| var svgEditorExtension_connector = (function () { | 
|   'use strict'; | 
|   | 
|   function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { | 
|     try { | 
|       var info = gen[key](arg); | 
|       var value = info.value; | 
|     } catch (error) { | 
|       reject(error); | 
|       return; | 
|     } | 
|   | 
|     if (info.done) { | 
|       resolve(value); | 
|     } else { | 
|       Promise.resolve(value).then(_next, _throw); | 
|     } | 
|   } | 
|   | 
|   function _asyncToGenerator(fn) { | 
|     return function () { | 
|       var self = this, | 
|           args = arguments; | 
|       return new Promise(function (resolve, reject) { | 
|         var gen = fn.apply(self, args); | 
|   | 
|         function _next(value) { | 
|           asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); | 
|         } | 
|   | 
|         function _throw(err) { | 
|           asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); | 
|         } | 
|   | 
|         _next(undefined); | 
|       }); | 
|     }; | 
|   } | 
|   | 
|   /* globals jQuery */ | 
|   | 
|   /** | 
|    * ext-connector.js | 
|    * | 
|    * @license MIT | 
|    * | 
|    * @copyright 2010 Alexis Deveria | 
|    * | 
|    */ | 
|   var extConnector = { | 
|     name: 'connector', | 
|     init: function () { | 
|       var _init = _asyncToGenerator( | 
|       /*#__PURE__*/ | 
|       regeneratorRuntime.mark(function _callee2(S) { | 
|         var $, svgEditor, svgCanvas, getElem, svgroot, importLocale, addElem, selManager, connSel, elData, strings, startX, startY, curLine, startElem, endElem, seNs, svgcontent, started, connections, selElems, getBBintersect, getOffset, showPanel, setPoint, updateLine, findConnectors, updateConnectors, init, buttons; | 
|         return regeneratorRuntime.wrap(function _callee2$(_context2) { | 
|           while (1) { | 
|             switch (_context2.prev = _context2.next) { | 
|               case 0: | 
|                 init = function _ref9() { | 
|                   // Make sure all connectors have data set | 
|                   $(svgcontent).find('*').each(function () { | 
|                     var conn = this.getAttributeNS(seNs, 'connector'); | 
|   | 
|                     if (conn) { | 
|                       this.setAttribute('class', connSel.substr(1)); | 
|                       var connData = conn.split(' '); | 
|                       var sbb = svgCanvas.getStrokedBBox([getElem(connData[0])]); | 
|                       var ebb = svgCanvas.getStrokedBBox([getElem(connData[1])]); | 
|                       $(this).data('c_start', connData[0]).data('c_end', connData[1]).data('start_bb', sbb).data('end_bb', ebb); | 
|                       svgCanvas.getEditorNS(true); | 
|                     } | 
|                   }); // updateConnectors(); | 
|                 }; | 
|   | 
|                 updateConnectors = function _ref8(elems) { | 
|                   // Updates connector lines based on selected elements | 
|                   // Is not used on mousemove, as it runs getStrokedBBox every time, | 
|                   // which isn't necessary there. | 
|                   findConnectors(elems); | 
|   | 
|                   if (connections.length) { | 
|                     // Update line with element | 
|                     var i = connections.length; | 
|   | 
|                     while (i--) { | 
|                       var conn = connections[i]; | 
|                       var line = conn.connector; | 
|                       var elem = conn.elem; // const sw = line.getAttribute('stroke-width') * 5; | 
|   | 
|                       var pre = conn.is_start ? 'start' : 'end'; // Update bbox for this element | 
|   | 
|                       var bb = svgCanvas.getStrokedBBox([elem]); | 
|                       bb.x = conn.start_x; | 
|                       bb.y = conn.start_y; | 
|                       elData(line, pre + '_bb', bb); | 
|                       /* const addOffset = */ | 
|   | 
|                       elData(line, pre + '_off'); | 
|                       var altPre = conn.is_start ? 'end' : 'start'; // Get center pt of connected element | 
|   | 
|                       var bb2 = elData(line, altPre + '_bb'); | 
|                       var srcX = bb2.x + bb2.width / 2; | 
|                       var srcY = bb2.y + bb2.height / 2; // Set point of element being moved | 
|   | 
|                       var pt = getBBintersect(srcX, srcY, bb, getOffset(pre, line)); | 
|                       setPoint(line, conn.is_start ? 0 : 'end', pt.x, pt.y, true); // Set point of connected element | 
|   | 
|                       var pt2 = getBBintersect(pt.x, pt.y, elData(line, altPre + '_bb'), getOffset(altPre, line)); | 
|                       setPoint(line, conn.is_start ? 'end' : 0, pt2.x, pt2.y, true); // Update points attribute manually for webkit | 
|   | 
|                       if (navigator.userAgent.includes('AppleWebKit')) { | 
|                         var pts = line.points; | 
|                         var len = pts.numberOfItems; | 
|                         var ptArr = []; | 
|   | 
|                         for (var j = 0; j < len; j++) { | 
|                           pt = pts.getItem(j); | 
|                           ptArr[j] = pt.x + ',' + pt.y; | 
|                         } | 
|   | 
|                         line.setAttribute('points', ptArr.join(' ')); | 
|                       } | 
|                     } | 
|                   } | 
|                 }; | 
|   | 
|                 findConnectors = function _ref7() { | 
|                   var elems = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : selElems; | 
|                   var connectors = $(svgcontent).find(connSel); | 
|                   connections = []; // Loop through connectors to see if one is connected to the element | 
|   | 
|                   connectors.each(function () { | 
|                     var addThis; | 
|   | 
|                     function add() { | 
|                       if (elems.includes(this)) { | 
|                         // Pretend this element is selected | 
|                         addThis = true; | 
|                       } | 
|                     } // Grab the ends | 
|   | 
|   | 
|                     var parts = []; | 
|                     ['start', 'end'].forEach(function (pos, i) { | 
|                       var key = 'c_' + pos; | 
|                       var part = elData(this, key); | 
|   | 
|                       if (part == null) { | 
|                         part = document.getElementById(this.attributes['se:connector'].value.split(' ')[i]); | 
|                         elData(this, 'c_' + pos, part.id); | 
|                         elData(this, pos + '_bb', svgCanvas.getStrokedBBox([part])); | 
|                       } else part = document.getElementById(part); | 
|   | 
|                       parts.push(part); | 
|                     }.bind(this)); | 
|   | 
|                     for (var i = 0; i < 2; i++) { | 
|                       var cElem = parts[i]; | 
|                       addThis = false; // The connected element might be part of a selected group | 
|   | 
|                       $(cElem).parents().each(add); | 
|   | 
|                       if (!cElem || !cElem.parentNode) { | 
|                         $(this).remove(); | 
|                         continue; | 
|                       } | 
|   | 
|                       if (elems.includes(cElem) || addThis) { | 
|                         var bb = svgCanvas.getStrokedBBox([cElem]); | 
|                         connections.push({ | 
|                           elem: cElem, | 
|                           connector: this, | 
|                           is_start: i === 0, | 
|                           start_x: bb.x, | 
|                           start_y: bb.y | 
|                         }); | 
|                       } | 
|                     } | 
|                   }); | 
|                 }; | 
|   | 
|                 updateLine = function _ref6(diffX, diffY) { | 
|                   // Update line with element | 
|                   var i = connections.length; | 
|   | 
|                   while (i--) { | 
|                     var conn = connections[i]; | 
|                     var line = conn.connector; // const {elem} = conn; | 
|   | 
|                     var pre = conn.is_start ? 'start' : 'end'; // const sw = line.getAttribute('stroke-width') * 5; | 
|                     // Update bbox for this element | 
|   | 
|                     var bb = elData(line, pre + '_bb'); | 
|                     bb.x = conn.start_x + diffX; | 
|                     bb.y = conn.start_y + diffY; | 
|                     elData(line, pre + '_bb', bb); | 
|                     var altPre = conn.is_start ? 'end' : 'start'; // Get center pt of connected element | 
|   | 
|                     var bb2 = elData(line, altPre + '_bb'); | 
|                     var srcX = bb2.x + bb2.width / 2; | 
|                     var srcY = bb2.y + bb2.height / 2; // Set point of element being moved | 
|   | 
|                     var pt = getBBintersect(srcX, srcY, bb, getOffset(pre, line)); // $(line).data(pre+'_off')?sw:0 | 
|   | 
|                     setPoint(line, conn.is_start ? 0 : 'end', pt.x, pt.y, true); // Set point of connected element | 
|   | 
|                     var pt2 = getBBintersect(pt.x, pt.y, elData(line, altPre + '_bb'), getOffset(altPre, line)); | 
|                     setPoint(line, conn.is_start ? 'end' : 0, pt2.x, pt2.y, true); | 
|                   } | 
|                 }; | 
|   | 
|                 setPoint = function _ref5(elem, pos, x, y, setMid) { | 
|                   var pts = elem.points; | 
|                   var pt = svgroot.createSVGPoint(); | 
|                   pt.x = x; | 
|                   pt.y = y; | 
|   | 
|                   if (pos === 'end') { | 
|                     pos = pts.numberOfItems - 1; | 
|                   } // TODO: Test for this on init, then use alt only if needed | 
|   | 
|   | 
|                   try { | 
|                     pts.replaceItem(pt, pos); | 
|                   } catch (err) { | 
|                     // Should only occur in FF which formats points attr as "n,n n,n", so just split | 
|                     var ptArr = elem.getAttribute('points').split(' '); | 
|   | 
|                     for (var i = 0; i < ptArr.length; i++) { | 
|                       if (i === pos) { | 
|                         ptArr[i] = x + ',' + y; | 
|                       } | 
|                     } | 
|   | 
|                     elem.setAttribute('points', ptArr.join(' ')); | 
|                   } | 
|   | 
|                   if (setMid) { | 
|                     // Add center point | 
|                     var ptStart = pts.getItem(0); | 
|                     var ptEnd = pts.getItem(pts.numberOfItems - 1); | 
|                     setPoint(elem, 1, (ptEnd.x + ptStart.x) / 2, (ptEnd.y + ptStart.y) / 2); | 
|                   } | 
|                 }; | 
|   | 
|                 showPanel = function _ref4(on) { | 
|                   var connRules = $('#connector_rules'); | 
|   | 
|                   if (!connRules.length) { | 
|                     connRules = $('<style id="connector_rules"></style>').appendTo('head'); | 
|                   } | 
|   | 
|                   connRules.text(!on ? '' : '#tool_clone, #tool_topath, #tool_angle, #xy_panel { display: none !important; }'); | 
|                   $('#connector_panel').toggle(on); | 
|                 }; | 
|   | 
|                 getOffset = function _ref3(side, line) { | 
|                   var giveOffset = !!line.getAttribute('marker-' + side); // const giveOffset = $(line).data(side+'_off'); | 
|                   // TODO: Make this number (5) be based on marker width/height | 
|   | 
|                   var size = line.getAttribute('stroke-width') * 5; | 
|                   return giveOffset ? size : 0; | 
|                 }; | 
|   | 
|                 getBBintersect = function _ref2(x, y, bb, offset) { | 
|                   if (offset) { | 
|                     offset -= 0; | 
|                     bb = $.extend({}, bb); | 
|                     bb.width += offset; | 
|                     bb.height += offset; | 
|                     bb.x -= offset / 2; | 
|                     bb.y -= offset / 2; | 
|                   } | 
|   | 
|                   var midX = bb.x + bb.width / 2; | 
|                   var midY = bb.y + bb.height / 2; | 
|                   var lenX = x - midX; | 
|                   var lenY = y - midY; | 
|                   var slope = Math.abs(lenY / lenX); | 
|                   var ratio; | 
|   | 
|                   if (slope < bb.height / bb.width) { | 
|                     ratio = bb.width / 2 / Math.abs(lenX); | 
|                   } else { | 
|                     ratio = lenY ? bb.height / 2 / Math.abs(lenY) : 0; | 
|                   } | 
|   | 
|                   return { | 
|                     x: midX + lenX * ratio, | 
|                     y: midY + lenY * ratio | 
|                   }; | 
|                 }; | 
|   | 
|                 $ = jQuery; | 
|                 svgEditor = this; | 
|                 svgCanvas = svgEditor.canvas; | 
|                 getElem = svgCanvas.getElem; | 
|                 svgroot = S.svgroot, importLocale = S.importLocale, addElem = svgCanvas.addSVGElementFromJson, selManager = S.selectorManager, connSel = '.se_connector', elData = $.data; | 
|                 _context2.next = 15; | 
|                 return importLocale(); | 
|   | 
|               case 15: | 
|                 strings = _context2.sent; | 
|                 svgcontent = S.svgcontent, started = false, connections = [], selElems = []; | 
|   | 
|                 // Do once | 
|                 (function () { | 
|                   var gse = svgCanvas.groupSelectedElements; | 
|   | 
|                   svgCanvas.groupSelectedElements = function () { | 
|                     svgCanvas.removeFromSelection($(connSel).toArray()); | 
|                     return gse.apply(this, arguments); | 
|                   }; | 
|   | 
|                   var mse = svgCanvas.moveSelectedElements; | 
|   | 
|                   svgCanvas.moveSelectedElements = function () { | 
|                     var cmd = mse.apply(this, arguments); | 
|                     updateConnectors(); | 
|                     return cmd; | 
|                   }; | 
|   | 
|                   seNs = svgCanvas.getEditorNS(); | 
|                 })(); // Do on reset | 
|   | 
|   | 
|                 // $(svgroot).parent().mousemove(function (e) { | 
|                 // // if (started | 
|                 // //   || svgCanvas.getMode() !== 'connector' | 
|                 // //  || e.target.parentNode.parentNode !== svgcontent) return; | 
|                 // | 
|                 // console.log('y') | 
|                 // // if (e.target.parentNode.parentNode === svgcontent) { | 
|                 // // | 
|                 // // } | 
|                 // }); | 
|                 buttons = [{ | 
|                   id: 'mode_connect', | 
|                   type: 'mode', | 
|                   icon: svgEditor.curConfig.imgPath + 'cut.png', | 
|                   includeWith: { | 
|                     button: '#tool_line', | 
|                     isDefault: false, | 
|                     position: 1 | 
|                   }, | 
|                   events: { | 
|                     click: function click() { | 
|                       svgCanvas.setMode('connector'); | 
|                     } | 
|                   } | 
|                 }]; | 
|                 return _context2.abrupt("return", { | 
|                   name: strings.name, | 
|                   svgicons: svgEditor.curConfig.imgPath + 'conn.svg', | 
|                   buttons: strings.buttons.map(function (button, i) { | 
|                     return Object.assign(buttons[i], button); | 
|                   }), | 
|                   addLangData: function () { | 
|                     var _addLangData = _asyncToGenerator( | 
|                     /*#__PURE__*/ | 
|                     regeneratorRuntime.mark(function _callee(_ref) { | 
|                       var lang, importLocale; | 
|                       return regeneratorRuntime.wrap(function _callee$(_context) { | 
|                         while (1) { | 
|                           switch (_context.prev = _context.next) { | 
|                             case 0: | 
|                               lang = _ref.lang, importLocale = _ref.importLocale; | 
|                               return _context.abrupt("return", { | 
|                                 data: strings.langList | 
|                               }); | 
|   | 
|                             case 2: | 
|                             case "end": | 
|                               return _context.stop(); | 
|                           } | 
|                         } | 
|                       }, _callee, this); | 
|                     })); | 
|   | 
|                     return function addLangData(_x2) { | 
|                       return _addLangData.apply(this, arguments); | 
|                     }; | 
|                   }(), | 
|                   mouseDown: function mouseDown(opts) { | 
|                     var e = opts.event; | 
|                     startX = opts.start_x; | 
|                     startY = opts.start_y; | 
|                     var mode = svgCanvas.getMode(); | 
|                     var initStroke = svgEditor.curConfig.initStroke; | 
|   | 
|                     if (mode === 'connector') { | 
|                       if (started) { | 
|                         return; | 
|                       } | 
|   | 
|                       var mouseTarget = e.target; | 
|                       var parents = $(mouseTarget).parents(); | 
|   | 
|                       if ($.inArray(svgcontent, parents) !== -1) { | 
|                         // Connectable element | 
|                         // If child of foreignObject, use parent | 
|                         var fo = $(mouseTarget).closest('foreignObject'); | 
|                         startElem = fo.length ? fo[0] : mouseTarget; // Get center of source element | 
|   | 
|                         var bb = svgCanvas.getStrokedBBox([startElem]); | 
|                         var x = bb.x + bb.width / 2; | 
|                         var y = bb.y + bb.height / 2; | 
|                         started = true; | 
|                         curLine = addElem({ | 
|                           element: 'polyline', | 
|                           attr: { | 
|                             id: svgCanvas.getNextId(), | 
|                             points: x + ',' + y + ' ' + x + ',' + y + ' ' + startX + ',' + startY, | 
|                             stroke: '#' + initStroke.color, | 
|                             'stroke-width': !startElem.stroke_width || startElem.stroke_width === 0 ? initStroke.width : startElem.stroke_width, | 
|                             fill: 'none', | 
|                             opacity: initStroke.opacity, | 
|                             style: 'pointer-events:none' | 
|                           } | 
|                         }); | 
|                         elData(curLine, 'start_bb', bb); | 
|                       } | 
|   | 
|                       return { | 
|                         started: true | 
|                       }; | 
|                     } | 
|   | 
|                     if (mode === 'select') { | 
|                       findConnectors(); | 
|                     } | 
|                   }, | 
|                   mouseMove: function mouseMove(opts) { | 
|                     var zoom = svgCanvas.getZoom(); // const e = opts.event; | 
|   | 
|                     var x = opts.mouse_x / zoom; | 
|                     var y = opts.mouse_y / zoom; | 
|                     var diffX = x - startX, | 
|                         diffY = y - startY; | 
|                     var mode = svgCanvas.getMode(); | 
|   | 
|                     if (mode === 'connector' && started) { | 
|                       // const sw = curLine.getAttribute('stroke-width') * 3; | 
|                       // Set start point (adjusts based on bb) | 
|                       var pt = getBBintersect(x, y, elData(curLine, 'start_bb'), getOffset('start', curLine)); | 
|                       startX = pt.x; | 
|                       startY = pt.y; | 
|                       setPoint(curLine, 0, pt.x, pt.y, true); // Set end point | 
|   | 
|                       setPoint(curLine, 'end', x, y, true); | 
|                     } else if (mode === 'select') { | 
|                       var slen = selElems.length; | 
|   | 
|                       while (slen--) { | 
|                         var elem = selElems[slen]; // Look for selected connector elements | 
|   | 
|                         if (elem && elData(elem, 'c_start')) { | 
|                           // Remove the "translate" transform given to move | 
|                           svgCanvas.removeFromSelection([elem]); | 
|                           svgCanvas.getTransformList(elem).clear(); | 
|                         } | 
|                       } | 
|   | 
|                       if (connections.length) { | 
|                         updateLine(diffX, diffY); | 
|                       } | 
|                     } | 
|                   }, | 
|                   mouseUp: function mouseUp(opts) { | 
|                     // const zoom = svgCanvas.getZoom(); | 
|                     var e = opts.event; // , x = opts.mouse_x / zoom, | 
|                     // , y = opts.mouse_y / zoom, | 
|   | 
|                     var mouseTarget = e.target; | 
|   | 
|                     if (svgCanvas.getMode() !== 'connector') { | 
|                       return; | 
|                     } | 
|   | 
|                     var fo = $(mouseTarget).closest('foreignObject'); | 
|   | 
|                     if (fo.length) { | 
|                       mouseTarget = fo[0]; | 
|                     } | 
|   | 
|                     var parents = $(mouseTarget).parents(); | 
|   | 
|                     if (mouseTarget === startElem) { | 
|                       // Start line through click | 
|                       started = true; | 
|                       return { | 
|                         keep: true, | 
|                         element: null, | 
|                         started: started | 
|                       }; | 
|                     } | 
|   | 
|                     if ($.inArray(svgcontent, parents) === -1) { | 
|                       // Not a valid target element, so remove line | 
|                       $(curLine).remove(); | 
|                       started = false; | 
|                       return { | 
|                         keep: false, | 
|                         element: null, | 
|                         started: started | 
|                       }; | 
|                     } // Valid end element | 
|   | 
|   | 
|                     endElem = mouseTarget; | 
|                     var startId = startElem.id, | 
|                         endId = endElem.id; | 
|                     var connStr = startId + ' ' + endId; | 
|                     var altStr = endId + ' ' + startId; // Don't create connector if one already exists | 
|   | 
|                     var dupe = $(svgcontent).find(connSel).filter(function () { | 
|                       var conn = this.getAttributeNS(seNs, 'connector'); | 
|   | 
|                       if (conn === connStr || conn === altStr) { | 
|                         return true; | 
|                       } | 
|                     }); | 
|   | 
|                     if (dupe.length) { | 
|                       $(curLine).remove(); | 
|                       return { | 
|                         keep: false, | 
|                         element: null, | 
|                         started: false | 
|                       }; | 
|                     } | 
|   | 
|                     var bb = svgCanvas.getStrokedBBox([endElem]); | 
|                     var pt = getBBintersect(startX, startY, bb, getOffset('start', curLine)); | 
|                     setPoint(curLine, 'end', pt.x, pt.y, true); | 
|                     $(curLine).data('c_start', startId).data('c_end', endId).data('end_bb', bb); | 
|                     seNs = svgCanvas.getEditorNS(true); | 
|                     curLine.setAttributeNS(seNs, 'se:connector', connStr); | 
|                     curLine.setAttribute('class', connSel.substr(1)); | 
|                     curLine.setAttribute('opacity', 1); | 
|                     svgCanvas.addToSelection([curLine]); | 
|                     svgCanvas.moveToBottomSelectedElement(); | 
|                     selManager.requestSelector(curLine).showGrips(false); | 
|                     started = false; | 
|                     return { | 
|                       keep: true, | 
|                       element: curLine, | 
|                       started: started | 
|                     }; | 
|                   }, | 
|                   selectedChanged: function selectedChanged(opts) { | 
|                     // TODO: Find better way to skip operations if no connectors are in use | 
|                     if (!$(svgcontent).find(connSel).length) { | 
|                       return; | 
|                     } | 
|   | 
|                     if (svgCanvas.getMode() === 'connector') { | 
|                       svgCanvas.setMode('select'); | 
|                     } // Use this to update the current selected elements | 
|   | 
|   | 
|                     selElems = opts.elems; | 
|                     var i = selElems.length; | 
|   | 
|                     while (i--) { | 
|                       var elem = selElems[i]; | 
|   | 
|                       if (elem && elData(elem, 'c_start')) { | 
|                         selManager.requestSelector(elem).showGrips(false); | 
|   | 
|                         if (opts.selectedElement && !opts.multiselected) { | 
|                           // TODO: Set up context tools and hide most regular line tools | 
|                           showPanel(true); | 
|                         } else { | 
|                           showPanel(false); | 
|                         } | 
|                       } else { | 
|                         showPanel(false); | 
|                       } | 
|                     } | 
|   | 
|                     updateConnectors(); | 
|                   }, | 
|                   elementChanged: function elementChanged(opts) { | 
|                     var elem = opts.elems[0]; | 
|   | 
|                     if (elem && elem.tagName === 'svg' && elem.id === 'svgcontent') { | 
|                       // Update svgcontent (can change on import) | 
|                       svgcontent = elem; | 
|                       init(); | 
|                     } // Has marker, so change offset | 
|   | 
|   | 
|                     if (elem && (elem.getAttribute('marker-start') || elem.getAttribute('marker-mid') || elem.getAttribute('marker-end'))) { | 
|                       var start = elem.getAttribute('marker-start'); | 
|                       var mid = elem.getAttribute('marker-mid'); | 
|                       var end = elem.getAttribute('marker-end'); | 
|                       curLine = elem; | 
|                       $(elem).data('start_off', !!start).data('end_off', !!end); | 
|   | 
|                       if (elem.tagName === 'line' && mid) { | 
|                         // Convert to polyline to accept mid-arrow | 
|                         var x1 = Number(elem.getAttribute('x1')); | 
|                         var x2 = Number(elem.getAttribute('x2')); | 
|                         var y1 = Number(elem.getAttribute('y1')); | 
|                         var y2 = Number(elem.getAttribute('y2')); | 
|                         var _elem = elem, | 
|                             id = _elem.id; | 
|                         var midPt = ' ' + (x1 + x2) / 2 + ',' + (y1 + y2) / 2 + ' '; | 
|                         var pline = addElem({ | 
|                           element: 'polyline', | 
|                           attr: { | 
|                             points: x1 + ',' + y1 + midPt + x2 + ',' + y2, | 
|                             stroke: elem.getAttribute('stroke'), | 
|                             'stroke-width': elem.getAttribute('stroke-width'), | 
|                             'marker-mid': mid, | 
|                             fill: 'none', | 
|                             opacity: elem.getAttribute('opacity') || 1 | 
|                           } | 
|                         }); | 
|                         $(elem).after(pline).remove(); | 
|                         svgCanvas.clearSelection(); | 
|                         pline.id = id; | 
|                         svgCanvas.addToSelection([pline]); | 
|                         elem = pline; | 
|                       } | 
|                     } // Update line if it's a connector | 
|   | 
|   | 
|                     if (elem.getAttribute('class') === connSel.substr(1)) { | 
|                       var _start = getElem(elData(elem, 'c_start')); | 
|   | 
|                       updateConnectors([_start]); | 
|                     } else { | 
|                       updateConnectors(); | 
|                     } | 
|                   }, | 
|                   IDsUpdated: function IDsUpdated(input) { | 
|                     var remove = []; | 
|                     input.elems.forEach(function (elem) { | 
|                       if ('se:connector' in elem.attr) { | 
|                         elem.attr['se:connector'] = elem.attr['se:connector'].split(' ').map(function (oldID) { | 
|                           return input.changes[oldID]; | 
|                         }).join(' '); // Check validity - the field would be something like 'svg_21 svg_22', but | 
|                         // if one end is missing, it would be 'svg_21' and therefore fail this test | 
|   | 
|                         if (!/. ./.test(elem.attr['se:connector'])) { | 
|                           remove.push(elem.attr.id); | 
|                         } | 
|                       } | 
|                     }); | 
|                     return { | 
|                       remove: remove | 
|                     }; | 
|                   }, | 
|                   toolButtonStateUpdate: function toolButtonStateUpdate(opts) { | 
|                     if (opts.nostroke) { | 
|                       if ($('#mode_connect').hasClass('tool_button_current')) { | 
|                         svgEditor.clickSelect(); | 
|                       } | 
|                     } | 
|   | 
|                     $('#mode_connect').toggleClass('disabled', opts.nostroke); | 
|                   } | 
|                 }); | 
|   | 
|               case 20: | 
|               case "end": | 
|                 return _context2.stop(); | 
|             } | 
|           } | 
|         }, _callee2, this); | 
|       })); | 
|   | 
|       return function init(_x) { | 
|         return _init.apply(this, arguments); | 
|       }; | 
|     }() | 
|   }; | 
|   | 
|   return extConnector; | 
|   | 
| }()); |