UNPKG

vis-network

Version:

A dynamic, browser-based visualization library.

26 lines 260 kB
/** * vis-network * https://visjs.github.io/vis-network/ * * A dynamic, browser-based visualization library. * * @version 10.1.1 * @date 2026-08-07T17:51:09.571Z * * @copyright (c) 2011-2017 Almende B.V, http://almende.com * @copyright (c) 2017-2019 visjs contributors, https://github.com/visjs * * @license * vis.js is dual licensed under both * * 1. The Apache 2.0 License * http://www.apache.org/licenses/LICENSE-2.0 * * and * * 2. The MIT License * http://opensource.org/licenses/MIT * * vis.js may be distributed under either license. */ import t from"component-emitter";import{selectiveDeepExtend as e,Hammer as i,deepExtend as o,topMost as s,overrideOpacity as n,forEach as r,bridgeObject as d,mergeOptions as h,isString as a,selectiveNotDeepExtend as l,parseColor as c,fillIfDefined as p,VALIDATOR_PRINT_STYLE as u,getAbsoluteTop as g,getAbsoluteLeft as b,Popup as m,Alea as f,recursiveDOMDelete as y,HSVToHex as v,easingFunctions as w,Validator as x,Configurator as _,Activator as E}from"vis-util/esnext/esm/vis-util.js";import{v4 as O}from"uuid";import{isDataViewLike as C,DataSet as M}from"vis-data/esnext/esm/vis-data.js";import S from"keycharm";function k(t,e,i,o){t.beginPath(),t.arc(e,i,o,0,2*Math.PI,!1),t.closePath()}function z(t,e,i,o,s,n){const r=Math.PI/180;o-2*n<0&&(n=o/2),s-2*n<0&&(n=s/2),t.beginPath(),t.moveTo(e+n,i),t.lineTo(e+o-n,i),t.arc(e+o-n,i+n,n,270*r,360*r,!1),t.lineTo(e+o,i+s-n),t.arc(e+o-n,i+s-n,n,0,90*r,!1),t.lineTo(e+n,i+s),t.arc(e+n,i+s-n,n,90*r,180*r,!1),t.lineTo(e,i+n),t.arc(e+n,i+n,n,180*r,270*r,!1),t.closePath()}function B(t,e,i,o,s){const n=.5522848,r=o/2*n,d=s/2*n,h=e+o,a=i+s,l=e+o/2,c=i+s/2;t.beginPath(),t.moveTo(e,c),t.bezierCurveTo(e,c-d,l-r,i,l,i),t.bezierCurveTo(l+r,i,h,c-d,h,c),t.bezierCurveTo(h,c+d,l+r,a,l,a),t.bezierCurveTo(l-r,a,e,c+d,e,c),t.closePath()}function T(t,e,i,o,s){const n=s*(1/3),r=.5522848,d=o/2*r,h=n/2*r,a=e+o,l=i+n,c=e+o/2,p=i+n/2,u=i+(s-n/2),g=i+s;t.beginPath(),t.moveTo(a,p),t.bezierCurveTo(a,p+h,c+d,l,c,l),t.bezierCurveTo(c-d,l,e,p+h,e,p),t.bezierCurveTo(e,p-h,c-d,i,c,i),t.bezierCurveTo(c+d,i,a,p-h,a,p),t.lineTo(a,u),t.bezierCurveTo(a,u+h,c+d,g,c,g),t.bezierCurveTo(c-d,g,e,u+h,e,u),t.lineTo(e,p)}function I(t,e,i,o,s,n){t.beginPath(),t.moveTo(e,i);const r=n.length,d=o-e,h=s-i,a=h/d;let l=Math.sqrt(d*d+h*h),c=0,p=!0,u=0,g=+n[0];for(;l>=.1;)g=+n[c++%r],g>l&&(g=l),u=Math.sqrt(g*g/(1+a*a)),u=d<0?-u:u,e+=u,i+=a*u,!0===p?t.lineTo(e,i):t.moveTo(e,i),l-=g,p=!p}const D={circle:k,dashedLine:I,database:T,diamond:function(t,e,i,o){t.beginPath(),t.lineTo(e,i+o),t.lineTo(e+o,i),t.lineTo(e,i-o),t.lineTo(e-o,i),t.closePath()},ellipse:B,ellipse_vis:B,hexagon:function(t,e,i,o){t.beginPath();const s=2*Math.PI/6;t.moveTo(e+o,i);for(let n=1;n<6;n++)t.lineTo(e+o*Math.cos(s*n),i+o*Math.sin(s*n));t.closePath()},roundRect:z,square:function(t,e,i,o){t.beginPath(),t.rect(e-o,i-o,2*o,2*o),t.closePath()},star:function(t,e,i,o){t.beginPath(),i+=.1*(o*=.82);for(let s=0;s<10;s++){const n=s%2==0?1.3*o:.5*o;t.lineTo(e+n*Math.sin(2*s*Math.PI/10),i-n*Math.cos(2*s*Math.PI/10))}t.closePath()},triangle:function(t,e,i,o){t.beginPath(),i+=.275*(o*=1.15);const s=2*o,n=s/2,r=Math.sqrt(3)/6*s,d=Math.sqrt(s*s-n*n);t.moveTo(e,i-(d-r)),t.lineTo(e+n,i+r),t.lineTo(e-n,i+r),t.lineTo(e,i-(d-r)),t.closePath()},triangleDown:function(t,e,i,o){t.beginPath(),i-=.275*(o*=1.15);const s=2*o,n=s/2,r=Math.sqrt(3)/6*s,d=Math.sqrt(s*s-n*n);t.moveTo(e,i+(d-r)),t.lineTo(e+n,i-r),t.lineTo(e-n,i-r),t.lineTo(e,i+(d-r)),t.closePath()}};const N={fontsize:"font.size",fontcolor:"font.color",labelfontcolor:"font.color",fontname:"font.face",color:["color.border","color.background"],fillcolor:"color.background",tooltip:"title",labeltooltip:"title"},P=Object.create(N);P.color="color.color",P.style="dashes";const F=0,R=1,A=2,j=3,L={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0};let H="",W=0,V="",q="",U=F;function Y(){W++,V=H.charAt(W)}function X(){return H.charAt(W+1)}function K(t){const e=t.charCodeAt(0);return e<47?35===e||46===e:e<59?e>47:e<91?e>64:e<96?95===e:e<123&&e>96}function G(t,e){if(t||(t={}),e)for(const i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function Z(t,e,i){const o=e.split(".");let s=t;for(;o.length;){const t=o.shift();o.length?(s[t]||(s[t]={}),s=s[t]):s[t]=i}}function $(t,e){let i,o,s=null;const n=[t];let r=t;for(;r.parent;)n.push(r.parent),r=r.parent;if(r.nodes)for(i=0,o=r.nodes.length;i<o;i++)if(e.id===r.nodes[i].id){s=r.nodes[i];break}for(s||(s={id:e.id},t.node&&(s.attr=G(s.attr,t.node))),i=n.length-1;i>=0;i--){const t=n[i];t.nodes||(t.nodes=[]),-1===t.nodes.indexOf(s)&&t.nodes.push(s)}e.attr&&(s.attr=G(s.attr,e.attr))}function Q(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){const i=G({},t.edge);e.attr=G(i,e.attr)}}function J(t,e,i,o,s){const n={from:e,to:i,type:o};return t.edge&&(n.attr=G({},t.edge)),n.attr=G(n.attr||{},s),null!=s&&s.hasOwnProperty("arrows")&&null!=s.arrows&&(n.arrows={to:{enabled:!0,type:s.arrows.type}},s.arrows=null),n}function tt(){for(U=F,q="";" "===V||"\t"===V||"\n"===V||"\r"===V;)Y();let t;do{if(t=!1,"#"===V){let e=W-1;for(;" "===H.charAt(e)||"\t"===H.charAt(e);)e--;if("\n"===H.charAt(e)||""===H.charAt(e)){for(;""!=V&&"\n"!=V;)Y();t=!0}}if("/"===V&&"/"===X()){for(;""!=V&&"\n"!=V;)Y();t=!0}if("/"===V&&"*"===X()){for(;""!=V;){if("*"===V&&"/"===X()){Y(),Y();break}Y()}t=!0}for(;" "===V||"\t"===V||"\n"===V||"\r"===V;)Y()}while(t);if(""===V)return void(U=R);const e=V+X();if(L[e])return U=R,q=e,Y(),void Y();if(L[V])return U=R,q=V,void Y();if(K(V)||"-"===V){for(q+=V,Y();K(V);)q+=V,Y();return"false"===q?q=!1:"true"===q?q=!0:isNaN(Number(q))||(q=Number(q)),void(U=A)}if('"'===V){for(Y();""!=V&&('"'!=V||'"'===V&&'"'===X());)'"'===V?(q+=V,Y()):"\\"===V&&"n"===X()?(q+="\n",Y()):q+=V,Y();if('"'!=V)throw dt('End of string " expected');return Y(),void(U=A)}for(U=j;""!=V;)q+=V,Y();throw new SyntaxError('Syntax error in part "'+ht(q,30)+'"')}function et(){const t={};if(W=0,V=H.charAt(0),tt(),"strict"===q&&(t.strict=!0,tt()),"graph"!==q&&"digraph"!==q||(t.type=q,tt()),U===A&&(t.id=q,tt()),"{"!=q)throw dt("Angle bracket { expected");if(tt(),it(t),"}"!=q)throw dt("Angle bracket } expected");if(tt(),""!==q)throw dt("End of file expected");return tt(),delete t.node,delete t.edge,delete t.graph,t}function it(t){for(;""!==q&&"}"!=q;)ot(t),";"===q&&tt()}function ot(t){const e=st(t);if(e)return void nt(t,e);const i=function(t){if("node"===q)return tt(),t.node=rt(),"node";if("edge"===q)return tt(),t.edge=rt(),"edge";if("graph"===q)return tt(),t.graph=rt(),"graph";return null}(t);if(i)return;if(U!=A)throw dt("Identifier expected");const o=q;if(tt(),"="===q){if(tt(),U!=A)throw dt("Identifier expected");t[o]=q,tt()}else!function(t,e){const i={id:e},o=rt();o&&(i.attr=o);$(t,i),nt(t,e)}(t,o)}function st(t){let e=null;if("subgraph"===q&&(e={},e.type="subgraph",tt(),U===A&&(e.id=q,tt())),"{"===q){if(tt(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,it(e),"}"!=q)throw dt("Angle bracket } expected");tt(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function nt(t,e){for(;"->"===q||"--"===q;){let i;const o=q;tt();const s=st(t);if(s)i=s;else{if(U!=A)throw dt("Identifier or subgraph expected");i=q,$(t,{id:i}),tt()}Q(t,J(t,e,i,o,rt())),e=i}}function rt(){let t,e=null;const i={dashed:!0,solid:!1,dotted:[1,5]},o={dot:"circle",box:"box",crow:"crow",curve:"curve",icurve:"inv_curve",normal:"triangle",inv:"inv_triangle",diamond:"diamond",tee:"bar",vee:"vee"};let s=[];const n=[];for(;"["===q;){for(tt(),e={};""!==q&&"]"!=q;){if(U!=A)throw dt("Attribute name expected");let t=q;if(tt(),"="!=q)throw dt("Equal sign = expected");if(tt(),U!=A)throw dt("Attribute value expected");let r,d=q;"style"===t&&(d=i[d]),"arrowhead"===t&&(r=o[d],t="arrows",d={to:{enabled:!0,type:r}}),"arrowtail"===t&&(r=o[d],t="arrows",d={from:{enabled:!0,type:r}}),s.push({attr:e,name:t,value:d}),n.push(t),tt(),","==q&&tt()}if("]"!=q)throw dt("Bracket ] expected");tt()}if(n.includes("dir")){const t={arrows:{}};for(let e=0;e<s.length;e++)if("arrows"===s[e].name)if(null!=s[e].value.to)t.arrows.to=e;else{if(null==s[e].value.from)throw dt("Invalid value of arrows");t.arrows.from=e}else"dir"===s[e].name&&(t.dir=e);const e=s[t.dir].value;if(!n.includes("arrows"))if("both"===e)s.push({attr:s[t.dir].attr,name:"arrows",value:{to:{enabled:!0}}}),t.arrows.to=s.length-1,s.push({attr:s[t.dir].attr,name:"arrows",value:{from:{enabled:!0}}}),t.arrows.from=s.length-1;else if("forward"===e)s.push({attr:s[t.dir].attr,name:"arrows",value:{to:{enabled:!0}}}),t.arrows.to=s.length-1;else if("back"===e)s.push({attr:s[t.dir].attr,name:"arrows",value:{from:{enabled:!0}}}),t.arrows.from=s.length-1;else{if("none"!==e)throw dt('Invalid dir type "'+e+'"');s.push({attr:s[t.dir].attr,name:"arrows",value:""}),t.arrows.to=s.length-1}let i,o;if("both"===e)t.arrows.to&&t.arrows.from?(o=s[t.arrows.to].value.to.type,i=s[t.arrows.from].value.from.type,s[t.arrows.to]={attr:s[t.arrows.to].attr,name:s[t.arrows.to].name,value:{to:{enabled:!0,type:o},from:{enabled:!0,type:i}}},s.splice(t.arrows.from,1)):t.arrows.to?(o=s[t.arrows.to].value.to.type,i="arrow",s[t.arrows.to]={attr:s[t.arrows.to].attr,name:s[t.arrows.to].name,value:{to:{enabled:!0,type:o},from:{enabled:!0,type:i}}}):t.arrows.from&&(o="arrow",i=s[t.arrows.from].value.from.type,s[t.arrows.from]={attr:s[t.arrows.from].attr,name:s[t.arrows.from].name,value:{to:{enabled:!0,type:o},from:{enabled:!0,type:i}}});else if("back"===e)t.arrows.to&&t.arrows.from?(o="",i=s[t.arrows.from].value.from.type,s[t.arrows.from]={attr:s[t.arrows.from].attr,name:s[t.arrows.from].name,value:{to:{enabled:!0,type:o},from:{enabled:!0,type:i}}}):t.arrows.to?(o="",i="arrow",t.arrows.from=t.arrows.to,s[t.arrows.from]={attr:s[t.arrows.from].attr,name:s[t.arrows.from].name,value:{to:{enabled:!0,type:o},from:{enabled:!0,type:i}}}):t.arrows.from&&(o="",i=s[t.arrows.from].value.from.type,s[t.arrows.to]={attr:s[t.arrows.from].attr,name:s[t.arrows.from].name,value:{to:{enabled:!0,type:o},from:{enabled:!0,type:i}}}),s[t.arrows.from]={attr:s[t.arrows.from].attr,name:s[t.arrows.from].name,value:{from:{enabled:!0,type:s[t.arrows.from].value.from.type}}};else if("none"===e){let e;e=t.arrows.to?t.arrows.to:t.arrows.from,s[e]={attr:s[e].attr,name:s[e].name,value:""}}else{if("forward"!==e)throw dt('Invalid dir type "'+e+'"');t.arrows.to&&t.arrows.from||t.arrows.to?(o=s[t.arrows.to].value.to.type,i="",s[t.arrows.to]={attr:s[t.arrows.to].attr,name:s[t.arrows.to].name,value:{to:{enabled:!0,type:o},from:{enabled:!0,type:i}}}):t.arrows.from&&(o="arrow",i="",t.arrows.to=t.arrows.from,s[t.arrows.to]={attr:s[t.arrows.to].attr,name:s[t.arrows.to].name,value:{to:{enabled:!0,type:o},from:{enabled:!0,type:i}}}),s[t.arrows.to]={attr:s[t.arrows.to].attr,name:s[t.arrows.to].name,value:{to:{enabled:!0,type:s[t.arrows.to].value.to.type}}}}s.splice(t.dir,1)}let r;if(n.includes("penwidth")){const e=[];for(r=s.length,t=0;t<r;t++)"width"!==s[t].name&&("penwidth"===s[t].name&&(s[t].name="width"),e.push(s[t]));s=e}for(r=s.length,t=0;t<r;t++)Z(s[t].attr,s[t].name,s[t].value);return e}function dt(t){return new SyntaxError(t+', got "'+ht(q,30)+'" (char '+W+")")}function ht(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function at(t,e,i){const o=e.split("."),s=o.pop();let n=t;for(let t=0;t<o.length;t++){const e=o[t];e in n||(n[e]={}),n=n[e]}return n[s]=i,t}function lt(t,e){const i={};for(const o in t)if(t.hasOwnProperty(o)){const s=e[o];Array.isArray(s)?s.forEach(function(e){at(i,e,t[o])}):at(i,"string"==typeof s?s:o,t[o])}return i}function ct(t){const e=pt(t),i={nodes:[],edges:[],options:{}};if(e.nodes&&e.nodes.forEach(function(t){const e={id:t.id,label:String(t.label||t.id)};G(e,lt(t.attr,N)),e.image&&(e.shape="image"),i.nodes.push(e)}),e.edges){const t=function(t){const e={from:t.from,to:t.to};return G(e,lt(t.attr,P)),null==e.arrows&&"->"===t.type&&(e.arrows="to"),e};e.edges.forEach(function(e){let o,s;var n,r,d;o=e.from instanceof Object?e.from.nodes:{id:e.from},s=e.to instanceof Object?e.to.nodes:{id:e.to},e.from instanceof Object&&e.from.edges&&e.from.edges.forEach(function(e){const o=t(e);i.edges.push(o)}),n=o,r=s,d=function(o,s){const n=J(i,o.id,s.id,e.type,e.attr),r=t(n);i.edges.push(r)},Array.isArray(n)?n.forEach(function(t){Array.isArray(r)?r.forEach(function(e){d(t,e)}):d(t,r)}):Array.isArray(r)?r.forEach(function(t){d(n,t)}):d(n,r),e.to instanceof Object&&e.to.edges&&e.to.edges.forEach(function(e){const o=t(e);i.edges.push(o)})})}return e.attr&&(i.options=e.attr),i}function pt(t){return H=t,et()}var ut=Object.freeze({__proto__:null,DOTToGraph:ct,parseDOT:pt});function gt(t,{fixed:e=!1,inheritColor:i=!1,parseColor:o=!1}={}){const s=t.edges.map(t=>{const e={from:t.source,id:t.id,to:t.target};return null!=t.attributes&&(e.attributes=t.attributes),null!=t.label&&(e.label=t.label),null!=t.attributes&&null!=t.attributes.title&&(e.title=t.attributes.title),"Directed"===t.type&&(e.arrows="to"),t.color&&!1===i&&(e.color=t.color),e});return{nodes:t.nodes.map(t=>{const i={id:t.id,fixed:e&&null!=t.x&&null!=t.y};return null!=t.attributes&&(i.attributes=t.attributes),null!=t.label&&(i.label=t.label),null!=t.size&&(i.size=t.size),null!=t.attributes&&null!=t.attributes.title&&(i.title=t.attributes.title),null!=t.title&&(i.title=t.title),null!=t.x&&(i.x=t.x),null!=t.y&&(i.y=t.y),null!=t.color&&(i.color=!0===o?t.color:{background:t.color,border:t.color,highlight:{background:t.color,border:t.color},hover:{background:t.color,border:t.color}}),i}),edges:s}}var bt=Object.freeze({__proto__:null,parseGephi:gt});class mt{constructor(){this.NUM_ITERATIONS=4,this.image=new Image,this.canvas=document.createElement("canvas")}init(){if(this.initialized())return;this.src=this.image.src;const t=this.image.width,e=this.image.height;this.width=t,this.height=e;const i=Math.floor(e/2),o=Math.floor(e/4),s=Math.floor(e/8),n=Math.floor(e/16),r=Math.floor(t/2),d=Math.floor(t/4),h=Math.floor(t/8),a=Math.floor(t/16);this.canvas.width=3*d,this.canvas.height=i,this.coordinates=[[0,0,r,i],[r,0,d,o],[r,o,h,s],[5*h,o,a,n]],this._fillMipMap()}initialized(){return void 0!==this.coordinates}_fillMipMap(){const t=this.canvas.getContext("2d"),e=this.coordinates[0];t.drawImage(this.image,e[0],e[1],e[2],e[3]);for(let e=1;e<this.NUM_ITERATIONS;e++){const i=this.coordinates[e-1],o=this.coordinates[e];t.drawImage(this.canvas,i[0],i[1],i[2],i[3],o[0],o[1],o[2],o[3])}}drawImageAtPosition(t,e,i,o,s,n){if(this.initialized())if(e>2){e*=.5;let r=0;for(;e>2&&r<this.NUM_ITERATIONS;)e*=.5,r+=1;r>=this.NUM_ITERATIONS&&(r=this.NUM_ITERATIONS-1);const d=this.coordinates[r];t.drawImage(this.canvas,d[0],d[1],d[2],d[3],i,o,s,n)}else t.drawImage(this.image,i,o,s,n)}}class ft{constructor(t){this.images={},this.imageBroken={},this.callback=t}_tryloadBrokenUrl(t,e,i){void 0!==t&&void 0!==i&&(void 0!==e?(i.image.addEventListener("error",()=>{console.error("Could not load brokenImage:",e)}),i.image.src=e):console.warn("No broken url image defined"))}_redrawWithImage(t){this.callback&&this.callback(t)}load(t,e){const i=this.images[t];if(i)return i;const o=new mt;return this.images[t]=o,o.image.addEventListener("load",()=>{this._fixImageCoordinates(o.image),o.init(),this._redrawWithImage(o)}),o.image.addEventListener("error",()=>{console.error("Could not load image:",t),this._tryloadBrokenUrl(t,e,o)}),o.image.src=t,o}_fixImageCoordinates(t){0===t.width&&(document.body.appendChild(t),t.width=t.offsetWidth,t.height=t.offsetHeight,document.body.removeChild(t))}}var yt=Object.freeze({__proto__:null,cn:{addDescription:"单击空白处放置新节点。",addEdge:"添加连接线",addNode:"添加节点",back:"返回",close:"關閉",createEdgeError:"无法将连接线连接到群集。",del:"删除选定",deleteClusterError:"无法删除群集。",edgeDescription:"单击某个节点并将该连接线拖动到另一个节点以连接它们。",edit:"编辑",editClusterError:"无法编辑群集。",editEdge:"编辑连接线",editEdgeDescription:"单击控制节点并将它们拖到节点上连接。",editNode:"编辑节点"},cs:{addDescription:"Kluknutím do prázdného prostoru můžete přidat nový vrchol.",addEdge:"Přidat hranu",addNode:"Přidat vrchol",back:"Zpět",close:"Zavřít",createEdgeError:"Nelze připojit hranu ke shluku.",del:"Smazat výběr",deleteClusterError:"Nelze mazat shluky.",edgeDescription:"Přetažením z jednoho vrcholu do druhého můžete spojit tyto vrcholy novou hranou.",edit:"Upravit",editClusterError:"Nelze upravovat shluky.",editEdge:"Upravit hranu",editEdgeDescription:"Přetažením kontrolního vrcholu hrany ji můžete připojit k jinému vrcholu.",editNode:"Upravit vrchol"},de:{addDescription:"Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.",addEdge:"Kante hinzufügen",addNode:"Knoten hinzufügen",back:"Zurück",close:"Schließen",createEdgeError:"Es ist nicht möglich, Kanten mit Clustern zu verbinden.",del:"Lösche Auswahl",deleteClusterError:"Cluster können nicht gelöscht werden.",edgeDescription:"Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.",edit:"Editieren",editClusterError:"Cluster können nicht editiert werden.",editEdge:"Kante editieren",editEdgeDescription:"Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.",editNode:"Knoten editieren"},en:{addDescription:"Click in an empty space to place a new node.",addEdge:"Add Edge",addNode:"Add Node",back:"Back",close:"Close",createEdgeError:"Cannot link edges to a cluster.",del:"Delete selected",deleteClusterError:"Clusters cannot be deleted.",edgeDescription:"Click on a node and drag the edge to another node to connect them.",edit:"Edit",editClusterError:"Clusters cannot be edited.",editEdge:"Edit Edge",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",editNode:"Edit Node"},es:{addDescription:"Haga clic en un lugar vacío para colocar un nuevo nodo.",addEdge:"Añadir arista",addNode:"Añadir nodo",back:"Atrás",close:"Cerrar",createEdgeError:"No se puede conectar una arista a un grupo.",del:"Eliminar selección",deleteClusterError:"No es posible eliminar grupos.",edgeDescription:"Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.",edit:"Editar",editClusterError:"No es posible editar grupos.",editEdge:"Editar arista",editEdgeDescription:"Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.",editNode:"Editar nodo"},fr:{addDescription:"Cliquez dans un endroit vide pour placer un nœud.",addEdge:"Ajouter un lien",addNode:"Ajouter un nœud",back:"Retour",close:"Fermer",createEdgeError:"Impossible de créer un lien vers un cluster.",del:"Effacer la sélection",deleteClusterError:"Les clusters ne peuvent pas être effacés.",edgeDescription:"Cliquez sur un nœud et glissez le lien vers un autre nœud pour les connecter.",edit:"Éditer",editClusterError:"Les clusters ne peuvent pas être édités.",editEdge:"Éditer le lien",editEdgeDescription:"Cliquez sur les points de contrôle et glissez-les pour connecter un nœud.",editNode:"Éditer le nœud"},it:{addDescription:"Clicca per aggiungere un nuovo nodo",addEdge:"Aggiungi un vertice",addNode:"Aggiungi un nodo",back:"Indietro",close:"Chiudere",createEdgeError:"Non si possono collegare vertici ad un cluster",del:"Cancella la selezione",deleteClusterError:"I cluster non possono essere cancellati",edgeDescription:"Clicca su un nodo e trascinalo ad un altro nodo per connetterli.",edit:"Modifica",editClusterError:"I clusters non possono essere modificati.",editEdge:"Modifica il vertice",editEdgeDescription:"Clicca sui Punti di controllo e trascinali ad un nodo per connetterli.",editNode:"Modifica il nodo"},nl:{addDescription:"Klik op een leeg gebied om een nieuwe node te maken.",addEdge:"Link toevoegen",addNode:"Node toevoegen",back:"Terug",close:"Sluiten",createEdgeError:"Kan geen link maken naar een cluster.",del:"Selectie verwijderen",deleteClusterError:"Clusters kunnen niet worden verwijderd.",edgeDescription:"Klik op een node en sleep de link naar een andere node om ze te verbinden.",edit:"Wijzigen",editClusterError:"Clusters kunnen niet worden aangepast.",editEdge:"Link wijzigen",editEdgeDescription:"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.",editNode:"Node wijzigen"},pt:{addDescription:"Clique em um espaço em branco para adicionar um novo nó",addEdge:"Adicionar aresta",addNode:"Adicionar nó",back:"Voltar",close:"Fechar",createEdgeError:"Não foi possível linkar arestas a um cluster.",del:"Remover selecionado",deleteClusterError:"Clusters não puderam ser removidos.",edgeDescription:"Clique em um nó e arraste a aresta até outro nó para conectá-los",edit:"Editar",editClusterError:"Clusters não puderam ser editados.",editEdge:"Editar aresta",editEdgeDescription:"Clique nos pontos de controle e os arraste para um nó para conectá-los",editNode:"Editar nó"},ru:{addDescription:"Кликните в свободное место, чтобы добавить новый узел.",addEdge:"Добавить ребро",addNode:"Добавить узел",back:"Назад",close:"Закрывать",createEdgeError:"Невозможно соединить ребра в кластер.",del:"Удалить выбранное",deleteClusterError:"Кластеры не могут быть удалены",edgeDescription:"Кликните на узел и протяните ребро к другому узлу, чтобы соединить их.",edit:"Редактировать",editClusterError:"Кластеры недоступны для редактирования.",editEdge:"Редактировать ребро",editEdgeDescription:"Кликните на контрольные точки и перетащите их в узел, чтобы подключиться к нему.",editNode:"Редактировать узел"},uk:{addDescription:"Kлікніть на вільне місце, щоб додати новий вузол.",addEdge:"Додати край",addNode:"Додати вузол",back:"Назад",close:"Закрити",createEdgeError:"Не можливо об'єднати краї в групу.",del:"Видалити обране",deleteClusterError:"Групи не можуть бути видалені.",edgeDescription:"Клікніть на вузол і перетягніть край до іншого вузла, щоб їх з'єднати.",edit:"Редагувати",editClusterError:"Групи недоступні для редагування.",editEdge:"Редагувати край",editEdgeDescription:"Клікніть на контрольні точки і перетягніть їх у вузол, щоб підключитися до нього.",editNode:"Редагувати вузол"}});function vt(t,e){e.inputHandler=function(t){t.isFirst&&e(t)},t.on("hammer.input",e.inputHandler)}function wt(t,e){return e.inputHandler=function(t){t.isFinal&&e(t)},t.on("hammer.input",e.inputHandler)}class xt{constructor(t){this.body=t,this.pixelRatio=1,this.cameraState={},this.initialized=!1,this.canvasViewCenter={},this._cleanupCallbacks=[],this.options={},this.defaultOptions={autoResize:!0,height:"100%",width:"100%"},Object.assign(this.options,this.defaultOptions),this.bindEventListeners()}bindEventListeners(){this.body.emitter.once("resize",t=>{0!==t.width&&(this.body.view.translation.x=.5*t.width),0!==t.height&&(this.body.view.translation.y=.5*t.height)}),this.body.emitter.on("setSize",this.setSize.bind(this)),this.body.emitter.on("destroy",()=>{this.hammerFrame.destroy(),this.hammer.destroy(),this._cleanUp()})}setOptions(t){if(void 0!==t){e(["width","height","autoResize"],this.options,t)}if(this._cleanUp(),!0===this.options.autoResize){if(window.ResizeObserver){const t=new ResizeObserver(()=>{!0===this.setSize()&&this.body.emitter.emit("_requestRedraw")}),{frame:e}=this;t.observe(e),this._cleanupCallbacks.push(()=>{t.unobserve(e)})}else{const t=setInterval(()=>{!0===this.setSize()&&this.body.emitter.emit("_requestRedraw")},1e3);this._cleanupCallbacks.push(()=>{clearInterval(t)})}const t=this._onResize.bind(this);window.addEventListener("resize",t),this._cleanupCallbacks.push(()=>{window.removeEventListener("resize",t)})}}_cleanUp(){this._cleanupCallbacks.splice(0).toReversed().forEach(t=>{try{t()}catch(t){console.error(t)}})}_onResize(){this.setSize(),this.body.emitter.emit("_redraw")}_getCameraState(t=this.pixelRatio){!0===this.initialized&&(this.cameraState.previousWidth=this.frame.canvas.width/t,this.cameraState.previousHeight=this.frame.canvas.height/t,this.cameraState.scale=this.body.view.scale,this.cameraState.position=this.DOMtoCanvas({x:.5*this.frame.canvas.width/t,y:.5*this.frame.canvas.height/t}))}_setCameraState(){if(void 0!==this.cameraState.scale&&0!==this.frame.canvas.clientWidth&&0!==this.frame.canvas.clientHeight&&0!==this.pixelRatio&&this.cameraState.previousWidth>0&&this.cameraState.previousHeight>0){const t=this.frame.canvas.width/this.pixelRatio/this.cameraState.previousWidth,e=this.frame.canvas.height/this.pixelRatio/this.cameraState.previousHeight;let i=this.cameraState.scale;1!=t&&1!=e?i=.5*this.cameraState.scale*(t+e):1!=t?i=this.cameraState.scale*t:1!=e&&(i=this.cameraState.scale*e),this.body.view.scale=i;const o=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight}),s={x:o.x-this.cameraState.position.x,y:o.y-this.cameraState.position.y};this.body.view.translation.x+=s.x*this.body.view.scale,this.body.view.translation.y+=s.y*this.body.view.scale}}_prepareValue(t){if("number"==typeof t)return t+"px";if("string"==typeof t){if(-1!==t.indexOf("%")||-1!==t.indexOf("px"))return t;if(-1===t.indexOf("%"))return t+"px"}throw new Error("Could not use the value supplied for width or height:"+t)}_create(){for(;this.body.container.hasChildNodes();)this.body.container.removeChild(this.body.container.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis-network",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.tabIndex=0,this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext)this._setPixelRatio(),this.setTransform();else{const t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerText="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}this.body.container.appendChild(this.frame),this.body.view.scale=1,this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight},this._bindHammer()}_bindHammer(){void 0!==this.hammer&&this.hammer.destroy(),this.drag={},this.pinch={},this.hammer=new i(this.frame.canvas),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:i.DIRECTION_ALL}),vt(this.hammer,t=>{this.body.eventListeners.onTouch(t)}),this.hammer.on("tap",t=>{this.body.eventListeners.onTap(t)}),this.hammer.on("doubletap",t=>{this.body.eventListeners.onDoubleTap(t)}),this.hammer.on("press",t=>{this.body.eventListeners.onHold(t)}),this.hammer.on("panstart",t=>{this.body.eventListeners.onDragStart(t)}),this.hammer.on("panmove",t=>{this.body.eventListeners.onDrag(t)}),this.hammer.on("panend",t=>{this.body.eventListeners.onDragEnd(t)}),this.hammer.on("pinch",t=>{this.body.eventListeners.onPinch(t)}),this.frame.canvas.addEventListener("wheel",t=>{this.body.eventListeners.onMouseWheel(t)}),this.frame.canvas.addEventListener("mousemove",t=>{this.body.eventListeners.onMouseMove(t)}),this.frame.canvas.addEventListener("contextmenu",t=>{this.body.eventListeners.onContext(t)}),this.hammerFrame=new i(this.frame),wt(this.hammerFrame,t=>{this.body.eventListeners.onRelease(t)})}setSize(t=this.options.width,e=this.options.height){t=this._prepareValue(t),e=this._prepareValue(e);let i=!1;const o=this.frame.canvas.width,s=this.frame.canvas.height,n=this.pixelRatio;if(this._setPixelRatio(),t!=this.options.width||e!=this.options.height||this.frame.style.width!=t||this.frame.style.height!=e)this._getCameraState(n),this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio),this.options.width=t,this.options.height=e,this.canvasViewCenter={x:.5*this.frame.clientWidth,y:.5*this.frame.clientHeight},i=!0;else{const t=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),e=Math.round(this.frame.canvas.clientHeight*this.pixelRatio);this.frame.canvas.width===t&&this.frame.canvas.height===e||this._getCameraState(n),this.frame.canvas.width!==t&&(this.frame.canvas.width=t,i=!0),this.frame.canvas.height!==e&&(this.frame.canvas.height=e,i=!0)}return!0===i&&(this.body.emitter.emit("resize",{width:Math.round(this.frame.canvas.width/this.pixelRatio),height:Math.round(this.frame.canvas.height/this.pixelRatio),oldWidth:Math.round(o/this.pixelRatio),oldHeight:Math.round(s/this.pixelRatio)}),this._setCameraState()),this.initialized=!0,i}getContext(){return this.frame.canvas.getContext("2d")}_determinePixelRatio(){const t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");let e=1;"undefined"!=typeof window&&(e=window.devicePixelRatio||1);return e/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)}_setPixelRatio(){this.pixelRatio=this._determinePixelRatio()}setTransform(){const t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}_XconvertDOMtoCanvas(t){return(t-this.body.view.translation.x)/this.body.view.scale}_XconvertCanvasToDOM(t){return t*this.body.view.scale+this.body.view.translation.x}_YconvertDOMtoCanvas(t){return(t-this.body.view.translation.y)/this.body.view.scale}_YconvertCanvasToDOM(t){return t*this.body.view.scale+this.body.view.translation.y}canvasToDOM(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}}DOMtoCanvas(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}}}class _t{constructor(t,e){this.body=t,this.canvas=e,this.redrawRequested=!1,this.requestAnimationFrameRequestId=void 0,this.renderingActive=!1,this.renderRequests=0,this.allowRedraw=!0,this.dragging=!1,this.zooming=!1,this.options={},this.defaultOptions={hideEdgesOnDrag:!1,hideEdgesOnZoom:!1,hideNodesOnDrag:!1},Object.assign(this.options,this.defaultOptions),this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("dragStart",()=>{this.dragging=!0}),this.body.emitter.on("dragEnd",()=>{this.dragging=!1}),this.body.emitter.on("zoom",()=>{this.zooming=!0,window.clearTimeout(this.zoomTimeoutId),this.zoomTimeoutId=window.setTimeout(()=>{this.zooming=!1,this._requestRedraw.bind(this)()},250)}),this.body.emitter.on("_resizeNodes",()=>{this._resizeNodes()}),this.body.emitter.on("_redraw",()=>{!1===this.renderingActive&&this._redraw()}),this.body.emitter.on("_blockRedraw",()=>{this.allowRedraw=!1}),this.body.emitter.on("_allowRedraw",()=>{this.allowRedraw=!0,this.redrawRequested=!1}),this.body.emitter.on("_requestRedraw",this._requestRedraw.bind(this)),this.body.emitter.on("_startRendering",()=>{this.renderRequests+=1,this.renderingActive=!0,this._startRendering()}),this.body.emitter.on("_stopRendering",()=>{this.renderRequests-=1,this.renderingActive=this.renderRequests>0,this.requestAnimationFrameRequestId=void 0}),this.body.emitter.on("destroy",()=>{this.renderRequests=0,this.allowRedraw=!1,this.renderingActive=!1,window.cancelAnimationFrame(this.requestAnimationFrameRequestId),this.body.emitter.off()})}setOptions(t){if(void 0!==t){e(["hideEdgesOnDrag","hideEdgesOnZoom","hideNodesOnDrag"],this.options,t)}}_startRendering(){!0===this.renderingActive&&void 0===this.requestAnimationFrameRequestId&&(this.requestAnimationFrameRequestId=window.requestAnimationFrame(this._renderStep.bind(this),this.simulationInterval))}_renderStep(){!0===this.renderingActive&&(this.requestAnimationFrameRequestId=void 0,this._startRendering(),this._redraw())}redraw(){this.body.emitter.emit("setSize"),this._redraw()}_requestRedraw(){!0!==this.redrawRequested&&!1===this.renderingActive&&!0===this.allowRedraw&&(this.redrawRequested=!0,window.requestAnimationFrame(()=>{this._redraw(!1)}))}_redraw(t=!1){if(!0===this.allowRedraw){this.body.emitter.emit("initRedraw"),this.redrawRequested=!1;const e={drawExternalLabels:null};0!==this.canvas.frame.canvas.width&&0!==this.canvas.frame.canvas.height||this.canvas.setSize(),this.canvas.setTransform();const i=this.canvas.getContext(),o=this.canvas.frame.canvas.clientWidth,s=this.canvas.frame.canvas.clientHeight;if(i.clearRect(0,0,o,s),0===this.canvas.frame.clientWidth)return;if(i.save(),i.translate(this.body.view.translation.x,this.body.view.translation.y),i.scale(this.body.view.scale,this.body.view.scale),i.beginPath(),this.body.emitter.emit("beforeDrawing",i),i.closePath(),!1===t&&(!1===this.dragging||!0===this.dragging&&!1===this.options.hideEdgesOnDrag)&&(!1===this.zooming||!0===this.zooming&&!1===this.options.hideEdgesOnZoom)&&this._drawEdges(i),!1===this.dragging||!0===this.dragging&&!1===this.options.hideNodesOnDrag){const{drawExternalLabels:o}=this._drawNodes(i,t);e.drawExternalLabels=o}!1===t&&(!1===this.dragging||!0===this.dragging&&!1===this.options.hideEdgesOnDrag)&&(!1===this.zooming||!0===this.zooming&&!1===this.options.hideEdgesOnZoom)&&this._drawArrows(i),null!=e.drawExternalLabels&&e.drawExternalLabels(),!1===t&&this._drawSelectionBox(i),i.beginPath(),this.body.emitter.emit("afterDrawing",i),i.closePath(),i.restore(),!0===t&&i.clearRect(0,0,o,s)}}_resizeNodes(){this.canvas.setTransform();const t=this.canvas.getContext();t.save(),t.translate(this.body.view.translation.x,this.body.view.translation.y),t.scale(this.body.view.scale,this.body.view.scale);const e=this.body.nodes;let i;for(const o in e)Object.prototype.hasOwnProperty.call(e,o)&&(i=e[o],i.resize(t),i.updateBoundingBox(t,i.selected));t.restore()}_drawNodes(t,e=!1){const i=this.body.nodes,o=this.body.nodeIndices;let s;const n=[],r=[],d=this.canvas.DOMtoCanvas({x:-20,y:-20}),h=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+20,y:this.canvas.frame.canvas.clientHeight+20}),a={top:d.y,left:d.x,bottom:h.y,right:h.x},l=[];for(let d=0;d<o.length;d++)if(s=i[o[d]],s.hover)r.push(o[d]);else if(s.isSelected())n.push(o[d]);else if(!0===e){const e=s.draw(t);null!=e.drawExternalLabel&&l.push(e.drawExternalLabel)}else if(!0===s.isBoundingBoxOverlappingWith(a)){const e=s.draw(t);null!=e.drawExternalLabel&&l.push(e.drawExternalLabel)}else s.updateBoundingBox(t,s.selected);let c;const p=n.length,u=r.length;for(c=0;c<p;c++){s=i[n[c]];const e=s.draw(t);null!=e.drawExternalLabel&&l.push(e.drawExternalLabel)}for(c=0;c<u;c++){s=i[r[c]];const e=s.draw(t);null!=e.drawExternalLabel&&l.push(e.drawExternalLabel)}return{drawExternalLabels:()=>{for(const t of l)t()}}}_drawEdges(t){const e=this.body.edges,i=this.body.edgeIndices;for(let o=0;o<i.length;o++){const s=e[i[o]];!0===s.connected&&s.draw(t)}}_drawArrows(t){const e=this.body.edges,i=this.body.edgeIndices;for(let o=0;o<i.length;o++){const s=e[i[o]];!0===s.connected&&s.drawArrows(t)}}_drawSelectionBox(t){if(this.body.selectionBox.show){t.beginPath();const e=this.body.selectionBox.position.end.x-this.body.selectionBox.position.start.x,i=this.body.selectionBox.position.end.y-this.body.selectionBox.position.start.y;t.rect(this.body.selectionBox.position.start.x,this.body.selectionBox.position.start.y,e,i),t.fillStyle="rgba(151, 194, 252, 0.2)",t.fillRect(this.body.selectionBox.position.start.x,this.body.selectionBox.position.start.y,e,i),t.strokeStyle="rgba(151, 194, 252, 1)",t.stroke()}else t.closePath()}}class Et{static getRange(t,e=[]){let i,o=1e9,s=-1e9,n=1e9,r=-1e9;if(e.length>0)for(let d=0;d<e.length;d++)i=t[e[d]],n>i.shape.boundingBox.left&&(n=i.shape.boundingBox.left),r<i.shape.boundingBox.right&&(r=i.shape.boundingBox.right),o>i.shape.boundingBox.top&&(o=i.shape.boundingBox.top),s<i.shape.boundingBox.bottom&&(s=i.shape.boundingBox.bottom);return 1e9===n&&-1e9===r&&1e9===o&&-1e9===s&&(o=0,s=0,n=0,r=0),{minX:n,maxX:r,minY:o,maxY:s}}static getRangeCore(t,e=[]){let i,o=1e9,s=-1e9,n=1e9,r=-1e9;if(e.length>0)for(let d=0;d<e.length;d++)i=t[e[d]],n>i.x&&(n=i.x),r<i.x&&(r=i.x),o>i.y&&(o=i.y),s<i.y&&(s=i.y);return 1e9===n&&-1e9===r&&1e9===o&&-1e9===s&&(o=0,s=0,n=0,r=0),{minX:n,maxX:r,minY:o,maxY:s}}static findCenter(t){return{x:.5*(t.maxX+t.minX),y:.5*(t.maxY+t.minY)}}static cloneOptions(t,e){const i={};return void 0===e||"node"===e?(o(i,t.options,!0),i.x=t.x,i.y=t.y,i.amountOfConnections=t.edges.length):o(i,t.options,!0),i}}function Ot(t,e){const i=["node","edge","label"];let o=!0;const n=s(e,"chosen");if("boolean"==typeof n)o=n;else if("object"==typeof n){if(-1===i.indexOf(t))throw new Error("choosify: subOption '"+t+"' should be one of '"+i.join("', '")+"'");const n=s(e,["chosen",t]);"boolean"!=typeof n&&"function"!=typeof n||(o=n)}return o}function Ct(t,e,i){if(t.width<=0||t.height<=0)return!1;if(void 0!==i){const t={x:e.x-i.x,y:e.y-i.y};if(0!==i.angle){const o=-i.angle;e={x:Math.cos(o)*t.x-Math.sin(o)*t.y,y:Math.sin(o)*t.x+Math.cos(o)*t.y}}else e=t}const o=t.x+t.width,s=t.y+t.width;return t.left<e.x&&o>e.x&&t.top<e.y&&s>e.y}function Mt(t){return"string"==typeof t&&""!==t}function St(t,e,i,o){let s=o.x,n=o.y;if("function"==typeof o.distanceToBorder){const i=o.distanceToBorder(t,e),r=Math.sin(e)*i,d=Math.cos(e)*i;d===i?(s+=i,n=o.y):r===i?(s=o.x,n-=i):(s+=d,n-=r)}else o.shape.width>o.shape.height?(s=o.x+.5*o.shape.width,n=o.y-i):(s=o.x+i,n=o.y-.5*o.shape.height);return{x:s,y:n}}class kt{static transform(t,e){Array.isArray(t)||(t=[t]);const i=e.point.x,o=e.point.y,s=e.angle,n=e.length;for(let e=0;e<t.length;++e){const r=t[e],d=r.x*Math.cos(s)-r.y*Math.sin(s),h=r.x*Math.sin(s)+r.y*Math.cos(s);r.x=i+n*d,r.y=o+n*h}}static drawPath(t,e){t.beginPath(),t.moveTo(e[0].x,e[0].y);for(let i=1;i<e.length;++i)t.lineTo(e[i].x,e[i].y);t.closePath()}}let zt=class extends kt{static draw(t,e){if(e.image){t.save(),t.translate(e.point.x,e.point.y),t.rotate(Math.PI/2+e.angle);const i=null!=e.imageWidth?e.imageWidth:e.image.width,o=null!=e.imageHeight?e.imageHeight:e.image.height;e.image.drawImageAtPosition(t,1,-i/2,0,i,o),t.restore()}return!1}};class Bt extends kt{static draw(t,e){const i=[{x:0,y:0},{x:-1,y:.3},{x:-.9,y:0},{x:-1,y:-.3}];return kt.transform(i,e),kt.drawPath(t,i),!0}}class Tt{static draw(t,e){const i=[{x:-1,y:0},{x:0,y:.3},{x:-.4,y:0},{x:0,y:-.3}];return kt.transform(i,e),kt.drawPath(t,i),!0}}class It{static draw(t,e){const i={x:-.4,y:0};kt.transform(i,e),t.strokeStyle=t.fillStyle,t.fillStyle="rgba(0, 0, 0, 0)";const o=Math.PI,s=e.angle-o/2,n=e.angle+o/2;return t.beginPath(),t.arc(i.x,i.y,.4*e.length,s,n,!1),t.stroke(),!0}}class Dt{static draw(t,e){const i={x:-.3,y:0};kt.transform(i,e),t.strokeStyle=t.fillStyle,t.fillStyle="rgba(0, 0, 0, 0)";const o=Math.PI,s=e.angle+o/2,n=e.angle+3*o/2;return t.beginPath(),t.arc(i.x,i.y,.4*e.length,s,n,!1),t.stroke(),!0}}let Nt=class{static draw(t,e){const i=[{x:.02,y:0},{x:-1,y:.3},{x:-1,y:-.3}];return kt.transform(i,e),kt.drawPath(t,i),!0}};class Pt{static draw(t,e){const i=[{x:0,y:.3},{x:0,y:-.3},{x:-1,y:0}];return kt.transform(i,e),kt.drawPath(t,i),!0}}let Ft=class{static draw(t,e){const i={x:-.4,y:0};return kt.transform(i,e),k(t,i.x,i.y,.4*e.length),!0}};class Rt{static draw(t,e){const i=[{x:0,y:.5},{x:0,y:-.5},{x:-.15,y:-.5},{x:-.15,y:.5}];return kt.transform(i,e),kt.drawPath(t,i),!0}}let At=class{static draw(t,e){const i=[{x:0,y:.3},{x:0,y:-.3},{x:-.6,y:-.3},{x:-.6,y:.3}];return kt.transform(i,e),kt.drawPath(t,i),!0}},jt=class{static draw(t,e){const i=[{x:0,y:0},{x:-.5,y:-.3},{x:-1,y:0},{x:-.5,y:.3}];return kt.transform(i,e),kt.drawPath(t,i),!0}};class Lt{static draw(t,e){const i=[{x:-1,y:.3},{x:-.5,y:0},{x:-1,y:-.3},{x:0,y:0}];return kt.transform(i,e),kt.drawPath(t,i),!0}}class Ht{static draw(t,e){let i;switch(e.type&&(i=e.type.toLowerCase()),i){case"image":return zt.draw(t,e);case"circle":return Ft.draw(t,e);case"box":return At.draw(t,e);case"crow":return Tt.draw(t,e);case"curve":return It.draw(t,e);case"diamond":return jt.draw(t,e);case"inv_curve":return Dt.draw(t,e);case"triangle":return Nt.draw(t,e);case"inv_triangle":return Pt.draw(t,e);case"bar":return Rt.draw(t,e);case"vee":return Lt.draw(t,e);default:return Bt.draw(t,e)}}}class Wt{from;fromPoint;to;toPoint;via;color={};colorDirty=!0;id;options;hoverWidth=1.5;selectionWidth=2;_body;_labelModule;constructor(t,e,i){this._body=e,this._labelModule=i,this.setOptions(t),this.fromPoint=this.from,this.toPoint=this.to}connect(){this.from=this._body.nodes[this.options.from],this.to=this._body.nodes[this.options.to]}cleanup(){return!1}setOptions(t){this.options=t,this.from=this._body.nodes[this.options.from],this.to=this._body.nodes[this.options.to],this.id=this.options.id}drawLine(t,e,i,o,s=this.getViaNode()){t.strokeStyle=this.getColor(t,e),t.lineWidth=e.width,!1!==e.dashes?this._drawDashedLine(t,e,s):this._drawLine(t,e,s)}_drawLine(t,e,i,o,s){if(this.from!=this.to)this._line(t,e,i,o,s);else{const[i,o,s]=this._getCircleData(t);this._circle(t,e,i,o,s)}}_drawDashedLine(t,e,i,o,s){t.lineCap="round";const n=Array.isArray(e.dashes)?e.dashes:[5,5];if(void 0!==t.setLineDash){if(t.save(),t.setLineDash(n),t.lineDashOffset=0,this.from!=this.to)this._line(t,e,i);else{const[i,o,s]=this._getCircleData(t);this._circle(t,e,i,o,s)}t.setLineDash([0]),t.lineDashOffset=0,t.restore()}else{if(this.from!=this.to)I(t,this.from.x,this.from.y,this.to.x,this.to.y,n);else{const[i,o,s]=this._getCircleData(t);this._circle(t,e,i,o,s)}this.enableShadow(t,e),t.stroke(),this.disableShadow(t,e)}}findBorderPosition(t,e,i){return this.from!=this.to?this._findBorderPosition(t,e,i):this._findBorderPositionCircle(t,e,i)}findBorderPositions(t){if(this.from!=this.to)return{from:this._findBorderPosition(this.from,t),to:this._findBorderPosition(this.to,t)};{const[e,i]=this._getCircleData(t).slice(0,2);return{from:this._findBorderPositionCircle(this.from,t,{x:e,y:i,low:.25,high:.6,direction:-1}),to:this._findBorderPositionCircle(this.from,t,{x:e,y:i,low:.6,high:.8,direction:1})}}}_getCircleData(t){const e=this.options.selfReference.size;void 0!==t&&void 0===this.from.shape.width&&this.from.shape.resize(t);const i=St(t,this.options.selfReference.angle,e,this.from);return[i.x,i.y,e]}_pointOnCircle(t,e,i,o){const s=2*o*Math.PI;return{x:t+i*Math.cos(s),y:e-i*Math.sin(s)}}_findBorderPositionCircle(t,e,i){const o=i.x,s=i.y;let n=i.low,r=i.high;const d=i.direction,h=this.options.selfReference.size;let a,l=.5*(n+r),c=0;!0===this.options.arrowStrikethrough&&(-1===d?c=this.options.endPointOffset.from:1===d&&(c=this.options.endPointOffset.to));let p=0;do{l=.5*(n+r),a=this._pointOnCircle(o,s,h,l);const i=Math.atan2(t.y-a.y,t.x-a.x),u=t.distanceToBorder(e,i)+c-Math.sqrt(Math.pow(a.x-t.x,2)+Math.pow(a.y-t.y,2));if(Math.abs(u)<.05)break;u>0?d>0?n=l:r=l:d>0?r=l:n=l,++p}while(n<=r&&p<10);return{...a,t:l}}getLineWidth(t,e){return!0===t?Math.max(this.selectionWidth,.3/this._body.view.scale):!0===e?Math.max(this.hoverWidth,.3/this._body.view.scale):Math.max(this.options.width,.3/this._body.view.scale)}getColor(t,e){if(!1!==e.inheritsColor){if("both"===e.inheritsColor&&this.from.id!==this.to.id){const i=t.createLinearGradient(this.from.x,this.from.y,this.to.x,this.to.y);let o=this.from.options.color.highlight.border,s=this.to.options.color.highlight.border;return!1===this.from.selected&&!1===this.to.selected?(o=n(this.from.options.color.border,e.opacity),s=n(this.to.options.color.border,e.opacity)):!0===this.from.selected&&!1===this.to.selected?s=this.to.options.color.border:!1===this.from.selected&&!0===this.to.selected&&(o=this.from.options.color.border),i.addColorStop(0,o),i.addColorStop(1,s),i}return"to"===e.inheritsColor?n(this.to.options.color.border,e.opacity):n(this.from.options.color.border,e.opacity)}return n(e.color,e.opacity)}_circle(t,e,i,o,s){this.enableShadow(t,e);let n=0,r=2*Math.PI;if(!this.options.selfReference.renderBehindTheNode){const e=this.options.selfReference.angle,s=this.options.selfReference.angle+Math.PI,d=this._findBorderPositionCircle(this.from,t,{x:i,y:o,low:e,high:s,direction:-1}),h=this._findBorderPositionCircle(this.from,t,{x:i,y:o,low:e,high:s,direction:1});n=Math.atan2(d.y-o,d.x-i),r=Math.atan2(h.y-o,h.x-i)}t.beginPath(),t.arc(i,o,s,n,r,!1),t.stroke(),this.disableShadow(t,e)}getDistanceToEdge(t,e,i,o,s,n){if(this.from!=this.to)return this._getDistanceToEdge(t,e,i,o,s,n);{const[t,e,i]=this._getCircleData(void 0),o=t-s,r=e-n;return Math.abs(Math.sqrt(o*o+r*r)-i)}}_getDistanceToLine(t,e,i,o,s,n){const r=i-t,d=o-e;let h=((s-t)*r+(n-e)*d)/(r*r+d*d);h>1?h=1:h<0&&(h=0);const a=t+h*r-s,l=e+h*d-n;return Math.sqrt(a*a+l*l)}getArrowData(t,e,i,o,s,n){let r,d,h,a,l,c,p;const u=n.width;"from"===e?(h=this.from,a=this.to,l=n.fromArrowScale<0,c=Math.abs(n.fromArrowScale),p=n.fromArrowType):"to"===e?(h=this.to,a=this.from,l=n.toArrowScale<0,c=Math.abs(n.toArrowScale),p=n.toArrowType):(h=this.to,a=this.from,l=n.middleArrowScale<0,c=Math.abs(n.middleArrowScale),p=n.middleArrowType);const g=15*c+3*u;if(h!=a){const o=g/Math.hypot(h.x-a.x,h.y-a.y);if("middle"!==e)if(!0===this.options.smooth.enabled){const s=this._findBorderPosition(h,t,{via:i}),n=this.getPoint(s.t+o*("from"===e?1:-1),i);r=Math.atan2(s.y-n.y,s.x-n.x),d=s}else r=Math.atan2(h.y-a.y,h.x-a.x),d=this._findBorderPosition(h,t);else{const t=(l?-o:o)/2,e=this.getPoint(.5+t,i),s=this.getPoint(.5-t,i);r=Math.atan2(e.y-s.y,e.x-s.x),d=this.getPoint(.5,i)}}else{const[i,o,s]=this._getCircleData(t);if("from"===e){const e=this.options.selfReference.angle,s=this.options.selfReference.angle+Math.PI,n=this._findBorderPositionCircle(this.from,t,{x:i,y:o,low:e,high:s,direction:-1});r=-2*n.t*Math.PI+1.5*Math.PI+.1*Math.PI,d=n}else if("to"===e){const e=this.options.selfReference.angle,s=this.options.selfReference.angle+Math.PI,n=this._findBorderPositionCircle(this.from,t,{x:i,y:o,low:e,high:s,direction:1});r=-2*n.t*Math.PI+1.5*Math.PI-1.1*Math.PI,d=n}else{const t=this.options.selfReference.angle/(2*Math.PI);d=this._pointOnCircle(i,o,s,t),r=-2*t*Math.PI+1.5*Math.PI+.1*Math.PI}}return{point:d,core:{x:d.x-.9*g*Math.cos(r),y:d.y-.9*g*Math.sin(r)},angle:r,length:g,type:p}}drawArrowHead(t,e,i,o,s){t.strokeStyle=this.getColor(t,e),t.fillStyle=t.strokeStyle,t.lineWidth=e.width;Ht.draw(t,s)&&(this.enableShadow(t,e),t.fill(),this.disableShadow(t,e))}enableShadow(t,e){!0===e.shadow&&(t.shadowColor=e.shadowColor,t.shadowBlur=e.shadowSize,t.shadowOffsetX=e.shadowX,t.shadowOffsetY=e.shadowY)}disableShadow(t,e){!0===e.shadow&&(t.shadowColor="rgba(0,0,0,0)",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0)}drawBackground(t,e){if(!1!==e.background){const i={strokeStyle:t.strokeStyle,lineWidth:t.lineWidth,dashes:t.dashes};t.strokeStyle=e.backgroundColor,t.lineWidth=e.backgroundSize,this.setStrokeDashed(t,e.backgroundDashes),t.stroke(),t.strokeStyle=i.strokeStyle,t.lineWidth=i.lineWidth,t.dashes=i.dashes,this.setStrokeDashed(t,e.dashes)}}setStrokeDashed(t,e){if(!1!==e)if(void 0!==t.setLineDash){const i=Array.isArray(e)?e:[5,5];t.setLineDash(i)}else console.warn("setLineDash is not supported in this browser. The dashed stroke cannot be used.");else void 0!==t.setLineDash?t.setLineDash([]):console.warn("setLineDash is not supported in this browser. The dashed stroke cannot be used.")}}class Vt extends Wt{_findBorderPositionBezier(t,e,i=this._getViaCoordinates()){let o,s,n=!1,r=1,d=0,h=this.to,a=this.options.endPointOffset?this.options.endPointOffset.to:0;t.id===this.from.id&&(h=this.from,n=!0,a=this.options.endPointOffset?this.options.endPointOffset.from:0),!1===this.options.arrowStrikethrough&&(a=0);let l=0;do{s=.5*(d+r),o=this.getPoint(s,i);const t=Math.atan2(h.y-o.y,h.x-o.x),c=h.distanceToBorder(e,t)+a-Math.sqrt(Math.pow(o.x-h.x,2)+Math.pow(o.y-h.y,2));if(Math.abs(c)<.2)break;c<0?!1===n?d=s:r=s:!1===n?r=s:d=s,++l}while(d<=r&&l<10);return{...o,t:s}}_getDistanceToBezierEdge(t,e,i,o,s,n,r){let d,h,a,l,c,p=1e9,u=t,g=e;for(h=1;h<10;h++)a=.1*h,l=Math.pow(1-a,2)*t+2*a*(1-a)*r.x+Math.pow(a,2)*i,c=Math.pow(1-a,2)*e+2*a*(1-a)*r.y+Math.pow(a,2)*o,h>0&&(d=this._getDistanceToLine(u,g,l,c,s,n),p=d<p?d:p),u=l,g=c;return p}_bezierCurve(t,e,i,o){t.beginPath(),t.moveTo(this.fromPoint.x,this.fromPoint.y),null!=i&&null!=i.x?null!=o&&null!=o.x?t.bezierCurveTo(i.x,i.y,o.x,o.y,this.toPoint.x,this.toPoint.y):t.quadraticCurveTo(i.x,i.y,this.toPoint.x,this.toPoint.y):t.lineTo(this.toPoint.x,this.toPoint.y),this.drawBackground(t,e),this.enableShadow(t,e),t.stroke(),this.disableShadow(t,e)}getViaNode(){return this._getViaCoordinates()}}class qt extends Vt{via=this.via;_boundFunction;constructor(t,e,i){super(t,e,i),this._boundFunction=()=>{this.positionBezierNode()},this._body.emitter.on("_repositionBezierNodes",this._boundFunction)}setOptions(t){super.setOptions(t);let e=!1;this.options.physics!==t.physics&&(e=!0),this.options=t,this.id=this.options.id,this.from=this._body.nodes[this.options.from],this.to=this._body.nodes[this.options.to],this.setupSupportNode(),this.connect(),!0===e&&(this.via.setOptions({physics:this.options.physics}),this.positionBezierNode())}connect(){this.from=this._body.nodes[this.options.from],this.to=this._body.nodes[this.options.to],void 0===this.from||void 0===this.to||!1===this.options.physics||this.from.id===this.to.id?this.via.setOptions({physics:!1}):this.via.setOptions({physics:!0})}cleanup(){return this._body.emitter.off("_repositionBezierNodes",this._boundFunction),void 0!==this.via&&(delete this._body.nodes[this.via.id],this.via=void 0,!0)}setupSupportNode(){if(void 0===this.via){const t="edgeId:"+this.id,e=this._body.functions.createNode({id:t,shape:"circle",physics:!0,hidden:!0});this._body.nodes[t]=e,this.via=e,this.via.parentEdgeId=this.id,this.positionBezierNode()}}positionBezierNode(){void 0!==this.via&&void 0!==this.from&&void 0!==this.to?(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y)):void 0!==this.via&&(this.via.x=0,this.via.y=0)}_line(t,e,i){this._bezierCurve(t,e,i)}_getViaCoordinates(){return this.via}getViaNode(){return this.via}getPoint(t,e=this.via){if(this.from===this.to){const[e,i,o]=this._getCircleData(),s=2*Math.PI*(1-t);return{x:e+o*Math.sin(s),y:i+o-o*(1-Math.cos(s))}}return{x:Math.pow(1-t,2)*this.fromPoint.x+2*t*(1-t)*e.x+Math.pow(t,2)*this.toPoint.x,y:Math.pow(1-t,2)*this.fromPoint.y+2*t*(1-t)*e.y+Math.pow(t,2)*this.toPoint.y}}_findBorderPosition(t,e){return this._findBorderPositionBezier(t,e,this.via)}_getDistanceToEdge(t,e,i,o,s,n){return this._getDistanceToBezierEdge(t,e,i,o,s,n,this.via)}}class