                     constructiveSolidResultCache[other.cacheId] = .regions(ShapeRegion(solids: self.breakLoop(intersectTable.looping_left)), ShapeRegion(solids: other.breakLoop(intersectTable.looping_right)))
                 } else {
                     
-                    if intersectTable.graph.count == 0 {
+                    if intersectTable.l_graph.count == 0 {
                         constructiveSolidResultCache[other.cacheId] = .overlap(intersectTable.overlap)
                     } else {
-                        let segments = createSegments(other, intersectTable.graph)
+                        let segments = create_solids(other, intersectTable.l_graph, intersectTable.r_graph)
                         let forward = segments.filter { self.area.sign == $0.solid.area.sign }
                         let backward = segments.filter { self.area.sign != $0.solid.area.sign }
                         constructiveSolidResultCache[other.cacheId] = .segments(forward, backward)

    
    fileprivate func breakLoop() -> [ShapeRegion.Solid] {
        
        var intersects: [(ConstructiveSolidResult.Table.Split, ConstructiveSolidResult.Table.Split)] = []
        for (index1, segment1) in bezier.enumerated() {
            for (index2, segment2) in bezier.suffix(from: index1 + 1).indexed() {
                if !segment2.boundary.inset(dx: -1e-6, dy: -1e-6).isIntersect(segment1.boundary.inset(dx: -1e-6, dy: -1e-6)) {

    fileprivate init(_ left: Shape.Component, _ right: Shape.Component) {
        
        struct SplitData {
            fileprivate let left: ConstructiveSolidResult.Split
            fileprivate let right: ConstructiveSolidResult.Split
            let point: Point
        }
        
        let left_spaces = left.spaces
        let right_spaces = right.spaces
        
        var data: [SplitData] = []
        var overlaps_index: [(Int, Int)] = []
        var overlap_r_index: Set<Int> = []
        var overlap_l_index: Set<Int> = []
