{"v":"5.12.1","fr":60,"ip":0,"op":599,"w":553,"h":553,"nm":"MAIN 2","ddd":0,"assets":[{"id":"comp_0","nm":"Orbit 2","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Planet","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-10.811,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[214.424,-310.576,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[25,25],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.390121160769,0.377845464968,0.377845464968,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.341176480055,0.882353007793,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[214.424,-310.576],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2400,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Trace Circ 1: Path 1 [2.1.1]","cl":"1 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar pathToTrace = thisComp.layer('Circ 1')('ADBE Root Vectors Group')(2)('ADBE Vectors Group')(1)('ADBE Vectors Group')(1)('ADBE Vector Shape');\nvar progress = $bm_div(thisLayer.effect('Pseudo/ADBE Trace Path')('Pseudo/ADBE Trace Path-0001'), 100);\nvar pathTan = pathToTrace.tangentOnPath(progress);\n$bm_rt = radiansToDegrees(Math.atan2(pathTan[1], pathTan[0]));"},"p":{"a":0,"k":[960,540,0],"ix":2,"l":2,"x":"var $bm_rt;\nvar pathLayer = thisComp.layer('Circ 1');\nvar progress = $bm_div(thisLayer.effect('Pseudo/ADBE Trace Path')('Pseudo/ADBE Trace Path-0001'), 100);\nvar pathToTrace = pathLayer('ADBE Root Vectors Group')(2)('ADBE Vectors Group')(1)('ADBE Vectors Group')(1)('ADBE Vector Shape');\n$bm_rt = pathLayer.toComp(pathToTrace.pointOnPath(progress));"},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Trace Path","np":4,"mn":"Pseudo/ADBE Trace Path","ix":1,"en":1,"ef":[{"ty":0,"nm":"Progress","mn":"Pseudo/ADBE Trace Path-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":120,"s":[100]}],"ix":1,"x":"var $bm_rt;\nif (thisProperty.propertyGroup(1)('Pseudo/ADBE Trace Path-0002') == true && thisProperty.numKeys > 1) {\n    $bm_rt = thisProperty.loopOut('cycle');\n} else {\n    $bm_rt = value;\n}"}},{"ty":7,"nm":"Loop","mn":"Pseudo/ADBE Trace Path-0002","ix":2,"v":{"a":0,"k":1,"ix":2}}]}],"ip":0,"op":2400,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Circ 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[958,542,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Extrudalizer","np":70,"mn":"Pseudo/Extrudalizer","ix":1,"en":1,"ef":[{"ty":6,"nm":"3D Transform","mn":"Pseudo/Extrudalizer-0001","ix":1,"v":0},{"ty":0,"nm":"Extrusion depth","mn":"Pseudo/Extrudalizer-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":3,"nm":"Position","mn":"Pseudo/Extrudalizer-0003","ix":3,"v":{"a":0,"k":[0,0,0],"ix":3}},{"ty":6,"nm":"Scale","mn":"Pseudo/Extrudalizer-0004","ix":4,"v":0},{"ty":0,"nm":"Front scale","mn":"Pseudo/Extrudalizer-0005","ix":5,"v":{"a":0,"k":100,"ix":5}},{"ty":0,"nm":"Back scale","mn":"Pseudo/Extrudalizer-0006","ix":6,"v":{"a":0,"k":100,"ix":6}},{"ty":6,"nm":"Extrudalizer","mn":"Pseudo/Extrudalizer-0007","ix":7,"v":0},{"ty":6,"nm":"Pitch/Roll/Yaw","mn":"Pseudo/Extrudalizer-0008","ix":8,"v":0},{"ty":0,"nm":"Pitch (x)","mn":"Pseudo/Extrudalizer-0009","ix":9,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":600,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":640,"s":[64]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":660,"s":[64]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1260,"s":[64]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1310,"s":[64]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1330,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1380,"s":[0]},{"t":1980,"s":[0]}],"ix":9}},{"ty":0,"nm":"Yaw (y)","mn":"Pseudo/Extrudalizer-0010","ix":10,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[65]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":600,"s":[65]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":640,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":660,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1260,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1310,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1330,"s":[65]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1380,"s":[65]},{"t":1980,"s":[65]}],"ix":10}},{"ty":0,"nm":"Roll (z)","mn":"Pseudo/Extrudalizer-0011","ix":11,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":600,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":660,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1260,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1310,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1330,"s":[-32]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1380,"s":[-32]},{"t":1980,"s":[-32]}],"ix":11}},{"ty":6,"nm":"Extrudalizer","mn":"Pseudo/Extrudalizer-0012","ix":12,"v":0},{"ty":6,"nm":"Orbit control","mn":"Pseudo/Extrudalizer-0013","ix":13,"v":0},{"ty":0,"nm":"X Rotation","mn":"Pseudo/Extrudalizer-0014","ix":14,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":600,"s":[720]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":660,"s":[720]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1260,"s":[720]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1310,"s":[720]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1380,"s":[0]},{"t":1980,"s":[720]}],"ix":14}},{"ty":0,"nm":"Y Rotation","mn":"Pseudo/Extrudalizer-0015","ix":15,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":600,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":660,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1260,"s":[-720]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1310,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1380,"s":[0]},{"t":1980,"s":[0]}],"ix":15}},{"ty":0,"nm":"Z Rotation","mn":"Pseudo/Extrudalizer-0016","ix":16,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":600,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":660,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1260,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1310,"s":[720]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1330,"s":[675]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1380,"s":[675]},{"t":1980,"s":[675]}],"ix":16}},{"ty":6,"nm":"Extrudalizer","mn":"Pseudo/Extrudalizer-0017","ix":17,"v":0},{"ty":6,"nm":"Extrudalizer","mn":"Pseudo/Extrudalizer-0018","ix":18,"v":0},{"ty":6,"nm":"Appearance","mn":"Pseudo/Extrudalizer-0019","ix":19,"v":0},{"ty":7,"nm":"Hide anchor point","mn":"Pseudo/Extrudalizer-0020","ix":20,"v":{"a":0,"k":0,"ix":20}},{"ty":7,"nm":"Wireframe mode","mn":"Pseudo/Extrudalizer-0021","ix":21,"v":{"a":0,"k":1,"ix":21}},{"ty":2,"nm":"Edge stroke color","mn":"Pseudo/Extrudalizer-0022","ix":22,"v":{"a":0,"k":[0.23137255013,0.529411792755,0.192156866193,1],"ix":22}},{"ty":0,"nm":"Edge stroke width","mn":"Pseudo/Extrudalizer-0023","ix":23,"v":{"a":0,"k":5,"ix":23}},{"ty":0,"nm":"Translucency","mn":"Pseudo/Extrudalizer-0024","ix":24,"v":{"a":0,"k":0,"ix":24}},{"ty":6,"nm":"Front & Back ","mn":"Pseudo/Extrudalizer-0025","ix":25,"v":0},{"ty":2,"nm":"Front color","mn":"Pseudo/Extrudalizer-0026","ix":26,"v":{"a":0,"k":[1,0.78431372549,0,1],"ix":26}},{"ty":0,"nm":"Front opacity","mn":"Pseudo/Extrudalizer-0027","ix":27,"v":{"a":0,"k":100,"ix":27}},{"ty":0,"nm":"Front gradient opacity","mn":"Pseudo/Extrudalizer-0028","ix":28,"v":{"a":0,"k":0,"ix":28}},{"ty":0,"nm":"Front gradient direction","mn":"Pseudo/Extrudalizer-0029","ix":29,"v":{"a":0,"k":0,"ix":29}},{"ty":6,"nm":"   ","mn":"Pseudo/Extrudalizer-0030","ix":30,"v":0},{"ty":6,"nm":"Extrudalizer","mn":"Pseudo/Extrudalizer-0031","ix":31,"v":0},{"ty":2,"nm":"Back color","mn":"Pseudo/Extrudalizer-0032","ix":32,"v":{"a":0,"k":[0,0.235294117647,1,1],"ix":32}},{"ty":0,"nm":"Back opacity","mn":"Pseudo/Extrudalizer-0033","ix":33,"v":{"a":0,"k":100,"ix":33}},{"ty":0,"nm":"Back gradient opacity","mn":"Pseudo/Extrudalizer-0034","ix":34,"v":{"a":0,"k":0,"ix":34}},{"ty":0,"nm":"Back gradient direction","mn":"Pseudo/Extrudalizer-0035","ix":35,"v":{"a":0,"k":0,"ix":35}},{"ty":6,"nm":"    ","mn":"Pseudo/Extrudalizer-0036","ix":36,"v":0},{"ty":6,"nm":"Extrudalizer","mn":"Pseudo/Extrudalizer-0037","ix":37,"v":0},{"ty":3,"nm":"Gradient start point","mn":"Pseudo/Extrudalizer-0038","ix":38,"v":{"a":0,"k":[0,0],"ix":38}},{"ty":3,"nm":"Gradient end point","mn":"Pseudo/Extrudalizer-0039","ix":39,"v":{"a":0,"k":[0,0],"ix":39}},{"ty":6,"nm":"Edit gradient start/end points ","mn":"Pseudo/Extrudalizer-0040","ix":40,"v":0},{"ty":6,"nm":"Extrudalizer","mn":"Pseudo/Extrudalizer-0041","ix":41,"v":0},{"ty":6,"nm":"at 3D rotation set to [0,0,0]","mn":"Pseudo/Extrudalizer-0042","ix":42,"v":0},{"ty":6,"nm":"Extrudalizer","mn":"Pseudo/Extrudalizer-0043","ix":43,"v":0},{"ty":6,"nm":"Extrudalizer","mn":"Pseudo/Extrudalizer-0044","ix":44,"v":0},{"ty":6,"nm":"Sides","mn":"Pseudo/Extrudalizer-0045","ix":45,"v":0},{"ty":2,"nm":"Sides color","mn":"Pseudo/Extrudalizer-0046","ix":46,"v":{"a":0,"k":[0.23137254902,0.529411764706,0.192156862745,1],"ix":46}},{"ty":0,"nm":"Sides opacity","mn":"Pseudo/Extrudalizer-0047","ix":47,"v":{"a":0,"k":100,"ix":47}},{"ty":0,"nm":"Sides gradient opacity","mn":"Pseudo/Extrudalizer-0048","ix":48,"v":{"a":0,"k":25,"ix":48}},{"ty":0,"nm":"Sides gradient direction","mn":"Pseudo/Extrudalizer-0049","ix":49,"v":{"a":0,"k":0,"ix":49}},{"ty":0,"nm":"Sides gradient length","mn":"Pseudo/Extrudalizer-0050","ix":50,"v":{"a":0,"k":0,"ix":50}},{"ty":2,"nm":"Sides fill shadow color","mn":"Pseudo/Extrudalizer-0051","ix":51,"v":{"a":0,"k":[0,0,0,1],"ix":51}},{"ty":0,"nm":"Sides fill shadow opacity","mn":"Pseudo/Extrudalizer-0052","ix":52,"v":{"a":0,"k":50,"ix":52}},{"ty":6,"nm":"Extrudalizer","mn":"Pseudo/Extrudalizer-0053","ix":53,"v":0},{"ty":6,"nm":"Extrudalizer","mn":"Pseudo/Extrudalizer-0054","ix":54,"v":0},{"ty":6,"nm":"Parenting Data","mn":"Pseudo/Extrudalizer-0055","ix":55,"v":0},{"ty":0,"nm":"Front opacity readout","mn":"Pseudo/Extrudalizer-0056","ix":56,"v":{"a":0,"k":100,"ix":56,"x":"var $bm_rt;\ntry {\n    $bm_rt = content('--- EXTRUDALIZER ---').content('FRONT').transform.opacity;\n} catch (e) {\n    $bm_rt = 0;\n}"}},{"ty":0,"nm":"Back opacity readout","mn":"Pseudo/Extrudalizer-0057","ix":57,"v":{"a":0,"k":100,"ix":57,"x":"var $bm_rt;\ntry {\n    $bm_rt = content('--- EXTRUDALIZER ---').content('BACK').transform.opacity;\n} catch (e) {\n    $bm_rt = 0;\n}"}},{"ty":7,"nm":"Compute 3D front bounding box","mn":"Pseudo/Extrudalizer-0058","ix":58,"v":{"a":0,"k":0,"ix":58}},{"ty":3,"nm":"Front upper left","mn":"Pseudo/Extrudalizer-0059","ix":59,"v":{"a":0,"k":[0,0],"ix":59,"x":"var $bm_rt;\n'use native operators';\nconst use_bb = effect('Extrudalizer')('Compute 3D front bounding box').value;\nif (!use_bb) {\n    $bm_rt = [\n        0,\n        0\n    ];\n} else {\n    let extr_data_arr;\n    let front_bb;\n    try {\n        _lottieGlobal.ml_extrudalizer = _lottieGlobal.ml_extrudalizer || {};\n        extr_data_arr = _lottieGlobal.ml_extrudalizer['EXTRUDALIZER DATA || Circ 1'];\n        front_bb = extr_data_arr[14];\n        $bm_rt = front_bb[0];\n    } catch (err) {\n        const extr_data = thisComp.layer('EXTRUDALIZER DATA || Circ 1').text.sourceText;\n        extr_data_arr = extr_data.split(';');\n        front_bb = extr_data_arr[14].split(',').map(s => parseFloat(s));\n        $bm_rt = [\n            front_bb[0],\n            front_bb[1]\n        ];\n    }\n}"}},{"ty":3,"nm":"Front upper right","mn":"Pseudo/Extrudalizer-0060","ix":60,"v":{"a":0,"k":[0,0],"ix":60,"x":"var $bm_rt;\n'use native operators';\nconst use_bb = effect('Extrudalizer')('Compute 3D front bounding box').value;\nif (!use_bb) {\n    $bm_rt = [\n        0,\n        0\n    ];\n} else {\n    let extr_data_arr;\n    let front_bb;\n    try {\n        _lottieGlobal.ml_extrudalizer = _lottieGlobal.ml_extrudalizer || {};\n        extr_data_arr = _lottieGlobal.ml_extrudalizer['EXTRUDALIZER DATA || Circ 1'];\n        front_bb = extr_data_arr[14];\n        $bm_rt = front_bb[1];\n    } catch (err) {\n        const extr_data = thisComp.layer('EXTRUDALIZER DATA || Circ 1').text.sourceText;\n        extr_data_arr = extr_data.split(';');\n        front_bb = extr_data_arr[14].split(',').map(s => parseFloat(s));\n        $bm_rt = [\n            front_bb[2],\n            front_bb[3]\n        ];\n    }\n}"}},{"ty":3,"nm":"Front lower left","mn":"Pseudo/Extrudalizer-0061","ix":61,"v":{"a":0,"k":[0,0],"ix":61,"x":"var $bm_rt;\n'use native operators';\nconst use_bb = effect('Extrudalizer')('Compute 3D front bounding box').value;\nif (!use_bb) {\n    $bm_rt = [\n        0,\n        0\n    ];\n} else {\n    let extr_data_arr;\n    let front_bb;\n    try {\n        _lottieGlobal.ml_extrudalizer = _lottieGlobal.ml_extrudalizer || {};\n        extr_data_arr = _lottieGlobal.ml_extrudalizer['EXTRUDALIZER DATA || Circ 1'];\n        front_bb = extr_data_arr[14];\n        $bm_rt = front_bb[2];\n    } catch (err) {\n        const extr_data = thisComp.layer('EXTRUDALIZER DATA || Circ 1').text.sourceText;\n        extr_data_arr = extr_data.split(';');\n        front_bb = extr_data_arr[14].split(',').map(s => parseFloat(s));\n        $bm_rt = [\n            front_bb[4],\n            front_bb[5]\n        ];\n    }\n}"}},{"ty":3,"nm":"Front lower right","mn":"Pseudo/Extrudalizer-0062","ix":62,"v":{"a":0,"k":[0,0],"ix":62,"x":"var $bm_rt;\n'use native operators';\nconst use_bb = effect('Extrudalizer')('Compute 3D front bounding box').value;\nif (!use_bb) {\n    $bm_rt = [\n        0,\n        0\n    ];\n} else {\n    let extr_data_arr;\n    let front_bb;\n    try {\n        _lottieGlobal.ml_extrudalizer = _lottieGlobal.ml_extrudalizer || {};\n        extr_data_arr = _lottieGlobal.ml_extrudalizer['EXTRUDALIZER DATA || Circ 1'];\n        front_bb = extr_data_arr[14];\n        $bm_rt = front_bb[3];\n    } catch (err) {\n        const extr_data = thisComp.layer('EXTRUDALIZER DATA || Circ 1').text.sourceText;\n        extr_data_arr = extr_data.split(';');\n        front_bb = extr_data_arr[14].split(',').map(s => parseFloat(s));\n        $bm_rt = [\n            front_bb[6],\n            front_bb[7]\n        ];\n    }\n}"}},{"ty":7,"nm":"Compute 3D back bounding box","mn":"Pseudo/Extrudalizer-0063","ix":63,"v":{"a":0,"k":0,"ix":63}},{"ty":3,"nm":"Back upper left","mn":"Pseudo/Extrudalizer-0064","ix":64,"v":{"a":0,"k":[0,0],"ix":64,"x":"var $bm_rt;\n'use native operators';\nconst use_bb = effect('Extrudalizer')('Compute 3D back bounding box').value;\nif (!use_bb) {\n    $bm_rt = [\n        0,\n        0\n    ];\n} else {\n    let extr_data_arr;\n    let back_bb;\n    try {\n        _lottieGlobal.ml_extrudalizer = _lottieGlobal.ml_extrudalizer || {};\n        extr_data_arr = _lottieGlobal.ml_extrudalizer['EXTRUDALIZER DATA || Circ 1'];\n        back_bb = extr_data_arr[15];\n        $bm_rt = back_bb[0];\n    } catch (err) {\n        const extr_data = thisComp.layer('EXTRUDALIZER DATA || Circ 1').text.sourceText;\n        extr_data_arr = extr_data.split(';');\n        back_bb = extr_data_arr[15].split(',').map(s => parseFloat(s));\n        $bm_rt = [\n            back_bb[0],\n            back_bb[1]\n        ];\n    }\n}"}},{"ty":3,"nm":"Back upper right","mn":"Pseudo/Extrudalizer-0065","ix":65,"v":{"a":0,"k":[0,0],"ix":65,"x":"var $bm_rt;\n'use native operators';\nconst use_bb = effect('Extrudalizer')('Compute 3D back bounding box').value;\nif (!use_bb) {\n    $bm_rt = [\n        0,\n        0\n    ];\n} else {\n    let extr_data_arr;\n    let back_bb;\n    try {\n        _lottieGlobal.ml_extrudalizer = _lottieGlobal.ml_extrudalizer || {};\n        extr_data_arr = _lottieGlobal.ml_extrudalizer['EXTRUDALIZER DATA || Circ 1'];\n        back_bb = extr_data_arr[15];\n        $bm_rt = back_bb[1];\n    } catch (err) {\n        const extr_data = thisComp.layer('EXTRUDALIZER DATA || Circ 1').text.sourceText;\n        extr_data_arr = extr_data.split(';');\n        back_bb = extr_data_arr[15].split(',').map(s => parseFloat(s));\n        $bm_rt = [\n            back_bb[2],\n            back_bb[3]\n        ];\n    }\n}"}},{"ty":3,"nm":"Back lower left","mn":"Pseudo/Extrudalizer-0066","ix":66,"v":{"a":0,"k":[0,0],"ix":66,"x":"var $bm_rt;\n'use native operators';\nconst use_bb = effect('Extrudalizer')('Compute 3D back bounding box').value;\nif (!use_bb) {\n    $bm_rt = [\n        0,\n        0\n    ];\n} else {\n    let extr_data_arr;\n    let back_bb;\n    try {\n        _lottieGlobal.ml_extrudalizer = _lottieGlobal.ml_extrudalizer || {};\n        extr_data_arr = _lottieGlobal.ml_extrudalizer['EXTRUDALIZER DATA || Circ 1'];\n        back_bb = extr_data_arr[15];\n        $bm_rt = back_bb[2];\n    } catch (err) {\n        const extr_data = thisComp.layer('EXTRUDALIZER DATA || Circ 1').text.sourceText;\n        extr_data_arr = extr_data.split(';');\n        back_bb = extr_data_arr[15].split(',').map(s => parseFloat(s));\n        $bm_rt = [\n            back_bb[4],\n            back_bb[5]\n        ];\n    }\n}"}},{"ty":3,"nm":"Back lower right","mn":"Pseudo/Extrudalizer-0067","ix":67,"v":{"a":0,"k":[0,0],"ix":67,"x":"var $bm_rt;\n'use native operators';\nconst use_bb = effect('Extrudalizer')('Compute 3D back bounding box').value;\nif (!use_bb) {\n    $bm_rt = [\n        0,\n        0\n    ];\n} else {\n    let extr_data_arr;\n    let back_bb;\n    try {\n        _lottieGlobal.ml_extrudalizer = _lottieGlobal.ml_extrudalizer || {};\n        extr_data_arr = _lottieGlobal.ml_extrudalizer['EXTRUDALIZER DATA || Circ 1'];\n        back_bb = extr_data_arr[15];\n        $bm_rt = back_bb[3];\n    } catch (err) {\n        const extr_data = thisComp.layer('EXTRUDALIZER DATA || Circ 1').text.sourceText;\n        extr_data_arr = extr_data.split(';');\n        back_bb = extr_data_arr[15].split(',').map(s => parseFloat(s));\n        $bm_rt = [\n            back_bb[6],\n            back_bb[7]\n        ];\n    }\n}"}},{"ty":6,"nm":"Extrudalizer","mn":"Pseudo/Extrudalizer-0068","ix":68,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-138.071,0],[0,-138.071],[138.071,0],[0,138.071]],"o":[[138.071,0],[0,138.071],[-138.071,0],[0,-138.071]],"v":[[0,-250],[250,0],[0,250],[-250,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":true},{"ty":"st","c":{"a":0,"k":[0.390121160769,0.377845464968,0.377845464968,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":true},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":2,"k":{"a":0,"k":[0,1,1,1,1,0,0,0],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[100,0],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ORIGIN SHAPE","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[],"o":[],"v":[],"c":false},"ix":2,"x":"var $bm_rt;\n'use native operators';\nlet extr_data_arr;\nlet points_3D = [];\nlet isPathClosed;\ntry {\n    _lottieGlobal.ml_extrudalizer = _lottieGlobal.ml_extrudalizer || {};\n    extr_data_arr = _lottieGlobal.ml_extrudalizer['EXTRUDALIZER DATA || Circ 1'];\n    points_3D = extr_data_arr[5];\n    isPathClosed = extr_data_arr[4] === true;\n} catch (err) {\n    const extr_data = thisComp.layer('EXTRUDALIZER DATA || Circ 1').text.sourceText;\n    extr_data_arr = extr_data.split(';');\n    let points_arr = extr_data_arr[5].split(',').map(s => parseFloat(s));\n    isPathClosed = extr_data_arr[4] === 'true';\n    for (var i = 0, il = points_arr.length / 3; i < il; i++) {\n        points_3D.push(points_arr.slice($bm_mul(3, i), $bm_sum($bm_mul(3, i), 3)));\n    }\n}\nconst points_2D = points_3D.map(v => [\n    v[0],\n    v[1]\n]);\nconst num_pts = points_2D.length;\nconst zeroArr = Array(num_pts).fill([\n    0,\n    0\n]);\n$bm_rt = createPath(points_2D, zeroArr, zeroArr, isPathClosed);"},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.341176480055,0.882353007793,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4,"x":"var $bm_rt;\nvar dot_, adjustColorBrightness;\n'use native operators';\nlet color;\nconst isWireframe = effect('Extrudalizer')('Wireframe mode').value;\nif (isWireframe) {\n    color = [\n        0,\n        0,\n        0,\n        0\n    ];\n} else {\n    dot_ = function (a, b) {\n        return $bm_sum($bm_sum($bm_mul(a[0], b[0]), $bm_mul(a[1], b[1])), $bm_mul(a[2], b[2]));\n    };\n    adjustColorBrightness = function (rgba, brightness) {\n        const r = Math.max(0, Math.min(1, $bm_mul(rgba[0], brightness)));\n        const g = Math.max(0, Math.min(1, $bm_mul(rgba[1], brightness)));\n        const b = Math.max(0, Math.min(1, $bm_mul(rgba[2], brightness)));\n        return [\n            Math.round(r * 100) / 100,\n            Math.round(g * 100) / 100,\n            Math.round(b * 100) / 100,\n            rgba[3]\n        ];\n    };\n    const side_shadow_opacity_max = effect('Extrudalizer')('Sides fill shadow opacity').value;\n    const rgba = effect('Extrudalizer')('Front color').value;\n    let extr_data_arr;\n    let front_normal = [];\n    try {\n        _lottieGlobal.ml_extrudalizer = _lottieGlobal.ml_extrudalizer || {};\n        extr_data_arr = _lottieGlobal.ml_extrudalizer['EXTRUDALIZER DATA || Circ 1'];\n        front_normal = extr_data_arr[13];\n    } catch (err) {\n        const extr_data = thisComp.layer('EXTRUDALIZER DATA || Circ 1').text.sourceText;\n        extr_data_arr = extr_data.split(';');\n        front_normal = extr_data_arr[13].split(',').map(p => parseFloat(p));\n    }\n    const dark_coeff = 2;\n    var brightness = $bm_div($bm_mul($bm_mul(dark_coeff, $bm_sub(100, side_shadow_opacity_max)), Math.abs(dot_(front_normal, [\n        0,\n        0,\n        1\n    ]))), 100);\n    color = adjustColorBrightness(rgba, brightness);\n}\n$bm_rt = color;"},"o":{"a":0,"k":100,"ix":5,"x":"var $bm_rt;\nconst isWireframe = effect('Extrudalizer')('Wireframe mode').value;\nconst opacity = effect('Extrudalizer')('Front opacity').value;\n$bm_rt = $bm_mul(!isWireframe, opacity);"},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"FRONT","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"--- EXTRUDALIZER ---","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":10,"ix":1},"ix":3,"mn":"ADBE Vector Filter - RC","hd":false}],"ip":0,"op":2400,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"EXTRUDALIZER DATA || Circ 1","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"t":{"d":{"k":[{"s":{"s":43.4000015258789,"f":"ObelixPro","t":"","ca":1,"j":2,"tr":60,"lh":83,"ls":0,"fc":[1,0.789,0]},"t":0}],"x":"var $bm_rt;\nvar dot_, cross_vec, len_vec, arraysEqual, getNormal, get2D_projection, getBoundingBox, getPositionMatrix, getRotationMatrix, getScaleMatrix, getIdentity, translate, rotateX, rotateY, rotateZ, multiplyMatrixVector, multiplyMatrices, multiplyArrayOfMatrices, transformMatrix, make_transform, getPoint, getArea, isClockwise, getCentroid, getCentroidPro, hasNoneZeroValues, angle_between, angle_between_cw, angle_between_cw_te, isStraightLine_w_delta, isFacingTowardsUs, isVectorFacingTowardsUs, multiplyMatrixVector3x3, multiplyArrayOfMatrices3x3, multiplyMatrices3x3, transform2D_apply, get_transform_shape_matrix, get_transforms_from_bb, num_pts, compare_sides, sorted_sides_indices, adjustColorBrightness, lambertShader, stringify;\n'use native operators';\ndot_ = function (a, b) {\n    if (a.length == 2) {\n        return $bm_sum($bm_mul(a[0], b[0]), $bm_mul(a[1], b[1]));\n    } else {\n        return $bm_sum($bm_sum($bm_mul(a[0], b[0]), $bm_mul(a[1], b[1])), $bm_mul(a[2], b[2]));\n    }\n};\ncross_vec = function (a, b) {\n    return [\n        a[1] * b[2] - a[2] * b[1],\n        a[2] * b[0] - a[0] * b[2],\n        a[0] * b[1] - a[1] * b[0]\n    ];\n};\nlen_vec = function (a) {\n    return Math.sqrt(dot_(a, a));\n};\narraysEqual = function (arr1, arr2) {\n    for (var i = 0, il = arr1.length; i < il; i++) {\n        if (arr1[i] !== arr2[i]) {\n            return false;\n        }\n    }\n    return true;\n};\ngetNormal = function (pts, normalized) {\n    let dir = cross_vec(sub(pts[1], pts[0]), sub(pts[2], pts[0]));\n    let len_dir = len_vec(dir);\n    if (len_dir === 0) {\n        return [\n            0,\n            0,\n            0\n        ];\n    }\n    if (normalized) {\n        return div(dir, len_dir);\n    } else {\n        return dir;\n    }\n};\nget2D_projection = function (points) {\n    return points.map(v => [\n        v[0],\n        v[1]\n    ]);\n};\ngetBoundingBox = function (points) {\n    const boundingBox = {\n        left: Number.POSITIVE_INFINITY,\n        top: Number.POSITIVE_INFINITY,\n        right: Number.NEGATIVE_INFINITY,\n        bottom: Number.NEGATIVE_INFINITY,\n        width: undefined,\n        height: undefined,\n        center: undefined\n    };\n    points.forEach(point => {\n        boundingBox.left = Math.min(boundingBox.left, point[0]);\n        boundingBox.top = Math.min(boundingBox.top, point[1]);\n        boundingBox.right = Math.max(boundingBox.right, point[0]);\n        boundingBox.bottom = Math.max(boundingBox.bottom, point[1]);\n    });\n    boundingBox.width = sub(boundingBox.right, boundingBox.left);\n    boundingBox.height = sub(boundingBox.bottom, boundingBox.top);\n    boundingBox.center = [\n        add(boundingBox.left, $bm_div(boundingBox.width, 2)),\n        add(boundingBox.top, $bm_div(boundingBox.height, 2))\n    ];\n    boundingBox.left_top = [\n        boundingBox.left,\n        boundingBox.top\n    ];\n    boundingBox.left_bottom = [\n        boundingBox.left,\n        boundingBox.bottom\n    ];\n    boundingBox.right_top = [\n        boundingBox.right,\n        boundingBox.top\n    ];\n    boundingBox.right_bottom = [\n        boundingBox.right,\n        boundingBox.bottom\n    ];\n    return boundingBox;\n};\ngetPositionMatrix = function (value) {\n    return translate(getIdentity(), value[0], value[1], $bm_neg(value[2]));\n};\ngetRotationMatrix = function (angles) {\n    const angleX = angles[0];\n    const angleY = angles[1];\n    const angleZ = angles[2];\n    var matrix = getIdentity();\n    matrix = rotateZ(matrix, $bm_div($bm_mul(angleZ, Math.PI), 180));\n    matrix = rotateY(matrix, $bm_div($bm_mul(angleY, Math.PI), 180));\n    matrix = rotateX(matrix, $bm_div($bm_mul(angleX, Math.PI), 180));\n    return matrix;\n};\ngetScaleMatrix = function (sc) {\n    return [\n        sc,\n        0,\n        0,\n        0,\n        0,\n        sc,\n        0,\n        0,\n        0,\n        0,\n        sc,\n        0,\n        0,\n        0,\n        0,\n        1\n    ];\n};\ngetIdentity = function () {\n    return [\n        1,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        1\n    ];\n};\ntranslate = function (matrix, x, y, z) {\n    return multiplyMatrices(matrix, [\n        1,\n        0,\n        0,\n        x,\n        0,\n        1,\n        0,\n        y,\n        0,\n        0,\n        1,\n        z,\n        0,\n        0,\n        0,\n        1\n    ]);\n};\nrotateX = function (matrix, theta) {\n    const cos_th = Math.cos(theta), sin_th = Math.sin(theta);\n    return multiplyMatrices(matrix, [\n        1,\n        0,\n        0,\n        0,\n        0,\n        cos_th,\n        $bm_neg(sin_th),\n        0,\n        0,\n        sin_th,\n        cos_th,\n        0,\n        0,\n        0,\n        0,\n        1\n    ]);\n};\nrotateY = function (matrix, theta) {\n    const cos_th = Math.cos(theta), sin_th = Math.sin(theta);\n    return multiplyMatrices(matrix, [\n        cos_th,\n        0,\n        sin_th,\n        0,\n        0,\n        1,\n        0,\n        0,\n        $bm_neg(sin_th),\n        0,\n        cos_th,\n        0,\n        0,\n        0,\n        0,\n        1\n    ]);\n};\nrotateZ = function (matrix, theta) {\n    const cos_th = Math.cos(theta), sin_th = Math.sin(theta);\n    return multiplyMatrices(matrix, [\n        cos_th,\n        $bm_neg(sin_th),\n        0,\n        0,\n        sin_th,\n        cos_th,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        1\n    ]);\n};\nmultiplyMatrixVector = function (matrix, vector) {\n    var result = [\n        0,\n        0,\n        0,\n        0\n    ];\n    for (var i = 0; i < 4; i++) {\n        result[i] = 0;\n        for (var j = 0; j < 4; j++) {\n            result[i] = $bm_sum(result[i], $bm_mul(matrix[$bm_sum($bm_mul(i, 4), j)], vector[j]));\n        }\n    }\n    return result;\n};\nmultiplyMatrices = function (matrixB, matrixA) {\n    let result = new Array(16).fill(0);\n    for (let i = 0; i < 4; i++) {\n        for (let j = 0; j < 4; j++) {\n            for (let k = 0; k < 4; k++) {\n                result[$bm_sum($bm_mul(i, 4), j)] = $bm_sum(result[$bm_sum($bm_mul(i, 4), j)], $bm_mul(matrixA[$bm_sum($bm_mul(i, 4), k)], matrixB[$bm_sum($bm_mul(k, 4), j)]));\n            }\n        }\n    }\n    return result;\n};\nmultiplyArrayOfMatrices = function (matrices) {\n    var result = matrices[0];\n    for (var i = 1, il = matrices.length; i < il; i++) {\n        result = multiplyMatrices(result, matrices[i]);\n    }\n    return result;\n};\ntransformMatrix = function (move, sc, pivot, pitch_angles, anch, orbit_angles) {\n    var mat_array = [];\n    if (sc !== 1) {\n        if (!arraysEqual(pivot, [\n                0,\n                0,\n                0\n            ])) {\n            mat_array = mat_array.concat([\n                getPositionMatrix(pivot.map(i => -i)),\n                getScaleMatrix(sc),\n                getPositionMatrix(pivot)\n            ]);\n        } else {\n            mat_array.push(getScaleMatrix(sc));\n        }\n    }\n    mat_array.push(getPositionMatrix(move));\n    if (!arraysEqual(pitch_angles, [\n            0,\n            0,\n            0\n        ])) {\n        if (!arraysEqual(pivot, [\n                0,\n                0,\n                0\n            ])) {\n            mat_array = mat_array.concat([\n                getPositionMatrix(pivot.map(i => -i)),\n                getRotationMatrix(pitch_angles),\n                getPositionMatrix(pivot)\n            ]);\n        } else {\n            mat_array.push(getRotationMatrix(pitch_angles));\n        }\n    }\n    if (!arraysEqual(anch, [\n            0,\n            0,\n            0\n        ])) {\n        mat_array.push(getPositionMatrix(anch.map(i => -i)));\n    }\n    if (!arraysEqual(orbit_angles, [\n            0,\n            0,\n            0\n        ])) {\n        mat_array.push(getRotationMatrix(orbit_angles));\n    }\n    return multiplyArrayOfMatrices(mat_array);\n};\nmake_transform = function (transform_matrix, vector) {\n    if (vector.length == 2) {\n        vector = [\n            ...vector,\n            0,\n            1\n        ];\n    } else if (vector.length == 3) {\n        vector = [\n            ...vector,\n            1\n        ];\n    }\n    var result_vector_4d = multiplyMatrixVector(transform_matrix, vector);\n    return result_vector_4d.slice(0, 3);\n};\ngetPoint = function (p1, cp1, cp2, p2, t) {\n    const x = $bm_sum($bm_sum($bm_sum($bm_mul(Math.pow($bm_sub(1, t), 3), p1[0]), $bm_mul($bm_mul($bm_mul(3, Math.pow($bm_sub(1, t), 2)), t), cp1[0])), $bm_mul($bm_mul($bm_mul(3, $bm_sub(1, t)), Math.pow(t, 2)), cp2[0])), $bm_mul(Math.pow(t, 3), p2[0]));\n    const y = $bm_sum($bm_sum($bm_sum($bm_mul(Math.pow($bm_sub(1, t), 3), p1[1]), $bm_mul($bm_mul($bm_mul(3, Math.pow($bm_sub(1, t), 2)), t), cp1[1])), $bm_mul($bm_mul($bm_mul(3, $bm_sub(1, t)), Math.pow(t, 2)), cp2[1])), $bm_mul(Math.pow(t, 3), p2[1]));\n    return [\n        x,\n        y\n    ];\n};\ngetArea = function (points) {\n    var area = 0;\n    for (var i = 0, il = points.length; i < il; i++) {\n        var p1 = points[i];\n        var p2 = points[(i + 1) % il];\n        area = $bm_sum(area, $bm_sub($bm_mul(p1[0], p2[1]), $bm_mul(p2[0], p1[1])));\n    }\n    return $bm_div(area, 2);\n};\nisClockwise = function (points) {\n    return getArea(points) > 0;\n};\ngetCentroid = function (vertices) {\n    var area = getArea(vertices);\n    if (area === 0) {\n        function findCenter(points) {\n            let sumX = 0;\n            let sumY = 0;\n            for (let i = 0, il = points.length; i < il; i++) {\n                const point = points[i];\n                sumX = $bm_sum(sumX, point[0]);\n                sumY = $bm_sum(sumY, point[1]);\n            }\n            const meanX = $bm_div(sumX, points.length);\n            const meanY = $bm_div(sumY, points.length);\n            return [\n                meanX,\n                meanY\n            ];\n        }\n        return findCenter(vertices);\n    }\n    let centroidX = 0;\n    let centroidY = 0;\n    const numVertices = vertices.length;\n    for (var i = 0; i < numVertices; i++) {\n        var currentVertex = vertices[i];\n        var nextVertex = vertices[(i + 1) % numVertices];\n        var commonFactor = $bm_sub($bm_mul(currentVertex[0], nextVertex[1]), $bm_mul(nextVertex[0], currentVertex[1]));\n        centroidX = $bm_sum(centroidX, $bm_mul($bm_sum(currentVertex[0], nextVertex[0]), commonFactor));\n        centroidY = $bm_sum(centroidY, $bm_mul($bm_sum(currentVertex[1], nextVertex[1]), commonFactor));\n    }\n    var scaleFactor = $bm_div(1, $bm_mul(6, area));\n    centroidX *= scaleFactor;\n    centroidY *= scaleFactor;\n    return [\n        centroidX,\n        centroidY\n    ];\n};\ngetCentroidPro = function (vertices) {\n    const bb = getBoundingBox(vertices);\n    return {\n        0: bb.left_top,\n        1: [\n            (bb.left_top[0] + bb.right_top[0]) / 2,\n            bb.left_top[1]\n        ],\n        2: bb.right_top,\n        3: [\n            (bb.left_top[0] + bb.left_bottom[0]) / 2,\n            (bb.left_top[1] + bb.left_bottom[1]) / 2\n        ],\n        4: getCentroid(vertices),\n        5: [\n            (bb.right_top[0] + bb.right_bottom[0]) / 2,\n            (bb.right_top[1] + bb.right_bottom[1]) / 2\n        ],\n        6: bb.left_bottom,\n        7: [\n            (bb.left_bottom[0] + bb.right_bottom[0]) / 2,\n            bb.left_bottom[1]\n        ],\n        8: bb.right_bottom\n    };\n};\nhasNoneZeroValues = function (array2D) {\n    return array2D.some(array => array.some(value => value !== 0));\n};\nangle_between = function (a, b) {\n    const dot_prod = dot_(a, b);\n    const mag_a = len_vec(a);\n    const mag_b = len_vec(b);\n    const cos_ = $bm_div(dot_prod, $bm_mul(mag_a, mag_b));\n    return cos_;\n};\nangle_between_cw = function (u, v) {\n    const dotProduct = $bm_sum($bm_mul(u[0], v[0]), $bm_mul(u[1], v[1]));\n    const crossProduct = $bm_sub($bm_mul(u[0], v[1]), $bm_mul(u[1], v[0]));\n    let angle = Math.atan2(crossProduct, dotProduct);\n    angle = angle >= 0 ? angle : $bm_sum($bm_mul(2, Math.PI), angle);\n    const degrees = $bm_mul(angle, $bm_div(180, Math.PI));\n    return degrees;\n};\nangle_between_cw_te = function (u, v) {\n    const dotProduct = $bm_sum($bm_mul(u[0], v[0]), $bm_mul(u[1], v[1]));\n    const crossProduct = $bm_sub($bm_mul(u[0], v[1]), $bm_mul(u[1], v[0]));\n    let angle = Math.atan2(crossProduct, dotProduct);\n    const degrees = $bm_mul($bm_neg(angle), $bm_div(180, Math.PI));\n    return degrees;\n};\nisStraightLine_w_delta = function (cp1, cp2, delta) {\n    return angle_between(cp1, cp2) <= -delta;\n};\nisFacingTowardsUs = function (p1, p2) {\n    return dot_(sub(p2, p1), [\n        0,\n        0,\n        1\n    ]) > 0;\n};\nisVectorFacingTowardsUs = function (v) {\n    return dot_(v, [\n        0,\n        0,\n        -1\n    ]) > 0;\n};\nmultiplyMatrixVector3x3 = function (matrix, vector) {\n    var result = [\n        0,\n        0,\n        0,\n        0\n    ];\n    for (var i = 0; i < 3; i++) {\n        result[i] = 0;\n        for (var j = 0; j < 3; j++) {\n            result[i] = $bm_sum(result[i], $bm_mul(matrix[$bm_sum($bm_mul(i, 3), j)], vector[j]));\n        }\n    }\n    return result.slice(0, 2);\n};\nmultiplyArrayOfMatrices3x3 = function (matrices) {\n    if (matrices.length > 0) {\n        var result = matrices[0];\n        for (var i = 1, il = matrices.length; i < il; i++) {\n            result = multiplyMatrices3x3(result, matrices[i]);\n        }\n        return result;\n    } else {\n        return false;\n    }\n};\nmultiplyMatrices3x3 = function (B, A) {\n    let C = new Array(9).fill(0);\n    for (let i = 0; i < 3; i++) {\n        for (let j = 0; j < 3; j++) {\n            for (let k = 0; k < 3; k++) {\n                C[$bm_sum($bm_mul(i, 3), j)] = $bm_sum(C[$bm_sum($bm_mul(i, 3), j)], $bm_mul(A[$bm_sum($bm_mul(i, 3), k)], B[$bm_sum($bm_mul(k, 3), j)]));\n            }\n        }\n    }\n    return C;\n};\ntransform2D_apply = function (mt, p) {\n    if (mt == false) {\n        return p;\n    }\n    if (p.length == 2) {\n        p = [\n            ...p,\n            1\n        ];\n    }\n    return multiplyMatrixVector3x3(mt, p).slice(0, 2);\n};\nget_transform_shape_matrix = function (anchor, pos, scale, rot, skew, skew_axis) {\n    let mat_array = [];\n    if (anchor[0] !== 0 || anchor[1] !== 0) {\n        const A = [\n            1,\n            0,\n            -anchor[0],\n            0,\n            1,\n            -anchor[1],\n            0,\n            0,\n            1\n        ];\n        mat_array.push(A);\n    }\n    if (scale[0] !== 100 || scale[1] !== 100) {\n        const S = [\n            scale[0] / 100,\n            0,\n            0,\n            0,\n            scale[1] / 100,\n            0,\n            0,\n            0,\n            1\n        ];\n        mat_array.push(S);\n    }\n    if (skew !== 0) {\n        const sk_angle = $bm_div($bm_mul(skew, Math.PI), 180);\n        const Sk = [\n            1,\n            Math.tan(-sk_angle),\n            0,\n            0,\n            1,\n            0,\n            0,\n            0,\n            1\n        ];\n        if (skew_axis !== 0) {\n            const sk_axis_angle = $bm_div($bm_mul(skew_axis, Math.PI), 180);\n            const cos_sk = Math.cos(sk_axis_angle);\n            const sin_sk = Math.sin(sk_axis_angle);\n            const Rz = [\n                cos_sk,\n                -sin_sk,\n                0,\n                sin_sk,\n                cos_sk,\n                0,\n                0,\n                0,\n                1\n            ];\n            const Rz_inv = [\n                cos_sk,\n                sin_sk,\n                0,\n                -sin_sk,\n                cos_sk,\n                0,\n                0,\n                0,\n                1\n            ];\n            const SkM = multiplyArrayOfMatrices3x3([\n                Rz_inv,\n                Sk,\n                Rz\n            ]);\n            mat_array.push(SkM);\n        } else {\n            mat_array.push(Sk);\n        }\n    }\n    if (rot !== 0) {\n        const theta = $bm_div($bm_mul(rot, Math.PI), 180);\n        const cos_th = Math.cos(theta);\n        const sin_th = Math.sin(theta);\n        const R = [\n            cos_th,\n            -sin_th,\n            0,\n            sin_th,\n            cos_th,\n            0,\n            0,\n            0,\n            1\n        ];\n        mat_array.push(R);\n    }\n    if (pos[0] !== 0 || pos[1] !== 0) {\n        const T = [\n            1,\n            0,\n            pos[0],\n            0,\n            1,\n            pos[1],\n            0,\n            0,\n            1\n        ];\n        mat_array.push(T);\n    }\n    return multiplyArrayOfMatrices3x3(mat_array);\n};\nget_transforms_from_bb = function (bb, extr_transform_matrix, layer_transform_matrix, parent_transform_matrix, is_front, front_facing_towards_us, mode) {\n    let bb_transformed_3D = [];\n    if (front_facing_towards_us) {\n        bb_transformed_3D = [\n            bb.left_top,\n            bb.right_top,\n            bb.left_bottom,\n            bb.right_bottom\n        ];\n    } else {\n        bb_transformed_3D = [\n            bb.right_top,\n            bb.left_top,\n            bb.right_bottom,\n            bb.left_bottom\n        ];\n    }\n    bb_transformed_3D = bb_transformed_3D.map(pnt => make_transform(extr_transform_matrix, pnt));\n    let bb_transformed_2D = get2D_projection(bb_transformed_3D);\n    bb_transformed_2D = bb_transformed_2D.map(p => transform2D_apply(layer_transform_matrix, p));\n    if (parent_transform_matrix) {\n        bb_transformed_2D = bb_transformed_2D.map(p => transform2D_apply(parent_transform_matrix, p));\n    }\n    const ex_left_top = bb_transformed_2D[0], ex_right_top = bb_transformed_2D[1], ex_left_bottom = bb_transformed_2D[2], ex_right_bottom = bb_transformed_2D[3];\n    let transform_effect_controls = [];\n    if (mode & 1) {\n        const bb_pos = ex_left_top;\n        const ex_AD = sub(ex_left_bottom, ex_left_top);\n        const rot = angle_between_cw_te(ex_AD, [\n            0,\n            1\n        ]);\n        const ex_AB = sub(ex_right_top, ex_left_top);\n        const rot_rad = $bm_mul(rot, $bm_div(Math.PI, 180));\n        const x_rot = [\n            Math.cos(rot_rad),\n            Math.sin(rot_rad)\n        ];\n        let skw = angle_between_cw_te(ex_AB, x_rot);\n        if (!front_facing_towards_us) {\n            skw = skw > 90 ? $bm_sub(skw, 180) : skw;\n            skw = skw <= -90 ? $bm_sum(skw, 180) : skw;\n        }\n        ;\n        let extra_skew_arr = [];\n        if (Math.abs(skw) > 70) {\n            const max_count = 7;\n            let count = 1;\n            let skew_ = Math.abs(skw);\n            const tan_70 = Math.tan(degreesToRadians(70));\n            while (skew_ > 70 && count < max_count) {\n                skew_ = radiansToDegrees(Math.atan($bm_sub(Math.tan(degreesToRadians(skew_)), tan_70)));\n                extra_skew_arr.push(skw > 0 ? skew_ : -skew_);\n                count++;\n            }\n        }\n        const scaleY = $bm_mul(100, len_vec(ex_AD));\n        const angle_AB_AD = angle_between_cw_te(ex_AD, ex_AB);\n        const beta = $bm_sub($bm_sub(180, angle_AB_AD), skw);\n        const scaleX_coeff = $bm_div(Math.sin($bm_div($bm_mul(beta, Math.PI), 180)), Math.sin($bm_div($bm_mul(angle_AB_AD, Math.PI), 180)));\n        let scaleX = $bm_div($bm_mul(100, len_vec(ex_AB)), scaleX_coeff);\n        if (!front_facing_towards_us) {\n            scaleX = $bm_neg(scaleX);\n        }\n        transform_effect_controls = [\n            bb_pos,\n            rot,\n            skw,\n            scaleY,\n            scaleX,\n            extra_skew_arr\n        ];\n    }\n    let transform_layer_controls = [];\n    if (mode & 2) {\n        const tl_AB = sub(bb.right_top, bb.left_top);\n        const tl_AD = sub(bb.left_bottom, bb.left_top);\n        const tl_scaleX_coeff = 100;\n        const tl_scaleY_coeff = 100;\n        const tl_bb_anchor = bb.left_top;\n        let tl_bb_pos = ex_left_top;\n        const tl_ex_AB = sub(ex_right_top, ex_left_top);\n        let tl_bb_theta = angle_between_cw(tl_AB, tl_ex_AB);\n        let tl_bb_scx = $bm_div($bm_mul(tl_scaleX_coeff, len_vec(tl_ex_AB)), len_vec(tl_AB));\n        const tl_ex_AD = sub(ex_left_bottom, ex_left_top);\n        const tl_bb_th_rad = $bm_mul(tl_bb_theta, $bm_div(Math.PI, 180));\n        const tl_cos_th = Math.cos(tl_bb_th_rad);\n        const tl_sin_th = Math.sin(tl_bb_th_rad);\n        const tl_AD_rot = [\n            tl_AD[0] * tl_cos_th - tl_AD[1] * tl_sin_th,\n            tl_AD[0] * tl_sin_th + tl_AD[1] * tl_cos_th\n        ];\n        let tl_skew = angle_between_cw(tl_AD_rot, tl_ex_AD);\n        tl_skew = tl_skew < 90 ? tl_skew : $bm_sub(tl_skew, 360);\n        const tl_sk_rad = $bm_div($bm_mul(tl_skew, Math.PI), 180);\n        const tl_AD_skew = [\n            tl_AD[0] + Math.tan(-tl_sk_rad) * tl_AD[1],\n            tl_AD[1]\n        ];\n        const tl_bb_scy = $bm_div($bm_mul(tl_scaleY_coeff, len_vec(tl_ex_AD)), len_vec(tl_AD_skew));\n        if (front_facing_towards_us && !is_front || !front_facing_towards_us && is_front) {\n            tl_bb_scx = $bm_neg(tl_bb_scx);\n            tl_bb_pos = $bm_sum(tl_bb_pos, tl_ex_AB);\n        }\n        transform_layer_controls = [\n            tl_bb_anchor[0],\n            tl_bb_anchor[1],\n            tl_bb_pos[0],\n            tl_bb_pos[1],\n            tl_bb_theta,\n            tl_bb_scx,\n            tl_bb_scy,\n            tl_skew\n        ];\n    }\n    return {\n        'boundingBoxTransformed': bb_transformed_2D,\n        'transformEffectControls': transform_effect_controls,\n        'transformLayerControls': transform_layer_controls\n    };\n};\nconst shape_layer = thisComp.layer('Circ 1');\nconst shape = shape_layer(2)(1);\nconst shape_contents = shape(2);\nconst targetPath = shape_contents(1)(2);\nconst is_path_closed = targetPath.isClosed();\nconst extrudalizer = shape_layer('ADBE Effect Parade')('Pseudo/Extrudalizer');\nconst depth = extrudalizer('Extrusion depth').value;\nlet anchor = extrudalizer('Position').value;\nanchor = [\n    $bm_neg(anchor[0]),\n    anchor[1],\n    anchor[2]\n];\nconst angleX = extrudalizer('X Rotation').value;\nconst angleY = extrudalizer('Y Rotation').value;\nconst angleZ = extrudalizer('Z Rotation').value;\nconst pivot_angleX = extrudalizer('Pitch (x)').value;\nconst pivot_angleY = extrudalizer('Yaw (y)').value;\nconst pivot_angleZ = extrudalizer('Roll (z)').value;\nconst scale_front = $bm_div(extrudalizer('Front scale').value, 100);\nconst scale_back = $bm_div(extrudalizer('Back scale').value, 100);\nconst use_bb_front = extrudalizer('Compute 3D front bounding box').value;\nconst use_bb_back = extrudalizer('Compute 3D back bounding box').value;\nlet pnts = targetPath.points();\nlet inTangents = targetPath.inTangents();\nlet outTangents = targetPath.outTangents();\nconst is_front_clockwise = isClockwise(pnts);\nconst shape_transform = shape.transform;\nconst s_anchor = shape_transform.anchorPoint;\nconst s_pos = shape_transform.position;\nconst s_scale = shape_transform.scale;\nconst s_rot = shape_transform.rotation;\nconst s_skew = shape_transform.skew;\nconst s_skew_axis = shape_transform.skewAxis;\nconst shape_transform_matrix = get_transform_shape_matrix(s_anchor, s_pos, s_scale, s_rot, s_skew, s_skew_axis);\nconst layer_transform = shape_layer.transform;\nconst l_anchor = layer_transform.anchorPoint;\nconst l_pos = layer_transform.position;\nconst l_scale = layer_transform.scale;\nconst l_rot = layer_transform.rotation;\nconst layer_transform_matrix = get_transform_shape_matrix(l_anchor, l_pos, l_scale, l_rot, 0, 0);\nlet subdivs = 1;\nlet num_pnts = pnts.length;\nif (hasNoneZeroValues(inTangents) || hasNoneZeroValues(outTangents)) {\n    subdivs = 10;\n    let pointsF = [];\n    for (var i = 0; i < num_pnts; i++) {\n        pointsF.push(pnts[i]);\n        if (!is_path_closed && i == num_pnts - 1) {\n            break;\n        }\n        var p1 = pnts[i], p2 = pnts[(i + 1) % num_pnts];\n        var out1 = outTangents[i], in2 = inTangents[(i + 1) % num_pnts];\n        var cp1 = add(p1, out1), cp2 = add(p2, in2);\n        var len_out1 = len_vec(out1), len_in2 = len_vec(in2);\n        var len_p1p2 = len_vec(sub(p2, p1));\n        if (len_out1 !== 0 || len_in2 !== 0) {\n            var a = len_out1 === 0 ? sub(p2, p1) : out1;\n            var b = len_in2 === 0 ? sub(p1, p2) : in2;\n            if (!isStraightLine_w_delta(a, b, 0.999) && (len_out1 > len_p1p2 * 0.02 || len_in2 > len_p1p2 * 0.02)) {\n                for (var j = 1; j < subdivs; j++) {\n                    var t = $bm_div(j, subdivs);\n                    pointsF.push(getPoint(p1, cp1, cp2, p2, t));\n                }\n            }\n        }\n    }\n    pnts = pointsF;\n}\npnts = pnts.map(p => transform2D_apply(shape_transform_matrix, p));\nnum_pts = pnts.length;\nconst zero_center_point = getCentroidPro(pnts)[4];\nlet z_coord = 0;\nswitch (1) {\ncase 0:\n    z_coord = $bm_div($bm_neg(depth), 2);\n    break;\ncase 1:\n    z_coord = 0;\n    break;\ncase 2:\n    z_coord = $bm_div(depth, 2);\n    break;\n}\n;\nconst zero_center_point_3D = [\n    ...zero_center_point,\n    z_coord\n];\nconst pivot_matrix = transformMatrix([\n    0,\n    0,\n    z_coord\n], 1, [\n    0,\n    0,\n    0\n], [\n    0,\n    0,\n    0\n], anchor, [\n    angleX,\n    angleY,\n    angleZ\n]);\nconst pivot_position = make_transform(pivot_matrix, zero_center_point);\nconst tr_front_mat = transformMatrix([\n    0,\n    0,\n    $bm_div($bm_neg(depth), 2)\n], scale_front, zero_center_point_3D, [\n    pivot_angleX,\n    pivot_angleY,\n    pivot_angleZ\n], anchor, [\n    angleX,\n    angleY,\n    angleZ\n]);\nconst tr_back_mat = transformMatrix([\n    0,\n    0,\n    $bm_div(depth, 2)\n], scale_back, zero_center_point_3D, [\n    pivot_angleX,\n    pivot_angleY,\n    pivot_angleZ\n], anchor, [\n    angleX,\n    angleY,\n    angleZ\n]);\nconst rot_matrix = transformMatrix([\n    0,\n    0,\n    0\n], 1, [\n    0,\n    0,\n    0\n], [\n    pivot_angleX,\n    pivot_angleY,\n    pivot_angleZ\n], [\n    0,\n    0,\n    0\n], [\n    angleX,\n    angleY,\n    angleZ\n]);\nconst z1_transformed = make_transform(rot_matrix, [\n    0,\n    0,\n    -1\n]);\nconst front_facing_towards_us = isVectorFacingTowardsUs(z1_transformed);\nlet points_front_3D = pnts.map(pnt => make_transform(tr_front_mat, pnt));\nlet points_back_3D = pnts.map(pnt => make_transform(tr_back_mat, pnt));\nlet winding_sides = [];\nlet sorted_sides = [];\nlet sorted_side_colors = [];\nlet num_sides_towards_us = 0;\nfor (var i = 0; i < num_pts; i++) {\n    if (!is_path_closed && i == num_pts - 1) {\n        break;\n    }\n    var F1 = points_front_3D[i], F2 = points_front_3D[(i + 1) % num_pts];\n    var B1 = points_back_3D[i], B2 = points_back_3D[(i + 1) % num_pts];\n    let abs_side_normal = getNormal([\n        F2,\n        F1,\n        B1\n    ], true);\n    let real_side_normal = !is_front_clockwise ? mul(abs_side_normal, -1) : abs_side_normal;\n    const sideIsFacingUs = isFacingTowardsUs([\n        0,\n        0,\n        0\n    ], real_side_normal);\n    if (sideIsFacingUs) {\n        num_sides_towards_us++;\n    }\n    winding_sides.push(sideIsFacingUs);\n    let side_sorted = [\n        F2,\n        F1,\n        B1,\n        B2\n    ];\n    side_sorted.sort((a, b) => b[2] - a[2]);\n    sorted_sides.push([\n        side_sorted,\n        i,\n        $bm_mod($bm_sum(i, 1), num_pts),\n        abs_side_normal\n    ]);\n}\ncompare_sides = function (side1, side2) {\n    const s1_vertices_z = side1[0].map(v => v[2]), s2_vertices_z = side2[0].map(v => v[2]);\n    for (var i = 0, il = side1[0].length; i < il; i++) {\n        if (s1_vertices_z[i] != s2_vertices_z[i]) {\n            return $bm_sub(s2_vertices_z[i], s1_vertices_z[i]);\n        }\n    }\n};\nsorted_sides.sort((a, b) => compare_sides(a, b));\nsorted_sides.sort(function (a, b) {\n    const fa = winding_sides[a[1]], fb = winding_sides[b[1]];\n    if (fa && !fb) {\n        return -1;\n    } else if (!fa && fb) {\n        return 1;\n    } else {\n        return 0;\n    }\n});\nsorted_sides_indices = sorted_sides.map(p => [\n    p[1],\n    p[2]\n]);\nif (true) {\n    const lambert_max = extrudalizer('Sides fill shadow opacity').value;\n    const rgba = extrudalizer('Sides color').value;\n    adjustColorBrightness = function (rgba, brightness) {\n        const r = Math.max(0, Math.min(1, $bm_mul(rgba[0], brightness)));\n        const g = Math.max(0, Math.min(1, $bm_mul(rgba[1], brightness)));\n        const b = Math.max(0, Math.min(1, $bm_mul(rgba[2], brightness)));\n        return [\n            Math.round(r * 100) / 100,\n            Math.round(g * 100) / 100,\n            Math.round(b * 100) / 100,\n            rgba[3]\n        ];\n    };\n    lambertShader = function (normal, max_value, multiplier) {\n        return $bm_div($bm_mul($bm_mul(multiplier, $bm_sub(100, max_value)), Math.abs(dot_(normal, [\n            0,\n            0,\n            1\n        ]))), 100);\n    };\n    sorted_side_colors = sorted_sides.map(p => adjustColorBrightness(rgba, lambertShader(p[3], lambert_max, 2)));\n}\nconst front_normal = div(z1_transformed, len_vec(z1_transformed));\nlet bb_front_2D = [], bb_back_2D = [], bb_front_transforms_te = [], bb_back_transforms_te = [], bb_front_transforms_tl = [], bb_back_transforms_tl = [];\nif (use_bb_back || use_bb_front) {\n    const bb = getBoundingBox(pnts);\n    let hasParent = shape_layer.hasParent;\n    let parent_transform_matrix = null;\n    if (hasParent) {\n        let p_pos = shape_layer.parent.transform.position;\n        let p_anchor = shape_layer.parent.transform.anchorPoint;\n        let p_rot = shape_layer.parent.transform.rotation;\n        let p_sca = shape_layer.parent.transform.scale;\n        parent_transform_matrix = get_transform_shape_matrix(p_anchor, p_pos, p_sca, p_rot, 0, 0);\n    }\n    if (use_bb_front) {\n        const bb_front_data = get_transforms_from_bb(bb, tr_front_mat, layer_transform_matrix, parent_transform_matrix, true, front_facing_towards_us, 3);\n        bb_front_2D = bb_front_data['boundingBoxTransformed'];\n        bb_front_transforms_te = bb_front_data['transformEffectControls'];\n        bb_front_transforms_tl = bb_front_data['transformLayerControls'];\n    }\n    if (use_bb_back) {\n        const bb_back_data = get_transforms_from_bb(bb, tr_back_mat, layer_transform_matrix, parent_transform_matrix, false, front_facing_towards_us, 3);\n        bb_back_2D = bb_back_data['boundingBoxTransformed'];\n        bb_back_transforms_te = bb_back_data['transformEffectControls'];\n        bb_back_transforms_tl = bb_back_data['transformLayerControls'];\n    }\n}\nlet grad_property = null;\ntry {\n    grad_property = shape_contents('ADBE Vector Graphic - G-Fill');\n} catch (e) {\n}\nlet grad_start_front_new = [\n    0,\n    0\n];\nlet grad_end_front_new = [\n    0,\n    0\n];\nlet grad_start_back_new = [\n    0,\n    0\n];\nlet grad_end_back_new = [\n    0,\n    0\n];\nif (grad_property != null) {\n    let grad_start = grad_property.startPoint.value;\n    let grad_end = grad_property.endPoint.value;\n    grad_start = transform2D_apply(shape_transform_matrix, grad_start);\n    grad_end = transform2D_apply(shape_transform_matrix, grad_end);\n    const grad_start_front = make_transform(tr_front_mat, grad_start);\n    const grad_end_front = make_transform(tr_front_mat, grad_end);\n    const grad_start_back = make_transform(tr_back_mat, grad_start);\n    const grad_end_back = make_transform(tr_back_mat, grad_end);\n    grad_start_front_new = grad_start_front;\n    grad_end_front_new = grad_end_front;\n    grad_start_back_new = grad_start_back;\n    grad_end_back_new = grad_end_back;\n    const grad_front_rot = $bm_div($bm_mul(extrudalizer('Front gradient direction').value, Math.PI), 180);\n    const grad_back_rot = $bm_div($bm_mul(extrudalizer('Back gradient direction').value, Math.PI), 180);\n    if (!arraysEqual([\n            grad_front_rot,\n            grad_back_rot\n        ], [\n            0,\n            0\n        ])) {\n        const grad_origin_front = div(add(grad_end_front, grad_start_front), 2);\n        const grad_origin_back = div(add(grad_end_back, grad_start_back), 2);\n        const grad_p_st_front = sub(grad_start_front, grad_origin_front);\n        const grad_p_end_front = sub(grad_end_front, grad_origin_front);\n        const grad_p_st_back = sub(grad_start_back, grad_origin_back);\n        const grad_p_end_back = sub(grad_end_back, grad_origin_back);\n        if (grad_front_rot != 0) {\n            const cos_st = Math.cos(grad_front_rot), sin_st = Math.sin(grad_front_rot);\n            grad_start_front_new[0] = $bm_sum($bm_sub($bm_mul(cos_st, grad_p_st_front[0]), $bm_mul(sin_st, grad_p_st_front[1])), grad_origin_front[0]);\n            grad_start_front_new[1] = $bm_sum($bm_sum($bm_mul(sin_st, grad_p_st_front[0]), $bm_mul(cos_st, grad_p_st_front[1])), grad_origin_front[1]);\n            grad_end_front_new[0] = $bm_sum($bm_sub($bm_mul(cos_st, grad_p_end_front[0]), $bm_mul(sin_st, grad_p_end_front[1])), grad_origin_front[0]);\n            grad_end_front_new[1] = $bm_sum($bm_sum($bm_mul(sin_st, grad_p_end_front[0]), $bm_mul(cos_st, grad_p_end_front[1])), grad_origin_front[1]);\n        }\n        if (grad_back_rot != 0) {\n            const cos_st_b = Math.cos(grad_back_rot), sin_st_b = Math.sin(grad_back_rot);\n            grad_start_back_new[0] = $bm_sum($bm_sub($bm_mul(cos_st_b, grad_p_st_back[0]), $bm_mul(sin_st_b, grad_p_st_back[1])), grad_origin_back[0]);\n            grad_start_back_new[1] = $bm_sum($bm_sum($bm_mul(sin_st_b, grad_p_st_back[0]), $bm_mul(cos_st_b, grad_p_st_back[1])), grad_origin_back[1]);\n            grad_end_back_new[0] = $bm_sum($bm_sub($bm_mul(cos_st_b, grad_p_end_back[0]), $bm_mul(sin_st_b, grad_p_end_back[1])), grad_origin_back[0]);\n            grad_end_back_new[1] = $bm_sum($bm_sum($bm_mul(sin_st_b, grad_p_end_back[0]), $bm_mul(cos_st_b, grad_p_end_back[1])), grad_origin_back[1]);\n        }\n    }\n}\nconst extr_data = [\n    tr_front_mat,\n    tr_back_mat,\n    shape_transform_matrix,\n    subdivs,\n    is_path_closed,\n    points_front_3D,\n    points_back_3D,\n    sorted_sides_indices,\n    front_facing_towards_us,\n    is_front_clockwise,\n    num_sides_towards_us,\n    sorted_side_colors,\n    pivot_position,\n    front_normal,\n    bb_front_2D,\n    bb_back_2D,\n    bb_front_transforms_te,\n    bb_back_transforms_te,\n    bb_front_transforms_tl,\n    bb_back_transforms_tl,\n    grad_start_front_new,\n    grad_end_front_new,\n    grad_start_back_new,\n    grad_end_back_new\n];\nvar txt = '';\ntry {\n    _lottieGlobal.ml_extrudalizer = _lottieGlobal.ml_extrudalizer || {};\n    _lottieGlobal.ml_extrudalizer['EXTRUDALIZER DATA || Circ 1'] = extr_data;\n} catch (err) {\n    stringify = function (data, separator) {\n        return data.map(item => Array.isArray(item) ? item.join(',') : item.toString()).join(separator);\n    };\n    txt = stringify(extr_data, ';');\n}\n$bm_rt = txt;"},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":2400,"st":0,"ct":1,"bm":0}]}],"fonts":{"list":[{"origin":0,"fPath":"","fClass":"","fFamily":"ObelixPro","fWeight":"","fStyle":"Regular","fName":"ObelixPro","ascent":103.239816520363}]},"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Orbit 2","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279,275,0],"ix":2,"l":2},"a":{"a":0,"k":[960,540,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":600,"s":[10],"h":1}],"ix":2},"w":1920,"h":1080,"ip":0,"op":2400,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Orbit 2","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279,275,0],"ix":2,"l":2},"a":{"a":0,"k":[960,540,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[11]},{"t":600,"s":[21],"h":1}],"ix":2},"w":1920,"h":1080,"ip":0,"op":2400,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Orbit 2","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279,275,0],"ix":2,"l":2},"a":{"a":0,"k":[960,540,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[23]},{"t":600,"s":[33],"h":1}],"ix":2},"w":1920,"h":1080,"ip":0,"op":2400,"st":0,"bm":0}],"markers":[],"props":{}}