Mr.doob 4 years ago
parent
commit
2297b1adbd
100 changed files with 45264 additions and 3989 deletions
  1. 183 280
      build/three.js
  2. 0 0
      build/three.min.js
  3. 258 384
      build/three.module.js
  4. 1 1
      docs/api/en/core/Object3D.html
  5. 1 1
      docs/api/en/core/Uniform.html
  6. 6 1
      docs/api/en/helpers/AxesHelper.html
  7. 1 1
      docs/api/en/lights/shadows/PointLightShadow.html
  8. 6 6
      docs/api/en/math/Matrix4.html
  9. 1 1
      docs/api/en/renderers/WebGLRenderer.html
  10. 1 1
      docs/api/ko/core/Object3D.html
  11. 1 1
      docs/api/ko/core/Uniform.html
  12. 1 1
      docs/api/zh/core/Object3D.html
  13. 1 1
      docs/api/zh/core/Uniform.html
  14. 1 1
      docs/api/zh/lights/RectAreaLight.html
  15. 1 1
      docs/api/zh/lights/shadows/PointLightShadow.html
  16. 1 1
      docs/api/zh/renderers/WebGLRenderer.html
  17. 1 1
      docs/examples/en/helpers/VertexTangentsHelper.html
  18. 1 1
      docs/examples/zh/helpers/VertexTangentsHelper.html
  19. 9 0
      docs/index.html
  20. 2 2
      docs/manual/en/introduction/Creating-a-scene.html
  21. 1 1
      docs/manual/zh/introduction/How-to-use-post-processing.html
  22. 0 1
      editor/js/Config.js
  23. 5 12
      editor/js/Editor.js
  24. 15 15
      editor/js/Menubar.File.js
  25. 1 1
      editor/js/Sidebar.Geometry.BufferGeometry.js
  26. 10 5
      editor/js/Sidebar.Geometry.js
  27. 16 7
      editor/js/Sidebar.Scene.js
  28. 1 19
      editor/js/Sidebar.Settings.js
  29. 3 6
      editor/js/Strings.js
  30. 2 5
      editor/js/Viewport.js
  31. 7 2
      editor/js/libs/ui.js
  32. 1 1
      editor/js/libs/ui.three.js
  33. 14 21
      editor/sw.js
  34. 1 0
      examples/files.json
  35. 13 4
      examples/games_fps.html
  36. 52 186
      examples/js/controls/DragControls.js
  37. 0 5
      examples/js/controls/FirstPersonControls.js
  38. 1 12
      examples/js/controls/FlyControls.js
  39. 136 79
      examples/js/controls/OrbitControls.js
  40. 122 67
      examples/js/controls/TrackballControls.js
  41. 82 180
      examples/js/controls/TransformControls.js
  42. 1 1
      examples/js/exporters/DracoExporter.js
  43. 12 4
      examples/js/exporters/GLTFExporter.js
  44. 9 0
      examples/js/exporters/USDZExporter.js
  45. 8 6
      examples/js/lines/LineMaterial.js
  46. 12 5
      examples/js/loaders/GLTFLoader.js
  47. 106 10
      examples/js/loaders/MMDLoader.js
  48. 30 13
      examples/js/loaders/NRRDLoader.js
  49. 13 8
      examples/js/misc/Volume.js
  50. 2 2
      examples/js/misc/VolumeSlice.js
  51. 7 8
      examples/js/modifiers/SimplifyModifier.js
  52. 9 0
      examples/js/objects/Reflector.js
  53. 110 0
      examples/js/shaders/MMDToonShader.js
  54. 1 1
      examples/js/shaders/WaterRefractionShader.js
  55. 44 162
      examples/jsm/controls/DragControls.js
  56. 0 6
      examples/jsm/controls/FirstPersonControls.js
  57. 0 12
      examples/jsm/controls/FlyControls.js
  58. 137 84
      examples/jsm/controls/OrbitControls.js
  59. 123 71
      examples/jsm/controls/TrackballControls.js
  60. 109 233
      examples/jsm/controls/TransformControls.js
  61. 1 1
      examples/jsm/exporters/DRACOExporter.js
  62. 13 4
      examples/jsm/exporters/GLTFExporter.js
  63. 8 0
      examples/jsm/exporters/USDZExporter.js
  64. 5 8
      examples/jsm/lines/LineMaterial.js
  65. 10 2
      examples/jsm/loaders/GLTFLoader.js
  66. 322 69
      examples/jsm/loaders/IFCLoader.js
  67. 169 10
      examples/jsm/loaders/MMDLoader.js
  68. 53 24
      examples/jsm/loaders/NRRDLoader.js
  69. 42805 238
      examples/jsm/loaders/ifc/web-ifc-api.js
  70. BIN
      examples/jsm/loaders/ifc/web-ifc.wasm
  71. 12 9
      examples/jsm/misc/Volume.js
  72. 2 2
      examples/jsm/misc/VolumeSlice.js
  73. 7 10
      examples/jsm/modifiers/SimplifyModifier.js
  74. 9 0
      examples/jsm/objects/Reflector.js
  75. 7 7
      examples/jsm/renderers/webgpu/WebGPURenderer.js
  76. 5 5
      examples/jsm/renderers/webgpu/WebGPUTextures.js
  77. 137 0
      examples/jsm/shaders/MMDToonShader.js
  78. 1 1
      examples/jsm/shaders/WaterRefractionShader.js
  79. 1 1
      examples/jsm/webxr/VRButton.js
  80. 4 4
      examples/misc_controls_transform.html
  81. BIN
      examples/models/gltf/TransmissionTest.glb
  82. 0 14
      examples/models/gltf/TransmissionTest/README.md
  83. 0 1628
      examples/models/gltf/TransmissionTest/glTF/TransmissionTest.gltf
  84. BIN
      examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture10487.png
  85. BIN
      examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture14184.jpg
  86. BIN
      examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture15366.jpg
  87. BIN
      examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture175763.png
  88. BIN
      examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture177328.png
  89. BIN
      examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture214190.png
  90. BIN
      examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture28577.jpg
  91. BIN
      examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture4086.png
  92. BIN
      examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture6807.png
  93. BIN
      examples/models/gltf/TransmissionTest/screenshot/screenshot.jpg
  94. BIN
      examples/models/gltf/TransmissionTest/screenshot/screenshot_large.png
  95. 0 11
      examples/models/json/multimaterial.json
  96. BIN
      examples/screenshots/misc_controls_transform.jpg
  97. BIN
      examples/screenshots/webgl2_multisampled_renderbuffers.jpg
  98. BIN
      examples/screenshots/webgl_buffergeometry_instancing.jpg
  99. BIN
      examples/screenshots/webgl_loader_gltf_transmission.jpg
  100. BIN
      examples/screenshots/webgl_loader_mmd.jpg

File diff suppressed because it is too large
+ 183 - 280
build/three.js


File diff suppressed because it is too large
+ 0 - 0
build/three.min.js


File diff suppressed because it is too large
+ 258 - 384
build/three.module.js


+ 1 - 1
docs/api/en/core/Object3D.html

@@ -258,7 +258,7 @@
 		have to set it manually to make use of this method.
 		</p>
 
-		<h3>[method:Object3D getObjectByProperty]( [param:String name], [param:Float value] )</h3>
+		<h3>[method:Object3D getObjectByProperty]( [param:String name], [param:Any value] )</h3>
 		<p>
 		name -- the property name to search for. <br />
 		value -- value of the given property. <br /><br />

+ 1 - 1
docs/api/en/core/Uniform.html

@@ -133,7 +133,7 @@
 				</tr>
 				<tr>
 					<td>mat4</td>
-					<td>[page:Matrix3 THREE.Matrix4]</td>
+					<td>[page:Matrix4 THREE.Matrix4]</td>
 				</tr>
 				<tr>
 					<td>mat4</td>

+ 6 - 1
docs/api/en/helpers/AxesHelper.html

@@ -44,7 +44,12 @@ scene.add( axesHelper );
 		<h2>Methods</h2>
 		<p>See the base [page:LineSegments] class for common methods.</p>
 
-		<h3>[method:AxesHelper dispose]()</h3>
+		<h3>[method:this setColors]( [param:Color xAxisColor], [param:Color yAxisColor], [param:Color zAxisColor] )</h3>
+		<p>
+		Sets the axes colors to [page:Color xAxisColor], [page:Color yAxisColor], [page:Color zAxisColor].
+		</p>
+
+		<h3>[method:null dispose]()</h3>
 		<p>
 		Disposes of the internally-created [page:Line.material material] and [page:Line.geometry geometry] used by this helper.
 		</p>

+ 1 - 1
docs/api/en/lights/shadows/PointLightShadow.html

@@ -24,7 +24,7 @@
 
 		//Create a PointLight and turn on shadows for the light
 		const light = new THREE.PointLight( 0xffffff, 1, 100 );
-		light.position.set( 0, 10, 0 );
+		light.position.set( 0, 10, 4 );
 		light.castShadow = true; // default false
 		scene.add( light );
 

+ 6 - 6
docs/api/en/math/Matrix4.html

@@ -319,12 +319,12 @@ x, 0, 0, 0,
 
 		<h3>[method:this makeShear]( [param:Float xy], [param:Float xz], [param:Float yx], [param:Float yz], [param:Float zx], [param:Float zy] )</h3>
 		<p>
-			[page:Float x] - the amount to shear X by Y.<br />
-			[page:Float x] - the amount to shear X by Z.<br />
-			[page:Float x] - the amount to shear Y by X.<br />
-			[page:Float x] - the amount to shear Y by Z.<br />
-			[page:Float y] - the amount to shear Z by X.<br />
-			[page:Float z] - the amount to shear Z by Y.<br /><br />
+			[page:Float xy] - the amount to shear X by Y.<br />
+			[page:Float xz] - the amount to shear X by Z.<br />
+			[page:Float yx] - the amount to shear Y by X.<br />
+			[page:Float yz] - the amount to shear Y by Z.<br />
+			[page:Float zx] - the amount to shear Z by X.<br />
+			[page:Float zy] - the amount to shear Z by Y.<br /><br />
 
 		Sets this matrix as a shear transform:
 <code>

+ 1 - 1
docs/api/en/renderers/WebGLRenderer.html

@@ -409,7 +409,7 @@
 			[page:WebGLRenderer.autoClearDepth autoClearDepth] properties to false. To forcibly clear one ore more buffers call [page:WebGLRenderer.clear .clear].
 		</p>
 
-		<h3>[method:null renderBufferDirect]( [param:Camera camera], [param:Fog fog], [param:BufferGeometry geometry], [param:Material material], [param:Object3D object], [param:Object group] )</h3>
+		<h3>[method:null renderBufferDirect]( [param:Camera camera], [param:Scene scene], [param:BufferGeometry geometry], [param:Material material], [param:Object3D object], [param:Object group] )</h3>
 		<p>Render a buffer geometry group using the camera and with the specified material.</p>
 
 		<h3>[method:null renderBufferImmediate]( [param:Object3D object], [param:WebGLProgram program] )</h3>

+ 1 - 1
docs/api/ko/core/Object3D.html

@@ -247,7 +247,7 @@
 		대부분의 객체는 기본값으로 이름이 빈 문자열입니다. 이 메서드를 사용하기 위해서는 직접 이름을 지정해야 합니다.
 		</p>
 
-		<h3>[method:Object3D getObjectByProperty]( [param:String name], [param:Float value] )</h3>
+		<h3>[method:Object3D getObjectByProperty]( [param:String name], [param:Any value] )</h3>
 		<p>
 		name -- 검색하고자하는 이름 프로퍼티. <br />
 		value -- 프로퍼티의 값. <br /><br />

+ 1 - 1
docs/api/ko/core/Uniform.html

@@ -129,7 +129,7 @@
 				</tr>
 				<tr>
 					<td>mat4</td>
-					<td>[page:Matrix3 THREE.Matrix4]</td>
+					<td>[page:Matrix4 THREE.Matrix4]</td>
 				</tr>
 				<tr>
 					<td>mat4</td>

+ 1 - 1
docs/api/zh/core/Object3D.html

@@ -247,7 +247,7 @@
 		请注意,大多数的对象中name默认是一个空字符串,要使用这个方法,你将需要手动地设置name属性。
 	</p>
 
-	<h3>[method:Object3D getObjectByProperty]( [param:String name], [param:Float value] )</h3>
+	<h3>[method:Object3D getObjectByProperty]( [param:String name], [param:Any value] )</h3>
 	<p>
 		name —— 将要用于查找的属性的名称。<br />
 		value —— 给定的属性的值。 <br /><br />

+ 1 - 1
docs/api/zh/core/Uniform.html

@@ -130,7 +130,7 @@
 				</tr>
 				<tr>
 					<td>mat4</td>
-					<td>[page:Matrix3 THREE.Matrix4]</td>
+					<td>[page:Matrix4 THREE.Matrix4]</td>
 				</tr>
 				<tr>
 					<td>mat4</td>

+ 1 - 1
docs/api/zh/lights/RectAreaLight.html

@@ -53,7 +53,7 @@
 			[page:Float width] - (可选参数) 光源宽度。缺省值为 10。<br />
 			[page:Float height] - (可选参数) 光源高度。缺省值为 10。<br /><br />
 
-			创建一个新的平光。
+			创建一个新的平光。
 		</p>
 
 		<h2>属性(Properties)</h2>

+ 1 - 1
docs/api/zh/lights/shadows/PointLightShadow.html

@@ -25,7 +25,7 @@
 
 		//Create a PointLight and turn on shadows for the light
 		const light = new THREE.PointLight( 0xffffff, 1, 100 );
-		light.position.set( 0, 10, 0 );
+		light.position.set( 0, 10, 4 );
 		light.castShadow = true; // default false
 		scene.add( light );
 

+ 1 - 1
docs/api/zh/renderers/WebGLRenderer.html

@@ -363,7 +363,7 @@
 			即便forceClear设为true, 也可以通过将[page:WebGLRenderer.autoClearColor autoClearColor]、[page:WebGLRenderer.autoClearStencil autoClearStencil]或[page:WebGLRenderer.autoClearDepth autoClearDepth]属性的值设为false来阻止对应缓存被清除。
 		</p>
 
-		<h3>[method:null renderBufferDirect]( [param:Camera camera], [param:Fog fog], [param:BufferGeometry geometry], [param:Material material], [param:Object3D object], [param:Object group] )</h3>
+		<h3>[method:null renderBufferDirect]( [param:Camera camera], [param:Scene scene], [param:BufferGeometry geometry], [param:Material material], [param:Object3D object], [param:Object group] )</h3>
 		<p>使用相机和指定材质渲染缓冲几何组。</p>
 
 		<h3>[method:null renderBufferImmediate]( [param:Object3D object], [param:WebGLProgram program] )</h3>

+ 1 - 1
docs/examples/en/helpers/VertexTangentsHelper.html

@@ -14,7 +14,7 @@
 		<p class="desc">
 			Renders arrows to visualize an object's vertex tangent vectors.
 			Requires that tangents have been specified in a [page:BufferAttribute custom attribute] or
-			have been calculated using [page:BufferGeometryUtils.computeTangents computeTangents].<br /><br />
+			have been calculated using [page:BufferGeometry.computeTangents computeTangents].<br /><br />
 
 			This helper supports [page:BufferGeometry] only.
 		</p>

+ 1 - 1
docs/examples/zh/helpers/VertexTangentsHelper.html

@@ -14,7 +14,7 @@
 		<p class="desc">
 			Renders arrows to visualize an object's vertex tangent vectors.
 			Requires that tangents have been specified in a [page:BufferAttribute custom attribute] or
-			have been calculated using [page:BufferGeometryUtils.computeTangents computeTangents].<br /><br />
+			have been calculated using [page:BufferGeometry.computeTangents computeTangents].<br /><br />
 
 			This helper supports [page:BufferGeometry] only.
 		</p>

+ 9 - 0
docs/index.html

@@ -252,6 +252,7 @@
 			}
 
 			const localList = list[ language ];
+			const selectedPage = window.location.hash.substring( 1 );
 
 			for ( const section in localList ) {
 
@@ -293,6 +294,14 @@
 						const linkElement = createLink( pageName, pageURL );
 						listElement.appendChild( linkElement );
 
+						// select current page
+
+						if ( pageURL === selectedPage ) {
+
+							linkElement.classList.add( 'selected' );
+
+						}
+
 						// Gather the main properties for the current subpage
 
 						pageProperties[ pageName ] = {

+ 2 - 2
docs/manual/en/introduction/Creating-a-scene.html

@@ -61,7 +61,7 @@
 
 		<p>Next up is the renderer. This is where the magic happens. In addition to the WebGLRenderer we use here, three.js comes with a few others, often used as fallbacks for users with older browsers or for those who don't have WebGL support for some reason.</p>
 
-		<p>In addition to creating the renderer instance, we also need to set the size at which we want it to render our app. It's a good idea to use the width and height of the area we want to fill with our app - in this case, the width and height of the browser window. For performance intensive apps, you can also give <strong>setSize</strong> smaller values, like <strong>window.innerWidth/2</strong> and <strong>window.innerHeight/2</strong>, which will make the app render at half size.</p>
+		<p>In addition to creating the renderer instance, we also need to set the size at which we want it to render our app. It's a good idea to use the width and height of the area we want to fill with our app - in this case, the width and height of the browser window. For performance intensive apps, you can also give <strong>setSize</strong> smaller values, like <strong>window.innerWidth/2</strong> and <strong>window.innerHeight/2</strong>, which will make the app render at quarter size.</p>
 
 		<p>If you wish to keep the size of your app but render it at a lower resolution, you can do so by calling <strong>setSize</strong> with false as <strong>updateStyle</strong> (the third argument). For example, <strong>setSize(window.innerWidth/2, window.innerHeight/2, false)</strong> will render your app at half resolution, given that your &lt;canvas&gt; has 100% width and height.</p>
 
@@ -111,7 +111,7 @@
 		cube.rotation.y += 0.01;
 		</code>
 
-		<p>This will be run every frame (normally 60 times per second), and give the cube a nice rotation animation. Basically, anything you want to move or change while the app is running has to go through the animate loop. You can of course call other functions from there, so that you don't end up with a <strong>animate</strong> function that's hundreds of lines.</p>
+		<p>This will be run every frame (normally 60 times per second), and give the cube a nice rotation animation. Basically, anything you want to move or change while the app is running has to go through the animate loop. You can of course call other functions from there, so that you don't end up with an <strong>animate</strong> function that's hundreds of lines.</p>
 
 		<h2>The result</h2>
 		<p>Congratulations! You have now completed your first three.js application. It's simple, but you have to start somewhere.</p>

+ 1 - 1
docs/manual/zh/introduction/How-to-use-post-processing.html

@@ -88,7 +88,7 @@
 
 		<p>
 			有时你或许想要自己写一个自定义后期处理着色器,并将其包含到后期处理过程链中。
-			对于这个需求,你可以使用*ShaderPass*。在引入该文件以及你的自定义着色后,可以使用下列代码来设置该过程:
+			对于这个需求,你可以使用*ShaderPass*。在引入该文件以及你的自定义着色后,可以使用下列代码来设置该过程:
 		</p>
 
 		<code>

+ 0 - 1
editor/js/Config.js

@@ -4,7 +4,6 @@ function Config() {
 
 	var storage = {
 		'language': 'en',
-		'exportPrecision': 6,
 
 		'autosave': true,
 

+ 5 - 12
editor/js/Editor.js

@@ -131,9 +131,8 @@ Editor.prototype = {
 		this.scene.uuid = scene.uuid;
 		this.scene.name = scene.name;
 
-		this.scene.background = ( scene.background !== null ) ? scene.background.clone() : null;
-
-		if ( scene.fog !== null ) this.scene.fog = scene.fog.clone();
+		this.scene.background = scene.background;
+		this.scene.fog = scene.fog;
 
 		this.scene.userData = JSON.parse( JSON.stringify( scene.userData ) );
 
@@ -641,12 +640,10 @@ Editor.prototype = {
 
 	//
 
-	fromJSON: function ( json ) {
-
-		var scope = this;
+	fromJSON: async function ( json ) {
 
 		var loader = new THREE.ObjectLoader();
-		var camera = loader.parse( json.camera );
+		var camera = await loader.parseAsync( json.camera );
 
 		this.camera.copy( camera );
 		this.signals.cameraResetted.dispatch();
@@ -654,11 +651,7 @@ Editor.prototype = {
 		this.history.fromJSON( json.history );
 		this.scripts = json.scripts;
 
-		loader.parse( json.scene, function ( scene ) {
-
-			scope.setScene( scene );
-
-		} );
+		this.setScene( await loader.parseAsync( json.scene ) );
 
 	},
 

+ 15 - 15
editor/js/Menubar.File.js

@@ -6,16 +6,6 @@ import { UIPanel, UIRow, UIHorizontalRule } from './libs/ui.js';
 
 function MenubarFile( editor ) {
 
-	function parseNumber( key, value ) {
-
-		var precision = config.getKey( 'exportPrecision' );
-
-		return typeof value === 'number' ? parseFloat( value.toFixed( precision ) ) : value;
-
-	}
-
-	//
-
 	var config = editor.config;
 	var strings = editor.strings;
 
@@ -111,7 +101,7 @@ function MenubarFile( editor ) {
 
 		try {
 
-			output = JSON.stringify( output, parseNumber, '\t' );
+			output = JSON.stringify( output, null, '\t' );
 			output = output.replace( /[\n\t]+([\d\.e\-\[\]]+)/g, '$1' );
 
 		} catch ( e ) {
@@ -145,7 +135,7 @@ function MenubarFile( editor ) {
 
 		try {
 
-			output = JSON.stringify( output, parseNumber, '\t' );
+			output = JSON.stringify( output, null, '\t' );
 			output = output.replace( /[\n\t]+([\d\.e\-\[\]]+)/g, '$1' );
 
 		} catch ( e ) {
@@ -170,7 +160,7 @@ function MenubarFile( editor ) {
 
 		try {
 
-			output = JSON.stringify( output, parseNumber, '\t' );
+			output = JSON.stringify( output, null, '\t' );
 			output = output.replace( /[\n\t]+([\d\.e\-\[\]]+)/g, '$1' );
 
 		} catch ( e ) {
@@ -228,8 +218,18 @@ function MenubarFile( editor ) {
 
 		var exporter = new DRACOExporter();
 
+		const options = {
+			decodeSpeed: 5,
+			encodeSpeed: 5,
+			encoderMethod: DRACOExporter.MESH_EDGEBREAKER_ENCODING,
+			quantization: [ 16, 8, 8, 8, 8 ],
+			exportUvs: true,
+			exportNormals: true,
+			exportColor: object.geometry.hasAttribute( 'color' )
+		};
+
 		// TODO: Change to DRACOExporter's parse( geometry, onParse )?
-		var result = exporter.parse( object );
+		var result = exporter.parse( object, options );
 		saveArrayBuffer( result, 'model.drc' );
 
 	} );
@@ -414,7 +414,7 @@ function MenubarFile( editor ) {
 		output.metadata.type = 'App';
 		delete output.history;
 
-		output = JSON.stringify( output, parseNumber, '\t' );
+		output = JSON.stringify( output, null, '\t' );
 		output = output.replace( /[\n\t]+([\d\.e\-\[\]]+)/g, '$1' );
 
 		toZip[ 'app.json' ] = strToU8( output );

+ 1 - 1
editor/js/Sidebar.Geometry.BufferGeometry.js

@@ -23,7 +23,7 @@ function SidebarGeometryBufferGeometry( editor ) {
 			var text = new UIText( strings.getKey( 'sidebar/geometry/buffer_geometry/attributes' ) ).setWidth( '90px' );
 			container.add( text );
 
-			var container2 = new UISpan().setDisplay( 'inline-block' ).setWidth( '160px' );
+			var container2 = new UISpan().setDisplay( 'inline-block' ).setVerticalAlign( 'middle' ).setWidth( '160px' );
 			container.add( container2 );
 
 			var index = geometry.index;

+ 10 - 5
editor/js/Sidebar.Geometry.js

@@ -146,12 +146,12 @@ function SidebarGeometry( editor ) {
 
 	container.add( new SidebarGeometryBufferGeometry( editor ) );
 
-	// size
+	// Size
 
-	var geometryBoundingSphere = new UIText();
+	var geometryBoundingBox = new UIText().setFontSize( '12px' ).setVerticalAlign( 'middle' );
 
 	container.add( new UIText( strings.getKey( 'sidebar/geometry/bounds' ) ).setWidth( '90px' ) );
-	container.add( geometryBoundingSphere );
+	container.add( geometryBoundingBox );
 
 	// Helpers
 
@@ -216,9 +216,14 @@ function SidebarGeometry( editor ) {
 
 			}
 
-			if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
+			if ( geometry.boundingBox === null ) geometry.computeBoundingBox();
 
-			geometryBoundingSphere.setValue( Math.floor( geometry.boundingSphere.radius * 1000 ) / 1000 );
+			const boundingBox = geometry.boundingBox;
+			const x = Math.floor( ( boundingBox.max.x - boundingBox.min.x ) * 1000 ) / 1000;
+			const y = Math.floor( ( boundingBox.max.y - boundingBox.min.y ) * 1000 ) / 1000;
+			const z = Math.floor( ( boundingBox.max.z - boundingBox.min.z ) * 1000 ) / 1000;
+
+			geometryBoundingBox.setInnerHTML( `${x}<br/>${y}<br/>${z}` );
 
 		} else {
 

+ 16 - 7
editor/js/Sidebar.Scene.js

@@ -1,3 +1,5 @@
+import * as THREE from '../../build/three.module.js';
+
 import { UIPanel, UIBreak, UIRow, UIColor, UISelect, UIText, UINumber } from './libs/ui.js';
 import { UIOutliner, UITexture } from './libs/ui.three.js';
 
@@ -166,7 +168,6 @@ function SidebarScene( editor ) {
 		refreshBackgroundUI();
 
 	} );
-	backgroundType.setValue( 'Color' );
 
 	backgroundRow.add( new UIText( strings.getKey( 'sidebar/scene/background' ) ).setWidth( '90px' ) );
 	backgroundRow.add( backgroundType );
@@ -376,18 +377,26 @@ function SidebarScene( editor ) {
 
 				backgroundType.setValue( 'Color' );
 				backgroundColor.setHexValue( scene.background.getHex() );
-				backgroundTexture.setValue( null );
-				backgroundEquirectangularTexture.setValue( null );
 
-			}
+			} else if ( scene.background.isTexture ) {
+
+				if ( scene.background.mapping === THREE.EquirectangularReflectionMapping ) {
+
+					backgroundType.setValue( 'Equirectangular' );
+					backgroundEquirectangularTexture.setValue( scene.background );
+
+				} else {
 
-			// TODO: Add Texture/EquirectangularTexture support
+					backgroundType.setValue( 'Texture' );
+					backgroundTexture.setValue( scene.background );
+
+				}
+
+			}
 
 		} else {
 
 			backgroundType.setValue( 'None' );
-			backgroundTexture.setValue( null );
-			backgroundEquirectangularTexture.setValue( null );
 
 		}
 

+ 1 - 19
editor/js/Sidebar.Settings.js

@@ -1,4 +1,4 @@
-import { UIPanel, UIRow, UISelect, UISpan, UIText, UIInteger } from './libs/ui.js';
+import { UIPanel, UIRow, UISelect, UISpan, UIText } from './libs/ui.js';
 
 import { SidebarSettingsViewport } from './Sidebar.Settings.Viewport.js';
 import { SidebarSettingsShortcuts } from './Sidebar.Settings.Shortcuts.js';
@@ -47,24 +47,6 @@ function SidebarSettings( editor ) {
 
 	settings.add( languageRow );
 
-	// export precision
-
-	var exportPrecisionRow = new UIRow();
-	var exportPrecision = new UIInteger( config.getKey( 'exportPrecision' ) ).setRange( 2, Infinity );
-
-	exportPrecision.onChange( function () {
-
-		var value = this.getValue();
-
-		editor.config.setKey( 'exportPrecision', value );
-
-	} );
-
-	exportPrecisionRow.add( new UIText( strings.getKey( 'sidebar/settings/exportPrecision' ) ).setWidth( '90px' ) );
-	exportPrecisionRow.add( exportPrecision );
-
-	settings.add( exportPrecisionRow );
-
 	//
 
 	container.add( new SidebarSettingsViewport( editor ) );

+ 3 - 6
editor/js/Strings.js

@@ -311,7 +311,6 @@ function Strings( config ) {
 
 			'sidebar/settings': 'Settings',
 			'sidebar/settings/language': 'Language',
-			'sidebar/settings/exportPrecision': 'Export Precision',
 
 			'sidebar/settings/shortcuts': 'Shortcuts',
 			'sidebar/settings/shortcuts/translate': 'Translate',
@@ -646,7 +645,6 @@ function Strings( config ) {
 
 			'sidebar/settings': 'Paramètres',
 			'sidebar/settings/language': 'Langue',
-			'sidebar/settings/exportPrecision': 'Précision à l\'exportation',
 
 			'sidebar/settings/shortcuts': 'Shortcuts',
 			'sidebar/settings/shortcuts/translate': 'Position',
@@ -917,8 +915,8 @@ function Strings( config ) {
 			'sidebar/material/emissive': '自发光',
 			'sidebar/material/specular': '高光',
 			'sidebar/material/shininess': '高光大小',
-			'sidebar/material/clearcoat': '透明图层',
-			'sidebar/material/clearcoatroughness': '透明图层粗糙度',
+			'sidebar/material/clearcoat': '清漆',
+			'sidebar/material/clearcoatroughness': '清漆粗糙度',
 			'sidebar/material/vertexcolors': '顶点颜色',
 			'sidebar/material/vertextangents': '顶点切线',
 			'sidebar/material/matcap': '材质捕获',
@@ -926,7 +924,7 @@ function Strings( config ) {
 			'sidebar/material/alphamap': '透明贴图',
 			'sidebar/material/bumpmap': '凹凸贴图',
 			'sidebar/material/normalmap': '法线贴图',
-			'sidebar/material/clearcoatnormalmap': '透明图层法线贴图',
+			'sidebar/material/clearcoatnormalmap': '清漆法线贴图',
 			'sidebar/material/displacemap': '置换贴图',
 			'sidebar/material/roughmap': '粗糙贴图',
 			'sidebar/material/metalmap': '金属贴图',
@@ -981,7 +979,6 @@ function Strings( config ) {
 
 			'sidebar/settings': '设置',
 			'sidebar/settings/language': '语言',
-			'sidebar/settings/exportPrecision': '输出精度',
 
 			'sidebar/settings/shortcuts': '快捷键',
 			'sidebar/settings/shortcuts/translate': '移动',

+ 2 - 5
editor/js/Viewport.js

@@ -565,11 +565,8 @@ function Viewport( editor ) {
 
 				if ( backgroundEquirectangularTexture ) {
 
-					var renderTarget = new THREE.WebGLCubeRenderTarget( backgroundEquirectangularTexture.image.width );
-					renderTarget.fromEquirectangularTexture( renderer, backgroundEquirectangularTexture );
-					renderTarget.toJSON = function () { return null }; // TODO Remove hack
-
-					scene.background = renderTarget.texture;
+					backgroundEquirectangularTexture.mapping = THREE.EquirectangularReflectionMapping;
+					scene.background = backgroundEquirectangularTexture;
 
 				}
 

+ 7 - 2
editor/js/libs/ui.js

@@ -126,6 +126,12 @@ class UIElement {
 
 	}
 
+	setInnerHTML( value ) {
+
+		this.dom.innerHTML = value;
+
+	}
+
 	getIndexOfChild( element ) {
 
 		return Array.prototype.indexOf.call( this.dom.children, element.dom );
@@ -137,7 +143,7 @@ class UIElement {
 // properties
 
 const properties = [ 'position', 'left', 'top', 'right', 'bottom', 'width', 'height', 'border', 'borderLeft',
-	'borderTop', 'borderRight', 'borderBottom', 'borderColor', 'display', 'overflow', 'margin', 'marginLeft', 'marginTop', 'marginRight', 'marginBottom', 'padding', 'paddingLeft', 'paddingTop', 'paddingRight', 'paddingBottom', 'color',
+	'borderTop', 'borderRight', 'borderBottom', 'borderColor', 'display', 'overflow', 'margin', 'marginLeft', 'marginTop', 'marginRight', 'marginBottom', 'padding', 'paddingLeft', 'paddingTop', 'paddingRight', 'paddingBottom', 'verticalAlign', 'color',
 	'background', 'backgroundColor', 'opacity', 'fontSize', 'fontWeight', 'textAlign', 'textDecoration', 'textTransform', 'cursor', 'zIndex' ];
 
 properties.forEach( function ( property ) {
@@ -225,7 +231,6 @@ class UIText extends UISpan {
 		this.dom.className = 'Text';
 		this.dom.style.cursor = 'default';
 		this.dom.style.display = 'inline-block';
-		this.dom.style.verticalAlign = 'middle';
 
 		this.setValue( text );
 

+ 1 - 1
editor/js/libs/ui.three.js

@@ -36,7 +36,7 @@ class UITexture extends UISpan {
 			input.click();
 
 		}, false );
-		canvas.addEventListener( 'drop', function () {
+		canvas.addEventListener( 'drop', function ( event ) {
 
 			event.preventDefault();
 			event.stopPropagation();

+ 14 - 21
editor/sw.js

@@ -1,4 +1,4 @@
-// r129
+// r130
 
 const cacheName = 'threejs-editor';
 
@@ -244,35 +244,28 @@ self.addEventListener( 'fetch', async function ( event ) {
 
 async function networkFirst( request ) {
 
-	return fetch( request ).catch( async function () {
+	return fetch( request )
+		.then( async function ( response ) {
 
-		const cachedResponse = await caches.match( request );
+			const cache = await caches.open( cacheName );
 
-		if ( cachedResponse === undefined ) {
+			cache.put( request, response.clone() );
 
-			console.warn( '[SW] Not cached:', request.url );
+			return response;
 
-		}
+		} )
+		.catch( async function () {
 
-		return cachedResponse;
+			const cachedResponse = await caches.match( request );
 
-	} );
-
-}
+			if ( cachedResponse === undefined ) {
 
-/*
-async function cacheFirst( request ) {
+				console.warn( '[SW] Not cached:', request.url );
 
-	const cachedResponse = await caches.match( request );
+			}
 
-	if ( cachedResponse === undefined ) {
+			return cachedResponse;
 
-		console.warn( '[SW] Not cached:', request.url );
-		return fetch( request );
-
-	}
-
-	return cachedResponse;
+		} );
 
 }
-*/

+ 1 - 0
examples/files.json

@@ -348,6 +348,7 @@
 		"webxr_vr_handinput_pointerdrag",
 		"webxr_vr_handinput_pressbutton",
 		"webxr_vr_haptics",
+		"webxr_vr_layers",
 		"webxr_vr_lorenzattractor",
 		"webxr_vr_panorama",
 		"webxr_vr_panorama_depth",

+ 13 - 4
examples/games_fps.html

@@ -77,6 +77,8 @@
 			const NUM_SPHERES = 20;
 			const SPHERE_RADIUS = 0.2;
 
+			const STEPS_PER_FRAME = 5;
+
 			const sphereGeometry = new THREE.SphereGeometry( SPHERE_RADIUS, 32, 32 );
 			const sphereMaterial = new THREE.MeshStandardMaterial( { color: 0x888855, roughness: 0.8, metalness: 0.5 } );
 
@@ -360,13 +362,20 @@
 
 			function animate() {
 
-				const deltaTime = Math.min( 0.1, clock.getDelta() );
+				const deltaTime = Math.min( 0.05, clock.getDelta() ) / STEPS_PER_FRAME;
+
+				// we look for collisions in substeps to mitigate the risk of
+				// an object traversing another too quickly for detection.
+
+				for ( let i = 0 ; i < STEPS_PER_FRAME ; i ++ ) {
 
-				controls( deltaTime );
+					controls( deltaTime );
 
-				updatePlayer( deltaTime );
+					updatePlayer( deltaTime );
 
-				updateSpheres( deltaTime );
+					updateSpheres( deltaTime );
+
+				}
 
 				renderer.render( scene, camera );
 

+ 52 - 186
examples/js/controls/DragControls.js

@@ -4,7 +4,7 @@
 
 	const _raycaster = new THREE.Raycaster();
 
-	const _mouse = new THREE.Vector2();
+	const _pointer = new THREE.Vector2();
 
 	const _offset = new THREE.Vector3();
 
@@ -19,6 +19,8 @@
 		constructor( _objects, _camera, _domElement ) {
 
 			super();
+			_domElement.style.touchAction = 'none'; // disable touch scroll
+
 			let _selected = null,
 				_hovered = null;
 			const _intersections = []; //
@@ -35,16 +37,6 @@
 
 				_domElement.addEventListener( 'pointerleave', onPointerCancel );
 
-				_domElement.addEventListener( 'touchmove', onTouchMove, {
-					passive: false
-				} );
-
-				_domElement.addEventListener( 'touchstart', onTouchStart, {
-					passive: false
-				} );
-
-				_domElement.addEventListener( 'touchend', onTouchEnd );
-
 			}
 
 			function deactivate() {
@@ -57,12 +49,6 @@
 
 				_domElement.removeEventListener( 'pointerleave', onPointerCancel );
 
-				_domElement.removeEventListener( 'touchmove', onTouchMove );
-
-				_domElement.removeEventListener( 'touchstart', onTouchStart );
-
-				_domElement.removeEventListener( 'touchend', onTouchEnd );
-
 				_domElement.style.cursor = '';
 
 			}
@@ -81,30 +67,12 @@
 
 			function onPointerMove( event ) {
 
-				event.preventDefault();
+				if ( scope.enabled === false ) return;
+				updatePointer( event );
 
-				switch ( event.pointerType ) {
+				_raycaster.setFromCamera( _pointer, _camera );
 
-					case 'mouse':
-					case 'pen':
-						onMouseMove( event );
-						break;
-        // TODO touch
-
-				}
-
-			}
-
-			function onMouseMove( event ) {
-
-				const rect = _domElement.getBoundingClientRect();
-
-				_mouse.x = ( event.clientX - rect.left ) / rect.width * 2 - 1;
-				_mouse.y = - ( ( event.clientY - rect.top ) / rect.height ) * 2 + 1;
-
-				_raycaster.setFromCamera( _mouse, _camera );
-
-				if ( _selected && scope.enabled ) {
+				if ( _selected ) {
 
 					if ( _raycaster.ray.intersectPlane( _plane, _intersection ) ) {
 
@@ -118,81 +86,71 @@
 					} );
 					return;
 
-				}
+				} // hover support
 
-				_intersections.length = 0;
 
-				_raycaster.setFromCamera( _mouse, _camera );
+				if ( event.pointerType === 'mouse' || event.pointerType === 'pen' ) {
 
-				_raycaster.intersectObjects( _objects, true, _intersections );
+					_intersections.length = 0;
 
-				if ( _intersections.length > 0 ) {
+					_raycaster.setFromCamera( _pointer, _camera );
 
-					const object = _intersections[ 0 ].object;
+					_raycaster.intersectObjects( _objects, true, _intersections );
 
-					_plane.setFromNormalAndCoplanarPoint( _camera.getWorldDirection( _plane.normal ), _worldPosition.setFromMatrixPosition( object.matrixWorld ) );
+					if ( _intersections.length > 0 ) {
 
-					if ( _hovered !== object && _hovered !== null ) {
+						const object = _intersections[ 0 ].object;
 
-						scope.dispatchEvent( {
-							type: 'hoveroff',
-							object: _hovered
-						} );
-						_domElement.style.cursor = 'auto';
-						_hovered = null;
+						_plane.setFromNormalAndCoplanarPoint( _camera.getWorldDirection( _plane.normal ), _worldPosition.setFromMatrixPosition( object.matrixWorld ) );
 
-					}
+						if ( _hovered !== object && _hovered !== null ) {
 
-					if ( _hovered !== object ) {
+							scope.dispatchEvent( {
+								type: 'hoveroff',
+								object: _hovered
+							} );
+							_domElement.style.cursor = 'auto';
+							_hovered = null;
 
-						scope.dispatchEvent( {
-							type: 'hoveron',
-							object: object
-						} );
-						_domElement.style.cursor = 'pointer';
-						_hovered = object;
+						}
 
-					}
+						if ( _hovered !== object ) {
 
-				} else {
+							scope.dispatchEvent( {
+								type: 'hoveron',
+								object: object
+							} );
+							_domElement.style.cursor = 'pointer';
+							_hovered = object;
 
-					if ( _hovered !== null ) {
+						}
 
-						scope.dispatchEvent( {
-							type: 'hoveroff',
-							object: _hovered
-						} );
-						_domElement.style.cursor = 'auto';
-						_hovered = null;
+					} else {
 
-					}
+						if ( _hovered !== null ) {
 
-				}
+							scope.dispatchEvent( {
+								type: 'hoveroff',
+								object: _hovered
+							} );
+							_domElement.style.cursor = 'auto';
+							_hovered = null;
 
-			}
+						}
 
-			function onPointerDown( event ) {
-
-				event.preventDefault();
-
-				switch ( event.pointerType ) {
-
-					case 'mouse':
-					case 'pen':
-						onMouseDown( event );
-						break;
-        // TODO touch
+					}
 
 				}
 
 			}
 
-			function onMouseDown( event ) {
+			function onPointerDown() {
 
-				event.preventDefault();
+				if ( scope.enabled === false ) return;
+				updatePointer( event );
 				_intersections.length = 0;
 
-				_raycaster.setFromCamera( _mouse, _camera );
+				_raycaster.setFromCamera( _pointer, _camera );
 
 				_raycaster.intersectObjects( _objects, true, _intersections );
 
@@ -200,6 +158,8 @@
 
 					_selected = scope.transformGroup === true ? _objects[ 0 ] : _intersections[ 0 ].object;
 
+					_plane.setFromNormalAndCoplanarPoint( _camera.getWorldDirection( _plane.normal ), _worldPosition.setFromMatrixPosition( _selected.matrixWorld ) );
+
 					if ( _raycaster.ray.intersectPlane( _plane, _intersection ) ) {
 
 						_inverseMatrix.copy( _selected.parent.matrixWorld ).invert();
@@ -218,25 +178,9 @@
 
 			}
 
-			function onPointerCancel( event ) {
-
-				event.preventDefault();
-
-				switch ( event.pointerType ) {
-
-					case 'mouse':
-					case 'pen':
-						onMouseCancel( event );
-						break;
-        // TODO touch
-
-				}
-
-			}
-
-			function onMouseCancel( event ) {
+			function onPointerCancel() {
 
-				event.preventDefault();
+				if ( scope.enabled === false ) return;
 
 				if ( _selected ) {
 
@@ -252,90 +196,12 @@
 
 			}
 
-			function onTouchMove( event ) {
-
-				event.preventDefault();
-				event = event.changedTouches[ 0 ];
-
-				const rect = _domElement.getBoundingClientRect();
-
-				_mouse.x = ( event.clientX - rect.left ) / rect.width * 2 - 1;
-				_mouse.y = - ( ( event.clientY - rect.top ) / rect.height ) * 2 + 1;
-
-				_raycaster.setFromCamera( _mouse, _camera );
-
-				if ( _selected && scope.enabled ) {
-
-					if ( _raycaster.ray.intersectPlane( _plane, _intersection ) ) {
-
-						_selected.position.copy( _intersection.sub( _offset ).applyMatrix4( _inverseMatrix ) );
-
-					}
-
-					scope.dispatchEvent( {
-						type: 'drag',
-						object: _selected
-					} );
-					return;
-
-				}
-
-			}
-
-			function onTouchStart( event ) {
-
-				event.preventDefault();
-				event = event.changedTouches[ 0 ];
+			function updatePointer( event ) {
 
 				const rect = _domElement.getBoundingClientRect();
 
-				_mouse.x = ( event.clientX - rect.left ) / rect.width * 2 - 1;
-				_mouse.y = - ( ( event.clientY - rect.top ) / rect.height ) * 2 + 1;
-				_intersections.length = 0;
-
-				_raycaster.setFromCamera( _mouse, _camera );
-
-				_raycaster.intersectObjects( _objects, true, _intersections );
-
-				if ( _intersections.length > 0 ) {
-
-					_selected = scope.transformGroup === true ? _objects[ 0 ] : _intersections[ 0 ].object;
-
-					_plane.setFromNormalAndCoplanarPoint( _camera.getWorldDirection( _plane.normal ), _worldPosition.setFromMatrixPosition( _selected.matrixWorld ) );
-
-					if ( _raycaster.ray.intersectPlane( _plane, _intersection ) ) {
-
-						_inverseMatrix.copy( _selected.parent.matrixWorld ).invert();
-
-						_offset.copy( _intersection ).sub( _worldPosition.setFromMatrixPosition( _selected.matrixWorld ) );
-
-					}
-
-					_domElement.style.cursor = 'move';
-					scope.dispatchEvent( {
-						type: 'dragstart',
-						object: _selected
-					} );
-
-				}
-
-			}
-
-			function onTouchEnd( event ) {
-
-				event.preventDefault();
-
-				if ( _selected ) {
-
-					scope.dispatchEvent( {
-						type: 'dragend',
-						object: _selected
-					} );
-					_selected = null;
-
-				}
-
-				_domElement.style.cursor = 'auto';
+				_pointer.x = ( event.clientX - rect.left ) / rect.width * 2 - 1;
+				_pointer.y = - ( event.clientY - rect.top ) / rect.height * 2 + 1;
 
 			}
 

+ 0 - 5
examples/js/controls/FirstPersonControls.js

@@ -72,8 +72,6 @@
 
 				}
 
-				event.preventDefault();
-
 				if ( this.activeLook ) {
 
 					switch ( event.button ) {
@@ -96,8 +94,6 @@
 
 			this.onMouseUp = function ( event ) {
 
-				event.preventDefault();
-
 				if ( this.activeLook ) {
 
 					switch ( event.button ) {
@@ -136,7 +132,6 @@
 
 			this.onKeyDown = function ( event ) {
 
-				//event.preventDefault();
 				switch ( event.code ) {
 
 					case 'ArrowUp':

+ 1 - 12
examples/js/controls/FlyControls.js

@@ -55,8 +55,7 @@
 
 					return;
 
-				} //event.preventDefault();
-
+				}
 
 				switch ( event.code ) {
 
@@ -186,14 +185,6 @@
 
 			this.mousedown = function ( event ) {
 
-				if ( this.domElement !== document ) {
-
-					this.domElement.focus();
-
-				}
-
-				event.preventDefault();
-
 				if ( this.dragToLook ) {
 
 					this.mouseStatus ++;
@@ -235,8 +226,6 @@
 
 			this.mouseup = function ( event ) {
 
-				event.preventDefault();
-
 				if ( this.dragToLook ) {
 
 					this.mouseStatus --;

+ 136 - 79
examples/js/controls/OrbitControls.js

@@ -24,7 +24,9 @@
 			if ( domElement === undefined ) console.warn( 'THREE.OrbitControls: The second parameter "domElement" is now mandatory.' );
 			if ( domElement === document ) console.error( 'THREE.OrbitControls: "document" should not be used as the target "domElement". Please use "renderer.domElement" instead.' );
 			this.object = object;
-			this.domElement = domElement; // Set to false to disable this control
+			this.domElement = domElement;
+			this.domElement.style.touchAction = 'none'; // disable touch scroll
+			// Set to false to disable this control
 
 			this.enabled = true; // "target" sets the location of focus, where the object orbits around
 
@@ -254,10 +256,8 @@
 
 				scope.domElement.removeEventListener( 'contextmenu', onContextMenu );
 				scope.domElement.removeEventListener( 'pointerdown', onPointerDown );
+				scope.domElement.removeEventListener( 'pointercancel', onPointerCancel );
 				scope.domElement.removeEventListener( 'wheel', onMouseWheel );
-				scope.domElement.removeEventListener( 'touchstart', onTouchStart );
-				scope.domElement.removeEventListener( 'touchend', onTouchEnd );
-				scope.domElement.removeEventListener( 'touchmove', onTouchMove );
 				scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
 				scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
 
@@ -300,6 +300,8 @@
 			const dollyStart = new THREE.Vector2();
 			const dollyEnd = new THREE.Vector2();
 			const dollyDelta = new THREE.Vector2();
+			const pointers = [];
+			const pointerPositions = {};
 
 			function getAutoRotationAngle() {
 
@@ -563,71 +565,72 @@
 
 			}
 
-			function handleTouchStartRotate( event ) {
+			function handleTouchStartRotate() {
 
-				if ( event.touches.length == 1 ) {
+				if ( pointers.length === 1 ) {
 
-					rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
+					rotateStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );
 
 				} else {
 
-					const x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );
-					const y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );
+					const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );
+					const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );
 					rotateStart.set( x, y );
 
 				}
 
 			}
 
-			function handleTouchStartPan( event ) {
+			function handleTouchStartPan() {
 
-				if ( event.touches.length == 1 ) {
+				if ( pointers.length === 1 ) {
 
-					panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
+					panStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );
 
 				} else {
 
-					const x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );
-					const y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );
+					const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );
+					const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );
 					panStart.set( x, y );
 
 				}
 
 			}
 
-			function handleTouchStartDolly( event ) {
+			function handleTouchStartDolly() {
 
-				const dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
-				const dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
+				const dx = pointers[ 0 ].pageX - pointers[ 1 ].pageX;
+				const dy = pointers[ 0 ].pageY - pointers[ 1 ].pageY;
 				const distance = Math.sqrt( dx * dx + dy * dy );
 				dollyStart.set( 0, distance );
 
 			}
 
-			function handleTouchStartDollyPan( event ) {
+			function handleTouchStartDollyPan() {
 
-				if ( scope.enableZoom ) handleTouchStartDolly( event );
-				if ( scope.enablePan ) handleTouchStartPan( event );
+				if ( scope.enableZoom ) handleTouchStartDolly();
+				if ( scope.enablePan ) handleTouchStartPan();
 
 			}
 
-			function handleTouchStartDollyRotate( event ) {
+			function handleTouchStartDollyRotate() {
 
-				if ( scope.enableZoom ) handleTouchStartDolly( event );
-				if ( scope.enableRotate ) handleTouchStartRotate( event );
+				if ( scope.enableZoom ) handleTouchStartDolly();
+				if ( scope.enableRotate ) handleTouchStartRotate();
 
 			}
 
 			function handleTouchMoveRotate( event ) {
 
-				if ( event.touches.length == 1 ) {
+				if ( pointers.length == 1 ) {
 
-					rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
+					rotateEnd.set( event.pageX, event.pageY );
 
 				} else {
 
-					const x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );
-					const y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );
+					const position = getSecondPointerPosition( event );
+					const x = 0.5 * ( event.pageX + position.x );
+					const y = 0.5 * ( event.pageY + position.y );
 					rotateEnd.set( x, y );
 
 				}
@@ -643,14 +646,15 @@
 
 			function handleTouchMovePan( event ) {
 
-				if ( event.touches.length == 1 ) {
+				if ( pointers.length === 1 ) {
 
-					panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
+					panEnd.set( event.pageX, event.pageY );
 
 				} else {
 
-					const x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );
-					const y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );
+					const position = getSecondPointerPosition( event );
+					const x = 0.5 * ( event.pageX + position.x );
+					const y = 0.5 * ( event.pageY + position.y );
 					panEnd.set( x, y );
 
 				}
@@ -663,8 +667,9 @@
 
 			function handleTouchMoveDolly( event ) {
 
-				const dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
-				const dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
+				const position = getSecondPointerPosition( event );
+				const dx = event.pageX - position.x;
+				const dy = event.pageY - position.y;
 				const distance = Math.sqrt( dx * dx + dy * dy );
 				dollyEnd.set( 0, distance );
 				dollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );
@@ -697,13 +702,23 @@
 
 				if ( scope.enabled === false ) return;
 
-				switch ( event.pointerType ) {
+				if ( pointers.length === 0 ) {
 
-					case 'mouse':
-					case 'pen':
-						onMouseDown( event );
-						break;
-        // TODO touch
+					scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove );
+					scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp );
+
+				} //
+
+
+				addPointer( event );
+
+				if ( event.pointerType === 'touch' ) {
+
+					onTouchStart( event );
+
+				} else {
+
+					onMouseDown( event );
 
 				}
 
@@ -713,13 +728,13 @@
 
 				if ( scope.enabled === false ) return;
 
-				switch ( event.pointerType ) {
+				if ( event.pointerType === 'touch' ) {
 
-					case 'mouse':
-					case 'pen':
-						onMouseMove( event );
-						break;
-        // TODO touch
+					onTouchMove( event );
+
+				} else {
+
+					onMouseMove( event );
 
 				}
 
@@ -727,25 +742,37 @@
 
 			function onPointerUp( event ) {
 
-				switch ( event.pointerType ) {
+				if ( scope.enabled === false ) return;
+
+				if ( event.pointerType === 'touch' ) {
 
-					case 'mouse':
-					case 'pen':
-						onMouseUp( event );
-						break;
-        // TODO touch
+					onTouchEnd();
+
+				} else {
+
+					onMouseUp( event );
+
+				}
+
+				removePointer( event ); //
+
+				if ( pointers.length === 0 ) {
+
+					scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
+					scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
 
 				}
 
 			}
 
-			function onMouseDown( event ) {
+			function onPointerCancel( event ) {
 
-				// Prevent the browser from scrolling.
-				event.preventDefault(); // Manually set the focus since calling preventDefault above
-				// prevents the browser from setting it automatically.
+				removePointer( event );
+
+			}
+
+			function onMouseDown( event ) {
 
-				scope.domElement.focus ? scope.domElement.focus() : window.focus();
 				let mouseAction;
 
 				switch ( event.button ) {
@@ -816,8 +843,6 @@
 
 				if ( state !== STATE.NONE ) {
 
-					scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove );
-					scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp );
 					scope.dispatchEvent( _startEvent );
 
 				}
@@ -827,7 +852,6 @@
 			function onMouseMove( event ) {
 
 				if ( scope.enabled === false ) return;
-				event.preventDefault();
 
 				switch ( state ) {
 
@@ -852,9 +876,6 @@
 
 			function onMouseUp( event ) {
 
-				scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
-				scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
-				if ( scope.enabled === false ) return;
 				handleMouseUp( event );
 				scope.dispatchEvent( _endEvent );
 				state = STATE.NONE;
@@ -880,23 +901,22 @@
 
 			function onTouchStart( event ) {
 
-				if ( scope.enabled === false ) return;
-				event.preventDefault(); // prevent scrolling
+				trackPointer( event );
 
-				switch ( event.touches.length ) {
+				switch ( pointers.length ) {
 
 					case 1:
 						switch ( scope.touches.ONE ) {
 
 							case THREE.TOUCH.ROTATE:
 								if ( scope.enableRotate === false ) return;
-								handleTouchStartRotate( event );
+								handleTouchStartRotate();
 								state = STATE.TOUCH_ROTATE;
 								break;
 
 							case THREE.TOUCH.PAN:
 								if ( scope.enablePan === false ) return;
-								handleTouchStartPan( event );
+								handleTouchStartPan();
 								state = STATE.TOUCH_PAN;
 								break;
 
@@ -912,13 +932,13 @@
 
 							case THREE.TOUCH.DOLLY_PAN:
 								if ( scope.enableZoom === false && scope.enablePan === false ) return;
-								handleTouchStartDollyPan( event );
+								handleTouchStartDollyPan();
 								state = STATE.TOUCH_DOLLY_PAN;
 								break;
 
 							case THREE.TOUCH.DOLLY_ROTATE:
 								if ( scope.enableZoom === false && scope.enableRotate === false ) return;
-								handleTouchStartDollyRotate( event );
+								handleTouchStartDollyRotate();
 								state = STATE.TOUCH_DOLLY_ROTATE;
 								break;
 
@@ -944,8 +964,7 @@
 
 			function onTouchMove( event ) {
 
-				if ( scope.enabled === false ) return;
-				event.preventDefault(); // prevent scrolling
+				trackPointer( event );
 
 				switch ( state ) {
 
@@ -982,7 +1001,6 @@
 
 			function onTouchEnd( event ) {
 
-				if ( scope.enabled === false ) return;
 				handleTouchEnd( event );
 				scope.dispatchEvent( _endEvent );
 				state = STATE.NONE;
@@ -994,20 +1012,59 @@
 				if ( scope.enabled === false ) return;
 				event.preventDefault();
 
+			}
+
+			function addPointer( event ) {
+
+				pointers.push( event );
+
+			}
+
+			function removePointer( event ) {
+
+				delete pointerPositions[ event.pointerId ];
+
+				for ( let i = 0; i < pointers.length; i ++ ) {
+
+					if ( pointers[ i ].pointerId == event.pointerId ) {
+
+						pointers.splice( i, 1 );
+						return;
+
+					}
+
+				}
+
+			}
+
+			function trackPointer( event ) {
+
+				let position = pointerPositions[ event.pointerId ];
+
+				if ( position === undefined ) {
+
+					position = new THREE.Vector2();
+					pointerPositions[ event.pointerId ] = position;
+
+				}
+
+				position.set( event.pageX, event.pageY );
+
+			}
+
+			function getSecondPointerPosition( event ) {
+
+				const pointer = event.pointerId === pointers[ 0 ].pointerId ? pointers[ 1 ] : pointers[ 0 ];
+				return pointerPositions[ pointer.pointerId ];
+
 			} //
 
 
 			scope.domElement.addEventListener( 'contextmenu', onContextMenu );
 			scope.domElement.addEventListener( 'pointerdown', onPointerDown );
+			scope.domElement.addEventListener( 'pointercancel', onPointerCancel );
 			scope.domElement.addEventListener( 'wheel', onMouseWheel, {
 				passive: false
-			} );
-			scope.domElement.addEventListener( 'touchstart', onTouchStart, {
-				passive: false
-			} );
-			scope.domElement.addEventListener( 'touchend', onTouchEnd );
-			scope.domElement.addEventListener( 'touchmove', onTouchMove, {
-				passive: false
 			} ); // force an update at start
 
 			this.update();

+ 122 - 67
examples/js/controls/TrackballControls.js

@@ -27,7 +27,9 @@
 				TOUCH_ZOOM_PAN: 4
 			};
 			this.object = object;
-			this.domElement = domElement; // API
+			this.domElement = domElement;
+			this.domElement.style.touchAction = 'none'; // disable touch scroll
+			// API
 
 			this.enabled = true;
 			this.screen = {
@@ -76,7 +78,9 @@
 				_zoomStart = new THREE.Vector2(),
 				_zoomEnd = new THREE.Vector2(),
 				_panStart = new THREE.Vector2(),
-				_panEnd = new THREE.Vector2(); // for reset
+				_panEnd = new THREE.Vector2(),
+				_pointers = [],
+				_pointerPositions = {}; // for reset
 
 
 			this.target0 = this.target.clone();
@@ -383,13 +387,23 @@
 
 				if ( scope.enabled === false ) return;
 
-				switch ( event.pointerType ) {
+				if ( _pointers.length === 0 ) {
 
-					case 'mouse':
-					case 'pen':
-						onMouseDown( event );
-						break;
-        // TODO touch
+					scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove );
+					scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp );
+
+				} //
+
+
+				addPointer( event );
+
+				if ( event.pointerType === 'touch' ) {
+
+					onTouchStart( event );
+
+				} else {
+
+					onMouseDown( event );
 
 				}
 
@@ -399,13 +413,13 @@
 
 				if ( scope.enabled === false ) return;
 
-				switch ( event.pointerType ) {
+				if ( event.pointerType === 'touch' ) {
 
-					case 'mouse':
-					case 'pen':
-						onMouseMove( event );
-						break;
-        // TODO touch
+					onTouchMove( event );
+
+				} else {
+
+					onMouseMove( event );
 
 				}
 
@@ -415,18 +429,34 @@
 
 				if ( scope.enabled === false ) return;
 
-				switch ( event.pointerType ) {
+				if ( event.pointerType === 'touch' ) {
+
+					onTouchEnd( event );
+
+				} else {
+
+					onMouseUp();
+
+				} //
 
-					case 'mouse':
-					case 'pen':
-						onMouseUp( event );
-						break;
-        // TODO touch
+
+				removePointer( event );
+
+				if ( _pointers.length === 0 ) {
+
+					scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
+					scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
 
 				}
 
 			}
 
+			function onPointerCancel( event ) {
+
+				removePointer( event );
+
+			}
+
 			function keydown( event ) {
 
 				if ( scope.enabled === false ) return;
@@ -462,8 +492,6 @@
 
 			function onMouseDown( event ) {
 
-				event.preventDefault();
-
 				if ( _state === STATE.NONE ) {
 
 					switch ( event.button ) {
@@ -517,8 +545,6 @@
 
 			function onMouseMove( event ) {
 
-				if ( scope.enabled === false ) return;
-				event.preventDefault();
 				const state = _keyState !== STATE.NONE ? _keyState : _state;
 
 				if ( state === STATE.ROTATE && ! scope.noRotate ) {
@@ -539,10 +565,8 @@
 
 			}
 
-			function onMouseUp( event ) {
+			function onMouseUp() {
 
-				if ( scope.enabled === false ) return;
-				event.preventDefault();
 				_state = STATE.NONE;
 				scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
 				scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
@@ -550,7 +574,7 @@
 
 			}
 
-			function mousewheel( event ) {
+			function onMouseWheel( event ) {
 
 				if ( scope.enabled === false ) return;
 				if ( scope.noZoom === true ) return;
@@ -580,17 +604,16 @@
 
 			}
 
-			function touchstart( event ) {
+			function onTouchStart( event ) {
 
-				if ( scope.enabled === false ) return;
-				event.preventDefault();
+				trackPointer( event );
 
-				switch ( event.touches.length ) {
+				switch ( _pointers.length ) {
 
 					case 1:
 						_state = STATE.TOUCH_ROTATE;
 
-						_moveCurr.copy( getMouseOnCircle( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) );
+						_moveCurr.copy( getMouseOnCircle( _pointers[ 0 ].pageX, _pointers[ 0 ].pageY ) );
 
 						_movePrev.copy( _moveCurr );
 
@@ -599,11 +622,11 @@
 					default:
 						// 2 or more
 						_state = STATE.TOUCH_ZOOM_PAN;
-						const dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
-						const dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
+						const dx = _pointers[ 0 ].pageX - _pointers[ 1 ].pageX;
+						const dy = _pointers[ 0 ].pageY - _pointers[ 1 ].pageY;
 						_touchZoomDistanceEnd = _touchZoomDistanceStart = Math.sqrt( dx * dx + dy * dy );
-						const x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2;
-						const y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2;
+						const x = ( _pointers[ 0 ].pageX + _pointers[ 1 ].pageX ) / 2;
+						const y = ( _pointers[ 0 ].pageY + _pointers[ 1 ].pageY ) / 2;
 
 						_panStart.copy( getMouseOnScreen( x, y ) );
 
@@ -617,27 +640,27 @@
 
 			}
 
-			function touchmove( event ) {
+			function onTouchMove( event ) {
 
-				if ( scope.enabled === false ) return;
-				event.preventDefault();
+				trackPointer( event );
 
-				switch ( event.touches.length ) {
+				switch ( _pointers.length ) {
 
 					case 1:
 						_movePrev.copy( _moveCurr );
 
-						_moveCurr.copy( getMouseOnCircle( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) );
+						_moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) );
 
 						break;
 
 					default:
 						// 2 or more
-						const dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
-						const dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
+						const position = getSecondPointerPosition( event );
+						const dx = event.pageX - position.x;
+						const dy = event.pageY - position.y;
 						_touchZoomDistanceEnd = Math.sqrt( dx * dx + dy * dy );
-						const x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2;
-						const y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2;
+						const x = ( event.pageX + position.x ) / 2;
+						const y = ( event.pageY + position.y ) / 2;
 
 						_panEnd.copy( getMouseOnScreen( x, y ) );
 
@@ -647,11 +670,9 @@
 
 			}
 
-			function touchend( event ) {
+			function onTouchEnd( event ) {
 
-				if ( scope.enabled === false ) return;
-
-				switch ( event.touches.length ) {
+				switch ( _pointers.length ) {
 
 					case 0:
 						_state = STATE.NONE;
@@ -660,7 +681,7 @@
 					case 1:
 						_state = STATE.TOUCH_ROTATE;
 
-						_moveCurr.copy( getMouseOnCircle( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) );
+						_moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) );
 
 						_movePrev.copy( _moveCurr );
 
@@ -679,16 +700,58 @@
 
 			}
 
+			function addPointer( event ) {
+
+				_pointers.push( event );
+
+			}
+
+			function removePointer( event ) {
+
+				delete _pointerPositions[ event.pointerId ];
+
+				for ( let i = 0; i < _pointers.length; i ++ ) {
+
+					if ( _pointers[ i ].pointerId == event.pointerId ) {
+
+						_pointers.splice( i, 1 );
+
+						return;
+
+					}
+
+				}
+
+			}
+
+			function trackPointer( event ) {
+
+				let position = _pointerPositions[ event.pointerId ];
+
+				if ( position === undefined ) {
+
+					position = new THREE.Vector2();
+					_pointerPositions[ event.pointerId ] = position;
+
+				}
+
+				position.set( event.pageX, event.pageY );
+
+			}
+
+			function getSecondPointerPosition( event ) {
+
+				const pointer = event.pointerId === _pointers[ 0 ].pointerId ? _pointers[ 1 ] : _pointers[ 0 ];
+				return _pointerPositions[ pointer.pointerId ];
+
+			}
+
 			this.dispose = function () {
 
 				scope.domElement.removeEventListener( 'contextmenu', contextmenu );
 				scope.domElement.removeEventListener( 'pointerdown', onPointerDown );
-				scope.domElement.removeEventListener( 'wheel', mousewheel );
-				scope.domElement.removeEventListener( 'touchstart', touchstart );
-				scope.domElement.removeEventListener( 'touchend', touchend );
-				scope.domElement.removeEventListener( 'touchmove', touchmove );
-				scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
-				scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
+				scope.domElement.removeEventListener( 'pointercancel', onPointerCancel );
+				scope.domElement.removeEventListener( 'wheel', onMouseWheel );
 				window.removeEventListener( 'keydown', keydown );
 				window.removeEventListener( 'keyup', keyup );
 
@@ -696,18 +759,10 @@
 
 			this.domElement.addEventListener( 'contextmenu', contextmenu );
 			this.domElement.addEventListener( 'pointerdown', onPointerDown );
-			this.domElement.addEventListener( 'wheel', mousewheel, {
-				passive: false
-			} );
-			this.domElement.addEventListener( 'touchstart', touchstart, {
-				passive: false
-			} );
-			this.domElement.addEventListener( 'touchend', touchend );
-			this.domElement.addEventListener( 'touchmove', touchmove, {
+			this.domElement.addEventListener( 'pointercancel', onPointerCancel );
+			this.domElement.addEventListener( 'wheel', onMouseWheel, {
 				passive: false
 			} );
-			this.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove );
-			this.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp );
 			window.addEventListener( 'keydown', keydown );
 			window.addEventListener( 'keyup', keyup );
 			this.handleResize(); // force an update at start

+ 82 - 180
examples/js/controls/TransformControls.js

@@ -42,6 +42,7 @@
 
 			this.visible = false;
 			this.domElement = domElement;
+			this.domElement.style.touchAction = 'none'; // disable touch scroll
 
 			const _gizmo = new TransformControlsGizmo();
 
@@ -617,11 +618,10 @@
 
 		} else {
 
-			const pointer = event.changedTouches ? event.changedTouches[ 0 ] : event;
 			const rect = this.domElement.getBoundingClientRect();
 			return {
-				x: ( pointer.clientX - rect.left ) / rect.width * 2 - 1,
-				y: - ( pointer.clientY - rect.top ) / rect.height * 2 + 1,
+				x: ( event.clientX - rect.left ) / rect.width * 2 - 1,
+				y: - ( event.clientY - rect.top ) / rect.height * 2 + 1,
 				button: event.button
 			};
 
@@ -647,8 +647,6 @@
 	function onPointerDown( event ) {
 
 		if ( ! this.enabled ) return;
-		this.domElement.style.touchAction = 'none'; // disable touch scroll
-
 		this.domElement.ownerDocument.addEventListener( 'pointermove', this._onPointerMove );
 		this.pointerHover( this._getPointer( event ) );
 		this.pointerDown( this._getPointer( event ) );
@@ -665,7 +663,6 @@
 	function onPointerUp( event ) {
 
 		if ( ! this.enabled ) return;
-		this.domElement.style.touchAction = '';
 		this.domElement.ownerDocument.removeEventListener( 'pointermove', this._onPointerMove );
 		this.pointerUp( this._getPointer( event ) );
 
@@ -729,74 +726,61 @@
 			const gizmoMaterial = new THREE.MeshBasicMaterial( {
 				depthTest: false,
 				depthWrite: false,
-				transparent: true,
-				side: THREE.DoubleSide,
 				fog: false,
-				toneMapped: false
+				toneMapped: false,
+				transparent: true
 			} );
 			const gizmoLineMaterial = new THREE.LineBasicMaterial( {
 				depthTest: false,
 				depthWrite: false,
-				transparent: true,
-				linewidth: 1,
 				fog: false,
-				toneMapped: false
+				toneMapped: false,
+				transparent: true
 			} ); // Make unique material for each axis/color
 
 			const matInvisible = gizmoMaterial.clone();
 			matInvisible.opacity = 0.15;
-			const matHelper = gizmoMaterial.clone();
-			matHelper.opacity = 0.33;
+			const matHelper = gizmoLineMaterial.clone();
+			matHelper.opacity = 0.5;
 			const matRed = gizmoMaterial.clone();
-			matRed.color.set( 0xff0000 );
+			matRed.color.setHex( 0xff0000 );
 			const matGreen = gizmoMaterial.clone();
-			matGreen.color.set( 0x00ff00 );
+			matGreen.color.setHex( 0x00ff00 );
 			const matBlue = gizmoMaterial.clone();
-			matBlue.color.set( 0x0000ff );
+			matBlue.color.setHex( 0x0000ff );
+			const matRedTransparent = gizmoMaterial.clone();
+			matRedTransparent.color.setHex( 0xff0000 );
+			matRedTransparent.opacity = 0.5;
+			const matGreenTransparent = gizmoMaterial.clone();
+			matGreenTransparent.color.setHex( 0x00ff00 );
+			matGreenTransparent.opacity = 0.5;
+			const matBlueTransparent = gizmoMaterial.clone();
+			matBlueTransparent.color.setHex( 0x0000ff );
+			matBlueTransparent.opacity = 0.5;
 			const matWhiteTransparent = gizmoMaterial.clone();
 			matWhiteTransparent.opacity = 0.25;
-			const matYellowTransparent = matWhiteTransparent.clone();
-			matYellowTransparent.color.set( 0xffff00 );
-			const matCyanTransparent = matWhiteTransparent.clone();
-			matCyanTransparent.color.set( 0x00ffff );
-			const matMagentaTransparent = matWhiteTransparent.clone();
-			matMagentaTransparent.color.set( 0xff00ff );
+			const matYellowTransparent = gizmoMaterial.clone();
+			matYellowTransparent.color.setHex( 0xffff00 );
+			matYellowTransparent.opacity = 0.25;
 			const matYellow = gizmoMaterial.clone();
-			matYellow.color.set( 0xffff00 );
-			const matLineRed = gizmoLineMaterial.clone();
-			matLineRed.color.set( 0xff0000 );
-			const matLineGreen = gizmoLineMaterial.clone();
-			matLineGreen.color.set( 0x00ff00 );
-			const matLineBlue = gizmoLineMaterial.clone();
-			matLineBlue.color.set( 0x0000ff );
-			const matLineCyan = gizmoLineMaterial.clone();
-			matLineCyan.color.set( 0x00ffff );
-			const matLineMagenta = gizmoLineMaterial.clone();
-			matLineMagenta.color.set( 0xff00ff );
-			const matLineYellow = gizmoLineMaterial.clone();
-			matLineYellow.color.set( 0xffff00 );
-			const matLineGray = gizmoLineMaterial.clone();
-			matLineGray.color.set( 0x787878 );
-			const matLineYellowTransparent = matLineYellow.clone();
-			matLineYellowTransparent.opacity = 0.25; // reusable geometry
-
-			const arrowGeometry = new THREE.CylinderGeometry( 0, 0.05, 0.2, 12, 1, false );
-			const scaleHandleGeometry = new THREE.BoxGeometry( 0.125, 0.125, 0.125 );
+			matYellow.color.setHex( 0xffff00 );
+			const matGray = gizmoMaterial.clone();
+			matGray.color.setHex( 0x787878 ); // reusable geometry
+
+			const arrowGeometry = new THREE.CylinderGeometry( 0, 0.04, 0.1, 12 );
+			arrowGeometry.translate( 0, 0.05, 0 );
+			const scaleHandleGeometry = new THREE.BoxGeometry( 0.08, 0.08, 0.08 );
+			scaleHandleGeometry.translate( 0, 0.04, 0 );
 			const lineGeometry = new THREE.BufferGeometry();
 			lineGeometry.setAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0, 1, 0, 0 ], 3 ) );
+			const lineGeometry2 = new THREE.CylinderGeometry( 0.0075, 0.0075, 0.5, 3 );
+			lineGeometry2.translate( 0, 0.25, 0 );
 
 			function CircleGeometry( radius, arc ) {
 
-				const geometry = new THREE.BufferGeometry();
-				const vertices = [];
-
-				for ( let i = 0; i <= 64 * arc; ++ i ) {
-
-					vertices.push( 0, Math.cos( i / 32 * Math.PI ) * radius, Math.sin( i / 32 * Math.PI ) * radius );
-
-				}
-
-				geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );
+				const geometry = new THREE.TorusGeometry( radius, 0.0075, 3, 64, arc * Math.PI * 2 );
+				geometry.rotateY( Math.PI / 2 );
+				geometry.rotateX( Math.PI / 2 );
 				return geometry;
 
 			} // Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position
@@ -812,22 +796,22 @@
 
 
 			const gizmoTranslate = {
-				X: [[ new THREE.Mesh( arrowGeometry, matRed ), [ 1, 0, 0 ], [ 0, 0, - Math.PI / 2 ], null, 'fwd' ], [ new THREE.Mesh( arrowGeometry, matRed ), [ 1, 0, 0 ], [ 0, 0, Math.PI / 2 ], null, 'bwd' ], [ new THREE.Line( lineGeometry, matLineRed ) ]],
-				Y: [[ new THREE.Mesh( arrowGeometry, matGreen ), [ 0, 1, 0 ], null, null, 'fwd' ], [ new THREE.Mesh( arrowGeometry, matGreen ), [ 0, 1, 0 ], [ Math.PI, 0, 0 ], null, 'bwd' ], [ new THREE.Line( lineGeometry, matLineGreen ), null, [ 0, 0, Math.PI / 2 ]]],
-				Z: [[ new THREE.Mesh( arrowGeometry, matBlue ), [ 0, 0, 1 ], [ Math.PI / 2, 0, 0 ], null, 'fwd' ], [ new THREE.Mesh( arrowGeometry, matBlue ), [ 0, 0, 1 ], [ - Math.PI / 2, 0, 0 ], null, 'bwd' ], [ new THREE.Line( lineGeometry, matLineBlue ), null, [ 0, - Math.PI / 2, 0 ]]],
-				XYZ: [[ new THREE.Mesh( new THREE.OctahedronGeometry( 0.1, 0 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ], [ 0, 0, 0 ]]],
-				XY: [[ new THREE.Mesh( new THREE.PlaneGeometry( 0.295, 0.295 ), matYellowTransparent.clone() ), [ 0.15, 0.15, 0 ]], [ new THREE.Line( lineGeometry, matLineYellow ), [ 0.18, 0.3, 0 ], null, [ 0.125, 1, 1 ]], [ new THREE.Line( lineGeometry, matLineYellow ), [ 0.3, 0.18, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]]],
-				YZ: [[ new THREE.Mesh( new THREE.PlaneGeometry( 0.295, 0.295 ), matCyanTransparent.clone() ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]], [ new THREE.Line( lineGeometry, matLineCyan ), [ 0, 0.18, 0.3 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]], [ new THREE.Line( lineGeometry, matLineCyan ), [ 0, 0.3, 0.18 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]],
-				XZ: [[ new THREE.Mesh( new THREE.PlaneGeometry( 0.295, 0.295 ), matMagentaTransparent.clone() ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]], [ new THREE.Line( lineGeometry, matLineMagenta ), [ 0.18, 0, 0.3 ], null, [ 0.125, 1, 1 ]], [ new THREE.Line( lineGeometry, matLineMagenta ), [ 0.3, 0, 0.18 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]]
+				X: [[ new THREE.Mesh( arrowGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]], [ new THREE.Mesh( arrowGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]], [ new THREE.Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]],
+				Y: [[ new THREE.Mesh( arrowGeometry, matGreen ), [ 0, 0.5, 0 ]], [ new THREE.Mesh( arrowGeometry, matGreen ), [ 0, - 0.5, 0 ], [ Math.PI, 0, 0 ]], [ new THREE.Mesh( lineGeometry2, matGreen ) ]],
+				Z: [[ new THREE.Mesh( arrowGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]], [ new THREE.Mesh( arrowGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]], [ new THREE.Mesh( lineGeometry2, matBlue ), null, [ Math.PI / 2, 0, 0 ]]],
+				XYZ: [[ new THREE.Mesh( new THREE.OctahedronGeometry( 0.1, 0 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ]]],
+				XY: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent.clone() ), [ 0.15, 0.15, 0 ]]],
+				YZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent.clone() ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]],
+				XZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent.clone() ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]]
 			};
 			const pickerTranslate = {
-				X: [[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), matInvisible ), [ 0.6, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]],
-				Y: [[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), matInvisible ), [ 0, 0.6, 0 ]]],
-				Z: [[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), matInvisible ), [ 0, 0, 0.6 ], [ Math.PI / 2, 0, 0 ]]],
+				X: [[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]], [ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]],
+				Y: [[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]], [ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]],
+				Z: [[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]], [ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]],
 				XYZ: [[ new THREE.Mesh( new THREE.OctahedronGeometry( 0.2, 0 ), matInvisible ) ]],
-				XY: [[ new THREE.Mesh( new THREE.PlaneGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0.2, 0 ]]],
-				YZ: [[ new THREE.Mesh( new THREE.PlaneGeometry( 0.4, 0.4 ), matInvisible ), [ 0, 0.2, 0.2 ], [ 0, Math.PI / 2, 0 ]]],
-				XZ: [[ new THREE.Mesh( new THREE.PlaneGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0, 0.2 ], [ - Math.PI / 2, 0, 0 ]]]
+				XY: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]]],
+				YZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]],
+				XZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]]
 			};
 			const helperTranslate = {
 				START: [[ new THREE.Mesh( new THREE.OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]],
@@ -838,43 +822,39 @@
 				Z: [[ new THREE.Line( lineGeometry, matHelper.clone() ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]]
 			};
 			const gizmoRotate = {
-				X: [[ new THREE.Line( CircleGeometry( 1, 0.5 ), matLineRed ) ], [ new THREE.Mesh( new THREE.OctahedronGeometry( 0.04, 0 ), matRed ), [ 0, 0, 0.99 ], null, [ 1, 3, 1 ]]],
-				Y: [[ new THREE.Line( CircleGeometry( 1, 0.5 ), matLineGreen ), null, [ 0, 0, - Math.PI / 2 ]], [ new THREE.Mesh( new THREE.OctahedronGeometry( 0.04, 0 ), matGreen ), [ 0, 0, 0.99 ], null, [ 3, 1, 1 ]]],
-				Z: [[ new THREE.Line( CircleGeometry( 1, 0.5 ), matLineBlue ), null, [ 0, Math.PI / 2, 0 ]], [ new THREE.Mesh( new THREE.OctahedronGeometry( 0.04, 0 ), matBlue ), [ 0.99, 0, 0 ], null, [ 1, 3, 1 ]]],
-				E: [[ new THREE.Line( CircleGeometry( 1.25, 1 ), matLineYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]], [ new THREE.Mesh( new THREE.CylinderGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 1.17, 0, 0 ], [ 0, 0, - Math.PI / 2 ], [ 1, 1, 0.001 ]], [ new THREE.Mesh( new THREE.CylinderGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ - 1.17, 0, 0 ], [ 0, 0, Math.PI / 2 ], [ 1, 1, 0.001 ]], [ new THREE.Mesh( new THREE.CylinderGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 0, - 1.17, 0 ], [ Math.PI, 0, 0 ], [ 1, 1, 0.001 ]], [ new THREE.Mesh( new THREE.CylinderGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 0, 1.17, 0 ], [ 0, 0, 0 ], [ 1, 1, 0.001 ]]],
-				XYZE: [[ new THREE.Line( CircleGeometry( 1, 1 ), matLineGray ), null, [ 0, Math.PI / 2, 0 ]]]
+				XYZE: [[ new THREE.Mesh( CircleGeometry( 0.5, 1 ), matGray ), null, [ 0, Math.PI / 2, 0 ]]],
+				X: [[ new THREE.Mesh( CircleGeometry( 0.5, 0.5 ), matRed ) ]],
+				Y: [[ new THREE.Mesh( CircleGeometry( 0.5, 0.5 ), matGreen ), null, [ 0, 0, - Math.PI / 2 ]]],
+				Z: [[ new THREE.Mesh( CircleGeometry( 0.5, 0.5 ), matBlue ), null, [ 0, Math.PI / 2, 0 ]]],
+				E: [[ new THREE.Mesh( CircleGeometry( 0.75, 1 ), matYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]]]
 			};
 			const helperRotate = {
 				AXIS: [[ new THREE.Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]]
 			};
 			const pickerRotate = {
-				X: [[ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ]]],
-				Y: [[ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]]],
-				Z: [[ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]],
-				E: [[ new THREE.Mesh( new THREE.TorusGeometry( 1.25, 0.1, 2, 24 ), matInvisible ) ]],
-				XYZE: [[ new THREE.Mesh( new THREE.SphereGeometry( 0.7, 10, 8 ), matInvisible ) ]]
+				XYZE: [[ new THREE.Mesh( new THREE.SphereGeometry( 0.25, 10, 8 ), matInvisible ) ]],
+				X: [[ new THREE.Mesh( new THREE.TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ]]],
+				Y: [[ new THREE.Mesh( new THREE.TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]]],
+				Z: [[ new THREE.Mesh( new THREE.TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]],
+				E: [[ new THREE.Mesh( new THREE.TorusGeometry( 0.75, 0.1, 2, 24 ), matInvisible ) ]]
 			};
 			const gizmoScale = {
-				X: [[ new THREE.Mesh( scaleHandleGeometry, matRed ), [ 0.8, 0, 0 ], [ 0, 0, - Math.PI / 2 ]], [ new THREE.Line( lineGeometry, matLineRed ), null, null, [ 0.8, 1, 1 ]]],
-				Y: [[ new THREE.Mesh( scaleHandleGeometry, matGreen ), [ 0, 0.8, 0 ]], [ new THREE.Line( lineGeometry, matLineGreen ), null, [ 0, 0, Math.PI / 2 ], [ 0.8, 1, 1 ]]],
-				Z: [[ new THREE.Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, 0.8 ], [ Math.PI / 2, 0, 0 ]], [ new THREE.Line( lineGeometry, matLineBlue ), null, [ 0, - Math.PI / 2, 0 ], [ 0.8, 1, 1 ]]],
-				XY: [[ new THREE.Mesh( scaleHandleGeometry, matYellowTransparent ), [ 0.85, 0.85, 0 ], null, [ 2, 2, 0.2 ]], [ new THREE.Line( lineGeometry, matLineYellow ), [ 0.855, 0.98, 0 ], null, [ 0.125, 1, 1 ]], [ new THREE.Line( lineGeometry, matLineYellow ), [ 0.98, 0.855, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]]],
-				YZ: [[ new THREE.Mesh( scaleHandleGeometry, matCyanTransparent ), [ 0, 0.85, 0.85 ], null, [ 0.2, 2, 2 ]], [ new THREE.Line( lineGeometry, matLineCyan ), [ 0, 0.855, 0.98 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]], [ new THREE.Line( lineGeometry, matLineCyan ), [ 0, 0.98, 0.855 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]],
-				XZ: [[ new THREE.Mesh( scaleHandleGeometry, matMagentaTransparent ), [ 0.85, 0, 0.85 ], null, [ 2, 0.2, 2 ]], [ new THREE.Line( lineGeometry, matLineMagenta ), [ 0.855, 0, 0.98 ], null, [ 0.125, 1, 1 ]], [ new THREE.Line( lineGeometry, matLineMagenta ), [ 0.98, 0, 0.855 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]],
-				XYZX: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 1.1, 0, 0 ]]],
-				XYZY: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 0, 1.1, 0 ]]],
-				XYZZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 0, 0, 1.1 ]]]
+				X: [[ new THREE.Mesh( scaleHandleGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]], [ new THREE.Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]], [ new THREE.Mesh( scaleHandleGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]]],
+				Y: [[ new THREE.Mesh( scaleHandleGeometry, matGreen ), [ 0, 0.5, 0 ]], [ new THREE.Mesh( lineGeometry2, matGreen ) ], [ new THREE.Mesh( scaleHandleGeometry, matGreen ), [ 0, - 0.5, 0 ], [ 0, 0, Math.PI ]]],
+				Z: [[ new THREE.Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]], [ new THREE.Mesh( lineGeometry2, matBlue ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]], [ new THREE.Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]]],
+				XY: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent ), [ 0.15, 0.15, 0 ]]],
+				YZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]],
+				XZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]],
+				XYZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.1, 0.1, 0.1 ), matWhiteTransparent.clone() ) ]]
 			};
 			const pickerScale = {
-				X: [[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.8, 4, 1, false ), matInvisible ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]],
-				Y: [[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.8, 4, 1, false ), matInvisible ), [ 0, 0.5, 0 ]]],
-				Z: [[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.8, 4, 1, false ), matInvisible ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]]],
-				XY: [[ new THREE.Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0.85, 0 ], null, [ 3, 3, 0.2 ]]],
-				YZ: [[ new THREE.Mesh( scaleHandleGeometry, matInvisible ), [ 0, 0.85, 0.85 ], null, [ 0.2, 3, 3 ]]],
-				XZ: [[ new THREE.Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0, 0.85 ], null, [ 3, 0.2, 3 ]]],
-				XYZX: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 1.1, 0, 0 ]]],
-				XYZY: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 1.1, 0 ]]],
-				XYZZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 1.1 ]]]
+				X: [[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]], [ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]],
+				Y: [[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]], [ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]],
+				Z: [[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]], [ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]],
+				XY: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]]],
+				YZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]],
+				XZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]],
+				XYZ: [[ new THREE.Mesh( new THREE.BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 0 ]]]
 			};
 			const helperScale = {
 				X: [[ new THREE.Line( lineGeometry, matHelper.clone() ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]],
@@ -992,7 +972,7 @@
 
 				}
 
-				handle.scale.set( 1, 1, 1 ).multiplyScalar( factor * this.size / 7 ); // TODO: simplify helpers and consider decoupling from gizmo
+				handle.scale.set( 1, 1, 1 ).multiplyScalar( factor * this.size / 4 ); // TODO: simplify helpers and consider decoupling from gizmo
 
 				if ( handle.tag === 'helper' ) {
 
@@ -1120,9 +1100,8 @@
 					// Hide translate and scale axis facing the camera
 					const AXIS_HIDE_TRESHOLD = 0.99;
 					const PLANE_HIDE_TRESHOLD = 0.2;
-					const AXIS_FLIP_TRESHOLD = 0.0;
 
-					if ( handle.name === 'X' || handle.name === 'XYZX' ) {
+					if ( handle.name === 'X' ) {
 
 						if ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {
 
@@ -1133,7 +1112,7 @@
 
 					}
 
-					if ( handle.name === 'Y' || handle.name === 'XYZY' ) {
+					if ( handle.name === 'Y' ) {
 
 						if ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {
 
@@ -1144,7 +1123,7 @@
 
 					}
 
-					if ( handle.name === 'Z' || handle.name === 'XYZZ' ) {
+					if ( handle.name === 'Z' ) {
 
 						if ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {
 
@@ -1186,73 +1165,6 @@
 
 						}
 
-					} // Flip translate and scale axis ocluded behind another axis
-
-
-					if ( handle.name.search( 'X' ) !== - 1 ) {
-
-						if ( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) < AXIS_FLIP_TRESHOLD ) {
-
-							if ( handle.tag === 'fwd' ) {
-
-								handle.visible = false;
-
-							} else {
-
-								handle.scale.x *= - 1;
-
-							}
-
-						} else if ( handle.tag === 'bwd' ) {
-
-							handle.visible = false;
-
-						}
-
-					}
-
-					if ( handle.name.search( 'Y' ) !== - 1 ) {
-
-						if ( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) < AXIS_FLIP_TRESHOLD ) {
-
-							if ( handle.tag === 'fwd' ) {
-
-								handle.visible = false;
-
-							} else {
-
-								handle.scale.y *= - 1;
-
-							}
-
-						} else if ( handle.tag === 'bwd' ) {
-
-							handle.visible = false;
-
-						}
-
-					}
-
-					if ( handle.name.search( 'Z' ) !== - 1 ) {
-
-						if ( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) < AXIS_FLIP_TRESHOLD ) {
-
-							if ( handle.tag === 'fwd' ) {
-
-								handle.visible = false;
-
-							} else {
-
-								handle.scale.z *= - 1;
-
-							}
-
-						} else if ( handle.tag === 'bwd' ) {
-
-							handle.visible = false;
-
-						}
-
 					}
 
 				} else if ( this.mode === 'rotate' ) {
@@ -1306,22 +1218,17 @@
 				handle.visible = handle.visible && ( handle.name.indexOf( 'Z' ) === - 1 || this.showZ );
 				handle.visible = handle.visible && ( handle.name.indexOf( 'E' ) === - 1 || this.showX && this.showY && this.showZ ); // highlight selected axis
 
-				handle.material._opacity = handle.material._opacity || handle.material.opacity;
 				handle.material._color = handle.material._color || handle.material.color.clone();
+				handle.material._opacity = handle.material._opacity || handle.material.opacity;
 				handle.material.color.copy( handle.material._color );
 				handle.material.opacity = handle.material._opacity;
 
-				if ( ! this.enabled ) {
-
-					handle.material.opacity *= 0.5;
-					handle.material.color.lerp( new THREE.Color( 1, 1, 1 ), 0.5 );
-
-				} else if ( this.axis ) {
+				if ( this.enabled && this.axis ) {
 
 					if ( handle.name === this.axis ) {
 
+						handle.material.color.setHex( 0xffff00 );
 						handle.material.opacity = 1.0;
-						handle.material.color.lerp( new THREE.Color( 1, 1, 1 ), 0.5 );
 
 					} else if ( this.axis.split( '' ).some( function ( a ) {
 
@@ -1329,13 +1236,8 @@
 
 					} ) ) {
 
+						handle.material.color.setHex( 0xffff00 );
 						handle.material.opacity = 1.0;
-						handle.material.color.lerp( new THREE.Color( 1, 1, 1 ), 0.5 );
-
-					} else {
-
-						handle.material.opacity *= 0.25;
-						handle.material.color.lerp( new THREE.Color( 1, 1, 1 ), 0.5 );
 
 					}
 

+ 1 - 1
examples/js/exporters/DracoExporter.js

@@ -35,7 +35,7 @@
 
 			if ( DracoEncoderModule === undefined ) {
 
-				throw new Error( 'THREE.DRACOExporter: required the draco_decoder to work.' );
+				throw new Error( 'THREE.DRACOExporter: required the draco_encoder to work.' );
 
 			}
 

+ 12 - 4
examples/js/exporters/GLTFExporter.js

@@ -1089,12 +1089,20 @@
 
 			if ( material.emissive ) {
 
-				// note: `emissive` is not scaled by `material.emissiveIntensity` for now to accommodate glTF spec. see #21849.
-				const emissive = material.emissive.toArray();
+				// note: emissive components are limited to stay within the 0 - 1 range to accommodate glTF spec. see #21849 and #22000.
+				const emissive = material.emissive.clone().multiplyScalar( material.emissiveIntensity );
+				const maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b );
 
-				if ( ! equalArray( emissive, [ 0, 0, 0 ] ) ) {
+				if ( maxEmissiveComponent > 1 ) {
 
-					materialDef.emissiveFactor = emissive;
+					emissive.multiplyScalar( 1 / maxEmissiveComponent );
+					console.warn( 'THREE.GLTFExporter: Some emissive components exceed 1; emissive has been limited' );
+
+				}
+
+				if ( maxEmissiveComponent > 0 ) {
+
+					materialDef.emissiveFactor = emissive.toArray();
 
 				} // emissiveTexture
 

+ 9 - 0
examples/js/exporters/USDZExporter.js

@@ -396,6 +396,15 @@ ${array.join( '' )}
 		}
 
 		inputs.push( `${pad}float inputs:opacity = ${material.opacity}` );
+
+		if ( material.isMeshPhysicalMaterial ) {
+
+			inputs.push( `${pad}float inputs:clearcoat = ${material.clearcoat}` );
+			inputs.push( `${pad}float inputs:clearcoatRoughness = ${material.clearcoatRoughness}` );
+			inputs.push( `${pad}float inputs:ior = ${material.ior}` );
+
+		}
+
 		return `
     def Material "Material_${material.id}"
     {

+ 8 - 6
examples/js/lines/LineMaterial.js

@@ -39,7 +39,9 @@
 	};
 	THREE.ShaderLib[ 'line' ] = {
 		uniforms: THREE.UniformsUtils.merge( [ THREE.UniformsLib.common, THREE.UniformsLib.fog, THREE.UniformsLib.line ] ),
-		vertexShader: `
+		vertexShader:
+  /* glsl */
+  `
 		#include <common>
 		#include <color_pars_vertex>
 		#include <fog_pars_vertex>
@@ -182,9 +184,10 @@
 			#include <clipping_planes_vertex>
 			#include <fog_vertex>
 
-		}
-		`,
-		fragmentShader: `
+		}`,
+		fragmentShader:
+  /* glsl */
+  `
 		uniform vec3 diffuse;
 		uniform float opacity;
 
@@ -260,8 +263,7 @@
 			#include <fog_fragment>
 			#include <premultiplied_alpha_fragment>
 
-		}
-		`
+		}`
 	};
 
 	class LineMaterial extends THREE.ShaderMaterial {

+ 12 - 5
examples/js/loaders/GLTFLoader.js

@@ -634,7 +634,7 @@
 
 	}
 	/**
- * BasisU Texture Extension
+ * BasisU THREE.Texture Extension
  *
  * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu
  */
@@ -686,7 +686,7 @@
 
 	}
 	/**
- * WebP Texture Extension
+ * WebP THREE.Texture Extension
  *
  * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp
  */
@@ -986,7 +986,7 @@
 
 	}
 	/**
- * Texture Transform Extension
+ * THREE.Texture Transform Extension
  *
  * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform
  */
@@ -2340,7 +2340,9 @@
 
 						onLoad = function ( imageBitmap ) {
 
-							resolve( new THREE.CanvasTexture( imageBitmap ) );
+							const texture = new THREE.Texture( imageBitmap );
+							texture.needsUpdate = true;
+							resolve( texture );
 
 						};
 
@@ -2352,7 +2354,7 @@
 
 			} ).then( function ( texture ) {
 
-				// Clean up resources and configure Texture.
+				// Clean up resources and configure THREE.Texture.
 				if ( isObjectURL === true ) {
 
 					URL.revokeObjectURL( sourceURI );
@@ -2375,6 +2377,11 @@
 				} );
 				return texture;
 
+			} ).catch( function () {
+
+				console.error( 'THREE.GLTFLoader: Couldn\'t load texture', sourceURI );
+				return null;
+
 			} );
 			this.textureCache[ cacheKey ] = promise;
 			return promise;

+ 106 - 10
examples/js/loaders/MMDLoader.js

@@ -921,7 +921,7 @@
    * @param {BufferGeometry} geometry - some properties are dependend on geometry
    * @param {function} onProgress
    * @param {function} onError
-   * @return {Array<MeshToonMaterial>}
+   * @return {Array<MMDToonMaterial>}
    */
 
 
@@ -937,23 +937,26 @@
 
 				const material = data.materials[ i ];
 				const params = {
-					userData: {}
+					userData: {
+						MMD: {}
+					}
 				};
 				if ( material.name !== undefined ) params.name = material.name;
 				/*
       	 * THREE.Color
       	 *
-      	 * MMD         THREE.MeshToonMaterial
-      	 * diffuse  -  color
+      	 * MMD         MMDToonMaterial
       	 * ambient  -  emissive * a
       	 *               (a = 1.0 without map texture or 0.2 with map texture)
       	 *
-      	 * THREE.MeshToonMaterial doesn't have ambient. Set it to emissive instead.
+      	 * MMDToonMaterial doesn't have ambient. Set it to emissive instead.
       	 * It'll be too bright if material has map texture so using coef 0.2.
       	 */
 
-				params.color = new THREE.Color().fromArray( material.diffuse );
+				params.diffuse = new THREE.Color().fromArray( material.diffuse );
 				params.opacity = material.diffuse[ 3 ];
+				params.specular = new THREE.Color().fromArray( material.specular );
+				params.shininess = material.shininess;
 				params.emissive = new THREE.Color().fromArray( material.ambient );
 				params.transparent = params.opacity !== 1.0; //
 
@@ -1016,15 +1019,21 @@
 					// map
 					if ( material.textureIndex !== - 1 ) {
 
-						params.map = this._loadTexture( data.textures[ material.textureIndex ], textures );
+						params.map = this._loadTexture( data.textures[ material.textureIndex ], textures ); // Since PMX spec don't have standard to list map files except color map and env map,
+						// we need to save file name for further mapping, like matching normal map file names after model loaded.
+						// ref: https://gist.github.com/felixjones/f8a06bd48f9da9a4539f#texture
+
+						params.userData.MMD.mapFileName = data.textures[ material.textureIndex ];
 
 					} // envMap TODO: support m.envFlag === 3
 
 
 					if ( material.envTextureIndex !== - 1 && ( material.envFlag === 1 || material.envFlag == 2 ) ) {
 
-						params.envMap = this._loadTexture( data.textures[ material.envTextureIndex ], textures );
-						params.combine = material.envFlag === 1 ? THREE.MultiplyOperation : THREE.AddOperation;
+						params.matcap = this._loadTexture( data.textures[ material.envTextureIndex ], textures ); // Same as color map above, keep file name in userData for further usage.
+
+						params.userData.MMD.matcapFileName = data.textures[ material.envTextureIndex ];
+						params.matcapCombine = material.envFlag === 1 ? THREE.MultiplyOperation : THREE.AddOperation;
 
 					} // gradientMap
 
@@ -1070,7 +1079,7 @@
 
 				}
 
-				materials.push( new THREE.MeshToonMaterial( params ) );
+				materials.push( new MMDToonMaterial( params ) );
 
 			}
 
@@ -1811,6 +1820,93 @@
 
 	}
 
+	class MMDToonMaterial extends THREE.ShaderMaterial {
+
+		constructor( parameters ) {
+
+			super();
+			this._matcapCombine = THREE.AddOperation;
+			this.emissiveIntensity = 1.0;
+			this.normalMapType = THREE.TangentSpaceNormalMap;
+			this.combine = THREE.MultiplyOperation;
+			this.wireframeLinecap = 'round';
+			this.wireframeLinejoin = 'round';
+			this.flatShading = false;
+			this.lights = true;
+			this.vertexShader = THREE.MMDToonShader.vertexShader;
+			this.fragmentShader = THREE.MMDToonShader.fragmentShader;
+			this.defines = Object.assign( {}, THREE.MMDToonShader.defines );
+			Object.defineProperty( this, 'matcapCombine', {
+				get: function () {
+
+					return this._matcapCombine;
+
+				},
+				set: function ( value ) {
+
+					this._matcapCombine = value;
+
+					switch ( value ) {
+
+						case THREE.MultiplyOperation:
+							this.defines.MATCAP_BLENDING_MULTIPLY = true;
+							delete this.defines.MATCAP_BLENDING_ADD;
+							break;
+
+						default:
+						case THREE.AddOperation:
+							this.defines.MATCAP_BLENDING_ADD = true;
+							delete this.defines.MATCAP_BLENDING_MULTIPLY;
+							break;
+
+					}
+
+				}
+			} );
+			this.uniforms = THREE.UniformsUtils.clone( THREE.MMDToonShader.uniforms ); // merged from MeshToon/Phong/MatcapMaterial
+
+			const exposePropertyNames = [ 'specular', 'shininess', 'opacity', 'diffuse', 'map', 'matcap', 'gradientMap', 'lightMap', 'lightMapIntensity', 'aoMap', 'aoMapIntensity', 'emissive', 'emissiveMap', 'bumpMap', 'bumpScale', 'normalMap', 'normalScale', 'displacemantBias', 'displacemantMap', 'displacemantScale', 'specularMap', 'alphaMap', 'envMap', 'reflectivity', 'refractionRatio' ];
+
+			for ( const propertyName of exposePropertyNames ) {
+
+				Object.defineProperty( this, propertyName, {
+					get: function () {
+
+						return this.uniforms[ propertyName ].value;
+
+					},
+					set: function ( value ) {
+
+						this.uniforms[ propertyName ].value = value;
+
+					}
+				} );
+
+			}
+
+			Object.defineProperty( this, 'color', Object.getOwnPropertyDescriptor( this, 'diffuse' ) );
+			this.setValues( parameters );
+
+		}
+
+		copy( source ) {
+
+			super.copy( source );
+			this.matcapCombine = source.matcapCombine;
+			this.emissiveIntensity = source.emissiveIntensity;
+			this.normalMapType = source.normalMapType;
+			this.combine = source.combine;
+			this.wireframeLinecap = source.wireframeLinecap;
+			this.wireframeLinejoin = source.wireframeLinejoin;
+			this.flatShading = source.flatShading;
+			return this;
+
+		}
+
+	}
+
+	MMDToonMaterial.prototype.isMMDToonMaterial = true;
+
 	THREE.MMDLoader = MMDLoader;
 
 } )();

+ 30 - 13
examples/js/loaders/NRRDLoader.js

@@ -362,37 +362,54 @@
 			volume.dimensions = [ headerObject.sizes[ 0 ], headerObject.sizes[ 1 ], headerObject.sizes[ 2 ] ];
 			volume.xLength = volume.dimensions[ 0 ];
 			volume.yLength = volume.dimensions[ 1 ];
-			volume.zLength = volume.dimensions[ 2 ]; // spacing
+			volume.zLength = volume.dimensions[ 2 ]; // Identify axis order in the space-directions matrix from the header if possible.
 
-			const spacingX = new THREE.Vector3( headerObject.vectors[ 0 ][ 0 ], headerObject.vectors[ 0 ][ 1 ], headerObject.vectors[ 0 ][ 2 ] ).length();
-			const spacingY = new THREE.Vector3( headerObject.vectors[ 1 ][ 0 ], headerObject.vectors[ 1 ][ 1 ], headerObject.vectors[ 1 ][ 2 ] ).length();
-			const spacingZ = new THREE.Vector3( headerObject.vectors[ 2 ][ 0 ], headerObject.vectors[ 2 ][ 1 ], headerObject.vectors[ 2 ][ 2 ] ).length();
+			if ( headerObject.vectors ) {
+
+				const xIndex = headerObject.vectors.findIndex( vector => vector[ 0 ] !== 0 );
+				const yIndex = headerObject.vectors.findIndex( vector => vector[ 1 ] !== 0 );
+				const zIndex = headerObject.vectors.findIndex( vector => vector[ 2 ] !== 0 );
+				const axisOrder = [];
+				axisOrder[ xIndex ] = 'x';
+				axisOrder[ yIndex ] = 'y';
+				axisOrder[ zIndex ] = 'z';
+				volume.axisOrder = axisOrder;
+
+			} else {
+
+				volume.axisOrder = [ 'x', 'y', 'z' ];
+
+			} // spacing
+
+
+			const spacingX = new THREE.Vector3().fromArray( headerObject.vectors[ 0 ] ).length();
+			const spacingY = new THREE.Vector3().fromArray( headerObject.vectors[ 1 ] ).length();
+			const spacingZ = new THREE.Vector3().fromArray( headerObject.vectors[ 2 ] ).length();
 			volume.spacing = [ spacingX, spacingY, spacingZ ]; // Create IJKtoRAS matrix
 
 			volume.matrix = new THREE.Matrix4();
-			let _spaceX = 1;
-			let _spaceY = 1;
-			const _spaceZ = 1;
+			const transitionMatrix = new THREE.Matrix4();
 
-			if ( headerObject.space == 'left-posterior-superior' ) {
+			if ( headerObject.space === 'left-posterior-superior' ) {
 
-				_spaceX = - 1;
-				_spaceY = - 1;
+				transitionMatrix.set( - 1, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 );
 
 			} else if ( headerObject.space === 'left-anterior-superior' ) {
 
-				_spaceX = - 1;
+				transitionMatrix.set( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 1 );
 
 			}
 
 			if ( ! headerObject.vectors ) {
 
-				volume.matrix.set( _spaceX, 0, 0, 0, 0, _spaceY, 0, 0, 0, 0, _spaceZ, 0, 0, 0, 0, 1 );
+				volume.matrix.set( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 );
 
 			} else {
 
 				const v = headerObject.vectors;
-				volume.matrix.set( _spaceX * v[ 0 ][ 0 ], _spaceX * v[ 1 ][ 0 ], _spaceX * v[ 2 ][ 0 ], 0, _spaceY * v[ 0 ][ 1 ], _spaceY * v[ 1 ][ 1 ], _spaceY * v[ 2 ][ 1 ], 0, _spaceZ * v[ 0 ][ 2 ], _spaceZ * v[ 1 ][ 2 ], _spaceZ * v[ 2 ][ 2 ], 0, 0, 0, 0, 1 );
+				const ijk_to_transition = new THREE.Matrix4().set( v[ 0 ][ 0 ], v[ 1 ][ 0 ], v[ 2 ][ 0 ], 0, v[ 0 ][ 1 ], v[ 1 ][ 1 ], v[ 2 ][ 1 ], 0, v[ 0 ][ 2 ], v[ 1 ][ 2 ], v[ 2 ][ 2 ], 0, 0, 0, 0, 1 );
+				const transition_to_ras = new THREE.Matrix4().multiplyMatrices( ijk_to_transition, transitionMatrix );
+				volume.matrix = transition_to_ras;
 
 			}
 

+ 13 - 8
examples/js/misc/Volume.js

@@ -13,7 +13,7 @@
  * @param   {ArrayBuffer}   arrayBuffer     The buffer with volume data
  */
 
-	var Volume = function ( xLength, yLength, zLength, type, arrayBuffer ) {
+	function Volume( xLength, yLength, zLength, type, arrayBuffer ) {
 
 		if ( arguments.length > 0 ) {
 
@@ -32,6 +32,11 @@
 
 			this.zLength = Number( zLength ) || 1;
 			/**
+     * @member {Array<string>} The order of the Axis dictated by the NRRD header
+     */
+
+			this.axisOrder = [ 'x', 'y', 'z' ];
+			/**
      * @member {TypedArray} data Data of the volume
      */
 
@@ -202,7 +207,7 @@
    * @member {Array} RASDimensions This array holds the dimensions of the volume in the RAS space
    */
 
-	};
+	}
 
 	Volume.prototype = {
 		constructor: Volume,
@@ -306,8 +311,8 @@
 					axisInIJK.set( 1, 0, 0 );
 					firstDirection.set( 0, 0, - 1 );
 					secondDirection.set( 0, - 1, 0 );
-					firstSpacing = this.spacing[ 2 ];
-					secondSpacing = this.spacing[ 1 ];
+					firstSpacing = this.spacing[ this.axisOrder.indexOf( 'z' ) ];
+					secondSpacing = this.spacing[ this.axisOrder.indexOf( 'y' ) ];
 					IJKIndex = new THREE.Vector3( RASIndex, 0, 0 );
 					planeMatrix.multiply( new THREE.Matrix4().makeRotationY( Math.PI / 2 ) );
 					positionOffset = ( volume.RASDimensions[ 0 ] - 1 ) / 2;
@@ -318,8 +323,8 @@
 					axisInIJK.set( 0, 1, 0 );
 					firstDirection.set( 1, 0, 0 );
 					secondDirection.set( 0, 0, 1 );
-					firstSpacing = this.spacing[ 0 ];
-					secondSpacing = this.spacing[ 2 ];
+					firstSpacing = this.spacing[ this.axisOrder.indexOf( 'x' ) ];
+					secondSpacing = this.spacing[ this.axisOrder.indexOf( 'z' ) ];
 					IJKIndex = new THREE.Vector3( 0, RASIndex, 0 );
 					planeMatrix.multiply( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );
 					positionOffset = ( volume.RASDimensions[ 1 ] - 1 ) / 2;
@@ -331,8 +336,8 @@
 					axisInIJK.set( 0, 0, 1 );
 					firstDirection.set( 1, 0, 0 );
 					secondDirection.set( 0, - 1, 0 );
-					firstSpacing = this.spacing[ 0 ];
-					secondSpacing = this.spacing[ 1 ];
+					firstSpacing = this.spacing[ this.axisOrder.indexOf( 'x' ) ];
+					secondSpacing = this.spacing[ this.axisOrder.indexOf( 'y' ) ];
 					IJKIndex = new THREE.Vector3( 0, 0, RASIndex );
 					positionOffset = ( volume.RASDimensions[ 2 ] - 1 ) / 2;
 					planeMatrix.setPosition( new THREE.Vector3( 0, 0, RASIndex - positionOffset ) );

+ 2 - 2
examples/js/misc/VolumeSlice.js

@@ -9,7 +9,7 @@
  * @see Volume
  */
 
-	var VolumeSlice = function ( volume, index, axis ) {
+	function VolumeSlice( volume, index, axis ) {
 
 		var slice = this;
 		/**
@@ -96,7 +96,7 @@
    * @returns {Number} the index corresponding to the voxel in volume.data of the given position in the slice
    */
 
-	};
+	}
 
 	VolumeSlice.prototype = {
 		constructor: VolumeSlice,

+ 7 - 8
examples/js/modifiers/SimplifyModifier.js

@@ -53,7 +53,7 @@
 			for ( let i = 0; i < positionAttribute.count; i ++ ) {
 
 				const v = new THREE.Vector3().fromBufferAttribute( positionAttribute, i );
-				const vertex = new Vertex( v, i );
+				const vertex = new Vertex( v );
 				vertices.push( vertex );
 
 			} // add faces
@@ -120,7 +120,9 @@
 			for ( let i = 0; i < vertices.length; i ++ ) {
 
 				const vertex = vertices[ i ].position;
-				position.push( vertex.x, vertex.y, vertex.z );
+				position.push( vertex.x, vertex.y, vertex.z ); // cache final index to GREATLY speed up faces reconstruction
+
+				vertices[ i ].id = i;
 
 			} //
 
@@ -128,10 +130,7 @@
 			for ( let i = 0; i < faces.length; i ++ ) {
 
 				const face = faces[ i ];
-				const a = vertices.indexOf( face.v1 );
-				const b = vertices.indexOf( face.v2 );
-				const c = vertices.indexOf( face.v3 );
-				index.push( a, b, c );
+				index.push( face.v1.id, face.v2.id, face.v3.id );
 
 			} //
 
@@ -440,10 +439,10 @@
 
 	class Vertex {
 
-		constructor( v, id ) {
+		constructor( v ) {
 
 			this.position = v;
-			this.id = id; // old index id
+			this.id = - 1; // external use position in vertices list (for e.g. face generation)
 
 			this.faces = []; // faces vertex is connected
 

+ 9 - 0
examples/js/objects/Reflector.js

@@ -158,12 +158,17 @@
 		uniform mat4 textureMatrix;
 		varying vec4 vUv;
 
+		#include <common>
+		#include <logdepthbuf_pars_vertex>
+
 		void main() {
 
 			vUv = textureMatrix * vec4( position, 1.0 );
 
 			gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
 
+			#include <logdepthbuf_vertex>
+
 		}`,
 		fragmentShader:
   /* glsl */
@@ -172,6 +177,8 @@
 		uniform sampler2D tDiffuse;
 		varying vec4 vUv;
 
+		#include <logdepthbuf_pars_fragment>
+
 		float blendOverlay( float base, float blend ) {
 
 			return( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );
@@ -186,6 +193,8 @@
 
 		void main() {
 
+			#include <logdepthbuf_fragment>
+
 			vec4 base = texture2DProj( tDiffuse, vUv );
 			gl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );
 

+ 110 - 0
examples/js/shaders/MMDToonShader.js

@@ -0,0 +1,110 @@
+( function () {
+
+	/**
+ * MMD Toon Shader
+ *
+ * This shader is extended from MeshPhongMaterial, and merged algorithms with
+ * MeshToonMaterial and MeshMetcapMaterial.
+ * Ideas came from https://github.com/mrdoob/three.js/issues/19609
+ *
+ * Combining steps:
+ *  * Declare matcap uniform.
+ *  * Add gradientmap_pars_fragment.
+ *  * Use gradient irradiances instead of dotNL irradiance from MeshPhongMaterial.
+ *    (Replace lights_phong_pars_fragment with lights_mmd_toon_pars_fragment)
+ *  * Add mmd_toon_matcap_fragment.
+ */
+	const lights_mmd_toon_pars_fragment = `
+varying vec3 vViewPosition;
+
+#ifndef FLAT_SHADED
+
+	varying vec3 vNormal;
+
+#endif
+
+
+struct BlinnPhongMaterial {
+
+	vec3 diffuseColor;
+	vec3 specularColor;
+	float specularShininess;
+	float specularStrength;
+
+};
+
+void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
+
+	vec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;
+
+	#ifndef PHYSICALLY_CORRECT_LIGHTS
+
+		irradiance *= PI; // punctual light
+
+	#endif
+
+	reflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );
+
+	reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;
+
+}
+
+void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
+
+	reflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );
+
+}
+
+#define RE_Direct				RE_Direct_BlinnPhong
+#define RE_IndirectDiffuse		RE_IndirectDiffuse_BlinnPhong
+
+#define Material_LightProbeLOD( material )	(0)
+`;
+	const mmd_toon_matcap_fragment = `
+#ifdef USE_MATCAP
+
+	vec3 viewDir = normalize( vViewPosition );
+	vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );
+	vec3 y = cross( viewDir, x );
+	vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks
+	vec4 matcapColor = texture2D( matcap, uv );
+	matcapColor = matcapTexelToLinear( matcapColor );
+
+	#ifdef MATCAP_BLENDING_MULTIPLY
+
+		outgoingLight *= matcapColor.rgb;
+
+	#elif defined( MATCAP_BLENDING_ADD )
+
+		outgoingLight += matcapColor.rgb;
+
+	#endif
+
+#endif
+`;
+	const MMDToonShader = {
+		defines: {
+			TOON: true,
+			MATCAP: true,
+			MATCAP_BLENDING_ADD: true
+		},
+		uniforms: THREE.UniformsUtils.merge( [ THREE.ShaderLib.toon.uniforms, THREE.ShaderLib.phong.uniforms, THREE.ShaderLib.matcap.uniforms ] ),
+		vertexShader: THREE.ShaderLib.phong.vertexShader,
+		fragmentShader: THREE.ShaderLib.phong.fragmentShader.replace( '#include <common>', `
+					#ifdef USE_MATCAP
+						uniform sampler2D matcap;
+					#endif
+
+					#include <common>
+				` ).replace( '#include <envmap_common_pars_fragment>', `
+					#include <gradientmap_pars_fragment>
+					#include <envmap_common_pars_fragment>
+				` ).replace( '#include <lights_phong_pars_fragment>', lights_mmd_toon_pars_fragment ).replace( '#include <envmap_fragment>', `
+					#include <envmap_fragment>
+					${mmd_toon_matcap_fragment}
+				` )
+	};
+
+	THREE.MMDToonShader = MMDToonShader;
+
+} )();

+ 1 - 1
examples/js/shaders/WaterRefractionShader.js

@@ -62,7 +62,7 @@
 
 		void main() {
 
-		 float waveStrength = 0.1;
+		 float waveStrength = 0.5;
 		 float waveSpeed = 0.03;
 
 			// simple distortion (ripple) via dudv map (see https://www.youtube.com/watch?v=6B7IF6GOu7s)

+ 44 - 162
examples/jsm/controls/DragControls.js

@@ -10,7 +10,7 @@ import {
 const _plane = new Plane();
 const _raycaster = new Raycaster();
 
-const _mouse = new Vector2();
+const _pointer = new Vector2();
 const _offset = new Vector3();
 const _intersection = new Vector3();
 const _worldPosition = new Vector3();
@@ -22,6 +22,8 @@ class DragControls extends EventDispatcher {
 
 		super();
 
+		_domElement.style.touchAction = 'none'; // disable touch scroll
+
 		let _selected = null, _hovered = null;
 
 		const _intersections = [];
@@ -36,9 +38,6 @@ class DragControls extends EventDispatcher {
 			_domElement.addEventListener( 'pointerdown', onPointerDown );
 			_domElement.addEventListener( 'pointerup', onPointerCancel );
 			_domElement.addEventListener( 'pointerleave', onPointerCancel );
-			_domElement.addEventListener( 'touchmove', onTouchMove, { passive: false } );
-			_domElement.addEventListener( 'touchstart', onTouchStart, { passive: false } );
-			_domElement.addEventListener( 'touchend', onTouchEnd );
 
 		}
 
@@ -48,9 +47,6 @@ class DragControls extends EventDispatcher {
 			_domElement.removeEventListener( 'pointerdown', onPointerDown );
 			_domElement.removeEventListener( 'pointerup', onPointerCancel );
 			_domElement.removeEventListener( 'pointerleave', onPointerCancel );
-			_domElement.removeEventListener( 'touchmove', onTouchMove );
-			_domElement.removeEventListener( 'touchstart', onTouchStart );
-			_domElement.removeEventListener( 'touchend', onTouchEnd );
 
 			_domElement.style.cursor = '';
 
@@ -70,31 +66,13 @@ class DragControls extends EventDispatcher {
 
 		function onPointerMove( event ) {
 
-			event.preventDefault();
-
-			switch ( event.pointerType ) {
-
-				case 'mouse':
-				case 'pen':
-					onMouseMove( event );
-					break;
-
-				// TODO touch
-
-			}
-
-		}
-
-		function onMouseMove( event ) {
+			if ( scope.enabled === false ) return;
 
-			const rect = _domElement.getBoundingClientRect();
-
-			_mouse.x = ( ( event.clientX - rect.left ) / rect.width ) * 2 - 1;
-			_mouse.y = - ( ( event.clientY - rect.top ) / rect.height ) * 2 + 1;
+			updatePointer( event );
 
-			_raycaster.setFromCamera( _mouse, _camera );
+			_raycaster.setFromCamera( _pointer, _camera );
 
-			if ( _selected && scope.enabled ) {
+			if ( _selected ) {
 
 				if ( _raycaster.ray.intersectPlane( _plane, _intersection ) ) {
 
@@ -108,80 +86,73 @@ class DragControls extends EventDispatcher {
 
 			}
 
-			_intersections.length = 0;
-
-			_raycaster.setFromCamera( _mouse, _camera );
-			_raycaster.intersectObjects( _objects, true, _intersections );
-
-			if ( _intersections.length > 0 ) {
-
-				const object = _intersections[ 0 ].object;
+			// hover support
 
-				_plane.setFromNormalAndCoplanarPoint( _camera.getWorldDirection( _plane.normal ), _worldPosition.setFromMatrixPosition( object.matrixWorld ) );
+			if ( event.pointerType === 'mouse' || event.pointerType === 'pen' ) {
 
-				if ( _hovered !== object && _hovered !== null ) {
+				_intersections.length = 0;
 
-					scope.dispatchEvent( { type: 'hoveroff', object: _hovered } );
+				_raycaster.setFromCamera( _pointer, _camera );
+				_raycaster.intersectObjects( _objects, true, _intersections );
 
-					_domElement.style.cursor = 'auto';
-					_hovered = null;
+				if ( _intersections.length > 0 ) {
 
-				}
-
-				if ( _hovered !== object ) {
+					const object = _intersections[ 0 ].object;
 
-					scope.dispatchEvent( { type: 'hoveron', object: object } );
+					_plane.setFromNormalAndCoplanarPoint( _camera.getWorldDirection( _plane.normal ), _worldPosition.setFromMatrixPosition( object.matrixWorld ) );
 
-					_domElement.style.cursor = 'pointer';
-					_hovered = object;
+					if ( _hovered !== object && _hovered !== null ) {
 
-				}
+						scope.dispatchEvent( { type: 'hoveroff', object: _hovered } );
 
-			} else {
+						_domElement.style.cursor = 'auto';
+						_hovered = null;
 
-				if ( _hovered !== null ) {
+					}
 
-					scope.dispatchEvent( { type: 'hoveroff', object: _hovered } );
+					if ( _hovered !== object ) {
 
-					_domElement.style.cursor = 'auto';
-					_hovered = null;
+						scope.dispatchEvent( { type: 'hoveron', object: object } );
 
-				}
+						_domElement.style.cursor = 'pointer';
+						_hovered = object;
 
-			}
+					}
 
-		}
+				} else {
 
-		function onPointerDown( event ) {
+					if ( _hovered !== null ) {
 
-			event.preventDefault();
+						scope.dispatchEvent( { type: 'hoveroff', object: _hovered } );
 
-			switch ( event.pointerType ) {
+						_domElement.style.cursor = 'auto';
+						_hovered = null;
 
-				case 'mouse':
-				case 'pen':
-					onMouseDown( event );
-					break;
+					}
 
-				// TODO touch
+				}
 
 			}
 
 		}
 
-		function onMouseDown( event ) {
+		function onPointerDown() {
+
+			if ( scope.enabled === false ) return;
 
-			event.preventDefault();
+			updatePointer( event );
 
 			_intersections.length = 0;
 
-			_raycaster.setFromCamera( _mouse, _camera );
+			_raycaster.setFromCamera( _pointer, _camera );
 			_raycaster.intersectObjects( _objects, true, _intersections );
 
 			if ( _intersections.length > 0 ) {
 
 				_selected = ( scope.transformGroup === true ) ? _objects[ 0 ] : _intersections[ 0 ].object;
 
+				_plane.setFromNormalAndCoplanarPoint( _camera.getWorldDirection( _plane.normal ), _worldPosition.setFromMatrixPosition( _selected.matrixWorld ) );
+
 				if ( _raycaster.ray.intersectPlane( _plane, _intersection ) ) {
 
 					_inverseMatrix.copy( _selected.parent.matrixWorld ).invert();
@@ -198,26 +169,9 @@ class DragControls extends EventDispatcher {
 
 		}
 
-		function onPointerCancel( event ) {
-
-			event.preventDefault();
-
-			switch ( event.pointerType ) {
-
-				case 'mouse':
-				case 'pen':
-					onMouseCancel( event );
-					break;
-
-				// TODO touch
-
-			}
-
-		}
-
-		function onMouseCancel( event ) {
+		function onPointerCancel() {
 
-			event.preventDefault();
+			if ( scope.enabled === false ) return;
 
 			if ( _selected ) {
 
@@ -231,84 +185,12 @@ class DragControls extends EventDispatcher {
 
 		}
 
-		function onTouchMove( event ) {
-
-			event.preventDefault();
-			event = event.changedTouches[ 0 ];
+		function updatePointer( event ) {
 
 			const rect = _domElement.getBoundingClientRect();
 
-			_mouse.x = ( ( event.clientX - rect.left ) / rect.width ) * 2 - 1;
-			_mouse.y = - ( ( event.clientY - rect.top ) / rect.height ) * 2 + 1;
-
-			_raycaster.setFromCamera( _mouse, _camera );
-
-			if ( _selected && scope.enabled ) {
-
-				if ( _raycaster.ray.intersectPlane( _plane, _intersection ) ) {
-
-					_selected.position.copy( _intersection.sub( _offset ).applyMatrix4( _inverseMatrix ) );
-
-				}
-
-				scope.dispatchEvent( { type: 'drag', object: _selected } );
-
-				return;
-
-			}
-
-		}
-
-		function onTouchStart( event ) {
-
-			event.preventDefault();
-			event = event.changedTouches[ 0 ];
-
-			const rect = _domElement.getBoundingClientRect();
-
-			_mouse.x = ( ( event.clientX - rect.left ) / rect.width ) * 2 - 1;
-			_mouse.y = - ( ( event.clientY - rect.top ) / rect.height ) * 2 + 1;
-
-			_intersections.length = 0;
-
-			_raycaster.setFromCamera( _mouse, _camera );
-			 _raycaster.intersectObjects( _objects, true, _intersections );
-
-			if ( _intersections.length > 0 ) {
-
-				_selected = ( scope.transformGroup === true ) ? _objects[ 0 ] : _intersections[ 0 ].object;
-
-				_plane.setFromNormalAndCoplanarPoint( _camera.getWorldDirection( _plane.normal ), _worldPosition.setFromMatrixPosition( _selected.matrixWorld ) );
-
-				if ( _raycaster.ray.intersectPlane( _plane, _intersection ) ) {
-
-					_inverseMatrix.copy( _selected.parent.matrixWorld ).invert();
-					_offset.copy( _intersection ).sub( _worldPosition.setFromMatrixPosition( _selected.matrixWorld ) );
-
-				}
-
-				_domElement.style.cursor = 'move';
-
-				scope.dispatchEvent( { type: 'dragstart', object: _selected } );
-
-			}
-
-
-		}
-
-		function onTouchEnd( event ) {
-
-			event.preventDefault();
-
-			if ( _selected ) {
-
-				scope.dispatchEvent( { type: 'dragend', object: _selected } );
-
-				_selected = null;
-
-			}
-
-			_domElement.style.cursor = 'auto';
+			_pointer.x = ( event.clientX - rect.left ) / rect.width * 2 - 1;
+			_pointer.y = - ( event.clientY - rect.top ) / rect.height * 2 + 1;
 
 		}
 

+ 0 - 6
examples/jsm/controls/FirstPersonControls.js

@@ -91,8 +91,6 @@ class FirstPersonControls {
 
 			}
 
-			event.preventDefault();
-
 			if ( this.activeLook ) {
 
 				switch ( event.button ) {
@@ -110,8 +108,6 @@ class FirstPersonControls {
 
 		this.onMouseUp = function ( event ) {
 
-			event.preventDefault();
-
 			if ( this.activeLook ) {
 
 				switch ( event.button ) {
@@ -145,8 +141,6 @@ class FirstPersonControls {
 
 		this.onKeyDown = function ( event ) {
 
-			//event.preventDefault();
-
 			switch ( event.code ) {
 
 				case 'ArrowUp':

+ 0 - 12
examples/jsm/controls/FlyControls.js

@@ -57,8 +57,6 @@ class FlyControls extends EventDispatcher {
 
 			}
 
-			//event.preventDefault();
-
 			switch ( event.code ) {
 
 				case 'ShiftLeft':
@@ -123,14 +121,6 @@ class FlyControls extends EventDispatcher {
 
 		this.mousedown = function ( event ) {
 
-			if ( this.domElement !== document ) {
-
-				this.domElement.focus();
-
-			}
-
-			event.preventDefault();
-
 			if ( this.dragToLook ) {
 
 				this.mouseStatus ++;
@@ -169,8 +159,6 @@ class FlyControls extends EventDispatcher {
 
 		this.mouseup = function ( event ) {
 
-			event.preventDefault();
-
 			if ( this.dragToLook ) {
 
 				this.mouseStatus --;

+ 137 - 84
examples/jsm/controls/OrbitControls.js

@@ -30,6 +30,7 @@ class OrbitControls extends EventDispatcher {
 
 		this.object = object;
 		this.domElement = domElement;
+		this.domElement.style.touchAction = 'none'; // disable touch scroll
 
 		// Set to false to disable this control
 		this.enabled = true;
@@ -290,12 +291,9 @@ class OrbitControls extends EventDispatcher {
 			scope.domElement.removeEventListener( 'contextmenu', onContextMenu );
 
 			scope.domElement.removeEventListener( 'pointerdown', onPointerDown );
+			scope.domElement.removeEventListener( 'pointercancel', onPointerCancel );
 			scope.domElement.removeEventListener( 'wheel', onMouseWheel );
 
-			scope.domElement.removeEventListener( 'touchstart', onTouchStart );
-			scope.domElement.removeEventListener( 'touchend', onTouchEnd );
-			scope.domElement.removeEventListener( 'touchmove', onTouchMove );
-
 			scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
 			scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
 
@@ -351,6 +349,9 @@ class OrbitControls extends EventDispatcher {
 		const dollyEnd = new Vector2();
 		const dollyDelta = new Vector2();
 
+		const pointers = [];
+		const pointerPositions = {};
+
 		function getAutoRotationAngle() {
 
 			return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;
@@ -636,16 +637,16 @@ class OrbitControls extends EventDispatcher {
 
 		}
 
-		function handleTouchStartRotate( event ) {
+		function handleTouchStartRotate() {
 
-			if ( event.touches.length == 1 ) {
+			if ( pointers.length === 1 ) {
 
-				rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
+				rotateStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );
 
 			} else {
 
-				const x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );
-				const y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );
+				const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );
+				const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );
 
 				rotateStart.set( x, y );
 
@@ -653,16 +654,16 @@ class OrbitControls extends EventDispatcher {
 
 		}
 
-		function handleTouchStartPan( event ) {
+		function handleTouchStartPan() {
 
-			if ( event.touches.length == 1 ) {
+			if ( pointers.length === 1 ) {
 
-				panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
+				panStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );
 
 			} else {
 
-				const x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );
-				const y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );
+				const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );
+				const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );
 
 				panStart.set( x, y );
 
@@ -670,10 +671,10 @@ class OrbitControls extends EventDispatcher {
 
 		}
 
-		function handleTouchStartDolly( event ) {
+		function handleTouchStartDolly() {
 
-			const dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
-			const dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
+			const dx = pointers[ 0 ].pageX - pointers[ 1 ].pageX;
+			const dy = pointers[ 0 ].pageY - pointers[ 1 ].pageY;
 
 			const distance = Math.sqrt( dx * dx + dy * dy );
 
@@ -681,32 +682,34 @@ class OrbitControls extends EventDispatcher {
 
 		}
 
-		function handleTouchStartDollyPan( event ) {
+		function handleTouchStartDollyPan() {
 
-			if ( scope.enableZoom ) handleTouchStartDolly( event );
+			if ( scope.enableZoom ) handleTouchStartDolly();
 
-			if ( scope.enablePan ) handleTouchStartPan( event );
+			if ( scope.enablePan ) handleTouchStartPan();
 
 		}
 
-		function handleTouchStartDollyRotate( event ) {
+		function handleTouchStartDollyRotate() {
 
-			if ( scope.enableZoom ) handleTouchStartDolly( event );
+			if ( scope.enableZoom ) handleTouchStartDolly();
 
-			if ( scope.enableRotate ) handleTouchStartRotate( event );
+			if ( scope.enableRotate ) handleTouchStartRotate();
 
 		}
 
 		function handleTouchMoveRotate( event ) {
 
-			if ( event.touches.length == 1 ) {
+			if ( pointers.length == 1 ) {
 
-				rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
+				rotateEnd.set( event.pageX, event.pageY );
 
 			} else {
 
-				const x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );
-				const y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );
+				const position = getSecondPointerPosition( event );
+
+				const x = 0.5 * ( event.pageX + position.x );
+				const y = 0.5 * ( event.pageY + position.y );
 
 				rotateEnd.set( x, y );
 
@@ -726,14 +729,16 @@ class OrbitControls extends EventDispatcher {
 
 		function handleTouchMovePan( event ) {
 
-			if ( event.touches.length == 1 ) {
+			if ( pointers.length === 1 ) {
 
-				panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
+				panEnd.set( event.pageX, event.pageY );
 
 			} else {
 
-				const x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );
-				const y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );
+				const position = getSecondPointerPosition( event );
+
+				const x = 0.5 * ( event.pageX + position.x );
+				const y = 0.5 * ( event.pageY + position.y );
 
 				panEnd.set( x, y );
 
@@ -749,8 +754,10 @@ class OrbitControls extends EventDispatcher {
 
 		function handleTouchMoveDolly( event ) {
 
-			const dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
-			const dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
+			const position = getSecondPointerPosition( event );
+
+			const dx = event.pageX - position.x;
+			const dy = event.pageY - position.y;
 
 			const distance = Math.sqrt( dx * dx + dy * dy );
 
@@ -794,14 +801,24 @@ class OrbitControls extends EventDispatcher {
 
 			if ( scope.enabled === false ) return;
 
-			switch ( event.pointerType ) {
+			if ( pointers.length === 0 ) {
 
-				case 'mouse':
-				case 'pen':
-					onMouseDown( event );
-					break;
+				scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove );
+				scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp );
+
+			}
 
-				// TODO touch
+			//
+
+			addPointer( event );
+
+			if ( event.pointerType === 'touch' ) {
+
+				onTouchStart( event );
+
+			} else {
+
+				onMouseDown( event );
 
 			}
 
@@ -811,14 +828,13 @@ class OrbitControls extends EventDispatcher {
 
 			if ( scope.enabled === false ) return;
 
-			switch ( event.pointerType ) {
+			if ( event.pointerType === 'touch' ) {
 
-				case 'mouse':
-				case 'pen':
-					onMouseMove( event );
-					break;
+				onTouchMove( event );
 
-				// TODO touch
+			} else {
+
+				onMouseMove( event );
 
 			}
 
@@ -826,28 +842,38 @@ class OrbitControls extends EventDispatcher {
 
 		function onPointerUp( event ) {
 
-			switch ( event.pointerType ) {
+			if ( scope.enabled === false ) return;
+
+			if ( event.pointerType === 'touch' ) {
 
-				case 'mouse':
-				case 'pen':
-					onMouseUp( event );
-					break;
+				onTouchEnd();
+
+			} else {
+
+				onMouseUp( event );
+
+			}
+
+			removePointer( event );
+
+			//
+
+			if ( pointers.length === 0 ) {
 
-				// TODO touch
+				scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
+				scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
 
 			}
 
 		}
 
-		function onMouseDown( event ) {
+		function onPointerCancel( event ) {
 
-			// Prevent the browser from scrolling.
-			event.preventDefault();
+			removePointer( event );
 
-			// Manually set the focus since calling preventDefault above
-			// prevents the browser from setting it automatically.
+		}
 
-			scope.domElement.focus ? scope.domElement.focus() : window.focus();
+		function onMouseDown( event ) {
 
 			let mouseAction;
 
@@ -938,9 +964,6 @@ class OrbitControls extends EventDispatcher {
 
 			if ( state !== STATE.NONE ) {
 
-				scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove );
-				scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp );
-
 				scope.dispatchEvent( _startEvent );
 
 			}
@@ -951,8 +974,6 @@ class OrbitControls extends EventDispatcher {
 
 			if ( scope.enabled === false ) return;
 
-			event.preventDefault();
-
 			switch ( state ) {
 
 				case STATE.ROTATE:
@@ -985,11 +1006,6 @@ class OrbitControls extends EventDispatcher {
 
 		function onMouseUp( event ) {
 
-			scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
-			scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
-
-			if ( scope.enabled === false ) return;
-
 			handleMouseUp( event );
 
 			scope.dispatchEvent( _endEvent );
@@ -1022,11 +1038,9 @@ class OrbitControls extends EventDispatcher {
 
 		function onTouchStart( event ) {
 
-			if ( scope.enabled === false ) return;
-
-			event.preventDefault(); // prevent scrolling
+			trackPointer( event );
 
-			switch ( event.touches.length ) {
+			switch ( pointers.length ) {
 
 				case 1:
 
@@ -1036,7 +1050,7 @@ class OrbitControls extends EventDispatcher {
 
 							if ( scope.enableRotate === false ) return;
 
-							handleTouchStartRotate( event );
+							handleTouchStartRotate();
 
 							state = STATE.TOUCH_ROTATE;
 
@@ -1046,7 +1060,7 @@ class OrbitControls extends EventDispatcher {
 
 							if ( scope.enablePan === false ) return;
 
-							handleTouchStartPan( event );
+							handleTouchStartPan();
 
 							state = STATE.TOUCH_PAN;
 
@@ -1068,7 +1082,7 @@ class OrbitControls extends EventDispatcher {
 
 							if ( scope.enableZoom === false && scope.enablePan === false ) return;
 
-							handleTouchStartDollyPan( event );
+							handleTouchStartDollyPan();
 
 							state = STATE.TOUCH_DOLLY_PAN;
 
@@ -1078,7 +1092,7 @@ class OrbitControls extends EventDispatcher {
 
 							if ( scope.enableZoom === false && scope.enableRotate === false ) return;
 
-							handleTouchStartDollyRotate( event );
+							handleTouchStartDollyRotate();
 
 							state = STATE.TOUCH_DOLLY_ROTATE;
 
@@ -1108,9 +1122,7 @@ class OrbitControls extends EventDispatcher {
 
 		function onTouchMove( event ) {
 
-			if ( scope.enabled === false ) return;
-
-			event.preventDefault(); // prevent scrolling
+			trackPointer( event );
 
 			switch ( state ) {
 
@@ -1164,8 +1176,6 @@ class OrbitControls extends EventDispatcher {
 
 		function onTouchEnd( event ) {
 
-			if ( scope.enabled === false ) return;
-
 			handleTouchEnd( event );
 
 			scope.dispatchEvent( _endEvent );
@@ -1182,17 +1192,60 @@ class OrbitControls extends EventDispatcher {
 
 		}
 
+		function addPointer( event ) {
+
+			pointers.push( event );
+
+		}
+
+		function removePointer( event ) {
+
+			delete pointerPositions[ event.pointerId ];
+
+			for ( let i = 0; i < pointers.length; i ++ ) {
+
+				if ( pointers[ i ].pointerId == event.pointerId ) {
+
+					pointers.splice( i, 1 );
+					return;
+
+				}
+
+			}
+
+		}
+
+		function trackPointer( event ) {
+
+			let position = pointerPositions[ event.pointerId ];
+
+			if ( position === undefined ) {
+
+				position = new Vector2();
+				pointerPositions[ event.pointerId ] = position;
+
+			}
+
+			position.set( event.pageX, event.pageY );
+
+		}
+
+		function getSecondPointerPosition( event ) {
+
+			const pointer = ( event.pointerId === pointers[ 0 ].pointerId ) ? pointers[ 1 ] : pointers[ 0 ];
+
+			return pointerPositions[ pointer.pointerId ];
+
+		}
+
 		//
 
 		scope.domElement.addEventListener( 'contextmenu', onContextMenu );
 
 		scope.domElement.addEventListener( 'pointerdown', onPointerDown );
+		scope.domElement.addEventListener( 'pointercancel', onPointerCancel );
 		scope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );
 
-		scope.domElement.addEventListener( 'touchstart', onTouchStart, { passive: false } );
-		scope.domElement.addEventListener( 'touchend', onTouchEnd );
-		scope.domElement.addEventListener( 'touchmove', onTouchMove, { passive: false } );
-
 		// force an update at start
 
 		this.update();

+ 123 - 71
examples/jsm/controls/TrackballControls.js

@@ -24,6 +24,7 @@ class TrackballControls extends EventDispatcher {
 
 		this.object = object;
 		this.domElement = domElement;
+		this.domElement.style.touchAction = 'none'; // disable touch scroll
 
 		// API
 
@@ -77,7 +78,10 @@ class TrackballControls extends EventDispatcher {
 			_zoomEnd = new Vector2(),
 
 			_panStart = new Vector2(),
-			_panEnd = new Vector2();
+			_panEnd = new Vector2(),
+
+			_pointers = [],
+			_pointerPositions = {};
 
 		// for reset
 
@@ -406,14 +410,24 @@ class TrackballControls extends EventDispatcher {
 
 			if ( scope.enabled === false ) return;
 
-			switch ( event.pointerType ) {
+			if ( _pointers.length === 0 ) {
 
-				case 'mouse':
-				case 'pen':
-					onMouseDown( event );
-					break;
+				scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove );
+				scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp );
+
+			}
+
+			//
+
+			addPointer( event );
 
-				// TODO touch
+			if ( event.pointerType === 'touch' ) {
+
+				onTouchStart( event );
+
+			} else {
+
+				onMouseDown( event );
 
 			}
 
@@ -423,14 +437,13 @@ class TrackballControls extends EventDispatcher {
 
 			if ( scope.enabled === false ) return;
 
-			switch ( event.pointerType ) {
+			if ( event.pointerType === 'touch' ) {
 
-				case 'mouse':
-				case 'pen':
-					onMouseMove( event );
-					break;
+				onTouchMove( event );
 
-				// TODO touch
+			} else {
+
+				onMouseMove( event );
 
 			}
 
@@ -440,17 +453,34 @@ class TrackballControls extends EventDispatcher {
 
 			if ( scope.enabled === false ) return;
 
-			switch ( event.pointerType ) {
+			if ( event.pointerType === 'touch' ) {
 
-				case 'mouse':
-				case 'pen':
-					onMouseUp( event );
-					break;
+				onTouchEnd( event );
+
+			} else {
 
-				// TODO touch
+				onMouseUp();
 
 			}
 
+			//
+
+			removePointer( event );
+
+			if ( _pointers.length === 0 ) {
+
+				scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
+				scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
+
+			}
+
+
+		}
+
+		function onPointerCancel( event ) {
+
+			removePointer( event );
+
 		}
 
 		function keydown( event ) {
@@ -491,8 +521,6 @@ class TrackballControls extends EventDispatcher {
 
 		function onMouseDown( event ) {
 
-			event.preventDefault();
-
 			if ( _state === STATE.NONE ) {
 
 				switch ( event.button ) {
@@ -544,10 +572,6 @@ class TrackballControls extends EventDispatcher {
 
 		function onMouseMove( event ) {
 
-			if ( scope.enabled === false ) return;
-
-			event.preventDefault();
-
 			const state = ( _keyState !== STATE.NONE ) ? _keyState : _state;
 
 			if ( state === STATE.ROTATE && ! scope.noRotate ) {
@@ -567,11 +591,7 @@ class TrackballControls extends EventDispatcher {
 
 		}
 
-		function onMouseUp( event ) {
-
-			if ( scope.enabled === false ) return;
-
-			event.preventDefault();
+		function onMouseUp() {
 
 			_state = STATE.NONE;
 
@@ -582,7 +602,7 @@ class TrackballControls extends EventDispatcher {
 
 		}
 
-		function mousewheel( event ) {
+		function onMouseWheel( event ) {
 
 			if ( scope.enabled === false ) return;
 
@@ -614,28 +634,26 @@ class TrackballControls extends EventDispatcher {
 
 		}
 
-		function touchstart( event ) {
+		function onTouchStart( event ) {
 
-			if ( scope.enabled === false ) return;
+			trackPointer( event );
 
-			event.preventDefault();
-
-			switch ( event.touches.length ) {
+			switch ( _pointers.length ) {
 
 				case 1:
 					_state = STATE.TOUCH_ROTATE;
-					_moveCurr.copy( getMouseOnCircle( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) );
+					_moveCurr.copy( getMouseOnCircle( _pointers[ 0 ].pageX, _pointers[ 0 ].pageY ) );
 					_movePrev.copy( _moveCurr );
 					break;
 
 				default: // 2 or more
 					_state = STATE.TOUCH_ZOOM_PAN;
-					const dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
-					const dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
+					const dx = _pointers[ 0 ].pageX - _pointers[ 1 ].pageX;
+					const dy = _pointers[ 0 ].pageY - _pointers[ 1 ].pageY;
 					_touchZoomDistanceEnd = _touchZoomDistanceStart = Math.sqrt( dx * dx + dy * dy );
 
-					const x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2;
-					const y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2;
+					const x = ( _pointers[ 0 ].pageX + _pointers[ 1 ].pageX ) / 2;
+					const y = ( _pointers[ 0 ].pageY + _pointers[ 1 ].pageY ) / 2;
 					_panStart.copy( getMouseOnScreen( x, y ) );
 					_panEnd.copy( _panStart );
 					break;
@@ -646,26 +664,27 @@ class TrackballControls extends EventDispatcher {
 
 		}
 
-		function touchmove( event ) {
+		function onTouchMove( event ) {
 
-			if ( scope.enabled === false ) return;
+			trackPointer( event );
 
-			event.preventDefault();
-
-			switch ( event.touches.length ) {
+			switch ( _pointers.length ) {
 
 				case 1:
 					_movePrev.copy( _moveCurr );
-					_moveCurr.copy( getMouseOnCircle( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) );
+					_moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) );
 					break;
 
 				default: // 2 or more
-					const dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
-					const dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
+
+					const position = getSecondPointerPosition( event );
+
+					const dx = event.pageX - position.x;
+					const dy = event.pageY - position.y;
 					_touchZoomDistanceEnd = Math.sqrt( dx * dx + dy * dy );
 
-					const x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2;
-					const y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2;
+					const x = ( event.pageX + position.x ) / 2;
+					const y = ( event.pageY + position.y ) / 2;
 					_panEnd.copy( getMouseOnScreen( x, y ) );
 					break;
 
@@ -673,11 +692,9 @@ class TrackballControls extends EventDispatcher {
 
 		}
 
-		function touchend( event ) {
-
-			if ( scope.enabled === false ) return;
+		function onTouchEnd( event ) {
 
-			switch ( event.touches.length ) {
+			switch ( _pointers.length ) {
 
 				case 0:
 					_state = STATE.NONE;
@@ -685,7 +702,7 @@ class TrackballControls extends EventDispatcher {
 
 				case 1:
 					_state = STATE.TOUCH_ROTATE;
-					_moveCurr.copy( getMouseOnCircle( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) );
+					_moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) );
 					_movePrev.copy( _moveCurr );
 					break;
 
@@ -703,19 +720,59 @@ class TrackballControls extends EventDispatcher {
 
 		}
 
+		function addPointer( event ) {
+
+			_pointers.push( event );
+
+		}
+
+		function removePointer( event ) {
+
+			delete _pointerPositions[ event.pointerId ];
+
+			for ( let i = 0; i < _pointers.length; i ++ ) {
+
+				if ( _pointers[ i ].pointerId == event.pointerId ) {
+
+					_pointers.splice( i, 1 );
+					return;
+
+				}
+
+			}
+
+		}
+
+		function trackPointer( event ) {
+
+			let position = _pointerPositions[ event.pointerId ];
+
+			if ( position === undefined ) {
+
+				position = new Vector2();
+				_pointerPositions[ event.pointerId ] = position;
+
+			}
+
+			position.set( event.pageX, event.pageY );
+
+		}
+
+		function getSecondPointerPosition( event ) {
+
+			const pointer = ( event.pointerId === _pointers[ 0 ].pointerId ) ? _pointers[ 1 ] : _pointers[ 0 ];
+
+			return _pointerPositions[ pointer.pointerId ];
+
+		}
+
 		this.dispose = function () {
 
 			scope.domElement.removeEventListener( 'contextmenu', contextmenu );
 
 			scope.domElement.removeEventListener( 'pointerdown', onPointerDown );
-			scope.domElement.removeEventListener( 'wheel', mousewheel );
-
-			scope.domElement.removeEventListener( 'touchstart', touchstart );
-			scope.domElement.removeEventListener( 'touchend', touchend );
-			scope.domElement.removeEventListener( 'touchmove', touchmove );
-
-			scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
-			scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
+			scope.domElement.removeEventListener( 'pointercancel', onPointerCancel );
+			scope.domElement.removeEventListener( 'wheel', onMouseWheel );
 
 			window.removeEventListener( 'keydown', keydown );
 			window.removeEventListener( 'keyup', keyup );
@@ -725,14 +782,9 @@ class TrackballControls extends EventDispatcher {
 		this.domElement.addEventListener( 'contextmenu', contextmenu );
 
 		this.domElement.addEventListener( 'pointerdown', onPointerDown );
-		this.domElement.addEventListener( 'wheel', mousewheel, { passive: false } );
-
-		this.domElement.addEventListener( 'touchstart', touchstart, { passive: false } );
-		this.domElement.addEventListener( 'touchend', touchend );
-		this.domElement.addEventListener( 'touchmove', touchmove, { passive: false } );
+		this.domElement.addEventListener( 'pointercancel', onPointerCancel );
+		this.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );
 
-		this.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove );
-		this.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp );
 
 		window.addEventListener( 'keydown', keydown );
 		window.addEventListener( 'keyup', keyup );

+ 109 - 233
examples/jsm/controls/TransformControls.js

@@ -1,7 +1,6 @@
 import {
 	BoxGeometry,
 	BufferGeometry,
-	Color,
 	CylinderGeometry,
 	DoubleSide,
 	Euler,
@@ -52,6 +51,7 @@ class TransformControls extends Object3D {
 
 		this.visible = false;
 		this.domElement = domElement;
+		this.domElement.style.touchAction = 'none'; // disable touch scroll
 
 		const _gizmo = new TransformControlsGizmo();
 		this._gizmo = _gizmo;
@@ -654,13 +654,11 @@ function getPointer( event ) {
 
 	} else {
 
-		const pointer = event.changedTouches ? event.changedTouches[ 0 ] : event;
-
 		const rect = this.domElement.getBoundingClientRect();
 
 		return {
-			x: ( pointer.clientX - rect.left ) / rect.width * 2 - 1,
-			y: - ( pointer.clientY - rect.top ) / rect.height * 2 + 1,
+			x: ( event.clientX - rect.left ) / rect.width * 2 - 1,
+			y: - ( event.clientY - rect.top ) / rect.height * 2 + 1,
 			button: event.button
 		};
 
@@ -687,7 +685,6 @@ function onPointerDown( event ) {
 
 	if ( ! this.enabled ) return;
 
-	this.domElement.style.touchAction = 'none'; // disable touch scroll
 	this.domElement.ownerDocument.addEventListener( 'pointermove', this._onPointerMove );
 
 	this.pointerHover( this._getPointer( event ) );
@@ -707,7 +704,6 @@ function onPointerUp( event ) {
 
 	if ( ! this.enabled ) return;
 
-	this.domElement.style.touchAction = '';
 	this.domElement.ownerDocument.removeEventListener( 'pointermove', this._onPointerMove );
 
 	this.pointerUp( this._getPointer( event ) );
@@ -766,19 +762,17 @@ class TransformControlsGizmo extends Object3D {
 		const gizmoMaterial = new MeshBasicMaterial( {
 			depthTest: false,
 			depthWrite: false,
-			transparent: true,
-			side: DoubleSide,
 			fog: false,
-			toneMapped: false
+			toneMapped: false,
+			transparent: true
 		} );
 
 		const gizmoLineMaterial = new LineBasicMaterial( {
 			depthTest: false,
 			depthWrite: false,
-			transparent: true,
-			linewidth: 1,
 			fog: false,
-			toneMapped: false
+			toneMapped: false,
+			transparent: true
 		} );
 
 		// Make unique material for each axis/color
@@ -786,79 +780,62 @@ class TransformControlsGizmo extends Object3D {
 		const matInvisible = gizmoMaterial.clone();
 		matInvisible.opacity = 0.15;
 
-		const matHelper = gizmoMaterial.clone();
-		matHelper.opacity = 0.33;
+		const matHelper = gizmoLineMaterial.clone();
+		matHelper.opacity = 0.5;
 
 		const matRed = gizmoMaterial.clone();
-		matRed.color.set( 0xff0000 );
+		matRed.color.setHex( 0xff0000 );
 
 		const matGreen = gizmoMaterial.clone();
-		matGreen.color.set( 0x00ff00 );
+		matGreen.color.setHex( 0x00ff00 );
 
 		const matBlue = gizmoMaterial.clone();
-		matBlue.color.set( 0x0000ff );
-
-		const matWhiteTransparent = gizmoMaterial.clone();
-		matWhiteTransparent.opacity = 0.25;
-
-		const matYellowTransparent = matWhiteTransparent.clone();
-		matYellowTransparent.color.set( 0xffff00 );
-
-		const matCyanTransparent = matWhiteTransparent.clone();
-		matCyanTransparent.color.set( 0x00ffff );
+		matBlue.color.setHex( 0x0000ff );
 
-		const matMagentaTransparent = matWhiteTransparent.clone();
-		matMagentaTransparent.color.set( 0xff00ff );
+		const matRedTransparent = gizmoMaterial.clone();
+		matRedTransparent.color.setHex( 0xff0000 );
+		matRedTransparent.opacity = 0.5;
 
-		const matYellow = gizmoMaterial.clone();
-		matYellow.color.set( 0xffff00 );
-
-		const matLineRed = gizmoLineMaterial.clone();
-		matLineRed.color.set( 0xff0000 );
-
-		const matLineGreen = gizmoLineMaterial.clone();
-		matLineGreen.color.set( 0x00ff00 );
+		const matGreenTransparent = gizmoMaterial.clone();
+		matGreenTransparent.color.setHex( 0x00ff00 );
+		matGreenTransparent.opacity = 0.5;
 
-		const matLineBlue = gizmoLineMaterial.clone();
-		matLineBlue.color.set( 0x0000ff );
+		const matBlueTransparent = gizmoMaterial.clone();
+		matBlueTransparent.color.setHex( 0x0000ff );
+		matBlueTransparent.opacity = 0.5;
 
-		const matLineCyan = gizmoLineMaterial.clone();
-		matLineCyan.color.set( 0x00ffff );
-
-		const matLineMagenta = gizmoLineMaterial.clone();
-		matLineMagenta.color.set( 0xff00ff );
+		const matWhiteTransparent = gizmoMaterial.clone();
+		matWhiteTransparent.opacity = 0.25;
 
-		const matLineYellow = gizmoLineMaterial.clone();
-		matLineYellow.color.set( 0xffff00 );
+		const matYellowTransparent = gizmoMaterial.clone();
+		matYellowTransparent.color.setHex( 0xffff00 );
+		matYellowTransparent.opacity = 0.25;
 
-		const matLineGray = gizmoLineMaterial.clone();
-		matLineGray.color.set( 0x787878 );
+		const matYellow = gizmoMaterial.clone();
+		matYellow.color.setHex( 0xffff00 );
 
-		const matLineYellowTransparent = matLineYellow.clone();
-		matLineYellowTransparent.opacity = 0.25;
+		const matGray = gizmoMaterial.clone();
+		matGray.color.setHex( 0x787878 );
 
 		// reusable geometry
 
-		const arrowGeometry = new CylinderGeometry( 0, 0.05, 0.2, 12, 1, false );
+		const arrowGeometry = new CylinderGeometry( 0, 0.04, 0.1, 12 );
+		arrowGeometry.translate( 0, 0.05, 0 );
 
-		const scaleHandleGeometry = new BoxGeometry( 0.125, 0.125, 0.125 );
+		const scaleHandleGeometry = new BoxGeometry( 0.08, 0.08, 0.08 );
+		scaleHandleGeometry.translate( 0, 0.04, 0 );
 
 		const lineGeometry = new BufferGeometry();
 		lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0,	1, 0, 0 ], 3 ) );
 
-		function CircleGeometry( radius, arc ) {
-
-			const geometry = new BufferGeometry( );
-			const vertices = [];
-
-			for ( let i = 0; i <= 64 * arc; ++ i ) {
-
-				vertices.push( 0, Math.cos( i / 32 * Math.PI ) * radius, Math.sin( i / 32 * Math.PI ) * radius );
-
-			}
+		const lineGeometry2 = new CylinderGeometry( 0.0075, 0.0075, 0.5, 3 );
+		lineGeometry2.translate( 0, 0.25, 0 );
 
-			geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
+		function CircleGeometry( radius, arc ) {
 
+			const geometry = new TorusGeometry( radius, 0.0075, 3, 64, arc * Math.PI * 2 );
+			geometry.rotateY( Math.PI / 2 );
+			geometry.rotateX( Math.PI / 2 );
 			return geometry;
 
 		}
@@ -879,61 +856,58 @@ class TransformControlsGizmo extends Object3D {
 
 		const gizmoTranslate = {
 			X: [
-				[ new Mesh( arrowGeometry, matRed ), [ 1, 0, 0 ], [ 0, 0, - Math.PI / 2 ], null, 'fwd' ],
-				[ new Mesh( arrowGeometry, matRed ), [ 1, 0, 0 ], [ 0, 0, Math.PI / 2 ], null, 'bwd' ],
-				[ new Line( lineGeometry, matLineRed ) ]
+				[ new Mesh( arrowGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],
+				[ new Mesh( arrowGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],
+				[ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]
 			],
 			Y: [
-				[ new Mesh( arrowGeometry, matGreen ), [ 0, 1, 0 ], null, null, 'fwd' ],
-				[ new Mesh( arrowGeometry, matGreen ), [ 0, 1, 0 ], [ Math.PI, 0, 0 ], null, 'bwd' ],
-				[ new Line( lineGeometry, matLineGreen ), null, [ 0, 0, Math.PI / 2 ]]
+				[ new Mesh( arrowGeometry, matGreen ), [ 0, 0.5, 0 ]],
+				[ new Mesh( arrowGeometry, matGreen ), [ 0, - 0.5, 0 ], [ Math.PI, 0, 0 ]],
+				[ new Mesh( lineGeometry2, matGreen ) ]
 			],
 			Z: [
-				[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, 1 ], [ Math.PI / 2, 0, 0 ], null, 'fwd' ],
-				[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, 1 ], [ - Math.PI / 2, 0, 0 ], null, 'bwd' ],
-				[ new Line( lineGeometry, matLineBlue ), null, [ 0, - Math.PI / 2, 0 ]]
+				[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],
+				[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]],
+				[ new Mesh( lineGeometry2, matBlue ), null, [ Math.PI / 2, 0, 0 ]]
 			],
 			XYZ: [
-				[ new Mesh( new OctahedronGeometry( 0.1, 0 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ], [ 0, 0, 0 ]]
+				[ new Mesh( new OctahedronGeometry( 0.1, 0 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ]]
 			],
 			XY: [
-				[ new Mesh( new PlaneGeometry( 0.295, 0.295 ), matYellowTransparent.clone() ), [ 0.15, 0.15, 0 ]],
-				[ new Line( lineGeometry, matLineYellow ), [ 0.18, 0.3, 0 ], null, [ 0.125, 1, 1 ]],
-				[ new Line( lineGeometry, matLineYellow ), [ 0.3, 0.18, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]]
+				[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent.clone() ), [ 0.15, 0.15, 0 ]]
 			],
 			YZ: [
-				[ new Mesh( new PlaneGeometry( 0.295, 0.295 ), matCyanTransparent.clone() ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]],
-				[ new Line( lineGeometry, matLineCyan ), [ 0, 0.18, 0.3 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]],
-				[ new Line( lineGeometry, matLineCyan ), [ 0, 0.3, 0.18 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]
+				[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent.clone() ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]
 			],
 			XZ: [
-				[ new Mesh( new PlaneGeometry( 0.295, 0.295 ), matMagentaTransparent.clone() ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]],
-				[ new Line( lineGeometry, matLineMagenta ), [ 0.18, 0, 0.3 ], null, [ 0.125, 1, 1 ]],
-				[ new Line( lineGeometry, matLineMagenta ), [ 0.3, 0, 0.18 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]
+				[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent.clone() ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]
 			]
 		};
 
 		const pickerTranslate = {
 			X: [
-				[ new Mesh( new CylinderGeometry( 0.2, 0, 1, 4, 1, false ), matInvisible ), [ 0.6, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]
+				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],
+				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]
 			],
 			Y: [
-				[ new Mesh( new CylinderGeometry( 0.2, 0, 1, 4, 1, false ), matInvisible ), [ 0, 0.6, 0 ]]
+				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],
+				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]
 			],
 			Z: [
-				[ new Mesh( new CylinderGeometry( 0.2, 0, 1, 4, 1, false ), matInvisible ), [ 0, 0, 0.6 ], [ Math.PI / 2, 0, 0 ]]
+				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],
+				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]
 			],
 			XYZ: [
 				[ new Mesh( new OctahedronGeometry( 0.2, 0 ), matInvisible ) ]
 			],
 			XY: [
-				[ new Mesh( new PlaneGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0.2, 0 ]]
+				[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]]
 			],
 			YZ: [
-				[ new Mesh( new PlaneGeometry( 0.4, 0.4 ), matInvisible ), [ 0, 0.2, 0.2 ], [ 0, Math.PI / 2, 0 ]]
+				[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]
 			],
 			XZ: [
-				[ new Mesh( new PlaneGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0, 0.2 ], [ - Math.PI / 2, 0, 0 ]]
+				[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]
 			]
 		};
 
@@ -959,27 +933,20 @@ class TransformControlsGizmo extends Object3D {
 		};
 
 		const gizmoRotate = {
+			XYZE: [
+				[ new Mesh( CircleGeometry( 0.5, 1 ), matGray ), null, [ 0, Math.PI / 2, 0 ]]
+			],
 			X: [
-				[ new Line( CircleGeometry( 1, 0.5 ), matLineRed ) ],
-				[ new Mesh( new OctahedronGeometry( 0.04, 0 ), matRed ), [ 0, 0, 0.99 ], null, [ 1, 3, 1 ]],
+				[ new Mesh( CircleGeometry( 0.5, 0.5 ), matRed ) ]
 			],
 			Y: [
-				[ new Line( CircleGeometry( 1, 0.5 ), matLineGreen ), null, [ 0, 0, - Math.PI / 2 ]],
-				[ new Mesh( new OctahedronGeometry( 0.04, 0 ), matGreen ), [ 0, 0, 0.99 ], null, [ 3, 1, 1 ]],
+				[ new Mesh( CircleGeometry( 0.5, 0.5 ), matGreen ), null, [ 0, 0, - Math.PI / 2 ]]
 			],
 			Z: [
-				[ new Line( CircleGeometry( 1, 0.5 ), matLineBlue ), null, [ 0, Math.PI / 2, 0 ]],
-				[ new Mesh( new OctahedronGeometry( 0.04, 0 ), matBlue ), [ 0.99, 0, 0 ], null, [ 1, 3, 1 ]],
+				[ new Mesh( CircleGeometry( 0.5, 0.5 ), matBlue ), null, [ 0, Math.PI / 2, 0 ]]
 			],
 			E: [
-				[ new Line( CircleGeometry( 1.25, 1 ), matLineYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]],
-				[ new Mesh( new CylinderGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 1.17, 0, 0 ], [ 0, 0, - Math.PI / 2 ], [ 1, 1, 0.001 ]],
-				[ new Mesh( new CylinderGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ - 1.17, 0, 0 ], [ 0, 0, Math.PI / 2 ], [ 1, 1, 0.001 ]],
-				[ new Mesh( new CylinderGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 0, - 1.17, 0 ], [ Math.PI, 0, 0 ], [ 1, 1, 0.001 ]],
-				[ new Mesh( new CylinderGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 0, 1.17, 0 ], [ 0, 0, 0 ], [ 1, 1, 0.001 ]],
-			],
-			XYZE: [
-				[ new Line( CircleGeometry( 1, 1 ), matLineGray ), null, [ 0, Math.PI / 2, 0 ]]
+				[ new Mesh( CircleGeometry( 0.75, 1 ), matYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]]
 			]
 		};
 
@@ -990,89 +957,77 @@ class TransformControlsGizmo extends Object3D {
 		};
 
 		const pickerRotate = {
+			XYZE: [
+				[ new Mesh( new SphereGeometry( 0.25, 10, 8 ), matInvisible ) ]
+			],
 			X: [
-				[ new Mesh( new TorusGeometry( 1, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ]],
+				[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ]],
 			],
 			Y: [
-				[ new Mesh( new TorusGeometry( 1, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],
+				[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],
 			],
 			Z: [
-				[ new Mesh( new TorusGeometry( 1, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],
+				[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],
 			],
 			E: [
-				[ new Mesh( new TorusGeometry( 1.25, 0.1, 2, 24 ), matInvisible ) ]
-			],
-			XYZE: [
-				[ new Mesh( new SphereGeometry( 0.7, 10, 8 ), matInvisible ) ]
+				[ new Mesh( new TorusGeometry( 0.75, 0.1, 2, 24 ), matInvisible ) ]
 			]
 		};
 
 		const gizmoScale = {
 			X: [
-				[ new Mesh( scaleHandleGeometry, matRed ), [ 0.8, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],
-				[ new Line( lineGeometry, matLineRed ), null, null, [ 0.8, 1, 1 ]]
+				[ new Mesh( scaleHandleGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],
+				[ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],
+				[ new Mesh( scaleHandleGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],
 			],
 			Y: [
-				[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, 0.8, 0 ]],
-				[ new Line( lineGeometry, matLineGreen ), null, [ 0, 0, Math.PI / 2 ], [ 0.8, 1, 1 ]]
+				[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, 0.5, 0 ]],
+				[ new Mesh( lineGeometry2, matGreen ) ],
+				[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, - 0.5, 0 ], [ 0, 0, Math.PI ]],
 			],
 			Z: [
-				[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, 0.8 ], [ Math.PI / 2, 0, 0 ]],
-				[ new Line( lineGeometry, matLineBlue ), null, [ 0, - Math.PI / 2, 0 ], [ 0.8, 1, 1 ]]
+				[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],
+				[ new Mesh( lineGeometry2, matBlue ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],
+				[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]]
 			],
 			XY: [
-				[ new Mesh( scaleHandleGeometry, matYellowTransparent ), [ 0.85, 0.85, 0 ], null, [ 2, 2, 0.2 ]],
-				[ new Line( lineGeometry, matLineYellow ), [ 0.855, 0.98, 0 ], null, [ 0.125, 1, 1 ]],
-				[ new Line( lineGeometry, matLineYellow ), [ 0.98, 0.855, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]]
+				[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent ), [ 0.15, 0.15, 0 ]]
 			],
 			YZ: [
-				[ new Mesh( scaleHandleGeometry, matCyanTransparent ), [ 0, 0.85, 0.85 ], null, [ 0.2, 2, 2 ]],
-				[ new Line( lineGeometry, matLineCyan ), [ 0, 0.855, 0.98 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]],
-				[ new Line( lineGeometry, matLineCyan ), [ 0, 0.98, 0.855 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]
+				[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]
 			],
 			XZ: [
-				[ new Mesh( scaleHandleGeometry, matMagentaTransparent ), [ 0.85, 0, 0.85 ], null, [ 2, 0.2, 2 ]],
-				[ new Line( lineGeometry, matLineMagenta ), [ 0.855, 0, 0.98 ], null, [ 0.125, 1, 1 ]],
-				[ new Line( lineGeometry, matLineMagenta ), [ 0.98, 0, 0.855 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]
-			],
-			XYZX: [
-				[ new Mesh( new BoxGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 1.1, 0, 0 ]],
-			],
-			XYZY: [
-				[ new Mesh( new BoxGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 0, 1.1, 0 ]],
+				[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]
 			],
-			XYZZ: [
-				[ new Mesh( new BoxGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 0, 0, 1.1 ]],
+			XYZ: [
+				[ new Mesh( new BoxGeometry( 0.1, 0.1, 0.1 ), matWhiteTransparent.clone() ) ],
 			]
 		};
 
 		const pickerScale = {
 			X: [
-				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.8, 4, 1, false ), matInvisible ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]
+				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],
+				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]
 			],
 			Y: [
-				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.8, 4, 1, false ), matInvisible ), [ 0, 0.5, 0 ]]
+				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],
+				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]
 			],
 			Z: [
-				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.8, 4, 1, false ), matInvisible ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]]
+				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],
+				[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]
 			],
 			XY: [
-				[ new Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0.85, 0 ], null, [ 3, 3, 0.2 ]],
+				[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]],
 			],
 			YZ: [
-				[ new Mesh( scaleHandleGeometry, matInvisible ), [ 0, 0.85, 0.85 ], null, [ 0.2, 3, 3 ]],
+				[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]],
 			],
 			XZ: [
-				[ new Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0, 0.85 ], null, [ 3, 0.2, 3 ]],
-			],
-			XYZX: [
-				[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 1.1, 0, 0 ]],
-			],
-			XYZY: [
-				[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 1.1, 0 ]],
+				[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]],
 			],
-			XYZZ: [
-				[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 1.1 ]],
+			XYZ: [
+				[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 0 ]],
 			]
 		};
 
@@ -1217,7 +1172,7 @@ class TransformControlsGizmo extends Object3D {
 
 			}
 
-			handle.scale.set( 1, 1, 1 ).multiplyScalar( factor * this.size / 7 );
+			handle.scale.set( 1, 1, 1 ).multiplyScalar( factor * this.size / 4 );
 
 			// TODO: simplify helpers and consider decoupling from gizmo
 
@@ -1342,9 +1297,8 @@ class TransformControlsGizmo extends Object3D {
 
 				const AXIS_HIDE_TRESHOLD = 0.99;
 				const PLANE_HIDE_TRESHOLD = 0.2;
-				const AXIS_FLIP_TRESHOLD = 0.0;
 
-				if ( handle.name === 'X' || handle.name === 'XYZX' ) {
+				if ( handle.name === 'X' ) {
 
 					if ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {
 
@@ -1355,7 +1309,7 @@ class TransformControlsGizmo extends Object3D {
 
 				}
 
-				if ( handle.name === 'Y' || handle.name === 'XYZY' ) {
+				if ( handle.name === 'Y' ) {
 
 					if ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {
 
@@ -1366,7 +1320,7 @@ class TransformControlsGizmo extends Object3D {
 
 				}
 
-				if ( handle.name === 'Z' || handle.name === 'XYZZ' ) {
+				if ( handle.name === 'Z' ) {
 
 					if ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {
 
@@ -1410,74 +1364,6 @@ class TransformControlsGizmo extends Object3D {
 
 				}
 
-				// Flip translate and scale axis ocluded behind another axis
-
-				if ( handle.name.search( 'X' ) !== - 1 ) {
-
-					if ( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) < AXIS_FLIP_TRESHOLD ) {
-
-						if ( handle.tag === 'fwd' ) {
-
-							handle.visible = false;
-
-						} else {
-
-							handle.scale.x *= - 1;
-
-						}
-
-					} else if ( handle.tag === 'bwd' ) {
-
-						handle.visible = false;
-
-					}
-
-				}
-
-				if ( handle.name.search( 'Y' ) !== - 1 ) {
-
-					if ( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) < AXIS_FLIP_TRESHOLD ) {
-
-						if ( handle.tag === 'fwd' ) {
-
-							handle.visible = false;
-
-						} else {
-
-							handle.scale.y *= - 1;
-
-						}
-
-					} else if ( handle.tag === 'bwd' ) {
-
-						handle.visible = false;
-
-					}
-
-				}
-
-				if ( handle.name.search( 'Z' ) !== - 1 ) {
-
-					if ( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) < AXIS_FLIP_TRESHOLD ) {
-
-						if ( handle.tag === 'fwd' ) {
-
-							handle.visible = false;
-
-						} else {
-
-							handle.scale.z *= - 1;
-
-						}
-
-					} else if ( handle.tag === 'bwd' ) {
-
-						handle.visible = false;
-
-					}
-
-				}
-
 			} else if ( this.mode === 'rotate' ) {
 
 				// Align handles to current local or world rotation
@@ -1525,23 +1411,18 @@ class TransformControlsGizmo extends Object3D {
 
 			// highlight selected axis
 
-			handle.material._opacity = handle.material._opacity || handle.material.opacity;
 			handle.material._color = handle.material._color || handle.material.color.clone();
+			handle.material._opacity = handle.material._opacity || handle.material.opacity;
 
 			handle.material.color.copy( handle.material._color );
 			handle.material.opacity = handle.material._opacity;
 
-			if ( ! this.enabled ) {
-
-				handle.material.opacity *= 0.5;
-				handle.material.color.lerp( new Color( 1, 1, 1 ), 0.5 );
-
-			} else if ( this.axis ) {
+			if ( this.enabled && this.axis ) {
 
 				if ( handle.name === this.axis ) {
 
+					handle.material.color.setHex( 0xffff00 );
 					handle.material.opacity = 1.0;
-					handle.material.color.lerp( new Color( 1, 1, 1 ), 0.5 );
 
 				} else if ( this.axis.split( '' ).some( function ( a ) {
 
@@ -1549,13 +1430,8 @@ class TransformControlsGizmo extends Object3D {
 
 				} ) ) {
 
+					handle.material.color.setHex( 0xffff00 );
 					handle.material.opacity = 1.0;
-					handle.material.color.lerp( new Color( 1, 1, 1 ), 0.5 );
-
-				} else {
-
-					handle.material.opacity *= 0.25;
-					handle.material.color.lerp( new Color( 1, 1, 1 ), 0.5 );
 
 				}
 

+ 1 - 1
examples/jsm/exporters/DRACOExporter.js

@@ -34,7 +34,7 @@ class DRACOExporter {
 
 		if ( DracoEncoderModule === undefined ) {
 
-			throw new Error( 'THREE.DRACOExporter: required the draco_decoder to work.' );
+			throw new Error( 'THREE.DRACOExporter: required the draco_encoder to work.' );
 
 		}
 

+ 13 - 4
examples/jsm/exporters/GLTFExporter.js

@@ -1185,12 +1185,21 @@ class GLTFWriter {
 
 		if ( material.emissive ) {
 
-			// note: `emissive` is not scaled by `material.emissiveIntensity` for now to accommodate glTF spec. see #21849.
-			const emissive = material.emissive.toArray();
+			// note: emissive components are limited to stay within the 0 - 1 range to accommodate glTF spec. see #21849 and #22000.
+			const emissive = material.emissive.clone().multiplyScalar( material.emissiveIntensity );
+			const maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b );
 
-			if ( ! equalArray( emissive, [ 0, 0, 0 ] ) ) {
+			if ( maxEmissiveComponent > 1 ) {
 
-				materialDef.emissiveFactor = emissive;
+				emissive.multiplyScalar( 1 / maxEmissiveComponent );
+
+				console.warn( 'THREE.GLTFExporter: Some emissive components exceed 1; emissive has been limited' );
+
+			}
+
+			if ( maxEmissiveComponent > 0 ) {
+
+				materialDef.emissiveFactor = emissive.toArray();
 
 			}
 

+ 8 - 0
examples/jsm/exporters/USDZExporter.js

@@ -426,6 +426,14 @@ function buildMaterial( material, textures ) {
 
 	inputs.push( `${ pad }float inputs:opacity = ${ material.opacity }` );
 
+	if ( material.isMeshPhysicalMaterial ) {
+
+		inputs.push( `${ pad }float inputs:clearcoat = ${ material.clearcoat }` );
+		inputs.push( `${ pad }float inputs:clearcoatRoughness = ${ material.clearcoatRoughness }` );
+		inputs.push( `${ pad }float inputs:ior = ${ material.ior }` );
+
+	}
+
 	return `
     def Material "Material_${ material.id }"
     {

+ 5 - 8
examples/jsm/lines/LineMaterial.js

@@ -39,8 +39,7 @@ ShaderLib[ 'line' ] = {
 		UniformsLib.line
 	] ),
 
-	vertexShader:
-		`
+	vertexShader: /* glsl */`
 		#include <common>
 		#include <color_pars_vertex>
 		#include <fog_pars_vertex>
@@ -183,11 +182,9 @@ ShaderLib[ 'line' ] = {
 			#include <clipping_planes_vertex>
 			#include <fog_vertex>
 
-		}
-		`,
+		}`,
 
-	fragmentShader:
-		`
+	fragmentShader: /* glsl */`
 		uniform vec3 diffuse;
 		uniform float opacity;
 
@@ -263,8 +260,8 @@ ShaderLib[ 'line' ] = {
 			#include <fog_fragment>
 			#include <premultiplied_alpha_fragment>
 
-		}
-		`
+		}`
+
 };
 
 class LineMaterial extends ShaderMaterial {

+ 10 - 2
examples/jsm/loaders/GLTFLoader.js

@@ -4,7 +4,6 @@ import {
 	Box3,
 	BufferAttribute,
 	BufferGeometry,
-	CanvasTexture,
 	ClampToEdgeWrapping,
 	Color,
 	DirectionalLight,
@@ -54,6 +53,7 @@ import {
 	Sphere,
 	SpotLight,
 	TangentSpaceNormalMap,
+	Texture,
 	TextureLoader,
 	TriangleFanDrawMode,
 	TriangleStripDrawMode,
@@ -2598,7 +2598,10 @@ class GLTFParser {
 
 					onLoad = function ( imageBitmap ) {
 
-						resolve( new CanvasTexture( imageBitmap ) );
+						const texture = new Texture( imageBitmap );
+						texture.needsUpdate = true;
+
+						resolve( texture );
 
 					};
 
@@ -2640,6 +2643,11 @@ class GLTFParser {
 
 			return texture;
 
+		} ).catch( function () {
+
+			console.error( 'THREE.GLTFLoader: Couldn\'t load texture', sourceURI );
+			return null;
+
 		} );
 
 		this.textureCache[ cacheKey ] = promise;

+ 322 - 69
examples/jsm/loaders/IFCLoader.js

@@ -1,28 +1,32 @@
-//Example: https://github.com/tomvandig/web-ifc-three/tree/main/examples/jsm
+//Docs: https://agviegas.github.io/ifcjs-docs/#/
 
-import { IfcAPI } from './ifc/web-ifc-api.js';
+import * as WebIFC from './ifc/web-ifc-api.js';
 import {
 	FileLoader,
 	Loader,
-	Object3D,
 	Mesh,
 	Color,
-	MeshPhongMaterial,
+	MeshBasicMaterial,
+	MeshLambertMaterial,
 	DoubleSide,
 	Matrix4,
 	BufferGeometry,
-	InterleavedBuffer,
-	InterleavedBufferAttribute,
 	BufferAttribute,
 } from '../../../build/three.module.js';
+import {BufferGeometryUtils} from "../utils/BufferGeometryUtils.js"
 
-const ifcAPI = new IfcAPI();
+const ifcAPI = new WebIFC.IfcAPI();
 
 class IFCLoader extends Loader {
 
 	constructor( manager ) {
 
 		super( manager );
+		this.modelID = 0;
+		this.mapFaceindexID = {};
+		this.mapIDGeometry = {};
+		this.selectedObjects = [];
+		this.highlightMaterial = new MeshBasicMaterial({ color: 0xff0000, depthTest: false, side: DoubleSide });
 
 	}
 
@@ -66,8 +70,168 @@ class IFCLoader extends Loader {
 
 	}
 
+	setWasmPath( path ) {
+
+		ifcAPI.SetWasmPath( path );
+
+	}
+
+	getExpressId( faceIndex ) {
+
+		for (let index in this.mapFaceindexID) {
+
+		  if (parseInt(index) >= faceIndex) return this.mapFaceindexID[index];
+
+		}
+
+		return -1;
+	}
+
+	highlightItems( expressIds, scene, material = this.highlightMaterial ) {
+
+		this.removePreviousSelection(scene);
+
+		expressIds.forEach((id) => {
+
+			if (!this.mapIDGeometry[id]) return;
+			var mesh = new Mesh(this.mapIDGeometry[id], material);
+			mesh.renderOrder = 1;
+			scene.add(mesh);
+			this.selectedObjects.push(mesh);
+			return;
+
+		});
+	}
+
+	removePreviousSelection( scene ) {
+
+		if (this.selectedObjects.length > 0){
+
+			this.selectedObjects.forEach((object) => scene.remove(object));
+
+		} 
+	}
+
+	setItemsVisibility( expressIds, geometry, visible = false ) {
+
+		this.setupVisibility(geometry);
+		var previous = 0;
+
+		for (var current in this.mapFaceindexID) {
+
+			if (expressIds.includes(this.mapFaceindexID[current])) {
+
+				for (var i = previous; i <= current; i++) this.setVertexVisibility(geometry, i, visible);
+
+			}
+
+			previous = current;
+
+		}
+
+		geometry.attributes.visibility.needsUpdate = true;
+
+	}
+
+	setVertexVisibility( geometry, index, visible ) {
+
+		var isVisible = visible ? 0 : 1;
+		var geoIndex = geometry.index.array;
+		geometry.attributes.visibility.setX(geoIndex[3 * index], isVisible);
+		geometry.attributes.visibility.setX(geoIndex[3 * index + 1], isVisible);
+		geometry.attributes.visibility.setX(geoIndex[3 * index + 2], isVisible);
+		
+	}
+
+	setupVisibility( geometry ) {
+
+		if (!geometry.attributes.visibility) {
+
+		  var visible = new Float32Array(geometry.getAttribute('position').count);
+		  geometry.setAttribute('visibility', new BufferAttribute(visible, 1));
+
+		}
+
+	}
+
+	getItemProperties( elementID, all = false ) {
+
+		const properties = ifcAPI.GetLine(this.modelID, elementID);
+	
+		if (all) {
+
+		  const propSetIds = this.getAllRelatedItemsOfType(elementID, WebIFC.IFCRELDEFINESBYPROPERTIES, "RelatedObjects", "RelatingPropertyDefinition");
+		  properties.hasPropertySets = propSetIds.map((id) => ifcAPI.GetLine(this.modelID, id, true));
+	
+		  const typeId = this.getAllRelatedItemsOfType(elementID, WebIFC.IFCRELDEFINESBYTYPE, "RelatedObjects", "RelatingType");
+		  properties.hasType = typeId.map((id) => ifcAPI.GetLine(this.modelID, id, true));
+		  
+		}
+	
+		// properties.type = properties.constructor.name;
+		return properties;
+
+	}
+
+	getSpatialStructure() {
+
+		let lines = ifcAPI.GetLineIDsWithType(this.modelID, WebIFC.IFCPROJECT);
+		let ifcProjectId = lines.get(0);
+		let ifcProject = ifcAPI.GetLine(this.modelID, ifcProjectId);
+		this.getAllSpatialChildren(ifcProject);
+		return ifcProject;
+
+	}
+	
+	getAllSpatialChildren( spatialElement ) {
+
+		const id = spatialElement.expressID;
+		const spatialChildrenID = this.getAllRelatedItemsOfType(id, WebIFC.IFCRELAGGREGATES, "RelatingObject", "RelatedObjects");
+		spatialElement.hasSpatialChildren = spatialChildrenID.map((id) => ifcAPI.GetLine(this.modelID, id, false));
+		spatialElement.hasChildren = this.getAllRelatedItemsOfType(id, WebIFC.IFCRELCONTAINEDINSPATIALSTRUCTURE, "RelatingStructure", "RelatedElements");
+		spatialElement.hasSpatialChildren.forEach(child => this.getAllSpatialChildren(child));
+		
+	}
+	
+	getAllRelatedItemsOfType ( elementID, type, relation, relatedProperty ) {
+
+		const lines = ifcAPI.GetLineIDsWithType(this.modelID, type);
+		const IDs = [];
+
+		for (let i = 0; i < lines.size(); i++) {
+
+		  	const relID = lines.get(i);
+		  	const rel = ifcAPI.GetLine(this.modelID, relID);
+		  	const relatedItems = rel[relation];
+		  	let foundElement = false;
+	
+		  	if (Array.isArray(relatedItems)){
+
+			  relatedItems.forEach((relID) => {
+
+				  if (relID.value === elementID) foundElement = true;
+
+				});
+			}
+			else foundElement = (relatedItems.value === elementID);
+	
+		  	if (foundElement) {
+
+				var element = rel[relatedProperty];
+				if (!Array.isArray(element)) IDs.push(element.value);
+				else element.forEach(ele => IDs.push(ele.value))
+			
+		  	}
+		}
+		return IDs;
+	}
+
 	async parse( buffer ) {
 
+		const geometryByMaterials = {};
+		const mapIDGeometry = this.mapIDGeometry;
+		const mapFaceindexID = this.mapFaceindexID;
+
 		if ( ifcAPI.wasmModule === undefined ) {
 
 			await ifcAPI.Init();
@@ -75,108 +239,197 @@ class IFCLoader extends Loader {
 		}
 
 		const data = new Uint8Array( buffer );
-		const modelID = ifcAPI.OpenModel( 'example.ifc', data );
-		return loadAllGeometry( modelID );
+		this.modelID = ifcAPI.OpenModel( 'example.ifc', data );
+		return loadAllGeometry( this.modelID );
+
+		function loadAllGeometry(modelID) {
+
+			saveAllPlacedGeometriesByMaterial(modelID);
+			return generateAllGeometriesByMaterial();
+
+		}
+	
+		function generateAllGeometriesByMaterial() {
+
+			const { materials, geometries } = getMaterialsAndGeometries();
+			const allGeometry = BufferGeometryUtils.mergeBufferGeometries(geometries, true);
+			return new Mesh(allGeometry, materials);
+
+		}
+	
+		function getMaterialsAndGeometries() {
+
+			const materials = [];
+			const geometries = [];
+			let totalFaceCount = 0;
+
+			for (let i in geometryByMaterials) {
+
+				materials.push(geometryByMaterials[i].material);
+				const currentGeometries = geometryByMaterials[i].geometry;
+				geometries.push(BufferGeometryUtils.mergeBufferGeometries(currentGeometries));
 
-		function loadAllGeometry( modelID ) {
+				for (let j in geometryByMaterials[i].indices) {
 
-			const flatMeshes = getFlatMeshes( modelID );
-			const mainObject = new Object3D();
-			for ( let i = 0; i < flatMeshes.size(); i ++ ) {
+					const globalIndex = parseInt(j, 10) + parseInt(totalFaceCount, 10);
+					mapFaceindexID[globalIndex] = geometryByMaterials[i].indices[j];
 
-				const placedGeometries = flatMeshes.get( i ).geometries;
-				for ( let j = 0; j < placedGeometries.size(); j ++ )
-					mainObject.add( getPlacedGeometry( modelID, placedGeometries.get( j ) ) );
+				}
+
+				totalFaceCount += geometryByMaterials[i].lastIndex;
 
 			}
 
-			return mainObject;
+			return { materials, geometries };
 
 		}
+	
+		function saveAllPlacedGeometriesByMaterial(modelID) {
 
-		function getFlatMeshes( modelID ) {
+			const flatMeshes = ifcAPI.LoadAllGeometry(modelID);
 
-			const flatMeshes = ifcAPI.LoadAllGeometry( modelID );
-			return flatMeshes;
+			for (let i = 0; i < flatMeshes.size(); i++) {
 
-		}
+				const flatMesh = flatMeshes.get(i);
+				const productId = flatMesh.expressID;
+				const placedGeometries = flatMesh.geometries;
 
-		function getPlacedGeometry( modelID, placedGeometry ) {
+				for (let j = 0; j < placedGeometries.size(); j++) {
 
-			const geometry = getBufferGeometry( modelID, placedGeometry );
-			const material = getMeshMaterial( placedGeometry.color );
-			const mesh = new Mesh( geometry, material );
-			mesh.matrix = getMeshMatrix( placedGeometry.flatTransformation );
-			mesh.matrixAutoUpdate = false;
-			return mesh;
+					savePlacedGeometryByMaterial(modelID, placedGeometries.get(j), productId);
 
+				}
+			}
 		}
 
-		function getBufferGeometry( modelID, placedGeometry ) {
+		function savePlacedGeometryByMaterial(modelID, placedGeometry, productId) {
 
-			const geometry = ifcAPI.GetGeometry(
-				modelID,
-				placedGeometry.geometryExpressID
-			);
-			const verts = ifcAPI.GetVertexArray(
-				geometry.GetVertexData(),
-				geometry.GetVertexDataSize()
-			);
-			const indices = ifcAPI.GetIndexArray(
-				geometry.GetIndexData(),
-				geometry.GetIndexDataSize()
-			);
-			const bufferGeometry = ifcGeometryToBuffer( verts, indices );
-			return bufferGeometry;
+			const geometry = getBufferGeometry(modelID, placedGeometry);
+			geometry.computeVertexNormals();
+			const matrix = getMeshMatrix(placedGeometry.flatTransformation);
+			geometry.applyMatrix4(matrix);
+			storeGeometryForHighlight(productId, geometry);
+			saveGeometryByMaterial(geometry, placedGeometry, productId);
 
 		}
 
-		function getMeshMaterial( color ) {
+		function getBufferGeometry(modelID, placedGeometry) {
 
-			const col = new Color( color.x, color.y, color.z );
-			const material = new MeshPhongMaterial( { color: col, side: DoubleSide } );
-			material.transparent = color.w !== 1;
-			if ( material.transparent ) material.opacity = color.w;
-			return material;
+			const geometry = ifcAPI.GetGeometry(modelID, placedGeometry.geometryExpressID);
+			const verts = ifcAPI.GetVertexArray(geometry.GetVertexData(), geometry.GetVertexDataSize());
+			const indices = ifcAPI.GetIndexArray(geometry.GetIndexData(), geometry.GetIndexDataSize());
+			return ifcGeometryToBuffer(verts, indices);
 
 		}
 
-		function getMeshMatrix( matrix ) {
+		function getMeshMatrix(matrix) {
 
 			const mat = new Matrix4();
-			mat.fromArray( matrix );
-			// mat.elements[15 - 3] *= 0.001;
-			// mat.elements[15 - 2] *= 0.001;
-			// mat.elements[15 - 1] *= 0.001;
+			mat.fromArray(matrix);
 			return mat;
 
 		}
+	
+		function storeGeometryForHighlight(productId, geometry) {
+
+			if (!mapIDGeometry[productId]) {
 
-		function ifcGeometryToBuffer( vertexData, indexData ) {
+				mapIDGeometry[productId] = geometry;
+				return;
+
+			}
+
+			const geometries = [mapIDGeometry[productId], geometry];
+			mapIDGeometry[productId] = BufferGeometryUtils.mergeBufferGeometries(geometries, true);
+
+		}
+	
+		function ifcGeometryToBuffer(vertexData, indexData) {
 
 			const geometry = new BufferGeometry();
-			const buffer32 = new InterleavedBuffer( vertexData, 6 );
-			geometry.setAttribute(
-				'position',
-				new InterleavedBufferAttribute( buffer32, 3, 0 )
-			);
-			geometry.setAttribute(
-				'normal',
-				new InterleavedBufferAttribute( buffer32, 3, 3 )
-			);
-			geometry.setIndex( new BufferAttribute( indexData, 1 ) );
+			const { vertices, normals } = extractVertexData(vertexData);
+			geometry.setAttribute('position', new BufferAttribute(new Float32Array(vertices), 3));
+			geometry.setAttribute('normal', new BufferAttribute(new Float32Array(normals), 3));
+			geometry.setIndex(new BufferAttribute(indexData, 1));
 			return geometry;
 
 		}
+	
+		function extractVertexData(vertexData) {
 
-	}
+			const vertices = [];
+			const normals = [];
+			let isNormalData = false;
 
-	setWasmPath( path ) {
+			for (let i = 0; i < vertexData.length; i++) {
 
-		ifcAPI.SetWasmPath( path );
+				isNormalData ? normals.push(vertexData[i]) : vertices.push(vertexData[i]);
+				if ((i + 1) % 3 == 0) isNormalData = !isNormalData;
 
-	}
+			}
 
+			return { vertices, normals };
+
+		}
+	
+		function saveGeometryByMaterial(geometry, placedGeometry, productId) {
+
+			const color = placedGeometry.color;
+			const id = `${color.x}${color.y}${color.z}${color.w}`;
+			createMaterial(id, color);
+			const currentGeometry = geometryByMaterials[id];
+			currentGeometry.geometry.push(geometry);
+			currentGeometry.lastIndex += geometry.index.count / 3;
+			currentGeometry.indices[currentGeometry.lastIndex] = productId;
+
+		}
+	
+		function createMaterial(id, color) {
+
+			if (!geometryByMaterials[id]){
+
+				const col = new Color(color.x, color.y, color.z);
+				const newMaterial = new MeshLambertMaterial({ color: col, side: DoubleSide });
+				newMaterial.onBeforeCompile = materialHider;
+				newMaterial.transparent = color.w !== 1;
+				if (newMaterial.transparent) newMaterial.opacity = color.w;
+				geometryByMaterials[id] = initializeGeometryByMaterial(newMaterial);
+
+			}
+		}
+	
+		function initializeGeometryByMaterial(newMaterial) {
+
+			return {
+				material: newMaterial,
+				geometry: [],
+				indices: {},
+				lastIndex: 0
+
+			};
+	  	}
+
+		function materialHider(shader) {
+			shader.vertexShader = `
+			attribute float sizes;
+			attribute float visibility;
+			varying float vVisible;
+		  ${shader.vertexShader}`.replace(
+			  `#include <fog_vertex>`,
+			  `#include <fog_vertex>
+			  vVisible = visibility;
+			`
+			);
+			shader.fragmentShader = `
+			varying float vVisible;
+		  ${shader.fragmentShader}`.replace(
+			  `#include <clipping_planes_fragment>`,
+			  `
+			  if (vVisible > 0.5) discard;
+			#include <clipping_planes_fragment>`
+			);
+		}
+	}
 }
 
 export { IFCLoader };

+ 169 - 10
examples/jsm/loaders/MMDLoader.js

@@ -5,6 +5,7 @@ import {
 	BufferGeometry,
 	Color,
 	CustomBlending,
+	TangentSpaceNormalMap,
 	DoubleSide,
 	DstAlphaFactor,
 	Euler,
@@ -14,7 +15,8 @@ import {
 	Interpolant,
 	Loader,
 	LoaderUtils,
-	MeshToonMaterial,
+	UniformsUtils,
+	ShaderMaterial,
 	MultiplyOperation,
 	NearestFilter,
 	NumberKeyframeTrack,
@@ -35,6 +37,7 @@ import {
 	RGB_ETC1_Format,
 	RGB_ETC2_Format
 } from '../../../build/three.module.js';
+import { MMDToonShader } from '../shaders/MMDToonShader.js';
 import { TGALoader } from '../loaders/TGALoader.js';
 import { MMDParser } from '../libs/mmdparser.module.js';
 
@@ -1075,7 +1078,7 @@ class MaterialBuilder {
 	 * @param {BufferGeometry} geometry - some properties are dependend on geometry
 	 * @param {function} onProgress
 	 * @param {function} onError
-	 * @return {Array<MeshToonMaterial>}
+	 * @return {Array<MMDToonMaterial>}
 	 */
 	build( data, geometry /*, onProgress, onError */ ) {
 
@@ -1091,23 +1094,24 @@ class MaterialBuilder {
 
 			const material = data.materials[ i ];
 
-			const params = { userData: {} };
+			const params = { userData: { MMD: {} } };
 
 			if ( material.name !== undefined ) params.name = material.name;
 
 			/*
 				 * Color
 				 *
-				 * MMD         MeshToonMaterial
-				 * diffuse  -  color
+				 * MMD         MMDToonMaterial
 				 * ambient  -  emissive * a
 				 *               (a = 1.0 without map texture or 0.2 with map texture)
 				 *
-				 * MeshToonMaterial doesn't have ambient. Set it to emissive instead.
+				 * MMDToonMaterial doesn't have ambient. Set it to emissive instead.
 				 * It'll be too bright if material has map texture so using coef 0.2.
 				 */
-			params.color = new Color().fromArray( material.diffuse );
+			params.diffuse = new Color().fromArray( material.diffuse );
 			params.opacity = material.diffuse[ 3 ];
+			params.specular = new Color().fromArray( material.specular );
+			params.shininess = material.shininess;
 			params.emissive = new Color().fromArray( material.ambient );
 			params.transparent = params.opacity !== 1.0;
 
@@ -1199,18 +1203,26 @@ class MaterialBuilder {
 
 					params.map = this._loadTexture( data.textures[ material.textureIndex ], textures );
 
+					// Since PMX spec don't have standard to list map files except color map and env map,
+					// we need to save file name for further mapping, like matching normal map file names after model loaded.
+					// ref: https://gist.github.com/felixjones/f8a06bd48f9da9a4539f#texture
+					params.userData.MMD.mapFileName = data.textures[ material.textureIndex ];
+
 				}
 
 				// envMap TODO: support m.envFlag === 3
 
 				if ( material.envTextureIndex !== - 1 && ( material.envFlag === 1 || material.envFlag == 2 ) ) {
 
-					params.envMap = this._loadTexture(
+					params.matcap = this._loadTexture(
 						data.textures[ material.envTextureIndex ],
 						textures
 					);
 
-					params.combine = material.envFlag === 1
+					// Same as color map above, keep file name in userData for further usage.
+					params.userData.MMD.matcapFileName = data.textures[ material.envTextureIndex ];
+
+					params.matcapCombine = material.envFlag === 1
 						? MultiplyOperation
 						: AddOperation;
 
@@ -1263,7 +1275,7 @@ class MaterialBuilder {
 
 			}
 
-			materials.push( new MeshToonMaterial( params ) );
+			materials.push( new MMDToonMaterial( params ) );
 
 		}
 
@@ -2064,4 +2076,151 @@ class CubicBezierInterpolation extends Interpolant {
 
 }
 
+class MMDToonMaterial extends ShaderMaterial {
+
+	constructor( parameters ) {
+
+		super();
+
+		this._matcapCombine = AddOperation;
+		this.emissiveIntensity = 1.0;
+		this.normalMapType = TangentSpaceNormalMap;
+
+		this.combine = MultiplyOperation;
+
+		this.wireframeLinecap = 'round';
+		this.wireframeLinejoin = 'round';
+
+		this.flatShading = false;
+
+		this.lights = true;
+
+		this.vertexShader = MMDToonShader.vertexShader;
+		this.fragmentShader = MMDToonShader.fragmentShader;
+
+		this.defines = Object.assign( {}, MMDToonShader.defines );
+		Object.defineProperty( this, 'matcapCombine', {
+
+			get: function () {
+
+				return this._matcapCombine;
+
+			},
+
+			set: function ( value ) {
+
+				this._matcapCombine = value;
+
+				switch ( value ) {
+
+					case MultiplyOperation:
+						this.defines.MATCAP_BLENDING_MULTIPLY = true;
+						delete this.defines.MATCAP_BLENDING_ADD;
+						break;
+
+					default:
+					case AddOperation:
+						this.defines.MATCAP_BLENDING_ADD = true;
+						delete this.defines.MATCAP_BLENDING_MULTIPLY;
+						break;
+
+				}
+
+			},
+
+		} );
+
+		this.uniforms = UniformsUtils.clone( MMDToonShader.uniforms );
+
+		// merged from MeshToon/Phong/MatcapMaterial
+		const exposePropertyNames = [
+			'specular',
+			'shininess',
+			'opacity',
+			'diffuse',
+
+			'map',
+			'matcap',
+			'gradientMap',
+
+			'lightMap',
+			'lightMapIntensity',
+
+			'aoMap',
+			'aoMapIntensity',
+
+			'emissive',
+			'emissiveMap',
+
+			'bumpMap',
+			'bumpScale',
+
+			'normalMap',
+			'normalScale',
+
+			'displacemantBias',
+			'displacemantMap',
+			'displacemantScale',
+
+			'specularMap',
+
+			'alphaMap',
+
+			'envMap',
+			'reflectivity',
+			'refractionRatio',
+		];
+		for ( const propertyName of exposePropertyNames ) {
+
+			Object.defineProperty( this, propertyName, {
+
+				get: function () {
+
+					return this.uniforms[ propertyName ].value;
+
+				},
+
+				set: function ( value ) {
+
+					this.uniforms[ propertyName ].value = value;
+
+				},
+
+			} );
+
+		}
+
+		Object.defineProperty(
+			this,
+			'color',
+			Object.getOwnPropertyDescriptor( this, 'diffuse' )
+		);
+
+		this.setValues( parameters );
+
+	}
+
+	copy( source ) {
+
+		super.copy( source );
+
+		this.matcapCombine = source.matcapCombine;
+		this.emissiveIntensity = source.emissiveIntensity;
+		this.normalMapType = source.normalMapType;
+
+		this.combine = source.combine;
+
+		this.wireframeLinecap = source.wireframeLinecap;
+		this.wireframeLinejoin = source.wireframeLinejoin;
+
+		this.flatShading = source.flatShading;
+
+		return this;
+
+	}
+
+}
+
+MMDToonMaterial.prototype.isMMDToonMaterial = true;
+
 export { MMDLoader };

+ 53 - 24
examples/jsm/loaders/NRRDLoader.js

@@ -83,7 +83,7 @@ class NRRDLoader extends Loader {
 				case 'schar':
 					_array_type = Int8Array;
 					break;
-					// 2 byte data types
+				// 2 byte data types
 				case 'ushort':
 					_array_type = Uint16Array;
 					_chunkSize = 2;
@@ -92,7 +92,7 @@ class NRRDLoader extends Loader {
 					_array_type = Int16Array;
 					_chunkSize = 2;
 					break;
-					// 4 byte data types
+				// 4 byte data types
 				case 'uint':
 					_array_type = Uint32Array;
 					_chunkSize = 4;
@@ -363,31 +363,55 @@ class NRRDLoader extends Loader {
 		volume.xLength = volume.dimensions[ 0 ];
 		volume.yLength = volume.dimensions[ 1 ];
 		volume.zLength = volume.dimensions[ 2 ];
+
+		// Identify axis order in the space-directions matrix from the header if possible.
+		if ( headerObject.vectors ) {
+
+			const xIndex = headerObject.vectors.findIndex( vector => vector[ 0 ] !== 0 );
+			const yIndex = headerObject.vectors.findIndex( vector => vector[ 1 ] !== 0 );
+			const zIndex = headerObject.vectors.findIndex( vector => vector[ 2 ] !== 0 );
+
+			const axisOrder = [];
+			axisOrder[ xIndex ] = 'x';
+			axisOrder[ yIndex ] = 'y';
+			axisOrder[ zIndex ] = 'z';
+			volume.axisOrder = axisOrder;
+
+		} else {
+
+			volume.axisOrder = [ 'x', 'y', 'z' ];
+
+		}
+
 		// spacing
-		const spacingX = ( new Vector3( headerObject.vectors[ 0 ][ 0 ], headerObject.vectors[ 0 ][ 1 ],
-			headerObject.vectors[ 0 ][ 2 ] ) ).length();
-		const spacingY = ( new Vector3( headerObject.vectors[ 1 ][ 0 ], headerObject.vectors[ 1 ][ 1 ],
-			headerObject.vectors[ 1 ][ 2 ] ) ).length();
-		const spacingZ = ( new Vector3( headerObject.vectors[ 2 ][ 0 ], headerObject.vectors[ 2 ][ 1 ],
-			headerObject.vectors[ 2 ][ 2 ] ) ).length();
+		const spacingX = new Vector3().fromArray( headerObject.vectors[ 0 ] ).length();
+		const spacingY = new Vector3().fromArray( headerObject.vectors[ 1 ] ).length();
+		const spacingZ = new Vector3().fromArray( headerObject.vectors[ 2 ] ).length();
 		volume.spacing = [ spacingX, spacingY, spacingZ ];
 
 
 		// Create IJKtoRAS matrix
 		volume.matrix = new Matrix4();
 
-		let _spaceX = 1;
-		let _spaceY = 1;
-		const _spaceZ = 1;
+		const transitionMatrix = new Matrix4();
 
-		if ( headerObject.space == 'left-posterior-superior' ) {
+		if ( headerObject.space === 'left-posterior-superior' ) {
 
-			_spaceX = - 1;
-			_spaceY = - 1;
+			transitionMatrix.set(
+				- 1, 0, 0, 0,
+				0, - 1, 0, 0,
+				0, 0, 1, 0,
+				0, 0, 0, 1
+			);
 
 		} else if ( headerObject.space === 'left-anterior-superior' ) {
 
-			_spaceX = - 1;
+			transitionMatrix.set(
+				1, 0, 0, 0,
+				0, 1, 0, 0,
+				0, 0, - 1, 0,
+				0, 0, 0, 1
+			);
 
 		}
 
@@ -395,26 +419,31 @@ class NRRDLoader extends Loader {
 		if ( ! headerObject.vectors ) {
 
 			volume.matrix.set(
-				_spaceX, 0, 0, 0,
-				0, _spaceY, 0, 0,
-				0, 0, _spaceZ, 0,
+				1, 0, 0, 0,
+				0, 1, 0, 0,
+				0, 0, 1, 0,
 				0, 0, 0, 1 );
 
 		} else {
 
 			const v = headerObject.vectors;
 
-			volume.matrix.set(
-				_spaceX * v[ 0 ][ 0 ], _spaceX * v[ 1 ][ 0 ], _spaceX * v[ 2 ][ 0 ], 0,
-				_spaceY * v[ 0 ][ 1 ], _spaceY * v[ 1 ][ 1 ], _spaceY * v[ 2 ][ 1 ], 0,
-				_spaceZ * v[ 0 ][ 2 ], _spaceZ * v[ 1 ][ 2 ], _spaceZ * v[ 2 ][ 2 ], 0,
-				0, 0, 0, 1 );
+			const ijk_to_transition = new Matrix4().set(
+				v[ 0 ][ 0 ], v[ 1 ][ 0 ], v[ 2 ][ 0 ], 0,
+				v[ 0 ][ 1 ], v[ 1 ][ 1 ], v[ 2 ][ 1 ], 0,
+				v[ 0 ][ 2 ], v[ 1 ][ 2 ], v[ 2 ][ 2 ], 0,
+				0, 0, 0, 1
+			);
+
+			const transition_to_ras = new Matrix4().multiplyMatrices( ijk_to_transition, transitionMatrix );
+
+			volume.matrix = transition_to_ras;
 
 		}
 
 		volume.inverseMatrix = new Matrix4();
 		volume.inverseMatrix.copy( volume.matrix ).invert();
-		volume.RASDimensions = ( new Vector3( volume.xLength, volume.yLength, volume.zLength ) ).applyMatrix4( volume.matrix ).round().toArray().map( Math.abs );
+		volume.RASDimensions = new Vector3( volume.xLength, volume.yLength, volume.zLength ).applyMatrix4( volume.matrix ).round().toArray().map( Math.abs );
 
 		// .. and set the default threshold
 		// only if the threshold was not already set

+ 42805 - 238
examples/jsm/loaders/ifc/web-ifc-api.js

@@ -6,8 +6,6 @@ var __commonJS = (callback, module) => () => {
   return module.exports;
 };
 
-let WasmPath = "";
-
 // dist/web-ifc.js
 var require_web_ifc = __commonJS((exports, module) => {
   var WebIFCWasm2 = function() {
@@ -577,7 +575,7 @@ var require_web_ifc = __commonJS((exports, module) => {
         function receiveInstance(instance, module2) {
           var exports3 = instance.exports;
           Module["asm"] = exports3;
-          wasmTable = Module["asm"]["P"];
+          wasmTable = Module["asm"]["W"];
           removeRunDependency("wasm-instantiate");
         }
         addRunDependency("wasm-instantiate");
@@ -654,6 +652,10 @@ var require_web_ifc = __commonJS((exports, module) => {
       function ___assert_fail(condition, filename, line, func) {
         abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function"]);
       }
+      function setErrNo(value) {
+        HEAP32[___errno_location() >> 2] = value;
+        return value;
+      }
       var PATH = {splitPath: function(filename) {
         var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
         return splitPathRe.exec(filename).slice(1);
@@ -914,14 +916,14 @@ var require_web_ifc = __commonJS((exports, module) => {
       }
       var MEMFS = {ops_table: null, mount: function(mount) {
         return MEMFS.createNode(null, "/", 16384 | 511, 0);
-      }, createNode: function(parent, name, mode, dev) {
+      }, createNode: function(parent, name2, mode, dev) {
         if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
           throw new FS.ErrnoError(63);
         }
         if (!MEMFS.ops_table) {
           MEMFS.ops_table = {dir: {node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, lookup: MEMFS.node_ops.lookup, mknod: MEMFS.node_ops.mknod, rename: MEMFS.node_ops.rename, unlink: MEMFS.node_ops.unlink, rmdir: MEMFS.node_ops.rmdir, readdir: MEMFS.node_ops.readdir, symlink: MEMFS.node_ops.symlink}, stream: {llseek: MEMFS.stream_ops.llseek}}, file: {node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr}, stream: {llseek: MEMFS.stream_ops.llseek, read: MEMFS.stream_ops.read, write: MEMFS.stream_ops.write, allocate: MEMFS.stream_ops.allocate, mmap: MEMFS.stream_ops.mmap, msync: MEMFS.stream_ops.msync}}, link: {node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, readlink: MEMFS.node_ops.readlink}, stream: {}}, chrdev: {node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr}, stream: FS.chrdev_stream_ops}};
         }
-        var node = FS.createNode(parent, name, mode, dev);
+        var node = FS.createNode(parent, name2, mode, dev);
         if (FS.isDir(node.mode)) {
           node.node_ops = MEMFS.ops_table.dir.node;
           node.stream_ops = MEMFS.ops_table.dir.stream;
@@ -940,7 +942,7 @@ var require_web_ifc = __commonJS((exports, module) => {
         }
         node.timestamp = Date.now();
         if (parent) {
-          parent.contents[name] = node;
+          parent.contents[name2] = node;
         }
         return node;
       }, getFileDataAsRegularArray: function(node) {
@@ -1029,10 +1031,10 @@ var require_web_ifc = __commonJS((exports, module) => {
         if (attr.size !== void 0) {
           MEMFS.resizeFileStorage(node, attr.size);
         }
-      }, lookup: function(parent, name) {
+      }, lookup: function(parent, name2) {
         throw FS.genericErrors[44];
-      }, mknod: function(parent, name, mode, dev) {
-        return MEMFS.createNode(parent, name, mode, dev);
+      }, mknod: function(parent, name2, mode, dev) {
+        return MEMFS.createNode(parent, name2, mode, dev);
       }, rename: function(old_node, new_dir, new_name) {
         if (FS.isDir(old_node.mode)) {
           var new_node;
@@ -1050,14 +1052,14 @@ var require_web_ifc = __commonJS((exports, module) => {
         old_node.name = new_name;
         new_dir.contents[new_name] = old_node;
         old_node.parent = new_dir;
-      }, unlink: function(parent, name) {
-        delete parent.contents[name];
-      }, rmdir: function(parent, name) {
-        var node = FS.lookupNode(parent, name);
+      }, unlink: function(parent, name2) {
+        delete parent.contents[name2];
+      }, rmdir: function(parent, name2) {
+        var node = FS.lookupNode(parent, name2);
         for (var i in node.contents) {
           throw new FS.ErrnoError(55);
         }
-        delete parent.contents[name];
+        delete parent.contents[name2];
       }, readdir: function(node) {
         var entries = [".", ".."];
         for (var key2 in node.contents) {
@@ -1230,10 +1232,10 @@ var require_web_ifc = __commonJS((exports, module) => {
           path = path ? node.name + "/" + path : node.name;
           node = node.parent;
         }
-      }, hashName: function(parentid, name) {
+      }, hashName: function(parentid, name2) {
         var hash = 0;
-        for (var i = 0; i < name.length; i++) {
-          hash = (hash << 5) - hash + name.charCodeAt(i) | 0;
+        for (var i = 0; i < name2.length; i++) {
+          hash = (hash << 5) - hash + name2.charCodeAt(i) | 0;
         }
         return (parentid + hash >>> 0) % FS.nameTable.length;
       }, hashAddNode: function(node) {
@@ -1254,21 +1256,21 @@ var require_web_ifc = __commonJS((exports, module) => {
             current = current.name_next;
           }
         }
-      }, lookupNode: function(parent, name) {
+      }, lookupNode: function(parent, name2) {
         var errCode = FS.mayLookup(parent);
         if (errCode) {
           throw new FS.ErrnoError(errCode, parent);
         }
-        var hash = FS.hashName(parent.id, name);
+        var hash = FS.hashName(parent.id, name2);
         for (var node = FS.nameTable[hash]; node; node = node.name_next) {
           var nodeName = node.name;
-          if (node.parent.id === parent.id && nodeName === name) {
+          if (node.parent.id === parent.id && nodeName === name2) {
             return node;
           }
         }
-        return FS.lookup(parent, name);
-      }, createNode: function(parent, name, mode, rdev) {
-        var node = new FS.FSNode(parent, name, mode, rdev);
+        return FS.lookup(parent, name2);
+      }, createNode: function(parent, name2, mode, rdev) {
+        var node = new FS.FSNode(parent, name2, mode, rdev);
         FS.hashAddNode(node);
         return node;
       }, destroyNode: function(node) {
@@ -1322,17 +1324,17 @@ var require_web_ifc = __commonJS((exports, module) => {
         if (!dir.node_ops.lookup)
           return 2;
         return 0;
-      }, mayCreate: function(dir, name) {
+      }, mayCreate: function(dir, name2) {
         try {
-          var node = FS.lookupNode(dir, name);
+          var node = FS.lookupNode(dir, name2);
           return 20;
         } catch (e) {
         }
         return FS.nodePermissions(dir, "wx");
-      }, mayDelete: function(dir, name, isdir) {
+      }, mayDelete: function(dir, name2, isdir) {
         var node;
         try {
-          node = FS.lookupNode(dir, name);
+          node = FS.lookupNode(dir, name2);
         } catch (e) {
           return e.errno;
         }
@@ -1514,23 +1516,23 @@ var require_web_ifc = __commonJS((exports, module) => {
         node.mounted = null;
         var idx = node.mount.mounts.indexOf(mount);
         node.mount.mounts.splice(idx, 1);
-      }, lookup: function(parent, name) {
-        return parent.node_ops.lookup(parent, name);
+      }, lookup: function(parent, name2) {
+        return parent.node_ops.lookup(parent, name2);
       }, mknod: function(path, mode, dev) {
         var lookup = FS.lookupPath(path, {parent: true});
         var parent = lookup.node;
-        var name = PATH.basename(path);
-        if (!name || name === "." || name === "..") {
+        var name2 = PATH.basename(path);
+        if (!name2 || name2 === "." || name2 === "..") {
           throw new FS.ErrnoError(28);
         }
-        var errCode = FS.mayCreate(parent, name);
+        var errCode = FS.mayCreate(parent, name2);
         if (errCode) {
           throw new FS.ErrnoError(errCode);
         }
         if (!parent.node_ops.mknod) {
           throw new FS.ErrnoError(63);
         }
-        return parent.node_ops.mknod(parent, name, mode, dev);
+        return parent.node_ops.mknod(parent, name2, mode, dev);
       }, create: function(path, mode) {
         mode = mode !== void 0 ? mode : 438;
         mode &= 4095;
@@ -1657,9 +1659,9 @@ var require_web_ifc = __commonJS((exports, module) => {
       }, rmdir: function(path) {
         var lookup = FS.lookupPath(path, {parent: true});
         var parent = lookup.node;
-        var name = PATH.basename(path);
-        var node = FS.lookupNode(parent, name);
-        var errCode = FS.mayDelete(parent, name, true);
+        var name2 = PATH.basename(path);
+        var node = FS.lookupNode(parent, name2);
+        var errCode = FS.mayDelete(parent, name2, true);
         if (errCode) {
           throw new FS.ErrnoError(errCode);
         }
@@ -1676,7 +1678,7 @@ var require_web_ifc = __commonJS((exports, module) => {
         } catch (e) {
           err("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message);
         }
-        parent.node_ops.rmdir(parent, name);
+        parent.node_ops.rmdir(parent, name2);
         FS.destroyNode(node);
         try {
           if (FS.trackingDelegate["onDeletePath"])
@@ -1694,9 +1696,9 @@ var require_web_ifc = __commonJS((exports, module) => {
       }, unlink: function(path) {
         var lookup = FS.lookupPath(path, {parent: true});
         var parent = lookup.node;
-        var name = PATH.basename(path);
-        var node = FS.lookupNode(parent, name);
-        var errCode = FS.mayDelete(parent, name, false);
+        var name2 = PATH.basename(path);
+        var node = FS.lookupNode(parent, name2);
+        var errCode = FS.mayDelete(parent, name2, false);
         if (errCode) {
           throw new FS.ErrnoError(errCode);
         }
@@ -1713,7 +1715,7 @@ var require_web_ifc = __commonJS((exports, module) => {
         } catch (e) {
           err("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message);
         }
-        parent.node_ops.unlink(parent, name);
+        parent.node_ops.unlink(parent, name2);
         FS.destroyNode(node);
         try {
           if (FS.trackingDelegate["onDeletePath"])
@@ -2108,8 +2110,8 @@ var require_web_ifc = __commonJS((exports, module) => {
         FS.mkdir("/proc/self/fd");
         FS.mount({mount: function() {
           var node = FS.createNode("/proc/self", "fd", 16384 | 511, 73);
-          node.node_ops = {lookup: function(parent, name) {
-            var fd = +name;
+          node.node_ops = {lookup: function(parent, name2) {
+            var fd = +name2;
             var stream = FS.getStream(fd);
             if (!stream)
               throw new FS.ErrnoError(8);
@@ -2236,12 +2238,12 @@ var require_web_ifc = __commonJS((exports, module) => {
           parent = current;
         }
         return current;
-      }, createFile: function(parent, name, properties, canRead, canWrite) {
-        var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
+      }, createFile: function(parent, name2, properties, canRead, canWrite) {
+        var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name2);
         var mode = FS.getMode(canRead, canWrite);
         return FS.create(path, mode);
-      }, createDataFile: function(parent, name, data, canRead, canWrite, canOwn) {
-        var path = name ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name) : parent;
+      }, createDataFile: function(parent, name2, data, canRead, canWrite, canOwn) {
+        var path = name2 ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name2) : parent;
         var mode = FS.getMode(canRead, canWrite);
         var node = FS.create(path, mode);
         if (data) {
@@ -2258,8 +2260,8 @@ var require_web_ifc = __commonJS((exports, module) => {
           FS.chmod(node, mode);
         }
         return node;
-      }, createDevice: function(parent, name, input, output) {
-        var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
+      }, createDevice: function(parent, name2, input, output) {
+        var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name2);
         var mode = FS.getMode(!!input, !!output);
         if (!FS.createDevice.major)
           FS.createDevice.major = 64;
@@ -2320,7 +2322,7 @@ var require_web_ifc = __commonJS((exports, module) => {
         } else {
           throw new Error("Cannot load without read() or XMLHttpRequest.");
         }
-      }, createLazyFile: function(parent, name, url, canRead, canWrite) {
+      }, createLazyFile: function(parent, name2, url, canRead, canWrite) {
         function LazyUint8Array() {
           this.lengthKnown = false;
           this.chunks = [];
@@ -2413,7 +2415,7 @@ var require_web_ifc = __commonJS((exports, module) => {
         } else {
           var properties = {isDevice: false, url};
         }
-        var node = FS.createFile(parent, name, properties, canRead, canWrite);
+        var node = FS.createFile(parent, name2, properties, canRead, canWrite);
         if (properties.contents) {
           node.contents = properties.contents;
         } else if (properties.url) {
@@ -2451,16 +2453,16 @@ var require_web_ifc = __commonJS((exports, module) => {
         };
         node.stream_ops = stream_ops;
         return node;
-      }, createPreloadedFile: function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) {
+      }, createPreloadedFile: function(parent, name2, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) {
         Browser.init();
-        var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent;
+        var fullname = name2 ? PATH_FS.resolve(PATH.join2(parent, name2)) : parent;
         var dep = getUniqueRunDependency("cp " + fullname);
         function processData(byteArray) {
           function finish(byteArray2) {
             if (preFinish)
               preFinish();
             if (!dontCreateFile) {
-              FS.createDataFile(parent, name, byteArray2, canRead, canWrite, canOwn);
+              FS.createDataFile(parent, name2, byteArray2, canRead, canWrite, canOwn);
             }
             if (onload)
               onload();
@@ -2725,6 +2727,55 @@ var require_web_ifc = __commonJS((exports, module) => {
       }, get64: function(low, high) {
         return low;
       }};
+      function ___sys_fcntl64(fd, cmd, varargs) {
+        SYSCALLS.varargs = varargs;
+        try {
+          var stream = SYSCALLS.getStreamFromFD(fd);
+          switch (cmd) {
+            case 0: {
+              var arg = SYSCALLS.get();
+              if (arg < 0) {
+                return -28;
+              }
+              var newStream;
+              newStream = FS.open(stream.path, stream.flags, 0, arg);
+              return newStream.fd;
+            }
+            case 1:
+            case 2:
+              return 0;
+            case 3:
+              return stream.flags;
+            case 4: {
+              var arg = SYSCALLS.get();
+              stream.flags |= arg;
+              return 0;
+            }
+            case 12: {
+              var arg = SYSCALLS.get();
+              var offset = 0;
+              HEAP16[arg + offset >> 1] = 2;
+              return 0;
+            }
+            case 13:
+            case 14:
+              return 0;
+            case 16:
+            case 8:
+              return -28;
+            case 9:
+              setErrNo(28);
+              return -1;
+            default: {
+              return -28;
+            }
+          }
+        } catch (e) {
+          if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
+            abort(e);
+          return -e.errno;
+        }
+      }
       function ___sys_ioctl(fd, op, varargs) {
         SYSCALLS.varargs = varargs;
         try {
@@ -2810,21 +2861,21 @@ var require_web_ifc = __commonJS((exports, module) => {
       var typeDependencies = {};
       var char_0 = 48;
       var char_9 = 57;
-      function makeLegalFunctionName(name) {
-        if (name === void 0) {
+      function makeLegalFunctionName(name2) {
+        if (name2 === void 0) {
           return "_unknown";
         }
-        name = name.replace(/[^a-zA-Z0-9_]/g, "$");
-        var f = name.charCodeAt(0);
+        name2 = name2.replace(/[^a-zA-Z0-9_]/g, "$");
+        var f = name2.charCodeAt(0);
         if (f >= char_0 && f <= char_9) {
-          return "_" + name;
+          return "_" + name2;
         } else {
-          return name;
+          return name2;
         }
       }
-      function createNamedFunction(name, body) {
-        name = makeLegalFunctionName(name);
-        return new Function("body", "return function " + name + '() {\n    "use strict";    return body.apply(this, arguments);\n};\n')(body);
+      function createNamedFunction(name2, body) {
+        name2 = makeLegalFunctionName(name2);
+        return new Function("body", "return function " + name2 + '() {\n    "use strict";    return body.apply(this, arguments);\n};\n')(body);
       }
       function extendError(baseErrorType, errorName) {
         var errorClass = createNamedFunction(errorName, function(message) {
@@ -3031,15 +3082,15 @@ var require_web_ifc = __commonJS((exports, module) => {
         if (!("argPackAdvance" in registeredInstance)) {
           throw new TypeError("registerType registeredInstance requires argPackAdvance");
         }
-        var name = registeredInstance.name;
+        var name2 = registeredInstance.name;
         if (!rawType) {
-          throwBindingError('type "' + name + '" must have a positive integer typeid pointer');
+          throwBindingError('type "' + name2 + '" must have a positive integer typeid pointer');
         }
         if (registeredTypes.hasOwnProperty(rawType)) {
           if (options.ignoreDuplicateRegistrations) {
             return;
           } else {
-            throwBindingError("Cannot register type '" + name + "' twice");
+            throwBindingError("Cannot register type '" + name2 + "' twice");
           }
         }
         registeredTypes[rawType] = registeredInstance;
@@ -3052,10 +3103,10 @@ var require_web_ifc = __commonJS((exports, module) => {
           });
         }
       }
-      function __embind_register_bool(rawType, name, size, trueValue, falseValue) {
+      function __embind_register_bool(rawType, name2, size, trueValue, falseValue) {
         var shift = getShiftFromSize(size);
-        name = readLatin1String(name);
-        registerType(rawType, {name, fromWireType: function(wt) {
+        name2 = readLatin1String(name2);
+        registerType(rawType, {name: name2, fromWireType: function(wt) {
           return !!wt;
         }, toWireType: function(destructors, o) {
           return o ? trueValue : falseValue;
@@ -3068,7 +3119,7 @@ var require_web_ifc = __commonJS((exports, module) => {
           } else if (size === 4) {
             heap = HEAP32;
           } else {
-            throw new TypeError("Unknown boolean type size: " + name);
+            throw new TypeError("Unknown boolean type size: " + name2);
           }
           return this["fromWireType"](heap[pointer >> shift]);
         }, destructorFunction: null});
@@ -3223,25 +3274,25 @@ var require_web_ifc = __commonJS((exports, module) => {
           proto[methodName].overloadTable[prevFunc.argCount] = prevFunc;
         }
       }
-      function exposePublicSymbol(name, value, numArguments) {
-        if (Module.hasOwnProperty(name)) {
-          if (numArguments === void 0 || Module[name].overloadTable !== void 0 && Module[name].overloadTable[numArguments] !== void 0) {
-            throwBindingError("Cannot register public name '" + name + "' twice");
+      function exposePublicSymbol(name2, value, numArguments) {
+        if (Module.hasOwnProperty(name2)) {
+          if (numArguments === void 0 || Module[name2].overloadTable !== void 0 && Module[name2].overloadTable[numArguments] !== void 0) {
+            throwBindingError("Cannot register public name '" + name2 + "' twice");
           }
-          ensureOverloadTable(Module, name, name);
+          ensureOverloadTable(Module, name2, name2);
           if (Module.hasOwnProperty(numArguments)) {
             throwBindingError("Cannot register multiple overloads of a function with the same number of arguments (" + numArguments + ")!");
           }
-          Module[name].overloadTable[numArguments] = value;
+          Module[name2].overloadTable[numArguments] = value;
         } else {
-          Module[name] = value;
+          Module[name2] = value;
           if (numArguments !== void 0) {
-            Module[name].numArguments = numArguments;
+            Module[name2].numArguments = numArguments;
           }
         }
       }
-      function RegisteredClass(name, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast) {
-        this.name = name;
+      function RegisteredClass(name2, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast) {
+        this.name = name2;
         this.constructor = constructor;
         this.instancePrototype = instancePrototype;
         this.rawDestructor = rawDestructor;
@@ -3493,8 +3544,8 @@ var require_web_ifc = __commonJS((exports, module) => {
         RegisteredPointer.prototype["deleteObject"] = RegisteredPointer_deleteObject;
         RegisteredPointer.prototype["fromWireType"] = RegisteredPointer_fromWireType;
       }
-      function RegisteredPointer(name, registeredClass, isReference, isConst, isSmartPointer, pointeeType, sharingPolicy, rawGetPointee, rawConstructor, rawShare, rawDestructor) {
-        this.name = name;
+      function RegisteredPointer(name2, registeredClass, isReference, isConst, isSmartPointer, pointeeType, sharingPolicy, rawGetPointee, rawConstructor, rawShare, rawDestructor) {
+        this.name = name2;
         this.registeredClass = registeredClass;
         this.isReference = isReference;
         this.isConst = isConst;
@@ -3517,15 +3568,15 @@ var require_web_ifc = __commonJS((exports, module) => {
           this["toWireType"] = genericPointerToWireType;
         }
       }
-      function replacePublicSymbol(name, value, numArguments) {
-        if (!Module.hasOwnProperty(name)) {
+      function replacePublicSymbol(name2, value, numArguments) {
+        if (!Module.hasOwnProperty(name2)) {
           throwInternalError("Replacing nonexistant public symbol");
         }
-        if (Module[name].overloadTable !== void 0 && numArguments !== void 0) {
-          Module[name].overloadTable[numArguments] = value;
+        if (Module[name2].overloadTable !== void 0 && numArguments !== void 0) {
+          Module[name2].overloadTable[numArguments] = value;
         } else {
-          Module[name] = value;
-          Module[name].argCount = numArguments;
+          Module[name2] = value;
+          Module[name2].argCount = numArguments;
         }
       }
       function getDynCaller(sig, ptr) {
@@ -3580,8 +3631,8 @@ var require_web_ifc = __commonJS((exports, module) => {
         types.forEach(visit);
         throw new UnboundTypeError(message + ": " + unboundTypes.map(getTypeName).join([", "]));
       }
-      function __embind_register_class(rawType, rawPointerType, rawConstPointerType, baseClassRawType, getActualTypeSignature, getActualType, upcastSignature, upcast, downcastSignature, downcast, name, destructorSignature, rawDestructor) {
-        name = readLatin1String(name);
+      function __embind_register_class(rawType, rawPointerType, rawConstPointerType, baseClassRawType, getActualTypeSignature, getActualType, upcastSignature, upcast, downcastSignature, downcast, name2, destructorSignature, rawDestructor) {
+        name2 = readLatin1String(name2);
         getActualType = embind__requireFunction(getActualTypeSignature, getActualType);
         if (upcast) {
           upcast = embind__requireFunction(upcastSignature, upcast);
@@ -3590,9 +3641,9 @@ var require_web_ifc = __commonJS((exports, module) => {
           downcast = embind__requireFunction(downcastSignature, downcast);
         }
         rawDestructor = embind__requireFunction(destructorSignature, rawDestructor);
-        var legalFunctionName = makeLegalFunctionName(name);
+        var legalFunctionName = makeLegalFunctionName(name2);
         exposePublicSymbol(legalFunctionName, function() {
-          throwUnboundTypeError("Cannot construct " + name + " due to unbound types", [baseClassRawType]);
+          throwUnboundTypeError("Cannot construct " + name2 + " due to unbound types", [baseClassRawType]);
         });
         whenDependentTypesAreResolved([rawType, rawPointerType, rawConstPointerType], baseClassRawType ? [baseClassRawType] : [], function(base) {
           base = base[0];
@@ -3606,23 +3657,23 @@ var require_web_ifc = __commonJS((exports, module) => {
           }
           var constructor = createNamedFunction(legalFunctionName, function() {
             if (Object.getPrototypeOf(this) !== instancePrototype) {
-              throw new BindingError("Use 'new' to construct " + name);
+              throw new BindingError("Use 'new' to construct " + name2);
             }
             if (registeredClass.constructor_body === void 0) {
-              throw new BindingError(name + " has no accessible constructor");
+              throw new BindingError(name2 + " has no accessible constructor");
             }
             var body = registeredClass.constructor_body[arguments.length];
             if (body === void 0) {
-              throw new BindingError("Tried to invoke ctor of " + name + " with invalid number of parameters (" + arguments.length + ") - expected (" + Object.keys(registeredClass.constructor_body).toString() + ") parameters instead!");
+              throw new BindingError("Tried to invoke ctor of " + name2 + " with invalid number of parameters (" + arguments.length + ") - expected (" + Object.keys(registeredClass.constructor_body).toString() + ") parameters instead!");
             }
             return body.apply(this, arguments);
           });
           var instancePrototype = Object.create(basePrototype, {constructor: {value: constructor}});
           constructor.prototype = instancePrototype;
-          var registeredClass = new RegisteredClass(name, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast);
-          var referenceConverter = new RegisteredPointer(name, registeredClass, true, false, false);
-          var pointerConverter = new RegisteredPointer(name + "*", registeredClass, false, false, false);
-          var constPointerConverter = new RegisteredPointer(name + " const*", registeredClass, false, true, false);
+          var registeredClass = new RegisteredClass(name2, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast);
+          var referenceConverter = new RegisteredPointer(name2, registeredClass, true, false, false);
+          var pointerConverter = new RegisteredPointer(name2 + "*", registeredClass, false, false, false);
+          var constPointerConverter = new RegisteredPointer(name2 + " const*", registeredClass, false, true, false);
           registeredPointers[rawType] = {pointerType: pointerConverter, constPointerType: constPointerConverter};
           replacePublicSymbol(legalFunctionName, constructor);
           return [referenceConverter, pointerConverter, constPointerConverter];
@@ -3829,9 +3880,9 @@ var require_web_ifc = __commonJS((exports, module) => {
           }
         }
       }
-      function __embind_register_emval(rawType, name) {
-        name = readLatin1String(name);
-        registerType(rawType, {name, fromWireType: function(handle) {
+      function __embind_register_emval(rawType, name2) {
+        name2 = readLatin1String(name2);
+        registerType(rawType, {name: name2, fromWireType: function(handle) {
           var rv = emval_handle_array[handle].value;
           __emval_decref(handle);
           return rv;
@@ -3850,7 +3901,7 @@ var require_web_ifc = __commonJS((exports, module) => {
           return "" + v;
         }
       }
-      function floatReadValueFromPointer(name, shift) {
+      function floatReadValueFromPointer(name2, shift) {
         switch (shift) {
           case 2:
             return function(pointer) {
@@ -3861,35 +3912,35 @@ var require_web_ifc = __commonJS((exports, module) => {
               return this["fromWireType"](HEAPF64[pointer >> 3]);
             };
           default:
-            throw new TypeError("Unknown float type: " + name);
+            throw new TypeError("Unknown float type: " + name2);
         }
       }
-      function __embind_register_float(rawType, name, size) {
+      function __embind_register_float(rawType, name2, size) {
         var shift = getShiftFromSize(size);
-        name = readLatin1String(name);
-        registerType(rawType, {name, fromWireType: function(value) {
+        name2 = readLatin1String(name2);
+        registerType(rawType, {name: name2, fromWireType: function(value) {
           return value;
         }, toWireType: function(destructors, value) {
           if (typeof value !== "number" && typeof value !== "boolean") {
             throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name);
           }
           return value;
-        }, argPackAdvance: 8, readValueFromPointer: floatReadValueFromPointer(name, shift), destructorFunction: null});
+        }, argPackAdvance: 8, readValueFromPointer: floatReadValueFromPointer(name2, shift), destructorFunction: null});
       }
-      function __embind_register_function(name, argCount, rawArgTypesAddr, signature, rawInvoker, fn) {
+      function __embind_register_function(name2, argCount, rawArgTypesAddr, signature, rawInvoker, fn) {
         var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
-        name = readLatin1String(name);
+        name2 = readLatin1String(name2);
         rawInvoker = embind__requireFunction(signature, rawInvoker);
-        exposePublicSymbol(name, function() {
-          throwUnboundTypeError("Cannot call " + name + " due to unbound types", argTypes);
+        exposePublicSymbol(name2, function() {
+          throwUnboundTypeError("Cannot call " + name2 + " due to unbound types", argTypes);
         }, argCount - 1);
         whenDependentTypesAreResolved([], argTypes, function(argTypes2) {
           var invokerArgsArray = [argTypes2[0], null].concat(argTypes2.slice(1));
-          replacePublicSymbol(name, craftInvokerFunction(name, invokerArgsArray, null, rawInvoker, fn), argCount - 1);
+          replacePublicSymbol(name2, craftInvokerFunction(name2, invokerArgsArray, null, rawInvoker, fn), argCount - 1);
           return [];
         });
       }
-      function integerReadValueFromPointer(name, shift, signed) {
+      function integerReadValueFromPointer(name2, shift, signed) {
         switch (shift) {
           case 0:
             return signed ? function readS8FromPointer(pointer) {
@@ -3910,11 +3961,11 @@ var require_web_ifc = __commonJS((exports, module) => {
               return HEAPU32[pointer >> 2];
             };
           default:
-            throw new TypeError("Unknown integer type: " + name);
+            throw new TypeError("Unknown integer type: " + name2);
         }
       }
-      function __embind_register_integer(primitiveType, name, size, minRange, maxRange) {
-        name = readLatin1String(name);
+      function __embind_register_integer(primitiveType, name2, size, minRange, maxRange) {
+        name2 = readLatin1String(name2);
         if (maxRange === -1) {
           maxRange = 4294967295;
         }
@@ -3928,18 +3979,18 @@ var require_web_ifc = __commonJS((exports, module) => {
             return value << bitshift >>> bitshift;
           };
         }
-        var isUnsignedType = name.indexOf("unsigned") != -1;
-        registerType(primitiveType, {name, fromWireType, toWireType: function(destructors, value) {
+        var isUnsignedType = name2.indexOf("unsigned") != -1;
+        registerType(primitiveType, {name: name2, fromWireType, toWireType: function(destructors, value) {
           if (typeof value !== "number" && typeof value !== "boolean") {
             throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name);
           }
           if (value < minRange || value > maxRange) {
-            throw new TypeError('Passing a number "' + _embind_repr(value) + '" from JS side to C/C++ side to an argument of type "' + name + '", which is outside the valid range [' + minRange + ", " + maxRange + "]!");
+            throw new TypeError('Passing a number "' + _embind_repr(value) + '" from JS side to C/C++ side to an argument of type "' + name2 + '", which is outside the valid range [' + minRange + ", " + maxRange + "]!");
           }
           return isUnsignedType ? value >>> 0 : value | 0;
-        }, argPackAdvance: 8, readValueFromPointer: integerReadValueFromPointer(name, shift, minRange !== 0), destructorFunction: null});
+        }, argPackAdvance: 8, readValueFromPointer: integerReadValueFromPointer(name2, shift, minRange !== 0), destructorFunction: null});
       }
-      function __embind_register_memory_view(rawType, dataTypeIndex, name) {
+      function __embind_register_memory_view(rawType, dataTypeIndex, name2) {
         var typeMapping = [Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array];
         var TA = typeMapping[dataTypeIndex];
         function decodeMemoryView(handle) {
@@ -3949,13 +4000,13 @@ var require_web_ifc = __commonJS((exports, module) => {
           var data = heap[handle + 1];
           return new TA(buffer, data, size);
         }
-        name = readLatin1String(name);
-        registerType(rawType, {name, fromWireType: decodeMemoryView, argPackAdvance: 8, readValueFromPointer: decodeMemoryView}, {ignoreDuplicateRegistrations: true});
+        name2 = readLatin1String(name2);
+        registerType(rawType, {name: name2, fromWireType: decodeMemoryView, argPackAdvance: 8, readValueFromPointer: decodeMemoryView}, {ignoreDuplicateRegistrations: true});
       }
-      function __embind_register_std_string(rawType, name) {
-        name = readLatin1String(name);
-        var stdStringIsUTF8 = name === "std::string";
-        registerType(rawType, {name, fromWireType: function(value) {
+      function __embind_register_std_string(rawType, name2) {
+        name2 = readLatin1String(name2);
+        var stdStringIsUTF8 = name2 === "std::string";
+        registerType(rawType, {name: name2, fromWireType: function(value) {
           var length = HEAPU32[value >> 2];
           var str;
           if (stdStringIsUTF8) {
@@ -4030,8 +4081,8 @@ var require_web_ifc = __commonJS((exports, module) => {
           _free(ptr);
         }});
       }
-      function __embind_register_std_wstring(rawType, charSize, name) {
-        name = readLatin1String(name);
+      function __embind_register_std_wstring(rawType, charSize, name2) {
+        name2 = readLatin1String(name2);
         var decodeString, encodeString, getHeap, lengthBytesUTF, shift;
         if (charSize === 2) {
           decodeString = UTF16ToString;
@@ -4050,7 +4101,7 @@ var require_web_ifc = __commonJS((exports, module) => {
           };
           shift = 2;
         }
-        registerType(rawType, {name, fromWireType: function(value) {
+        registerType(rawType, {name: name2, fromWireType: function(value) {
           var length = HEAPU32[value >> 2];
           var HEAP = getHeap();
           var str;
@@ -4073,7 +4124,7 @@ var require_web_ifc = __commonJS((exports, module) => {
           return str;
         }, toWireType: function(destructors, value) {
           if (!(typeof value === "string")) {
-            throwBindingError("Cannot pass non-string to C++ string type " + name);
+            throwBindingError("Cannot pass non-string to C++ string type " + name2);
           }
           var length = lengthBytesUTF(value);
           var ptr = _malloc(4 + length + charSize);
@@ -4087,33 +4138,46 @@ var require_web_ifc = __commonJS((exports, module) => {
           _free(ptr);
         }});
       }
-      function __embind_register_value_array(rawType, name, constructorSignature, rawConstructor, destructorSignature, rawDestructor) {
-        tupleRegistrations[rawType] = {name: readLatin1String(name), rawConstructor: embind__requireFunction(constructorSignature, rawConstructor), rawDestructor: embind__requireFunction(destructorSignature, rawDestructor), elements: []};
+      function __embind_register_value_array(rawType, name2, constructorSignature, rawConstructor, destructorSignature, rawDestructor) {
+        tupleRegistrations[rawType] = {name: readLatin1String(name2), rawConstructor: embind__requireFunction(constructorSignature, rawConstructor), rawDestructor: embind__requireFunction(destructorSignature, rawDestructor), elements: []};
       }
       function __embind_register_value_array_element(rawTupleType, getterReturnType, getterSignature, getter, getterContext, setterArgumentType, setterSignature, setter, setterContext) {
         tupleRegistrations[rawTupleType].elements.push({getterReturnType, getter: embind__requireFunction(getterSignature, getter), getterContext, setterArgumentType, setter: embind__requireFunction(setterSignature, setter), setterContext});
       }
-      function __embind_register_value_object(rawType, name, constructorSignature, rawConstructor, destructorSignature, rawDestructor) {
-        structRegistrations[rawType] = {name: readLatin1String(name), rawConstructor: embind__requireFunction(constructorSignature, rawConstructor), rawDestructor: embind__requireFunction(destructorSignature, rawDestructor), fields: []};
+      function __embind_register_value_object(rawType, name2, constructorSignature, rawConstructor, destructorSignature, rawDestructor) {
+        structRegistrations[rawType] = {name: readLatin1String(name2), rawConstructor: embind__requireFunction(constructorSignature, rawConstructor), rawDestructor: embind__requireFunction(destructorSignature, rawDestructor), fields: []};
       }
       function __embind_register_value_object_field(structType, fieldName, getterReturnType, getterSignature, getter, getterContext, setterArgumentType, setterSignature, setter, setterContext) {
         structRegistrations[structType].fields.push({fieldName: readLatin1String(fieldName), getterReturnType, getter: embind__requireFunction(getterSignature, getter), getterContext, setterArgumentType, setter: embind__requireFunction(setterSignature, setter), setterContext});
       }
-      function __embind_register_void(rawType, name) {
-        name = readLatin1String(name);
-        registerType(rawType, {isVoid: true, name, argPackAdvance: 0, fromWireType: function() {
+      function __embind_register_void(rawType, name2) {
+        name2 = readLatin1String(name2);
+        registerType(rawType, {isVoid: true, name: name2, argPackAdvance: 0, fromWireType: function() {
           return void 0;
         }, toWireType: function(destructors, o) {
           return void 0;
         }});
       }
-      function __emval_incref(handle) {
-        if (handle > 4) {
-          emval_handle_array[handle].refcount += 1;
+      function requireHandle(handle) {
+        if (!handle) {
+          throwBindingError("Cannot use deleted val. handle = " + handle);
         }
+        return emval_handle_array[handle].value;
       }
-      function __emval_new_array() {
-        return __emval_register([]);
+      function requireRegisteredType(rawType, humanName) {
+        var impl = registeredTypes[rawType];
+        if (impl === void 0) {
+          throwBindingError(humanName + " has unknown type " + getTypeName(rawType));
+        }
+        return impl;
+      }
+      function __emval_as(handle, returnType, destructorsRef) {
+        handle = requireHandle(handle);
+        returnType = requireRegisteredType(returnType, "emval::as");
+        var destructors = [];
+        var rd = __emval_register(destructors);
+        HEAP32[destructorsRef >> 2] = rd;
+        return returnType["toWireType"](destructors, handle);
       }
       var emval_symbols = {};
       function getStringOrSymbol(address) {
@@ -4124,17 +4188,54 @@ var require_web_ifc = __commonJS((exports, module) => {
           return symbol;
         }
       }
+      function emval_get_global() {
+        if (typeof globalThis === "object") {
+          return globalThis;
+        }
+        return function() {
+          return Function;
+        }()("return this")();
+      }
+      function __emval_get_global(name2) {
+        if (name2 === 0) {
+          return __emval_register(emval_get_global());
+        } else {
+          name2 = getStringOrSymbol(name2);
+          return __emval_register(emval_get_global()[name2]);
+        }
+      }
+      function __emval_get_property(handle, key2) {
+        handle = requireHandle(handle);
+        key2 = requireHandle(key2);
+        return __emval_register(handle[key2]);
+      }
+      function __emval_incref(handle) {
+        if (handle > 4) {
+          emval_handle_array[handle].refcount += 1;
+        }
+      }
+      function __emval_instanceof(object, constructor) {
+        object = requireHandle(object);
+        constructor = requireHandle(constructor);
+        return object instanceof constructor;
+      }
+      function __emval_is_number(handle) {
+        handle = requireHandle(handle);
+        return typeof handle === "number";
+      }
+      function __emval_new_array() {
+        return __emval_register([]);
+      }
       function __emval_new_cstring(v) {
         return __emval_register(getStringOrSymbol(v));
       }
       function __emval_new_object() {
         return __emval_register({});
       }
-      function requireHandle(handle) {
-        if (!handle) {
-          throwBindingError("Cannot use deleted val. handle = " + handle);
-        }
-        return emval_handle_array[handle].value;
+      function __emval_run_destructors(handle) {
+        var destructors = emval_handle_array[handle].value;
+        runDestructors(destructors);
+        __emval_decref(handle);
       }
       function __emval_set_property(handle, key2, value) {
         handle = requireHandle(handle);
@@ -4142,13 +4243,6 @@ var require_web_ifc = __commonJS((exports, module) => {
         value = requireHandle(value);
         handle[key2] = value;
       }
-      function requireRegisteredType(rawType, humanName) {
-        var impl = registeredTypes[rawType];
-        if (impl === void 0) {
-          throwBindingError(humanName + " has unknown type " + getTypeName(rawType));
-        }
-        return impl;
-      }
       function __emval_take_value(type, argv) {
         type = requireRegisteredType(type, "_emval_take_value");
         var v = type["readValueFromPointer"](argv);
@@ -4170,10 +4264,6 @@ var require_web_ifc = __commonJS((exports, module) => {
           return performance.now();
         };
       var _emscripten_get_now_is_monotonic = true;
-      function setErrNo(value) {
-        HEAP32[___errno_location() >> 2] = value;
-        return value;
-      }
       function _clock_gettime(clk_id, tp) {
         var now;
         if (clk_id === 0) {
@@ -4550,7 +4640,7 @@ var require_web_ifc = __commonJS((exports, module) => {
       function _strftime_l(s, maxsize, format, tm) {
         return _strftime(s, maxsize, format, tm);
       }
-      var FSNode = function(parent, name, mode, rdev) {
+      var FSNode = function(parent, name2, mode, rdev) {
         if (!parent) {
           parent = this;
         }
@@ -4558,7 +4648,7 @@ var require_web_ifc = __commonJS((exports, module) => {
         this.mount = parent.mount;
         this.mounted = null;
         this.id = FS.nextInode++;
-        this.name = name;
+        this.name = name2;
         this.mode = mode;
         this.node_ops = {};
         this.stream_ops = {};
@@ -4606,43 +4696,43 @@ var require_web_ifc = __commonJS((exports, module) => {
       __ATINIT__.push({func: function() {
         ___wasm_call_ctors();
       }});
-      var asmLibraryArg = {t: ___assert_fail, I: ___sys_ioctl, J: ___sys_open, N: __embind_finalize_value_array, r: __embind_finalize_value_object, L: __embind_register_bool, n: __embind_register_class, o: __embind_register_class_constructor, d: __embind_register_class_function, K: __embind_register_emval, w: __embind_register_float, l: __embind_register_function, h: __embind_register_integer, g: __embind_register_memory_view, x: __embind_register_std_string, q: __embind_register_std_wstring, O: __embind_register_value_array, e: __embind_register_value_array_element, s: __embind_register_value_object, i: __embind_register_value_object_field, M: __embind_register_void, c: __emval_decref, k: __emval_incref, y: __emval_new_array, p: __emval_new_cstring, z: __emval_new_object, j: __emval_set_property, f: __emval_take_value, b: _abort, G: _clock_gettime, C: _emscripten_memcpy_big, m: _emscripten_resize_heap, E: _environ_get, F: _environ_sizes_get, v: _fd_close, H: _fd_read, A: _fd_seek, u: _fd_write, a: wasmMemory, B: _setTempRet0, D: _strftime_l};
+      var asmLibraryArg = {x: ___assert_fail, A: ___sys_fcntl64, O: ___sys_ioctl, P: ___sys_open, U: __embind_finalize_value_array, v: __embind_finalize_value_object, S: __embind_register_bool, t: __embind_register_class, s: __embind_register_class_constructor, d: __embind_register_class_function, R: __embind_register_emval, C: __embind_register_float, j: __embind_register_function, l: __embind_register_integer, i: __embind_register_memory_view, D: __embind_register_std_string, u: __embind_register_std_wstring, V: __embind_register_value_array, g: __embind_register_value_array_element, w: __embind_register_value_object, m: __embind_register_value_object_field, T: __embind_register_void, q: __emval_as, b: __emval_decref, L: __emval_get_global, n: __emval_get_property, k: __emval_incref, Q: __emval_instanceof, E: __emval_is_number, y: __emval_new_array, f: __emval_new_cstring, r: __emval_new_object, p: __emval_run_destructors, h: __emval_set_property, e: __emval_take_value, c: _abort, M: _clock_gettime, H: _emscripten_memcpy_big, o: _emscripten_resize_heap, J: _environ_get, K: _environ_sizes_get, B: _fd_close, N: _fd_read, F: _fd_seek, z: _fd_write, a: wasmMemory, G: _setTempRet0, I: _strftime_l};
       var asm = createWasm();
       var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() {
-        return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["Q"]).apply(null, arguments);
+        return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["X"]).apply(null, arguments);
       };
       var _main = Module["_main"] = function() {
-        return (_main = Module["_main"] = Module["asm"]["R"]).apply(null, arguments);
+        return (_main = Module["_main"] = Module["asm"]["Y"]).apply(null, arguments);
       };
       var _malloc = Module["_malloc"] = function() {
-        return (_malloc = Module["_malloc"] = Module["asm"]["S"]).apply(null, arguments);
+        return (_malloc = Module["_malloc"] = Module["asm"]["Z"]).apply(null, arguments);
       };
       var ___getTypeName = Module["___getTypeName"] = function() {
-        return (___getTypeName = Module["___getTypeName"] = Module["asm"]["T"]).apply(null, arguments);
+        return (___getTypeName = Module["___getTypeName"] = Module["asm"]["_"]).apply(null, arguments);
       };
       var ___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = function() {
-        return (___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = Module["asm"]["U"]).apply(null, arguments);
+        return (___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = Module["asm"]["$"]).apply(null, arguments);
       };
       var ___errno_location = Module["___errno_location"] = function() {
-        return (___errno_location = Module["___errno_location"] = Module["asm"]["V"]).apply(null, arguments);
+        return (___errno_location = Module["___errno_location"] = Module["asm"]["aa"]).apply(null, arguments);
       };
       var _free = Module["_free"] = function() {
-        return (_free = Module["_free"] = Module["asm"]["W"]).apply(null, arguments);
+        return (_free = Module["_free"] = Module["asm"]["ba"]).apply(null, arguments);
       };
       var dynCall_jiji = Module["dynCall_jiji"] = function() {
-        return (dynCall_jiji = Module["dynCall_jiji"] = Module["asm"]["X"]).apply(null, arguments);
+        return (dynCall_jiji = Module["dynCall_jiji"] = Module["asm"]["ca"]).apply(null, arguments);
       };
       var dynCall_viijii = Module["dynCall_viijii"] = function() {
-        return (dynCall_viijii = Module["dynCall_viijii"] = Module["asm"]["Y"]).apply(null, arguments);
+        return (dynCall_viijii = Module["dynCall_viijii"] = Module["asm"]["da"]).apply(null, arguments);
       };
       var dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = function() {
-        return (dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = Module["asm"]["Z"]).apply(null, arguments);
+        return (dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = Module["asm"]["ea"]).apply(null, arguments);
       };
       var dynCall_iiiiij = Module["dynCall_iiiiij"] = function() {
-        return (dynCall_iiiiij = Module["dynCall_iiiiij"] = Module["asm"]["_"]).apply(null, arguments);
+        return (dynCall_iiiiij = Module["dynCall_iiiiij"] = Module["asm"]["fa"]).apply(null, arguments);
       };
       var dynCall_iiiiijj = Module["dynCall_iiiiijj"] = function() {
-        return (dynCall_iiiiijj = Module["dynCall_iiiiijj"] = Module["asm"]["$"]).apply(null, arguments);
+        return (dynCall_iiiiijj = Module["dynCall_iiiiijj"] = Module["asm"]["ga"]).apply(null, arguments);
       };
       Module["addRunDependency"] = addRunDependency;
       Module["removeRunDependency"] = removeRunDependency;
@@ -4652,6 +4742,7 @@ var require_web_ifc = __commonJS((exports, module) => {
       Module["FS_createLazyFile"] = FS.createLazyFile;
       Module["FS_createDevice"] = FS.createDevice;
       Module["FS_unlink"] = FS.unlink;
+      Module["FS"] = FS;
       var calledRun;
       function ExitStatus(status) {
         this.name = "ExitStatus";
@@ -4766,68 +4857,42544 @@ var require_web_ifc = __commonJS((exports, module) => {
     exports["WebIFCWasm"] = WebIFCWasm2;
 });
 
-// dist/web-ifc-api.ts
-var WebIFCWasm = require_web_ifc();
-function ms() {
-  return new Date().getTime();
-}
-var IfcAPI = class {
-  constructor() {
-    this.wasmModule = void 0;
-  }
-  async Init() {
-    if (WebIFCWasm) {
-      this.wasmModule = await WebIFCWasm({noInitialRun: true});
-    } else {
-      console.error(`Could not find wasm module at './web-ifc' from web-ifc-api.ts`);
-    }
-  }
-  OpenModel(filename, data) {
-    this.wasmModule["FS_createDataFile"]("/", "filename", data, true, true, true);
-    console.log("Wrote file");
-    let result = this.wasmModule.OpenModel(filename);
-    this.wasmModule["FS_unlink"]("/filename");
-    return result;
-  }
-  GetGeometry(modelID, geometryExpressID) {
-    return this.wasmModule.GetGeometry(modelID, geometryExpressID);
-  }
-  GetLine(modelID, expressID) {
-    return this.wasmModule.GetLine(modelID, expressID);
-  }
-  GetLineIDsWithType(modelID, type) {
-    return this.wasmModule.GetLineIDsWithType(modelID, type);
-  }
-  SetGeometryTransformation(modelID, transformationMatrix) {
-    if (transformationMatrix.length != 16) {
-      console.log(`Bad transformation matrix size: ${transformationMatrix.length}`);
-      return;
-    }
-    this.wasmModule.SetGeometryTransformation(modelID, transformationMatrix);
-  }
-  GetVertexArray(ptr, size) {
-    return this.getSubArray(this.wasmModule.HEAPF32, ptr, size);
-  }
-  GetIndexArray(ptr, size) {
-    return this.getSubArray(this.wasmModule.HEAPU32, ptr, size);
-  }
-  getSubArray(heap, startPtr, sizeBytes) {
-    return heap.subarray(startPtr / 4, startPtr / 4 + sizeBytes).slice(0);
-  }
-  CloseModel(modelID) {
-    this.wasmModule.CloseModel(modelID);
-  }
-  IsModelOpen(modelID) {
-    return this.wasmModule.IsModelOpen(modelID);
-  }
-  LoadAllGeometry(modelID) {
-    return this.wasmModule.LoadAllGeometry(modelID);
-  }
-  SetWasmPath(path){
-    WasmPath = path;
-  }
+// dist/ifc2x4.ts
+var IFCACTIONREQUEST = 3821786052;
+var IFCACTOR = 2296667514;
+var IFCACTORROLE = 3630933823;
+var IFCACTUATOR = 4288193352;
+var IFCACTUATORTYPE = 2874132201;
+var IFCADDRESS = 618182010;
+var IFCADVANCEDBREP = 1635779807;
+var IFCADVANCEDBREPWITHVOIDS = 2603310189;
+var IFCADVANCEDFACE = 3406155212;
+var IFCAIRTERMINAL = 1634111441;
+var IFCAIRTERMINALBOX = 177149247;
+var IFCAIRTERMINALBOXTYPE = 1411407467;
+var IFCAIRTERMINALTYPE = 3352864051;
+var IFCAIRTOAIRHEATRECOVERY = 2056796094;
+var IFCAIRTOAIRHEATRECOVERYTYPE = 1871374353;
+var IFCALARM = 3087945054;
+var IFCALARMTYPE = 3001207471;
+var IFCALIGNMENT = 325726236;
+var IFCALIGNMENT2DHORIZONTAL = 749761778;
+var IFCALIGNMENT2DHORIZONTALSEGMENT = 3199563722;
+var IFCALIGNMENT2DSEGMENT = 2483840362;
+var IFCALIGNMENT2DVERSEGCIRCULARARC = 3379348081;
+var IFCALIGNMENT2DVERSEGLINE = 3239324667;
+var IFCALIGNMENT2DVERSEGPARABOLICARC = 4263986512;
+var IFCALIGNMENT2DVERTICAL = 53199957;
+var IFCALIGNMENT2DVERTICALSEGMENT = 2029264950;
+var IFCALIGNMENTCURVE = 3512275521;
+var IFCANNOTATION = 1674181508;
+var IFCANNOTATIONFILLAREA = 669184980;
+var IFCAPPLICATION = 639542469;
+var IFCAPPLIEDVALUE = 411424972;
+var IFCAPPROVAL = 130549933;
+var IFCAPPROVALRELATIONSHIP = 3869604511;
+var IFCARBITRARYCLOSEDPROFILEDEF = 3798115385;
+var IFCARBITRARYOPENPROFILEDEF = 1310608509;
+var IFCARBITRARYPROFILEDEFWITHVOIDS = 2705031697;
+var IFCASSET = 3460190687;
+var IFCASYMMETRICISHAPEPROFILEDEF = 3207858831;
+var IFCAUDIOVISUALAPPLIANCE = 277319702;
+var IFCAUDIOVISUALAPPLIANCETYPE = 1532957894;
+var IFCAXIS1PLACEMENT = 4261334040;
+var IFCAXIS2PLACEMENT2D = 3125803723;
+var IFCAXIS2PLACEMENT3D = 2740243338;
+var IFCBSPLINECURVE = 1967976161;
+var IFCBSPLINECURVEWITHKNOTS = 2461110595;
+var IFCBSPLINESURFACE = 2887950389;
+var IFCBSPLINESURFACEWITHKNOTS = 167062518;
+var IFCBEAM = 753842376;
+var IFCBEAMSTANDARDCASE = 2906023776;
+var IFCBEAMTYPE = 819618141;
+var IFCBEARING = 4196446775;
+var IFCBEARINGTYPE = 3649138523;
+var IFCBLOBTEXTURE = 616511568;
+var IFCBLOCK = 1334484129;
+var IFCBOILER = 32344328;
+var IFCBOILERTYPE = 231477066;
+var IFCBOOLEANCLIPPINGRESULT = 3649129432;
+var IFCBOOLEANRESULT = 2736907675;
+var IFCBOUNDARYCONDITION = 4037036970;
+var IFCBOUNDARYCURVE = 1136057603;
+var IFCBOUNDARYEDGECONDITION = 1560379544;
+var IFCBOUNDARYFACECONDITION = 3367102660;
+var IFCBOUNDARYNODECONDITION = 1387855156;
+var IFCBOUNDARYNODECONDITIONWARPING = 2069777674;
+var IFCBOUNDEDCURVE = 1260505505;
+var IFCBOUNDEDSURFACE = 4182860854;
+var IFCBOUNDINGBOX = 2581212453;
+var IFCBOXEDHALFSPACE = 2713105998;
+var IFCBRIDGE = 644574406;
+var IFCBRIDGEPART = 963979645;
+var IFCBUILDING = 4031249490;
+var IFCBUILDINGELEMENT = 3299480353;
+var IFCBUILDINGELEMENTPART = 2979338954;
+var IFCBUILDINGELEMENTPARTTYPE = 39481116;
+var IFCBUILDINGELEMENTPROXY = 1095909175;
+var IFCBUILDINGELEMENTPROXYTYPE = 1909888760;
+var IFCBUILDINGELEMENTTYPE = 1950629157;
+var IFCBUILDINGSTOREY = 3124254112;
+var IFCBUILDINGSYSTEM = 1177604601;
+var IFCBURNER = 2938176219;
+var IFCBURNERTYPE = 2188180465;
+var IFCCSHAPEPROFILEDEF = 2898889636;
+var IFCCABLECARRIERFITTING = 635142910;
+var IFCCABLECARRIERFITTINGTYPE = 395041908;
+var IFCCABLECARRIERSEGMENT = 3758799889;
+var IFCCABLECARRIERSEGMENTTYPE = 3293546465;
+var IFCCABLEFITTING = 1051757585;
+var IFCCABLEFITTINGTYPE = 2674252688;
+var IFCCABLESEGMENT = 4217484030;
+var IFCCABLESEGMENTTYPE = 1285652485;
+var IFCCAISSONFOUNDATION = 3999819293;
+var IFCCAISSONFOUNDATIONTYPE = 3203706013;
+var IFCCARTESIANPOINT = 1123145078;
+var IFCCARTESIANPOINTLIST = 574549367;
+var IFCCARTESIANPOINTLIST2D = 1675464909;
+var IFCCARTESIANPOINTLIST3D = 2059837836;
+var IFCCARTESIANTRANSFORMATIONOPERATOR = 59481748;
+var IFCCARTESIANTRANSFORMATIONOPERATOR2D = 3749851601;
+var IFCCARTESIANTRANSFORMATIONOPERATOR2DNONUNIFORM = 3486308946;
+var IFCCARTESIANTRANSFORMATIONOPERATOR3D = 3331915920;
+var IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM = 1416205885;
+var IFCCENTERLINEPROFILEDEF = 3150382593;
+var IFCCHILLER = 3902619387;
+var IFCCHILLERTYPE = 2951183804;
+var IFCCHIMNEY = 3296154744;
+var IFCCHIMNEYTYPE = 2197970202;
+var IFCCIRCLE = 2611217952;
+var IFCCIRCLEHOLLOWPROFILEDEF = 2937912522;
+var IFCCIRCLEPROFILEDEF = 1383045692;
+var IFCCIRCULARARCSEGMENT2D = 1062206242;
+var IFCCIVILELEMENT = 1677625105;
+var IFCCIVILELEMENTTYPE = 3893394355;
+var IFCCLASSIFICATION = 747523909;
+var IFCCLASSIFICATIONREFERENCE = 647927063;
+var IFCCLOSEDSHELL = 2205249479;
+var IFCCOIL = 639361253;
+var IFCCOILTYPE = 2301859152;
+var IFCCOLOURRGB = 776857604;
+var IFCCOLOURRGBLIST = 3285139300;
+var IFCCOLOURSPECIFICATION = 3264961684;
+var IFCCOLUMN = 843113511;
+var IFCCOLUMNSTANDARDCASE = 905975707;
+var IFCCOLUMNTYPE = 300633059;
+var IFCCOMMUNICATIONSAPPLIANCE = 3221913625;
+var IFCCOMMUNICATIONSAPPLIANCETYPE = 400855858;
+var IFCCOMPLEXPROPERTY = 2542286263;
+var IFCCOMPLEXPROPERTYTEMPLATE = 3875453745;
+var IFCCOMPOSITECURVE = 3732776249;
+var IFCCOMPOSITECURVEONSURFACE = 15328376;
+var IFCCOMPOSITECURVESEGMENT = 2485617015;
+var IFCCOMPOSITEPROFILEDEF = 1485152156;
+var IFCCOMPRESSOR = 3571504051;
+var IFCCOMPRESSORTYPE = 3850581409;
+var IFCCONDENSER = 2272882330;
+var IFCCONDENSERTYPE = 2816379211;
+var IFCCONIC = 2510884976;
+var IFCCONNECTEDFACESET = 370225590;
+var IFCCONNECTIONCURVEGEOMETRY = 1981873012;
+var IFCCONNECTIONGEOMETRY = 2859738748;
+var IFCCONNECTIONPOINTECCENTRICITY = 45288368;
+var IFCCONNECTIONPOINTGEOMETRY = 2614616156;
+var IFCCONNECTIONSURFACEGEOMETRY = 2732653382;
+var IFCCONNECTIONVOLUMEGEOMETRY = 775493141;
+var IFCCONSTRAINT = 1959218052;
+var IFCCONSTRUCTIONEQUIPMENTRESOURCE = 3898045240;
+var IFCCONSTRUCTIONEQUIPMENTRESOURCETYPE = 2185764099;
+var IFCCONSTRUCTIONMATERIALRESOURCE = 1060000209;
+var IFCCONSTRUCTIONMATERIALRESOURCETYPE = 4105962743;
+var IFCCONSTRUCTIONPRODUCTRESOURCE = 488727124;
+var IFCCONSTRUCTIONPRODUCTRESOURCETYPE = 1525564444;
+var IFCCONSTRUCTIONRESOURCE = 2559216714;
+var IFCCONSTRUCTIONRESOURCETYPE = 2574617495;
+var IFCCONTEXT = 3419103109;
+var IFCCONTEXTDEPENDENTUNIT = 3050246964;
+var IFCCONTROL = 3293443760;
+var IFCCONTROLLER = 25142252;
+var IFCCONTROLLERTYPE = 578613899;
+var IFCCONVERSIONBASEDUNIT = 2889183280;
+var IFCCONVERSIONBASEDUNITWITHOFFSET = 2713554722;
+var IFCCOOLEDBEAM = 4136498852;
+var IFCCOOLEDBEAMTYPE = 335055490;
+var IFCCOOLINGTOWER = 3640358203;
+var IFCCOOLINGTOWERTYPE = 2954562838;
+var IFCCOORDINATEOPERATION = 1785450214;
+var IFCCOORDINATEREFERENCESYSTEM = 1466758467;
+var IFCCOSTITEM = 3895139033;
+var IFCCOSTSCHEDULE = 1419761937;
+var IFCCOSTVALUE = 602808272;
+var IFCCOVERING = 1973544240;
+var IFCCOVERINGTYPE = 1916426348;
+var IFCCREWRESOURCE = 3295246426;
+var IFCCREWRESOURCETYPE = 1815067380;
+var IFCCSGPRIMITIVE3D = 2506170314;
+var IFCCSGSOLID = 2147822146;
+var IFCCURRENCYRELATIONSHIP = 539742890;
+var IFCCURTAINWALL = 3495092785;
+var IFCCURTAINWALLTYPE = 1457835157;
+var IFCCURVE = 2601014836;
+var IFCCURVEBOUNDEDPLANE = 2827736869;
+var IFCCURVEBOUNDEDSURFACE = 2629017746;
+var IFCCURVESEGMENT2D = 1186437898;
+var IFCCURVESTYLE = 3800577675;
+var IFCCURVESTYLEFONT = 1105321065;
+var IFCCURVESTYLEFONTANDSCALING = 2367409068;
+var IFCCURVESTYLEFONTPATTERN = 3510044353;
+var IFCCYLINDRICALSURFACE = 1213902940;
+var IFCDAMPER = 4074379575;
+var IFCDAMPERTYPE = 3961806047;
+var IFCDEEPFOUNDATION = 3426335179;
+var IFCDEEPFOUNDATIONTYPE = 1306400036;
+var IFCDERIVEDPROFILEDEF = 3632507154;
+var IFCDERIVEDUNIT = 1765591967;
+var IFCDERIVEDUNITELEMENT = 1045800335;
+var IFCDIMENSIONALEXPONENTS = 2949456006;
+var IFCDIRECTION = 32440307;
+var IFCDISCRETEACCESSORY = 1335981549;
+var IFCDISCRETEACCESSORYTYPE = 2635815018;
+var IFCDISTANCEEXPRESSION = 1945343521;
+var IFCDISTRIBUTIONCHAMBERELEMENT = 1052013943;
+var IFCDISTRIBUTIONCHAMBERELEMENTTYPE = 1599208980;
+var IFCDISTRIBUTIONCIRCUIT = 562808652;
+var IFCDISTRIBUTIONCONTROLELEMENT = 1062813311;
+var IFCDISTRIBUTIONCONTROLELEMENTTYPE = 2063403501;
+var IFCDISTRIBUTIONELEMENT = 1945004755;
+var IFCDISTRIBUTIONELEMENTTYPE = 3256556792;
+var IFCDISTRIBUTIONFLOWELEMENT = 3040386961;
+var IFCDISTRIBUTIONFLOWELEMENTTYPE = 3849074793;
+var IFCDISTRIBUTIONPORT = 3041715199;
+var IFCDISTRIBUTIONSYSTEM = 3205830791;
+var IFCDOCUMENTINFORMATION = 1154170062;
+var IFCDOCUMENTINFORMATIONRELATIONSHIP = 770865208;
+var IFCDOCUMENTREFERENCE = 3732053477;
+var IFCDOOR = 395920057;
+var IFCDOORLININGPROPERTIES = 2963535650;
+var IFCDOORPANELPROPERTIES = 1714330368;
+var IFCDOORSTANDARDCASE = 3242481149;
+var IFCDOORSTYLE = 526551008;
+var IFCDOORTYPE = 2323601079;
+var IFCDRAUGHTINGPREDEFINEDCOLOUR = 445594917;
+var IFCDRAUGHTINGPREDEFINEDCURVEFONT = 4006246654;
+var IFCDUCTFITTING = 342316401;
+var IFCDUCTFITTINGTYPE = 869906466;
+var IFCDUCTSEGMENT = 3518393246;
+var IFCDUCTSEGMENTTYPE = 3760055223;
+var IFCDUCTSILENCER = 1360408905;
+var IFCDUCTSILENCERTYPE = 2030761528;
+var IFCEDGE = 3900360178;
+var IFCEDGECURVE = 476780140;
+var IFCEDGELOOP = 1472233963;
+var IFCELECTRICAPPLIANCE = 1904799276;
+var IFCELECTRICAPPLIANCETYPE = 663422040;
+var IFCELECTRICDISTRIBUTIONBOARD = 862014818;
+var IFCELECTRICDISTRIBUTIONBOARDTYPE = 2417008758;
+var IFCELECTRICFLOWSTORAGEDEVICE = 3310460725;
+var IFCELECTRICFLOWSTORAGEDEVICETYPE = 3277789161;
+var IFCELECTRICGENERATOR = 264262732;
+var IFCELECTRICGENERATORTYPE = 1534661035;
+var IFCELECTRICMOTOR = 402227799;
+var IFCELECTRICMOTORTYPE = 1217240411;
+var IFCELECTRICTIMECONTROL = 1003880860;
+var IFCELECTRICTIMECONTROLTYPE = 712377611;
+var IFCELEMENT = 1758889154;
+var IFCELEMENTASSEMBLY = 4123344466;
+var IFCELEMENTASSEMBLYTYPE = 2397081782;
+var IFCELEMENTCOMPONENT = 1623761950;
+var IFCELEMENTCOMPONENTTYPE = 2590856083;
+var IFCELEMENTQUANTITY = 1883228015;
+var IFCELEMENTTYPE = 339256511;
+var IFCELEMENTARYSURFACE = 2777663545;
+var IFCELLIPSE = 1704287377;
+var IFCELLIPSEPROFILEDEF = 2835456948;
+var IFCENERGYCONVERSIONDEVICE = 1658829314;
+var IFCENERGYCONVERSIONDEVICETYPE = 2107101300;
+var IFCENGINE = 2814081492;
+var IFCENGINETYPE = 132023988;
+var IFCEVAPORATIVECOOLER = 3747195512;
+var IFCEVAPORATIVECOOLERTYPE = 3174744832;
+var IFCEVAPORATOR = 484807127;
+var IFCEVAPORATORTYPE = 3390157468;
+var IFCEVENT = 4148101412;
+var IFCEVENTTIME = 211053100;
+var IFCEVENTTYPE = 4024345920;
+var IFCEXTENDEDPROPERTIES = 297599258;
+var IFCEXTERNALINFORMATION = 4294318154;
+var IFCEXTERNALREFERENCE = 3200245327;
+var IFCEXTERNALREFERENCERELATIONSHIP = 1437805879;
+var IFCEXTERNALSPATIALELEMENT = 1209101575;
+var IFCEXTERNALSPATIALSTRUCTUREELEMENT = 2853485674;
+var IFCEXTERNALLYDEFINEDHATCHSTYLE = 2242383968;
+var IFCEXTERNALLYDEFINEDSURFACESTYLE = 1040185647;
+var IFCEXTERNALLYDEFINEDTEXTFONT = 3548104201;
+var IFCEXTRUDEDAREASOLID = 477187591;
+var IFCEXTRUDEDAREASOLIDTAPERED = 2804161546;
+var IFCFACE = 2556980723;
+var IFCFACEBASEDSURFACEMODEL = 2047409740;
+var IFCFACEBOUND = 1809719519;
+var IFCFACEOUTERBOUND = 803316827;
+var IFCFACESURFACE = 3008276851;
+var IFCFACETEDBREP = 807026263;
+var IFCFACETEDBREPWITHVOIDS = 3737207727;
+var IFCFACILITY = 24185140;
+var IFCFACILITYPART = 1310830890;
+var IFCFAILURECONNECTIONCONDITION = 4219587988;
+var IFCFAN = 3415622556;
+var IFCFANTYPE = 346874300;
+var IFCFASTENER = 647756555;
+var IFCFASTENERTYPE = 2489546625;
+var IFCFEATUREELEMENT = 2827207264;
+var IFCFEATUREELEMENTADDITION = 2143335405;
+var IFCFEATUREELEMENTSUBTRACTION = 1287392070;
+var IFCFILLAREASTYLE = 738692330;
+var IFCFILLAREASTYLEHATCHING = 374418227;
+var IFCFILLAREASTYLETILES = 315944413;
+var IFCFILTER = 819412036;
+var IFCFILTERTYPE = 1810631287;
+var IFCFIRESUPPRESSIONTERMINAL = 1426591983;
+var IFCFIRESUPPRESSIONTERMINALTYPE = 4222183408;
+var IFCFIXEDREFERENCESWEPTAREASOLID = 2652556860;
+var IFCFLOWCONTROLLER = 2058353004;
+var IFCFLOWCONTROLLERTYPE = 3907093117;
+var IFCFLOWFITTING = 4278956645;
+var IFCFLOWFITTINGTYPE = 3198132628;
+var IFCFLOWINSTRUMENT = 182646315;
+var IFCFLOWINSTRUMENTTYPE = 4037862832;
+var IFCFLOWMETER = 2188021234;
+var IFCFLOWMETERTYPE = 3815607619;
+var IFCFLOWMOVINGDEVICE = 3132237377;
+var IFCFLOWMOVINGDEVICETYPE = 1482959167;
+var IFCFLOWSEGMENT = 987401354;
+var IFCFLOWSEGMENTTYPE = 1834744321;
+var IFCFLOWSTORAGEDEVICE = 707683696;
+var IFCFLOWSTORAGEDEVICETYPE = 1339347760;
+var IFCFLOWTERMINAL = 2223149337;
+var IFCFLOWTERMINALTYPE = 2297155007;
+var IFCFLOWTREATMENTDEVICE = 3508470533;
+var IFCFLOWTREATMENTDEVICETYPE = 3009222698;
+var IFCFOOTING = 900683007;
+var IFCFOOTINGTYPE = 1893162501;
+var IFCFURNISHINGELEMENT = 263784265;
+var IFCFURNISHINGELEMENTTYPE = 4238390223;
+var IFCFURNITURE = 1509553395;
+var IFCFURNITURETYPE = 1268542332;
+var IFCGEOGRAPHICELEMENT = 3493046030;
+var IFCGEOGRAPHICELEMENTTYPE = 4095422895;
+var IFCGEOMETRICCURVESET = 987898635;
+var IFCGEOMETRICREPRESENTATIONCONTEXT = 3448662350;
+var IFCGEOMETRICREPRESENTATIONITEM = 2453401579;
+var IFCGEOMETRICREPRESENTATIONSUBCONTEXT = 4142052618;
+var IFCGEOMETRICSET = 3590301190;
+var IFCGRID = 3009204131;
+var IFCGRIDAXIS = 852622518;
+var IFCGRIDPLACEMENT = 178086475;
+var IFCGROUP = 2706460486;
+var IFCHALFSPACESOLID = 812098782;
+var IFCHEATEXCHANGER = 3319311131;
+var IFCHEATEXCHANGERTYPE = 1251058090;
+var IFCHUMIDIFIER = 2068733104;
+var IFCHUMIDIFIERTYPE = 1806887404;
+var IFCISHAPEPROFILEDEF = 1484403080;
+var IFCIMAGETEXTURE = 3905492369;
+var IFCINDEXEDCOLOURMAP = 3570813810;
+var IFCINDEXEDPOLYCURVE = 2571569899;
+var IFCINDEXEDPOLYGONALFACE = 178912537;
+var IFCINDEXEDPOLYGONALFACEWITHVOIDS = 2294589976;
+var IFCINDEXEDTEXTUREMAP = 1437953363;
+var IFCINDEXEDTRIANGLETEXTUREMAP = 2133299955;
+var IFCINTERCEPTOR = 4175244083;
+var IFCINTERCEPTORTYPE = 3946677679;
+var IFCINTERSECTIONCURVE = 3113134337;
+var IFCINVENTORY = 2391368822;
+var IFCIRREGULARTIMESERIES = 3741457305;
+var IFCIRREGULARTIMESERIESVALUE = 3020489413;
+var IFCJUNCTIONBOX = 2176052936;
+var IFCJUNCTIONBOXTYPE = 4288270099;
+var IFCLSHAPEPROFILEDEF = 572779678;
+var IFCLABORRESOURCE = 3827777499;
+var IFCLABORRESOURCETYPE = 428585644;
+var IFCLAGTIME = 1585845231;
+var IFCLAMP = 76236018;
+var IFCLAMPTYPE = 1051575348;
+var IFCLIBRARYINFORMATION = 2655187982;
+var IFCLIBRARYREFERENCE = 3452421091;
+var IFCLIGHTDISTRIBUTIONDATA = 4162380809;
+var IFCLIGHTFIXTURE = 629592764;
+var IFCLIGHTFIXTURETYPE = 1161773419;
+var IFCLIGHTINTENSITYDISTRIBUTION = 1566485204;
+var IFCLIGHTSOURCE = 1402838566;
+var IFCLIGHTSOURCEAMBIENT = 125510826;
+var IFCLIGHTSOURCEDIRECTIONAL = 2604431987;
+var IFCLIGHTSOURCEGONIOMETRIC = 4266656042;
+var IFCLIGHTSOURCEPOSITIONAL = 1520743889;
+var IFCLIGHTSOURCESPOT = 3422422726;
+var IFCLINE = 1281925730;
+var IFCLINESEGMENT2D = 3092502836;
+var IFCLINEARPLACEMENT = 388784114;
+var IFCLINEARPOSITIONINGELEMENT = 1154579445;
+var IFCLOCALPLACEMENT = 2624227202;
+var IFCLOOP = 1008929658;
+var IFCMANIFOLDSOLIDBREP = 1425443689;
+var IFCMAPCONVERSION = 3057273783;
+var IFCMAPPEDITEM = 2347385850;
+var IFCMATERIAL = 1838606355;
+var IFCMATERIALCLASSIFICATIONRELATIONSHIP = 1847130766;
+var IFCMATERIALCONSTITUENT = 3708119e3;
+var IFCMATERIALCONSTITUENTSET = 2852063980;
+var IFCMATERIALDEFINITION = 760658860;
+var IFCMATERIALDEFINITIONREPRESENTATION = 2022407955;
+var IFCMATERIALLAYER = 248100487;
+var IFCMATERIALLAYERSET = 3303938423;
+var IFCMATERIALLAYERSETUSAGE = 1303795690;
+var IFCMATERIALLAYERWITHOFFSETS = 1847252529;
+var IFCMATERIALLIST = 2199411900;
+var IFCMATERIALPROFILE = 2235152071;
+var IFCMATERIALPROFILESET = 164193824;
+var IFCMATERIALPROFILESETUSAGE = 3079605661;
+var IFCMATERIALPROFILESETUSAGETAPERING = 3404854881;
+var IFCMATERIALPROFILEWITHOFFSETS = 552965576;
+var IFCMATERIALPROPERTIES = 3265635763;
+var IFCMATERIALRELATIONSHIP = 853536259;
+var IFCMATERIALUSAGEDEFINITION = 1507914824;
+var IFCMEASUREWITHUNIT = 2597039031;
+var IFCMECHANICALFASTENER = 377706215;
+var IFCMECHANICALFASTENERTYPE = 2108223431;
+var IFCMEDICALDEVICE = 1437502449;
+var IFCMEDICALDEVICETYPE = 1114901282;
+var IFCMEMBER = 1073191201;
+var IFCMEMBERSTANDARDCASE = 1911478936;
+var IFCMEMBERTYPE = 3181161470;
+var IFCMETRIC = 3368373690;
+var IFCMIRROREDPROFILEDEF = 2998442950;
+var IFCMONETARYUNIT = 2706619895;
+var IFCMOTORCONNECTION = 2474470126;
+var IFCMOTORCONNECTIONTYPE = 977012517;
+var IFCNAMEDUNIT = 1918398963;
+var IFCOBJECT = 3888040117;
+var IFCOBJECTDEFINITION = 219451334;
+var IFCOBJECTPLACEMENT = 3701648758;
+var IFCOBJECTIVE = 2251480897;
+var IFCOCCUPANT = 4143007308;
+var IFCOFFSETCURVE = 590820931;
+var IFCOFFSETCURVE2D = 3388369263;
+var IFCOFFSETCURVE3D = 3505215534;
+var IFCOFFSETCURVEBYDISTANCES = 2485787929;
+var IFCOPENSHELL = 2665983363;
+var IFCOPENINGELEMENT = 3588315303;
+var IFCOPENINGSTANDARDCASE = 3079942009;
+var IFCORGANIZATION = 4251960020;
+var IFCORGANIZATIONRELATIONSHIP = 1411181986;
+var IFCORIENTATIONEXPRESSION = 643959842;
+var IFCORIENTEDEDGE = 1029017970;
+var IFCOUTERBOUNDARYCURVE = 144952367;
+var IFCOUTLET = 3694346114;
+var IFCOUTLETTYPE = 2837617999;
+var IFCOWNERHISTORY = 1207048766;
+var IFCPARAMETERIZEDPROFILEDEF = 2529465313;
+var IFCPATH = 2519244187;
+var IFCPCURVE = 1682466193;
+var IFCPERFORMANCEHISTORY = 2382730787;
+var IFCPERMEABLECOVERINGPROPERTIES = 3566463478;
+var IFCPERMIT = 3327091369;
+var IFCPERSON = 2077209135;
+var IFCPERSONANDORGANIZATION = 101040310;
+var IFCPHYSICALCOMPLEXQUANTITY = 3021840470;
+var IFCPHYSICALQUANTITY = 2483315170;
+var IFCPHYSICALSIMPLEQUANTITY = 2226359599;
+var IFCPILE = 1687234759;
+var IFCPILETYPE = 1158309216;
+var IFCPIPEFITTING = 310824031;
+var IFCPIPEFITTINGTYPE = 804291784;
+var IFCPIPESEGMENT = 3612865200;
+var IFCPIPESEGMENTTYPE = 4231323485;
+var IFCPIXELTEXTURE = 597895409;
+var IFCPLACEMENT = 2004835150;
+var IFCPLANARBOX = 603570806;
+var IFCPLANAREXTENT = 1663979128;
+var IFCPLANE = 220341763;
+var IFCPLATE = 3171933400;
+var IFCPLATESTANDARDCASE = 1156407060;
+var IFCPLATETYPE = 4017108033;
+var IFCPOINT = 2067069095;
+var IFCPOINTONCURVE = 4022376103;
+var IFCPOINTONSURFACE = 1423911732;
+var IFCPOLYLOOP = 2924175390;
+var IFCPOLYGONALBOUNDEDHALFSPACE = 2775532180;
+var IFCPOLYGONALFACESET = 2839578677;
+var IFCPOLYLINE = 3724593414;
+var IFCPORT = 3740093272;
+var IFCPOSITIONINGELEMENT = 1946335990;
+var IFCPOSTALADDRESS = 3355820592;
+var IFCPREDEFINEDCOLOUR = 759155922;
+var IFCPREDEFINEDCURVEFONT = 2559016684;
+var IFCPREDEFINEDITEM = 3727388367;
+var IFCPREDEFINEDPROPERTIES = 3778827333;
+var IFCPREDEFINEDPROPERTYSET = 3967405729;
+var IFCPREDEFINEDTEXTFONT = 1775413392;
+var IFCPRESENTATIONITEM = 677532197;
+var IFCPRESENTATIONLAYERASSIGNMENT = 2022622350;
+var IFCPRESENTATIONLAYERWITHSTYLE = 1304840413;
+var IFCPRESENTATIONSTYLE = 3119450353;
+var IFCPRESENTATIONSTYLEASSIGNMENT = 2417041796;
+var IFCPROCEDURE = 2744685151;
+var IFCPROCEDURETYPE = 569719735;
+var IFCPROCESS = 2945172077;
+var IFCPRODUCT = 4208778838;
+var IFCPRODUCTDEFINITIONSHAPE = 673634403;
+var IFCPRODUCTREPRESENTATION = 2095639259;
+var IFCPROFILEDEF = 3958567839;
+var IFCPROFILEPROPERTIES = 2802850158;
+var IFCPROJECT = 103090709;
+var IFCPROJECTLIBRARY = 653396225;
+var IFCPROJECTORDER = 2904328755;
+var IFCPROJECTEDCRS = 3843373140;
+var IFCPROJECTIONELEMENT = 3651124850;
+var IFCPROPERTY = 2598011224;
+var IFCPROPERTYABSTRACTION = 986844984;
+var IFCPROPERTYBOUNDEDVALUE = 871118103;
+var IFCPROPERTYDEFINITION = 1680319473;
+var IFCPROPERTYDEPENDENCYRELATIONSHIP = 148025276;
+var IFCPROPERTYENUMERATEDVALUE = 4166981789;
+var IFCPROPERTYENUMERATION = 3710013099;
+var IFCPROPERTYLISTVALUE = 2752243245;
+var IFCPROPERTYREFERENCEVALUE = 941946838;
+var IFCPROPERTYSET = 1451395588;
+var IFCPROPERTYSETDEFINITION = 3357820518;
+var IFCPROPERTYSETTEMPLATE = 492091185;
+var IFCPROPERTYSINGLEVALUE = 3650150729;
+var IFCPROPERTYTABLEVALUE = 110355661;
+var IFCPROPERTYTEMPLATE = 3521284610;
+var IFCPROPERTYTEMPLATEDEFINITION = 1482703590;
+var IFCPROTECTIVEDEVICE = 738039164;
+var IFCPROTECTIVEDEVICETRIPPINGUNIT = 2295281155;
+var IFCPROTECTIVEDEVICETRIPPINGUNITTYPE = 655969474;
+var IFCPROTECTIVEDEVICETYPE = 1842657554;
+var IFCPROXY = 3219374653;
+var IFCPUMP = 90941305;
+var IFCPUMPTYPE = 2250791053;
+var IFCQUANTITYAREA = 2044713172;
+var IFCQUANTITYCOUNT = 2093928680;
+var IFCQUANTITYLENGTH = 931644368;
+var IFCQUANTITYSET = 2090586900;
+var IFCQUANTITYTIME = 3252649465;
+var IFCQUANTITYVOLUME = 2405470396;
+var IFCQUANTITYWEIGHT = 825690147;
+var IFCRAILING = 2262370178;
+var IFCRAILINGTYPE = 2893384427;
+var IFCRAMP = 3024970846;
+var IFCRAMPFLIGHT = 3283111854;
+var IFCRAMPFLIGHTTYPE = 2324767716;
+var IFCRAMPTYPE = 1469900589;
+var IFCRATIONALBSPLINECURVEWITHKNOTS = 1232101972;
+var IFCRATIONALBSPLINESURFACEWITHKNOTS = 683857671;
+var IFCRECTANGLEHOLLOWPROFILEDEF = 2770003689;
+var IFCRECTANGLEPROFILEDEF = 3615266464;
+var IFCRECTANGULARPYRAMID = 2798486643;
+var IFCRECTANGULARTRIMMEDSURFACE = 3454111270;
+var IFCRECURRENCEPATTERN = 3915482550;
+var IFCREFERENCE = 2433181523;
+var IFCREFERENT = 4021432810;
+var IFCREGULARTIMESERIES = 3413951693;
+var IFCREINFORCEMENTBARPROPERTIES = 1580146022;
+var IFCREINFORCEMENTDEFINITIONPROPERTIES = 3765753017;
+var IFCREINFORCINGBAR = 979691226;
+var IFCREINFORCINGBARTYPE = 2572171363;
+var IFCREINFORCINGELEMENT = 3027567501;
+var IFCREINFORCINGELEMENTTYPE = 964333572;
+var IFCREINFORCINGMESH = 2320036040;
+var IFCREINFORCINGMESHTYPE = 2310774935;
+var IFCRELAGGREGATES = 160246688;
+var IFCRELASSIGNS = 3939117080;
+var IFCRELASSIGNSTOACTOR = 1683148259;
+var IFCRELASSIGNSTOCONTROL = 2495723537;
+var IFCRELASSIGNSTOGROUP = 1307041759;
+var IFCRELASSIGNSTOGROUPBYFACTOR = 1027710054;
+var IFCRELASSIGNSTOPROCESS = 4278684876;
+var IFCRELASSIGNSTOPRODUCT = 2857406711;
+var IFCRELASSIGNSTORESOURCE = 205026976;
+var IFCRELASSOCIATES = 1865459582;
+var IFCRELASSOCIATESAPPROVAL = 4095574036;
+var IFCRELASSOCIATESCLASSIFICATION = 919958153;
+var IFCRELASSOCIATESCONSTRAINT = 2728634034;
+var IFCRELASSOCIATESDOCUMENT = 982818633;
+var IFCRELASSOCIATESLIBRARY = 3840914261;
+var IFCRELASSOCIATESMATERIAL = 2655215786;
+var IFCRELCONNECTS = 826625072;
+var IFCRELCONNECTSELEMENTS = 1204542856;
+var IFCRELCONNECTSPATHELEMENTS = 3945020480;
+var IFCRELCONNECTSPORTTOELEMENT = 4201705270;
+var IFCRELCONNECTSPORTS = 3190031847;
+var IFCRELCONNECTSSTRUCTURALACTIVITY = 2127690289;
+var IFCRELCONNECTSSTRUCTURALMEMBER = 1638771189;
+var IFCRELCONNECTSWITHECCENTRICITY = 504942748;
+var IFCRELCONNECTSWITHREALIZINGELEMENTS = 3678494232;
+var IFCRELCONTAINEDINSPATIALSTRUCTURE = 3242617779;
+var IFCRELCOVERSBLDGELEMENTS = 886880790;
+var IFCRELCOVERSSPACES = 2802773753;
+var IFCRELDECLARES = 2565941209;
+var IFCRELDECOMPOSES = 2551354335;
+var IFCRELDEFINES = 693640335;
+var IFCRELDEFINESBYOBJECT = 1462361463;
+var IFCRELDEFINESBYPROPERTIES = 4186316022;
+var IFCRELDEFINESBYTEMPLATE = 307848117;
+var IFCRELDEFINESBYTYPE = 781010003;
+var IFCRELFILLSELEMENT = 3940055652;
+var IFCRELFLOWCONTROLELEMENTS = 279856033;
+var IFCRELINTERFERESELEMENTS = 427948657;
+var IFCRELNESTS = 3268803585;
+var IFCRELPOSITIONS = 1441486842;
+var IFCRELPROJECTSELEMENT = 750771296;
+var IFCRELREFERENCEDINSPATIALSTRUCTURE = 1245217292;
+var IFCRELSEQUENCE = 4122056220;
+var IFCRELSERVICESBUILDINGS = 366585022;
+var IFCRELSPACEBOUNDARY = 3451746338;
+var IFCRELSPACEBOUNDARY1STLEVEL = 3523091289;
+var IFCRELSPACEBOUNDARY2NDLEVEL = 1521410863;
+var IFCRELVOIDSELEMENT = 1401173127;
+var IFCRELATIONSHIP = 478536968;
+var IFCREPARAMETRISEDCOMPOSITECURVESEGMENT = 816062949;
+var IFCREPRESENTATION = 1076942058;
+var IFCREPRESENTATIONCONTEXT = 3377609919;
+var IFCREPRESENTATIONITEM = 3008791417;
+var IFCREPRESENTATIONMAP = 1660063152;
+var IFCRESOURCE = 2914609552;
+var IFCRESOURCEAPPROVALRELATIONSHIP = 2943643501;
+var IFCRESOURCECONSTRAINTRELATIONSHIP = 1608871552;
+var IFCRESOURCELEVELRELATIONSHIP = 2439245199;
+var IFCRESOURCETIME = 1042787934;
+var IFCREVOLVEDAREASOLID = 1856042241;
+var IFCREVOLVEDAREASOLIDTAPERED = 3243963512;
+var IFCRIGHTCIRCULARCONE = 4158566097;
+var IFCRIGHTCIRCULARCYLINDER = 3626867408;
+var IFCROOF = 2016517767;
+var IFCROOFTYPE = 2781568857;
+var IFCROOT = 2341007311;
+var IFCROUNDEDRECTANGLEPROFILEDEF = 2778083089;
+var IFCSIUNIT = 448429030;
+var IFCSANITARYTERMINAL = 3053780830;
+var IFCSANITARYTERMINALTYPE = 1768891740;
+var IFCSCHEDULINGTIME = 1054537805;
+var IFCSEAMCURVE = 2157484638;
+var IFCSECTIONPROPERTIES = 2042790032;
+var IFCSECTIONREINFORCEMENTPROPERTIES = 4165799628;
+var IFCSECTIONEDSOLID = 1862484736;
+var IFCSECTIONEDSOLIDHORIZONTAL = 1290935644;
+var IFCSECTIONEDSPINE = 1509187699;
+var IFCSENSOR = 4086658281;
+var IFCSENSORTYPE = 1783015770;
+var IFCSHADINGDEVICE = 1329646415;
+var IFCSHADINGDEVICETYPE = 4074543187;
+var IFCSHAPEASPECT = 867548509;
+var IFCSHAPEMODEL = 3982875396;
+var IFCSHAPEREPRESENTATION = 4240577450;
+var IFCSHELLBASEDSURFACEMODEL = 4124623270;
+var IFCSIMPLEPROPERTY = 3692461612;
+var IFCSIMPLEPROPERTYTEMPLATE = 3663146110;
+var IFCSITE = 4097777520;
+var IFCSLAB = 1529196076;
+var IFCSLABELEMENTEDCASE = 3127900445;
+var IFCSLABSTANDARDCASE = 3027962421;
+var IFCSLABTYPE = 2533589738;
+var IFCSLIPPAGECONNECTIONCONDITION = 2609359061;
+var IFCSOLARDEVICE = 3420628829;
+var IFCSOLARDEVICETYPE = 1072016465;
+var IFCSOLIDMODEL = 723233188;
+var IFCSPACE = 3856911033;
+var IFCSPACEHEATER = 1999602285;
+var IFCSPACEHEATERTYPE = 1305183839;
+var IFCSPACETYPE = 3812236995;
+var IFCSPATIALELEMENT = 1412071761;
+var IFCSPATIALELEMENTTYPE = 710998568;
+var IFCSPATIALSTRUCTUREELEMENT = 2706606064;
+var IFCSPATIALSTRUCTUREELEMENTTYPE = 3893378262;
+var IFCSPATIALZONE = 463610769;
+var IFCSPATIALZONETYPE = 2481509218;
+var IFCSPHERE = 451544542;
+var IFCSPHERICALSURFACE = 4015995234;
+var IFCSTACKTERMINAL = 1404847402;
+var IFCSTACKTERMINALTYPE = 3112655638;
+var IFCSTAIR = 331165859;
+var IFCSTAIRFLIGHT = 4252922144;
+var IFCSTAIRFLIGHTTYPE = 1039846685;
+var IFCSTAIRTYPE = 338393293;
+var IFCSTRUCTURALACTION = 682877961;
+var IFCSTRUCTURALACTIVITY = 3544373492;
+var IFCSTRUCTURALANALYSISMODEL = 2515109513;
+var IFCSTRUCTURALCONNECTION = 1179482911;
+var IFCSTRUCTURALCONNECTIONCONDITION = 2273995522;
+var IFCSTRUCTURALCURVEACTION = 1004757350;
+var IFCSTRUCTURALCURVECONNECTION = 4243806635;
+var IFCSTRUCTURALCURVEMEMBER = 214636428;
+var IFCSTRUCTURALCURVEMEMBERVARYING = 2445595289;
+var IFCSTRUCTURALCURVEREACTION = 2757150158;
+var IFCSTRUCTURALITEM = 3136571912;
+var IFCSTRUCTURALLINEARACTION = 1807405624;
+var IFCSTRUCTURALLOAD = 2162789131;
+var IFCSTRUCTURALLOADCASE = 385403989;
+var IFCSTRUCTURALLOADCONFIGURATION = 3478079324;
+var IFCSTRUCTURALLOADGROUP = 1252848954;
+var IFCSTRUCTURALLOADLINEARFORCE = 1595516126;
+var IFCSTRUCTURALLOADORRESULT = 609421318;
+var IFCSTRUCTURALLOADPLANARFORCE = 2668620305;
+var IFCSTRUCTURALLOADSINGLEDISPLACEMENT = 2473145415;
+var IFCSTRUCTURALLOADSINGLEDISPLACEMENTDISTORTION = 1973038258;
+var IFCSTRUCTURALLOADSINGLEFORCE = 1597423693;
+var IFCSTRUCTURALLOADSINGLEFORCEWARPING = 1190533807;
+var IFCSTRUCTURALLOADSTATIC = 2525727697;
+var IFCSTRUCTURALLOADTEMPERATURE = 3408363356;
+var IFCSTRUCTURALMEMBER = 530289379;
+var IFCSTRUCTURALPLANARACTION = 1621171031;
+var IFCSTRUCTURALPOINTACTION = 2082059205;
+var IFCSTRUCTURALPOINTCONNECTION = 734778138;
+var IFCSTRUCTURALPOINTREACTION = 1235345126;
+var IFCSTRUCTURALREACTION = 3689010777;
+var IFCSTRUCTURALRESULTGROUP = 2986769608;
+var IFCSTRUCTURALSURFACEACTION = 3657597509;
+var IFCSTRUCTURALSURFACECONNECTION = 1975003073;
+var IFCSTRUCTURALSURFACEMEMBER = 3979015343;
+var IFCSTRUCTURALSURFACEMEMBERVARYING = 2218152070;
+var IFCSTRUCTURALSURFACEREACTION = 603775116;
+var IFCSTYLEMODEL = 2830218821;
+var IFCSTYLEDITEM = 3958052878;
+var IFCSTYLEDREPRESENTATION = 3049322572;
+var IFCSUBCONTRACTRESOURCE = 148013059;
+var IFCSUBCONTRACTRESOURCETYPE = 4095615324;
+var IFCSUBEDGE = 2233826070;
+var IFCSURFACE = 2513912981;
+var IFCSURFACECURVE = 699246055;
+var IFCSURFACECURVESWEPTAREASOLID = 2028607225;
+var IFCSURFACEFEATURE = 3101698114;
+var IFCSURFACEOFLINEAREXTRUSION = 2809605785;
+var IFCSURFACEOFREVOLUTION = 4124788165;
+var IFCSURFACEREINFORCEMENTAREA = 2934153892;
+var IFCSURFACESTYLE = 1300840506;
+var IFCSURFACESTYLELIGHTING = 3303107099;
+var IFCSURFACESTYLEREFRACTION = 1607154358;
+var IFCSURFACESTYLERENDERING = 1878645084;
+var IFCSURFACESTYLESHADING = 846575682;
+var IFCSURFACESTYLEWITHTEXTURES = 1351298697;
+var IFCSURFACETEXTURE = 626085974;
+var IFCSWEPTAREASOLID = 2247615214;
+var IFCSWEPTDISKSOLID = 1260650574;
+var IFCSWEPTDISKSOLIDPOLYGONAL = 1096409881;
+var IFCSWEPTSURFACE = 230924584;
+var IFCSWITCHINGDEVICE = 1162798199;
+var IFCSWITCHINGDEVICETYPE = 2315554128;
+var IFCSYSTEM = 2254336722;
+var IFCSYSTEMFURNITUREELEMENT = 413509423;
+var IFCSYSTEMFURNITUREELEMENTTYPE = 1580310250;
+var IFCTSHAPEPROFILEDEF = 3071757647;
+var IFCTABLE = 985171141;
+var IFCTABLECOLUMN = 2043862942;
+var IFCTABLEROW = 531007025;
+var IFCTANK = 812556717;
+var IFCTANKTYPE = 5716631;
+var IFCTASK = 3473067441;
+var IFCTASKTIME = 1549132990;
+var IFCTASKTIMERECURRING = 2771591690;
+var IFCTASKTYPE = 3206491090;
+var IFCTELECOMADDRESS = 912023232;
+var IFCTENDON = 3824725483;
+var IFCTENDONANCHOR = 2347447852;
+var IFCTENDONANCHORTYPE = 3081323446;
+var IFCTENDONCONDUIT = 3663046924;
+var IFCTENDONCONDUITTYPE = 2281632017;
+var IFCTENDONTYPE = 2415094496;
+var IFCTESSELLATEDFACESET = 2387106220;
+var IFCTESSELLATEDITEM = 901063453;
+var IFCTEXTLITERAL = 4282788508;
+var IFCTEXTLITERALWITHEXTENT = 3124975700;
+var IFCTEXTSTYLE = 1447204868;
+var IFCTEXTSTYLEFONTMODEL = 1983826977;
+var IFCTEXTSTYLEFORDEFINEDFONT = 2636378356;
+var IFCTEXTSTYLETEXTMODEL = 1640371178;
+var IFCTEXTURECOORDINATE = 280115917;
+var IFCTEXTURECOORDINATEGENERATOR = 1742049831;
+var IFCTEXTUREMAP = 2552916305;
+var IFCTEXTUREVERTEX = 1210645708;
+var IFCTEXTUREVERTEXLIST = 3611470254;
+var IFCTIMEPERIOD = 1199560280;
+var IFCTIMESERIES = 3101149627;
+var IFCTIMESERIESVALUE = 581633288;
+var IFCTOPOLOGICALREPRESENTATIONITEM = 1377556343;
+var IFCTOPOLOGYREPRESENTATION = 1735638870;
+var IFCTOROIDALSURFACE = 1935646853;
+var IFCTRANSFORMER = 3825984169;
+var IFCTRANSFORMERTYPE = 1692211062;
+var IFCTRANSITIONCURVESEGMENT2D = 2595432518;
+var IFCTRANSPORTELEMENT = 1620046519;
+var IFCTRANSPORTELEMENTTYPE = 2097647324;
+var IFCTRAPEZIUMPROFILEDEF = 2715220739;
+var IFCTRIANGULATEDFACESET = 2916149573;
+var IFCTRIANGULATEDIRREGULARNETWORK = 1229763772;
+var IFCTRIMMEDCURVE = 3593883385;
+var IFCTUBEBUNDLE = 3026737570;
+var IFCTUBEBUNDLETYPE = 1600972822;
+var IFCTYPEOBJECT = 1628702193;
+var IFCTYPEPROCESS = 3736923433;
+var IFCTYPEPRODUCT = 2347495698;
+var IFCTYPERESOURCE = 3698973494;
+var IFCUSHAPEPROFILEDEF = 427810014;
+var IFCUNITASSIGNMENT = 180925521;
+var IFCUNITARYCONTROLELEMENT = 630975310;
+var IFCUNITARYCONTROLELEMENTTYPE = 3179687236;
+var IFCUNITARYEQUIPMENT = 4292641817;
+var IFCUNITARYEQUIPMENTTYPE = 1911125066;
+var IFCVALVE = 4207607924;
+var IFCVALVETYPE = 728799441;
+var IFCVECTOR = 1417489154;
+var IFCVERTEX = 2799835756;
+var IFCVERTEXLOOP = 2759199220;
+var IFCVERTEXPOINT = 1907098498;
+var IFCVIBRATIONDAMPER = 1530820697;
+var IFCVIBRATIONDAMPERTYPE = 3956297820;
+var IFCVIBRATIONISOLATOR = 2391383451;
+var IFCVIBRATIONISOLATORTYPE = 3313531582;
+var IFCVIRTUALELEMENT = 2769231204;
+var IFCVIRTUALGRIDINTERSECTION = 891718957;
+var IFCVOIDINGFEATURE = 926996030;
+var IFCWALL = 2391406946;
+var IFCWALLELEMENTEDCASE = 4156078855;
+var IFCWALLSTANDARDCASE = 3512223829;
+var IFCWALLTYPE = 1898987631;
+var IFCWASTETERMINAL = 4237592921;
+var IFCWASTETERMINALTYPE = 1133259667;
+var IFCWINDOW = 3304561284;
+var IFCWINDOWLININGPROPERTIES = 336235671;
+var IFCWINDOWPANELPROPERTIES = 512836454;
+var IFCWINDOWSTANDARDCASE = 486154966;
+var IFCWINDOWSTYLE = 1299126871;
+var IFCWINDOWTYPE = 4009809668;
+var IFCWORKCALENDAR = 4088093105;
+var IFCWORKCONTROL = 1028945134;
+var IFCWORKPLAN = 4218914973;
+var IFCWORKSCHEDULE = 3342526732;
+var IFCWORKTIME = 1236880293;
+var IFCZSHAPEPROFILEDEF = 2543172580;
+var IFCZONE = 1033361043;
+var IfcElements = [
+  4288193352,
+  1634111441,
+  177149247,
+  2056796094,
+  3087945054,
+  277319702,
+  753842376,
+  2906023776,
+  32344328,
+  2979338954,
+  1095909175,
+  2938176219,
+  635142910,
+  3758799889,
+  1051757585,
+  4217484030,
+  3902619387,
+  3296154744,
+  1677625105,
+  639361253,
+  843113511,
+  905975707,
+  3221913625,
+  3571504051,
+  2272882330,
+  25142252,
+  4136498852,
+  3640358203,
+  1973544240,
+  3495092785,
+  4074379575,
+  1335981549,
+  1052013943,
+  1062813311,
+  1945004755,
+  3040386961,
+  395920057,
+  3242481149,
+  342316401,
+  3518393246,
+  1360408905,
+  1904799276,
+  862014818,
+  3310460725,
+  264262732,
+  402227799,
+  1003880860,
+  4123344466,
+  1658829314,
+  2814081492,
+  3747195512,
+  484807127,
+  3415622556,
+  647756555,
+  819412036,
+  1426591983,
+  2058353004,
+  4278956645,
+  182646315,
+  2188021234,
+  3132237377,
+  987401354,
+  707683696,
+  2223149337,
+  3508470533,
+  900683007,
+  263784265,
+  1509553395,
+  3493046030,
+  3319311131,
+  2068733104,
+  4175244083,
+  2176052936,
+  76236018,
+  629592764,
+  377706215,
+  1437502449,
+  1073191201,
+  1911478936,
+  2474470126,
+  3588315303,
+  3079942009,
+  3694346114,
+  1687234759,
+  310824031,
+  3612865200,
+  3171933400,
+  1156407060,
+  3651124850,
+  738039164,
+  2295281155,
+  90941305,
+  2262370178,
+  3024970846,
+  3283111854,
+  979691226,
+  2320036040,
+  2016517767,
+  3053780830,
+  4086658281,
+  1329646415,
+  1529196076,
+  3127900445,
+  3027962421,
+  3420628829,
+  1999602285,
+  1404847402,
+  331165859,
+  4252922144,
+  3101698114,
+  1162798199,
+  413509423,
+  812556717,
+  3824725483,
+  2347447852,
+  3825984169,
+  1620046519,
+  3026737570,
+  630975310,
+  4292641817,
+  4207607924,
+  2391383451,
+  2769231204,
+  926996030,
+  2391406946,
+  4156078855,
+  3512223829,
+  4237592921,
+  3304561284,
+  486154966
+];
+
+// dist/ifc2x4_helper.ts
+var FromRawLineData = {};
+FromRawLineData[IFCACTIONREQUEST] = (d) => {
+  return IfcActionRequest.FromTape(d.ID, d.type, d.arguments);
 };
-export {
-  IfcAPI,
-  ms
+FromRawLineData[IFCACTOR] = (d) => {
+  return IfcActor.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCACTORROLE] = (d) => {
+  return IfcActorRole.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCACTUATOR] = (d) => {
+  return IfcActuator.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCACTUATORTYPE] = (d) => {
+  return IfcActuatorType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCADDRESS] = (d) => {
+  return IfcAddress.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCADVANCEDBREP] = (d) => {
+  return IfcAdvancedBrep.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCADVANCEDBREPWITHVOIDS] = (d) => {
+  return IfcAdvancedBrepWithVoids.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCADVANCEDFACE] = (d) => {
+  return IfcAdvancedFace.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAIRTERMINAL] = (d) => {
+  return IfcAirTerminal.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAIRTERMINALBOX] = (d) => {
+  return IfcAirTerminalBox.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAIRTERMINALBOXTYPE] = (d) => {
+  return IfcAirTerminalBoxType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAIRTERMINALTYPE] = (d) => {
+  return IfcAirTerminalType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAIRTOAIRHEATRECOVERY] = (d) => {
+  return IfcAirToAirHeatRecovery.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAIRTOAIRHEATRECOVERYTYPE] = (d) => {
+  return IfcAirToAirHeatRecoveryType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCALARM] = (d) => {
+  return IfcAlarm.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCALARMTYPE] = (d) => {
+  return IfcAlarmType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCALIGNMENT] = (d) => {
+  return IfcAlignment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCALIGNMENT2DHORIZONTAL] = (d) => {
+  return IfcAlignment2DHorizontal.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCALIGNMENT2DHORIZONTALSEGMENT] = (d) => {
+  return IfcAlignment2DHorizontalSegment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCALIGNMENT2DSEGMENT] = (d) => {
+  return IfcAlignment2DSegment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCALIGNMENT2DVERSEGCIRCULARARC] = (d) => {
+  return IfcAlignment2DVerSegCircularArc.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCALIGNMENT2DVERSEGLINE] = (d) => {
+  return IfcAlignment2DVerSegLine.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCALIGNMENT2DVERSEGPARABOLICARC] = (d) => {
+  return IfcAlignment2DVerSegParabolicArc.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCALIGNMENT2DVERTICAL] = (d) => {
+  return IfcAlignment2DVertical.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCALIGNMENT2DVERTICALSEGMENT] = (d) => {
+  return IfcAlignment2DVerticalSegment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCALIGNMENTCURVE] = (d) => {
+  return IfcAlignmentCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCANNOTATION] = (d) => {
+  return IfcAnnotation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCANNOTATIONFILLAREA] = (d) => {
+  return IfcAnnotationFillArea.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAPPLICATION] = (d) => {
+  return IfcApplication.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAPPLIEDVALUE] = (d) => {
+  return IfcAppliedValue.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAPPROVAL] = (d) => {
+  return IfcApproval.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAPPROVALRELATIONSHIP] = (d) => {
+  return IfcApprovalRelationship.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCARBITRARYCLOSEDPROFILEDEF] = (d) => {
+  return IfcArbitraryClosedProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCARBITRARYOPENPROFILEDEF] = (d) => {
+  return IfcArbitraryOpenProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCARBITRARYPROFILEDEFWITHVOIDS] = (d) => {
+  return IfcArbitraryProfileDefWithVoids.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCASSET] = (d) => {
+  return IfcAsset.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCASYMMETRICISHAPEPROFILEDEF] = (d) => {
+  return IfcAsymmetricIShapeProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAUDIOVISUALAPPLIANCE] = (d) => {
+  return IfcAudioVisualAppliance.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAUDIOVISUALAPPLIANCETYPE] = (d) => {
+  return IfcAudioVisualApplianceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAXIS1PLACEMENT] = (d) => {
+  return IfcAxis1Placement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAXIS2PLACEMENT2D] = (d) => {
+  return IfcAxis2Placement2D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCAXIS2PLACEMENT3D] = (d) => {
+  return IfcAxis2Placement3D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBSPLINECURVE] = (d) => {
+  return IfcBSplineCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBSPLINECURVEWITHKNOTS] = (d) => {
+  return IfcBSplineCurveWithKnots.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBSPLINESURFACE] = (d) => {
+  return IfcBSplineSurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBSPLINESURFACEWITHKNOTS] = (d) => {
+  return IfcBSplineSurfaceWithKnots.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBEAM] = (d) => {
+  return IfcBeam.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBEAMSTANDARDCASE] = (d) => {
+  return IfcBeamStandardCase.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBEAMTYPE] = (d) => {
+  return IfcBeamType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBEARING] = (d) => {
+  return IfcBearing.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBEARINGTYPE] = (d) => {
+  return IfcBearingType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBLOBTEXTURE] = (d) => {
+  return IfcBlobTexture.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBLOCK] = (d) => {
+  return IfcBlock.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOILER] = (d) => {
+  return IfcBoiler.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOILERTYPE] = (d) => {
+  return IfcBoilerType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOOLEANCLIPPINGRESULT] = (d) => {
+  return IfcBooleanClippingResult.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOOLEANRESULT] = (d) => {
+  return IfcBooleanResult.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOUNDARYCONDITION] = (d) => {
+  return IfcBoundaryCondition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOUNDARYCURVE] = (d) => {
+  return IfcBoundaryCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOUNDARYEDGECONDITION] = (d) => {
+  return IfcBoundaryEdgeCondition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOUNDARYFACECONDITION] = (d) => {
+  return IfcBoundaryFaceCondition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOUNDARYNODECONDITION] = (d) => {
+  return IfcBoundaryNodeCondition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOUNDARYNODECONDITIONWARPING] = (d) => {
+  return IfcBoundaryNodeConditionWarping.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOUNDEDCURVE] = (d) => {
+  return IfcBoundedCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOUNDEDSURFACE] = (d) => {
+  return IfcBoundedSurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOUNDINGBOX] = (d) => {
+  return IfcBoundingBox.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBOXEDHALFSPACE] = (d) => {
+  return IfcBoxedHalfSpace.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBRIDGE] = (d) => {
+  return IfcBridge.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBRIDGEPART] = (d) => {
+  return IfcBridgePart.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBUILDING] = (d) => {
+  return IfcBuilding.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBUILDINGELEMENT] = (d) => {
+  return IfcBuildingElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBUILDINGELEMENTPART] = (d) => {
+  return IfcBuildingElementPart.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBUILDINGELEMENTPARTTYPE] = (d) => {
+  return IfcBuildingElementPartType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBUILDINGELEMENTPROXY] = (d) => {
+  return IfcBuildingElementProxy.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBUILDINGELEMENTPROXYTYPE] = (d) => {
+  return IfcBuildingElementProxyType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBUILDINGELEMENTTYPE] = (d) => {
+  return IfcBuildingElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBUILDINGSTOREY] = (d) => {
+  return IfcBuildingStorey.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBUILDINGSYSTEM] = (d) => {
+  return IfcBuildingSystem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBURNER] = (d) => {
+  return IfcBurner.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCBURNERTYPE] = (d) => {
+  return IfcBurnerType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCSHAPEPROFILEDEF] = (d) => {
+  return IfcCShapeProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCABLECARRIERFITTING] = (d) => {
+  return IfcCableCarrierFitting.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCABLECARRIERFITTINGTYPE] = (d) => {
+  return IfcCableCarrierFittingType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCABLECARRIERSEGMENT] = (d) => {
+  return IfcCableCarrierSegment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCABLECARRIERSEGMENTTYPE] = (d) => {
+  return IfcCableCarrierSegmentType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCABLEFITTING] = (d) => {
+  return IfcCableFitting.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCABLEFITTINGTYPE] = (d) => {
+  return IfcCableFittingType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCABLESEGMENT] = (d) => {
+  return IfcCableSegment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCABLESEGMENTTYPE] = (d) => {
+  return IfcCableSegmentType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCAISSONFOUNDATION] = (d) => {
+  return IfcCaissonFoundation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCAISSONFOUNDATIONTYPE] = (d) => {
+  return IfcCaissonFoundationType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCARTESIANPOINT] = (d) => {
+  return IfcCartesianPoint.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCARTESIANPOINTLIST] = (d) => {
+  return IfcCartesianPointList.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCARTESIANPOINTLIST2D] = (d) => {
+  return IfcCartesianPointList2D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCARTESIANPOINTLIST3D] = (d) => {
+  return IfcCartesianPointList3D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCARTESIANTRANSFORMATIONOPERATOR] = (d) => {
+  return IfcCartesianTransformationOperator.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCARTESIANTRANSFORMATIONOPERATOR2D] = (d) => {
+  return IfcCartesianTransformationOperator2D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCARTESIANTRANSFORMATIONOPERATOR2DNONUNIFORM] = (d) => {
+  return IfcCartesianTransformationOperator2DnonUniform.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCARTESIANTRANSFORMATIONOPERATOR3D] = (d) => {
+  return IfcCartesianTransformationOperator3D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM] = (d) => {
+  return IfcCartesianTransformationOperator3DnonUniform.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCENTERLINEPROFILEDEF] = (d) => {
+  return IfcCenterLineProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCHILLER] = (d) => {
+  return IfcChiller.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCHILLERTYPE] = (d) => {
+  return IfcChillerType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCHIMNEY] = (d) => {
+  return IfcChimney.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCHIMNEYTYPE] = (d) => {
+  return IfcChimneyType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCIRCLE] = (d) => {
+  return IfcCircle.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCIRCLEHOLLOWPROFILEDEF] = (d) => {
+  return IfcCircleHollowProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCIRCLEPROFILEDEF] = (d) => {
+  return IfcCircleProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCIRCULARARCSEGMENT2D] = (d) => {
+  return IfcCircularArcSegment2D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCIVILELEMENT] = (d) => {
+  return IfcCivilElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCIVILELEMENTTYPE] = (d) => {
+  return IfcCivilElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCLASSIFICATION] = (d) => {
+  return IfcClassification.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCLASSIFICATIONREFERENCE] = (d) => {
+  return IfcClassificationReference.FromTape(d.ID, d.type, d.arguments);
 };
+FromRawLineData[IFCCLOSEDSHELL] = (d) => {
+  return IfcClosedShell.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOIL] = (d) => {
+  return IfcCoil.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOILTYPE] = (d) => {
+  return IfcCoilType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOLOURRGB] = (d) => {
+  return IfcColourRgb.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOLOURRGBLIST] = (d) => {
+  return IfcColourRgbList.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOLOURSPECIFICATION] = (d) => {
+  return IfcColourSpecification.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOLUMN] = (d) => {
+  return IfcColumn.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOLUMNSTANDARDCASE] = (d) => {
+  return IfcColumnStandardCase.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOLUMNTYPE] = (d) => {
+  return IfcColumnType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOMMUNICATIONSAPPLIANCE] = (d) => {
+  return IfcCommunicationsAppliance.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOMMUNICATIONSAPPLIANCETYPE] = (d) => {
+  return IfcCommunicationsApplianceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOMPLEXPROPERTY] = (d) => {
+  return IfcComplexProperty.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOMPLEXPROPERTYTEMPLATE] = (d) => {
+  return IfcComplexPropertyTemplate.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOMPOSITECURVE] = (d) => {
+  return IfcCompositeCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOMPOSITECURVEONSURFACE] = (d) => {
+  return IfcCompositeCurveOnSurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOMPOSITECURVESEGMENT] = (d) => {
+  return IfcCompositeCurveSegment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOMPOSITEPROFILEDEF] = (d) => {
+  return IfcCompositeProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOMPRESSOR] = (d) => {
+  return IfcCompressor.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOMPRESSORTYPE] = (d) => {
+  return IfcCompressorType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONDENSER] = (d) => {
+  return IfcCondenser.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONDENSERTYPE] = (d) => {
+  return IfcCondenserType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONIC] = (d) => {
+  return IfcConic.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONNECTEDFACESET] = (d) => {
+  return IfcConnectedFaceSet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONNECTIONCURVEGEOMETRY] = (d) => {
+  return IfcConnectionCurveGeometry.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONNECTIONGEOMETRY] = (d) => {
+  return IfcConnectionGeometry.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONNECTIONPOINTECCENTRICITY] = (d) => {
+  return IfcConnectionPointEccentricity.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONNECTIONPOINTGEOMETRY] = (d) => {
+  return IfcConnectionPointGeometry.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONNECTIONSURFACEGEOMETRY] = (d) => {
+  return IfcConnectionSurfaceGeometry.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONNECTIONVOLUMEGEOMETRY] = (d) => {
+  return IfcConnectionVolumeGeometry.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONSTRAINT] = (d) => {
+  return IfcConstraint.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONSTRUCTIONEQUIPMENTRESOURCE] = (d) => {
+  return IfcConstructionEquipmentResource.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONSTRUCTIONEQUIPMENTRESOURCETYPE] = (d) => {
+  return IfcConstructionEquipmentResourceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONSTRUCTIONMATERIALRESOURCE] = (d) => {
+  return IfcConstructionMaterialResource.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONSTRUCTIONMATERIALRESOURCETYPE] = (d) => {
+  return IfcConstructionMaterialResourceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONSTRUCTIONPRODUCTRESOURCE] = (d) => {
+  return IfcConstructionProductResource.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONSTRUCTIONPRODUCTRESOURCETYPE] = (d) => {
+  return IfcConstructionProductResourceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONSTRUCTIONRESOURCE] = (d) => {
+  return IfcConstructionResource.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONSTRUCTIONRESOURCETYPE] = (d) => {
+  return IfcConstructionResourceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONTEXT] = (d) => {
+  return IfcContext.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONTEXTDEPENDENTUNIT] = (d) => {
+  return IfcContextDependentUnit.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONTROL] = (d) => {
+  return IfcControl.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONTROLLER] = (d) => {
+  return IfcController.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONTROLLERTYPE] = (d) => {
+  return IfcControllerType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONVERSIONBASEDUNIT] = (d) => {
+  return IfcConversionBasedUnit.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCONVERSIONBASEDUNITWITHOFFSET] = (d) => {
+  return IfcConversionBasedUnitWithOffset.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOOLEDBEAM] = (d) => {
+  return IfcCooledBeam.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOOLEDBEAMTYPE] = (d) => {
+  return IfcCooledBeamType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOOLINGTOWER] = (d) => {
+  return IfcCoolingTower.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOOLINGTOWERTYPE] = (d) => {
+  return IfcCoolingTowerType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOORDINATEOPERATION] = (d) => {
+  return IfcCoordinateOperation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOORDINATEREFERENCESYSTEM] = (d) => {
+  return IfcCoordinateReferenceSystem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOSTITEM] = (d) => {
+  return IfcCostItem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOSTSCHEDULE] = (d) => {
+  return IfcCostSchedule.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOSTVALUE] = (d) => {
+  return IfcCostValue.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOVERING] = (d) => {
+  return IfcCovering.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCOVERINGTYPE] = (d) => {
+  return IfcCoveringType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCREWRESOURCE] = (d) => {
+  return IfcCrewResource.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCREWRESOURCETYPE] = (d) => {
+  return IfcCrewResourceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCSGPRIMITIVE3D] = (d) => {
+  return IfcCsgPrimitive3D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCSGSOLID] = (d) => {
+  return IfcCsgSolid.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCURRENCYRELATIONSHIP] = (d) => {
+  return IfcCurrencyRelationship.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCURTAINWALL] = (d) => {
+  return IfcCurtainWall.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCURTAINWALLTYPE] = (d) => {
+  return IfcCurtainWallType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCURVE] = (d) => {
+  return IfcCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCURVEBOUNDEDPLANE] = (d) => {
+  return IfcCurveBoundedPlane.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCURVEBOUNDEDSURFACE] = (d) => {
+  return IfcCurveBoundedSurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCURVESEGMENT2D] = (d) => {
+  return IfcCurveSegment2D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCURVESTYLE] = (d) => {
+  return IfcCurveStyle.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCURVESTYLEFONT] = (d) => {
+  return IfcCurveStyleFont.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCURVESTYLEFONTANDSCALING] = (d) => {
+  return IfcCurveStyleFontAndScaling.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCURVESTYLEFONTPATTERN] = (d) => {
+  return IfcCurveStyleFontPattern.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCCYLINDRICALSURFACE] = (d) => {
+  return IfcCylindricalSurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDAMPER] = (d) => {
+  return IfcDamper.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDAMPERTYPE] = (d) => {
+  return IfcDamperType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDEEPFOUNDATION] = (d) => {
+  return IfcDeepFoundation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDEEPFOUNDATIONTYPE] = (d) => {
+  return IfcDeepFoundationType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDERIVEDPROFILEDEF] = (d) => {
+  return IfcDerivedProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDERIVEDUNIT] = (d) => {
+  return IfcDerivedUnit.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDERIVEDUNITELEMENT] = (d) => {
+  return IfcDerivedUnitElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDIMENSIONALEXPONENTS] = (d) => {
+  return IfcDimensionalExponents.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDIRECTION] = (d) => {
+  return IfcDirection.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISCRETEACCESSORY] = (d) => {
+  return IfcDiscreteAccessory.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISCRETEACCESSORYTYPE] = (d) => {
+  return IfcDiscreteAccessoryType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISTANCEEXPRESSION] = (d) => {
+  return IfcDistanceExpression.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISTRIBUTIONCHAMBERELEMENT] = (d) => {
+  return IfcDistributionChamberElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISTRIBUTIONCHAMBERELEMENTTYPE] = (d) => {
+  return IfcDistributionChamberElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISTRIBUTIONCIRCUIT] = (d) => {
+  return IfcDistributionCircuit.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISTRIBUTIONCONTROLELEMENT] = (d) => {
+  return IfcDistributionControlElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISTRIBUTIONCONTROLELEMENTTYPE] = (d) => {
+  return IfcDistributionControlElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISTRIBUTIONELEMENT] = (d) => {
+  return IfcDistributionElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISTRIBUTIONELEMENTTYPE] = (d) => {
+  return IfcDistributionElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISTRIBUTIONFLOWELEMENT] = (d) => {
+  return IfcDistributionFlowElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISTRIBUTIONFLOWELEMENTTYPE] = (d) => {
+  return IfcDistributionFlowElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISTRIBUTIONPORT] = (d) => {
+  return IfcDistributionPort.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDISTRIBUTIONSYSTEM] = (d) => {
+  return IfcDistributionSystem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDOCUMENTINFORMATION] = (d) => {
+  return IfcDocumentInformation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDOCUMENTINFORMATIONRELATIONSHIP] = (d) => {
+  return IfcDocumentInformationRelationship.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDOCUMENTREFERENCE] = (d) => {
+  return IfcDocumentReference.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDOOR] = (d) => {
+  return IfcDoor.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDOORLININGPROPERTIES] = (d) => {
+  return IfcDoorLiningProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDOORPANELPROPERTIES] = (d) => {
+  return IfcDoorPanelProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDOORSTANDARDCASE] = (d) => {
+  return IfcDoorStandardCase.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDOORSTYLE] = (d) => {
+  return IfcDoorStyle.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDOORTYPE] = (d) => {
+  return IfcDoorType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDRAUGHTINGPREDEFINEDCOLOUR] = (d) => {
+  return IfcDraughtingPreDefinedColour.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDRAUGHTINGPREDEFINEDCURVEFONT] = (d) => {
+  return IfcDraughtingPreDefinedCurveFont.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDUCTFITTING] = (d) => {
+  return IfcDuctFitting.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDUCTFITTINGTYPE] = (d) => {
+  return IfcDuctFittingType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDUCTSEGMENT] = (d) => {
+  return IfcDuctSegment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDUCTSEGMENTTYPE] = (d) => {
+  return IfcDuctSegmentType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDUCTSILENCER] = (d) => {
+  return IfcDuctSilencer.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCDUCTSILENCERTYPE] = (d) => {
+  return IfcDuctSilencerType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEDGE] = (d) => {
+  return IfcEdge.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEDGECURVE] = (d) => {
+  return IfcEdgeCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEDGELOOP] = (d) => {
+  return IfcEdgeLoop.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELECTRICAPPLIANCE] = (d) => {
+  return IfcElectricAppliance.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELECTRICAPPLIANCETYPE] = (d) => {
+  return IfcElectricApplianceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELECTRICDISTRIBUTIONBOARD] = (d) => {
+  return IfcElectricDistributionBoard.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELECTRICDISTRIBUTIONBOARDTYPE] = (d) => {
+  return IfcElectricDistributionBoardType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELECTRICFLOWSTORAGEDEVICE] = (d) => {
+  return IfcElectricFlowStorageDevice.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELECTRICFLOWSTORAGEDEVICETYPE] = (d) => {
+  return IfcElectricFlowStorageDeviceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELECTRICGENERATOR] = (d) => {
+  return IfcElectricGenerator.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELECTRICGENERATORTYPE] = (d) => {
+  return IfcElectricGeneratorType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELECTRICMOTOR] = (d) => {
+  return IfcElectricMotor.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELECTRICMOTORTYPE] = (d) => {
+  return IfcElectricMotorType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELECTRICTIMECONTROL] = (d) => {
+  return IfcElectricTimeControl.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELECTRICTIMECONTROLTYPE] = (d) => {
+  return IfcElectricTimeControlType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELEMENT] = (d) => {
+  return IfcElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELEMENTASSEMBLY] = (d) => {
+  return IfcElementAssembly.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELEMENTASSEMBLYTYPE] = (d) => {
+  return IfcElementAssemblyType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELEMENTCOMPONENT] = (d) => {
+  return IfcElementComponent.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELEMENTCOMPONENTTYPE] = (d) => {
+  return IfcElementComponentType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELEMENTQUANTITY] = (d) => {
+  return IfcElementQuantity.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELEMENTTYPE] = (d) => {
+  return IfcElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELEMENTARYSURFACE] = (d) => {
+  return IfcElementarySurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELLIPSE] = (d) => {
+  return IfcEllipse.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCELLIPSEPROFILEDEF] = (d) => {
+  return IfcEllipseProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCENERGYCONVERSIONDEVICE] = (d) => {
+  return IfcEnergyConversionDevice.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCENERGYCONVERSIONDEVICETYPE] = (d) => {
+  return IfcEnergyConversionDeviceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCENGINE] = (d) => {
+  return IfcEngine.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCENGINETYPE] = (d) => {
+  return IfcEngineType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEVAPORATIVECOOLER] = (d) => {
+  return IfcEvaporativeCooler.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEVAPORATIVECOOLERTYPE] = (d) => {
+  return IfcEvaporativeCoolerType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEVAPORATOR] = (d) => {
+  return IfcEvaporator.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEVAPORATORTYPE] = (d) => {
+  return IfcEvaporatorType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEVENT] = (d) => {
+  return IfcEvent.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEVENTTIME] = (d) => {
+  return IfcEventTime.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEVENTTYPE] = (d) => {
+  return IfcEventType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEXTENDEDPROPERTIES] = (d) => {
+  return IfcExtendedProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEXTERNALINFORMATION] = (d) => {
+  return IfcExternalInformation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEXTERNALREFERENCE] = (d) => {
+  return IfcExternalReference.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEXTERNALREFERENCERELATIONSHIP] = (d) => {
+  return IfcExternalReferenceRelationship.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEXTERNALSPATIALELEMENT] = (d) => {
+  return IfcExternalSpatialElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEXTERNALSPATIALSTRUCTUREELEMENT] = (d) => {
+  return IfcExternalSpatialStructureElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEXTERNALLYDEFINEDHATCHSTYLE] = (d) => {
+  return IfcExternallyDefinedHatchStyle.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEXTERNALLYDEFINEDSURFACESTYLE] = (d) => {
+  return IfcExternallyDefinedSurfaceStyle.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEXTERNALLYDEFINEDTEXTFONT] = (d) => {
+  return IfcExternallyDefinedTextFont.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEXTRUDEDAREASOLID] = (d) => {
+  return IfcExtrudedAreaSolid.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCEXTRUDEDAREASOLIDTAPERED] = (d) => {
+  return IfcExtrudedAreaSolidTapered.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFACE] = (d) => {
+  return IfcFace.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFACEBASEDSURFACEMODEL] = (d) => {
+  return IfcFaceBasedSurfaceModel.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFACEBOUND] = (d) => {
+  return IfcFaceBound.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFACEOUTERBOUND] = (d) => {
+  return IfcFaceOuterBound.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFACESURFACE] = (d) => {
+  return IfcFaceSurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFACETEDBREP] = (d) => {
+  return IfcFacetedBrep.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFACETEDBREPWITHVOIDS] = (d) => {
+  return IfcFacetedBrepWithVoids.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFACILITY] = (d) => {
+  return IfcFacility.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFACILITYPART] = (d) => {
+  return IfcFacilityPart.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFAILURECONNECTIONCONDITION] = (d) => {
+  return IfcFailureConnectionCondition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFAN] = (d) => {
+  return IfcFan.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFANTYPE] = (d) => {
+  return IfcFanType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFASTENER] = (d) => {
+  return IfcFastener.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFASTENERTYPE] = (d) => {
+  return IfcFastenerType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFEATUREELEMENT] = (d) => {
+  return IfcFeatureElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFEATUREELEMENTADDITION] = (d) => {
+  return IfcFeatureElementAddition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFEATUREELEMENTSUBTRACTION] = (d) => {
+  return IfcFeatureElementSubtraction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFILLAREASTYLE] = (d) => {
+  return IfcFillAreaStyle.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFILLAREASTYLEHATCHING] = (d) => {
+  return IfcFillAreaStyleHatching.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFILLAREASTYLETILES] = (d) => {
+  return IfcFillAreaStyleTiles.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFILTER] = (d) => {
+  return IfcFilter.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFILTERTYPE] = (d) => {
+  return IfcFilterType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFIRESUPPRESSIONTERMINAL] = (d) => {
+  return IfcFireSuppressionTerminal.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFIRESUPPRESSIONTERMINALTYPE] = (d) => {
+  return IfcFireSuppressionTerminalType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFIXEDREFERENCESWEPTAREASOLID] = (d) => {
+  return IfcFixedReferenceSweptAreaSolid.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWCONTROLLER] = (d) => {
+  return IfcFlowController.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWCONTROLLERTYPE] = (d) => {
+  return IfcFlowControllerType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWFITTING] = (d) => {
+  return IfcFlowFitting.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWFITTINGTYPE] = (d) => {
+  return IfcFlowFittingType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWINSTRUMENT] = (d) => {
+  return IfcFlowInstrument.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWINSTRUMENTTYPE] = (d) => {
+  return IfcFlowInstrumentType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWMETER] = (d) => {
+  return IfcFlowMeter.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWMETERTYPE] = (d) => {
+  return IfcFlowMeterType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWMOVINGDEVICE] = (d) => {
+  return IfcFlowMovingDevice.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWMOVINGDEVICETYPE] = (d) => {
+  return IfcFlowMovingDeviceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWSEGMENT] = (d) => {
+  return IfcFlowSegment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWSEGMENTTYPE] = (d) => {
+  return IfcFlowSegmentType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWSTORAGEDEVICE] = (d) => {
+  return IfcFlowStorageDevice.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWSTORAGEDEVICETYPE] = (d) => {
+  return IfcFlowStorageDeviceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWTERMINAL] = (d) => {
+  return IfcFlowTerminal.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWTERMINALTYPE] = (d) => {
+  return IfcFlowTerminalType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWTREATMENTDEVICE] = (d) => {
+  return IfcFlowTreatmentDevice.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFLOWTREATMENTDEVICETYPE] = (d) => {
+  return IfcFlowTreatmentDeviceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFOOTING] = (d) => {
+  return IfcFooting.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFOOTINGTYPE] = (d) => {
+  return IfcFootingType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFURNISHINGELEMENT] = (d) => {
+  return IfcFurnishingElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFURNISHINGELEMENTTYPE] = (d) => {
+  return IfcFurnishingElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFURNITURE] = (d) => {
+  return IfcFurniture.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCFURNITURETYPE] = (d) => {
+  return IfcFurnitureType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCGEOGRAPHICELEMENT] = (d) => {
+  return IfcGeographicElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCGEOGRAPHICELEMENTTYPE] = (d) => {
+  return IfcGeographicElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCGEOMETRICCURVESET] = (d) => {
+  return IfcGeometricCurveSet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCGEOMETRICREPRESENTATIONCONTEXT] = (d) => {
+  return IfcGeometricRepresentationContext.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCGEOMETRICREPRESENTATIONITEM] = (d) => {
+  return IfcGeometricRepresentationItem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCGEOMETRICREPRESENTATIONSUBCONTEXT] = (d) => {
+  return IfcGeometricRepresentationSubContext.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCGEOMETRICSET] = (d) => {
+  return IfcGeometricSet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCGRID] = (d) => {
+  return IfcGrid.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCGRIDAXIS] = (d) => {
+  return IfcGridAxis.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCGRIDPLACEMENT] = (d) => {
+  return IfcGridPlacement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCGROUP] = (d) => {
+  return IfcGroup.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCHALFSPACESOLID] = (d) => {
+  return IfcHalfSpaceSolid.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCHEATEXCHANGER] = (d) => {
+  return IfcHeatExchanger.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCHEATEXCHANGERTYPE] = (d) => {
+  return IfcHeatExchangerType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCHUMIDIFIER] = (d) => {
+  return IfcHumidifier.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCHUMIDIFIERTYPE] = (d) => {
+  return IfcHumidifierType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCISHAPEPROFILEDEF] = (d) => {
+  return IfcIShapeProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCIMAGETEXTURE] = (d) => {
+  return IfcImageTexture.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCINDEXEDCOLOURMAP] = (d) => {
+  return IfcIndexedColourMap.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCINDEXEDPOLYCURVE] = (d) => {
+  return IfcIndexedPolyCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCINDEXEDPOLYGONALFACE] = (d) => {
+  return IfcIndexedPolygonalFace.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCINDEXEDPOLYGONALFACEWITHVOIDS] = (d) => {
+  return IfcIndexedPolygonalFaceWithVoids.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCINDEXEDTEXTUREMAP] = (d) => {
+  return IfcIndexedTextureMap.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCINDEXEDTRIANGLETEXTUREMAP] = (d) => {
+  return IfcIndexedTriangleTextureMap.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCINTERCEPTOR] = (d) => {
+  return IfcInterceptor.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCINTERCEPTORTYPE] = (d) => {
+  return IfcInterceptorType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCINTERSECTIONCURVE] = (d) => {
+  return IfcIntersectionCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCINVENTORY] = (d) => {
+  return IfcInventory.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCIRREGULARTIMESERIES] = (d) => {
+  return IfcIrregularTimeSeries.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCIRREGULARTIMESERIESVALUE] = (d) => {
+  return IfcIrregularTimeSeriesValue.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCJUNCTIONBOX] = (d) => {
+  return IfcJunctionBox.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCJUNCTIONBOXTYPE] = (d) => {
+  return IfcJunctionBoxType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLSHAPEPROFILEDEF] = (d) => {
+  return IfcLShapeProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLABORRESOURCE] = (d) => {
+  return IfcLaborResource.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLABORRESOURCETYPE] = (d) => {
+  return IfcLaborResourceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLAGTIME] = (d) => {
+  return IfcLagTime.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLAMP] = (d) => {
+  return IfcLamp.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLAMPTYPE] = (d) => {
+  return IfcLampType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLIBRARYINFORMATION] = (d) => {
+  return IfcLibraryInformation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLIBRARYREFERENCE] = (d) => {
+  return IfcLibraryReference.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLIGHTDISTRIBUTIONDATA] = (d) => {
+  return IfcLightDistributionData.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLIGHTFIXTURE] = (d) => {
+  return IfcLightFixture.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLIGHTFIXTURETYPE] = (d) => {
+  return IfcLightFixtureType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLIGHTINTENSITYDISTRIBUTION] = (d) => {
+  return IfcLightIntensityDistribution.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLIGHTSOURCE] = (d) => {
+  return IfcLightSource.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLIGHTSOURCEAMBIENT] = (d) => {
+  return IfcLightSourceAmbient.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLIGHTSOURCEDIRECTIONAL] = (d) => {
+  return IfcLightSourceDirectional.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLIGHTSOURCEGONIOMETRIC] = (d) => {
+  return IfcLightSourceGoniometric.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLIGHTSOURCEPOSITIONAL] = (d) => {
+  return IfcLightSourcePositional.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLIGHTSOURCESPOT] = (d) => {
+  return IfcLightSourceSpot.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLINE] = (d) => {
+  return IfcLine.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLINESEGMENT2D] = (d) => {
+  return IfcLineSegment2D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLINEARPLACEMENT] = (d) => {
+  return IfcLinearPlacement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLINEARPOSITIONINGELEMENT] = (d) => {
+  return IfcLinearPositioningElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLOCALPLACEMENT] = (d) => {
+  return IfcLocalPlacement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCLOOP] = (d) => {
+  return IfcLoop.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMANIFOLDSOLIDBREP] = (d) => {
+  return IfcManifoldSolidBrep.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMAPCONVERSION] = (d) => {
+  return IfcMapConversion.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMAPPEDITEM] = (d) => {
+  return IfcMappedItem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIAL] = (d) => {
+  return IfcMaterial.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALCLASSIFICATIONRELATIONSHIP] = (d) => {
+  return IfcMaterialClassificationRelationship.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALCONSTITUENT] = (d) => {
+  return IfcMaterialConstituent.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALCONSTITUENTSET] = (d) => {
+  return IfcMaterialConstituentSet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALDEFINITION] = (d) => {
+  return IfcMaterialDefinition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALDEFINITIONREPRESENTATION] = (d) => {
+  return IfcMaterialDefinitionRepresentation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALLAYER] = (d) => {
+  return IfcMaterialLayer.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALLAYERSET] = (d) => {
+  return IfcMaterialLayerSet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALLAYERSETUSAGE] = (d) => {
+  return IfcMaterialLayerSetUsage.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALLAYERWITHOFFSETS] = (d) => {
+  return IfcMaterialLayerWithOffsets.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALLIST] = (d) => {
+  return IfcMaterialList.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALPROFILE] = (d) => {
+  return IfcMaterialProfile.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALPROFILESET] = (d) => {
+  return IfcMaterialProfileSet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALPROFILESETUSAGE] = (d) => {
+  return IfcMaterialProfileSetUsage.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALPROFILESETUSAGETAPERING] = (d) => {
+  return IfcMaterialProfileSetUsageTapering.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALPROFILEWITHOFFSETS] = (d) => {
+  return IfcMaterialProfileWithOffsets.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALPROPERTIES] = (d) => {
+  return IfcMaterialProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALRELATIONSHIP] = (d) => {
+  return IfcMaterialRelationship.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMATERIALUSAGEDEFINITION] = (d) => {
+  return IfcMaterialUsageDefinition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMEASUREWITHUNIT] = (d) => {
+  return IfcMeasureWithUnit.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMECHANICALFASTENER] = (d) => {
+  return IfcMechanicalFastener.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMECHANICALFASTENERTYPE] = (d) => {
+  return IfcMechanicalFastenerType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMEDICALDEVICE] = (d) => {
+  return IfcMedicalDevice.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMEDICALDEVICETYPE] = (d) => {
+  return IfcMedicalDeviceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMEMBER] = (d) => {
+  return IfcMember.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMEMBERSTANDARDCASE] = (d) => {
+  return IfcMemberStandardCase.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMEMBERTYPE] = (d) => {
+  return IfcMemberType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMETRIC] = (d) => {
+  return IfcMetric.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMIRROREDPROFILEDEF] = (d) => {
+  return IfcMirroredProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMONETARYUNIT] = (d) => {
+  return IfcMonetaryUnit.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMOTORCONNECTION] = (d) => {
+  return IfcMotorConnection.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCMOTORCONNECTIONTYPE] = (d) => {
+  return IfcMotorConnectionType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCNAMEDUNIT] = (d) => {
+  return IfcNamedUnit.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOBJECT] = (d) => {
+  return IfcObject.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOBJECTDEFINITION] = (d) => {
+  return IfcObjectDefinition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOBJECTPLACEMENT] = (d) => {
+  return IfcObjectPlacement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOBJECTIVE] = (d) => {
+  return IfcObjective.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOCCUPANT] = (d) => {
+  return IfcOccupant.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOFFSETCURVE] = (d) => {
+  return IfcOffsetCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOFFSETCURVE2D] = (d) => {
+  return IfcOffsetCurve2D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOFFSETCURVE3D] = (d) => {
+  return IfcOffsetCurve3D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOFFSETCURVEBYDISTANCES] = (d) => {
+  return IfcOffsetCurveByDistances.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOPENSHELL] = (d) => {
+  return IfcOpenShell.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOPENINGELEMENT] = (d) => {
+  return IfcOpeningElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOPENINGSTANDARDCASE] = (d) => {
+  return IfcOpeningStandardCase.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCORGANIZATION] = (d) => {
+  return IfcOrganization.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCORGANIZATIONRELATIONSHIP] = (d) => {
+  return IfcOrganizationRelationship.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCORIENTATIONEXPRESSION] = (d) => {
+  return IfcOrientationExpression.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCORIENTEDEDGE] = (d) => {
+  return IfcOrientedEdge.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOUTERBOUNDARYCURVE] = (d) => {
+  return IfcOuterBoundaryCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOUTLET] = (d) => {
+  return IfcOutlet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOUTLETTYPE] = (d) => {
+  return IfcOutletType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCOWNERHISTORY] = (d) => {
+  return IfcOwnerHistory.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPARAMETERIZEDPROFILEDEF] = (d) => {
+  return IfcParameterizedProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPATH] = (d) => {
+  return IfcPath.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPCURVE] = (d) => {
+  return IfcPcurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPERFORMANCEHISTORY] = (d) => {
+  return IfcPerformanceHistory.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPERMEABLECOVERINGPROPERTIES] = (d) => {
+  return IfcPermeableCoveringProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPERMIT] = (d) => {
+  return IfcPermit.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPERSON] = (d) => {
+  return IfcPerson.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPERSONANDORGANIZATION] = (d) => {
+  return IfcPersonAndOrganization.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPHYSICALCOMPLEXQUANTITY] = (d) => {
+  return IfcPhysicalComplexQuantity.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPHYSICALQUANTITY] = (d) => {
+  return IfcPhysicalQuantity.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPHYSICALSIMPLEQUANTITY] = (d) => {
+  return IfcPhysicalSimpleQuantity.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPILE] = (d) => {
+  return IfcPile.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPILETYPE] = (d) => {
+  return IfcPileType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPIPEFITTING] = (d) => {
+  return IfcPipeFitting.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPIPEFITTINGTYPE] = (d) => {
+  return IfcPipeFittingType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPIPESEGMENT] = (d) => {
+  return IfcPipeSegment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPIPESEGMENTTYPE] = (d) => {
+  return IfcPipeSegmentType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPIXELTEXTURE] = (d) => {
+  return IfcPixelTexture.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPLACEMENT] = (d) => {
+  return IfcPlacement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPLANARBOX] = (d) => {
+  return IfcPlanarBox.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPLANAREXTENT] = (d) => {
+  return IfcPlanarExtent.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPLANE] = (d) => {
+  return IfcPlane.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPLATE] = (d) => {
+  return IfcPlate.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPLATESTANDARDCASE] = (d) => {
+  return IfcPlateStandardCase.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPLATETYPE] = (d) => {
+  return IfcPlateType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPOINT] = (d) => {
+  return IfcPoint.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPOINTONCURVE] = (d) => {
+  return IfcPointOnCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPOINTONSURFACE] = (d) => {
+  return IfcPointOnSurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPOLYLOOP] = (d) => {
+  return IfcPolyLoop.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPOLYGONALBOUNDEDHALFSPACE] = (d) => {
+  return IfcPolygonalBoundedHalfSpace.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPOLYGONALFACESET] = (d) => {
+  return IfcPolygonalFaceSet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPOLYLINE] = (d) => {
+  return IfcPolyline.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPORT] = (d) => {
+  return IfcPort.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPOSITIONINGELEMENT] = (d) => {
+  return IfcPositioningElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPOSTALADDRESS] = (d) => {
+  return IfcPostalAddress.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPREDEFINEDCOLOUR] = (d) => {
+  return IfcPreDefinedColour.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPREDEFINEDCURVEFONT] = (d) => {
+  return IfcPreDefinedCurveFont.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPREDEFINEDITEM] = (d) => {
+  return IfcPreDefinedItem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPREDEFINEDPROPERTIES] = (d) => {
+  return IfcPreDefinedProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPREDEFINEDPROPERTYSET] = (d) => {
+  return IfcPreDefinedPropertySet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPREDEFINEDTEXTFONT] = (d) => {
+  return IfcPreDefinedTextFont.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPRESENTATIONITEM] = (d) => {
+  return IfcPresentationItem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPRESENTATIONLAYERASSIGNMENT] = (d) => {
+  return IfcPresentationLayerAssignment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPRESENTATIONLAYERWITHSTYLE] = (d) => {
+  return IfcPresentationLayerWithStyle.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPRESENTATIONSTYLE] = (d) => {
+  return IfcPresentationStyle.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPRESENTATIONSTYLEASSIGNMENT] = (d) => {
+  return IfcPresentationStyleAssignment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROCEDURE] = (d) => {
+  return IfcProcedure.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROCEDURETYPE] = (d) => {
+  return IfcProcedureType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROCESS] = (d) => {
+  return IfcProcess.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPRODUCT] = (d) => {
+  return IfcProduct.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPRODUCTDEFINITIONSHAPE] = (d) => {
+  return IfcProductDefinitionShape.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPRODUCTREPRESENTATION] = (d) => {
+  return IfcProductRepresentation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROFILEDEF] = (d) => {
+  return IfcProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROFILEPROPERTIES] = (d) => {
+  return IfcProfileProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROJECT] = (d) => {
+  return IfcProject.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROJECTLIBRARY] = (d) => {
+  return IfcProjectLibrary.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROJECTORDER] = (d) => {
+  return IfcProjectOrder.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROJECTEDCRS] = (d) => {
+  return IfcProjectedCRS.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROJECTIONELEMENT] = (d) => {
+  return IfcProjectionElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTY] = (d) => {
+  return IfcProperty.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYABSTRACTION] = (d) => {
+  return IfcPropertyAbstraction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYBOUNDEDVALUE] = (d) => {
+  return IfcPropertyBoundedValue.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYDEFINITION] = (d) => {
+  return IfcPropertyDefinition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYDEPENDENCYRELATIONSHIP] = (d) => {
+  return IfcPropertyDependencyRelationship.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYENUMERATEDVALUE] = (d) => {
+  return IfcPropertyEnumeratedValue.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYENUMERATION] = (d) => {
+  return IfcPropertyEnumeration.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYLISTVALUE] = (d) => {
+  return IfcPropertyListValue.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYREFERENCEVALUE] = (d) => {
+  return IfcPropertyReferenceValue.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYSET] = (d) => {
+  return IfcPropertySet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYSETDEFINITION] = (d) => {
+  return IfcPropertySetDefinition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYSETTEMPLATE] = (d) => {
+  return IfcPropertySetTemplate.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYSINGLEVALUE] = (d) => {
+  return IfcPropertySingleValue.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYTABLEVALUE] = (d) => {
+  return IfcPropertyTableValue.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYTEMPLATE] = (d) => {
+  return IfcPropertyTemplate.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROPERTYTEMPLATEDEFINITION] = (d) => {
+  return IfcPropertyTemplateDefinition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROTECTIVEDEVICE] = (d) => {
+  return IfcProtectiveDevice.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROTECTIVEDEVICETRIPPINGUNIT] = (d) => {
+  return IfcProtectiveDeviceTrippingUnit.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROTECTIVEDEVICETRIPPINGUNITTYPE] = (d) => {
+  return IfcProtectiveDeviceTrippingUnitType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROTECTIVEDEVICETYPE] = (d) => {
+  return IfcProtectiveDeviceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPROXY] = (d) => {
+  return IfcProxy.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPUMP] = (d) => {
+  return IfcPump.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCPUMPTYPE] = (d) => {
+  return IfcPumpType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCQUANTITYAREA] = (d) => {
+  return IfcQuantityArea.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCQUANTITYCOUNT] = (d) => {
+  return IfcQuantityCount.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCQUANTITYLENGTH] = (d) => {
+  return IfcQuantityLength.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCQUANTITYSET] = (d) => {
+  return IfcQuantitySet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCQUANTITYTIME] = (d) => {
+  return IfcQuantityTime.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCQUANTITYVOLUME] = (d) => {
+  return IfcQuantityVolume.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCQUANTITYWEIGHT] = (d) => {
+  return IfcQuantityWeight.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRAILING] = (d) => {
+  return IfcRailing.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRAILINGTYPE] = (d) => {
+  return IfcRailingType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRAMP] = (d) => {
+  return IfcRamp.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRAMPFLIGHT] = (d) => {
+  return IfcRampFlight.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRAMPFLIGHTTYPE] = (d) => {
+  return IfcRampFlightType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRAMPTYPE] = (d) => {
+  return IfcRampType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRATIONALBSPLINECURVEWITHKNOTS] = (d) => {
+  return IfcRationalBSplineCurveWithKnots.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRATIONALBSPLINESURFACEWITHKNOTS] = (d) => {
+  return IfcRationalBSplineSurfaceWithKnots.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRECTANGLEHOLLOWPROFILEDEF] = (d) => {
+  return IfcRectangleHollowProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRECTANGLEPROFILEDEF] = (d) => {
+  return IfcRectangleProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRECTANGULARPYRAMID] = (d) => {
+  return IfcRectangularPyramid.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRECTANGULARTRIMMEDSURFACE] = (d) => {
+  return IfcRectangularTrimmedSurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRECURRENCEPATTERN] = (d) => {
+  return IfcRecurrencePattern.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREFERENCE] = (d) => {
+  return IfcReference.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREFERENT] = (d) => {
+  return IfcReferent.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREGULARTIMESERIES] = (d) => {
+  return IfcRegularTimeSeries.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREINFORCEMENTBARPROPERTIES] = (d) => {
+  return IfcReinforcementBarProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREINFORCEMENTDEFINITIONPROPERTIES] = (d) => {
+  return IfcReinforcementDefinitionProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREINFORCINGBAR] = (d) => {
+  return IfcReinforcingBar.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREINFORCINGBARTYPE] = (d) => {
+  return IfcReinforcingBarType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREINFORCINGELEMENT] = (d) => {
+  return IfcReinforcingElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREINFORCINGELEMENTTYPE] = (d) => {
+  return IfcReinforcingElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREINFORCINGMESH] = (d) => {
+  return IfcReinforcingMesh.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREINFORCINGMESHTYPE] = (d) => {
+  return IfcReinforcingMeshType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELAGGREGATES] = (d) => {
+  return IfcRelAggregates.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSIGNS] = (d) => {
+  return IfcRelAssigns.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSIGNSTOACTOR] = (d) => {
+  return IfcRelAssignsToActor.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSIGNSTOCONTROL] = (d) => {
+  return IfcRelAssignsToControl.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSIGNSTOGROUP] = (d) => {
+  return IfcRelAssignsToGroup.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSIGNSTOGROUPBYFACTOR] = (d) => {
+  return IfcRelAssignsToGroupByFactor.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSIGNSTOPROCESS] = (d) => {
+  return IfcRelAssignsToProcess.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSIGNSTOPRODUCT] = (d) => {
+  return IfcRelAssignsToProduct.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSIGNSTORESOURCE] = (d) => {
+  return IfcRelAssignsToResource.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSOCIATES] = (d) => {
+  return IfcRelAssociates.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSOCIATESAPPROVAL] = (d) => {
+  return IfcRelAssociatesApproval.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSOCIATESCLASSIFICATION] = (d) => {
+  return IfcRelAssociatesClassification.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSOCIATESCONSTRAINT] = (d) => {
+  return IfcRelAssociatesConstraint.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSOCIATESDOCUMENT] = (d) => {
+  return IfcRelAssociatesDocument.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSOCIATESLIBRARY] = (d) => {
+  return IfcRelAssociatesLibrary.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELASSOCIATESMATERIAL] = (d) => {
+  return IfcRelAssociatesMaterial.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELCONNECTS] = (d) => {
+  return IfcRelConnects.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELCONNECTSELEMENTS] = (d) => {
+  return IfcRelConnectsElements.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELCONNECTSPATHELEMENTS] = (d) => {
+  return IfcRelConnectsPathElements.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELCONNECTSPORTTOELEMENT] = (d) => {
+  return IfcRelConnectsPortToElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELCONNECTSPORTS] = (d) => {
+  return IfcRelConnectsPorts.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELCONNECTSSTRUCTURALACTIVITY] = (d) => {
+  return IfcRelConnectsStructuralActivity.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELCONNECTSSTRUCTURALMEMBER] = (d) => {
+  return IfcRelConnectsStructuralMember.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELCONNECTSWITHECCENTRICITY] = (d) => {
+  return IfcRelConnectsWithEccentricity.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELCONNECTSWITHREALIZINGELEMENTS] = (d) => {
+  return IfcRelConnectsWithRealizingElements.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELCONTAINEDINSPATIALSTRUCTURE] = (d) => {
+  return IfcRelContainedInSpatialStructure.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELCOVERSBLDGELEMENTS] = (d) => {
+  return IfcRelCoversBldgElements.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELCOVERSSPACES] = (d) => {
+  return IfcRelCoversSpaces.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELDECLARES] = (d) => {
+  return IfcRelDeclares.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELDECOMPOSES] = (d) => {
+  return IfcRelDecomposes.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELDEFINES] = (d) => {
+  return IfcRelDefines.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELDEFINESBYOBJECT] = (d) => {
+  return IfcRelDefinesByObject.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELDEFINESBYPROPERTIES] = (d) => {
+  return IfcRelDefinesByProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELDEFINESBYTEMPLATE] = (d) => {
+  return IfcRelDefinesByTemplate.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELDEFINESBYTYPE] = (d) => {
+  return IfcRelDefinesByType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELFILLSELEMENT] = (d) => {
+  return IfcRelFillsElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELFLOWCONTROLELEMENTS] = (d) => {
+  return IfcRelFlowControlElements.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELINTERFERESELEMENTS] = (d) => {
+  return IfcRelInterferesElements.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELNESTS] = (d) => {
+  return IfcRelNests.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELPOSITIONS] = (d) => {
+  return IfcRelPositions.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELPROJECTSELEMENT] = (d) => {
+  return IfcRelProjectsElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELREFERENCEDINSPATIALSTRUCTURE] = (d) => {
+  return IfcRelReferencedInSpatialStructure.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELSEQUENCE] = (d) => {
+  return IfcRelSequence.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELSERVICESBUILDINGS] = (d) => {
+  return IfcRelServicesBuildings.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELSPACEBOUNDARY] = (d) => {
+  return IfcRelSpaceBoundary.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELSPACEBOUNDARY1STLEVEL] = (d) => {
+  return IfcRelSpaceBoundary1stLevel.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELSPACEBOUNDARY2NDLEVEL] = (d) => {
+  return IfcRelSpaceBoundary2ndLevel.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELVOIDSELEMENT] = (d) => {
+  return IfcRelVoidsElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRELATIONSHIP] = (d) => {
+  return IfcRelationship.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREPARAMETRISEDCOMPOSITECURVESEGMENT] = (d) => {
+  return IfcReparametrisedCompositeCurveSegment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREPRESENTATION] = (d) => {
+  return IfcRepresentation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREPRESENTATIONCONTEXT] = (d) => {
+  return IfcRepresentationContext.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREPRESENTATIONITEM] = (d) => {
+  return IfcRepresentationItem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREPRESENTATIONMAP] = (d) => {
+  return IfcRepresentationMap.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRESOURCE] = (d) => {
+  return IfcResource.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRESOURCEAPPROVALRELATIONSHIP] = (d) => {
+  return IfcResourceApprovalRelationship.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRESOURCECONSTRAINTRELATIONSHIP] = (d) => {
+  return IfcResourceConstraintRelationship.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRESOURCELEVELRELATIONSHIP] = (d) => {
+  return IfcResourceLevelRelationship.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRESOURCETIME] = (d) => {
+  return IfcResourceTime.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREVOLVEDAREASOLID] = (d) => {
+  return IfcRevolvedAreaSolid.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCREVOLVEDAREASOLIDTAPERED] = (d) => {
+  return IfcRevolvedAreaSolidTapered.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRIGHTCIRCULARCONE] = (d) => {
+  return IfcRightCircularCone.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCRIGHTCIRCULARCYLINDER] = (d) => {
+  return IfcRightCircularCylinder.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCROOF] = (d) => {
+  return IfcRoof.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCROOFTYPE] = (d) => {
+  return IfcRoofType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCROOT] = (d) => {
+  return IfcRoot.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCROUNDEDRECTANGLEPROFILEDEF] = (d) => {
+  return IfcRoundedRectangleProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSIUNIT] = (d) => {
+  return IfcSIUnit.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSANITARYTERMINAL] = (d) => {
+  return IfcSanitaryTerminal.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSANITARYTERMINALTYPE] = (d) => {
+  return IfcSanitaryTerminalType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSCHEDULINGTIME] = (d) => {
+  return IfcSchedulingTime.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSEAMCURVE] = (d) => {
+  return IfcSeamCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSECTIONPROPERTIES] = (d) => {
+  return IfcSectionProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSECTIONREINFORCEMENTPROPERTIES] = (d) => {
+  return IfcSectionReinforcementProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSECTIONEDSOLID] = (d) => {
+  return IfcSectionedSolid.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSECTIONEDSOLIDHORIZONTAL] = (d) => {
+  return IfcSectionedSolidHorizontal.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSECTIONEDSPINE] = (d) => {
+  return IfcSectionedSpine.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSENSOR] = (d) => {
+  return IfcSensor.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSENSORTYPE] = (d) => {
+  return IfcSensorType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSHADINGDEVICE] = (d) => {
+  return IfcShadingDevice.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSHADINGDEVICETYPE] = (d) => {
+  return IfcShadingDeviceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSHAPEASPECT] = (d) => {
+  return IfcShapeAspect.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSHAPEMODEL] = (d) => {
+  return IfcShapeModel.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSHAPEREPRESENTATION] = (d) => {
+  return IfcShapeRepresentation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSHELLBASEDSURFACEMODEL] = (d) => {
+  return IfcShellBasedSurfaceModel.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSIMPLEPROPERTY] = (d) => {
+  return IfcSimpleProperty.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSIMPLEPROPERTYTEMPLATE] = (d) => {
+  return IfcSimplePropertyTemplate.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSITE] = (d) => {
+  return IfcSite.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSLAB] = (d) => {
+  return IfcSlab.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSLABELEMENTEDCASE] = (d) => {
+  return IfcSlabElementedCase.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSLABSTANDARDCASE] = (d) => {
+  return IfcSlabStandardCase.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSLABTYPE] = (d) => {
+  return IfcSlabType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSLIPPAGECONNECTIONCONDITION] = (d) => {
+  return IfcSlippageConnectionCondition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSOLARDEVICE] = (d) => {
+  return IfcSolarDevice.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSOLARDEVICETYPE] = (d) => {
+  return IfcSolarDeviceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSOLIDMODEL] = (d) => {
+  return IfcSolidModel.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSPACE] = (d) => {
+  return IfcSpace.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSPACEHEATER] = (d) => {
+  return IfcSpaceHeater.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSPACEHEATERTYPE] = (d) => {
+  return IfcSpaceHeaterType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSPACETYPE] = (d) => {
+  return IfcSpaceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSPATIALELEMENT] = (d) => {
+  return IfcSpatialElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSPATIALELEMENTTYPE] = (d) => {
+  return IfcSpatialElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSPATIALSTRUCTUREELEMENT] = (d) => {
+  return IfcSpatialStructureElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSPATIALSTRUCTUREELEMENTTYPE] = (d) => {
+  return IfcSpatialStructureElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSPATIALZONE] = (d) => {
+  return IfcSpatialZone.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSPATIALZONETYPE] = (d) => {
+  return IfcSpatialZoneType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSPHERE] = (d) => {
+  return IfcSphere.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSPHERICALSURFACE] = (d) => {
+  return IfcSphericalSurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTACKTERMINAL] = (d) => {
+  return IfcStackTerminal.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTACKTERMINALTYPE] = (d) => {
+  return IfcStackTerminalType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTAIR] = (d) => {
+  return IfcStair.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTAIRFLIGHT] = (d) => {
+  return IfcStairFlight.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTAIRFLIGHTTYPE] = (d) => {
+  return IfcStairFlightType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTAIRTYPE] = (d) => {
+  return IfcStairType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALACTION] = (d) => {
+  return IfcStructuralAction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALACTIVITY] = (d) => {
+  return IfcStructuralActivity.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALANALYSISMODEL] = (d) => {
+  return IfcStructuralAnalysisModel.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALCONNECTION] = (d) => {
+  return IfcStructuralConnection.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALCONNECTIONCONDITION] = (d) => {
+  return IfcStructuralConnectionCondition.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALCURVEACTION] = (d) => {
+  return IfcStructuralCurveAction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALCURVECONNECTION] = (d) => {
+  return IfcStructuralCurveConnection.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALCURVEMEMBER] = (d) => {
+  return IfcStructuralCurveMember.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALCURVEMEMBERVARYING] = (d) => {
+  return IfcStructuralCurveMemberVarying.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALCURVEREACTION] = (d) => {
+  return IfcStructuralCurveReaction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALITEM] = (d) => {
+  return IfcStructuralItem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLINEARACTION] = (d) => {
+  return IfcStructuralLinearAction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOAD] = (d) => {
+  return IfcStructuralLoad.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOADCASE] = (d) => {
+  return IfcStructuralLoadCase.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOADCONFIGURATION] = (d) => {
+  return IfcStructuralLoadConfiguration.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOADGROUP] = (d) => {
+  return IfcStructuralLoadGroup.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOADLINEARFORCE] = (d) => {
+  return IfcStructuralLoadLinearForce.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOADORRESULT] = (d) => {
+  return IfcStructuralLoadOrResult.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOADPLANARFORCE] = (d) => {
+  return IfcStructuralLoadPlanarForce.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOADSINGLEDISPLACEMENT] = (d) => {
+  return IfcStructuralLoadSingleDisplacement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOADSINGLEDISPLACEMENTDISTORTION] = (d) => {
+  return IfcStructuralLoadSingleDisplacementDistortion.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOADSINGLEFORCE] = (d) => {
+  return IfcStructuralLoadSingleForce.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOADSINGLEFORCEWARPING] = (d) => {
+  return IfcStructuralLoadSingleForceWarping.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOADSTATIC] = (d) => {
+  return IfcStructuralLoadStatic.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALLOADTEMPERATURE] = (d) => {
+  return IfcStructuralLoadTemperature.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALMEMBER] = (d) => {
+  return IfcStructuralMember.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALPLANARACTION] = (d) => {
+  return IfcStructuralPlanarAction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALPOINTACTION] = (d) => {
+  return IfcStructuralPointAction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALPOINTCONNECTION] = (d) => {
+  return IfcStructuralPointConnection.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALPOINTREACTION] = (d) => {
+  return IfcStructuralPointReaction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALREACTION] = (d) => {
+  return IfcStructuralReaction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALRESULTGROUP] = (d) => {
+  return IfcStructuralResultGroup.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALSURFACEACTION] = (d) => {
+  return IfcStructuralSurfaceAction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALSURFACECONNECTION] = (d) => {
+  return IfcStructuralSurfaceConnection.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALSURFACEMEMBER] = (d) => {
+  return IfcStructuralSurfaceMember.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALSURFACEMEMBERVARYING] = (d) => {
+  return IfcStructuralSurfaceMemberVarying.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTRUCTURALSURFACEREACTION] = (d) => {
+  return IfcStructuralSurfaceReaction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTYLEMODEL] = (d) => {
+  return IfcStyleModel.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTYLEDITEM] = (d) => {
+  return IfcStyledItem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSTYLEDREPRESENTATION] = (d) => {
+  return IfcStyledRepresentation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSUBCONTRACTRESOURCE] = (d) => {
+  return IfcSubContractResource.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSUBCONTRACTRESOURCETYPE] = (d) => {
+  return IfcSubContractResourceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSUBEDGE] = (d) => {
+  return IfcSubedge.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACE] = (d) => {
+  return IfcSurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACECURVE] = (d) => {
+  return IfcSurfaceCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACECURVESWEPTAREASOLID] = (d) => {
+  return IfcSurfaceCurveSweptAreaSolid.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACEFEATURE] = (d) => {
+  return IfcSurfaceFeature.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACEOFLINEAREXTRUSION] = (d) => {
+  return IfcSurfaceOfLinearExtrusion.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACEOFREVOLUTION] = (d) => {
+  return IfcSurfaceOfRevolution.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACEREINFORCEMENTAREA] = (d) => {
+  return IfcSurfaceReinforcementArea.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACESTYLE] = (d) => {
+  return IfcSurfaceStyle.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACESTYLELIGHTING] = (d) => {
+  return IfcSurfaceStyleLighting.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACESTYLEREFRACTION] = (d) => {
+  return IfcSurfaceStyleRefraction.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACESTYLERENDERING] = (d) => {
+  return IfcSurfaceStyleRendering.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACESTYLESHADING] = (d) => {
+  return IfcSurfaceStyleShading.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACESTYLEWITHTEXTURES] = (d) => {
+  return IfcSurfaceStyleWithTextures.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSURFACETEXTURE] = (d) => {
+  return IfcSurfaceTexture.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSWEPTAREASOLID] = (d) => {
+  return IfcSweptAreaSolid.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSWEPTDISKSOLID] = (d) => {
+  return IfcSweptDiskSolid.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSWEPTDISKSOLIDPOLYGONAL] = (d) => {
+  return IfcSweptDiskSolidPolygonal.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSWEPTSURFACE] = (d) => {
+  return IfcSweptSurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSWITCHINGDEVICE] = (d) => {
+  return IfcSwitchingDevice.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSWITCHINGDEVICETYPE] = (d) => {
+  return IfcSwitchingDeviceType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSYSTEM] = (d) => {
+  return IfcSystem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSYSTEMFURNITUREELEMENT] = (d) => {
+  return IfcSystemFurnitureElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCSYSTEMFURNITUREELEMENTTYPE] = (d) => {
+  return IfcSystemFurnitureElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTSHAPEPROFILEDEF] = (d) => {
+  return IfcTShapeProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTABLE] = (d) => {
+  return IfcTable.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTABLECOLUMN] = (d) => {
+  return IfcTableColumn.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTABLEROW] = (d) => {
+  return IfcTableRow.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTANK] = (d) => {
+  return IfcTank.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTANKTYPE] = (d) => {
+  return IfcTankType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTASK] = (d) => {
+  return IfcTask.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTASKTIME] = (d) => {
+  return IfcTaskTime.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTASKTIMERECURRING] = (d) => {
+  return IfcTaskTimeRecurring.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTASKTYPE] = (d) => {
+  return IfcTaskType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTELECOMADDRESS] = (d) => {
+  return IfcTelecomAddress.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTENDON] = (d) => {
+  return IfcTendon.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTENDONANCHOR] = (d) => {
+  return IfcTendonAnchor.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTENDONANCHORTYPE] = (d) => {
+  return IfcTendonAnchorType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTENDONCONDUIT] = (d) => {
+  return IfcTendonConduit.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTENDONCONDUITTYPE] = (d) => {
+  return IfcTendonConduitType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTENDONTYPE] = (d) => {
+  return IfcTendonType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTESSELLATEDFACESET] = (d) => {
+  return IfcTessellatedFaceSet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTESSELLATEDITEM] = (d) => {
+  return IfcTessellatedItem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTEXTLITERAL] = (d) => {
+  return IfcTextLiteral.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTEXTLITERALWITHEXTENT] = (d) => {
+  return IfcTextLiteralWithExtent.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTEXTSTYLE] = (d) => {
+  return IfcTextStyle.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTEXTSTYLEFONTMODEL] = (d) => {
+  return IfcTextStyleFontModel.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTEXTSTYLEFORDEFINEDFONT] = (d) => {
+  return IfcTextStyleForDefinedFont.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTEXTSTYLETEXTMODEL] = (d) => {
+  return IfcTextStyleTextModel.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTEXTURECOORDINATE] = (d) => {
+  return IfcTextureCoordinate.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTEXTURECOORDINATEGENERATOR] = (d) => {
+  return IfcTextureCoordinateGenerator.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTEXTUREMAP] = (d) => {
+  return IfcTextureMap.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTEXTUREVERTEX] = (d) => {
+  return IfcTextureVertex.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTEXTUREVERTEXLIST] = (d) => {
+  return IfcTextureVertexList.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTIMEPERIOD] = (d) => {
+  return IfcTimePeriod.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTIMESERIES] = (d) => {
+  return IfcTimeSeries.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTIMESERIESVALUE] = (d) => {
+  return IfcTimeSeriesValue.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTOPOLOGICALREPRESENTATIONITEM] = (d) => {
+  return IfcTopologicalRepresentationItem.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTOPOLOGYREPRESENTATION] = (d) => {
+  return IfcTopologyRepresentation.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTOROIDALSURFACE] = (d) => {
+  return IfcToroidalSurface.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTRANSFORMER] = (d) => {
+  return IfcTransformer.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTRANSFORMERTYPE] = (d) => {
+  return IfcTransformerType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTRANSITIONCURVESEGMENT2D] = (d) => {
+  return IfcTransitionCurveSegment2D.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTRANSPORTELEMENT] = (d) => {
+  return IfcTransportElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTRANSPORTELEMENTTYPE] = (d) => {
+  return IfcTransportElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTRAPEZIUMPROFILEDEF] = (d) => {
+  return IfcTrapeziumProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTRIANGULATEDFACESET] = (d) => {
+  return IfcTriangulatedFaceSet.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTRIANGULATEDIRREGULARNETWORK] = (d) => {
+  return IfcTriangulatedIrregularNetwork.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTRIMMEDCURVE] = (d) => {
+  return IfcTrimmedCurve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTUBEBUNDLE] = (d) => {
+  return IfcTubeBundle.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTUBEBUNDLETYPE] = (d) => {
+  return IfcTubeBundleType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTYPEOBJECT] = (d) => {
+  return IfcTypeObject.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTYPEPROCESS] = (d) => {
+  return IfcTypeProcess.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTYPEPRODUCT] = (d) => {
+  return IfcTypeProduct.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCTYPERESOURCE] = (d) => {
+  return IfcTypeResource.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCUSHAPEPROFILEDEF] = (d) => {
+  return IfcUShapeProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCUNITASSIGNMENT] = (d) => {
+  return IfcUnitAssignment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCUNITARYCONTROLELEMENT] = (d) => {
+  return IfcUnitaryControlElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCUNITARYCONTROLELEMENTTYPE] = (d) => {
+  return IfcUnitaryControlElementType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCUNITARYEQUIPMENT] = (d) => {
+  return IfcUnitaryEquipment.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCUNITARYEQUIPMENTTYPE] = (d) => {
+  return IfcUnitaryEquipmentType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVALVE] = (d) => {
+  return IfcValve.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVALVETYPE] = (d) => {
+  return IfcValveType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVECTOR] = (d) => {
+  return IfcVector.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVERTEX] = (d) => {
+  return IfcVertex.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVERTEXLOOP] = (d) => {
+  return IfcVertexLoop.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVERTEXPOINT] = (d) => {
+  return IfcVertexPoint.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVIBRATIONDAMPER] = (d) => {
+  return IfcVibrationDamper.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVIBRATIONDAMPERTYPE] = (d) => {
+  return IfcVibrationDamperType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVIBRATIONISOLATOR] = (d) => {
+  return IfcVibrationIsolator.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVIBRATIONISOLATORTYPE] = (d) => {
+  return IfcVibrationIsolatorType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVIRTUALELEMENT] = (d) => {
+  return IfcVirtualElement.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVIRTUALGRIDINTERSECTION] = (d) => {
+  return IfcVirtualGridIntersection.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCVOIDINGFEATURE] = (d) => {
+  return IfcVoidingFeature.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWALL] = (d) => {
+  return IfcWall.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWALLELEMENTEDCASE] = (d) => {
+  return IfcWallElementedCase.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWALLSTANDARDCASE] = (d) => {
+  return IfcWallStandardCase.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWALLTYPE] = (d) => {
+  return IfcWallType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWASTETERMINAL] = (d) => {
+  return IfcWasteTerminal.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWASTETERMINALTYPE] = (d) => {
+  return IfcWasteTerminalType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWINDOW] = (d) => {
+  return IfcWindow.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWINDOWLININGPROPERTIES] = (d) => {
+  return IfcWindowLiningProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWINDOWPANELPROPERTIES] = (d) => {
+  return IfcWindowPanelProperties.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWINDOWSTANDARDCASE] = (d) => {
+  return IfcWindowStandardCase.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWINDOWSTYLE] = (d) => {
+  return IfcWindowStyle.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWINDOWTYPE] = (d) => {
+  return IfcWindowType.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWORKCALENDAR] = (d) => {
+  return IfcWorkCalendar.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWORKCONTROL] = (d) => {
+  return IfcWorkControl.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWORKPLAN] = (d) => {
+  return IfcWorkPlan.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWORKSCHEDULE] = (d) => {
+  return IfcWorkSchedule.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCWORKTIME] = (d) => {
+  return IfcWorkTime.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCZSHAPEPROFILEDEF] = (d) => {
+  return IfcZShapeProfileDef.FromTape(d.ID, d.type, d.arguments);
+};
+FromRawLineData[IFCZONE] = (d) => {
+  return IfcZone.FromTape(d.ID, d.type, d.arguments);
+};
+var Handle = class {
+  constructor(id) {
+    this.value = id;
+  }
+  toTape(args) {
+    args.push({type: 5, value: this.value});
+  }
+};
+function Value(type, value) {
+  return {t: type, v: value};
+}
+var IfcAbsorbedDoseMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcAccelerationMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcAmountOfSubstanceMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcAngularVelocityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcAreaDensityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcAreaMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcBinary = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcBoolean = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcBoxAlignment = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcCardinalPointReference = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcContextDependentMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcCountMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcCurvatureMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcDate = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcDateTime = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcDayInMonthNumber = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcDayInWeekNumber = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcDescriptiveMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcDimensionCount = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcDoseEquivalentMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcDuration = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcDynamicViscosityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcElectricCapacitanceMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcElectricChargeMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcElectricConductanceMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcElectricCurrentMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcElectricResistanceMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcElectricVoltageMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcEnergyMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcFontStyle = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcFontVariant = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcFontWeight = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcForceMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcFrequencyMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcGloballyUniqueId = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcHeatFluxDensityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcHeatingValueMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcIdentifier = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcIlluminanceMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcInductanceMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcInteger = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcIntegerCountRateMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcIonConcentrationMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcIsothermalMoistureCapacityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcKinematicViscosityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcLabel = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcLanguageId = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcLengthMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcLinearForceMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcLinearMomentMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcLinearStiffnessMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcLinearVelocityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcLogical = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcLuminousFluxMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcLuminousIntensityDistributionMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcLuminousIntensityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcMagneticFluxDensityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcMagneticFluxMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcMassDensityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcMassFlowRateMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcMassMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcMassPerLengthMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcModulusOfElasticityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcModulusOfLinearSubgradeReactionMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcModulusOfRotationalSubgradeReactionMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcModulusOfSubgradeReactionMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcMoistureDiffusivityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcMolecularWeightMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcMomentOfInertiaMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcMonetaryMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcMonthInYearNumber = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcNonNegativeLengthMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcNormalisedRatioMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcNumericMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcPHMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcParameterValue = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcPlanarForceMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcPlaneAngleMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcPositiveInteger = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcPositiveLengthMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcPositivePlaneAngleMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcPositiveRatioMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcPowerMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcPresentableText = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcPressureMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcRadioActivityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcRatioMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcReal = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcRotationalFrequencyMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcRotationalMassMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcRotationalStiffnessMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcSectionModulusMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcSectionalAreaIntegralMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcShearModulusMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcSolidAngleMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcSoundPowerLevelMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcSoundPowerMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcSoundPressureLevelMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcSoundPressureMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcSpecificHeatCapacityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcSpecularExponent = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcSpecularRoughness = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcTemperatureGradientMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcTemperatureRateOfChangeMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcText = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcTextAlignment = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcTextDecoration = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcTextFontName = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcTextTransformation = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcThermalAdmittanceMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcThermalConductivityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcThermalExpansionCoefficientMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcThermalResistanceMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcThermalTransmittanceMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcThermodynamicTemperatureMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcTime = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcTimeMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcTimeStamp = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcTorqueMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcURIReference = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcVaporPermeabilityMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcVolumeMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcVolumetricFlowRateMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcWarpingConstantMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcWarpingMomentMeasure = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+var IfcActionRequestTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcActionRequestTypeEnum.EMAIL = "EMAIL";
+IfcActionRequestTypeEnum.FAX = "FAX";
+IfcActionRequestTypeEnum.PHONE = "PHONE";
+IfcActionRequestTypeEnum.POST = "POST";
+IfcActionRequestTypeEnum.VERBAL = "VERBAL";
+IfcActionRequestTypeEnum.USERDEFINED = "USERDEFINED";
+IfcActionRequestTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcActionSourceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcActionSourceTypeEnum.DEAD_LOAD_G = "DEAD_LOAD_G";
+IfcActionSourceTypeEnum.COMPLETION_G1 = "COMPLETION_G1";
+IfcActionSourceTypeEnum.LIVE_LOAD_Q = "LIVE_LOAD_Q";
+IfcActionSourceTypeEnum.SNOW_S = "SNOW_S";
+IfcActionSourceTypeEnum.WIND_W = "WIND_W";
+IfcActionSourceTypeEnum.PRESTRESSING_P = "PRESTRESSING_P";
+IfcActionSourceTypeEnum.SETTLEMENT_U = "SETTLEMENT_U";
+IfcActionSourceTypeEnum.TEMPERATURE_T = "TEMPERATURE_T";
+IfcActionSourceTypeEnum.EARTHQUAKE_E = "EARTHQUAKE_E";
+IfcActionSourceTypeEnum.FIRE = "FIRE";
+IfcActionSourceTypeEnum.IMPULSE = "IMPULSE";
+IfcActionSourceTypeEnum.IMPACT = "IMPACT";
+IfcActionSourceTypeEnum.TRANSPORT = "TRANSPORT";
+IfcActionSourceTypeEnum.ERECTION = "ERECTION";
+IfcActionSourceTypeEnum.PROPPING = "PROPPING";
+IfcActionSourceTypeEnum.SYSTEM_IMPERFECTION = "SYSTEM_IMPERFECTION";
+IfcActionSourceTypeEnum.SHRINKAGE = "SHRINKAGE";
+IfcActionSourceTypeEnum.CREEP = "CREEP";
+IfcActionSourceTypeEnum.LACK_OF_FIT = "LACK_OF_FIT";
+IfcActionSourceTypeEnum.BUOYANCY = "BUOYANCY";
+IfcActionSourceTypeEnum.ICE = "ICE";
+IfcActionSourceTypeEnum.CURRENT = "CURRENT";
+IfcActionSourceTypeEnum.WAVE = "WAVE";
+IfcActionSourceTypeEnum.RAIN = "RAIN";
+IfcActionSourceTypeEnum.BRAKES = "BRAKES";
+IfcActionSourceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcActionSourceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcActionTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcActionTypeEnum.PERMANENT_G = "PERMANENT_G";
+IfcActionTypeEnum.VARIABLE_Q = "VARIABLE_Q";
+IfcActionTypeEnum.EXTRAORDINARY_A = "EXTRAORDINARY_A";
+IfcActionTypeEnum.USERDEFINED = "USERDEFINED";
+IfcActionTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcActuatorTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcActuatorTypeEnum.ELECTRICACTUATOR = "ELECTRICACTUATOR";
+IfcActuatorTypeEnum.HANDOPERATEDACTUATOR = "HANDOPERATEDACTUATOR";
+IfcActuatorTypeEnum.HYDRAULICACTUATOR = "HYDRAULICACTUATOR";
+IfcActuatorTypeEnum.PNEUMATICACTUATOR = "PNEUMATICACTUATOR";
+IfcActuatorTypeEnum.THERMOSTATICACTUATOR = "THERMOSTATICACTUATOR";
+IfcActuatorTypeEnum.USERDEFINED = "USERDEFINED";
+IfcActuatorTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcAddressTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcAddressTypeEnum.OFFICE = "OFFICE";
+IfcAddressTypeEnum.SITE = "SITE";
+IfcAddressTypeEnum.HOME = "HOME";
+IfcAddressTypeEnum.DISTRIBUTIONPOINT = "DISTRIBUTIONPOINT";
+IfcAddressTypeEnum.USERDEFINED = "USERDEFINED";
+var IfcAirTerminalBoxTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcAirTerminalBoxTypeEnum.CONSTANTFLOW = "CONSTANTFLOW";
+IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREDEPENDANT = "VARIABLEFLOWPRESSUREDEPENDANT";
+IfcAirTerminalBoxTypeEnum.VARIABLEFLOWPRESSUREINDEPENDANT = "VARIABLEFLOWPRESSUREINDEPENDANT";
+IfcAirTerminalBoxTypeEnum.USERDEFINED = "USERDEFINED";
+IfcAirTerminalBoxTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcAirTerminalTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcAirTerminalTypeEnum.DIFFUSER = "DIFFUSER";
+IfcAirTerminalTypeEnum.GRILLE = "GRILLE";
+IfcAirTerminalTypeEnum.LOUVRE = "LOUVRE";
+IfcAirTerminalTypeEnum.REGISTER = "REGISTER";
+IfcAirTerminalTypeEnum.USERDEFINED = "USERDEFINED";
+IfcAirTerminalTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcAirToAirHeatRecoveryTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECOUNTERFLOWEXCHANGER = "FIXEDPLATECOUNTERFLOWEXCHANGER";
+IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATECROSSFLOWEXCHANGER = "FIXEDPLATECROSSFLOWEXCHANGER";
+IfcAirToAirHeatRecoveryTypeEnum.FIXEDPLATEPARALLELFLOWEXCHANGER = "FIXEDPLATEPARALLELFLOWEXCHANGER";
+IfcAirToAirHeatRecoveryTypeEnum.ROTARYWHEEL = "ROTARYWHEEL";
+IfcAirToAirHeatRecoveryTypeEnum.RUNAROUNDCOILLOOP = "RUNAROUNDCOILLOOP";
+IfcAirToAirHeatRecoveryTypeEnum.HEATPIPE = "HEATPIPE";
+IfcAirToAirHeatRecoveryTypeEnum.TWINTOWERENTHALPYRECOVERYLOOPS = "TWINTOWERENTHALPYRECOVERYLOOPS";
+IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONSEALEDTUBEHEATEXCHANGERS = "THERMOSIPHONSEALEDTUBEHEATEXCHANGERS";
+IfcAirToAirHeatRecoveryTypeEnum.THERMOSIPHONCOILTYPEHEATEXCHANGERS = "THERMOSIPHONCOILTYPEHEATEXCHANGERS";
+IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED = "USERDEFINED";
+IfcAirToAirHeatRecoveryTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcAlarmTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcAlarmTypeEnum.BELL = "BELL";
+IfcAlarmTypeEnum.BREAKGLASSBUTTON = "BREAKGLASSBUTTON";
+IfcAlarmTypeEnum.LIGHT = "LIGHT";
+IfcAlarmTypeEnum.MANUALPULLBOX = "MANUALPULLBOX";
+IfcAlarmTypeEnum.SIREN = "SIREN";
+IfcAlarmTypeEnum.WHISTLE = "WHISTLE";
+IfcAlarmTypeEnum.USERDEFINED = "USERDEFINED";
+IfcAlarmTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcAlignmentTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcAlignmentTypeEnum.USERDEFINED = "USERDEFINED";
+IfcAlignmentTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcAnalysisModelTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcAnalysisModelTypeEnum.IN_PLANE_LOADING_2D = "IN_PLANE_LOADING_2D";
+IfcAnalysisModelTypeEnum.OUT_PLANE_LOADING_2D = "OUT_PLANE_LOADING_2D";
+IfcAnalysisModelTypeEnum.LOADING_3D = "LOADING_3D";
+IfcAnalysisModelTypeEnum.USERDEFINED = "USERDEFINED";
+IfcAnalysisModelTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcAnalysisTheoryTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcAnalysisTheoryTypeEnum.FIRST_ORDER_THEORY = "FIRST_ORDER_THEORY";
+IfcAnalysisTheoryTypeEnum.SECOND_ORDER_THEORY = "SECOND_ORDER_THEORY";
+IfcAnalysisTheoryTypeEnum.THIRD_ORDER_THEORY = "THIRD_ORDER_THEORY";
+IfcAnalysisTheoryTypeEnum.FULL_NONLINEAR_THEORY = "FULL_NONLINEAR_THEORY";
+IfcAnalysisTheoryTypeEnum.USERDEFINED = "USERDEFINED";
+IfcAnalysisTheoryTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcArithmeticOperatorEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcArithmeticOperatorEnum.ADD = "ADD";
+IfcArithmeticOperatorEnum.DIVIDE = "DIVIDE";
+IfcArithmeticOperatorEnum.MULTIPLY = "MULTIPLY";
+IfcArithmeticOperatorEnum.SUBTRACT = "SUBTRACT";
+var IfcAssemblyPlaceEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcAssemblyPlaceEnum.SITE = "SITE";
+IfcAssemblyPlaceEnum.FACTORY = "FACTORY";
+IfcAssemblyPlaceEnum.NOTDEFINED = "NOTDEFINED";
+var IfcAudioVisualApplianceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcAudioVisualApplianceTypeEnum.AMPLIFIER = "AMPLIFIER";
+IfcAudioVisualApplianceTypeEnum.CAMERA = "CAMERA";
+IfcAudioVisualApplianceTypeEnum.DISPLAY = "DISPLAY";
+IfcAudioVisualApplianceTypeEnum.MICROPHONE = "MICROPHONE";
+IfcAudioVisualApplianceTypeEnum.PLAYER = "PLAYER";
+IfcAudioVisualApplianceTypeEnum.PROJECTOR = "PROJECTOR";
+IfcAudioVisualApplianceTypeEnum.RECEIVER = "RECEIVER";
+IfcAudioVisualApplianceTypeEnum.SPEAKER = "SPEAKER";
+IfcAudioVisualApplianceTypeEnum.SWITCHER = "SWITCHER";
+IfcAudioVisualApplianceTypeEnum.TELEPHONE = "TELEPHONE";
+IfcAudioVisualApplianceTypeEnum.TUNER = "TUNER";
+IfcAudioVisualApplianceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcAudioVisualApplianceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcBSplineCurveForm = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBSplineCurveForm.POLYLINE_FORM = "POLYLINE_FORM";
+IfcBSplineCurveForm.CIRCULAR_ARC = "CIRCULAR_ARC";
+IfcBSplineCurveForm.ELLIPTIC_ARC = "ELLIPTIC_ARC";
+IfcBSplineCurveForm.PARABOLIC_ARC = "PARABOLIC_ARC";
+IfcBSplineCurveForm.HYPERBOLIC_ARC = "HYPERBOLIC_ARC";
+IfcBSplineCurveForm.UNSPECIFIED = "UNSPECIFIED";
+var IfcBSplineSurfaceForm = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBSplineSurfaceForm.PLANE_SURF = "PLANE_SURF";
+IfcBSplineSurfaceForm.CYLINDRICAL_SURF = "CYLINDRICAL_SURF";
+IfcBSplineSurfaceForm.CONICAL_SURF = "CONICAL_SURF";
+IfcBSplineSurfaceForm.SPHERICAL_SURF = "SPHERICAL_SURF";
+IfcBSplineSurfaceForm.TOROIDAL_SURF = "TOROIDAL_SURF";
+IfcBSplineSurfaceForm.SURF_OF_REVOLUTION = "SURF_OF_REVOLUTION";
+IfcBSplineSurfaceForm.RULED_SURF = "RULED_SURF";
+IfcBSplineSurfaceForm.GENERALISED_CONE = "GENERALISED_CONE";
+IfcBSplineSurfaceForm.QUADRIC_SURF = "QUADRIC_SURF";
+IfcBSplineSurfaceForm.SURF_OF_LINEAR_EXTRUSION = "SURF_OF_LINEAR_EXTRUSION";
+IfcBSplineSurfaceForm.UNSPECIFIED = "UNSPECIFIED";
+var IfcBeamTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBeamTypeEnum.BEAM = "BEAM";
+IfcBeamTypeEnum.JOIST = "JOIST";
+IfcBeamTypeEnum.HOLLOWCORE = "HOLLOWCORE";
+IfcBeamTypeEnum.LINTEL = "LINTEL";
+IfcBeamTypeEnum.SPANDREL = "SPANDREL";
+IfcBeamTypeEnum.T_BEAM = "T_BEAM";
+IfcBeamTypeEnum.GIRDER_SEGMENT = "GIRDER_SEGMENT";
+IfcBeamTypeEnum.DIAPHRAGM = "DIAPHRAGM";
+IfcBeamTypeEnum.PIERCAP = "PIERCAP";
+IfcBeamTypeEnum.HATSTONE = "HATSTONE";
+IfcBeamTypeEnum.CORNICE = "CORNICE";
+IfcBeamTypeEnum.EDGEBEAM = "EDGEBEAM";
+IfcBeamTypeEnum.USERDEFINED = "USERDEFINED";
+IfcBeamTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcBearingTypeDisplacementEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBearingTypeDisplacementEnum.FIXED_MOVEMENT = "FIXED_MOVEMENT";
+IfcBearingTypeDisplacementEnum.GUIDED_LONGITUDINAL = "GUIDED_LONGITUDINAL";
+IfcBearingTypeDisplacementEnum.GUIDED_TRANSVERSAL = "GUIDED_TRANSVERSAL";
+IfcBearingTypeDisplacementEnum.FREE_MOVEMENT = "FREE_MOVEMENT";
+IfcBearingTypeDisplacementEnum.NOTDEFINED = "NOTDEFINED";
+var IfcBearingTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBearingTypeEnum.CYLINDRICAL = "CYLINDRICAL";
+IfcBearingTypeEnum.SPHERICAL = "SPHERICAL";
+IfcBearingTypeEnum.ELASTOMERIC = "ELASTOMERIC";
+IfcBearingTypeEnum.POT = "POT";
+IfcBearingTypeEnum.GUIDE = "GUIDE";
+IfcBearingTypeEnum.ROCKER = "ROCKER";
+IfcBearingTypeEnum.ROLLER = "ROLLER";
+IfcBearingTypeEnum.DISK = "DISK";
+IfcBearingTypeEnum.USERDEFINED = "USERDEFINED";
+IfcBearingTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcBenchmarkEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBenchmarkEnum.GREATERTHAN = "GREATERTHAN";
+IfcBenchmarkEnum.GREATERTHANOREQUALTO = "GREATERTHANOREQUALTO";
+IfcBenchmarkEnum.LESSTHAN = "LESSTHAN";
+IfcBenchmarkEnum.LESSTHANOREQUALTO = "LESSTHANOREQUALTO";
+IfcBenchmarkEnum.EQUALTO = "EQUALTO";
+IfcBenchmarkEnum.NOTEQUALTO = "NOTEQUALTO";
+IfcBenchmarkEnum.INCLUDES = "INCLUDES";
+IfcBenchmarkEnum.NOTINCLUDES = "NOTINCLUDES";
+IfcBenchmarkEnum.INCLUDEDIN = "INCLUDEDIN";
+IfcBenchmarkEnum.NOTINCLUDEDIN = "NOTINCLUDEDIN";
+var IfcBoilerTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBoilerTypeEnum.WATER = "WATER";
+IfcBoilerTypeEnum.STEAM = "STEAM";
+IfcBoilerTypeEnum.USERDEFINED = "USERDEFINED";
+IfcBoilerTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcBooleanOperator = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBooleanOperator.UNION = "UNION";
+IfcBooleanOperator.INTERSECTION = "INTERSECTION";
+IfcBooleanOperator.DIFFERENCE = "DIFFERENCE";
+var IfcBridgePartTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBridgePartTypeEnum.ABUTMENT = "ABUTMENT";
+IfcBridgePartTypeEnum.DECK = "DECK";
+IfcBridgePartTypeEnum.DECK_SEGMENT = "DECK_SEGMENT";
+IfcBridgePartTypeEnum.FOUNDATION = "FOUNDATION";
+IfcBridgePartTypeEnum.PIER = "PIER";
+IfcBridgePartTypeEnum.PIER_SEGMENT = "PIER_SEGMENT";
+IfcBridgePartTypeEnum.PYLON = "PYLON";
+IfcBridgePartTypeEnum.SUBSTRUCTURE = "SUBSTRUCTURE";
+IfcBridgePartTypeEnum.SUPERSTRUCTURE = "SUPERSTRUCTURE";
+IfcBridgePartTypeEnum.SURFACESTRUCTURE = "SURFACESTRUCTURE";
+IfcBridgePartTypeEnum.USERDEFINED = "USERDEFINED";
+IfcBridgePartTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcBridgeTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBridgeTypeEnum.ARCHED = "ARCHED";
+IfcBridgeTypeEnum.CABLE_STAYED = "CABLE_STAYED";
+IfcBridgeTypeEnum.CANTILEVER = "CANTILEVER";
+IfcBridgeTypeEnum.CULVERT = "CULVERT";
+IfcBridgeTypeEnum.FRAMEWORK = "FRAMEWORK";
+IfcBridgeTypeEnum.GIRDER = "GIRDER";
+IfcBridgeTypeEnum.SUSPENSION = "SUSPENSION";
+IfcBridgeTypeEnum.TRUSS = "TRUSS";
+IfcBridgeTypeEnum.USERDEFINED = "USERDEFINED";
+IfcBridgeTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcBuildingElementPartTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBuildingElementPartTypeEnum.INSULATION = "INSULATION";
+IfcBuildingElementPartTypeEnum.PRECASTPANEL = "PRECASTPANEL";
+IfcBuildingElementPartTypeEnum.APRON = "APRON";
+IfcBuildingElementPartTypeEnum.USERDEFINED = "USERDEFINED";
+IfcBuildingElementPartTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcBuildingElementProxyTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBuildingElementProxyTypeEnum.COMPLEX = "COMPLEX";
+IfcBuildingElementProxyTypeEnum.ELEMENT = "ELEMENT";
+IfcBuildingElementProxyTypeEnum.PARTIAL = "PARTIAL";
+IfcBuildingElementProxyTypeEnum.PROVISIONFORVOID = "PROVISIONFORVOID";
+IfcBuildingElementProxyTypeEnum.PROVISIONFORSPACE = "PROVISIONFORSPACE";
+IfcBuildingElementProxyTypeEnum.USERDEFINED = "USERDEFINED";
+IfcBuildingElementProxyTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcBuildingSystemTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBuildingSystemTypeEnum.FENESTRATION = "FENESTRATION";
+IfcBuildingSystemTypeEnum.FOUNDATION = "FOUNDATION";
+IfcBuildingSystemTypeEnum.LOADBEARING = "LOADBEARING";
+IfcBuildingSystemTypeEnum.OUTERSHELL = "OUTERSHELL";
+IfcBuildingSystemTypeEnum.SHADING = "SHADING";
+IfcBuildingSystemTypeEnum.TRANSPORT = "TRANSPORT";
+IfcBuildingSystemTypeEnum.REINFORCING = "REINFORCING";
+IfcBuildingSystemTypeEnum.PRESTRESSING = "PRESTRESSING";
+IfcBuildingSystemTypeEnum.USERDEFINED = "USERDEFINED";
+IfcBuildingSystemTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcBurnerTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcBurnerTypeEnum.USERDEFINED = "USERDEFINED";
+IfcBurnerTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCableCarrierFittingTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCableCarrierFittingTypeEnum.BEND = "BEND";
+IfcCableCarrierFittingTypeEnum.CROSS = "CROSS";
+IfcCableCarrierFittingTypeEnum.REDUCER = "REDUCER";
+IfcCableCarrierFittingTypeEnum.TEE = "TEE";
+IfcCableCarrierFittingTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCableCarrierFittingTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCableCarrierSegmentTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT = "CABLELADDERSEGMENT";
+IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT = "CABLETRAYSEGMENT";
+IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT = "CABLETRUNKINGSEGMENT";
+IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT = "CONDUITSEGMENT";
+IfcCableCarrierSegmentTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCableCarrierSegmentTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCableFittingTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCableFittingTypeEnum.CONNECTOR = "CONNECTOR";
+IfcCableFittingTypeEnum.ENTRY = "ENTRY";
+IfcCableFittingTypeEnum.EXIT = "EXIT";
+IfcCableFittingTypeEnum.JUNCTION = "JUNCTION";
+IfcCableFittingTypeEnum.TRANSITION = "TRANSITION";
+IfcCableFittingTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCableFittingTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCableSegmentTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCableSegmentTypeEnum.BUSBARSEGMENT = "BUSBARSEGMENT";
+IfcCableSegmentTypeEnum.CABLESEGMENT = "CABLESEGMENT";
+IfcCableSegmentTypeEnum.CONDUCTORSEGMENT = "CONDUCTORSEGMENT";
+IfcCableSegmentTypeEnum.CORESEGMENT = "CORESEGMENT";
+IfcCableSegmentTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCableSegmentTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCaissonFoundationTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCaissonFoundationTypeEnum.WELL = "WELL";
+IfcCaissonFoundationTypeEnum.CAISSON = "CAISSON";
+IfcCaissonFoundationTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCaissonFoundationTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcChangeActionEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcChangeActionEnum.NOCHANGE = "NOCHANGE";
+IfcChangeActionEnum.MODIFIED = "MODIFIED";
+IfcChangeActionEnum.ADDED = "ADDED";
+IfcChangeActionEnum.DELETED = "DELETED";
+IfcChangeActionEnum.NOTDEFINED = "NOTDEFINED";
+var IfcChillerTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcChillerTypeEnum.AIRCOOLED = "AIRCOOLED";
+IfcChillerTypeEnum.WATERCOOLED = "WATERCOOLED";
+IfcChillerTypeEnum.HEATRECOVERY = "HEATRECOVERY";
+IfcChillerTypeEnum.USERDEFINED = "USERDEFINED";
+IfcChillerTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcChimneyTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcChimneyTypeEnum.USERDEFINED = "USERDEFINED";
+IfcChimneyTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCoilTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCoilTypeEnum.DXCOOLINGCOIL = "DXCOOLINGCOIL";
+IfcCoilTypeEnum.ELECTRICHEATINGCOIL = "ELECTRICHEATINGCOIL";
+IfcCoilTypeEnum.GASHEATINGCOIL = "GASHEATINGCOIL";
+IfcCoilTypeEnum.HYDRONICCOIL = "HYDRONICCOIL";
+IfcCoilTypeEnum.STEAMHEATINGCOIL = "STEAMHEATINGCOIL";
+IfcCoilTypeEnum.WATERCOOLINGCOIL = "WATERCOOLINGCOIL";
+IfcCoilTypeEnum.WATERHEATINGCOIL = "WATERHEATINGCOIL";
+IfcCoilTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCoilTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcColumnTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcColumnTypeEnum.COLUMN = "COLUMN";
+IfcColumnTypeEnum.PILASTER = "PILASTER";
+IfcColumnTypeEnum.PIERSTEM = "PIERSTEM";
+IfcColumnTypeEnum.PIERSTEM_SEGMENT = "PIERSTEM_SEGMENT";
+IfcColumnTypeEnum.STANDCOLUMN = "STANDCOLUMN";
+IfcColumnTypeEnum.USERDEFINED = "USERDEFINED";
+IfcColumnTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCommunicationsApplianceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCommunicationsApplianceTypeEnum.ANTENNA = "ANTENNA";
+IfcCommunicationsApplianceTypeEnum.COMPUTER = "COMPUTER";
+IfcCommunicationsApplianceTypeEnum.FAX = "FAX";
+IfcCommunicationsApplianceTypeEnum.GATEWAY = "GATEWAY";
+IfcCommunicationsApplianceTypeEnum.MODEM = "MODEM";
+IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE = "NETWORKAPPLIANCE";
+IfcCommunicationsApplianceTypeEnum.NETWORKBRIDGE = "NETWORKBRIDGE";
+IfcCommunicationsApplianceTypeEnum.NETWORKHUB = "NETWORKHUB";
+IfcCommunicationsApplianceTypeEnum.PRINTER = "PRINTER";
+IfcCommunicationsApplianceTypeEnum.REPEATER = "REPEATER";
+IfcCommunicationsApplianceTypeEnum.ROUTER = "ROUTER";
+IfcCommunicationsApplianceTypeEnum.SCANNER = "SCANNER";
+IfcCommunicationsApplianceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCommunicationsApplianceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcComplexPropertyTemplateTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcComplexPropertyTemplateTypeEnum.P_COMPLEX = "P_COMPLEX";
+IfcComplexPropertyTemplateTypeEnum.Q_COMPLEX = "Q_COMPLEX";
+var IfcCompressorTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCompressorTypeEnum.DYNAMIC = "DYNAMIC";
+IfcCompressorTypeEnum.RECIPROCATING = "RECIPROCATING";
+IfcCompressorTypeEnum.ROTARY = "ROTARY";
+IfcCompressorTypeEnum.SCROLL = "SCROLL";
+IfcCompressorTypeEnum.TROCHOIDAL = "TROCHOIDAL";
+IfcCompressorTypeEnum.SINGLESTAGE = "SINGLESTAGE";
+IfcCompressorTypeEnum.BOOSTER = "BOOSTER";
+IfcCompressorTypeEnum.OPENTYPE = "OPENTYPE";
+IfcCompressorTypeEnum.HERMETIC = "HERMETIC";
+IfcCompressorTypeEnum.SEMIHERMETIC = "SEMIHERMETIC";
+IfcCompressorTypeEnum.WELDEDSHELLHERMETIC = "WELDEDSHELLHERMETIC";
+IfcCompressorTypeEnum.ROLLINGPISTON = "ROLLINGPISTON";
+IfcCompressorTypeEnum.ROTARYVANE = "ROTARYVANE";
+IfcCompressorTypeEnum.SINGLESCREW = "SINGLESCREW";
+IfcCompressorTypeEnum.TWINSCREW = "TWINSCREW";
+IfcCompressorTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCompressorTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCondenserTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCondenserTypeEnum.AIRCOOLED = "AIRCOOLED";
+IfcCondenserTypeEnum.EVAPORATIVECOOLED = "EVAPORATIVECOOLED";
+IfcCondenserTypeEnum.WATERCOOLED = "WATERCOOLED";
+IfcCondenserTypeEnum.WATERCOOLEDBRAZEDPLATE = "WATERCOOLEDBRAZEDPLATE";
+IfcCondenserTypeEnum.WATERCOOLEDSHELLCOIL = "WATERCOOLEDSHELLCOIL";
+IfcCondenserTypeEnum.WATERCOOLEDSHELLTUBE = "WATERCOOLEDSHELLTUBE";
+IfcCondenserTypeEnum.WATERCOOLEDTUBEINTUBE = "WATERCOOLEDTUBEINTUBE";
+IfcCondenserTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCondenserTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcConnectionTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcConnectionTypeEnum.ATPATH = "ATPATH";
+IfcConnectionTypeEnum.ATSTART = "ATSTART";
+IfcConnectionTypeEnum.ATEND = "ATEND";
+IfcConnectionTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcConstraintEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcConstraintEnum.HARD = "HARD";
+IfcConstraintEnum.SOFT = "SOFT";
+IfcConstraintEnum.ADVISORY = "ADVISORY";
+IfcConstraintEnum.USERDEFINED = "USERDEFINED";
+IfcConstraintEnum.NOTDEFINED = "NOTDEFINED";
+var IfcConstructionEquipmentResourceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcConstructionEquipmentResourceTypeEnum.DEMOLISHING = "DEMOLISHING";
+IfcConstructionEquipmentResourceTypeEnum.EARTHMOVING = "EARTHMOVING";
+IfcConstructionEquipmentResourceTypeEnum.ERECTING = "ERECTING";
+IfcConstructionEquipmentResourceTypeEnum.HEATING = "HEATING";
+IfcConstructionEquipmentResourceTypeEnum.LIGHTING = "LIGHTING";
+IfcConstructionEquipmentResourceTypeEnum.PAVING = "PAVING";
+IfcConstructionEquipmentResourceTypeEnum.PUMPING = "PUMPING";
+IfcConstructionEquipmentResourceTypeEnum.TRANSPORTING = "TRANSPORTING";
+IfcConstructionEquipmentResourceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcConstructionEquipmentResourceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcConstructionMaterialResourceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcConstructionMaterialResourceTypeEnum.AGGREGATES = "AGGREGATES";
+IfcConstructionMaterialResourceTypeEnum.CONCRETE = "CONCRETE";
+IfcConstructionMaterialResourceTypeEnum.DRYWALL = "DRYWALL";
+IfcConstructionMaterialResourceTypeEnum.FUEL = "FUEL";
+IfcConstructionMaterialResourceTypeEnum.GYPSUM = "GYPSUM";
+IfcConstructionMaterialResourceTypeEnum.MASONRY = "MASONRY";
+IfcConstructionMaterialResourceTypeEnum.METAL = "METAL";
+IfcConstructionMaterialResourceTypeEnum.PLASTIC = "PLASTIC";
+IfcConstructionMaterialResourceTypeEnum.WOOD = "WOOD";
+IfcConstructionMaterialResourceTypeEnum.NOTDEFINED = "NOTDEFINED";
+IfcConstructionMaterialResourceTypeEnum.USERDEFINED = "USERDEFINED";
+var IfcConstructionProductResourceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcConstructionProductResourceTypeEnum.ASSEMBLY = "ASSEMBLY";
+IfcConstructionProductResourceTypeEnum.FORMWORK = "FORMWORK";
+IfcConstructionProductResourceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcConstructionProductResourceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcControllerTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcControllerTypeEnum.FLOATING = "FLOATING";
+IfcControllerTypeEnum.PROGRAMMABLE = "PROGRAMMABLE";
+IfcControllerTypeEnum.PROPORTIONAL = "PROPORTIONAL";
+IfcControllerTypeEnum.MULTIPOSITION = "MULTIPOSITION";
+IfcControllerTypeEnum.TWOPOSITION = "TWOPOSITION";
+IfcControllerTypeEnum.USERDEFINED = "USERDEFINED";
+IfcControllerTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCooledBeamTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCooledBeamTypeEnum.ACTIVE = "ACTIVE";
+IfcCooledBeamTypeEnum.PASSIVE = "PASSIVE";
+IfcCooledBeamTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCooledBeamTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCoolingTowerTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCoolingTowerTypeEnum.NATURALDRAFT = "NATURALDRAFT";
+IfcCoolingTowerTypeEnum.MECHANICALINDUCEDDRAFT = "MECHANICALINDUCEDDRAFT";
+IfcCoolingTowerTypeEnum.MECHANICALFORCEDDRAFT = "MECHANICALFORCEDDRAFT";
+IfcCoolingTowerTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCoolingTowerTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCostItemTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCostItemTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCostItemTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCostScheduleTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCostScheduleTypeEnum.BUDGET = "BUDGET";
+IfcCostScheduleTypeEnum.COSTPLAN = "COSTPLAN";
+IfcCostScheduleTypeEnum.ESTIMATE = "ESTIMATE";
+IfcCostScheduleTypeEnum.TENDER = "TENDER";
+IfcCostScheduleTypeEnum.PRICEDBILLOFQUANTITIES = "PRICEDBILLOFQUANTITIES";
+IfcCostScheduleTypeEnum.UNPRICEDBILLOFQUANTITIES = "UNPRICEDBILLOFQUANTITIES";
+IfcCostScheduleTypeEnum.SCHEDULEOFRATES = "SCHEDULEOFRATES";
+IfcCostScheduleTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCostScheduleTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCoveringTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCoveringTypeEnum.CEILING = "CEILING";
+IfcCoveringTypeEnum.FLOORING = "FLOORING";
+IfcCoveringTypeEnum.CLADDING = "CLADDING";
+IfcCoveringTypeEnum.ROOFING = "ROOFING";
+IfcCoveringTypeEnum.MOLDING = "MOLDING";
+IfcCoveringTypeEnum.SKIRTINGBOARD = "SKIRTINGBOARD";
+IfcCoveringTypeEnum.INSULATION = "INSULATION";
+IfcCoveringTypeEnum.MEMBRANE = "MEMBRANE";
+IfcCoveringTypeEnum.SLEEVING = "SLEEVING";
+IfcCoveringTypeEnum.WRAPPING = "WRAPPING";
+IfcCoveringTypeEnum.COPING = "COPING";
+IfcCoveringTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCoveringTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCrewResourceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCrewResourceTypeEnum.OFFICE = "OFFICE";
+IfcCrewResourceTypeEnum.SITE = "SITE";
+IfcCrewResourceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCrewResourceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCurtainWallTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCurtainWallTypeEnum.USERDEFINED = "USERDEFINED";
+IfcCurtainWallTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcCurveInterpolationEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcCurveInterpolationEnum.LINEAR = "LINEAR";
+IfcCurveInterpolationEnum.LOG_LINEAR = "LOG_LINEAR";
+IfcCurveInterpolationEnum.LOG_LOG = "LOG_LOG";
+IfcCurveInterpolationEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDamperTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDamperTypeEnum.BACKDRAFTDAMPER = "BACKDRAFTDAMPER";
+IfcDamperTypeEnum.BALANCINGDAMPER = "BALANCINGDAMPER";
+IfcDamperTypeEnum.BLASTDAMPER = "BLASTDAMPER";
+IfcDamperTypeEnum.CONTROLDAMPER = "CONTROLDAMPER";
+IfcDamperTypeEnum.FIREDAMPER = "FIREDAMPER";
+IfcDamperTypeEnum.FIRESMOKEDAMPER = "FIRESMOKEDAMPER";
+IfcDamperTypeEnum.FUMEHOODEXHAUST = "FUMEHOODEXHAUST";
+IfcDamperTypeEnum.GRAVITYDAMPER = "GRAVITYDAMPER";
+IfcDamperTypeEnum.GRAVITYRELIEFDAMPER = "GRAVITYRELIEFDAMPER";
+IfcDamperTypeEnum.RELIEFDAMPER = "RELIEFDAMPER";
+IfcDamperTypeEnum.SMOKEDAMPER = "SMOKEDAMPER";
+IfcDamperTypeEnum.USERDEFINED = "USERDEFINED";
+IfcDamperTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDataOriginEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDataOriginEnum.MEASURED = "MEASURED";
+IfcDataOriginEnum.PREDICTED = "PREDICTED";
+IfcDataOriginEnum.SIMULATED = "SIMULATED";
+IfcDataOriginEnum.USERDEFINED = "USERDEFINED";
+IfcDataOriginEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDerivedUnitEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDerivedUnitEnum.ANGULARVELOCITYUNIT = "ANGULARVELOCITYUNIT";
+IfcDerivedUnitEnum.AREADENSITYUNIT = "AREADENSITYUNIT";
+IfcDerivedUnitEnum.COMPOUNDPLANEANGLEUNIT = "COMPOUNDPLANEANGLEUNIT";
+IfcDerivedUnitEnum.DYNAMICVISCOSITYUNIT = "DYNAMICVISCOSITYUNIT";
+IfcDerivedUnitEnum.HEATFLUXDENSITYUNIT = "HEATFLUXDENSITYUNIT";
+IfcDerivedUnitEnum.INTEGERCOUNTRATEUNIT = "INTEGERCOUNTRATEUNIT";
+IfcDerivedUnitEnum.ISOTHERMALMOISTURECAPACITYUNIT = "ISOTHERMALMOISTURECAPACITYUNIT";
+IfcDerivedUnitEnum.KINEMATICVISCOSITYUNIT = "KINEMATICVISCOSITYUNIT";
+IfcDerivedUnitEnum.LINEARVELOCITYUNIT = "LINEARVELOCITYUNIT";
+IfcDerivedUnitEnum.MASSDENSITYUNIT = "MASSDENSITYUNIT";
+IfcDerivedUnitEnum.MASSFLOWRATEUNIT = "MASSFLOWRATEUNIT";
+IfcDerivedUnitEnum.MOISTUREDIFFUSIVITYUNIT = "MOISTUREDIFFUSIVITYUNIT";
+IfcDerivedUnitEnum.MOLECULARWEIGHTUNIT = "MOLECULARWEIGHTUNIT";
+IfcDerivedUnitEnum.SPECIFICHEATCAPACITYUNIT = "SPECIFICHEATCAPACITYUNIT";
+IfcDerivedUnitEnum.THERMALADMITTANCEUNIT = "THERMALADMITTANCEUNIT";
+IfcDerivedUnitEnum.THERMALCONDUCTANCEUNIT = "THERMALCONDUCTANCEUNIT";
+IfcDerivedUnitEnum.THERMALRESISTANCEUNIT = "THERMALRESISTANCEUNIT";
+IfcDerivedUnitEnum.THERMALTRANSMITTANCEUNIT = "THERMALTRANSMITTANCEUNIT";
+IfcDerivedUnitEnum.VAPORPERMEABILITYUNIT = "VAPORPERMEABILITYUNIT";
+IfcDerivedUnitEnum.VOLUMETRICFLOWRATEUNIT = "VOLUMETRICFLOWRATEUNIT";
+IfcDerivedUnitEnum.ROTATIONALFREQUENCYUNIT = "ROTATIONALFREQUENCYUNIT";
+IfcDerivedUnitEnum.TORQUEUNIT = "TORQUEUNIT";
+IfcDerivedUnitEnum.MOMENTOFINERTIAUNIT = "MOMENTOFINERTIAUNIT";
+IfcDerivedUnitEnum.LINEARMOMENTUNIT = "LINEARMOMENTUNIT";
+IfcDerivedUnitEnum.LINEARFORCEUNIT = "LINEARFORCEUNIT";
+IfcDerivedUnitEnum.PLANARFORCEUNIT = "PLANARFORCEUNIT";
+IfcDerivedUnitEnum.MODULUSOFELASTICITYUNIT = "MODULUSOFELASTICITYUNIT";
+IfcDerivedUnitEnum.SHEARMODULUSUNIT = "SHEARMODULUSUNIT";
+IfcDerivedUnitEnum.LINEARSTIFFNESSUNIT = "LINEARSTIFFNESSUNIT";
+IfcDerivedUnitEnum.ROTATIONALSTIFFNESSUNIT = "ROTATIONALSTIFFNESSUNIT";
+IfcDerivedUnitEnum.MODULUSOFSUBGRADEREACTIONUNIT = "MODULUSOFSUBGRADEREACTIONUNIT";
+IfcDerivedUnitEnum.ACCELERATIONUNIT = "ACCELERATIONUNIT";
+IfcDerivedUnitEnum.CURVATUREUNIT = "CURVATUREUNIT";
+IfcDerivedUnitEnum.HEATINGVALUEUNIT = "HEATINGVALUEUNIT";
+IfcDerivedUnitEnum.IONCONCENTRATIONUNIT = "IONCONCENTRATIONUNIT";
+IfcDerivedUnitEnum.LUMINOUSINTENSITYDISTRIBUTIONUNIT = "LUMINOUSINTENSITYDISTRIBUTIONUNIT";
+IfcDerivedUnitEnum.MASSPERLENGTHUNIT = "MASSPERLENGTHUNIT";
+IfcDerivedUnitEnum.MODULUSOFLINEARSUBGRADEREACTIONUNIT = "MODULUSOFLINEARSUBGRADEREACTIONUNIT";
+IfcDerivedUnitEnum.MODULUSOFROTATIONALSUBGRADEREACTIONUNIT = "MODULUSOFROTATIONALSUBGRADEREACTIONUNIT";
+IfcDerivedUnitEnum.PHUNIT = "PHUNIT";
+IfcDerivedUnitEnum.ROTATIONALMASSUNIT = "ROTATIONALMASSUNIT";
+IfcDerivedUnitEnum.SECTIONAREAINTEGRALUNIT = "SECTIONAREAINTEGRALUNIT";
+IfcDerivedUnitEnum.SECTIONMODULUSUNIT = "SECTIONMODULUSUNIT";
+IfcDerivedUnitEnum.SOUNDPOWERLEVELUNIT = "SOUNDPOWERLEVELUNIT";
+IfcDerivedUnitEnum.SOUNDPOWERUNIT = "SOUNDPOWERUNIT";
+IfcDerivedUnitEnum.SOUNDPRESSURELEVELUNIT = "SOUNDPRESSURELEVELUNIT";
+IfcDerivedUnitEnum.SOUNDPRESSUREUNIT = "SOUNDPRESSUREUNIT";
+IfcDerivedUnitEnum.TEMPERATUREGRADIENTUNIT = "TEMPERATUREGRADIENTUNIT";
+IfcDerivedUnitEnum.TEMPERATURERATEOFCHANGEUNIT = "TEMPERATURERATEOFCHANGEUNIT";
+IfcDerivedUnitEnum.THERMALEXPANSIONCOEFFICIENTUNIT = "THERMALEXPANSIONCOEFFICIENTUNIT";
+IfcDerivedUnitEnum.WARPINGCONSTANTUNIT = "WARPINGCONSTANTUNIT";
+IfcDerivedUnitEnum.WARPINGMOMENTUNIT = "WARPINGMOMENTUNIT";
+IfcDerivedUnitEnum.USERDEFINED = "USERDEFINED";
+var IfcDirectionSenseEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDirectionSenseEnum.POSITIVE = "POSITIVE";
+IfcDirectionSenseEnum.NEGATIVE = "NEGATIVE";
+var IfcDiscreteAccessoryTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDiscreteAccessoryTypeEnum.ANCHORPLATE = "ANCHORPLATE";
+IfcDiscreteAccessoryTypeEnum.BRACKET = "BRACKET";
+IfcDiscreteAccessoryTypeEnum.SHOE = "SHOE";
+IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE = "EXPANSION_JOINT_DEVICE";
+IfcDiscreteAccessoryTypeEnum.USERDEFINED = "USERDEFINED";
+IfcDiscreteAccessoryTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDistributionChamberElementTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDistributionChamberElementTypeEnum.FORMEDDUCT = "FORMEDDUCT";
+IfcDistributionChamberElementTypeEnum.INSPECTIONCHAMBER = "INSPECTIONCHAMBER";
+IfcDistributionChamberElementTypeEnum.INSPECTIONPIT = "INSPECTIONPIT";
+IfcDistributionChamberElementTypeEnum.MANHOLE = "MANHOLE";
+IfcDistributionChamberElementTypeEnum.METERCHAMBER = "METERCHAMBER";
+IfcDistributionChamberElementTypeEnum.SUMP = "SUMP";
+IfcDistributionChamberElementTypeEnum.TRENCH = "TRENCH";
+IfcDistributionChamberElementTypeEnum.VALVECHAMBER = "VALVECHAMBER";
+IfcDistributionChamberElementTypeEnum.USERDEFINED = "USERDEFINED";
+IfcDistributionChamberElementTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDistributionPortTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDistributionPortTypeEnum.CABLE = "CABLE";
+IfcDistributionPortTypeEnum.CABLECARRIER = "CABLECARRIER";
+IfcDistributionPortTypeEnum.DUCT = "DUCT";
+IfcDistributionPortTypeEnum.PIPE = "PIPE";
+IfcDistributionPortTypeEnum.USERDEFINED = "USERDEFINED";
+IfcDistributionPortTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDistributionSystemEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDistributionSystemEnum.AIRCONDITIONING = "AIRCONDITIONING";
+IfcDistributionSystemEnum.AUDIOVISUAL = "AUDIOVISUAL";
+IfcDistributionSystemEnum.CHEMICAL = "CHEMICAL";
+IfcDistributionSystemEnum.CHILLEDWATER = "CHILLEDWATER";
+IfcDistributionSystemEnum.COMMUNICATION = "COMMUNICATION";
+IfcDistributionSystemEnum.COMPRESSEDAIR = "COMPRESSEDAIR";
+IfcDistributionSystemEnum.CONDENSERWATER = "CONDENSERWATER";
+IfcDistributionSystemEnum.CONTROL = "CONTROL";
+IfcDistributionSystemEnum.CONVEYING = "CONVEYING";
+IfcDistributionSystemEnum.DATA = "DATA";
+IfcDistributionSystemEnum.DISPOSAL = "DISPOSAL";
+IfcDistributionSystemEnum.DOMESTICCOLDWATER = "DOMESTICCOLDWATER";
+IfcDistributionSystemEnum.DOMESTICHOTWATER = "DOMESTICHOTWATER";
+IfcDistributionSystemEnum.DRAINAGE = "DRAINAGE";
+IfcDistributionSystemEnum.EARTHING = "EARTHING";
+IfcDistributionSystemEnum.ELECTRICAL = "ELECTRICAL";
+IfcDistributionSystemEnum.ELECTROACOUSTIC = "ELECTROACOUSTIC";
+IfcDistributionSystemEnum.EXHAUST = "EXHAUST";
+IfcDistributionSystemEnum.FIREPROTECTION = "FIREPROTECTION";
+IfcDistributionSystemEnum.FUEL = "FUEL";
+IfcDistributionSystemEnum.GAS = "GAS";
+IfcDistributionSystemEnum.HAZARDOUS = "HAZARDOUS";
+IfcDistributionSystemEnum.HEATING = "HEATING";
+IfcDistributionSystemEnum.LIGHTING = "LIGHTING";
+IfcDistributionSystemEnum.LIGHTNINGPROTECTION = "LIGHTNINGPROTECTION";
+IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE = "MUNICIPALSOLIDWASTE";
+IfcDistributionSystemEnum.OIL = "OIL";
+IfcDistributionSystemEnum.OPERATIONAL = "OPERATIONAL";
+IfcDistributionSystemEnum.POWERGENERATION = "POWERGENERATION";
+IfcDistributionSystemEnum.RAINWATER = "RAINWATER";
+IfcDistributionSystemEnum.REFRIGERATION = "REFRIGERATION";
+IfcDistributionSystemEnum.SECURITY = "SECURITY";
+IfcDistributionSystemEnum.SEWAGE = "SEWAGE";
+IfcDistributionSystemEnum.SIGNAL = "SIGNAL";
+IfcDistributionSystemEnum.STORMWATER = "STORMWATER";
+IfcDistributionSystemEnum.TELEPHONE = "TELEPHONE";
+IfcDistributionSystemEnum.TV = "TV";
+IfcDistributionSystemEnum.VACUUM = "VACUUM";
+IfcDistributionSystemEnum.VENT = "VENT";
+IfcDistributionSystemEnum.VENTILATION = "VENTILATION";
+IfcDistributionSystemEnum.WASTEWATER = "WASTEWATER";
+IfcDistributionSystemEnum.WATERSUPPLY = "WATERSUPPLY";
+IfcDistributionSystemEnum.USERDEFINED = "USERDEFINED";
+IfcDistributionSystemEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDocumentConfidentialityEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDocumentConfidentialityEnum.PUBLIC = "PUBLIC";
+IfcDocumentConfidentialityEnum.RESTRICTED = "RESTRICTED";
+IfcDocumentConfidentialityEnum.CONFIDENTIAL = "CONFIDENTIAL";
+IfcDocumentConfidentialityEnum.PERSONAL = "PERSONAL";
+IfcDocumentConfidentialityEnum.USERDEFINED = "USERDEFINED";
+IfcDocumentConfidentialityEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDocumentStatusEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDocumentStatusEnum.DRAFT = "DRAFT";
+IfcDocumentStatusEnum.FINALDRAFT = "FINALDRAFT";
+IfcDocumentStatusEnum.FINAL = "FINAL";
+IfcDocumentStatusEnum.REVISION = "REVISION";
+IfcDocumentStatusEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDoorPanelOperationEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDoorPanelOperationEnum.SWINGING = "SWINGING";
+IfcDoorPanelOperationEnum.DOUBLE_ACTING = "DOUBLE_ACTING";
+IfcDoorPanelOperationEnum.SLIDING = "SLIDING";
+IfcDoorPanelOperationEnum.FOLDING = "FOLDING";
+IfcDoorPanelOperationEnum.REVOLVING = "REVOLVING";
+IfcDoorPanelOperationEnum.ROLLINGUP = "ROLLINGUP";
+IfcDoorPanelOperationEnum.FIXEDPANEL = "FIXEDPANEL";
+IfcDoorPanelOperationEnum.USERDEFINED = "USERDEFINED";
+IfcDoorPanelOperationEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDoorPanelPositionEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDoorPanelPositionEnum.LEFT = "LEFT";
+IfcDoorPanelPositionEnum.MIDDLE = "MIDDLE";
+IfcDoorPanelPositionEnum.RIGHT = "RIGHT";
+IfcDoorPanelPositionEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDoorStyleConstructionEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDoorStyleConstructionEnum.ALUMINIUM = "ALUMINIUM";
+IfcDoorStyleConstructionEnum.HIGH_GRADE_STEEL = "HIGH_GRADE_STEEL";
+IfcDoorStyleConstructionEnum.STEEL = "STEEL";
+IfcDoorStyleConstructionEnum.WOOD = "WOOD";
+IfcDoorStyleConstructionEnum.ALUMINIUM_WOOD = "ALUMINIUM_WOOD";
+IfcDoorStyleConstructionEnum.ALUMINIUM_PLASTIC = "ALUMINIUM_PLASTIC";
+IfcDoorStyleConstructionEnum.PLASTIC = "PLASTIC";
+IfcDoorStyleConstructionEnum.USERDEFINED = "USERDEFINED";
+IfcDoorStyleConstructionEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDoorStyleOperationEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDoorStyleOperationEnum.SINGLE_SWING_LEFT = "SINGLE_SWING_LEFT";
+IfcDoorStyleOperationEnum.SINGLE_SWING_RIGHT = "SINGLE_SWING_RIGHT";
+IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING = "DOUBLE_DOOR_SINGLE_SWING";
+IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT = "DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT";
+IfcDoorStyleOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT = "DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT";
+IfcDoorStyleOperationEnum.DOUBLE_SWING_LEFT = "DOUBLE_SWING_LEFT";
+IfcDoorStyleOperationEnum.DOUBLE_SWING_RIGHT = "DOUBLE_SWING_RIGHT";
+IfcDoorStyleOperationEnum.DOUBLE_DOOR_DOUBLE_SWING = "DOUBLE_DOOR_DOUBLE_SWING";
+IfcDoorStyleOperationEnum.SLIDING_TO_LEFT = "SLIDING_TO_LEFT";
+IfcDoorStyleOperationEnum.SLIDING_TO_RIGHT = "SLIDING_TO_RIGHT";
+IfcDoorStyleOperationEnum.DOUBLE_DOOR_SLIDING = "DOUBLE_DOOR_SLIDING";
+IfcDoorStyleOperationEnum.FOLDING_TO_LEFT = "FOLDING_TO_LEFT";
+IfcDoorStyleOperationEnum.FOLDING_TO_RIGHT = "FOLDING_TO_RIGHT";
+IfcDoorStyleOperationEnum.DOUBLE_DOOR_FOLDING = "DOUBLE_DOOR_FOLDING";
+IfcDoorStyleOperationEnum.REVOLVING = "REVOLVING";
+IfcDoorStyleOperationEnum.ROLLINGUP = "ROLLINGUP";
+IfcDoorStyleOperationEnum.USERDEFINED = "USERDEFINED";
+IfcDoorStyleOperationEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDoorTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDoorTypeEnum.DOOR = "DOOR";
+IfcDoorTypeEnum.GATE = "GATE";
+IfcDoorTypeEnum.TRAPDOOR = "TRAPDOOR";
+IfcDoorTypeEnum.USERDEFINED = "USERDEFINED";
+IfcDoorTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDoorTypeOperationEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT = "SINGLE_SWING_LEFT";
+IfcDoorTypeOperationEnum.SINGLE_SWING_RIGHT = "SINGLE_SWING_RIGHT";
+IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING = "DOUBLE_DOOR_SINGLE_SWING";
+IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT = "DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT";
+IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT = "DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT";
+IfcDoorTypeOperationEnum.DOUBLE_SWING_LEFT = "DOUBLE_SWING_LEFT";
+IfcDoorTypeOperationEnum.DOUBLE_SWING_RIGHT = "DOUBLE_SWING_RIGHT";
+IfcDoorTypeOperationEnum.DOUBLE_DOOR_DOUBLE_SWING = "DOUBLE_DOOR_DOUBLE_SWING";
+IfcDoorTypeOperationEnum.SLIDING_TO_LEFT = "SLIDING_TO_LEFT";
+IfcDoorTypeOperationEnum.SLIDING_TO_RIGHT = "SLIDING_TO_RIGHT";
+IfcDoorTypeOperationEnum.DOUBLE_DOOR_SLIDING = "DOUBLE_DOOR_SLIDING";
+IfcDoorTypeOperationEnum.FOLDING_TO_LEFT = "FOLDING_TO_LEFT";
+IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT = "FOLDING_TO_RIGHT";
+IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING = "DOUBLE_DOOR_FOLDING";
+IfcDoorTypeOperationEnum.REVOLVING = "REVOLVING";
+IfcDoorTypeOperationEnum.ROLLINGUP = "ROLLINGUP";
+IfcDoorTypeOperationEnum.SWING_FIXED_LEFT = "SWING_FIXED_LEFT";
+IfcDoorTypeOperationEnum.SWING_FIXED_RIGHT = "SWING_FIXED_RIGHT";
+IfcDoorTypeOperationEnum.USERDEFINED = "USERDEFINED";
+IfcDoorTypeOperationEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDuctFittingTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDuctFittingTypeEnum.BEND = "BEND";
+IfcDuctFittingTypeEnum.CONNECTOR = "CONNECTOR";
+IfcDuctFittingTypeEnum.ENTRY = "ENTRY";
+IfcDuctFittingTypeEnum.EXIT = "EXIT";
+IfcDuctFittingTypeEnum.JUNCTION = "JUNCTION";
+IfcDuctFittingTypeEnum.OBSTRUCTION = "OBSTRUCTION";
+IfcDuctFittingTypeEnum.TRANSITION = "TRANSITION";
+IfcDuctFittingTypeEnum.USERDEFINED = "USERDEFINED";
+IfcDuctFittingTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDuctSegmentTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDuctSegmentTypeEnum.RIGIDSEGMENT = "RIGIDSEGMENT";
+IfcDuctSegmentTypeEnum.FLEXIBLESEGMENT = "FLEXIBLESEGMENT";
+IfcDuctSegmentTypeEnum.USERDEFINED = "USERDEFINED";
+IfcDuctSegmentTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcDuctSilencerTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcDuctSilencerTypeEnum.FLATOVAL = "FLATOVAL";
+IfcDuctSilencerTypeEnum.RECTANGULAR = "RECTANGULAR";
+IfcDuctSilencerTypeEnum.ROUND = "ROUND";
+IfcDuctSilencerTypeEnum.USERDEFINED = "USERDEFINED";
+IfcDuctSilencerTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcElectricApplianceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcElectricApplianceTypeEnum.DISHWASHER = "DISHWASHER";
+IfcElectricApplianceTypeEnum.ELECTRICCOOKER = "ELECTRICCOOKER";
+IfcElectricApplianceTypeEnum.FREESTANDINGELECTRICHEATER = "FREESTANDINGELECTRICHEATER";
+IfcElectricApplianceTypeEnum.FREESTANDINGFAN = "FREESTANDINGFAN";
+IfcElectricApplianceTypeEnum.FREESTANDINGWATERHEATER = "FREESTANDINGWATERHEATER";
+IfcElectricApplianceTypeEnum.FREESTANDINGWATERCOOLER = "FREESTANDINGWATERCOOLER";
+IfcElectricApplianceTypeEnum.FREEZER = "FREEZER";
+IfcElectricApplianceTypeEnum.FRIDGE_FREEZER = "FRIDGE_FREEZER";
+IfcElectricApplianceTypeEnum.HANDDRYER = "HANDDRYER";
+IfcElectricApplianceTypeEnum.KITCHENMACHINE = "KITCHENMACHINE";
+IfcElectricApplianceTypeEnum.MICROWAVE = "MICROWAVE";
+IfcElectricApplianceTypeEnum.PHOTOCOPIER = "PHOTOCOPIER";
+IfcElectricApplianceTypeEnum.REFRIGERATOR = "REFRIGERATOR";
+IfcElectricApplianceTypeEnum.TUMBLEDRYER = "TUMBLEDRYER";
+IfcElectricApplianceTypeEnum.VENDINGMACHINE = "VENDINGMACHINE";
+IfcElectricApplianceTypeEnum.WASHINGMACHINE = "WASHINGMACHINE";
+IfcElectricApplianceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcElectricApplianceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcElectricDistributionBoardTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcElectricDistributionBoardTypeEnum.CONSUMERUNIT = "CONSUMERUNIT";
+IfcElectricDistributionBoardTypeEnum.DISTRIBUTIONBOARD = "DISTRIBUTIONBOARD";
+IfcElectricDistributionBoardTypeEnum.MOTORCONTROLCENTRE = "MOTORCONTROLCENTRE";
+IfcElectricDistributionBoardTypeEnum.SWITCHBOARD = "SWITCHBOARD";
+IfcElectricDistributionBoardTypeEnum.USERDEFINED = "USERDEFINED";
+IfcElectricDistributionBoardTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcElectricFlowStorageDeviceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcElectricFlowStorageDeviceTypeEnum.BATTERY = "BATTERY";
+IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK = "CAPACITORBANK";
+IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER = "HARMONICFILTER";
+IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK = "INDUCTORBANK";
+IfcElectricFlowStorageDeviceTypeEnum.UPS = "UPS";
+IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcElectricFlowStorageDeviceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcElectricGeneratorTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcElectricGeneratorTypeEnum.CHP = "CHP";
+IfcElectricGeneratorTypeEnum.ENGINEGENERATOR = "ENGINEGENERATOR";
+IfcElectricGeneratorTypeEnum.STANDALONE = "STANDALONE";
+IfcElectricGeneratorTypeEnum.USERDEFINED = "USERDEFINED";
+IfcElectricGeneratorTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcElectricMotorTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcElectricMotorTypeEnum.DC = "DC";
+IfcElectricMotorTypeEnum.INDUCTION = "INDUCTION";
+IfcElectricMotorTypeEnum.POLYPHASE = "POLYPHASE";
+IfcElectricMotorTypeEnum.RELUCTANCESYNCHRONOUS = "RELUCTANCESYNCHRONOUS";
+IfcElectricMotorTypeEnum.SYNCHRONOUS = "SYNCHRONOUS";
+IfcElectricMotorTypeEnum.USERDEFINED = "USERDEFINED";
+IfcElectricMotorTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcElectricTimeControlTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcElectricTimeControlTypeEnum.TIMECLOCK = "TIMECLOCK";
+IfcElectricTimeControlTypeEnum.TIMEDELAY = "TIMEDELAY";
+IfcElectricTimeControlTypeEnum.RELAY = "RELAY";
+IfcElectricTimeControlTypeEnum.USERDEFINED = "USERDEFINED";
+IfcElectricTimeControlTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcElementAssemblyTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY = "ACCESSORY_ASSEMBLY";
+IfcElementAssemblyTypeEnum.ARCH = "ARCH";
+IfcElementAssemblyTypeEnum.BEAM_GRID = "BEAM_GRID";
+IfcElementAssemblyTypeEnum.BRACED_FRAME = "BRACED_FRAME";
+IfcElementAssemblyTypeEnum.GIRDER = "GIRDER";
+IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT = "REINFORCEMENT_UNIT";
+IfcElementAssemblyTypeEnum.RIGID_FRAME = "RIGID_FRAME";
+IfcElementAssemblyTypeEnum.SLAB_FIELD = "SLAB_FIELD";
+IfcElementAssemblyTypeEnum.TRUSS = "TRUSS";
+IfcElementAssemblyTypeEnum.ABUTMENT = "ABUTMENT";
+IfcElementAssemblyTypeEnum.PIER = "PIER";
+IfcElementAssemblyTypeEnum.PYLON = "PYLON";
+IfcElementAssemblyTypeEnum.CROSS_BRACING = "CROSS_BRACING";
+IfcElementAssemblyTypeEnum.DECK = "DECK";
+IfcElementAssemblyTypeEnum.USERDEFINED = "USERDEFINED";
+IfcElementAssemblyTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcElementCompositionEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcElementCompositionEnum.COMPLEX = "COMPLEX";
+IfcElementCompositionEnum.ELEMENT = "ELEMENT";
+IfcElementCompositionEnum.PARTIAL = "PARTIAL";
+var IfcEngineTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcEngineTypeEnum.EXTERNALCOMBUSTION = "EXTERNALCOMBUSTION";
+IfcEngineTypeEnum.INTERNALCOMBUSTION = "INTERNALCOMBUSTION";
+IfcEngineTypeEnum.USERDEFINED = "USERDEFINED";
+IfcEngineTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcEvaporativeCoolerTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER = "DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER";
+IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER = "DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER";
+IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER = "DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER";
+IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER = "DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER";
+IfcEvaporativeCoolerTypeEnum.DIRECTEVAPORATIVEAIRWASHER = "DIRECTEVAPORATIVEAIRWASHER";
+IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEPACKAGEAIRCOOLER = "INDIRECTEVAPORATIVEPACKAGEAIRCOOLER";
+IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVEWETCOIL = "INDIRECTEVAPORATIVEWETCOIL";
+IfcEvaporativeCoolerTypeEnum.INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER = "INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER";
+IfcEvaporativeCoolerTypeEnum.INDIRECTDIRECTCOMBINATION = "INDIRECTDIRECTCOMBINATION";
+IfcEvaporativeCoolerTypeEnum.USERDEFINED = "USERDEFINED";
+IfcEvaporativeCoolerTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcEvaporatorTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcEvaporatorTypeEnum.DIRECTEXPANSION = "DIRECTEXPANSION";
+IfcEvaporatorTypeEnum.DIRECTEXPANSIONSHELLANDTUBE = "DIRECTEXPANSIONSHELLANDTUBE";
+IfcEvaporatorTypeEnum.DIRECTEXPANSIONTUBEINTUBE = "DIRECTEXPANSIONTUBEINTUBE";
+IfcEvaporatorTypeEnum.DIRECTEXPANSIONBRAZEDPLATE = "DIRECTEXPANSIONBRAZEDPLATE";
+IfcEvaporatorTypeEnum.FLOODEDSHELLANDTUBE = "FLOODEDSHELLANDTUBE";
+IfcEvaporatorTypeEnum.SHELLANDCOIL = "SHELLANDCOIL";
+IfcEvaporatorTypeEnum.USERDEFINED = "USERDEFINED";
+IfcEvaporatorTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcEventTriggerTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcEventTriggerTypeEnum.EVENTRULE = "EVENTRULE";
+IfcEventTriggerTypeEnum.EVENTMESSAGE = "EVENTMESSAGE";
+IfcEventTriggerTypeEnum.EVENTTIME = "EVENTTIME";
+IfcEventTriggerTypeEnum.EVENTCOMPLEX = "EVENTCOMPLEX";
+IfcEventTriggerTypeEnum.USERDEFINED = "USERDEFINED";
+IfcEventTriggerTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcEventTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcEventTypeEnum.STARTEVENT = "STARTEVENT";
+IfcEventTypeEnum.ENDEVENT = "ENDEVENT";
+IfcEventTypeEnum.INTERMEDIATEEVENT = "INTERMEDIATEEVENT";
+IfcEventTypeEnum.USERDEFINED = "USERDEFINED";
+IfcEventTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcExternalSpatialElementTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcExternalSpatialElementTypeEnum.EXTERNAL = "EXTERNAL";
+IfcExternalSpatialElementTypeEnum.EXTERNAL_EARTH = "EXTERNAL_EARTH";
+IfcExternalSpatialElementTypeEnum.EXTERNAL_WATER = "EXTERNAL_WATER";
+IfcExternalSpatialElementTypeEnum.EXTERNAL_FIRE = "EXTERNAL_FIRE";
+IfcExternalSpatialElementTypeEnum.USERDEFINED = "USERDEFINED";
+IfcExternalSpatialElementTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcFanTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcFanTypeEnum.CENTRIFUGALFORWARDCURVED = "CENTRIFUGALFORWARDCURVED";
+IfcFanTypeEnum.CENTRIFUGALRADIAL = "CENTRIFUGALRADIAL";
+IfcFanTypeEnum.CENTRIFUGALBACKWARDINCLINEDCURVED = "CENTRIFUGALBACKWARDINCLINEDCURVED";
+IfcFanTypeEnum.CENTRIFUGALAIRFOIL = "CENTRIFUGALAIRFOIL";
+IfcFanTypeEnum.TUBEAXIAL = "TUBEAXIAL";
+IfcFanTypeEnum.VANEAXIAL = "VANEAXIAL";
+IfcFanTypeEnum.PROPELLORAXIAL = "PROPELLORAXIAL";
+IfcFanTypeEnum.USERDEFINED = "USERDEFINED";
+IfcFanTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcFastenerTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcFastenerTypeEnum.GLUE = "GLUE";
+IfcFastenerTypeEnum.MORTAR = "MORTAR";
+IfcFastenerTypeEnum.WELD = "WELD";
+IfcFastenerTypeEnum.USERDEFINED = "USERDEFINED";
+IfcFastenerTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcFilterTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcFilterTypeEnum.AIRPARTICLEFILTER = "AIRPARTICLEFILTER";
+IfcFilterTypeEnum.COMPRESSEDAIRFILTER = "COMPRESSEDAIRFILTER";
+IfcFilterTypeEnum.ODORFILTER = "ODORFILTER";
+IfcFilterTypeEnum.OILFILTER = "OILFILTER";
+IfcFilterTypeEnum.STRAINER = "STRAINER";
+IfcFilterTypeEnum.WATERFILTER = "WATERFILTER";
+IfcFilterTypeEnum.USERDEFINED = "USERDEFINED";
+IfcFilterTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcFireSuppressionTerminalTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcFireSuppressionTerminalTypeEnum.BREECHINGINLET = "BREECHINGINLET";
+IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT = "FIREHYDRANT";
+IfcFireSuppressionTerminalTypeEnum.HOSEREEL = "HOSEREEL";
+IfcFireSuppressionTerminalTypeEnum.SPRINKLER = "SPRINKLER";
+IfcFireSuppressionTerminalTypeEnum.SPRINKLERDEFLECTOR = "SPRINKLERDEFLECTOR";
+IfcFireSuppressionTerminalTypeEnum.USERDEFINED = "USERDEFINED";
+IfcFireSuppressionTerminalTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcFlowDirectionEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcFlowDirectionEnum.SOURCE = "SOURCE";
+IfcFlowDirectionEnum.SINK = "SINK";
+IfcFlowDirectionEnum.SOURCEANDSINK = "SOURCEANDSINK";
+IfcFlowDirectionEnum.NOTDEFINED = "NOTDEFINED";
+var IfcFlowInstrumentTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcFlowInstrumentTypeEnum.PRESSUREGAUGE = "PRESSUREGAUGE";
+IfcFlowInstrumentTypeEnum.THERMOMETER = "THERMOMETER";
+IfcFlowInstrumentTypeEnum.AMMETER = "AMMETER";
+IfcFlowInstrumentTypeEnum.FREQUENCYMETER = "FREQUENCYMETER";
+IfcFlowInstrumentTypeEnum.POWERFACTORMETER = "POWERFACTORMETER";
+IfcFlowInstrumentTypeEnum.PHASEANGLEMETER = "PHASEANGLEMETER";
+IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK = "VOLTMETER_PEAK";
+IfcFlowInstrumentTypeEnum.VOLTMETER_RMS = "VOLTMETER_RMS";
+IfcFlowInstrumentTypeEnum.USERDEFINED = "USERDEFINED";
+IfcFlowInstrumentTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcFlowMeterTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcFlowMeterTypeEnum.ENERGYMETER = "ENERGYMETER";
+IfcFlowMeterTypeEnum.GASMETER = "GASMETER";
+IfcFlowMeterTypeEnum.OILMETER = "OILMETER";
+IfcFlowMeterTypeEnum.WATERMETER = "WATERMETER";
+IfcFlowMeterTypeEnum.USERDEFINED = "USERDEFINED";
+IfcFlowMeterTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcFootingTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcFootingTypeEnum.CAISSON_FOUNDATION = "CAISSON_FOUNDATION";
+IfcFootingTypeEnum.FOOTING_BEAM = "FOOTING_BEAM";
+IfcFootingTypeEnum.PAD_FOOTING = "PAD_FOOTING";
+IfcFootingTypeEnum.PILE_CAP = "PILE_CAP";
+IfcFootingTypeEnum.STRIP_FOOTING = "STRIP_FOOTING";
+IfcFootingTypeEnum.USERDEFINED = "USERDEFINED";
+IfcFootingTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcFurnitureTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcFurnitureTypeEnum.CHAIR = "CHAIR";
+IfcFurnitureTypeEnum.TABLE = "TABLE";
+IfcFurnitureTypeEnum.DESK = "DESK";
+IfcFurnitureTypeEnum.BED = "BED";
+IfcFurnitureTypeEnum.FILECABINET = "FILECABINET";
+IfcFurnitureTypeEnum.SHELF = "SHELF";
+IfcFurnitureTypeEnum.SOFA = "SOFA";
+IfcFurnitureTypeEnum.USERDEFINED = "USERDEFINED";
+IfcFurnitureTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcGeographicElementTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcGeographicElementTypeEnum.TERRAIN = "TERRAIN";
+IfcGeographicElementTypeEnum.SOIL_BORING_POINT = "SOIL_BORING_POINT";
+IfcGeographicElementTypeEnum.USERDEFINED = "USERDEFINED";
+IfcGeographicElementTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcGeometricProjectionEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcGeometricProjectionEnum.GRAPH_VIEW = "GRAPH_VIEW";
+IfcGeometricProjectionEnum.SKETCH_VIEW = "SKETCH_VIEW";
+IfcGeometricProjectionEnum.MODEL_VIEW = "MODEL_VIEW";
+IfcGeometricProjectionEnum.PLAN_VIEW = "PLAN_VIEW";
+IfcGeometricProjectionEnum.REFLECTED_PLAN_VIEW = "REFLECTED_PLAN_VIEW";
+IfcGeometricProjectionEnum.SECTION_VIEW = "SECTION_VIEW";
+IfcGeometricProjectionEnum.ELEVATION_VIEW = "ELEVATION_VIEW";
+IfcGeometricProjectionEnum.USERDEFINED = "USERDEFINED";
+IfcGeometricProjectionEnum.NOTDEFINED = "NOTDEFINED";
+var IfcGlobalOrLocalEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcGlobalOrLocalEnum.GLOBAL_COORDS = "GLOBAL_COORDS";
+IfcGlobalOrLocalEnum.LOCAL_COORDS = "LOCAL_COORDS";
+var IfcGridTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcGridTypeEnum.RECTANGULAR = "RECTANGULAR";
+IfcGridTypeEnum.RADIAL = "RADIAL";
+IfcGridTypeEnum.TRIANGULAR = "TRIANGULAR";
+IfcGridTypeEnum.IRREGULAR = "IRREGULAR";
+IfcGridTypeEnum.USERDEFINED = "USERDEFINED";
+IfcGridTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcHeatExchangerTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcHeatExchangerTypeEnum.PLATE = "PLATE";
+IfcHeatExchangerTypeEnum.SHELLANDTUBE = "SHELLANDTUBE";
+IfcHeatExchangerTypeEnum.USERDEFINED = "USERDEFINED";
+IfcHeatExchangerTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcHumidifierTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcHumidifierTypeEnum.STEAMINJECTION = "STEAMINJECTION";
+IfcHumidifierTypeEnum.ADIABATICAIRWASHER = "ADIABATICAIRWASHER";
+IfcHumidifierTypeEnum.ADIABATICPAN = "ADIABATICPAN";
+IfcHumidifierTypeEnum.ADIABATICWETTEDELEMENT = "ADIABATICWETTEDELEMENT";
+IfcHumidifierTypeEnum.ADIABATICATOMIZING = "ADIABATICATOMIZING";
+IfcHumidifierTypeEnum.ADIABATICULTRASONIC = "ADIABATICULTRASONIC";
+IfcHumidifierTypeEnum.ADIABATICRIGIDMEDIA = "ADIABATICRIGIDMEDIA";
+IfcHumidifierTypeEnum.ADIABATICCOMPRESSEDAIRNOZZLE = "ADIABATICCOMPRESSEDAIRNOZZLE";
+IfcHumidifierTypeEnum.ASSISTEDELECTRIC = "ASSISTEDELECTRIC";
+IfcHumidifierTypeEnum.ASSISTEDNATURALGAS = "ASSISTEDNATURALGAS";
+IfcHumidifierTypeEnum.ASSISTEDPROPANE = "ASSISTEDPROPANE";
+IfcHumidifierTypeEnum.ASSISTEDBUTANE = "ASSISTEDBUTANE";
+IfcHumidifierTypeEnum.ASSISTEDSTEAM = "ASSISTEDSTEAM";
+IfcHumidifierTypeEnum.USERDEFINED = "USERDEFINED";
+IfcHumidifierTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcInterceptorTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcInterceptorTypeEnum.CYCLONIC = "CYCLONIC";
+IfcInterceptorTypeEnum.GREASE = "GREASE";
+IfcInterceptorTypeEnum.OIL = "OIL";
+IfcInterceptorTypeEnum.PETROL = "PETROL";
+IfcInterceptorTypeEnum.USERDEFINED = "USERDEFINED";
+IfcInterceptorTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcInternalOrExternalEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcInternalOrExternalEnum.INTERNAL = "INTERNAL";
+IfcInternalOrExternalEnum.EXTERNAL = "EXTERNAL";
+IfcInternalOrExternalEnum.EXTERNAL_EARTH = "EXTERNAL_EARTH";
+IfcInternalOrExternalEnum.EXTERNAL_WATER = "EXTERNAL_WATER";
+IfcInternalOrExternalEnum.EXTERNAL_FIRE = "EXTERNAL_FIRE";
+IfcInternalOrExternalEnum.NOTDEFINED = "NOTDEFINED";
+var IfcInventoryTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcInventoryTypeEnum.ASSETINVENTORY = "ASSETINVENTORY";
+IfcInventoryTypeEnum.SPACEINVENTORY = "SPACEINVENTORY";
+IfcInventoryTypeEnum.FURNITUREINVENTORY = "FURNITUREINVENTORY";
+IfcInventoryTypeEnum.USERDEFINED = "USERDEFINED";
+IfcInventoryTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcJunctionBoxTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcJunctionBoxTypeEnum.DATA = "DATA";
+IfcJunctionBoxTypeEnum.POWER = "POWER";
+IfcJunctionBoxTypeEnum.USERDEFINED = "USERDEFINED";
+IfcJunctionBoxTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcKnotType = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcKnotType.UNIFORM_KNOTS = "UNIFORM_KNOTS";
+IfcKnotType.QUASI_UNIFORM_KNOTS = "QUASI_UNIFORM_KNOTS";
+IfcKnotType.PIECEWISE_BEZIER_KNOTS = "PIECEWISE_BEZIER_KNOTS";
+IfcKnotType.UNSPECIFIED = "UNSPECIFIED";
+var IfcLaborResourceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcLaborResourceTypeEnum.ADMINISTRATION = "ADMINISTRATION";
+IfcLaborResourceTypeEnum.CARPENTRY = "CARPENTRY";
+IfcLaborResourceTypeEnum.CLEANING = "CLEANING";
+IfcLaborResourceTypeEnum.CONCRETE = "CONCRETE";
+IfcLaborResourceTypeEnum.DRYWALL = "DRYWALL";
+IfcLaborResourceTypeEnum.ELECTRIC = "ELECTRIC";
+IfcLaborResourceTypeEnum.FINISHING = "FINISHING";
+IfcLaborResourceTypeEnum.FLOORING = "FLOORING";
+IfcLaborResourceTypeEnum.GENERAL = "GENERAL";
+IfcLaborResourceTypeEnum.HVAC = "HVAC";
+IfcLaborResourceTypeEnum.LANDSCAPING = "LANDSCAPING";
+IfcLaborResourceTypeEnum.MASONRY = "MASONRY";
+IfcLaborResourceTypeEnum.PAINTING = "PAINTING";
+IfcLaborResourceTypeEnum.PAVING = "PAVING";
+IfcLaborResourceTypeEnum.PLUMBING = "PLUMBING";
+IfcLaborResourceTypeEnum.ROOFING = "ROOFING";
+IfcLaborResourceTypeEnum.SITEGRADING = "SITEGRADING";
+IfcLaborResourceTypeEnum.STEELWORK = "STEELWORK";
+IfcLaborResourceTypeEnum.SURVEYING = "SURVEYING";
+IfcLaborResourceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcLaborResourceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcLampTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcLampTypeEnum.COMPACTFLUORESCENT = "COMPACTFLUORESCENT";
+IfcLampTypeEnum.FLUORESCENT = "FLUORESCENT";
+IfcLampTypeEnum.HALOGEN = "HALOGEN";
+IfcLampTypeEnum.HIGHPRESSUREMERCURY = "HIGHPRESSUREMERCURY";
+IfcLampTypeEnum.HIGHPRESSURESODIUM = "HIGHPRESSURESODIUM";
+IfcLampTypeEnum.LED = "LED";
+IfcLampTypeEnum.METALHALIDE = "METALHALIDE";
+IfcLampTypeEnum.OLED = "OLED";
+IfcLampTypeEnum.TUNGSTENFILAMENT = "TUNGSTENFILAMENT";
+IfcLampTypeEnum.USERDEFINED = "USERDEFINED";
+IfcLampTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcLayerSetDirectionEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcLayerSetDirectionEnum.AXIS1 = "AXIS1";
+IfcLayerSetDirectionEnum.AXIS2 = "AXIS2";
+IfcLayerSetDirectionEnum.AXIS3 = "AXIS3";
+var IfcLightDistributionCurveEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcLightDistributionCurveEnum.TYPE_A = "TYPE_A";
+IfcLightDistributionCurveEnum.TYPE_B = "TYPE_B";
+IfcLightDistributionCurveEnum.TYPE_C = "TYPE_C";
+IfcLightDistributionCurveEnum.NOTDEFINED = "NOTDEFINED";
+var IfcLightEmissionSourceEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcLightEmissionSourceEnum.COMPACTFLUORESCENT = "COMPACTFLUORESCENT";
+IfcLightEmissionSourceEnum.FLUORESCENT = "FLUORESCENT";
+IfcLightEmissionSourceEnum.HIGHPRESSUREMERCURY = "HIGHPRESSUREMERCURY";
+IfcLightEmissionSourceEnum.HIGHPRESSURESODIUM = "HIGHPRESSURESODIUM";
+IfcLightEmissionSourceEnum.LIGHTEMITTINGDIODE = "LIGHTEMITTINGDIODE";
+IfcLightEmissionSourceEnum.LOWPRESSURESODIUM = "LOWPRESSURESODIUM";
+IfcLightEmissionSourceEnum.LOWVOLTAGEHALOGEN = "LOWVOLTAGEHALOGEN";
+IfcLightEmissionSourceEnum.MAINVOLTAGEHALOGEN = "MAINVOLTAGEHALOGEN";
+IfcLightEmissionSourceEnum.METALHALIDE = "METALHALIDE";
+IfcLightEmissionSourceEnum.TUNGSTENFILAMENT = "TUNGSTENFILAMENT";
+IfcLightEmissionSourceEnum.NOTDEFINED = "NOTDEFINED";
+var IfcLightFixtureTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcLightFixtureTypeEnum.POINTSOURCE = "POINTSOURCE";
+IfcLightFixtureTypeEnum.DIRECTIONSOURCE = "DIRECTIONSOURCE";
+IfcLightFixtureTypeEnum.SECURITYLIGHTING = "SECURITYLIGHTING";
+IfcLightFixtureTypeEnum.USERDEFINED = "USERDEFINED";
+IfcLightFixtureTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcLoadGroupTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcLoadGroupTypeEnum.LOAD_GROUP = "LOAD_GROUP";
+IfcLoadGroupTypeEnum.LOAD_CASE = "LOAD_CASE";
+IfcLoadGroupTypeEnum.LOAD_COMBINATION = "LOAD_COMBINATION";
+IfcLoadGroupTypeEnum.USERDEFINED = "USERDEFINED";
+IfcLoadGroupTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcLogicalOperatorEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcLogicalOperatorEnum.LOGICALAND = "LOGICALAND";
+IfcLogicalOperatorEnum.LOGICALOR = "LOGICALOR";
+IfcLogicalOperatorEnum.LOGICALXOR = "LOGICALXOR";
+IfcLogicalOperatorEnum.LOGICALNOTAND = "LOGICALNOTAND";
+IfcLogicalOperatorEnum.LOGICALNOTOR = "LOGICALNOTOR";
+var IfcMechanicalFastenerTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcMechanicalFastenerTypeEnum.ANCHORBOLT = "ANCHORBOLT";
+IfcMechanicalFastenerTypeEnum.BOLT = "BOLT";
+IfcMechanicalFastenerTypeEnum.DOWEL = "DOWEL";
+IfcMechanicalFastenerTypeEnum.NAIL = "NAIL";
+IfcMechanicalFastenerTypeEnum.NAILPLATE = "NAILPLATE";
+IfcMechanicalFastenerTypeEnum.RIVET = "RIVET";
+IfcMechanicalFastenerTypeEnum.SCREW = "SCREW";
+IfcMechanicalFastenerTypeEnum.SHEARCONNECTOR = "SHEARCONNECTOR";
+IfcMechanicalFastenerTypeEnum.STAPLE = "STAPLE";
+IfcMechanicalFastenerTypeEnum.STUDSHEARCONNECTOR = "STUDSHEARCONNECTOR";
+IfcMechanicalFastenerTypeEnum.COUPLER = "COUPLER";
+IfcMechanicalFastenerTypeEnum.USERDEFINED = "USERDEFINED";
+IfcMechanicalFastenerTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcMedicalDeviceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcMedicalDeviceTypeEnum.AIRSTATION = "AIRSTATION";
+IfcMedicalDeviceTypeEnum.FEEDAIRUNIT = "FEEDAIRUNIT";
+IfcMedicalDeviceTypeEnum.OXYGENGENERATOR = "OXYGENGENERATOR";
+IfcMedicalDeviceTypeEnum.OXYGENPLANT = "OXYGENPLANT";
+IfcMedicalDeviceTypeEnum.VACUUMSTATION = "VACUUMSTATION";
+IfcMedicalDeviceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcMedicalDeviceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcMemberTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcMemberTypeEnum.BRACE = "BRACE";
+IfcMemberTypeEnum.CHORD = "CHORD";
+IfcMemberTypeEnum.COLLAR = "COLLAR";
+IfcMemberTypeEnum.MEMBER = "MEMBER";
+IfcMemberTypeEnum.MULLION = "MULLION";
+IfcMemberTypeEnum.PLATE = "PLATE";
+IfcMemberTypeEnum.POST = "POST";
+IfcMemberTypeEnum.PURLIN = "PURLIN";
+IfcMemberTypeEnum.RAFTER = "RAFTER";
+IfcMemberTypeEnum.STRINGER = "STRINGER";
+IfcMemberTypeEnum.STRUT = "STRUT";
+IfcMemberTypeEnum.STUD = "STUD";
+IfcMemberTypeEnum.STIFFENING_RIB = "STIFFENING_RIB";
+IfcMemberTypeEnum.ARCH_SEGMENT = "ARCH_SEGMENT";
+IfcMemberTypeEnum.SUSPENSION_CABLE = "SUSPENSION_CABLE";
+IfcMemberTypeEnum.SUSPENDER = "SUSPENDER";
+IfcMemberTypeEnum.STAY_CABLE = "STAY_CABLE";
+IfcMemberTypeEnum.USERDEFINED = "USERDEFINED";
+IfcMemberTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcMotorConnectionTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcMotorConnectionTypeEnum.BELTDRIVE = "BELTDRIVE";
+IfcMotorConnectionTypeEnum.COUPLING = "COUPLING";
+IfcMotorConnectionTypeEnum.DIRECTDRIVE = "DIRECTDRIVE";
+IfcMotorConnectionTypeEnum.USERDEFINED = "USERDEFINED";
+IfcMotorConnectionTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcNullStyle = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcNullStyle.NULL = "NULL";
+var IfcObjectTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcObjectTypeEnum.PRODUCT = "PRODUCT";
+IfcObjectTypeEnum.PROCESS = "PROCESS";
+IfcObjectTypeEnum.CONTROL = "CONTROL";
+IfcObjectTypeEnum.RESOURCE = "RESOURCE";
+IfcObjectTypeEnum.ACTOR = "ACTOR";
+IfcObjectTypeEnum.GROUP = "GROUP";
+IfcObjectTypeEnum.PROJECT = "PROJECT";
+IfcObjectTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcObjectiveEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcObjectiveEnum.CODECOMPLIANCE = "CODECOMPLIANCE";
+IfcObjectiveEnum.CODEWAIVER = "CODEWAIVER";
+IfcObjectiveEnum.DESIGNINTENT = "DESIGNINTENT";
+IfcObjectiveEnum.EXTERNAL = "EXTERNAL";
+IfcObjectiveEnum.HEALTHANDSAFETY = "HEALTHANDSAFETY";
+IfcObjectiveEnum.MERGECONFLICT = "MERGECONFLICT";
+IfcObjectiveEnum.MODELVIEW = "MODELVIEW";
+IfcObjectiveEnum.PARAMETER = "PARAMETER";
+IfcObjectiveEnum.REQUIREMENT = "REQUIREMENT";
+IfcObjectiveEnum.SPECIFICATION = "SPECIFICATION";
+IfcObjectiveEnum.TRIGGERCONDITION = "TRIGGERCONDITION";
+IfcObjectiveEnum.USERDEFINED = "USERDEFINED";
+IfcObjectiveEnum.NOTDEFINED = "NOTDEFINED";
+var IfcOccupantTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcOccupantTypeEnum.ASSIGNEE = "ASSIGNEE";
+IfcOccupantTypeEnum.ASSIGNOR = "ASSIGNOR";
+IfcOccupantTypeEnum.LESSEE = "LESSEE";
+IfcOccupantTypeEnum.LESSOR = "LESSOR";
+IfcOccupantTypeEnum.LETTINGAGENT = "LETTINGAGENT";
+IfcOccupantTypeEnum.OWNER = "OWNER";
+IfcOccupantTypeEnum.TENANT = "TENANT";
+IfcOccupantTypeEnum.USERDEFINED = "USERDEFINED";
+IfcOccupantTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcOpeningElementTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcOpeningElementTypeEnum.OPENING = "OPENING";
+IfcOpeningElementTypeEnum.RECESS = "RECESS";
+IfcOpeningElementTypeEnum.USERDEFINED = "USERDEFINED";
+IfcOpeningElementTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcOutletTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcOutletTypeEnum.AUDIOVISUALOUTLET = "AUDIOVISUALOUTLET";
+IfcOutletTypeEnum.COMMUNICATIONSOUTLET = "COMMUNICATIONSOUTLET";
+IfcOutletTypeEnum.POWEROUTLET = "POWEROUTLET";
+IfcOutletTypeEnum.DATAOUTLET = "DATAOUTLET";
+IfcOutletTypeEnum.TELEPHONEOUTLET = "TELEPHONEOUTLET";
+IfcOutletTypeEnum.USERDEFINED = "USERDEFINED";
+IfcOutletTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcPerformanceHistoryTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcPerformanceHistoryTypeEnum.USERDEFINED = "USERDEFINED";
+IfcPerformanceHistoryTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcPermeableCoveringOperationEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcPermeableCoveringOperationEnum.GRILL = "GRILL";
+IfcPermeableCoveringOperationEnum.LOUVER = "LOUVER";
+IfcPermeableCoveringOperationEnum.SCREEN = "SCREEN";
+IfcPermeableCoveringOperationEnum.USERDEFINED = "USERDEFINED";
+IfcPermeableCoveringOperationEnum.NOTDEFINED = "NOTDEFINED";
+var IfcPermitTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcPermitTypeEnum.ACCESS = "ACCESS";
+IfcPermitTypeEnum.BUILDING = "BUILDING";
+IfcPermitTypeEnum.WORK = "WORK";
+IfcPermitTypeEnum.USERDEFINED = "USERDEFINED";
+IfcPermitTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcPhysicalOrVirtualEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcPhysicalOrVirtualEnum.PHYSICAL = "PHYSICAL";
+IfcPhysicalOrVirtualEnum.VIRTUAL = "VIRTUAL";
+IfcPhysicalOrVirtualEnum.NOTDEFINED = "NOTDEFINED";
+var IfcPileConstructionEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcPileConstructionEnum.CAST_IN_PLACE = "CAST_IN_PLACE";
+IfcPileConstructionEnum.COMPOSITE = "COMPOSITE";
+IfcPileConstructionEnum.PRECAST_CONCRETE = "PRECAST_CONCRETE";
+IfcPileConstructionEnum.PREFAB_STEEL = "PREFAB_STEEL";
+IfcPileConstructionEnum.USERDEFINED = "USERDEFINED";
+IfcPileConstructionEnum.NOTDEFINED = "NOTDEFINED";
+var IfcPileTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcPileTypeEnum.BORED = "BORED";
+IfcPileTypeEnum.DRIVEN = "DRIVEN";
+IfcPileTypeEnum.JETGROUTING = "JETGROUTING";
+IfcPileTypeEnum.COHESION = "COHESION";
+IfcPileTypeEnum.FRICTION = "FRICTION";
+IfcPileTypeEnum.SUPPORT = "SUPPORT";
+IfcPileTypeEnum.USERDEFINED = "USERDEFINED";
+IfcPileTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcPipeFittingTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcPipeFittingTypeEnum.BEND = "BEND";
+IfcPipeFittingTypeEnum.CONNECTOR = "CONNECTOR";
+IfcPipeFittingTypeEnum.ENTRY = "ENTRY";
+IfcPipeFittingTypeEnum.EXIT = "EXIT";
+IfcPipeFittingTypeEnum.JUNCTION = "JUNCTION";
+IfcPipeFittingTypeEnum.OBSTRUCTION = "OBSTRUCTION";
+IfcPipeFittingTypeEnum.TRANSITION = "TRANSITION";
+IfcPipeFittingTypeEnum.USERDEFINED = "USERDEFINED";
+IfcPipeFittingTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcPipeSegmentTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcPipeSegmentTypeEnum.CULVERT = "CULVERT";
+IfcPipeSegmentTypeEnum.FLEXIBLESEGMENT = "FLEXIBLESEGMENT";
+IfcPipeSegmentTypeEnum.RIGIDSEGMENT = "RIGIDSEGMENT";
+IfcPipeSegmentTypeEnum.GUTTER = "GUTTER";
+IfcPipeSegmentTypeEnum.SPOOL = "SPOOL";
+IfcPipeSegmentTypeEnum.USERDEFINED = "USERDEFINED";
+IfcPipeSegmentTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcPlateTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcPlateTypeEnum.CURTAIN_PANEL = "CURTAIN_PANEL";
+IfcPlateTypeEnum.SHEET = "SHEET";
+IfcPlateTypeEnum.FLANGE_PLATE = "FLANGE_PLATE";
+IfcPlateTypeEnum.WEB_PLATE = "WEB_PLATE";
+IfcPlateTypeEnum.STIFFENER_PLATE = "STIFFENER_PLATE";
+IfcPlateTypeEnum.GUSSET_PLATE = "GUSSET_PLATE";
+IfcPlateTypeEnum.COVER_PLATE = "COVER_PLATE";
+IfcPlateTypeEnum.SPLICE_PLATE = "SPLICE_PLATE";
+IfcPlateTypeEnum.BASE_PLATE = "BASE_PLATE";
+IfcPlateTypeEnum.USERDEFINED = "USERDEFINED";
+IfcPlateTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcPreferredSurfaceCurveRepresentation = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcPreferredSurfaceCurveRepresentation.CURVE3D = "CURVE3D";
+IfcPreferredSurfaceCurveRepresentation.PCURVE_S1 = "PCURVE_S1";
+IfcPreferredSurfaceCurveRepresentation.PCURVE_S2 = "PCURVE_S2";
+var IfcProcedureTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcProcedureTypeEnum.ADVICE_CAUTION = "ADVICE_CAUTION";
+IfcProcedureTypeEnum.ADVICE_NOTE = "ADVICE_NOTE";
+IfcProcedureTypeEnum.ADVICE_WARNING = "ADVICE_WARNING";
+IfcProcedureTypeEnum.CALIBRATION = "CALIBRATION";
+IfcProcedureTypeEnum.DIAGNOSTIC = "DIAGNOSTIC";
+IfcProcedureTypeEnum.SHUTDOWN = "SHUTDOWN";
+IfcProcedureTypeEnum.STARTUP = "STARTUP";
+IfcProcedureTypeEnum.USERDEFINED = "USERDEFINED";
+IfcProcedureTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcProfileTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcProfileTypeEnum.CURVE = "CURVE";
+IfcProfileTypeEnum.AREA = "AREA";
+var IfcProjectOrderTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcProjectOrderTypeEnum.CHANGEORDER = "CHANGEORDER";
+IfcProjectOrderTypeEnum.MAINTENANCEWORKORDER = "MAINTENANCEWORKORDER";
+IfcProjectOrderTypeEnum.MOVEORDER = "MOVEORDER";
+IfcProjectOrderTypeEnum.PURCHASEORDER = "PURCHASEORDER";
+IfcProjectOrderTypeEnum.WORKORDER = "WORKORDER";
+IfcProjectOrderTypeEnum.USERDEFINED = "USERDEFINED";
+IfcProjectOrderTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcProjectedOrTrueLengthEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcProjectedOrTrueLengthEnum.PROJECTED_LENGTH = "PROJECTED_LENGTH";
+IfcProjectedOrTrueLengthEnum.TRUE_LENGTH = "TRUE_LENGTH";
+var IfcProjectionElementTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcProjectionElementTypeEnum.BLISTER = "BLISTER";
+IfcProjectionElementTypeEnum.DEVIATOR = "DEVIATOR";
+IfcProjectionElementTypeEnum.USERDEFINED = "USERDEFINED";
+IfcProjectionElementTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcPropertySetTemplateTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENONLY = "PSET_TYPEDRIVENONLY";
+IfcPropertySetTemplateTypeEnum.PSET_TYPEDRIVENOVERRIDE = "PSET_TYPEDRIVENOVERRIDE";
+IfcPropertySetTemplateTypeEnum.PSET_OCCURRENCEDRIVEN = "PSET_OCCURRENCEDRIVEN";
+IfcPropertySetTemplateTypeEnum.PSET_PERFORMANCEDRIVEN = "PSET_PERFORMANCEDRIVEN";
+IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENONLY = "QTO_TYPEDRIVENONLY";
+IfcPropertySetTemplateTypeEnum.QTO_TYPEDRIVENOVERRIDE = "QTO_TYPEDRIVENOVERRIDE";
+IfcPropertySetTemplateTypeEnum.QTO_OCCURRENCEDRIVEN = "QTO_OCCURRENCEDRIVEN";
+IfcPropertySetTemplateTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcProtectiveDeviceTrippingUnitTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTRONIC = "ELECTRONIC";
+IfcProtectiveDeviceTrippingUnitTypeEnum.ELECTROMAGNETIC = "ELECTROMAGNETIC";
+IfcProtectiveDeviceTrippingUnitTypeEnum.RESIDUALCURRENT = "RESIDUALCURRENT";
+IfcProtectiveDeviceTrippingUnitTypeEnum.THERMAL = "THERMAL";
+IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED = "USERDEFINED";
+IfcProtectiveDeviceTrippingUnitTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcProtectiveDeviceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER = "CIRCUITBREAKER";
+IfcProtectiveDeviceTypeEnum.EARTHLEAKAGECIRCUITBREAKER = "EARTHLEAKAGECIRCUITBREAKER";
+IfcProtectiveDeviceTypeEnum.EARTHINGSWITCH = "EARTHINGSWITCH";
+IfcProtectiveDeviceTypeEnum.FUSEDISCONNECTOR = "FUSEDISCONNECTOR";
+IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTCIRCUITBREAKER = "RESIDUALCURRENTCIRCUITBREAKER";
+IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH = "RESIDUALCURRENTSWITCH";
+IfcProtectiveDeviceTypeEnum.VARISTOR = "VARISTOR";
+IfcProtectiveDeviceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcProtectiveDeviceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcPumpTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcPumpTypeEnum.CIRCULATOR = "CIRCULATOR";
+IfcPumpTypeEnum.ENDSUCTION = "ENDSUCTION";
+IfcPumpTypeEnum.SPLITCASE = "SPLITCASE";
+IfcPumpTypeEnum.SUBMERSIBLEPUMP = "SUBMERSIBLEPUMP";
+IfcPumpTypeEnum.SUMPPUMP = "SUMPPUMP";
+IfcPumpTypeEnum.VERTICALINLINE = "VERTICALINLINE";
+IfcPumpTypeEnum.VERTICALTURBINE = "VERTICALTURBINE";
+IfcPumpTypeEnum.USERDEFINED = "USERDEFINED";
+IfcPumpTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcRailingTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcRailingTypeEnum.HANDRAIL = "HANDRAIL";
+IfcRailingTypeEnum.GUARDRAIL = "GUARDRAIL";
+IfcRailingTypeEnum.BALUSTRADE = "BALUSTRADE";
+IfcRailingTypeEnum.USERDEFINED = "USERDEFINED";
+IfcRailingTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcRampFlightTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcRampFlightTypeEnum.STRAIGHT = "STRAIGHT";
+IfcRampFlightTypeEnum.SPIRAL = "SPIRAL";
+IfcRampFlightTypeEnum.USERDEFINED = "USERDEFINED";
+IfcRampFlightTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcRampTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcRampTypeEnum.STRAIGHT_RUN_RAMP = "STRAIGHT_RUN_RAMP";
+IfcRampTypeEnum.TWO_STRAIGHT_RUN_RAMP = "TWO_STRAIGHT_RUN_RAMP";
+IfcRampTypeEnum.QUARTER_TURN_RAMP = "QUARTER_TURN_RAMP";
+IfcRampTypeEnum.TWO_QUARTER_TURN_RAMP = "TWO_QUARTER_TURN_RAMP";
+IfcRampTypeEnum.HALF_TURN_RAMP = "HALF_TURN_RAMP";
+IfcRampTypeEnum.SPIRAL_RAMP = "SPIRAL_RAMP";
+IfcRampTypeEnum.USERDEFINED = "USERDEFINED";
+IfcRampTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcRecurrenceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcRecurrenceTypeEnum.DAILY = "DAILY";
+IfcRecurrenceTypeEnum.WEEKLY = "WEEKLY";
+IfcRecurrenceTypeEnum.MONTHLY_BY_DAY_OF_MONTH = "MONTHLY_BY_DAY_OF_MONTH";
+IfcRecurrenceTypeEnum.MONTHLY_BY_POSITION = "MONTHLY_BY_POSITION";
+IfcRecurrenceTypeEnum.BY_DAY_COUNT = "BY_DAY_COUNT";
+IfcRecurrenceTypeEnum.BY_WEEKDAY_COUNT = "BY_WEEKDAY_COUNT";
+IfcRecurrenceTypeEnum.YEARLY_BY_DAY_OF_MONTH = "YEARLY_BY_DAY_OF_MONTH";
+IfcRecurrenceTypeEnum.YEARLY_BY_POSITION = "YEARLY_BY_POSITION";
+var IfcReferentTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcReferentTypeEnum.KILOPOINT = "KILOPOINT";
+IfcReferentTypeEnum.MILEPOINT = "MILEPOINT";
+IfcReferentTypeEnum.STATION = "STATION";
+IfcReferentTypeEnum.USERDEFINED = "USERDEFINED";
+IfcReferentTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcReflectanceMethodEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcReflectanceMethodEnum.BLINN = "BLINN";
+IfcReflectanceMethodEnum.FLAT = "FLAT";
+IfcReflectanceMethodEnum.GLASS = "GLASS";
+IfcReflectanceMethodEnum.MATT = "MATT";
+IfcReflectanceMethodEnum.METAL = "METAL";
+IfcReflectanceMethodEnum.MIRROR = "MIRROR";
+IfcReflectanceMethodEnum.PHONG = "PHONG";
+IfcReflectanceMethodEnum.PLASTIC = "PLASTIC";
+IfcReflectanceMethodEnum.STRAUSS = "STRAUSS";
+IfcReflectanceMethodEnum.NOTDEFINED = "NOTDEFINED";
+var IfcReinforcingBarRoleEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcReinforcingBarRoleEnum.MAIN = "MAIN";
+IfcReinforcingBarRoleEnum.SHEAR = "SHEAR";
+IfcReinforcingBarRoleEnum.LIGATURE = "LIGATURE";
+IfcReinforcingBarRoleEnum.STUD = "STUD";
+IfcReinforcingBarRoleEnum.PUNCHING = "PUNCHING";
+IfcReinforcingBarRoleEnum.EDGE = "EDGE";
+IfcReinforcingBarRoleEnum.RING = "RING";
+IfcReinforcingBarRoleEnum.ANCHORING = "ANCHORING";
+IfcReinforcingBarRoleEnum.USERDEFINED = "USERDEFINED";
+IfcReinforcingBarRoleEnum.NOTDEFINED = "NOTDEFINED";
+var IfcReinforcingBarSurfaceEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcReinforcingBarSurfaceEnum.PLAIN = "PLAIN";
+IfcReinforcingBarSurfaceEnum.TEXTURED = "TEXTURED";
+var IfcReinforcingBarTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcReinforcingBarTypeEnum.ANCHORING = "ANCHORING";
+IfcReinforcingBarTypeEnum.EDGE = "EDGE";
+IfcReinforcingBarTypeEnum.LIGATURE = "LIGATURE";
+IfcReinforcingBarTypeEnum.MAIN = "MAIN";
+IfcReinforcingBarTypeEnum.PUNCHING = "PUNCHING";
+IfcReinforcingBarTypeEnum.RING = "RING";
+IfcReinforcingBarTypeEnum.SHEAR = "SHEAR";
+IfcReinforcingBarTypeEnum.STUD = "STUD";
+IfcReinforcingBarTypeEnum.SPACEBAR = "SPACEBAR";
+IfcReinforcingBarTypeEnum.USERDEFINED = "USERDEFINED";
+IfcReinforcingBarTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcReinforcingMeshTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcReinforcingMeshTypeEnum.USERDEFINED = "USERDEFINED";
+IfcReinforcingMeshTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcRoleEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcRoleEnum.SUPPLIER = "SUPPLIER";
+IfcRoleEnum.MANUFACTURER = "MANUFACTURER";
+IfcRoleEnum.CONTRACTOR = "CONTRACTOR";
+IfcRoleEnum.SUBCONTRACTOR = "SUBCONTRACTOR";
+IfcRoleEnum.ARCHITECT = "ARCHITECT";
+IfcRoleEnum.STRUCTURALENGINEER = "STRUCTURALENGINEER";
+IfcRoleEnum.COSTENGINEER = "COSTENGINEER";
+IfcRoleEnum.CLIENT = "CLIENT";
+IfcRoleEnum.BUILDINGOWNER = "BUILDINGOWNER";
+IfcRoleEnum.BUILDINGOPERATOR = "BUILDINGOPERATOR";
+IfcRoleEnum.MECHANICALENGINEER = "MECHANICALENGINEER";
+IfcRoleEnum.ELECTRICALENGINEER = "ELECTRICALENGINEER";
+IfcRoleEnum.PROJECTMANAGER = "PROJECTMANAGER";
+IfcRoleEnum.FACILITIESMANAGER = "FACILITIESMANAGER";
+IfcRoleEnum.CIVILENGINEER = "CIVILENGINEER";
+IfcRoleEnum.COMMISSIONINGENGINEER = "COMMISSIONINGENGINEER";
+IfcRoleEnum.ENGINEER = "ENGINEER";
+IfcRoleEnum.OWNER = "OWNER";
+IfcRoleEnum.CONSULTANT = "CONSULTANT";
+IfcRoleEnum.CONSTRUCTIONMANAGER = "CONSTRUCTIONMANAGER";
+IfcRoleEnum.FIELDCONSTRUCTIONMANAGER = "FIELDCONSTRUCTIONMANAGER";
+IfcRoleEnum.RESELLER = "RESELLER";
+IfcRoleEnum.USERDEFINED = "USERDEFINED";
+var IfcRoofTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcRoofTypeEnum.FLAT_ROOF = "FLAT_ROOF";
+IfcRoofTypeEnum.SHED_ROOF = "SHED_ROOF";
+IfcRoofTypeEnum.GABLE_ROOF = "GABLE_ROOF";
+IfcRoofTypeEnum.HIP_ROOF = "HIP_ROOF";
+IfcRoofTypeEnum.HIPPED_GABLE_ROOF = "HIPPED_GABLE_ROOF";
+IfcRoofTypeEnum.GAMBREL_ROOF = "GAMBREL_ROOF";
+IfcRoofTypeEnum.MANSARD_ROOF = "MANSARD_ROOF";
+IfcRoofTypeEnum.BARREL_ROOF = "BARREL_ROOF";
+IfcRoofTypeEnum.RAINBOW_ROOF = "RAINBOW_ROOF";
+IfcRoofTypeEnum.BUTTERFLY_ROOF = "BUTTERFLY_ROOF";
+IfcRoofTypeEnum.PAVILION_ROOF = "PAVILION_ROOF";
+IfcRoofTypeEnum.DOME_ROOF = "DOME_ROOF";
+IfcRoofTypeEnum.FREEFORM = "FREEFORM";
+IfcRoofTypeEnum.USERDEFINED = "USERDEFINED";
+IfcRoofTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcSIPrefix = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSIPrefix.EXA = "EXA";
+IfcSIPrefix.PETA = "PETA";
+IfcSIPrefix.TERA = "TERA";
+IfcSIPrefix.GIGA = "GIGA";
+IfcSIPrefix.MEGA = "MEGA";
+IfcSIPrefix.KILO = "KILO";
+IfcSIPrefix.HECTO = "HECTO";
+IfcSIPrefix.DECA = "DECA";
+IfcSIPrefix.DECI = "DECI";
+IfcSIPrefix.CENTI = "CENTI";
+IfcSIPrefix.MILLI = "MILLI";
+IfcSIPrefix.MICRO = "MICRO";
+IfcSIPrefix.NANO = "NANO";
+IfcSIPrefix.PICO = "PICO";
+IfcSIPrefix.FEMTO = "FEMTO";
+IfcSIPrefix.ATTO = "ATTO";
+var IfcSIUnitName = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSIUnitName.AMPERE = "AMPERE";
+IfcSIUnitName.BECQUEREL = "BECQUEREL";
+IfcSIUnitName.CANDELA = "CANDELA";
+IfcSIUnitName.COULOMB = "COULOMB";
+IfcSIUnitName.CUBIC_METRE = "CUBIC_METRE";
+IfcSIUnitName.DEGREE_CELSIUS = "DEGREE_CELSIUS";
+IfcSIUnitName.FARAD = "FARAD";
+IfcSIUnitName.GRAM = "GRAM";
+IfcSIUnitName.GRAY = "GRAY";
+IfcSIUnitName.HENRY = "HENRY";
+IfcSIUnitName.HERTZ = "HERTZ";
+IfcSIUnitName.JOULE = "JOULE";
+IfcSIUnitName.KELVIN = "KELVIN";
+IfcSIUnitName.LUMEN = "LUMEN";
+IfcSIUnitName.LUX = "LUX";
+IfcSIUnitName.METRE = "METRE";
+IfcSIUnitName.MOLE = "MOLE";
+IfcSIUnitName.NEWTON = "NEWTON";
+IfcSIUnitName.OHM = "OHM";
+IfcSIUnitName.PASCAL = "PASCAL";
+IfcSIUnitName.RADIAN = "RADIAN";
+IfcSIUnitName.SECOND = "SECOND";
+IfcSIUnitName.SIEMENS = "SIEMENS";
+IfcSIUnitName.SIEVERT = "SIEVERT";
+IfcSIUnitName.SQUARE_METRE = "SQUARE_METRE";
+IfcSIUnitName.STERADIAN = "STERADIAN";
+IfcSIUnitName.TESLA = "TESLA";
+IfcSIUnitName.VOLT = "VOLT";
+IfcSIUnitName.WATT = "WATT";
+IfcSIUnitName.WEBER = "WEBER";
+var IfcSanitaryTerminalTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSanitaryTerminalTypeEnum.BATH = "BATH";
+IfcSanitaryTerminalTypeEnum.BIDET = "BIDET";
+IfcSanitaryTerminalTypeEnum.CISTERN = "CISTERN";
+IfcSanitaryTerminalTypeEnum.SHOWER = "SHOWER";
+IfcSanitaryTerminalTypeEnum.SINK = "SINK";
+IfcSanitaryTerminalTypeEnum.SANITARYFOUNTAIN = "SANITARYFOUNTAIN";
+IfcSanitaryTerminalTypeEnum.TOILETPAN = "TOILETPAN";
+IfcSanitaryTerminalTypeEnum.URINAL = "URINAL";
+IfcSanitaryTerminalTypeEnum.WASHHANDBASIN = "WASHHANDBASIN";
+IfcSanitaryTerminalTypeEnum.WCSEAT = "WCSEAT";
+IfcSanitaryTerminalTypeEnum.USERDEFINED = "USERDEFINED";
+IfcSanitaryTerminalTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcSectionTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSectionTypeEnum.UNIFORM = "UNIFORM";
+IfcSectionTypeEnum.TAPERED = "TAPERED";
+var IfcSensorTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSensorTypeEnum.COSENSOR = "COSENSOR";
+IfcSensorTypeEnum.CO2SENSOR = "CO2SENSOR";
+IfcSensorTypeEnum.CONDUCTANCESENSOR = "CONDUCTANCESENSOR";
+IfcSensorTypeEnum.CONTACTSENSOR = "CONTACTSENSOR";
+IfcSensorTypeEnum.FIRESENSOR = "FIRESENSOR";
+IfcSensorTypeEnum.FLOWSENSOR = "FLOWSENSOR";
+IfcSensorTypeEnum.FROSTSENSOR = "FROSTSENSOR";
+IfcSensorTypeEnum.GASSENSOR = "GASSENSOR";
+IfcSensorTypeEnum.HEATSENSOR = "HEATSENSOR";
+IfcSensorTypeEnum.HUMIDITYSENSOR = "HUMIDITYSENSOR";
+IfcSensorTypeEnum.IDENTIFIERSENSOR = "IDENTIFIERSENSOR";
+IfcSensorTypeEnum.IONCONCENTRATIONSENSOR = "IONCONCENTRATIONSENSOR";
+IfcSensorTypeEnum.LEVELSENSOR = "LEVELSENSOR";
+IfcSensorTypeEnum.LIGHTSENSOR = "LIGHTSENSOR";
+IfcSensorTypeEnum.MOISTURESENSOR = "MOISTURESENSOR";
+IfcSensorTypeEnum.MOVEMENTSENSOR = "MOVEMENTSENSOR";
+IfcSensorTypeEnum.PHSENSOR = "PHSENSOR";
+IfcSensorTypeEnum.PRESSURESENSOR = "PRESSURESENSOR";
+IfcSensorTypeEnum.RADIATIONSENSOR = "RADIATIONSENSOR";
+IfcSensorTypeEnum.RADIOACTIVITYSENSOR = "RADIOACTIVITYSENSOR";
+IfcSensorTypeEnum.SMOKESENSOR = "SMOKESENSOR";
+IfcSensorTypeEnum.SOUNDSENSOR = "SOUNDSENSOR";
+IfcSensorTypeEnum.TEMPERATURESENSOR = "TEMPERATURESENSOR";
+IfcSensorTypeEnum.WINDSENSOR = "WINDSENSOR";
+IfcSensorTypeEnum.USERDEFINED = "USERDEFINED";
+IfcSensorTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcSequenceEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSequenceEnum.START_START = "START_START";
+IfcSequenceEnum.START_FINISH = "START_FINISH";
+IfcSequenceEnum.FINISH_START = "FINISH_START";
+IfcSequenceEnum.FINISH_FINISH = "FINISH_FINISH";
+IfcSequenceEnum.USERDEFINED = "USERDEFINED";
+IfcSequenceEnum.NOTDEFINED = "NOTDEFINED";
+var IfcShadingDeviceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcShadingDeviceTypeEnum.JALOUSIE = "JALOUSIE";
+IfcShadingDeviceTypeEnum.SHUTTER = "SHUTTER";
+IfcShadingDeviceTypeEnum.AWNING = "AWNING";
+IfcShadingDeviceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcShadingDeviceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcSimplePropertyTemplateTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE = "P_SINGLEVALUE";
+IfcSimplePropertyTemplateTypeEnum.P_ENUMERATEDVALUE = "P_ENUMERATEDVALUE";
+IfcSimplePropertyTemplateTypeEnum.P_BOUNDEDVALUE = "P_BOUNDEDVALUE";
+IfcSimplePropertyTemplateTypeEnum.P_LISTVALUE = "P_LISTVALUE";
+IfcSimplePropertyTemplateTypeEnum.P_TABLEVALUE = "P_TABLEVALUE";
+IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE = "P_REFERENCEVALUE";
+IfcSimplePropertyTemplateTypeEnum.Q_LENGTH = "Q_LENGTH";
+IfcSimplePropertyTemplateTypeEnum.Q_AREA = "Q_AREA";
+IfcSimplePropertyTemplateTypeEnum.Q_VOLUME = "Q_VOLUME";
+IfcSimplePropertyTemplateTypeEnum.Q_COUNT = "Q_COUNT";
+IfcSimplePropertyTemplateTypeEnum.Q_WEIGHT = "Q_WEIGHT";
+IfcSimplePropertyTemplateTypeEnum.Q_TIME = "Q_TIME";
+var IfcSlabTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSlabTypeEnum.FLOOR = "FLOOR";
+IfcSlabTypeEnum.ROOF = "ROOF";
+IfcSlabTypeEnum.LANDING = "LANDING";
+IfcSlabTypeEnum.BASESLAB = "BASESLAB";
+IfcSlabTypeEnum.APPROACH_SLAB = "APPROACH_SLAB";
+IfcSlabTypeEnum.PAVING = "PAVING";
+IfcSlabTypeEnum.WEARING = "WEARING";
+IfcSlabTypeEnum.SIDEWALK = "SIDEWALK";
+IfcSlabTypeEnum.USERDEFINED = "USERDEFINED";
+IfcSlabTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcSolarDeviceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSolarDeviceTypeEnum.SOLARCOLLECTOR = "SOLARCOLLECTOR";
+IfcSolarDeviceTypeEnum.SOLARPANEL = "SOLARPANEL";
+IfcSolarDeviceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcSolarDeviceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcSpaceHeaterTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSpaceHeaterTypeEnum.CONVECTOR = "CONVECTOR";
+IfcSpaceHeaterTypeEnum.RADIATOR = "RADIATOR";
+IfcSpaceHeaterTypeEnum.USERDEFINED = "USERDEFINED";
+IfcSpaceHeaterTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcSpaceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSpaceTypeEnum.SPACE = "SPACE";
+IfcSpaceTypeEnum.PARKING = "PARKING";
+IfcSpaceTypeEnum.GFA = "GFA";
+IfcSpaceTypeEnum.INTERNAL = "INTERNAL";
+IfcSpaceTypeEnum.EXTERNAL = "EXTERNAL";
+IfcSpaceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcSpaceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcSpatialZoneTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSpatialZoneTypeEnum.CONSTRUCTION = "CONSTRUCTION";
+IfcSpatialZoneTypeEnum.FIRESAFETY = "FIRESAFETY";
+IfcSpatialZoneTypeEnum.LIGHTING = "LIGHTING";
+IfcSpatialZoneTypeEnum.OCCUPANCY = "OCCUPANCY";
+IfcSpatialZoneTypeEnum.SECURITY = "SECURITY";
+IfcSpatialZoneTypeEnum.THERMAL = "THERMAL";
+IfcSpatialZoneTypeEnum.TRANSPORT = "TRANSPORT";
+IfcSpatialZoneTypeEnum.VENTILATION = "VENTILATION";
+IfcSpatialZoneTypeEnum.USERDEFINED = "USERDEFINED";
+IfcSpatialZoneTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcStackTerminalTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcStackTerminalTypeEnum.BIRDCAGE = "BIRDCAGE";
+IfcStackTerminalTypeEnum.COWL = "COWL";
+IfcStackTerminalTypeEnum.RAINWATERHOPPER = "RAINWATERHOPPER";
+IfcStackTerminalTypeEnum.USERDEFINED = "USERDEFINED";
+IfcStackTerminalTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcStairFlightTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcStairFlightTypeEnum.STRAIGHT = "STRAIGHT";
+IfcStairFlightTypeEnum.WINDER = "WINDER";
+IfcStairFlightTypeEnum.SPIRAL = "SPIRAL";
+IfcStairFlightTypeEnum.CURVED = "CURVED";
+IfcStairFlightTypeEnum.FREEFORM = "FREEFORM";
+IfcStairFlightTypeEnum.USERDEFINED = "USERDEFINED";
+IfcStairFlightTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcStairTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcStairTypeEnum.STRAIGHT_RUN_STAIR = "STRAIGHT_RUN_STAIR";
+IfcStairTypeEnum.TWO_STRAIGHT_RUN_STAIR = "TWO_STRAIGHT_RUN_STAIR";
+IfcStairTypeEnum.QUARTER_WINDING_STAIR = "QUARTER_WINDING_STAIR";
+IfcStairTypeEnum.QUARTER_TURN_STAIR = "QUARTER_TURN_STAIR";
+IfcStairTypeEnum.HALF_WINDING_STAIR = "HALF_WINDING_STAIR";
+IfcStairTypeEnum.HALF_TURN_STAIR = "HALF_TURN_STAIR";
+IfcStairTypeEnum.TWO_QUARTER_WINDING_STAIR = "TWO_QUARTER_WINDING_STAIR";
+IfcStairTypeEnum.TWO_QUARTER_TURN_STAIR = "TWO_QUARTER_TURN_STAIR";
+IfcStairTypeEnum.THREE_QUARTER_WINDING_STAIR = "THREE_QUARTER_WINDING_STAIR";
+IfcStairTypeEnum.THREE_QUARTER_TURN_STAIR = "THREE_QUARTER_TURN_STAIR";
+IfcStairTypeEnum.SPIRAL_STAIR = "SPIRAL_STAIR";
+IfcStairTypeEnum.DOUBLE_RETURN_STAIR = "DOUBLE_RETURN_STAIR";
+IfcStairTypeEnum.CURVED_RUN_STAIR = "CURVED_RUN_STAIR";
+IfcStairTypeEnum.TWO_CURVED_RUN_STAIR = "TWO_CURVED_RUN_STAIR";
+IfcStairTypeEnum.USERDEFINED = "USERDEFINED";
+IfcStairTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcStateEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcStateEnum.READWRITE = "READWRITE";
+IfcStateEnum.READONLY = "READONLY";
+IfcStateEnum.LOCKED = "LOCKED";
+IfcStateEnum.READWRITELOCKED = "READWRITELOCKED";
+IfcStateEnum.READONLYLOCKED = "READONLYLOCKED";
+var IfcStructuralCurveActivityTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcStructuralCurveActivityTypeEnum.CONST = "CONST";
+IfcStructuralCurveActivityTypeEnum.LINEAR = "LINEAR";
+IfcStructuralCurveActivityTypeEnum.POLYGONAL = "POLYGONAL";
+IfcStructuralCurveActivityTypeEnum.EQUIDISTANT = "EQUIDISTANT";
+IfcStructuralCurveActivityTypeEnum.SINUS = "SINUS";
+IfcStructuralCurveActivityTypeEnum.PARABOLA = "PARABOLA";
+IfcStructuralCurveActivityTypeEnum.DISCRETE = "DISCRETE";
+IfcStructuralCurveActivityTypeEnum.USERDEFINED = "USERDEFINED";
+IfcStructuralCurveActivityTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcStructuralCurveMemberTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcStructuralCurveMemberTypeEnum.RIGID_JOINED_MEMBER = "RIGID_JOINED_MEMBER";
+IfcStructuralCurveMemberTypeEnum.PIN_JOINED_MEMBER = "PIN_JOINED_MEMBER";
+IfcStructuralCurveMemberTypeEnum.CABLE = "CABLE";
+IfcStructuralCurveMemberTypeEnum.TENSION_MEMBER = "TENSION_MEMBER";
+IfcStructuralCurveMemberTypeEnum.COMPRESSION_MEMBER = "COMPRESSION_MEMBER";
+IfcStructuralCurveMemberTypeEnum.USERDEFINED = "USERDEFINED";
+IfcStructuralCurveMemberTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcStructuralSurfaceActivityTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcStructuralSurfaceActivityTypeEnum.CONST = "CONST";
+IfcStructuralSurfaceActivityTypeEnum.BILINEAR = "BILINEAR";
+IfcStructuralSurfaceActivityTypeEnum.DISCRETE = "DISCRETE";
+IfcStructuralSurfaceActivityTypeEnum.ISOCONTOUR = "ISOCONTOUR";
+IfcStructuralSurfaceActivityTypeEnum.USERDEFINED = "USERDEFINED";
+IfcStructuralSurfaceActivityTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcStructuralSurfaceMemberTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcStructuralSurfaceMemberTypeEnum.BENDING_ELEMENT = "BENDING_ELEMENT";
+IfcStructuralSurfaceMemberTypeEnum.MEMBRANE_ELEMENT = "MEMBRANE_ELEMENT";
+IfcStructuralSurfaceMemberTypeEnum.SHELL = "SHELL";
+IfcStructuralSurfaceMemberTypeEnum.USERDEFINED = "USERDEFINED";
+IfcStructuralSurfaceMemberTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcSubContractResourceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSubContractResourceTypeEnum.PURCHASE = "PURCHASE";
+IfcSubContractResourceTypeEnum.WORK = "WORK";
+IfcSubContractResourceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcSubContractResourceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcSurfaceFeatureTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSurfaceFeatureTypeEnum.MARK = "MARK";
+IfcSurfaceFeatureTypeEnum.TAG = "TAG";
+IfcSurfaceFeatureTypeEnum.TREATMENT = "TREATMENT";
+IfcSurfaceFeatureTypeEnum.DEFECT = "DEFECT";
+IfcSurfaceFeatureTypeEnum.USERDEFINED = "USERDEFINED";
+IfcSurfaceFeatureTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcSurfaceSide = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSurfaceSide.POSITIVE = "POSITIVE";
+IfcSurfaceSide.NEGATIVE = "NEGATIVE";
+IfcSurfaceSide.BOTH = "BOTH";
+var IfcSwitchingDeviceTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSwitchingDeviceTypeEnum.CONTACTOR = "CONTACTOR";
+IfcSwitchingDeviceTypeEnum.DIMMERSWITCH = "DIMMERSWITCH";
+IfcSwitchingDeviceTypeEnum.EMERGENCYSTOP = "EMERGENCYSTOP";
+IfcSwitchingDeviceTypeEnum.KEYPAD = "KEYPAD";
+IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH = "MOMENTARYSWITCH";
+IfcSwitchingDeviceTypeEnum.SELECTORSWITCH = "SELECTORSWITCH";
+IfcSwitchingDeviceTypeEnum.STARTER = "STARTER";
+IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR = "SWITCHDISCONNECTOR";
+IfcSwitchingDeviceTypeEnum.TOGGLESWITCH = "TOGGLESWITCH";
+IfcSwitchingDeviceTypeEnum.USERDEFINED = "USERDEFINED";
+IfcSwitchingDeviceTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcSystemFurnitureElementTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcSystemFurnitureElementTypeEnum.PANEL = "PANEL";
+IfcSystemFurnitureElementTypeEnum.WORKSURFACE = "WORKSURFACE";
+IfcSystemFurnitureElementTypeEnum.USERDEFINED = "USERDEFINED";
+IfcSystemFurnitureElementTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcTankTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTankTypeEnum.BASIN = "BASIN";
+IfcTankTypeEnum.BREAKPRESSURE = "BREAKPRESSURE";
+IfcTankTypeEnum.EXPANSION = "EXPANSION";
+IfcTankTypeEnum.FEEDANDEXPANSION = "FEEDANDEXPANSION";
+IfcTankTypeEnum.PRESSUREVESSEL = "PRESSUREVESSEL";
+IfcTankTypeEnum.STORAGE = "STORAGE";
+IfcTankTypeEnum.VESSEL = "VESSEL";
+IfcTankTypeEnum.USERDEFINED = "USERDEFINED";
+IfcTankTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcTaskDurationEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTaskDurationEnum.ELAPSEDTIME = "ELAPSEDTIME";
+IfcTaskDurationEnum.WORKTIME = "WORKTIME";
+IfcTaskDurationEnum.NOTDEFINED = "NOTDEFINED";
+var IfcTaskTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTaskTypeEnum.ATTENDANCE = "ATTENDANCE";
+IfcTaskTypeEnum.CONSTRUCTION = "CONSTRUCTION";
+IfcTaskTypeEnum.DEMOLITION = "DEMOLITION";
+IfcTaskTypeEnum.DISMANTLE = "DISMANTLE";
+IfcTaskTypeEnum.DISPOSAL = "DISPOSAL";
+IfcTaskTypeEnum.INSTALLATION = "INSTALLATION";
+IfcTaskTypeEnum.LOGISTIC = "LOGISTIC";
+IfcTaskTypeEnum.MAINTENANCE = "MAINTENANCE";
+IfcTaskTypeEnum.MOVE = "MOVE";
+IfcTaskTypeEnum.OPERATION = "OPERATION";
+IfcTaskTypeEnum.REMOVAL = "REMOVAL";
+IfcTaskTypeEnum.RENOVATION = "RENOVATION";
+IfcTaskTypeEnum.USERDEFINED = "USERDEFINED";
+IfcTaskTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcTendonAnchorTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTendonAnchorTypeEnum.COUPLER = "COUPLER";
+IfcTendonAnchorTypeEnum.FIXED_END = "FIXED_END";
+IfcTendonAnchorTypeEnum.TENSIONING_END = "TENSIONING_END";
+IfcTendonAnchorTypeEnum.USERDEFINED = "USERDEFINED";
+IfcTendonAnchorTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcTendonConduitTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTendonConduitTypeEnum.DUCT = "DUCT";
+IfcTendonConduitTypeEnum.COUPLER = "COUPLER";
+IfcTendonConduitTypeEnum.GROUTING_DUCT = "GROUTING_DUCT";
+IfcTendonConduitTypeEnum.TRUMPET = "TRUMPET";
+IfcTendonConduitTypeEnum.DIABOLO = "DIABOLO";
+IfcTendonConduitTypeEnum.USERDEFINED = "USERDEFINED";
+IfcTendonConduitTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcTendonTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTendonTypeEnum.BAR = "BAR";
+IfcTendonTypeEnum.COATED = "COATED";
+IfcTendonTypeEnum.STRAND = "STRAND";
+IfcTendonTypeEnum.WIRE = "WIRE";
+IfcTendonTypeEnum.USERDEFINED = "USERDEFINED";
+IfcTendonTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcTextPath = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTextPath.LEFT = "LEFT";
+IfcTextPath.RIGHT = "RIGHT";
+IfcTextPath.UP = "UP";
+IfcTextPath.DOWN = "DOWN";
+var IfcTimeSeriesDataTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTimeSeriesDataTypeEnum.CONTINUOUS = "CONTINUOUS";
+IfcTimeSeriesDataTypeEnum.DISCRETE = "DISCRETE";
+IfcTimeSeriesDataTypeEnum.DISCRETEBINARY = "DISCRETEBINARY";
+IfcTimeSeriesDataTypeEnum.PIECEWISEBINARY = "PIECEWISEBINARY";
+IfcTimeSeriesDataTypeEnum.PIECEWISECONSTANT = "PIECEWISECONSTANT";
+IfcTimeSeriesDataTypeEnum.PIECEWISECONTINUOUS = "PIECEWISECONTINUOUS";
+IfcTimeSeriesDataTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcTransformerTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTransformerTypeEnum.CURRENT = "CURRENT";
+IfcTransformerTypeEnum.FREQUENCY = "FREQUENCY";
+IfcTransformerTypeEnum.INVERTER = "INVERTER";
+IfcTransformerTypeEnum.RECTIFIER = "RECTIFIER";
+IfcTransformerTypeEnum.VOLTAGE = "VOLTAGE";
+IfcTransformerTypeEnum.USERDEFINED = "USERDEFINED";
+IfcTransformerTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcTransitionCode = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTransitionCode.DISCONTINUOUS = "DISCONTINUOUS";
+IfcTransitionCode.CONTINUOUS = "CONTINUOUS";
+IfcTransitionCode.CONTSAMEGRADIENT = "CONTSAMEGRADIENT";
+IfcTransitionCode.CONTSAMEGRADIENTSAMECURVATURE = "CONTSAMEGRADIENTSAMECURVATURE";
+var IfcTransitionCurveType = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTransitionCurveType.BIQUADRATICPARABOLA = "BIQUADRATICPARABOLA";
+IfcTransitionCurveType.BLOSSCURVE = "BLOSSCURVE";
+IfcTransitionCurveType.CLOTHOIDCURVE = "CLOTHOIDCURVE";
+IfcTransitionCurveType.COSINECURVE = "COSINECURVE";
+IfcTransitionCurveType.CUBICPARABOLA = "CUBICPARABOLA";
+IfcTransitionCurveType.SINECURVE = "SINECURVE";
+var IfcTransportElementTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTransportElementTypeEnum.ELEVATOR = "ELEVATOR";
+IfcTransportElementTypeEnum.ESCALATOR = "ESCALATOR";
+IfcTransportElementTypeEnum.MOVINGWALKWAY = "MOVINGWALKWAY";
+IfcTransportElementTypeEnum.CRANEWAY = "CRANEWAY";
+IfcTransportElementTypeEnum.LIFTINGGEAR = "LIFTINGGEAR";
+IfcTransportElementTypeEnum.USERDEFINED = "USERDEFINED";
+IfcTransportElementTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcTrimmingPreference = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTrimmingPreference.CARTESIAN = "CARTESIAN";
+IfcTrimmingPreference.PARAMETER = "PARAMETER";
+IfcTrimmingPreference.UNSPECIFIED = "UNSPECIFIED";
+var IfcTubeBundleTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcTubeBundleTypeEnum.FINNED = "FINNED";
+IfcTubeBundleTypeEnum.USERDEFINED = "USERDEFINED";
+IfcTubeBundleTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcUnitEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcUnitEnum.ABSORBEDDOSEUNIT = "ABSORBEDDOSEUNIT";
+IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT = "AMOUNTOFSUBSTANCEUNIT";
+IfcUnitEnum.AREAUNIT = "AREAUNIT";
+IfcUnitEnum.DOSEEQUIVALENTUNIT = "DOSEEQUIVALENTUNIT";
+IfcUnitEnum.ELECTRICCAPACITANCEUNIT = "ELECTRICCAPACITANCEUNIT";
+IfcUnitEnum.ELECTRICCHARGEUNIT = "ELECTRICCHARGEUNIT";
+IfcUnitEnum.ELECTRICCONDUCTANCEUNIT = "ELECTRICCONDUCTANCEUNIT";
+IfcUnitEnum.ELECTRICCURRENTUNIT = "ELECTRICCURRENTUNIT";
+IfcUnitEnum.ELECTRICRESISTANCEUNIT = "ELECTRICRESISTANCEUNIT";
+IfcUnitEnum.ELECTRICVOLTAGEUNIT = "ELECTRICVOLTAGEUNIT";
+IfcUnitEnum.ENERGYUNIT = "ENERGYUNIT";
+IfcUnitEnum.FORCEUNIT = "FORCEUNIT";
+IfcUnitEnum.FREQUENCYUNIT = "FREQUENCYUNIT";
+IfcUnitEnum.ILLUMINANCEUNIT = "ILLUMINANCEUNIT";
+IfcUnitEnum.INDUCTANCEUNIT = "INDUCTANCEUNIT";
+IfcUnitEnum.LENGTHUNIT = "LENGTHUNIT";
+IfcUnitEnum.LUMINOUSFLUXUNIT = "LUMINOUSFLUXUNIT";
+IfcUnitEnum.LUMINOUSINTENSITYUNIT = "LUMINOUSINTENSITYUNIT";
+IfcUnitEnum.MAGNETICFLUXDENSITYUNIT = "MAGNETICFLUXDENSITYUNIT";
+IfcUnitEnum.MAGNETICFLUXUNIT = "MAGNETICFLUXUNIT";
+IfcUnitEnum.MASSUNIT = "MASSUNIT";
+IfcUnitEnum.PLANEANGLEUNIT = "PLANEANGLEUNIT";
+IfcUnitEnum.POWERUNIT = "POWERUNIT";
+IfcUnitEnum.PRESSUREUNIT = "PRESSUREUNIT";
+IfcUnitEnum.RADIOACTIVITYUNIT = "RADIOACTIVITYUNIT";
+IfcUnitEnum.SOLIDANGLEUNIT = "SOLIDANGLEUNIT";
+IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT = "THERMODYNAMICTEMPERATUREUNIT";
+IfcUnitEnum.TIMEUNIT = "TIMEUNIT";
+IfcUnitEnum.VOLUMEUNIT = "VOLUMEUNIT";
+IfcUnitEnum.USERDEFINED = "USERDEFINED";
+var IfcUnitaryControlElementTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcUnitaryControlElementTypeEnum.ALARMPANEL = "ALARMPANEL";
+IfcUnitaryControlElementTypeEnum.CONTROLPANEL = "CONTROLPANEL";
+IfcUnitaryControlElementTypeEnum.GASDETECTIONPANEL = "GASDETECTIONPANEL";
+IfcUnitaryControlElementTypeEnum.INDICATORPANEL = "INDICATORPANEL";
+IfcUnitaryControlElementTypeEnum.MIMICPANEL = "MIMICPANEL";
+IfcUnitaryControlElementTypeEnum.HUMIDISTAT = "HUMIDISTAT";
+IfcUnitaryControlElementTypeEnum.THERMOSTAT = "THERMOSTAT";
+IfcUnitaryControlElementTypeEnum.WEATHERSTATION = "WEATHERSTATION";
+IfcUnitaryControlElementTypeEnum.USERDEFINED = "USERDEFINED";
+IfcUnitaryControlElementTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcUnitaryEquipmentTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcUnitaryEquipmentTypeEnum.AIRHANDLER = "AIRHANDLER";
+IfcUnitaryEquipmentTypeEnum.AIRCONDITIONINGUNIT = "AIRCONDITIONINGUNIT";
+IfcUnitaryEquipmentTypeEnum.DEHUMIDIFIER = "DEHUMIDIFIER";
+IfcUnitaryEquipmentTypeEnum.SPLITSYSTEM = "SPLITSYSTEM";
+IfcUnitaryEquipmentTypeEnum.ROOFTOPUNIT = "ROOFTOPUNIT";
+IfcUnitaryEquipmentTypeEnum.USERDEFINED = "USERDEFINED";
+IfcUnitaryEquipmentTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcValveTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcValveTypeEnum.AIRRELEASE = "AIRRELEASE";
+IfcValveTypeEnum.ANTIVACUUM = "ANTIVACUUM";
+IfcValveTypeEnum.CHANGEOVER = "CHANGEOVER";
+IfcValveTypeEnum.CHECK = "CHECK";
+IfcValveTypeEnum.COMMISSIONING = "COMMISSIONING";
+IfcValveTypeEnum.DIVERTING = "DIVERTING";
+IfcValveTypeEnum.DRAWOFFCOCK = "DRAWOFFCOCK";
+IfcValveTypeEnum.DOUBLECHECK = "DOUBLECHECK";
+IfcValveTypeEnum.DOUBLEREGULATING = "DOUBLEREGULATING";
+IfcValveTypeEnum.FAUCET = "FAUCET";
+IfcValveTypeEnum.FLUSHING = "FLUSHING";
+IfcValveTypeEnum.GASCOCK = "GASCOCK";
+IfcValveTypeEnum.GASTAP = "GASTAP";
+IfcValveTypeEnum.ISOLATING = "ISOLATING";
+IfcValveTypeEnum.MIXING = "MIXING";
+IfcValveTypeEnum.PRESSUREREDUCING = "PRESSUREREDUCING";
+IfcValveTypeEnum.PRESSURERELIEF = "PRESSURERELIEF";
+IfcValveTypeEnum.REGULATING = "REGULATING";
+IfcValveTypeEnum.SAFETYCUTOFF = "SAFETYCUTOFF";
+IfcValveTypeEnum.STEAMTRAP = "STEAMTRAP";
+IfcValveTypeEnum.STOPCOCK = "STOPCOCK";
+IfcValveTypeEnum.USERDEFINED = "USERDEFINED";
+IfcValveTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcVibrationDamperTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcVibrationDamperTypeEnum.BENDING_YIELD = "BENDING_YIELD";
+IfcVibrationDamperTypeEnum.SHEAR_YIELD = "SHEAR_YIELD";
+IfcVibrationDamperTypeEnum.AXIAL_YIELD = "AXIAL_YIELD";
+IfcVibrationDamperTypeEnum.FRICTION = "FRICTION";
+IfcVibrationDamperTypeEnum.VISCOUS = "VISCOUS";
+IfcVibrationDamperTypeEnum.RUBBER = "RUBBER";
+IfcVibrationDamperTypeEnum.USERDEFINED = "USERDEFINED";
+IfcVibrationDamperTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcVibrationIsolatorTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcVibrationIsolatorTypeEnum.COMPRESSION = "COMPRESSION";
+IfcVibrationIsolatorTypeEnum.SPRING = "SPRING";
+IfcVibrationIsolatorTypeEnum.BASE = "BASE";
+IfcVibrationIsolatorTypeEnum.USERDEFINED = "USERDEFINED";
+IfcVibrationIsolatorTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcVoidingFeatureTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcVoidingFeatureTypeEnum.CUTOUT = "CUTOUT";
+IfcVoidingFeatureTypeEnum.NOTCH = "NOTCH";
+IfcVoidingFeatureTypeEnum.HOLE = "HOLE";
+IfcVoidingFeatureTypeEnum.MITER = "MITER";
+IfcVoidingFeatureTypeEnum.CHAMFER = "CHAMFER";
+IfcVoidingFeatureTypeEnum.EDGE = "EDGE";
+IfcVoidingFeatureTypeEnum.USERDEFINED = "USERDEFINED";
+IfcVoidingFeatureTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcWallTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcWallTypeEnum.MOVABLE = "MOVABLE";
+IfcWallTypeEnum.PARAPET = "PARAPET";
+IfcWallTypeEnum.PARTITIONING = "PARTITIONING";
+IfcWallTypeEnum.PLUMBINGWALL = "PLUMBINGWALL";
+IfcWallTypeEnum.SHEAR = "SHEAR";
+IfcWallTypeEnum.SOLIDWALL = "SOLIDWALL";
+IfcWallTypeEnum.STANDARD = "STANDARD";
+IfcWallTypeEnum.POLYGONAL = "POLYGONAL";
+IfcWallTypeEnum.ELEMENTEDWALL = "ELEMENTEDWALL";
+IfcWallTypeEnum.RETAININGWALL = "RETAININGWALL";
+IfcWallTypeEnum.USERDEFINED = "USERDEFINED";
+IfcWallTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcWasteTerminalTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcWasteTerminalTypeEnum.FLOORTRAP = "FLOORTRAP";
+IfcWasteTerminalTypeEnum.FLOORWASTE = "FLOORWASTE";
+IfcWasteTerminalTypeEnum.GULLYSUMP = "GULLYSUMP";
+IfcWasteTerminalTypeEnum.GULLYTRAP = "GULLYTRAP";
+IfcWasteTerminalTypeEnum.ROOFDRAIN = "ROOFDRAIN";
+IfcWasteTerminalTypeEnum.WASTEDISPOSALUNIT = "WASTEDISPOSALUNIT";
+IfcWasteTerminalTypeEnum.WASTETRAP = "WASTETRAP";
+IfcWasteTerminalTypeEnum.USERDEFINED = "USERDEFINED";
+IfcWasteTerminalTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcWindowPanelOperationEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcWindowPanelOperationEnum.SIDEHUNGRIGHTHAND = "SIDEHUNGRIGHTHAND";
+IfcWindowPanelOperationEnum.SIDEHUNGLEFTHAND = "SIDEHUNGLEFTHAND";
+IfcWindowPanelOperationEnum.TILTANDTURNRIGHTHAND = "TILTANDTURNRIGHTHAND";
+IfcWindowPanelOperationEnum.TILTANDTURNLEFTHAND = "TILTANDTURNLEFTHAND";
+IfcWindowPanelOperationEnum.TOPHUNG = "TOPHUNG";
+IfcWindowPanelOperationEnum.BOTTOMHUNG = "BOTTOMHUNG";
+IfcWindowPanelOperationEnum.PIVOTHORIZONTAL = "PIVOTHORIZONTAL";
+IfcWindowPanelOperationEnum.PIVOTVERTICAL = "PIVOTVERTICAL";
+IfcWindowPanelOperationEnum.SLIDINGHORIZONTAL = "SLIDINGHORIZONTAL";
+IfcWindowPanelOperationEnum.SLIDINGVERTICAL = "SLIDINGVERTICAL";
+IfcWindowPanelOperationEnum.REMOVABLECASEMENT = "REMOVABLECASEMENT";
+IfcWindowPanelOperationEnum.FIXEDCASEMENT = "FIXEDCASEMENT";
+IfcWindowPanelOperationEnum.OTHEROPERATION = "OTHEROPERATION";
+IfcWindowPanelOperationEnum.NOTDEFINED = "NOTDEFINED";
+var IfcWindowPanelPositionEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcWindowPanelPositionEnum.LEFT = "LEFT";
+IfcWindowPanelPositionEnum.MIDDLE = "MIDDLE";
+IfcWindowPanelPositionEnum.RIGHT = "RIGHT";
+IfcWindowPanelPositionEnum.BOTTOM = "BOTTOM";
+IfcWindowPanelPositionEnum.TOP = "TOP";
+IfcWindowPanelPositionEnum.NOTDEFINED = "NOTDEFINED";
+var IfcWindowStyleConstructionEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcWindowStyleConstructionEnum.ALUMINIUM = "ALUMINIUM";
+IfcWindowStyleConstructionEnum.HIGH_GRADE_STEEL = "HIGH_GRADE_STEEL";
+IfcWindowStyleConstructionEnum.STEEL = "STEEL";
+IfcWindowStyleConstructionEnum.WOOD = "WOOD";
+IfcWindowStyleConstructionEnum.ALUMINIUM_WOOD = "ALUMINIUM_WOOD";
+IfcWindowStyleConstructionEnum.PLASTIC = "PLASTIC";
+IfcWindowStyleConstructionEnum.OTHER_CONSTRUCTION = "OTHER_CONSTRUCTION";
+IfcWindowStyleConstructionEnum.NOTDEFINED = "NOTDEFINED";
+var IfcWindowStyleOperationEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcWindowStyleOperationEnum.SINGLE_PANEL = "SINGLE_PANEL";
+IfcWindowStyleOperationEnum.DOUBLE_PANEL_VERTICAL = "DOUBLE_PANEL_VERTICAL";
+IfcWindowStyleOperationEnum.DOUBLE_PANEL_HORIZONTAL = "DOUBLE_PANEL_HORIZONTAL";
+IfcWindowStyleOperationEnum.TRIPLE_PANEL_VERTICAL = "TRIPLE_PANEL_VERTICAL";
+IfcWindowStyleOperationEnum.TRIPLE_PANEL_BOTTOM = "TRIPLE_PANEL_BOTTOM";
+IfcWindowStyleOperationEnum.TRIPLE_PANEL_TOP = "TRIPLE_PANEL_TOP";
+IfcWindowStyleOperationEnum.TRIPLE_PANEL_LEFT = "TRIPLE_PANEL_LEFT";
+IfcWindowStyleOperationEnum.TRIPLE_PANEL_RIGHT = "TRIPLE_PANEL_RIGHT";
+IfcWindowStyleOperationEnum.TRIPLE_PANEL_HORIZONTAL = "TRIPLE_PANEL_HORIZONTAL";
+IfcWindowStyleOperationEnum.USERDEFINED = "USERDEFINED";
+IfcWindowStyleOperationEnum.NOTDEFINED = "NOTDEFINED";
+var IfcWindowTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcWindowTypeEnum.WINDOW = "WINDOW";
+IfcWindowTypeEnum.SKYLIGHT = "SKYLIGHT";
+IfcWindowTypeEnum.LIGHTDOME = "LIGHTDOME";
+IfcWindowTypeEnum.USERDEFINED = "USERDEFINED";
+IfcWindowTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcWindowTypePartitioningEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcWindowTypePartitioningEnum.SINGLE_PANEL = "SINGLE_PANEL";
+IfcWindowTypePartitioningEnum.DOUBLE_PANEL_VERTICAL = "DOUBLE_PANEL_VERTICAL";
+IfcWindowTypePartitioningEnum.DOUBLE_PANEL_HORIZONTAL = "DOUBLE_PANEL_HORIZONTAL";
+IfcWindowTypePartitioningEnum.TRIPLE_PANEL_VERTICAL = "TRIPLE_PANEL_VERTICAL";
+IfcWindowTypePartitioningEnum.TRIPLE_PANEL_BOTTOM = "TRIPLE_PANEL_BOTTOM";
+IfcWindowTypePartitioningEnum.TRIPLE_PANEL_TOP = "TRIPLE_PANEL_TOP";
+IfcWindowTypePartitioningEnum.TRIPLE_PANEL_LEFT = "TRIPLE_PANEL_LEFT";
+IfcWindowTypePartitioningEnum.TRIPLE_PANEL_RIGHT = "TRIPLE_PANEL_RIGHT";
+IfcWindowTypePartitioningEnum.TRIPLE_PANEL_HORIZONTAL = "TRIPLE_PANEL_HORIZONTAL";
+IfcWindowTypePartitioningEnum.USERDEFINED = "USERDEFINED";
+IfcWindowTypePartitioningEnum.NOTDEFINED = "NOTDEFINED";
+var IfcWorkCalendarTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcWorkCalendarTypeEnum.FIRSTSHIFT = "FIRSTSHIFT";
+IfcWorkCalendarTypeEnum.SECONDSHIFT = "SECONDSHIFT";
+IfcWorkCalendarTypeEnum.THIRDSHIFT = "THIRDSHIFT";
+IfcWorkCalendarTypeEnum.USERDEFINED = "USERDEFINED";
+IfcWorkCalendarTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcWorkPlanTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcWorkPlanTypeEnum.ACTUAL = "ACTUAL";
+IfcWorkPlanTypeEnum.BASELINE = "BASELINE";
+IfcWorkPlanTypeEnum.PLANNED = "PLANNED";
+IfcWorkPlanTypeEnum.USERDEFINED = "USERDEFINED";
+IfcWorkPlanTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcWorkScheduleTypeEnum = class {
+  constructor(v) {
+    this.value = v;
+  }
+};
+IfcWorkScheduleTypeEnum.ACTUAL = "ACTUAL";
+IfcWorkScheduleTypeEnum.BASELINE = "BASELINE";
+IfcWorkScheduleTypeEnum.PLANNED = "PLANNED";
+IfcWorkScheduleTypeEnum.USERDEFINED = "USERDEFINED";
+IfcWorkScheduleTypeEnum.NOTDEFINED = "NOTDEFINED";
+var IfcActionRequest = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, LongDescription) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.PredefinedType = PredefinedType;
+    this.Status = Status;
+    this.LongDescription = LongDescription;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let Status = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    return new IfcActionRequest(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, LongDescription);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.Status);
+    ;
+    args.push(this.LongDescription);
+    ;
+    return args;
+  }
+};
+var IfcActor = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, TheActor) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.TheActor = TheActor;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let TheActor = tape[ptr++];
+    return new IfcActor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, TheActor);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.TheActor);
+    ;
+    return args;
+  }
+};
+var IfcActorRole = class {
+  constructor(expressID, type, Role, UserDefinedRole, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Role = Role;
+    this.UserDefinedRole = UserDefinedRole;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Role = tape[ptr++];
+    let UserDefinedRole = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcActorRole(expressID, type, Role, UserDefinedRole, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Role);
+    ;
+    args.push(this.UserDefinedRole);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcActuator = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcActuator(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcActuatorType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcActuatorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcAddress = class {
+  constructor(expressID, type, Purpose, Description, UserDefinedPurpose) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Purpose = Purpose;
+    this.Description = Description;
+    this.UserDefinedPurpose = UserDefinedPurpose;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Purpose = tape[ptr++];
+    let Description = tape[ptr++];
+    let UserDefinedPurpose = tape[ptr++];
+    return new IfcAddress(expressID, type, Purpose, Description, UserDefinedPurpose);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Purpose);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.UserDefinedPurpose);
+    ;
+    return args;
+  }
+};
+var IfcAdvancedBrep = class {
+  constructor(expressID, type, Outer) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Outer = Outer;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Outer = tape[ptr++];
+    return new IfcAdvancedBrep(expressID, type, Outer);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Outer);
+    ;
+    return args;
+  }
+};
+var IfcAdvancedBrepWithVoids = class {
+  constructor(expressID, type, Outer, Voids) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Outer = Outer;
+    this.Voids = Voids;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Outer = tape[ptr++];
+    let Voids = tape[ptr++];
+    return new IfcAdvancedBrepWithVoids(expressID, type, Outer, Voids);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Outer);
+    ;
+    args.push(this.Voids);
+    ;
+    return args;
+  }
+};
+var IfcAdvancedFace = class {
+  constructor(expressID, type, Bounds, FaceSurface, SameSense) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Bounds = Bounds;
+    this.FaceSurface = FaceSurface;
+    this.SameSense = SameSense;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Bounds = tape[ptr++];
+    let FaceSurface = tape[ptr++];
+    let SameSense = tape[ptr++];
+    return new IfcAdvancedFace(expressID, type, Bounds, FaceSurface, SameSense);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Bounds);
+    ;
+    args.push(this.FaceSurface);
+    ;
+    args.push(this.SameSense);
+    ;
+    return args;
+  }
+};
+var IfcAirTerminal = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcAirTerminal(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcAirTerminalBox = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcAirTerminalBox(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcAirTerminalBoxType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcAirTerminalBoxType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcAirTerminalType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcAirTerminalType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcAirToAirHeatRecovery = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcAirToAirHeatRecovery(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcAirToAirHeatRecoveryType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcAirToAirHeatRecoveryType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcAlarm = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcAlarm(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcAlarmType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcAlarmType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcAlignment = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Axis, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Axis = Axis;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Axis = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcAlignment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Axis, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Axis);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcAlignment2DHorizontal = class {
+  constructor(expressID, type, StartDistAlong, Segments) {
+    this.expressID = expressID;
+    this.type = type;
+    this.StartDistAlong = StartDistAlong;
+    this.Segments = Segments;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let StartDistAlong = tape[ptr++];
+    let Segments = tape[ptr++];
+    return new IfcAlignment2DHorizontal(expressID, type, StartDistAlong, Segments);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.StartDistAlong);
+    ;
+    args.push(this.Segments);
+    ;
+    return args;
+  }
+};
+var IfcAlignment2DHorizontalSegment = class {
+  constructor(expressID, type, TangentialContinuity, StartTag, EndTag, CurveGeometry) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TangentialContinuity = TangentialContinuity;
+    this.StartTag = StartTag;
+    this.EndTag = EndTag;
+    this.CurveGeometry = CurveGeometry;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TangentialContinuity = tape[ptr++];
+    let StartTag = tape[ptr++];
+    let EndTag = tape[ptr++];
+    let CurveGeometry = tape[ptr++];
+    return new IfcAlignment2DHorizontalSegment(expressID, type, TangentialContinuity, StartTag, EndTag, CurveGeometry);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TangentialContinuity);
+    ;
+    args.push(this.StartTag);
+    ;
+    args.push(this.EndTag);
+    ;
+    args.push(this.CurveGeometry);
+    ;
+    return args;
+  }
+};
+var IfcAlignment2DSegment = class {
+  constructor(expressID, type, TangentialContinuity, StartTag, EndTag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TangentialContinuity = TangentialContinuity;
+    this.StartTag = StartTag;
+    this.EndTag = EndTag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TangentialContinuity = tape[ptr++];
+    let StartTag = tape[ptr++];
+    let EndTag = tape[ptr++];
+    return new IfcAlignment2DSegment(expressID, type, TangentialContinuity, StartTag, EndTag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TangentialContinuity);
+    ;
+    args.push(this.StartTag);
+    ;
+    args.push(this.EndTag);
+    ;
+    return args;
+  }
+};
+var IfcAlignment2DVerSegCircularArc = class {
+  constructor(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient, Radius, IsConvex) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TangentialContinuity = TangentialContinuity;
+    this.StartTag = StartTag;
+    this.EndTag = EndTag;
+    this.StartDistAlong = StartDistAlong;
+    this.HorizontalLength = HorizontalLength;
+    this.StartHeight = StartHeight;
+    this.StartGradient = StartGradient;
+    this.Radius = Radius;
+    this.IsConvex = IsConvex;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TangentialContinuity = tape[ptr++];
+    let StartTag = tape[ptr++];
+    let EndTag = tape[ptr++];
+    let StartDistAlong = tape[ptr++];
+    let HorizontalLength = tape[ptr++];
+    let StartHeight = tape[ptr++];
+    let StartGradient = tape[ptr++];
+    let Radius = tape[ptr++];
+    let IsConvex = tape[ptr++];
+    return new IfcAlignment2DVerSegCircularArc(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient, Radius, IsConvex);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TangentialContinuity);
+    ;
+    args.push(this.StartTag);
+    ;
+    args.push(this.EndTag);
+    ;
+    args.push(this.StartDistAlong);
+    ;
+    args.push(this.HorizontalLength);
+    ;
+    args.push(this.StartHeight);
+    ;
+    args.push(this.StartGradient);
+    ;
+    args.push(this.Radius);
+    ;
+    args.push(this.IsConvex);
+    ;
+    return args;
+  }
+};
+var IfcAlignment2DVerSegLine = class {
+  constructor(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TangentialContinuity = TangentialContinuity;
+    this.StartTag = StartTag;
+    this.EndTag = EndTag;
+    this.StartDistAlong = StartDistAlong;
+    this.HorizontalLength = HorizontalLength;
+    this.StartHeight = StartHeight;
+    this.StartGradient = StartGradient;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TangentialContinuity = tape[ptr++];
+    let StartTag = tape[ptr++];
+    let EndTag = tape[ptr++];
+    let StartDistAlong = tape[ptr++];
+    let HorizontalLength = tape[ptr++];
+    let StartHeight = tape[ptr++];
+    let StartGradient = tape[ptr++];
+    return new IfcAlignment2DVerSegLine(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TangentialContinuity);
+    ;
+    args.push(this.StartTag);
+    ;
+    args.push(this.EndTag);
+    ;
+    args.push(this.StartDistAlong);
+    ;
+    args.push(this.HorizontalLength);
+    ;
+    args.push(this.StartHeight);
+    ;
+    args.push(this.StartGradient);
+    ;
+    return args;
+  }
+};
+var IfcAlignment2DVerSegParabolicArc = class {
+  constructor(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient, ParabolaConstant, IsConvex) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TangentialContinuity = TangentialContinuity;
+    this.StartTag = StartTag;
+    this.EndTag = EndTag;
+    this.StartDistAlong = StartDistAlong;
+    this.HorizontalLength = HorizontalLength;
+    this.StartHeight = StartHeight;
+    this.StartGradient = StartGradient;
+    this.ParabolaConstant = ParabolaConstant;
+    this.IsConvex = IsConvex;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TangentialContinuity = tape[ptr++];
+    let StartTag = tape[ptr++];
+    let EndTag = tape[ptr++];
+    let StartDistAlong = tape[ptr++];
+    let HorizontalLength = tape[ptr++];
+    let StartHeight = tape[ptr++];
+    let StartGradient = tape[ptr++];
+    let ParabolaConstant = tape[ptr++];
+    let IsConvex = tape[ptr++];
+    return new IfcAlignment2DVerSegParabolicArc(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient, ParabolaConstant, IsConvex);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TangentialContinuity);
+    ;
+    args.push(this.StartTag);
+    ;
+    args.push(this.EndTag);
+    ;
+    args.push(this.StartDistAlong);
+    ;
+    args.push(this.HorizontalLength);
+    ;
+    args.push(this.StartHeight);
+    ;
+    args.push(this.StartGradient);
+    ;
+    args.push(this.ParabolaConstant);
+    ;
+    args.push(this.IsConvex);
+    ;
+    return args;
+  }
+};
+var IfcAlignment2DVertical = class {
+  constructor(expressID, type, Segments) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Segments = Segments;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Segments = tape[ptr++];
+    return new IfcAlignment2DVertical(expressID, type, Segments);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Segments);
+    ;
+    return args;
+  }
+};
+var IfcAlignment2DVerticalSegment = class {
+  constructor(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TangentialContinuity = TangentialContinuity;
+    this.StartTag = StartTag;
+    this.EndTag = EndTag;
+    this.StartDistAlong = StartDistAlong;
+    this.HorizontalLength = HorizontalLength;
+    this.StartHeight = StartHeight;
+    this.StartGradient = StartGradient;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TangentialContinuity = tape[ptr++];
+    let StartTag = tape[ptr++];
+    let EndTag = tape[ptr++];
+    let StartDistAlong = tape[ptr++];
+    let HorizontalLength = tape[ptr++];
+    let StartHeight = tape[ptr++];
+    let StartGradient = tape[ptr++];
+    return new IfcAlignment2DVerticalSegment(expressID, type, TangentialContinuity, StartTag, EndTag, StartDistAlong, HorizontalLength, StartHeight, StartGradient);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TangentialContinuity);
+    ;
+    args.push(this.StartTag);
+    ;
+    args.push(this.EndTag);
+    ;
+    args.push(this.StartDistAlong);
+    ;
+    args.push(this.HorizontalLength);
+    ;
+    args.push(this.StartHeight);
+    ;
+    args.push(this.StartGradient);
+    ;
+    return args;
+  }
+};
+var IfcAlignmentCurve = class {
+  constructor(expressID, type, Horizontal, Vertical, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Horizontal = Horizontal;
+    this.Vertical = Vertical;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Horizontal = tape[ptr++];
+    let Vertical = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcAlignmentCurve(expressID, type, Horizontal, Vertical, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Horizontal);
+    ;
+    args.push(this.Vertical);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcAnnotation = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    return new IfcAnnotation(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    return args;
+  }
+};
+var IfcAnnotationFillArea = class {
+  constructor(expressID, type, OuterBoundary, InnerBoundaries) {
+    this.expressID = expressID;
+    this.type = type;
+    this.OuterBoundary = OuterBoundary;
+    this.InnerBoundaries = InnerBoundaries;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let OuterBoundary = tape[ptr++];
+    let InnerBoundaries = tape[ptr++];
+    return new IfcAnnotationFillArea(expressID, type, OuterBoundary, InnerBoundaries);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.OuterBoundary);
+    ;
+    args.push(this.InnerBoundaries);
+    ;
+    return args;
+  }
+};
+var IfcApplication = class {
+  constructor(expressID, type, ApplicationDeveloper, Version, ApplicationFullName, ApplicationIdentifier) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ApplicationDeveloper = ApplicationDeveloper;
+    this.Version = Version;
+    this.ApplicationFullName = ApplicationFullName;
+    this.ApplicationIdentifier = ApplicationIdentifier;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ApplicationDeveloper = tape[ptr++];
+    let Version = tape[ptr++];
+    let ApplicationFullName = tape[ptr++];
+    let ApplicationIdentifier = tape[ptr++];
+    return new IfcApplication(expressID, type, ApplicationDeveloper, Version, ApplicationFullName, ApplicationIdentifier);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ApplicationDeveloper);
+    ;
+    args.push(this.Version);
+    ;
+    args.push(this.ApplicationFullName);
+    ;
+    args.push(this.ApplicationIdentifier);
+    ;
+    return args;
+  }
+};
+var IfcAppliedValue = class {
+  constructor(expressID, type, Name, Description, AppliedValue, UnitBasis, ApplicableDate, FixedUntilDate, Category, Condition, ArithmeticOperator, Components) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.AppliedValue = AppliedValue;
+    this.UnitBasis = UnitBasis;
+    this.ApplicableDate = ApplicableDate;
+    this.FixedUntilDate = FixedUntilDate;
+    this.Category = Category;
+    this.Condition = Condition;
+    this.ArithmeticOperator = ArithmeticOperator;
+    this.Components = Components;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let AppliedValue = tape[ptr++];
+    let UnitBasis = tape[ptr++];
+    let ApplicableDate = tape[ptr++];
+    let FixedUntilDate = tape[ptr++];
+    let Category = tape[ptr++];
+    let Condition = tape[ptr++];
+    let ArithmeticOperator = tape[ptr++];
+    let Components = tape[ptr++];
+    return new IfcAppliedValue(expressID, type, Name, Description, AppliedValue, UnitBasis, ApplicableDate, FixedUntilDate, Category, Condition, ArithmeticOperator, Components);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.AppliedValue);
+    ;
+    args.push(this.UnitBasis);
+    ;
+    args.push(this.ApplicableDate);
+    ;
+    args.push(this.FixedUntilDate);
+    ;
+    args.push(this.Category);
+    ;
+    args.push(this.Condition);
+    ;
+    args.push(this.ArithmeticOperator);
+    ;
+    args.push(this.Components);
+    ;
+    return args;
+  }
+};
+var IfcApproval = class {
+  constructor(expressID, type, Identifier, Name, Description, TimeOfApproval, Status, Level, Qualifier, RequestingApproval, GivingApproval) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Identifier = Identifier;
+    this.Name = Name;
+    this.Description = Description;
+    this.TimeOfApproval = TimeOfApproval;
+    this.Status = Status;
+    this.Level = Level;
+    this.Qualifier = Qualifier;
+    this.RequestingApproval = RequestingApproval;
+    this.GivingApproval = GivingApproval;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Identifier = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let TimeOfApproval = tape[ptr++];
+    let Status = tape[ptr++];
+    let Level = tape[ptr++];
+    let Qualifier = tape[ptr++];
+    let RequestingApproval = tape[ptr++];
+    let GivingApproval = tape[ptr++];
+    return new IfcApproval(expressID, type, Identifier, Name, Description, TimeOfApproval, Status, Level, Qualifier, RequestingApproval, GivingApproval);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Identifier);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.TimeOfApproval);
+    ;
+    args.push(this.Status);
+    ;
+    args.push(this.Level);
+    ;
+    args.push(this.Qualifier);
+    ;
+    args.push(this.RequestingApproval);
+    ;
+    args.push(this.GivingApproval);
+    ;
+    return args;
+  }
+};
+var IfcApprovalRelationship = class {
+  constructor(expressID, type, Name, Description, RelatingApproval, RelatedApprovals) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingApproval = RelatingApproval;
+    this.RelatedApprovals = RelatedApprovals;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingApproval = tape[ptr++];
+    let RelatedApprovals = tape[ptr++];
+    return new IfcApprovalRelationship(expressID, type, Name, Description, RelatingApproval, RelatedApprovals);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingApproval);
+    ;
+    args.push(this.RelatedApprovals);
+    ;
+    return args;
+  }
+};
+var IfcArbitraryClosedProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, OuterCurve) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.OuterCurve = OuterCurve;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let OuterCurve = tape[ptr++];
+    return new IfcArbitraryClosedProfileDef(expressID, type, ProfileType, ProfileName, OuterCurve);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.OuterCurve);
+    ;
+    return args;
+  }
+};
+var IfcArbitraryOpenProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Curve) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Curve = Curve;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Curve = tape[ptr++];
+    return new IfcArbitraryOpenProfileDef(expressID, type, ProfileType, ProfileName, Curve);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Curve);
+    ;
+    return args;
+  }
+};
+var IfcArbitraryProfileDefWithVoids = class {
+  constructor(expressID, type, ProfileType, ProfileName, OuterCurve, InnerCurves) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.OuterCurve = OuterCurve;
+    this.InnerCurves = InnerCurves;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let OuterCurve = tape[ptr++];
+    let InnerCurves = tape[ptr++];
+    return new IfcArbitraryProfileDefWithVoids(expressID, type, ProfileType, ProfileName, OuterCurve, InnerCurves);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.OuterCurve);
+    ;
+    args.push(this.InnerCurves);
+    ;
+    return args;
+  }
+};
+var IfcAsset = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, OriginalValue, CurrentValue, TotalReplacementCost, Owner, User, ResponsiblePerson, IncorporationDate, DepreciatedValue) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.OriginalValue = OriginalValue;
+    this.CurrentValue = CurrentValue;
+    this.TotalReplacementCost = TotalReplacementCost;
+    this.Owner = Owner;
+    this.User = User;
+    this.ResponsiblePerson = ResponsiblePerson;
+    this.IncorporationDate = IncorporationDate;
+    this.DepreciatedValue = DepreciatedValue;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let OriginalValue = tape[ptr++];
+    let CurrentValue = tape[ptr++];
+    let TotalReplacementCost = tape[ptr++];
+    let Owner = tape[ptr++];
+    let User = tape[ptr++];
+    let ResponsiblePerson = tape[ptr++];
+    let IncorporationDate = tape[ptr++];
+    let DepreciatedValue = tape[ptr++];
+    return new IfcAsset(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, OriginalValue, CurrentValue, TotalReplacementCost, Owner, User, ResponsiblePerson, IncorporationDate, DepreciatedValue);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.OriginalValue);
+    ;
+    args.push(this.CurrentValue);
+    ;
+    args.push(this.TotalReplacementCost);
+    ;
+    args.push(this.Owner);
+    ;
+    args.push(this.User);
+    ;
+    args.push(this.ResponsiblePerson);
+    ;
+    args.push(this.IncorporationDate);
+    ;
+    args.push(this.DepreciatedValue);
+    ;
+    return args;
+  }
+};
+var IfcAsymmetricIShapeProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, BottomFlangeWidth, OverallDepth, WebThickness, BottomFlangeThickness, BottomFlangeFilletRadius, TopFlangeWidth, TopFlangeThickness, TopFlangeFilletRadius, BottomFlangeEdgeRadius, BottomFlangeSlope, TopFlangeEdgeRadius, TopFlangeSlope) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.BottomFlangeWidth = BottomFlangeWidth;
+    this.OverallDepth = OverallDepth;
+    this.WebThickness = WebThickness;
+    this.BottomFlangeThickness = BottomFlangeThickness;
+    this.BottomFlangeFilletRadius = BottomFlangeFilletRadius;
+    this.TopFlangeWidth = TopFlangeWidth;
+    this.TopFlangeThickness = TopFlangeThickness;
+    this.TopFlangeFilletRadius = TopFlangeFilletRadius;
+    this.BottomFlangeEdgeRadius = BottomFlangeEdgeRadius;
+    this.BottomFlangeSlope = BottomFlangeSlope;
+    this.TopFlangeEdgeRadius = TopFlangeEdgeRadius;
+    this.TopFlangeSlope = TopFlangeSlope;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let BottomFlangeWidth = tape[ptr++];
+    let OverallDepth = tape[ptr++];
+    let WebThickness = tape[ptr++];
+    let BottomFlangeThickness = tape[ptr++];
+    let BottomFlangeFilletRadius = tape[ptr++];
+    let TopFlangeWidth = tape[ptr++];
+    let TopFlangeThickness = tape[ptr++];
+    let TopFlangeFilletRadius = tape[ptr++];
+    let BottomFlangeEdgeRadius = tape[ptr++];
+    let BottomFlangeSlope = tape[ptr++];
+    let TopFlangeEdgeRadius = tape[ptr++];
+    let TopFlangeSlope = tape[ptr++];
+    return new IfcAsymmetricIShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, BottomFlangeWidth, OverallDepth, WebThickness, BottomFlangeThickness, BottomFlangeFilletRadius, TopFlangeWidth, TopFlangeThickness, TopFlangeFilletRadius, BottomFlangeEdgeRadius, BottomFlangeSlope, TopFlangeEdgeRadius, TopFlangeSlope);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.BottomFlangeWidth);
+    ;
+    args.push(this.OverallDepth);
+    ;
+    args.push(this.WebThickness);
+    ;
+    args.push(this.BottomFlangeThickness);
+    ;
+    args.push(this.BottomFlangeFilletRadius);
+    ;
+    args.push(this.TopFlangeWidth);
+    ;
+    args.push(this.TopFlangeThickness);
+    ;
+    args.push(this.TopFlangeFilletRadius);
+    ;
+    args.push(this.BottomFlangeEdgeRadius);
+    ;
+    args.push(this.BottomFlangeSlope);
+    ;
+    args.push(this.TopFlangeEdgeRadius);
+    ;
+    args.push(this.TopFlangeSlope);
+    ;
+    return args;
+  }
+};
+var IfcAudioVisualAppliance = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcAudioVisualAppliance(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcAudioVisualApplianceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcAudioVisualApplianceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcAxis1Placement = class {
+  constructor(expressID, type, Location, Axis) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Location = Location;
+    this.Axis = Axis;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Location = tape[ptr++];
+    let Axis = tape[ptr++];
+    return new IfcAxis1Placement(expressID, type, Location, Axis);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Location);
+    ;
+    args.push(this.Axis);
+    ;
+    return args;
+  }
+};
+var IfcAxis2Placement2D = class {
+  constructor(expressID, type, Location, RefDirection) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Location = Location;
+    this.RefDirection = RefDirection;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Location = tape[ptr++];
+    let RefDirection = tape[ptr++];
+    return new IfcAxis2Placement2D(expressID, type, Location, RefDirection);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Location);
+    ;
+    args.push(this.RefDirection);
+    ;
+    return args;
+  }
+};
+var IfcAxis2Placement3D = class {
+  constructor(expressID, type, Location, Axis, RefDirection) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Location = Location;
+    this.Axis = Axis;
+    this.RefDirection = RefDirection;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Location = tape[ptr++];
+    let Axis = tape[ptr++];
+    let RefDirection = tape[ptr++];
+    return new IfcAxis2Placement3D(expressID, type, Location, Axis, RefDirection);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Location);
+    ;
+    args.push(this.Axis);
+    ;
+    args.push(this.RefDirection);
+    ;
+    return args;
+  }
+};
+var IfcBSplineCurve = class {
+  constructor(expressID, type, Degree, ControlPointsList, CurveForm, ClosedCurve, SelfIntersect) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Degree = Degree;
+    this.ControlPointsList = ControlPointsList;
+    this.CurveForm = CurveForm;
+    this.ClosedCurve = ClosedCurve;
+    this.SelfIntersect = SelfIntersect;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Degree = tape[ptr++];
+    let ControlPointsList = tape[ptr++];
+    let CurveForm = tape[ptr++];
+    let ClosedCurve = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    return new IfcBSplineCurve(expressID, type, Degree, ControlPointsList, CurveForm, ClosedCurve, SelfIntersect);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Degree);
+    ;
+    args.push(this.ControlPointsList);
+    ;
+    args.push(this.CurveForm);
+    ;
+    args.push(this.ClosedCurve);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    return args;
+  }
+};
+var IfcBSplineCurveWithKnots = class {
+  constructor(expressID, type, Degree, ControlPointsList, CurveForm, ClosedCurve, SelfIntersect, KnotMultiplicities, Knots, KnotSpec) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Degree = Degree;
+    this.ControlPointsList = ControlPointsList;
+    this.CurveForm = CurveForm;
+    this.ClosedCurve = ClosedCurve;
+    this.SelfIntersect = SelfIntersect;
+    this.KnotMultiplicities = KnotMultiplicities;
+    this.Knots = Knots;
+    this.KnotSpec = KnotSpec;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Degree = tape[ptr++];
+    let ControlPointsList = tape[ptr++];
+    let CurveForm = tape[ptr++];
+    let ClosedCurve = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    let KnotMultiplicities = tape[ptr++];
+    let Knots = tape[ptr++];
+    let KnotSpec = tape[ptr++];
+    return new IfcBSplineCurveWithKnots(expressID, type, Degree, ControlPointsList, CurveForm, ClosedCurve, SelfIntersect, KnotMultiplicities, Knots, KnotSpec);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Degree);
+    ;
+    args.push(this.ControlPointsList);
+    ;
+    args.push(this.CurveForm);
+    ;
+    args.push(this.ClosedCurve);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    args.push(this.KnotMultiplicities);
+    ;
+    args.push(this.Knots);
+    ;
+    args.push(this.KnotSpec);
+    ;
+    return args;
+  }
+};
+var IfcBSplineSurface = class {
+  constructor(expressID, type, UDegree, VDegree, ControlPointsList, SurfaceForm, UClosed, VClosed, SelfIntersect) {
+    this.expressID = expressID;
+    this.type = type;
+    this.UDegree = UDegree;
+    this.VDegree = VDegree;
+    this.ControlPointsList = ControlPointsList;
+    this.SurfaceForm = SurfaceForm;
+    this.UClosed = UClosed;
+    this.VClosed = VClosed;
+    this.SelfIntersect = SelfIntersect;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let UDegree = tape[ptr++];
+    let VDegree = tape[ptr++];
+    let ControlPointsList = tape[ptr++];
+    let SurfaceForm = tape[ptr++];
+    let UClosed = tape[ptr++];
+    let VClosed = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    return new IfcBSplineSurface(expressID, type, UDegree, VDegree, ControlPointsList, SurfaceForm, UClosed, VClosed, SelfIntersect);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.UDegree);
+    ;
+    args.push(this.VDegree);
+    ;
+    args.push(this.ControlPointsList);
+    ;
+    args.push(this.SurfaceForm);
+    ;
+    args.push(this.UClosed);
+    ;
+    args.push(this.VClosed);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    return args;
+  }
+};
+var IfcBSplineSurfaceWithKnots = class {
+  constructor(expressID, type, UDegree, VDegree, ControlPointsList, SurfaceForm, UClosed, VClosed, SelfIntersect, UMultiplicities, VMultiplicities, UKnots, VKnots, KnotSpec) {
+    this.expressID = expressID;
+    this.type = type;
+    this.UDegree = UDegree;
+    this.VDegree = VDegree;
+    this.ControlPointsList = ControlPointsList;
+    this.SurfaceForm = SurfaceForm;
+    this.UClosed = UClosed;
+    this.VClosed = VClosed;
+    this.SelfIntersect = SelfIntersect;
+    this.UMultiplicities = UMultiplicities;
+    this.VMultiplicities = VMultiplicities;
+    this.UKnots = UKnots;
+    this.VKnots = VKnots;
+    this.KnotSpec = KnotSpec;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let UDegree = tape[ptr++];
+    let VDegree = tape[ptr++];
+    let ControlPointsList = tape[ptr++];
+    let SurfaceForm = tape[ptr++];
+    let UClosed = tape[ptr++];
+    let VClosed = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    let UMultiplicities = tape[ptr++];
+    let VMultiplicities = tape[ptr++];
+    let UKnots = tape[ptr++];
+    let VKnots = tape[ptr++];
+    let KnotSpec = tape[ptr++];
+    return new IfcBSplineSurfaceWithKnots(expressID, type, UDegree, VDegree, ControlPointsList, SurfaceForm, UClosed, VClosed, SelfIntersect, UMultiplicities, VMultiplicities, UKnots, VKnots, KnotSpec);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.UDegree);
+    ;
+    args.push(this.VDegree);
+    ;
+    args.push(this.ControlPointsList);
+    ;
+    args.push(this.SurfaceForm);
+    ;
+    args.push(this.UClosed);
+    ;
+    args.push(this.VClosed);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    args.push(this.UMultiplicities);
+    ;
+    args.push(this.VMultiplicities);
+    ;
+    args.push(this.UKnots);
+    ;
+    args.push(this.VKnots);
+    ;
+    args.push(this.KnotSpec);
+    ;
+    return args;
+  }
+};
+var IfcBeam = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBeam(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBeamStandardCase = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBeamStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBeamType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBeamType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBearing = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBearing(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBearingType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBearingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBlobTexture = class {
+  constructor(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter, RasterFormat, RasterCode) {
+    this.expressID = expressID;
+    this.type = type;
+    this.RepeatS = RepeatS;
+    this.RepeatT = RepeatT;
+    this.Mode = Mode;
+    this.TextureTransform = TextureTransform;
+    this.Parameter = Parameter;
+    this.RasterFormat = RasterFormat;
+    this.RasterCode = RasterCode;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let RepeatS = tape[ptr++];
+    let RepeatT = tape[ptr++];
+    let Mode = tape[ptr++];
+    let TextureTransform = tape[ptr++];
+    let Parameter = tape[ptr++];
+    let RasterFormat = tape[ptr++];
+    let RasterCode = tape[ptr++];
+    return new IfcBlobTexture(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter, RasterFormat, RasterCode);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.RepeatS);
+    ;
+    args.push(this.RepeatT);
+    ;
+    args.push(this.Mode);
+    ;
+    args.push(this.TextureTransform);
+    ;
+    args.push(this.Parameter);
+    ;
+    args.push(this.RasterFormat);
+    ;
+    args.push(this.RasterCode);
+    ;
+    return args;
+  }
+};
+var IfcBlock = class {
+  constructor(expressID, type, Position, XLength, YLength, ZLength) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+    this.XLength = XLength;
+    this.YLength = YLength;
+    this.ZLength = ZLength;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    let XLength = tape[ptr++];
+    let YLength = tape[ptr++];
+    let ZLength = tape[ptr++];
+    return new IfcBlock(expressID, type, Position, XLength, YLength, ZLength);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    args.push(this.XLength);
+    ;
+    args.push(this.YLength);
+    ;
+    args.push(this.ZLength);
+    ;
+    return args;
+  }
+};
+var IfcBoiler = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBoiler(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBoilerType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBoilerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBooleanClippingResult = class {
+  constructor(expressID, type, Operator, FirstOperand, SecondOperand) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Operator = Operator;
+    this.FirstOperand = FirstOperand;
+    this.SecondOperand = SecondOperand;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Operator = tape[ptr++];
+    let FirstOperand = tape[ptr++];
+    let SecondOperand = tape[ptr++];
+    return new IfcBooleanClippingResult(expressID, type, Operator, FirstOperand, SecondOperand);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Operator);
+    ;
+    args.push(this.FirstOperand);
+    ;
+    args.push(this.SecondOperand);
+    ;
+    return args;
+  }
+};
+var IfcBooleanResult = class {
+  constructor(expressID, type, Operator, FirstOperand, SecondOperand) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Operator = Operator;
+    this.FirstOperand = FirstOperand;
+    this.SecondOperand = SecondOperand;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Operator = tape[ptr++];
+    let FirstOperand = tape[ptr++];
+    let SecondOperand = tape[ptr++];
+    return new IfcBooleanResult(expressID, type, Operator, FirstOperand, SecondOperand);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Operator);
+    ;
+    args.push(this.FirstOperand);
+    ;
+    args.push(this.SecondOperand);
+    ;
+    return args;
+  }
+};
+var IfcBoundaryCondition = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcBoundaryCondition(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcBoundaryCurve = class {
+  constructor(expressID, type, Segments, SelfIntersect) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Segments = Segments;
+    this.SelfIntersect = SelfIntersect;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Segments = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    return new IfcBoundaryCurve(expressID, type, Segments, SelfIntersect);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Segments);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    return args;
+  }
+};
+var IfcBoundaryEdgeCondition = class {
+  constructor(expressID, type, Name, TranslationalStiffnessByLengthX, TranslationalStiffnessByLengthY, TranslationalStiffnessByLengthZ, RotationalStiffnessByLengthX, RotationalStiffnessByLengthY, RotationalStiffnessByLengthZ) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.TranslationalStiffnessByLengthX = TranslationalStiffnessByLengthX;
+    this.TranslationalStiffnessByLengthY = TranslationalStiffnessByLengthY;
+    this.TranslationalStiffnessByLengthZ = TranslationalStiffnessByLengthZ;
+    this.RotationalStiffnessByLengthX = RotationalStiffnessByLengthX;
+    this.RotationalStiffnessByLengthY = RotationalStiffnessByLengthY;
+    this.RotationalStiffnessByLengthZ = RotationalStiffnessByLengthZ;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let TranslationalStiffnessByLengthX = tape[ptr++];
+    let TranslationalStiffnessByLengthY = tape[ptr++];
+    let TranslationalStiffnessByLengthZ = tape[ptr++];
+    let RotationalStiffnessByLengthX = tape[ptr++];
+    let RotationalStiffnessByLengthY = tape[ptr++];
+    let RotationalStiffnessByLengthZ = tape[ptr++];
+    return new IfcBoundaryEdgeCondition(expressID, type, Name, TranslationalStiffnessByLengthX, TranslationalStiffnessByLengthY, TranslationalStiffnessByLengthZ, RotationalStiffnessByLengthX, RotationalStiffnessByLengthY, RotationalStiffnessByLengthZ);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.TranslationalStiffnessByLengthX);
+    ;
+    args.push(this.TranslationalStiffnessByLengthY);
+    ;
+    args.push(this.TranslationalStiffnessByLengthZ);
+    ;
+    args.push(this.RotationalStiffnessByLengthX);
+    ;
+    args.push(this.RotationalStiffnessByLengthY);
+    ;
+    args.push(this.RotationalStiffnessByLengthZ);
+    ;
+    return args;
+  }
+};
+var IfcBoundaryFaceCondition = class {
+  constructor(expressID, type, Name, TranslationalStiffnessByAreaX, TranslationalStiffnessByAreaY, TranslationalStiffnessByAreaZ) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.TranslationalStiffnessByAreaX = TranslationalStiffnessByAreaX;
+    this.TranslationalStiffnessByAreaY = TranslationalStiffnessByAreaY;
+    this.TranslationalStiffnessByAreaZ = TranslationalStiffnessByAreaZ;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let TranslationalStiffnessByAreaX = tape[ptr++];
+    let TranslationalStiffnessByAreaY = tape[ptr++];
+    let TranslationalStiffnessByAreaZ = tape[ptr++];
+    return new IfcBoundaryFaceCondition(expressID, type, Name, TranslationalStiffnessByAreaX, TranslationalStiffnessByAreaY, TranslationalStiffnessByAreaZ);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.TranslationalStiffnessByAreaX);
+    ;
+    args.push(this.TranslationalStiffnessByAreaY);
+    ;
+    args.push(this.TranslationalStiffnessByAreaZ);
+    ;
+    return args;
+  }
+};
+var IfcBoundaryNodeCondition = class {
+  constructor(expressID, type, Name, TranslationalStiffnessX, TranslationalStiffnessY, TranslationalStiffnessZ, RotationalStiffnessX, RotationalStiffnessY, RotationalStiffnessZ) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.TranslationalStiffnessX = TranslationalStiffnessX;
+    this.TranslationalStiffnessY = TranslationalStiffnessY;
+    this.TranslationalStiffnessZ = TranslationalStiffnessZ;
+    this.RotationalStiffnessX = RotationalStiffnessX;
+    this.RotationalStiffnessY = RotationalStiffnessY;
+    this.RotationalStiffnessZ = RotationalStiffnessZ;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let TranslationalStiffnessX = tape[ptr++];
+    let TranslationalStiffnessY = tape[ptr++];
+    let TranslationalStiffnessZ = tape[ptr++];
+    let RotationalStiffnessX = tape[ptr++];
+    let RotationalStiffnessY = tape[ptr++];
+    let RotationalStiffnessZ = tape[ptr++];
+    return new IfcBoundaryNodeCondition(expressID, type, Name, TranslationalStiffnessX, TranslationalStiffnessY, TranslationalStiffnessZ, RotationalStiffnessX, RotationalStiffnessY, RotationalStiffnessZ);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.TranslationalStiffnessX);
+    ;
+    args.push(this.TranslationalStiffnessY);
+    ;
+    args.push(this.TranslationalStiffnessZ);
+    ;
+    args.push(this.RotationalStiffnessX);
+    ;
+    args.push(this.RotationalStiffnessY);
+    ;
+    args.push(this.RotationalStiffnessZ);
+    ;
+    return args;
+  }
+};
+var IfcBoundaryNodeConditionWarping = class {
+  constructor(expressID, type, Name, TranslationalStiffnessX, TranslationalStiffnessY, TranslationalStiffnessZ, RotationalStiffnessX, RotationalStiffnessY, RotationalStiffnessZ, WarpingStiffness) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.TranslationalStiffnessX = TranslationalStiffnessX;
+    this.TranslationalStiffnessY = TranslationalStiffnessY;
+    this.TranslationalStiffnessZ = TranslationalStiffnessZ;
+    this.RotationalStiffnessX = RotationalStiffnessX;
+    this.RotationalStiffnessY = RotationalStiffnessY;
+    this.RotationalStiffnessZ = RotationalStiffnessZ;
+    this.WarpingStiffness = WarpingStiffness;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let TranslationalStiffnessX = tape[ptr++];
+    let TranslationalStiffnessY = tape[ptr++];
+    let TranslationalStiffnessZ = tape[ptr++];
+    let RotationalStiffnessX = tape[ptr++];
+    let RotationalStiffnessY = tape[ptr++];
+    let RotationalStiffnessZ = tape[ptr++];
+    let WarpingStiffness = tape[ptr++];
+    return new IfcBoundaryNodeConditionWarping(expressID, type, Name, TranslationalStiffnessX, TranslationalStiffnessY, TranslationalStiffnessZ, RotationalStiffnessX, RotationalStiffnessY, RotationalStiffnessZ, WarpingStiffness);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.TranslationalStiffnessX);
+    ;
+    args.push(this.TranslationalStiffnessY);
+    ;
+    args.push(this.TranslationalStiffnessZ);
+    ;
+    args.push(this.RotationalStiffnessX);
+    ;
+    args.push(this.RotationalStiffnessY);
+    ;
+    args.push(this.RotationalStiffnessZ);
+    ;
+    args.push(this.WarpingStiffness);
+    ;
+    return args;
+  }
+};
+var IfcBoundedCurve = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcBoundedCurve(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcBoundedSurface = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcBoundedSurface(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcBoundingBox = class {
+  constructor(expressID, type, Corner, XDim, YDim, ZDim) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Corner = Corner;
+    this.XDim = XDim;
+    this.YDim = YDim;
+    this.ZDim = ZDim;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Corner = tape[ptr++];
+    let XDim = tape[ptr++];
+    let YDim = tape[ptr++];
+    let ZDim = tape[ptr++];
+    return new IfcBoundingBox(expressID, type, Corner, XDim, YDim, ZDim);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Corner);
+    ;
+    args.push(this.XDim);
+    ;
+    args.push(this.YDim);
+    ;
+    args.push(this.ZDim);
+    ;
+    return args;
+  }
+};
+var IfcBoxedHalfSpace = class {
+  constructor(expressID, type, BaseSurface, AgreementFlag, Enclosure) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BaseSurface = BaseSurface;
+    this.AgreementFlag = AgreementFlag;
+    this.Enclosure = Enclosure;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BaseSurface = tape[ptr++];
+    let AgreementFlag = tape[ptr++];
+    let Enclosure = tape[ptr++];
+    return new IfcBoxedHalfSpace(expressID, type, BaseSurface, AgreementFlag, Enclosure);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BaseSurface);
+    ;
+    args.push(this.AgreementFlag);
+    ;
+    args.push(this.Enclosure);
+    ;
+    return args;
+  }
+};
+var IfcBridge = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+    this.CompositionType = CompositionType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    let CompositionType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBridge(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.CompositionType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBridgePart = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+    this.CompositionType = CompositionType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    let CompositionType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBridgePart(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.CompositionType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBuilding = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, ElevationOfRefHeight, ElevationOfTerrain, BuildingAddress) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+    this.CompositionType = CompositionType;
+    this.ElevationOfRefHeight = ElevationOfRefHeight;
+    this.ElevationOfTerrain = ElevationOfTerrain;
+    this.BuildingAddress = BuildingAddress;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    let CompositionType = tape[ptr++];
+    let ElevationOfRefHeight = tape[ptr++];
+    let ElevationOfTerrain = tape[ptr++];
+    let BuildingAddress = tape[ptr++];
+    return new IfcBuilding(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, ElevationOfRefHeight, ElevationOfTerrain, BuildingAddress);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.CompositionType);
+    ;
+    args.push(this.ElevationOfRefHeight);
+    ;
+    args.push(this.ElevationOfTerrain);
+    ;
+    args.push(this.BuildingAddress);
+    ;
+    return args;
+  }
+};
+var IfcBuildingElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcBuildingElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcBuildingElementPart = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBuildingElementPart(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBuildingElementPartType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBuildingElementPartType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBuildingElementProxy = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBuildingElementProxy(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBuildingElementProxyType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBuildingElementProxyType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBuildingElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcBuildingElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcBuildingStorey = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, Elevation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+    this.CompositionType = CompositionType;
+    this.Elevation = Elevation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    let CompositionType = tape[ptr++];
+    let Elevation = tape[ptr++];
+    return new IfcBuildingStorey(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, Elevation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.CompositionType);
+    ;
+    args.push(this.Elevation);
+    ;
+    return args;
+  }
+};
+var IfcBuildingSystem = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, LongName) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.PredefinedType = PredefinedType;
+    this.LongName = LongName;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let LongName = tape[ptr++];
+    return new IfcBuildingSystem(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, LongName);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.LongName);
+    ;
+    return args;
+  }
+};
+var IfcBurner = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBurner(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcBurnerType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcBurnerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCShapeProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, Depth, Width, WallThickness, Girth, InternalFilletRadius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.Depth = Depth;
+    this.Width = Width;
+    this.WallThickness = WallThickness;
+    this.Girth = Girth;
+    this.InternalFilletRadius = InternalFilletRadius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let Depth = tape[ptr++];
+    let Width = tape[ptr++];
+    let WallThickness = tape[ptr++];
+    let Girth = tape[ptr++];
+    let InternalFilletRadius = tape[ptr++];
+    return new IfcCShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, Depth, Width, WallThickness, Girth, InternalFilletRadius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Depth);
+    ;
+    args.push(this.Width);
+    ;
+    args.push(this.WallThickness);
+    ;
+    args.push(this.Girth);
+    ;
+    args.push(this.InternalFilletRadius);
+    ;
+    return args;
+  }
+};
+var IfcCableCarrierFitting = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCableCarrierFitting(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCableCarrierFittingType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCableCarrierFittingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCableCarrierSegment = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCableCarrierSegment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCableCarrierSegmentType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCableCarrierSegmentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCableFitting = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCableFitting(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCableFittingType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCableFittingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCableSegment = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCableSegment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCableSegmentType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCableSegmentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCaissonFoundation = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCaissonFoundation(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCaissonFoundationType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCaissonFoundationType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCartesianPoint = class {
+  constructor(expressID, type, Coordinates) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Coordinates = Coordinates;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Coordinates = tape[ptr++];
+    return new IfcCartesianPoint(expressID, type, Coordinates);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Coordinates);
+    ;
+    return args;
+  }
+};
+var IfcCartesianPointList = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcCartesianPointList(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcCartesianPointList2D = class {
+  constructor(expressID, type, CoordList, TagList) {
+    this.expressID = expressID;
+    this.type = type;
+    this.CoordList = CoordList;
+    this.TagList = TagList;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let CoordList = tape[ptr++];
+    let TagList = tape[ptr++];
+    return new IfcCartesianPointList2D(expressID, type, CoordList, TagList);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.CoordList);
+    ;
+    args.push(this.TagList);
+    ;
+    return args;
+  }
+};
+var IfcCartesianPointList3D = class {
+  constructor(expressID, type, CoordList, TagList) {
+    this.expressID = expressID;
+    this.type = type;
+    this.CoordList = CoordList;
+    this.TagList = TagList;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let CoordList = tape[ptr++];
+    let TagList = tape[ptr++];
+    return new IfcCartesianPointList3D(expressID, type, CoordList, TagList);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.CoordList);
+    ;
+    args.push(this.TagList);
+    ;
+    return args;
+  }
+};
+var IfcCartesianTransformationOperator = class {
+  constructor(expressID, type, Axis1, Axis2, LocalOrigin, Scale) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Axis1 = Axis1;
+    this.Axis2 = Axis2;
+    this.LocalOrigin = LocalOrigin;
+    this.Scale = Scale;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Axis1 = tape[ptr++];
+    let Axis2 = tape[ptr++];
+    let LocalOrigin = tape[ptr++];
+    let Scale = tape[ptr++];
+    return new IfcCartesianTransformationOperator(expressID, type, Axis1, Axis2, LocalOrigin, Scale);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Axis1);
+    ;
+    args.push(this.Axis2);
+    ;
+    args.push(this.LocalOrigin);
+    ;
+    args.push(this.Scale);
+    ;
+    return args;
+  }
+};
+var IfcCartesianTransformationOperator2D = class {
+  constructor(expressID, type, Axis1, Axis2, LocalOrigin, Scale) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Axis1 = Axis1;
+    this.Axis2 = Axis2;
+    this.LocalOrigin = LocalOrigin;
+    this.Scale = Scale;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Axis1 = tape[ptr++];
+    let Axis2 = tape[ptr++];
+    let LocalOrigin = tape[ptr++];
+    let Scale = tape[ptr++];
+    return new IfcCartesianTransformationOperator2D(expressID, type, Axis1, Axis2, LocalOrigin, Scale);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Axis1);
+    ;
+    args.push(this.Axis2);
+    ;
+    args.push(this.LocalOrigin);
+    ;
+    args.push(this.Scale);
+    ;
+    return args;
+  }
+};
+var IfcCartesianTransformationOperator2DnonUniform = class {
+  constructor(expressID, type, Axis1, Axis2, LocalOrigin, Scale, Scale2) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Axis1 = Axis1;
+    this.Axis2 = Axis2;
+    this.LocalOrigin = LocalOrigin;
+    this.Scale = Scale;
+    this.Scale2 = Scale2;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Axis1 = tape[ptr++];
+    let Axis2 = tape[ptr++];
+    let LocalOrigin = tape[ptr++];
+    let Scale = tape[ptr++];
+    let Scale2 = tape[ptr++];
+    return new IfcCartesianTransformationOperator2DnonUniform(expressID, type, Axis1, Axis2, LocalOrigin, Scale, Scale2);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Axis1);
+    ;
+    args.push(this.Axis2);
+    ;
+    args.push(this.LocalOrigin);
+    ;
+    args.push(this.Scale);
+    ;
+    args.push(this.Scale2);
+    ;
+    return args;
+  }
+};
+var IfcCartesianTransformationOperator3D = class {
+  constructor(expressID, type, Axis1, Axis2, LocalOrigin, Scale, Axis3) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Axis1 = Axis1;
+    this.Axis2 = Axis2;
+    this.LocalOrigin = LocalOrigin;
+    this.Scale = Scale;
+    this.Axis3 = Axis3;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Axis1 = tape[ptr++];
+    let Axis2 = tape[ptr++];
+    let LocalOrigin = tape[ptr++];
+    let Scale = tape[ptr++];
+    let Axis3 = tape[ptr++];
+    return new IfcCartesianTransformationOperator3D(expressID, type, Axis1, Axis2, LocalOrigin, Scale, Axis3);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Axis1);
+    ;
+    args.push(this.Axis2);
+    ;
+    args.push(this.LocalOrigin);
+    ;
+    args.push(this.Scale);
+    ;
+    args.push(this.Axis3);
+    ;
+    return args;
+  }
+};
+var IfcCartesianTransformationOperator3DnonUniform = class {
+  constructor(expressID, type, Axis1, Axis2, LocalOrigin, Scale, Axis3, Scale2, Scale3) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Axis1 = Axis1;
+    this.Axis2 = Axis2;
+    this.LocalOrigin = LocalOrigin;
+    this.Scale = Scale;
+    this.Axis3 = Axis3;
+    this.Scale2 = Scale2;
+    this.Scale3 = Scale3;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Axis1 = tape[ptr++];
+    let Axis2 = tape[ptr++];
+    let LocalOrigin = tape[ptr++];
+    let Scale = tape[ptr++];
+    let Axis3 = tape[ptr++];
+    let Scale2 = tape[ptr++];
+    let Scale3 = tape[ptr++];
+    return new IfcCartesianTransformationOperator3DnonUniform(expressID, type, Axis1, Axis2, LocalOrigin, Scale, Axis3, Scale2, Scale3);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Axis1);
+    ;
+    args.push(this.Axis2);
+    ;
+    args.push(this.LocalOrigin);
+    ;
+    args.push(this.Scale);
+    ;
+    args.push(this.Axis3);
+    ;
+    args.push(this.Scale2);
+    ;
+    args.push(this.Scale3);
+    ;
+    return args;
+  }
+};
+var IfcCenterLineProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Curve, Thickness) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Curve = Curve;
+    this.Thickness = Thickness;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Curve = tape[ptr++];
+    let Thickness = tape[ptr++];
+    return new IfcCenterLineProfileDef(expressID, type, ProfileType, ProfileName, Curve, Thickness);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Curve);
+    ;
+    args.push(this.Thickness);
+    ;
+    return args;
+  }
+};
+var IfcChiller = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcChiller(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcChillerType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcChillerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcChimney = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcChimney(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcChimneyType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcChimneyType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCircle = class {
+  constructor(expressID, type, Position, Radius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+    this.Radius = Radius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    let Radius = tape[ptr++];
+    return new IfcCircle(expressID, type, Position, Radius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    args.push(this.Radius);
+    ;
+    return args;
+  }
+};
+var IfcCircleHollowProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, Radius, WallThickness) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.Radius = Radius;
+    this.WallThickness = WallThickness;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let Radius = tape[ptr++];
+    let WallThickness = tape[ptr++];
+    return new IfcCircleHollowProfileDef(expressID, type, ProfileType, ProfileName, Position, Radius, WallThickness);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Radius);
+    ;
+    args.push(this.WallThickness);
+    ;
+    return args;
+  }
+};
+var IfcCircleProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, Radius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.Radius = Radius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let Radius = tape[ptr++];
+    return new IfcCircleProfileDef(expressID, type, ProfileType, ProfileName, Position, Radius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Radius);
+    ;
+    return args;
+  }
+};
+var IfcCircularArcSegment2D = class {
+  constructor(expressID, type, StartPoint, StartDirection, SegmentLength, Radius, IsCCW) {
+    this.expressID = expressID;
+    this.type = type;
+    this.StartPoint = StartPoint;
+    this.StartDirection = StartDirection;
+    this.SegmentLength = SegmentLength;
+    this.Radius = Radius;
+    this.IsCCW = IsCCW;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let StartPoint = tape[ptr++];
+    let StartDirection = tape[ptr++];
+    let SegmentLength = tape[ptr++];
+    let Radius = tape[ptr++];
+    let IsCCW = tape[ptr++];
+    return new IfcCircularArcSegment2D(expressID, type, StartPoint, StartDirection, SegmentLength, Radius, IsCCW);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.StartPoint);
+    ;
+    args.push(this.StartDirection);
+    ;
+    args.push(this.SegmentLength);
+    ;
+    args.push(this.Radius);
+    ;
+    args.push(this.IsCCW);
+    ;
+    return args;
+  }
+};
+var IfcCivilElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcCivilElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcCivilElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcCivilElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcClassification = class {
+  constructor(expressID, type, Source, Edition, EditionDate, Name, Description, Location, ReferenceTokens) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Source = Source;
+    this.Edition = Edition;
+    this.EditionDate = EditionDate;
+    this.Name = Name;
+    this.Description = Description;
+    this.Location = Location;
+    this.ReferenceTokens = ReferenceTokens;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Source = tape[ptr++];
+    let Edition = tape[ptr++];
+    let EditionDate = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Location = tape[ptr++];
+    let ReferenceTokens = tape[ptr++];
+    return new IfcClassification(expressID, type, Source, Edition, EditionDate, Name, Description, Location, ReferenceTokens);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Source);
+    ;
+    args.push(this.Edition);
+    ;
+    args.push(this.EditionDate);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Location);
+    ;
+    args.push(this.ReferenceTokens);
+    ;
+    return args;
+  }
+};
+var IfcClassificationReference = class {
+  constructor(expressID, type, Location, Identification, Name, ReferencedSource, Description, Sort) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Location = Location;
+    this.Identification = Identification;
+    this.Name = Name;
+    this.ReferencedSource = ReferencedSource;
+    this.Description = Description;
+    this.Sort = Sort;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Location = tape[ptr++];
+    let Identification = tape[ptr++];
+    let Name = tape[ptr++];
+    let ReferencedSource = tape[ptr++];
+    let Description = tape[ptr++];
+    let Sort = tape[ptr++];
+    return new IfcClassificationReference(expressID, type, Location, Identification, Name, ReferencedSource, Description, Sort);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Location);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.ReferencedSource);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Sort);
+    ;
+    return args;
+  }
+};
+var IfcClosedShell = class {
+  constructor(expressID, type, CfsFaces) {
+    this.expressID = expressID;
+    this.type = type;
+    this.CfsFaces = CfsFaces;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let CfsFaces = tape[ptr++];
+    return new IfcClosedShell(expressID, type, CfsFaces);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.CfsFaces);
+    ;
+    return args;
+  }
+};
+var IfcCoil = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCoil(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCoilType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCoilType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcColourRgb = class {
+  constructor(expressID, type, Name, Red, Green, Blue) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Red = Red;
+    this.Green = Green;
+    this.Blue = Blue;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Red = tape[ptr++];
+    let Green = tape[ptr++];
+    let Blue = tape[ptr++];
+    return new IfcColourRgb(expressID, type, Name, Red, Green, Blue);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Red);
+    ;
+    args.push(this.Green);
+    ;
+    args.push(this.Blue);
+    ;
+    return args;
+  }
+};
+var IfcColourRgbList = class {
+  constructor(expressID, type, ColourList) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ColourList = ColourList;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ColourList = tape[ptr++];
+    return new IfcColourRgbList(expressID, type, ColourList);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ColourList);
+    ;
+    return args;
+  }
+};
+var IfcColourSpecification = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcColourSpecification(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcColumn = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcColumn(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcColumnStandardCase = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcColumnStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcColumnType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcColumnType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCommunicationsAppliance = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCommunicationsAppliance(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCommunicationsApplianceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCommunicationsApplianceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcComplexProperty = class {
+  constructor(expressID, type, Name, Description, UsageName, HasProperties) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.UsageName = UsageName;
+    this.HasProperties = HasProperties;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let UsageName = tape[ptr++];
+    let HasProperties = tape[ptr++];
+    return new IfcComplexProperty(expressID, type, Name, Description, UsageName, HasProperties);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.UsageName);
+    ;
+    args.push(this.HasProperties);
+    ;
+    return args;
+  }
+};
+var IfcComplexPropertyTemplate = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, UsageName, TemplateType, HasPropertyTemplates) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.UsageName = UsageName;
+    this.TemplateType = TemplateType;
+    this.HasPropertyTemplates = HasPropertyTemplates;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let UsageName = tape[ptr++];
+    let TemplateType = tape[ptr++];
+    let HasPropertyTemplates = tape[ptr++];
+    return new IfcComplexPropertyTemplate(expressID, type, GlobalId, OwnerHistory, Name, Description, UsageName, TemplateType, HasPropertyTemplates);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.UsageName);
+    ;
+    args.push(this.TemplateType);
+    ;
+    args.push(this.HasPropertyTemplates);
+    ;
+    return args;
+  }
+};
+var IfcCompositeCurve = class {
+  constructor(expressID, type, Segments, SelfIntersect) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Segments = Segments;
+    this.SelfIntersect = SelfIntersect;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Segments = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    return new IfcCompositeCurve(expressID, type, Segments, SelfIntersect);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Segments);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    return args;
+  }
+};
+var IfcCompositeCurveOnSurface = class {
+  constructor(expressID, type, Segments, SelfIntersect) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Segments = Segments;
+    this.SelfIntersect = SelfIntersect;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Segments = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    return new IfcCompositeCurveOnSurface(expressID, type, Segments, SelfIntersect);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Segments);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    return args;
+  }
+};
+var IfcCompositeCurveSegment = class {
+  constructor(expressID, type, Transition, SameSense, ParentCurve) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Transition = Transition;
+    this.SameSense = SameSense;
+    this.ParentCurve = ParentCurve;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Transition = tape[ptr++];
+    let SameSense = tape[ptr++];
+    let ParentCurve = tape[ptr++];
+    return new IfcCompositeCurveSegment(expressID, type, Transition, SameSense, ParentCurve);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Transition);
+    ;
+    args.push(this.SameSense);
+    ;
+    args.push(this.ParentCurve);
+    ;
+    return args;
+  }
+};
+var IfcCompositeProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Profiles, Label) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Profiles = Profiles;
+    this.Label = Label;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Profiles = tape[ptr++];
+    let Label = tape[ptr++];
+    return new IfcCompositeProfileDef(expressID, type, ProfileType, ProfileName, Profiles, Label);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Profiles);
+    ;
+    args.push(this.Label);
+    ;
+    return args;
+  }
+};
+var IfcCompressor = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCompressor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCompressorType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCompressorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCondenser = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCondenser(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCondenserType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCondenserType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcConic = class {
+  constructor(expressID, type, Position) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    return new IfcConic(expressID, type, Position);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    return args;
+  }
+};
+var IfcConnectedFaceSet = class {
+  constructor(expressID, type, CfsFaces) {
+    this.expressID = expressID;
+    this.type = type;
+    this.CfsFaces = CfsFaces;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let CfsFaces = tape[ptr++];
+    return new IfcConnectedFaceSet(expressID, type, CfsFaces);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.CfsFaces);
+    ;
+    return args;
+  }
+};
+var IfcConnectionCurveGeometry = class {
+  constructor(expressID, type, CurveOnRelatingElement, CurveOnRelatedElement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.CurveOnRelatingElement = CurveOnRelatingElement;
+    this.CurveOnRelatedElement = CurveOnRelatedElement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let CurveOnRelatingElement = tape[ptr++];
+    let CurveOnRelatedElement = tape[ptr++];
+    return new IfcConnectionCurveGeometry(expressID, type, CurveOnRelatingElement, CurveOnRelatedElement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.CurveOnRelatingElement);
+    ;
+    args.push(this.CurveOnRelatedElement);
+    ;
+    return args;
+  }
+};
+var IfcConnectionGeometry = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcConnectionGeometry(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcConnectionPointEccentricity = class {
+  constructor(expressID, type, PointOnRelatingElement, PointOnRelatedElement, EccentricityInX, EccentricityInY, EccentricityInZ) {
+    this.expressID = expressID;
+    this.type = type;
+    this.PointOnRelatingElement = PointOnRelatingElement;
+    this.PointOnRelatedElement = PointOnRelatedElement;
+    this.EccentricityInX = EccentricityInX;
+    this.EccentricityInY = EccentricityInY;
+    this.EccentricityInZ = EccentricityInZ;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let PointOnRelatingElement = tape[ptr++];
+    let PointOnRelatedElement = tape[ptr++];
+    let EccentricityInX = tape[ptr++];
+    let EccentricityInY = tape[ptr++];
+    let EccentricityInZ = tape[ptr++];
+    return new IfcConnectionPointEccentricity(expressID, type, PointOnRelatingElement, PointOnRelatedElement, EccentricityInX, EccentricityInY, EccentricityInZ);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.PointOnRelatingElement);
+    ;
+    args.push(this.PointOnRelatedElement);
+    ;
+    args.push(this.EccentricityInX);
+    ;
+    args.push(this.EccentricityInY);
+    ;
+    args.push(this.EccentricityInZ);
+    ;
+    return args;
+  }
+};
+var IfcConnectionPointGeometry = class {
+  constructor(expressID, type, PointOnRelatingElement, PointOnRelatedElement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.PointOnRelatingElement = PointOnRelatingElement;
+    this.PointOnRelatedElement = PointOnRelatedElement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let PointOnRelatingElement = tape[ptr++];
+    let PointOnRelatedElement = tape[ptr++];
+    return new IfcConnectionPointGeometry(expressID, type, PointOnRelatingElement, PointOnRelatedElement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.PointOnRelatingElement);
+    ;
+    args.push(this.PointOnRelatedElement);
+    ;
+    return args;
+  }
+};
+var IfcConnectionSurfaceGeometry = class {
+  constructor(expressID, type, SurfaceOnRelatingElement, SurfaceOnRelatedElement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SurfaceOnRelatingElement = SurfaceOnRelatingElement;
+    this.SurfaceOnRelatedElement = SurfaceOnRelatedElement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SurfaceOnRelatingElement = tape[ptr++];
+    let SurfaceOnRelatedElement = tape[ptr++];
+    return new IfcConnectionSurfaceGeometry(expressID, type, SurfaceOnRelatingElement, SurfaceOnRelatedElement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SurfaceOnRelatingElement);
+    ;
+    args.push(this.SurfaceOnRelatedElement);
+    ;
+    return args;
+  }
+};
+var IfcConnectionVolumeGeometry = class {
+  constructor(expressID, type, VolumeOnRelatingElement, VolumeOnRelatedElement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.VolumeOnRelatingElement = VolumeOnRelatingElement;
+    this.VolumeOnRelatedElement = VolumeOnRelatedElement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let VolumeOnRelatingElement = tape[ptr++];
+    let VolumeOnRelatedElement = tape[ptr++];
+    return new IfcConnectionVolumeGeometry(expressID, type, VolumeOnRelatingElement, VolumeOnRelatedElement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.VolumeOnRelatingElement);
+    ;
+    args.push(this.VolumeOnRelatedElement);
+    ;
+    return args;
+  }
+};
+var IfcConstraint = class {
+  constructor(expressID, type, Name, Description, ConstraintGrade, ConstraintSource, CreatingActor, CreationTime, UserDefinedGrade) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.ConstraintGrade = ConstraintGrade;
+    this.ConstraintSource = ConstraintSource;
+    this.CreatingActor = CreatingActor;
+    this.CreationTime = CreationTime;
+    this.UserDefinedGrade = UserDefinedGrade;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ConstraintGrade = tape[ptr++];
+    let ConstraintSource = tape[ptr++];
+    let CreatingActor = tape[ptr++];
+    let CreationTime = tape[ptr++];
+    let UserDefinedGrade = tape[ptr++];
+    return new IfcConstraint(expressID, type, Name, Description, ConstraintGrade, ConstraintSource, CreatingActor, CreationTime, UserDefinedGrade);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ConstraintGrade);
+    ;
+    args.push(this.ConstraintSource);
+    ;
+    args.push(this.CreatingActor);
+    ;
+    args.push(this.CreationTime);
+    ;
+    args.push(this.UserDefinedGrade);
+    ;
+    return args;
+  }
+};
+var IfcConstructionEquipmentResource = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.Usage = Usage;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let Usage = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcConstructionEquipmentResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.Usage);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcConstructionEquipmentResourceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.ResourceType = ResourceType;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let ResourceType = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcConstructionEquipmentResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.ResourceType);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcConstructionMaterialResource = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.Usage = Usage;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let Usage = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcConstructionMaterialResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.Usage);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcConstructionMaterialResourceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.ResourceType = ResourceType;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let ResourceType = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcConstructionMaterialResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.ResourceType);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcConstructionProductResource = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.Usage = Usage;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let Usage = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcConstructionProductResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.Usage);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcConstructionProductResourceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.ResourceType = ResourceType;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let ResourceType = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcConstructionProductResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.ResourceType);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcConstructionResource = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.Usage = Usage;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let Usage = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    return new IfcConstructionResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.Usage);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    return args;
+  }
+};
+var IfcConstructionResourceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.ResourceType = ResourceType;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let ResourceType = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    return new IfcConstructionResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.ResourceType);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    return args;
+  }
+};
+var IfcContext = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, Phase, RepresentationContexts, UnitsInContext) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.LongName = LongName;
+    this.Phase = Phase;
+    this.RepresentationContexts = RepresentationContexts;
+    this.UnitsInContext = UnitsInContext;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let LongName = tape[ptr++];
+    let Phase = tape[ptr++];
+    let RepresentationContexts = tape[ptr++];
+    let UnitsInContext = tape[ptr++];
+    return new IfcContext(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, Phase, RepresentationContexts, UnitsInContext);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.Phase);
+    ;
+    args.push(this.RepresentationContexts);
+    ;
+    args.push(this.UnitsInContext);
+    ;
+    return args;
+  }
+};
+var IfcContextDependentUnit = class {
+  constructor(expressID, type, Dimensions, UnitType, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Dimensions = Dimensions;
+    this.UnitType = UnitType;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Dimensions = tape[ptr++];
+    let UnitType = tape[ptr++];
+    let Name = tape[ptr++];
+    return new IfcContextDependentUnit(expressID, type, Dimensions, UnitType, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Dimensions);
+    ;
+    args.push(this.UnitType);
+    ;
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcControl = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    return new IfcControl(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    return args;
+  }
+};
+var IfcController = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcController(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcControllerType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcControllerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcConversionBasedUnit = class {
+  constructor(expressID, type, Dimensions, UnitType, Name, ConversionFactor) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Dimensions = Dimensions;
+    this.UnitType = UnitType;
+    this.Name = Name;
+    this.ConversionFactor = ConversionFactor;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Dimensions = tape[ptr++];
+    let UnitType = tape[ptr++];
+    let Name = tape[ptr++];
+    let ConversionFactor = tape[ptr++];
+    return new IfcConversionBasedUnit(expressID, type, Dimensions, UnitType, Name, ConversionFactor);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Dimensions);
+    ;
+    args.push(this.UnitType);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.ConversionFactor);
+    ;
+    return args;
+  }
+};
+var IfcConversionBasedUnitWithOffset = class {
+  constructor(expressID, type, Dimensions, UnitType, Name, ConversionFactor, ConversionOffset) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Dimensions = Dimensions;
+    this.UnitType = UnitType;
+    this.Name = Name;
+    this.ConversionFactor = ConversionFactor;
+    this.ConversionOffset = ConversionOffset;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Dimensions = tape[ptr++];
+    let UnitType = tape[ptr++];
+    let Name = tape[ptr++];
+    let ConversionFactor = tape[ptr++];
+    let ConversionOffset = tape[ptr++];
+    return new IfcConversionBasedUnitWithOffset(expressID, type, Dimensions, UnitType, Name, ConversionFactor, ConversionOffset);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Dimensions);
+    ;
+    args.push(this.UnitType);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.ConversionFactor);
+    ;
+    args.push(this.ConversionOffset);
+    ;
+    return args;
+  }
+};
+var IfcCooledBeam = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCooledBeam(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCooledBeamType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCooledBeamType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCoolingTower = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCoolingTower(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCoolingTowerType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCoolingTowerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCoordinateOperation = class {
+  constructor(expressID, type, SourceCRS, TargetCRS) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SourceCRS = SourceCRS;
+    this.TargetCRS = TargetCRS;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SourceCRS = tape[ptr++];
+    let TargetCRS = tape[ptr++];
+    return new IfcCoordinateOperation(expressID, type, SourceCRS, TargetCRS);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SourceCRS);
+    ;
+    args.push(this.TargetCRS);
+    ;
+    return args;
+  }
+};
+var IfcCoordinateReferenceSystem = class {
+  constructor(expressID, type, Name, Description, GeodeticDatum, VerticalDatum) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.GeodeticDatum = GeodeticDatum;
+    this.VerticalDatum = VerticalDatum;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let GeodeticDatum = tape[ptr++];
+    let VerticalDatum = tape[ptr++];
+    return new IfcCoordinateReferenceSystem(expressID, type, Name, Description, GeodeticDatum, VerticalDatum);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.GeodeticDatum);
+    ;
+    args.push(this.VerticalDatum);
+    ;
+    return args;
+  }
+};
+var IfcCostItem = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, CostValues, CostQuantities) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.PredefinedType = PredefinedType;
+    this.CostValues = CostValues;
+    this.CostQuantities = CostQuantities;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let CostValues = tape[ptr++];
+    let CostQuantities = tape[ptr++];
+    return new IfcCostItem(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, CostValues, CostQuantities);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.CostValues);
+    ;
+    args.push(this.CostQuantities);
+    ;
+    return args;
+  }
+};
+var IfcCostSchedule = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, SubmittedOn, UpdateDate) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.PredefinedType = PredefinedType;
+    this.Status = Status;
+    this.SubmittedOn = SubmittedOn;
+    this.UpdateDate = UpdateDate;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let Status = tape[ptr++];
+    let SubmittedOn = tape[ptr++];
+    let UpdateDate = tape[ptr++];
+    return new IfcCostSchedule(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, SubmittedOn, UpdateDate);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.Status);
+    ;
+    args.push(this.SubmittedOn);
+    ;
+    args.push(this.UpdateDate);
+    ;
+    return args;
+  }
+};
+var IfcCostValue = class {
+  constructor(expressID, type, Name, Description, AppliedValue, UnitBasis, ApplicableDate, FixedUntilDate, Category, Condition, ArithmeticOperator, Components) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.AppliedValue = AppliedValue;
+    this.UnitBasis = UnitBasis;
+    this.ApplicableDate = ApplicableDate;
+    this.FixedUntilDate = FixedUntilDate;
+    this.Category = Category;
+    this.Condition = Condition;
+    this.ArithmeticOperator = ArithmeticOperator;
+    this.Components = Components;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let AppliedValue = tape[ptr++];
+    let UnitBasis = tape[ptr++];
+    let ApplicableDate = tape[ptr++];
+    let FixedUntilDate = tape[ptr++];
+    let Category = tape[ptr++];
+    let Condition = tape[ptr++];
+    let ArithmeticOperator = tape[ptr++];
+    let Components = tape[ptr++];
+    return new IfcCostValue(expressID, type, Name, Description, AppliedValue, UnitBasis, ApplicableDate, FixedUntilDate, Category, Condition, ArithmeticOperator, Components);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.AppliedValue);
+    ;
+    args.push(this.UnitBasis);
+    ;
+    args.push(this.ApplicableDate);
+    ;
+    args.push(this.FixedUntilDate);
+    ;
+    args.push(this.Category);
+    ;
+    args.push(this.Condition);
+    ;
+    args.push(this.ArithmeticOperator);
+    ;
+    args.push(this.Components);
+    ;
+    return args;
+  }
+};
+var IfcCovering = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCovering(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCoveringType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCoveringType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCrewResource = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.Usage = Usage;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let Usage = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCrewResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.Usage);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCrewResourceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.ResourceType = ResourceType;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let ResourceType = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCrewResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.ResourceType);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCsgPrimitive3D = class {
+  constructor(expressID, type, Position) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    return new IfcCsgPrimitive3D(expressID, type, Position);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    return args;
+  }
+};
+var IfcCsgSolid = class {
+  constructor(expressID, type, TreeRootExpression) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TreeRootExpression = TreeRootExpression;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TreeRootExpression = tape[ptr++];
+    return new IfcCsgSolid(expressID, type, TreeRootExpression);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TreeRootExpression);
+    ;
+    return args;
+  }
+};
+var IfcCurrencyRelationship = class {
+  constructor(expressID, type, Name, Description, RelatingMonetaryUnit, RelatedMonetaryUnit, ExchangeRate, RateDateTime, RateSource) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingMonetaryUnit = RelatingMonetaryUnit;
+    this.RelatedMonetaryUnit = RelatedMonetaryUnit;
+    this.ExchangeRate = ExchangeRate;
+    this.RateDateTime = RateDateTime;
+    this.RateSource = RateSource;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingMonetaryUnit = tape[ptr++];
+    let RelatedMonetaryUnit = tape[ptr++];
+    let ExchangeRate = tape[ptr++];
+    let RateDateTime = tape[ptr++];
+    let RateSource = tape[ptr++];
+    return new IfcCurrencyRelationship(expressID, type, Name, Description, RelatingMonetaryUnit, RelatedMonetaryUnit, ExchangeRate, RateDateTime, RateSource);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingMonetaryUnit);
+    ;
+    args.push(this.RelatedMonetaryUnit);
+    ;
+    args.push(this.ExchangeRate);
+    ;
+    args.push(this.RateDateTime);
+    ;
+    args.push(this.RateSource);
+    ;
+    return args;
+  }
+};
+var IfcCurtainWall = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCurtainWall(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCurtainWallType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcCurtainWallType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcCurve = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcCurve(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcCurveBoundedPlane = class {
+  constructor(expressID, type, BasisSurface, OuterBoundary, InnerBoundaries) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BasisSurface = BasisSurface;
+    this.OuterBoundary = OuterBoundary;
+    this.InnerBoundaries = InnerBoundaries;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BasisSurface = tape[ptr++];
+    let OuterBoundary = tape[ptr++];
+    let InnerBoundaries = tape[ptr++];
+    return new IfcCurveBoundedPlane(expressID, type, BasisSurface, OuterBoundary, InnerBoundaries);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BasisSurface);
+    ;
+    args.push(this.OuterBoundary);
+    ;
+    args.push(this.InnerBoundaries);
+    ;
+    return args;
+  }
+};
+var IfcCurveBoundedSurface = class {
+  constructor(expressID, type, BasisSurface, Boundaries, ImplicitOuter) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BasisSurface = BasisSurface;
+    this.Boundaries = Boundaries;
+    this.ImplicitOuter = ImplicitOuter;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BasisSurface = tape[ptr++];
+    let Boundaries = tape[ptr++];
+    let ImplicitOuter = tape[ptr++];
+    return new IfcCurveBoundedSurface(expressID, type, BasisSurface, Boundaries, ImplicitOuter);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BasisSurface);
+    ;
+    args.push(this.Boundaries);
+    ;
+    args.push(this.ImplicitOuter);
+    ;
+    return args;
+  }
+};
+var IfcCurveSegment2D = class {
+  constructor(expressID, type, StartPoint, StartDirection, SegmentLength) {
+    this.expressID = expressID;
+    this.type = type;
+    this.StartPoint = StartPoint;
+    this.StartDirection = StartDirection;
+    this.SegmentLength = SegmentLength;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let StartPoint = tape[ptr++];
+    let StartDirection = tape[ptr++];
+    let SegmentLength = tape[ptr++];
+    return new IfcCurveSegment2D(expressID, type, StartPoint, StartDirection, SegmentLength);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.StartPoint);
+    ;
+    args.push(this.StartDirection);
+    ;
+    args.push(this.SegmentLength);
+    ;
+    return args;
+  }
+};
+var IfcCurveStyle = class {
+  constructor(expressID, type, Name, CurveFont, CurveWidth, CurveColour, ModelOrDraughting) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.CurveFont = CurveFont;
+    this.CurveWidth = CurveWidth;
+    this.CurveColour = CurveColour;
+    this.ModelOrDraughting = ModelOrDraughting;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let CurveFont = tape[ptr++];
+    let CurveWidth = tape[ptr++];
+    let CurveColour = tape[ptr++];
+    let ModelOrDraughting = tape[ptr++];
+    return new IfcCurveStyle(expressID, type, Name, CurveFont, CurveWidth, CurveColour, ModelOrDraughting);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.CurveFont);
+    ;
+    args.push(this.CurveWidth);
+    ;
+    args.push(this.CurveColour);
+    ;
+    args.push(this.ModelOrDraughting);
+    ;
+    return args;
+  }
+};
+var IfcCurveStyleFont = class {
+  constructor(expressID, type, Name, PatternList) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.PatternList = PatternList;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let PatternList = tape[ptr++];
+    return new IfcCurveStyleFont(expressID, type, Name, PatternList);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.PatternList);
+    ;
+    return args;
+  }
+};
+var IfcCurveStyleFontAndScaling = class {
+  constructor(expressID, type, Name, CurveFont, CurveFontScaling) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.CurveFont = CurveFont;
+    this.CurveFontScaling = CurveFontScaling;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let CurveFont = tape[ptr++];
+    let CurveFontScaling = tape[ptr++];
+    return new IfcCurveStyleFontAndScaling(expressID, type, Name, CurveFont, CurveFontScaling);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.CurveFont);
+    ;
+    args.push(this.CurveFontScaling);
+    ;
+    return args;
+  }
+};
+var IfcCurveStyleFontPattern = class {
+  constructor(expressID, type, VisibleSegmentLength, InvisibleSegmentLength) {
+    this.expressID = expressID;
+    this.type = type;
+    this.VisibleSegmentLength = VisibleSegmentLength;
+    this.InvisibleSegmentLength = InvisibleSegmentLength;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let VisibleSegmentLength = tape[ptr++];
+    let InvisibleSegmentLength = tape[ptr++];
+    return new IfcCurveStyleFontPattern(expressID, type, VisibleSegmentLength, InvisibleSegmentLength);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.VisibleSegmentLength);
+    ;
+    args.push(this.InvisibleSegmentLength);
+    ;
+    return args;
+  }
+};
+var IfcCylindricalSurface = class {
+  constructor(expressID, type, Position, Radius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+    this.Radius = Radius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    let Radius = tape[ptr++];
+    return new IfcCylindricalSurface(expressID, type, Position, Radius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    args.push(this.Radius);
+    ;
+    return args;
+  }
+};
+var IfcDamper = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDamper(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDamperType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDamperType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDeepFoundation = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcDeepFoundation(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcDeepFoundationType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcDeepFoundationType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcDerivedProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, ParentProfile, Operator, Label) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.ParentProfile = ParentProfile;
+    this.Operator = Operator;
+    this.Label = Label;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let ParentProfile = tape[ptr++];
+    let Operator = tape[ptr++];
+    let Label = tape[ptr++];
+    return new IfcDerivedProfileDef(expressID, type, ProfileType, ProfileName, ParentProfile, Operator, Label);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.ParentProfile);
+    ;
+    args.push(this.Operator);
+    ;
+    args.push(this.Label);
+    ;
+    return args;
+  }
+};
+var IfcDerivedUnit = class {
+  constructor(expressID, type, Elements, UnitType, UserDefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Elements = Elements;
+    this.UnitType = UnitType;
+    this.UserDefinedType = UserDefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Elements = tape[ptr++];
+    let UnitType = tape[ptr++];
+    let UserDefinedType = tape[ptr++];
+    return new IfcDerivedUnit(expressID, type, Elements, UnitType, UserDefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Elements);
+    ;
+    args.push(this.UnitType);
+    ;
+    args.push(this.UserDefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDerivedUnitElement = class {
+  constructor(expressID, type, Unit, Exponent) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Unit = Unit;
+    this.Exponent = Exponent;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Unit = tape[ptr++];
+    let Exponent = tape[ptr++];
+    return new IfcDerivedUnitElement(expressID, type, Unit, Exponent);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Unit);
+    ;
+    args.push(this.Exponent);
+    ;
+    return args;
+  }
+};
+var IfcDimensionalExponents = class {
+  constructor(expressID, type, LengthExponent, MassExponent, TimeExponent, ElectricCurrentExponent, ThermodynamicTemperatureExponent, AmountOfSubstanceExponent, LuminousIntensityExponent) {
+    this.expressID = expressID;
+    this.type = type;
+    this.LengthExponent = LengthExponent;
+    this.MassExponent = MassExponent;
+    this.TimeExponent = TimeExponent;
+    this.ElectricCurrentExponent = ElectricCurrentExponent;
+    this.ThermodynamicTemperatureExponent = ThermodynamicTemperatureExponent;
+    this.AmountOfSubstanceExponent = AmountOfSubstanceExponent;
+    this.LuminousIntensityExponent = LuminousIntensityExponent;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let LengthExponent = tape[ptr++];
+    let MassExponent = tape[ptr++];
+    let TimeExponent = tape[ptr++];
+    let ElectricCurrentExponent = tape[ptr++];
+    let ThermodynamicTemperatureExponent = tape[ptr++];
+    let AmountOfSubstanceExponent = tape[ptr++];
+    let LuminousIntensityExponent = tape[ptr++];
+    return new IfcDimensionalExponents(expressID, type, LengthExponent, MassExponent, TimeExponent, ElectricCurrentExponent, ThermodynamicTemperatureExponent, AmountOfSubstanceExponent, LuminousIntensityExponent);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.LengthExponent);
+    ;
+    args.push(this.MassExponent);
+    ;
+    args.push(this.TimeExponent);
+    ;
+    args.push(this.ElectricCurrentExponent);
+    ;
+    args.push(this.ThermodynamicTemperatureExponent);
+    ;
+    args.push(this.AmountOfSubstanceExponent);
+    ;
+    args.push(this.LuminousIntensityExponent);
+    ;
+    return args;
+  }
+};
+var IfcDirection = class {
+  constructor(expressID, type, DirectionRatios) {
+    this.expressID = expressID;
+    this.type = type;
+    this.DirectionRatios = DirectionRatios;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let DirectionRatios = tape[ptr++];
+    return new IfcDirection(expressID, type, DirectionRatios);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.DirectionRatios);
+    ;
+    return args;
+  }
+};
+var IfcDiscreteAccessory = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDiscreteAccessory(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDiscreteAccessoryType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDiscreteAccessoryType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDistanceExpression = class {
+  constructor(expressID, type, DistanceAlong, OffsetLateral, OffsetVertical, OffsetLongitudinal, AlongHorizontal) {
+    this.expressID = expressID;
+    this.type = type;
+    this.DistanceAlong = DistanceAlong;
+    this.OffsetLateral = OffsetLateral;
+    this.OffsetVertical = OffsetVertical;
+    this.OffsetLongitudinal = OffsetLongitudinal;
+    this.AlongHorizontal = AlongHorizontal;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let DistanceAlong = tape[ptr++];
+    let OffsetLateral = tape[ptr++];
+    let OffsetVertical = tape[ptr++];
+    let OffsetLongitudinal = tape[ptr++];
+    let AlongHorizontal = tape[ptr++];
+    return new IfcDistanceExpression(expressID, type, DistanceAlong, OffsetLateral, OffsetVertical, OffsetLongitudinal, AlongHorizontal);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.DistanceAlong);
+    ;
+    args.push(this.OffsetLateral);
+    ;
+    args.push(this.OffsetVertical);
+    ;
+    args.push(this.OffsetLongitudinal);
+    ;
+    args.push(this.AlongHorizontal);
+    ;
+    return args;
+  }
+};
+var IfcDistributionChamberElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDistributionChamberElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDistributionChamberElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDistributionChamberElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDistributionCircuit = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.LongName = LongName;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let LongName = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDistributionCircuit(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDistributionControlElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcDistributionControlElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcDistributionControlElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcDistributionControlElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcDistributionElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcDistributionElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcDistributionElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcDistributionElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcDistributionFlowElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcDistributionFlowElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcDistributionFlowElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcDistributionFlowElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcDistributionPort = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, FlowDirection, PredefinedType, SystemType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.FlowDirection = FlowDirection;
+    this.PredefinedType = PredefinedType;
+    this.SystemType = SystemType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let FlowDirection = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let SystemType = tape[ptr++];
+    return new IfcDistributionPort(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, FlowDirection, PredefinedType, SystemType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.FlowDirection);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.SystemType);
+    ;
+    return args;
+  }
+};
+var IfcDistributionSystem = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.LongName = LongName;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let LongName = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDistributionSystem(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDocumentInformation = class {
+  constructor(expressID, type, Identification, Name, Description, Location, Purpose, IntendedUse, Scope, Revision, DocumentOwner, Editors, CreationTime, LastRevisionTime, ElectronicFormat, ValidFrom, ValidUntil, Confidentiality, Status) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Identification = Identification;
+    this.Name = Name;
+    this.Description = Description;
+    this.Location = Location;
+    this.Purpose = Purpose;
+    this.IntendedUse = IntendedUse;
+    this.Scope = Scope;
+    this.Revision = Revision;
+    this.DocumentOwner = DocumentOwner;
+    this.Editors = Editors;
+    this.CreationTime = CreationTime;
+    this.LastRevisionTime = LastRevisionTime;
+    this.ElectronicFormat = ElectronicFormat;
+    this.ValidFrom = ValidFrom;
+    this.ValidUntil = ValidUntil;
+    this.Confidentiality = Confidentiality;
+    this.Status = Status;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Identification = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Location = tape[ptr++];
+    let Purpose = tape[ptr++];
+    let IntendedUse = tape[ptr++];
+    let Scope = tape[ptr++];
+    let Revision = tape[ptr++];
+    let DocumentOwner = tape[ptr++];
+    let Editors = tape[ptr++];
+    let CreationTime = tape[ptr++];
+    let LastRevisionTime = tape[ptr++];
+    let ElectronicFormat = tape[ptr++];
+    let ValidFrom = tape[ptr++];
+    let ValidUntil = tape[ptr++];
+    let Confidentiality = tape[ptr++];
+    let Status = tape[ptr++];
+    return new IfcDocumentInformation(expressID, type, Identification, Name, Description, Location, Purpose, IntendedUse, Scope, Revision, DocumentOwner, Editors, CreationTime, LastRevisionTime, ElectronicFormat, ValidFrom, ValidUntil, Confidentiality, Status);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Identification);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Location);
+    ;
+    args.push(this.Purpose);
+    ;
+    args.push(this.IntendedUse);
+    ;
+    args.push(this.Scope);
+    ;
+    args.push(this.Revision);
+    ;
+    args.push(this.DocumentOwner);
+    ;
+    args.push(this.Editors);
+    ;
+    args.push(this.CreationTime);
+    ;
+    args.push(this.LastRevisionTime);
+    ;
+    args.push(this.ElectronicFormat);
+    ;
+    args.push(this.ValidFrom);
+    ;
+    args.push(this.ValidUntil);
+    ;
+    args.push(this.Confidentiality);
+    ;
+    args.push(this.Status);
+    ;
+    return args;
+  }
+};
+var IfcDocumentInformationRelationship = class {
+  constructor(expressID, type, Name, Description, RelatingDocument, RelatedDocuments, RelationshipType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingDocument = RelatingDocument;
+    this.RelatedDocuments = RelatedDocuments;
+    this.RelationshipType = RelationshipType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingDocument = tape[ptr++];
+    let RelatedDocuments = tape[ptr++];
+    let RelationshipType = tape[ptr++];
+    return new IfcDocumentInformationRelationship(expressID, type, Name, Description, RelatingDocument, RelatedDocuments, RelationshipType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingDocument);
+    ;
+    args.push(this.RelatedDocuments);
+    ;
+    args.push(this.RelationshipType);
+    ;
+    return args;
+  }
+};
+var IfcDocumentReference = class {
+  constructor(expressID, type, Location, Identification, Name, Description, ReferencedDocument) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Location = Location;
+    this.Identification = Identification;
+    this.Name = Name;
+    this.Description = Description;
+    this.ReferencedDocument = ReferencedDocument;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Location = tape[ptr++];
+    let Identification = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ReferencedDocument = tape[ptr++];
+    return new IfcDocumentReference(expressID, type, Location, Identification, Name, Description, ReferencedDocument);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Location);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ReferencedDocument);
+    ;
+    return args;
+  }
+};
+var IfcDoor = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, OperationType, UserDefinedOperationType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.OverallHeight = OverallHeight;
+    this.OverallWidth = OverallWidth;
+    this.PredefinedType = PredefinedType;
+    this.OperationType = OperationType;
+    this.UserDefinedOperationType = UserDefinedOperationType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let OverallHeight = tape[ptr++];
+    let OverallWidth = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let OperationType = tape[ptr++];
+    let UserDefinedOperationType = tape[ptr++];
+    return new IfcDoor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, OperationType, UserDefinedOperationType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.OverallHeight);
+    ;
+    args.push(this.OverallWidth);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.OperationType);
+    ;
+    args.push(this.UserDefinedOperationType);
+    ;
+    return args;
+  }
+};
+var IfcDoorLiningProperties = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, LiningDepth, LiningThickness, ThresholdDepth, ThresholdThickness, TransomThickness, TransomOffset, LiningOffset, ThresholdOffset, CasingThickness, CasingDepth, ShapeAspectStyle, LiningToPanelOffsetX, LiningToPanelOffsetY) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.LiningDepth = LiningDepth;
+    this.LiningThickness = LiningThickness;
+    this.ThresholdDepth = ThresholdDepth;
+    this.ThresholdThickness = ThresholdThickness;
+    this.TransomThickness = TransomThickness;
+    this.TransomOffset = TransomOffset;
+    this.LiningOffset = LiningOffset;
+    this.ThresholdOffset = ThresholdOffset;
+    this.CasingThickness = CasingThickness;
+    this.CasingDepth = CasingDepth;
+    this.ShapeAspectStyle = ShapeAspectStyle;
+    this.LiningToPanelOffsetX = LiningToPanelOffsetX;
+    this.LiningToPanelOffsetY = LiningToPanelOffsetY;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let LiningDepth = tape[ptr++];
+    let LiningThickness = tape[ptr++];
+    let ThresholdDepth = tape[ptr++];
+    let ThresholdThickness = tape[ptr++];
+    let TransomThickness = tape[ptr++];
+    let TransomOffset = tape[ptr++];
+    let LiningOffset = tape[ptr++];
+    let ThresholdOffset = tape[ptr++];
+    let CasingThickness = tape[ptr++];
+    let CasingDepth = tape[ptr++];
+    let ShapeAspectStyle = tape[ptr++];
+    let LiningToPanelOffsetX = tape[ptr++];
+    let LiningToPanelOffsetY = tape[ptr++];
+    return new IfcDoorLiningProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, LiningDepth, LiningThickness, ThresholdDepth, ThresholdThickness, TransomThickness, TransomOffset, LiningOffset, ThresholdOffset, CasingThickness, CasingDepth, ShapeAspectStyle, LiningToPanelOffsetX, LiningToPanelOffsetY);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.LiningDepth);
+    ;
+    args.push(this.LiningThickness);
+    ;
+    args.push(this.ThresholdDepth);
+    ;
+    args.push(this.ThresholdThickness);
+    ;
+    args.push(this.TransomThickness);
+    ;
+    args.push(this.TransomOffset);
+    ;
+    args.push(this.LiningOffset);
+    ;
+    args.push(this.ThresholdOffset);
+    ;
+    args.push(this.CasingThickness);
+    ;
+    args.push(this.CasingDepth);
+    ;
+    args.push(this.ShapeAspectStyle);
+    ;
+    args.push(this.LiningToPanelOffsetX);
+    ;
+    args.push(this.LiningToPanelOffsetY);
+    ;
+    return args;
+  }
+};
+var IfcDoorPanelProperties = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, PanelDepth, PanelOperation, PanelWidth, PanelPosition, ShapeAspectStyle) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.PanelDepth = PanelDepth;
+    this.PanelOperation = PanelOperation;
+    this.PanelWidth = PanelWidth;
+    this.PanelPosition = PanelPosition;
+    this.ShapeAspectStyle = ShapeAspectStyle;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let PanelDepth = tape[ptr++];
+    let PanelOperation = tape[ptr++];
+    let PanelWidth = tape[ptr++];
+    let PanelPosition = tape[ptr++];
+    let ShapeAspectStyle = tape[ptr++];
+    return new IfcDoorPanelProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, PanelDepth, PanelOperation, PanelWidth, PanelPosition, ShapeAspectStyle);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.PanelDepth);
+    ;
+    args.push(this.PanelOperation);
+    ;
+    args.push(this.PanelWidth);
+    ;
+    args.push(this.PanelPosition);
+    ;
+    args.push(this.ShapeAspectStyle);
+    ;
+    return args;
+  }
+};
+var IfcDoorStandardCase = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, OperationType, UserDefinedOperationType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.OverallHeight = OverallHeight;
+    this.OverallWidth = OverallWidth;
+    this.PredefinedType = PredefinedType;
+    this.OperationType = OperationType;
+    this.UserDefinedOperationType = UserDefinedOperationType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let OverallHeight = tape[ptr++];
+    let OverallWidth = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let OperationType = tape[ptr++];
+    let UserDefinedOperationType = tape[ptr++];
+    return new IfcDoorStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, OperationType, UserDefinedOperationType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.OverallHeight);
+    ;
+    args.push(this.OverallWidth);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.OperationType);
+    ;
+    args.push(this.UserDefinedOperationType);
+    ;
+    return args;
+  }
+};
+var IfcDoorStyle = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, OperationType, ConstructionType, ParameterTakesPrecedence, Sizeable) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.OperationType = OperationType;
+    this.ConstructionType = ConstructionType;
+    this.ParameterTakesPrecedence = ParameterTakesPrecedence;
+    this.Sizeable = Sizeable;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let OperationType = tape[ptr++];
+    let ConstructionType = tape[ptr++];
+    let ParameterTakesPrecedence = tape[ptr++];
+    let Sizeable = tape[ptr++];
+    return new IfcDoorStyle(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, OperationType, ConstructionType, ParameterTakesPrecedence, Sizeable);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.OperationType);
+    ;
+    args.push(this.ConstructionType);
+    ;
+    args.push(this.ParameterTakesPrecedence);
+    ;
+    args.push(this.Sizeable);
+    ;
+    return args;
+  }
+};
+var IfcDoorType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, OperationType, ParameterTakesPrecedence, UserDefinedOperationType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+    this.OperationType = OperationType;
+    this.ParameterTakesPrecedence = ParameterTakesPrecedence;
+    this.UserDefinedOperationType = UserDefinedOperationType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let OperationType = tape[ptr++];
+    let ParameterTakesPrecedence = tape[ptr++];
+    let UserDefinedOperationType = tape[ptr++];
+    return new IfcDoorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, OperationType, ParameterTakesPrecedence, UserDefinedOperationType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.OperationType);
+    ;
+    args.push(this.ParameterTakesPrecedence);
+    ;
+    args.push(this.UserDefinedOperationType);
+    ;
+    return args;
+  }
+};
+var IfcDraughtingPreDefinedColour = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcDraughtingPreDefinedColour(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcDraughtingPreDefinedCurveFont = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcDraughtingPreDefinedCurveFont(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcDuctFitting = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDuctFitting(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDuctFittingType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDuctFittingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDuctSegment = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDuctSegment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDuctSegmentType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDuctSegmentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDuctSilencer = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDuctSilencer(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcDuctSilencerType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcDuctSilencerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcEdge = class {
+  constructor(expressID, type, EdgeStart, EdgeEnd) {
+    this.expressID = expressID;
+    this.type = type;
+    this.EdgeStart = EdgeStart;
+    this.EdgeEnd = EdgeEnd;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let EdgeStart = tape[ptr++];
+    let EdgeEnd = tape[ptr++];
+    return new IfcEdge(expressID, type, EdgeStart, EdgeEnd);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.EdgeStart);
+    ;
+    args.push(this.EdgeEnd);
+    ;
+    return args;
+  }
+};
+var IfcEdgeCurve = class {
+  constructor(expressID, type, EdgeStart, EdgeEnd, EdgeGeometry, SameSense) {
+    this.expressID = expressID;
+    this.type = type;
+    this.EdgeStart = EdgeStart;
+    this.EdgeEnd = EdgeEnd;
+    this.EdgeGeometry = EdgeGeometry;
+    this.SameSense = SameSense;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let EdgeStart = tape[ptr++];
+    let EdgeEnd = tape[ptr++];
+    let EdgeGeometry = tape[ptr++];
+    let SameSense = tape[ptr++];
+    return new IfcEdgeCurve(expressID, type, EdgeStart, EdgeEnd, EdgeGeometry, SameSense);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.EdgeStart);
+    ;
+    args.push(this.EdgeEnd);
+    ;
+    args.push(this.EdgeGeometry);
+    ;
+    args.push(this.SameSense);
+    ;
+    return args;
+  }
+};
+var IfcEdgeLoop = class {
+  constructor(expressID, type, EdgeList) {
+    this.expressID = expressID;
+    this.type = type;
+    this.EdgeList = EdgeList;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let EdgeList = tape[ptr++];
+    return new IfcEdgeLoop(expressID, type, EdgeList);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.EdgeList);
+    ;
+    return args;
+  }
+};
+var IfcElectricAppliance = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElectricAppliance(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElectricApplianceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElectricApplianceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElectricDistributionBoard = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElectricDistributionBoard(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElectricDistributionBoardType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElectricDistributionBoardType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElectricFlowStorageDevice = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElectricFlowStorageDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElectricFlowStorageDeviceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElectricFlowStorageDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElectricGenerator = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElectricGenerator(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElectricGeneratorType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElectricGeneratorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElectricMotor = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElectricMotor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElectricMotorType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElectricMotorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElectricTimeControl = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElectricTimeControl(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElectricTimeControlType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElectricTimeControlType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcElementAssembly = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, AssemblyPlace, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.AssemblyPlace = AssemblyPlace;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let AssemblyPlace = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElementAssembly(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, AssemblyPlace, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.AssemblyPlace);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElementAssemblyType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcElementAssemblyType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcElementComponent = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcElementComponent(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcElementComponentType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcElementComponentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcElementQuantity = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, MethodOfMeasurement, Quantities) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.MethodOfMeasurement = MethodOfMeasurement;
+    this.Quantities = Quantities;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let MethodOfMeasurement = tape[ptr++];
+    let Quantities = tape[ptr++];
+    return new IfcElementQuantity(expressID, type, GlobalId, OwnerHistory, Name, Description, MethodOfMeasurement, Quantities);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.MethodOfMeasurement);
+    ;
+    args.push(this.Quantities);
+    ;
+    return args;
+  }
+};
+var IfcElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcElementarySurface = class {
+  constructor(expressID, type, Position) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    return new IfcElementarySurface(expressID, type, Position);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    return args;
+  }
+};
+var IfcEllipse = class {
+  constructor(expressID, type, Position, SemiAxis1, SemiAxis2) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+    this.SemiAxis1 = SemiAxis1;
+    this.SemiAxis2 = SemiAxis2;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    let SemiAxis1 = tape[ptr++];
+    let SemiAxis2 = tape[ptr++];
+    return new IfcEllipse(expressID, type, Position, SemiAxis1, SemiAxis2);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    args.push(this.SemiAxis1);
+    ;
+    args.push(this.SemiAxis2);
+    ;
+    return args;
+  }
+};
+var IfcEllipseProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, SemiAxis1, SemiAxis2) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.SemiAxis1 = SemiAxis1;
+    this.SemiAxis2 = SemiAxis2;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let SemiAxis1 = tape[ptr++];
+    let SemiAxis2 = tape[ptr++];
+    return new IfcEllipseProfileDef(expressID, type, ProfileType, ProfileName, Position, SemiAxis1, SemiAxis2);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.SemiAxis1);
+    ;
+    args.push(this.SemiAxis2);
+    ;
+    return args;
+  }
+};
+var IfcEnergyConversionDevice = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcEnergyConversionDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcEnergyConversionDeviceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcEnergyConversionDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcEngine = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcEngine(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcEngineType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcEngineType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcEvaporativeCooler = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcEvaporativeCooler(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcEvaporativeCoolerType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcEvaporativeCoolerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcEvaporator = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcEvaporator(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcEvaporatorType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcEvaporatorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcEvent = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, PredefinedType, EventTriggerType, UserDefinedEventTriggerType, EventOccurenceTime) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.PredefinedType = PredefinedType;
+    this.EventTriggerType = EventTriggerType;
+    this.UserDefinedEventTriggerType = UserDefinedEventTriggerType;
+    this.EventOccurenceTime = EventOccurenceTime;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let EventTriggerType = tape[ptr++];
+    let UserDefinedEventTriggerType = tape[ptr++];
+    let EventOccurenceTime = tape[ptr++];
+    return new IfcEvent(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, PredefinedType, EventTriggerType, UserDefinedEventTriggerType, EventOccurenceTime);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.EventTriggerType);
+    ;
+    args.push(this.UserDefinedEventTriggerType);
+    ;
+    args.push(this.EventOccurenceTime);
+    ;
+    return args;
+  }
+};
+var IfcEventTime = class {
+  constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, ActualDate, EarlyDate, LateDate, ScheduleDate) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.DataOrigin = DataOrigin;
+    this.UserDefinedDataOrigin = UserDefinedDataOrigin;
+    this.ActualDate = ActualDate;
+    this.EarlyDate = EarlyDate;
+    this.LateDate = LateDate;
+    this.ScheduleDate = ScheduleDate;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let DataOrigin = tape[ptr++];
+    let UserDefinedDataOrigin = tape[ptr++];
+    let ActualDate = tape[ptr++];
+    let EarlyDate = tape[ptr++];
+    let LateDate = tape[ptr++];
+    let ScheduleDate = tape[ptr++];
+    return new IfcEventTime(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, ActualDate, EarlyDate, LateDate, ScheduleDate);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.DataOrigin);
+    ;
+    args.push(this.UserDefinedDataOrigin);
+    ;
+    args.push(this.ActualDate);
+    ;
+    args.push(this.EarlyDate);
+    ;
+    args.push(this.LateDate);
+    ;
+    args.push(this.ScheduleDate);
+    ;
+    return args;
+  }
+};
+var IfcEventType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType, PredefinedType, EventTriggerType, UserDefinedEventTriggerType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.ProcessType = ProcessType;
+    this.PredefinedType = PredefinedType;
+    this.EventTriggerType = EventTriggerType;
+    this.UserDefinedEventTriggerType = UserDefinedEventTriggerType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let ProcessType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let EventTriggerType = tape[ptr++];
+    let UserDefinedEventTriggerType = tape[ptr++];
+    return new IfcEventType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType, PredefinedType, EventTriggerType, UserDefinedEventTriggerType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.ProcessType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.EventTriggerType);
+    ;
+    args.push(this.UserDefinedEventTriggerType);
+    ;
+    return args;
+  }
+};
+var IfcExtendedProperties = class {
+  constructor(expressID, type, Name, Description, Properties) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Properties = Properties;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Properties = tape[ptr++];
+    return new IfcExtendedProperties(expressID, type, Name, Description, Properties);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Properties);
+    ;
+    return args;
+  }
+};
+var IfcExternalInformation = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcExternalInformation(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcExternalReference = class {
+  constructor(expressID, type, Location, Identification, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Location = Location;
+    this.Identification = Identification;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Location = tape[ptr++];
+    let Identification = tape[ptr++];
+    let Name = tape[ptr++];
+    return new IfcExternalReference(expressID, type, Location, Identification, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Location);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcExternalReferenceRelationship = class {
+  constructor(expressID, type, Name, Description, RelatingReference, RelatedResourceObjects) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingReference = RelatingReference;
+    this.RelatedResourceObjects = RelatedResourceObjects;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingReference = tape[ptr++];
+    let RelatedResourceObjects = tape[ptr++];
+    return new IfcExternalReferenceRelationship(expressID, type, Name, Description, RelatingReference, RelatedResourceObjects);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingReference);
+    ;
+    args.push(this.RelatedResourceObjects);
+    ;
+    return args;
+  }
+};
+var IfcExternalSpatialElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcExternalSpatialElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcExternalSpatialStructureElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    return new IfcExternalSpatialStructureElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    return args;
+  }
+};
+var IfcExternallyDefinedHatchStyle = class {
+  constructor(expressID, type, Location, Identification, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Location = Location;
+    this.Identification = Identification;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Location = tape[ptr++];
+    let Identification = tape[ptr++];
+    let Name = tape[ptr++];
+    return new IfcExternallyDefinedHatchStyle(expressID, type, Location, Identification, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Location);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcExternallyDefinedSurfaceStyle = class {
+  constructor(expressID, type, Location, Identification, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Location = Location;
+    this.Identification = Identification;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Location = tape[ptr++];
+    let Identification = tape[ptr++];
+    let Name = tape[ptr++];
+    return new IfcExternallyDefinedSurfaceStyle(expressID, type, Location, Identification, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Location);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcExternallyDefinedTextFont = class {
+  constructor(expressID, type, Location, Identification, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Location = Location;
+    this.Identification = Identification;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Location = tape[ptr++];
+    let Identification = tape[ptr++];
+    let Name = tape[ptr++];
+    return new IfcExternallyDefinedTextFont(expressID, type, Location, Identification, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Location);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcExtrudedAreaSolid = class {
+  constructor(expressID, type, SweptArea, Position, ExtrudedDirection, Depth) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SweptArea = SweptArea;
+    this.Position = Position;
+    this.ExtrudedDirection = ExtrudedDirection;
+    this.Depth = Depth;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SweptArea = tape[ptr++];
+    let Position = tape[ptr++];
+    let ExtrudedDirection = tape[ptr++];
+    let Depth = tape[ptr++];
+    return new IfcExtrudedAreaSolid(expressID, type, SweptArea, Position, ExtrudedDirection, Depth);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SweptArea);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.ExtrudedDirection);
+    ;
+    args.push(this.Depth);
+    ;
+    return args;
+  }
+};
+var IfcExtrudedAreaSolidTapered = class {
+  constructor(expressID, type, SweptArea, Position, ExtrudedDirection, Depth, EndSweptArea) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SweptArea = SweptArea;
+    this.Position = Position;
+    this.ExtrudedDirection = ExtrudedDirection;
+    this.Depth = Depth;
+    this.EndSweptArea = EndSweptArea;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SweptArea = tape[ptr++];
+    let Position = tape[ptr++];
+    let ExtrudedDirection = tape[ptr++];
+    let Depth = tape[ptr++];
+    let EndSweptArea = tape[ptr++];
+    return new IfcExtrudedAreaSolidTapered(expressID, type, SweptArea, Position, ExtrudedDirection, Depth, EndSweptArea);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SweptArea);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.ExtrudedDirection);
+    ;
+    args.push(this.Depth);
+    ;
+    args.push(this.EndSweptArea);
+    ;
+    return args;
+  }
+};
+var IfcFace = class {
+  constructor(expressID, type, Bounds) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Bounds = Bounds;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Bounds = tape[ptr++];
+    return new IfcFace(expressID, type, Bounds);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Bounds);
+    ;
+    return args;
+  }
+};
+var IfcFaceBasedSurfaceModel = class {
+  constructor(expressID, type, FbsmFaces) {
+    this.expressID = expressID;
+    this.type = type;
+    this.FbsmFaces = FbsmFaces;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let FbsmFaces = tape[ptr++];
+    return new IfcFaceBasedSurfaceModel(expressID, type, FbsmFaces);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.FbsmFaces);
+    ;
+    return args;
+  }
+};
+var IfcFaceBound = class {
+  constructor(expressID, type, Bound, Orientation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Bound = Bound;
+    this.Orientation = Orientation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Bound = tape[ptr++];
+    let Orientation = tape[ptr++];
+    return new IfcFaceBound(expressID, type, Bound, Orientation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Bound);
+    ;
+    args.push(this.Orientation);
+    ;
+    return args;
+  }
+};
+var IfcFaceOuterBound = class {
+  constructor(expressID, type, Bound, Orientation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Bound = Bound;
+    this.Orientation = Orientation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Bound = tape[ptr++];
+    let Orientation = tape[ptr++];
+    return new IfcFaceOuterBound(expressID, type, Bound, Orientation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Bound);
+    ;
+    args.push(this.Orientation);
+    ;
+    return args;
+  }
+};
+var IfcFaceSurface = class {
+  constructor(expressID, type, Bounds, FaceSurface, SameSense) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Bounds = Bounds;
+    this.FaceSurface = FaceSurface;
+    this.SameSense = SameSense;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Bounds = tape[ptr++];
+    let FaceSurface = tape[ptr++];
+    let SameSense = tape[ptr++];
+    return new IfcFaceSurface(expressID, type, Bounds, FaceSurface, SameSense);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Bounds);
+    ;
+    args.push(this.FaceSurface);
+    ;
+    args.push(this.SameSense);
+    ;
+    return args;
+  }
+};
+var IfcFacetedBrep = class {
+  constructor(expressID, type, Outer) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Outer = Outer;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Outer = tape[ptr++];
+    return new IfcFacetedBrep(expressID, type, Outer);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Outer);
+    ;
+    return args;
+  }
+};
+var IfcFacetedBrepWithVoids = class {
+  constructor(expressID, type, Outer, Voids) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Outer = Outer;
+    this.Voids = Voids;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Outer = tape[ptr++];
+    let Voids = tape[ptr++];
+    return new IfcFacetedBrepWithVoids(expressID, type, Outer, Voids);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Outer);
+    ;
+    args.push(this.Voids);
+    ;
+    return args;
+  }
+};
+var IfcFacility = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+    this.CompositionType = CompositionType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    let CompositionType = tape[ptr++];
+    return new IfcFacility(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.CompositionType);
+    ;
+    return args;
+  }
+};
+var IfcFacilityPart = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+    this.CompositionType = CompositionType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    let CompositionType = tape[ptr++];
+    return new IfcFacilityPart(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.CompositionType);
+    ;
+    return args;
+  }
+};
+var IfcFailureConnectionCondition = class {
+  constructor(expressID, type, Name, TensionFailureX, TensionFailureY, TensionFailureZ, CompressionFailureX, CompressionFailureY, CompressionFailureZ) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.TensionFailureX = TensionFailureX;
+    this.TensionFailureY = TensionFailureY;
+    this.TensionFailureZ = TensionFailureZ;
+    this.CompressionFailureX = CompressionFailureX;
+    this.CompressionFailureY = CompressionFailureY;
+    this.CompressionFailureZ = CompressionFailureZ;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let TensionFailureX = tape[ptr++];
+    let TensionFailureY = tape[ptr++];
+    let TensionFailureZ = tape[ptr++];
+    let CompressionFailureX = tape[ptr++];
+    let CompressionFailureY = tape[ptr++];
+    let CompressionFailureZ = tape[ptr++];
+    return new IfcFailureConnectionCondition(expressID, type, Name, TensionFailureX, TensionFailureY, TensionFailureZ, CompressionFailureX, CompressionFailureY, CompressionFailureZ);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.TensionFailureX);
+    ;
+    args.push(this.TensionFailureY);
+    ;
+    args.push(this.TensionFailureZ);
+    ;
+    args.push(this.CompressionFailureX);
+    ;
+    args.push(this.CompressionFailureY);
+    ;
+    args.push(this.CompressionFailureZ);
+    ;
+    return args;
+  }
+};
+var IfcFan = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFan(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFanType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFanType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFastener = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFastener(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFastenerType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFastenerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFeatureElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcFeatureElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcFeatureElementAddition = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcFeatureElementAddition(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcFeatureElementSubtraction = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcFeatureElementSubtraction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcFillAreaStyle = class {
+  constructor(expressID, type, Name, FillStyles, ModelorDraughting) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.FillStyles = FillStyles;
+    this.ModelorDraughting = ModelorDraughting;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let FillStyles = tape[ptr++];
+    let ModelorDraughting = tape[ptr++];
+    return new IfcFillAreaStyle(expressID, type, Name, FillStyles, ModelorDraughting);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.FillStyles);
+    ;
+    args.push(this.ModelorDraughting);
+    ;
+    return args;
+  }
+};
+var IfcFillAreaStyleHatching = class {
+  constructor(expressID, type, HatchLineAppearance, StartOfNextHatchLine, PointOfReferenceHatchLine, PatternStart, HatchLineAngle) {
+    this.expressID = expressID;
+    this.type = type;
+    this.HatchLineAppearance = HatchLineAppearance;
+    this.StartOfNextHatchLine = StartOfNextHatchLine;
+    this.PointOfReferenceHatchLine = PointOfReferenceHatchLine;
+    this.PatternStart = PatternStart;
+    this.HatchLineAngle = HatchLineAngle;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let HatchLineAppearance = tape[ptr++];
+    let StartOfNextHatchLine = tape[ptr++];
+    let PointOfReferenceHatchLine = tape[ptr++];
+    let PatternStart = tape[ptr++];
+    let HatchLineAngle = tape[ptr++];
+    return new IfcFillAreaStyleHatching(expressID, type, HatchLineAppearance, StartOfNextHatchLine, PointOfReferenceHatchLine, PatternStart, HatchLineAngle);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.HatchLineAppearance);
+    ;
+    args.push(this.StartOfNextHatchLine);
+    ;
+    args.push(this.PointOfReferenceHatchLine);
+    ;
+    args.push(this.PatternStart);
+    ;
+    args.push(this.HatchLineAngle);
+    ;
+    return args;
+  }
+};
+var IfcFillAreaStyleTiles = class {
+  constructor(expressID, type, TilingPattern, Tiles, TilingScale) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TilingPattern = TilingPattern;
+    this.Tiles = Tiles;
+    this.TilingScale = TilingScale;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TilingPattern = tape[ptr++];
+    let Tiles = tape[ptr++];
+    let TilingScale = tape[ptr++];
+    return new IfcFillAreaStyleTiles(expressID, type, TilingPattern, Tiles, TilingScale);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TilingPattern);
+    ;
+    args.push(this.Tiles);
+    ;
+    args.push(this.TilingScale);
+    ;
+    return args;
+  }
+};
+var IfcFilter = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFilter(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFilterType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFilterType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFireSuppressionTerminal = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFireSuppressionTerminal(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFireSuppressionTerminalType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFireSuppressionTerminalType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFixedReferenceSweptAreaSolid = class {
+  constructor(expressID, type, SweptArea, Position, Directrix, StartParam, EndParam, FixedReference) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SweptArea = SweptArea;
+    this.Position = Position;
+    this.Directrix = Directrix;
+    this.StartParam = StartParam;
+    this.EndParam = EndParam;
+    this.FixedReference = FixedReference;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SweptArea = tape[ptr++];
+    let Position = tape[ptr++];
+    let Directrix = tape[ptr++];
+    let StartParam = tape[ptr++];
+    let EndParam = tape[ptr++];
+    let FixedReference = tape[ptr++];
+    return new IfcFixedReferenceSweptAreaSolid(expressID, type, SweptArea, Position, Directrix, StartParam, EndParam, FixedReference);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SweptArea);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Directrix);
+    ;
+    args.push(this.StartParam);
+    ;
+    args.push(this.EndParam);
+    ;
+    args.push(this.FixedReference);
+    ;
+    return args;
+  }
+};
+var IfcFlowController = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcFlowController(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcFlowControllerType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcFlowControllerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcFlowFitting = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcFlowFitting(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcFlowFittingType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcFlowFittingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcFlowInstrument = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFlowInstrument(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFlowInstrumentType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFlowInstrumentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFlowMeter = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFlowMeter(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFlowMeterType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFlowMeterType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFlowMovingDevice = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcFlowMovingDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcFlowMovingDeviceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcFlowMovingDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcFlowSegment = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcFlowSegment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcFlowSegmentType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcFlowSegmentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcFlowStorageDevice = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcFlowStorageDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcFlowStorageDeviceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcFlowStorageDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcFlowTerminal = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcFlowTerminal(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcFlowTerminalType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcFlowTerminalType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcFlowTreatmentDevice = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcFlowTreatmentDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcFlowTreatmentDeviceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcFlowTreatmentDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcFooting = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFooting(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFootingType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFootingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFurnishingElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcFurnishingElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcFurnishingElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcFurnishingElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcFurniture = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFurniture(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcFurnitureType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, AssemblyPlace, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.AssemblyPlace = AssemblyPlace;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let AssemblyPlace = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcFurnitureType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, AssemblyPlace, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.AssemblyPlace);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcGeographicElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcGeographicElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcGeographicElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcGeographicElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcGeometricCurveSet = class {
+  constructor(expressID, type, Elements) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Elements = Elements;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Elements = tape[ptr++];
+    return new IfcGeometricCurveSet(expressID, type, Elements);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Elements);
+    ;
+    return args;
+  }
+};
+var IfcGeometricRepresentationContext = class {
+  constructor(expressID, type, ContextIdentifier, ContextType, CoordinateSpaceDimension, Precision, WorldCoordinateSystem, TrueNorth) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ContextIdentifier = ContextIdentifier;
+    this.ContextType = ContextType;
+    this.CoordinateSpaceDimension = CoordinateSpaceDimension;
+    this.Precision = Precision;
+    this.WorldCoordinateSystem = WorldCoordinateSystem;
+    this.TrueNorth = TrueNorth;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ContextIdentifier = tape[ptr++];
+    let ContextType = tape[ptr++];
+    let CoordinateSpaceDimension = tape[ptr++];
+    let Precision = tape[ptr++];
+    let WorldCoordinateSystem = tape[ptr++];
+    let TrueNorth = tape[ptr++];
+    return new IfcGeometricRepresentationContext(expressID, type, ContextIdentifier, ContextType, CoordinateSpaceDimension, Precision, WorldCoordinateSystem, TrueNorth);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ContextIdentifier);
+    ;
+    args.push(this.ContextType);
+    ;
+    args.push(this.CoordinateSpaceDimension);
+    ;
+    args.push(this.Precision);
+    ;
+    args.push(this.WorldCoordinateSystem);
+    ;
+    args.push(this.TrueNorth);
+    ;
+    return args;
+  }
+};
+var IfcGeometricRepresentationItem = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcGeometricRepresentationItem(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcGeometricRepresentationSubContext = class {
+  constructor(expressID, type, ContextIdentifier, ContextType, CoordinateSpaceDimension, Precision, WorldCoordinateSystem, TrueNorth, ParentContext, TargetScale, TargetView, UserDefinedTargetView) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ContextIdentifier = ContextIdentifier;
+    this.ContextType = ContextType;
+    this.CoordinateSpaceDimension = CoordinateSpaceDimension;
+    this.Precision = Precision;
+    this.WorldCoordinateSystem = WorldCoordinateSystem;
+    this.TrueNorth = TrueNorth;
+    this.ParentContext = ParentContext;
+    this.TargetScale = TargetScale;
+    this.TargetView = TargetView;
+    this.UserDefinedTargetView = UserDefinedTargetView;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ContextIdentifier = tape[ptr++];
+    let ContextType = tape[ptr++];
+    let CoordinateSpaceDimension = tape[ptr++];
+    let Precision = tape[ptr++];
+    let WorldCoordinateSystem = tape[ptr++];
+    let TrueNorth = tape[ptr++];
+    let ParentContext = tape[ptr++];
+    let TargetScale = tape[ptr++];
+    let TargetView = tape[ptr++];
+    let UserDefinedTargetView = tape[ptr++];
+    return new IfcGeometricRepresentationSubContext(expressID, type, ContextIdentifier, ContextType, CoordinateSpaceDimension, Precision, WorldCoordinateSystem, TrueNorth, ParentContext, TargetScale, TargetView, UserDefinedTargetView);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ContextIdentifier);
+    ;
+    args.push(this.ContextType);
+    ;
+    args.push(this.CoordinateSpaceDimension);
+    ;
+    args.push(this.Precision);
+    ;
+    args.push(this.WorldCoordinateSystem);
+    ;
+    args.push(this.TrueNorth);
+    ;
+    args.push(this.ParentContext);
+    ;
+    args.push(this.TargetScale);
+    ;
+    args.push(this.TargetView);
+    ;
+    args.push(this.UserDefinedTargetView);
+    ;
+    return args;
+  }
+};
+var IfcGeometricSet = class {
+  constructor(expressID, type, Elements) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Elements = Elements;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Elements = tape[ptr++];
+    return new IfcGeometricSet(expressID, type, Elements);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Elements);
+    ;
+    return args;
+  }
+};
+var IfcGrid = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, UAxes, VAxes, WAxes, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.UAxes = UAxes;
+    this.VAxes = VAxes;
+    this.WAxes = WAxes;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let UAxes = tape[ptr++];
+    let VAxes = tape[ptr++];
+    let WAxes = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcGrid(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, UAxes, VAxes, WAxes, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.UAxes);
+    ;
+    args.push(this.VAxes);
+    ;
+    args.push(this.WAxes);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcGridAxis = class {
+  constructor(expressID, type, AxisTag, AxisCurve, SameSense) {
+    this.expressID = expressID;
+    this.type = type;
+    this.AxisTag = AxisTag;
+    this.AxisCurve = AxisCurve;
+    this.SameSense = SameSense;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let AxisTag = tape[ptr++];
+    let AxisCurve = tape[ptr++];
+    let SameSense = tape[ptr++];
+    return new IfcGridAxis(expressID, type, AxisTag, AxisCurve, SameSense);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.AxisTag);
+    ;
+    args.push(this.AxisCurve);
+    ;
+    args.push(this.SameSense);
+    ;
+    return args;
+  }
+};
+var IfcGridPlacement = class {
+  constructor(expressID, type, PlacementRelTo, PlacementLocation, PlacementRefDirection) {
+    this.expressID = expressID;
+    this.type = type;
+    this.PlacementRelTo = PlacementRelTo;
+    this.PlacementLocation = PlacementLocation;
+    this.PlacementRefDirection = PlacementRefDirection;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let PlacementRelTo = tape[ptr++];
+    let PlacementLocation = tape[ptr++];
+    let PlacementRefDirection = tape[ptr++];
+    return new IfcGridPlacement(expressID, type, PlacementRelTo, PlacementLocation, PlacementRefDirection);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.PlacementRelTo);
+    ;
+    args.push(this.PlacementLocation);
+    ;
+    args.push(this.PlacementRefDirection);
+    ;
+    return args;
+  }
+};
+var IfcGroup = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    return new IfcGroup(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    return args;
+  }
+};
+var IfcHalfSpaceSolid = class {
+  constructor(expressID, type, BaseSurface, AgreementFlag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BaseSurface = BaseSurface;
+    this.AgreementFlag = AgreementFlag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BaseSurface = tape[ptr++];
+    let AgreementFlag = tape[ptr++];
+    return new IfcHalfSpaceSolid(expressID, type, BaseSurface, AgreementFlag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BaseSurface);
+    ;
+    args.push(this.AgreementFlag);
+    ;
+    return args;
+  }
+};
+var IfcHeatExchanger = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcHeatExchanger(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcHeatExchangerType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcHeatExchangerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcHumidifier = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcHumidifier(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcHumidifierType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcHumidifierType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcIShapeProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, OverallWidth, OverallDepth, WebThickness, FlangeThickness, FilletRadius, FlangeEdgeRadius, FlangeSlope) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.OverallWidth = OverallWidth;
+    this.OverallDepth = OverallDepth;
+    this.WebThickness = WebThickness;
+    this.FlangeThickness = FlangeThickness;
+    this.FilletRadius = FilletRadius;
+    this.FlangeEdgeRadius = FlangeEdgeRadius;
+    this.FlangeSlope = FlangeSlope;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let OverallWidth = tape[ptr++];
+    let OverallDepth = tape[ptr++];
+    let WebThickness = tape[ptr++];
+    let FlangeThickness = tape[ptr++];
+    let FilletRadius = tape[ptr++];
+    let FlangeEdgeRadius = tape[ptr++];
+    let FlangeSlope = tape[ptr++];
+    return new IfcIShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, OverallWidth, OverallDepth, WebThickness, FlangeThickness, FilletRadius, FlangeEdgeRadius, FlangeSlope);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.OverallWidth);
+    ;
+    args.push(this.OverallDepth);
+    ;
+    args.push(this.WebThickness);
+    ;
+    args.push(this.FlangeThickness);
+    ;
+    args.push(this.FilletRadius);
+    ;
+    args.push(this.FlangeEdgeRadius);
+    ;
+    args.push(this.FlangeSlope);
+    ;
+    return args;
+  }
+};
+var IfcImageTexture = class {
+  constructor(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter, URLReference) {
+    this.expressID = expressID;
+    this.type = type;
+    this.RepeatS = RepeatS;
+    this.RepeatT = RepeatT;
+    this.Mode = Mode;
+    this.TextureTransform = TextureTransform;
+    this.Parameter = Parameter;
+    this.URLReference = URLReference;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let RepeatS = tape[ptr++];
+    let RepeatT = tape[ptr++];
+    let Mode = tape[ptr++];
+    let TextureTransform = tape[ptr++];
+    let Parameter = tape[ptr++];
+    let URLReference = tape[ptr++];
+    return new IfcImageTexture(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter, URLReference);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.RepeatS);
+    ;
+    args.push(this.RepeatT);
+    ;
+    args.push(this.Mode);
+    ;
+    args.push(this.TextureTransform);
+    ;
+    args.push(this.Parameter);
+    ;
+    args.push(this.URLReference);
+    ;
+    return args;
+  }
+};
+var IfcIndexedColourMap = class {
+  constructor(expressID, type, MappedTo, Opacity, Colours, ColourIndex) {
+    this.expressID = expressID;
+    this.type = type;
+    this.MappedTo = MappedTo;
+    this.Opacity = Opacity;
+    this.Colours = Colours;
+    this.ColourIndex = ColourIndex;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let MappedTo = tape[ptr++];
+    let Opacity = tape[ptr++];
+    let Colours = tape[ptr++];
+    let ColourIndex = tape[ptr++];
+    return new IfcIndexedColourMap(expressID, type, MappedTo, Opacity, Colours, ColourIndex);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.MappedTo);
+    ;
+    args.push(this.Opacity);
+    ;
+    args.push(this.Colours);
+    ;
+    args.push(this.ColourIndex);
+    ;
+    return args;
+  }
+};
+var IfcIndexedPolyCurve = class {
+  constructor(expressID, type, Points, Segments, SelfIntersect) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Points = Points;
+    this.Segments = Segments;
+    this.SelfIntersect = SelfIntersect;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Points = tape[ptr++];
+    let Segments = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    return new IfcIndexedPolyCurve(expressID, type, Points, Segments, SelfIntersect);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Points);
+    ;
+    args.push(this.Segments);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    return args;
+  }
+};
+var IfcIndexedPolygonalFace = class {
+  constructor(expressID, type, CoordIndex) {
+    this.expressID = expressID;
+    this.type = type;
+    this.CoordIndex = CoordIndex;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let CoordIndex = tape[ptr++];
+    return new IfcIndexedPolygonalFace(expressID, type, CoordIndex);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.CoordIndex);
+    ;
+    return args;
+  }
+};
+var IfcIndexedPolygonalFaceWithVoids = class {
+  constructor(expressID, type, CoordIndex, InnerCoordIndices) {
+    this.expressID = expressID;
+    this.type = type;
+    this.CoordIndex = CoordIndex;
+    this.InnerCoordIndices = InnerCoordIndices;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let CoordIndex = tape[ptr++];
+    let InnerCoordIndices = tape[ptr++];
+    return new IfcIndexedPolygonalFaceWithVoids(expressID, type, CoordIndex, InnerCoordIndices);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.CoordIndex);
+    ;
+    args.push(this.InnerCoordIndices);
+    ;
+    return args;
+  }
+};
+var IfcIndexedTextureMap = class {
+  constructor(expressID, type, Maps, MappedTo, TexCoords) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Maps = Maps;
+    this.MappedTo = MappedTo;
+    this.TexCoords = TexCoords;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Maps = tape[ptr++];
+    let MappedTo = tape[ptr++];
+    let TexCoords = tape[ptr++];
+    return new IfcIndexedTextureMap(expressID, type, Maps, MappedTo, TexCoords);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Maps);
+    ;
+    args.push(this.MappedTo);
+    ;
+    args.push(this.TexCoords);
+    ;
+    return args;
+  }
+};
+var IfcIndexedTriangleTextureMap = class {
+  constructor(expressID, type, Maps, MappedTo, TexCoords, TexCoordIndex) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Maps = Maps;
+    this.MappedTo = MappedTo;
+    this.TexCoords = TexCoords;
+    this.TexCoordIndex = TexCoordIndex;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Maps = tape[ptr++];
+    let MappedTo = tape[ptr++];
+    let TexCoords = tape[ptr++];
+    let TexCoordIndex = tape[ptr++];
+    return new IfcIndexedTriangleTextureMap(expressID, type, Maps, MappedTo, TexCoords, TexCoordIndex);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Maps);
+    ;
+    args.push(this.MappedTo);
+    ;
+    args.push(this.TexCoords);
+    ;
+    args.push(this.TexCoordIndex);
+    ;
+    return args;
+  }
+};
+var IfcInterceptor = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcInterceptor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcInterceptorType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcInterceptorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcIntersectionCurve = class {
+  constructor(expressID, type, Curve3D, AssociatedGeometry, MasterRepresentation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Curve3D = Curve3D;
+    this.AssociatedGeometry = AssociatedGeometry;
+    this.MasterRepresentation = MasterRepresentation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Curve3D = tape[ptr++];
+    let AssociatedGeometry = tape[ptr++];
+    let MasterRepresentation = tape[ptr++];
+    return new IfcIntersectionCurve(expressID, type, Curve3D, AssociatedGeometry, MasterRepresentation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Curve3D);
+    ;
+    args.push(this.AssociatedGeometry);
+    ;
+    args.push(this.MasterRepresentation);
+    ;
+    return args;
+  }
+};
+var IfcInventory = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, Jurisdiction, ResponsiblePersons, LastUpdateDate, CurrentValue, OriginalValue) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.PredefinedType = PredefinedType;
+    this.Jurisdiction = Jurisdiction;
+    this.ResponsiblePersons = ResponsiblePersons;
+    this.LastUpdateDate = LastUpdateDate;
+    this.CurrentValue = CurrentValue;
+    this.OriginalValue = OriginalValue;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let Jurisdiction = tape[ptr++];
+    let ResponsiblePersons = tape[ptr++];
+    let LastUpdateDate = tape[ptr++];
+    let CurrentValue = tape[ptr++];
+    let OriginalValue = tape[ptr++];
+    return new IfcInventory(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, Jurisdiction, ResponsiblePersons, LastUpdateDate, CurrentValue, OriginalValue);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.Jurisdiction);
+    ;
+    args.push(this.ResponsiblePersons);
+    ;
+    args.push(this.LastUpdateDate);
+    ;
+    args.push(this.CurrentValue);
+    ;
+    args.push(this.OriginalValue);
+    ;
+    return args;
+  }
+};
+var IfcIrregularTimeSeries = class {
+  constructor(expressID, type, Name, Description, StartTime, EndTime, TimeSeriesDataType, DataOrigin, UserDefinedDataOrigin, Unit, Values) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.StartTime = StartTime;
+    this.EndTime = EndTime;
+    this.TimeSeriesDataType = TimeSeriesDataType;
+    this.DataOrigin = DataOrigin;
+    this.UserDefinedDataOrigin = UserDefinedDataOrigin;
+    this.Unit = Unit;
+    this.Values = Values;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let StartTime = tape[ptr++];
+    let EndTime = tape[ptr++];
+    let TimeSeriesDataType = tape[ptr++];
+    let DataOrigin = tape[ptr++];
+    let UserDefinedDataOrigin = tape[ptr++];
+    let Unit = tape[ptr++];
+    let Values = tape[ptr++];
+    return new IfcIrregularTimeSeries(expressID, type, Name, Description, StartTime, EndTime, TimeSeriesDataType, DataOrigin, UserDefinedDataOrigin, Unit, Values);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.StartTime);
+    ;
+    args.push(this.EndTime);
+    ;
+    args.push(this.TimeSeriesDataType);
+    ;
+    args.push(this.DataOrigin);
+    ;
+    args.push(this.UserDefinedDataOrigin);
+    ;
+    args.push(this.Unit);
+    ;
+    args.push(this.Values);
+    ;
+    return args;
+  }
+};
+var IfcIrregularTimeSeriesValue = class {
+  constructor(expressID, type, TimeStamp, ListValues) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TimeStamp = TimeStamp;
+    this.ListValues = ListValues;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TimeStamp = tape[ptr++];
+    let ListValues = tape[ptr++];
+    return new IfcIrregularTimeSeriesValue(expressID, type, TimeStamp, ListValues);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TimeStamp);
+    ;
+    args.push(this.ListValues);
+    ;
+    return args;
+  }
+};
+var IfcJunctionBox = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcJunctionBox(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcJunctionBoxType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcJunctionBoxType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcLShapeProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, Depth, Width, Thickness, FilletRadius, EdgeRadius, LegSlope) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.Depth = Depth;
+    this.Width = Width;
+    this.Thickness = Thickness;
+    this.FilletRadius = FilletRadius;
+    this.EdgeRadius = EdgeRadius;
+    this.LegSlope = LegSlope;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let Depth = tape[ptr++];
+    let Width = tape[ptr++];
+    let Thickness = tape[ptr++];
+    let FilletRadius = tape[ptr++];
+    let EdgeRadius = tape[ptr++];
+    let LegSlope = tape[ptr++];
+    return new IfcLShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, Depth, Width, Thickness, FilletRadius, EdgeRadius, LegSlope);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Depth);
+    ;
+    args.push(this.Width);
+    ;
+    args.push(this.Thickness);
+    ;
+    args.push(this.FilletRadius);
+    ;
+    args.push(this.EdgeRadius);
+    ;
+    args.push(this.LegSlope);
+    ;
+    return args;
+  }
+};
+var IfcLaborResource = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.Usage = Usage;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let Usage = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcLaborResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.Usage);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcLaborResourceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.ResourceType = ResourceType;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let ResourceType = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcLaborResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.ResourceType);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcLagTime = class {
+  constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, LagValue, DurationType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.DataOrigin = DataOrigin;
+    this.UserDefinedDataOrigin = UserDefinedDataOrigin;
+    this.LagValue = LagValue;
+    this.DurationType = DurationType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let DataOrigin = tape[ptr++];
+    let UserDefinedDataOrigin = tape[ptr++];
+    let LagValue = tape[ptr++];
+    let DurationType = tape[ptr++];
+    return new IfcLagTime(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, LagValue, DurationType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.DataOrigin);
+    ;
+    args.push(this.UserDefinedDataOrigin);
+    ;
+    args.push(this.LagValue);
+    ;
+    args.push(this.DurationType);
+    ;
+    return args;
+  }
+};
+var IfcLamp = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcLamp(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcLampType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcLampType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcLibraryInformation = class {
+  constructor(expressID, type, Name, Version, Publisher, VersionDate, Location, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Version = Version;
+    this.Publisher = Publisher;
+    this.VersionDate = VersionDate;
+    this.Location = Location;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Version = tape[ptr++];
+    let Publisher = tape[ptr++];
+    let VersionDate = tape[ptr++];
+    let Location = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcLibraryInformation(expressID, type, Name, Version, Publisher, VersionDate, Location, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Version);
+    ;
+    args.push(this.Publisher);
+    ;
+    args.push(this.VersionDate);
+    ;
+    args.push(this.Location);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcLibraryReference = class {
+  constructor(expressID, type, Location, Identification, Name, Description, Language, ReferencedLibrary) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Location = Location;
+    this.Identification = Identification;
+    this.Name = Name;
+    this.Description = Description;
+    this.Language = Language;
+    this.ReferencedLibrary = ReferencedLibrary;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Location = tape[ptr++];
+    let Identification = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Language = tape[ptr++];
+    let ReferencedLibrary = tape[ptr++];
+    return new IfcLibraryReference(expressID, type, Location, Identification, Name, Description, Language, ReferencedLibrary);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Location);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Language);
+    ;
+    args.push(this.ReferencedLibrary);
+    ;
+    return args;
+  }
+};
+var IfcLightDistributionData = class {
+  constructor(expressID, type, MainPlaneAngle, SecondaryPlaneAngle, LuminousIntensity) {
+    this.expressID = expressID;
+    this.type = type;
+    this.MainPlaneAngle = MainPlaneAngle;
+    this.SecondaryPlaneAngle = SecondaryPlaneAngle;
+    this.LuminousIntensity = LuminousIntensity;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let MainPlaneAngle = tape[ptr++];
+    let SecondaryPlaneAngle = tape[ptr++];
+    let LuminousIntensity = tape[ptr++];
+    return new IfcLightDistributionData(expressID, type, MainPlaneAngle, SecondaryPlaneAngle, LuminousIntensity);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.MainPlaneAngle);
+    ;
+    args.push(this.SecondaryPlaneAngle);
+    ;
+    args.push(this.LuminousIntensity);
+    ;
+    return args;
+  }
+};
+var IfcLightFixture = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcLightFixture(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcLightFixtureType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcLightFixtureType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcLightIntensityDistribution = class {
+  constructor(expressID, type, LightDistributionCurve, DistributionData) {
+    this.expressID = expressID;
+    this.type = type;
+    this.LightDistributionCurve = LightDistributionCurve;
+    this.DistributionData = DistributionData;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let LightDistributionCurve = tape[ptr++];
+    let DistributionData = tape[ptr++];
+    return new IfcLightIntensityDistribution(expressID, type, LightDistributionCurve, DistributionData);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.LightDistributionCurve);
+    ;
+    args.push(this.DistributionData);
+    ;
+    return args;
+  }
+};
+var IfcLightSource = class {
+  constructor(expressID, type, Name, LightColour, AmbientIntensity, Intensity) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.LightColour = LightColour;
+    this.AmbientIntensity = AmbientIntensity;
+    this.Intensity = Intensity;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let LightColour = tape[ptr++];
+    let AmbientIntensity = tape[ptr++];
+    let Intensity = tape[ptr++];
+    return new IfcLightSource(expressID, type, Name, LightColour, AmbientIntensity, Intensity);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.LightColour);
+    ;
+    args.push(this.AmbientIntensity);
+    ;
+    args.push(this.Intensity);
+    ;
+    return args;
+  }
+};
+var IfcLightSourceAmbient = class {
+  constructor(expressID, type, Name, LightColour, AmbientIntensity, Intensity) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.LightColour = LightColour;
+    this.AmbientIntensity = AmbientIntensity;
+    this.Intensity = Intensity;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let LightColour = tape[ptr++];
+    let AmbientIntensity = tape[ptr++];
+    let Intensity = tape[ptr++];
+    return new IfcLightSourceAmbient(expressID, type, Name, LightColour, AmbientIntensity, Intensity);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.LightColour);
+    ;
+    args.push(this.AmbientIntensity);
+    ;
+    args.push(this.Intensity);
+    ;
+    return args;
+  }
+};
+var IfcLightSourceDirectional = class {
+  constructor(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Orientation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.LightColour = LightColour;
+    this.AmbientIntensity = AmbientIntensity;
+    this.Intensity = Intensity;
+    this.Orientation = Orientation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let LightColour = tape[ptr++];
+    let AmbientIntensity = tape[ptr++];
+    let Intensity = tape[ptr++];
+    let Orientation = tape[ptr++];
+    return new IfcLightSourceDirectional(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Orientation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.LightColour);
+    ;
+    args.push(this.AmbientIntensity);
+    ;
+    args.push(this.Intensity);
+    ;
+    args.push(this.Orientation);
+    ;
+    return args;
+  }
+};
+var IfcLightSourceGoniometric = class {
+  constructor(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Position, ColourAppearance, ColourTemperature, LuminousFlux, LightEmissionSource, LightDistributionDataSource) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.LightColour = LightColour;
+    this.AmbientIntensity = AmbientIntensity;
+    this.Intensity = Intensity;
+    this.Position = Position;
+    this.ColourAppearance = ColourAppearance;
+    this.ColourTemperature = ColourTemperature;
+    this.LuminousFlux = LuminousFlux;
+    this.LightEmissionSource = LightEmissionSource;
+    this.LightDistributionDataSource = LightDistributionDataSource;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let LightColour = tape[ptr++];
+    let AmbientIntensity = tape[ptr++];
+    let Intensity = tape[ptr++];
+    let Position = tape[ptr++];
+    let ColourAppearance = tape[ptr++];
+    let ColourTemperature = tape[ptr++];
+    let LuminousFlux = tape[ptr++];
+    let LightEmissionSource = tape[ptr++];
+    let LightDistributionDataSource = tape[ptr++];
+    return new IfcLightSourceGoniometric(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Position, ColourAppearance, ColourTemperature, LuminousFlux, LightEmissionSource, LightDistributionDataSource);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.LightColour);
+    ;
+    args.push(this.AmbientIntensity);
+    ;
+    args.push(this.Intensity);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.ColourAppearance);
+    ;
+    args.push(this.ColourTemperature);
+    ;
+    args.push(this.LuminousFlux);
+    ;
+    args.push(this.LightEmissionSource);
+    ;
+    args.push(this.LightDistributionDataSource);
+    ;
+    return args;
+  }
+};
+var IfcLightSourcePositional = class {
+  constructor(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Position, Radius, ConstantAttenuation, DistanceAttenuation, QuadricAttenuation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.LightColour = LightColour;
+    this.AmbientIntensity = AmbientIntensity;
+    this.Intensity = Intensity;
+    this.Position = Position;
+    this.Radius = Radius;
+    this.ConstantAttenuation = ConstantAttenuation;
+    this.DistanceAttenuation = DistanceAttenuation;
+    this.QuadricAttenuation = QuadricAttenuation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let LightColour = tape[ptr++];
+    let AmbientIntensity = tape[ptr++];
+    let Intensity = tape[ptr++];
+    let Position = tape[ptr++];
+    let Radius = tape[ptr++];
+    let ConstantAttenuation = tape[ptr++];
+    let DistanceAttenuation = tape[ptr++];
+    let QuadricAttenuation = tape[ptr++];
+    return new IfcLightSourcePositional(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Position, Radius, ConstantAttenuation, DistanceAttenuation, QuadricAttenuation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.LightColour);
+    ;
+    args.push(this.AmbientIntensity);
+    ;
+    args.push(this.Intensity);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Radius);
+    ;
+    args.push(this.ConstantAttenuation);
+    ;
+    args.push(this.DistanceAttenuation);
+    ;
+    args.push(this.QuadricAttenuation);
+    ;
+    return args;
+  }
+};
+var IfcLightSourceSpot = class {
+  constructor(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Position, Radius, ConstantAttenuation, DistanceAttenuation, QuadricAttenuation, Orientation, ConcentrationExponent, SpreadAngle, BeamWidthAngle) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.LightColour = LightColour;
+    this.AmbientIntensity = AmbientIntensity;
+    this.Intensity = Intensity;
+    this.Position = Position;
+    this.Radius = Radius;
+    this.ConstantAttenuation = ConstantAttenuation;
+    this.DistanceAttenuation = DistanceAttenuation;
+    this.QuadricAttenuation = QuadricAttenuation;
+    this.Orientation = Orientation;
+    this.ConcentrationExponent = ConcentrationExponent;
+    this.SpreadAngle = SpreadAngle;
+    this.BeamWidthAngle = BeamWidthAngle;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let LightColour = tape[ptr++];
+    let AmbientIntensity = tape[ptr++];
+    let Intensity = tape[ptr++];
+    let Position = tape[ptr++];
+    let Radius = tape[ptr++];
+    let ConstantAttenuation = tape[ptr++];
+    let DistanceAttenuation = tape[ptr++];
+    let QuadricAttenuation = tape[ptr++];
+    let Orientation = tape[ptr++];
+    let ConcentrationExponent = tape[ptr++];
+    let SpreadAngle = tape[ptr++];
+    let BeamWidthAngle = tape[ptr++];
+    return new IfcLightSourceSpot(expressID, type, Name, LightColour, AmbientIntensity, Intensity, Position, Radius, ConstantAttenuation, DistanceAttenuation, QuadricAttenuation, Orientation, ConcentrationExponent, SpreadAngle, BeamWidthAngle);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.LightColour);
+    ;
+    args.push(this.AmbientIntensity);
+    ;
+    args.push(this.Intensity);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Radius);
+    ;
+    args.push(this.ConstantAttenuation);
+    ;
+    args.push(this.DistanceAttenuation);
+    ;
+    args.push(this.QuadricAttenuation);
+    ;
+    args.push(this.Orientation);
+    ;
+    args.push(this.ConcentrationExponent);
+    ;
+    args.push(this.SpreadAngle);
+    ;
+    args.push(this.BeamWidthAngle);
+    ;
+    return args;
+  }
+};
+var IfcLine = class {
+  constructor(expressID, type, Pnt, Dir) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Pnt = Pnt;
+    this.Dir = Dir;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Pnt = tape[ptr++];
+    let Dir = tape[ptr++];
+    return new IfcLine(expressID, type, Pnt, Dir);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Pnt);
+    ;
+    args.push(this.Dir);
+    ;
+    return args;
+  }
+};
+var IfcLineSegment2D = class {
+  constructor(expressID, type, StartPoint, StartDirection, SegmentLength) {
+    this.expressID = expressID;
+    this.type = type;
+    this.StartPoint = StartPoint;
+    this.StartDirection = StartDirection;
+    this.SegmentLength = SegmentLength;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let StartPoint = tape[ptr++];
+    let StartDirection = tape[ptr++];
+    let SegmentLength = tape[ptr++];
+    return new IfcLineSegment2D(expressID, type, StartPoint, StartDirection, SegmentLength);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.StartPoint);
+    ;
+    args.push(this.StartDirection);
+    ;
+    args.push(this.SegmentLength);
+    ;
+    return args;
+  }
+};
+var IfcLinearPlacement = class {
+  constructor(expressID, type, PlacementRelTo, PlacementMeasuredAlong, Distance, Orientation, CartesianPosition) {
+    this.expressID = expressID;
+    this.type = type;
+    this.PlacementRelTo = PlacementRelTo;
+    this.PlacementMeasuredAlong = PlacementMeasuredAlong;
+    this.Distance = Distance;
+    this.Orientation = Orientation;
+    this.CartesianPosition = CartesianPosition;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let PlacementRelTo = tape[ptr++];
+    let PlacementMeasuredAlong = tape[ptr++];
+    let Distance = tape[ptr++];
+    let Orientation = tape[ptr++];
+    let CartesianPosition = tape[ptr++];
+    return new IfcLinearPlacement(expressID, type, PlacementRelTo, PlacementMeasuredAlong, Distance, Orientation, CartesianPosition);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.PlacementRelTo);
+    ;
+    args.push(this.PlacementMeasuredAlong);
+    ;
+    args.push(this.Distance);
+    ;
+    args.push(this.Orientation);
+    ;
+    args.push(this.CartesianPosition);
+    ;
+    return args;
+  }
+};
+var IfcLinearPositioningElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Axis) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Axis = Axis;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Axis = tape[ptr++];
+    return new IfcLinearPositioningElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Axis);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Axis);
+    ;
+    return args;
+  }
+};
+var IfcLocalPlacement = class {
+  constructor(expressID, type, PlacementRelTo, RelativePlacement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.PlacementRelTo = PlacementRelTo;
+    this.RelativePlacement = RelativePlacement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let PlacementRelTo = tape[ptr++];
+    let RelativePlacement = tape[ptr++];
+    return new IfcLocalPlacement(expressID, type, PlacementRelTo, RelativePlacement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.PlacementRelTo);
+    ;
+    args.push(this.RelativePlacement);
+    ;
+    return args;
+  }
+};
+var IfcLoop = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcLoop(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcManifoldSolidBrep = class {
+  constructor(expressID, type, Outer) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Outer = Outer;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Outer = tape[ptr++];
+    return new IfcManifoldSolidBrep(expressID, type, Outer);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Outer);
+    ;
+    return args;
+  }
+};
+var IfcMapConversion = class {
+  constructor(expressID, type, SourceCRS, TargetCRS, Eastings, Northings, OrthogonalHeight, XAxisAbscissa, XAxisOrdinate, Scale) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SourceCRS = SourceCRS;
+    this.TargetCRS = TargetCRS;
+    this.Eastings = Eastings;
+    this.Northings = Northings;
+    this.OrthogonalHeight = OrthogonalHeight;
+    this.XAxisAbscissa = XAxisAbscissa;
+    this.XAxisOrdinate = XAxisOrdinate;
+    this.Scale = Scale;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SourceCRS = tape[ptr++];
+    let TargetCRS = tape[ptr++];
+    let Eastings = tape[ptr++];
+    let Northings = tape[ptr++];
+    let OrthogonalHeight = tape[ptr++];
+    let XAxisAbscissa = tape[ptr++];
+    let XAxisOrdinate = tape[ptr++];
+    let Scale = tape[ptr++];
+    return new IfcMapConversion(expressID, type, SourceCRS, TargetCRS, Eastings, Northings, OrthogonalHeight, XAxisAbscissa, XAxisOrdinate, Scale);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SourceCRS);
+    ;
+    args.push(this.TargetCRS);
+    ;
+    args.push(this.Eastings);
+    ;
+    args.push(this.Northings);
+    ;
+    args.push(this.OrthogonalHeight);
+    ;
+    args.push(this.XAxisAbscissa);
+    ;
+    args.push(this.XAxisOrdinate);
+    ;
+    args.push(this.Scale);
+    ;
+    return args;
+  }
+};
+var IfcMappedItem = class {
+  constructor(expressID, type, MappingSource, MappingTarget) {
+    this.expressID = expressID;
+    this.type = type;
+    this.MappingSource = MappingSource;
+    this.MappingTarget = MappingTarget;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let MappingSource = tape[ptr++];
+    let MappingTarget = tape[ptr++];
+    return new IfcMappedItem(expressID, type, MappingSource, MappingTarget);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.MappingSource);
+    ;
+    args.push(this.MappingTarget);
+    ;
+    return args;
+  }
+};
+var IfcMaterial = class {
+  constructor(expressID, type, Name, Description, Category) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Category = Category;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Category = tape[ptr++];
+    return new IfcMaterial(expressID, type, Name, Description, Category);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Category);
+    ;
+    return args;
+  }
+};
+var IfcMaterialClassificationRelationship = class {
+  constructor(expressID, type, MaterialClassifications, ClassifiedMaterial) {
+    this.expressID = expressID;
+    this.type = type;
+    this.MaterialClassifications = MaterialClassifications;
+    this.ClassifiedMaterial = ClassifiedMaterial;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let MaterialClassifications = tape[ptr++];
+    let ClassifiedMaterial = tape[ptr++];
+    return new IfcMaterialClassificationRelationship(expressID, type, MaterialClassifications, ClassifiedMaterial);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.MaterialClassifications);
+    ;
+    args.push(this.ClassifiedMaterial);
+    ;
+    return args;
+  }
+};
+var IfcMaterialConstituent = class {
+  constructor(expressID, type, Name, Description, Material, Fraction, Category) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Material = Material;
+    this.Fraction = Fraction;
+    this.Category = Category;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Material = tape[ptr++];
+    let Fraction = tape[ptr++];
+    let Category = tape[ptr++];
+    return new IfcMaterialConstituent(expressID, type, Name, Description, Material, Fraction, Category);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Material);
+    ;
+    args.push(this.Fraction);
+    ;
+    args.push(this.Category);
+    ;
+    return args;
+  }
+};
+var IfcMaterialConstituentSet = class {
+  constructor(expressID, type, Name, Description, MaterialConstituents) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.MaterialConstituents = MaterialConstituents;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let MaterialConstituents = tape[ptr++];
+    return new IfcMaterialConstituentSet(expressID, type, Name, Description, MaterialConstituents);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.MaterialConstituents);
+    ;
+    return args;
+  }
+};
+var IfcMaterialDefinition = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcMaterialDefinition(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcMaterialDefinitionRepresentation = class {
+  constructor(expressID, type, Name, Description, Representations, RepresentedMaterial) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Representations = Representations;
+    this.RepresentedMaterial = RepresentedMaterial;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Representations = tape[ptr++];
+    let RepresentedMaterial = tape[ptr++];
+    return new IfcMaterialDefinitionRepresentation(expressID, type, Name, Description, Representations, RepresentedMaterial);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Representations);
+    ;
+    args.push(this.RepresentedMaterial);
+    ;
+    return args;
+  }
+};
+var IfcMaterialLayer = class {
+  constructor(expressID, type, Material, LayerThickness, IsVentilated, Name, Description, Category, Priority) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Material = Material;
+    this.LayerThickness = LayerThickness;
+    this.IsVentilated = IsVentilated;
+    this.Name = Name;
+    this.Description = Description;
+    this.Category = Category;
+    this.Priority = Priority;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Material = tape[ptr++];
+    let LayerThickness = tape[ptr++];
+    let IsVentilated = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Category = tape[ptr++];
+    let Priority = tape[ptr++];
+    return new IfcMaterialLayer(expressID, type, Material, LayerThickness, IsVentilated, Name, Description, Category, Priority);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Material);
+    ;
+    args.push(this.LayerThickness);
+    ;
+    args.push(this.IsVentilated);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Category);
+    ;
+    args.push(this.Priority);
+    ;
+    return args;
+  }
+};
+var IfcMaterialLayerSet = class {
+  constructor(expressID, type, MaterialLayers, LayerSetName, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.MaterialLayers = MaterialLayers;
+    this.LayerSetName = LayerSetName;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let MaterialLayers = tape[ptr++];
+    let LayerSetName = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcMaterialLayerSet(expressID, type, MaterialLayers, LayerSetName, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.MaterialLayers);
+    ;
+    args.push(this.LayerSetName);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcMaterialLayerSetUsage = class {
+  constructor(expressID, type, ForLayerSet, LayerSetDirection, DirectionSense, OffsetFromReferenceLine, ReferenceExtent) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ForLayerSet = ForLayerSet;
+    this.LayerSetDirection = LayerSetDirection;
+    this.DirectionSense = DirectionSense;
+    this.OffsetFromReferenceLine = OffsetFromReferenceLine;
+    this.ReferenceExtent = ReferenceExtent;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ForLayerSet = tape[ptr++];
+    let LayerSetDirection = tape[ptr++];
+    let DirectionSense = tape[ptr++];
+    let OffsetFromReferenceLine = tape[ptr++];
+    let ReferenceExtent = tape[ptr++];
+    return new IfcMaterialLayerSetUsage(expressID, type, ForLayerSet, LayerSetDirection, DirectionSense, OffsetFromReferenceLine, ReferenceExtent);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ForLayerSet);
+    ;
+    args.push(this.LayerSetDirection);
+    ;
+    args.push(this.DirectionSense);
+    ;
+    args.push(this.OffsetFromReferenceLine);
+    ;
+    args.push(this.ReferenceExtent);
+    ;
+    return args;
+  }
+};
+var IfcMaterialLayerWithOffsets = class {
+  constructor(expressID, type, Material, LayerThickness, IsVentilated, Name, Description, Category, Priority, OffsetDirection, OffsetValues) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Material = Material;
+    this.LayerThickness = LayerThickness;
+    this.IsVentilated = IsVentilated;
+    this.Name = Name;
+    this.Description = Description;
+    this.Category = Category;
+    this.Priority = Priority;
+    this.OffsetDirection = OffsetDirection;
+    this.OffsetValues = OffsetValues;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Material = tape[ptr++];
+    let LayerThickness = tape[ptr++];
+    let IsVentilated = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Category = tape[ptr++];
+    let Priority = tape[ptr++];
+    let OffsetDirection = tape[ptr++];
+    let OffsetValues = tape[ptr++];
+    return new IfcMaterialLayerWithOffsets(expressID, type, Material, LayerThickness, IsVentilated, Name, Description, Category, Priority, OffsetDirection, OffsetValues);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Material);
+    ;
+    args.push(this.LayerThickness);
+    ;
+    args.push(this.IsVentilated);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Category);
+    ;
+    args.push(this.Priority);
+    ;
+    args.push(this.OffsetDirection);
+    ;
+    args.push(this.OffsetValues);
+    ;
+    return args;
+  }
+};
+var IfcMaterialList = class {
+  constructor(expressID, type, Materials) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Materials = Materials;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Materials = tape[ptr++];
+    return new IfcMaterialList(expressID, type, Materials);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Materials);
+    ;
+    return args;
+  }
+};
+var IfcMaterialProfile = class {
+  constructor(expressID, type, Name, Description, Material, Profile, Priority, Category) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Material = Material;
+    this.Profile = Profile;
+    this.Priority = Priority;
+    this.Category = Category;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Material = tape[ptr++];
+    let Profile = tape[ptr++];
+    let Priority = tape[ptr++];
+    let Category = tape[ptr++];
+    return new IfcMaterialProfile(expressID, type, Name, Description, Material, Profile, Priority, Category);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Material);
+    ;
+    args.push(this.Profile);
+    ;
+    args.push(this.Priority);
+    ;
+    args.push(this.Category);
+    ;
+    return args;
+  }
+};
+var IfcMaterialProfileSet = class {
+  constructor(expressID, type, Name, Description, MaterialProfiles, CompositeProfile) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.MaterialProfiles = MaterialProfiles;
+    this.CompositeProfile = CompositeProfile;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let MaterialProfiles = tape[ptr++];
+    let CompositeProfile = tape[ptr++];
+    return new IfcMaterialProfileSet(expressID, type, Name, Description, MaterialProfiles, CompositeProfile);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.MaterialProfiles);
+    ;
+    args.push(this.CompositeProfile);
+    ;
+    return args;
+  }
+};
+var IfcMaterialProfileSetUsage = class {
+  constructor(expressID, type, ForProfileSet, CardinalPoint, ReferenceExtent) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ForProfileSet = ForProfileSet;
+    this.CardinalPoint = CardinalPoint;
+    this.ReferenceExtent = ReferenceExtent;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ForProfileSet = tape[ptr++];
+    let CardinalPoint = tape[ptr++];
+    let ReferenceExtent = tape[ptr++];
+    return new IfcMaterialProfileSetUsage(expressID, type, ForProfileSet, CardinalPoint, ReferenceExtent);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ForProfileSet);
+    ;
+    args.push(this.CardinalPoint);
+    ;
+    args.push(this.ReferenceExtent);
+    ;
+    return args;
+  }
+};
+var IfcMaterialProfileSetUsageTapering = class {
+  constructor(expressID, type, ForProfileSet, CardinalPoint, ReferenceExtent, ForProfileEndSet, CardinalEndPoint) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ForProfileSet = ForProfileSet;
+    this.CardinalPoint = CardinalPoint;
+    this.ReferenceExtent = ReferenceExtent;
+    this.ForProfileEndSet = ForProfileEndSet;
+    this.CardinalEndPoint = CardinalEndPoint;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ForProfileSet = tape[ptr++];
+    let CardinalPoint = tape[ptr++];
+    let ReferenceExtent = tape[ptr++];
+    let ForProfileEndSet = tape[ptr++];
+    let CardinalEndPoint = tape[ptr++];
+    return new IfcMaterialProfileSetUsageTapering(expressID, type, ForProfileSet, CardinalPoint, ReferenceExtent, ForProfileEndSet, CardinalEndPoint);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ForProfileSet);
+    ;
+    args.push(this.CardinalPoint);
+    ;
+    args.push(this.ReferenceExtent);
+    ;
+    args.push(this.ForProfileEndSet);
+    ;
+    args.push(this.CardinalEndPoint);
+    ;
+    return args;
+  }
+};
+var IfcMaterialProfileWithOffsets = class {
+  constructor(expressID, type, Name, Description, Material, Profile, Priority, Category, OffsetValues) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Material = Material;
+    this.Profile = Profile;
+    this.Priority = Priority;
+    this.Category = Category;
+    this.OffsetValues = OffsetValues;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Material = tape[ptr++];
+    let Profile = tape[ptr++];
+    let Priority = tape[ptr++];
+    let Category = tape[ptr++];
+    let OffsetValues = tape[ptr++];
+    return new IfcMaterialProfileWithOffsets(expressID, type, Name, Description, Material, Profile, Priority, Category, OffsetValues);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Material);
+    ;
+    args.push(this.Profile);
+    ;
+    args.push(this.Priority);
+    ;
+    args.push(this.Category);
+    ;
+    args.push(this.OffsetValues);
+    ;
+    return args;
+  }
+};
+var IfcMaterialProperties = class {
+  constructor(expressID, type, Name, Description, Properties, Material) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Properties = Properties;
+    this.Material = Material;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Properties = tape[ptr++];
+    let Material = tape[ptr++];
+    return new IfcMaterialProperties(expressID, type, Name, Description, Properties, Material);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Properties);
+    ;
+    args.push(this.Material);
+    ;
+    return args;
+  }
+};
+var IfcMaterialRelationship = class {
+  constructor(expressID, type, Name, Description, RelatingMaterial, RelatedMaterials, Expression) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingMaterial = RelatingMaterial;
+    this.RelatedMaterials = RelatedMaterials;
+    this.Expression = Expression;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingMaterial = tape[ptr++];
+    let RelatedMaterials = tape[ptr++];
+    let Expression = tape[ptr++];
+    return new IfcMaterialRelationship(expressID, type, Name, Description, RelatingMaterial, RelatedMaterials, Expression);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingMaterial);
+    ;
+    args.push(this.RelatedMaterials);
+    ;
+    args.push(this.Expression);
+    ;
+    return args;
+  }
+};
+var IfcMaterialUsageDefinition = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcMaterialUsageDefinition(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcMeasureWithUnit = class {
+  constructor(expressID, type, ValueComponent, UnitComponent) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ValueComponent = ValueComponent;
+    this.UnitComponent = UnitComponent;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ValueComponent = tape[ptr++];
+    let UnitComponent = tape[ptr++];
+    return new IfcMeasureWithUnit(expressID, type, ValueComponent, UnitComponent);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ValueComponent);
+    ;
+    args.push(this.UnitComponent);
+    ;
+    return args;
+  }
+};
+var IfcMechanicalFastener = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, NominalDiameter, NominalLength, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.NominalDiameter = NominalDiameter;
+    this.NominalLength = NominalLength;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let NominalDiameter = tape[ptr++];
+    let NominalLength = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcMechanicalFastener(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, NominalDiameter, NominalLength, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.NominalDiameter);
+    ;
+    args.push(this.NominalLength);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcMechanicalFastenerType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, NominalDiameter, NominalLength) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+    this.NominalDiameter = NominalDiameter;
+    this.NominalLength = NominalLength;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let NominalDiameter = tape[ptr++];
+    let NominalLength = tape[ptr++];
+    return new IfcMechanicalFastenerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, NominalDiameter, NominalLength);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.NominalDiameter);
+    ;
+    args.push(this.NominalLength);
+    ;
+    return args;
+  }
+};
+var IfcMedicalDevice = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcMedicalDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcMedicalDeviceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcMedicalDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcMember = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcMember(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcMemberStandardCase = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcMemberStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcMemberType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcMemberType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcMetric = class {
+  constructor(expressID, type, Name, Description, ConstraintGrade, ConstraintSource, CreatingActor, CreationTime, UserDefinedGrade, Benchmark, ValueSource, DataValue, ReferencePath) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.ConstraintGrade = ConstraintGrade;
+    this.ConstraintSource = ConstraintSource;
+    this.CreatingActor = CreatingActor;
+    this.CreationTime = CreationTime;
+    this.UserDefinedGrade = UserDefinedGrade;
+    this.Benchmark = Benchmark;
+    this.ValueSource = ValueSource;
+    this.DataValue = DataValue;
+    this.ReferencePath = ReferencePath;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ConstraintGrade = tape[ptr++];
+    let ConstraintSource = tape[ptr++];
+    let CreatingActor = tape[ptr++];
+    let CreationTime = tape[ptr++];
+    let UserDefinedGrade = tape[ptr++];
+    let Benchmark = tape[ptr++];
+    let ValueSource = tape[ptr++];
+    let DataValue = tape[ptr++];
+    let ReferencePath = tape[ptr++];
+    return new IfcMetric(expressID, type, Name, Description, ConstraintGrade, ConstraintSource, CreatingActor, CreationTime, UserDefinedGrade, Benchmark, ValueSource, DataValue, ReferencePath);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ConstraintGrade);
+    ;
+    args.push(this.ConstraintSource);
+    ;
+    args.push(this.CreatingActor);
+    ;
+    args.push(this.CreationTime);
+    ;
+    args.push(this.UserDefinedGrade);
+    ;
+    args.push(this.Benchmark);
+    ;
+    args.push(this.ValueSource);
+    ;
+    args.push(this.DataValue);
+    ;
+    args.push(this.ReferencePath);
+    ;
+    return args;
+  }
+};
+var IfcMirroredProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, ParentProfile, Operator, Label) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.ParentProfile = ParentProfile;
+    this.Operator = Operator;
+    this.Label = Label;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let ParentProfile = tape[ptr++];
+    let Operator = tape[ptr++];
+    let Label = tape[ptr++];
+    return new IfcMirroredProfileDef(expressID, type, ProfileType, ProfileName, ParentProfile, Operator, Label);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.ParentProfile);
+    ;
+    args.push(this.Operator);
+    ;
+    args.push(this.Label);
+    ;
+    return args;
+  }
+};
+var IfcMonetaryUnit = class {
+  constructor(expressID, type, Currency) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Currency = Currency;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Currency = tape[ptr++];
+    return new IfcMonetaryUnit(expressID, type, Currency);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Currency);
+    ;
+    return args;
+  }
+};
+var IfcMotorConnection = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcMotorConnection(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcMotorConnectionType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcMotorConnectionType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcNamedUnit = class {
+  constructor(expressID, type, Dimensions, UnitType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Dimensions = Dimensions;
+    this.UnitType = UnitType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Dimensions = tape[ptr++];
+    let UnitType = tape[ptr++];
+    return new IfcNamedUnit(expressID, type, Dimensions, UnitType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Dimensions);
+    ;
+    args.push(this.UnitType);
+    ;
+    return args;
+  }
+};
+var IfcObject = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    return new IfcObject(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    return args;
+  }
+};
+var IfcObjectDefinition = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcObjectDefinition(expressID, type, GlobalId, OwnerHistory, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcObjectPlacement = class {
+  constructor(expressID, type, PlacementRelTo) {
+    this.expressID = expressID;
+    this.type = type;
+    this.PlacementRelTo = PlacementRelTo;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let PlacementRelTo = tape[ptr++];
+    return new IfcObjectPlacement(expressID, type, PlacementRelTo);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.PlacementRelTo);
+    ;
+    return args;
+  }
+};
+var IfcObjective = class {
+  constructor(expressID, type, Name, Description, ConstraintGrade, ConstraintSource, CreatingActor, CreationTime, UserDefinedGrade, BenchmarkValues, LogicalAggregator, ObjectiveQualifier, UserDefinedQualifier) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.ConstraintGrade = ConstraintGrade;
+    this.ConstraintSource = ConstraintSource;
+    this.CreatingActor = CreatingActor;
+    this.CreationTime = CreationTime;
+    this.UserDefinedGrade = UserDefinedGrade;
+    this.BenchmarkValues = BenchmarkValues;
+    this.LogicalAggregator = LogicalAggregator;
+    this.ObjectiveQualifier = ObjectiveQualifier;
+    this.UserDefinedQualifier = UserDefinedQualifier;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ConstraintGrade = tape[ptr++];
+    let ConstraintSource = tape[ptr++];
+    let CreatingActor = tape[ptr++];
+    let CreationTime = tape[ptr++];
+    let UserDefinedGrade = tape[ptr++];
+    let BenchmarkValues = tape[ptr++];
+    let LogicalAggregator = tape[ptr++];
+    let ObjectiveQualifier = tape[ptr++];
+    let UserDefinedQualifier = tape[ptr++];
+    return new IfcObjective(expressID, type, Name, Description, ConstraintGrade, ConstraintSource, CreatingActor, CreationTime, UserDefinedGrade, BenchmarkValues, LogicalAggregator, ObjectiveQualifier, UserDefinedQualifier);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ConstraintGrade);
+    ;
+    args.push(this.ConstraintSource);
+    ;
+    args.push(this.CreatingActor);
+    ;
+    args.push(this.CreationTime);
+    ;
+    args.push(this.UserDefinedGrade);
+    ;
+    args.push(this.BenchmarkValues);
+    ;
+    args.push(this.LogicalAggregator);
+    ;
+    args.push(this.ObjectiveQualifier);
+    ;
+    args.push(this.UserDefinedQualifier);
+    ;
+    return args;
+  }
+};
+var IfcOccupant = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, TheActor, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.TheActor = TheActor;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let TheActor = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcOccupant(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, TheActor, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.TheActor);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcOffsetCurve = class {
+  constructor(expressID, type, BasisCurve) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BasisCurve = BasisCurve;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BasisCurve = tape[ptr++];
+    return new IfcOffsetCurve(expressID, type, BasisCurve);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BasisCurve);
+    ;
+    return args;
+  }
+};
+var IfcOffsetCurve2D = class {
+  constructor(expressID, type, BasisCurve, Distance, SelfIntersect) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BasisCurve = BasisCurve;
+    this.Distance = Distance;
+    this.SelfIntersect = SelfIntersect;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BasisCurve = tape[ptr++];
+    let Distance = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    return new IfcOffsetCurve2D(expressID, type, BasisCurve, Distance, SelfIntersect);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BasisCurve);
+    ;
+    args.push(this.Distance);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    return args;
+  }
+};
+var IfcOffsetCurve3D = class {
+  constructor(expressID, type, BasisCurve, Distance, SelfIntersect, RefDirection) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BasisCurve = BasisCurve;
+    this.Distance = Distance;
+    this.SelfIntersect = SelfIntersect;
+    this.RefDirection = RefDirection;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BasisCurve = tape[ptr++];
+    let Distance = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    let RefDirection = tape[ptr++];
+    return new IfcOffsetCurve3D(expressID, type, BasisCurve, Distance, SelfIntersect, RefDirection);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BasisCurve);
+    ;
+    args.push(this.Distance);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    args.push(this.RefDirection);
+    ;
+    return args;
+  }
+};
+var IfcOffsetCurveByDistances = class {
+  constructor(expressID, type, BasisCurve, OffsetValues, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BasisCurve = BasisCurve;
+    this.OffsetValues = OffsetValues;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BasisCurve = tape[ptr++];
+    let OffsetValues = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcOffsetCurveByDistances(expressID, type, BasisCurve, OffsetValues, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BasisCurve);
+    ;
+    args.push(this.OffsetValues);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcOpenShell = class {
+  constructor(expressID, type, CfsFaces) {
+    this.expressID = expressID;
+    this.type = type;
+    this.CfsFaces = CfsFaces;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let CfsFaces = tape[ptr++];
+    return new IfcOpenShell(expressID, type, CfsFaces);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.CfsFaces);
+    ;
+    return args;
+  }
+};
+var IfcOpeningElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcOpeningElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcOpeningStandardCase = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcOpeningStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcOrganization = class {
+  constructor(expressID, type, Identification, Name, Description, Roles, Addresses) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Identification = Identification;
+    this.Name = Name;
+    this.Description = Description;
+    this.Roles = Roles;
+    this.Addresses = Addresses;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Identification = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Roles = tape[ptr++];
+    let Addresses = tape[ptr++];
+    return new IfcOrganization(expressID, type, Identification, Name, Description, Roles, Addresses);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Identification);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Roles);
+    ;
+    args.push(this.Addresses);
+    ;
+    return args;
+  }
+};
+var IfcOrganizationRelationship = class {
+  constructor(expressID, type, Name, Description, RelatingOrganization, RelatedOrganizations) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingOrganization = RelatingOrganization;
+    this.RelatedOrganizations = RelatedOrganizations;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingOrganization = tape[ptr++];
+    let RelatedOrganizations = tape[ptr++];
+    return new IfcOrganizationRelationship(expressID, type, Name, Description, RelatingOrganization, RelatedOrganizations);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingOrganization);
+    ;
+    args.push(this.RelatedOrganizations);
+    ;
+    return args;
+  }
+};
+var IfcOrientationExpression = class {
+  constructor(expressID, type, LateralAxisDirection, VerticalAxisDirection) {
+    this.expressID = expressID;
+    this.type = type;
+    this.LateralAxisDirection = LateralAxisDirection;
+    this.VerticalAxisDirection = VerticalAxisDirection;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let LateralAxisDirection = tape[ptr++];
+    let VerticalAxisDirection = tape[ptr++];
+    return new IfcOrientationExpression(expressID, type, LateralAxisDirection, VerticalAxisDirection);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.LateralAxisDirection);
+    ;
+    args.push(this.VerticalAxisDirection);
+    ;
+    return args;
+  }
+};
+var IfcOrientedEdge = class {
+  constructor(expressID, type, EdgeStart, EdgeEnd, EdgeElement, Orientation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.EdgeStart = EdgeStart;
+    this.EdgeEnd = EdgeEnd;
+    this.EdgeElement = EdgeElement;
+    this.Orientation = Orientation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let EdgeStart = tape[ptr++];
+    let EdgeEnd = tape[ptr++];
+    let EdgeElement = tape[ptr++];
+    let Orientation = tape[ptr++];
+    return new IfcOrientedEdge(expressID, type, EdgeStart, EdgeEnd, EdgeElement, Orientation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.EdgeStart);
+    ;
+    args.push(this.EdgeEnd);
+    ;
+    args.push(this.EdgeElement);
+    ;
+    args.push(this.Orientation);
+    ;
+    return args;
+  }
+};
+var IfcOuterBoundaryCurve = class {
+  constructor(expressID, type, Segments, SelfIntersect) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Segments = Segments;
+    this.SelfIntersect = SelfIntersect;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Segments = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    return new IfcOuterBoundaryCurve(expressID, type, Segments, SelfIntersect);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Segments);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    return args;
+  }
+};
+var IfcOutlet = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcOutlet(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcOutletType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcOutletType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcOwnerHistory = class {
+  constructor(expressID, type, OwningUser, OwningApplication, State, ChangeAction, LastModifiedDate, LastModifyingUser, LastModifyingApplication, CreationDate) {
+    this.expressID = expressID;
+    this.type = type;
+    this.OwningUser = OwningUser;
+    this.OwningApplication = OwningApplication;
+    this.State = State;
+    this.ChangeAction = ChangeAction;
+    this.LastModifiedDate = LastModifiedDate;
+    this.LastModifyingUser = LastModifyingUser;
+    this.LastModifyingApplication = LastModifyingApplication;
+    this.CreationDate = CreationDate;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let OwningUser = tape[ptr++];
+    let OwningApplication = tape[ptr++];
+    let State = tape[ptr++];
+    let ChangeAction = tape[ptr++];
+    let LastModifiedDate = tape[ptr++];
+    let LastModifyingUser = tape[ptr++];
+    let LastModifyingApplication = tape[ptr++];
+    let CreationDate = tape[ptr++];
+    return new IfcOwnerHistory(expressID, type, OwningUser, OwningApplication, State, ChangeAction, LastModifiedDate, LastModifyingUser, LastModifyingApplication, CreationDate);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.OwningUser);
+    ;
+    args.push(this.OwningApplication);
+    ;
+    args.push(this.State);
+    ;
+    args.push(this.ChangeAction);
+    ;
+    args.push(this.LastModifiedDate);
+    ;
+    args.push(this.LastModifyingUser);
+    ;
+    args.push(this.LastModifyingApplication);
+    ;
+    args.push(this.CreationDate);
+    ;
+    return args;
+  }
+};
+var IfcParameterizedProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    return new IfcParameterizedProfileDef(expressID, type, ProfileType, ProfileName, Position);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    return args;
+  }
+};
+var IfcPath = class {
+  constructor(expressID, type, EdgeList) {
+    this.expressID = expressID;
+    this.type = type;
+    this.EdgeList = EdgeList;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let EdgeList = tape[ptr++];
+    return new IfcPath(expressID, type, EdgeList);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.EdgeList);
+    ;
+    return args;
+  }
+};
+var IfcPcurve = class {
+  constructor(expressID, type, BasisSurface, ReferenceCurve) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BasisSurface = BasisSurface;
+    this.ReferenceCurve = ReferenceCurve;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BasisSurface = tape[ptr++];
+    let ReferenceCurve = tape[ptr++];
+    return new IfcPcurve(expressID, type, BasisSurface, ReferenceCurve);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BasisSurface);
+    ;
+    args.push(this.ReferenceCurve);
+    ;
+    return args;
+  }
+};
+var IfcPerformanceHistory = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LifeCyclePhase, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LifeCyclePhase = LifeCyclePhase;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LifeCyclePhase = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcPerformanceHistory(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LifeCyclePhase, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LifeCyclePhase);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcPermeableCoveringProperties = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, OperationType, PanelPosition, FrameDepth, FrameThickness, ShapeAspectStyle) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.OperationType = OperationType;
+    this.PanelPosition = PanelPosition;
+    this.FrameDepth = FrameDepth;
+    this.FrameThickness = FrameThickness;
+    this.ShapeAspectStyle = ShapeAspectStyle;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let OperationType = tape[ptr++];
+    let PanelPosition = tape[ptr++];
+    let FrameDepth = tape[ptr++];
+    let FrameThickness = tape[ptr++];
+    let ShapeAspectStyle = tape[ptr++];
+    return new IfcPermeableCoveringProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, OperationType, PanelPosition, FrameDepth, FrameThickness, ShapeAspectStyle);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.OperationType);
+    ;
+    args.push(this.PanelPosition);
+    ;
+    args.push(this.FrameDepth);
+    ;
+    args.push(this.FrameThickness);
+    ;
+    args.push(this.ShapeAspectStyle);
+    ;
+    return args;
+  }
+};
+var IfcPermit = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, LongDescription) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.PredefinedType = PredefinedType;
+    this.Status = Status;
+    this.LongDescription = LongDescription;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let Status = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    return new IfcPermit(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, LongDescription);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.Status);
+    ;
+    args.push(this.LongDescription);
+    ;
+    return args;
+  }
+};
+var IfcPerson = class {
+  constructor(expressID, type, Identification, FamilyName, GivenName, MiddleNames, PrefixTitles, SuffixTitles, Roles, Addresses) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Identification = Identification;
+    this.FamilyName = FamilyName;
+    this.GivenName = GivenName;
+    this.MiddleNames = MiddleNames;
+    this.PrefixTitles = PrefixTitles;
+    this.SuffixTitles = SuffixTitles;
+    this.Roles = Roles;
+    this.Addresses = Addresses;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Identification = tape[ptr++];
+    let FamilyName = tape[ptr++];
+    let GivenName = tape[ptr++];
+    let MiddleNames = tape[ptr++];
+    let PrefixTitles = tape[ptr++];
+    let SuffixTitles = tape[ptr++];
+    let Roles = tape[ptr++];
+    let Addresses = tape[ptr++];
+    return new IfcPerson(expressID, type, Identification, FamilyName, GivenName, MiddleNames, PrefixTitles, SuffixTitles, Roles, Addresses);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Identification);
+    ;
+    args.push(this.FamilyName);
+    ;
+    args.push(this.GivenName);
+    ;
+    args.push(this.MiddleNames);
+    ;
+    args.push(this.PrefixTitles);
+    ;
+    args.push(this.SuffixTitles);
+    ;
+    args.push(this.Roles);
+    ;
+    args.push(this.Addresses);
+    ;
+    return args;
+  }
+};
+var IfcPersonAndOrganization = class {
+  constructor(expressID, type, ThePerson, TheOrganization, Roles) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ThePerson = ThePerson;
+    this.TheOrganization = TheOrganization;
+    this.Roles = Roles;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ThePerson = tape[ptr++];
+    let TheOrganization = tape[ptr++];
+    let Roles = tape[ptr++];
+    return new IfcPersonAndOrganization(expressID, type, ThePerson, TheOrganization, Roles);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ThePerson);
+    ;
+    args.push(this.TheOrganization);
+    ;
+    args.push(this.Roles);
+    ;
+    return args;
+  }
+};
+var IfcPhysicalComplexQuantity = class {
+  constructor(expressID, type, Name, Description, HasQuantities, Discrimination, Quality, Usage) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.HasQuantities = HasQuantities;
+    this.Discrimination = Discrimination;
+    this.Quality = Quality;
+    this.Usage = Usage;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let HasQuantities = tape[ptr++];
+    let Discrimination = tape[ptr++];
+    let Quality = tape[ptr++];
+    let Usage = tape[ptr++];
+    return new IfcPhysicalComplexQuantity(expressID, type, Name, Description, HasQuantities, Discrimination, Quality, Usage);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.HasQuantities);
+    ;
+    args.push(this.Discrimination);
+    ;
+    args.push(this.Quality);
+    ;
+    args.push(this.Usage);
+    ;
+    return args;
+  }
+};
+var IfcPhysicalQuantity = class {
+  constructor(expressID, type, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcPhysicalQuantity(expressID, type, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcPhysicalSimpleQuantity = class {
+  constructor(expressID, type, Name, Description, Unit) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Unit = Unit;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Unit = tape[ptr++];
+    return new IfcPhysicalSimpleQuantity(expressID, type, Name, Description, Unit);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Unit);
+    ;
+    return args;
+  }
+};
+var IfcPile = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType, ConstructionType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+    this.ConstructionType = ConstructionType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let ConstructionType = tape[ptr++];
+    return new IfcPile(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType, ConstructionType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.ConstructionType);
+    ;
+    return args;
+  }
+};
+var IfcPileType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcPileType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcPipeFitting = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcPipeFitting(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcPipeFittingType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcPipeFittingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcPipeSegment = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcPipeSegment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcPipeSegmentType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcPipeSegmentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcPixelTexture = class {
+  constructor(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter, Width, Height, ColourComponents, Pixel) {
+    this.expressID = expressID;
+    this.type = type;
+    this.RepeatS = RepeatS;
+    this.RepeatT = RepeatT;
+    this.Mode = Mode;
+    this.TextureTransform = TextureTransform;
+    this.Parameter = Parameter;
+    this.Width = Width;
+    this.Height = Height;
+    this.ColourComponents = ColourComponents;
+    this.Pixel = Pixel;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let RepeatS = tape[ptr++];
+    let RepeatT = tape[ptr++];
+    let Mode = tape[ptr++];
+    let TextureTransform = tape[ptr++];
+    let Parameter = tape[ptr++];
+    let Width = tape[ptr++];
+    let Height = tape[ptr++];
+    let ColourComponents = tape[ptr++];
+    let Pixel = tape[ptr++];
+    return new IfcPixelTexture(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter, Width, Height, ColourComponents, Pixel);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.RepeatS);
+    ;
+    args.push(this.RepeatT);
+    ;
+    args.push(this.Mode);
+    ;
+    args.push(this.TextureTransform);
+    ;
+    args.push(this.Parameter);
+    ;
+    args.push(this.Width);
+    ;
+    args.push(this.Height);
+    ;
+    args.push(this.ColourComponents);
+    ;
+    args.push(this.Pixel);
+    ;
+    return args;
+  }
+};
+var IfcPlacement = class {
+  constructor(expressID, type, Location) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Location = Location;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Location = tape[ptr++];
+    return new IfcPlacement(expressID, type, Location);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Location);
+    ;
+    return args;
+  }
+};
+var IfcPlanarBox = class {
+  constructor(expressID, type, SizeInX, SizeInY, Placement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SizeInX = SizeInX;
+    this.SizeInY = SizeInY;
+    this.Placement = Placement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SizeInX = tape[ptr++];
+    let SizeInY = tape[ptr++];
+    let Placement = tape[ptr++];
+    return new IfcPlanarBox(expressID, type, SizeInX, SizeInY, Placement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SizeInX);
+    ;
+    args.push(this.SizeInY);
+    ;
+    args.push(this.Placement);
+    ;
+    return args;
+  }
+};
+var IfcPlanarExtent = class {
+  constructor(expressID, type, SizeInX, SizeInY) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SizeInX = SizeInX;
+    this.SizeInY = SizeInY;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SizeInX = tape[ptr++];
+    let SizeInY = tape[ptr++];
+    return new IfcPlanarExtent(expressID, type, SizeInX, SizeInY);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SizeInX);
+    ;
+    args.push(this.SizeInY);
+    ;
+    return args;
+  }
+};
+var IfcPlane = class {
+  constructor(expressID, type, Position) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    return new IfcPlane(expressID, type, Position);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    return args;
+  }
+};
+var IfcPlate = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcPlate(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcPlateStandardCase = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcPlateStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcPlateType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcPlateType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcPoint = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcPoint(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcPointOnCurve = class {
+  constructor(expressID, type, BasisCurve, PointParameter) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BasisCurve = BasisCurve;
+    this.PointParameter = PointParameter;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BasisCurve = tape[ptr++];
+    let PointParameter = tape[ptr++];
+    return new IfcPointOnCurve(expressID, type, BasisCurve, PointParameter);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BasisCurve);
+    ;
+    args.push(this.PointParameter);
+    ;
+    return args;
+  }
+};
+var IfcPointOnSurface = class {
+  constructor(expressID, type, BasisSurface, PointParameterU, PointParameterV) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BasisSurface = BasisSurface;
+    this.PointParameterU = PointParameterU;
+    this.PointParameterV = PointParameterV;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BasisSurface = tape[ptr++];
+    let PointParameterU = tape[ptr++];
+    let PointParameterV = tape[ptr++];
+    return new IfcPointOnSurface(expressID, type, BasisSurface, PointParameterU, PointParameterV);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BasisSurface);
+    ;
+    args.push(this.PointParameterU);
+    ;
+    args.push(this.PointParameterV);
+    ;
+    return args;
+  }
+};
+var IfcPolyLoop = class {
+  constructor(expressID, type, Polygon) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Polygon = Polygon;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Polygon = tape[ptr++];
+    return new IfcPolyLoop(expressID, type, Polygon);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Polygon);
+    ;
+    return args;
+  }
+};
+var IfcPolygonalBoundedHalfSpace = class {
+  constructor(expressID, type, BaseSurface, AgreementFlag, Position, PolygonalBoundary) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BaseSurface = BaseSurface;
+    this.AgreementFlag = AgreementFlag;
+    this.Position = Position;
+    this.PolygonalBoundary = PolygonalBoundary;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BaseSurface = tape[ptr++];
+    let AgreementFlag = tape[ptr++];
+    let Position = tape[ptr++];
+    let PolygonalBoundary = tape[ptr++];
+    return new IfcPolygonalBoundedHalfSpace(expressID, type, BaseSurface, AgreementFlag, Position, PolygonalBoundary);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BaseSurface);
+    ;
+    args.push(this.AgreementFlag);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.PolygonalBoundary);
+    ;
+    return args;
+  }
+};
+var IfcPolygonalFaceSet = class {
+  constructor(expressID, type, Coordinates, Closed, Faces, PnIndex) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Coordinates = Coordinates;
+    this.Closed = Closed;
+    this.Faces = Faces;
+    this.PnIndex = PnIndex;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Coordinates = tape[ptr++];
+    let Closed = tape[ptr++];
+    let Faces = tape[ptr++];
+    let PnIndex = tape[ptr++];
+    return new IfcPolygonalFaceSet(expressID, type, Coordinates, Closed, Faces, PnIndex);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Coordinates);
+    ;
+    args.push(this.Closed);
+    ;
+    args.push(this.Faces);
+    ;
+    args.push(this.PnIndex);
+    ;
+    return args;
+  }
+};
+var IfcPolyline = class {
+  constructor(expressID, type, Points) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Points = Points;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Points = tape[ptr++];
+    return new IfcPolyline(expressID, type, Points);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Points);
+    ;
+    return args;
+  }
+};
+var IfcPort = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    return new IfcPort(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    return args;
+  }
+};
+var IfcPositioningElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    return new IfcPositioningElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    return args;
+  }
+};
+var IfcPostalAddress = class {
+  constructor(expressID, type, Purpose, Description, UserDefinedPurpose, InternalLocation, AddressLines, PostalBox, Town, Region, PostalCode, Country) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Purpose = Purpose;
+    this.Description = Description;
+    this.UserDefinedPurpose = UserDefinedPurpose;
+    this.InternalLocation = InternalLocation;
+    this.AddressLines = AddressLines;
+    this.PostalBox = PostalBox;
+    this.Town = Town;
+    this.Region = Region;
+    this.PostalCode = PostalCode;
+    this.Country = Country;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Purpose = tape[ptr++];
+    let Description = tape[ptr++];
+    let UserDefinedPurpose = tape[ptr++];
+    let InternalLocation = tape[ptr++];
+    let AddressLines = tape[ptr++];
+    let PostalBox = tape[ptr++];
+    let Town = tape[ptr++];
+    let Region = tape[ptr++];
+    let PostalCode = tape[ptr++];
+    let Country = tape[ptr++];
+    return new IfcPostalAddress(expressID, type, Purpose, Description, UserDefinedPurpose, InternalLocation, AddressLines, PostalBox, Town, Region, PostalCode, Country);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Purpose);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.UserDefinedPurpose);
+    ;
+    args.push(this.InternalLocation);
+    ;
+    args.push(this.AddressLines);
+    ;
+    args.push(this.PostalBox);
+    ;
+    args.push(this.Town);
+    ;
+    args.push(this.Region);
+    ;
+    args.push(this.PostalCode);
+    ;
+    args.push(this.Country);
+    ;
+    return args;
+  }
+};
+var IfcPreDefinedColour = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcPreDefinedColour(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcPreDefinedCurveFont = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcPreDefinedCurveFont(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcPreDefinedItem = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcPreDefinedItem(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcPreDefinedProperties = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcPreDefinedProperties(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcPreDefinedPropertySet = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcPreDefinedPropertySet(expressID, type, GlobalId, OwnerHistory, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcPreDefinedTextFont = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcPreDefinedTextFont(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcPresentationItem = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcPresentationItem(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcPresentationLayerAssignment = class {
+  constructor(expressID, type, Name, Description, AssignedItems, Identifier) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.AssignedItems = AssignedItems;
+    this.Identifier = Identifier;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let AssignedItems = tape[ptr++];
+    let Identifier = tape[ptr++];
+    return new IfcPresentationLayerAssignment(expressID, type, Name, Description, AssignedItems, Identifier);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.AssignedItems);
+    ;
+    args.push(this.Identifier);
+    ;
+    return args;
+  }
+};
+var IfcPresentationLayerWithStyle = class {
+  constructor(expressID, type, Name, Description, AssignedItems, Identifier, LayerOn, LayerFrozen, LayerBlocked, LayerStyles) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.AssignedItems = AssignedItems;
+    this.Identifier = Identifier;
+    this.LayerOn = LayerOn;
+    this.LayerFrozen = LayerFrozen;
+    this.LayerBlocked = LayerBlocked;
+    this.LayerStyles = LayerStyles;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let AssignedItems = tape[ptr++];
+    let Identifier = tape[ptr++];
+    let LayerOn = tape[ptr++];
+    let LayerFrozen = tape[ptr++];
+    let LayerBlocked = tape[ptr++];
+    let LayerStyles = tape[ptr++];
+    return new IfcPresentationLayerWithStyle(expressID, type, Name, Description, AssignedItems, Identifier, LayerOn, LayerFrozen, LayerBlocked, LayerStyles);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.AssignedItems);
+    ;
+    args.push(this.Identifier);
+    ;
+    args.push(this.LayerOn);
+    ;
+    args.push(this.LayerFrozen);
+    ;
+    args.push(this.LayerBlocked);
+    ;
+    args.push(this.LayerStyles);
+    ;
+    return args;
+  }
+};
+var IfcPresentationStyle = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcPresentationStyle(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcPresentationStyleAssignment = class {
+  constructor(expressID, type, Styles) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Styles = Styles;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Styles = tape[ptr++];
+    return new IfcPresentationStyleAssignment(expressID, type, Styles);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Styles);
+    ;
+    return args;
+  }
+};
+var IfcProcedure = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcProcedure(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcProcedureType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.ProcessType = ProcessType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let ProcessType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcProcedureType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.ProcessType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcProcess = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    return new IfcProcess(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    return args;
+  }
+};
+var IfcProduct = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    return new IfcProduct(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    return args;
+  }
+};
+var IfcProductDefinitionShape = class {
+  constructor(expressID, type, Name, Description, Representations) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Representations = Representations;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Representations = tape[ptr++];
+    return new IfcProductDefinitionShape(expressID, type, Name, Description, Representations);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Representations);
+    ;
+    return args;
+  }
+};
+var IfcProductRepresentation = class {
+  constructor(expressID, type, Name, Description, Representations) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Representations = Representations;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Representations = tape[ptr++];
+    return new IfcProductRepresentation(expressID, type, Name, Description, Representations);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Representations);
+    ;
+    return args;
+  }
+};
+var IfcProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    return new IfcProfileDef(expressID, type, ProfileType, ProfileName);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    return args;
+  }
+};
+var IfcProfileProperties = class {
+  constructor(expressID, type, Name, Description, Properties, ProfileDefinition) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Properties = Properties;
+    this.ProfileDefinition = ProfileDefinition;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Properties = tape[ptr++];
+    let ProfileDefinition = tape[ptr++];
+    return new IfcProfileProperties(expressID, type, Name, Description, Properties, ProfileDefinition);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Properties);
+    ;
+    args.push(this.ProfileDefinition);
+    ;
+    return args;
+  }
+};
+var IfcProject = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, Phase, RepresentationContexts, UnitsInContext) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.LongName = LongName;
+    this.Phase = Phase;
+    this.RepresentationContexts = RepresentationContexts;
+    this.UnitsInContext = UnitsInContext;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let LongName = tape[ptr++];
+    let Phase = tape[ptr++];
+    let RepresentationContexts = tape[ptr++];
+    let UnitsInContext = tape[ptr++];
+    return new IfcProject(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, Phase, RepresentationContexts, UnitsInContext);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.Phase);
+    ;
+    args.push(this.RepresentationContexts);
+    ;
+    args.push(this.UnitsInContext);
+    ;
+    return args;
+  }
+};
+var IfcProjectLibrary = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, Phase, RepresentationContexts, UnitsInContext) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.LongName = LongName;
+    this.Phase = Phase;
+    this.RepresentationContexts = RepresentationContexts;
+    this.UnitsInContext = UnitsInContext;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let LongName = tape[ptr++];
+    let Phase = tape[ptr++];
+    let RepresentationContexts = tape[ptr++];
+    let UnitsInContext = tape[ptr++];
+    return new IfcProjectLibrary(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName, Phase, RepresentationContexts, UnitsInContext);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.Phase);
+    ;
+    args.push(this.RepresentationContexts);
+    ;
+    args.push(this.UnitsInContext);
+    ;
+    return args;
+  }
+};
+var IfcProjectOrder = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, LongDescription) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.PredefinedType = PredefinedType;
+    this.Status = Status;
+    this.LongDescription = LongDescription;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let Status = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    return new IfcProjectOrder(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, PredefinedType, Status, LongDescription);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.Status);
+    ;
+    args.push(this.LongDescription);
+    ;
+    return args;
+  }
+};
+var IfcProjectedCRS = class {
+  constructor(expressID, type, Name, Description, GeodeticDatum, VerticalDatum, MapProjection, MapZone, MapUnit) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.GeodeticDatum = GeodeticDatum;
+    this.VerticalDatum = VerticalDatum;
+    this.MapProjection = MapProjection;
+    this.MapZone = MapZone;
+    this.MapUnit = MapUnit;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let GeodeticDatum = tape[ptr++];
+    let VerticalDatum = tape[ptr++];
+    let MapProjection = tape[ptr++];
+    let MapZone = tape[ptr++];
+    let MapUnit = tape[ptr++];
+    return new IfcProjectedCRS(expressID, type, Name, Description, GeodeticDatum, VerticalDatum, MapProjection, MapZone, MapUnit);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.GeodeticDatum);
+    ;
+    args.push(this.VerticalDatum);
+    ;
+    args.push(this.MapProjection);
+    ;
+    args.push(this.MapZone);
+    ;
+    args.push(this.MapUnit);
+    ;
+    return args;
+  }
+};
+var IfcProjectionElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcProjectionElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcProperty = class {
+  constructor(expressID, type, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcProperty(expressID, type, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcPropertyAbstraction = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcPropertyAbstraction(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcPropertyBoundedValue = class {
+  constructor(expressID, type, Name, Description, UpperBoundValue, LowerBoundValue, Unit, SetPointValue) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.UpperBoundValue = UpperBoundValue;
+    this.LowerBoundValue = LowerBoundValue;
+    this.Unit = Unit;
+    this.SetPointValue = SetPointValue;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let UpperBoundValue = tape[ptr++];
+    let LowerBoundValue = tape[ptr++];
+    let Unit = tape[ptr++];
+    let SetPointValue = tape[ptr++];
+    return new IfcPropertyBoundedValue(expressID, type, Name, Description, UpperBoundValue, LowerBoundValue, Unit, SetPointValue);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.UpperBoundValue);
+    ;
+    args.push(this.LowerBoundValue);
+    ;
+    args.push(this.Unit);
+    ;
+    args.push(this.SetPointValue);
+    ;
+    return args;
+  }
+};
+var IfcPropertyDefinition = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcPropertyDefinition(expressID, type, GlobalId, OwnerHistory, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcPropertyDependencyRelationship = class {
+  constructor(expressID, type, Name, Description, DependingProperty, DependantProperty, Expression) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.DependingProperty = DependingProperty;
+    this.DependantProperty = DependantProperty;
+    this.Expression = Expression;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let DependingProperty = tape[ptr++];
+    let DependantProperty = tape[ptr++];
+    let Expression = tape[ptr++];
+    return new IfcPropertyDependencyRelationship(expressID, type, Name, Description, DependingProperty, DependantProperty, Expression);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.DependingProperty);
+    ;
+    args.push(this.DependantProperty);
+    ;
+    args.push(this.Expression);
+    ;
+    return args;
+  }
+};
+var IfcPropertyEnumeratedValue = class {
+  constructor(expressID, type, Name, Description, EnumerationValues, EnumerationReference) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.EnumerationValues = EnumerationValues;
+    this.EnumerationReference = EnumerationReference;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let EnumerationValues = tape[ptr++];
+    let EnumerationReference = tape[ptr++];
+    return new IfcPropertyEnumeratedValue(expressID, type, Name, Description, EnumerationValues, EnumerationReference);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.EnumerationValues);
+    ;
+    args.push(this.EnumerationReference);
+    ;
+    return args;
+  }
+};
+var IfcPropertyEnumeration = class {
+  constructor(expressID, type, Name, EnumerationValues, Unit) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.EnumerationValues = EnumerationValues;
+    this.Unit = Unit;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let EnumerationValues = tape[ptr++];
+    let Unit = tape[ptr++];
+    return new IfcPropertyEnumeration(expressID, type, Name, EnumerationValues, Unit);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.EnumerationValues);
+    ;
+    args.push(this.Unit);
+    ;
+    return args;
+  }
+};
+var IfcPropertyListValue = class {
+  constructor(expressID, type, Name, Description, ListValues, Unit) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.ListValues = ListValues;
+    this.Unit = Unit;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ListValues = tape[ptr++];
+    let Unit = tape[ptr++];
+    return new IfcPropertyListValue(expressID, type, Name, Description, ListValues, Unit);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ListValues);
+    ;
+    args.push(this.Unit);
+    ;
+    return args;
+  }
+};
+var IfcPropertyReferenceValue = class {
+  constructor(expressID, type, Name, Description, UsageName, PropertyReference) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.UsageName = UsageName;
+    this.PropertyReference = PropertyReference;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let UsageName = tape[ptr++];
+    let PropertyReference = tape[ptr++];
+    return new IfcPropertyReferenceValue(expressID, type, Name, Description, UsageName, PropertyReference);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.UsageName);
+    ;
+    args.push(this.PropertyReference);
+    ;
+    return args;
+  }
+};
+var IfcPropertySet = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, HasProperties) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.HasProperties = HasProperties;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let HasProperties = tape[ptr++];
+    return new IfcPropertySet(expressID, type, GlobalId, OwnerHistory, Name, Description, HasProperties);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.HasProperties);
+    ;
+    return args;
+  }
+};
+var IfcPropertySetDefinition = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcPropertySetDefinition(expressID, type, GlobalId, OwnerHistory, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcPropertySetTemplate = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, TemplateType, ApplicableEntity, HasPropertyTemplates) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.TemplateType = TemplateType;
+    this.ApplicableEntity = ApplicableEntity;
+    this.HasPropertyTemplates = HasPropertyTemplates;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let TemplateType = tape[ptr++];
+    let ApplicableEntity = tape[ptr++];
+    let HasPropertyTemplates = tape[ptr++];
+    return new IfcPropertySetTemplate(expressID, type, GlobalId, OwnerHistory, Name, Description, TemplateType, ApplicableEntity, HasPropertyTemplates);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.TemplateType);
+    ;
+    args.push(this.ApplicableEntity);
+    ;
+    args.push(this.HasPropertyTemplates);
+    ;
+    return args;
+  }
+};
+var IfcPropertySingleValue = class {
+  constructor(expressID, type, Name, Description, NominalValue, Unit) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.NominalValue = NominalValue;
+    this.Unit = Unit;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let NominalValue = tape[ptr++];
+    let Unit = tape[ptr++];
+    return new IfcPropertySingleValue(expressID, type, Name, Description, NominalValue, Unit);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.NominalValue);
+    ;
+    args.push(this.Unit);
+    ;
+    return args;
+  }
+};
+var IfcPropertyTableValue = class {
+  constructor(expressID, type, Name, Description, DefiningValues, DefinedValues, Expression, DefiningUnit, DefinedUnit, CurveInterpolation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.DefiningValues = DefiningValues;
+    this.DefinedValues = DefinedValues;
+    this.Expression = Expression;
+    this.DefiningUnit = DefiningUnit;
+    this.DefinedUnit = DefinedUnit;
+    this.CurveInterpolation = CurveInterpolation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let DefiningValues = tape[ptr++];
+    let DefinedValues = tape[ptr++];
+    let Expression = tape[ptr++];
+    let DefiningUnit = tape[ptr++];
+    let DefinedUnit = tape[ptr++];
+    let CurveInterpolation = tape[ptr++];
+    return new IfcPropertyTableValue(expressID, type, Name, Description, DefiningValues, DefinedValues, Expression, DefiningUnit, DefinedUnit, CurveInterpolation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.DefiningValues);
+    ;
+    args.push(this.DefinedValues);
+    ;
+    args.push(this.Expression);
+    ;
+    args.push(this.DefiningUnit);
+    ;
+    args.push(this.DefinedUnit);
+    ;
+    args.push(this.CurveInterpolation);
+    ;
+    return args;
+  }
+};
+var IfcPropertyTemplate = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcPropertyTemplate(expressID, type, GlobalId, OwnerHistory, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcPropertyTemplateDefinition = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcPropertyTemplateDefinition(expressID, type, GlobalId, OwnerHistory, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcProtectiveDevice = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcProtectiveDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcProtectiveDeviceTrippingUnit = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcProtectiveDeviceTrippingUnit(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcProtectiveDeviceTrippingUnitType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcProtectiveDeviceTrippingUnitType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcProtectiveDeviceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcProtectiveDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcProxy = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, ProxyType, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.ProxyType = ProxyType;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let ProxyType = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcProxy(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, ProxyType, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.ProxyType);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcPump = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcPump(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcPumpType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcPumpType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcQuantityArea = class {
+  constructor(expressID, type, Name, Description, Unit, AreaValue, Formula) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Unit = Unit;
+    this.AreaValue = AreaValue;
+    this.Formula = Formula;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Unit = tape[ptr++];
+    let AreaValue = tape[ptr++];
+    let Formula = tape[ptr++];
+    return new IfcQuantityArea(expressID, type, Name, Description, Unit, AreaValue, Formula);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Unit);
+    ;
+    args.push(this.AreaValue);
+    ;
+    args.push(this.Formula);
+    ;
+    return args;
+  }
+};
+var IfcQuantityCount = class {
+  constructor(expressID, type, Name, Description, Unit, CountValue, Formula) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Unit = Unit;
+    this.CountValue = CountValue;
+    this.Formula = Formula;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Unit = tape[ptr++];
+    let CountValue = tape[ptr++];
+    let Formula = tape[ptr++];
+    return new IfcQuantityCount(expressID, type, Name, Description, Unit, CountValue, Formula);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Unit);
+    ;
+    args.push(this.CountValue);
+    ;
+    args.push(this.Formula);
+    ;
+    return args;
+  }
+};
+var IfcQuantityLength = class {
+  constructor(expressID, type, Name, Description, Unit, LengthValue, Formula) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Unit = Unit;
+    this.LengthValue = LengthValue;
+    this.Formula = Formula;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Unit = tape[ptr++];
+    let LengthValue = tape[ptr++];
+    let Formula = tape[ptr++];
+    return new IfcQuantityLength(expressID, type, Name, Description, Unit, LengthValue, Formula);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Unit);
+    ;
+    args.push(this.LengthValue);
+    ;
+    args.push(this.Formula);
+    ;
+    return args;
+  }
+};
+var IfcQuantitySet = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcQuantitySet(expressID, type, GlobalId, OwnerHistory, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcQuantityTime = class {
+  constructor(expressID, type, Name, Description, Unit, TimeValue, Formula) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Unit = Unit;
+    this.TimeValue = TimeValue;
+    this.Formula = Formula;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Unit = tape[ptr++];
+    let TimeValue = tape[ptr++];
+    let Formula = tape[ptr++];
+    return new IfcQuantityTime(expressID, type, Name, Description, Unit, TimeValue, Formula);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Unit);
+    ;
+    args.push(this.TimeValue);
+    ;
+    args.push(this.Formula);
+    ;
+    return args;
+  }
+};
+var IfcQuantityVolume = class {
+  constructor(expressID, type, Name, Description, Unit, VolumeValue, Formula) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Unit = Unit;
+    this.VolumeValue = VolumeValue;
+    this.Formula = Formula;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Unit = tape[ptr++];
+    let VolumeValue = tape[ptr++];
+    let Formula = tape[ptr++];
+    return new IfcQuantityVolume(expressID, type, Name, Description, Unit, VolumeValue, Formula);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Unit);
+    ;
+    args.push(this.VolumeValue);
+    ;
+    args.push(this.Formula);
+    ;
+    return args;
+  }
+};
+var IfcQuantityWeight = class {
+  constructor(expressID, type, Name, Description, Unit, WeightValue, Formula) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.Unit = Unit;
+    this.WeightValue = WeightValue;
+    this.Formula = Formula;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Unit = tape[ptr++];
+    let WeightValue = tape[ptr++];
+    let Formula = tape[ptr++];
+    return new IfcQuantityWeight(expressID, type, Name, Description, Unit, WeightValue, Formula);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Unit);
+    ;
+    args.push(this.WeightValue);
+    ;
+    args.push(this.Formula);
+    ;
+    return args;
+  }
+};
+var IfcRailing = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcRailing(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcRailingType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcRailingType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcRamp = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcRamp(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcRampFlight = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcRampFlight(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcRampFlightType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcRampFlightType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcRampType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcRampType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcRationalBSplineCurveWithKnots = class {
+  constructor(expressID, type, Degree, ControlPointsList, CurveForm, ClosedCurve, SelfIntersect, KnotMultiplicities, Knots, KnotSpec, WeightsData) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Degree = Degree;
+    this.ControlPointsList = ControlPointsList;
+    this.CurveForm = CurveForm;
+    this.ClosedCurve = ClosedCurve;
+    this.SelfIntersect = SelfIntersect;
+    this.KnotMultiplicities = KnotMultiplicities;
+    this.Knots = Knots;
+    this.KnotSpec = KnotSpec;
+    this.WeightsData = WeightsData;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Degree = tape[ptr++];
+    let ControlPointsList = tape[ptr++];
+    let CurveForm = tape[ptr++];
+    let ClosedCurve = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    let KnotMultiplicities = tape[ptr++];
+    let Knots = tape[ptr++];
+    let KnotSpec = tape[ptr++];
+    let WeightsData = tape[ptr++];
+    return new IfcRationalBSplineCurveWithKnots(expressID, type, Degree, ControlPointsList, CurveForm, ClosedCurve, SelfIntersect, KnotMultiplicities, Knots, KnotSpec, WeightsData);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Degree);
+    ;
+    args.push(this.ControlPointsList);
+    ;
+    args.push(this.CurveForm);
+    ;
+    args.push(this.ClosedCurve);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    args.push(this.KnotMultiplicities);
+    ;
+    args.push(this.Knots);
+    ;
+    args.push(this.KnotSpec);
+    ;
+    args.push(this.WeightsData);
+    ;
+    return args;
+  }
+};
+var IfcRationalBSplineSurfaceWithKnots = class {
+  constructor(expressID, type, UDegree, VDegree, ControlPointsList, SurfaceForm, UClosed, VClosed, SelfIntersect, UMultiplicities, VMultiplicities, UKnots, VKnots, KnotSpec, WeightsData) {
+    this.expressID = expressID;
+    this.type = type;
+    this.UDegree = UDegree;
+    this.VDegree = VDegree;
+    this.ControlPointsList = ControlPointsList;
+    this.SurfaceForm = SurfaceForm;
+    this.UClosed = UClosed;
+    this.VClosed = VClosed;
+    this.SelfIntersect = SelfIntersect;
+    this.UMultiplicities = UMultiplicities;
+    this.VMultiplicities = VMultiplicities;
+    this.UKnots = UKnots;
+    this.VKnots = VKnots;
+    this.KnotSpec = KnotSpec;
+    this.WeightsData = WeightsData;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let UDegree = tape[ptr++];
+    let VDegree = tape[ptr++];
+    let ControlPointsList = tape[ptr++];
+    let SurfaceForm = tape[ptr++];
+    let UClosed = tape[ptr++];
+    let VClosed = tape[ptr++];
+    let SelfIntersect = tape[ptr++];
+    let UMultiplicities = tape[ptr++];
+    let VMultiplicities = tape[ptr++];
+    let UKnots = tape[ptr++];
+    let VKnots = tape[ptr++];
+    let KnotSpec = tape[ptr++];
+    let WeightsData = tape[ptr++];
+    return new IfcRationalBSplineSurfaceWithKnots(expressID, type, UDegree, VDegree, ControlPointsList, SurfaceForm, UClosed, VClosed, SelfIntersect, UMultiplicities, VMultiplicities, UKnots, VKnots, KnotSpec, WeightsData);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.UDegree);
+    ;
+    args.push(this.VDegree);
+    ;
+    args.push(this.ControlPointsList);
+    ;
+    args.push(this.SurfaceForm);
+    ;
+    args.push(this.UClosed);
+    ;
+    args.push(this.VClosed);
+    ;
+    args.push(this.SelfIntersect);
+    ;
+    args.push(this.UMultiplicities);
+    ;
+    args.push(this.VMultiplicities);
+    ;
+    args.push(this.UKnots);
+    ;
+    args.push(this.VKnots);
+    ;
+    args.push(this.KnotSpec);
+    ;
+    args.push(this.WeightsData);
+    ;
+    return args;
+  }
+};
+var IfcRectangleHollowProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, XDim, YDim, WallThickness, InnerFilletRadius, OuterFilletRadius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.XDim = XDim;
+    this.YDim = YDim;
+    this.WallThickness = WallThickness;
+    this.InnerFilletRadius = InnerFilletRadius;
+    this.OuterFilletRadius = OuterFilletRadius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let XDim = tape[ptr++];
+    let YDim = tape[ptr++];
+    let WallThickness = tape[ptr++];
+    let InnerFilletRadius = tape[ptr++];
+    let OuterFilletRadius = tape[ptr++];
+    return new IfcRectangleHollowProfileDef(expressID, type, ProfileType, ProfileName, Position, XDim, YDim, WallThickness, InnerFilletRadius, OuterFilletRadius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.XDim);
+    ;
+    args.push(this.YDim);
+    ;
+    args.push(this.WallThickness);
+    ;
+    args.push(this.InnerFilletRadius);
+    ;
+    args.push(this.OuterFilletRadius);
+    ;
+    return args;
+  }
+};
+var IfcRectangleProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, XDim, YDim) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.XDim = XDim;
+    this.YDim = YDim;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let XDim = tape[ptr++];
+    let YDim = tape[ptr++];
+    return new IfcRectangleProfileDef(expressID, type, ProfileType, ProfileName, Position, XDim, YDim);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.XDim);
+    ;
+    args.push(this.YDim);
+    ;
+    return args;
+  }
+};
+var IfcRectangularPyramid = class {
+  constructor(expressID, type, Position, XLength, YLength, Height) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+    this.XLength = XLength;
+    this.YLength = YLength;
+    this.Height = Height;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    let XLength = tape[ptr++];
+    let YLength = tape[ptr++];
+    let Height = tape[ptr++];
+    return new IfcRectangularPyramid(expressID, type, Position, XLength, YLength, Height);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    args.push(this.XLength);
+    ;
+    args.push(this.YLength);
+    ;
+    args.push(this.Height);
+    ;
+    return args;
+  }
+};
+var IfcRectangularTrimmedSurface = class {
+  constructor(expressID, type, BasisSurface, U1, V1, U2, V2, Usense, Vsense) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BasisSurface = BasisSurface;
+    this.U1 = U1;
+    this.V1 = V1;
+    this.U2 = U2;
+    this.V2 = V2;
+    this.Usense = Usense;
+    this.Vsense = Vsense;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BasisSurface = tape[ptr++];
+    let U1 = tape[ptr++];
+    let V1 = tape[ptr++];
+    let U2 = tape[ptr++];
+    let V2 = tape[ptr++];
+    let Usense = tape[ptr++];
+    let Vsense = tape[ptr++];
+    return new IfcRectangularTrimmedSurface(expressID, type, BasisSurface, U1, V1, U2, V2, Usense, Vsense);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BasisSurface);
+    ;
+    args.push(this.U1);
+    ;
+    args.push(this.V1);
+    ;
+    args.push(this.U2);
+    ;
+    args.push(this.V2);
+    ;
+    args.push(this.Usense);
+    ;
+    args.push(this.Vsense);
+    ;
+    return args;
+  }
+};
+var IfcRecurrencePattern = class {
+  constructor(expressID, type, RecurrenceType, DayComponent, WeekdayComponent, MonthComponent, Position, Interval, Occurrences, TimePeriods) {
+    this.expressID = expressID;
+    this.type = type;
+    this.RecurrenceType = RecurrenceType;
+    this.DayComponent = DayComponent;
+    this.WeekdayComponent = WeekdayComponent;
+    this.MonthComponent = MonthComponent;
+    this.Position = Position;
+    this.Interval = Interval;
+    this.Occurrences = Occurrences;
+    this.TimePeriods = TimePeriods;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let RecurrenceType = tape[ptr++];
+    let DayComponent = tape[ptr++];
+    let WeekdayComponent = tape[ptr++];
+    let MonthComponent = tape[ptr++];
+    let Position = tape[ptr++];
+    let Interval = tape[ptr++];
+    let Occurrences = tape[ptr++];
+    let TimePeriods = tape[ptr++];
+    return new IfcRecurrencePattern(expressID, type, RecurrenceType, DayComponent, WeekdayComponent, MonthComponent, Position, Interval, Occurrences, TimePeriods);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.RecurrenceType);
+    ;
+    args.push(this.DayComponent);
+    ;
+    args.push(this.WeekdayComponent);
+    ;
+    args.push(this.MonthComponent);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Interval);
+    ;
+    args.push(this.Occurrences);
+    ;
+    args.push(this.TimePeriods);
+    ;
+    return args;
+  }
+};
+var IfcReference = class {
+  constructor(expressID, type, TypeIdentifier, AttributeIdentifier, InstanceName, ListPositions, InnerReference) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TypeIdentifier = TypeIdentifier;
+    this.AttributeIdentifier = AttributeIdentifier;
+    this.InstanceName = InstanceName;
+    this.ListPositions = ListPositions;
+    this.InnerReference = InnerReference;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TypeIdentifier = tape[ptr++];
+    let AttributeIdentifier = tape[ptr++];
+    let InstanceName = tape[ptr++];
+    let ListPositions = tape[ptr++];
+    let InnerReference = tape[ptr++];
+    return new IfcReference(expressID, type, TypeIdentifier, AttributeIdentifier, InstanceName, ListPositions, InnerReference);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TypeIdentifier);
+    ;
+    args.push(this.AttributeIdentifier);
+    ;
+    args.push(this.InstanceName);
+    ;
+    args.push(this.ListPositions);
+    ;
+    args.push(this.InnerReference);
+    ;
+    return args;
+  }
+};
+var IfcReferent = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, RestartDistance) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.PredefinedType = PredefinedType;
+    this.RestartDistance = RestartDistance;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let RestartDistance = tape[ptr++];
+    return new IfcReferent(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, RestartDistance);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.RestartDistance);
+    ;
+    return args;
+  }
+};
+var IfcRegularTimeSeries = class {
+  constructor(expressID, type, Name, Description, StartTime, EndTime, TimeSeriesDataType, DataOrigin, UserDefinedDataOrigin, Unit, TimeStep, Values) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.StartTime = StartTime;
+    this.EndTime = EndTime;
+    this.TimeSeriesDataType = TimeSeriesDataType;
+    this.DataOrigin = DataOrigin;
+    this.UserDefinedDataOrigin = UserDefinedDataOrigin;
+    this.Unit = Unit;
+    this.TimeStep = TimeStep;
+    this.Values = Values;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let StartTime = tape[ptr++];
+    let EndTime = tape[ptr++];
+    let TimeSeriesDataType = tape[ptr++];
+    let DataOrigin = tape[ptr++];
+    let UserDefinedDataOrigin = tape[ptr++];
+    let Unit = tape[ptr++];
+    let TimeStep = tape[ptr++];
+    let Values = tape[ptr++];
+    return new IfcRegularTimeSeries(expressID, type, Name, Description, StartTime, EndTime, TimeSeriesDataType, DataOrigin, UserDefinedDataOrigin, Unit, TimeStep, Values);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.StartTime);
+    ;
+    args.push(this.EndTime);
+    ;
+    args.push(this.TimeSeriesDataType);
+    ;
+    args.push(this.DataOrigin);
+    ;
+    args.push(this.UserDefinedDataOrigin);
+    ;
+    args.push(this.Unit);
+    ;
+    args.push(this.TimeStep);
+    ;
+    args.push(this.Values);
+    ;
+    return args;
+  }
+};
+var IfcReinforcementBarProperties = class {
+  constructor(expressID, type, TotalCrossSectionArea, SteelGrade, BarSurface, EffectiveDepth, NominalBarDiameter, BarCount) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TotalCrossSectionArea = TotalCrossSectionArea;
+    this.SteelGrade = SteelGrade;
+    this.BarSurface = BarSurface;
+    this.EffectiveDepth = EffectiveDepth;
+    this.NominalBarDiameter = NominalBarDiameter;
+    this.BarCount = BarCount;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TotalCrossSectionArea = tape[ptr++];
+    let SteelGrade = tape[ptr++];
+    let BarSurface = tape[ptr++];
+    let EffectiveDepth = tape[ptr++];
+    let NominalBarDiameter = tape[ptr++];
+    let BarCount = tape[ptr++];
+    return new IfcReinforcementBarProperties(expressID, type, TotalCrossSectionArea, SteelGrade, BarSurface, EffectiveDepth, NominalBarDiameter, BarCount);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TotalCrossSectionArea);
+    ;
+    args.push(this.SteelGrade);
+    ;
+    args.push(this.BarSurface);
+    ;
+    args.push(this.EffectiveDepth);
+    ;
+    args.push(this.NominalBarDiameter);
+    ;
+    args.push(this.BarCount);
+    ;
+    return args;
+  }
+};
+var IfcReinforcementDefinitionProperties = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, DefinitionType, ReinforcementSectionDefinitions) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.DefinitionType = DefinitionType;
+    this.ReinforcementSectionDefinitions = ReinforcementSectionDefinitions;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let DefinitionType = tape[ptr++];
+    let ReinforcementSectionDefinitions = tape[ptr++];
+    return new IfcReinforcementDefinitionProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, DefinitionType, ReinforcementSectionDefinitions);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.DefinitionType);
+    ;
+    args.push(this.ReinforcementSectionDefinitions);
+    ;
+    return args;
+  }
+};
+var IfcReinforcingBar = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, NominalDiameter, CrossSectionArea, BarLength, PredefinedType, BarSurface) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.SteelGrade = SteelGrade;
+    this.NominalDiameter = NominalDiameter;
+    this.CrossSectionArea = CrossSectionArea;
+    this.BarLength = BarLength;
+    this.PredefinedType = PredefinedType;
+    this.BarSurface = BarSurface;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let SteelGrade = tape[ptr++];
+    let NominalDiameter = tape[ptr++];
+    let CrossSectionArea = tape[ptr++];
+    let BarLength = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let BarSurface = tape[ptr++];
+    return new IfcReinforcingBar(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, NominalDiameter, CrossSectionArea, BarLength, PredefinedType, BarSurface);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.SteelGrade);
+    ;
+    args.push(this.NominalDiameter);
+    ;
+    args.push(this.CrossSectionArea);
+    ;
+    args.push(this.BarLength);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.BarSurface);
+    ;
+    return args;
+  }
+};
+var IfcReinforcingBarType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, NominalDiameter, CrossSectionArea, BarLength, BarSurface, BendingShapeCode, BendingParameters) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+    this.NominalDiameter = NominalDiameter;
+    this.CrossSectionArea = CrossSectionArea;
+    this.BarLength = BarLength;
+    this.BarSurface = BarSurface;
+    this.BendingShapeCode = BendingShapeCode;
+    this.BendingParameters = BendingParameters;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let NominalDiameter = tape[ptr++];
+    let CrossSectionArea = tape[ptr++];
+    let BarLength = tape[ptr++];
+    let BarSurface = tape[ptr++];
+    let BendingShapeCode = tape[ptr++];
+    let BendingParameters = tape[ptr++];
+    return new IfcReinforcingBarType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, NominalDiameter, CrossSectionArea, BarLength, BarSurface, BendingShapeCode, BendingParameters);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.NominalDiameter);
+    ;
+    args.push(this.CrossSectionArea);
+    ;
+    args.push(this.BarLength);
+    ;
+    args.push(this.BarSurface);
+    ;
+    args.push(this.BendingShapeCode);
+    ;
+    args.push(this.BendingParameters);
+    ;
+    return args;
+  }
+};
+var IfcReinforcingElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.SteelGrade = SteelGrade;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let SteelGrade = tape[ptr++];
+    return new IfcReinforcingElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.SteelGrade);
+    ;
+    return args;
+  }
+};
+var IfcReinforcingElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcReinforcingElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcReinforcingMesh = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, MeshLength, MeshWidth, LongitudinalBarNominalDiameter, TransverseBarNominalDiameter, LongitudinalBarCrossSectionArea, TransverseBarCrossSectionArea, LongitudinalBarSpacing, TransverseBarSpacing, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.SteelGrade = SteelGrade;
+    this.MeshLength = MeshLength;
+    this.MeshWidth = MeshWidth;
+    this.LongitudinalBarNominalDiameter = LongitudinalBarNominalDiameter;
+    this.TransverseBarNominalDiameter = TransverseBarNominalDiameter;
+    this.LongitudinalBarCrossSectionArea = LongitudinalBarCrossSectionArea;
+    this.TransverseBarCrossSectionArea = TransverseBarCrossSectionArea;
+    this.LongitudinalBarSpacing = LongitudinalBarSpacing;
+    this.TransverseBarSpacing = TransverseBarSpacing;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let SteelGrade = tape[ptr++];
+    let MeshLength = tape[ptr++];
+    let MeshWidth = tape[ptr++];
+    let LongitudinalBarNominalDiameter = tape[ptr++];
+    let TransverseBarNominalDiameter = tape[ptr++];
+    let LongitudinalBarCrossSectionArea = tape[ptr++];
+    let TransverseBarCrossSectionArea = tape[ptr++];
+    let LongitudinalBarSpacing = tape[ptr++];
+    let TransverseBarSpacing = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcReinforcingMesh(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, MeshLength, MeshWidth, LongitudinalBarNominalDiameter, TransverseBarNominalDiameter, LongitudinalBarCrossSectionArea, TransverseBarCrossSectionArea, LongitudinalBarSpacing, TransverseBarSpacing, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.SteelGrade);
+    ;
+    args.push(this.MeshLength);
+    ;
+    args.push(this.MeshWidth);
+    ;
+    args.push(this.LongitudinalBarNominalDiameter);
+    ;
+    args.push(this.TransverseBarNominalDiameter);
+    ;
+    args.push(this.LongitudinalBarCrossSectionArea);
+    ;
+    args.push(this.TransverseBarCrossSectionArea);
+    ;
+    args.push(this.LongitudinalBarSpacing);
+    ;
+    args.push(this.TransverseBarSpacing);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcReinforcingMeshType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, MeshLength, MeshWidth, LongitudinalBarNominalDiameter, TransverseBarNominalDiameter, LongitudinalBarCrossSectionArea, TransverseBarCrossSectionArea, LongitudinalBarSpacing, TransverseBarSpacing, BendingShapeCode, BendingParameters) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+    this.MeshLength = MeshLength;
+    this.MeshWidth = MeshWidth;
+    this.LongitudinalBarNominalDiameter = LongitudinalBarNominalDiameter;
+    this.TransverseBarNominalDiameter = TransverseBarNominalDiameter;
+    this.LongitudinalBarCrossSectionArea = LongitudinalBarCrossSectionArea;
+    this.TransverseBarCrossSectionArea = TransverseBarCrossSectionArea;
+    this.LongitudinalBarSpacing = LongitudinalBarSpacing;
+    this.TransverseBarSpacing = TransverseBarSpacing;
+    this.BendingShapeCode = BendingShapeCode;
+    this.BendingParameters = BendingParameters;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let MeshLength = tape[ptr++];
+    let MeshWidth = tape[ptr++];
+    let LongitudinalBarNominalDiameter = tape[ptr++];
+    let TransverseBarNominalDiameter = tape[ptr++];
+    let LongitudinalBarCrossSectionArea = tape[ptr++];
+    let TransverseBarCrossSectionArea = tape[ptr++];
+    let LongitudinalBarSpacing = tape[ptr++];
+    let TransverseBarSpacing = tape[ptr++];
+    let BendingShapeCode = tape[ptr++];
+    let BendingParameters = tape[ptr++];
+    return new IfcReinforcingMeshType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, MeshLength, MeshWidth, LongitudinalBarNominalDiameter, TransverseBarNominalDiameter, LongitudinalBarCrossSectionArea, TransverseBarCrossSectionArea, LongitudinalBarSpacing, TransverseBarSpacing, BendingShapeCode, BendingParameters);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.MeshLength);
+    ;
+    args.push(this.MeshWidth);
+    ;
+    args.push(this.LongitudinalBarNominalDiameter);
+    ;
+    args.push(this.TransverseBarNominalDiameter);
+    ;
+    args.push(this.LongitudinalBarCrossSectionArea);
+    ;
+    args.push(this.TransverseBarCrossSectionArea);
+    ;
+    args.push(this.LongitudinalBarSpacing);
+    ;
+    args.push(this.TransverseBarSpacing);
+    ;
+    args.push(this.BendingShapeCode);
+    ;
+    args.push(this.BendingParameters);
+    ;
+    return args;
+  }
+};
+var IfcRelAggregates = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingObject, RelatedObjects) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingObject = RelatingObject;
+    this.RelatedObjects = RelatedObjects;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingObject = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    return new IfcRelAggregates(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingObject, RelatedObjects);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingObject);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    return args;
+  }
+};
+var IfcRelAssigns = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatedObjectsType = RelatedObjectsType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatedObjectsType = tape[ptr++];
+    return new IfcRelAssigns(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatedObjectsType);
+    ;
+    return args;
+  }
+};
+var IfcRelAssignsToActor = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingActor, ActingRole) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatedObjectsType = RelatedObjectsType;
+    this.RelatingActor = RelatingActor;
+    this.ActingRole = ActingRole;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatedObjectsType = tape[ptr++];
+    let RelatingActor = tape[ptr++];
+    let ActingRole = tape[ptr++];
+    return new IfcRelAssignsToActor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingActor, ActingRole);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatedObjectsType);
+    ;
+    args.push(this.RelatingActor);
+    ;
+    args.push(this.ActingRole);
+    ;
+    return args;
+  }
+};
+var IfcRelAssignsToControl = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingControl) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatedObjectsType = RelatedObjectsType;
+    this.RelatingControl = RelatingControl;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatedObjectsType = tape[ptr++];
+    let RelatingControl = tape[ptr++];
+    return new IfcRelAssignsToControl(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingControl);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatedObjectsType);
+    ;
+    args.push(this.RelatingControl);
+    ;
+    return args;
+  }
+};
+var IfcRelAssignsToGroup = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingGroup) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatedObjectsType = RelatedObjectsType;
+    this.RelatingGroup = RelatingGroup;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatedObjectsType = tape[ptr++];
+    let RelatingGroup = tape[ptr++];
+    return new IfcRelAssignsToGroup(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingGroup);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatedObjectsType);
+    ;
+    args.push(this.RelatingGroup);
+    ;
+    return args;
+  }
+};
+var IfcRelAssignsToGroupByFactor = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingGroup, Factor) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatedObjectsType = RelatedObjectsType;
+    this.RelatingGroup = RelatingGroup;
+    this.Factor = Factor;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatedObjectsType = tape[ptr++];
+    let RelatingGroup = tape[ptr++];
+    let Factor = tape[ptr++];
+    return new IfcRelAssignsToGroupByFactor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingGroup, Factor);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatedObjectsType);
+    ;
+    args.push(this.RelatingGroup);
+    ;
+    args.push(this.Factor);
+    ;
+    return args;
+  }
+};
+var IfcRelAssignsToProcess = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingProcess, QuantityInProcess) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatedObjectsType = RelatedObjectsType;
+    this.RelatingProcess = RelatingProcess;
+    this.QuantityInProcess = QuantityInProcess;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatedObjectsType = tape[ptr++];
+    let RelatingProcess = tape[ptr++];
+    let QuantityInProcess = tape[ptr++];
+    return new IfcRelAssignsToProcess(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingProcess, QuantityInProcess);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatedObjectsType);
+    ;
+    args.push(this.RelatingProcess);
+    ;
+    args.push(this.QuantityInProcess);
+    ;
+    return args;
+  }
+};
+var IfcRelAssignsToProduct = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingProduct) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatedObjectsType = RelatedObjectsType;
+    this.RelatingProduct = RelatingProduct;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatedObjectsType = tape[ptr++];
+    let RelatingProduct = tape[ptr++];
+    return new IfcRelAssignsToProduct(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingProduct);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatedObjectsType);
+    ;
+    args.push(this.RelatingProduct);
+    ;
+    return args;
+  }
+};
+var IfcRelAssignsToResource = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingResource) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatedObjectsType = RelatedObjectsType;
+    this.RelatingResource = RelatingResource;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatedObjectsType = tape[ptr++];
+    let RelatingResource = tape[ptr++];
+    return new IfcRelAssignsToResource(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatedObjectsType, RelatingResource);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatedObjectsType);
+    ;
+    args.push(this.RelatingResource);
+    ;
+    return args;
+  }
+};
+var IfcRelAssociates = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    return new IfcRelAssociates(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    return args;
+  }
+};
+var IfcRelAssociatesApproval = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingApproval) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatingApproval = RelatingApproval;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatingApproval = tape[ptr++];
+    return new IfcRelAssociatesApproval(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingApproval);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatingApproval);
+    ;
+    return args;
+  }
+};
+var IfcRelAssociatesClassification = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingClassification) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatingClassification = RelatingClassification;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatingClassification = tape[ptr++];
+    return new IfcRelAssociatesClassification(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingClassification);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatingClassification);
+    ;
+    return args;
+  }
+};
+var IfcRelAssociatesConstraint = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, Intent, RelatingConstraint) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.Intent = Intent;
+    this.RelatingConstraint = RelatingConstraint;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let Intent = tape[ptr++];
+    let RelatingConstraint = tape[ptr++];
+    return new IfcRelAssociatesConstraint(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, Intent, RelatingConstraint);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.Intent);
+    ;
+    args.push(this.RelatingConstraint);
+    ;
+    return args;
+  }
+};
+var IfcRelAssociatesDocument = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingDocument) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatingDocument = RelatingDocument;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatingDocument = tape[ptr++];
+    return new IfcRelAssociatesDocument(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingDocument);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatingDocument);
+    ;
+    return args;
+  }
+};
+var IfcRelAssociatesLibrary = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingLibrary) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatingLibrary = RelatingLibrary;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatingLibrary = tape[ptr++];
+    return new IfcRelAssociatesLibrary(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingLibrary);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatingLibrary);
+    ;
+    return args;
+  }
+};
+var IfcRelAssociatesMaterial = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingMaterial) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatingMaterial = RelatingMaterial;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatingMaterial = tape[ptr++];
+    return new IfcRelAssociatesMaterial(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingMaterial);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatingMaterial);
+    ;
+    return args;
+  }
+};
+var IfcRelConnects = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcRelConnects(expressID, type, GlobalId, OwnerHistory, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcRelConnectsElements = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ConnectionGeometry, RelatingElement, RelatedElement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ConnectionGeometry = ConnectionGeometry;
+    this.RelatingElement = RelatingElement;
+    this.RelatedElement = RelatedElement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ConnectionGeometry = tape[ptr++];
+    let RelatingElement = tape[ptr++];
+    let RelatedElement = tape[ptr++];
+    return new IfcRelConnectsElements(expressID, type, GlobalId, OwnerHistory, Name, Description, ConnectionGeometry, RelatingElement, RelatedElement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ConnectionGeometry);
+    ;
+    args.push(this.RelatingElement);
+    ;
+    args.push(this.RelatedElement);
+    ;
+    return args;
+  }
+};
+var IfcRelConnectsPathElements = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ConnectionGeometry, RelatingElement, RelatedElement, RelatingPriorities, RelatedPriorities, RelatedConnectionType, RelatingConnectionType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ConnectionGeometry = ConnectionGeometry;
+    this.RelatingElement = RelatingElement;
+    this.RelatedElement = RelatedElement;
+    this.RelatingPriorities = RelatingPriorities;
+    this.RelatedPriorities = RelatedPriorities;
+    this.RelatedConnectionType = RelatedConnectionType;
+    this.RelatingConnectionType = RelatingConnectionType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ConnectionGeometry = tape[ptr++];
+    let RelatingElement = tape[ptr++];
+    let RelatedElement = tape[ptr++];
+    let RelatingPriorities = tape[ptr++];
+    let RelatedPriorities = tape[ptr++];
+    let RelatedConnectionType = tape[ptr++];
+    let RelatingConnectionType = tape[ptr++];
+    return new IfcRelConnectsPathElements(expressID, type, GlobalId, OwnerHistory, Name, Description, ConnectionGeometry, RelatingElement, RelatedElement, RelatingPriorities, RelatedPriorities, RelatedConnectionType, RelatingConnectionType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ConnectionGeometry);
+    ;
+    args.push(this.RelatingElement);
+    ;
+    args.push(this.RelatedElement);
+    ;
+    args.push(this.RelatingPriorities);
+    ;
+    args.push(this.RelatedPriorities);
+    ;
+    args.push(this.RelatedConnectionType);
+    ;
+    args.push(this.RelatingConnectionType);
+    ;
+    return args;
+  }
+};
+var IfcRelConnectsPortToElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingPort, RelatedElement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingPort = RelatingPort;
+    this.RelatedElement = RelatedElement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingPort = tape[ptr++];
+    let RelatedElement = tape[ptr++];
+    return new IfcRelConnectsPortToElement(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingPort, RelatedElement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingPort);
+    ;
+    args.push(this.RelatedElement);
+    ;
+    return args;
+  }
+};
+var IfcRelConnectsPorts = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingPort, RelatedPort, RealizingElement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingPort = RelatingPort;
+    this.RelatedPort = RelatedPort;
+    this.RealizingElement = RealizingElement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingPort = tape[ptr++];
+    let RelatedPort = tape[ptr++];
+    let RealizingElement = tape[ptr++];
+    return new IfcRelConnectsPorts(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingPort, RelatedPort, RealizingElement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingPort);
+    ;
+    args.push(this.RelatedPort);
+    ;
+    args.push(this.RealizingElement);
+    ;
+    return args;
+  }
+};
+var IfcRelConnectsStructuralActivity = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingElement, RelatedStructuralActivity) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingElement = RelatingElement;
+    this.RelatedStructuralActivity = RelatedStructuralActivity;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingElement = tape[ptr++];
+    let RelatedStructuralActivity = tape[ptr++];
+    return new IfcRelConnectsStructuralActivity(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingElement, RelatedStructuralActivity);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingElement);
+    ;
+    args.push(this.RelatedStructuralActivity);
+    ;
+    return args;
+  }
+};
+var IfcRelConnectsStructuralMember = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingStructuralMember, RelatedStructuralConnection, AppliedCondition, AdditionalConditions, SupportedLength, ConditionCoordinateSystem) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingStructuralMember = RelatingStructuralMember;
+    this.RelatedStructuralConnection = RelatedStructuralConnection;
+    this.AppliedCondition = AppliedCondition;
+    this.AdditionalConditions = AdditionalConditions;
+    this.SupportedLength = SupportedLength;
+    this.ConditionCoordinateSystem = ConditionCoordinateSystem;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingStructuralMember = tape[ptr++];
+    let RelatedStructuralConnection = tape[ptr++];
+    let AppliedCondition = tape[ptr++];
+    let AdditionalConditions = tape[ptr++];
+    let SupportedLength = tape[ptr++];
+    let ConditionCoordinateSystem = tape[ptr++];
+    return new IfcRelConnectsStructuralMember(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingStructuralMember, RelatedStructuralConnection, AppliedCondition, AdditionalConditions, SupportedLength, ConditionCoordinateSystem);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingStructuralMember);
+    ;
+    args.push(this.RelatedStructuralConnection);
+    ;
+    args.push(this.AppliedCondition);
+    ;
+    args.push(this.AdditionalConditions);
+    ;
+    args.push(this.SupportedLength);
+    ;
+    args.push(this.ConditionCoordinateSystem);
+    ;
+    return args;
+  }
+};
+var IfcRelConnectsWithEccentricity = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingStructuralMember, RelatedStructuralConnection, AppliedCondition, AdditionalConditions, SupportedLength, ConditionCoordinateSystem, ConnectionConstraint) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingStructuralMember = RelatingStructuralMember;
+    this.RelatedStructuralConnection = RelatedStructuralConnection;
+    this.AppliedCondition = AppliedCondition;
+    this.AdditionalConditions = AdditionalConditions;
+    this.SupportedLength = SupportedLength;
+    this.ConditionCoordinateSystem = ConditionCoordinateSystem;
+    this.ConnectionConstraint = ConnectionConstraint;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingStructuralMember = tape[ptr++];
+    let RelatedStructuralConnection = tape[ptr++];
+    let AppliedCondition = tape[ptr++];
+    let AdditionalConditions = tape[ptr++];
+    let SupportedLength = tape[ptr++];
+    let ConditionCoordinateSystem = tape[ptr++];
+    let ConnectionConstraint = tape[ptr++];
+    return new IfcRelConnectsWithEccentricity(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingStructuralMember, RelatedStructuralConnection, AppliedCondition, AdditionalConditions, SupportedLength, ConditionCoordinateSystem, ConnectionConstraint);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingStructuralMember);
+    ;
+    args.push(this.RelatedStructuralConnection);
+    ;
+    args.push(this.AppliedCondition);
+    ;
+    args.push(this.AdditionalConditions);
+    ;
+    args.push(this.SupportedLength);
+    ;
+    args.push(this.ConditionCoordinateSystem);
+    ;
+    args.push(this.ConnectionConstraint);
+    ;
+    return args;
+  }
+};
+var IfcRelConnectsWithRealizingElements = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ConnectionGeometry, RelatingElement, RelatedElement, RealizingElements, ConnectionType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ConnectionGeometry = ConnectionGeometry;
+    this.RelatingElement = RelatingElement;
+    this.RelatedElement = RelatedElement;
+    this.RealizingElements = RealizingElements;
+    this.ConnectionType = ConnectionType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ConnectionGeometry = tape[ptr++];
+    let RelatingElement = tape[ptr++];
+    let RelatedElement = tape[ptr++];
+    let RealizingElements = tape[ptr++];
+    let ConnectionType = tape[ptr++];
+    return new IfcRelConnectsWithRealizingElements(expressID, type, GlobalId, OwnerHistory, Name, Description, ConnectionGeometry, RelatingElement, RelatedElement, RealizingElements, ConnectionType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ConnectionGeometry);
+    ;
+    args.push(this.RelatingElement);
+    ;
+    args.push(this.RelatedElement);
+    ;
+    args.push(this.RealizingElements);
+    ;
+    args.push(this.ConnectionType);
+    ;
+    return args;
+  }
+};
+var IfcRelContainedInSpatialStructure = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedElements, RelatingStructure) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedElements = RelatedElements;
+    this.RelatingStructure = RelatingStructure;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedElements = tape[ptr++];
+    let RelatingStructure = tape[ptr++];
+    return new IfcRelContainedInSpatialStructure(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedElements, RelatingStructure);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedElements);
+    ;
+    args.push(this.RelatingStructure);
+    ;
+    return args;
+  }
+};
+var IfcRelCoversBldgElements = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingBuildingElement, RelatedCoverings) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingBuildingElement = RelatingBuildingElement;
+    this.RelatedCoverings = RelatedCoverings;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingBuildingElement = tape[ptr++];
+    let RelatedCoverings = tape[ptr++];
+    return new IfcRelCoversBldgElements(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingBuildingElement, RelatedCoverings);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingBuildingElement);
+    ;
+    args.push(this.RelatedCoverings);
+    ;
+    return args;
+  }
+};
+var IfcRelCoversSpaces = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedCoverings) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingSpace = RelatingSpace;
+    this.RelatedCoverings = RelatedCoverings;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingSpace = tape[ptr++];
+    let RelatedCoverings = tape[ptr++];
+    return new IfcRelCoversSpaces(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedCoverings);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingSpace);
+    ;
+    args.push(this.RelatedCoverings);
+    ;
+    return args;
+  }
+};
+var IfcRelDeclares = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingContext, RelatedDefinitions) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingContext = RelatingContext;
+    this.RelatedDefinitions = RelatedDefinitions;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingContext = tape[ptr++];
+    let RelatedDefinitions = tape[ptr++];
+    return new IfcRelDeclares(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingContext, RelatedDefinitions);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingContext);
+    ;
+    args.push(this.RelatedDefinitions);
+    ;
+    return args;
+  }
+};
+var IfcRelDecomposes = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcRelDecomposes(expressID, type, GlobalId, OwnerHistory, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcRelDefines = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcRelDefines(expressID, type, GlobalId, OwnerHistory, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcRelDefinesByObject = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingObject) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatingObject = RelatingObject;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatingObject = tape[ptr++];
+    return new IfcRelDefinesByObject(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingObject);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatingObject);
+    ;
+    return args;
+  }
+};
+var IfcRelDefinesByProperties = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingPropertyDefinition) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatingPropertyDefinition = RelatingPropertyDefinition;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatingPropertyDefinition = tape[ptr++];
+    return new IfcRelDefinesByProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingPropertyDefinition);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatingPropertyDefinition);
+    ;
+    return args;
+  }
+};
+var IfcRelDefinesByTemplate = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedPropertySets, RelatingTemplate) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedPropertySets = RelatedPropertySets;
+    this.RelatingTemplate = RelatingTemplate;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedPropertySets = tape[ptr++];
+    let RelatingTemplate = tape[ptr++];
+    return new IfcRelDefinesByTemplate(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedPropertySets, RelatingTemplate);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedPropertySets);
+    ;
+    args.push(this.RelatingTemplate);
+    ;
+    return args;
+  }
+};
+var IfcRelDefinesByType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedObjects = RelatedObjects;
+    this.RelatingType = RelatingType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    let RelatingType = tape[ptr++];
+    return new IfcRelDefinesByType(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    args.push(this.RelatingType);
+    ;
+    return args;
+  }
+};
+var IfcRelFillsElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingOpeningElement, RelatedBuildingElement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingOpeningElement = RelatingOpeningElement;
+    this.RelatedBuildingElement = RelatedBuildingElement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingOpeningElement = tape[ptr++];
+    let RelatedBuildingElement = tape[ptr++];
+    return new IfcRelFillsElement(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingOpeningElement, RelatedBuildingElement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingOpeningElement);
+    ;
+    args.push(this.RelatedBuildingElement);
+    ;
+    return args;
+  }
+};
+var IfcRelFlowControlElements = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedControlElements, RelatingFlowElement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedControlElements = RelatedControlElements;
+    this.RelatingFlowElement = RelatingFlowElement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedControlElements = tape[ptr++];
+    let RelatingFlowElement = tape[ptr++];
+    return new IfcRelFlowControlElements(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedControlElements, RelatingFlowElement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedControlElements);
+    ;
+    args.push(this.RelatingFlowElement);
+    ;
+    return args;
+  }
+};
+var IfcRelInterferesElements = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingElement, RelatedElement, InterferenceGeometry, InterferenceType, ImpliedOrder) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingElement = RelatingElement;
+    this.RelatedElement = RelatedElement;
+    this.InterferenceGeometry = InterferenceGeometry;
+    this.InterferenceType = InterferenceType;
+    this.ImpliedOrder = ImpliedOrder;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingElement = tape[ptr++];
+    let RelatedElement = tape[ptr++];
+    let InterferenceGeometry = tape[ptr++];
+    let InterferenceType = tape[ptr++];
+    let ImpliedOrder = tape[ptr++];
+    return new IfcRelInterferesElements(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingElement, RelatedElement, InterferenceGeometry, InterferenceType, ImpliedOrder);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingElement);
+    ;
+    args.push(this.RelatedElement);
+    ;
+    args.push(this.InterferenceGeometry);
+    ;
+    args.push(this.InterferenceType);
+    ;
+    args.push(this.ImpliedOrder);
+    ;
+    return args;
+  }
+};
+var IfcRelNests = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingObject, RelatedObjects) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingObject = RelatingObject;
+    this.RelatedObjects = RelatedObjects;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingObject = tape[ptr++];
+    let RelatedObjects = tape[ptr++];
+    return new IfcRelNests(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingObject, RelatedObjects);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingObject);
+    ;
+    args.push(this.RelatedObjects);
+    ;
+    return args;
+  }
+};
+var IfcRelPositions = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingPositioningElement, RelatedProducts) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingPositioningElement = RelatingPositioningElement;
+    this.RelatedProducts = RelatedProducts;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingPositioningElement = tape[ptr++];
+    let RelatedProducts = tape[ptr++];
+    return new IfcRelPositions(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingPositioningElement, RelatedProducts);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingPositioningElement);
+    ;
+    args.push(this.RelatedProducts);
+    ;
+    return args;
+  }
+};
+var IfcRelProjectsElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingElement, RelatedFeatureElement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingElement = RelatingElement;
+    this.RelatedFeatureElement = RelatedFeatureElement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingElement = tape[ptr++];
+    let RelatedFeatureElement = tape[ptr++];
+    return new IfcRelProjectsElement(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingElement, RelatedFeatureElement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingElement);
+    ;
+    args.push(this.RelatedFeatureElement);
+    ;
+    return args;
+  }
+};
+var IfcRelReferencedInSpatialStructure = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedElements, RelatingStructure) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedElements = RelatedElements;
+    this.RelatingStructure = RelatingStructure;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedElements = tape[ptr++];
+    let RelatingStructure = tape[ptr++];
+    return new IfcRelReferencedInSpatialStructure(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatedElements, RelatingStructure);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedElements);
+    ;
+    args.push(this.RelatingStructure);
+    ;
+    return args;
+  }
+};
+var IfcRelSequence = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingProcess, RelatedProcess, TimeLag, SequenceType, UserDefinedSequenceType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingProcess = RelatingProcess;
+    this.RelatedProcess = RelatedProcess;
+    this.TimeLag = TimeLag;
+    this.SequenceType = SequenceType;
+    this.UserDefinedSequenceType = UserDefinedSequenceType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingProcess = tape[ptr++];
+    let RelatedProcess = tape[ptr++];
+    let TimeLag = tape[ptr++];
+    let SequenceType = tape[ptr++];
+    let UserDefinedSequenceType = tape[ptr++];
+    return new IfcRelSequence(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingProcess, RelatedProcess, TimeLag, SequenceType, UserDefinedSequenceType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingProcess);
+    ;
+    args.push(this.RelatedProcess);
+    ;
+    args.push(this.TimeLag);
+    ;
+    args.push(this.SequenceType);
+    ;
+    args.push(this.UserDefinedSequenceType);
+    ;
+    return args;
+  }
+};
+var IfcRelServicesBuildings = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSystem, RelatedBuildings) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingSystem = RelatingSystem;
+    this.RelatedBuildings = RelatedBuildings;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingSystem = tape[ptr++];
+    let RelatedBuildings = tape[ptr++];
+    return new IfcRelServicesBuildings(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSystem, RelatedBuildings);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingSystem);
+    ;
+    args.push(this.RelatedBuildings);
+    ;
+    return args;
+  }
+};
+var IfcRelSpaceBoundary = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedBuildingElement, ConnectionGeometry, PhysicalOrVirtualBoundary, InternalOrExternalBoundary) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingSpace = RelatingSpace;
+    this.RelatedBuildingElement = RelatedBuildingElement;
+    this.ConnectionGeometry = ConnectionGeometry;
+    this.PhysicalOrVirtualBoundary = PhysicalOrVirtualBoundary;
+    this.InternalOrExternalBoundary = InternalOrExternalBoundary;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingSpace = tape[ptr++];
+    let RelatedBuildingElement = tape[ptr++];
+    let ConnectionGeometry = tape[ptr++];
+    let PhysicalOrVirtualBoundary = tape[ptr++];
+    let InternalOrExternalBoundary = tape[ptr++];
+    return new IfcRelSpaceBoundary(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedBuildingElement, ConnectionGeometry, PhysicalOrVirtualBoundary, InternalOrExternalBoundary);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingSpace);
+    ;
+    args.push(this.RelatedBuildingElement);
+    ;
+    args.push(this.ConnectionGeometry);
+    ;
+    args.push(this.PhysicalOrVirtualBoundary);
+    ;
+    args.push(this.InternalOrExternalBoundary);
+    ;
+    return args;
+  }
+};
+var IfcRelSpaceBoundary1stLevel = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedBuildingElement, ConnectionGeometry, PhysicalOrVirtualBoundary, InternalOrExternalBoundary, ParentBoundary) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingSpace = RelatingSpace;
+    this.RelatedBuildingElement = RelatedBuildingElement;
+    this.ConnectionGeometry = ConnectionGeometry;
+    this.PhysicalOrVirtualBoundary = PhysicalOrVirtualBoundary;
+    this.InternalOrExternalBoundary = InternalOrExternalBoundary;
+    this.ParentBoundary = ParentBoundary;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingSpace = tape[ptr++];
+    let RelatedBuildingElement = tape[ptr++];
+    let ConnectionGeometry = tape[ptr++];
+    let PhysicalOrVirtualBoundary = tape[ptr++];
+    let InternalOrExternalBoundary = tape[ptr++];
+    let ParentBoundary = tape[ptr++];
+    return new IfcRelSpaceBoundary1stLevel(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedBuildingElement, ConnectionGeometry, PhysicalOrVirtualBoundary, InternalOrExternalBoundary, ParentBoundary);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingSpace);
+    ;
+    args.push(this.RelatedBuildingElement);
+    ;
+    args.push(this.ConnectionGeometry);
+    ;
+    args.push(this.PhysicalOrVirtualBoundary);
+    ;
+    args.push(this.InternalOrExternalBoundary);
+    ;
+    args.push(this.ParentBoundary);
+    ;
+    return args;
+  }
+};
+var IfcRelSpaceBoundary2ndLevel = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedBuildingElement, ConnectionGeometry, PhysicalOrVirtualBoundary, InternalOrExternalBoundary, ParentBoundary, CorrespondingBoundary) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingSpace = RelatingSpace;
+    this.RelatedBuildingElement = RelatedBuildingElement;
+    this.ConnectionGeometry = ConnectionGeometry;
+    this.PhysicalOrVirtualBoundary = PhysicalOrVirtualBoundary;
+    this.InternalOrExternalBoundary = InternalOrExternalBoundary;
+    this.ParentBoundary = ParentBoundary;
+    this.CorrespondingBoundary = CorrespondingBoundary;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingSpace = tape[ptr++];
+    let RelatedBuildingElement = tape[ptr++];
+    let ConnectionGeometry = tape[ptr++];
+    let PhysicalOrVirtualBoundary = tape[ptr++];
+    let InternalOrExternalBoundary = tape[ptr++];
+    let ParentBoundary = tape[ptr++];
+    let CorrespondingBoundary = tape[ptr++];
+    return new IfcRelSpaceBoundary2ndLevel(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingSpace, RelatedBuildingElement, ConnectionGeometry, PhysicalOrVirtualBoundary, InternalOrExternalBoundary, ParentBoundary, CorrespondingBoundary);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingSpace);
+    ;
+    args.push(this.RelatedBuildingElement);
+    ;
+    args.push(this.ConnectionGeometry);
+    ;
+    args.push(this.PhysicalOrVirtualBoundary);
+    ;
+    args.push(this.InternalOrExternalBoundary);
+    ;
+    args.push(this.ParentBoundary);
+    ;
+    args.push(this.CorrespondingBoundary);
+    ;
+    return args;
+  }
+};
+var IfcRelVoidsElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingBuildingElement, RelatedOpeningElement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingBuildingElement = RelatingBuildingElement;
+    this.RelatedOpeningElement = RelatedOpeningElement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingBuildingElement = tape[ptr++];
+    let RelatedOpeningElement = tape[ptr++];
+    return new IfcRelVoidsElement(expressID, type, GlobalId, OwnerHistory, Name, Description, RelatingBuildingElement, RelatedOpeningElement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingBuildingElement);
+    ;
+    args.push(this.RelatedOpeningElement);
+    ;
+    return args;
+  }
+};
+var IfcRelationship = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcRelationship(expressID, type, GlobalId, OwnerHistory, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcReparametrisedCompositeCurveSegment = class {
+  constructor(expressID, type, Transition, SameSense, ParentCurve, ParamLength) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Transition = Transition;
+    this.SameSense = SameSense;
+    this.ParentCurve = ParentCurve;
+    this.ParamLength = ParamLength;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Transition = tape[ptr++];
+    let SameSense = tape[ptr++];
+    let ParentCurve = tape[ptr++];
+    let ParamLength = tape[ptr++];
+    return new IfcReparametrisedCompositeCurveSegment(expressID, type, Transition, SameSense, ParentCurve, ParamLength);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Transition);
+    ;
+    args.push(this.SameSense);
+    ;
+    args.push(this.ParentCurve);
+    ;
+    args.push(this.ParamLength);
+    ;
+    return args;
+  }
+};
+var IfcRepresentation = class {
+  constructor(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ContextOfItems = ContextOfItems;
+    this.RepresentationIdentifier = RepresentationIdentifier;
+    this.RepresentationType = RepresentationType;
+    this.Items = Items;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ContextOfItems = tape[ptr++];
+    let RepresentationIdentifier = tape[ptr++];
+    let RepresentationType = tape[ptr++];
+    let Items = tape[ptr++];
+    return new IfcRepresentation(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ContextOfItems);
+    ;
+    args.push(this.RepresentationIdentifier);
+    ;
+    args.push(this.RepresentationType);
+    ;
+    args.push(this.Items);
+    ;
+    return args;
+  }
+};
+var IfcRepresentationContext = class {
+  constructor(expressID, type, ContextIdentifier, ContextType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ContextIdentifier = ContextIdentifier;
+    this.ContextType = ContextType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ContextIdentifier = tape[ptr++];
+    let ContextType = tape[ptr++];
+    return new IfcRepresentationContext(expressID, type, ContextIdentifier, ContextType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ContextIdentifier);
+    ;
+    args.push(this.ContextType);
+    ;
+    return args;
+  }
+};
+var IfcRepresentationItem = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcRepresentationItem(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcRepresentationMap = class {
+  constructor(expressID, type, MappingOrigin, MappedRepresentation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.MappingOrigin = MappingOrigin;
+    this.MappedRepresentation = MappedRepresentation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let MappingOrigin = tape[ptr++];
+    let MappedRepresentation = tape[ptr++];
+    return new IfcRepresentationMap(expressID, type, MappingOrigin, MappedRepresentation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.MappingOrigin);
+    ;
+    args.push(this.MappedRepresentation);
+    ;
+    return args;
+  }
+};
+var IfcResource = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    return new IfcResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    return args;
+  }
+};
+var IfcResourceApprovalRelationship = class {
+  constructor(expressID, type, Name, Description, RelatedResourceObjects, RelatingApproval) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatedResourceObjects = RelatedResourceObjects;
+    this.RelatingApproval = RelatingApproval;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatedResourceObjects = tape[ptr++];
+    let RelatingApproval = tape[ptr++];
+    return new IfcResourceApprovalRelationship(expressID, type, Name, Description, RelatedResourceObjects, RelatingApproval);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatedResourceObjects);
+    ;
+    args.push(this.RelatingApproval);
+    ;
+    return args;
+  }
+};
+var IfcResourceConstraintRelationship = class {
+  constructor(expressID, type, Name, Description, RelatingConstraint, RelatedResourceObjects) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.RelatingConstraint = RelatingConstraint;
+    this.RelatedResourceObjects = RelatedResourceObjects;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let RelatingConstraint = tape[ptr++];
+    let RelatedResourceObjects = tape[ptr++];
+    return new IfcResourceConstraintRelationship(expressID, type, Name, Description, RelatingConstraint, RelatedResourceObjects);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.RelatingConstraint);
+    ;
+    args.push(this.RelatedResourceObjects);
+    ;
+    return args;
+  }
+};
+var IfcResourceLevelRelationship = class {
+  constructor(expressID, type, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcResourceLevelRelationship(expressID, type, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcResourceTime = class {
+  constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, ScheduleWork, ScheduleUsage, ScheduleStart, ScheduleFinish, ScheduleContour, LevelingDelay, IsOverAllocated, StatusTime, ActualWork, ActualUsage, ActualStart, ActualFinish, RemainingWork, RemainingUsage, Completion) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.DataOrigin = DataOrigin;
+    this.UserDefinedDataOrigin = UserDefinedDataOrigin;
+    this.ScheduleWork = ScheduleWork;
+    this.ScheduleUsage = ScheduleUsage;
+    this.ScheduleStart = ScheduleStart;
+    this.ScheduleFinish = ScheduleFinish;
+    this.ScheduleContour = ScheduleContour;
+    this.LevelingDelay = LevelingDelay;
+    this.IsOverAllocated = IsOverAllocated;
+    this.StatusTime = StatusTime;
+    this.ActualWork = ActualWork;
+    this.ActualUsage = ActualUsage;
+    this.ActualStart = ActualStart;
+    this.ActualFinish = ActualFinish;
+    this.RemainingWork = RemainingWork;
+    this.RemainingUsage = RemainingUsage;
+    this.Completion = Completion;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let DataOrigin = tape[ptr++];
+    let UserDefinedDataOrigin = tape[ptr++];
+    let ScheduleWork = tape[ptr++];
+    let ScheduleUsage = tape[ptr++];
+    let ScheduleStart = tape[ptr++];
+    let ScheduleFinish = tape[ptr++];
+    let ScheduleContour = tape[ptr++];
+    let LevelingDelay = tape[ptr++];
+    let IsOverAllocated = tape[ptr++];
+    let StatusTime = tape[ptr++];
+    let ActualWork = tape[ptr++];
+    let ActualUsage = tape[ptr++];
+    let ActualStart = tape[ptr++];
+    let ActualFinish = tape[ptr++];
+    let RemainingWork = tape[ptr++];
+    let RemainingUsage = tape[ptr++];
+    let Completion = tape[ptr++];
+    return new IfcResourceTime(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, ScheduleWork, ScheduleUsage, ScheduleStart, ScheduleFinish, ScheduleContour, LevelingDelay, IsOverAllocated, StatusTime, ActualWork, ActualUsage, ActualStart, ActualFinish, RemainingWork, RemainingUsage, Completion);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.DataOrigin);
+    ;
+    args.push(this.UserDefinedDataOrigin);
+    ;
+    args.push(this.ScheduleWork);
+    ;
+    args.push(this.ScheduleUsage);
+    ;
+    args.push(this.ScheduleStart);
+    ;
+    args.push(this.ScheduleFinish);
+    ;
+    args.push(this.ScheduleContour);
+    ;
+    args.push(this.LevelingDelay);
+    ;
+    args.push(this.IsOverAllocated);
+    ;
+    args.push(this.StatusTime);
+    ;
+    args.push(this.ActualWork);
+    ;
+    args.push(this.ActualUsage);
+    ;
+    args.push(this.ActualStart);
+    ;
+    args.push(this.ActualFinish);
+    ;
+    args.push(this.RemainingWork);
+    ;
+    args.push(this.RemainingUsage);
+    ;
+    args.push(this.Completion);
+    ;
+    return args;
+  }
+};
+var IfcRevolvedAreaSolid = class {
+  constructor(expressID, type, SweptArea, Position, Axis, Angle) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SweptArea = SweptArea;
+    this.Position = Position;
+    this.Axis = Axis;
+    this.Angle = Angle;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SweptArea = tape[ptr++];
+    let Position = tape[ptr++];
+    let Axis = tape[ptr++];
+    let Angle = tape[ptr++];
+    return new IfcRevolvedAreaSolid(expressID, type, SweptArea, Position, Axis, Angle);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SweptArea);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Axis);
+    ;
+    args.push(this.Angle);
+    ;
+    return args;
+  }
+};
+var IfcRevolvedAreaSolidTapered = class {
+  constructor(expressID, type, SweptArea, Position, Axis, Angle, EndSweptArea) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SweptArea = SweptArea;
+    this.Position = Position;
+    this.Axis = Axis;
+    this.Angle = Angle;
+    this.EndSweptArea = EndSweptArea;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SweptArea = tape[ptr++];
+    let Position = tape[ptr++];
+    let Axis = tape[ptr++];
+    let Angle = tape[ptr++];
+    let EndSweptArea = tape[ptr++];
+    return new IfcRevolvedAreaSolidTapered(expressID, type, SweptArea, Position, Axis, Angle, EndSweptArea);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SweptArea);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Axis);
+    ;
+    args.push(this.Angle);
+    ;
+    args.push(this.EndSweptArea);
+    ;
+    return args;
+  }
+};
+var IfcRightCircularCone = class {
+  constructor(expressID, type, Position, Height, BottomRadius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+    this.Height = Height;
+    this.BottomRadius = BottomRadius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    let Height = tape[ptr++];
+    let BottomRadius = tape[ptr++];
+    return new IfcRightCircularCone(expressID, type, Position, Height, BottomRadius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    args.push(this.Height);
+    ;
+    args.push(this.BottomRadius);
+    ;
+    return args;
+  }
+};
+var IfcRightCircularCylinder = class {
+  constructor(expressID, type, Position, Height, Radius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+    this.Height = Height;
+    this.Radius = Radius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    let Height = tape[ptr++];
+    let Radius = tape[ptr++];
+    return new IfcRightCircularCylinder(expressID, type, Position, Height, Radius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    args.push(this.Height);
+    ;
+    args.push(this.Radius);
+    ;
+    return args;
+  }
+};
+var IfcRoof = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcRoof(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcRoofType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcRoofType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcRoot = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcRoot(expressID, type, GlobalId, OwnerHistory, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcRoundedRectangleProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, XDim, YDim, RoundingRadius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.XDim = XDim;
+    this.YDim = YDim;
+    this.RoundingRadius = RoundingRadius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let XDim = tape[ptr++];
+    let YDim = tape[ptr++];
+    let RoundingRadius = tape[ptr++];
+    return new IfcRoundedRectangleProfileDef(expressID, type, ProfileType, ProfileName, Position, XDim, YDim, RoundingRadius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.XDim);
+    ;
+    args.push(this.YDim);
+    ;
+    args.push(this.RoundingRadius);
+    ;
+    return args;
+  }
+};
+var IfcSIUnit = class {
+  constructor(expressID, type, Dimensions, UnitType, Prefix, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Dimensions = Dimensions;
+    this.UnitType = UnitType;
+    this.Prefix = Prefix;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Dimensions = tape[ptr++];
+    let UnitType = tape[ptr++];
+    let Prefix = tape[ptr++];
+    let Name = tape[ptr++];
+    return new IfcSIUnit(expressID, type, Dimensions, UnitType, Prefix, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Dimensions);
+    ;
+    args.push(this.UnitType);
+    ;
+    args.push(this.Prefix);
+    ;
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcSanitaryTerminal = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSanitaryTerminal(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSanitaryTerminalType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSanitaryTerminalType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSchedulingTime = class {
+  constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.DataOrigin = DataOrigin;
+    this.UserDefinedDataOrigin = UserDefinedDataOrigin;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let DataOrigin = tape[ptr++];
+    let UserDefinedDataOrigin = tape[ptr++];
+    return new IfcSchedulingTime(expressID, type, Name, DataOrigin, UserDefinedDataOrigin);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.DataOrigin);
+    ;
+    args.push(this.UserDefinedDataOrigin);
+    ;
+    return args;
+  }
+};
+var IfcSeamCurve = class {
+  constructor(expressID, type, Curve3D, AssociatedGeometry, MasterRepresentation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Curve3D = Curve3D;
+    this.AssociatedGeometry = AssociatedGeometry;
+    this.MasterRepresentation = MasterRepresentation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Curve3D = tape[ptr++];
+    let AssociatedGeometry = tape[ptr++];
+    let MasterRepresentation = tape[ptr++];
+    return new IfcSeamCurve(expressID, type, Curve3D, AssociatedGeometry, MasterRepresentation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Curve3D);
+    ;
+    args.push(this.AssociatedGeometry);
+    ;
+    args.push(this.MasterRepresentation);
+    ;
+    return args;
+  }
+};
+var IfcSectionProperties = class {
+  constructor(expressID, type, SectionType, StartProfile, EndProfile) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SectionType = SectionType;
+    this.StartProfile = StartProfile;
+    this.EndProfile = EndProfile;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SectionType = tape[ptr++];
+    let StartProfile = tape[ptr++];
+    let EndProfile = tape[ptr++];
+    return new IfcSectionProperties(expressID, type, SectionType, StartProfile, EndProfile);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SectionType);
+    ;
+    args.push(this.StartProfile);
+    ;
+    args.push(this.EndProfile);
+    ;
+    return args;
+  }
+};
+var IfcSectionReinforcementProperties = class {
+  constructor(expressID, type, LongitudinalStartPosition, LongitudinalEndPosition, TransversePosition, ReinforcementRole, SectionDefinition, CrossSectionReinforcementDefinitions) {
+    this.expressID = expressID;
+    this.type = type;
+    this.LongitudinalStartPosition = LongitudinalStartPosition;
+    this.LongitudinalEndPosition = LongitudinalEndPosition;
+    this.TransversePosition = TransversePosition;
+    this.ReinforcementRole = ReinforcementRole;
+    this.SectionDefinition = SectionDefinition;
+    this.CrossSectionReinforcementDefinitions = CrossSectionReinforcementDefinitions;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let LongitudinalStartPosition = tape[ptr++];
+    let LongitudinalEndPosition = tape[ptr++];
+    let TransversePosition = tape[ptr++];
+    let ReinforcementRole = tape[ptr++];
+    let SectionDefinition = tape[ptr++];
+    let CrossSectionReinforcementDefinitions = tape[ptr++];
+    return new IfcSectionReinforcementProperties(expressID, type, LongitudinalStartPosition, LongitudinalEndPosition, TransversePosition, ReinforcementRole, SectionDefinition, CrossSectionReinforcementDefinitions);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.LongitudinalStartPosition);
+    ;
+    args.push(this.LongitudinalEndPosition);
+    ;
+    args.push(this.TransversePosition);
+    ;
+    args.push(this.ReinforcementRole);
+    ;
+    args.push(this.SectionDefinition);
+    ;
+    args.push(this.CrossSectionReinforcementDefinitions);
+    ;
+    return args;
+  }
+};
+var IfcSectionedSolid = class {
+  constructor(expressID, type, Directrix, CrossSections) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Directrix = Directrix;
+    this.CrossSections = CrossSections;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Directrix = tape[ptr++];
+    let CrossSections = tape[ptr++];
+    return new IfcSectionedSolid(expressID, type, Directrix, CrossSections);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Directrix);
+    ;
+    args.push(this.CrossSections);
+    ;
+    return args;
+  }
+};
+var IfcSectionedSolidHorizontal = class {
+  constructor(expressID, type, Directrix, CrossSections, CrossSectionPositions, FixedAxisVertical) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Directrix = Directrix;
+    this.CrossSections = CrossSections;
+    this.CrossSectionPositions = CrossSectionPositions;
+    this.FixedAxisVertical = FixedAxisVertical;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Directrix = tape[ptr++];
+    let CrossSections = tape[ptr++];
+    let CrossSectionPositions = tape[ptr++];
+    let FixedAxisVertical = tape[ptr++];
+    return new IfcSectionedSolidHorizontal(expressID, type, Directrix, CrossSections, CrossSectionPositions, FixedAxisVertical);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Directrix);
+    ;
+    args.push(this.CrossSections);
+    ;
+    args.push(this.CrossSectionPositions);
+    ;
+    args.push(this.FixedAxisVertical);
+    ;
+    return args;
+  }
+};
+var IfcSectionedSpine = class {
+  constructor(expressID, type, SpineCurve, CrossSections, CrossSectionPositions) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SpineCurve = SpineCurve;
+    this.CrossSections = CrossSections;
+    this.CrossSectionPositions = CrossSectionPositions;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SpineCurve = tape[ptr++];
+    let CrossSections = tape[ptr++];
+    let CrossSectionPositions = tape[ptr++];
+    return new IfcSectionedSpine(expressID, type, SpineCurve, CrossSections, CrossSectionPositions);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SpineCurve);
+    ;
+    args.push(this.CrossSections);
+    ;
+    args.push(this.CrossSectionPositions);
+    ;
+    return args;
+  }
+};
+var IfcSensor = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSensor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSensorType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSensorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcShadingDevice = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcShadingDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcShadingDeviceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcShadingDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcShapeAspect = class {
+  constructor(expressID, type, ShapeRepresentations, Name, Description, ProductDefinitional, PartOfProductDefinitionShape) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ShapeRepresentations = ShapeRepresentations;
+    this.Name = Name;
+    this.Description = Description;
+    this.ProductDefinitional = ProductDefinitional;
+    this.PartOfProductDefinitionShape = PartOfProductDefinitionShape;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ShapeRepresentations = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ProductDefinitional = tape[ptr++];
+    let PartOfProductDefinitionShape = tape[ptr++];
+    return new IfcShapeAspect(expressID, type, ShapeRepresentations, Name, Description, ProductDefinitional, PartOfProductDefinitionShape);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ShapeRepresentations);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ProductDefinitional);
+    ;
+    args.push(this.PartOfProductDefinitionShape);
+    ;
+    return args;
+  }
+};
+var IfcShapeModel = class {
+  constructor(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ContextOfItems = ContextOfItems;
+    this.RepresentationIdentifier = RepresentationIdentifier;
+    this.RepresentationType = RepresentationType;
+    this.Items = Items;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ContextOfItems = tape[ptr++];
+    let RepresentationIdentifier = tape[ptr++];
+    let RepresentationType = tape[ptr++];
+    let Items = tape[ptr++];
+    return new IfcShapeModel(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ContextOfItems);
+    ;
+    args.push(this.RepresentationIdentifier);
+    ;
+    args.push(this.RepresentationType);
+    ;
+    args.push(this.Items);
+    ;
+    return args;
+  }
+};
+var IfcShapeRepresentation = class {
+  constructor(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ContextOfItems = ContextOfItems;
+    this.RepresentationIdentifier = RepresentationIdentifier;
+    this.RepresentationType = RepresentationType;
+    this.Items = Items;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ContextOfItems = tape[ptr++];
+    let RepresentationIdentifier = tape[ptr++];
+    let RepresentationType = tape[ptr++];
+    let Items = tape[ptr++];
+    return new IfcShapeRepresentation(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ContextOfItems);
+    ;
+    args.push(this.RepresentationIdentifier);
+    ;
+    args.push(this.RepresentationType);
+    ;
+    args.push(this.Items);
+    ;
+    return args;
+  }
+};
+var IfcShellBasedSurfaceModel = class {
+  constructor(expressID, type, SbsmBoundary) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SbsmBoundary = SbsmBoundary;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SbsmBoundary = tape[ptr++];
+    return new IfcShellBasedSurfaceModel(expressID, type, SbsmBoundary);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SbsmBoundary);
+    ;
+    return args;
+  }
+};
+var IfcSimpleProperty = class {
+  constructor(expressID, type, Name, Description) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    return new IfcSimpleProperty(expressID, type, Name, Description);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    return args;
+  }
+};
+var IfcSimplePropertyTemplate = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, TemplateType, PrimaryMeasureType, SecondaryMeasureType, Enumerators, PrimaryUnit, SecondaryUnit, Expression, AccessState) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.TemplateType = TemplateType;
+    this.PrimaryMeasureType = PrimaryMeasureType;
+    this.SecondaryMeasureType = SecondaryMeasureType;
+    this.Enumerators = Enumerators;
+    this.PrimaryUnit = PrimaryUnit;
+    this.SecondaryUnit = SecondaryUnit;
+    this.Expression = Expression;
+    this.AccessState = AccessState;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let TemplateType = tape[ptr++];
+    let PrimaryMeasureType = tape[ptr++];
+    let SecondaryMeasureType = tape[ptr++];
+    let Enumerators = tape[ptr++];
+    let PrimaryUnit = tape[ptr++];
+    let SecondaryUnit = tape[ptr++];
+    let Expression = tape[ptr++];
+    let AccessState = tape[ptr++];
+    return new IfcSimplePropertyTemplate(expressID, type, GlobalId, OwnerHistory, Name, Description, TemplateType, PrimaryMeasureType, SecondaryMeasureType, Enumerators, PrimaryUnit, SecondaryUnit, Expression, AccessState);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.TemplateType);
+    ;
+    args.push(this.PrimaryMeasureType);
+    ;
+    args.push(this.SecondaryMeasureType);
+    ;
+    args.push(this.Enumerators);
+    ;
+    args.push(this.PrimaryUnit);
+    ;
+    args.push(this.SecondaryUnit);
+    ;
+    args.push(this.Expression);
+    ;
+    args.push(this.AccessState);
+    ;
+    return args;
+  }
+};
+var IfcSite = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, RefLatitude, RefLongitude, RefElevation, LandTitleNumber, SiteAddress) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+    this.CompositionType = CompositionType;
+    this.RefLatitude = RefLatitude;
+    this.RefLongitude = RefLongitude;
+    this.RefElevation = RefElevation;
+    this.LandTitleNumber = LandTitleNumber;
+    this.SiteAddress = SiteAddress;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    let CompositionType = tape[ptr++];
+    let RefLatitude = tape[ptr++];
+    let RefLongitude = tape[ptr++];
+    let RefElevation = tape[ptr++];
+    let LandTitleNumber = tape[ptr++];
+    let SiteAddress = tape[ptr++];
+    return new IfcSite(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, RefLatitude, RefLongitude, RefElevation, LandTitleNumber, SiteAddress);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.CompositionType);
+    ;
+    args.push(this.RefLatitude);
+    ;
+    args.push(this.RefLongitude);
+    ;
+    args.push(this.RefElevation);
+    ;
+    args.push(this.LandTitleNumber);
+    ;
+    args.push(this.SiteAddress);
+    ;
+    return args;
+  }
+};
+var IfcSlab = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSlab(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSlabElementedCase = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSlabElementedCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSlabStandardCase = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSlabStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSlabType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSlabType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSlippageConnectionCondition = class {
+  constructor(expressID, type, Name, SlippageX, SlippageY, SlippageZ) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.SlippageX = SlippageX;
+    this.SlippageY = SlippageY;
+    this.SlippageZ = SlippageZ;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let SlippageX = tape[ptr++];
+    let SlippageY = tape[ptr++];
+    let SlippageZ = tape[ptr++];
+    return new IfcSlippageConnectionCondition(expressID, type, Name, SlippageX, SlippageY, SlippageZ);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.SlippageX);
+    ;
+    args.push(this.SlippageY);
+    ;
+    args.push(this.SlippageZ);
+    ;
+    return args;
+  }
+};
+var IfcSolarDevice = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSolarDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSolarDeviceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSolarDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSolidModel = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcSolidModel(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcSpace = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, PredefinedType, ElevationWithFlooring) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+    this.CompositionType = CompositionType;
+    this.PredefinedType = PredefinedType;
+    this.ElevationWithFlooring = ElevationWithFlooring;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    let CompositionType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let ElevationWithFlooring = tape[ptr++];
+    return new IfcSpace(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType, PredefinedType, ElevationWithFlooring);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.CompositionType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.ElevationWithFlooring);
+    ;
+    return args;
+  }
+};
+var IfcSpaceHeater = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSpaceHeater(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSpaceHeaterType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSpaceHeaterType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSpaceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, LongName) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+    this.LongName = LongName;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let LongName = tape[ptr++];
+    return new IfcSpaceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, LongName);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.LongName);
+    ;
+    return args;
+  }
+};
+var IfcSpatialElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    return new IfcSpatialElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    return args;
+  }
+};
+var IfcSpatialElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcSpatialElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcSpatialStructureElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+    this.CompositionType = CompositionType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    let CompositionType = tape[ptr++];
+    return new IfcSpatialStructureElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, CompositionType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.CompositionType);
+    ;
+    return args;
+  }
+};
+var IfcSpatialStructureElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    return new IfcSpatialStructureElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    return args;
+  }
+};
+var IfcSpatialZone = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.LongName = LongName;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let LongName = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSpatialZone(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, LongName, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.LongName);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSpatialZoneType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, LongName) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+    this.LongName = LongName;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let LongName = tape[ptr++];
+    return new IfcSpatialZoneType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, LongName);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.LongName);
+    ;
+    return args;
+  }
+};
+var IfcSphere = class {
+  constructor(expressID, type, Position, Radius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+    this.Radius = Radius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    let Radius = tape[ptr++];
+    return new IfcSphere(expressID, type, Position, Radius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    args.push(this.Radius);
+    ;
+    return args;
+  }
+};
+var IfcSphericalSurface = class {
+  constructor(expressID, type, Position, Radius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+    this.Radius = Radius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    let Radius = tape[ptr++];
+    return new IfcSphericalSurface(expressID, type, Position, Radius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    args.push(this.Radius);
+    ;
+    return args;
+  }
+};
+var IfcStackTerminal = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcStackTerminal(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcStackTerminalType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcStackTerminalType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcStair = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcStair(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcStairFlight = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, NumberOfRisers, NumberOfTreads, RiserHeight, TreadLength, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.NumberOfRisers = NumberOfRisers;
+    this.NumberOfTreads = NumberOfTreads;
+    this.RiserHeight = RiserHeight;
+    this.TreadLength = TreadLength;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let NumberOfRisers = tape[ptr++];
+    let NumberOfTreads = tape[ptr++];
+    let RiserHeight = tape[ptr++];
+    let TreadLength = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcStairFlight(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, NumberOfRisers, NumberOfTreads, RiserHeight, TreadLength, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.NumberOfRisers);
+    ;
+    args.push(this.NumberOfTreads);
+    ;
+    args.push(this.RiserHeight);
+    ;
+    args.push(this.TreadLength);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcStairFlightType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcStairFlightType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcStairType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcStairType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcStructuralAction = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedLoad = AppliedLoad;
+    this.GlobalOrLocal = GlobalOrLocal;
+    this.DestabilizingLoad = DestabilizingLoad;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedLoad = tape[ptr++];
+    let GlobalOrLocal = tape[ptr++];
+    let DestabilizingLoad = tape[ptr++];
+    return new IfcStructuralAction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedLoad);
+    ;
+    args.push(this.GlobalOrLocal);
+    ;
+    args.push(this.DestabilizingLoad);
+    ;
+    return args;
+  }
+};
+var IfcStructuralActivity = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedLoad = AppliedLoad;
+    this.GlobalOrLocal = GlobalOrLocal;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedLoad = tape[ptr++];
+    let GlobalOrLocal = tape[ptr++];
+    return new IfcStructuralActivity(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedLoad);
+    ;
+    args.push(this.GlobalOrLocal);
+    ;
+    return args;
+  }
+};
+var IfcStructuralAnalysisModel = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, OrientationOf2DPlane, LoadedBy, HasResults, SharedPlacement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.PredefinedType = PredefinedType;
+    this.OrientationOf2DPlane = OrientationOf2DPlane;
+    this.LoadedBy = LoadedBy;
+    this.HasResults = HasResults;
+    this.SharedPlacement = SharedPlacement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let OrientationOf2DPlane = tape[ptr++];
+    let LoadedBy = tape[ptr++];
+    let HasResults = tape[ptr++];
+    let SharedPlacement = tape[ptr++];
+    return new IfcStructuralAnalysisModel(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, OrientationOf2DPlane, LoadedBy, HasResults, SharedPlacement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.OrientationOf2DPlane);
+    ;
+    args.push(this.LoadedBy);
+    ;
+    args.push(this.HasResults);
+    ;
+    args.push(this.SharedPlacement);
+    ;
+    return args;
+  }
+};
+var IfcStructuralConnection = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedCondition = AppliedCondition;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedCondition = tape[ptr++];
+    return new IfcStructuralConnection(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedCondition);
+    ;
+    return args;
+  }
+};
+var IfcStructuralConnectionCondition = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcStructuralConnectionCondition(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcStructuralCurveAction = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedLoad = AppliedLoad;
+    this.GlobalOrLocal = GlobalOrLocal;
+    this.DestabilizingLoad = DestabilizingLoad;
+    this.ProjectedOrTrue = ProjectedOrTrue;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedLoad = tape[ptr++];
+    let GlobalOrLocal = tape[ptr++];
+    let DestabilizingLoad = tape[ptr++];
+    let ProjectedOrTrue = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcStructuralCurveAction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedLoad);
+    ;
+    args.push(this.GlobalOrLocal);
+    ;
+    args.push(this.DestabilizingLoad);
+    ;
+    args.push(this.ProjectedOrTrue);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcStructuralCurveConnection = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition, Axis) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedCondition = AppliedCondition;
+    this.Axis = Axis;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedCondition = tape[ptr++];
+    let Axis = tape[ptr++];
+    return new IfcStructuralCurveConnection(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition, Axis);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedCondition);
+    ;
+    args.push(this.Axis);
+    ;
+    return args;
+  }
+};
+var IfcStructuralCurveMember = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Axis) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.PredefinedType = PredefinedType;
+    this.Axis = Axis;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let Axis = tape[ptr++];
+    return new IfcStructuralCurveMember(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Axis);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.Axis);
+    ;
+    return args;
+  }
+};
+var IfcStructuralCurveMemberVarying = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Axis) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.PredefinedType = PredefinedType;
+    this.Axis = Axis;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let Axis = tape[ptr++];
+    return new IfcStructuralCurveMemberVarying(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Axis);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.Axis);
+    ;
+    return args;
+  }
+};
+var IfcStructuralCurveReaction = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedLoad = AppliedLoad;
+    this.GlobalOrLocal = GlobalOrLocal;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedLoad = tape[ptr++];
+    let GlobalOrLocal = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcStructuralCurveReaction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedLoad);
+    ;
+    args.push(this.GlobalOrLocal);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcStructuralItem = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    return new IfcStructuralItem(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLinearAction = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedLoad = AppliedLoad;
+    this.GlobalOrLocal = GlobalOrLocal;
+    this.DestabilizingLoad = DestabilizingLoad;
+    this.ProjectedOrTrue = ProjectedOrTrue;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedLoad = tape[ptr++];
+    let GlobalOrLocal = tape[ptr++];
+    let DestabilizingLoad = tape[ptr++];
+    let ProjectedOrTrue = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcStructuralLinearAction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedLoad);
+    ;
+    args.push(this.GlobalOrLocal);
+    ;
+    args.push(this.DestabilizingLoad);
+    ;
+    args.push(this.ProjectedOrTrue);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoad = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcStructuralLoad(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoadCase = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, ActionType, ActionSource, Coefficient, Purpose, SelfWeightCoefficients) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.PredefinedType = PredefinedType;
+    this.ActionType = ActionType;
+    this.ActionSource = ActionSource;
+    this.Coefficient = Coefficient;
+    this.Purpose = Purpose;
+    this.SelfWeightCoefficients = SelfWeightCoefficients;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let ActionType = tape[ptr++];
+    let ActionSource = tape[ptr++];
+    let Coefficient = tape[ptr++];
+    let Purpose = tape[ptr++];
+    let SelfWeightCoefficients = tape[ptr++];
+    return new IfcStructuralLoadCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, ActionType, ActionSource, Coefficient, Purpose, SelfWeightCoefficients);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.ActionType);
+    ;
+    args.push(this.ActionSource);
+    ;
+    args.push(this.Coefficient);
+    ;
+    args.push(this.Purpose);
+    ;
+    args.push(this.SelfWeightCoefficients);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoadConfiguration = class {
+  constructor(expressID, type, Name, Values, Locations) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Values = Values;
+    this.Locations = Locations;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Values = tape[ptr++];
+    let Locations = tape[ptr++];
+    return new IfcStructuralLoadConfiguration(expressID, type, Name, Values, Locations);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Values);
+    ;
+    args.push(this.Locations);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoadGroup = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, ActionType, ActionSource, Coefficient, Purpose) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.PredefinedType = PredefinedType;
+    this.ActionType = ActionType;
+    this.ActionSource = ActionSource;
+    this.Coefficient = Coefficient;
+    this.Purpose = Purpose;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let ActionType = tape[ptr++];
+    let ActionSource = tape[ptr++];
+    let Coefficient = tape[ptr++];
+    let Purpose = tape[ptr++];
+    return new IfcStructuralLoadGroup(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, PredefinedType, ActionType, ActionSource, Coefficient, Purpose);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.ActionType);
+    ;
+    args.push(this.ActionSource);
+    ;
+    args.push(this.Coefficient);
+    ;
+    args.push(this.Purpose);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoadLinearForce = class {
+  constructor(expressID, type, Name, LinearForceX, LinearForceY, LinearForceZ, LinearMomentX, LinearMomentY, LinearMomentZ) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.LinearForceX = LinearForceX;
+    this.LinearForceY = LinearForceY;
+    this.LinearForceZ = LinearForceZ;
+    this.LinearMomentX = LinearMomentX;
+    this.LinearMomentY = LinearMomentY;
+    this.LinearMomentZ = LinearMomentZ;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let LinearForceX = tape[ptr++];
+    let LinearForceY = tape[ptr++];
+    let LinearForceZ = tape[ptr++];
+    let LinearMomentX = tape[ptr++];
+    let LinearMomentY = tape[ptr++];
+    let LinearMomentZ = tape[ptr++];
+    return new IfcStructuralLoadLinearForce(expressID, type, Name, LinearForceX, LinearForceY, LinearForceZ, LinearMomentX, LinearMomentY, LinearMomentZ);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.LinearForceX);
+    ;
+    args.push(this.LinearForceY);
+    ;
+    args.push(this.LinearForceZ);
+    ;
+    args.push(this.LinearMomentX);
+    ;
+    args.push(this.LinearMomentY);
+    ;
+    args.push(this.LinearMomentZ);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoadOrResult = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcStructuralLoadOrResult(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoadPlanarForce = class {
+  constructor(expressID, type, Name, PlanarForceX, PlanarForceY, PlanarForceZ) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.PlanarForceX = PlanarForceX;
+    this.PlanarForceY = PlanarForceY;
+    this.PlanarForceZ = PlanarForceZ;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let PlanarForceX = tape[ptr++];
+    let PlanarForceY = tape[ptr++];
+    let PlanarForceZ = tape[ptr++];
+    return new IfcStructuralLoadPlanarForce(expressID, type, Name, PlanarForceX, PlanarForceY, PlanarForceZ);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.PlanarForceX);
+    ;
+    args.push(this.PlanarForceY);
+    ;
+    args.push(this.PlanarForceZ);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoadSingleDisplacement = class {
+  constructor(expressID, type, Name, DisplacementX, DisplacementY, DisplacementZ, RotationalDisplacementRX, RotationalDisplacementRY, RotationalDisplacementRZ) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.DisplacementX = DisplacementX;
+    this.DisplacementY = DisplacementY;
+    this.DisplacementZ = DisplacementZ;
+    this.RotationalDisplacementRX = RotationalDisplacementRX;
+    this.RotationalDisplacementRY = RotationalDisplacementRY;
+    this.RotationalDisplacementRZ = RotationalDisplacementRZ;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let DisplacementX = tape[ptr++];
+    let DisplacementY = tape[ptr++];
+    let DisplacementZ = tape[ptr++];
+    let RotationalDisplacementRX = tape[ptr++];
+    let RotationalDisplacementRY = tape[ptr++];
+    let RotationalDisplacementRZ = tape[ptr++];
+    return new IfcStructuralLoadSingleDisplacement(expressID, type, Name, DisplacementX, DisplacementY, DisplacementZ, RotationalDisplacementRX, RotationalDisplacementRY, RotationalDisplacementRZ);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.DisplacementX);
+    ;
+    args.push(this.DisplacementY);
+    ;
+    args.push(this.DisplacementZ);
+    ;
+    args.push(this.RotationalDisplacementRX);
+    ;
+    args.push(this.RotationalDisplacementRY);
+    ;
+    args.push(this.RotationalDisplacementRZ);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoadSingleDisplacementDistortion = class {
+  constructor(expressID, type, Name, DisplacementX, DisplacementY, DisplacementZ, RotationalDisplacementRX, RotationalDisplacementRY, RotationalDisplacementRZ, Distortion) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.DisplacementX = DisplacementX;
+    this.DisplacementY = DisplacementY;
+    this.DisplacementZ = DisplacementZ;
+    this.RotationalDisplacementRX = RotationalDisplacementRX;
+    this.RotationalDisplacementRY = RotationalDisplacementRY;
+    this.RotationalDisplacementRZ = RotationalDisplacementRZ;
+    this.Distortion = Distortion;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let DisplacementX = tape[ptr++];
+    let DisplacementY = tape[ptr++];
+    let DisplacementZ = tape[ptr++];
+    let RotationalDisplacementRX = tape[ptr++];
+    let RotationalDisplacementRY = tape[ptr++];
+    let RotationalDisplacementRZ = tape[ptr++];
+    let Distortion = tape[ptr++];
+    return new IfcStructuralLoadSingleDisplacementDistortion(expressID, type, Name, DisplacementX, DisplacementY, DisplacementZ, RotationalDisplacementRX, RotationalDisplacementRY, RotationalDisplacementRZ, Distortion);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.DisplacementX);
+    ;
+    args.push(this.DisplacementY);
+    ;
+    args.push(this.DisplacementZ);
+    ;
+    args.push(this.RotationalDisplacementRX);
+    ;
+    args.push(this.RotationalDisplacementRY);
+    ;
+    args.push(this.RotationalDisplacementRZ);
+    ;
+    args.push(this.Distortion);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoadSingleForce = class {
+  constructor(expressID, type, Name, ForceX, ForceY, ForceZ, MomentX, MomentY, MomentZ) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.ForceX = ForceX;
+    this.ForceY = ForceY;
+    this.ForceZ = ForceZ;
+    this.MomentX = MomentX;
+    this.MomentY = MomentY;
+    this.MomentZ = MomentZ;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let ForceX = tape[ptr++];
+    let ForceY = tape[ptr++];
+    let ForceZ = tape[ptr++];
+    let MomentX = tape[ptr++];
+    let MomentY = tape[ptr++];
+    let MomentZ = tape[ptr++];
+    return new IfcStructuralLoadSingleForce(expressID, type, Name, ForceX, ForceY, ForceZ, MomentX, MomentY, MomentZ);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.ForceX);
+    ;
+    args.push(this.ForceY);
+    ;
+    args.push(this.ForceZ);
+    ;
+    args.push(this.MomentX);
+    ;
+    args.push(this.MomentY);
+    ;
+    args.push(this.MomentZ);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoadSingleForceWarping = class {
+  constructor(expressID, type, Name, ForceX, ForceY, ForceZ, MomentX, MomentY, MomentZ, WarpingMoment) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.ForceX = ForceX;
+    this.ForceY = ForceY;
+    this.ForceZ = ForceZ;
+    this.MomentX = MomentX;
+    this.MomentY = MomentY;
+    this.MomentZ = MomentZ;
+    this.WarpingMoment = WarpingMoment;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let ForceX = tape[ptr++];
+    let ForceY = tape[ptr++];
+    let ForceZ = tape[ptr++];
+    let MomentX = tape[ptr++];
+    let MomentY = tape[ptr++];
+    let MomentZ = tape[ptr++];
+    let WarpingMoment = tape[ptr++];
+    return new IfcStructuralLoadSingleForceWarping(expressID, type, Name, ForceX, ForceY, ForceZ, MomentX, MomentY, MomentZ, WarpingMoment);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.ForceX);
+    ;
+    args.push(this.ForceY);
+    ;
+    args.push(this.ForceZ);
+    ;
+    args.push(this.MomentX);
+    ;
+    args.push(this.MomentY);
+    ;
+    args.push(this.MomentZ);
+    ;
+    args.push(this.WarpingMoment);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoadStatic = class {
+  constructor(expressID, type, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    return new IfcStructuralLoadStatic(expressID, type, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcStructuralLoadTemperature = class {
+  constructor(expressID, type, Name, DeltaTConstant, DeltaTY, DeltaTZ) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.DeltaTConstant = DeltaTConstant;
+    this.DeltaTY = DeltaTY;
+    this.DeltaTZ = DeltaTZ;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let DeltaTConstant = tape[ptr++];
+    let DeltaTY = tape[ptr++];
+    let DeltaTZ = tape[ptr++];
+    return new IfcStructuralLoadTemperature(expressID, type, Name, DeltaTConstant, DeltaTY, DeltaTZ);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.DeltaTConstant);
+    ;
+    args.push(this.DeltaTY);
+    ;
+    args.push(this.DeltaTZ);
+    ;
+    return args;
+  }
+};
+var IfcStructuralMember = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    return new IfcStructuralMember(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    return args;
+  }
+};
+var IfcStructuralPlanarAction = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedLoad = AppliedLoad;
+    this.GlobalOrLocal = GlobalOrLocal;
+    this.DestabilizingLoad = DestabilizingLoad;
+    this.ProjectedOrTrue = ProjectedOrTrue;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedLoad = tape[ptr++];
+    let GlobalOrLocal = tape[ptr++];
+    let DestabilizingLoad = tape[ptr++];
+    let ProjectedOrTrue = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcStructuralPlanarAction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedLoad);
+    ;
+    args.push(this.GlobalOrLocal);
+    ;
+    args.push(this.DestabilizingLoad);
+    ;
+    args.push(this.ProjectedOrTrue);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcStructuralPointAction = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedLoad = AppliedLoad;
+    this.GlobalOrLocal = GlobalOrLocal;
+    this.DestabilizingLoad = DestabilizingLoad;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedLoad = tape[ptr++];
+    let GlobalOrLocal = tape[ptr++];
+    let DestabilizingLoad = tape[ptr++];
+    return new IfcStructuralPointAction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedLoad);
+    ;
+    args.push(this.GlobalOrLocal);
+    ;
+    args.push(this.DestabilizingLoad);
+    ;
+    return args;
+  }
+};
+var IfcStructuralPointConnection = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition, ConditionCoordinateSystem) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedCondition = AppliedCondition;
+    this.ConditionCoordinateSystem = ConditionCoordinateSystem;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedCondition = tape[ptr++];
+    let ConditionCoordinateSystem = tape[ptr++];
+    return new IfcStructuralPointConnection(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition, ConditionCoordinateSystem);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedCondition);
+    ;
+    args.push(this.ConditionCoordinateSystem);
+    ;
+    return args;
+  }
+};
+var IfcStructuralPointReaction = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedLoad = AppliedLoad;
+    this.GlobalOrLocal = GlobalOrLocal;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedLoad = tape[ptr++];
+    let GlobalOrLocal = tape[ptr++];
+    return new IfcStructuralPointReaction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedLoad);
+    ;
+    args.push(this.GlobalOrLocal);
+    ;
+    return args;
+  }
+};
+var IfcStructuralReaction = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedLoad = AppliedLoad;
+    this.GlobalOrLocal = GlobalOrLocal;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedLoad = tape[ptr++];
+    let GlobalOrLocal = tape[ptr++];
+    return new IfcStructuralReaction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedLoad);
+    ;
+    args.push(this.GlobalOrLocal);
+    ;
+    return args;
+  }
+};
+var IfcStructuralResultGroup = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, TheoryType, ResultForLoadGroup, IsLinear) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.TheoryType = TheoryType;
+    this.ResultForLoadGroup = ResultForLoadGroup;
+    this.IsLinear = IsLinear;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let TheoryType = tape[ptr++];
+    let ResultForLoadGroup = tape[ptr++];
+    let IsLinear = tape[ptr++];
+    return new IfcStructuralResultGroup(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, TheoryType, ResultForLoadGroup, IsLinear);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.TheoryType);
+    ;
+    args.push(this.ResultForLoadGroup);
+    ;
+    args.push(this.IsLinear);
+    ;
+    return args;
+  }
+};
+var IfcStructuralSurfaceAction = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedLoad = AppliedLoad;
+    this.GlobalOrLocal = GlobalOrLocal;
+    this.DestabilizingLoad = DestabilizingLoad;
+    this.ProjectedOrTrue = ProjectedOrTrue;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedLoad = tape[ptr++];
+    let GlobalOrLocal = tape[ptr++];
+    let DestabilizingLoad = tape[ptr++];
+    let ProjectedOrTrue = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcStructuralSurfaceAction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, DestabilizingLoad, ProjectedOrTrue, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedLoad);
+    ;
+    args.push(this.GlobalOrLocal);
+    ;
+    args.push(this.DestabilizingLoad);
+    ;
+    args.push(this.ProjectedOrTrue);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcStructuralSurfaceConnection = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedCondition = AppliedCondition;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedCondition = tape[ptr++];
+    return new IfcStructuralSurfaceConnection(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedCondition);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedCondition);
+    ;
+    return args;
+  }
+};
+var IfcStructuralSurfaceMember = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Thickness) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.PredefinedType = PredefinedType;
+    this.Thickness = Thickness;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let Thickness = tape[ptr++];
+    return new IfcStructuralSurfaceMember(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Thickness);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.Thickness);
+    ;
+    return args;
+  }
+};
+var IfcStructuralSurfaceMemberVarying = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Thickness) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.PredefinedType = PredefinedType;
+    this.Thickness = Thickness;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let Thickness = tape[ptr++];
+    return new IfcStructuralSurfaceMemberVarying(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, PredefinedType, Thickness);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.Thickness);
+    ;
+    return args;
+  }
+};
+var IfcStructuralSurfaceReaction = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.AppliedLoad = AppliedLoad;
+    this.GlobalOrLocal = GlobalOrLocal;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let AppliedLoad = tape[ptr++];
+    let GlobalOrLocal = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcStructuralSurfaceReaction(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, AppliedLoad, GlobalOrLocal, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.AppliedLoad);
+    ;
+    args.push(this.GlobalOrLocal);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcStyleModel = class {
+  constructor(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ContextOfItems = ContextOfItems;
+    this.RepresentationIdentifier = RepresentationIdentifier;
+    this.RepresentationType = RepresentationType;
+    this.Items = Items;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ContextOfItems = tape[ptr++];
+    let RepresentationIdentifier = tape[ptr++];
+    let RepresentationType = tape[ptr++];
+    let Items = tape[ptr++];
+    return new IfcStyleModel(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ContextOfItems);
+    ;
+    args.push(this.RepresentationIdentifier);
+    ;
+    args.push(this.RepresentationType);
+    ;
+    args.push(this.Items);
+    ;
+    return args;
+  }
+};
+var IfcStyledItem = class {
+  constructor(expressID, type, Item, Styles, Name) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Item = Item;
+    this.Styles = Styles;
+    this.Name = Name;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Item = tape[ptr++];
+    let Styles = tape[ptr++];
+    let Name = tape[ptr++];
+    return new IfcStyledItem(expressID, type, Item, Styles, Name);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Item);
+    ;
+    args.push(this.Styles);
+    ;
+    args.push(this.Name);
+    ;
+    return args;
+  }
+};
+var IfcStyledRepresentation = class {
+  constructor(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ContextOfItems = ContextOfItems;
+    this.RepresentationIdentifier = RepresentationIdentifier;
+    this.RepresentationType = RepresentationType;
+    this.Items = Items;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ContextOfItems = tape[ptr++];
+    let RepresentationIdentifier = tape[ptr++];
+    let RepresentationType = tape[ptr++];
+    let Items = tape[ptr++];
+    return new IfcStyledRepresentation(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ContextOfItems);
+    ;
+    args.push(this.RepresentationIdentifier);
+    ;
+    args.push(this.RepresentationType);
+    ;
+    args.push(this.Items);
+    ;
+    return args;
+  }
+};
+var IfcSubContractResource = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.Usage = Usage;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let Usage = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSubContractResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Usage, BaseCosts, BaseQuantity, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.Usage);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSubContractResourceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.ResourceType = ResourceType;
+    this.BaseCosts = BaseCosts;
+    this.BaseQuantity = BaseQuantity;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let ResourceType = tape[ptr++];
+    let BaseCosts = tape[ptr++];
+    let BaseQuantity = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSubContractResourceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType, BaseCosts, BaseQuantity, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.ResourceType);
+    ;
+    args.push(this.BaseCosts);
+    ;
+    args.push(this.BaseQuantity);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSubedge = class {
+  constructor(expressID, type, EdgeStart, EdgeEnd, ParentEdge) {
+    this.expressID = expressID;
+    this.type = type;
+    this.EdgeStart = EdgeStart;
+    this.EdgeEnd = EdgeEnd;
+    this.ParentEdge = ParentEdge;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let EdgeStart = tape[ptr++];
+    let EdgeEnd = tape[ptr++];
+    let ParentEdge = tape[ptr++];
+    return new IfcSubedge(expressID, type, EdgeStart, EdgeEnd, ParentEdge);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.EdgeStart);
+    ;
+    args.push(this.EdgeEnd);
+    ;
+    args.push(this.ParentEdge);
+    ;
+    return args;
+  }
+};
+var IfcSurface = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcSurface(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcSurfaceCurve = class {
+  constructor(expressID, type, Curve3D, AssociatedGeometry, MasterRepresentation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Curve3D = Curve3D;
+    this.AssociatedGeometry = AssociatedGeometry;
+    this.MasterRepresentation = MasterRepresentation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Curve3D = tape[ptr++];
+    let AssociatedGeometry = tape[ptr++];
+    let MasterRepresentation = tape[ptr++];
+    return new IfcSurfaceCurve(expressID, type, Curve3D, AssociatedGeometry, MasterRepresentation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Curve3D);
+    ;
+    args.push(this.AssociatedGeometry);
+    ;
+    args.push(this.MasterRepresentation);
+    ;
+    return args;
+  }
+};
+var IfcSurfaceCurveSweptAreaSolid = class {
+  constructor(expressID, type, SweptArea, Position, Directrix, StartParam, EndParam, ReferenceSurface) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SweptArea = SweptArea;
+    this.Position = Position;
+    this.Directrix = Directrix;
+    this.StartParam = StartParam;
+    this.EndParam = EndParam;
+    this.ReferenceSurface = ReferenceSurface;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SweptArea = tape[ptr++];
+    let Position = tape[ptr++];
+    let Directrix = tape[ptr++];
+    let StartParam = tape[ptr++];
+    let EndParam = tape[ptr++];
+    let ReferenceSurface = tape[ptr++];
+    return new IfcSurfaceCurveSweptAreaSolid(expressID, type, SweptArea, Position, Directrix, StartParam, EndParam, ReferenceSurface);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SweptArea);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Directrix);
+    ;
+    args.push(this.StartParam);
+    ;
+    args.push(this.EndParam);
+    ;
+    args.push(this.ReferenceSurface);
+    ;
+    return args;
+  }
+};
+var IfcSurfaceFeature = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSurfaceFeature(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSurfaceOfLinearExtrusion = class {
+  constructor(expressID, type, SweptCurve, Position, ExtrudedDirection, Depth) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SweptCurve = SweptCurve;
+    this.Position = Position;
+    this.ExtrudedDirection = ExtrudedDirection;
+    this.Depth = Depth;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SweptCurve = tape[ptr++];
+    let Position = tape[ptr++];
+    let ExtrudedDirection = tape[ptr++];
+    let Depth = tape[ptr++];
+    return new IfcSurfaceOfLinearExtrusion(expressID, type, SweptCurve, Position, ExtrudedDirection, Depth);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SweptCurve);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.ExtrudedDirection);
+    ;
+    args.push(this.Depth);
+    ;
+    return args;
+  }
+};
+var IfcSurfaceOfRevolution = class {
+  constructor(expressID, type, SweptCurve, Position, AxisPosition) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SweptCurve = SweptCurve;
+    this.Position = Position;
+    this.AxisPosition = AxisPosition;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SweptCurve = tape[ptr++];
+    let Position = tape[ptr++];
+    let AxisPosition = tape[ptr++];
+    return new IfcSurfaceOfRevolution(expressID, type, SweptCurve, Position, AxisPosition);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SweptCurve);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.AxisPosition);
+    ;
+    return args;
+  }
+};
+var IfcSurfaceReinforcementArea = class {
+  constructor(expressID, type, Name, SurfaceReinforcement1, SurfaceReinforcement2, ShearReinforcement) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.SurfaceReinforcement1 = SurfaceReinforcement1;
+    this.SurfaceReinforcement2 = SurfaceReinforcement2;
+    this.ShearReinforcement = ShearReinforcement;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let SurfaceReinforcement1 = tape[ptr++];
+    let SurfaceReinforcement2 = tape[ptr++];
+    let ShearReinforcement = tape[ptr++];
+    return new IfcSurfaceReinforcementArea(expressID, type, Name, SurfaceReinforcement1, SurfaceReinforcement2, ShearReinforcement);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.SurfaceReinforcement1);
+    ;
+    args.push(this.SurfaceReinforcement2);
+    ;
+    args.push(this.ShearReinforcement);
+    ;
+    return args;
+  }
+};
+var IfcSurfaceStyle = class {
+  constructor(expressID, type, Name, Side, Styles) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Side = Side;
+    this.Styles = Styles;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Side = tape[ptr++];
+    let Styles = tape[ptr++];
+    return new IfcSurfaceStyle(expressID, type, Name, Side, Styles);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Side);
+    ;
+    args.push(this.Styles);
+    ;
+    return args;
+  }
+};
+var IfcSurfaceStyleLighting = class {
+  constructor(expressID, type, DiffuseTransmissionColour, DiffuseReflectionColour, TransmissionColour, ReflectanceColour) {
+    this.expressID = expressID;
+    this.type = type;
+    this.DiffuseTransmissionColour = DiffuseTransmissionColour;
+    this.DiffuseReflectionColour = DiffuseReflectionColour;
+    this.TransmissionColour = TransmissionColour;
+    this.ReflectanceColour = ReflectanceColour;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let DiffuseTransmissionColour = tape[ptr++];
+    let DiffuseReflectionColour = tape[ptr++];
+    let TransmissionColour = tape[ptr++];
+    let ReflectanceColour = tape[ptr++];
+    return new IfcSurfaceStyleLighting(expressID, type, DiffuseTransmissionColour, DiffuseReflectionColour, TransmissionColour, ReflectanceColour);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.DiffuseTransmissionColour);
+    ;
+    args.push(this.DiffuseReflectionColour);
+    ;
+    args.push(this.TransmissionColour);
+    ;
+    args.push(this.ReflectanceColour);
+    ;
+    return args;
+  }
+};
+var IfcSurfaceStyleRefraction = class {
+  constructor(expressID, type, RefractionIndex, DispersionFactor) {
+    this.expressID = expressID;
+    this.type = type;
+    this.RefractionIndex = RefractionIndex;
+    this.DispersionFactor = DispersionFactor;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let RefractionIndex = tape[ptr++];
+    let DispersionFactor = tape[ptr++];
+    return new IfcSurfaceStyleRefraction(expressID, type, RefractionIndex, DispersionFactor);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.RefractionIndex);
+    ;
+    args.push(this.DispersionFactor);
+    ;
+    return args;
+  }
+};
+var IfcSurfaceStyleRendering = class {
+  constructor(expressID, type, SurfaceColour, Transparency, DiffuseColour, TransmissionColour, DiffuseTransmissionColour, ReflectionColour, SpecularColour, SpecularHighlight, ReflectanceMethod) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SurfaceColour = SurfaceColour;
+    this.Transparency = Transparency;
+    this.DiffuseColour = DiffuseColour;
+    this.TransmissionColour = TransmissionColour;
+    this.DiffuseTransmissionColour = DiffuseTransmissionColour;
+    this.ReflectionColour = ReflectionColour;
+    this.SpecularColour = SpecularColour;
+    this.SpecularHighlight = SpecularHighlight;
+    this.ReflectanceMethod = ReflectanceMethod;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SurfaceColour = tape[ptr++];
+    let Transparency = tape[ptr++];
+    let DiffuseColour = tape[ptr++];
+    let TransmissionColour = tape[ptr++];
+    let DiffuseTransmissionColour = tape[ptr++];
+    let ReflectionColour = tape[ptr++];
+    let SpecularColour = tape[ptr++];
+    let SpecularHighlight = tape[ptr++];
+    let ReflectanceMethod = tape[ptr++];
+    return new IfcSurfaceStyleRendering(expressID, type, SurfaceColour, Transparency, DiffuseColour, TransmissionColour, DiffuseTransmissionColour, ReflectionColour, SpecularColour, SpecularHighlight, ReflectanceMethod);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SurfaceColour);
+    ;
+    args.push(this.Transparency);
+    ;
+    args.push(this.DiffuseColour);
+    ;
+    args.push(this.TransmissionColour);
+    ;
+    args.push(this.DiffuseTransmissionColour);
+    ;
+    args.push(this.ReflectionColour);
+    ;
+    args.push(this.SpecularColour);
+    ;
+    args.push(this.SpecularHighlight);
+    ;
+    args.push(this.ReflectanceMethod);
+    ;
+    return args;
+  }
+};
+var IfcSurfaceStyleShading = class {
+  constructor(expressID, type, SurfaceColour, Transparency) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SurfaceColour = SurfaceColour;
+    this.Transparency = Transparency;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SurfaceColour = tape[ptr++];
+    let Transparency = tape[ptr++];
+    return new IfcSurfaceStyleShading(expressID, type, SurfaceColour, Transparency);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SurfaceColour);
+    ;
+    args.push(this.Transparency);
+    ;
+    return args;
+  }
+};
+var IfcSurfaceStyleWithTextures = class {
+  constructor(expressID, type, Textures) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Textures = Textures;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Textures = tape[ptr++];
+    return new IfcSurfaceStyleWithTextures(expressID, type, Textures);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Textures);
+    ;
+    return args;
+  }
+};
+var IfcSurfaceTexture = class {
+  constructor(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter) {
+    this.expressID = expressID;
+    this.type = type;
+    this.RepeatS = RepeatS;
+    this.RepeatT = RepeatT;
+    this.Mode = Mode;
+    this.TextureTransform = TextureTransform;
+    this.Parameter = Parameter;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let RepeatS = tape[ptr++];
+    let RepeatT = tape[ptr++];
+    let Mode = tape[ptr++];
+    let TextureTransform = tape[ptr++];
+    let Parameter = tape[ptr++];
+    return new IfcSurfaceTexture(expressID, type, RepeatS, RepeatT, Mode, TextureTransform, Parameter);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.RepeatS);
+    ;
+    args.push(this.RepeatT);
+    ;
+    args.push(this.Mode);
+    ;
+    args.push(this.TextureTransform);
+    ;
+    args.push(this.Parameter);
+    ;
+    return args;
+  }
+};
+var IfcSweptAreaSolid = class {
+  constructor(expressID, type, SweptArea, Position) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SweptArea = SweptArea;
+    this.Position = Position;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SweptArea = tape[ptr++];
+    let Position = tape[ptr++];
+    return new IfcSweptAreaSolid(expressID, type, SweptArea, Position);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SweptArea);
+    ;
+    args.push(this.Position);
+    ;
+    return args;
+  }
+};
+var IfcSweptDiskSolid = class {
+  constructor(expressID, type, Directrix, Radius, InnerRadius, StartParam, EndParam) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Directrix = Directrix;
+    this.Radius = Radius;
+    this.InnerRadius = InnerRadius;
+    this.StartParam = StartParam;
+    this.EndParam = EndParam;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Directrix = tape[ptr++];
+    let Radius = tape[ptr++];
+    let InnerRadius = tape[ptr++];
+    let StartParam = tape[ptr++];
+    let EndParam = tape[ptr++];
+    return new IfcSweptDiskSolid(expressID, type, Directrix, Radius, InnerRadius, StartParam, EndParam);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Directrix);
+    ;
+    args.push(this.Radius);
+    ;
+    args.push(this.InnerRadius);
+    ;
+    args.push(this.StartParam);
+    ;
+    args.push(this.EndParam);
+    ;
+    return args;
+  }
+};
+var IfcSweptDiskSolidPolygonal = class {
+  constructor(expressID, type, Directrix, Radius, InnerRadius, StartParam, EndParam, FilletRadius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Directrix = Directrix;
+    this.Radius = Radius;
+    this.InnerRadius = InnerRadius;
+    this.StartParam = StartParam;
+    this.EndParam = EndParam;
+    this.FilletRadius = FilletRadius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Directrix = tape[ptr++];
+    let Radius = tape[ptr++];
+    let InnerRadius = tape[ptr++];
+    let StartParam = tape[ptr++];
+    let EndParam = tape[ptr++];
+    let FilletRadius = tape[ptr++];
+    return new IfcSweptDiskSolidPolygonal(expressID, type, Directrix, Radius, InnerRadius, StartParam, EndParam, FilletRadius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Directrix);
+    ;
+    args.push(this.Radius);
+    ;
+    args.push(this.InnerRadius);
+    ;
+    args.push(this.StartParam);
+    ;
+    args.push(this.EndParam);
+    ;
+    args.push(this.FilletRadius);
+    ;
+    return args;
+  }
+};
+var IfcSweptSurface = class {
+  constructor(expressID, type, SweptCurve, Position) {
+    this.expressID = expressID;
+    this.type = type;
+    this.SweptCurve = SweptCurve;
+    this.Position = Position;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let SweptCurve = tape[ptr++];
+    let Position = tape[ptr++];
+    return new IfcSweptSurface(expressID, type, SweptCurve, Position);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.SweptCurve);
+    ;
+    args.push(this.Position);
+    ;
+    return args;
+  }
+};
+var IfcSwitchingDevice = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSwitchingDevice(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSwitchingDeviceType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSwitchingDeviceType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSystem = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    return new IfcSystem(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    return args;
+  }
+};
+var IfcSystemFurnitureElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSystemFurnitureElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcSystemFurnitureElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcSystemFurnitureElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTShapeProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, Depth, FlangeWidth, WebThickness, FlangeThickness, FilletRadius, FlangeEdgeRadius, WebEdgeRadius, WebSlope, FlangeSlope) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.Depth = Depth;
+    this.FlangeWidth = FlangeWidth;
+    this.WebThickness = WebThickness;
+    this.FlangeThickness = FlangeThickness;
+    this.FilletRadius = FilletRadius;
+    this.FlangeEdgeRadius = FlangeEdgeRadius;
+    this.WebEdgeRadius = WebEdgeRadius;
+    this.WebSlope = WebSlope;
+    this.FlangeSlope = FlangeSlope;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let Depth = tape[ptr++];
+    let FlangeWidth = tape[ptr++];
+    let WebThickness = tape[ptr++];
+    let FlangeThickness = tape[ptr++];
+    let FilletRadius = tape[ptr++];
+    let FlangeEdgeRadius = tape[ptr++];
+    let WebEdgeRadius = tape[ptr++];
+    let WebSlope = tape[ptr++];
+    let FlangeSlope = tape[ptr++];
+    return new IfcTShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, Depth, FlangeWidth, WebThickness, FlangeThickness, FilletRadius, FlangeEdgeRadius, WebEdgeRadius, WebSlope, FlangeSlope);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Depth);
+    ;
+    args.push(this.FlangeWidth);
+    ;
+    args.push(this.WebThickness);
+    ;
+    args.push(this.FlangeThickness);
+    ;
+    args.push(this.FilletRadius);
+    ;
+    args.push(this.FlangeEdgeRadius);
+    ;
+    args.push(this.WebEdgeRadius);
+    ;
+    args.push(this.WebSlope);
+    ;
+    args.push(this.FlangeSlope);
+    ;
+    return args;
+  }
+};
+var IfcTable = class {
+  constructor(expressID, type, Name, Rows, Columns) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Rows = Rows;
+    this.Columns = Columns;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Rows = tape[ptr++];
+    let Columns = tape[ptr++];
+    return new IfcTable(expressID, type, Name, Rows, Columns);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Rows);
+    ;
+    args.push(this.Columns);
+    ;
+    return args;
+  }
+};
+var IfcTableColumn = class {
+  constructor(expressID, type, Identifier, Name, Description, Unit, ReferencePath) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Identifier = Identifier;
+    this.Name = Name;
+    this.Description = Description;
+    this.Unit = Unit;
+    this.ReferencePath = ReferencePath;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Identifier = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let Unit = tape[ptr++];
+    let ReferencePath = tape[ptr++];
+    return new IfcTableColumn(expressID, type, Identifier, Name, Description, Unit, ReferencePath);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Identifier);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.Unit);
+    ;
+    args.push(this.ReferencePath);
+    ;
+    return args;
+  }
+};
+var IfcTableRow = class {
+  constructor(expressID, type, RowCells, IsHeading) {
+    this.expressID = expressID;
+    this.type = type;
+    this.RowCells = RowCells;
+    this.IsHeading = IsHeading;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let RowCells = tape[ptr++];
+    let IsHeading = tape[ptr++];
+    return new IfcTableRow(expressID, type, RowCells, IsHeading);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.RowCells);
+    ;
+    args.push(this.IsHeading);
+    ;
+    return args;
+  }
+};
+var IfcTank = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTank(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTankType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTankType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTask = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Status, WorkMethod, IsMilestone, Priority, TaskTime, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.Status = Status;
+    this.WorkMethod = WorkMethod;
+    this.IsMilestone = IsMilestone;
+    this.Priority = Priority;
+    this.TaskTime = TaskTime;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let Status = tape[ptr++];
+    let WorkMethod = tape[ptr++];
+    let IsMilestone = tape[ptr++];
+    let Priority = tape[ptr++];
+    let TaskTime = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTask(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, LongDescription, Status, WorkMethod, IsMilestone, Priority, TaskTime, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.Status);
+    ;
+    args.push(this.WorkMethod);
+    ;
+    args.push(this.IsMilestone);
+    ;
+    args.push(this.Priority);
+    ;
+    args.push(this.TaskTime);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTaskTime = class {
+  constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, DurationType, ScheduleDuration, ScheduleStart, ScheduleFinish, EarlyStart, EarlyFinish, LateStart, LateFinish, FreeFloat, TotalFloat, IsCritical, StatusTime, ActualDuration, ActualStart, ActualFinish, RemainingTime, Completion) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.DataOrigin = DataOrigin;
+    this.UserDefinedDataOrigin = UserDefinedDataOrigin;
+    this.DurationType = DurationType;
+    this.ScheduleDuration = ScheduleDuration;
+    this.ScheduleStart = ScheduleStart;
+    this.ScheduleFinish = ScheduleFinish;
+    this.EarlyStart = EarlyStart;
+    this.EarlyFinish = EarlyFinish;
+    this.LateStart = LateStart;
+    this.LateFinish = LateFinish;
+    this.FreeFloat = FreeFloat;
+    this.TotalFloat = TotalFloat;
+    this.IsCritical = IsCritical;
+    this.StatusTime = StatusTime;
+    this.ActualDuration = ActualDuration;
+    this.ActualStart = ActualStart;
+    this.ActualFinish = ActualFinish;
+    this.RemainingTime = RemainingTime;
+    this.Completion = Completion;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let DataOrigin = tape[ptr++];
+    let UserDefinedDataOrigin = tape[ptr++];
+    let DurationType = tape[ptr++];
+    let ScheduleDuration = tape[ptr++];
+    let ScheduleStart = tape[ptr++];
+    let ScheduleFinish = tape[ptr++];
+    let EarlyStart = tape[ptr++];
+    let EarlyFinish = tape[ptr++];
+    let LateStart = tape[ptr++];
+    let LateFinish = tape[ptr++];
+    let FreeFloat = tape[ptr++];
+    let TotalFloat = tape[ptr++];
+    let IsCritical = tape[ptr++];
+    let StatusTime = tape[ptr++];
+    let ActualDuration = tape[ptr++];
+    let ActualStart = tape[ptr++];
+    let ActualFinish = tape[ptr++];
+    let RemainingTime = tape[ptr++];
+    let Completion = tape[ptr++];
+    return new IfcTaskTime(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, DurationType, ScheduleDuration, ScheduleStart, ScheduleFinish, EarlyStart, EarlyFinish, LateStart, LateFinish, FreeFloat, TotalFloat, IsCritical, StatusTime, ActualDuration, ActualStart, ActualFinish, RemainingTime, Completion);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.DataOrigin);
+    ;
+    args.push(this.UserDefinedDataOrigin);
+    ;
+    args.push(this.DurationType);
+    ;
+    args.push(this.ScheduleDuration);
+    ;
+    args.push(this.ScheduleStart);
+    ;
+    args.push(this.ScheduleFinish);
+    ;
+    args.push(this.EarlyStart);
+    ;
+    args.push(this.EarlyFinish);
+    ;
+    args.push(this.LateStart);
+    ;
+    args.push(this.LateFinish);
+    ;
+    args.push(this.FreeFloat);
+    ;
+    args.push(this.TotalFloat);
+    ;
+    args.push(this.IsCritical);
+    ;
+    args.push(this.StatusTime);
+    ;
+    args.push(this.ActualDuration);
+    ;
+    args.push(this.ActualStart);
+    ;
+    args.push(this.ActualFinish);
+    ;
+    args.push(this.RemainingTime);
+    ;
+    args.push(this.Completion);
+    ;
+    return args;
+  }
+};
+var IfcTaskTimeRecurring = class {
+  constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, DurationType, ScheduleDuration, ScheduleStart, ScheduleFinish, EarlyStart, EarlyFinish, LateStart, LateFinish, FreeFloat, TotalFloat, IsCritical, StatusTime, ActualDuration, ActualStart, ActualFinish, RemainingTime, Completion, Recurrence) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.DataOrigin = DataOrigin;
+    this.UserDefinedDataOrigin = UserDefinedDataOrigin;
+    this.DurationType = DurationType;
+    this.ScheduleDuration = ScheduleDuration;
+    this.ScheduleStart = ScheduleStart;
+    this.ScheduleFinish = ScheduleFinish;
+    this.EarlyStart = EarlyStart;
+    this.EarlyFinish = EarlyFinish;
+    this.LateStart = LateStart;
+    this.LateFinish = LateFinish;
+    this.FreeFloat = FreeFloat;
+    this.TotalFloat = TotalFloat;
+    this.IsCritical = IsCritical;
+    this.StatusTime = StatusTime;
+    this.ActualDuration = ActualDuration;
+    this.ActualStart = ActualStart;
+    this.ActualFinish = ActualFinish;
+    this.RemainingTime = RemainingTime;
+    this.Completion = Completion;
+    this.Recurrence = Recurrence;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let DataOrigin = tape[ptr++];
+    let UserDefinedDataOrigin = tape[ptr++];
+    let DurationType = tape[ptr++];
+    let ScheduleDuration = tape[ptr++];
+    let ScheduleStart = tape[ptr++];
+    let ScheduleFinish = tape[ptr++];
+    let EarlyStart = tape[ptr++];
+    let EarlyFinish = tape[ptr++];
+    let LateStart = tape[ptr++];
+    let LateFinish = tape[ptr++];
+    let FreeFloat = tape[ptr++];
+    let TotalFloat = tape[ptr++];
+    let IsCritical = tape[ptr++];
+    let StatusTime = tape[ptr++];
+    let ActualDuration = tape[ptr++];
+    let ActualStart = tape[ptr++];
+    let ActualFinish = tape[ptr++];
+    let RemainingTime = tape[ptr++];
+    let Completion = tape[ptr++];
+    let Recurrence = tape[ptr++];
+    return new IfcTaskTimeRecurring(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, DurationType, ScheduleDuration, ScheduleStart, ScheduleFinish, EarlyStart, EarlyFinish, LateStart, LateFinish, FreeFloat, TotalFloat, IsCritical, StatusTime, ActualDuration, ActualStart, ActualFinish, RemainingTime, Completion, Recurrence);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.DataOrigin);
+    ;
+    args.push(this.UserDefinedDataOrigin);
+    ;
+    args.push(this.DurationType);
+    ;
+    args.push(this.ScheduleDuration);
+    ;
+    args.push(this.ScheduleStart);
+    ;
+    args.push(this.ScheduleFinish);
+    ;
+    args.push(this.EarlyStart);
+    ;
+    args.push(this.EarlyFinish);
+    ;
+    args.push(this.LateStart);
+    ;
+    args.push(this.LateFinish);
+    ;
+    args.push(this.FreeFloat);
+    ;
+    args.push(this.TotalFloat);
+    ;
+    args.push(this.IsCritical);
+    ;
+    args.push(this.StatusTime);
+    ;
+    args.push(this.ActualDuration);
+    ;
+    args.push(this.ActualStart);
+    ;
+    args.push(this.ActualFinish);
+    ;
+    args.push(this.RemainingTime);
+    ;
+    args.push(this.Completion);
+    ;
+    args.push(this.Recurrence);
+    ;
+    return args;
+  }
+};
+var IfcTaskType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType, PredefinedType, WorkMethod) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.ProcessType = ProcessType;
+    this.PredefinedType = PredefinedType;
+    this.WorkMethod = WorkMethod;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let ProcessType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let WorkMethod = tape[ptr++];
+    return new IfcTaskType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType, PredefinedType, WorkMethod);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.ProcessType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.WorkMethod);
+    ;
+    return args;
+  }
+};
+var IfcTelecomAddress = class {
+  constructor(expressID, type, Purpose, Description, UserDefinedPurpose, TelephoneNumbers, FacsimileNumbers, PagerNumber, ElectronicMailAddresses, WWWHomePageURL, MessagingIDs) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Purpose = Purpose;
+    this.Description = Description;
+    this.UserDefinedPurpose = UserDefinedPurpose;
+    this.TelephoneNumbers = TelephoneNumbers;
+    this.FacsimileNumbers = FacsimileNumbers;
+    this.PagerNumber = PagerNumber;
+    this.ElectronicMailAddresses = ElectronicMailAddresses;
+    this.WWWHomePageURL = WWWHomePageURL;
+    this.MessagingIDs = MessagingIDs;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Purpose = tape[ptr++];
+    let Description = tape[ptr++];
+    let UserDefinedPurpose = tape[ptr++];
+    let TelephoneNumbers = tape[ptr++];
+    let FacsimileNumbers = tape[ptr++];
+    let PagerNumber = tape[ptr++];
+    let ElectronicMailAddresses = tape[ptr++];
+    let WWWHomePageURL = tape[ptr++];
+    let MessagingIDs = tape[ptr++];
+    return new IfcTelecomAddress(expressID, type, Purpose, Description, UserDefinedPurpose, TelephoneNumbers, FacsimileNumbers, PagerNumber, ElectronicMailAddresses, WWWHomePageURL, MessagingIDs);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Purpose);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.UserDefinedPurpose);
+    ;
+    args.push(this.TelephoneNumbers);
+    ;
+    args.push(this.FacsimileNumbers);
+    ;
+    args.push(this.PagerNumber);
+    ;
+    args.push(this.ElectronicMailAddresses);
+    ;
+    args.push(this.WWWHomePageURL);
+    ;
+    args.push(this.MessagingIDs);
+    ;
+    return args;
+  }
+};
+var IfcTendon = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, PredefinedType, NominalDiameter, CrossSectionArea, TensionForce, PreStress, FrictionCoefficient, AnchorageSlip, MinCurvatureRadius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.SteelGrade = SteelGrade;
+    this.PredefinedType = PredefinedType;
+    this.NominalDiameter = NominalDiameter;
+    this.CrossSectionArea = CrossSectionArea;
+    this.TensionForce = TensionForce;
+    this.PreStress = PreStress;
+    this.FrictionCoefficient = FrictionCoefficient;
+    this.AnchorageSlip = AnchorageSlip;
+    this.MinCurvatureRadius = MinCurvatureRadius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let SteelGrade = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let NominalDiameter = tape[ptr++];
+    let CrossSectionArea = tape[ptr++];
+    let TensionForce = tape[ptr++];
+    let PreStress = tape[ptr++];
+    let FrictionCoefficient = tape[ptr++];
+    let AnchorageSlip = tape[ptr++];
+    let MinCurvatureRadius = tape[ptr++];
+    return new IfcTendon(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, PredefinedType, NominalDiameter, CrossSectionArea, TensionForce, PreStress, FrictionCoefficient, AnchorageSlip, MinCurvatureRadius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.SteelGrade);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.NominalDiameter);
+    ;
+    args.push(this.CrossSectionArea);
+    ;
+    args.push(this.TensionForce);
+    ;
+    args.push(this.PreStress);
+    ;
+    args.push(this.FrictionCoefficient);
+    ;
+    args.push(this.AnchorageSlip);
+    ;
+    args.push(this.MinCurvatureRadius);
+    ;
+    return args;
+  }
+};
+var IfcTendonAnchor = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.SteelGrade = SteelGrade;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let SteelGrade = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTendonAnchor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.SteelGrade);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTendonAnchorType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTendonAnchorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTendonConduit = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.SteelGrade = SteelGrade;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let SteelGrade = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTendonConduit(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, SteelGrade, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.SteelGrade);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTendonConduitType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTendonConduitType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTendonType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, NominalDiameter, CrossSectionArea, SheathDiameter) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+    this.NominalDiameter = NominalDiameter;
+    this.CrossSectionArea = CrossSectionArea;
+    this.SheathDiameter = SheathDiameter;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let NominalDiameter = tape[ptr++];
+    let CrossSectionArea = tape[ptr++];
+    let SheathDiameter = tape[ptr++];
+    return new IfcTendonType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, NominalDiameter, CrossSectionArea, SheathDiameter);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.NominalDiameter);
+    ;
+    args.push(this.CrossSectionArea);
+    ;
+    args.push(this.SheathDiameter);
+    ;
+    return args;
+  }
+};
+var IfcTessellatedFaceSet = class {
+  constructor(expressID, type, Coordinates) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Coordinates = Coordinates;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Coordinates = tape[ptr++];
+    return new IfcTessellatedFaceSet(expressID, type, Coordinates);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Coordinates);
+    ;
+    return args;
+  }
+};
+var IfcTessellatedItem = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcTessellatedItem(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcTextLiteral = class {
+  constructor(expressID, type, Literal, Placement, Path) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Literal = Literal;
+    this.Placement = Placement;
+    this.Path = Path;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Literal = tape[ptr++];
+    let Placement = tape[ptr++];
+    let Path = tape[ptr++];
+    return new IfcTextLiteral(expressID, type, Literal, Placement, Path);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Literal);
+    ;
+    args.push(this.Placement);
+    ;
+    args.push(this.Path);
+    ;
+    return args;
+  }
+};
+var IfcTextLiteralWithExtent = class {
+  constructor(expressID, type, Literal, Placement, Path, Extent, BoxAlignment) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Literal = Literal;
+    this.Placement = Placement;
+    this.Path = Path;
+    this.Extent = Extent;
+    this.BoxAlignment = BoxAlignment;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Literal = tape[ptr++];
+    let Placement = tape[ptr++];
+    let Path = tape[ptr++];
+    let Extent = tape[ptr++];
+    let BoxAlignment = tape[ptr++];
+    return new IfcTextLiteralWithExtent(expressID, type, Literal, Placement, Path, Extent, BoxAlignment);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Literal);
+    ;
+    args.push(this.Placement);
+    ;
+    args.push(this.Path);
+    ;
+    args.push(this.Extent);
+    ;
+    args.push(this.BoxAlignment);
+    ;
+    return args;
+  }
+};
+var IfcTextStyle = class {
+  constructor(expressID, type, Name, TextCharacterAppearance, TextStyle, TextFontStyle, ModelOrDraughting) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.TextCharacterAppearance = TextCharacterAppearance;
+    this.TextStyle = TextStyle;
+    this.TextFontStyle = TextFontStyle;
+    this.ModelOrDraughting = ModelOrDraughting;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let TextCharacterAppearance = tape[ptr++];
+    let TextStyle = tape[ptr++];
+    let TextFontStyle = tape[ptr++];
+    let ModelOrDraughting = tape[ptr++];
+    return new IfcTextStyle(expressID, type, Name, TextCharacterAppearance, TextStyle, TextFontStyle, ModelOrDraughting);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.TextCharacterAppearance);
+    ;
+    args.push(this.TextStyle);
+    ;
+    args.push(this.TextFontStyle);
+    ;
+    args.push(this.ModelOrDraughting);
+    ;
+    return args;
+  }
+};
+var IfcTextStyleFontModel = class {
+  constructor(expressID, type, Name, FontFamily, FontStyle, FontVariant, FontWeight, FontSize) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.FontFamily = FontFamily;
+    this.FontStyle = FontStyle;
+    this.FontVariant = FontVariant;
+    this.FontWeight = FontWeight;
+    this.FontSize = FontSize;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let FontFamily = tape[ptr++];
+    let FontStyle = tape[ptr++];
+    let FontVariant = tape[ptr++];
+    let FontWeight = tape[ptr++];
+    let FontSize = tape[ptr++];
+    return new IfcTextStyleFontModel(expressID, type, Name, FontFamily, FontStyle, FontVariant, FontWeight, FontSize);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.FontFamily);
+    ;
+    args.push(this.FontStyle);
+    ;
+    args.push(this.FontVariant);
+    ;
+    args.push(this.FontWeight);
+    ;
+    args.push(this.FontSize);
+    ;
+    return args;
+  }
+};
+var IfcTextStyleForDefinedFont = class {
+  constructor(expressID, type, Colour, BackgroundColour) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Colour = Colour;
+    this.BackgroundColour = BackgroundColour;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Colour = tape[ptr++];
+    let BackgroundColour = tape[ptr++];
+    return new IfcTextStyleForDefinedFont(expressID, type, Colour, BackgroundColour);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Colour);
+    ;
+    args.push(this.BackgroundColour);
+    ;
+    return args;
+  }
+};
+var IfcTextStyleTextModel = class {
+  constructor(expressID, type, TextIndent, TextAlign, TextDecoration, LetterSpacing, WordSpacing, TextTransform, LineHeight) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TextIndent = TextIndent;
+    this.TextAlign = TextAlign;
+    this.TextDecoration = TextDecoration;
+    this.LetterSpacing = LetterSpacing;
+    this.WordSpacing = WordSpacing;
+    this.TextTransform = TextTransform;
+    this.LineHeight = LineHeight;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TextIndent = tape[ptr++];
+    let TextAlign = tape[ptr++];
+    let TextDecoration = tape[ptr++];
+    let LetterSpacing = tape[ptr++];
+    let WordSpacing = tape[ptr++];
+    let TextTransform = tape[ptr++];
+    let LineHeight = tape[ptr++];
+    return new IfcTextStyleTextModel(expressID, type, TextIndent, TextAlign, TextDecoration, LetterSpacing, WordSpacing, TextTransform, LineHeight);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TextIndent);
+    ;
+    args.push(this.TextAlign);
+    ;
+    args.push(this.TextDecoration);
+    ;
+    args.push(this.LetterSpacing);
+    ;
+    args.push(this.WordSpacing);
+    ;
+    args.push(this.TextTransform);
+    ;
+    args.push(this.LineHeight);
+    ;
+    return args;
+  }
+};
+var IfcTextureCoordinate = class {
+  constructor(expressID, type, Maps) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Maps = Maps;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Maps = tape[ptr++];
+    return new IfcTextureCoordinate(expressID, type, Maps);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Maps);
+    ;
+    return args;
+  }
+};
+var IfcTextureCoordinateGenerator = class {
+  constructor(expressID, type, Maps, Mode, Parameter) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Maps = Maps;
+    this.Mode = Mode;
+    this.Parameter = Parameter;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Maps = tape[ptr++];
+    let Mode = tape[ptr++];
+    let Parameter = tape[ptr++];
+    return new IfcTextureCoordinateGenerator(expressID, type, Maps, Mode, Parameter);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Maps);
+    ;
+    args.push(this.Mode);
+    ;
+    args.push(this.Parameter);
+    ;
+    return args;
+  }
+};
+var IfcTextureMap = class {
+  constructor(expressID, type, Maps, Vertices, MappedTo) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Maps = Maps;
+    this.Vertices = Vertices;
+    this.MappedTo = MappedTo;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Maps = tape[ptr++];
+    let Vertices = tape[ptr++];
+    let MappedTo = tape[ptr++];
+    return new IfcTextureMap(expressID, type, Maps, Vertices, MappedTo);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Maps);
+    ;
+    args.push(this.Vertices);
+    ;
+    args.push(this.MappedTo);
+    ;
+    return args;
+  }
+};
+var IfcTextureVertex = class {
+  constructor(expressID, type, Coordinates) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Coordinates = Coordinates;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Coordinates = tape[ptr++];
+    return new IfcTextureVertex(expressID, type, Coordinates);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Coordinates);
+    ;
+    return args;
+  }
+};
+var IfcTextureVertexList = class {
+  constructor(expressID, type, TexCoordsList) {
+    this.expressID = expressID;
+    this.type = type;
+    this.TexCoordsList = TexCoordsList;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let TexCoordsList = tape[ptr++];
+    return new IfcTextureVertexList(expressID, type, TexCoordsList);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.TexCoordsList);
+    ;
+    return args;
+  }
+};
+var IfcTimePeriod = class {
+  constructor(expressID, type, StartTime, EndTime) {
+    this.expressID = expressID;
+    this.type = type;
+    this.StartTime = StartTime;
+    this.EndTime = EndTime;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let StartTime = tape[ptr++];
+    let EndTime = tape[ptr++];
+    return new IfcTimePeriod(expressID, type, StartTime, EndTime);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.StartTime);
+    ;
+    args.push(this.EndTime);
+    ;
+    return args;
+  }
+};
+var IfcTimeSeries = class {
+  constructor(expressID, type, Name, Description, StartTime, EndTime, TimeSeriesDataType, DataOrigin, UserDefinedDataOrigin, Unit) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.Description = Description;
+    this.StartTime = StartTime;
+    this.EndTime = EndTime;
+    this.TimeSeriesDataType = TimeSeriesDataType;
+    this.DataOrigin = DataOrigin;
+    this.UserDefinedDataOrigin = UserDefinedDataOrigin;
+    this.Unit = Unit;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let StartTime = tape[ptr++];
+    let EndTime = tape[ptr++];
+    let TimeSeriesDataType = tape[ptr++];
+    let DataOrigin = tape[ptr++];
+    let UserDefinedDataOrigin = tape[ptr++];
+    let Unit = tape[ptr++];
+    return new IfcTimeSeries(expressID, type, Name, Description, StartTime, EndTime, TimeSeriesDataType, DataOrigin, UserDefinedDataOrigin, Unit);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.StartTime);
+    ;
+    args.push(this.EndTime);
+    ;
+    args.push(this.TimeSeriesDataType);
+    ;
+    args.push(this.DataOrigin);
+    ;
+    args.push(this.UserDefinedDataOrigin);
+    ;
+    args.push(this.Unit);
+    ;
+    return args;
+  }
+};
+var IfcTimeSeriesValue = class {
+  constructor(expressID, type, ListValues) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ListValues = ListValues;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ListValues = tape[ptr++];
+    return new IfcTimeSeriesValue(expressID, type, ListValues);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ListValues);
+    ;
+    return args;
+  }
+};
+var IfcTopologicalRepresentationItem = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcTopologicalRepresentationItem(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcTopologyRepresentation = class {
+  constructor(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ContextOfItems = ContextOfItems;
+    this.RepresentationIdentifier = RepresentationIdentifier;
+    this.RepresentationType = RepresentationType;
+    this.Items = Items;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ContextOfItems = tape[ptr++];
+    let RepresentationIdentifier = tape[ptr++];
+    let RepresentationType = tape[ptr++];
+    let Items = tape[ptr++];
+    return new IfcTopologyRepresentation(expressID, type, ContextOfItems, RepresentationIdentifier, RepresentationType, Items);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ContextOfItems);
+    ;
+    args.push(this.RepresentationIdentifier);
+    ;
+    args.push(this.RepresentationType);
+    ;
+    args.push(this.Items);
+    ;
+    return args;
+  }
+};
+var IfcToroidalSurface = class {
+  constructor(expressID, type, Position, MajorRadius, MinorRadius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Position = Position;
+    this.MajorRadius = MajorRadius;
+    this.MinorRadius = MinorRadius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Position = tape[ptr++];
+    let MajorRadius = tape[ptr++];
+    let MinorRadius = tape[ptr++];
+    return new IfcToroidalSurface(expressID, type, Position, MajorRadius, MinorRadius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Position);
+    ;
+    args.push(this.MajorRadius);
+    ;
+    args.push(this.MinorRadius);
+    ;
+    return args;
+  }
+};
+var IfcTransformer = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTransformer(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTransformerType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTransformerType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTransitionCurveSegment2D = class {
+  constructor(expressID, type, StartPoint, StartDirection, SegmentLength, StartRadius, EndRadius, IsStartRadiusCCW, IsEndRadiusCCW, TransitionCurveType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.StartPoint = StartPoint;
+    this.StartDirection = StartDirection;
+    this.SegmentLength = SegmentLength;
+    this.StartRadius = StartRadius;
+    this.EndRadius = EndRadius;
+    this.IsStartRadiusCCW = IsStartRadiusCCW;
+    this.IsEndRadiusCCW = IsEndRadiusCCW;
+    this.TransitionCurveType = TransitionCurveType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let StartPoint = tape[ptr++];
+    let StartDirection = tape[ptr++];
+    let SegmentLength = tape[ptr++];
+    let StartRadius = tape[ptr++];
+    let EndRadius = tape[ptr++];
+    let IsStartRadiusCCW = tape[ptr++];
+    let IsEndRadiusCCW = tape[ptr++];
+    let TransitionCurveType = tape[ptr++];
+    return new IfcTransitionCurveSegment2D(expressID, type, StartPoint, StartDirection, SegmentLength, StartRadius, EndRadius, IsStartRadiusCCW, IsEndRadiusCCW, TransitionCurveType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.StartPoint);
+    ;
+    args.push(this.StartDirection);
+    ;
+    args.push(this.SegmentLength);
+    ;
+    args.push(this.StartRadius);
+    ;
+    args.push(this.EndRadius);
+    ;
+    args.push(this.IsStartRadiusCCW);
+    ;
+    args.push(this.IsEndRadiusCCW);
+    ;
+    args.push(this.TransitionCurveType);
+    ;
+    return args;
+  }
+};
+var IfcTransportElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTransportElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTransportElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTransportElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTrapeziumProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, BottomXDim, TopXDim, YDim, TopXOffset) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.BottomXDim = BottomXDim;
+    this.TopXDim = TopXDim;
+    this.YDim = YDim;
+    this.TopXOffset = TopXOffset;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let BottomXDim = tape[ptr++];
+    let TopXDim = tape[ptr++];
+    let YDim = tape[ptr++];
+    let TopXOffset = tape[ptr++];
+    return new IfcTrapeziumProfileDef(expressID, type, ProfileType, ProfileName, Position, BottomXDim, TopXDim, YDim, TopXOffset);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.BottomXDim);
+    ;
+    args.push(this.TopXDim);
+    ;
+    args.push(this.YDim);
+    ;
+    args.push(this.TopXOffset);
+    ;
+    return args;
+  }
+};
+var IfcTriangulatedFaceSet = class {
+  constructor(expressID, type, Coordinates, Normals, Closed, CoordIndex, PnIndex) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Coordinates = Coordinates;
+    this.Normals = Normals;
+    this.Closed = Closed;
+    this.CoordIndex = CoordIndex;
+    this.PnIndex = PnIndex;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Coordinates = tape[ptr++];
+    let Normals = tape[ptr++];
+    let Closed = tape[ptr++];
+    let CoordIndex = tape[ptr++];
+    let PnIndex = tape[ptr++];
+    return new IfcTriangulatedFaceSet(expressID, type, Coordinates, Normals, Closed, CoordIndex, PnIndex);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Coordinates);
+    ;
+    args.push(this.Normals);
+    ;
+    args.push(this.Closed);
+    ;
+    args.push(this.CoordIndex);
+    ;
+    args.push(this.PnIndex);
+    ;
+    return args;
+  }
+};
+var IfcTriangulatedIrregularNetwork = class {
+  constructor(expressID, type, Coordinates, Normals, Closed, CoordIndex, PnIndex, Flags) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Coordinates = Coordinates;
+    this.Normals = Normals;
+    this.Closed = Closed;
+    this.CoordIndex = CoordIndex;
+    this.PnIndex = PnIndex;
+    this.Flags = Flags;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Coordinates = tape[ptr++];
+    let Normals = tape[ptr++];
+    let Closed = tape[ptr++];
+    let CoordIndex = tape[ptr++];
+    let PnIndex = tape[ptr++];
+    let Flags = tape[ptr++];
+    return new IfcTriangulatedIrregularNetwork(expressID, type, Coordinates, Normals, Closed, CoordIndex, PnIndex, Flags);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Coordinates);
+    ;
+    args.push(this.Normals);
+    ;
+    args.push(this.Closed);
+    ;
+    args.push(this.CoordIndex);
+    ;
+    args.push(this.PnIndex);
+    ;
+    args.push(this.Flags);
+    ;
+    return args;
+  }
+};
+var IfcTrimmedCurve = class {
+  constructor(expressID, type, BasisCurve, Trim1, Trim2, SenseAgreement, MasterRepresentation) {
+    this.expressID = expressID;
+    this.type = type;
+    this.BasisCurve = BasisCurve;
+    this.Trim1 = Trim1;
+    this.Trim2 = Trim2;
+    this.SenseAgreement = SenseAgreement;
+    this.MasterRepresentation = MasterRepresentation;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let BasisCurve = tape[ptr++];
+    let Trim1 = tape[ptr++];
+    let Trim2 = tape[ptr++];
+    let SenseAgreement = tape[ptr++];
+    let MasterRepresentation = tape[ptr++];
+    return new IfcTrimmedCurve(expressID, type, BasisCurve, Trim1, Trim2, SenseAgreement, MasterRepresentation);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.BasisCurve);
+    ;
+    args.push(this.Trim1);
+    ;
+    args.push(this.Trim2);
+    ;
+    args.push(this.SenseAgreement);
+    ;
+    args.push(this.MasterRepresentation);
+    ;
+    return args;
+  }
+};
+var IfcTubeBundle = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTubeBundle(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTubeBundleType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcTubeBundleType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcTypeObject = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    return new IfcTypeObject(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    return args;
+  }
+};
+var IfcTypeProcess = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.ProcessType = ProcessType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let ProcessType = tape[ptr++];
+    return new IfcTypeProcess(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ProcessType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.ProcessType);
+    ;
+    return args;
+  }
+};
+var IfcTypeProduct = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcTypeProduct(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcTypeResource = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.Identification = Identification;
+    this.LongDescription = LongDescription;
+    this.ResourceType = ResourceType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let Identification = tape[ptr++];
+    let LongDescription = tape[ptr++];
+    let ResourceType = tape[ptr++];
+    return new IfcTypeResource(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, Identification, LongDescription, ResourceType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.LongDescription);
+    ;
+    args.push(this.ResourceType);
+    ;
+    return args;
+  }
+};
+var IfcUShapeProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, Depth, FlangeWidth, WebThickness, FlangeThickness, FilletRadius, EdgeRadius, FlangeSlope) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.Depth = Depth;
+    this.FlangeWidth = FlangeWidth;
+    this.WebThickness = WebThickness;
+    this.FlangeThickness = FlangeThickness;
+    this.FilletRadius = FilletRadius;
+    this.EdgeRadius = EdgeRadius;
+    this.FlangeSlope = FlangeSlope;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let Depth = tape[ptr++];
+    let FlangeWidth = tape[ptr++];
+    let WebThickness = tape[ptr++];
+    let FlangeThickness = tape[ptr++];
+    let FilletRadius = tape[ptr++];
+    let EdgeRadius = tape[ptr++];
+    let FlangeSlope = tape[ptr++];
+    return new IfcUShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, Depth, FlangeWidth, WebThickness, FlangeThickness, FilletRadius, EdgeRadius, FlangeSlope);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Depth);
+    ;
+    args.push(this.FlangeWidth);
+    ;
+    args.push(this.WebThickness);
+    ;
+    args.push(this.FlangeThickness);
+    ;
+    args.push(this.FilletRadius);
+    ;
+    args.push(this.EdgeRadius);
+    ;
+    args.push(this.FlangeSlope);
+    ;
+    return args;
+  }
+};
+var IfcUnitAssignment = class {
+  constructor(expressID, type, Units) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Units = Units;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Units = tape[ptr++];
+    return new IfcUnitAssignment(expressID, type, Units);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Units);
+    ;
+    return args;
+  }
+};
+var IfcUnitaryControlElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcUnitaryControlElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcUnitaryControlElementType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcUnitaryControlElementType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcUnitaryEquipment = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcUnitaryEquipment(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcUnitaryEquipmentType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcUnitaryEquipmentType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcValve = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcValve(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcValveType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcValveType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcVector = class {
+  constructor(expressID, type, Orientation, Magnitude) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Orientation = Orientation;
+    this.Magnitude = Magnitude;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Orientation = tape[ptr++];
+    let Magnitude = tape[ptr++];
+    return new IfcVector(expressID, type, Orientation, Magnitude);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Orientation);
+    ;
+    args.push(this.Magnitude);
+    ;
+    return args;
+  }
+};
+var IfcVertex = class {
+  constructor(expressID, type) {
+    this.expressID = expressID;
+    this.type = type;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    return new IfcVertex(expressID, type);
+  }
+  ToTape() {
+    let args = [];
+    return args;
+  }
+};
+var IfcVertexLoop = class {
+  constructor(expressID, type, LoopVertex) {
+    this.expressID = expressID;
+    this.type = type;
+    this.LoopVertex = LoopVertex;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let LoopVertex = tape[ptr++];
+    return new IfcVertexLoop(expressID, type, LoopVertex);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.LoopVertex);
+    ;
+    return args;
+  }
+};
+var IfcVertexPoint = class {
+  constructor(expressID, type, VertexGeometry) {
+    this.expressID = expressID;
+    this.type = type;
+    this.VertexGeometry = VertexGeometry;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let VertexGeometry = tape[ptr++];
+    return new IfcVertexPoint(expressID, type, VertexGeometry);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.VertexGeometry);
+    ;
+    return args;
+  }
+};
+var IfcVibrationDamper = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcVibrationDamper(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcVibrationDamperType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcVibrationDamperType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcVibrationIsolator = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcVibrationIsolator(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcVibrationIsolatorType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcVibrationIsolatorType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcVirtualElement = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    return new IfcVirtualElement(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    return args;
+  }
+};
+var IfcVirtualGridIntersection = class {
+  constructor(expressID, type, IntersectingAxes, OffsetDistances) {
+    this.expressID = expressID;
+    this.type = type;
+    this.IntersectingAxes = IntersectingAxes;
+    this.OffsetDistances = OffsetDistances;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let IntersectingAxes = tape[ptr++];
+    let OffsetDistances = tape[ptr++];
+    return new IfcVirtualGridIntersection(expressID, type, IntersectingAxes, OffsetDistances);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.IntersectingAxes);
+    ;
+    args.push(this.OffsetDistances);
+    ;
+    return args;
+  }
+};
+var IfcVoidingFeature = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcVoidingFeature(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcWall = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcWall(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcWallElementedCase = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcWallElementedCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcWallStandardCase = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcWallStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcWallType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcWallType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcWasteTerminal = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcWasteTerminal(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcWasteTerminalType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcWasteTerminalType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcWindow = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, PartitioningType, UserDefinedPartitioningType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.OverallHeight = OverallHeight;
+    this.OverallWidth = OverallWidth;
+    this.PredefinedType = PredefinedType;
+    this.PartitioningType = PartitioningType;
+    this.UserDefinedPartitioningType = UserDefinedPartitioningType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let OverallHeight = tape[ptr++];
+    let OverallWidth = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let PartitioningType = tape[ptr++];
+    let UserDefinedPartitioningType = tape[ptr++];
+    return new IfcWindow(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, PartitioningType, UserDefinedPartitioningType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.OverallHeight);
+    ;
+    args.push(this.OverallWidth);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.PartitioningType);
+    ;
+    args.push(this.UserDefinedPartitioningType);
+    ;
+    return args;
+  }
+};
+var IfcWindowLiningProperties = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, LiningDepth, LiningThickness, TransomThickness, MullionThickness, FirstTransomOffset, SecondTransomOffset, FirstMullionOffset, SecondMullionOffset, ShapeAspectStyle, LiningOffset, LiningToPanelOffsetX, LiningToPanelOffsetY) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.LiningDepth = LiningDepth;
+    this.LiningThickness = LiningThickness;
+    this.TransomThickness = TransomThickness;
+    this.MullionThickness = MullionThickness;
+    this.FirstTransomOffset = FirstTransomOffset;
+    this.SecondTransomOffset = SecondTransomOffset;
+    this.FirstMullionOffset = FirstMullionOffset;
+    this.SecondMullionOffset = SecondMullionOffset;
+    this.ShapeAspectStyle = ShapeAspectStyle;
+    this.LiningOffset = LiningOffset;
+    this.LiningToPanelOffsetX = LiningToPanelOffsetX;
+    this.LiningToPanelOffsetY = LiningToPanelOffsetY;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let LiningDepth = tape[ptr++];
+    let LiningThickness = tape[ptr++];
+    let TransomThickness = tape[ptr++];
+    let MullionThickness = tape[ptr++];
+    let FirstTransomOffset = tape[ptr++];
+    let SecondTransomOffset = tape[ptr++];
+    let FirstMullionOffset = tape[ptr++];
+    let SecondMullionOffset = tape[ptr++];
+    let ShapeAspectStyle = tape[ptr++];
+    let LiningOffset = tape[ptr++];
+    let LiningToPanelOffsetX = tape[ptr++];
+    let LiningToPanelOffsetY = tape[ptr++];
+    return new IfcWindowLiningProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, LiningDepth, LiningThickness, TransomThickness, MullionThickness, FirstTransomOffset, SecondTransomOffset, FirstMullionOffset, SecondMullionOffset, ShapeAspectStyle, LiningOffset, LiningToPanelOffsetX, LiningToPanelOffsetY);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.LiningDepth);
+    ;
+    args.push(this.LiningThickness);
+    ;
+    args.push(this.TransomThickness);
+    ;
+    args.push(this.MullionThickness);
+    ;
+    args.push(this.FirstTransomOffset);
+    ;
+    args.push(this.SecondTransomOffset);
+    ;
+    args.push(this.FirstMullionOffset);
+    ;
+    args.push(this.SecondMullionOffset);
+    ;
+    args.push(this.ShapeAspectStyle);
+    ;
+    args.push(this.LiningOffset);
+    ;
+    args.push(this.LiningToPanelOffsetX);
+    ;
+    args.push(this.LiningToPanelOffsetY);
+    ;
+    return args;
+  }
+};
+var IfcWindowPanelProperties = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, OperationType, PanelPosition, FrameDepth, FrameThickness, ShapeAspectStyle) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.OperationType = OperationType;
+    this.PanelPosition = PanelPosition;
+    this.FrameDepth = FrameDepth;
+    this.FrameThickness = FrameThickness;
+    this.ShapeAspectStyle = ShapeAspectStyle;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let OperationType = tape[ptr++];
+    let PanelPosition = tape[ptr++];
+    let FrameDepth = tape[ptr++];
+    let FrameThickness = tape[ptr++];
+    let ShapeAspectStyle = tape[ptr++];
+    return new IfcWindowPanelProperties(expressID, type, GlobalId, OwnerHistory, Name, Description, OperationType, PanelPosition, FrameDepth, FrameThickness, ShapeAspectStyle);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.OperationType);
+    ;
+    args.push(this.PanelPosition);
+    ;
+    args.push(this.FrameDepth);
+    ;
+    args.push(this.FrameThickness);
+    ;
+    args.push(this.ShapeAspectStyle);
+    ;
+    return args;
+  }
+};
+var IfcWindowStandardCase = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, PartitioningType, UserDefinedPartitioningType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.ObjectPlacement = ObjectPlacement;
+    this.Representation = Representation;
+    this.Tag = Tag;
+    this.OverallHeight = OverallHeight;
+    this.OverallWidth = OverallWidth;
+    this.PredefinedType = PredefinedType;
+    this.PartitioningType = PartitioningType;
+    this.UserDefinedPartitioningType = UserDefinedPartitioningType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let ObjectPlacement = tape[ptr++];
+    let Representation = tape[ptr++];
+    let Tag = tape[ptr++];
+    let OverallHeight = tape[ptr++];
+    let OverallWidth = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let PartitioningType = tape[ptr++];
+    let UserDefinedPartitioningType = tape[ptr++];
+    return new IfcWindowStandardCase(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, OverallHeight, OverallWidth, PredefinedType, PartitioningType, UserDefinedPartitioningType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.ObjectPlacement);
+    ;
+    args.push(this.Representation);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.OverallHeight);
+    ;
+    args.push(this.OverallWidth);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.PartitioningType);
+    ;
+    args.push(this.UserDefinedPartitioningType);
+    ;
+    return args;
+  }
+};
+var IfcWindowStyle = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ConstructionType, OperationType, ParameterTakesPrecedence, Sizeable) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ConstructionType = ConstructionType;
+    this.OperationType = OperationType;
+    this.ParameterTakesPrecedence = ParameterTakesPrecedence;
+    this.Sizeable = Sizeable;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ConstructionType = tape[ptr++];
+    let OperationType = tape[ptr++];
+    let ParameterTakesPrecedence = tape[ptr++];
+    let Sizeable = tape[ptr++];
+    return new IfcWindowStyle(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ConstructionType, OperationType, ParameterTakesPrecedence, Sizeable);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ConstructionType);
+    ;
+    args.push(this.OperationType);
+    ;
+    args.push(this.ParameterTakesPrecedence);
+    ;
+    args.push(this.Sizeable);
+    ;
+    return args;
+  }
+};
+var IfcWindowType = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, PartitioningType, ParameterTakesPrecedence, UserDefinedPartitioningType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ApplicableOccurrence = ApplicableOccurrence;
+    this.HasPropertySets = HasPropertySets;
+    this.RepresentationMaps = RepresentationMaps;
+    this.Tag = Tag;
+    this.ElementType = ElementType;
+    this.PredefinedType = PredefinedType;
+    this.PartitioningType = PartitioningType;
+    this.ParameterTakesPrecedence = ParameterTakesPrecedence;
+    this.UserDefinedPartitioningType = UserDefinedPartitioningType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ApplicableOccurrence = tape[ptr++];
+    let HasPropertySets = tape[ptr++];
+    let RepresentationMaps = tape[ptr++];
+    let Tag = tape[ptr++];
+    let ElementType = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    let PartitioningType = tape[ptr++];
+    let ParameterTakesPrecedence = tape[ptr++];
+    let UserDefinedPartitioningType = tape[ptr++];
+    return new IfcWindowType(expressID, type, GlobalId, OwnerHistory, Name, Description, ApplicableOccurrence, HasPropertySets, RepresentationMaps, Tag, ElementType, PredefinedType, PartitioningType, ParameterTakesPrecedence, UserDefinedPartitioningType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ApplicableOccurrence);
+    ;
+    args.push(this.HasPropertySets);
+    ;
+    args.push(this.RepresentationMaps);
+    ;
+    args.push(this.Tag);
+    ;
+    args.push(this.ElementType);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    args.push(this.PartitioningType);
+    ;
+    args.push(this.ParameterTakesPrecedence);
+    ;
+    args.push(this.UserDefinedPartitioningType);
+    ;
+    return args;
+  }
+};
+var IfcWorkCalendar = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, WorkingTimes, ExceptionTimes, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.WorkingTimes = WorkingTimes;
+    this.ExceptionTimes = ExceptionTimes;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let WorkingTimes = tape[ptr++];
+    let ExceptionTimes = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcWorkCalendar(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, WorkingTimes, ExceptionTimes, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.WorkingTimes);
+    ;
+    args.push(this.ExceptionTimes);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcWorkControl = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, CreationDate, Creators, Purpose, Duration, TotalFloat, StartTime, FinishTime) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.CreationDate = CreationDate;
+    this.Creators = Creators;
+    this.Purpose = Purpose;
+    this.Duration = Duration;
+    this.TotalFloat = TotalFloat;
+    this.StartTime = StartTime;
+    this.FinishTime = FinishTime;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let CreationDate = tape[ptr++];
+    let Creators = tape[ptr++];
+    let Purpose = tape[ptr++];
+    let Duration = tape[ptr++];
+    let TotalFloat = tape[ptr++];
+    let StartTime = tape[ptr++];
+    let FinishTime = tape[ptr++];
+    return new IfcWorkControl(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, CreationDate, Creators, Purpose, Duration, TotalFloat, StartTime, FinishTime);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.CreationDate);
+    ;
+    args.push(this.Creators);
+    ;
+    args.push(this.Purpose);
+    ;
+    args.push(this.Duration);
+    ;
+    args.push(this.TotalFloat);
+    ;
+    args.push(this.StartTime);
+    ;
+    args.push(this.FinishTime);
+    ;
+    return args;
+  }
+};
+var IfcWorkPlan = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, CreationDate, Creators, Purpose, Duration, TotalFloat, StartTime, FinishTime, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.CreationDate = CreationDate;
+    this.Creators = Creators;
+    this.Purpose = Purpose;
+    this.Duration = Duration;
+    this.TotalFloat = TotalFloat;
+    this.StartTime = StartTime;
+    this.FinishTime = FinishTime;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let CreationDate = tape[ptr++];
+    let Creators = tape[ptr++];
+    let Purpose = tape[ptr++];
+    let Duration = tape[ptr++];
+    let TotalFloat = tape[ptr++];
+    let StartTime = tape[ptr++];
+    let FinishTime = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcWorkPlan(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, CreationDate, Creators, Purpose, Duration, TotalFloat, StartTime, FinishTime, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.CreationDate);
+    ;
+    args.push(this.Creators);
+    ;
+    args.push(this.Purpose);
+    ;
+    args.push(this.Duration);
+    ;
+    args.push(this.TotalFloat);
+    ;
+    args.push(this.StartTime);
+    ;
+    args.push(this.FinishTime);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcWorkSchedule = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, CreationDate, Creators, Purpose, Duration, TotalFloat, StartTime, FinishTime, PredefinedType) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.Identification = Identification;
+    this.CreationDate = CreationDate;
+    this.Creators = Creators;
+    this.Purpose = Purpose;
+    this.Duration = Duration;
+    this.TotalFloat = TotalFloat;
+    this.StartTime = StartTime;
+    this.FinishTime = FinishTime;
+    this.PredefinedType = PredefinedType;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let Identification = tape[ptr++];
+    let CreationDate = tape[ptr++];
+    let Creators = tape[ptr++];
+    let Purpose = tape[ptr++];
+    let Duration = tape[ptr++];
+    let TotalFloat = tape[ptr++];
+    let StartTime = tape[ptr++];
+    let FinishTime = tape[ptr++];
+    let PredefinedType = tape[ptr++];
+    return new IfcWorkSchedule(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, Identification, CreationDate, Creators, Purpose, Duration, TotalFloat, StartTime, FinishTime, PredefinedType);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.Identification);
+    ;
+    args.push(this.CreationDate);
+    ;
+    args.push(this.Creators);
+    ;
+    args.push(this.Purpose);
+    ;
+    args.push(this.Duration);
+    ;
+    args.push(this.TotalFloat);
+    ;
+    args.push(this.StartTime);
+    ;
+    args.push(this.FinishTime);
+    ;
+    args.push(this.PredefinedType);
+    ;
+    return args;
+  }
+};
+var IfcWorkTime = class {
+  constructor(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, RecurrencePattern, Start, Finish) {
+    this.expressID = expressID;
+    this.type = type;
+    this.Name = Name;
+    this.DataOrigin = DataOrigin;
+    this.UserDefinedDataOrigin = UserDefinedDataOrigin;
+    this.RecurrencePattern = RecurrencePattern;
+    this.Start = Start;
+    this.Finish = Finish;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let Name = tape[ptr++];
+    let DataOrigin = tape[ptr++];
+    let UserDefinedDataOrigin = tape[ptr++];
+    let RecurrencePattern = tape[ptr++];
+    let Start = tape[ptr++];
+    let Finish = tape[ptr++];
+    return new IfcWorkTime(expressID, type, Name, DataOrigin, UserDefinedDataOrigin, RecurrencePattern, Start, Finish);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.Name);
+    ;
+    args.push(this.DataOrigin);
+    ;
+    args.push(this.UserDefinedDataOrigin);
+    ;
+    args.push(this.RecurrencePattern);
+    ;
+    args.push(this.Start);
+    ;
+    args.push(this.Finish);
+    ;
+    return args;
+  }
+};
+var IfcZShapeProfileDef = class {
+  constructor(expressID, type, ProfileType, ProfileName, Position, Depth, FlangeWidth, WebThickness, FlangeThickness, FilletRadius, EdgeRadius) {
+    this.expressID = expressID;
+    this.type = type;
+    this.ProfileType = ProfileType;
+    this.ProfileName = ProfileName;
+    this.Position = Position;
+    this.Depth = Depth;
+    this.FlangeWidth = FlangeWidth;
+    this.WebThickness = WebThickness;
+    this.FlangeThickness = FlangeThickness;
+    this.FilletRadius = FilletRadius;
+    this.EdgeRadius = EdgeRadius;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let ProfileType = tape[ptr++];
+    let ProfileName = tape[ptr++];
+    let Position = tape[ptr++];
+    let Depth = tape[ptr++];
+    let FlangeWidth = tape[ptr++];
+    let WebThickness = tape[ptr++];
+    let FlangeThickness = tape[ptr++];
+    let FilletRadius = tape[ptr++];
+    let EdgeRadius = tape[ptr++];
+    return new IfcZShapeProfileDef(expressID, type, ProfileType, ProfileName, Position, Depth, FlangeWidth, WebThickness, FlangeThickness, FilletRadius, EdgeRadius);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.ProfileType);
+    ;
+    args.push(this.ProfileName);
+    ;
+    args.push(this.Position);
+    ;
+    args.push(this.Depth);
+    ;
+    args.push(this.FlangeWidth);
+    ;
+    args.push(this.WebThickness);
+    ;
+    args.push(this.FlangeThickness);
+    ;
+    args.push(this.FilletRadius);
+    ;
+    args.push(this.EdgeRadius);
+    ;
+    return args;
+  }
+};
+var IfcZone = class {
+  constructor(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName) {
+    this.expressID = expressID;
+    this.type = type;
+    this.GlobalId = GlobalId;
+    this.OwnerHistory = OwnerHistory;
+    this.Name = Name;
+    this.Description = Description;
+    this.ObjectType = ObjectType;
+    this.LongName = LongName;
+  }
+  static FromTape(expressID, type, tape) {
+    let ptr = 0;
+    let GlobalId = tape[ptr++];
+    let OwnerHistory = tape[ptr++];
+    let Name = tape[ptr++];
+    let Description = tape[ptr++];
+    let ObjectType = tape[ptr++];
+    let LongName = tape[ptr++];
+    return new IfcZone(expressID, type, GlobalId, OwnerHistory, Name, Description, ObjectType, LongName);
+  }
+  ToTape() {
+    let args = [];
+    args.push(this.GlobalId);
+    ;
+    args.push(this.OwnerHistory);
+    ;
+    args.push(this.Name);
+    ;
+    args.push(this.Description);
+    ;
+    args.push(this.ObjectType);
+    ;
+    args.push(this.LongName);
+    ;
+    return args;
+  }
+};
+
+// dist/web-ifc-api.ts
+var WebIFCWasm = require_web_ifc();
+var UNKNOWN = 0;
+var STRING = 1;
+var LABEL = 2;
+var ENUM = 3;
+var REAL = 4;
+var REF = 5;
+var EMPTY = 6;
+var SET_BEGIN = 7;
+var SET_END = 8;
+var LINE_END = 9;
+function ms() {
+  return new Date().getTime();
+}
+var IfcAPI = class {
+  constructor() {
+    this.wasmModule = void 0;
+    this.fs = void 0;
+  }
+  async Init() {
+    if (WebIFCWasm) {
+      this.wasmModule = await WebIFCWasm({noInitialRun: true});
+      this.fs = this.wasmModule.FS;
+    } else {
+      console.error(`Could not find wasm module at './web-ifc' from web-ifc-api.ts`);
+    }
+  }
+  OpenModel(filename, data) {
+    this.wasmModule["FS_createDataFile"]("/", "filename", data, true, true, true);
+    let result = this.wasmModule.OpenModel(filename);
+    this.wasmModule["FS_unlink"]("/filename");
+    return result;
+  }
+  ExportFileAsIFC(modelID) {
+    this.wasmModule.ExportFileAsIFC(modelID);
+    let result = this.fs.readFile("/export.ifc");
+    this.wasmModule["FS_unlink"]("/export.ifc");
+    return result;
+  }
+  GetGeometry(modelID, geometryExpressID) {
+    return this.wasmModule.GetGeometry(modelID, geometryExpressID);
+  }
+  GetLine(modelID, expressID, flatten = false) {
+    let rawLineData = this.GetRawLineData(modelID, expressID);
+    let lineData = FromRawLineData[rawLineData.type](rawLineData);
+    if (flatten) {
+      this.FlattenLine(modelID, lineData);
+    }
+    return lineData;
+  }
+  WriteLine(modelID, lineObject) {
+    Object.keys(lineObject).forEach((propertyName) => {
+      let property = lineObject[propertyName];
+      if (property && property.expressID !== void 0) {
+        this.WriteLine(modelID, property);
+        lineObject[propertyName] = {
+          type: 5,
+          value: property.expressID
+        };
+      } else if (Array.isArray(property) && property.length > 0) {
+        for (let i = 0; i < property.length; i++) {
+          if (property[i].expressID !== void 0) {
+            this.WriteLine(modelID, property[i]);
+            lineObject[propertyName][i] = {
+              type: 5,
+              value: property[i].expressID
+            };
+          }
+        }
+      }
+    });
+    let rawLineData = {
+      ID: lineObject.expressID,
+      type: lineObject.type,
+      arguments: lineObject.ToTape()
+    };
+    this.WriteRawLineData(modelID, rawLineData);
+  }
+  FlattenLine(modelID, line) {
+    Object.keys(line).forEach((propertyName) => {
+      let property = line[propertyName];
+      if (property && property.type === 5) {
+        line[propertyName] = this.GetLine(modelID, property.value, true);
+      } else if (Array.isArray(property) && property.length > 0 && property[0].type === 5) {
+        for (let i = 0; i < property.length; i++) {
+          line[propertyName][i] = this.GetLine(modelID, property[i].value, true);
+        }
+      }
+    });
+  }
+  GetRawLineData(modelID, expressID) {
+    return this.wasmModule.GetLine(modelID, expressID);
+  }
+  WriteRawLineData(modelID, data) {
+    return this.wasmModule.WriteLine(modelID, data.ID, data.type, data.arguments);
+  }
+  GetLineIDsWithType(modelID, type) {
+    return this.wasmModule.GetLineIDsWithType(modelID, type);
+  }
+  GetAllLines(modelID) {
+    return this.wasmModule.GetAllLines(modelID);
+  }
+  SetGeometryTransformation(modelID, transformationMatrix) {
+    if (transformationMatrix.length != 16) {
+      console.log(`Bad transformation matrix size: ${transformationMatrix.length}`);
+      return;
+    }
+    this.wasmModule.SetGeometryTransformation(modelID, transformationMatrix);
+  }
+  GetVertexArray(ptr, size) {
+    return this.getSubArray(this.wasmModule.HEAPF32, ptr, size);
+  }
+  GetIndexArray(ptr, size) {
+    return this.getSubArray(this.wasmModule.HEAPU32, ptr, size);
+  }
+  getSubArray(heap, startPtr, sizeBytes) {
+    return heap.subarray(startPtr / 4, startPtr / 4 + sizeBytes).slice(0);
+  }
+  CloseModel(modelID) {
+    this.wasmModule.CloseModel(modelID);
+  }
+  IsModelOpen(modelID) {
+    return this.wasmModule.IsModelOpen(modelID);
+  }
+  LoadAllGeometry(modelID) {
+    return this.wasmModule.LoadAllGeometry(modelID);
+  }
+  SetWasmPath(path) {
+    WasmPath = path;
+  }
+};
+export {
+  EMPTY,
+  ENUM,
+  FromRawLineData,
+  Handle,
+  IFCACTIONREQUEST,
+  IFCACTOR,
+  IFCACTORROLE,
+  IFCACTUATOR,
+  IFCACTUATORTYPE,
+  IFCADDRESS,
+  IFCADVANCEDBREP,
+  IFCADVANCEDBREPWITHVOIDS,
+  IFCADVANCEDFACE,
+  IFCAIRTERMINAL,
+  IFCAIRTERMINALBOX,
+  IFCAIRTERMINALBOXTYPE,
+  IFCAIRTERMINALTYPE,
+  IFCAIRTOAIRHEATRECOVERY,
+  IFCAIRTOAIRHEATRECOVERYTYPE,
+  IFCALARM,
+  IFCALARMTYPE,
+  IFCALIGNMENT,
+  IFCALIGNMENT2DHORIZONTAL,
+  IFCALIGNMENT2DHORIZONTALSEGMENT,
+  IFCALIGNMENT2DSEGMENT,
+  IFCALIGNMENT2DVERSEGCIRCULARARC,
+  IFCALIGNMENT2DVERSEGLINE,
+  IFCALIGNMENT2DVERSEGPARABOLICARC,
+  IFCALIGNMENT2DVERTICAL,
+  IFCALIGNMENT2DVERTICALSEGMENT,
+  IFCALIGNMENTCURVE,
+  IFCANNOTATION,
+  IFCANNOTATIONFILLAREA,
+  IFCAPPLICATION,
+  IFCAPPLIEDVALUE,
+  IFCAPPROVAL,
+  IFCAPPROVALRELATIONSHIP,
+  IFCARBITRARYCLOSEDPROFILEDEF,
+  IFCARBITRARYOPENPROFILEDEF,
+  IFCARBITRARYPROFILEDEFWITHVOIDS,
+  IFCASSET,
+  IFCASYMMETRICISHAPEPROFILEDEF,
+  IFCAUDIOVISUALAPPLIANCE,
+  IFCAUDIOVISUALAPPLIANCETYPE,
+  IFCAXIS1PLACEMENT,
+  IFCAXIS2PLACEMENT2D,
+  IFCAXIS2PLACEMENT3D,
+  IFCBEAM,
+  IFCBEAMSTANDARDCASE,
+  IFCBEAMTYPE,
+  IFCBEARING,
+  IFCBEARINGTYPE,
+  IFCBLOBTEXTURE,
+  IFCBLOCK,
+  IFCBOILER,
+  IFCBOILERTYPE,
+  IFCBOOLEANCLIPPINGRESULT,
+  IFCBOOLEANRESULT,
+  IFCBOUNDARYCONDITION,
+  IFCBOUNDARYCURVE,
+  IFCBOUNDARYEDGECONDITION,
+  IFCBOUNDARYFACECONDITION,
+  IFCBOUNDARYNODECONDITION,
+  IFCBOUNDARYNODECONDITIONWARPING,
+  IFCBOUNDEDCURVE,
+  IFCBOUNDEDSURFACE,
+  IFCBOUNDINGBOX,
+  IFCBOXEDHALFSPACE,
+  IFCBRIDGE,
+  IFCBRIDGEPART,
+  IFCBSPLINECURVE,
+  IFCBSPLINECURVEWITHKNOTS,
+  IFCBSPLINESURFACE,
+  IFCBSPLINESURFACEWITHKNOTS,
+  IFCBUILDING,
+  IFCBUILDINGELEMENT,
+  IFCBUILDINGELEMENTPART,
+  IFCBUILDINGELEMENTPARTTYPE,
+  IFCBUILDINGELEMENTPROXY,
+  IFCBUILDINGELEMENTPROXYTYPE,
+  IFCBUILDINGELEMENTTYPE,
+  IFCBUILDINGSTOREY,
+  IFCBUILDINGSYSTEM,
+  IFCBURNER,
+  IFCBURNERTYPE,
+  IFCCABLECARRIERFITTING,
+  IFCCABLECARRIERFITTINGTYPE,
+  IFCCABLECARRIERSEGMENT,
+  IFCCABLECARRIERSEGMENTTYPE,
+  IFCCABLEFITTING,
+  IFCCABLEFITTINGTYPE,
+  IFCCABLESEGMENT,
+  IFCCABLESEGMENTTYPE,
+  IFCCAISSONFOUNDATION,
+  IFCCAISSONFOUNDATIONTYPE,
+  IFCCARTESIANPOINT,
+  IFCCARTESIANPOINTLIST,
+  IFCCARTESIANPOINTLIST2D,
+  IFCCARTESIANPOINTLIST3D,
+  IFCCARTESIANTRANSFORMATIONOPERATOR,
+  IFCCARTESIANTRANSFORMATIONOPERATOR2D,
+  IFCCARTESIANTRANSFORMATIONOPERATOR2DNONUNIFORM,
+  IFCCARTESIANTRANSFORMATIONOPERATOR3D,
+  IFCCARTESIANTRANSFORMATIONOPERATOR3DNONUNIFORM,
+  IFCCENTERLINEPROFILEDEF,
+  IFCCHILLER,
+  IFCCHILLERTYPE,
+  IFCCHIMNEY,
+  IFCCHIMNEYTYPE,
+  IFCCIRCLE,
+  IFCCIRCLEHOLLOWPROFILEDEF,
+  IFCCIRCLEPROFILEDEF,
+  IFCCIRCULARARCSEGMENT2D,
+  IFCCIVILELEMENT,
+  IFCCIVILELEMENTTYPE,
+  IFCCLASSIFICATION,
+  IFCCLASSIFICATIONREFERENCE,
+  IFCCLOSEDSHELL,
+  IFCCOIL,
+  IFCCOILTYPE,
+  IFCCOLOURRGB,
+  IFCCOLOURRGBLIST,
+  IFCCOLOURSPECIFICATION,
+  IFCCOLUMN,
+  IFCCOLUMNSTANDARDCASE,
+  IFCCOLUMNTYPE,
+  IFCCOMMUNICATIONSAPPLIANCE,
+  IFCCOMMUNICATIONSAPPLIANCETYPE,
+  IFCCOMPLEXPROPERTY,
+  IFCCOMPLEXPROPERTYTEMPLATE,
+  IFCCOMPOSITECURVE,
+  IFCCOMPOSITECURVEONSURFACE,
+  IFCCOMPOSITECURVESEGMENT,
+  IFCCOMPOSITEPROFILEDEF,
+  IFCCOMPRESSOR,
+  IFCCOMPRESSORTYPE,
+  IFCCONDENSER,
+  IFCCONDENSERTYPE,
+  IFCCONIC,
+  IFCCONNECTEDFACESET,
+  IFCCONNECTIONCURVEGEOMETRY,
+  IFCCONNECTIONGEOMETRY,
+  IFCCONNECTIONPOINTECCENTRICITY,
+  IFCCONNECTIONPOINTGEOMETRY,
+  IFCCONNECTIONSURFACEGEOMETRY,
+  IFCCONNECTIONVOLUMEGEOMETRY,
+  IFCCONSTRAINT,
+  IFCCONSTRUCTIONEQUIPMENTRESOURCE,
+  IFCCONSTRUCTIONEQUIPMENTRESOURCETYPE,
+  IFCCONSTRUCTIONMATERIALRESOURCE,
+  IFCCONSTRUCTIONMATERIALRESOURCETYPE,
+  IFCCONSTRUCTIONPRODUCTRESOURCE,
+  IFCCONSTRUCTIONPRODUCTRESOURCETYPE,
+  IFCCONSTRUCTIONRESOURCE,
+  IFCCONSTRUCTIONRESOURCETYPE,
+  IFCCONTEXT,
+  IFCCONTEXTDEPENDENTUNIT,
+  IFCCONTROL,
+  IFCCONTROLLER,
+  IFCCONTROLLERTYPE,
+  IFCCONVERSIONBASEDUNIT,
+  IFCCONVERSIONBASEDUNITWITHOFFSET,
+  IFCCOOLEDBEAM,
+  IFCCOOLEDBEAMTYPE,
+  IFCCOOLINGTOWER,
+  IFCCOOLINGTOWERTYPE,
+  IFCCOORDINATEOPERATION,
+  IFCCOORDINATEREFERENCESYSTEM,
+  IFCCOSTITEM,
+  IFCCOSTSCHEDULE,
+  IFCCOSTVALUE,
+  IFCCOVERING,
+  IFCCOVERINGTYPE,
+  IFCCREWRESOURCE,
+  IFCCREWRESOURCETYPE,
+  IFCCSGPRIMITIVE3D,
+  IFCCSGSOLID,
+  IFCCSHAPEPROFILEDEF,
+  IFCCURRENCYRELATIONSHIP,
+  IFCCURTAINWALL,
+  IFCCURTAINWALLTYPE,
+  IFCCURVE,
+  IFCCURVEBOUNDEDPLANE,
+  IFCCURVEBOUNDEDSURFACE,
+  IFCCURVESEGMENT2D,
+  IFCCURVESTYLE,
+  IFCCURVESTYLEFONT,
+  IFCCURVESTYLEFONTANDSCALING,
+  IFCCURVESTYLEFONTPATTERN,
+  IFCCYLINDRICALSURFACE,
+  IFCDAMPER,
+  IFCDAMPERTYPE,
+  IFCDEEPFOUNDATION,
+  IFCDEEPFOUNDATIONTYPE,
+  IFCDERIVEDPROFILEDEF,
+  IFCDERIVEDUNIT,
+  IFCDERIVEDUNITELEMENT,
+  IFCDIMENSIONALEXPONENTS,
+  IFCDIRECTION,
+  IFCDISCRETEACCESSORY,
+  IFCDISCRETEACCESSORYTYPE,
+  IFCDISTANCEEXPRESSION,
+  IFCDISTRIBUTIONCHAMBERELEMENT,
+  IFCDISTRIBUTIONCHAMBERELEMENTTYPE,
+  IFCDISTRIBUTIONCIRCUIT,
+  IFCDISTRIBUTIONCONTROLELEMENT,
+  IFCDISTRIBUTIONCONTROLELEMENTTYPE,
+  IFCDISTRIBUTIONELEMENT,
+  IFCDISTRIBUTIONELEMENTTYPE,
+  IFCDISTRIBUTIONFLOWELEMENT,
+  IFCDISTRIBUTIONFLOWELEMENTTYPE,
+  IFCDISTRIBUTIONPORT,
+  IFCDISTRIBUTIONSYSTEM,
+  IFCDOCUMENTINFORMATION,
+  IFCDOCUMENTINFORMATIONRELATIONSHIP,
+  IFCDOCUMENTREFERENCE,
+  IFCDOOR,
+  IFCDOORLININGPROPERTIES,
+  IFCDOORPANELPROPERTIES,
+  IFCDOORSTANDARDCASE,
+  IFCDOORSTYLE,
+  IFCDOORTYPE,
+  IFCDRAUGHTINGPREDEFINEDCOLOUR,
+  IFCDRAUGHTINGPREDEFINEDCURVEFONT,
+  IFCDUCTFITTING,
+  IFCDUCTFITTINGTYPE,
+  IFCDUCTSEGMENT,
+  IFCDUCTSEGMENTTYPE,
+  IFCDUCTSILENCER,
+  IFCDUCTSILENCERTYPE,
+  IFCEDGE,
+  IFCEDGECURVE,
+  IFCEDGELOOP,
+  IFCELECTRICAPPLIANCE,
+  IFCELECTRICAPPLIANCETYPE,
+  IFCELECTRICDISTRIBUTIONBOARD,
+  IFCELECTRICDISTRIBUTIONBOARDTYPE,
+  IFCELECTRICFLOWSTORAGEDEVICE,
+  IFCELECTRICFLOWSTORAGEDEVICETYPE,
+  IFCELECTRICGENERATOR,
+  IFCELECTRICGENERATORTYPE,
+  IFCELECTRICMOTOR,
+  IFCELECTRICMOTORTYPE,
+  IFCELECTRICTIMECONTROL,
+  IFCELECTRICTIMECONTROLTYPE,
+  IFCELEMENT,
+  IFCELEMENTARYSURFACE,
+  IFCELEMENTASSEMBLY,
+  IFCELEMENTASSEMBLYTYPE,
+  IFCELEMENTCOMPONENT,
+  IFCELEMENTCOMPONENTTYPE,
+  IFCELEMENTQUANTITY,
+  IFCELEMENTTYPE,
+  IFCELLIPSE,
+  IFCELLIPSEPROFILEDEF,
+  IFCENERGYCONVERSIONDEVICE,
+  IFCENERGYCONVERSIONDEVICETYPE,
+  IFCENGINE,
+  IFCENGINETYPE,
+  IFCEVAPORATIVECOOLER,
+  IFCEVAPORATIVECOOLERTYPE,
+  IFCEVAPORATOR,
+  IFCEVAPORATORTYPE,
+  IFCEVENT,
+  IFCEVENTTIME,
+  IFCEVENTTYPE,
+  IFCEXTENDEDPROPERTIES,
+  IFCEXTERNALINFORMATION,
+  IFCEXTERNALLYDEFINEDHATCHSTYLE,
+  IFCEXTERNALLYDEFINEDSURFACESTYLE,
+  IFCEXTERNALLYDEFINEDTEXTFONT,
+  IFCEXTERNALREFERENCE,
+  IFCEXTERNALREFERENCERELATIONSHIP,
+  IFCEXTERNALSPATIALELEMENT,
+  IFCEXTERNALSPATIALSTRUCTUREELEMENT,
+  IFCEXTRUDEDAREASOLID,
+  IFCEXTRUDEDAREASOLIDTAPERED,
+  IFCFACE,
+  IFCFACEBASEDSURFACEMODEL,
+  IFCFACEBOUND,
+  IFCFACEOUTERBOUND,
+  IFCFACESURFACE,
+  IFCFACETEDBREP,
+  IFCFACETEDBREPWITHVOIDS,
+  IFCFACILITY,
+  IFCFACILITYPART,
+  IFCFAILURECONNECTIONCONDITION,
+  IFCFAN,
+  IFCFANTYPE,
+  IFCFASTENER,
+  IFCFASTENERTYPE,
+  IFCFEATUREELEMENT,
+  IFCFEATUREELEMENTADDITION,
+  IFCFEATUREELEMENTSUBTRACTION,
+  IFCFILLAREASTYLE,
+  IFCFILLAREASTYLEHATCHING,
+  IFCFILLAREASTYLETILES,
+  IFCFILTER,
+  IFCFILTERTYPE,
+  IFCFIRESUPPRESSIONTERMINAL,
+  IFCFIRESUPPRESSIONTERMINALTYPE,
+  IFCFIXEDREFERENCESWEPTAREASOLID,
+  IFCFLOWCONTROLLER,
+  IFCFLOWCONTROLLERTYPE,
+  IFCFLOWFITTING,
+  IFCFLOWFITTINGTYPE,
+  IFCFLOWINSTRUMENT,
+  IFCFLOWINSTRUMENTTYPE,
+  IFCFLOWMETER,
+  IFCFLOWMETERTYPE,
+  IFCFLOWMOVINGDEVICE,
+  IFCFLOWMOVINGDEVICETYPE,
+  IFCFLOWSEGMENT,
+  IFCFLOWSEGMENTTYPE,
+  IFCFLOWSTORAGEDEVICE,
+  IFCFLOWSTORAGEDEVICETYPE,
+  IFCFLOWTERMINAL,
+  IFCFLOWTERMINALTYPE,
+  IFCFLOWTREATMENTDEVICE,
+  IFCFLOWTREATMENTDEVICETYPE,
+  IFCFOOTING,
+  IFCFOOTINGTYPE,
+  IFCFURNISHINGELEMENT,
+  IFCFURNISHINGELEMENTTYPE,
+  IFCFURNITURE,
+  IFCFURNITURETYPE,
+  IFCGEOGRAPHICELEMENT,
+  IFCGEOGRAPHICELEMENTTYPE,
+  IFCGEOMETRICCURVESET,
+  IFCGEOMETRICREPRESENTATIONCONTEXT,
+  IFCGEOMETRICREPRESENTATIONITEM,
+  IFCGEOMETRICREPRESENTATIONSUBCONTEXT,
+  IFCGEOMETRICSET,
+  IFCGRID,
+  IFCGRIDAXIS,
+  IFCGRIDPLACEMENT,
+  IFCGROUP,
+  IFCHALFSPACESOLID,
+  IFCHEATEXCHANGER,
+  IFCHEATEXCHANGERTYPE,
+  IFCHUMIDIFIER,
+  IFCHUMIDIFIERTYPE,
+  IFCIMAGETEXTURE,
+  IFCINDEXEDCOLOURMAP,
+  IFCINDEXEDPOLYCURVE,
+  IFCINDEXEDPOLYGONALFACE,
+  IFCINDEXEDPOLYGONALFACEWITHVOIDS,
+  IFCINDEXEDTEXTUREMAP,
+  IFCINDEXEDTRIANGLETEXTUREMAP,
+  IFCINTERCEPTOR,
+  IFCINTERCEPTORTYPE,
+  IFCINTERSECTIONCURVE,
+  IFCINVENTORY,
+  IFCIRREGULARTIMESERIES,
+  IFCIRREGULARTIMESERIESVALUE,
+  IFCISHAPEPROFILEDEF,
+  IFCJUNCTIONBOX,
+  IFCJUNCTIONBOXTYPE,
+  IFCLABORRESOURCE,
+  IFCLABORRESOURCETYPE,
+  IFCLAGTIME,
+  IFCLAMP,
+  IFCLAMPTYPE,
+  IFCLIBRARYINFORMATION,
+  IFCLIBRARYREFERENCE,
+  IFCLIGHTDISTRIBUTIONDATA,
+  IFCLIGHTFIXTURE,
+  IFCLIGHTFIXTURETYPE,
+  IFCLIGHTINTENSITYDISTRIBUTION,
+  IFCLIGHTSOURCE,
+  IFCLIGHTSOURCEAMBIENT,
+  IFCLIGHTSOURCEDIRECTIONAL,
+  IFCLIGHTSOURCEGONIOMETRIC,
+  IFCLIGHTSOURCEPOSITIONAL,
+  IFCLIGHTSOURCESPOT,
+  IFCLINE,
+  IFCLINEARPLACEMENT,
+  IFCLINEARPOSITIONINGELEMENT,
+  IFCLINESEGMENT2D,
+  IFCLOCALPLACEMENT,
+  IFCLOOP,
+  IFCLSHAPEPROFILEDEF,
+  IFCMANIFOLDSOLIDBREP,
+  IFCMAPCONVERSION,
+  IFCMAPPEDITEM,
+  IFCMATERIAL,
+  IFCMATERIALCLASSIFICATIONRELATIONSHIP,
+  IFCMATERIALCONSTITUENT,
+  IFCMATERIALCONSTITUENTSET,
+  IFCMATERIALDEFINITION,
+  IFCMATERIALDEFINITIONREPRESENTATION,
+  IFCMATERIALLAYER,
+  IFCMATERIALLAYERSET,
+  IFCMATERIALLAYERSETUSAGE,
+  IFCMATERIALLAYERWITHOFFSETS,
+  IFCMATERIALLIST,
+  IFCMATERIALPROFILE,
+  IFCMATERIALPROFILESET,
+  IFCMATERIALPROFILESETUSAGE,
+  IFCMATERIALPROFILESETUSAGETAPERING,
+  IFCMATERIALPROFILEWITHOFFSETS,
+  IFCMATERIALPROPERTIES,
+  IFCMATERIALRELATIONSHIP,
+  IFCMATERIALUSAGEDEFINITION,
+  IFCMEASUREWITHUNIT,
+  IFCMECHANICALFASTENER,
+  IFCMECHANICALFASTENERTYPE,
+  IFCMEDICALDEVICE,
+  IFCMEDICALDEVICETYPE,
+  IFCMEMBER,
+  IFCMEMBERSTANDARDCASE,
+  IFCMEMBERTYPE,
+  IFCMETRIC,
+  IFCMIRROREDPROFILEDEF,
+  IFCMONETARYUNIT,
+  IFCMOTORCONNECTION,
+  IFCMOTORCONNECTIONTYPE,
+  IFCNAMEDUNIT,
+  IFCOBJECT,
+  IFCOBJECTDEFINITION,
+  IFCOBJECTIVE,
+  IFCOBJECTPLACEMENT,
+  IFCOCCUPANT,
+  IFCOFFSETCURVE,
+  IFCOFFSETCURVE2D,
+  IFCOFFSETCURVE3D,
+  IFCOFFSETCURVEBYDISTANCES,
+  IFCOPENINGELEMENT,
+  IFCOPENINGSTANDARDCASE,
+  IFCOPENSHELL,
+  IFCORGANIZATION,
+  IFCORGANIZATIONRELATIONSHIP,
+  IFCORIENTATIONEXPRESSION,
+  IFCORIENTEDEDGE,
+  IFCOUTERBOUNDARYCURVE,
+  IFCOUTLET,
+  IFCOUTLETTYPE,
+  IFCOWNERHISTORY,
+  IFCPARAMETERIZEDPROFILEDEF,
+  IFCPATH,
+  IFCPCURVE,
+  IFCPERFORMANCEHISTORY,
+  IFCPERMEABLECOVERINGPROPERTIES,
+  IFCPERMIT,
+  IFCPERSON,
+  IFCPERSONANDORGANIZATION,
+  IFCPHYSICALCOMPLEXQUANTITY,
+  IFCPHYSICALQUANTITY,
+  IFCPHYSICALSIMPLEQUANTITY,
+  IFCPILE,
+  IFCPILETYPE,
+  IFCPIPEFITTING,
+  IFCPIPEFITTINGTYPE,
+  IFCPIPESEGMENT,
+  IFCPIPESEGMENTTYPE,
+  IFCPIXELTEXTURE,
+  IFCPLACEMENT,
+  IFCPLANARBOX,
+  IFCPLANAREXTENT,
+  IFCPLANE,
+  IFCPLATE,
+  IFCPLATESTANDARDCASE,
+  IFCPLATETYPE,
+  IFCPOINT,
+  IFCPOINTONCURVE,
+  IFCPOINTONSURFACE,
+  IFCPOLYGONALBOUNDEDHALFSPACE,
+  IFCPOLYGONALFACESET,
+  IFCPOLYLINE,
+  IFCPOLYLOOP,
+  IFCPORT,
+  IFCPOSITIONINGELEMENT,
+  IFCPOSTALADDRESS,
+  IFCPREDEFINEDCOLOUR,
+  IFCPREDEFINEDCURVEFONT,
+  IFCPREDEFINEDITEM,
+  IFCPREDEFINEDPROPERTIES,
+  IFCPREDEFINEDPROPERTYSET,
+  IFCPREDEFINEDTEXTFONT,
+  IFCPRESENTATIONITEM,
+  IFCPRESENTATIONLAYERASSIGNMENT,
+  IFCPRESENTATIONLAYERWITHSTYLE,
+  IFCPRESENTATIONSTYLE,
+  IFCPRESENTATIONSTYLEASSIGNMENT,
+  IFCPROCEDURE,
+  IFCPROCEDURETYPE,
+  IFCPROCESS,
+  IFCPRODUCT,
+  IFCPRODUCTDEFINITIONSHAPE,
+  IFCPRODUCTREPRESENTATION,
+  IFCPROFILEDEF,
+  IFCPROFILEPROPERTIES,
+  IFCPROJECT,
+  IFCPROJECTEDCRS,
+  IFCPROJECTIONELEMENT,
+  IFCPROJECTLIBRARY,
+  IFCPROJECTORDER,
+  IFCPROPERTY,
+  IFCPROPERTYABSTRACTION,
+  IFCPROPERTYBOUNDEDVALUE,
+  IFCPROPERTYDEFINITION,
+  IFCPROPERTYDEPENDENCYRELATIONSHIP,
+  IFCPROPERTYENUMERATEDVALUE,
+  IFCPROPERTYENUMERATION,
+  IFCPROPERTYLISTVALUE,
+  IFCPROPERTYREFERENCEVALUE,
+  IFCPROPERTYSET,
+  IFCPROPERTYSETDEFINITION,
+  IFCPROPERTYSETTEMPLATE,
+  IFCPROPERTYSINGLEVALUE,
+  IFCPROPERTYTABLEVALUE,
+  IFCPROPERTYTEMPLATE,
+  IFCPROPERTYTEMPLATEDEFINITION,
+  IFCPROTECTIVEDEVICE,
+  IFCPROTECTIVEDEVICETRIPPINGUNIT,
+  IFCPROTECTIVEDEVICETRIPPINGUNITTYPE,
+  IFCPROTECTIVEDEVICETYPE,
+  IFCPROXY,
+  IFCPUMP,
+  IFCPUMPTYPE,
+  IFCQUANTITYAREA,
+  IFCQUANTITYCOUNT,
+  IFCQUANTITYLENGTH,
+  IFCQUANTITYSET,
+  IFCQUANTITYTIME,
+  IFCQUANTITYVOLUME,
+  IFCQUANTITYWEIGHT,
+  IFCRAILING,
+  IFCRAILINGTYPE,
+  IFCRAMP,
+  IFCRAMPFLIGHT,
+  IFCRAMPFLIGHTTYPE,
+  IFCRAMPTYPE,
+  IFCRATIONALBSPLINECURVEWITHKNOTS,
+  IFCRATIONALBSPLINESURFACEWITHKNOTS,
+  IFCRECTANGLEHOLLOWPROFILEDEF,
+  IFCRECTANGLEPROFILEDEF,
+  IFCRECTANGULARPYRAMID,
+  IFCRECTANGULARTRIMMEDSURFACE,
+  IFCRECURRENCEPATTERN,
+  IFCREFERENCE,
+  IFCREFERENT,
+  IFCREGULARTIMESERIES,
+  IFCREINFORCEMENTBARPROPERTIES,
+  IFCREINFORCEMENTDEFINITIONPROPERTIES,
+  IFCREINFORCINGBAR,
+  IFCREINFORCINGBARTYPE,
+  IFCREINFORCINGELEMENT,
+  IFCREINFORCINGELEMENTTYPE,
+  IFCREINFORCINGMESH,
+  IFCREINFORCINGMESHTYPE,
+  IFCRELAGGREGATES,
+  IFCRELASSIGNS,
+  IFCRELASSIGNSTOACTOR,
+  IFCRELASSIGNSTOCONTROL,
+  IFCRELASSIGNSTOGROUP,
+  IFCRELASSIGNSTOGROUPBYFACTOR,
+  IFCRELASSIGNSTOPROCESS,
+  IFCRELASSIGNSTOPRODUCT,
+  IFCRELASSIGNSTORESOURCE,
+  IFCRELASSOCIATES,
+  IFCRELASSOCIATESAPPROVAL,
+  IFCRELASSOCIATESCLASSIFICATION,
+  IFCRELASSOCIATESCONSTRAINT,
+  IFCRELASSOCIATESDOCUMENT,
+  IFCRELASSOCIATESLIBRARY,
+  IFCRELASSOCIATESMATERIAL,
+  IFCRELATIONSHIP,
+  IFCRELCONNECTS,
+  IFCRELCONNECTSELEMENTS,
+  IFCRELCONNECTSPATHELEMENTS,
+  IFCRELCONNECTSPORTS,
+  IFCRELCONNECTSPORTTOELEMENT,
+  IFCRELCONNECTSSTRUCTURALACTIVITY,
+  IFCRELCONNECTSSTRUCTURALMEMBER,
+  IFCRELCONNECTSWITHECCENTRICITY,
+  IFCRELCONNECTSWITHREALIZINGELEMENTS,
+  IFCRELCONTAINEDINSPATIALSTRUCTURE,
+  IFCRELCOVERSBLDGELEMENTS,
+  IFCRELCOVERSSPACES,
+  IFCRELDECLARES,
+  IFCRELDECOMPOSES,
+  IFCRELDEFINES,
+  IFCRELDEFINESBYOBJECT,
+  IFCRELDEFINESBYPROPERTIES,
+  IFCRELDEFINESBYTEMPLATE,
+  IFCRELDEFINESBYTYPE,
+  IFCRELFILLSELEMENT,
+  IFCRELFLOWCONTROLELEMENTS,
+  IFCRELINTERFERESELEMENTS,
+  IFCRELNESTS,
+  IFCRELPOSITIONS,
+  IFCRELPROJECTSELEMENT,
+  IFCRELREFERENCEDINSPATIALSTRUCTURE,
+  IFCRELSEQUENCE,
+  IFCRELSERVICESBUILDINGS,
+  IFCRELSPACEBOUNDARY,
+  IFCRELSPACEBOUNDARY1STLEVEL,
+  IFCRELSPACEBOUNDARY2NDLEVEL,
+  IFCRELVOIDSELEMENT,
+  IFCREPARAMETRISEDCOMPOSITECURVESEGMENT,
+  IFCREPRESENTATION,
+  IFCREPRESENTATIONCONTEXT,
+  IFCREPRESENTATIONITEM,
+  IFCREPRESENTATIONMAP,
+  IFCRESOURCE,
+  IFCRESOURCEAPPROVALRELATIONSHIP,
+  IFCRESOURCECONSTRAINTRELATIONSHIP,
+  IFCRESOURCELEVELRELATIONSHIP,
+  IFCRESOURCETIME,
+  IFCREVOLVEDAREASOLID,
+  IFCREVOLVEDAREASOLIDTAPERED,
+  IFCRIGHTCIRCULARCONE,
+  IFCRIGHTCIRCULARCYLINDER,
+  IFCROOF,
+  IFCROOFTYPE,
+  IFCROOT,
+  IFCROUNDEDRECTANGLEPROFILEDEF,
+  IFCSANITARYTERMINAL,
+  IFCSANITARYTERMINALTYPE,
+  IFCSCHEDULINGTIME,
+  IFCSEAMCURVE,
+  IFCSECTIONEDSOLID,
+  IFCSECTIONEDSOLIDHORIZONTAL,
+  IFCSECTIONEDSPINE,
+  IFCSECTIONPROPERTIES,
+  IFCSECTIONREINFORCEMENTPROPERTIES,
+  IFCSENSOR,
+  IFCSENSORTYPE,
+  IFCSHADINGDEVICE,
+  IFCSHADINGDEVICETYPE,
+  IFCSHAPEASPECT,
+  IFCSHAPEMODEL,
+  IFCSHAPEREPRESENTATION,
+  IFCSHELLBASEDSURFACEMODEL,
+  IFCSIMPLEPROPERTY,
+  IFCSIMPLEPROPERTYTEMPLATE,
+  IFCSITE,
+  IFCSIUNIT,
+  IFCSLAB,
+  IFCSLABELEMENTEDCASE,
+  IFCSLABSTANDARDCASE,
+  IFCSLABTYPE,
+  IFCSLIPPAGECONNECTIONCONDITION,
+  IFCSOLARDEVICE,
+  IFCSOLARDEVICETYPE,
+  IFCSOLIDMODEL,
+  IFCSPACE,
+  IFCSPACEHEATER,
+  IFCSPACEHEATERTYPE,
+  IFCSPACETYPE,
+  IFCSPATIALELEMENT,
+  IFCSPATIALELEMENTTYPE,
+  IFCSPATIALSTRUCTUREELEMENT,
+  IFCSPATIALSTRUCTUREELEMENTTYPE,
+  IFCSPATIALZONE,
+  IFCSPATIALZONETYPE,
+  IFCSPHERE,
+  IFCSPHERICALSURFACE,
+  IFCSTACKTERMINAL,
+  IFCSTACKTERMINALTYPE,
+  IFCSTAIR,
+  IFCSTAIRFLIGHT,
+  IFCSTAIRFLIGHTTYPE,
+  IFCSTAIRTYPE,
+  IFCSTRUCTURALACTION,
+  IFCSTRUCTURALACTIVITY,
+  IFCSTRUCTURALANALYSISMODEL,
+  IFCSTRUCTURALCONNECTION,
+  IFCSTRUCTURALCONNECTIONCONDITION,
+  IFCSTRUCTURALCURVEACTION,
+  IFCSTRUCTURALCURVECONNECTION,
+  IFCSTRUCTURALCURVEMEMBER,
+  IFCSTRUCTURALCURVEMEMBERVARYING,
+  IFCSTRUCTURALCURVEREACTION,
+  IFCSTRUCTURALITEM,
+  IFCSTRUCTURALLINEARACTION,
+  IFCSTRUCTURALLOAD,
+  IFCSTRUCTURALLOADCASE,
+  IFCSTRUCTURALLOADCONFIGURATION,
+  IFCSTRUCTURALLOADGROUP,
+  IFCSTRUCTURALLOADLINEARFORCE,
+  IFCSTRUCTURALLOADORRESULT,
+  IFCSTRUCTURALLOADPLANARFORCE,
+  IFCSTRUCTURALLOADSINGLEDISPLACEMENT,
+  IFCSTRUCTURALLOADSINGLEDISPLACEMENTDISTORTION,
+  IFCSTRUCTURALLOADSINGLEFORCE,
+  IFCSTRUCTURALLOADSINGLEFORCEWARPING,
+  IFCSTRUCTURALLOADSTATIC,
+  IFCSTRUCTURALLOADTEMPERATURE,
+  IFCSTRUCTURALMEMBER,
+  IFCSTRUCTURALPLANARACTION,
+  IFCSTRUCTURALPOINTACTION,
+  IFCSTRUCTURALPOINTCONNECTION,
+  IFCSTRUCTURALPOINTREACTION,
+  IFCSTRUCTURALREACTION,
+  IFCSTRUCTURALRESULTGROUP,
+  IFCSTRUCTURALSURFACEACTION,
+  IFCSTRUCTURALSURFACECONNECTION,
+  IFCSTRUCTURALSURFACEMEMBER,
+  IFCSTRUCTURALSURFACEMEMBERVARYING,
+  IFCSTRUCTURALSURFACEREACTION,
+  IFCSTYLEDITEM,
+  IFCSTYLEDREPRESENTATION,
+  IFCSTYLEMODEL,
+  IFCSUBCONTRACTRESOURCE,
+  IFCSUBCONTRACTRESOURCETYPE,
+  IFCSUBEDGE,
+  IFCSURFACE,
+  IFCSURFACECURVE,
+  IFCSURFACECURVESWEPTAREASOLID,
+  IFCSURFACEFEATURE,
+  IFCSURFACEOFLINEAREXTRUSION,
+  IFCSURFACEOFREVOLUTION,
+  IFCSURFACEREINFORCEMENTAREA,
+  IFCSURFACESTYLE,
+  IFCSURFACESTYLELIGHTING,
+  IFCSURFACESTYLEREFRACTION,
+  IFCSURFACESTYLERENDERING,
+  IFCSURFACESTYLESHADING,
+  IFCSURFACESTYLEWITHTEXTURES,
+  IFCSURFACETEXTURE,
+  IFCSWEPTAREASOLID,
+  IFCSWEPTDISKSOLID,
+  IFCSWEPTDISKSOLIDPOLYGONAL,
+  IFCSWEPTSURFACE,
+  IFCSWITCHINGDEVICE,
+  IFCSWITCHINGDEVICETYPE,
+  IFCSYSTEM,
+  IFCSYSTEMFURNITUREELEMENT,
+  IFCSYSTEMFURNITUREELEMENTTYPE,
+  IFCTABLE,
+  IFCTABLECOLUMN,
+  IFCTABLEROW,
+  IFCTANK,
+  IFCTANKTYPE,
+  IFCTASK,
+  IFCTASKTIME,
+  IFCTASKTIMERECURRING,
+  IFCTASKTYPE,
+  IFCTELECOMADDRESS,
+  IFCTENDON,
+  IFCTENDONANCHOR,
+  IFCTENDONANCHORTYPE,
+  IFCTENDONCONDUIT,
+  IFCTENDONCONDUITTYPE,
+  IFCTENDONTYPE,
+  IFCTESSELLATEDFACESET,
+  IFCTESSELLATEDITEM,
+  IFCTEXTLITERAL,
+  IFCTEXTLITERALWITHEXTENT,
+  IFCTEXTSTYLE,
+  IFCTEXTSTYLEFONTMODEL,
+  IFCTEXTSTYLEFORDEFINEDFONT,
+  IFCTEXTSTYLETEXTMODEL,
+  IFCTEXTURECOORDINATE,
+  IFCTEXTURECOORDINATEGENERATOR,
+  IFCTEXTUREMAP,
+  IFCTEXTUREVERTEX,
+  IFCTEXTUREVERTEXLIST,
+  IFCTIMEPERIOD,
+  IFCTIMESERIES,
+  IFCTIMESERIESVALUE,
+  IFCTOPOLOGICALREPRESENTATIONITEM,
+  IFCTOPOLOGYREPRESENTATION,
+  IFCTOROIDALSURFACE,
+  IFCTRANSFORMER,
+  IFCTRANSFORMERTYPE,
+  IFCTRANSITIONCURVESEGMENT2D,
+  IFCTRANSPORTELEMENT,
+  IFCTRANSPORTELEMENTTYPE,
+  IFCTRAPEZIUMPROFILEDEF,
+  IFCTRIANGULATEDFACESET,
+  IFCTRIANGULATEDIRREGULARNETWORK,
+  IFCTRIMMEDCURVE,
+  IFCTSHAPEPROFILEDEF,
+  IFCTUBEBUNDLE,
+  IFCTUBEBUNDLETYPE,
+  IFCTYPEOBJECT,
+  IFCTYPEPROCESS,
+  IFCTYPEPRODUCT,
+  IFCTYPERESOURCE,
+  IFCUNITARYCONTROLELEMENT,
+  IFCUNITARYCONTROLELEMENTTYPE,
+  IFCUNITARYEQUIPMENT,
+  IFCUNITARYEQUIPMENTTYPE,
+  IFCUNITASSIGNMENT,
+  IFCUSHAPEPROFILEDEF,
+  IFCVALVE,
+  IFCVALVETYPE,
+  IFCVECTOR,
+  IFCVERTEX,
+  IFCVERTEXLOOP,
+  IFCVERTEXPOINT,
+  IFCVIBRATIONDAMPER,
+  IFCVIBRATIONDAMPERTYPE,
+  IFCVIBRATIONISOLATOR,
+  IFCVIBRATIONISOLATORTYPE,
+  IFCVIRTUALELEMENT,
+  IFCVIRTUALGRIDINTERSECTION,
+  IFCVOIDINGFEATURE,
+  IFCWALL,
+  IFCWALLELEMENTEDCASE,
+  IFCWALLSTANDARDCASE,
+  IFCWALLTYPE,
+  IFCWASTETERMINAL,
+  IFCWASTETERMINALTYPE,
+  IFCWINDOW,
+  IFCWINDOWLININGPROPERTIES,
+  IFCWINDOWPANELPROPERTIES,
+  IFCWINDOWSTANDARDCASE,
+  IFCWINDOWSTYLE,
+  IFCWINDOWTYPE,
+  IFCWORKCALENDAR,
+  IFCWORKCONTROL,
+  IFCWORKPLAN,
+  IFCWORKSCHEDULE,
+  IFCWORKTIME,
+  IFCZONE,
+  IFCZSHAPEPROFILEDEF,
+  IfcAPI,
+  IfcAbsorbedDoseMeasure,
+  IfcAccelerationMeasure,
+  IfcActionRequest,
+  IfcActionRequestTypeEnum,
+  IfcActionSourceTypeEnum,
+  IfcActionTypeEnum,
+  IfcActor,
+  IfcActorRole,
+  IfcActuator,
+  IfcActuatorType,
+  IfcActuatorTypeEnum,
+  IfcAddress,
+  IfcAddressTypeEnum,
+  IfcAdvancedBrep,
+  IfcAdvancedBrepWithVoids,
+  IfcAdvancedFace,
+  IfcAirTerminal,
+  IfcAirTerminalBox,
+  IfcAirTerminalBoxType,
+  IfcAirTerminalBoxTypeEnum,
+  IfcAirTerminalType,
+  IfcAirTerminalTypeEnum,
+  IfcAirToAirHeatRecovery,
+  IfcAirToAirHeatRecoveryType,
+  IfcAirToAirHeatRecoveryTypeEnum,
+  IfcAlarm,
+  IfcAlarmType,
+  IfcAlarmTypeEnum,
+  IfcAlignment,
+  IfcAlignment2DHorizontal,
+  IfcAlignment2DHorizontalSegment,
+  IfcAlignment2DSegment,
+  IfcAlignment2DVerSegCircularArc,
+  IfcAlignment2DVerSegLine,
+  IfcAlignment2DVerSegParabolicArc,
+  IfcAlignment2DVertical,
+  IfcAlignment2DVerticalSegment,
+  IfcAlignmentCurve,
+  IfcAlignmentTypeEnum,
+  IfcAmountOfSubstanceMeasure,
+  IfcAnalysisModelTypeEnum,
+  IfcAnalysisTheoryTypeEnum,
+  IfcAngularVelocityMeasure,
+  IfcAnnotation,
+  IfcAnnotationFillArea,
+  IfcApplication,
+  IfcAppliedValue,
+  IfcApproval,
+  IfcApprovalRelationship,
+  IfcArbitraryClosedProfileDef,
+  IfcArbitraryOpenProfileDef,
+  IfcArbitraryProfileDefWithVoids,
+  IfcAreaDensityMeasure,
+  IfcAreaMeasure,
+  IfcArithmeticOperatorEnum,
+  IfcAssemblyPlaceEnum,
+  IfcAsset,
+  IfcAsymmetricIShapeProfileDef,
+  IfcAudioVisualAppliance,
+  IfcAudioVisualApplianceType,
+  IfcAudioVisualApplianceTypeEnum,
+  IfcAxis1Placement,
+  IfcAxis2Placement2D,
+  IfcAxis2Placement3D,
+  IfcBSplineCurve,
+  IfcBSplineCurveForm,
+  IfcBSplineCurveWithKnots,
+  IfcBSplineSurface,
+  IfcBSplineSurfaceForm,
+  IfcBSplineSurfaceWithKnots,
+  IfcBeam,
+  IfcBeamStandardCase,
+  IfcBeamType,
+  IfcBeamTypeEnum,
+  IfcBearing,
+  IfcBearingType,
+  IfcBearingTypeDisplacementEnum,
+  IfcBearingTypeEnum,
+  IfcBenchmarkEnum,
+  IfcBinary,
+  IfcBlobTexture,
+  IfcBlock,
+  IfcBoiler,
+  IfcBoilerType,
+  IfcBoilerTypeEnum,
+  IfcBoolean,
+  IfcBooleanClippingResult,
+  IfcBooleanOperator,
+  IfcBooleanResult,
+  IfcBoundaryCondition,
+  IfcBoundaryCurve,
+  IfcBoundaryEdgeCondition,
+  IfcBoundaryFaceCondition,
+  IfcBoundaryNodeCondition,
+  IfcBoundaryNodeConditionWarping,
+  IfcBoundedCurve,
+  IfcBoundedSurface,
+  IfcBoundingBox,
+  IfcBoxAlignment,
+  IfcBoxedHalfSpace,
+  IfcBridge,
+  IfcBridgePart,
+  IfcBridgePartTypeEnum,
+  IfcBridgeTypeEnum,
+  IfcBuilding,
+  IfcBuildingElement,
+  IfcBuildingElementPart,
+  IfcBuildingElementPartType,
+  IfcBuildingElementPartTypeEnum,
+  IfcBuildingElementProxy,
+  IfcBuildingElementProxyType,
+  IfcBuildingElementProxyTypeEnum,
+  IfcBuildingElementType,
+  IfcBuildingStorey,
+  IfcBuildingSystem,
+  IfcBuildingSystemTypeEnum,
+  IfcBurner,
+  IfcBurnerType,
+  IfcBurnerTypeEnum,
+  IfcCShapeProfileDef,
+  IfcCableCarrierFitting,
+  IfcCableCarrierFittingType,
+  IfcCableCarrierFittingTypeEnum,
+  IfcCableCarrierSegment,
+  IfcCableCarrierSegmentType,
+  IfcCableCarrierSegmentTypeEnum,
+  IfcCableFitting,
+  IfcCableFittingType,
+  IfcCableFittingTypeEnum,
+  IfcCableSegment,
+  IfcCableSegmentType,
+  IfcCableSegmentTypeEnum,
+  IfcCaissonFoundation,
+  IfcCaissonFoundationType,
+  IfcCaissonFoundationTypeEnum,
+  IfcCardinalPointReference,
+  IfcCartesianPoint,
+  IfcCartesianPointList,
+  IfcCartesianPointList2D,
+  IfcCartesianPointList3D,
+  IfcCartesianTransformationOperator,
+  IfcCartesianTransformationOperator2D,
+  IfcCartesianTransformationOperator2DnonUniform,
+  IfcCartesianTransformationOperator3D,
+  IfcCartesianTransformationOperator3DnonUniform,
+  IfcCenterLineProfileDef,
+  IfcChangeActionEnum,
+  IfcChiller,
+  IfcChillerType,
+  IfcChillerTypeEnum,
+  IfcChimney,
+  IfcChimneyType,
+  IfcChimneyTypeEnum,
+  IfcCircle,
+  IfcCircleHollowProfileDef,
+  IfcCircleProfileDef,
+  IfcCircularArcSegment2D,
+  IfcCivilElement,
+  IfcCivilElementType,
+  IfcClassification,
+  IfcClassificationReference,
+  IfcClosedShell,
+  IfcCoil,
+  IfcCoilType,
+  IfcCoilTypeEnum,
+  IfcColourRgb,
+  IfcColourRgbList,
+  IfcColourSpecification,
+  IfcColumn,
+  IfcColumnStandardCase,
+  IfcColumnType,
+  IfcColumnTypeEnum,
+  IfcCommunicationsAppliance,
+  IfcCommunicationsApplianceType,
+  IfcCommunicationsApplianceTypeEnum,
+  IfcComplexProperty,
+  IfcComplexPropertyTemplate,
+  IfcComplexPropertyTemplateTypeEnum,
+  IfcCompositeCurve,
+  IfcCompositeCurveOnSurface,
+  IfcCompositeCurveSegment,
+  IfcCompositeProfileDef,
+  IfcCompressor,
+  IfcCompressorType,
+  IfcCompressorTypeEnum,
+  IfcCondenser,
+  IfcCondenserType,
+  IfcCondenserTypeEnum,
+  IfcConic,
+  IfcConnectedFaceSet,
+  IfcConnectionCurveGeometry,
+  IfcConnectionGeometry,
+  IfcConnectionPointEccentricity,
+  IfcConnectionPointGeometry,
+  IfcConnectionSurfaceGeometry,
+  IfcConnectionTypeEnum,
+  IfcConnectionVolumeGeometry,
+  IfcConstraint,
+  IfcConstraintEnum,
+  IfcConstructionEquipmentResource,
+  IfcConstructionEquipmentResourceType,
+  IfcConstructionEquipmentResourceTypeEnum,
+  IfcConstructionMaterialResource,
+  IfcConstructionMaterialResourceType,
+  IfcConstructionMaterialResourceTypeEnum,
+  IfcConstructionProductResource,
+  IfcConstructionProductResourceType,
+  IfcConstructionProductResourceTypeEnum,
+  IfcConstructionResource,
+  IfcConstructionResourceType,
+  IfcContext,
+  IfcContextDependentMeasure,
+  IfcContextDependentUnit,
+  IfcControl,
+  IfcController,
+  IfcControllerType,
+  IfcControllerTypeEnum,
+  IfcConversionBasedUnit,
+  IfcConversionBasedUnitWithOffset,
+  IfcCooledBeam,
+  IfcCooledBeamType,
+  IfcCooledBeamTypeEnum,
+  IfcCoolingTower,
+  IfcCoolingTowerType,
+  IfcCoolingTowerTypeEnum,
+  IfcCoordinateOperation,
+  IfcCoordinateReferenceSystem,
+  IfcCostItem,
+  IfcCostItemTypeEnum,
+  IfcCostSchedule,
+  IfcCostScheduleTypeEnum,
+  IfcCostValue,
+  IfcCountMeasure,
+  IfcCovering,
+  IfcCoveringType,
+  IfcCoveringTypeEnum,
+  IfcCrewResource,
+  IfcCrewResourceType,
+  IfcCrewResourceTypeEnum,
+  IfcCsgPrimitive3D,
+  IfcCsgSolid,
+  IfcCurrencyRelationship,
+  IfcCurtainWall,
+  IfcCurtainWallType,
+  IfcCurtainWallTypeEnum,
+  IfcCurvatureMeasure,
+  IfcCurve,
+  IfcCurveBoundedPlane,
+  IfcCurveBoundedSurface,
+  IfcCurveInterpolationEnum,
+  IfcCurveSegment2D,
+  IfcCurveStyle,
+  IfcCurveStyleFont,
+  IfcCurveStyleFontAndScaling,
+  IfcCurveStyleFontPattern,
+  IfcCylindricalSurface,
+  IfcDamper,
+  IfcDamperType,
+  IfcDamperTypeEnum,
+  IfcDataOriginEnum,
+  IfcDate,
+  IfcDateTime,
+  IfcDayInMonthNumber,
+  IfcDayInWeekNumber,
+  IfcDeepFoundation,
+  IfcDeepFoundationType,
+  IfcDerivedProfileDef,
+  IfcDerivedUnit,
+  IfcDerivedUnitElement,
+  IfcDerivedUnitEnum,
+  IfcDescriptiveMeasure,
+  IfcDimensionCount,
+  IfcDimensionalExponents,
+  IfcDirection,
+  IfcDirectionSenseEnum,
+  IfcDiscreteAccessory,
+  IfcDiscreteAccessoryType,
+  IfcDiscreteAccessoryTypeEnum,
+  IfcDistanceExpression,
+  IfcDistributionChamberElement,
+  IfcDistributionChamberElementType,
+  IfcDistributionChamberElementTypeEnum,
+  IfcDistributionCircuit,
+  IfcDistributionControlElement,
+  IfcDistributionControlElementType,
+  IfcDistributionElement,
+  IfcDistributionElementType,
+  IfcDistributionFlowElement,
+  IfcDistributionFlowElementType,
+  IfcDistributionPort,
+  IfcDistributionPortTypeEnum,
+  IfcDistributionSystem,
+  IfcDistributionSystemEnum,
+  IfcDocumentConfidentialityEnum,
+  IfcDocumentInformation,
+  IfcDocumentInformationRelationship,
+  IfcDocumentReference,
+  IfcDocumentStatusEnum,
+  IfcDoor,
+  IfcDoorLiningProperties,
+  IfcDoorPanelOperationEnum,
+  IfcDoorPanelPositionEnum,
+  IfcDoorPanelProperties,
+  IfcDoorStandardCase,
+  IfcDoorStyle,
+  IfcDoorStyleConstructionEnum,
+  IfcDoorStyleOperationEnum,
+  IfcDoorType,
+  IfcDoorTypeEnum,
+  IfcDoorTypeOperationEnum,
+  IfcDoseEquivalentMeasure,
+  IfcDraughtingPreDefinedColour,
+  IfcDraughtingPreDefinedCurveFont,
+  IfcDuctFitting,
+  IfcDuctFittingType,
+  IfcDuctFittingTypeEnum,
+  IfcDuctSegment,
+  IfcDuctSegmentType,
+  IfcDuctSegmentTypeEnum,
+  IfcDuctSilencer,
+  IfcDuctSilencerType,
+  IfcDuctSilencerTypeEnum,
+  IfcDuration,
+  IfcDynamicViscosityMeasure,
+  IfcEdge,
+  IfcEdgeCurve,
+  IfcEdgeLoop,
+  IfcElectricAppliance,
+  IfcElectricApplianceType,
+  IfcElectricApplianceTypeEnum,
+  IfcElectricCapacitanceMeasure,
+  IfcElectricChargeMeasure,
+  IfcElectricConductanceMeasure,
+  IfcElectricCurrentMeasure,
+  IfcElectricDistributionBoard,
+  IfcElectricDistributionBoardType,
+  IfcElectricDistributionBoardTypeEnum,
+  IfcElectricFlowStorageDevice,
+  IfcElectricFlowStorageDeviceType,
+  IfcElectricFlowStorageDeviceTypeEnum,
+  IfcElectricGenerator,
+  IfcElectricGeneratorType,
+  IfcElectricGeneratorTypeEnum,
+  IfcElectricMotor,
+  IfcElectricMotorType,
+  IfcElectricMotorTypeEnum,
+  IfcElectricResistanceMeasure,
+  IfcElectricTimeControl,
+  IfcElectricTimeControlType,
+  IfcElectricTimeControlTypeEnum,
+  IfcElectricVoltageMeasure,
+  IfcElement,
+  IfcElementAssembly,
+  IfcElementAssemblyType,
+  IfcElementAssemblyTypeEnum,
+  IfcElementComponent,
+  IfcElementComponentType,
+  IfcElementCompositionEnum,
+  IfcElementQuantity,
+  IfcElementType,
+  IfcElementarySurface,
+  IfcElements,
+  IfcEllipse,
+  IfcEllipseProfileDef,
+  IfcEnergyConversionDevice,
+  IfcEnergyConversionDeviceType,
+  IfcEnergyMeasure,
+  IfcEngine,
+  IfcEngineType,
+  IfcEngineTypeEnum,
+  IfcEvaporativeCooler,
+  IfcEvaporativeCoolerType,
+  IfcEvaporativeCoolerTypeEnum,
+  IfcEvaporator,
+  IfcEvaporatorType,
+  IfcEvaporatorTypeEnum,
+  IfcEvent,
+  IfcEventTime,
+  IfcEventTriggerTypeEnum,
+  IfcEventType,
+  IfcEventTypeEnum,
+  IfcExtendedProperties,
+  IfcExternalInformation,
+  IfcExternalReference,
+  IfcExternalReferenceRelationship,
+  IfcExternalSpatialElement,
+  IfcExternalSpatialElementTypeEnum,
+  IfcExternalSpatialStructureElement,
+  IfcExternallyDefinedHatchStyle,
+  IfcExternallyDefinedSurfaceStyle,
+  IfcExternallyDefinedTextFont,
+  IfcExtrudedAreaSolid,
+  IfcExtrudedAreaSolidTapered,
+  IfcFace,
+  IfcFaceBasedSurfaceModel,
+  IfcFaceBound,
+  IfcFaceOuterBound,
+  IfcFaceSurface,
+  IfcFacetedBrep,
+  IfcFacetedBrepWithVoids,
+  IfcFacility,
+  IfcFacilityPart,
+  IfcFailureConnectionCondition,
+  IfcFan,
+  IfcFanType,
+  IfcFanTypeEnum,
+  IfcFastener,
+  IfcFastenerType,
+  IfcFastenerTypeEnum,
+  IfcFeatureElement,
+  IfcFeatureElementAddition,
+  IfcFeatureElementSubtraction,
+  IfcFillAreaStyle,
+  IfcFillAreaStyleHatching,
+  IfcFillAreaStyleTiles,
+  IfcFilter,
+  IfcFilterType,
+  IfcFilterTypeEnum,
+  IfcFireSuppressionTerminal,
+  IfcFireSuppressionTerminalType,
+  IfcFireSuppressionTerminalTypeEnum,
+  IfcFixedReferenceSweptAreaSolid,
+  IfcFlowController,
+  IfcFlowControllerType,
+  IfcFlowDirectionEnum,
+  IfcFlowFitting,
+  IfcFlowFittingType,
+  IfcFlowInstrument,
+  IfcFlowInstrumentType,
+  IfcFlowInstrumentTypeEnum,
+  IfcFlowMeter,
+  IfcFlowMeterType,
+  IfcFlowMeterTypeEnum,
+  IfcFlowMovingDevice,
+  IfcFlowMovingDeviceType,
+  IfcFlowSegment,
+  IfcFlowSegmentType,
+  IfcFlowStorageDevice,
+  IfcFlowStorageDeviceType,
+  IfcFlowTerminal,
+  IfcFlowTerminalType,
+  IfcFlowTreatmentDevice,
+  IfcFlowTreatmentDeviceType,
+  IfcFontStyle,
+  IfcFontVariant,
+  IfcFontWeight,
+  IfcFooting,
+  IfcFootingType,
+  IfcFootingTypeEnum,
+  IfcForceMeasure,
+  IfcFrequencyMeasure,
+  IfcFurnishingElement,
+  IfcFurnishingElementType,
+  IfcFurniture,
+  IfcFurnitureType,
+  IfcFurnitureTypeEnum,
+  IfcGeographicElement,
+  IfcGeographicElementType,
+  IfcGeographicElementTypeEnum,
+  IfcGeometricCurveSet,
+  IfcGeometricProjectionEnum,
+  IfcGeometricRepresentationContext,
+  IfcGeometricRepresentationItem,
+  IfcGeometricRepresentationSubContext,
+  IfcGeometricSet,
+  IfcGlobalOrLocalEnum,
+  IfcGloballyUniqueId,
+  IfcGrid,
+  IfcGridAxis,
+  IfcGridPlacement,
+  IfcGridTypeEnum,
+  IfcGroup,
+  IfcHalfSpaceSolid,
+  IfcHeatExchanger,
+  IfcHeatExchangerType,
+  IfcHeatExchangerTypeEnum,
+  IfcHeatFluxDensityMeasure,
+  IfcHeatingValueMeasure,
+  IfcHumidifier,
+  IfcHumidifierType,
+  IfcHumidifierTypeEnum,
+  IfcIShapeProfileDef,
+  IfcIdentifier,
+  IfcIlluminanceMeasure,
+  IfcImageTexture,
+  IfcIndexedColourMap,
+  IfcIndexedPolyCurve,
+  IfcIndexedPolygonalFace,
+  IfcIndexedPolygonalFaceWithVoids,
+  IfcIndexedTextureMap,
+  IfcIndexedTriangleTextureMap,
+  IfcInductanceMeasure,
+  IfcInteger,
+  IfcIntegerCountRateMeasure,
+  IfcInterceptor,
+  IfcInterceptorType,
+  IfcInterceptorTypeEnum,
+  IfcInternalOrExternalEnum,
+  IfcIntersectionCurve,
+  IfcInventory,
+  IfcInventoryTypeEnum,
+  IfcIonConcentrationMeasure,
+  IfcIrregularTimeSeries,
+  IfcIrregularTimeSeriesValue,
+  IfcIsothermalMoistureCapacityMeasure,
+  IfcJunctionBox,
+  IfcJunctionBoxType,
+  IfcJunctionBoxTypeEnum,
+  IfcKinematicViscosityMeasure,
+  IfcKnotType,
+  IfcLShapeProfileDef,
+  IfcLabel,
+  IfcLaborResource,
+  IfcLaborResourceType,
+  IfcLaborResourceTypeEnum,
+  IfcLagTime,
+  IfcLamp,
+  IfcLampType,
+  IfcLampTypeEnum,
+  IfcLanguageId,
+  IfcLayerSetDirectionEnum,
+  IfcLengthMeasure,
+  IfcLibraryInformation,
+  IfcLibraryReference,
+  IfcLightDistributionCurveEnum,
+  IfcLightDistributionData,
+  IfcLightEmissionSourceEnum,
+  IfcLightFixture,
+  IfcLightFixtureType,
+  IfcLightFixtureTypeEnum,
+  IfcLightIntensityDistribution,
+  IfcLightSource,
+  IfcLightSourceAmbient,
+  IfcLightSourceDirectional,
+  IfcLightSourceGoniometric,
+  IfcLightSourcePositional,
+  IfcLightSourceSpot,
+  IfcLine,
+  IfcLineSegment2D,
+  IfcLinearForceMeasure,
+  IfcLinearMomentMeasure,
+  IfcLinearPlacement,
+  IfcLinearPositioningElement,
+  IfcLinearStiffnessMeasure,
+  IfcLinearVelocityMeasure,
+  IfcLoadGroupTypeEnum,
+  IfcLocalPlacement,
+  IfcLogical,
+  IfcLogicalOperatorEnum,
+  IfcLoop,
+  IfcLuminousFluxMeasure,
+  IfcLuminousIntensityDistributionMeasure,
+  IfcLuminousIntensityMeasure,
+  IfcMagneticFluxDensityMeasure,
+  IfcMagneticFluxMeasure,
+  IfcManifoldSolidBrep,
+  IfcMapConversion,
+  IfcMappedItem,
+  IfcMassDensityMeasure,
+  IfcMassFlowRateMeasure,
+  IfcMassMeasure,
+  IfcMassPerLengthMeasure,
+  IfcMaterial,
+  IfcMaterialClassificationRelationship,
+  IfcMaterialConstituent,
+  IfcMaterialConstituentSet,
+  IfcMaterialDefinition,
+  IfcMaterialDefinitionRepresentation,
+  IfcMaterialLayer,
+  IfcMaterialLayerSet,
+  IfcMaterialLayerSetUsage,
+  IfcMaterialLayerWithOffsets,
+  IfcMaterialList,
+  IfcMaterialProfile,
+  IfcMaterialProfileSet,
+  IfcMaterialProfileSetUsage,
+  IfcMaterialProfileSetUsageTapering,
+  IfcMaterialProfileWithOffsets,
+  IfcMaterialProperties,
+  IfcMaterialRelationship,
+  IfcMaterialUsageDefinition,
+  IfcMeasureWithUnit,
+  IfcMechanicalFastener,
+  IfcMechanicalFastenerType,
+  IfcMechanicalFastenerTypeEnum,
+  IfcMedicalDevice,
+  IfcMedicalDeviceType,
+  IfcMedicalDeviceTypeEnum,
+  IfcMember,
+  IfcMemberStandardCase,
+  IfcMemberType,
+  IfcMemberTypeEnum,
+  IfcMetric,
+  IfcMirroredProfileDef,
+  IfcModulusOfElasticityMeasure,
+  IfcModulusOfLinearSubgradeReactionMeasure,
+  IfcModulusOfRotationalSubgradeReactionMeasure,
+  IfcModulusOfSubgradeReactionMeasure,
+  IfcMoistureDiffusivityMeasure,
+  IfcMolecularWeightMeasure,
+  IfcMomentOfInertiaMeasure,
+  IfcMonetaryMeasure,
+  IfcMonetaryUnit,
+  IfcMonthInYearNumber,
+  IfcMotorConnection,
+  IfcMotorConnectionType,
+  IfcMotorConnectionTypeEnum,
+  IfcNamedUnit,
+  IfcNonNegativeLengthMeasure,
+  IfcNormalisedRatioMeasure,
+  IfcNullStyle,
+  IfcNumericMeasure,
+  IfcObject,
+  IfcObjectDefinition,
+  IfcObjectPlacement,
+  IfcObjectTypeEnum,
+  IfcObjective,
+  IfcObjectiveEnum,
+  IfcOccupant,
+  IfcOccupantTypeEnum,
+  IfcOffsetCurve,
+  IfcOffsetCurve2D,
+  IfcOffsetCurve3D,
+  IfcOffsetCurveByDistances,
+  IfcOpenShell,
+  IfcOpeningElement,
+  IfcOpeningElementTypeEnum,
+  IfcOpeningStandardCase,
+  IfcOrganization,
+  IfcOrganizationRelationship,
+  IfcOrientationExpression,
+  IfcOrientedEdge,
+  IfcOuterBoundaryCurve,
+  IfcOutlet,
+  IfcOutletType,
+  IfcOutletTypeEnum,
+  IfcOwnerHistory,
+  IfcPHMeasure,
+  IfcParameterValue,
+  IfcParameterizedProfileDef,
+  IfcPath,
+  IfcPcurve,
+  IfcPerformanceHistory,
+  IfcPerformanceHistoryTypeEnum,
+  IfcPermeableCoveringOperationEnum,
+  IfcPermeableCoveringProperties,
+  IfcPermit,
+  IfcPermitTypeEnum,
+  IfcPerson,
+  IfcPersonAndOrganization,
+  IfcPhysicalComplexQuantity,
+  IfcPhysicalOrVirtualEnum,
+  IfcPhysicalQuantity,
+  IfcPhysicalSimpleQuantity,
+  IfcPile,
+  IfcPileConstructionEnum,
+  IfcPileType,
+  IfcPileTypeEnum,
+  IfcPipeFitting,
+  IfcPipeFittingType,
+  IfcPipeFittingTypeEnum,
+  IfcPipeSegment,
+  IfcPipeSegmentType,
+  IfcPipeSegmentTypeEnum,
+  IfcPixelTexture,
+  IfcPlacement,
+  IfcPlanarBox,
+  IfcPlanarExtent,
+  IfcPlanarForceMeasure,
+  IfcPlane,
+  IfcPlaneAngleMeasure,
+  IfcPlate,
+  IfcPlateStandardCase,
+  IfcPlateType,
+  IfcPlateTypeEnum,
+  IfcPoint,
+  IfcPointOnCurve,
+  IfcPointOnSurface,
+  IfcPolyLoop,
+  IfcPolygonalBoundedHalfSpace,
+  IfcPolygonalFaceSet,
+  IfcPolyline,
+  IfcPort,
+  IfcPositioningElement,
+  IfcPositiveInteger,
+  IfcPositiveLengthMeasure,
+  IfcPositivePlaneAngleMeasure,
+  IfcPositiveRatioMeasure,
+  IfcPostalAddress,
+  IfcPowerMeasure,
+  IfcPreDefinedColour,
+  IfcPreDefinedCurveFont,
+  IfcPreDefinedItem,
+  IfcPreDefinedProperties,
+  IfcPreDefinedPropertySet,
+  IfcPreDefinedTextFont,
+  IfcPreferredSurfaceCurveRepresentation,
+  IfcPresentableText,
+  IfcPresentationItem,
+  IfcPresentationLayerAssignment,
+  IfcPresentationLayerWithStyle,
+  IfcPresentationStyle,
+  IfcPresentationStyleAssignment,
+  IfcPressureMeasure,
+  IfcProcedure,
+  IfcProcedureType,
+  IfcProcedureTypeEnum,
+  IfcProcess,
+  IfcProduct,
+  IfcProductDefinitionShape,
+  IfcProductRepresentation,
+  IfcProfileDef,
+  IfcProfileProperties,
+  IfcProfileTypeEnum,
+  IfcProject,
+  IfcProjectLibrary,
+  IfcProjectOrder,
+  IfcProjectOrderTypeEnum,
+  IfcProjectedCRS,
+  IfcProjectedOrTrueLengthEnum,
+  IfcProjectionElement,
+  IfcProjectionElementTypeEnum,
+  IfcProperty,
+  IfcPropertyAbstraction,
+  IfcPropertyBoundedValue,
+  IfcPropertyDefinition,
+  IfcPropertyDependencyRelationship,
+  IfcPropertyEnumeratedValue,
+  IfcPropertyEnumeration,
+  IfcPropertyListValue,
+  IfcPropertyReferenceValue,
+  IfcPropertySet,
+  IfcPropertySetDefinition,
+  IfcPropertySetTemplate,
+  IfcPropertySetTemplateTypeEnum,
+  IfcPropertySingleValue,
+  IfcPropertyTableValue,
+  IfcPropertyTemplate,
+  IfcPropertyTemplateDefinition,
+  IfcProtectiveDevice,
+  IfcProtectiveDeviceTrippingUnit,
+  IfcProtectiveDeviceTrippingUnitType,
+  IfcProtectiveDeviceTrippingUnitTypeEnum,
+  IfcProtectiveDeviceType,
+  IfcProtectiveDeviceTypeEnum,
+  IfcProxy,
+  IfcPump,
+  IfcPumpType,
+  IfcPumpTypeEnum,
+  IfcQuantityArea,
+  IfcQuantityCount,
+  IfcQuantityLength,
+  IfcQuantitySet,
+  IfcQuantityTime,
+  IfcQuantityVolume,
+  IfcQuantityWeight,
+  IfcRadioActivityMeasure,
+  IfcRailing,
+  IfcRailingType,
+  IfcRailingTypeEnum,
+  IfcRamp,
+  IfcRampFlight,
+  IfcRampFlightType,
+  IfcRampFlightTypeEnum,
+  IfcRampType,
+  IfcRampTypeEnum,
+  IfcRatioMeasure,
+  IfcRationalBSplineCurveWithKnots,
+  IfcRationalBSplineSurfaceWithKnots,
+  IfcReal,
+  IfcRectangleHollowProfileDef,
+  IfcRectangleProfileDef,
+  IfcRectangularPyramid,
+  IfcRectangularTrimmedSurface,
+  IfcRecurrencePattern,
+  IfcRecurrenceTypeEnum,
+  IfcReference,
+  IfcReferent,
+  IfcReferentTypeEnum,
+  IfcReflectanceMethodEnum,
+  IfcRegularTimeSeries,
+  IfcReinforcementBarProperties,
+  IfcReinforcementDefinitionProperties,
+  IfcReinforcingBar,
+  IfcReinforcingBarRoleEnum,
+  IfcReinforcingBarSurfaceEnum,
+  IfcReinforcingBarType,
+  IfcReinforcingBarTypeEnum,
+  IfcReinforcingElement,
+  IfcReinforcingElementType,
+  IfcReinforcingMesh,
+  IfcReinforcingMeshType,
+  IfcReinforcingMeshTypeEnum,
+  IfcRelAggregates,
+  IfcRelAssigns,
+  IfcRelAssignsToActor,
+  IfcRelAssignsToControl,
+  IfcRelAssignsToGroup,
+  IfcRelAssignsToGroupByFactor,
+  IfcRelAssignsToProcess,
+  IfcRelAssignsToProduct,
+  IfcRelAssignsToResource,
+  IfcRelAssociates,
+  IfcRelAssociatesApproval,
+  IfcRelAssociatesClassification,
+  IfcRelAssociatesConstraint,
+  IfcRelAssociatesDocument,
+  IfcRelAssociatesLibrary,
+  IfcRelAssociatesMaterial,
+  IfcRelConnects,
+  IfcRelConnectsElements,
+  IfcRelConnectsPathElements,
+  IfcRelConnectsPortToElement,
+  IfcRelConnectsPorts,
+  IfcRelConnectsStructuralActivity,
+  IfcRelConnectsStructuralMember,
+  IfcRelConnectsWithEccentricity,
+  IfcRelConnectsWithRealizingElements,
+  IfcRelContainedInSpatialStructure,
+  IfcRelCoversBldgElements,
+  IfcRelCoversSpaces,
+  IfcRelDeclares,
+  IfcRelDecomposes,
+  IfcRelDefines,
+  IfcRelDefinesByObject,
+  IfcRelDefinesByProperties,
+  IfcRelDefinesByTemplate,
+  IfcRelDefinesByType,
+  IfcRelFillsElement,
+  IfcRelFlowControlElements,
+  IfcRelInterferesElements,
+  IfcRelNests,
+  IfcRelPositions,
+  IfcRelProjectsElement,
+  IfcRelReferencedInSpatialStructure,
+  IfcRelSequence,
+  IfcRelServicesBuildings,
+  IfcRelSpaceBoundary,
+  IfcRelSpaceBoundary1stLevel,
+  IfcRelSpaceBoundary2ndLevel,
+  IfcRelVoidsElement,
+  IfcRelationship,
+  IfcReparametrisedCompositeCurveSegment,
+  IfcRepresentation,
+  IfcRepresentationContext,
+  IfcRepresentationItem,
+  IfcRepresentationMap,
+  IfcResource,
+  IfcResourceApprovalRelationship,
+  IfcResourceConstraintRelationship,
+  IfcResourceLevelRelationship,
+  IfcResourceTime,
+  IfcRevolvedAreaSolid,
+  IfcRevolvedAreaSolidTapered,
+  IfcRightCircularCone,
+  IfcRightCircularCylinder,
+  IfcRoleEnum,
+  IfcRoof,
+  IfcRoofType,
+  IfcRoofTypeEnum,
+  IfcRoot,
+  IfcRotationalFrequencyMeasure,
+  IfcRotationalMassMeasure,
+  IfcRotationalStiffnessMeasure,
+  IfcRoundedRectangleProfileDef,
+  IfcSIPrefix,
+  IfcSIUnit,
+  IfcSIUnitName,
+  IfcSanitaryTerminal,
+  IfcSanitaryTerminalType,
+  IfcSanitaryTerminalTypeEnum,
+  IfcSchedulingTime,
+  IfcSeamCurve,
+  IfcSectionModulusMeasure,
+  IfcSectionProperties,
+  IfcSectionReinforcementProperties,
+  IfcSectionTypeEnum,
+  IfcSectionalAreaIntegralMeasure,
+  IfcSectionedSolid,
+  IfcSectionedSolidHorizontal,
+  IfcSectionedSpine,
+  IfcSensor,
+  IfcSensorType,
+  IfcSensorTypeEnum,
+  IfcSequenceEnum,
+  IfcShadingDevice,
+  IfcShadingDeviceType,
+  IfcShadingDeviceTypeEnum,
+  IfcShapeAspect,
+  IfcShapeModel,
+  IfcShapeRepresentation,
+  IfcShearModulusMeasure,
+  IfcShellBasedSurfaceModel,
+  IfcSimpleProperty,
+  IfcSimplePropertyTemplate,
+  IfcSimplePropertyTemplateTypeEnum,
+  IfcSite,
+  IfcSlab,
+  IfcSlabElementedCase,
+  IfcSlabStandardCase,
+  IfcSlabType,
+  IfcSlabTypeEnum,
+  IfcSlippageConnectionCondition,
+  IfcSolarDevice,
+  IfcSolarDeviceType,
+  IfcSolarDeviceTypeEnum,
+  IfcSolidAngleMeasure,
+  IfcSolidModel,
+  IfcSoundPowerLevelMeasure,
+  IfcSoundPowerMeasure,
+  IfcSoundPressureLevelMeasure,
+  IfcSoundPressureMeasure,
+  IfcSpace,
+  IfcSpaceHeater,
+  IfcSpaceHeaterType,
+  IfcSpaceHeaterTypeEnum,
+  IfcSpaceType,
+  IfcSpaceTypeEnum,
+  IfcSpatialElement,
+  IfcSpatialElementType,
+  IfcSpatialStructureElement,
+  IfcSpatialStructureElementType,
+  IfcSpatialZone,
+  IfcSpatialZoneType,
+  IfcSpatialZoneTypeEnum,
+  IfcSpecificHeatCapacityMeasure,
+  IfcSpecularExponent,
+  IfcSpecularRoughness,
+  IfcSphere,
+  IfcSphericalSurface,
+  IfcStackTerminal,
+  IfcStackTerminalType,
+  IfcStackTerminalTypeEnum,
+  IfcStair,
+  IfcStairFlight,
+  IfcStairFlightType,
+  IfcStairFlightTypeEnum,
+  IfcStairType,
+  IfcStairTypeEnum,
+  IfcStateEnum,
+  IfcStructuralAction,
+  IfcStructuralActivity,
+  IfcStructuralAnalysisModel,
+  IfcStructuralConnection,
+  IfcStructuralConnectionCondition,
+  IfcStructuralCurveAction,
+  IfcStructuralCurveActivityTypeEnum,
+  IfcStructuralCurveConnection,
+  IfcStructuralCurveMember,
+  IfcStructuralCurveMemberTypeEnum,
+  IfcStructuralCurveMemberVarying,
+  IfcStructuralCurveReaction,
+  IfcStructuralItem,
+  IfcStructuralLinearAction,
+  IfcStructuralLoad,
+  IfcStructuralLoadCase,
+  IfcStructuralLoadConfiguration,
+  IfcStructuralLoadGroup,
+  IfcStructuralLoadLinearForce,
+  IfcStructuralLoadOrResult,
+  IfcStructuralLoadPlanarForce,
+  IfcStructuralLoadSingleDisplacement,
+  IfcStructuralLoadSingleDisplacementDistortion,
+  IfcStructuralLoadSingleForce,
+  IfcStructuralLoadSingleForceWarping,
+  IfcStructuralLoadStatic,
+  IfcStructuralLoadTemperature,
+  IfcStructuralMember,
+  IfcStructuralPlanarAction,
+  IfcStructuralPointAction,
+  IfcStructuralPointConnection,
+  IfcStructuralPointReaction,
+  IfcStructuralReaction,
+  IfcStructuralResultGroup,
+  IfcStructuralSurfaceAction,
+  IfcStructuralSurfaceActivityTypeEnum,
+  IfcStructuralSurfaceConnection,
+  IfcStructuralSurfaceMember,
+  IfcStructuralSurfaceMemberTypeEnum,
+  IfcStructuralSurfaceMemberVarying,
+  IfcStructuralSurfaceReaction,
+  IfcStyleModel,
+  IfcStyledItem,
+  IfcStyledRepresentation,
+  IfcSubContractResource,
+  IfcSubContractResourceType,
+  IfcSubContractResourceTypeEnum,
+  IfcSubedge,
+  IfcSurface,
+  IfcSurfaceCurve,
+  IfcSurfaceCurveSweptAreaSolid,
+  IfcSurfaceFeature,
+  IfcSurfaceFeatureTypeEnum,
+  IfcSurfaceOfLinearExtrusion,
+  IfcSurfaceOfRevolution,
+  IfcSurfaceReinforcementArea,
+  IfcSurfaceSide,
+  IfcSurfaceStyle,
+  IfcSurfaceStyleLighting,
+  IfcSurfaceStyleRefraction,
+  IfcSurfaceStyleRendering,
+  IfcSurfaceStyleShading,
+  IfcSurfaceStyleWithTextures,
+  IfcSurfaceTexture,
+  IfcSweptAreaSolid,
+  IfcSweptDiskSolid,
+  IfcSweptDiskSolidPolygonal,
+  IfcSweptSurface,
+  IfcSwitchingDevice,
+  IfcSwitchingDeviceType,
+  IfcSwitchingDeviceTypeEnum,
+  IfcSystem,
+  IfcSystemFurnitureElement,
+  IfcSystemFurnitureElementType,
+  IfcSystemFurnitureElementTypeEnum,
+  IfcTShapeProfileDef,
+  IfcTable,
+  IfcTableColumn,
+  IfcTableRow,
+  IfcTank,
+  IfcTankType,
+  IfcTankTypeEnum,
+  IfcTask,
+  IfcTaskDurationEnum,
+  IfcTaskTime,
+  IfcTaskTimeRecurring,
+  IfcTaskType,
+  IfcTaskTypeEnum,
+  IfcTelecomAddress,
+  IfcTemperatureGradientMeasure,
+  IfcTemperatureRateOfChangeMeasure,
+  IfcTendon,
+  IfcTendonAnchor,
+  IfcTendonAnchorType,
+  IfcTendonAnchorTypeEnum,
+  IfcTendonConduit,
+  IfcTendonConduitType,
+  IfcTendonConduitTypeEnum,
+  IfcTendonType,
+  IfcTendonTypeEnum,
+  IfcTessellatedFaceSet,
+  IfcTessellatedItem,
+  IfcText,
+  IfcTextAlignment,
+  IfcTextDecoration,
+  IfcTextFontName,
+  IfcTextLiteral,
+  IfcTextLiteralWithExtent,
+  IfcTextPath,
+  IfcTextStyle,
+  IfcTextStyleFontModel,
+  IfcTextStyleForDefinedFont,
+  IfcTextStyleTextModel,
+  IfcTextTransformation,
+  IfcTextureCoordinate,
+  IfcTextureCoordinateGenerator,
+  IfcTextureMap,
+  IfcTextureVertex,
+  IfcTextureVertexList,
+  IfcThermalAdmittanceMeasure,
+  IfcThermalConductivityMeasure,
+  IfcThermalExpansionCoefficientMeasure,
+  IfcThermalResistanceMeasure,
+  IfcThermalTransmittanceMeasure,
+  IfcThermodynamicTemperatureMeasure,
+  IfcTime,
+  IfcTimeMeasure,
+  IfcTimePeriod,
+  IfcTimeSeries,
+  IfcTimeSeriesDataTypeEnum,
+  IfcTimeSeriesValue,
+  IfcTimeStamp,
+  IfcTopologicalRepresentationItem,
+  IfcTopologyRepresentation,
+  IfcToroidalSurface,
+  IfcTorqueMeasure,
+  IfcTransformer,
+  IfcTransformerType,
+  IfcTransformerTypeEnum,
+  IfcTransitionCode,
+  IfcTransitionCurveSegment2D,
+  IfcTransitionCurveType,
+  IfcTransportElement,
+  IfcTransportElementType,
+  IfcTransportElementTypeEnum,
+  IfcTrapeziumProfileDef,
+  IfcTriangulatedFaceSet,
+  IfcTriangulatedIrregularNetwork,
+  IfcTrimmedCurve,
+  IfcTrimmingPreference,
+  IfcTubeBundle,
+  IfcTubeBundleType,
+  IfcTubeBundleTypeEnum,
+  IfcTypeObject,
+  IfcTypeProcess,
+  IfcTypeProduct,
+  IfcTypeResource,
+  IfcURIReference,
+  IfcUShapeProfileDef,
+  IfcUnitAssignment,
+  IfcUnitEnum,
+  IfcUnitaryControlElement,
+  IfcUnitaryControlElementType,
+  IfcUnitaryControlElementTypeEnum,
+  IfcUnitaryEquipment,
+  IfcUnitaryEquipmentType,
+  IfcUnitaryEquipmentTypeEnum,
+  IfcValve,
+  IfcValveType,
+  IfcValveTypeEnum,
+  IfcVaporPermeabilityMeasure,
+  IfcVector,
+  IfcVertex,
+  IfcVertexLoop,
+  IfcVertexPoint,
+  IfcVibrationDamper,
+  IfcVibrationDamperType,
+  IfcVibrationDamperTypeEnum,
+  IfcVibrationIsolator,
+  IfcVibrationIsolatorType,
+  IfcVibrationIsolatorTypeEnum,
+  IfcVirtualElement,
+  IfcVirtualGridIntersection,
+  IfcVoidingFeature,
+  IfcVoidingFeatureTypeEnum,
+  IfcVolumeMeasure,
+  IfcVolumetricFlowRateMeasure,
+  IfcWall,
+  IfcWallElementedCase,
+  IfcWallStandardCase,
+  IfcWallType,
+  IfcWallTypeEnum,
+  IfcWarpingConstantMeasure,
+  IfcWarpingMomentMeasure,
+  IfcWasteTerminal,
+  IfcWasteTerminalType,
+  IfcWasteTerminalTypeEnum,
+  IfcWindow,
+  IfcWindowLiningProperties,
+  IfcWindowPanelOperationEnum,
+  IfcWindowPanelPositionEnum,
+  IfcWindowPanelProperties,
+  IfcWindowStandardCase,
+  IfcWindowStyle,
+  IfcWindowStyleConstructionEnum,
+  IfcWindowStyleOperationEnum,
+  IfcWindowType,
+  IfcWindowTypeEnum,
+  IfcWindowTypePartitioningEnum,
+  IfcWorkCalendar,
+  IfcWorkCalendarTypeEnum,
+  IfcWorkControl,
+  IfcWorkPlan,
+  IfcWorkPlanTypeEnum,
+  IfcWorkSchedule,
+  IfcWorkScheduleTypeEnum,
+  IfcWorkTime,
+  IfcZShapeProfileDef,
+  IfcZone,
+  LABEL,
+  LINE_END,
+  REAL,
+  REF,
+  SET_BEGIN,
+  SET_END,
+  STRING,
+  UNKNOWN,
+  Value,
+  ms
+};
+
+
+ var WasmPath = "";

BIN
examples/jsm/loaders/ifc/web-ifc.wasm


+ 12 - 9
examples/jsm/misc/Volume.js

@@ -17,7 +17,7 @@ import { VolumeSlice } from '../misc/VolumeSlice.js';
  * @param   {string}        type            The type of data (uint8, uint16, ...)
  * @param   {ArrayBuffer}   arrayBuffer     The buffer with volume data
  */
-var Volume = function ( xLength, yLength, zLength, type, arrayBuffer ) {
+function Volume( xLength, yLength, zLength, type, arrayBuffer ) {
 
 	if ( arguments.length > 0 ) {
 
@@ -33,7 +33,10 @@ var Volume = function ( xLength, yLength, zLength, type, arrayBuffer ) {
 		 * @member {number} zLength Depth of the volume in the IJK coordinate system
 		 */
 		this.zLength = Number( zLength ) || 1;
-
+		/**
+		 * @member {Array<string>} The order of the Axis dictated by the NRRD header
+		 */
+		this.axisOrder = [ 'x', 'y', 'z' ];
 		/**
 		 * @member {TypedArray} data Data of the volume
 		 */
@@ -193,7 +196,7 @@ var Volume = function ( xLength, yLength, zLength, type, arrayBuffer ) {
 	 * @member {Array} RASDimensions This array holds the dimensions of the volume in the RAS space
 	 */
 
-};
+}
 
 Volume.prototype = {
 
@@ -301,8 +304,8 @@ Volume.prototype = {
 				axisInIJK.set( 1, 0, 0 );
 				firstDirection.set( 0, 0, - 1 );
 				secondDirection.set( 0, - 1, 0 );
-				firstSpacing = this.spacing[ 2 ];
-				secondSpacing = this.spacing[ 1 ];
+				firstSpacing = this.spacing[ this.axisOrder.indexOf( 'z' ) ];
+				secondSpacing = this.spacing[ this.axisOrder.indexOf( 'y' ) ];
 				IJKIndex = new Vector3( RASIndex, 0, 0 );
 
 				planeMatrix.multiply( ( new Matrix4() ).makeRotationY( Math.PI / 2 ) );
@@ -313,8 +316,8 @@ Volume.prototype = {
 				axisInIJK.set( 0, 1, 0 );
 				firstDirection.set( 1, 0, 0 );
 				secondDirection.set( 0, 0, 1 );
-				firstSpacing = this.spacing[ 0 ];
-				secondSpacing = this.spacing[ 2 ];
+				firstSpacing = this.spacing[ this.axisOrder.indexOf( 'x' ) ];
+				secondSpacing = this.spacing[ this.axisOrder.indexOf( 'z' ) ];
 				IJKIndex = new Vector3( 0, RASIndex, 0 );
 
 				planeMatrix.multiply( ( new Matrix4() ).makeRotationX( - Math.PI / 2 ) );
@@ -326,8 +329,8 @@ Volume.prototype = {
 				axisInIJK.set( 0, 0, 1 );
 				firstDirection.set( 1, 0, 0 );
 				secondDirection.set( 0, - 1, 0 );
-				firstSpacing = this.spacing[ 0 ];
-				secondSpacing = this.spacing[ 1 ];
+				firstSpacing = this.spacing[ this.axisOrder.indexOf( 'x' ) ];
+				secondSpacing = this.spacing[ this.axisOrder.indexOf( 'y' ) ];
 				IJKIndex = new Vector3( 0, 0, RASIndex );
 
 				positionOffset = ( volume.RASDimensions[ 2 ] - 1 ) / 2;

+ 2 - 2
examples/jsm/misc/VolumeSlice.js

@@ -16,7 +16,7 @@ import {
  * @param   {string}       [axis='z']      For now only 'x', 'y' or 'z' but later it will change to a normal vector
  * @see Volume
  */
-var VolumeSlice = function ( volume, index, axis ) {
+function VolumeSlice( volume, index, axis ) {
 
 	var slice = this;
 	/**
@@ -95,7 +95,7 @@ var VolumeSlice = function ( volume, index, axis ) {
 	 */
 
 
-};
+}
 
 VolumeSlice.prototype = {
 

+ 7 - 10
examples/jsm/modifiers/SimplifyModifier.js

@@ -64,7 +64,7 @@ class SimplifyModifier {
 
 			const v = new Vector3().fromBufferAttribute( positionAttribute, i );
 
-			const vertex = new Vertex( v, i );
+			const vertex = new Vertex( v );
 			vertices.push( vertex );
 
 		}
@@ -141,6 +141,8 @@ class SimplifyModifier {
 
 			const vertex = vertices[ i ].position;
 			position.push( vertex.x, vertex.y, vertex.z );
+			// cache final index to GREATLY speed up faces reconstruction
+			vertices[ i ].id = i;
 
 		}
 
@@ -149,12 +151,7 @@ class SimplifyModifier {
 		for ( let i = 0; i < faces.length; i ++ ) {
 
 			const face = faces[ i ];
-
-			const a = vertices.indexOf( face.v1 );
-			const b = vertices.indexOf( face.v2 );
-			const c = vertices.indexOf( face.v3 );
-
-			index.push( a, b, c );
+			index.push( face.v1.id, face.v2.id, face.v3.id );
 
 		}
 
@@ -500,11 +497,11 @@ class Triangle {
 
 class Vertex {
 
-	constructor( v, id ) {
+	constructor( v ) {
 
 		this.position = v;
-
-		this.id = id; // old index id
+			
+		this.id = -1; // external use position in vertices list (for e.g. face generation)
 
 		this.faces = []; // faces vertex is connected
 		this.neighbors = []; // neighbouring vertices aka "adjacentVertices"

+ 9 - 0
examples/jsm/objects/Reflector.js

@@ -221,12 +221,17 @@ Reflector.ReflectorShader = {
 		uniform mat4 textureMatrix;
 		varying vec4 vUv;
 
+		#include <common>
+		#include <logdepthbuf_pars_vertex>
+
 		void main() {
 
 			vUv = textureMatrix * vec4( position, 1.0 );
 
 			gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
 
+			#include <logdepthbuf_vertex>
+
 		}`,
 
 	fragmentShader: /* glsl */`
@@ -234,6 +239,8 @@ Reflector.ReflectorShader = {
 		uniform sampler2D tDiffuse;
 		varying vec4 vUv;
 
+		#include <logdepthbuf_pars_fragment>
+
 		float blendOverlay( float base, float blend ) {
 
 			return( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );
@@ -248,6 +255,8 @@ Reflector.ReflectorShader = {
 
 		void main() {
 
+			#include <logdepthbuf_fragment>
+
 			vec4 base = texture2DProj( tDiffuse, vUv );
 			gl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );
 

+ 7 - 7
examples/jsm/renderers/webgpu/WebGPURenderer.js

@@ -138,8 +138,8 @@ class WebGPURenderer {
 
 		}
 
-		this._parameters.nonGuaranteedFeatures = ( parameters.nonGuaranteedFeatures === undefined ) ? [] : parameters.nonGuaranteedFeatures;
-		this._parameters.nonGuaranteedLimits = ( parameters.nonGuaranteedLimits === undefined ) ? {} : parameters.nonGuaranteedLimits;
+		this._parameters.requiredFeatures = ( parameters.requiredFeatures === undefined ) ? [] : parameters.requiredFeatures;
+		this._parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits;
 
 	}
 
@@ -154,8 +154,8 @@ class WebGPURenderer {
 		const adapter = await navigator.gpu.requestAdapter( adapterOptions );
 
 		const deviceDescriptor = {
-			nonGuaranteedFeatures: parameters.nonGuaranteedFeatures,
-			nonGuaranteedLimits: parameters.nonGuaranteedLimits
+			requiredFeatures: parameters.requiredFeatures,
+			requiredLimits: parameters.requiredLimits
 		};
 
 		const device = await adapter.requestDevice( deviceDescriptor );
@@ -164,7 +164,7 @@ class WebGPURenderer {
 
 		const context = ( parameters.context !== undefined ) ? parameters.context : this.domElement.getContext( 'gpupresent' );
 
-		const swapChain = context.configureSwapChain( {
+		const swapChain = context.configure( {
 			device: device,
 			format: GPUTextureFormat.BRGA8Unorm // this is the only valid swap chain format right now (r121)
 		} );
@@ -256,11 +256,11 @@ class WebGPURenderer {
 			if ( this._parameters.antialias === true ) {
 
 				colorAttachment.view = this._colorBuffer.createView();
-				colorAttachment.resolveTarget = this._swapChain.getCurrentTexture().createView();
+				colorAttachment.resolveTarget = this._context.getCurrentTexture().createView();
 
 			} else {
 
-				colorAttachment.view = this._swapChain.getCurrentTexture().createView();
+				colorAttachment.view = this._context.getCurrentTexture().createView();
 				colorAttachment.resolveTarget = undefined;
 
 			}

+ 5 - 5
examples/jsm/renderers/webgpu/WebGPUTextures.js

@@ -366,7 +366,7 @@ class WebGPUTextures {
 
 				this._getImageBitmap( image, texture ).then( imageBitmap => {
 
-					this._copyImageBitmapToTexture( imageBitmap, textureGPU );
+					this._copyExternalImageToTexture( imageBitmap, textureGPU );
 
 					if ( needsMipmaps === true ) this._generateMipmaps( textureGPU, textureGPUDescriptor );
 
@@ -416,7 +416,7 @@ class WebGPUTextures {
 
 			this._getImageBitmap( image, texture ).then( imageBitmap => {
 
-				this._copyImageBitmapToTexture( imageBitmap, textureGPU, { x: 0, y: 0, z: i } );
+				this._copyExternalImageToTexture( imageBitmap, textureGPU, { x: 0, y: 0, z: i } );
 
 			} );
 
@@ -424,11 +424,11 @@ class WebGPUTextures {
 
 	}
 
-	_copyImageBitmapToTexture( image, textureGPU, origin = { x: 0, y: 0, z: 0 } ) {
+	_copyExternalImageToTexture( image, textureGPU, origin = { x: 0, y: 0, z: 0 } ) {
 
-		this.device.queue.copyImageBitmapToTexture(
+		this.device.queue.copyExternalImageToTexture(
 			{
-				imageBitmap: image
+				source: image
 			}, {
 				texture: textureGPU,
 				mipLevel: 0,

+ 137 - 0
examples/jsm/shaders/MMDToonShader.js

@@ -0,0 +1,137 @@
+/**
+ * MMD Toon Shader
+ *
+ * This shader is extended from MeshPhongMaterial, and merged algorithms with
+ * MeshToonMaterial and MeshMetcapMaterial.
+ * Ideas came from https://github.com/mrdoob/three.js/issues/19609
+ *
+ * Combining steps:
+ *  * Declare matcap uniform.
+ *  * Add gradientmap_pars_fragment.
+ *  * Use gradient irradiances instead of dotNL irradiance from MeshPhongMaterial.
+ *    (Replace lights_phong_pars_fragment with lights_mmd_toon_pars_fragment)
+ *  * Add mmd_toon_matcap_fragment.
+ */
+
+import { UniformsUtils, ShaderLib } from '../../../build/three.module.js';
+
+const lights_mmd_toon_pars_fragment = `
+varying vec3 vViewPosition;
+
+#ifndef FLAT_SHADED
+
+	varying vec3 vNormal;
+
+#endif
+
+
+struct BlinnPhongMaterial {
+
+	vec3 diffuseColor;
+	vec3 specularColor;
+	float specularShininess;
+	float specularStrength;
+
+};
+
+void RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
+
+	vec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;
+
+	#ifndef PHYSICALLY_CORRECT_LIGHTS
+
+		irradiance *= PI; // punctual light
+
+	#endif
+
+	reflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );
+
+	reflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;
+
+}
+
+void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {
+
+	reflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );
+
+}
+
+#define RE_Direct				RE_Direct_BlinnPhong
+#define RE_IndirectDiffuse		RE_IndirectDiffuse_BlinnPhong
+
+#define Material_LightProbeLOD( material )	(0)
+`;
+
+const mmd_toon_matcap_fragment = `
+#ifdef USE_MATCAP
+
+	vec3 viewDir = normalize( vViewPosition );
+	vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );
+	vec3 y = cross( viewDir, x );
+	vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks
+	vec4 matcapColor = texture2D( matcap, uv );
+	matcapColor = matcapTexelToLinear( matcapColor );
+
+	#ifdef MATCAP_BLENDING_MULTIPLY
+
+		outgoingLight *= matcapColor.rgb;
+
+	#elif defined( MATCAP_BLENDING_ADD )
+
+		outgoingLight += matcapColor.rgb;
+
+	#endif
+
+#endif
+`;
+
+const MMDToonShader = {
+
+	defines: {
+		TOON: true,
+		MATCAP: true,
+		MATCAP_BLENDING_ADD: true,
+	},
+
+	uniforms: UniformsUtils.merge( [
+		ShaderLib.toon.uniforms,
+		ShaderLib.phong.uniforms,
+		ShaderLib.matcap.uniforms,
+	] ),
+
+	vertexShader: ShaderLib.phong.vertexShader,
+
+	fragmentShader:
+		ShaderLib.phong.fragmentShader
+			.replace(
+				'#include <common>',
+				`
+					#ifdef USE_MATCAP
+						uniform sampler2D matcap;
+					#endif
+
+					#include <common>
+				`
+			)
+			.replace(
+				'#include <envmap_common_pars_fragment>',
+				`
+					#include <gradientmap_pars_fragment>
+					#include <envmap_common_pars_fragment>
+				`
+			)
+			.replace(
+				'#include <lights_phong_pars_fragment>',
+				lights_mmd_toon_pars_fragment
+			)
+			.replace(
+				'#include <envmap_fragment>',
+				`
+					#include <envmap_fragment>
+					${mmd_toon_matcap_fragment}
+				`
+			),
+
+};
+
+export { MMDToonShader };

+ 1 - 1
examples/jsm/shaders/WaterRefractionShader.js

@@ -65,7 +65,7 @@ const WaterRefractionShader = {
 
 		void main() {
 
-		 float waveStrength = 0.1;
+		 float waveStrength = 0.5;
 		 float waveSpeed = 0.03;
 
 			// simple distortion (ripple) via dudv map (see https://www.youtube.com/watch?v=6B7IF6GOu7s)

+ 1 - 1
examples/jsm/webxr/VRButton.js

@@ -68,7 +68,7 @@ class VRButton {
 					// ('local' is always available for immersive sessions and doesn't need to
 					// be requested separately.)
 
-					const sessionInit = { optionalFeatures: [ 'local-floor', 'bounded-floor', 'hand-tracking' ] };
+					const sessionInit = { optionalFeatures: [ 'local-floor', 'bounded-floor', 'hand-tracking', 'layers' ] };
 					navigator.xr.requestSession( 'immersive-vr', sessionInit ).then( onSessionStarted );
 
 				} else {

+ 4 - 4
examples/misc_controls_transform.html

@@ -83,7 +83,7 @@
 					switch ( event.keyCode ) {
 
 						case 81: // Q
-							control.setSpace( control.space === "local" ? "world" : "local" );
+							control.setSpace( control.space === 'local' ? 'world' : 'local' );
 							break;
 
 						case 16: // Shift
@@ -93,15 +93,15 @@
 							break;
 
 						case 87: // W
-							control.setMode( "translate" );
+							control.setMode( 'translate' );
 							break;
 
 						case 69: // E
-							control.setMode( "rotate" );
+							control.setMode( 'rotate' );
 							break;
 
 						case 82: // R
-							control.setMode( "scale" );
+							control.setMode( 'scale' );
 							break;
 
 						case 67: // C

BIN
examples/models/gltf/TransmissionTest/glTF/TransmissionTest_binary.bin → examples/models/gltf/TransmissionTest.glb


+ 0 - 14
examples/models/gltf/TransmissionTest/README.md

@@ -1,14 +0,0 @@
-# Transmission Test
-
-## Screenshot
-
-![screenshot](screenshot/screenshot_large.png)
-
-## Description
-
-This model demonstrates the usage of the `KHR_materials_transmission`. The grid of spheres demonstrate different combinations of uniform transmission and textured transmission and how they should render in conjunction with opacity (`baseColor.a`) and surface roughness/metalicity.
-
-## License Information
-
-[![CC0](http://i.creativecommons.org/p/zero/1.0/88x31.png)](http://creativecommons.org/publicdomain/zero/1.0/)  
-To the extent possible under law, Adobe has waived all copyright and related or neighboring rights to this asset.

+ 0 - 1628
examples/models/gltf/TransmissionTest/glTF/TransmissionTest.gltf

@@ -1,1628 +0,0 @@
-{
-    "asset": {
-        "copyright": "2020 (c) Adobe Inc.",
-        "generator": "Adobe Dimension - 63f6e07d31a7b4abc83cb799813e511e9e5587a5",
-        "version": "2.0",
-        "extensions": {
-            "KHR_xmp": {
-                "packet": 0
-            }
-        }
-    },
-    "accessors": [
-        {
-            "bufferView": 0,
-            "componentType": 5126,
-            "count": 22202,
-            "type": "VEC3",
-            "max": [
-                0.9809443354606628,
-                1.0221298933029175,
-                1.4283748865127564
-            ],
-            "min": [
-                -0.8216659426689148,
-                0.0015843699220567942,
-                -0.46063709259033205
-            ]
-        },
-        {
-            "bufferView": 1,
-            "componentType": 5126,
-            "count": 22202,
-            "type": "VEC3"
-        },
-        {
-            "bufferView": 2,
-            "componentType": 5126,
-            "count": 22202,
-            "type": "VEC2"
-        },
-        {
-            "bufferView": 3,
-            "componentType": 5125,
-            "count": 131337,
-            "type": "SCALAR",
-            "max": [
-                22201
-            ],
-            "min": [
-                0
-            ]
-        },
-        {
-            "bufferView": 4,
-            "componentType": 5126,
-            "count": 3719,
-            "type": "VEC3",
-            "max": [
-                0.09999999403953552,
-                0.19999998807907105,
-                0.10000000894069672
-            ],
-            "min": [
-                -0.1000000387430191,
-                0.0,
-                -0.1000000536441803
-            ]
-        },
-        {
-            "bufferView": 5,
-            "componentType": 5126,
-            "count": 3719,
-            "type": "VEC3"
-        },
-        {
-            "bufferView": 6,
-            "componentType": 5126,
-            "count": 3719,
-            "type": "VEC2"
-        },
-        {
-            "bufferView": 7,
-            "componentType": 5125,
-            "count": 21240,
-            "type": "SCALAR",
-            "max": [
-                3718
-            ],
-            "min": [
-                0
-            ]
-        },
-        {
-            "bufferView": 8,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC3",
-            "max": [
-                0.8968609571456909,
-                0.20853587985038758,
-                3.397480696776256e-8
-            ],
-            "min": [
-                -0.9147982001304627,
-                -0.20853577554225923,
-                -0.010000113397836686
-            ]
-        },
-        {
-            "bufferView": 9,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC3"
-        },
-        {
-            "bufferView": 10,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC2"
-        },
-        {
-            "bufferView": 11,
-            "componentType": 5125,
-            "count": 12,
-            "type": "SCALAR",
-            "max": [
-                7
-            ],
-            "min": [
-                0
-            ]
-        },
-        {
-            "bufferView": 12,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC3",
-            "max": [
-                2.0,
-                0.21764808893203736,
-                3.545937232729557e-8
-            ],
-            "min": [
-                -2.0,
-                -0.21764802932739259,
-                -0.01000013668090105
-            ]
-        },
-        {
-            "bufferView": 13,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC3"
-        },
-        {
-            "bufferView": 14,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC2"
-        },
-        {
-            "bufferView": 15,
-            "componentType": 5125,
-            "count": 12,
-            "type": "SCALAR",
-            "max": [
-                7
-            ],
-            "min": [
-                0
-            ]
-        },
-        {
-            "bufferView": 16,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC3",
-            "max": [
-                1.0280373096466065,
-                0.23501670360565186,
-                3.8289083903464419e-8
-            ],
-            "min": [
-                -0.9682242274284363,
-                -0.2350165843963623,
-                -0.01000012457370758
-            ]
-        },
-        {
-            "bufferView": 17,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC3"
-        },
-        {
-            "bufferView": 18,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC2"
-        },
-        {
-            "bufferView": 19,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC3",
-            "max": [
-                2.0,
-                0.23026323318481446,
-                3.751463495405005e-8
-            ],
-            "min": [
-                -2.0,
-                -0.23026317358016969,
-                -0.010000579059123993
-            ]
-        },
-        {
-            "bufferView": 20,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC3"
-        },
-        {
-            "bufferView": 21,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC2"
-        },
-        {
-            "bufferView": 22,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC3",
-            "max": [
-                2.0,
-                0.22341907024383546,
-                3.6399587344249088e-8
-            ],
-            "min": [
-                -2.0,
-                -0.22341907024383546,
-                -0.009999859146773816
-            ]
-        },
-        {
-            "bufferView": 23,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC3"
-        },
-        {
-            "bufferView": 24,
-            "componentType": 5126,
-            "count": 8,
-            "type": "VEC2"
-        }
-    ],
-    "bufferViews": [
-        {
-            "buffer": 0,
-            "byteOffset": 0,
-            "byteLength": 266424,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 266424,
-            "byteLength": 266424,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 532848,
-            "byteLength": 177616,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 710464,
-            "byteLength": 525348,
-            "target": 34963
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1235812,
-            "byteLength": 44628,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1280440,
-            "byteLength": 44628,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1325068,
-            "byteLength": 29752,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1354820,
-            "byteLength": 84960,
-            "target": 34963
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1439780,
-            "byteLength": 96,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1439876,
-            "byteLength": 96,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1439972,
-            "byteLength": 64,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440036,
-            "byteLength": 48,
-            "target": 34963
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440084,
-            "byteLength": 96,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440180,
-            "byteLength": 96,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440276,
-            "byteLength": 64,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440340,
-            "byteLength": 48,
-            "target": 34963
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440388,
-            "byteLength": 96,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440484,
-            "byteLength": 96,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440580,
-            "byteLength": 64,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440644,
-            "byteLength": 96,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440740,
-            "byteLength": 96,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440836,
-            "byteLength": 64,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440900,
-            "byteLength": 96,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1440996,
-            "byteLength": 96,
-            "target": 34962
-        },
-        {
-            "buffer": 0,
-            "byteOffset": 1441092,
-            "byteLength": 64,
-            "target": 34962
-        }
-    ],
-    "buffers": [
-        {
-            "byteLength": 1441156,
-            "uri": "TransmissionTest_binary.bin"
-        }
-    ],
-    "cameras": [
-        {
-            "perspective": {
-                "znear": 0.00005606882768915966,
-                "yfov": 0.6024156808853149,
-                "zfar": 3.0837855339050295,
-                "aspectRatio": 1.3333333730697632
-            },
-            "type": "perspective",
-            "name": "render_camera"
-        }
-    ],
-    "images": [
-        {
-            "name": "texture28577",
-            "uri": "TransmissionTest_images/texture28577.jpg",
-            "mimeType": "image/jpeg"
-        },
-        {
-            "name": "texture14184",
-            "uri": "TransmissionTest_images/texture14184.jpg",
-            "mimeType": "image/jpeg"
-        },
-        {
-            "name": "texture214190",
-            "uri": "TransmissionTest_images/texture214190.png",
-            "mimeType": "image/png"
-        },
-        {
-            "name": "texture4086",
-            "uri": "TransmissionTest_images/texture4086.png",
-            "mimeType": "image/png"
-        },
-        {
-            "name": "texture177328",
-            "uri": "TransmissionTest_images/texture177328.png",
-            "mimeType": "image/png"
-        },
-        {
-            "name": "texture6807",
-            "uri": "TransmissionTest_images/texture6807.png",
-            "mimeType": "image/png"
-        },
-        {
-            "name": "texture175763",
-            "uri": "TransmissionTest_images/texture175763.png",
-            "mimeType": "image/png"
-        },
-        {
-            "name": "texture10487",
-            "uri": "TransmissionTest_images/texture10487.png",
-            "mimeType": "image/png"
-        },
-        {
-            "name": "texture15366",
-            "uri": "TransmissionTest_images/texture15366.jpg",
-            "mimeType": "image/jpeg"
-        }
-    ],
-    "materials": [
-        {
-            "pbrMetallicRoughness": {
-                "baseColorTexture": {
-                    "index": 0
-                },
-                "metallicFactor": 0.0,
-                "roughnessFactor": 0.4934999942779541
-            },
-            "name": "Cloth Backdrop"
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.9559729695320129,
-                    0.17788879573345185,
-                    0.09530720859766007,
-                    1.0
-                ],
-                "metallicFactor": 0.0,
-                "roughnessFactor": 0.0
-            },
-            "name": "RedTransTexture",
-            "doubleSided": true,
-            "extensions": {
-                "KHR_materials_transmission": {
-                    "transmissionFactor": 1,
-                    "transmissionTexture": {
-                        "index": 1
-                    }
-                }
-            }
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.8468738198280335,
-                    0.8713662624359131,
-                    0.09305903315544129,
-                    1.0
-                ],
-                "metallicFactor": 0.0,
-                "roughnessFactor": 0.0
-            },
-            "name": "YellowTrans",
-            "doubleSided": true,
-            "extensions": {
-                "KHR_materials_transmission": {
-                    "transmissionFactor": 1
-                }
-            }
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.08650036156177521,
-                    0.46207714080810549,
-                    0.8468738198280335,
-                    1.0
-                ],
-                "baseColorTexture": {
-                    "index": 2
-                },
-                "metallicFactor": 0.0,
-                "roughnessFactor": 0.0
-            },
-            "alphaMode": "MASK",
-            "name": "BlueTransWithMask",
-            "doubleSided": true,
-            "extensions": {
-                "KHR_materials_transmission": {
-                    "transmissionFactor": 1,
-                    "transmissionTexture": {
-                        "index": 1
-                    }
-                }
-            }
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.1499594897031784,
-                    0.83077073097229,
-                    0.19120188057422639,
-                    1.0
-                ],
-                "baseColorTexture": {
-                    "index": 3
-                },
-                "metallicFactor": 0.0,
-                "roughnessFactor": 0.0
-            },
-            "alphaMode": "MASK",
-            "name": "GreenMask",
-            "doubleSided": true,
-            "extensions": {
-                "KHR_materials_transmission": {
-                    "transmissionFactor": 1
-                }
-            }
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.9559729695320129,
-                    0.17788879573345185,
-                    0.09530720859766007,
-                    1.0
-                ],
-                "metallicFactor": 0.0,
-                "metallicRoughnessTexture": {
-                    "index": 4
-                }
-            },
-            "name": "RedTransTextureRough",
-            "doubleSided": true,
-            "extensions": {
-                "KHR_materials_transmission": {
-                    "transmissionFactor": 1,
-                    "transmissionTexture": {
-                        "index": 1
-                    }
-                }
-            }
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.8468738198280335,
-                    0.8713662624359131,
-                    0.09305903315544129,
-                    1.0
-                ],
-                "metallicFactor": 0.0,
-                "metallicRoughnessTexture": {
-                    "index": 5
-                }
-            },
-            "name": "YellowTransRough",
-            "doubleSided": true,
-            "extensions": {
-                "KHR_materials_transmission": {
-                    "transmissionFactor": 1
-                }
-            }
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.08650036156177521,
-                    0.46207714080810549,
-                    0.8468738198280335,
-                    1.0
-                ],
-                "baseColorTexture": {
-                    "index": 2
-                },
-                "metallicFactor": 0.0,
-                "metallicRoughnessTexture": {
-                    "index": 4
-                }
-            },
-            "alphaMode": "MASK",
-            "name": "BlueTransWithMask",
-            "doubleSided": true,
-            "extensions": {
-                "KHR_materials_transmission": {
-                    "transmissionFactor": 1,
-                    "transmissionTexture": {
-                        "index": 1
-                    }
-                }
-            }
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.1499594897031784,
-                    0.83077073097229,
-                    0.19120188057422639,
-                    1.0
-                ],
-                "baseColorTexture": {
-                    "index": 3
-                },
-                "metallicFactor": 0.0,
-                "roughnessFactor": 0.3199999928474426
-            },
-            "alphaMode": "MASK",
-            "name": "GreenMaskRough",
-            "doubleSided": true,
-            "extensions": {
-                "KHR_materials_transmission": {
-                    "transmissionFactor": 1
-                }
-            }
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.9559729695320129,
-                    0.17788879573345185,
-                    0.09530720859766007,
-                    1.0
-                ],
-                "roughnessFactor": 0.0,
-                "metallicRoughnessTexture": {
-                    "index": 6
-                }
-            },
-            "name": "RedTransTextureMetal",
-            "doubleSided": true,
-            "extensions": {
-                "KHR_materials_transmission": {
-                    "transmissionFactor": 1,
-                    "transmissionTexture": {
-                        "index": 1
-                    }
-                }
-            }
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.8468738198280335,
-                    0.8713662624359131,
-                    0.09305903315544129,
-                    1.0
-                ],
-                "roughnessFactor": 0.0,
-                "metallicRoughnessTexture": {
-                    "index": 7
-                }
-            },
-            "name": "YellowTransMetal",
-            "doubleSided": true,
-            "extensions": {
-                "KHR_materials_transmission": {
-                    "transmissionFactor": 1
-                }
-            }
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.1499594897031784,
-                    0.83077073097229,
-                    0.19120188057422639,
-                    1.0
-                ],
-                "baseColorTexture": {
-                    "index": 3
-                },
-                "roughnessFactor": 0.0,
-                "metallicRoughnessTexture": {
-                    "index": 6
-                }
-            },
-            "alphaMode": "MASK",
-            "name": "GreenMaskMetal",
-            "doubleSided": true,
-            "extensions": {
-                "KHR_materials_transmission": {
-                    "transmissionFactor": 1
-                }
-            }
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.08650036156177521,
-                    0.46207714080810549,
-                    0.8468738198280335,
-                    1.0
-                ],
-                "baseColorTexture": {
-                    "index": 2
-                },
-                "roughnessFactor": 0.0,
-                "metallicRoughnessTexture": {
-                    "index": 6
-                }
-            },
-            "alphaMode": "MASK",
-            "name": "BlueTransWithMask",
-            "doubleSided": true,
-            "extensions": {
-                "KHR_materials_transmission": {
-                    "transmissionFactor": 1,
-                    "transmissionTexture": {
-                        "index": 1
-                    }
-                }
-            }
-        },
-        {
-            "pbrMetallicRoughness": {
-                "baseColorFactor": [
-                    0.0,
-                    0.0,
-                    0.0,
-                    1.0
-                ],
-                "metallicFactor": 0.0,
-                "roughnessFactor": 0.8999999761581421
-            },
-            "emissiveTexture": {
-                "index": 8
-            },
-            "emissiveFactor": [
-                1.0,
-                1.0,
-                1.0
-            ],
-            "name": "LabelMaterial"
-        }
-    ],
-    "meshes": [
-        {
-            "name": "Cloth Backdrop 01",
-            "primitives": [
-                {
-                    "attributes": {
-                        "TEXCOORD_0": 2,
-                        "NORMAL": 1,
-                        "POSITION": 0
-                    },
-                    "indices": 3,
-                    "material": 0
-                }
-            ]
-        },
-        {
-            "name": "Sphere",
-            "primitives": [
-                {
-                    "attributes": {
-                        "POSITION": 4,
-                        "NORMAL": 5,
-                        "TEXCOORD_0": 6
-                    },
-                    "indices": 7,
-                    "material": 1
-                }
-            ]
-        },
-        {
-            "name": "Sphere",
-            "primitives": [
-                {
-                    "attributes": {
-                        "TEXCOORD_0": 6,
-                        "NORMAL": 5,
-                        "POSITION": 4
-                    },
-                    "indices": 7,
-                    "material": 2
-                }
-            ]
-        },
-        {
-            "name": "Sphere",
-            "primitives": [
-                {
-                    "attributes": {
-                        "TEXCOORD_0": 6,
-                        "NORMAL": 5,
-                        "POSITION": 4
-                    },
-                    "indices": 7,
-                    "material": 3
-                }
-            ]
-        },
-        {
-            "name": "Sphere",
-            "primitives": [
-                {
-                    "attributes": {
-                        "POSITION": 4,
-                        "NORMAL": 5,
-                        "TEXCOORD_0": 6
-                    },
-                    "indices": 7,
-                    "material": 4
-                }
-            ]
-        },
-        {
-            "name": "Sphere",
-            "primitives": [
-                {
-                    "attributes": {
-                        "POSITION": 4,
-                        "NORMAL": 5,
-                        "TEXCOORD_0": 6
-                    },
-                    "indices": 7,
-                    "material": 5
-                }
-            ]
-        },
-        {
-            "name": "Sphere",
-            "primitives": [
-                {
-                    "attributes": {
-                        "POSITION": 4,
-                        "NORMAL": 5,
-                        "TEXCOORD_0": 6
-                    },
-                    "indices": 7,
-                    "material": 6
-                }
-            ]
-        },
-        {
-            "name": "Sphere",
-            "primitives": [
-                {
-                    "attributes": {
-                        "POSITION": 4,
-                        "NORMAL": 5,
-                        "TEXCOORD_0": 6
-                    },
-                    "indices": 7,
-                    "material": 7
-                }
-            ]
-        },
-        {
-            "name": "Sphere",
-            "primitives": [
-                {
-                    "attributes": {
-                        "TEXCOORD_0": 6,
-                        "NORMAL": 5,
-                        "POSITION": 4
-                    },
-                    "indices": 7,
-                    "material": 8
-                }
-            ]
-        },
-        {
-            "name": "Sphere",
-            "primitives": [
-                {
-                    "attributes": {
-                        "TEXCOORD_0": 6,
-                        "NORMAL": 5,
-                        "POSITION": 4
-                    },
-                    "indices": 7,
-                    "material": 9
-                }
-            ]
-        },
-        {
-            "name": "Sphere",
-            "primitives": [
-                {
-                    "attributes": {
-                        "TEXCOORD_0": 6,
-                        "NORMAL": 5,
-                        "POSITION": 4
-                    },
-                    "indices": 7,
-                    "material": 10
-                }
-            ]
-        },
-        {
-            "name": "Sphere",
-            "primitives": [
-                {
-                    "attributes": {
-                        "TEXCOORD_0": 6,
-                        "NORMAL": 5,
-                        "POSITION": 4
-                    },
-                    "indices": 7,
-                    "material": 11
-                }
-            ]
-        },
-        {
-            "name": "Sphere",
-            "primitives": [
-                {
-                    "attributes": {
-                        "TEXCOORD_0": 6,
-                        "NORMAL": 5,
-                        "POSITION": 4
-                    },
-                    "indices": 7,
-                    "material": 12
-                }
-            ]
-        },
-        {
-            "name": "X1_Label_Coated",
-            "primitives": [
-                {
-                    "attributes": {
-                        "TEXCOORD_0": 10,
-                        "NORMAL": 9,
-                        "POSITION": 8
-                    },
-                    "indices": 11,
-                    "material": 13
-                }
-            ]
-        },
-        {
-            "name": "Y3_Label_BaseNormals",
-            "primitives": [
-                {
-                    "attributes": {
-                        "TEXCOORD_0": 14,
-                        "NORMAL": 13,
-                        "POSITION": 12
-                    },
-                    "indices": 15,
-                    "material": 13
-                }
-            ]
-        },
-        {
-            "name": "X1_Label_Coated",
-            "primitives": [
-                {
-                    "attributes": {
-                        "TEXCOORD_0": 10,
-                        "NORMAL": 9,
-                        "POSITION": 8
-                    },
-                    "indices": 11,
-                    "material": 13
-                }
-            ]
-        },
-        {
-            "name": "Y3_Label_BaseNormals",
-            "primitives": [
-                {
-                    "attributes": {
-                        "POSITION": 12,
-                        "NORMAL": 13,
-                        "TEXCOORD_0": 14
-                    },
-                    "indices": 15,
-                    "material": 13
-                }
-            ]
-        },
-        {
-            "name": "X2_Label_CoatingOnly",
-            "primitives": [
-                {
-                    "attributes": {
-                        "POSITION": 16,
-                        "NORMAL": 17,
-                        "TEXCOORD_0": 18
-                    },
-                    "indices": 11,
-                    "material": 13
-                }
-            ]
-        },
-        {
-            "name": "X2_Label_CoatingOnly",
-            "primitives": [
-                {
-                    "attributes": {
-                        "POSITION": 16,
-                        "NORMAL": 17,
-                        "TEXCOORD_0": 18
-                    },
-                    "indices": 11,
-                    "material": 13
-                }
-            ]
-        },
-        {
-            "name": "Y0_Label_SimpleCoating",
-            "primitives": [
-                {
-                    "attributes": {
-                        "POSITION": 19,
-                        "NORMAL": 20,
-                        "TEXCOORD_0": 21
-                    },
-                    "indices": 11,
-                    "material": 13
-                }
-            ]
-        },
-        {
-            "name": "Y5_Label_SharedNormals",
-            "primitives": [
-                {
-                    "attributes": {
-                        "POSITION": 22,
-                        "NORMAL": 23,
-                        "TEXCOORD_0": 24
-                    },
-                    "indices": 15,
-                    "material": 13
-                }
-            ]
-        },
-        {
-            "name": "X2_Label_CoatingOnly",
-            "primitives": [
-                {
-                    "attributes": {
-                        "POSITION": 16,
-                        "NORMAL": 17,
-                        "TEXCOORD_0": 18
-                    },
-                    "indices": 11,
-                    "material": 13
-                }
-            ]
-        }
-    ],
-    "nodes": [
-        {
-            "translation": [
-                -0.07675539702177048,
-                0.3394200801849365,
-                1.802846074104309
-            ],
-            "rotation": [
-                -0.07035518437623978,
-                0.01940322108566761,
-                0.0013688141480088235,
-                0.9973323345184326
-            ],
-            "scale": [
-                1.0,
-                1.0000001192092896,
-                0.9999999403953552
-            ],
-            "camera": 0,
-            "name": "render_camera_n3d"
-        },
-        {
-            "translation": [
-                -0.15470129251480103,
-                -0.4015843868255615,
-                -0.06036872789263725
-            ],
-            "mesh": 0,
-            "name": "Cloth Backdrop 01"
-        },
-        {
-            "translation": [
-                0.10135379433631897,
-                0.1326718032360077,
-                0.01683981902897358
-            ],
-            "rotation": [
-                0.0,
-                0.9996573328971863,
-                0.0,
-                0.026176994666457177
-            ],
-            "mesh": 1,
-            "name": "RedTransTexture"
-        },
-        {
-            "translation": [
-                -0.36709079146385195,
-                0.1261221021413803,
-                -0.01051957905292511
-            ],
-            "rotation": [
-                0.0,
-                0.9996573328971863,
-                0.0,
-                0.026176994666457177
-            ],
-            "mesh": 2,
-            "name": "YellowTrans"
-        },
-        {
-            "translation": [
-                0.33557596802711489,
-                0.13594670593738557,
-                0.030519530177116395
-            ],
-            "rotation": [
-                0.0,
-                0.9996573328971863,
-                0.0,
-                0.026176994666457177
-            ],
-            "mesh": 3,
-            "name": "BlueTransWithMask"
-        },
-        {
-            "translation": [
-                -0.13286849856376649,
-                0.12939700484275819,
-                0.003160127904266119
-            ],
-            "rotation": [
-                0.0,
-                0.9996573328971863,
-                0.0,
-                0.026176994666457177
-            ],
-            "mesh": 4,
-            "name": "GreenMask"
-        },
-        {
-            "translation": [
-                0.10135379433631897,
-                -0.09345020353794098,
-                0.01683981902897358
-            ],
-            "rotation": [
-                0.0,
-                0.9996573328971863,
-                0.0,
-                0.026176994666457177
-            ],
-            "mesh": 5,
-            "name": "RedTransTextureRough"
-        },
-        {
-            "translation": [
-                -0.36709079146385195,
-                -0.09999999403953552,
-                -0.01051957905292511
-            ],
-            "rotation": [
-                0.0,
-                0.9996573328971863,
-                0.0,
-                0.026176994666457177
-            ],
-            "mesh": 6,
-            "name": "YellowTransRough"
-        },
-        {
-            "translation": [
-                0.33557596802711489,
-                -0.09017530083656311,
-                0.030519530177116395
-            ],
-            "rotation": [
-                0.0,
-                0.9996573328971863,
-                0.0,
-                0.026176994666457177
-            ],
-            "mesh": 7,
-            "name": "BlueTransWithMask"
-        },
-        {
-            "translation": [
-                -0.13286849856376649,
-                -0.09672509878873825,
-                0.003160127904266119
-            ],
-            "rotation": [
-                0.0,
-                0.9996573328971863,
-                0.0,
-                0.026176994666457177
-            ],
-            "mesh": 8,
-            "name": "GreenMaskRough"
-        },
-        {
-            "translation": [
-                0.10135379433631897,
-                -0.32746508717536929,
-                0.01683981902897358
-            ],
-            "rotation": [
-                0.0,
-                0.9996573328971863,
-                0.0,
-                0.026176994666457177
-            ],
-            "mesh": 9,
-            "name": "RedTransTextureMetal"
-        },
-        {
-            "translation": [
-                -0.36709079146385195,
-                -0.334014892578125,
-                -0.01051957905292511
-            ],
-            "rotation": [
-                0.0,
-                0.9996573328971863,
-                0.0,
-                0.026176994666457177
-            ],
-            "mesh": 10,
-            "name": "YellowTransMetal"
-        },
-        {
-            "translation": [
-                -0.13286849856376649,
-                -0.3307400047779083,
-                0.003160127904266119
-            ],
-            "rotation": [
-                0.0,
-                0.9996573328971863,
-                0.0,
-                0.026176994666457177
-            ],
-            "mesh": 11,
-            "name": "GreenMaskMetal"
-        },
-        {
-            "translation": [
-                0.33557596802711489,
-                -0.3241901993751526,
-                0.030519530177116395
-            ],
-            "rotation": [
-                0.0,
-                0.9996573328971863,
-                0.0,
-                0.026176994666457177
-            ],
-            "mesh": 12,
-            "name": "BlueTransWithMask"
-        },
-        {
-            "children": [
-                15,
-                16,
-                17,
-                18,
-                19,
-                20
-            ],
-            "name": "Column Labels"
-        },
-        {
-            "translation": [
-                -0.15605439245700837,
-                0.4127219021320343,
-                -0.03671092912554741
-            ],
-            "rotation": [
-                -0.00009458513522986323,
-                -4.074816573051976e-8,
-                0.00003576850940589793,
-                1.0
-            ],
-            "scale": [
-                0.08348584175109863,
-                0.1557399034500122,
-                0.1557399034500122
-            ],
-            "mesh": 13,
-            "name": "X1_Label_WithOpacity"
-        },
-        {
-            "translation": [
-                0.362414687871933,
-                0.4796152114868164,
-                -0.03672285005450249
-            ],
-            "rotation": [
-                -0.00009458522981731221,
-                -5.835058658476555e-8,
-                0.00003573128196876496,
-                1.0
-            ],
-            "scale": [
-                0.06954946368932724,
-                0.1557399034500122,
-                0.1557399034500122
-            ],
-            "mesh": 14,
-            "name": "Y3_Label_TransmissionTexture"
-        },
-        {
-            "translation": [
-                0.36164841055870058,
-                0.4127587676048279,
-                -0.03671097755432129
-            ],
-            "rotation": [
-                -0.00009458513522986323,
-                -4.47990515795027e-8,
-                0.000035770794056588787,
-                1.0
-            ],
-            "scale": [
-                0.07980477809906006,
-                0.1557399034500122,
-                0.1557399034500122
-            ],
-            "mesh": 15,
-            "name": "X1_Label_WithOpacity"
-        },
-        {
-            "translation": [
-                0.10603449493646622,
-                0.4796152114868164,
-                -0.03672285005450249
-            ],
-            "rotation": [
-                -0.00009458520071348175,
-                -6.512453154527975e-8,
-                0.0000357320714101661,
-                1.0
-            ],
-            "scale": [
-                0.06535045057535172,
-                0.1557399034500122,
-                0.1557399034500122
-            ],
-            "mesh": 16,
-            "name": "Y3_Label_TransmissionTexture"
-        },
-        {
-            "translation": [
-                -0.3994385004043579,
-                0.47961509227752688,
-                -0.03672334924340248
-            ],
-            "rotation": [
-                -0.00009458516433369368,
-                -2.7568585636572608e-8,
-                0.000035779212339548397,
-                1.0
-            ],
-            "scale": [
-                0.09822454303503037,
-                0.1557399034500122,
-                0.1557399034500122
-            ],
-            "mesh": 17,
-            "name": "X2_Label_Transmission"
-        },
-        {
-            "translation": [
-                -0.16186389327049256,
-                0.4796149730682373,
-                -0.03672334924340248
-            ],
-            "rotation": [
-                -0.00009458513522986323,
-                -2.909321139554777e-8,
-                0.00003578040923457593,
-                1.0
-            ],
-            "scale": [
-                0.09625838696956635,
-                0.1557399034500122,
-                0.1557399034500122
-            ],
-            "mesh": 18,
-            "name": "X2_Label_Transmission"
-        },
-        {
-            "children": [
-                22,
-                23,
-                24
-            ],
-            "translation": [
-                -2.265920877456665,
-                1.0377169847488404,
-                -0.036828286945819858
-            ],
-            "rotation": [
-                -0.00009458513522986323,
-                -1.497378067892574e-14,
-                0.00003578418181859888,
-                1.0
-            ],
-            "scale": [
-                0.1557399034500122,
-                0.1557399034500122,
-                0.1557399034500122
-            ],
-            "name": "Row Labels"
-        },
-        {
-            "translation": [
-                10.043020248413086,
-                -8.2355375289917,
-                -0.000007152556463552173
-            ],
-            "rotation": [
-                -2.1582695700073097e-11,
-                -3.345704513435521e-8,
-                -3.844720097845311e-8,
-                1.0
-            ],
-            "scale": [
-                0.5845792293548584,
-                1.0,
-                1.0
-            ],
-            "mesh": 19,
-            "name": "Y0_Label_MetallicTransmission"
-        },
-        {
-            "translation": [
-                10.137709617614746,
-                -6.663864612579346,
-                -0.000002937316821771674
-            ],
-            "rotation": [
-                -1.4305411022430548e-11,
-                -4.159385724733511e-8,
-                -4.7792596546969438e-8,
-                1.0
-            ],
-            "scale": [
-                0.530937910079956,
-                1.0,
-                1.0
-            ],
-            "mesh": 20,
-            "name": "Y5_Label_RoughTransmission"
-        },
-        {
-            "translation": [
-                10.396340370178223,
-                -5.149285316467285,
-                -0.0000057220458984375
-            ],
-            "rotation": [
-                -2.8860731512980743e-11,
-                -1.6422601945009775e-8,
-                -1.886485456736864e-8,
-                1.0
-            ],
-            "scale": [
-                0.741389811038971,
-                1.0,
-                1.0
-            ],
-            "mesh": 21,
-            "name": "X2_Label_Transmission"
-        }
-    ],
-    "samplers": [
-        {},
-        {},
-        {},
-        {},
-        {},
-        {},
-        {},
-        {},
-        {}
-    ],
-    "scenes": [
-        {
-            "nodes": [
-                0,
-                1,
-                2,
-                3,
-                4,
-                5,
-                6,
-                7,
-                8,
-                9,
-                10,
-                11,
-                12,
-                13,
-                14,
-                21
-            ],
-            "name": "scene"
-        }
-    ],
-    "textures": [
-        {
-            "name": "texture28577",
-            "sampler": 0,
-            "source": 0
-        },
-        {
-            "name": "texture14184",
-            "sampler": 1,
-            "source": 1
-        },
-        {
-            "name": "texture214190",
-            "sampler": 2,
-            "source": 2
-        },
-        {
-            "name": "texture4086",
-            "sampler": 3,
-            "source": 3
-        },
-        {
-            "name": "texture177328",
-            "sampler": 4,
-            "source": 4
-        },
-        {
-            "name": "texture6807",
-            "sampler": 5,
-            "source": 5
-        },
-        {
-            "name": "texture175763",
-            "sampler": 6,
-            "source": 6
-        },
-        {
-            "name": "texture10487",
-            "sampler": 7,
-            "source": 7
-        },
-        {
-            "name": "texture15366",
-            "sampler": 8,
-            "source": 8
-        }
-    ],
-    "scene": 0,
-    "extensions": {
-        "KHR_xmp": {
-            "@context": {
-                "dc": "http://purl.org/dc/elements/1.1/"
-            },
-            "packets": [
-                {
-                    "dc:date": "2019-10-25T15:25:01.695-07:00",
-                    "dc:title": "ASM_transparency_labels.dn",
-                    "xmp:CreatorTool": "Adobe Dimension"
-                }
-            ]
-        }
-    },
-    "extensionsUsed": [
-        "KHR_materials_transmission",
-        "KHR_xmp"
-    ]
-}

BIN
examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture10487.png


BIN
examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture14184.jpg


BIN
examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture15366.jpg


BIN
examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture175763.png


BIN
examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture177328.png


BIN
examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture214190.png


BIN
examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture28577.jpg


BIN
examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture4086.png


BIN
examples/models/gltf/TransmissionTest/glTF/TransmissionTest_images/texture6807.png


BIN
examples/models/gltf/TransmissionTest/screenshot/screenshot.jpg


BIN
examples/models/gltf/TransmissionTest/screenshot/screenshot_large.png


File diff suppressed because it is too large
+ 0 - 11
examples/models/json/multimaterial.json


BIN
examples/screenshots/misc_controls_transform.jpg


BIN
examples/screenshots/webgl2_multisampled_renderbuffers.jpg


BIN
examples/screenshots/webgl_buffergeometry_instancing.jpg


BIN
examples/screenshots/webgl_loader_gltf_transmission.jpg


BIN
examples/screenshots/webgl_loader_mmd.jpg


Some files were not shown because too many files changed in this diff