diff --git a/CHANGELOG b/CHANGELOG index b564797d3..00b3dc43e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,31 @@ +04-6-2020 (v3.2.0) + * add Sequence Diagram demo + * add HTML Elements demo + * upgrade jQuery dependency + * dia.Paper - add beforeRender and afterRender options, add hasScheduledUpdates(), trigger `render:done` in sync mode + * dia.Paper - fix missing initial render:done event + * dia.Paper - prevent the prototype options modification, persist functions passed as options + * dia.Paper - scaleContentToFit() padding option accepts object + * dia.Paper - fix isMounted argument of viewport() option + * dia.Paper - dynamic link update priorities (fix for "link connected to other two links" update bug) + * dia.Element - port removal runs in batch + * dia.Element - add getGroupPorts() + * dia.Element - prevent exception in getPointFromConnectedLink() when port does not exist + * dia.LinkView - fix never ending batch for legacy link tools + * dia.LinkView - add requestConnectionUpdate() + * dia.LinkView - trigger link:snap:connect and link:snap:disconnect events + * dia.LinkView - prevent exception when labels and connection require update + * dia.LinkView - measure snap distance for links from magnet's boundary + * dia.LinkView - add getEndConnectionPoint() + * mvc.View - add DETACHABLE property to ignore viewport matching, FLAG_INSERT & FLAG_REMOVE defined on per view basis + * linkTools.Anchor: add resetAnchor option + * linkTools.Segments: add stopPropagation option + * connectionPoints.anchor - add align and alignOffset options + * attributes.textWrap: add maxLineCount option + * util.breakText - retain new line characters, add maxLineCount option + * util.sanitizeHTML: sanitize attribute values with "data:" and "vbscript:" + * Geometry - add parallel() to Line, add serialize() to Point and Line + 28-11-2019 (v3.1.1) * dia.CellView - prevent DOM exceptions when invalid attrs provided diff --git a/dist/geometry.js b/dist/geometry.js index 34df5e44b..4ee2ee48b 100644 --- a/dist/geometry.js +++ b/dist/geometry.js @@ -1,4 +1,4 @@ -/*! JointJS v3.1.1 (2019-10-28) - JavaScript diagramming library +/*! JointJS v3.2.0 (2020-06-04) - JavaScript diagramming library This Source Code Form is subject to the terms of the Mozilla Public @@ -1535,6 +1535,18 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. ); }, + parallel: function(distance) { + var l = this.clone(); + if (!this.isDifferentiable()) { return l; } + var start = l.start; + var end = l.end; + var eRef = start.clone().rotate(end, 270); + var sRef = end.clone().rotate(start, 90); + start.move(sRef, distance); + end.move(eRef, distance); + return l; + }, + // @return {point} my point at 't' <0,1> pointAt: function(t) { @@ -1656,6 +1668,11 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return this.start.toString() + ' ' + this.end.toString(); }, + serialize: function() { + + return this.start.serialize() + ' ' + this.end.serialize(); + }, + translate: function(tx, ty) { this.start.translate(tx, ty); @@ -3249,6 +3266,11 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return this.x + '@' + this.y; }, + serialize: function() { + + return this.x + ',' + this.y; + }, + update: function(x, y) { this.x = x || 0; diff --git a/dist/geometry.min.js b/dist/geometry.min.js index 16c8fd76e..3ce132551 100644 --- a/dist/geometry.min.js +++ b/dist/geometry.min.js @@ -1,8 +1,8 @@ -/*! JointJS v3.1.1 (2019-10-28) - JavaScript diagramming library +/*! JointJS v3.2.0 (2020-06-04) - JavaScript diagramming library This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t=t||self).g={})}(this,function(t){"use strict";var i=Math,R=i.abs,u=i.cos,a=i.sin,q=i.sqrt,z=i.min,j=i.max,c=i.atan2,e=i.round,r=i.floor,s=i.PI,T=i.pow,n={curveThroughPoints:function(t){return console.warn("deprecated"),new L(d.throughPoints(t)).serialize()},getCurveControlPoints:function(t){console.warn("deprecated");var n,e=[],i=[],r=t.length-1;if(1==r)return e[0]=new w((2*t[0].x+t[1].x)/3,(2*t[0].y+t[1].y)/3),i[0]=new w(2*e[0].x-t[0].x,2*e[0].y-t[0].y),[e,i];var s=[];for(n=1;nh.x+s/2,l=ih.x?r-30:r+30)-a)/(o*o*(i-u))+u:n=o*o/(r-a)-o*o*(i-u)*((e=r>h.y?i+30:i-30)-u)/(s*s*(r-a))+a,new w(e,n).theta(t)},toString:function(){return new w(this.x,this.y).toString()+" "+this.a+" "+this.b}};var g=function(t,n){return this instanceof g?t instanceof g?new g(t.start,t.end):(this.start=new w(t),void(this.end=new w(n))):new g(t,n)};g.prototype={angle:function(){var t=new w(this.start.x+1,this.start.y);return this.start.angleBetween(this.end,t)},bbox:function(){var t=z(this.start.x,this.end.x),n=z(this.start.y,this.end.y),e=j(this.start.x,this.end.x),i=j(this.start.y,this.end.y);return new M(t,n,e-t,i-n)},bearing:function(){var t=v(this.start.y),n=v(this.end.y),e=this.start.x,i=this.end.x,r=v(i-e),s=a(r)*u(n),o=u(t)*a(n)-a(t)*u(n)*u(r),h=f(c(s,o))-22.5;return h<0&&(h+=360),["NE","E","SE","S","SW","W","NW","N"][h=parseInt(h/45)]},clone:function(){return new g(this.start,this.end)},closestPoint:function(t){return this.pointAt(this.closestPointNormalizedLength(t))},closestPointLength:function(t){return this.closestPointNormalizedLength(t)*this.length()},closestPointNormalizedLength:function(t){var n=this.vector().dot(new g(this.start,t).vector()),e=z(1,j(0,n/this.squaredLength()));return e!=e?0:e},closestPointTangent:function(t){return this.tangentAt(this.closestPointNormalizedLength(t))},containsPoint:function(t){var n=this.start,e=this.end;if(0!==n.cross(t,e))return!1;var i=this.length();return!(new g(n,t).length()>i)&&!(new g(t,e).length()>i)},divideAt:function(t){var n=this.pointAt(t);return[new g(this.start,n),new g(n,this.end)]},divideAtLength:function(t){var n=this.pointAtLength(t);return[new g(this.start,n),new g(n,this.end)]},equals:function(t){return!!t&&this.start.x===t.start.x&&this.start.y===t.start.y&&this.end.x===t.end.x&&this.end.y===t.end.y},intersect:function(t,n){if(t instanceof g||t instanceof M||t instanceof I||t instanceof o||t instanceof L){var e=t.intersectionWithLine(this,n);return e&&t instanceof g&&(e=e[0]),e}return null},intersectionWithLine:function(t){var n=new w(this.end.x-this.start.x,this.end.y-this.start.y),e=new w(t.end.x-t.start.x,t.end.y-t.start.y),i=n.x*e.y-n.y*e.x,r=new w(t.start.x-this.start.x,t.start.y-this.start.y),s=r.x*e.y-r.y*e.x,o=r.x*n.y-r.y*n.x;if(0===i||s*i<0||o*i<0)return null;if(0a.y||r>u.y&&r<=a.y){var l=u.x-i>a.x-i?u.x-i:a.x-i;if(0<=l){var f=new w(i+l,r),d=new g(t,f);c.intersect(d)&&h++}}s=o}return h%2==1},convexHull:function(){var t,n,e,i=this.points,r=i.length;if(0===r)return new I;for(t=0;te.x&&(e=i[t]);var s=[];for(t=0;t=this.x&&t.x<=this.x+this.width&&t.y>=this.y&&t.y<=this.y+this.height},containsRect:function(t){var n=new M(this).normalize(),e=new M(t).normalize(),i=n.width,r=n.height,s=e.width,o=e.height;if(!(i&&r&&s&&o))return!1;var h=n.x,u=n.y,a=e.x,c=e.y;return s+=a,i+=h,o+=c,r+=u,h<=a&&s<=i&&u<=c&&o<=r},corner:function(){return new w(this.x+this.width,this.y+this.height)},equals:function(t){var n=new M(this).normalize(),e=new M(t).normalize();return n.x===e.x&&n.y===e.y&&n.width===e.width&&n.height===e.height},inflate:function(t,n){return void 0===t&&(t=0),void 0===n&&(n=t),this.x-=t,this.y-=n,this.width+=2*t,this.height+=2*n,this},intersect:function(t){var n=this.origin(),e=this.corner(),i=t.origin(),r=t.corner();if(r.x<=n.x||r.y<=n.y||i.x>=e.x||i.y>=e.y)return null;var s=j(n.x,i.x),o=j(n.y,i.y);return new M(s,o,z(e.x,r.x)-s,z(e.y,r.y)-o)},intersectionWithLine:function(t){var n,e,i=[this.topLine(),this.rightLine(),this.bottomLine(),this.leftLine()],r=[],s=[],o=i.length;for(e=0;ec&&(i=(this.x+this.width-c)/(d.x-c)),d.y>l&&(h=(this.y+this.height-l)/(d.y-l));var g=t.topRight();g.x>c&&(r=(this.x+this.width-c)/(g.x-c)),g.yl&&(a=(this.y+this.height-l)/(v.y-l)),{sx:z(e,i,r,s),sy:z(o,h,u,a)}},maxRectUniformScaleToFit:function(t,n){var e=this.maxRectScaleToFit(t,n);return z(e.sx,e.sy)},moveAndExpand:function(t){return this.x+=t.x||0,this.y+=t.y||0,this.width+=t.width||0,this.height+=t.height||0,this},normalize:function(){var t=this.x,n=this.y,e=this.width,i=this.height;return this.width<0&&(t=this.x+this.width,e=-this.width),this.height<0&&(n=this.y+this.height,i=-this.height),this.x=t,this.y=n,this.width=e,this.height=i,this},offset:function(t,n){return w.prototype.offset.call(this,t,n)},origin:function(){return new w(this.x,this.y)},pointNearestToPoint:function(t){if(t=new w(t),this.containsPoint(t))switch(this.sideNearestToPoint(t)){case"right":return new w(this.x+this.width,t.y);case"left":return new w(this.x,t.y);case"bottom":return new w(t.x,this.y+this.height);case"top":return new w(t.x,this.y)}return t.adhereToRect(this)},rightLine:function(){return new g(this.topRight(),this.bottomRight())},rightMiddle:function(){return new w(this.x+this.width,this.y+this.height/2)},round:function(t){var n=T(10,t||0);return this.x=e(this.x*n)/n,this.y=e(this.y*n)/n,this.width=e(this.width*n)/n,this.height=e(this.height*n)/n,this},scale:function(t,n,e){return e=this.origin().scale(t,n,e),this.x=e.x,this.y=e.y,this.width*=t,this.height*=n,this},sideNearestToPoint:function(t){var n=(t=new w(t)).x-this.x,e=this.x+this.width-t.x,i=t.y-this.y,r=n,s="left";return eh.x+s/2,l=ih.x?r-30:r+30)-a)/(o*o*(i-u))+u:n=o*o/(r-a)-o*o*(i-u)*((e=r>h.y?i+30:i-30)-u)/(s*s*(r-a))+a,new w(e,n).theta(t)},toString:function(){return new w(this.x,this.y).toString()+" "+this.a+" "+this.b}};var g=function(t,n){return this instanceof g?t instanceof g?new g(t.start,t.end):(this.start=new w(t),void(this.end=new w(n))):new g(t,n)};g.prototype={angle:function(){var t=new w(this.start.x+1,this.start.y);return this.start.angleBetween(this.end,t)},bbox:function(){var t=z(this.start.x,this.end.x),n=z(this.start.y,this.end.y),e=j(this.start.x,this.end.x),i=j(this.start.y,this.end.y);return new M(t,n,e-t,i-n)},bearing:function(){var t=v(this.start.y),n=v(this.end.y),e=this.start.x,i=this.end.x,r=v(i-e),s=a(r)*u(n),o=u(t)*a(n)-a(t)*u(n)*u(r),h=f(c(s,o))-22.5;return h<0&&(h+=360),["NE","E","SE","S","SW","W","NW","N"][h=parseInt(h/45)]},clone:function(){return new g(this.start,this.end)},closestPoint:function(t){return this.pointAt(this.closestPointNormalizedLength(t))},closestPointLength:function(t){return this.closestPointNormalizedLength(t)*this.length()},closestPointNormalizedLength:function(t){var n=this.vector().dot(new g(this.start,t).vector()),e=z(1,j(0,n/this.squaredLength()));return e!=e?0:e},closestPointTangent:function(t){return this.tangentAt(this.closestPointNormalizedLength(t))},containsPoint:function(t){var n=this.start,e=this.end;if(0!==n.cross(t,e))return!1;var i=this.length();return!(new g(n,t).length()>i)&&!(new g(t,e).length()>i)},divideAt:function(t){var n=this.pointAt(t);return[new g(this.start,n),new g(n,this.end)]},divideAtLength:function(t){var n=this.pointAtLength(t);return[new g(this.start,n),new g(n,this.end)]},equals:function(t){return!!t&&this.start.x===t.start.x&&this.start.y===t.start.y&&this.end.x===t.end.x&&this.end.y===t.end.y},intersect:function(t,n){if(t instanceof g||t instanceof M||t instanceof I||t instanceof o||t instanceof L){var e=t.intersectionWithLine(this,n);return e&&t instanceof g&&(e=e[0]),e}return null},intersectionWithLine:function(t){var n=new w(this.end.x-this.start.x,this.end.y-this.start.y),e=new w(t.end.x-t.start.x,t.end.y-t.start.y),i=n.x*e.y-n.y*e.x,r=new w(t.start.x-this.start.x,t.start.y-this.start.y),s=r.x*e.y-r.y*e.x,o=r.x*n.y-r.y*n.x;if(0===i||s*i<0||o*i<0)return null;if(0a.y||r>u.y&&r<=a.y){var l=u.x-i>a.x-i?u.x-i:a.x-i;if(0<=l){var f=new w(i+l,r),d=new g(t,f);c.intersect(d)&&h++}}s=o}return h%2==1},convexHull:function(){var t,n,e,i=this.points,r=i.length;if(0===r)return new I;for(t=0;te.x&&(e=i[t]);var s=[];for(t=0;t=this.x&&t.x<=this.x+this.width&&t.y>=this.y&&t.y<=this.y+this.height},containsRect:function(t){var n=new M(this).normalize(),e=new M(t).normalize(),i=n.width,r=n.height,s=e.width,o=e.height;if(!(i&&r&&s&&o))return!1;var h=n.x,u=n.y,a=e.x,c=e.y;return s+=a,i+=h,o+=c,r+=u,h<=a&&s<=i&&u<=c&&o<=r},corner:function(){return new w(this.x+this.width,this.y+this.height)},equals:function(t){var n=new M(this).normalize(),e=new M(t).normalize();return n.x===e.x&&n.y===e.y&&n.width===e.width&&n.height===e.height},inflate:function(t,n){return void 0===t&&(t=0),void 0===n&&(n=t),this.x-=t,this.y-=n,this.width+=2*t,this.height+=2*n,this},intersect:function(t){var n=this.origin(),e=this.corner(),i=t.origin(),r=t.corner();if(r.x<=n.x||r.y<=n.y||i.x>=e.x||i.y>=e.y)return null;var s=j(n.x,i.x),o=j(n.y,i.y);return new M(s,o,z(e.x,r.x)-s,z(e.y,r.y)-o)},intersectionWithLine:function(t){var n,e,i=[this.topLine(),this.rightLine(),this.bottomLine(),this.leftLine()],r=[],s=[],o=i.length;for(e=0;ec&&(i=(this.x+this.width-c)/(d.x-c)),d.y>l&&(h=(this.y+this.height-l)/(d.y-l));var g=t.topRight();g.x>c&&(r=(this.x+this.width-c)/(g.x-c)),g.yl&&(a=(this.y+this.height-l)/(v.y-l)),{sx:z(e,i,r,s),sy:z(o,h,u,a)}},maxRectUniformScaleToFit:function(t,n){var e=this.maxRectScaleToFit(t,n);return z(e.sx,e.sy)},moveAndExpand:function(t){return this.x+=t.x||0,this.y+=t.y||0,this.width+=t.width||0,this.height+=t.height||0,this},normalize:function(){var t=this.x,n=this.y,e=this.width,i=this.height;return this.width<0&&(t=this.x+this.width,e=-this.width),this.height<0&&(n=this.y+this.height,i=-this.height),this.x=t,this.y=n,this.width=e,this.height=i,this},offset:function(t,n){return w.prototype.offset.call(this,t,n)},origin:function(){return new w(this.x,this.y)},pointNearestToPoint:function(t){if(t=new w(t),this.containsPoint(t))switch(this.sideNearestToPoint(t)){case"right":return new w(this.x+this.width,t.y);case"left":return new w(this.x,t.y);case"bottom":return new w(t.x,this.y+this.height);case"top":return new w(t.x,this.y)}return t.adhereToRect(this)},rightLine:function(){return new g(this.topRight(),this.bottomRight())},rightMiddle:function(){return new w(this.x+this.width,this.y+this.height/2)},round:function(t){var n=T(10,t||0);return this.x=e(this.x*n)/n,this.y=e(this.y*n)/n,this.width=e(this.width*n)/n,this.height=e(this.height*n)/n,this},scale:function(t,n,e){return e=this.origin().scale(t,n,e),this.x=e.x,this.y=e.y,this.width*=t,this.height*=n,this},sideNearestToPoint:function(t){var n=(t=new w(t)).x-this.x,e=this.x+this.width-t.x,i=t.y-this.y,r=n,s="left";return e pointAt: function(t) { @@ -2051,6 +2063,11 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return this.start.toString() + ' ' + this.end.toString(); }, + serialize: function() { + + return this.start.serialize() + ' ' + this.end.serialize(); + }, + translate: function(tx, ty) { this.start.translate(tx, ty); @@ -3644,6 +3661,11 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return this.x + '@' + this.y; }, + serialize: function() { + + return this.x + ',' + this.y; + }, + update: function(x, y) { this.x = x || 0; @@ -8806,9 +8828,9 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. }; var breakText = function(text, size, styles, opt) { + if ( styles === void 0 ) styles = {}; + if ( opt === void 0 ) opt = {}; - opt = opt || {}; - styles = styles || {}; var width = size.width; var height = size.height; @@ -8840,6 +8862,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var separator = opt.separator || ' '; var eol = opt.eol || '\n'; var hyphen = opt.hyphen ? new RegExp(opt.hyphen) : /[^\w\d]/; + var maxLineCount = opt.maxLineCount; + if (!isNumber(maxLineCount)) { maxLineCount = Infinity; } var words = text.split(separator); var full = []; @@ -8854,19 +8878,19 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. if (!word) { continue; } if (eol && word.indexOf(eol) >= 0) { - // word cotains end-of-line character + // word contains end-of-line character if (word.length > 1) { // separate word and continue cycle var eolWords = word.split(eol); for (var j = 0, jl = eolWords.length - 1; j < jl; j++) { eolWords.splice(2 * j + 1, 0, eol); } - Array.prototype.splice.apply(words, [i, 1].concat(eolWords)); + words.splice.apply(words, [ i, 1 ].concat( eolWords.filter(function (word) { return word !== ''; }) )); i--; - len += eolWords.length - 1; + len = words.length; } else { - // creates new line - l++; + // creates a new line + lines[++l] = ''; } continue; } @@ -8965,9 +8989,16 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. i--; } - // if size.height is defined we have to check whether the height of the entire - // text exceeds the rect height - if (height !== undefined) { + var lastL = null; + + if (lines.length > maxLineCount) { + + lastL = maxLineCount - 1; + + } else if (height !== undefined) { + + // if size.height is defined we have to check whether the height of the entire + // text exceeds the rect height if (lineHeight === undefined) { @@ -8989,37 +9020,42 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. if (lineHeight * lines.length > height) { // remove overflowing lines - var lastL = Math.floor(height / lineHeight) - 1; - lines.splice(lastL + 1); - - // add ellipsis - var ellipsis = opt.ellipsis; - if (!ellipsis || lastL < 0) { break; } - if (typeof ellipsis !== 'string') { ellipsis = '\u2026'; } - - var lastLine = lines[lastL]; - var k = lastLine.length; - var lastLineWithOmission, lastChar, separatorChar; - do { - lastChar = lastLine[k]; - lastLineWithOmission = lastLine.substring(0, k); - if (!lastChar) { - separatorChar = (typeof separator === 'string') ? separator : ' '; - lastLineWithOmission += separatorChar; - } else if (lastChar.match(separator)) { - lastLineWithOmission += lastChar; - } - lastLineWithOmission += ellipsis; - textNode.data = lastLineWithOmission; - if (textSpan.getComputedTextLength() <= width) { - lines[lastL] = lastLineWithOmission; - break; - } - k--; - } while (k >= 0); - break; + lastL = Math.floor(height / lineHeight) - 1; } } + + if (lastL !== null) { + + lines.splice(lastL + 1); + + // add ellipsis + var ellipsis = opt.ellipsis; + if (!ellipsis || lastL < 0) { break; } + if (typeof ellipsis !== 'string') { ellipsis = '\u2026'; } + + var lastLine = lines[lastL]; + if (!lastLine) { break; } + var k = lastLine.length; + var lastLineWithOmission, lastChar, separatorChar; + do { + lastChar = lastLine[k]; + lastLineWithOmission = lastLine.substring(0, k); + if (!lastChar) { + separatorChar = (typeof separator === 'string') ? separator : ' '; + lastLineWithOmission += separatorChar; + } else if (lastChar.match(separator)) { + lastLineWithOmission += lastChar; + } + lastLineWithOmission += ellipsis; + textNode.data = lastLineWithOmission; + if (textSpan.getComputedTextLength() <= width) { + lines[lastL] = lastLineWithOmission; + break; + } + k--; + } while (k >= 0); + break; + } } if (opt.svgDocument) { @@ -9061,7 +9097,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. // Remove attribute names that start with "on" (e.g. onload, onerror...). // Remove attribute values that start with "javascript:" pseudo protocol (e.g. `href="javascript:alert(1)"`). - if (attrName.indexOf('on') === 0 || attrValue.indexOf('javascript:') === 0) { + if (attrName.startsWith('on') || attrValue.startsWith('javascript:') || attrValue.startsWith('data:') || attrValue.startsWith('vbscript:')) { $(currentNode).removeAttr(attrName); } }); @@ -10468,7 +10504,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. // instead of creating a temporary one over again. svgDocument: this.paper.svg, ellipsis: value.ellipsis, - hyphen: value.hyphen + hyphen: value.hyphen, + maxLineCount: value.maxLineCount }); } else { wrappedText = ''; @@ -12339,6 +12376,14 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return cloneDeep(this.prop('ports/items')) || []; }, + /** + * @returns {Array} + */ + getGroupPorts: function(groupName) { + var groupPorts = toArray(this.prop(['ports','items'])).filter(function (port) { return port.group === groupName; }); + return cloneDeep(groupPorts); + }, + /** * @param {string} id * @returns {object} @@ -12490,45 +12535,39 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. }, removePort: function(port, opt) { - var options = opt || {}; - var ports = assign([], this.prop('ports/items')); - var index$1 = this.getPortIndex(port); - if (index$1 !== -1) { + var ports = assign([], this.prop(['ports', 'items'])); ports.splice(index$1, 1); options.rewrite = true; - this.prop('ports/items', ports, options); + this.startBatch('port-remove'); + this.prop(['ports', 'items'], ports, options); + this.stopBatch('port-remove'); } - return this; }, removePorts: function(portsForRemoval, opt) { - - var options; - + var options, newPorts; if (Array.isArray(portsForRemoval)) { options = opt || {}; - - if (portsForRemoval.length) { - options.rewrite = true; - var currentPorts = assign([], this.prop('ports/items')); - var remainingPorts = currentPorts.filter(function(cp) { - return !portsForRemoval.some(function(rp) { - var rpId = isObject(rp) ? rp.id : rp; - return cp.id === rpId; - }); + if (portsForRemoval.length === 0) { return this.this; } + var currentPorts = assign([], this.prop(['ports', 'items'])); + newPorts = currentPorts.filter(function(cp) { + return !portsForRemoval.some(function(rp) { + var rpId = isObject(rp) ? rp.id : rp; + return cp.id === rpId; }); - this.prop('ports/items', remainingPorts, options); - } + }); } else { options = portsForRemoval || {}; - options.rewrite = true; - this.prop('ports/items', [], options); + newPorts = []; } - + this.startBatch('port-remove'); + options.rewrite = true; + this.prop(['ports', 'items'], newPorts, options); + this.stopBatch('port-remove'); return this; }, @@ -13303,7 +13342,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var endDef = link.get(endType); if (!endDef) { return center; } var portId = endDef.port; - if (!portId) { return center; } + if (!portId || !this.hasPort(portId)) { return center; } var portGroup = this.portProp(portId, ['group']); var portsPositions = this.getPortsPositions(portGroup); var portCenter = new Point(portsPositions[portId]).offset(bbox.origin()); @@ -13327,7 +13366,10 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. children: null, childNodes: null, + DETACHABLE: true, UPDATE_PRIORITY: 2, + FLAG_INSERT: 1<<30, + FLAG_REMOVE: 1<<29, constructor: function(options) { @@ -13959,7 +14001,11 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return selector; }, - getLinkEnd: function(magnet, x, y, link, endType) { + getLinkEnd: function(magnet) { + var ref; + + var args = [], len = arguments.length - 1; + while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ]; var model = this.model; var id = model.id; @@ -13979,13 +14025,18 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. end.selector = this.getSelector(magnet); } - var paper = this.paper; - var connectionStrategy = paper.options.connectionStrategy; + return (ref = this).customizeLinkEnd.apply(ref, [ end, magnet ].concat( args )); + }, + + customizeLinkEnd: function(end, magnet, x, y, link, endType) { + var ref = this; + var paper = ref.paper; + var ref$1 = paper.options; + var connectionStrategy = ref$1.connectionStrategy; if (typeof connectionStrategy === 'function') { var strategy = connectionStrategy.call(paper, end, this, magnet, new Point(x, y), link, endType, paper); - if (strategy) { end = strategy; } + if (strategy) { return strategy; } } - return end; }, @@ -14557,9 +14608,12 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. pointerdown: function(evt, x, y) { - if (this.model.graph) { - this.model.startBatch('pointer'); - this._graph = this.model.graph; + var ref = this; + var model = ref.model; + var graph = model.graph; + if (graph) { + model.startBatch('pointer'); + this.eventData(evt, { graph: graph }); } this.notify('cell:pointerdown', evt, x, y); @@ -14572,13 +14626,15 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. pointerup: function(evt, x, y) { + var ref = this.eventData(evt); + var graph = ref.graph; + this.notify('cell:pointerup', evt, x, y); - if (this._graph) { + if (graph) { // we don't want to trigger event on model as model doesn't // need to be member of collection anymore (remove) - this._graph.stopBatch('pointer', { cell: this.model }); - delete this._graph; + graph.stopBatch('pointer', { cell: this.model }); } }, @@ -17866,8 +17922,20 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. addClass: addClass }); - function offset(p1, p2, offset) { - + function offsetPoint(p1, p2, offset) { + if (isPlainObject(offset)) { + var x = offset.x; + var y = offset.y; + if (isFinite(y)) { + var line = new Line(p2, p1); + var ref = line.parallel(y); + var start = ref.start; + var end = ref.end; + p2 = start; + p1 = end; + } + offset = x; + } if (!isFinite(offset)) { return p1; } var length = p1.distance(p2); if (offset === 0 && length > 0) { return p1; } @@ -17881,11 +17949,59 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return parseFloat(stroke) || 0; } - // Connection Points + function alignLine(line, type, offset) { + if ( offset === void 0 ) offset = 0; + + var coordinate, a, b, direction; + var start = line.start; + var end = line.end; + switch (type) { + case 'left': + coordinate = 'x'; + a = end; + b = start; + direction = -1; + break; + case 'right': + coordinate = 'x'; + a = start; + b = end; + direction = 1; + break; + case 'top': + coordinate = 'y'; + a = end; + b = start; + direction = -1; + break; + case 'bottom': + coordinate = 'y'; + a = start; + b = end; + direction = 1; + break; + default: + return; + } + if (start[coordinate] < end[coordinate]) { + a[coordinate] = b[coordinate]; + } else { + b[coordinate] = a[coordinate]; + } + if (isFinite(offset)) { + a[coordinate] += direction * offset; + b[coordinate] += direction * offset; + } + } - function anchorIntersection(line, view, magnet, opt) { + // Connection Points - return offset(line.end, line.start, opt.offset); + function anchorConnectionPoint(line, _view, _magnet, opt) { + var offset = opt.offset; + var alignOffset = opt.alignOffset; + var align = opt.align; + if (align) { alignLine(line, align, alignOffset); } + return offsetPoint(line.end, line.start, offset); } function bboxIntersection(line, view, magnet, opt) { @@ -17896,7 +18012,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var cp = (intersections) ? line.start.chooseClosest(intersections) : line.end; - return offset(cp, line.start, opt.offset); + return offsetPoint(cp, line.start, opt.offset); } function rectangleIntersection(line, view, magnet, opt) { @@ -17914,7 +18030,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var cp = (intersections) ? lineWORotation.start.chooseClosest(intersections).rotate(center, -angle) : line.end; - return offset(cp, line.start, opt.offset); + return offsetPoint(cp, line.start, opt.offset); } function findShapeNode(magnet) { @@ -18003,10 +18119,10 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var cpOffset = opt.offset || 0; if (opt.stroke) { cpOffset += stroke$1(node) / 2; } - return offset(cp, line.start, cpOffset); + return offsetPoint(cp, line.start, cpOffset); } - var anchor = anchorIntersection; + var anchor = anchorConnectionPoint; var bbox = bboxIntersection; var rectangle = rectangleIntersection; var boundary = boundaryIntersection; @@ -20878,25 +20994,44 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var ref$1 = this; var model = ref$1.model; var attributes = model.attributes; + var updateLabels = this.hasFlag(flags, 'LABELS'); + var updateTools = this.hasFlag(flags, 'TOOLS'); + + if (updateLabels) { + this.onLabelsChange(model, attributes.labels, opt); + flags = this.removeFlag(flags, 'LABELS'); + } + + if (updateTools) { + this.renderTools(); + flags = this.removeFlag(flags, 'TOOLS'); + } if (this.hasFlag(flags, 'UPDATE')) { this.update(model, null, opt); flags = this.removeFlag(flags, 'UPDATE'); + updateLabels = false; + updateTools = false; } - if (this.hasFlag(flags, 'LABELS')) { - this.onLabelsChange(model, attributes.labels, opt); - flags = this.removeFlag(flags, 'LABELS'); + if (updateLabels) { + this.updateLabelPositions(); } - if (this.hasFlag(flags, 'TOOLS')) { - this.renderTools().updateToolsPosition(); - flags = this.removeFlag(flags, 'TOOLS'); + if (updateTools) { + this.updateToolsPosition(); } return flags; }, + requestConnectionUpdate: function(opt) { + var ref = this; + var paper = ref.paper; + var UPDATE_PRIORITY = ref.UPDATE_PRIORITY; + if (paper) { paper.requestViewUpdate(this, this.getFlag('UPDATE'), UPDATE_PRIORITY, opt); } + }, + isLabelsRenderRequired: function(opt) { if ( opt === void 0 ) opt = {}; @@ -20937,8 +21072,6 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. } else { this.updateLabels(); } - - this.updateLabelPositions(); }, // Rendering. @@ -21364,6 +21497,17 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. } }, + getEndConnectionPoint: function(type) { + switch (type) { + case 'source': + return new Point(this.sourcePoint); + case 'target': + return new Point(this.targetPoint); + default: + throw new Error('dia.LinkView: type parameter required.'); + } + }, + getEndMagnet: function(type) { switch (type) { case 'source': @@ -21676,11 +21820,13 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var defaultPosition = merge({}, builtinDefaultLabelPosition, defaultLabelPosition); for (var idx = 0, n = labels.length; idx < n; idx++) { + var labelNode = this._labelCache[idx]; + if (!labelNode) { continue; } var label = labels[idx]; var labelPosition = this._normalizeLabelPosition(label.position); var position = merge({}, defaultPosition, labelPosition); var transformationMatrix = this._getLabelTransformationMatrix(position); - this._labelCache[idx].setAttribute('transform', V.matrixToTransformString(transformationMatrix)); + labelNode.setAttribute('transform', V.matrixToTransformString(transformationMatrix)); } return this; @@ -22495,6 +22641,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. } this.notifyPointerdown(evt, x, y); + this.paper.delegateDragEvents(this, evt.data); } else { CellView.prototype.onevent.apply(this, arguments); @@ -22615,15 +22762,13 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. dragArrowhead: function(evt, x, y) { - var data = this.eventData(evt); - if (this.paper.options.snapLinks) { - this._snapArrowhead(x, y, data); + this._snapArrowhead(evt, x, y); } else { - this._connectArrowhead(this.getEventTarget(evt), x, y, data); + this._connectArrowhead(this.getEventTarget(evt), x, y, this.eventData(evt)); } }, @@ -22714,8 +22859,9 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. } }, - _snapArrowhead: function(x, y, data) { + _snapArrowhead: function(evt, x, y) { + var data = this.eventData(evt); // checking view in close area of the pointer var r = this.paper.options.snapLinks.radius || 50; @@ -22726,53 +22872,43 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. data.closestView = data.closestMagnet = null; - var distance; var minDistance = Number.MAX_VALUE; - var pointer = Point(x, y); + var pointer = new Point(x, y); var paper = this.paper; viewsInArea.forEach(function(view) { - + var candidates = []; // skip connecting to the element in case '.': { magnet: false } attribute present if (view.el.getAttribute('magnet') !== 'false') { - - // find distance from the center of the model to pointer coordinates - distance = view.model.getBBox().center().distance(pointer); - - // the connection is looked up in a circle area by `distance < r` - if (distance < r && distance < minDistance) { - - if (prevClosestMagnet === view.el || paper.options.validateConnection.apply( - paper, data.validateConnectionArgs(view, null) - )) { - minDistance = distance; - data.closestView = view; - data.closestMagnet = view.el; - } - } + candidates.push({ + bbox: view.model.getBBox(), + magnet: view.el + }); } - view.$('[magnet]').each(function(index, magnet) { - - var bbox = view.getNodeBBox(magnet); - - distance = pointer.distance({ - x: bbox.x + bbox.width / 2, - y: bbox.y + bbox.height / 2 + view.$('[magnet]').toArray().forEach(function (magnet) { + candidates.push({ + bbox: view.getNodeBBox(magnet), + magnet: magnet }); + }); - if (distance < r && distance < minDistance) { - - if (prevClosestMagnet === magnet || paper.options.validateConnection.apply( - paper, data.validateConnectionArgs(view, magnet) + candidates.forEach(function (candidate) { + var magnet = candidate.magnet; + var bbox = candidate.bbox; + // find distance from the center of the model to pointer coordinates + var distance = bbox.center().squaredDistance(pointer); + // the connection is looked up in a circle area by `distance < r` + if (distance < minDistance) { + if (prevClosestMagnet === view.el || paper.options.validateConnection.apply( + paper, data.validateConnectionArgs(view, (view.el === magnet) ? null : magnet) )) { minDistance = distance; data.closestView = view; data.closestMagnet = magnet; } } - - }.bind(this)); + }); }, this); @@ -22799,10 +22935,19 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. end = closestView.getLinkEnd(closestMagnet, x, y, this.model, endType); } else { + + end = { x: x, y: y }; } this.model.set(endType, end || { x: x, y: y }, { ui: true }); + + if (prevClosestView) { + this.notify('link:snap:disconnect', evt, prevClosestView, prevClosestMagnet, endType); + } + if (closestView) { + this.notify('link:snap:connect', evt, closestView, closestMagnet, endType); + } }, _snapArrowheadEnd: function(data) { @@ -23077,12 +23222,30 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. EXACT: 'sorting-exact' }; - var FLAG_INSERT = 1<<30; - var FLAG_REMOVE = 1<<29; - var MOUNT_BATCH_SIZE = 1000; var UPDATE_BATCH_SIZE = Infinity; - var MIN_PRIORITY = 2; + var MIN_PRIORITY = 9007199254740991; // Number.MAX_SAFE_INTEGER + + var defaultHighlighting = { + 'default': { + name: 'stroke', + options: { + padding: 3 + } + }, + magnetAvailability: { + name: 'addClass', + options: { + className: 'available-magnet' + } + }, + elementAvailability: { + name: 'addClass', + options: { + className: 'available-cell' + } + } + }; var Paper = View.extend({ @@ -23118,26 +23281,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return false; }, - highlighting: { - 'default': { - name: 'stroke', - options: { - padding: 3 - } - }, - magnetAvailability: { - name: 'addClass', - options: { - className: 'available-magnet' - } - }, - elementAvailability: { - name: 'addClass', - options: { - className: 'available-cell' - } - } - }, + highlighting: defaultHighlighting, // Prevent the default context menu from being displayed. preventContextMenu: true, @@ -23193,7 +23337,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. // Check whether to allow or disallow the link connection while an arrowhead end (source/target) // being changed. - validateConnection: function(cellViewS, magnetS, cellViewT, magnetT, end, linkView) { + validateConnection: function(cellViewS, _magnetS, cellViewT, _magnetT, end, _linkView) { return (end === 'target' ? cellViewT : cellViewS) instanceof ElementView; }, @@ -23248,15 +23392,21 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. frozen: false, - onViewUpdate: function(view, flag, opt, paper) { - if ((flag & FLAG_INSERT) || opt.mounting) { return; } - paper.requestConnectedLinksUpdate(view, opt); + // no docs yet + onViewUpdate: function(view, flag, priority, opt, paper) { + if ((flag & view.FLAG_INSERT) || opt.mounting) { return; } + paper.requestConnectedLinksUpdate(view, priority, opt); }, - onViewPostponed: function(view, flag /* paper */) { - return this.forcePostponedViewUpdate(view, flag); + // no docs yet + onViewPostponed: function(view, flag, paper) { + return paper.forcePostponedViewUpdate(view, flag); }, + beforeRender: null, // function(opt, paper) { }, + + afterRender: null, // function(stats, opt, paper) { + viewport: null, // Default namespaces @@ -23403,14 +23553,14 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. onCellRemoved: function(cell, _, opt) { var view = this.findViewByModel(cell); - if (view) { this.requestViewUpdate(view, FLAG_REMOVE, view.UPDATE_PRIORITY, opt); } + if (view) { this.requestViewUpdate(view, view.FLAG_REMOVE, view.UPDATE_PRIORITY, opt); } }, onCellChange: function(cell, opt) { if (cell === this.model.attributes.cells) { return; } if (cell.hasChanged('z') && this.options.sorting === sortingTypes.APPROX) { var view = this.findViewByModel(cell); - if (view) { this.requestViewUpdate(view, FLAG_INSERT, view.UPDATE_PRIORITY, opt); } + if (view) { this.requestViewUpdate(view, view.FLAG_INSERT, view.UPDATE_PRIORITY, opt); } } }, @@ -23442,26 +23592,48 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. cloneOptions: function() { - var options = this.options; - - // This is a fix for the case where two papers share the same options. - // Changing origin.x for one paper would change the value of origin.x for the other. - // This prevents that behavior. - options.origin = assign({}, options.origin); - options.defaultConnector = assign({}, options.defaultConnector); - // Return the default highlighting options into the user specified options. - options.highlighting = defaultsDeep( - {}, - options.highlighting, - this.constructor.prototype.options.highlighting - ); + var ref = this; + var options = ref.options; + var defaultConnector = options.defaultConnector; + var defaultRouter = options.defaultRouter; + var defaultConnectionPoint = options.defaultConnectionPoint; + var defaultAnchor = options.defaultAnchor; + var defaultLinkAnchor = options.defaultLinkAnchor; + var origin = options.origin; + var highlighting = options.highlighting; + var cellViewNamespace = options.cellViewNamespace; + var interactive = options.interactive; // Default cellView namespace for ES5 /* global joint: true */ - if (!options.cellViewNamespace && typeof joint !== 'undefined' && has(joint, 'shapes')) { + if (!cellViewNamespace && typeof joint !== 'undefined' && has(joint, 'shapes')) { options.cellViewNamespace = joint.shapes; } /* global joint: false */ + + // Here if a function was provided, we can not clone it, as this would result in loosing the function. + // If the default is used, the cloning is necessary in order to prevent modifying the options on prototype. + if (!isFunction(defaultConnector)) { + options.defaultConnector = cloneDeep(defaultConnector); + } + if (!isFunction(defaultRouter)) { + options.defaultRouter = cloneDeep(defaultRouter); + } + if (!isFunction(defaultConnectionPoint)) { + options.defaultConnectionPoint = cloneDeep(defaultConnectionPoint); + } + if (!isFunction(defaultAnchor)) { + options.defaultAnchor = cloneDeep(defaultAnchor); + } + if (!isFunction(defaultLinkAnchor)) { + options.defaultLinkAnchor = cloneDeep(defaultLinkAnchor); + } + if (isPlainObject(interactive)) { + options.interactive = assign({}, interactive); + } + options.origin = assign({}, origin); + // Return the default highlighting options into the user specified options. + options.highlighting = defaultsDeep({}, highlighting, defaultHighlighting); }, children: function() { @@ -23599,7 +23771,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return V.createSVGMatrix(this.cells.getScreenCTM()); }, - requestConnectedLinksUpdate: function(view, opt) { + requestConnectedLinksUpdate: function(view, priority, opt) { if (view instanceof CellView) { var model = view.model; var links = this.model.getConnectedLinks(model); @@ -23610,7 +23782,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var flagLabels = ['UPDATE']; if (link.getTargetCell() === model) { flagLabels.push('TARGET'); } if (link.getSourceCell() === model) { flagLabels.push('SOURCE'); } - this.scheduleViewUpdate(linkView, linkView.getFlag(flagLabels), linkView.UPDATE_PRIORITY, opt); + var nextPriority = Math.max(priority + 1, linkView.UPDATE_PRIORITY); + this.scheduleViewUpdate(linkView, linkView.getFlag(flagLabels), nextPriority, opt); } } }, @@ -23635,7 +23808,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. view.updateEndMagnet('target'); } if (sourceFlag === 0 && targetFlag === 0) { - return !!this.dumpView(view); + // If leftover flag is 0, all view updates were done. + return !this.dumpView(view); } } return false; @@ -23648,27 +23822,47 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. if (this.isFrozen() || (isAsync && opt.async !== false)) { return; } if (this.model.hasActiveBatch(this.UPDATE_DELAYING_BATCHES)) { return; } var stats = this.updateViews(opt); - if (isAsync) { this.trigger('render:done', stats, opt); } + if (isAsync) { this.notifyAfterRender(stats, opt); } }, scheduleViewUpdate: function(view, type, priority, opt) { - var updates = this._updates; + var ref = this; + var updates = ref._updates; + var options = ref.options; + var FLAG_REMOVE = view.FLAG_REMOVE; + var FLAG_INSERT = view.FLAG_INSERT; + var UPDATE_PRIORITY = view.UPDATE_PRIORITY; + var cid = view.cid; var priorityUpdates = updates.priorities[priority]; if (!priorityUpdates) { priorityUpdates = updates.priorities[priority] = {}; } - var currentType = priorityUpdates[view.cid] || 0; - // prevent cycling + // Move higher priority updates to this priority + if (priority > UPDATE_PRIORITY) { + // Not the default priority for this view. It's most likely a link view + // connected to another link view, which triggered the update. + // TODO: If there is an update scheduled with a lower priority already, we should + // change the requested priority to the lowest one. Does not seem to be critical + // right now, as it "only" results in multiple updates on the same view. + for (var i = priority - 1; i >= UPDATE_PRIORITY; i--) { + var prevPriorityUpdates = updates.priorities[i]; + if (!prevPriorityUpdates || !(cid in prevPriorityUpdates)) { continue; } + priorityUpdates[cid] |= prevPriorityUpdates[cid]; + delete prevPriorityUpdates[cid]; + } + } + var currentType = priorityUpdates[cid] || 0; + // Prevent cycling if ((currentType & type) === type) { return; } if (!currentType) { updates.count++; } if (type & FLAG_REMOVE && currentType & FLAG_INSERT) { // When a view is removed we need to remove the insert flag as this is a reinsert - priorityUpdates[view.cid] ^= FLAG_INSERT; + priorityUpdates[cid] ^= FLAG_INSERT; } else if (type & FLAG_INSERT && currentType & FLAG_REMOVE) { // When a view is added we need to remove the remove flag as this is view was previously removed - priorityUpdates[view.cid] ^= FLAG_REMOVE; + priorityUpdates[cid] ^= FLAG_REMOVE; } - priorityUpdates[view.cid] |= type; - var viewUpdateFn = this.options.onViewUpdate; - if (typeof viewUpdateFn === 'function') { viewUpdateFn.call(this, view, type, opt || {}, this); } + priorityUpdates[cid] |= type; + var viewUpdateFn = options.onViewUpdate; + if (typeof viewUpdateFn === 'function') { viewUpdateFn.call(this, view, type, priority, opt || {}, this); } }, dumpViewUpdate: function(view) { @@ -23689,9 +23883,12 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. updateView: function(view, flag, opt) { if (!view) { return 0; } + var FLAG_REMOVE = view.FLAG_REMOVE; + var FLAG_INSERT = view.FLAG_INSERT; + var model = view.model; if (view instanceof CellView) { if (flag & FLAG_REMOVE) { - this.removeView(view.model); + this.removeView(model); return 0; } if (flag & FLAG_INSERT) { @@ -23714,7 +23911,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var cid = view.cid; var updates = this._updates; if (cid in updates.unmounted) { return 0; } - var flag = updates.unmounted[cid] |= FLAG_INSERT; + var flag = updates.unmounted[cid] |= view.FLAG_INSERT; updates.unmountedCids.push(cid); delete updates.mounted[cid]; return flag; @@ -23744,18 +23941,33 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. this.updateViews(passingOpt); }, + // Synchronous views update updateViews: function(opt) { - var stats; + this.notifyBeforeRender(opt); + var batchStats; var updateCount = 0; var batchCount = 0; var priority = MIN_PRIORITY; do { batchCount++; - stats = this.updateViewsBatch(opt); - updateCount += stats.updated; - priority = Math.min(stats.priority, priority); - } while (!stats.empty); - return { updated: updateCount, batches: batchCount, priority: priority }; + batchStats = this.updateViewsBatch(opt); + updateCount += batchStats.updated; + priority = Math.min(batchStats.priority, priority); + } while (!batchStats.empty); + var stats = { updated: updateCount, batches: batchCount, priority: priority }; + this.notifyAfterRender(stats, opt); + return stats; + }, + + hasScheduledUpdates: function() { + var priorities = this._updates.priorities; + var priorityIndexes = Object.keys(priorities); // convert priorities to a dense array + var i = priorityIndexes.length; + while (i > 0 && i--) { + // a faster way how to check if an object is empty + for (var _key in priorities[priorityIndexes[i]]) { return true; } + } + return false; }, updateViewsAsync: function(opt, data) { @@ -23765,6 +23977,9 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var id = updates.id; if (id) { cancelFrame(id); + if (data.processed === 0 && this.hasScheduledUpdates()) { + this.notifyBeforeRender(opt); + } var stats = this.updateViewsBatch(opt); var passingOpt = defaults({}, opt, { mountBatchSize: MOUNT_BATCH_SIZE - stats.mounted, @@ -23784,7 +23999,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. stats.unmounted += unmountCount; stats.mounted += mountCount; stats.priority = data.priority; - this.trigger('render:done', stats, opt); + this.notifyAfterRender(stats, opt); data.processed = 0; updates.count = 0; } else { @@ -23802,6 +24017,30 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. updates.id = nextFrame(this.updateViewsAsync, this, opt, data); }, + notifyBeforeRender: function(opt) { + if ( opt === void 0 ) opt = {}; + + var beforeFn = opt.beforeRender; + if (typeof beforeFn !== 'function') { + beforeFn = this.options.beforeRender; + if (typeof beforeFn !== 'function') { return; } + } + beforeFn.call(this, opt, this); + }, + + notifyAfterRender: function(stats, opt) { + if ( opt === void 0 ) opt = {}; + + var afterFn = opt.afterRender; + if (typeof afterFn !== 'function') { + afterFn = this.options.afterRender; + } + if (typeof afterFn === 'function') { + afterFn.call(this, stats, opt, this); + } + this.trigger('render:done', stats, opt); + }, + updateViewsBatch: function(opt) { opt || (opt = {}); var batchSize = opt.batchSize || UPDATE_BATCH_SIZE; @@ -23818,7 +24057,9 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. if (typeof viewportFn !== 'function') { viewportFn = null; } var postponeViewFn = options.onViewPostponed; if (typeof postponeViewFn !== 'function') { postponeViewFn = null; } - main: for (var priority = 0, n = priorities.length; priority < n; priority++) { + var priorityIndexes = Object.keys(priorities); // convert priorities to a dense array + main: for (var i = 0, n = priorityIndexes.length; i < n; i++) { + var priority = priorityIndexes[i]; var priorityUpdates = priorities[priority]; for (var cid in priorityUpdates) { if (updateCount >= batchSize) { @@ -23832,10 +24073,10 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. continue; } var currentFlag = priorityUpdates[cid]; - if ((currentFlag & FLAG_REMOVE) === 0) { + if ((currentFlag & view.FLAG_REMOVE) === 0) { // We should never check a view for viewport if we are about to remove the view var isDetached = cid in updates.unmounted; - if (viewportFn && !viewportFn.call(this, view, isDetached, this)) { + if (view.DETACHABLE && viewportFn && !viewportFn.call(this, view, !isDetached, this)) { // Unmount View if (!isDetached) { this.registerUnmountedView(view); @@ -23848,7 +24089,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. } // Mount View if (isDetached) { - currentFlag |= FLAG_INSERT; + currentFlag |= view.FLAG_INSERT; mountCount++; } currentFlag |= this.registerMountedView(view); @@ -23913,7 +24154,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. if (!(cid in unmounted)) { continue; } var view = views[cid]; if (!view) { continue; } - if (viewportFn && !viewportFn.call(this, view, false, this)) { + if (view.DETACHABLE && viewportFn && !viewportFn.call(this, view, false, this)) { // Push at the end of all unmounted ids, so this can be check later again unmountedCids.push(cid); continue; @@ -23940,7 +24181,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. if (!(cid in mounted)) { continue; } var view = views[cid]; if (!view) { continue; } - if (viewportFn.call(this, view, true, this)) { + if (!view.DETACHABLE || viewportFn.call(this, view, true, this)) { // Push at the end of all mounted ids, so this can be check later again mountedCids.push(cid); continue; @@ -24175,7 +24416,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. //fittingBBox }); - var padding = opt.padding; + var padding = normalizeSides(opt.padding); var minScaleX = opt.minScaleX || opt.minScale; var maxScaleX = opt.maxScaleX || opt.maxScale; @@ -24196,7 +24437,12 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. }; } - fittingBBox = new Rect(fittingBBox).inflate(-padding); + fittingBBox = new Rect(fittingBBox).moveAndExpand({ + x: padding.left, + y: padding.top, + width: -padding.left - padding.right, + height: -padding.top - padding.bottom + }); var currentScale = this.scale(); @@ -24244,7 +24490,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return this.localToPaperRect(this.getContentArea(opt)); }, - // Returns a geometry rectangle represeting the entire + // Returns a geometry rectangle representing the entire // paper area (coordinates from the left paper border to the right one // and the top border to the bottom one). getArea: function() { @@ -24335,7 +24581,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var view, flag; if (id in views) { view = views[id]; - flag = FLAG_INSERT; + flag = view.FLAG_INSERT; } else { view = views[cell.id] = this.createViewForModel(cell); view.paper = this; @@ -25417,7 +25663,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. backgroundSize.width *= canvas.width / img.width; backgroundSize.height *= canvas.height / img.height; } else if (backgroundSize === undefined) { - // calcule the tile size if no provided + // calculate the tile size if no provided opt.size = { width: canvas.width / backgroundQuality, height: canvas.height / backgroundQuality @@ -25974,12 +26220,12 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var index$3 = ({ - ElementView: ElementView, Graph: Graph, + attributes: attributes, Cell: Cell, CellView: CellView, Element: Element$1, - attributes: attributes, + ElementView: ElementView, Link: Link, LinkView: LinkView, Paper: Paper, @@ -26359,7 +26605,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. redundancyRemoval: true, anchor: getAnchor, snapRadius: 10, - snapHandle: true + snapHandle: true, + stopPropagation: true }, handles: null, onRender: function() { @@ -26448,6 +26695,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. onHandleChanging: function(handle, evt) { + var ref = this; + var options = ref.options; var data = this.eventData(evt); var relatedView = this.relatedView; var paper = relatedView.paper; @@ -26547,34 +26796,46 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. link.vertices(vertices, { ui: true, tool: this.cid }); this.updateHandle(handle, vertex, nextVertex, offset); + if (!options.stopPropagation) { relatedView.notifyPointermove(normalizedEvent, coords.x, coords.y); } }, onHandleChangeStart: function(handle, evt) { + var ref = this; + var options = ref.options; + var handles = ref.handles; + var linkView = ref.relatedView; + var model = linkView.model; + var paper = linkView.paper; var index$1 = handle.options.index; - var handles = this.handles; if (!Array.isArray(handles)) { return; } for (var i = 0, n = handles.length; i < n; i++) { if (i !== index$1) { handles[i].hide(); } } this.focus(); - var relatedView = this.relatedView; - var relatedModel = relatedView.model; this.eventData(evt, { - sourceAnchor: relatedView.sourceAnchor.clone(), - targetAnchor: relatedView.targetAnchor.clone(), - sourceAnchorDef: clone(relatedModel.prop(['source', 'anchor'])), - targetAnchorDef: clone(relatedModel.prop(['target', 'anchor'])) + sourceAnchor: linkView.sourceAnchor.clone(), + targetAnchor: linkView.targetAnchor.clone(), + sourceAnchorDef: clone(model.prop(['source', 'anchor'])), + targetAnchorDef: clone(model.prop(['target', 'anchor'])) }); - relatedView.model.startBatch('segment-move', { ui: true, tool: this.cid }); + model.startBatch('segment-move', { ui: true, tool: this.cid }); + if (!options.stopPropagation) { linkView.notifyPointerdown.apply(linkView, paper.getPointerArgs(evt)); } }, onHandleChangeEnd: function(_handle, evt) { - var linkView = this.relatedView; - if (this.options.redundancyRemoval) { + var ref= this; + var options = ref.options; + var linkView = ref.relatedView; + var paper = linkView.paper; + var model = linkView.model; + if (options.redundancyRemoval) { linkView.removeRedundantLinearVertices({ ui: true, tool: this.cid }); } + var normalizedEvent = normalizeEvent(evt); + var coords = paper.snapToGrid(normalizedEvent.clientX, normalizedEvent.clientY); this.render(); this.blur(); - linkView.model.stopBatch('segment-move', { ui: true, tool: this.cid }); - linkView.checkMouseleave(normalizeEvent(evt)); + model.stopBatch('segment-move', { ui: true, tool: this.cid }); + if (!options.stopPropagation) { linkView.notifyPointerup(normalizedEvent, coords.x, coords.y); } + linkView.checkMouseleave(normalizedEvent); }, updateHandle: function(handle, vertex, nextVertex, offset) { var vertical = Math.abs(vertex.x - nextVertex.x) < this.precision; @@ -26903,6 +27164,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. options: { snap: snapAnchor, anchor: getAnchor, + resetAnchor: true, customAnchorAttributes: { 'stroke-width': 4, 'stroke': '#33334F', @@ -27067,7 +27329,10 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. }, onPointerDblClick: function() { - this.resetAnchor(); + var anchor = this.options.resetAnchor; + if (anchor === false) { return; } // reset anchor disabled + if (anchor === true) { anchor = null; } // remove the current anchor + this.resetAnchor(cloneDeep(anchor)); this.update(); } }); @@ -27102,7 +27367,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. Boundary: Boundary }); - var version = "3.1.1"; + var version = "3.2.0"; var Vectorizer = V; var layout = { PortLabel: PortLabel, Port: Port }; diff --git a/dist/joint.core.min.css b/dist/joint.core.min.css index 25324cf80..367a924e5 100644 --- a/dist/joint.core.min.css +++ b/dist/joint.core.min.css @@ -1,4 +1,4 @@ -/*! JointJS v3.1.1 (2019-10-28) - JavaScript diagramming library +/*! JointJS v3.2.0 (2020-06-04) - JavaScript diagramming library This Source Code Form is subject to the terms of the Mozilla Public diff --git a/dist/joint.core.min.js b/dist/joint.core.min.js index 5b07ef464..41c912581 100644 --- a/dist/joint.core.min.js +++ b/dist/joint.core.min.js @@ -1,8 +1,8 @@ -/*! JointJS v3.1.1 (2019-10-28) - JavaScript diagramming library +/*! JointJS v3.2.0 (2020-06-04) - JavaScript diagramming library This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -if(function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("backbone"),require("lodash"),require("jquery")):"function"==typeof define&&define.amd?define(["exports","backbone","lodash","jquery"],e):e((t=t||self).joint={},t.Backbone,t._,t.$)}(this,function(e,s,n,C){"use strict";var i,h,r,l;s=s&&s.hasOwnProperty("default")?s.default:s,n=n&&n.hasOwnProperty("default")?n.default:n,C=C&&C.hasOwnProperty("default")?C.default:C,Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(t,e){if(null==this)throw new TypeError('"this" is null or not defined');var n=Object(this),i=n.length>>>0;if(0===i)return!1;var r,o,s=0|e,a=Math.max(0<=s?s:i-Math.abs(s),0);for(;a>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r>8-r%1*8)){if(255<(n=i.charCodeAt(r+=.75)))throw new h("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");e=e<<8|n}return s}),t.atob||(t.atob=function(t){var e=String(t).replace(/=+$/,"");if(e.length%4==1)throw new h("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,i,r=0,o=0,s="";i=e.charAt(o++);~i&&(n=r%4?64*n+i:i,r++%4)?s+=String.fromCharCode(255&n>>(-2*r&6)):0)i=a.indexOf(i);return s})}(),Number.isFinite=Number.isFinite||function(t){return"number"==typeof t&&isFinite(t)},Number.isNaN=Number.isNaN||function(t){return t!=t},String.prototype.includes||(String.prototype.includes=function(t,e){return"number"!=typeof e&&(e=0),!(e+t.length>this.length)&&-1!==this.indexOf(t,e)}),String.prototype.startsWith||(String.prototype.startsWith=function(t,e){return this.substr(e||0,t.length)===t}),function(){function i(t,e){return this.slice(t,e)}function r(t,e){arguments.length<2&&(e=0);for(var n=0,i=t.length;na.x+o/2,c=ia.x?r-30:r+30)-l)/(s*s*(i-h))+h:e=s*s/(r-l)-s*s*(i-h)*((n=r>a.y?i+30:i-30)-h)/(o*o*(r-l))+l,new z(n,e).theta(t)},toString:function(){return new z(this.x,this.y).toString()+" "+this.a+" "+this.b}};var O=function(t,e){return this instanceof O?t instanceof O?new O(t.start,t.end):(this.start=new z(t),void(this.end=new z(e))):new O(t,e)};O.prototype={angle:function(){var t=new z(this.start.x+1,this.start.y);return this.start.angleBetween(this.end,t)},bbox:function(){var t=B(this.start.x,this.end.x),e=B(this.start.y,this.end.y),n=R(this.start.x,this.end.x),i=R(this.start.y,this.end.y);return new X(t,e,n-t,i-e)},bearing:function(){var t=A(this.start.y),e=A(this.end.y),n=this.start.x,i=this.end.x,r=A(i-n),o=c(r)*u(e),s=u(t)*c(e)-c(t)*u(e)*u(r),a=y(d(o,s))-22.5;return a<0&&(a+=360),["NE","E","SE","S","SW","W","NW","N"][a=parseInt(a/45)]},clone:function(){return new O(this.start,this.end)},closestPoint:function(t){return this.pointAt(this.closestPointNormalizedLength(t))},closestPointLength:function(t){return this.closestPointNormalizedLength(t)*this.length()},closestPointNormalizedLength:function(t){var e=this.vector().dot(new O(this.start,t).vector()),n=B(1,R(0,e/this.squaredLength()));return n!=n?0:n},closestPointTangent:function(t){return this.tangentAt(this.closestPointNormalizedLength(t))},containsPoint:function(t){var e=this.start,n=this.end;if(0!==e.cross(t,n))return!1;var i=this.length();return!(new O(e,t).length()>i)&&!(new O(t,n).length()>i)},divideAt:function(t){var e=this.pointAt(t);return[new O(this.start,e),new O(e,this.end)]},divideAtLength:function(t){var e=this.pointAtLength(t);return[new O(this.start,e),new O(e,this.end)]},equals:function(t){return!!t&&this.start.x===t.start.x&&this.start.y===t.start.y&&this.end.x===t.end.x&&this.end.y===t.end.y},intersect:function(t,e){if(t instanceof O||t instanceof X||t instanceof L||t instanceof x||t instanceof D){var n=t.intersectionWithLine(this,e);return n&&t instanceof O&&(n=n[0]),n}return null},intersectionWithLine:function(t){var e=new z(this.end.x-this.start.x,this.end.y-this.start.y),n=new z(t.end.x-t.start.x,t.end.y-t.start.y),i=e.x*n.y-e.y*n.x,r=new z(t.start.x-this.start.x,t.start.y-this.start.y),o=r.x*n.y-r.y*n.x,s=r.x*e.y-r.y*e.x;if(0===i||o*i<0||s*i<0)return null;if(0l.y||r>h.y&&r<=l.y){var c=h.x-i>l.x-i?h.x-i:l.x-i;if(0<=c){var d=new z(i+c,r),f=new O(t,d);u.intersect(f)&&a++}}o=s}return a%2==1},convexHull:function(){var t,e,n,i=this.points,r=i.length;if(0===r)return new L;for(t=0;tn.x&&(n=i[t]);var o=[];for(t=0;t=this.x&&t.x<=this.x+this.width&&t.y>=this.y&&t.y<=this.y+this.height},containsRect:function(t){var e=new X(this).normalize(),n=new X(t).normalize(),i=e.width,r=e.height,o=n.width,s=n.height;if(!(i&&r&&o&&s))return!1;var a=e.x,h=e.y,l=n.x,u=n.y;return o+=l,i+=a,s+=u,r+=h,a<=l&&o<=i&&h<=u&&s<=r},corner:function(){return new z(this.x+this.width,this.y+this.height)},equals:function(t){var e=new X(this).normalize(),n=new X(t).normalize();return e.x===n.x&&e.y===n.y&&e.width===n.width&&e.height===n.height},inflate:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.x-=t,this.y-=e,this.width+=2*t,this.height+=2*e,this},intersect:function(t){var e=this.origin(),n=this.corner(),i=t.origin(),r=t.corner();if(r.x<=e.x||r.y<=e.y||i.x>=n.x||i.y>=n.y)return null;var o=R(e.x,i.x),s=R(e.y,i.y);return new X(o,s,B(n.x,r.x)-o,B(n.y,r.y)-s)},intersectionWithLine:function(t){var e,n,i=[this.topLine(),this.rightLine(),this.bottomLine(),this.leftLine()],r=[],o=[],s=i.length;for(n=0;nu&&(i=(this.x+this.width-u)/(f.x-u)),f.y>c&&(a=(this.y+this.height-c)/(f.y-c));var p=t.topRight();p.x>u&&(r=(this.x+this.width-u)/(p.x-u)),p.yc&&(l=(this.y+this.height-c)/(g.y-c)),{sx:B(n,i,r,o),sy:B(s,a,h,l)}},maxRectUniformScaleToFit:function(t,e){var n=this.maxRectScaleToFit(t,e);return B(n.sx,n.sy)},moveAndExpand:function(t){return this.x+=t.x||0,this.y+=t.y||0,this.width+=t.width||0,this.height+=t.height||0,this},normalize:function(){var t=this.x,e=this.y,n=this.width,i=this.height;return this.width<0&&(t=this.x+this.width,n=-this.width),this.height<0&&(e=this.y+this.height,i=-this.height),this.x=t,this.y=e,this.width=n,this.height=i,this},offset:function(t,e){return z.prototype.offset.call(this,t,e)},origin:function(){return new z(this.x,this.y)},pointNearestToPoint:function(t){if(t=new z(t),this.containsPoint(t))switch(this.sideNearestToPoint(t)){case"right":return new z(this.x+this.width,t.y);case"left":return new z(this.x,t.y);case"bottom":return new z(t.x,this.y+this.height);case"top":return new z(t.x,this.y)}return t.adhereToRect(this)},rightLine:function(){return new O(this.topRight(),this.bottomRight())},rightMiddle:function(){return new z(this.x+this.width,this.y+this.height/2)},round:function(t){var e=T(10,t||0);return this.x=a(this.x*e)/e,this.y=a(this.y*e)/e,this.width=a(this.width*e)/e,this.height=a(this.height*e)/e,this},scale:function(t,e,n){return n=this.origin().scale(t,e,n),this.x=n.x,this.y=n.y,this.width*=t,this.height*=e,this},sideNearestToPoint:function(t){var e=(t=new z(t)).x-this.x,n=this.x+this.width-t.x,i=t.y-this.y,r=e,o="left";return n'+t+"";return N.parseXML(e,{async:!1}).documentElement}var n=document.createElementNS(M.svg,"svg");return n.setAttributeNS(M.xmlns,"xmlns:xlink",M.xlink),n.setAttribute("version","1.1"),n},N.idCounter=0,N.uniqueId=function(){return"v-"+ ++N.idCounter},N.toNode=function(t){return N.isV(t)?t.node:t.nodeName&&t||t[0]},N.ensureId=function(t){return(t=N.toNode(t)).id||(t.id=N.uniqueId())},N.sanitizeText=function(t){return(t||"").replace(/ /g," ")},N.isUndefined=function(t){return void 0===t},N.isString=function(t){return"string"==typeof t},N.isObject=function(t){return t&&"object"==typeof t},N.isArray=Array.isArray,N.parseXML=function(t,e){var n;e=e||{};try{var i=new DOMParser;N.isUndefined(e.async)||(i.async=e.async),n=i.parseFromString(t,"text/xml")}catch(t){n=void 0}if(!n||n.getElementsByTagName("parsererror").length)throw new Error("Invalid XML: "+t);return n},N.qualifyAttr=function(t){if(-1===t.indexOf(":"))return{ns:null,local:t};var e=t.split(":");return{ns:M[e[0]],local:e[1]}},N.transformRegex=/(\w+)\(([^,)]+),?([^)]+)?\)/gi,N.transformSeparatorRegex=/[ ,]+/,N.transformationListRegex=/^(\w+)\((.*)\)/,N.transformStringToMatrix=function(t){var e=N.createSVGMatrix(),n=t&&t.match(N.transformRegex);if(!n)return e;for(var i=0,r=n.length;i=t.start&&et.start&&n<=t.end||t.start>=e&&t.end=e?t.end+=n:t.start>=e&&(t.start+=n,t.end+=n)}),t},N.convertLineToPathData=function(t){return["M",(t=N(t)).attr("x1"),t.attr("y1"),"L",t.attr("x2"),t.attr("y2")].join(" ")},N.convertPolygonToPathData=function(t){var e=N.getPointsFromSvgNode(t);return 0===e.length?null:N.svgPointsToPath(e)+" Z"},N.convertPolylineToPathData=function(t){var e=N.getPointsFromSvgNode(t);return 0===e.length?null:N.svgPointsToPath(e)},N.svgPointsToPath=function(t){for(var e=0,n=t.length;e=o[r]&&(s.push([e].concat(i.splice(0,o[r]))),o[r]););}),s}(t)),!t||!t.length)return[["M",0,0]];for(var e,n=[],i=0,r=0,o=0,s=0,a=t.length,h=0;hd){var E=S,C=h,T=l;p=t(h=x+i*H(S=P+d*(a&&Po){var L=Math.floor(o/d)-1;y.splice(L+1);var M=i.ellipsis;if(!M||L<0)break;"string"!=typeof M&&(M="…");var N,V,F=y[L],_=F.length;do{if(V=F[_],N=F.substring(0,_),V?V.match(f)&&(N+=V):N+="string"==typeof f?f:" ",N+=M,l.data=N,a.getComputedTextLength()<=r){y[L]=N;break}_--}while(0<=_);break}}}}return i.svgDocument?s.removeChild(h):document.body.removeChild(s),y.join(p)},mt=function(t){var e=C(C.parseHTML("
"+t+"
",null,!1));return e.find("*").each(function(){var n=this;C.each(n.attributes,function(){var t=this.name,e=this.value;0!==t.indexOf("on")&&0!==e.indexOf("javascript:")||C(n).removeAttr(t)})}),e.html()},yt=function(t,e){if(window.navigator.msSaveBlob)window.navigator.msSaveBlob(t,e);else{var n=window.URL.createObjectURL(t),i=document.createElement("a");i.href=n,i.download=e,document.body.appendChild(i),i.click(),document.body.removeChild(i),window.URL.revokeObjectURL(n)}},wt=function(t){t=t.replace(/\s/g,"");var e,n=(t=decodeURIComponent(t)).indexOf(","),i=t.slice(0,n),r=i.split(":")[1].split(";")[0],o=t.slice(n+1);e=0<=i.indexOf("base64")?atob(o):unescape(encodeURIComponent(o));for(var s=new Uint8Array(e.length),a=0;a')({color:t.color||"blue",opacity:Number.isFinite(t.opacity)?t.opacity:1,outerRadius:e+n,innerRadius:e})},highlight:function(t){return Et('')({color:t.color||"red",width:Number.isFinite(t.width)?t.width:1,blur:Number.isFinite(t.blur)?t.blur:0,opacity:Number.isFinite(t.opacity)?t.opacity:1})},blur:function(t){var e=Number.isFinite(t.x)?t.x:2;return Et('')({stdDeviation:Number.isFinite(t.y)?[e,t.y]:e})},dropShadow:function(t){var e="SVGFEDropShadowElement"in window?'':'';return Et(e)({dx:t.dx||0,dy:t.dy||0,opacity:Number.isFinite(t.opacity)?t.opacity:1,color:t.color||"black",blur:Number.isFinite(t.blur)?t.blur:4})},grayscale:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return Et('')({a:.2126+.7874*(1-e),b:.7152-.7152*(1-e),c:.0722-.0722*(1-e),d:.2126-.2126*(1-e),e:.7152+.2848*(1-e),f:.0722-.0722*(1-e),g:.2126-.2126*(1-e),h:.0722+.9278*(1-e)})},sepia:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return Et('')({a:.393+.607*(1-e),b:.769-.769*(1-e),c:.189-.189*(1-e),d:.349-.349*(1-e),e:.686+.314*(1-e),f:.168-.168*(1-e),g:.272-.272*(1-e),h:.534-.534*(1-e),i:.131+.869*(1-e)})},saturate:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return Et('')({amount:1-e})},hueRotate:function(t){return Et('')({angle:t.angle||0})},invert:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return Et('')({amount:e,amount2:1-e})},brightness:function(t){return Et('')({amount:Number.isFinite(t.amount)?t.amount:1})},contrast:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return Et('')({amount:e,amount2:.5-e/2})}},kt={number:function(t,e,o){o=o||{currency:["$",""],decimal:".",thousands:",",grouping:[3]};var n=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i.exec(t),i=n[1]||" ",r=n[2]||">",s=n[3]||"",a=n[4]||"",h=n[5],l=+n[6],u=n[7],c=n[8],d=n[9],f=1,p="",g="",v=!1;switch(c&&(c=+c.substring(1)),(h||"0"===i&&"="===r)&&(h=i="0",r="=",u&&(l-=Math.floor((l-1)/4))),d){case"n":u=!0,d="g";break;case"%":f=100,g="%",d="f";break;case"p":f=100,g="%",d="r";break;case"b":case"o":case"x":case"X":"#"===a&&(p="0"+d.toLowerCase());break;case"c":case"d":v=!0,c=0;break;case"s":f=-1,d="r"}"$"===a&&(p=o.currency[0],g=o.currency[1]),"r"!=d||c||(d="g"),null!=c&&("g"==d?c=Math.max(1,Math.min(21,c)):"e"!=d&&"f"!=d||(c=Math.max(0,Math.min(20,c))));var m=h&&u;if(v&&e%1)return"";var y=e<0||0===e&&1/e<0?(e=-e,"-"):s,w=g;if(f<0){var b=this.prefix(e,c);e=b.scale(e),w=b.symbol+g}else e*=f;var x=(e=this.convert(d,e,c)).lastIndexOf("."),A=x<0?e:e.substring(0,x),P=x<0?"":o.decimal+e.substring(x+1);function S(t){for(var e=t.length,n=[],i=0,r=o.grouping[0];0"===r?E+y+e:"^"===r?E.substring(0,k>>=1)+y+e+E.substring(k):y+(m?e:E+e))+w},string:function(t,e){for(var n,i="{",r=!1,o=[];-1!==(n=t.indexOf(i));){var s,a,h;if(s=t.slice(0,n),r){h=(a=s.split(":")).shift().split("."),s=e;for(var l=0;l|\$\{ ?([^{} ]+) ?\}|\{\{([^{} ]+)\}\}/g;return function(i){return i=i||{},t.replace(e,function(t){for(var e=Array.from(arguments).slice(1,4).find(function(t){return!!t}).split("."),n=i[e.shift()];void 0!==n&&e.length;)n=n[e.shift()];return void 0!==n?n:""})}},Ct=n.assign,Tt=n.defaults,Lt=Ct,Mt=n.defaultsDeep,Nt=n.assign,Vt=n.defaults,Ft=n.defaultsDeep,_t=n.invokeMap||n.invoke,Bt=n.sortedIndexBy||n.sortedIndex,Rt=n.uniqBy||n.uniq,Ot=n.clone,Dt=n.cloneDeep,zt=n.isEmpty,It=n.isEqual,jt=n.isFunction,Gt=n.isPlainObject,Ut=n.toArray,qt=n.debounce,Ht=n.groupBy,$t=n.sortBy,Yt=n.flattenDeep,Xt=n.without,Wt=n.difference,Zt=n.intersection,Jt=n.union,Kt=n.has,Qt=n.result,te=n.omit,ee=n.pick,ne=n.bindAll,ie=n.forIn,re=n.camelCase,oe=n.uniqueId,se=function(){if(n.mergeWith){var t=Array.from(arguments),e=t[t.length-1],i=jt(e)?e:ce;return t.push(function(t,e){var n=i(t,e);return void 0!==n?n:Array.isArray(t)&&!Array.isArray(e)?e:void 0}),n.mergeWith.apply(this,t)}return n.merge.apply(this,arguments)},ae=function(t){var e=Object.prototype.toString;return!0===t||!1===t||!!t&&"object"==typeof t&&"[object Boolean]"===e.call(t)},he=function(t){return!!t&&("object"==typeof t||"function"==typeof t)},le=function(t){var e=Object.prototype.toString;return"number"==typeof t||!!t&&"object"==typeof t&&"[object Number]"===e.call(t)},ue=function(t){var e=Object.prototype.toString;return"string"==typeof t||!!t&&"object"==typeof t&&"[object String]"===e.call(t)},ce=function(){};function de(t){t=Rt(t);var s=Ut(t).reduce(function(t,e){return t[e.id]=e.clone(),t},{});return Ut(t).forEach(function(t){var e=s[t.id];if(e.isLink()){var n=e.source(),i=e.target();n.id&&s[n.id]&&e.prop("source/id",s[n.id].id),i.id&&s[i.id]&&e.prop("target/id",s[i.id].id)}var r=t.get("parent");r&&s[r]&&e.set("parent",s[r].id);var o=Ut(t.get("embeds")).reduce(function(t,e){return s[e]&&t.push(s[e].id),t},[]);zt(o)||e.set("embeds",o)}),s}function fe(o,s){return function(t,e){var n=pt(t);t=parseFloat(t),n&&(t/=100);var i={};if(isFinite(t)){var r=n||0<=t&&t<=1?t*e[s]:Math.max(t+e[s],0);i[o]=r}return i}}function pe(s,a,h){return function(t,e){var n,i=pt(t);if(t=parseFloat(t),i&&(t/=100),isFinite(t)){var r=e[h]();n=i||0e.width?Pe:Se)(t,e)})},refRCircumscribed:{set:function(t,e){var n=pt(t);t=parseFloat(t),n&&(t/=100);var i,r=Math.sqrt(e.height*e.height+e.width*e.width);return isFinite(t)&&(i=n||0<=t&&t<=1?t*r:Math.max(t+r,0)),{r:i}}},refCx:{set:fe("cx","width")},refCy:{set:fe("cy","height")},xAlignment:{offset:ge("x","width","right")},yAlignment:{offset:ge("y","height","bottom")},resetOffset:{offset:function(t,e){return t?{x:-e.x,y:-e.y}:{x:0,y:0}}},refDResetOffset:{set:me({resetOffset:!0})},refDKeepOffset:{set:me({resetOffset:!1})},refPointsResetOffset:{set:ye({resetOffset:!0})},refPointsKeepOffset:{set:ye({resetOffset:!1})},connection:{qualify:xe,set:function(t){var e,n=t.stubs;if(void 0===n&&(n=0),isFinite(n)&&0!==n){var i;i=n<0?(this.getConnectionLength()+n)/2:n;var r=this.getConnection(),o=r.divideAtLength(i),s=r.divideAtLength(-i);o&&s&&(e=o[0].serialize()+" "+s[1].serialize())}return{d:e||this.getSerializedConnection()}}},atConnectionLengthKeepGradient:{qualify:xe,set:we("getTangentAtLength",{rotate:!0})},atConnectionLengthIgnoreGradient:{qualify:xe,set:we("getTangentAtLength",{rotate:!1})},atConnectionRatioKeepGradient:{qualify:xe,set:we("getTangentAtRatio",{rotate:!0})},atConnectionRatioIgnoreGradient:{qualify:xe,set:we("getTangentAtRatio",{rotate:!1})}};ke.refR=ke.refRInscribed,ke.refD=ke.refDResetOffset,ke.refPoints=ke.refPointsResetOffset,ke.atConnectionLength=ke.atConnectionLengthKeepGradient,ke.atConnectionRatio=ke.atConnectionRatioKeepGradient,ke.refX2=ke.refX,ke.refY2=ke.refY,ke.refWidth2=ke.refWidth,ke.refHeight2=ke.refHeight,ke["ref-x"]=ke.refX,ke["ref-y"]=ke.refY,ke["ref-dy"]=ke.refDy,ke["ref-dx"]=ke.refDx,ke["ref-width"]=ke.refWidth,ke["ref-height"]=ke.refHeight,ke["x-alignment"]=ke.xAlignment,ke["y-alignment"]=ke.yAlignment;var Ee=ke,Ce=s.Model.extend({constructor:function(t,e){var n,i=t||{};this.cid=oe("c"),this.attributes={},e&&e.collection&&(this.collection=e.collection),e&&e.parse&&(i=this.parse(i,e)||{}),(n=Qt(this,"defaults"))&&(i=se({},n,i)),this.set(i,e),this.changed={},this.initialize.apply(this,arguments)},translate:function(t,e,n){throw new Error("Must define a translate() method.")},toJSON:function(){var e=this.constructor.prototype.defaults.attrs||{},t=this.attributes.attrs,o={};ie(t,function(t,i){var r=e[i];ie(t,function(t,n){he(t)&&!Array.isArray(t)?ie(t,function(t,e){r&&r[n]&&It(r[n][e],t)||(o[i]=o[i]||{},(o[i][n]||(o[i][n]={}))[e]=t)}):r&&It(r[n],t)||(o[i]=o[i]||{},o[i][n]=t)})});var n=Dt(te(this.attributes,"attrs"));return n.attrs=o,n},initialize:function(t){t&&t.id||this.set("id",this.generateId(),{silent:!0}),this._transitionIds={},this.processPorts(),this.on("change:attrs",this.processPorts,this)},generateId:function(){return ht()},processPorts:function(){var t=this.ports,n={};ie(this.get("attrs"),function(t,e){t&&t.port&&(void 0!==t.port.id?n[t.port.id]=t.port:n[t.port]={id:t.port})});var i={};(ie(t,function(t,e){n[e]||(i[e]=!0)}),this.graph&&!zt(i))&&(this.graph.getConnectedLinks(this,{inbound:!0}).forEach(function(t){i[t.get("target").port]&&t.remove()}),this.graph.getConnectedLinks(this,{outbound:!0}).forEach(function(t){i[t.get("source").port]&&t.remove()}));this.ports=n},remove:function(t){t=t||{};var e=this.graph;if(!e)return this.collection&&this.collection.remove(this,t),this;e.startBatch("remove");var n=this.getParentCell();n&&n.unembed(this);for(var i=this.getEmbeddedCells(),r=0,o=i.length;rl[2]?(s=".3em",r=u,o=0,"start"):hc[2]?(s=".3em",r=-l,o=0,"end"):h "+e),n=this.getSelector(t.parentNode,n)}return n},getLinkEnd:function(t,e,n,i,r){var o=this.model,s=o.id,a=this.findAttribute("port",t),h=t.getAttribute("joint-selector"),l={id:s};null!=h&&(l.magnet=h),null!=a?(l.port=a,o.hasPort(a)||h||(l.selector=this.getSelector(t))):null==h&&this.el!==t&&(l.selector=this.getSelector(t));var u=this.paper,c=u.options.connectionStrategy;if("function"==typeof c){var d=c.call(u,l,this,t,new z(e,n),i,r,u);d&&(l=d)}return l},getMagnetFromLinkEnd:function(t){var e=this.el,n=t.port,i=t.magnet,r=this.model;return null!=n&&r.isElement()&&r.hasPort(n)?this.findPortNode(n,i)||e:(i||(i=t.selector),i||null==n||(i='[port="'+n+'"]'),this.findBySelector(i,e,this.selectors)[0])},getAttributeDefinition:function(t){return this.model.constructor.getAttributeDefinition(t)},setNodeAttributes:function(t,e){zt(e)||(t instanceof SVGElement?K(t).attr(e):C(t).attr(e))},processNodeAttributes:function(t,e){var n,i,r,o,s,a,h,l,u,c=[];for(n in e)e.hasOwnProperty(n)&&(i=e[n],!(r=this.getAttributeDefinition(n))||jt(r.qualify)&&!r.qualify.call(this,i,t,e)?(a||(a={}),a[ut(n)]=i):(ue(r.set)&&(a||(a={}),a[r.set]=i),null!==i&&c.push(n,r)));for(o=0,s=c.length;or.options.clickThreshold||this.notify("element:magnet:pointerclick",t,e,n,i)}});Nt(Ze.prototype,qe);var Je={_results:{},_tests:{svgforeignobject:function(){return!!document.createElementNS&&/SVGForeignObject/.test({}.toString.call(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")))}},addTest:function(t,e){return this._tests[t]=e},test:function(t){var e=this._tests[t];if(!e)throw new Error('Test not defined ("'+t+'"). Use `joint.env.addTest(name, fn) to add a new test.`');var n=this._results[t];if(void 0!==n)return n;try{n=e()}catch(t){n=!1}return this._results[t]=n}},Ke=He.define("basic.Generic",{attrs:{".":{fill:"#ffffff",stroke:"none"}}}),Qe=Ke.define("basic.Rect",{attrs:{rect:{fill:"#ffffff",stroke:"#000000",width:100,height:60},text:{fill:"#000000",text:"","font-size":14,"ref-x":.5,"ref-y":.5,"text-anchor":"middle","y-alignment":"middle","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),tn=Ze.extend({presentationAttributes:Ze.addPresentationAttributes({attrs:["SCALE"]}),confirmUpdate:function(){var t=Ze.prototype.confirmUpdate.apply(this,arguments);return this.hasFlag(t,"SCALE")&&(this.resize(),t=this.removeFlag(t,"SCALE")),t}}),en=Ke.define("basic.Text",{attrs:{text:{"font-size":18,fill:"#000000"}}},{markup:''}),nn=Ke.define("basic.Circle",{size:{width:60,height:60},attrs:{circle:{fill:"#ffffff",stroke:"#000000",r:30,cx:30,cy:30},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-y":.5,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),rn=Ke.define("basic.Ellipse",{size:{width:60,height:40},attrs:{ellipse:{fill:"#ffffff",stroke:"#000000",rx:30,ry:20,cx:30,cy:20},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-y":.5,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),on=Ke.define("basic.Polygon",{size:{width:60,height:40},attrs:{polygon:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),sn=Ke.define("basic.Polyline",{size:{width:60,height:40},attrs:{polyline:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),an=Ke.define("basic.Image",{attrs:{text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),hn=Ke.define("basic.Path",{size:{width:60,height:60},attrs:{path:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle",ref:"path","ref-x":.5,"ref-dy":10,fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),ln=hn.define("basic.Rhombus",{attrs:{path:{d:"M 30 0 L 60 30 30 60 0 30 z"},text:{"ref-y":.5,"ref-dy":null,"y-alignment":"middle"}}}),un=Je.test("svgforeignobject"),cn=Ke.define("basic.TextBlock",{attrs:{rect:{fill:"#ffffff",stroke:"#000000",width:80,height:100},text:{fill:"#000000","font-size":14,"font-family":"Arial, helvetica, sans-serif"},".content":{text:"","ref-x":.5,"ref-y":.5,"y-alignment":"middle","x-alignment":"middle"}},content:""},{markup:['','',un?'
':'',""].join(""),initialize:function(){this.listenTo(this,"change:size",this.updateSize),this.listenTo(this,"change:content",this.updateContent),this.updateSize(this,this.get("size")),this.updateContent(this,this.get("content")),Ke.prototype.initialize.apply(this,arguments)},updateSize:function(t,e){this.attr({".fobj":Nt({},e),div:{style:Nt({},e)}})},updateContent:function(t,e){un?this.attr({".content":{html:mt(e)}}):this.attr({".content":{text:e}})},setForeignObjectSize:function(){this.updateSize.apply(this,arguments)},setDivContent:function(){this.updateContent.apply(this,arguments)}}),dn=Ze.extend({presentationAttributes:un?Ze.prototype.presentationAttributes:Ze.addPresentationAttributes({content:["CONTENT"],size:["CONTENT"]}),initFlag:["RENDER","CONTENT"],confirmUpdate:function(){var t=Ze.prototype.confirmUpdate.apply(this,arguments);return this.hasFlag(t,"CONTENT")&&(this.updateContent(this.model),t=this.removeFlag(t,"CONTENT")),t},update:function(t,e){var n=this.model;if(un)Ze.prototype.update.call(this,n,e);else{var i=te(e||n.get("attrs"),".content");Ze.prototype.update.call(this,n,i),e&&!Kt(e,".content")||this.updateContent(n,e)}},updateContent:function(t,e){var n=se({},(e||t.get("attrs"))[".content"]);n=te(n,"text");var i=vt(t.get("content"),t.get("size"),n,{svgDocument:this.paper.svg}),r=ot({},".content",n,"/");r[".content"].text=i,Ze.prototype.update.call(this,t,r)}}),fn={Generic:Ke,Rect:Qe,TextView:tn,Text:en,Circle:nn,Ellipse:rn,Polygon:on,Polyline:sn,Image:an,Path:hn,Rhombus:ln,TextBlock:cn,TextBlockView:dn},pn=Ce.extend({markup:['','','','','','','',''].join(""),toolMarkup:['','','','',"Remove link.","",'','','',"Link options.","",""].join(""),doubleToolMarkup:void 0,vertexMarkup:['','','','',"Remove vertex.","",""].join(""),arrowheadMarkup:['','',""].join(""),defaultLabel:void 0,labelMarkup:void 0,_builtins:{defaultLabel:{markup:[{tagName:"rect",selector:"rect"},{tagName:"text",selector:"text"}],attrs:{text:{fill:"#000000",fontSize:14,textAnchor:"middle",yAlignment:"middle",pointerEvents:"none"},rect:{ref:"text",fill:"#ffffff",rx:3,ry:3,refWidth:1,refHeight:1,refX:0,refY:0}},position:{distance:.5}}},defaults:{type:"link",source:{},target:{}},isLink:function(){return!0},disconnect:function(t){return this.set({source:{x:0,y:0},target:{x:0,y:0}},t)},source:function(t,e,n){return void 0===t?Ot(this.get("source")):(r=t instanceof Ce?((i=Ot(e)||{}).id=t.id,n):Gt(t)?(i=t,e):((i=Ot(e)||{}).x=t.x,i.y=t.y,n),this.set("source",i,r));var i,r},target:function(t,e,n){return void 0===t?Ot(this.get("target")):(r=t instanceof Ce?((i=Ot(e)||{}).id=t.id,n):Gt(t)?(i=t,e):((i=Ot(e)||{}).x=t.x,i.y=t.y,n),this.set("target",i,r));var i,r},router:function(t,e,n){if(void 0===t){var i=this.get("router");return i?"object"==typeof i?Ot(i):i:this.get("manhattan")?{name:"orthogonal"}:null}var r="object"==typeof t||"function"==typeof t,o=r?t:{name:t,args:e},s=r?e:n;return this.set("router",o,s)},connector:function(t,e,n){if(void 0===t){var i=this.get("connector");return i?"object"==typeof i?Ot(i):i:this.get("smooth")?{name:"smooth"}:null}var r="object"==typeof t||"function"==typeof t,o=r?t:{name:t,args:e},s=r?e:n;return this.set("connector",o,s)},label:function(t,e,n){var i=this.labels();return(t=isFinite(t)&&null!==t?0|t:0)<0&&(t=i.length+t),arguments.length<=1?this.prop(["labels",t]):this.prop(["labels",t],e,n)},labels:function(t,e){return 0===arguments.length?(t=this.get("labels"),Array.isArray(t)?t.slice():[]):(Array.isArray(t)||(t=[]),this.set("labels",t,e))},insertLabel:function(t,e,n){if(!e)throw new Error("dia.Link: no label provided");var i=this.labels(),r=i.length;return(t=isFinite(t)&&null!==t?0|t:r)<0&&(t=r+t+1),i.splice(t,0,e),this.labels(i,n)},appendLabel:function(t,e){return this.insertLabel(-1,t,e)},removeLabel:function(t,e){var n=this.labels();return t=isFinite(t)&&null!==t?0|t:-1,n.splice(t,1),this.labels(n,e)},vertex:function(t,e,n){var i=this.vertices();if((t=isFinite(t)&&null!==t?0|t:0)<0&&(t=i.length+t),arguments.length<=1)return this.prop(["vertices",t]);var r=this._normalizeVertex(e);return this.prop(["vertices",t],r,n)},vertices:function(t,e){if(0===arguments.length)return t=this.get("vertices"),Array.isArray(t)?t.slice():[];Array.isArray(t)||(t=[]);for(var n=[],i=0;i=Math.abs(t.y-e.y)){var l=(t.x+e.x)/2;h=D.createSegment("C",l,t.y,l,e.y,e.x,e.y),r.appendSegment(h)}else{var u=(t.y+e.y)/2;h=D.createSegment("C",t.x,u,e.x,u,e.x,e.y),r.appendSegment(h)}}return o?r:r.serialize()}},Dn={stroke:{defaultOptions:{padding:3,rx:0,ry:0,attrs:{"stroke-width":3,stroke:"#FEB663"}},_views:{},getHighlighterId:function(t,e){return t.id+JSON.stringify(e)},removeHighlighter:function(t){this._views[t]&&(this._views[t].remove(),this._views[t]=null)},highlight:function(t,e,n){var i=this.getHighlighterId(e,n);if(!this._views[i]){var r,o=Vt(n||{},this.defaultOptions),s=K(e);try{var a=s.convertToPathData()}catch(t){r=s.bbox(!0),a=K.rectToPath(Nt({},o,r))}var h=K("path").attr({d:a,"pointer-events":"none","vector-effect":"non-scaling-stroke",fill:"none"}).attr(o.attrs);if(t.isNodeConnection(e))h.attr("d",t.getSerializedConnection());else{var l=s.getTransformToElement(t.el),u=o.padding;if(u){r||(r=s.bbox(!0));var c=r.x+r.width/2,d=r.y+r.height/2;r=K.transformRect(r,l);var f=Math.max(r.width,1),p=Math.max(r.height,1),g=(f+u)/f,v=(p+u)/p,m=K.createSVGMatrix({a:g,b:0,c:0,d:v,e:c-g*c,f:d-v*d});l=l.multiply(m)}h.transform(l)}var y=this._views[i]=new Ye({svgElement:!0,className:"highlight-stroke",el:h.node}),w=this.removeHighlighter.bind(this,i),b=t.model;y.listenTo(b,"remove",w),y.listenTo(b.graph,"reset",w),t.vel.append(h)}},unhighlight:function(t,e,n){this.removeHighlighter(this.getHighlighterId(e,n))}},opacity:{highlight:function(t,e){K(e).addClass(tt("highlight-opacity"))},unhighlight:function(t,e){K(e).removeClass(tt("highlight-opacity"))}},addClass:{className:tt("highlighted"),highlight:function(t,e,n){var i=(n||{}).className||this.className;K(e).addClass(i)},unhighlight:function(t,e,n){var i=(n||{}).className||this.className;K(e).removeClass(i)}}};function zn(t,e,n){if(!isFinite(n))return t;var i=t.distance(e);return 0===n&&0e.y?"N":"S":t.y===e.y?t.x>e.x?"W":"E":null}function ri(t){return new X(t.x,t.y,0,0)}function oi(t){var e=xt(t.padding||t.elementPadding||20);return{x:-e.left,y:-e.top,width:e.left+e.right,height:e.top+e.bottom}}function si(t,e){return t.sourceBBox.clone().moveAndExpand(oi(e))}function ai(t,e){return t.targetBBox.clone().moveAndExpand(oi(e))}function hi(t,e,n){var i=new z(t.x,e.y),r=new z(e.x,t.y),o=ii(t,i),s=ii(t,r),a=Qn[n],h=o===n||o!==a&&(s===a||s!==n)?i:r;return{points:[h],direction:ii(h,e)}}function li(t,e,n){var i=ei(t,e,n);return{points:[i],direction:ii(i,e)}}function ui(e,t,n,i){var r,o={},s=[new z(e.x,t.y),new z(t.x,e.y)],a=s.filter(function(t){return!n.containsPoint(t)}),h=a.filter(function(t){return ii(t,e)!==i});if(0l.center().distance(t),c=u?e:t,d=u?t:e;return s=ei(o=r?(o=z.fromPolar(l.width+l.height,ti[r],c),l.pointNearestToPoint(o).move(o,-1)):l.pointNearestToPoint(c).move(c,1),d,l),o.round().equals(s.round())?(s=z.fromPolar(l.width+l.height,A(o.theta(c))+Math.PI/2,d),a=ei(o,s=l.pointNearestToPoint(s).move(d,1).round(),l),h.points=u?[s,a,o]:[o,a,s]):h.points=u?[s,o]:[o,s],h.direction=ii(u?o:s,e),h}function fi(t,e,n){var i,r,o,s,a,h=si(n,e),l=ai(n,e),u=(r=e,(i=n).sourceAnchor?i.sourceAnchor:si(i,r).center()),c=(s=e,(o=n).targetAnchor?o.targetAnchor:ai(o,s).center());h=h.union(ri(u)),l=l.union(ri(c)),(t=Ut(t).map(z)).unshift(u),t.push(c);for(var d=[],f=0,p=t.length-1;fi.maxAllowedDirectionChange)){var H=Si(D.clone().offset(T.gridOffsetX,T.gridOffsetY),w,h),$=ki(H);if(!b.isClose($)&&n.isPointAccessible(H)){if(0<=_.indexOf($))if(!H.equals(f))if(xi(q,bi(H,f,F,w,i))>i.maxAllowedDirectionChange)continue;var Y=I+T.cost+(G?0:i.penalties[L]);(!b.isOpen($)||Y=this.options.longLinkLength){var r=this.options.doubleLinkToolsOffset||e;i=this.getPointAtLength(n-r),this._tool2Cache.attr("transform","translate("+i.x+", "+i.y+") "+t),this._tool2Cache.attr("visibility","visible")}else this.options.doubleLinkTools&&this._tool2Cache.attr("visibility","hidden")}return this},updateArrowheadMarkers:function(){if(!this._V.markerArrowheads)return this;if("none"===C.css(this._V.markerArrowheads.node,"display"))return this;var t=this.getConnectionLength()'),o=["<"+n+">",Ut(i).map(function(t){return r({offset:t.offset,color:t.color,opacity:Number.isFinite(t.opacity)?t.opacity:1})}).join(""),""].join(""),s=Nt({id:e},t.attrs);K(o,s).appendTo(this.defs)}return e},defineMarker:function(t){if(!he(t))throw new TypeError("dia.Paper: defineMarker() requires 1. argument to be an object.");var e=t.id;if(e||(e=this.svg.id+it(JSON.stringify(t))),!this.isDefined(e)){var n=te(t,"type","userSpaceOnUse");K("marker",{id:e,orient:"auto",overflow:"visible",markerUnits:t.markerUnits||"userSpaceOnUse"},[K(t.type||"path",n)]).appendTo(this.defs)}return e}},{sorting:Hi,backgroundPatterns:{flipXy:function(t){var e=document.createElement("canvas"),n=t.width,i=t.height;e.width=2*n,e.height=2*i;var r=e.getContext("2d");return r.drawImage(t,0,0,n,i),r.setTransform(-1,0,0,-1,e.width,e.height),r.drawImage(t,0,0,n,i),r.setTransform(-1,0,0,1,e.width,0),r.drawImage(t,0,0,n,i),r.setTransform(1,0,0,-1,0,e.height),r.drawImage(t,0,0,n,i),e},flipX:function(t){var e=document.createElement("canvas"),n=t.width,i=t.height;e.width=2*n,e.height=i;var r=e.getContext("2d");return r.drawImage(t,0,0,n,i),r.translate(2*n,0),r.scale(-1,1),r.drawImage(t,0,0,n,i),e},flipY:function(t){var e=document.createElement("canvas"),n=t.width,i=t.height;e.width=n,e.height=2*i;var r=e.getContext("2d");return r.drawImage(t,0,0,n,i),r.translate(0,2*i),r.scale(1,-1),r.drawImage(t,0,0,n,i),e},watermark:function(t,e){e=e||{};var n=t.width,i=t.height,r=document.createElement("canvas");r.width=3*n,r.height=3*i;for(var o=r.getContext("2d"),s=le(e.watermarkAngle)?-e.watermarkAngle:-20,a=A(s),h=r.width/4,l=r.height/4,u=0;u<4;u++)for(var c=0;c<4;c++)0<(u+c)%2&&(o.setTransform(1,0,0,1,(2*u-1)*h,(2*c-1)*l),o.rotate(a),o.drawImage(t,-n/2,-i/2,n,i));return r}},gridPatterns:{dot:[{color:"#AAAAAA",thickness:1,markup:"rect",update:function(t,e){K(t).attr({width:e.thickness*e.sx,height:e.thickness*e.sy,fill:e.color})}}],fixedDot:[{color:"#AAAAAA",thickness:1,markup:"rect",update:function(t,e){var n=e.sx<=1?e.thickness*e.sx:e.thickness;K(t).attr({width:n,height:n,fill:e.color})}}],mesh:[{color:"#AAAAAA",thickness:1,markup:"path",update:function(t,e){var n,i=e.width,r=e.height,o=e.thickness;n=0<=i-o&&0<=r-o?["M",i,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",K(t).attr({d:n,stroke:e.color,"stroke-width":e.thickness})}}],doubleMesh:[{color:"#AAAAAA",thickness:1,markup:"path",update:function(t,e){var n,i=e.width,r=e.height,o=e.thickness;n=0<=i-o&&0<=r-o?["M",i,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",K(t).attr({d:n,stroke:e.color,"stroke-width":e.thickness})}},{color:"#000000",thickness:3,scaleFactor:4,markup:"path",update:function(t,e){var n,i=e.width,r=e.height,o=e.thickness;n=0<=i-o&&0<=r-o?["M",i,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",K(t).attr({d:n,stroke:e.color,"stroke-width":e.thickness})}}]}}),Wi=Ye.extend({name:null,tagName:"g",className:"tool",svgElement:!0,_visible:!0,init:function(){var t=this.name;t&&this.vel.attr("data-tool-name",t)},configure:function(t,e){return this.relatedView=t,this.paper=t.paper,this.parentView=e,this.simulateRelatedView(this.el),this.delegateEvents(),this},simulateRelatedView:function(t){t&&t.setAttribute("model-id",this.relatedView.model.id)},getName:function(){return this.name},show:function(){this.el.style.display="",this._visible=!0},hide:function(){this.el.style.display="none",this._visible=!1},isVisible:function(){return!!this._visible},focus:function(){var t=this.options.focusOpacity;isFinite(t)&&(this.el.style.opacity=t),this.parentView.focusTool(this)},blur:function(){this.el.style.opacity="",this.parentView.blurTool(this)},update:function(){},guard:function(t){var e=this.paper,n=this.relatedView;return!e||!n||e.guard(t,n)}}),Zi=Ye.extend({tagName:"g",className:"tools",svgElement:!0,tools:null,options:{tools:null,relatedView:null,name:null,component:!1},configure:function(t){var e=(t=Nt(this.options,t)).tools;if(!Array.isArray(e))return this;var n=t.relatedView;if(!(n instanceof We))return this;for(var i=this.tools=[],r=0,o=e.length;r>>0;if(0===i)return!1;var r,o,s=0|e,a=Math.max(0<=s?s:i-Math.abs(s),0);for(;a>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r>8-r%1*8)){if(255<(n=i.charCodeAt(r+=.75)))throw new h("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");e=e<<8|n}return s}),t.atob||(t.atob=function(t){var e=String(t).replace(/=+$/,"");if(e.length%4==1)throw new h("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,i,r=0,o=0,s="";i=e.charAt(o++);~i&&(n=r%4?64*n+i:i,r++%4)?s+=String.fromCharCode(255&n>>(-2*r&6)):0)i=a.indexOf(i);return s})}(),Number.isFinite=Number.isFinite||function(t){return"number"==typeof t&&isFinite(t)},Number.isNaN=Number.isNaN||function(t){return t!=t},String.prototype.includes||(String.prototype.includes=function(t,e){return"number"!=typeof e&&(e=0),!(e+t.length>this.length)&&-1!==this.indexOf(t,e)}),String.prototype.startsWith||(String.prototype.startsWith=function(t,e){return this.substr(e||0,t.length)===t}),function(){function i(t,e){return this.slice(t,e)}function r(t,e){arguments.length<2&&(e=0);for(var n=0,i=t.length;na.x+o/2,c=ia.x?r-30:r+30)-l)/(s*s*(i-h))+h:e=s*s/(r-l)-s*s*(i-h)*((n=r>a.y?i+30:i-30)-h)/(o*o*(r-l))+l,new z(n,e).theta(t)},toString:function(){return new z(this.x,this.y).toString()+" "+this.a+" "+this.b}};var O=function(t,e){return this instanceof O?t instanceof O?new O(t.start,t.end):(this.start=new z(t),void(this.end=new z(e))):new O(t,e)};O.prototype={angle:function(){var t=new z(this.start.x+1,this.start.y);return this.start.angleBetween(this.end,t)},bbox:function(){var t=R(this.start.x,this.end.x),e=R(this.start.y,this.end.y),n=B(this.start.x,this.end.x),i=B(this.start.y,this.end.y);return new X(t,e,n-t,i-e)},bearing:function(){var t=A(this.start.y),e=A(this.end.y),n=this.start.x,i=this.end.x,r=A(i-n),o=c(r)*u(e),s=u(t)*c(e)-c(t)*u(e)*u(r),a=y(d(o,s))-22.5;return a<0&&(a+=360),["NE","E","SE","S","SW","W","NW","N"][a=parseInt(a/45)]},clone:function(){return new O(this.start,this.end)},closestPoint:function(t){return this.pointAt(this.closestPointNormalizedLength(t))},closestPointLength:function(t){return this.closestPointNormalizedLength(t)*this.length()},closestPointNormalizedLength:function(t){var e=this.vector().dot(new O(this.start,t).vector()),n=R(1,B(0,e/this.squaredLength()));return n!=n?0:n},closestPointTangent:function(t){return this.tangentAt(this.closestPointNormalizedLength(t))},containsPoint:function(t){var e=this.start,n=this.end;if(0!==e.cross(t,n))return!1;var i=this.length();return!(new O(e,t).length()>i)&&!(new O(t,n).length()>i)},divideAt:function(t){var e=this.pointAt(t);return[new O(this.start,e),new O(e,this.end)]},divideAtLength:function(t){var e=this.pointAtLength(t);return[new O(this.start,e),new O(e,this.end)]},equals:function(t){return!!t&&this.start.x===t.start.x&&this.start.y===t.start.y&&this.end.x===t.end.x&&this.end.y===t.end.y},intersect:function(t,e){if(t instanceof O||t instanceof X||t instanceof L||t instanceof x||t instanceof D){var n=t.intersectionWithLine(this,e);return n&&t instanceof O&&(n=n[0]),n}return null},intersectionWithLine:function(t){var e=new z(this.end.x-this.start.x,this.end.y-this.start.y),n=new z(t.end.x-t.start.x,t.end.y-t.start.y),i=e.x*n.y-e.y*n.x,r=new z(t.start.x-this.start.x,t.start.y-this.start.y),o=r.x*n.y-r.y*n.x,s=r.x*e.y-r.y*e.x;if(0===i||o*i<0||s*i<0)return null;if(0l.y||r>h.y&&r<=l.y){var c=h.x-i>l.x-i?h.x-i:l.x-i;if(0<=c){var d=new z(i+c,r),f=new O(t,d);u.intersect(f)&&a++}}o=s}return a%2==1},convexHull:function(){var t,e,n,i=this.points,r=i.length;if(0===r)return new L;for(t=0;tn.x&&(n=i[t]);var o=[];for(t=0;t=this.x&&t.x<=this.x+this.width&&t.y>=this.y&&t.y<=this.y+this.height},containsRect:function(t){var e=new X(this).normalize(),n=new X(t).normalize(),i=e.width,r=e.height,o=n.width,s=n.height;if(!(i&&r&&o&&s))return!1;var a=e.x,h=e.y,l=n.x,u=n.y;return o+=l,i+=a,s+=u,r+=h,a<=l&&o<=i&&h<=u&&s<=r},corner:function(){return new z(this.x+this.width,this.y+this.height)},equals:function(t){var e=new X(this).normalize(),n=new X(t).normalize();return e.x===n.x&&e.y===n.y&&e.width===n.width&&e.height===n.height},inflate:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.x-=t,this.y-=e,this.width+=2*t,this.height+=2*e,this},intersect:function(t){var e=this.origin(),n=this.corner(),i=t.origin(),r=t.corner();if(r.x<=e.x||r.y<=e.y||i.x>=n.x||i.y>=n.y)return null;var o=B(e.x,i.x),s=B(e.y,i.y);return new X(o,s,R(n.x,r.x)-o,R(n.y,r.y)-s)},intersectionWithLine:function(t){var e,n,i=[this.topLine(),this.rightLine(),this.bottomLine(),this.leftLine()],r=[],o=[],s=i.length;for(n=0;nu&&(i=(this.x+this.width-u)/(f.x-u)),f.y>c&&(a=(this.y+this.height-c)/(f.y-c));var p=t.topRight();p.x>u&&(r=(this.x+this.width-u)/(p.x-u)),p.yc&&(l=(this.y+this.height-c)/(g.y-c)),{sx:R(n,i,r,o),sy:R(s,a,h,l)}},maxRectUniformScaleToFit:function(t,e){var n=this.maxRectScaleToFit(t,e);return R(n.sx,n.sy)},moveAndExpand:function(t){return this.x+=t.x||0,this.y+=t.y||0,this.width+=t.width||0,this.height+=t.height||0,this},normalize:function(){var t=this.x,e=this.y,n=this.width,i=this.height;return this.width<0&&(t=this.x+this.width,n=-this.width),this.height<0&&(e=this.y+this.height,i=-this.height),this.x=t,this.y=e,this.width=n,this.height=i,this},offset:function(t,e){return z.prototype.offset.call(this,t,e)},origin:function(){return new z(this.x,this.y)},pointNearestToPoint:function(t){if(t=new z(t),this.containsPoint(t))switch(this.sideNearestToPoint(t)){case"right":return new z(this.x+this.width,t.y);case"left":return new z(this.x,t.y);case"bottom":return new z(t.x,this.y+this.height);case"top":return new z(t.x,this.y)}return t.adhereToRect(this)},rightLine:function(){return new O(this.topRight(),this.bottomRight())},rightMiddle:function(){return new z(this.x+this.width,this.y+this.height/2)},round:function(t){var e=T(10,t||0);return this.x=a(this.x*e)/e,this.y=a(this.y*e)/e,this.width=a(this.width*e)/e,this.height=a(this.height*e)/e,this},scale:function(t,e,n){return n=this.origin().scale(t,e,n),this.x=n.x,this.y=n.y,this.width*=t,this.height*=e,this},sideNearestToPoint:function(t){var e=(t=new z(t)).x-this.x,n=this.x+this.width-t.x,i=t.y-this.y,r=e,o="left";return n'+t+"";return N.parseXML(e,{async:!1}).documentElement}var n=document.createElementNS(M.svg,"svg");return n.setAttributeNS(M.xmlns,"xmlns:xlink",M.xlink),n.setAttribute("version","1.1"),n},N.idCounter=0,N.uniqueId=function(){return"v-"+ ++N.idCounter},N.toNode=function(t){return N.isV(t)?t.node:t.nodeName&&t||t[0]},N.ensureId=function(t){return(t=N.toNode(t)).id||(t.id=N.uniqueId())},N.sanitizeText=function(t){return(t||"").replace(/ /g," ")},N.isUndefined=function(t){return void 0===t},N.isString=function(t){return"string"==typeof t},N.isObject=function(t){return t&&"object"==typeof t},N.isArray=Array.isArray,N.parseXML=function(t,e){var n;e=e||{};try{var i=new DOMParser;N.isUndefined(e.async)||(i.async=e.async),n=i.parseFromString(t,"text/xml")}catch(t){n=void 0}if(!n||n.getElementsByTagName("parsererror").length)throw new Error("Invalid XML: "+t);return n},N.qualifyAttr=function(t){if(-1===t.indexOf(":"))return{ns:null,local:t};var e=t.split(":");return{ns:M[e[0]],local:e[1]}},N.transformRegex=/(\w+)\(([^,)]+),?([^)]+)?\)/gi,N.transformSeparatorRegex=/[ ,]+/,N.transformationListRegex=/^(\w+)\((.*)\)/,N.transformStringToMatrix=function(t){var e=N.createSVGMatrix(),n=t&&t.match(N.transformRegex);if(!n)return e;for(var i=0,r=n.length;i=t.start&&et.start&&n<=t.end||t.start>=e&&t.end=e?t.end+=n:t.start>=e&&(t.start+=n,t.end+=n)}),t},N.convertLineToPathData=function(t){return["M",(t=N(t)).attr("x1"),t.attr("y1"),"L",t.attr("x2"),t.attr("y2")].join(" ")},N.convertPolygonToPathData=function(t){var e=N.getPointsFromSvgNode(t);return 0===e.length?null:N.svgPointsToPath(e)+" Z"},N.convertPolylineToPathData=function(t){var e=N.getPointsFromSvgNode(t);return 0===e.length?null:N.svgPointsToPath(e)},N.svgPointsToPath=function(t){for(var e=0,n=t.length;e=o[r]&&(s.push([e].concat(i.splice(0,o[r]))),o[r]););}),s}(t)),!t||!t.length)return[["M",0,0]];for(var e,n=[],i=0,r=0,o=0,s=0,a=t.length,h=0;hd){var E=S,C=h,T=l;p=t(h=x+i*H(S=P+d*(a&&Pf)L=f-1;else if(void 0!==o){var M;if(void 0===v)v=(M="auto"===n.lineHeight?{value:1.5,unit:"em"}:gt(n.lineHeight,["em"])||{value:1,unit:"em"}).value,"em"===M.unit&&(v*=h.getBBox().height);v*w.length>o&&(L=Math.floor(o/v)-1)}if(null!==L){w.splice(L+1);var N=i.ellipsis;if(!N||L<0)break;"string"!=typeof N&&(N="…");var V=w[L];if(!V)break;var F,_,R=V.length;do{if(_=V[R],F=V.substring(0,R),_?_.match(u)&&(F+=_):F+="string"==typeof u?u:" ",F+=N,l.data=F,a.getComputedTextLength()<=r){w[L]=F;break}R--}while(0<=R);break}}}return i.svgDocument?s.removeChild(h):document.body.removeChild(s),w.join(c)},mt=function(t){var e=C(C.parseHTML("
"+t+"
",null,!1));return e.find("*").each(function(){var n=this;C.each(n.attributes,function(){var t=this.name,e=this.value;(t.startsWith("on")||e.startsWith("javascript:")||e.startsWith("data:")||e.startsWith("vbscript:"))&&C(n).removeAttr(t)})}),e.html()},yt=function(t,e){if(window.navigator.msSaveBlob)window.navigator.msSaveBlob(t,e);else{var n=window.URL.createObjectURL(t),i=document.createElement("a");i.href=n,i.download=e,document.body.appendChild(i),i.click(),document.body.removeChild(i),window.URL.revokeObjectURL(n)}},wt=function(t){t=t.replace(/\s/g,"");var e,n=(t=decodeURIComponent(t)).indexOf(","),i=t.slice(0,n),r=i.split(":")[1].split(";")[0],o=t.slice(n+1);e=0<=i.indexOf("base64")?atob(o):unescape(encodeURIComponent(o));for(var s=new Uint8Array(e.length),a=0;a')({color:t.color||"blue",opacity:Number.isFinite(t.opacity)?t.opacity:1,outerRadius:e+n,innerRadius:e})},highlight:function(t){return Et('')({color:t.color||"red",width:Number.isFinite(t.width)?t.width:1,blur:Number.isFinite(t.blur)?t.blur:0,opacity:Number.isFinite(t.opacity)?t.opacity:1})},blur:function(t){var e=Number.isFinite(t.x)?t.x:2;return Et('')({stdDeviation:Number.isFinite(t.y)?[e,t.y]:e})},dropShadow:function(t){var e="SVGFEDropShadowElement"in window?'':'';return Et(e)({dx:t.dx||0,dy:t.dy||0,opacity:Number.isFinite(t.opacity)?t.opacity:1,color:t.color||"black",blur:Number.isFinite(t.blur)?t.blur:4})},grayscale:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return Et('')({a:.2126+.7874*(1-e),b:.7152-.7152*(1-e),c:.0722-.0722*(1-e),d:.2126-.2126*(1-e),e:.7152+.2848*(1-e),f:.0722-.0722*(1-e),g:.2126-.2126*(1-e),h:.0722+.9278*(1-e)})},sepia:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return Et('')({a:.393+.607*(1-e),b:.769-.769*(1-e),c:.189-.189*(1-e),d:.349-.349*(1-e),e:.686+.314*(1-e),f:.168-.168*(1-e),g:.272-.272*(1-e),h:.534-.534*(1-e),i:.131+.869*(1-e)})},saturate:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return Et('')({amount:1-e})},hueRotate:function(t){return Et('')({angle:t.angle||0})},invert:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return Et('')({amount:e,amount2:1-e})},brightness:function(t){return Et('')({amount:Number.isFinite(t.amount)?t.amount:1})},contrast:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return Et('')({amount:e,amount2:.5-e/2})}},kt={number:function(t,e,o){o=o||{currency:["$",""],decimal:".",thousands:",",grouping:[3]};var n=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i.exec(t),i=n[1]||" ",r=n[2]||">",s=n[3]||"",a=n[4]||"",h=n[5],l=+n[6],u=n[7],c=n[8],d=n[9],f=1,p="",g="",v=!1;switch(c&&(c=+c.substring(1)),(h||"0"===i&&"="===r)&&(h=i="0",r="=",u&&(l-=Math.floor((l-1)/4))),d){case"n":u=!0,d="g";break;case"%":f=100,g="%",d="f";break;case"p":f=100,g="%",d="r";break;case"b":case"o":case"x":case"X":"#"===a&&(p="0"+d.toLowerCase());break;case"c":case"d":v=!0,c=0;break;case"s":f=-1,d="r"}"$"===a&&(p=o.currency[0],g=o.currency[1]),"r"!=d||c||(d="g"),null!=c&&("g"==d?c=Math.max(1,Math.min(21,c)):"e"!=d&&"f"!=d||(c=Math.max(0,Math.min(20,c))));var m=h&&u;if(v&&e%1)return"";var y=e<0||0===e&&1/e<0?(e=-e,"-"):s,w=g;if(f<0){var b=this.prefix(e,c);e=b.scale(e),w=b.symbol+g}else e*=f;var x=(e=this.convert(d,e,c)).lastIndexOf("."),A=x<0?e:e.substring(0,x),P=x<0?"":o.decimal+e.substring(x+1);function S(t){for(var e=t.length,n=[],i=0,r=o.grouping[0];0"===r?E+y+e:"^"===r?E.substring(0,k>>=1)+y+e+E.substring(k):y+(m?e:E+e))+w},string:function(t,e){for(var n,i="{",r=!1,o=[];-1!==(n=t.indexOf(i));){var s,a,h;if(s=t.slice(0,n),r){h=(a=s.split(":")).shift().split("."),s=e;for(var l=0;l|\$\{ ?([^{} ]+) ?\}|\{\{([^{} ]+)\}\}/g;return function(i){return i=i||{},t.replace(e,function(t){for(var e=Array.from(arguments).slice(1,4).find(function(t){return!!t}).split("."),n=i[e.shift()];void 0!==n&&e.length;)n=n[e.shift()];return void 0!==n?n:""})}},Ct=n.assign,Tt=n.defaults,Lt=Ct,Mt=n.defaultsDeep,Nt=n.assign,Vt=n.defaults,Ft=n.defaultsDeep,_t=n.invokeMap||n.invoke,Rt=n.sortedIndexBy||n.sortedIndex,Bt=n.uniqBy||n.uniq,Ot=n.clone,Dt=n.cloneDeep,zt=n.isEmpty,It=n.isEqual,jt=n.isFunction,Gt=n.isPlainObject,Ut=n.toArray,qt=n.debounce,Ht=n.groupBy,Yt=n.sortBy,$t=n.flattenDeep,Xt=n.without,Wt=n.difference,Zt=n.intersection,Jt=n.union,Kt=n.has,Qt=n.result,te=n.omit,ee=n.pick,ne=n.bindAll,ie=n.forIn,re=n.camelCase,oe=n.uniqueId,se=function(){if(n.mergeWith){var t=Array.from(arguments),e=t[t.length-1],i=jt(e)?e:ce;return t.push(function(t,e){var n=i(t,e);return void 0!==n?n:Array.isArray(t)&&!Array.isArray(e)?e:void 0}),n.mergeWith.apply(this,t)}return n.merge.apply(this,arguments)},ae=function(t){var e=Object.prototype.toString;return!0===t||!1===t||!!t&&"object"==typeof t&&"[object Boolean]"===e.call(t)},he=function(t){return!!t&&("object"==typeof t||"function"==typeof t)},le=function(t){var e=Object.prototype.toString;return"number"==typeof t||!!t&&"object"==typeof t&&"[object Number]"===e.call(t)},ue=function(t){var e=Object.prototype.toString;return"string"==typeof t||!!t&&"object"==typeof t&&"[object String]"===e.call(t)},ce=function(){};function de(t){t=Bt(t);var s=Ut(t).reduce(function(t,e){return t[e.id]=e.clone(),t},{});return Ut(t).forEach(function(t){var e=s[t.id];if(e.isLink()){var n=e.source(),i=e.target();n.id&&s[n.id]&&e.prop("source/id",s[n.id].id),i.id&&s[i.id]&&e.prop("target/id",s[i.id].id)}var r=t.get("parent");r&&s[r]&&e.set("parent",s[r].id);var o=Ut(t.get("embeds")).reduce(function(t,e){return s[e]&&t.push(s[e].id),t},[]);zt(o)||e.set("embeds",o)}),s}function fe(o,s){return function(t,e){var n=pt(t);t=parseFloat(t),n&&(t/=100);var i={};if(isFinite(t)){var r=n||0<=t&&t<=1?t*e[s]:Math.max(t+e[s],0);i[o]=r}return i}}function pe(s,a,h){return function(t,e){var n,i=pt(t);if(t=parseFloat(t),i&&(t/=100),isFinite(t)){var r=e[h]();n=i||0e.width?Pe:Se)(t,e)})},refRCircumscribed:{set:function(t,e){var n=pt(t);t=parseFloat(t),n&&(t/=100);var i,r=Math.sqrt(e.height*e.height+e.width*e.width);return isFinite(t)&&(i=n||0<=t&&t<=1?t*r:Math.max(t+r,0)),{r:i}}},refCx:{set:fe("cx","width")},refCy:{set:fe("cy","height")},xAlignment:{offset:ge("x","width","right")},yAlignment:{offset:ge("y","height","bottom")},resetOffset:{offset:function(t,e){return t?{x:-e.x,y:-e.y}:{x:0,y:0}}},refDResetOffset:{set:me({resetOffset:!0})},refDKeepOffset:{set:me({resetOffset:!1})},refPointsResetOffset:{set:ye({resetOffset:!0})},refPointsKeepOffset:{set:ye({resetOffset:!1})},connection:{qualify:xe,set:function(t){var e,n=t.stubs;if(void 0===n&&(n=0),isFinite(n)&&0!==n){var i;i=n<0?(this.getConnectionLength()+n)/2:n;var r=this.getConnection(),o=r.divideAtLength(i),s=r.divideAtLength(-i);o&&s&&(e=o[0].serialize()+" "+s[1].serialize())}return{d:e||this.getSerializedConnection()}}},atConnectionLengthKeepGradient:{qualify:xe,set:we("getTangentAtLength",{rotate:!0})},atConnectionLengthIgnoreGradient:{qualify:xe,set:we("getTangentAtLength",{rotate:!1})},atConnectionRatioKeepGradient:{qualify:xe,set:we("getTangentAtRatio",{rotate:!0})},atConnectionRatioIgnoreGradient:{qualify:xe,set:we("getTangentAtRatio",{rotate:!1})}};ke.refR=ke.refRInscribed,ke.refD=ke.refDResetOffset,ke.refPoints=ke.refPointsResetOffset,ke.atConnectionLength=ke.atConnectionLengthKeepGradient,ke.atConnectionRatio=ke.atConnectionRatioKeepGradient,ke.refX2=ke.refX,ke.refY2=ke.refY,ke.refWidth2=ke.refWidth,ke.refHeight2=ke.refHeight,ke["ref-x"]=ke.refX,ke["ref-y"]=ke.refY,ke["ref-dy"]=ke.refDy,ke["ref-dx"]=ke.refDx,ke["ref-width"]=ke.refWidth,ke["ref-height"]=ke.refHeight,ke["x-alignment"]=ke.xAlignment,ke["y-alignment"]=ke.yAlignment;var Ee=ke,Ce=s.Model.extend({constructor:function(t,e){var n,i=t||{};this.cid=oe("c"),this.attributes={},e&&e.collection&&(this.collection=e.collection),e&&e.parse&&(i=this.parse(i,e)||{}),(n=Qt(this,"defaults"))&&(i=se({},n,i)),this.set(i,e),this.changed={},this.initialize.apply(this,arguments)},translate:function(t,e,n){throw new Error("Must define a translate() method.")},toJSON:function(){var e=this.constructor.prototype.defaults.attrs||{},t=this.attributes.attrs,o={};ie(t,function(t,i){var r=e[i];ie(t,function(t,n){he(t)&&!Array.isArray(t)?ie(t,function(t,e){r&&r[n]&&It(r[n][e],t)||(o[i]=o[i]||{},(o[i][n]||(o[i][n]={}))[e]=t)}):r&&It(r[n],t)||(o[i]=o[i]||{},o[i][n]=t)})});var n=Dt(te(this.attributes,"attrs"));return n.attrs=o,n},initialize:function(t){t&&t.id||this.set("id",this.generateId(),{silent:!0}),this._transitionIds={},this.processPorts(),this.on("change:attrs",this.processPorts,this)},generateId:function(){return ht()},processPorts:function(){var t=this.ports,n={};ie(this.get("attrs"),function(t,e){t&&t.port&&(void 0!==t.port.id?n[t.port.id]=t.port:n[t.port]={id:t.port})});var i={};(ie(t,function(t,e){n[e]||(i[e]=!0)}),this.graph&&!zt(i))&&(this.graph.getConnectedLinks(this,{inbound:!0}).forEach(function(t){i[t.get("target").port]&&t.remove()}),this.graph.getConnectedLinks(this,{outbound:!0}).forEach(function(t){i[t.get("source").port]&&t.remove()}));this.ports=n},remove:function(t){t=t||{};var e=this.graph;if(!e)return this.collection&&this.collection.remove(this,t),this;e.startBatch("remove");var n=this.getParentCell();n&&n.unembed(this);for(var i=this.getEmbeddedCells(),r=0,o=i.length;rl[2]?(s=".3em",r=u,o=0,"start"):hc[2]?(s=".3em",r=-l,o=0,"end"):h "+e),n=this.getSelector(t.parentNode,n)}return n},getLinkEnd:function(t){for(var e,n=[],i=arguments.length-1;0r.options.clickThreshold||this.notify("element:magnet:pointerclick",t,e,n,i)}});Nt(Ze.prototype,qe);var Je={_results:{},_tests:{svgforeignobject:function(){return!!document.createElementNS&&/SVGForeignObject/.test({}.toString.call(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")))}},addTest:function(t,e){return this._tests[t]=e},test:function(t){var e=this._tests[t];if(!e)throw new Error('Test not defined ("'+t+'"). Use `joint.env.addTest(name, fn) to add a new test.`');var n=this._results[t];if(void 0!==n)return n;try{n=e()}catch(t){n=!1}return this._results[t]=n}},Ke=He.define("basic.Generic",{attrs:{".":{fill:"#ffffff",stroke:"none"}}}),Qe=Ke.define("basic.Rect",{attrs:{rect:{fill:"#ffffff",stroke:"#000000",width:100,height:60},text:{fill:"#000000",text:"","font-size":14,"ref-x":.5,"ref-y":.5,"text-anchor":"middle","y-alignment":"middle","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),tn=Ze.extend({presentationAttributes:Ze.addPresentationAttributes({attrs:["SCALE"]}),confirmUpdate:function(){var t=Ze.prototype.confirmUpdate.apply(this,arguments);return this.hasFlag(t,"SCALE")&&(this.resize(),t=this.removeFlag(t,"SCALE")),t}}),en=Ke.define("basic.Text",{attrs:{text:{"font-size":18,fill:"#000000"}}},{markup:''}),nn=Ke.define("basic.Circle",{size:{width:60,height:60},attrs:{circle:{fill:"#ffffff",stroke:"#000000",r:30,cx:30,cy:30},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-y":.5,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),rn=Ke.define("basic.Ellipse",{size:{width:60,height:40},attrs:{ellipse:{fill:"#ffffff",stroke:"#000000",rx:30,ry:20,cx:30,cy:20},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-y":.5,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),on=Ke.define("basic.Polygon",{size:{width:60,height:40},attrs:{polygon:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),sn=Ke.define("basic.Polyline",{size:{width:60,height:40},attrs:{polyline:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),an=Ke.define("basic.Image",{attrs:{text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),hn=Ke.define("basic.Path",{size:{width:60,height:60},attrs:{path:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle",ref:"path","ref-x":.5,"ref-dy":10,fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),ln=hn.define("basic.Rhombus",{attrs:{path:{d:"M 30 0 L 60 30 30 60 0 30 z"},text:{"ref-y":.5,"ref-dy":null,"y-alignment":"middle"}}}),un=Je.test("svgforeignobject"),cn=Ke.define("basic.TextBlock",{attrs:{rect:{fill:"#ffffff",stroke:"#000000",width:80,height:100},text:{fill:"#000000","font-size":14,"font-family":"Arial, helvetica, sans-serif"},".content":{text:"","ref-x":.5,"ref-y":.5,"y-alignment":"middle","x-alignment":"middle"}},content:""},{markup:['','',un?'
':'',""].join(""),initialize:function(){this.listenTo(this,"change:size",this.updateSize),this.listenTo(this,"change:content",this.updateContent),this.updateSize(this,this.get("size")),this.updateContent(this,this.get("content")),Ke.prototype.initialize.apply(this,arguments)},updateSize:function(t,e){this.attr({".fobj":Nt({},e),div:{style:Nt({},e)}})},updateContent:function(t,e){un?this.attr({".content":{html:mt(e)}}):this.attr({".content":{text:e}})},setForeignObjectSize:function(){this.updateSize.apply(this,arguments)},setDivContent:function(){this.updateContent.apply(this,arguments)}}),dn=Ze.extend({presentationAttributes:un?Ze.prototype.presentationAttributes:Ze.addPresentationAttributes({content:["CONTENT"],size:["CONTENT"]}),initFlag:["RENDER","CONTENT"],confirmUpdate:function(){var t=Ze.prototype.confirmUpdate.apply(this,arguments);return this.hasFlag(t,"CONTENT")&&(this.updateContent(this.model),t=this.removeFlag(t,"CONTENT")),t},update:function(t,e){var n=this.model;if(un)Ze.prototype.update.call(this,n,e);else{var i=te(e||n.get("attrs"),".content");Ze.prototype.update.call(this,n,i),e&&!Kt(e,".content")||this.updateContent(n,e)}},updateContent:function(t,e){var n=se({},(e||t.get("attrs"))[".content"]);n=te(n,"text");var i=vt(t.get("content"),t.get("size"),n,{svgDocument:this.paper.svg}),r=ot({},".content",n,"/");r[".content"].text=i,Ze.prototype.update.call(this,t,r)}}),fn={Generic:Ke,Rect:Qe,TextView:tn,Text:en,Circle:nn,Ellipse:rn,Polygon:on,Polyline:sn,Image:an,Path:hn,Rhombus:ln,TextBlock:cn,TextBlockView:dn},pn=Ce.extend({markup:['','','','','','','',''].join(""),toolMarkup:['','','','',"Remove link.","",'','','',"Link options.","",""].join(""),doubleToolMarkup:void 0,vertexMarkup:['','','','',"Remove vertex.","",""].join(""),arrowheadMarkup:['','',""].join(""),defaultLabel:void 0,labelMarkup:void 0,_builtins:{defaultLabel:{markup:[{tagName:"rect",selector:"rect"},{tagName:"text",selector:"text"}],attrs:{text:{fill:"#000000",fontSize:14,textAnchor:"middle",yAlignment:"middle",pointerEvents:"none"},rect:{ref:"text",fill:"#ffffff",rx:3,ry:3,refWidth:1,refHeight:1,refX:0,refY:0}},position:{distance:.5}}},defaults:{type:"link",source:{},target:{}},isLink:function(){return!0},disconnect:function(t){return this.set({source:{x:0,y:0},target:{x:0,y:0}},t)},source:function(t,e,n){return void 0===t?Ot(this.get("source")):(r=t instanceof Ce?((i=Ot(e)||{}).id=t.id,n):Gt(t)?(i=t,e):((i=Ot(e)||{}).x=t.x,i.y=t.y,n),this.set("source",i,r));var i,r},target:function(t,e,n){return void 0===t?Ot(this.get("target")):(r=t instanceof Ce?((i=Ot(e)||{}).id=t.id,n):Gt(t)?(i=t,e):((i=Ot(e)||{}).x=t.x,i.y=t.y,n),this.set("target",i,r));var i,r},router:function(t,e,n){if(void 0===t){var i=this.get("router");return i?"object"==typeof i?Ot(i):i:this.get("manhattan")?{name:"orthogonal"}:null}var r="object"==typeof t||"function"==typeof t,o=r?t:{name:t,args:e},s=r?e:n;return this.set("router",o,s)},connector:function(t,e,n){if(void 0===t){var i=this.get("connector");return i?"object"==typeof i?Ot(i):i:this.get("smooth")?{name:"smooth"}:null}var r="object"==typeof t||"function"==typeof t,o=r?t:{name:t,args:e},s=r?e:n;return this.set("connector",o,s)},label:function(t,e,n){var i=this.labels();return(t=isFinite(t)&&null!==t?0|t:0)<0&&(t=i.length+t),arguments.length<=1?this.prop(["labels",t]):this.prop(["labels",t],e,n)},labels:function(t,e){return 0===arguments.length?(t=this.get("labels"),Array.isArray(t)?t.slice():[]):(Array.isArray(t)||(t=[]),this.set("labels",t,e))},insertLabel:function(t,e,n){if(!e)throw new Error("dia.Link: no label provided");var i=this.labels(),r=i.length;return(t=isFinite(t)&&null!==t?0|t:r)<0&&(t=r+t+1),i.splice(t,0,e),this.labels(i,n)},appendLabel:function(t,e){return this.insertLabel(-1,t,e)},removeLabel:function(t,e){var n=this.labels();return t=isFinite(t)&&null!==t?0|t:-1,n.splice(t,1),this.labels(n,e)},vertex:function(t,e,n){var i=this.vertices();if((t=isFinite(t)&&null!==t?0|t:0)<0&&(t=i.length+t),arguments.length<=1)return this.prop(["vertices",t]);var r=this._normalizeVertex(e);return this.prop(["vertices",t],r,n)},vertices:function(t,e){if(0===arguments.length)return t=this.get("vertices"),Array.isArray(t)?t.slice():[];Array.isArray(t)||(t=[]);for(var n=[],i=0;i=Math.abs(t.y-e.y)){var l=(t.x+e.x)/2;h=D.createSegment("C",l,t.y,l,e.y,e.x,e.y),r.appendSegment(h)}else{var u=(t.y+e.y)/2;h=D.createSegment("C",t.x,u,e.x,u,e.x,e.y),r.appendSegment(h)}}return o?r:r.serialize()}},Dn={stroke:{defaultOptions:{padding:3,rx:0,ry:0,attrs:{"stroke-width":3,stroke:"#FEB663"}},_views:{},getHighlighterId:function(t,e){return t.id+JSON.stringify(e)},removeHighlighter:function(t){this._views[t]&&(this._views[t].remove(),this._views[t]=null)},highlight:function(t,e,n){var i=this.getHighlighterId(e,n);if(!this._views[i]){var r,o=Vt(n||{},this.defaultOptions),s=K(e);try{var a=s.convertToPathData()}catch(t){r=s.bbox(!0),a=K.rectToPath(Nt({},o,r))}var h=K("path").attr({d:a,"pointer-events":"none","vector-effect":"non-scaling-stroke",fill:"none"}).attr(o.attrs);if(t.isNodeConnection(e))h.attr("d",t.getSerializedConnection());else{var l=s.getTransformToElement(t.el),u=o.padding;if(u){r||(r=s.bbox(!0));var c=r.x+r.width/2,d=r.y+r.height/2;r=K.transformRect(r,l);var f=Math.max(r.width,1),p=Math.max(r.height,1),g=(f+u)/f,v=(p+u)/p,m=K.createSVGMatrix({a:g,b:0,c:0,d:v,e:c-g*c,f:d-v*d});l=l.multiply(m)}h.transform(l)}var y=this._views[i]=new $e({svgElement:!0,className:"highlight-stroke",el:h.node}),w=this.removeHighlighter.bind(this,i),b=t.model;y.listenTo(b,"remove",w),y.listenTo(b.graph,"reset",w),t.vel.append(h)}},unhighlight:function(t,e,n){this.removeHighlighter(this.getHighlighterId(e,n))}},opacity:{highlight:function(t,e){K(e).addClass(tt("highlight-opacity"))},unhighlight:function(t,e){K(e).removeClass(tt("highlight-opacity"))}},addClass:{className:tt("highlighted"),highlight:function(t,e,n){var i=(n||{}).className||this.className;K(e).addClass(i)},unhighlight:function(t,e,n){var i=(n||{}).className||this.className;K(e).removeClass(i)}}};function zn(t,e,n){if(Gt(n)){var i=n.x,r=n.y;if(isFinite(r)){var o=new O(e,t).parallel(r);e=o.start,t=o.end}n=i}if(!isFinite(n))return t;var s=t.distance(e);return 0===n&&0e.y?"N":"S":t.y===e.y?t.x>e.x?"W":"E":null}function ri(t){return new X(t.x,t.y,0,0)}function oi(t){var e=xt(t.padding||t.elementPadding||20);return{x:-e.left,y:-e.top,width:e.left+e.right,height:e.top+e.bottom}}function si(t,e){return t.sourceBBox.clone().moveAndExpand(oi(e))}function ai(t,e){return t.targetBBox.clone().moveAndExpand(oi(e))}function hi(t,e,n){var i=new z(t.x,e.y),r=new z(e.x,t.y),o=ii(t,i),s=ii(t,r),a=Qn[n],h=o===n||o!==a&&(s===a||s!==n)?i:r;return{points:[h],direction:ii(h,e)}}function li(t,e,n){var i=ei(t,e,n);return{points:[i],direction:ii(i,e)}}function ui(e,t,n,i){var r,o={},s=[new z(e.x,t.y),new z(t.x,e.y)],a=s.filter(function(t){return!n.containsPoint(t)}),h=a.filter(function(t){return ii(t,e)!==i});if(0l.center().distance(t),c=u?e:t,d=u?t:e;return s=ei(o=r?(o=z.fromPolar(l.width+l.height,ti[r],c),l.pointNearestToPoint(o).move(o,-1)):l.pointNearestToPoint(c).move(c,1),d,l),o.round().equals(s.round())?(s=z.fromPolar(l.width+l.height,A(o.theta(c))+Math.PI/2,d),a=ei(o,s=l.pointNearestToPoint(s).move(d,1).round(),l),h.points=u?[s,a,o]:[o,a,s]):h.points=u?[s,o]:[o,s],h.direction=ii(u?o:s,e),h}function fi(t,e,n){var i,r,o,s,a,h=si(n,e),l=ai(n,e),u=(r=e,(i=n).sourceAnchor?i.sourceAnchor:si(i,r).center()),c=(s=e,(o=n).targetAnchor?o.targetAnchor:ai(o,s).center());h=h.union(ri(u)),l=l.union(ri(c)),(t=Ut(t).map(z)).unshift(u),t.push(c);for(var d=[],f=0,p=t.length-1;fi.maxAllowedDirectionChange)){var H=Si(D.clone().offset(T.gridOffsetX,T.gridOffsetY),w,h),Y=ki(H);if(!b.isClose(Y)&&n.isPointAccessible(H)){if(0<=_.indexOf(Y))if(!H.equals(f))if(xi(q,bi(H,f,F,w,i))>i.maxAllowedDirectionChange)continue;var $=I+T.cost+(G?0:i.penalties[L]);(!b.isOpen(Y)||$=this.options.longLinkLength){var r=this.options.doubleLinkToolsOffset||e;i=this.getPointAtLength(n-r),this._tool2Cache.attr("transform","translate("+i.x+", "+i.y+") "+t),this._tool2Cache.attr("visibility","visible")}else this.options.doubleLinkTools&&this._tool2Cache.attr("visibility","hidden")}return this},updateArrowheadMarkers:function(){if(!this._V.markerArrowheads)return this;if("none"===C.css(this._V.markerArrowheads.node,"display"))return this;var t=this.getConnectionLength()'),o=["<"+n+">",Ut(i).map(function(t){return r({offset:t.offset,color:t.color,opacity:Number.isFinite(t.opacity)?t.opacity:1})}).join(""),""].join(""),s=Nt({id:e},t.attrs);K(o,s).appendTo(this.defs)}return e},defineMarker:function(t){if(!he(t))throw new TypeError("dia.Paper: defineMarker() requires 1. argument to be an object.");var e=t.id;if(e||(e=this.svg.id+it(JSON.stringify(t))),!this.isDefined(e)){var n=te(t,"type","userSpaceOnUse");K("marker",{id:e,orient:"auto",overflow:"visible",markerUnits:t.markerUnits||"userSpaceOnUse"},[K(t.type||"path",n)]).appendTo(this.defs)}return e}},{sorting:Hi,backgroundPatterns:{flipXy:function(t){var e=document.createElement("canvas"),n=t.width,i=t.height;e.width=2*n,e.height=2*i;var r=e.getContext("2d");return r.drawImage(t,0,0,n,i),r.setTransform(-1,0,0,-1,e.width,e.height),r.drawImage(t,0,0,n,i),r.setTransform(-1,0,0,1,e.width,0),r.drawImage(t,0,0,n,i),r.setTransform(1,0,0,-1,0,e.height),r.drawImage(t,0,0,n,i),e},flipX:function(t){var e=document.createElement("canvas"),n=t.width,i=t.height;e.width=2*n,e.height=i;var r=e.getContext("2d");return r.drawImage(t,0,0,n,i),r.translate(2*n,0),r.scale(-1,1),r.drawImage(t,0,0,n,i),e},flipY:function(t){var e=document.createElement("canvas"),n=t.width,i=t.height;e.width=n,e.height=2*i;var r=e.getContext("2d");return r.drawImage(t,0,0,n,i),r.translate(0,2*i),r.scale(1,-1),r.drawImage(t,0,0,n,i),e},watermark:function(t,e){e=e||{};var n=t.width,i=t.height,r=document.createElement("canvas");r.width=3*n,r.height=3*i;for(var o=r.getContext("2d"),s=le(e.watermarkAngle)?-e.watermarkAngle:-20,a=A(s),h=r.width/4,l=r.height/4,u=0;u<4;u++)for(var c=0;c<4;c++)0<(u+c)%2&&(o.setTransform(1,0,0,1,(2*u-1)*h,(2*c-1)*l),o.rotate(a),o.drawImage(t,-n/2,-i/2,n,i));return r}},gridPatterns:{dot:[{color:"#AAAAAA",thickness:1,markup:"rect",update:function(t,e){K(t).attr({width:e.thickness*e.sx,height:e.thickness*e.sy,fill:e.color})}}],fixedDot:[{color:"#AAAAAA",thickness:1,markup:"rect",update:function(t,e){var n=e.sx<=1?e.thickness*e.sx:e.thickness;K(t).attr({width:n,height:n,fill:e.color})}}],mesh:[{color:"#AAAAAA",thickness:1,markup:"path",update:function(t,e){var n,i=e.width,r=e.height,o=e.thickness;n=0<=i-o&&0<=r-o?["M",i,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",K(t).attr({d:n,stroke:e.color,"stroke-width":e.thickness})}}],doubleMesh:[{color:"#AAAAAA",thickness:1,markup:"path",update:function(t,e){var n,i=e.width,r=e.height,o=e.thickness;n=0<=i-o&&0<=r-o?["M",i,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",K(t).attr({d:n,stroke:e.color,"stroke-width":e.thickness})}},{color:"#000000",thickness:3,scaleFactor:4,markup:"path",update:function(t,e){var n,i=e.width,r=e.height,o=e.thickness;n=0<=i-o&&0<=r-o?["M",i,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",K(t).attr({d:n,stroke:e.color,"stroke-width":e.thickness})}}]}}),Wi=$e.extend({name:null,tagName:"g",className:"tool",svgElement:!0,_visible:!0,init:function(){var t=this.name;t&&this.vel.attr("data-tool-name",t)},configure:function(t,e){return this.relatedView=t,this.paper=t.paper,this.parentView=e,this.simulateRelatedView(this.el),this.delegateEvents(),this},simulateRelatedView:function(t){t&&t.setAttribute("model-id",this.relatedView.model.id)},getName:function(){return this.name},show:function(){this.el.style.display="",this._visible=!0},hide:function(){this.el.style.display="none",this._visible=!1},isVisible:function(){return!!this._visible},focus:function(){var t=this.options.focusOpacity;isFinite(t)&&(this.el.style.opacity=t),this.parentView.focusTool(this)},blur:function(){this.el.style.opacity="",this.parentView.blurTool(this)},update:function(){},guard:function(t){var e=this.paper,n=this.relatedView;return!e||!n||e.guard(t,n)}}),Zi=$e.extend({tagName:"g",className:"tools",svgElement:!0,tools:null,options:{tools:null,relatedView:null,name:null,component:!1},configure:function(t){var e=(t=Nt(this.options,t)).tools;if(!Array.isArray(e))return this;var n=t.relatedView;if(!(n instanceof We))return this;for(var i=this.tools=[],r=0,o=e.length;r [IBezierCurve, IBezierCurve]; - export function getFirectControlPoints(rhs: number[]): number[]; + export function getFirstControlPoints(rhs: number[]): number[]; export function getInversionSolver( p0: PlainPoint, @@ -1074,6 +1080,8 @@ export namespace dia { type MarkupJSON = MarkupNodeJSON[]; + type Path = string | Array; + export namespace Graph { interface Options { @@ -1215,6 +1223,7 @@ export namespace dia { interface Constructor { new (opt?: { id: string }): T + define(type: string, defaults?: any, protoProps?: any, staticProps?: any): dia.Cell.Constructor; } interface Options { @@ -1242,8 +1251,8 @@ export namespace dia { constructor(attributes?: Cell.Attributes, opt?: Graph.Options); id: string | number; - graph: Graph; + markup: string | MarkupJSON; protected generateId(): string | number; @@ -1268,20 +1277,20 @@ export namespace dia { isEmbedded(): boolean; - prop(key: string | string[]): any; + prop(key: Path): any; prop(object: Cell.Attributes, opt?: Cell.Options): this; - prop(key: string | string[], value: any, opt?: Cell.Options): this; + prop(key: Path, value: any, opt?: Cell.Options): this; - removeProp(path: string | string[], opt?: Cell.Options): this; + removeProp(path: Path, opt?: Cell.Options): this; - attr(key?: string): any; + attr(key?: Path): any; attr(object: Cell.Selectors, opt?: Cell.Options): this; - attr(key: string, value: any, opt?: Cell.Options): this; + attr(key: Path, value: any, opt?: Cell.Options): this; clone(): Cell; clone(opt: Cell.EmbeddableOptions): Cell | Cell[]; - removeAttr(path: string | string[], opt?: Cell.Options): this; + removeAttr(path: Path, opt?: Cell.Options): this; transition(path: string, value?: any, opt?: Cell.TransitionOptions, delim?: string): number; @@ -1429,7 +1438,9 @@ export namespace dia { getPortIndex(port: string | Element.Port): number; - portProp(portId: string, path: any, value?: any, opt?: Cell.Options): Element; + portProp(portId: string, path: dia.Path): any; + + portProp(portId: string, path: dia.Path, value?: any, opt?: Cell.Options): Element; protected generatePortId(): string | number; @@ -1502,7 +1513,6 @@ export namespace dia { class Link extends Cell { - markup: string; toolMarkup: string; doubleToolMarkup?: string; vertexMarkup: string; @@ -1693,7 +1703,11 @@ export namespace dia { protected onmagnet(evt: dia.Event, x: number, y: number): void; - static addPresentationAttributes(attributes: CellView.PresentationAttributes): CellView.PresentationAttributes + static addPresentationAttributes(attributes: CellView.PresentationAttributes): CellView.PresentationAttributes; + + protected getLinkEnd(magnet: SVGElement, x: number, y: number, link: dia.Link, endType: dia.LinkEnd): dia.Link.EndJSON; + + protected customizeLinkEnd(end: dia.Link.EndJSON, magnet: SVGElement, x: number, y: number, link: dia.Link, endType: dia.LinkEnd): dia.Link.EndJSON; } class CellView extends CellViewGeneric { @@ -1842,6 +1856,14 @@ export namespace dia { setInteractivity(value: boolean | LinkView.InteractivityOptions): void; + getEndView(endType: dia.LinkEnd): dia.CellView | null; + + getEndAnchor(endType: dia.LinkEnd): g.Point; + + getEndConnectionPoint(endType: dia.LinkEnd): g.Point; + + getEndMagnet(endType: dia.LinkEnd): SVGElement | null; + protected onLabelsChange(link: Link, labels: Link.Label[], opt: { [key: string]: any }): void; protected onToolsChange(link: Link, toolsMarkup: string, opt: { [key: string]: any }): void; @@ -1933,14 +1955,32 @@ export namespace dia { type UpdateStats = { priority: number; updated: number; - postponed: number; - unmounted: number; - mounted: number; - empty: boolean; + empty?: boolean; + postponed?: number; + unmounted?: number; + mounted?: number; + batches?: number; }; - type ViewportCallback = (view: mvc.View, isDetached: boolean, paper: Paper) => boolean; + type ViewportCallback = (view: mvc.View, isMounted: boolean, paper: Paper) => boolean; type ProgressCallback = (done: boolean, processed: number, total: number, stats: UpdateStats, paper: Paper) => void; + type BeforeRenderCallback = (opt: { [key: string]: any }, paper: Paper) => void; + type AfterRenderCallback = (stats: UpdateStats, opt: { [key: string]: any }, paper: Paper) => void; + + interface FreezeOptions { + key?: string; + } + + interface UnfreezeOptions { + key?: string; + mountBatchSize?: number; + unmountBatchSize?: number; + batchSize?: number; + viewport?: ViewportCallback; + progress?: ProgressCallback; + beforeRender?: BeforeRenderCallback; + afterRender?: AfterRenderCallback; + } interface Options extends mvc.ViewOptions { // appearance @@ -1997,12 +2037,14 @@ export namespace dia { sorting?: sorting; frozen?: boolean; viewport?: ViewportCallback | null; - onViewUpdate?: (view: mvc.View, flag: number, opt: { [key: string]: any }, paper: Paper) => void; + onViewUpdate?: (view: mvc.View, flag: number, priority: number, opt: { [key: string]: any }, paper: Paper) => void; onViewPostponed?: (view: mvc.View, flag: number, paper: Paper) => boolean; + beforeRender?: Paper.BeforeRenderCallback + afterRender?: Paper.AfterRenderCallback } interface ScaleContentOptions { - padding?: number; + padding?: Padding; preserveAspectRatio?: boolean; minScale?: number; minScaleX?: number; @@ -2166,18 +2208,9 @@ export namespace dia { // rendering - freeze(opt?: { - key?: string - }): void; + freeze(opt?: Paper.FreezeOptions): void; - unfreeze(opt?: { - key?: string; - mountBatchSize?: number; - unmountBatchSize?: number; - batchSize?: number; - viewport?: Paper.ViewportCallback; - progress?: Paper.ProgressCallback; - }): void; + unfreeze(opt?: Paper.UnfreezeOptions): void; isFrozen(): boolean; @@ -2211,6 +2244,8 @@ export namespace dia { batches: number; }; + hasScheduledUpdates(): boolean; + // protected protected scheduleViewUpdate(view: mvc.View, flag: number, priority: number, opt?: { [key: string]: any }): void; @@ -2231,6 +2266,7 @@ export namespace dia { unmountBatchSize?: number; viewport?: Paper.ViewportCallback; progress?: Paper.ProgressCallback; + before?: Paper.BeforeRenderCallback }): void; protected updateViewsBatch(opt?: { @@ -3252,6 +3288,7 @@ export namespace util { eol?: string; ellipsis?: boolean | string; hyphen?: string | RegExp; + maxLineCount?: number; }): string; export function sanitizeHTML(html: string): string; @@ -3417,6 +3454,11 @@ export namespace util { type IterateeFunction = (value: any) => NotVoid; type IterateeShorthand = PropertyPath; // there are other shorthands in Lodash but not in the methods we duplicate + interface Cancelable { + cancel(): void; + flush(): void; + } + type SourceObjectsOptionalFinalCustomizer = Array; // typescript cannot express "any number of objects optionally followed by CustomizerFunction" type CustomizerFunction = (objValue: any, srcValue: any, key: string, object: any, source: any, stack: any) => NotVoid; @@ -3460,7 +3502,7 @@ export namespace util { export function toArray(value: any): any[]; - export function debounce(func: Function, wait?: number, options?: object): Function; + export function debounce(func: T, wait?: number, options?: object): T & Cancelable; export function groupBy(collection: Collection, iteratee?: Iteratee): object; @@ -3595,6 +3637,9 @@ export namespace mvc { constructor(opt?: ViewOptions); UPDATE_PRIORITY: number; + DETACHABLE: boolean; + FLAG_INSERT: number; + FLAG_REMOVE: number; vel: Vectorizer | null; @@ -3896,8 +3941,15 @@ export namespace linkAnchors { export namespace connectionPoints { + type ConnectionPointAlignment = 'top' | 'bottom' | 'left' | 'right'; + interface DefaultConnectionPointArguments { - offset?: number; + offset?: number | dia.Point; + } + + interface AlignConnectionPointArguments extends DefaultConnectionPointArguments { + align?: ConnectionPointAlignment | null; + alignOffset?: number; } interface StrokeConnectionPointArguments extends DefaultConnectionPointArguments { @@ -4125,6 +4177,7 @@ export namespace attributes { height?: string | number; ellipsis?: boolean | string; hyphen?: string; + maxLineCount?: number; [key: string]: any } @@ -4388,6 +4441,7 @@ export namespace linkTools { redundancyRemoval?: boolean; segmentLengthThreshold?: number; anchor?: AnchorCallback; + stopPropagation?: boolean; } } @@ -4422,6 +4476,7 @@ export namespace linkTools { interface Options extends dia.ToolView.Options { snap?: AnchorCallback, anchor?: AnchorCallback, + resetAnchor?: boolean | anchors.AnchorJSON; customAnchorAttributes?: attributes.NativeSVGAttributes; defaultAnchorAttributes?: attributes.NativeSVGAttributes; areaPadding?: number; diff --git a/dist/joint.js b/dist/joint.js index 6628b7f6b..2215b644a 100644 --- a/dist/joint.js +++ b/dist/joint.js @@ -1,4 +1,4 @@ -/*! JointJS v3.1.1 (2019-10-28) - JavaScript diagramming library +/*! JointJS v3.2.0 (2020-06-04) - JavaScript diagramming library This Source Code Form is subject to the terms of the Mozilla Public @@ -1931,6 +1931,18 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. ); }, + parallel: function(distance) { + var l = this.clone(); + if (!this.isDifferentiable()) { return l; } + var start = l.start; + var end = l.end; + var eRef = start.clone().rotate(end, 270); + var sRef = end.clone().rotate(start, 90); + start.move(sRef, distance); + end.move(eRef, distance); + return l; + }, + // @return {point} my point at 't' <0,1> pointAt: function(t) { @@ -2052,6 +2064,11 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return this.start.toString() + ' ' + this.end.toString(); }, + serialize: function() { + + return this.start.serialize() + ' ' + this.end.serialize(); + }, + translate: function(tx, ty) { this.start.translate(tx, ty); @@ -3648,6 +3665,11 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return this.x + '@' + this.y; }, + serialize: function() { + + return this.x + ',' + this.y; + }, + update: function(x, y) { this.x = x || 0; @@ -8810,9 +8832,9 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. }; var breakText = function(text, size, styles, opt) { + if ( styles === void 0 ) styles = {}; + if ( opt === void 0 ) opt = {}; - opt = opt || {}; - styles = styles || {}; var width = size.width; var height = size.height; @@ -8844,6 +8866,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var separator = opt.separator || ' '; var eol = opt.eol || '\n'; var hyphen = opt.hyphen ? new RegExp(opt.hyphen) : /[^\w\d]/; + var maxLineCount = opt.maxLineCount; + if (!isNumber(maxLineCount)) { maxLineCount = Infinity; } var words = text.split(separator); var full = []; @@ -8858,19 +8882,19 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. if (!word) { continue; } if (eol && word.indexOf(eol) >= 0) { - // word cotains end-of-line character + // word contains end-of-line character if (word.length > 1) { // separate word and continue cycle var eolWords = word.split(eol); for (var j = 0, jl = eolWords.length - 1; j < jl; j++) { eolWords.splice(2 * j + 1, 0, eol); } - Array.prototype.splice.apply(words, [i, 1].concat(eolWords)); + words.splice.apply(words, [ i, 1 ].concat( eolWords.filter(function (word) { return word !== ''; }) )); i--; - len += eolWords.length - 1; + len = words.length; } else { - // creates new line - l++; + // creates a new line + lines[++l] = ''; } continue; } @@ -8969,9 +8993,16 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. i--; } - // if size.height is defined we have to check whether the height of the entire - // text exceeds the rect height - if (height !== undefined) { + var lastL = null; + + if (lines.length > maxLineCount) { + + lastL = maxLineCount - 1; + + } else if (height !== undefined) { + + // if size.height is defined we have to check whether the height of the entire + // text exceeds the rect height if (lineHeight === undefined) { @@ -8993,37 +9024,42 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. if (lineHeight * lines.length > height) { // remove overflowing lines - var lastL = Math.floor(height / lineHeight) - 1; - lines.splice(lastL + 1); - - // add ellipsis - var ellipsis = opt.ellipsis; - if (!ellipsis || lastL < 0) { break; } - if (typeof ellipsis !== 'string') { ellipsis = '\u2026'; } - - var lastLine = lines[lastL]; - var k = lastLine.length; - var lastLineWithOmission, lastChar, separatorChar; - do { - lastChar = lastLine[k]; - lastLineWithOmission = lastLine.substring(0, k); - if (!lastChar) { - separatorChar = (typeof separator === 'string') ? separator : ' '; - lastLineWithOmission += separatorChar; - } else if (lastChar.match(separator)) { - lastLineWithOmission += lastChar; - } - lastLineWithOmission += ellipsis; - textNode.data = lastLineWithOmission; - if (textSpan.getComputedTextLength() <= width) { - lines[lastL] = lastLineWithOmission; - break; - } - k--; - } while (k >= 0); - break; + lastL = Math.floor(height / lineHeight) - 1; } } + + if (lastL !== null) { + + lines.splice(lastL + 1); + + // add ellipsis + var ellipsis = opt.ellipsis; + if (!ellipsis || lastL < 0) { break; } + if (typeof ellipsis !== 'string') { ellipsis = '\u2026'; } + + var lastLine = lines[lastL]; + if (!lastLine) { break; } + var k = lastLine.length; + var lastLineWithOmission, lastChar, separatorChar; + do { + lastChar = lastLine[k]; + lastLineWithOmission = lastLine.substring(0, k); + if (!lastChar) { + separatorChar = (typeof separator === 'string') ? separator : ' '; + lastLineWithOmission += separatorChar; + } else if (lastChar.match(separator)) { + lastLineWithOmission += lastChar; + } + lastLineWithOmission += ellipsis; + textNode.data = lastLineWithOmission; + if (textSpan.getComputedTextLength() <= width) { + lines[lastL] = lastLineWithOmission; + break; + } + k--; + } while (k >= 0); + break; + } } if (opt.svgDocument) { @@ -9065,7 +9101,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. // Remove attribute names that start with "on" (e.g. onload, onerror...). // Remove attribute values that start with "javascript:" pseudo protocol (e.g. `href="javascript:alert(1)"`). - if (attrName.indexOf('on') === 0 || attrValue.indexOf('javascript:') === 0) { + if (attrName.startsWith('on') || attrValue.startsWith('javascript:') || attrValue.startsWith('data:') || attrValue.startsWith('vbscript:')) { $(currentNode).removeAttr(attrName); } }); @@ -10472,7 +10508,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. // instead of creating a temporary one over again. svgDocument: this.paper.svg, ellipsis: value.ellipsis, - hyphen: value.hyphen + hyphen: value.hyphen, + maxLineCount: value.maxLineCount }); } else { wrappedText = ''; @@ -12958,6 +12995,14 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return cloneDeep(this.prop('ports/items')) || []; }, + /** + * @returns {Array} + */ + getGroupPorts: function(groupName) { + var groupPorts = toArray(this.prop(['ports','items'])).filter(function (port) { return port.group === groupName; }); + return cloneDeep(groupPorts); + }, + /** * @param {string} id * @returns {object} @@ -13109,45 +13154,39 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. }, removePort: function(port, opt) { - var options = opt || {}; - var ports = assign([], this.prop('ports/items')); - var index$1 = this.getPortIndex(port); - if (index$1 !== -1) { + var ports = assign([], this.prop(['ports', 'items'])); ports.splice(index$1, 1); options.rewrite = true; - this.prop('ports/items', ports, options); + this.startBatch('port-remove'); + this.prop(['ports', 'items'], ports, options); + this.stopBatch('port-remove'); } - return this; }, removePorts: function(portsForRemoval, opt) { - - var options; - + var options, newPorts; if (Array.isArray(portsForRemoval)) { options = opt || {}; - - if (portsForRemoval.length) { - options.rewrite = true; - var currentPorts = assign([], this.prop('ports/items')); - var remainingPorts = currentPorts.filter(function(cp) { - return !portsForRemoval.some(function(rp) { - var rpId = isObject(rp) ? rp.id : rp; - return cp.id === rpId; - }); + if (portsForRemoval.length === 0) { return this.this; } + var currentPorts = assign([], this.prop(['ports', 'items'])); + newPorts = currentPorts.filter(function(cp) { + return !portsForRemoval.some(function(rp) { + var rpId = isObject(rp) ? rp.id : rp; + return cp.id === rpId; }); - this.prop('ports/items', remainingPorts, options); - } + }); } else { options = portsForRemoval || {}; - options.rewrite = true; - this.prop('ports/items', [], options); + newPorts = []; } - + this.startBatch('port-remove'); + options.rewrite = true; + this.prop(['ports', 'items'], newPorts, options); + this.stopBatch('port-remove'); return this; }, @@ -13922,7 +13961,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var endDef = link.get(endType); if (!endDef) { return center; } var portId = endDef.port; - if (!portId) { return center; } + if (!portId || !this.hasPort(portId)) { return center; } var portGroup = this.portProp(portId, ['group']); var portsPositions = this.getPortsPositions(portGroup); var portCenter = new Point(portsPositions[portId]).offset(bbox.origin()); @@ -15091,7 +15130,10 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. children: null, childNodes: null, + DETACHABLE: true, UPDATE_PRIORITY: 2, + FLAG_INSERT: 1<<30, + FLAG_REMOVE: 1<<29, constructor: function(options) { @@ -15723,7 +15765,11 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return selector; }, - getLinkEnd: function(magnet, x, y, link, endType) { + getLinkEnd: function(magnet) { + var ref; + + var args = [], len = arguments.length - 1; + while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ]; var model = this.model; var id = model.id; @@ -15743,13 +15789,18 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. end.selector = this.getSelector(magnet); } - var paper = this.paper; - var connectionStrategy = paper.options.connectionStrategy; + return (ref = this).customizeLinkEnd.apply(ref, [ end, magnet ].concat( args )); + }, + + customizeLinkEnd: function(end, magnet, x, y, link, endType) { + var ref = this; + var paper = ref.paper; + var ref$1 = paper.options; + var connectionStrategy = ref$1.connectionStrategy; if (typeof connectionStrategy === 'function') { var strategy = connectionStrategy.call(paper, end, this, magnet, new Point(x, y), link, endType, paper); - if (strategy) { end = strategy; } + if (strategy) { return strategy; } } - return end; }, @@ -16321,9 +16372,12 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. pointerdown: function(evt, x, y) { - if (this.model.graph) { - this.model.startBatch('pointer'); - this._graph = this.model.graph; + var ref = this; + var model = ref.model; + var graph = model.graph; + if (graph) { + model.startBatch('pointer'); + this.eventData(evt, { graph: graph }); } this.notify('cell:pointerdown', evt, x, y); @@ -16336,13 +16390,15 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. pointerup: function(evt, x, y) { + var ref = this.eventData(evt); + var graph = ref.graph; + this.notify('cell:pointerup', evt, x, y); - if (this._graph) { + if (graph) { // we don't want to trigger event on model as model doesn't // need to be member of collection anymore (remove) - this._graph.stopBatch('pointer', { cell: this.model }); - delete this._graph; + graph.stopBatch('pointer', { cell: this.model }); } }, @@ -19097,25 +19153,44 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var ref$1 = this; var model = ref$1.model; var attributes = model.attributes; + var updateLabels = this.hasFlag(flags, 'LABELS'); + var updateTools = this.hasFlag(flags, 'TOOLS'); + + if (updateLabels) { + this.onLabelsChange(model, attributes.labels, opt); + flags = this.removeFlag(flags, 'LABELS'); + } + + if (updateTools) { + this.renderTools(); + flags = this.removeFlag(flags, 'TOOLS'); + } if (this.hasFlag(flags, 'UPDATE')) { this.update(model, null, opt); flags = this.removeFlag(flags, 'UPDATE'); + updateLabels = false; + updateTools = false; } - if (this.hasFlag(flags, 'LABELS')) { - this.onLabelsChange(model, attributes.labels, opt); - flags = this.removeFlag(flags, 'LABELS'); + if (updateLabels) { + this.updateLabelPositions(); } - if (this.hasFlag(flags, 'TOOLS')) { - this.renderTools().updateToolsPosition(); - flags = this.removeFlag(flags, 'TOOLS'); + if (updateTools) { + this.updateToolsPosition(); } return flags; }, + requestConnectionUpdate: function(opt) { + var ref = this; + var paper = ref.paper; + var UPDATE_PRIORITY = ref.UPDATE_PRIORITY; + if (paper) { paper.requestViewUpdate(this, this.getFlag('UPDATE'), UPDATE_PRIORITY, opt); } + }, + isLabelsRenderRequired: function(opt) { if ( opt === void 0 ) opt = {}; @@ -19156,8 +19231,6 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. } else { this.updateLabels(); } - - this.updateLabelPositions(); }, // Rendering. @@ -19583,6 +19656,17 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. } }, + getEndConnectionPoint: function(type) { + switch (type) { + case 'source': + return new Point(this.sourcePoint); + case 'target': + return new Point(this.targetPoint); + default: + throw new Error('dia.LinkView: type parameter required.'); + } + }, + getEndMagnet: function(type) { switch (type) { case 'source': @@ -19895,11 +19979,13 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var defaultPosition = merge({}, builtinDefaultLabelPosition, defaultLabelPosition); for (var idx = 0, n = labels.length; idx < n; idx++) { + var labelNode = this._labelCache[idx]; + if (!labelNode) { continue; } var label = labels[idx]; var labelPosition = this._normalizeLabelPosition(label.position); var position = merge({}, defaultPosition, labelPosition); var transformationMatrix = this._getLabelTransformationMatrix(position); - this._labelCache[idx].setAttribute('transform', V.matrixToTransformString(transformationMatrix)); + labelNode.setAttribute('transform', V.matrixToTransformString(transformationMatrix)); } return this; @@ -20714,6 +20800,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. } this.notifyPointerdown(evt, x, y); + this.paper.delegateDragEvents(this, evt.data); } else { CellView.prototype.onevent.apply(this, arguments); @@ -20834,15 +20921,13 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. dragArrowhead: function(evt, x, y) { - var data = this.eventData(evt); - if (this.paper.options.snapLinks) { - this._snapArrowhead(x, y, data); + this._snapArrowhead(evt, x, y); } else { - this._connectArrowhead(this.getEventTarget(evt), x, y, data); + this._connectArrowhead(this.getEventTarget(evt), x, y, this.eventData(evt)); } }, @@ -20933,8 +21018,9 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. } }, - _snapArrowhead: function(x, y, data) { + _snapArrowhead: function(evt, x, y) { + var data = this.eventData(evt); // checking view in close area of the pointer var r = this.paper.options.snapLinks.radius || 50; @@ -20945,53 +21031,43 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. data.closestView = data.closestMagnet = null; - var distance; var minDistance = Number.MAX_VALUE; - var pointer = Point(x, y); + var pointer = new Point(x, y); var paper = this.paper; viewsInArea.forEach(function(view) { - + var candidates = []; // skip connecting to the element in case '.': { magnet: false } attribute present if (view.el.getAttribute('magnet') !== 'false') { - - // find distance from the center of the model to pointer coordinates - distance = view.model.getBBox().center().distance(pointer); - - // the connection is looked up in a circle area by `distance < r` - if (distance < r && distance < minDistance) { - - if (prevClosestMagnet === view.el || paper.options.validateConnection.apply( - paper, data.validateConnectionArgs(view, null) - )) { - minDistance = distance; - data.closestView = view; - data.closestMagnet = view.el; - } - } + candidates.push({ + bbox: view.model.getBBox(), + magnet: view.el + }); } - view.$('[magnet]').each(function(index, magnet) { - - var bbox = view.getNodeBBox(magnet); - - distance = pointer.distance({ - x: bbox.x + bbox.width / 2, - y: bbox.y + bbox.height / 2 + view.$('[magnet]').toArray().forEach(function (magnet) { + candidates.push({ + bbox: view.getNodeBBox(magnet), + magnet: magnet }); + }); - if (distance < r && distance < minDistance) { - - if (prevClosestMagnet === magnet || paper.options.validateConnection.apply( - paper, data.validateConnectionArgs(view, magnet) + candidates.forEach(function (candidate) { + var magnet = candidate.magnet; + var bbox = candidate.bbox; + // find distance from the center of the model to pointer coordinates + var distance = bbox.center().squaredDistance(pointer); + // the connection is looked up in a circle area by `distance < r` + if (distance < minDistance) { + if (prevClosestMagnet === view.el || paper.options.validateConnection.apply( + paper, data.validateConnectionArgs(view, (view.el === magnet) ? null : magnet) )) { minDistance = distance; data.closestView = view; data.closestMagnet = magnet; } } - - }.bind(this)); + }); }, this); @@ -21018,10 +21094,19 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. end = closestView.getLinkEnd(closestMagnet, x, y, this.model, endType); } else { + + end = { x: x, y: y }; } this.model.set(endType, end || { x: x, y: y }, { ui: true }); + + if (prevClosestView) { + this.notify('link:snap:disconnect', evt, prevClosestView, prevClosestMagnet, endType); + } + if (closestView) { + this.notify('link:snap:connect', evt, closestView, closestMagnet, endType); + } }, _snapArrowheadEnd: function(data) { @@ -21556,8 +21641,20 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. connectionClosest: connectionClosest }); - function offset(p1, p2, offset) { - + function offsetPoint(p1, p2, offset) { + if (isPlainObject(offset)) { + var x = offset.x; + var y = offset.y; + if (isFinite(y)) { + var line = new Line(p2, p1); + var ref = line.parallel(y); + var start = ref.start; + var end = ref.end; + p2 = start; + p1 = end; + } + offset = x; + } if (!isFinite(offset)) { return p1; } var length = p1.distance(p2); if (offset === 0 && length > 0) { return p1; } @@ -21571,11 +21668,59 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return parseFloat(stroke) || 0; } - // Connection Points + function alignLine(line, type, offset) { + if ( offset === void 0 ) offset = 0; - function anchorIntersection(line, view, magnet, opt) { + var coordinate, a, b, direction; + var start = line.start; + var end = line.end; + switch (type) { + case 'left': + coordinate = 'x'; + a = end; + b = start; + direction = -1; + break; + case 'right': + coordinate = 'x'; + a = start; + b = end; + direction = 1; + break; + case 'top': + coordinate = 'y'; + a = end; + b = start; + direction = -1; + break; + case 'bottom': + coordinate = 'y'; + a = start; + b = end; + direction = 1; + break; + default: + return; + } + if (start[coordinate] < end[coordinate]) { + a[coordinate] = b[coordinate]; + } else { + b[coordinate] = a[coordinate]; + } + if (isFinite(offset)) { + a[coordinate] += direction * offset; + b[coordinate] += direction * offset; + } + } + + // Connection Points - return offset(line.end, line.start, opt.offset); + function anchorConnectionPoint(line, _view, _magnet, opt) { + var offset = opt.offset; + var alignOffset = opt.alignOffset; + var align = opt.align; + if (align) { alignLine(line, align, alignOffset); } + return offsetPoint(line.end, line.start, offset); } function bboxIntersection(line, view, magnet, opt) { @@ -21586,7 +21731,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var cp = (intersections) ? line.start.chooseClosest(intersections) : line.end; - return offset(cp, line.start, opt.offset); + return offsetPoint(cp, line.start, opt.offset); } function rectangleIntersection(line, view, magnet, opt) { @@ -21604,7 +21749,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var cp = (intersections) ? lineWORotation.start.chooseClosest(intersections).rotate(center, -angle) : line.end; - return offset(cp, line.start, opt.offset); + return offsetPoint(cp, line.start, opt.offset); } function findShapeNode(magnet) { @@ -21693,10 +21838,10 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var cpOffset = opt.offset || 0; if (opt.stroke) { cpOffset += stroke$1(node) / 2; } - return offset(cp, line.start, cpOffset); + return offsetPoint(cp, line.start, cpOffset); } - var anchor = anchorIntersection; + var anchor = anchorConnectionPoint; var bbox = bboxIntersection; var rectangle = rectangleIntersection; var boundary = boundaryIntersection; @@ -21848,12 +21993,30 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. EXACT: 'sorting-exact' }; - var FLAG_INSERT = 1<<30; - var FLAG_REMOVE = 1<<29; - var MOUNT_BATCH_SIZE = 1000; var UPDATE_BATCH_SIZE = Infinity; - var MIN_PRIORITY = 2; + var MIN_PRIORITY = 9007199254740991; // Number.MAX_SAFE_INTEGER + + var defaultHighlighting = { + 'default': { + name: 'stroke', + options: { + padding: 3 + } + }, + magnetAvailability: { + name: 'addClass', + options: { + className: 'available-magnet' + } + }, + elementAvailability: { + name: 'addClass', + options: { + className: 'available-cell' + } + } + }; var Paper = View.extend({ @@ -21889,26 +22052,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return false; }, - highlighting: { - 'default': { - name: 'stroke', - options: { - padding: 3 - } - }, - magnetAvailability: { - name: 'addClass', - options: { - className: 'available-magnet' - } - }, - elementAvailability: { - name: 'addClass', - options: { - className: 'available-cell' - } - } - }, + highlighting: defaultHighlighting, // Prevent the default context menu from being displayed. preventContextMenu: true, @@ -21964,7 +22108,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. // Check whether to allow or disallow the link connection while an arrowhead end (source/target) // being changed. - validateConnection: function(cellViewS, magnetS, cellViewT, magnetT, end, linkView) { + validateConnection: function(cellViewS, _magnetS, cellViewT, _magnetT, end, _linkView) { return (end === 'target' ? cellViewT : cellViewS) instanceof ElementView; }, @@ -22019,15 +22163,21 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. frozen: false, - onViewUpdate: function(view, flag, opt, paper) { - if ((flag & FLAG_INSERT) || opt.mounting) { return; } - paper.requestConnectedLinksUpdate(view, opt); + // no docs yet + onViewUpdate: function(view, flag, priority, opt, paper) { + if ((flag & view.FLAG_INSERT) || opt.mounting) { return; } + paper.requestConnectedLinksUpdate(view, priority, opt); }, - onViewPostponed: function(view, flag /* paper */) { - return this.forcePostponedViewUpdate(view, flag); + // no docs yet + onViewPostponed: function(view, flag, paper) { + return paper.forcePostponedViewUpdate(view, flag); }, + beforeRender: null, // function(opt, paper) { }, + + afterRender: null, // function(stats, opt, paper) { + viewport: null, // Default namespaces @@ -22174,14 +22324,14 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. onCellRemoved: function(cell, _, opt) { var view = this.findViewByModel(cell); - if (view) { this.requestViewUpdate(view, FLAG_REMOVE, view.UPDATE_PRIORITY, opt); } + if (view) { this.requestViewUpdate(view, view.FLAG_REMOVE, view.UPDATE_PRIORITY, opt); } }, onCellChange: function(cell, opt) { if (cell === this.model.attributes.cells) { return; } if (cell.hasChanged('z') && this.options.sorting === sortingTypes.APPROX) { var view = this.findViewByModel(cell); - if (view) { this.requestViewUpdate(view, FLAG_INSERT, view.UPDATE_PRIORITY, opt); } + if (view) { this.requestViewUpdate(view, view.FLAG_INSERT, view.UPDATE_PRIORITY, opt); } } }, @@ -22213,26 +22363,48 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. cloneOptions: function() { - var options = this.options; - - // This is a fix for the case where two papers share the same options. - // Changing origin.x for one paper would change the value of origin.x for the other. - // This prevents that behavior. - options.origin = assign({}, options.origin); - options.defaultConnector = assign({}, options.defaultConnector); - // Return the default highlighting options into the user specified options. - options.highlighting = defaultsDeep( - {}, - options.highlighting, - this.constructor.prototype.options.highlighting - ); + var ref = this; + var options = ref.options; + var defaultConnector = options.defaultConnector; + var defaultRouter = options.defaultRouter; + var defaultConnectionPoint = options.defaultConnectionPoint; + var defaultAnchor = options.defaultAnchor; + var defaultLinkAnchor = options.defaultLinkAnchor; + var origin = options.origin; + var highlighting = options.highlighting; + var cellViewNamespace = options.cellViewNamespace; + var interactive = options.interactive; // Default cellView namespace for ES5 /* global joint: true */ - if (!options.cellViewNamespace && typeof joint !== 'undefined' && has(joint, 'shapes')) { + if (!cellViewNamespace && typeof joint !== 'undefined' && has(joint, 'shapes')) { options.cellViewNamespace = joint.shapes; } /* global joint: false */ + + // Here if a function was provided, we can not clone it, as this would result in loosing the function. + // If the default is used, the cloning is necessary in order to prevent modifying the options on prototype. + if (!isFunction(defaultConnector)) { + options.defaultConnector = cloneDeep(defaultConnector); + } + if (!isFunction(defaultRouter)) { + options.defaultRouter = cloneDeep(defaultRouter); + } + if (!isFunction(defaultConnectionPoint)) { + options.defaultConnectionPoint = cloneDeep(defaultConnectionPoint); + } + if (!isFunction(defaultAnchor)) { + options.defaultAnchor = cloneDeep(defaultAnchor); + } + if (!isFunction(defaultLinkAnchor)) { + options.defaultLinkAnchor = cloneDeep(defaultLinkAnchor); + } + if (isPlainObject(interactive)) { + options.interactive = assign({}, interactive); + } + options.origin = assign({}, origin); + // Return the default highlighting options into the user specified options. + options.highlighting = defaultsDeep({}, highlighting, defaultHighlighting); }, children: function() { @@ -22370,7 +22542,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return V.createSVGMatrix(this.cells.getScreenCTM()); }, - requestConnectedLinksUpdate: function(view, opt) { + requestConnectedLinksUpdate: function(view, priority, opt) { if (view instanceof CellView) { var model = view.model; var links = this.model.getConnectedLinks(model); @@ -22381,7 +22553,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var flagLabels = ['UPDATE']; if (link.getTargetCell() === model) { flagLabels.push('TARGET'); } if (link.getSourceCell() === model) { flagLabels.push('SOURCE'); } - this.scheduleViewUpdate(linkView, linkView.getFlag(flagLabels), linkView.UPDATE_PRIORITY, opt); + var nextPriority = Math.max(priority + 1, linkView.UPDATE_PRIORITY); + this.scheduleViewUpdate(linkView, linkView.getFlag(flagLabels), nextPriority, opt); } } }, @@ -22406,7 +22579,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. view.updateEndMagnet('target'); } if (sourceFlag === 0 && targetFlag === 0) { - return !!this.dumpView(view); + // If leftover flag is 0, all view updates were done. + return !this.dumpView(view); } } return false; @@ -22419,27 +22593,47 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. if (this.isFrozen() || (isAsync && opt.async !== false)) { return; } if (this.model.hasActiveBatch(this.UPDATE_DELAYING_BATCHES)) { return; } var stats = this.updateViews(opt); - if (isAsync) { this.trigger('render:done', stats, opt); } + if (isAsync) { this.notifyAfterRender(stats, opt); } }, scheduleViewUpdate: function(view, type, priority, opt) { - var updates = this._updates; + var ref = this; + var updates = ref._updates; + var options = ref.options; + var FLAG_REMOVE = view.FLAG_REMOVE; + var FLAG_INSERT = view.FLAG_INSERT; + var UPDATE_PRIORITY = view.UPDATE_PRIORITY; + var cid = view.cid; var priorityUpdates = updates.priorities[priority]; if (!priorityUpdates) { priorityUpdates = updates.priorities[priority] = {}; } - var currentType = priorityUpdates[view.cid] || 0; - // prevent cycling + // Move higher priority updates to this priority + if (priority > UPDATE_PRIORITY) { + // Not the default priority for this view. It's most likely a link view + // connected to another link view, which triggered the update. + // TODO: If there is an update scheduled with a lower priority already, we should + // change the requested priority to the lowest one. Does not seem to be critical + // right now, as it "only" results in multiple updates on the same view. + for (var i = priority - 1; i >= UPDATE_PRIORITY; i--) { + var prevPriorityUpdates = updates.priorities[i]; + if (!prevPriorityUpdates || !(cid in prevPriorityUpdates)) { continue; } + priorityUpdates[cid] |= prevPriorityUpdates[cid]; + delete prevPriorityUpdates[cid]; + } + } + var currentType = priorityUpdates[cid] || 0; + // Prevent cycling if ((currentType & type) === type) { return; } if (!currentType) { updates.count++; } if (type & FLAG_REMOVE && currentType & FLAG_INSERT) { // When a view is removed we need to remove the insert flag as this is a reinsert - priorityUpdates[view.cid] ^= FLAG_INSERT; + priorityUpdates[cid] ^= FLAG_INSERT; } else if (type & FLAG_INSERT && currentType & FLAG_REMOVE) { // When a view is added we need to remove the remove flag as this is view was previously removed - priorityUpdates[view.cid] ^= FLAG_REMOVE; + priorityUpdates[cid] ^= FLAG_REMOVE; } - priorityUpdates[view.cid] |= type; - var viewUpdateFn = this.options.onViewUpdate; - if (typeof viewUpdateFn === 'function') { viewUpdateFn.call(this, view, type, opt || {}, this); } + priorityUpdates[cid] |= type; + var viewUpdateFn = options.onViewUpdate; + if (typeof viewUpdateFn === 'function') { viewUpdateFn.call(this, view, type, priority, opt || {}, this); } }, dumpViewUpdate: function(view) { @@ -22460,9 +22654,12 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. updateView: function(view, flag, opt) { if (!view) { return 0; } + var FLAG_REMOVE = view.FLAG_REMOVE; + var FLAG_INSERT = view.FLAG_INSERT; + var model = view.model; if (view instanceof CellView) { if (flag & FLAG_REMOVE) { - this.removeView(view.model); + this.removeView(model); return 0; } if (flag & FLAG_INSERT) { @@ -22485,7 +22682,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var cid = view.cid; var updates = this._updates; if (cid in updates.unmounted) { return 0; } - var flag = updates.unmounted[cid] |= FLAG_INSERT; + var flag = updates.unmounted[cid] |= view.FLAG_INSERT; updates.unmountedCids.push(cid); delete updates.mounted[cid]; return flag; @@ -22515,18 +22712,33 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. this.updateViews(passingOpt); }, + // Synchronous views update updateViews: function(opt) { - var stats; + this.notifyBeforeRender(opt); + var batchStats; var updateCount = 0; var batchCount = 0; var priority = MIN_PRIORITY; do { batchCount++; - stats = this.updateViewsBatch(opt); - updateCount += stats.updated; - priority = Math.min(stats.priority, priority); - } while (!stats.empty); - return { updated: updateCount, batches: batchCount, priority: priority }; + batchStats = this.updateViewsBatch(opt); + updateCount += batchStats.updated; + priority = Math.min(batchStats.priority, priority); + } while (!batchStats.empty); + var stats = { updated: updateCount, batches: batchCount, priority: priority }; + this.notifyAfterRender(stats, opt); + return stats; + }, + + hasScheduledUpdates: function() { + var priorities = this._updates.priorities; + var priorityIndexes = Object.keys(priorities); // convert priorities to a dense array + var i = priorityIndexes.length; + while (i > 0 && i--) { + // a faster way how to check if an object is empty + for (var _key in priorities[priorityIndexes[i]]) { return true; } + } + return false; }, updateViewsAsync: function(opt, data) { @@ -22536,6 +22748,9 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var id = updates.id; if (id) { cancelFrame(id); + if (data.processed === 0 && this.hasScheduledUpdates()) { + this.notifyBeforeRender(opt); + } var stats = this.updateViewsBatch(opt); var passingOpt = defaults({}, opt, { mountBatchSize: MOUNT_BATCH_SIZE - stats.mounted, @@ -22555,7 +22770,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. stats.unmounted += unmountCount; stats.mounted += mountCount; stats.priority = data.priority; - this.trigger('render:done', stats, opt); + this.notifyAfterRender(stats, opt); data.processed = 0; updates.count = 0; } else { @@ -22573,6 +22788,30 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. updates.id = nextFrame(this.updateViewsAsync, this, opt, data); }, + notifyBeforeRender: function(opt) { + if ( opt === void 0 ) opt = {}; + + var beforeFn = opt.beforeRender; + if (typeof beforeFn !== 'function') { + beforeFn = this.options.beforeRender; + if (typeof beforeFn !== 'function') { return; } + } + beforeFn.call(this, opt, this); + }, + + notifyAfterRender: function(stats, opt) { + if ( opt === void 0 ) opt = {}; + + var afterFn = opt.afterRender; + if (typeof afterFn !== 'function') { + afterFn = this.options.afterRender; + } + if (typeof afterFn === 'function') { + afterFn.call(this, stats, opt, this); + } + this.trigger('render:done', stats, opt); + }, + updateViewsBatch: function(opt) { opt || (opt = {}); var batchSize = opt.batchSize || UPDATE_BATCH_SIZE; @@ -22589,7 +22828,9 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. if (typeof viewportFn !== 'function') { viewportFn = null; } var postponeViewFn = options.onViewPostponed; if (typeof postponeViewFn !== 'function') { postponeViewFn = null; } - main: for (var priority = 0, n = priorities.length; priority < n; priority++) { + var priorityIndexes = Object.keys(priorities); // convert priorities to a dense array + main: for (var i = 0, n = priorityIndexes.length; i < n; i++) { + var priority = priorityIndexes[i]; var priorityUpdates = priorities[priority]; for (var cid in priorityUpdates) { if (updateCount >= batchSize) { @@ -22603,10 +22844,10 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. continue; } var currentFlag = priorityUpdates[cid]; - if ((currentFlag & FLAG_REMOVE) === 0) { + if ((currentFlag & view.FLAG_REMOVE) === 0) { // We should never check a view for viewport if we are about to remove the view var isDetached = cid in updates.unmounted; - if (viewportFn && !viewportFn.call(this, view, isDetached, this)) { + if (view.DETACHABLE && viewportFn && !viewportFn.call(this, view, !isDetached, this)) { // Unmount View if (!isDetached) { this.registerUnmountedView(view); @@ -22619,7 +22860,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. } // Mount View if (isDetached) { - currentFlag |= FLAG_INSERT; + currentFlag |= view.FLAG_INSERT; mountCount++; } currentFlag |= this.registerMountedView(view); @@ -22684,7 +22925,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. if (!(cid in unmounted)) { continue; } var view = views[cid]; if (!view) { continue; } - if (viewportFn && !viewportFn.call(this, view, false, this)) { + if (view.DETACHABLE && viewportFn && !viewportFn.call(this, view, false, this)) { // Push at the end of all unmounted ids, so this can be check later again unmountedCids.push(cid); continue; @@ -22711,7 +22952,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. if (!(cid in mounted)) { continue; } var view = views[cid]; if (!view) { continue; } - if (viewportFn.call(this, view, true, this)) { + if (!view.DETACHABLE || viewportFn.call(this, view, true, this)) { // Push at the end of all mounted ids, so this can be check later again mountedCids.push(cid); continue; @@ -22946,7 +23187,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. //fittingBBox }); - var padding = opt.padding; + var padding = normalizeSides(opt.padding); var minScaleX = opt.minScaleX || opt.minScale; var maxScaleX = opt.maxScaleX || opt.maxScale; @@ -22967,7 +23208,12 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. }; } - fittingBBox = new Rect(fittingBBox).inflate(-padding); + fittingBBox = new Rect(fittingBBox).moveAndExpand({ + x: padding.left, + y: padding.top, + width: -padding.left - padding.right, + height: -padding.top - padding.bottom + }); var currentScale = this.scale(); @@ -23015,7 +23261,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return this.localToPaperRect(this.getContentArea(opt)); }, - // Returns a geometry rectangle represeting the entire + // Returns a geometry rectangle representing the entire // paper area (coordinates from the left paper border to the right one // and the top border to the bottom one). getArea: function() { @@ -23106,7 +23352,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var view, flag; if (id in views) { view = views[id]; - flag = FLAG_INSERT; + flag = view.FLAG_INSERT; } else { view = views[cell.id] = this.createViewForModel(cell); view.paper = this; @@ -24188,7 +24434,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. backgroundSize.width *= canvas.width / img.width; backgroundSize.height *= canvas.height / img.height; } else if (backgroundSize === undefined) { - // calcule the tile size if no provided + // calculate the tile size if no provided opt.size = { width: canvas.width / backgroundQuality, height: canvas.height / backgroundQuality @@ -24745,12 +24991,12 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. var index$2 = ({ - ElementView: ElementView, Graph: Graph, + attributes: attributes, Cell: Cell, CellView: CellView, Element: Element$1, - attributes: attributes, + ElementView: ElementView, Link: Link, LinkView: LinkView, Paper: Paper, @@ -27791,7 +28037,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. redundancyRemoval: true, anchor: getAnchor, snapRadius: 10, - snapHandle: true + snapHandle: true, + stopPropagation: true }, handles: null, onRender: function() { @@ -27880,6 +28127,8 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. onHandleChanging: function(handle, evt) { + var ref = this; + var options = ref.options; var data = this.eventData(evt); var relatedView = this.relatedView; var paper = relatedView.paper; @@ -27979,34 +28228,46 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. link.vertices(vertices, { ui: true, tool: this.cid }); this.updateHandle(handle, vertex, nextVertex, offset); + if (!options.stopPropagation) { relatedView.notifyPointermove(normalizedEvent, coords.x, coords.y); } }, onHandleChangeStart: function(handle, evt) { + var ref = this; + var options = ref.options; + var handles = ref.handles; + var linkView = ref.relatedView; + var model = linkView.model; + var paper = linkView.paper; var index$1 = handle.options.index; - var handles = this.handles; if (!Array.isArray(handles)) { return; } for (var i = 0, n = handles.length; i < n; i++) { if (i !== index$1) { handles[i].hide(); } } this.focus(); - var relatedView = this.relatedView; - var relatedModel = relatedView.model; this.eventData(evt, { - sourceAnchor: relatedView.sourceAnchor.clone(), - targetAnchor: relatedView.targetAnchor.clone(), - sourceAnchorDef: clone(relatedModel.prop(['source', 'anchor'])), - targetAnchorDef: clone(relatedModel.prop(['target', 'anchor'])) + sourceAnchor: linkView.sourceAnchor.clone(), + targetAnchor: linkView.targetAnchor.clone(), + sourceAnchorDef: clone(model.prop(['source', 'anchor'])), + targetAnchorDef: clone(model.prop(['target', 'anchor'])) }); - relatedView.model.startBatch('segment-move', { ui: true, tool: this.cid }); + model.startBatch('segment-move', { ui: true, tool: this.cid }); + if (!options.stopPropagation) { linkView.notifyPointerdown.apply(linkView, paper.getPointerArgs(evt)); } }, onHandleChangeEnd: function(_handle, evt) { - var linkView = this.relatedView; - if (this.options.redundancyRemoval) { + var ref= this; + var options = ref.options; + var linkView = ref.relatedView; + var paper = linkView.paper; + var model = linkView.model; + if (options.redundancyRemoval) { linkView.removeRedundantLinearVertices({ ui: true, tool: this.cid }); } + var normalizedEvent = normalizeEvent(evt); + var coords = paper.snapToGrid(normalizedEvent.clientX, normalizedEvent.clientY); this.render(); this.blur(); - linkView.model.stopBatch('segment-move', { ui: true, tool: this.cid }); - linkView.checkMouseleave(normalizeEvent(evt)); + model.stopBatch('segment-move', { ui: true, tool: this.cid }); + if (!options.stopPropagation) { linkView.notifyPointerup(normalizedEvent, coords.x, coords.y); } + linkView.checkMouseleave(normalizedEvent); }, updateHandle: function(handle, vertex, nextVertex, offset) { var vertical = Math.abs(vertex.x - nextVertex.x) < this.precision; @@ -28335,6 +28596,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. options: { snap: snapAnchor, anchor: getAnchor, + resetAnchor: true, customAnchorAttributes: { 'stroke-width': 4, 'stroke': '#33334F', @@ -28499,7 +28761,10 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. }, onPointerDblClick: function() { - this.resetAnchor(); + var anchor = this.options.resetAnchor; + if (anchor === false) { return; } // reset anchor disabled + if (anchor === true) { anchor = null; } // remove the current anchor + this.resetAnchor(cloneDeep(anchor)); this.update(); } }); @@ -28534,7 +28799,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. Boundary: Boundary }); - var version = "3.1.1"; + var version = "3.2.0"; var Vectorizer = V; var layout = { PortLabel: PortLabel, Port: Port }; diff --git a/dist/joint.layout.DirectedGraph.js b/dist/joint.layout.DirectedGraph.js index 017fc8c15..1882e4cc8 100644 --- a/dist/joint.layout.DirectedGraph.js +++ b/dist/joint.layout.DirectedGraph.js @@ -1,4 +1,4 @@ -/*! JointJS v3.1.1 (2019-10-28) - JavaScript diagramming library +/*! JointJS v3.2.0 (2020-06-04) - JavaScript diagramming library This Source Code Form is subject to the terms of the Mozilla Public diff --git a/dist/joint.layout.DirectedGraph.min.js b/dist/joint.layout.DirectedGraph.min.js index 78f5a04ed..7e895f050 100644 --- a/dist/joint.layout.DirectedGraph.min.js +++ b/dist/joint.layout.DirectedGraph.min.js @@ -1,4 +1,4 @@ -/*! JointJS v3.1.1 (2019-10-28) - JavaScript diagramming library +/*! JointJS v3.2.0 (2020-06-04) - JavaScript diagramming library This Source Code Form is subject to the terms of the Mozilla Public diff --git a/dist/joint.min.css b/dist/joint.min.css index 25324cf80..367a924e5 100644 --- a/dist/joint.min.css +++ b/dist/joint.min.css @@ -1,4 +1,4 @@ -/*! JointJS v3.1.1 (2019-10-28) - JavaScript diagramming library +/*! JointJS v3.2.0 (2020-06-04) - JavaScript diagramming library This Source Code Form is subject to the terms of the Mozilla Public diff --git a/dist/joint.min.js b/dist/joint.min.js index 40542cb3c..b35e52cc6 100644 --- a/dist/joint.min.js +++ b/dist/joint.min.js @@ -1,8 +1,8 @@ -/*! JointJS v3.1.1 (2019-10-28) - JavaScript diagramming library +/*! JointJS v3.2.0 (2020-06-04) - JavaScript diagramming library This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -if(function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("backbone"),require("lodash"),require("jquery")):"function"==typeof define&&define.amd?define(["exports","backbone","lodash","jquery"],e):e((t=t||self).joint={},t.Backbone,t._,t.$)}(this,function(e,s,i,S){"use strict";var n,l,r,c;s=s&&s.hasOwnProperty("default")?s.default:s,i=i&&i.hasOwnProperty("default")?i.default:i,S=S&&S.hasOwnProperty("default")?S.default:S,Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(t,e){if(null==this)throw new TypeError('"this" is null or not defined');var i=Object(this),n=i.length>>>0;if(0===n)return!1;var r,o,s=0|e,a=Math.max(0<=s?s:n-Math.abs(s),0);for(;a>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var n=arguments[1],r=0;r>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var n=arguments[1],r=0;r>8-r%1*8)){if(255<(i=n.charCodeAt(r+=.75)))throw new l("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");e=e<<8|i}return s}),t.atob||(t.atob=function(t){var e=String(t).replace(/=+$/,"");if(e.length%4==1)throw new l("'atob' failed: The string to be decoded is not correctly encoded.");for(var i,n,r=0,o=0,s="";n=e.charAt(o++);~n&&(i=r%4?64*i+n:n,r++%4)?s+=String.fromCharCode(255&i>>(-2*r&6)):0)n=a.indexOf(n);return s})}(),Number.isFinite=Number.isFinite||function(t){return"number"==typeof t&&isFinite(t)},Number.isNaN=Number.isNaN||function(t){return t!=t},String.prototype.includes||(String.prototype.includes=function(t,e){return"number"!=typeof e&&(e=0),!(e+t.length>this.length)&&-1!==this.indexOf(t,e)}),String.prototype.startsWith||(String.prototype.startsWith=function(t,e){return this.substr(e||0,t.length)===t}),function(){function n(t,e){return this.slice(t,e)}function r(t,e){arguments.length<2&&(e=0);for(var i=0,n=t.length;ia.x+o/2,h=na.x?r-30:r+30)-c)/(s*s*(n-l))+l:e=s*s/(r-c)-s*s*(n-l)*((i=r>a.y?n+30:n-30)-l)/(o*o*(r-c))+c,new E(i,e).theta(t)},toString:function(){return new E(this.x,this.y).toString()+" "+this.a+" "+this.b}};var B=function(t,e){return this instanceof B?t instanceof B?new B(t.start,t.end):(this.start=new E(t),void(this.end=new E(e))):new B(t,e)};B.prototype={angle:function(){var t=new E(this.start.x+1,this.start.y);return this.start.angleBetween(this.end,t)},bbox:function(){var t=P(this.start.x,this.end.x),e=P(this.start.y,this.end.y),i=G(this.start.x,this.end.x),n=G(this.start.y,this.end.y);return new H(t,e,i-t,n-e)},bearing:function(){var t=y(this.start.y),e=y(this.end.y),i=this.start.x,n=this.end.x,r=y(n-i),o=h(r)*g(e),s=g(t)*h(e)-h(t)*g(e)*g(r),a=A(u(o,s))-22.5;return a<0&&(a+=360),["NE","E","SE","S","SW","W","NW","N"][a=parseInt(a/45)]},clone:function(){return new B(this.start,this.end)},closestPoint:function(t){return this.pointAt(this.closestPointNormalizedLength(t))},closestPointLength:function(t){return this.closestPointNormalizedLength(t)*this.length()},closestPointNormalizedLength:function(t){var e=this.vector().dot(new B(this.start,t).vector()),i=P(1,G(0,e/this.squaredLength()));return i!=i?0:i},closestPointTangent:function(t){return this.tangentAt(this.closestPointNormalizedLength(t))},containsPoint:function(t){var e=this.start,i=this.end;if(0!==e.cross(t,i))return!1;var n=this.length();return!(new B(e,t).length()>n)&&!(new B(t,i).length()>n)},divideAt:function(t){var e=this.pointAt(t);return[new B(this.start,e),new B(e,this.end)]},divideAtLength:function(t){var e=this.pointAtLength(t);return[new B(this.start,e),new B(e,this.end)]},equals:function(t){return!!t&&this.start.x===t.start.x&&this.start.y===t.start.y&&this.end.x===t.end.x&&this.end.y===t.end.y},intersect:function(t,e){if(t instanceof B||t instanceof H||t instanceof D||t instanceof w||t instanceof O){var i=t.intersectionWithLine(this,e);return i&&t instanceof B&&(i=i[0]),i}return null},intersectionWithLine:function(t){var e=new E(this.end.x-this.start.x,this.end.y-this.start.y),i=new E(t.end.x-t.start.x,t.end.y-t.start.y),n=e.x*i.y-e.y*i.x,r=new E(t.start.x-this.start.x,t.start.y-this.start.y),o=r.x*i.y-r.y*i.x,s=r.x*e.y-r.y*e.x;if(0===n||o*n<0||s*n<0)return null;if(0c.y||r>l.y&&r<=c.y){var h=l.x-n>c.x-n?l.x-n:c.x-n;if(0<=h){var u=new E(n+h,r),d=new B(t,u);g.intersect(d)&&a++}}o=s}return a%2==1},convexHull:function(){var t,e,i,n=this.points,r=n.length;if(0===r)return new D;for(t=0;ti.x&&(i=n[t]);var o=[];for(t=0;t=this.x&&t.x<=this.x+this.width&&t.y>=this.y&&t.y<=this.y+this.height},containsRect:function(t){var e=new H(this).normalize(),i=new H(t).normalize(),n=e.width,r=e.height,o=i.width,s=i.height;if(!(n&&r&&o&&s))return!1;var a=e.x,l=e.y,c=i.x,g=i.y;return o+=c,n+=a,s+=g,r+=l,a<=c&&o<=n&&l<=g&&s<=r},corner:function(){return new E(this.x+this.width,this.y+this.height)},equals:function(t){var e=new H(this).normalize(),i=new H(t).normalize();return e.x===i.x&&e.y===i.y&&e.width===i.width&&e.height===i.height},inflate:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.x-=t,this.y-=e,this.width+=2*t,this.height+=2*e,this},intersect:function(t){var e=this.origin(),i=this.corner(),n=t.origin(),r=t.corner();if(r.x<=e.x||r.y<=e.y||n.x>=i.x||n.y>=i.y)return null;var o=G(e.x,n.x),s=G(e.y,n.y);return new H(o,s,P(i.x,r.x)-o,P(i.y,r.y)-s)},intersectionWithLine:function(t){var e,i,n=[this.topLine(),this.rightLine(),this.bottomLine(),this.leftLine()],r=[],o=[],s=n.length;for(i=0;ig&&(n=(this.x+this.width-g)/(d.x-g)),d.y>h&&(a=(this.y+this.height-h)/(d.y-h));var f=t.topRight();f.x>g&&(r=(this.x+this.width-g)/(f.x-g)),f.yh&&(c=(this.y+this.height-h)/(p.y-h)),{sx:P(i,n,r,o),sy:P(s,a,l,c)}},maxRectUniformScaleToFit:function(t,e){var i=this.maxRectScaleToFit(t,e);return P(i.sx,i.sy)},moveAndExpand:function(t){return this.x+=t.x||0,this.y+=t.y||0,this.width+=t.width||0,this.height+=t.height||0,this},normalize:function(){var t=this.x,e=this.y,i=this.width,n=this.height;return this.width<0&&(t=this.x+this.width,i=-this.width),this.height<0&&(e=this.y+this.height,n=-this.height),this.x=t,this.y=e,this.width=i,this.height=n,this},offset:function(t,e){return E.prototype.offset.call(this,t,e)},origin:function(){return new E(this.x,this.y)},pointNearestToPoint:function(t){if(t=new E(t),this.containsPoint(t))switch(this.sideNearestToPoint(t)){case"right":return new E(this.x+this.width,t.y);case"left":return new E(this.x,t.y);case"bottom":return new E(t.x,this.y+this.height);case"top":return new E(t.x,this.y)}return t.adhereToRect(this)},rightLine:function(){return new B(this.topRight(),this.bottomRight())},rightMiddle:function(){return new E(this.x+this.width,this.y+this.height/2)},round:function(t){var e=k(10,t||0);return this.x=a(this.x*e)/e,this.y=a(this.y*e)/e,this.width=a(this.width*e)/e,this.height=a(this.height*e)/e,this},scale:function(t,e,i){return i=this.origin().scale(t,e,i),this.x=i.x,this.y=i.y,this.width*=t,this.height*=e,this},sideNearestToPoint:function(t){var e=(t=new E(t)).x-this.x,i=this.x+this.width-t.x,n=t.y-this.y,r=e,o="left";return i'+t+"";return j.parseXML(e,{async:!1}).documentElement}var i=document.createElementNS(z.svg,"svg");return i.setAttributeNS(z.xmlns,"xmlns:xlink",z.xlink),i.setAttribute("version","1.1"),i},j.idCounter=0,j.uniqueId=function(){return"v-"+ ++j.idCounter},j.toNode=function(t){return j.isV(t)?t.node:t.nodeName&&t||t[0]},j.ensureId=function(t){return(t=j.toNode(t)).id||(t.id=j.uniqueId())},j.sanitizeText=function(t){return(t||"").replace(/ /g," ")},j.isUndefined=function(t){return void 0===t},j.isString=function(t){return"string"==typeof t},j.isObject=function(t){return t&&"object"==typeof t},j.isArray=Array.isArray,j.parseXML=function(t,e){var i;e=e||{};try{var n=new DOMParser;j.isUndefined(e.async)||(n.async=e.async),i=n.parseFromString(t,"text/xml")}catch(t){i=void 0}if(!i||i.getElementsByTagName("parsererror").length)throw new Error("Invalid XML: "+t);return i},j.qualifyAttr=function(t){if(-1===t.indexOf(":"))return{ns:null,local:t};var e=t.split(":");return{ns:z[e[0]],local:e[1]}},j.transformRegex=/(\w+)\(([^,)]+),?([^)]+)?\)/gi,j.transformSeparatorRegex=/[ ,]+/,j.transformationListRegex=/^(\w+)\((.*)\)/,j.transformStringToMatrix=function(t){var e=j.createSVGMatrix(),i=t&&t.match(j.transformRegex);if(!i)return e;for(var n=0,r=i.length;n=t.start&&et.start&&i<=t.end||t.start>=e&&t.end=e?t.end+=i:t.start>=e&&(t.start+=i,t.end+=i)}),t},j.convertLineToPathData=function(t){return["M",(t=j(t)).attr("x1"),t.attr("y1"),"L",t.attr("x2"),t.attr("y2")].join(" ")},j.convertPolygonToPathData=function(t){var e=j.getPointsFromSvgNode(t);return 0===e.length?null:j.svgPointsToPath(e)+" Z"},j.convertPolylineToPathData=function(t){var e=j.getPointsFromSvgNode(t);return 0===e.length?null:j.svgPointsToPath(e)},j.svgPointsToPath=function(t){for(var e=0,i=t.length;e=o[r]&&(s.push([e].concat(n.splice(0,o[r]))),o[r]););}),s}(t)),!t||!t.length)return[["M",0,0]];for(var e,i=[],n=0,r=0,o=0,s=0,a=t.length,l=0;lu){var x=N,S=l,k=c;f=t(l=w+n*V(N=b+u*(a&&bo){var D=Math.floor(o/u)-1;A.splice(D+1);var z=n.ellipsis;if(!z||D<0)break;"string"!=typeof z&&(z="…");var j,T,Z=A[D],L=Z.length;do{if(T=Z[L],j=Z.substring(0,L),T?T.match(d)&&(j+=T):j+="string"==typeof d?d:" ",j+=z,c.data=j,a.getComputedTextLength()<=r){A[D]=j;break}L--}while(0<=L);break}}}}return n.svgDocument?s.removeChild(l):document.body.removeChild(s),A.join(f)},mt=function(t){var e=S(S.parseHTML("
"+t+"
",null,!1));return e.find("*").each(function(){var i=this;S.each(i.attributes,function(){var t=this.name,e=this.value;0!==t.indexOf("on")&&0!==e.indexOf("javascript:")||S(i).removeAttr(t)})}),e.html()},At=function(t,e){if(window.navigator.msSaveBlob)window.navigator.msSaveBlob(t,e);else{var i=window.URL.createObjectURL(t),n=document.createElement("a");n.href=i,n.download=e,document.body.appendChild(n),n.click(),document.body.removeChild(n),window.URL.revokeObjectURL(i)}},vt=function(t){t=t.replace(/\s/g,"");var e,i=(t=decodeURIComponent(t)).indexOf(","),n=t.slice(0,i),r=n.split(":")[1].split(";")[0],o=t.slice(i+1);e=0<=n.indexOf("base64")?atob(o):unescape(encodeURIComponent(o));for(var s=new Uint8Array(e.length),a=0;a')({color:t.color||"blue",opacity:Number.isFinite(t.opacity)?t.opacity:1,outerRadius:e+i,innerRadius:e})},highlight:function(t){return xt('')({color:t.color||"red",width:Number.isFinite(t.width)?t.width:1,blur:Number.isFinite(t.blur)?t.blur:0,opacity:Number.isFinite(t.opacity)?t.opacity:1})},blur:function(t){var e=Number.isFinite(t.x)?t.x:2;return xt('')({stdDeviation:Number.isFinite(t.y)?[e,t.y]:e})},dropShadow:function(t){var e="SVGFEDropShadowElement"in window?'':'';return xt(e)({dx:t.dx||0,dy:t.dy||0,opacity:Number.isFinite(t.opacity)?t.opacity:1,color:t.color||"black",blur:Number.isFinite(t.blur)?t.blur:4})},grayscale:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({a:.2126+.7874*(1-e),b:.7152-.7152*(1-e),c:.0722-.0722*(1-e),d:.2126-.2126*(1-e),e:.7152+.2848*(1-e),f:.0722-.0722*(1-e),g:.2126-.2126*(1-e),h:.0722+.9278*(1-e)})},sepia:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({a:.393+.607*(1-e),b:.769-.769*(1-e),c:.189-.189*(1-e),d:.349-.349*(1-e),e:.686+.314*(1-e),f:.168-.168*(1-e),g:.272-.272*(1-e),h:.534-.534*(1-e),i:.131+.869*(1-e)})},saturate:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({amount:1-e})},hueRotate:function(t){return xt('')({angle:t.angle||0})},invert:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({amount:e,amount2:1-e})},brightness:function(t){return xt('')({amount:Number.isFinite(t.amount)?t.amount:1})},contrast:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({amount:e,amount2:.5-e/2})}},Mt={number:function(t,e,o){o=o||{currency:["$",""],decimal:".",thousands:",",grouping:[3]};var i=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i.exec(t),n=i[1]||" ",r=i[2]||">",s=i[3]||"",a=i[4]||"",l=i[5],c=+i[6],g=i[7],h=i[8],u=i[9],d=1,f="",p="",I=!1;switch(h&&(h=+h.substring(1)),(l||"0"===n&&"="===r)&&(l=n="0",r="=",g&&(c-=Math.floor((c-1)/4))),u){case"n":g=!0,u="g";break;case"%":d=100,p="%",u="f";break;case"p":d=100,p="%",u="r";break;case"b":case"o":case"x":case"X":"#"===a&&(f="0"+u.toLowerCase());break;case"c":case"d":I=!0,h=0;break;case"s":d=-1,u="r"}"$"===a&&(f=o.currency[0],p=o.currency[1]),"r"!=u||h||(u="g"),null!=h&&("g"==u?h=Math.max(1,Math.min(21,h)):"e"!=u&&"f"!=u||(h=Math.max(0,Math.min(20,h))));var m=l&&g;if(I&&e%1)return"";var A=e<0||0===e&&1/e<0?(e=-e,"-"):s,v=p;if(d<0){var C=this.prefix(e,h);e=C.scale(e),v=C.symbol+p}else e*=d;var w=(e=this.convert(u,e,h)).lastIndexOf("."),y=w<0?e:e.substring(0,w),b=w<0?"":o.decimal+e.substring(w+1);function N(t){for(var e=t.length,i=[],n=0,r=o.grouping[0];0"===r?x+A+e:"^"===r?x.substring(0,M>>=1)+A+e+x.substring(M):A+(m?e:x+e))+v},string:function(t,e){for(var i,n="{",r=!1,o=[];-1!==(i=t.indexOf(n));){var s,a,l;if(s=t.slice(0,i),r){l=(a=s.split(":")).shift().split("."),s=e;for(var c=0;c|\$\{ ?([^{} ]+) ?\}|\{\{([^{} ]+)\}\}/g;return function(n){return n=n||{},t.replace(e,function(t){for(var e=Array.from(arguments).slice(1,4).find(function(t){return!!t}).split("."),i=n[e.shift()];void 0!==i&&e.length;)i=i[e.shift()];return void 0!==i?i:""})}},St=i.assign,kt=i.defaults,Dt=St,zt=i.defaultsDeep,jt=i.assign,Tt=i.defaults,Zt=i.defaultsDeep,Lt=i.invokeMap||i.invoke,Pt=i.sortedIndexBy||i.sortedIndex,Gt=i.uniqBy||i.uniq,Bt=i.clone,Ot=i.cloneDeep,Et=i.isEmpty,Yt=i.isEqual,Rt=i.isFunction,Wt=i.isPlainObject,Ut=i.toArray,Xt=i.debounce,Vt=i.groupBy,Ft=i.sortBy,Jt=i.flattenDeep,Ht=i.without,Qt=i.difference,_t=i.intersection,Kt=i.union,qt=i.has,$t=i.result,te=i.omit,ee=i.pick,ie=i.bindAll,ne=i.forIn,re=i.camelCase,oe=i.uniqueId,se=function(){if(i.mergeWith){var t=Array.from(arguments),e=t[t.length-1],n=Rt(e)?e:he;return t.push(function(t,e){var i=n(t,e);return void 0!==i?i:Array.isArray(t)&&!Array.isArray(e)?e:void 0}),i.mergeWith.apply(this,t)}return i.merge.apply(this,arguments)},ae=function(t){var e=Object.prototype.toString;return!0===t||!1===t||!!t&&"object"==typeof t&&"[object Boolean]"===e.call(t)},le=function(t){return!!t&&("object"==typeof t||"function"==typeof t)},ce=function(t){var e=Object.prototype.toString;return"number"==typeof t||!!t&&"object"==typeof t&&"[object Number]"===e.call(t)},ge=function(t){var e=Object.prototype.toString;return"string"==typeof t||!!t&&"object"==typeof t&&"[object String]"===e.call(t)},he=function(){};function ue(t){t=Gt(t);var s=Ut(t).reduce(function(t,e){return t[e.id]=e.clone(),t},{});return Ut(t).forEach(function(t){var e=s[t.id];if(e.isLink()){var i=e.source(),n=e.target();i.id&&s[i.id]&&e.prop("source/id",s[i.id].id),n.id&&s[n.id]&&e.prop("target/id",s[n.id].id)}var r=t.get("parent");r&&s[r]&&e.set("parent",s[r].id);var o=Ut(t.get("embeds")).reduce(function(t,e){return s[e]&&t.push(s[e].id),t},[]);Et(o)||e.set("embeds",o)}),s}function de(o,s){return function(t,e){var i=ft(t);t=parseFloat(t),i&&(t/=100);var n={};if(isFinite(t)){var r=i||0<=t&&t<=1?t*e[s]:Math.max(t+e[s],0);n[o]=r}return n}}function fe(s,a,l){return function(t,e){var i,n=ft(t);if(t=parseFloat(t),n&&(t/=100),isFinite(t)){var r=e[l]();i=n||0e.width?be:Ne)(t,e)})},refRCircumscribed:{set:function(t,e){var i=ft(t);t=parseFloat(t),i&&(t/=100);var n,r=Math.sqrt(e.height*e.height+e.width*e.width);return isFinite(t)&&(n=i||0<=t&&t<=1?t*r:Math.max(t+r,0)),{r:n}}},refCx:{set:de("cx","width")},refCy:{set:de("cy","height")},xAlignment:{offset:pe("x","width","right")},yAlignment:{offset:pe("y","height","bottom")},resetOffset:{offset:function(t,e){return t?{x:-e.x,y:-e.y}:{x:0,y:0}}},refDResetOffset:{set:me({resetOffset:!0})},refDKeepOffset:{set:me({resetOffset:!1})},refPointsResetOffset:{set:Ae({resetOffset:!0})},refPointsKeepOffset:{set:Ae({resetOffset:!1})},connection:{qualify:we,set:function(t){var e,i=t.stubs;if(void 0===i&&(i=0),isFinite(i)&&0!==i){var n;n=i<0?(this.getConnectionLength()+i)/2:i;var r=this.getConnection(),o=r.divideAtLength(n),s=r.divideAtLength(-n);o&&s&&(e=o[0].serialize()+" "+s[1].serialize())}return{d:e||this.getSerializedConnection()}}},atConnectionLengthKeepGradient:{qualify:we,set:ve("getTangentAtLength",{rotate:!0})},atConnectionLengthIgnoreGradient:{qualify:we,set:ve("getTangentAtLength",{rotate:!1})},atConnectionRatioKeepGradient:{qualify:we,set:ve("getTangentAtRatio",{rotate:!0})},atConnectionRatioIgnoreGradient:{qualify:we,set:ve("getTangentAtRatio",{rotate:!1})}};Me.refR=Me.refRInscribed,Me.refD=Me.refDResetOffset,Me.refPoints=Me.refPointsResetOffset,Me.atConnectionLength=Me.atConnectionLengthKeepGradient,Me.atConnectionRatio=Me.atConnectionRatioKeepGradient,Me.refX2=Me.refX,Me.refY2=Me.refY,Me.refWidth2=Me.refWidth,Me.refHeight2=Me.refHeight,Me["ref-x"]=Me.refX,Me["ref-y"]=Me.refY,Me["ref-dy"]=Me.refDy,Me["ref-dx"]=Me.refDx,Me["ref-width"]=Me.refWidth,Me["ref-height"]=Me.refHeight,Me["x-alignment"]=Me.xAlignment,Me["y-alignment"]=Me.yAlignment;var xe=Me,Se=s.Model.extend({constructor:function(t,e){var i,n=t||{};this.cid=oe("c"),this.attributes={},e&&e.collection&&(this.collection=e.collection),e&&e.parse&&(n=this.parse(n,e)||{}),(i=$t(this,"defaults"))&&(n=se({},i,n)),this.set(n,e),this.changed={},this.initialize.apply(this,arguments)},translate:function(t,e,i){throw new Error("Must define a translate() method.")},toJSON:function(){var e=this.constructor.prototype.defaults.attrs||{},t=this.attributes.attrs,o={};ne(t,function(t,n){var r=e[n];ne(t,function(t,i){le(t)&&!Array.isArray(t)?ne(t,function(t,e){r&&r[i]&&Yt(r[i][e],t)||(o[n]=o[n]||{},(o[n][i]||(o[n][i]={}))[e]=t)}):r&&Yt(r[i],t)||(o[n]=o[n]||{},o[n][i]=t)})});var i=Ot(te(this.attributes,"attrs"));return i.attrs=o,i},initialize:function(t){t&&t.id||this.set("id",this.generateId(),{silent:!0}),this._transitionIds={},this.processPorts(),this.on("change:attrs",this.processPorts,this)},generateId:function(){return lt()},processPorts:function(){var t=this.ports,i={};ne(this.get("attrs"),function(t,e){t&&t.port&&(void 0!==t.port.id?i[t.port.id]=t.port:i[t.port]={id:t.port})});var n={};(ne(t,function(t,e){i[e]||(n[e]=!0)}),this.graph&&!Et(n))&&(this.graph.getConnectedLinks(this,{inbound:!0}).forEach(function(t){n[t.get("target").port]&&t.remove()}),this.graph.getConnectedLinks(this,{outbound:!0}).forEach(function(t){n[t.get("source").port]&&t.remove()}));this.ports=i},remove:function(t){t=t||{};var e=this.graph;if(!e)return this.collection&&this.collection.remove(this,t),this;e.startBatch("remove");var i=this.getParentCell();i&&i.unembed(this);for(var n=this.getEmbeddedCells(),r=0,o=n.length;rc[2]?(s=".3em",r=g,o=0,"start"):lh[2]?(s=".3em",r=-c,o=0,"end"):l','','','','','','',''].join(""),toolMarkup:['','','','',"Remove link.","",'','','',"Link options.","",""].join(""),doubleToolMarkup:void 0,vertexMarkup:['','','','',"Remove vertex.","",""].join(""),arrowheadMarkup:['','',""].join(""),defaultLabel:void 0,labelMarkup:void 0,_builtins:{defaultLabel:{markup:[{tagName:"rect",selector:"rect"},{tagName:"text",selector:"text"}],attrs:{text:{fill:"#000000",fontSize:14,textAnchor:"middle",yAlignment:"middle",pointerEvents:"none"},rect:{ref:"text",fill:"#ffffff",rx:3,ry:3,refWidth:1,refHeight:1,refX:0,refY:0}},position:{distance:.5}}},defaults:{type:"link",source:{},target:{}},isLink:function(){return!0},disconnect:function(t){return this.set({source:{x:0,y:0},target:{x:0,y:0}},t)},source:function(t,e,i){return void 0===t?Bt(this.get("source")):(r=t instanceof Se?((n=Bt(e)||{}).id=t.id,i):Wt(t)?(n=t,e):((n=Bt(e)||{}).x=t.x,n.y=t.y,i),this.set("source",n,r));var n,r},target:function(t,e,i){return void 0===t?Bt(this.get("target")):(r=t instanceof Se?((n=Bt(e)||{}).id=t.id,i):Wt(t)?(n=t,e):((n=Bt(e)||{}).x=t.x,n.y=t.y,i),this.set("target",n,r));var n,r},router:function(t,e,i){if(void 0===t){var n=this.get("router");return n?"object"==typeof n?Bt(n):n:this.get("manhattan")?{name:"orthogonal"}:null}var r="object"==typeof t||"function"==typeof t,o=r?t:{name:t,args:e},s=r?e:i;return this.set("router",o,s)},connector:function(t,e,i){if(void 0===t){var n=this.get("connector");return n?"object"==typeof n?Bt(n):n:this.get("smooth")?{name:"smooth"}:null}var r="object"==typeof t||"function"==typeof t,o=r?t:{name:t,args:e},s=r?e:i;return this.set("connector",o,s)},label:function(t,e,i){var n=this.labels();return(t=isFinite(t)&&null!==t?0|t:0)<0&&(t=n.length+t),arguments.length<=1?this.prop(["labels",t]):this.prop(["labels",t],e,i)},labels:function(t,e){return 0===arguments.length?(t=this.get("labels"),Array.isArray(t)?t.slice():[]):(Array.isArray(t)||(t=[]),this.set("labels",t,e))},insertLabel:function(t,e,i){if(!e)throw new Error("dia.Link: no label provided");var n=this.labels(),r=n.length;return(t=isFinite(t)&&null!==t?0|t:r)<0&&(t=r+t+1),n.splice(t,0,e),this.labels(n,i)},appendLabel:function(t,e){return this.insertLabel(-1,t,e)},removeLabel:function(t,e){var i=this.labels();return t=isFinite(t)&&null!==t?0|t:-1,i.splice(t,1),this.labels(i,e)},vertex:function(t,e,i){var n=this.vertices();if((t=isFinite(t)&&null!==t?0|t:0)<0&&(t=n.length+t),arguments.length<=1)return this.prop(["vertices",t]);var r=this._normalizeVertex(e);return this.prop(["vertices",t],r,i)},vertices:function(t,e){if(0===arguments.length)return t=this.get("vertices"),Array.isArray(t)?t.slice():[];Array.isArray(t)||(t=[]);for(var i=[],n=0;n "+e),i=this.getSelector(t.parentNode,i)}return i},getLinkEnd:function(t,e,i,n,r){var o=this.model,s=o.id,a=this.findAttribute("port",t),l=t.getAttribute("joint-selector"),c={id:s};null!=l&&(c.magnet=l),null!=a?(c.port=a,o.hasPort(a)||l||(c.selector=this.getSelector(t))):null==l&&this.el!==t&&(c.selector=this.getSelector(t));var g=this.paper,h=g.options.connectionStrategy;if("function"==typeof h){var u=h.call(g,c,this,t,new E(e,i),n,r,g);u&&(c=u)}return c},getMagnetFromLinkEnd:function(t){var e=this.el,i=t.port,n=t.magnet,r=this.model;return null!=i&&r.isElement()&&r.hasPort(i)?this.findPortNode(i,n)||e:(n||(n=t.selector),n||null==i||(n='[port="'+i+'"]'),this.findBySelector(n,e,this.selectors)[0])},getAttributeDefinition:function(t){return this.model.constructor.getAttributeDefinition(t)},setNodeAttributes:function(t,e){Et(e)||(t instanceof SVGElement?q(t).attr(e):S(t).attr(e))},processNodeAttributes:function(t,e){var i,n,r,o,s,a,l,c,g,h=[];for(i in e)e.hasOwnProperty(i)&&(n=e[i],!(r=this.getAttributeDefinition(i))||Rt(r.qualify)&&!r.qualify.call(this,n,t,e)?(a||(a={}),a[gt(i)]=n):(ge(r.set)&&(a||(a={}),a[r.set]=n),null!==n&&h.push(i,r)));for(o=0,s=h.length;or.options.clickThreshold||this.notify("element:magnet:pointerclick",t,e,i,n)}});jt($e.prototype,Ve);var ti={N:"S",S:"N",E:"W",W:"E"},ei={N:-Math.PI/2*3,S:-Math.PI/2,E:0,W:Math.PI};function ii(t,e,i){var n=new E(t.x,e.y);return i.containsPoint(n)&&(n=new E(e.x,t.y)),n}function ni(t,e){return t["W"===e||"E"===e?"width":"height"]}function ri(t,e){return t.x===e.x?t.y>e.y?"N":"S":t.y===e.y?t.x>e.x?"W":"E":null}function oi(t){return new H(t.x,t.y,0,0)}function si(t){var e=wt(t.padding||t.elementPadding||20);return{x:-e.left,y:-e.top,width:e.left+e.right,height:e.top+e.bottom}}function ai(t,e){return t.sourceBBox.clone().moveAndExpand(si(e))}function li(t,e){return t.targetBBox.clone().moveAndExpand(si(e))}function ci(t,e,i){var n=new E(t.x,e.y),r=new E(e.x,t.y),o=ri(t,n),s=ri(t,r),a=ti[i],l=o===i||o!==a&&(s===a||s!==i)?n:r;return{points:[l],direction:ri(l,e)}}function gi(t,e,i){var n=ii(t,e,i);return{points:[n],direction:ri(n,e)}}function hi(e,t,i,n){var r,o={},s=[new E(e.x,t.y),new E(t.x,e.y)],a=s.filter(function(t){return!i.containsPoint(t)}),l=a.filter(function(t){return ri(t,e)!==n});if(0c.center().distance(t),h=g?e:t,u=g?t:e;return s=ii(o=r?(o=E.fromPolar(c.width+c.height,ei[r],h),c.pointNearestToPoint(o).move(o,-1)):c.pointNearestToPoint(h).move(h,1),u,c),o.round().equals(s.round())?(s=E.fromPolar(c.width+c.height,y(o.theta(h))+Math.PI/2,u),a=ii(o,s=c.pointNearestToPoint(s).move(u,1).round(),c),l.points=g?[s,a,o]:[o,a,s]):l.points=g?[s,o]:[o,s],l.direction=ri(g?o:s,e),l}function fi(t,e,i){var n,r,o,s,a,l=ai(i,e),c=li(i,e),g=(r=e,(n=i).sourceAnchor?n.sourceAnchor:ai(n,r).center()),h=(s=e,(o=i).targetAnchor?o.targetAnchor:li(o,s).center());l=l.union(oi(g)),c=c.union(oi(h)),(t=Ut(t).map(E)).unshift(g),t.push(h);for(var u=[],d=0,f=t.length-1;dn.maxAllowedDirectionChange)){var V=Mi(O.clone().offset(k.gridOffsetX,k.gridOffsetY),v,l),F=xi(V);if(!C.isClose(F)&&i.isPointAccessible(V)){if(0<=L.indexOf(F))if(!V.equals(d))if(yi(X,wi(V,d,Z,v,n))>n.maxAllowedDirectionChange)continue;var J=Y+k.cost+(W?0:n.penalties[D]);(!C.isOpen(F)||J=Math.abs(t.y-e.y)){var c=(t.x+e.x)/2;l=O.createSegment("C",c,t.y,c,e.y,e.x,e.y),r.appendSegment(l)}else{var g=(t.y+e.y)/2;l=O.createSegment("C",t.x,g,e.x,g,e.x,e.y),r.appendSegment(l)}}return o?r:r.serialize()}},Vi=qe.extend({className:function(){var t=qe.prototype.className.apply(this).split(" ");return t.push("link"),t.join(" ")},options:{shortLinkLength:105,doubleLinkTools:!1,longLinkLength:155,linkToolsOffset:40,doubleLinkToolsOffset:65,sampleInterval:50},_labelCache:null,_labelSelectors:null,_markerCache:null,_V:null,_dragData:null,metrics:null,decimalsRounding:2,initialize:function(){qe.prototype.initialize.apply(this,arguments),this._labelCache={},this._labelSelectors={},this._markerCache={},this._V={},this.metrics={}},presentationAttributes:{markup:["RENDER"],attrs:["UPDATE"],router:["UPDATE"],connector:["UPDATE"],smooth:["UPDATE"],manhattan:["UPDATE"],toolMarkup:["TOOLS"],labels:["LABELS"],labelMarkup:["LABELS"],vertices:["VERTICES","UPDATE"],vertexMarkup:["VERTICES"],source:["SOURCE","UPDATE"],target:["TARGET","UPDATE"]},initFlag:["RENDER","SOURCE","TARGET"],UPDATE_PRIORITY:1,confirmUpdate:function(t,e){if(e||(e={}),this.hasFlag(t,"SOURCE")){if(!this.updateEndProperties("source"))return t;t=this.removeFlag(t,"SOURCE")}if(this.hasFlag(t,"TARGET")){if(!this.updateEndProperties("target"))return t;t=this.removeFlag(t,"TARGET")}var i=this.paper,n=this.sourceView,r=this.targetView;if(i&&(n&&!i.isViewMounted(n)||r&&!i.isViewMounted(r)))return t;if(this.hasFlag(t,"RENDER"))return this.render(),t=this.removeFlag(t,["RENDER","UPDATE","VERTICES","TOOLS","LABELS"]);this.hasFlag(t,"VERTICES")&&(this.renderVertexMarkers(),t=this.removeFlag(t,"VERTICES"));var o=this.model,s=o.attributes;return this.hasFlag(t,"UPDATE")&&(this.update(o,null,e),t=this.removeFlag(t,"UPDATE")),this.hasFlag(t,"LABELS")&&(this.onLabelsChange(o,s.labels,e),t=this.removeFlag(t,"LABELS")),this.hasFlag(t,"TOOLS")&&(this.renderTools().updateToolsPosition(),t=this.removeFlag(t,"TOOLS")),t},isLabelsRenderRequired:function(t){void 0===t&&(t={});var e=this.model.previous("labels");if(!e)return!0;if("propertyPathArray"in t&&"propertyValue"in t){var i=t.propertyPathArray||[],n=i.length;if(1=this.options.longLinkLength){var r=this.options.doubleLinkToolsOffset||e;n=this.getPointAtLength(i-r),this._tool2Cache.attr("transform","translate("+n.x+", "+n.y+") "+t),this._tool2Cache.attr("visibility","visible")}else this.options.doubleLinkTools&&this._tool2Cache.attr("visibility","hidden")}return this},updateArrowheadMarkers:function(){if(!this._V.markerArrowheads)return this;if("none"===S.css(this._V.markerArrowheads.node,"display"))return this;var t=this.getConnectionLength()'),o=["<"+i+">",Ut(n).map(function(t){return r({offset:t.offset,color:t.color,opacity:Number.isFinite(t.opacity)?t.opacity:1})}).join(""),""].join(""),s=jt({id:e},t.attrs);q(o,s).appendTo(this.defs)}return e},defineMarker:function(t){if(!le(t))throw new TypeError("dia.Paper: defineMarker() requires 1. argument to be an object.");var e=t.id;if(e||(e=this.svg.id+nt(JSON.stringify(t))),!this.isDefined(e)){var i=te(t,"type","userSpaceOnUse");q("marker",{id:e,orient:"auto",overflow:"visible",markerUnits:t.markerUnits||"userSpaceOnUse"},[q(t.type||"path",i)]).appendTo(this.defs)}return e}},{sorting:an,backgroundPatterns:{flipXy:function(t){var e=document.createElement("canvas"),i=t.width,n=t.height;e.width=2*i,e.height=2*n;var r=e.getContext("2d");return r.drawImage(t,0,0,i,n),r.setTransform(-1,0,0,-1,e.width,e.height),r.drawImage(t,0,0,i,n),r.setTransform(-1,0,0,1,e.width,0),r.drawImage(t,0,0,i,n),r.setTransform(1,0,0,-1,0,e.height),r.drawImage(t,0,0,i,n),e},flipX:function(t){var e=document.createElement("canvas"),i=t.width,n=t.height;e.width=2*i,e.height=n;var r=e.getContext("2d");return r.drawImage(t,0,0,i,n),r.translate(2*i,0),r.scale(-1,1),r.drawImage(t,0,0,i,n),e},flipY:function(t){var e=document.createElement("canvas"),i=t.width,n=t.height;e.width=i,e.height=2*n;var r=e.getContext("2d");return r.drawImage(t,0,0,i,n),r.translate(0,2*n),r.scale(1,-1),r.drawImage(t,0,0,i,n),e},watermark:function(t,e){e=e||{};var i=t.width,n=t.height,r=document.createElement("canvas");r.width=3*i,r.height=3*n;for(var o=r.getContext("2d"),s=ce(e.watermarkAngle)?-e.watermarkAngle:-20,a=y(s),l=r.width/4,c=r.height/4,g=0;g<4;g++)for(var h=0;h<4;h++)0<(g+h)%2&&(o.setTransform(1,0,0,1,(2*g-1)*l,(2*h-1)*c),o.rotate(a),o.drawImage(t,-i/2,-n/2,i,n));return r}},gridPatterns:{dot:[{color:"#AAAAAA",thickness:1,markup:"rect",update:function(t,e){q(t).attr({width:e.thickness*e.sx,height:e.thickness*e.sy,fill:e.color})}}],fixedDot:[{color:"#AAAAAA",thickness:1,markup:"rect",update:function(t,e){var i=e.sx<=1?e.thickness*e.sx:e.thickness;q(t).attr({width:i,height:i,fill:e.color})}}],mesh:[{color:"#AAAAAA",thickness:1,markup:"path",update:function(t,e){var i,n=e.width,r=e.height,o=e.thickness;i=0<=n-o&&0<=r-o?["M",n,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",q(t).attr({d:i,stroke:e.color,"stroke-width":e.thickness})}}],doubleMesh:[{color:"#AAAAAA",thickness:1,markup:"path",update:function(t,e){var i,n=e.width,r=e.height,o=e.thickness;i=0<=n-o&&0<=r-o?["M",n,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",q(t).attr({d:i,stroke:e.color,"stroke-width":e.thickness})}},{color:"#000000",thickness:3,scaleFactor:4,markup:"path",update:function(t,e){var i,n=e.width,r=e.height,o=e.thickness;i=0<=n-o&&0<=r-o?["M",n,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",q(t).attr({d:i,stroke:e.color,"stroke-width":e.thickness})}}]}}),hn=_e.extend({name:null,tagName:"g",className:"tool",svgElement:!0,_visible:!0,init:function(){var t=this.name;t&&this.vel.attr("data-tool-name",t)},configure:function(t,e){return this.relatedView=t,this.paper=t.paper,this.parentView=e,this.simulateRelatedView(this.el),this.delegateEvents(),this},simulateRelatedView:function(t){t&&t.setAttribute("model-id",this.relatedView.model.id)},getName:function(){return this.name},show:function(){this.el.style.display="",this._visible=!0},hide:function(){this.el.style.display="none",this._visible=!1},isVisible:function(){return!!this._visible},focus:function(){var t=this.options.focusOpacity;isFinite(t)&&(this.el.style.opacity=t),this.parentView.focusTool(this)},blur:function(){this.el.style.opacity="",this.parentView.blurTool(this)},update:function(){},guard:function(t){var e=this.paper,i=this.relatedView;return!e||!i||e.guard(t,i)}}),un=_e.extend({tagName:"g",className:"tools",svgElement:!0,tools:null,options:{tools:null,relatedView:null,name:null,component:!1},configure:function(t){var e=(t=jt(this.options,t)).tools;if(!Array.isArray(e))return this;var i=t.relatedView;if(!(i instanceof qe))return this;for(var n=this.tools=[],r=0,o=e.length;r'}),An=$e.extend({presentationAttributes:$e.addPresentationAttributes({attrs:["SCALE"]}),confirmUpdate:function(){var t=$e.prototype.confirmUpdate.apply(this,arguments);return this.hasFlag(t,"SCALE")&&(this.resize(),t=this.removeFlag(t,"SCALE")),t}}),vn=In.define("basic.Text",{attrs:{text:{"font-size":18,fill:"#000000"}}},{markup:''}),Cn=In.define("basic.Circle",{size:{width:60,height:60},attrs:{circle:{fill:"#ffffff",stroke:"#000000",r:30,cx:30,cy:30},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-y":.5,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),wn=In.define("basic.Ellipse",{size:{width:60,height:40},attrs:{ellipse:{fill:"#ffffff",stroke:"#000000",rx:30,ry:20,cx:30,cy:20},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-y":.5,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),yn=In.define("basic.Polygon",{size:{width:60,height:40},attrs:{polygon:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),bn=In.define("basic.Polyline",{size:{width:60,height:40},attrs:{polyline:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),Nn=In.define("basic.Image",{attrs:{text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),Mn=In.define("basic.Path",{size:{width:60,height:60},attrs:{path:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle",ref:"path","ref-x":.5,"ref-dy":10,fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),xn=Mn.define("basic.Rhombus",{attrs:{path:{d:"M 30 0 L 60 30 30 60 0 30 z"},text:{"ref-y":.5,"ref-dy":null,"y-alignment":"middle"}}}),Sn=pn.test("svgforeignobject"),kn=In.define("basic.TextBlock",{attrs:{rect:{fill:"#ffffff",stroke:"#000000",width:80,height:100},text:{fill:"#000000","font-size":14,"font-family":"Arial, helvetica, sans-serif"},".content":{text:"","ref-x":.5,"ref-y":.5,"y-alignment":"middle","x-alignment":"middle"}},content:""},{markup:['','',Sn?'
':'',""].join(""),initialize:function(){this.listenTo(this,"change:size",this.updateSize),this.listenTo(this,"change:content",this.updateContent),this.updateSize(this,this.get("size")),this.updateContent(this,this.get("content")),In.prototype.initialize.apply(this,arguments)},updateSize:function(t,e){this.attr({".fobj":jt({},e),div:{style:jt({},e)}})},updateContent:function(t,e){Sn?this.attr({".content":{html:mt(e)}}):this.attr({".content":{text:e}})},setForeignObjectSize:function(){this.updateSize.apply(this,arguments)},setDivContent:function(){this.updateContent.apply(this,arguments)}}),Dn=$e.extend({presentationAttributes:Sn?$e.prototype.presentationAttributes:$e.addPresentationAttributes({content:["CONTENT"],size:["CONTENT"]}),initFlag:["RENDER","CONTENT"],confirmUpdate:function(){var t=$e.prototype.confirmUpdate.apply(this,arguments);return this.hasFlag(t,"CONTENT")&&(this.updateContent(this.model),t=this.removeFlag(t,"CONTENT")),t},update:function(t,e){var i=this.model;if(Sn)$e.prototype.update.call(this,i,e);else{var n=te(e||i.get("attrs"),".content");$e.prototype.update.call(this,i,n),e&&!qt(e,".content")||this.updateContent(i,e)}},updateContent:function(t,e){var i=se({},(e||t.get("attrs"))[".content"]);i=te(i,"text");var n=It(t.get("content"),t.get("size"),i,{svgDocument:this.paper.svg}),r=ot({},".content",i,"/");r[".content"].text=n,$e.prototype.update.call(this,t,r)}}),zn={Generic:In,Rect:mn,TextView:An,Text:vn,Circle:Cn,Ellipse:wn,Polygon:yn,Polyline:bn,Image:Nn,Path:Mn,Rhombus:xn,TextBlock:kn,TextBlockView:Dn},jn=Fe.define("standard.Rectangle",{attrs:{body:{refWidth:"100%",refHeight:"100%",strokeWidth:2,stroke:"#000000",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"body"},{tagName:"text",selector:"label"}]}),Tn=Fe.define("standard.Circle",{attrs:{body:{refCx:"50%",refCy:"50%",refR:"50%",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"circle",selector:"body"},{tagName:"text",selector:"label"}]}),Zn=Fe.define("standard.Ellipse",{attrs:{body:{refCx:"50%",refCy:"50%",refRx:"50%",refRy:"50%",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"ellipse",selector:"body"},{tagName:"text",selector:"label"}]}),Ln=Fe.define("standard.Path",{attrs:{body:{refD:"M 0 0 L 10 0 10 10 0 10 Z",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"path",selector:"body"},{tagName:"text",selector:"label"}]}),Pn=Fe.define("standard.Polygon",{attrs:{body:{refPoints:"0 0 10 0 10 10 0 10",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"polygon",selector:"body"},{tagName:"text",selector:"label"}]}),Gn=Fe.define("standard.Polyline",{attrs:{body:{refPoints:"0 0 10 0 10 10 0 10 0 0",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"polyline",selector:"body"},{tagName:"text",selector:"label"}]}),Bn=Fe.define("standard.Image",{attrs:{image:{refWidth:"100%",refHeight:"100%"},label:{textVerticalAnchor:"top",textAnchor:"middle",refX:"50%",refY:"100%",refY2:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"image",selector:"image"},{tagName:"text",selector:"label"}]}),On=Fe.define("standard.BorderedImage",{attrs:{border:{refWidth:"100%",refHeight:"100%",stroke:"#333333",strokeWidth:2},background:{refWidth:-1,refHeight:-1,x:.5,y:.5,fill:"#FFFFFF"},image:{refWidth:-1,refHeight:-1,x:.5,y:.5},label:{textVerticalAnchor:"top",textAnchor:"middle",refX:"50%",refY:"100%",refY2:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"background",attributes:{stroke:"none"}},{tagName:"image",selector:"image"},{tagName:"rect",selector:"border",attributes:{fill:"none"}},{tagName:"text",selector:"label"}]}),En=Fe.define("standard.EmbeddedImage",{attrs:{body:{refWidth:"100%",refHeight:"100%",stroke:"#333333",fill:"#FFFFFF",strokeWidth:2},image:{refWidth:"30%",refHeight:-20,x:10,y:10,preserveAspectRatio:"xMidYMin"},label:{textVerticalAnchor:"top",textAnchor:"left",refX:"30%",refX2:20,refY:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"body"},{tagName:"image",selector:"image"},{tagName:"text",selector:"label"}]}),Yn=Fe.define("standard.InscribedImage",{attrs:{border:{refRx:"50%",refRy:"50%",refCx:"50%",refCy:"50%",stroke:"#333333",strokeWidth:2},background:{refRx:"50%",refRy:"50%",refCx:"50%",refCy:"50%",fill:"#FFFFFF"},image:{refWidth:"68%",refHeight:"68%",refX:"16%",refY:"16%",preserveAspectRatio:"xMidYMid"},label:{textVerticalAnchor:"top",textAnchor:"middle",refX:"50%",refY:"100%",refY2:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"ellipse",selector:"background"},{tagName:"image",selector:"image"},{tagName:"ellipse",selector:"border",attributes:{fill:"none"}},{tagName:"text",selector:"label"}]}),Rn=Fe.define("standard.HeaderedRectangle",{attrs:{body:{refWidth:"100%",refHeight:"100%",strokeWidth:2,stroke:"#000000",fill:"#FFFFFF"},header:{refWidth:"100%",height:30,strokeWidth:2,stroke:"#000000",fill:"#FFFFFF"},headerText:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:15,fontSize:16,fill:"#333333"},bodyText:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",refY2:15,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"body"},{tagName:"rect",selector:"header"},{tagName:"text",selector:"headerText"},{tagName:"text",selector:"bodyText"}]}),Wn=Fe.define("standard.Cylinder",{attrs:{body:{lateralArea:10,fill:"#FFFFFF",stroke:"#333333",strokeWidth:2},top:{refCx:"50%",cy:10,refRx:"50%",ry:10,fill:"#FFFFFF",stroke:"#333333",strokeWidth:2},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"100%",refY2:15,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"path",selector:"body"},{tagName:"ellipse",selector:"top"},{tagName:"text",selector:"label"}],topRy:function(t,e){if(void 0===t)return this.attr("body/lateralArea");var i={lateralArea:t},n=ft(t)?{refCy:t,refRy:t,cy:null,ry:null}:{refCy:null,refRy:null,cy:t,ry:t};return this.attr({body:i,top:n},e)}},{attributes:{lateralArea:{set:function(t,e){var i=ft(t);i&&(t=parseFloat(t)/100);var n=e.x,r=e.y,o=e.width,s=e.height,a=o/2,l=i?s*t:t,c=q.KAPPA,g=c*a,h=c*(i?s*t:t),u=n+o/2,d=n+o,f=r+l,p=f-l,I=r+s-l,m=r+s;return{d:["M",n,f,"L",n,I,"C",n,I+h,u-g,m,u,m,"C",u+g,m,d,I+h,d,I,"L",d,f,"C",d,f-h,u+g,p,u,p,"C",u-g,p,n,f-h,n,f,"Z"].join(" ")}}}}}),Un=pn.test("svgforeignobject")?{tagName:"foreignObject",selector:"foreignObject",attributes:{overflow:"hidden"},children:[{tagName:"div",namespaceURI:"http://www.w3.org/1999/xhtml",selector:"label",style:{width:"100%",height:"100%",position:"static",backgroundColor:"transparent",textAlign:"center",margin:0,padding:"0px 5px",boxSizing:"border-box",display:"flex",alignItems:"center",justifyContent:"center"}}]}:{tagName:"text",selector:"label",attributes:{"text-anchor":"middle"}},Xn={Rectangle:jn,Circle:Tn,Ellipse:Zn,Path:Ln,Polygon:Pn,Polyline:Gn,Image:Bn,BorderedImage:On,EmbeddedImage:En,InscribedImage:Yn,HeaderedRectangle:Rn,Cylinder:Wn,TextBlock:Fe.define("standard.TextBlock",{attrs:{body:{refWidth:"100%",refHeight:"100%",stroke:"#333333",fill:"#ffffff",strokeWidth:2},foreignObject:{refWidth:"100%",refHeight:"100%"},label:{style:{fontSize:14}}}},{markup:[{tagName:"rect",selector:"body"},Un]},{attributes:{text:{set:function(t,e,i,n){if(!(i instanceof HTMLElement)){var r=n.style||{},o={text:t,width:-5,height:"100%"},s=jt({textVerticalAnchor:"middle"},r);return xe.textWrap.set.call(this,o,e,i,s),{fill:r.color||null}}i.textContent=t},position:function(t,e,i){if(i instanceof SVGElement)return e.center()}}}}),Link:We.define("standard.Link",{attrs:{line:{connection:!0,stroke:"#333333",strokeWidth:2,strokeLinejoin:"round",targetMarker:{type:"path",d:"M 10 -5 0 0 10 5 z"}},wrapper:{connection:!0,strokeWidth:10,strokeLinejoin:"round"}}},{markup:[{tagName:"path",selector:"wrapper",attributes:{fill:"none",cursor:"pointer",stroke:"transparent","stroke-linecap":"round"}},{tagName:"path",selector:"line",attributes:{fill:"none","pointer-events":"none"}}]}),DoubleLink:We.define("standard.DoubleLink",{attrs:{line:{connection:!0,stroke:"#DDDDDD",strokeWidth:4,strokeLinejoin:"round",targetMarker:{type:"path",stroke:"#000000",d:"M 10 -3 10 -10 -2 0 10 10 10 3"}},outline:{connection:!0,stroke:"#000000",strokeWidth:6,strokeLinejoin:"round"}}},{markup:[{tagName:"path",selector:"outline",attributes:{fill:"none"}},{tagName:"path",selector:"line",attributes:{fill:"none"}}]}),ShadowLink:We.define("standard.ShadowLink",{attrs:{line:{connection:!0,stroke:"#FF0000",strokeWidth:20,strokeLinejoin:"round",targetMarker:{type:"path",stroke:"none",d:"M 0 -10 -10 0 0 10 z"},sourceMarker:{type:"path",stroke:"none",d:"M -10 -10 0 0 -10 10 0 10 0 -10 z"}},shadow:{connection:!0,refX:3,refY:6,stroke:"#000000",strokeOpacity:.2,strokeWidth:20,strokeLinejoin:"round",targetMarker:{type:"path",d:"M 0 -10 -10 0 0 10 z",stroke:"none"},sourceMarker:{type:"path",stroke:"none",d:"M -10 -10 0 0 -10 10 0 10 0 -10 z"}}}},{markup:[{tagName:"path",selector:"shadow",attributes:{fill:"none"}},{tagName:"path",selector:"line",attributes:{fill:"none"}}]})},Vn=In.define("devs.Model",{inPorts:[],outPorts:[],size:{width:80,height:80},attrs:{".":{magnet:!1},".label":{text:"Model","ref-x":.5,"ref-y":10,"font-size":18,"text-anchor":"middle",fill:"#000"},".body":{"ref-width":"100%","ref-height":"100%",stroke:"#000"}},ports:{groups:{in:{position:{name:"left"},attrs:{".port-label":{fill:"#000"},".port-body":{fill:"#fff",stroke:"#000",r:10,magnet:!0}},label:{position:{name:"left",args:{y:10}}}},out:{position:{name:"right"},attrs:{".port-label":{fill:"#000"},".port-body":{fill:"#fff",stroke:"#000",r:10,magnet:!0}},label:{position:{name:"right",args:{y:10}}}}}}},{markup:'',portMarkup:'',portLabelMarkup:'',initialize:function(){In.prototype.initialize.apply(this,arguments),this.on("change:inPorts change:outPorts",this.updatePortItems,this),this.updatePortItems()},updatePortItems:function(t,e,i){var n=Gt(this.get("inPorts")),r=Qt(Gt(this.get("outPorts")),n),o=this.createPortItems("in",n),s=this.createPortItems("out",r);this.prop("ports/items",o.concat(s),jt({rewrite:!0},i))},createPortItem:function(t,e){return{id:e,group:t,attrs:{".port-label":{text:e}}}},createPortItems:function(t,e){return Ut(e).map(this.createPortItem.bind(this,t))},_addGroupPort:function(t,e,i){var n=this.get(e);return this.set(e,Array.isArray(n)?n.concat(t):[t],i)},addOutPort:function(t,e){return this._addGroupPort(t,"outPorts",e)},addInPort:function(t,e){return this._addGroupPort(t,"inPorts",e)},_removeGroupPort:function(t,e,i){return this.set(e,Ht(this.get(e),t),i)},removeOutPort:function(t,e){return this._removeGroupPort(t,"outPorts",e)},removeInPort:function(t,e){return this._removeGroupPort(t,"inPorts",e)},_changeGroup:function(t,e,i){return this.prop("ports/groups/"+t,le(e)?e:{},i)},changeInGroup:function(t,e){return this._changeGroup("in",t,e)},changeOutGroup:function(t,e){return this._changeGroup("out",t,e)}}),Fn=Vn.define("devs.Atomic",{size:{width:80,height:80},attrs:{".label":{text:"Atomic"}}}),Jn=Vn.define("devs.Coupled",{size:{width:200,height:300},attrs:{".label":{text:"Coupled"}}}),Hn={Model:Vn,Atomic:Fn,Coupled:Jn,Link:We.define("devs.Link",{attrs:{".connection":{"stroke-width":2}}})},Qn=In.define("logic.Gate",{size:{width:80,height:40},attrs:{".":{magnet:!1},".body":{width:100,height:50},circle:{r:7,stroke:"black",fill:"transparent","stroke-width":2}}},{operation:function(){return!0}}),_n=Qn.define("logic.IO",{size:{width:60,height:30},attrs:{".body":{fill:"white",stroke:"black","stroke-width":2},".wire":{ref:".body","ref-y":.5,stroke:"black"},text:{fill:"black",ref:".body","ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle","font-weight":"bold","font-variant":"small-caps","text-transform":"capitalize","font-size":"14px"}}},{markup:''}),Kn=_n.define("logic.Input",{attrs:{".wire":{"ref-dx":0,d:"M 0 0 L 23 0"},circle:{ref:".body","ref-dx":30,"ref-y":.5,magnet:!0,class:"output",port:"out"},text:{text:"input"}}}),qn=_n.define("logic.Output",{attrs:{".wire":{"ref-x":0,d:"M 0 0 L -23 0"},circle:{ref:".body","ref-x":-30,"ref-y":.5,magnet:"passive",class:"input",port:"in"},text:{text:"output"}}}),$n=Qn.define("logic.Gate11",{attrs:{".input":{ref:".body","ref-x":-2,"ref-y":.5,magnet:"passive",port:"in"},".output":{ref:".body","ref-dx":2,"ref-y":.5,magnet:!0,port:"out"}}},{markup:''}),tr=Qn.define("logic.Gate21",{attrs:{".input1":{ref:".body","ref-x":-2,"ref-y":.3,magnet:"passive",port:"in1"},".input2":{ref:".body","ref-x":-2,"ref-y":.7,magnet:"passive",port:"in2"},".output":{ref:".body","ref-dx":2,"ref-y":.5,magnet:!0,port:"out"}}},{markup:''}),er=$n.define("logic.Repeater",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5PVCBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjgiCiAgICAgaW5rc2NhcGU6Y3g9Ijg0LjY4NTM1MiIKICAgICBpbmtzY2FwZTpjeT0iMTUuMjg4NjI4IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjMzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gNzIuMTU2OTEsMjUgTCA5NSwyNSIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAyOS4wNDM0NzgsMjUgTCA1LjA0MzQ3ODEsMjUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgZD0iTSAyOC45Njg3NSwyLjU5Mzc1IEwgMjguOTY4NzUsNSBMIDI4Ljk2ODc1LDQ1IEwgMjguOTY4NzUsNDcuNDA2MjUgTCAzMS4xMjUsNDYuMzQzNzUgTCA3Mi4xNTYyNSwyNi4zNDM3NSBMIDcyLjE1NjI1LDIzLjY1NjI1IEwgMzEuMTI1LDMuNjU2MjUgTCAyOC45Njg3NSwyLjU5Mzc1IHogTSAzMS45Njg3NSw3LjQwNjI1IEwgNjguMDkzNzUsMjUgTCAzMS45Njg3NSw0Mi41OTM3NSBMIDMxLjk2ODc1LDcuNDA2MjUgeiIKICAgICAgIGlkPSJwYXRoMjYzOCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjY2NjYyIgLz4KICA8L2c+Cjwvc3ZnPgo="}}},{operation:function(t){return t}}),ir=$n.define("logic.Not",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5PVCBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjgiCiAgICAgaW5rc2NhcGU6Y3g9Ijg0LjY4NTM1MiIKICAgICBpbmtzY2FwZTpjeT0iMTUuMjg4NjI4IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjMzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gNzkuMTU2OTEsMjUgTCA5NSwyNSIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAyOS4wNDM0NzgsMjUgTCA1LjA0MzQ3ODEsMjUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgZD0iTSAyOC45Njg3NSwyLjU5Mzc1IEwgMjguOTY4NzUsNSBMIDI4Ljk2ODc1LDQ1IEwgMjguOTY4NzUsNDcuNDA2MjUgTCAzMS4xMjUsNDYuMzQzNzUgTCA3Mi4xNTYyNSwyNi4zNDM3NSBMIDcyLjE1NjI1LDIzLjY1NjI1IEwgMzEuMTI1LDMuNjU2MjUgTCAyOC45Njg3NSwyLjU5Mzc1IHogTSAzMS45Njg3NSw3LjQwNjI1IEwgNjguMDkzNzUsMjUgTCAzMS45Njg3NSw0Mi41OTM3NSBMIDMxLjk2ODc1LDcuNDA2MjUgeiIKICAgICAgIGlkPSJwYXRoMjYzOCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICBpZD0icGF0aDI2NzEiCiAgICAgICBzb2RpcG9kaTpjeD0iNzYiCiAgICAgICBzb2RpcG9kaTpjeT0iMjUiCiAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgIHNvZGlwb2RpOnJ5PSI0IgogICAgICAgZD0iTSA4MCwyNSBBIDQsNCAwIDEgMSA3MiwyNSBBIDQsNCAwIDEgMSA4MCwyNSB6IgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEsMCkiIC8+CiAgPC9nPgo8L3N2Zz4K"}}},{operation:function(t){return!t}}),nr=tr.define("logic.Or",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik9SIEFOU0kuc3ZnIgogICBpbmtzY2FwZTpvdXRwdXRfZXh0ZW5zaW9uPSJvcmcuaW5rc2NhcGUub3V0cHV0LnN2Zy5pbmtzY2FwZSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjUwIDogMTUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjI1IDogMTAgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjcxNCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODA2IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODE5IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjM3Mi4wNDcyNCA6IDM1MC43ODczOSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI3NDQuMDk0NDggOiA1MjYuMTgxMDkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNzc3IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49Ijc1IDogNDAgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMTUwIDogNjAgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDYwIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTMyNzUiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNTAgOiAzMy4zMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMTAwIDogNTAgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDUwIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1MzMiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzIgOiAyMS4zMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNjQgOiAzMiA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMzIgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjU1NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDE2LjY2NjY2NyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDI1IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAyNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iNCIKICAgICBpbmtzY2FwZTpjeD0iMTEzLjAwMDM5IgogICAgIGlua3NjYXBlOmN5PSIxMi44OTM3MzEiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImcyNTYwIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTpncmlkLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1wb2ludHM9InRydWUiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAwMDAiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMzk5IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijg3NCIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMzciCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii00IgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gNzAsMjUgYyAyMCwwIDI1LDAgMjUsMCIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMSwxNSA1LDE1IgogICAgICAgaWQ9InBhdGgzMDYxIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzIsMzUgNSwzNSIKICAgICAgIGlkPSJwYXRoMzk0NCIgLz4KICAgIDxnCiAgICAgICBpZD0iZzI1NjAiCiAgICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2LjUsLTM5LjUpIj4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJNIC0yLjQwNjI1LDQ0LjUgTCAtMC40MDYyNSw0Ni45Mzc1IEMgLTAuNDA2MjUsNDYuOTM3NSA1LjI1LDUzLjkzNzU0OSA1LjI1LDY0LjUgQyA1LjI1LDc1LjA2MjQ1MSAtMC40MDYyNSw4Mi4wNjI1IC0wLjQwNjI1LDgyLjA2MjUgTCAtMi40MDYyNSw4NC41IEwgMC43NSw4NC41IEwgMTQuNzUsODQuNSBDIDE3LjE1ODA3Niw4NC41MDAwMDEgMjIuNDM5Njk5LDg0LjUyNDUxNCAyOC4zNzUsODIuMDkzNzUgQyAzNC4zMTAzMDEsNzkuNjYyOTg2IDQwLjkxMTUzNiw3NC43NTA0ODQgNDYuMDYyNSw2NS4yMTg3NSBMIDQ0Ljc1LDY0LjUgTCA0Ni4wNjI1LDYzLjc4MTI1IEMgMzUuNzU5Mzg3LDQ0LjcxNTU5IDE5LjUwNjU3NCw0NC41IDE0Ljc1LDQ0LjUgTCAwLjc1LDQ0LjUgTCAtMi40MDYyNSw0NC41IHogTSAzLjQ2ODc1LDQ3LjUgTCAxNC43NSw0Ny41IEMgMTkuNDM0MTczLDQ3LjUgMzMuMDM2ODUsNDcuMzY5NzkzIDQyLjcxODc1LDY0LjUgQyAzNy45NTE5NjQsNzIuOTI5MDc1IDMyLjE5NzQ2OSw3Ny4xODM5MSAyNyw3OS4zMTI1IEMgMjEuNjM5MzM5LDgxLjUwNzkyNCAxNy4xNTgwNzUsODEuNTAwMDAxIDE0Ljc1LDgxLjUgTCAzLjUsODEuNSBDIDUuMzczNTg4NCw3OC4zOTE1NjYgOC4yNSw3Mi40NTA2NSA4LjI1LDY0LjUgQyA4LjI1LDU2LjUyNjY0NiA1LjM0MTQ2ODYsNTAuNTk5ODE1IDMuNDY4NzUsNDcuNSB6IgogICAgICAgICBpZD0icGF0aDQ5NzMiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NzY2NjY3NjY2NjY2NjY2NzY2NzYyIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo="}}},{operation:function(t,e){return t||e}}),rr=tr.define("logic.And",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9IkFORCBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI4IgogICAgIGlua3NjYXBlOmN4PSI1Ni42OTgzNDgiCiAgICAgaW5rc2NhcGU6Y3k9IjI1LjMyNjg5OSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzOTkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIzMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJtIDcwLDI1IGMgMjAsMCAyNSwwIDI1LDAiCiAgICAgICBpZD0icGF0aDMwNTkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzEsMTUgNSwxNSIKICAgICAgIGlkPSJwYXRoMzA2MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDMyLDM1IDUsMzUiCiAgICAgICBpZD0icGF0aDM5NDQiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZvbnQtc2l6ZTptZWRpdW07Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDt0ZXh0LWluZGVudDowO3RleHQtYWxpZ246c3RhcnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bGluZS1oZWlnaHQ6bm9ybWFsO2xldHRlci1zcGFjaW5nOm5vcm1hbDt3b3JkLXNwYWNpbmc6bm9ybWFsO3RleHQtdHJhbnNmb3JtOm5vbmU7ZGlyZWN0aW9uOmx0cjtibG9jay1wcm9ncmVzc2lvbjp0Yjt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGU7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOkJpdHN0cmVhbSBWZXJhIFNhbnMiCiAgICAgICBkPSJNIDMwLDUgTCAzMCw2LjQyODU3MTQgTCAzMCw0My41NzE0MjkgTCAzMCw0NSBMIDMxLjQyODU3MSw0NSBMIDUwLjQ3NjE5LDQ1IEMgNjEuNzQ0MDk4LDQ1IDcwLjQ3NjE5LDM1Ljk5OTk1NSA3MC40NzYxOSwyNSBDIDcwLjQ3NjE5LDE0LjAwMDA0NSA2MS43NDQwOTksNS4wMDAwMDAyIDUwLjQ3NjE5LDUgQyA1MC40NzYxOSw1IDUwLjQ3NjE5LDUgMzEuNDI4NTcxLDUgTCAzMCw1IHogTSAzMi44NTcxNDMsNy44NTcxNDI5IEMgNDAuODM0MjY0LDcuODU3MTQyOSA0NS45MTgzNjgsNy44NTcxNDI5IDQ4LjA5NTIzOCw3Ljg1NzE0MjkgQyA0OS4yODU3MTQsNy44NTcxNDI5IDQ5Ljg4MDk1Miw3Ljg1NzE0MjkgNTAuMTc4NTcxLDcuODU3MTQyOSBDIDUwLjMyNzM4MSw3Ljg1NzE0MjkgNTAuNDA5MjI3LDcuODU3MTQyOSA1MC40NDY0MjksNy44NTcxNDI5IEMgNTAuNDY1MDI5LDcuODU3MTQyOSA1MC40NzE1NDMsNy44NTcxNDI5IDUwLjQ3NjE5LDcuODU3MTQyOSBDIDYwLjIzNjg1Myw3Ljg1NzE0MyA2Ny4xNDI4NTcsMTUuNDk3MDk4IDY3LjE0Mjg1NywyNSBDIDY3LjE0Mjg1NywzNC41MDI5MDIgNTkuNzYwNjYyLDQyLjE0Mjg1NyA1MCw0Mi4xNDI4NTcgTCAzMi44NTcxNDMsNDIuMTQyODU3IEwgMzIuODU3MTQzLDcuODU3MTQyOSB6IgogICAgICAgaWQ9InBhdGgyODg0IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NzY2NjY3Nzc3NzY2NjIiAvPgogIDwvZz4KPC9zdmc+Cg=="}}},{operation:function(t,e){return t&&e}}),or=tr.define("logic.Nor",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5PUiBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEiCiAgICAgaW5rc2NhcGU6Y3g9Ijc4LjY3NzY0NCIKICAgICBpbmtzY2FwZTpjeT0iMjIuMTAyMzQ0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjM3IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItNCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDc5LDI1IEMgOTksMjUgOTUsMjUgOTUsMjUiCiAgICAgICBpZD0icGF0aDMwNTkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzEsMTUgNSwxNSIKICAgICAgIGlkPSJwYXRoMzA2MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDMyLDM1IDUsMzUiCiAgICAgICBpZD0icGF0aDM5NDQiIC8+CiAgICA8ZwogICAgICAgaWQ9ImcyNTYwIgogICAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNi41LC0zOS41KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0iTSAtMi40MDYyNSw0NC41IEwgLTAuNDA2MjUsNDYuOTM3NSBDIC0wLjQwNjI1LDQ2LjkzNzUgNS4yNSw1My45Mzc1NDkgNS4yNSw2NC41IEMgNS4yNSw3NS4wNjI0NTEgLTAuNDA2MjUsODIuMDYyNSAtMC40MDYyNSw4Mi4wNjI1IEwgLTIuNDA2MjUsODQuNSBMIDAuNzUsODQuNSBMIDE0Ljc1LDg0LjUgQyAxNy4xNTgwNzYsODQuNTAwMDAxIDIyLjQzOTY5OSw4NC41MjQ1MTQgMjguMzc1LDgyLjA5Mzc1IEMgMzQuMzEwMzAxLDc5LjY2Mjk4NiA0MC45MTE1MzYsNzQuNzUwNDg0IDQ2LjA2MjUsNjUuMjE4NzUgTCA0NC43NSw2NC41IEwgNDYuMDYyNSw2My43ODEyNSBDIDM1Ljc1OTM4Nyw0NC43MTU1OSAxOS41MDY1NzQsNDQuNSAxNC43NSw0NC41IEwgMC43NSw0NC41IEwgLTIuNDA2MjUsNDQuNSB6IE0gMy40Njg3NSw0Ny41IEwgMTQuNzUsNDcuNSBDIDE5LjQzNDE3Myw0Ny41IDMzLjAzNjg1LDQ3LjM2OTc5MyA0Mi43MTg3NSw2NC41IEMgMzcuOTUxOTY0LDcyLjkyOTA3NSAzMi4xOTc0NjksNzcuMTgzOTEgMjcsNzkuMzEyNSBDIDIxLjYzOTMzOSw4MS41MDc5MjQgMTcuMTU4MDc1LDgxLjUwMDAwMSAxNC43NSw4MS41IEwgMy41LDgxLjUgQyA1LjM3MzU4ODQsNzguMzkxNTY2IDguMjUsNzIuNDUwNjUgOC4yNSw2NC41IEMgOC4yNSw1Ni41MjY2NDYgNS4zNDE0Njg2LDUwLjU5OTgxNSAzLjQ2ODc1LDQ3LjUgeiIKICAgICAgICAgaWQ9InBhdGg0OTczIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc2NjY2NzY2NjY2NjY2Njc2Njc2MiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBpZD0icGF0aDI2MDQiCiAgICAgICAgIHNvZGlwb2RpOmN4PSI3NSIKICAgICAgICAgc29kaXBvZGk6Y3k9IjI1IgogICAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgICAgc29kaXBvZGk6cnk9IjQiCiAgICAgICAgIGQ9Ik0gNzksMjUgQSA0LDQgMCAxIDEgNzEsMjUgQSA0LDQgMCAxIDEgNzksMjUgeiIKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2LjUsMzkuNSkiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K"}}},{operation:function(t,e){return!(t||e)}}),sr=tr.define("logic.Nand",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5BTkQgQU5TSS5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMTUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxMCA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNzE0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MDYiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3NzciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNzUgOiA0MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxNTAgOiA2MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNjAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzI3NSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI1MCA6IDMzLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxMDAgOiA1MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTUzMyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzMiA6IDIxLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI2NCA6IDMyIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAzMiA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMTYiCiAgICAgaW5rc2NhcGU6Y3g9Ijc4LjI4MzMwNyIKICAgICBpbmtzY2FwZTpjeT0iMTYuNDQyODQzIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjMzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gNzksMjUgQyA5MS44LDI1IDk1LDI1IDk1LDI1IgogICAgICAgaWQ9InBhdGgzMDU5IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDMxLDE1IDUsMTUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45OTk5OTk4ODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMiwzNSA1LDM1IgogICAgICAgaWQ9InBhdGgzOTQ0IiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmb250LXNpemU6bWVkaXVtO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7dGV4dC1pbmRlbnQ6MDt0ZXh0LWFsaWduOnN0YXJ0O3RleHQtZGVjb3JhdGlvbjpub25lO2xpbmUtaGVpZ2h0Om5vcm1hbDtsZXR0ZXItc3BhY2luZzpub3JtYWw7d29yZC1zcGFjaW5nOm5vcm1hbDt0ZXh0LXRyYW5zZm9ybTpub25lO2RpcmVjdGlvbjpsdHI7YmxvY2stcHJvZ3Jlc3Npb246dGI7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MzttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpCaXRzdHJlYW0gVmVyYSBTYW5zIgogICAgICAgZD0iTSAzMCw1IEwgMzAsNi40Mjg1NzE0IEwgMzAsNDMuNTcxNDI5IEwgMzAsNDUgTCAzMS40Mjg1NzEsNDUgTCA1MC40NzYxOSw0NSBDIDYxLjc0NDA5OCw0NSA3MC40NzYxOSwzNS45OTk5NTUgNzAuNDc2MTksMjUgQyA3MC40NzYxOSwxNC4wMDAwNDUgNjEuNzQ0MDk5LDUuMDAwMDAwMiA1MC40NzYxOSw1IEMgNTAuNDc2MTksNSA1MC40NzYxOSw1IDMxLjQyODU3MSw1IEwgMzAsNSB6IE0gMzIuODU3MTQzLDcuODU3MTQyOSBDIDQwLjgzNDI2NCw3Ljg1NzE0MjkgNDUuOTE4MzY4LDcuODU3MTQyOSA0OC4wOTUyMzgsNy44NTcxNDI5IEMgNDkuMjg1NzE0LDcuODU3MTQyOSA0OS44ODA5NTIsNy44NTcxNDI5IDUwLjE3ODU3MSw3Ljg1NzE0MjkgQyA1MC4zMjczODEsNy44NTcxNDI5IDUwLjQwOTIyNyw3Ljg1NzE0MjkgNTAuNDQ2NDI5LDcuODU3MTQyOSBDIDUwLjQ2NTAyOSw3Ljg1NzE0MjkgNTAuNDcxNTQzLDcuODU3MTQyOSA1MC40NzYxOSw3Ljg1NzE0MjkgQyA2MC4yMzY4NTMsNy44NTcxNDMgNjcuMTQyODU3LDE1LjQ5NzA5OCA2Ny4xNDI4NTcsMjUgQyA2Ny4xNDI4NTcsMzQuNTAyOTAyIDU5Ljc2MDY2Miw0Mi4xNDI4NTcgNTAsNDIuMTQyODU3IEwgMzIuODU3MTQzLDQyLjE0Mjg1NyBMIDMyLjg1NzE0Myw3Ljg1NzE0MjkgeiIKICAgICAgIGlkPSJwYXRoMjg4NCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2Njc2NjY2Nzc3Nzc2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICBpZD0icGF0aDQwMDgiCiAgICAgICBzb2RpcG9kaTpjeD0iNzUiCiAgICAgICBzb2RpcG9kaTpjeT0iMjUiCiAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgIHNvZGlwb2RpOnJ5PSI0IgogICAgICAgZD0iTSA3OSwyNSBBIDQsNCAwIDEgMSA3MSwyNSBBIDQsNCAwIDEgMSA3OSwyNSB6IiAvPgogIDwvZz4KPC9zdmc+Cg=="}}},{operation:function(t,e){return!(t&&e)}}),ar=tr.define("logic.Xor",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9IlhPUiBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjUuNjU2ODU0MiIKICAgICBpbmtzY2FwZTpjeD0iMjUuOTM4MTE2IgogICAgIGlua3NjYXBlOmN5PSIxNy4yMzAwNSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzOTkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIzMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJtIDcwLDI1IGMgMjAsMCAyNSwwIDI1LDAiCiAgICAgICBpZD0icGF0aDMwNTkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzAuMzg1NzE3LDE1IEwgNC45OTk5OTk4LDE1IgogICAgICAgaWQ9InBhdGgzMDYxIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5NzY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzEuMzYyMDkxLDM1IEwgNC45OTk5OTk4LDM1IgogICAgICAgaWQ9InBhdGgzOTQ0IiAvPgogICAgPGcKICAgICAgIGlkPSJnMjU2MCIKICAgICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjYuNSwtMzkuNSkiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDM1MTYiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0iTSAtMi4yNSw4MS41MDAwMDUgQyAtMy44NDczNzQsODQuMTQ0NDA1IC00LjUsODQuNTAwMDA1IC00LjUsODQuNTAwMDA1IEwgLTguMTU2MjUsODQuNTAwMDA1IEwgLTYuMTU2MjUsODIuMDYyNTA1IEMgLTYuMTU2MjUsODIuMDYyNTA1IC0wLjUsNzUuMDYyNDUxIC0wLjUsNjQuNSBDIC0wLjUsNTMuOTM3NTQ5IC02LjE1NjI1LDQ2LjkzNzUgLTYuMTU2MjUsNDYuOTM3NSBMIC04LjE1NjI1LDQ0LjUgTCAtNC41LDQ0LjUgQyAtMy43MTg3NSw0NS40Mzc1IC0zLjA3ODEyNSw0Ni4xNTYyNSAtMi4yODEyNSw0Ny41IEMgLTAuNDA4NTMxLDUwLjU5OTgxNSAyLjUsNTYuNTI2NjQ2IDIuNSw2NC41IEMgMi41LDcyLjQ1MDY1IC0wLjM5NjY5Nyw3OC4zNzk0MjUgLTIuMjUsODEuNTAwMDA1IHoiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY3NjY2Njc2MiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0iTSAtMi40MDYyNSw0NC41IEwgLTAuNDA2MjUsNDYuOTM3NSBDIC0wLjQwNjI1LDQ2LjkzNzUgNS4yNSw1My45Mzc1NDkgNS4yNSw2NC41IEMgNS4yNSw3NS4wNjI0NTEgLTAuNDA2MjUsODIuMDYyNSAtMC40MDYyNSw4Mi4wNjI1IEwgLTIuNDA2MjUsODQuNSBMIDAuNzUsODQuNSBMIDE0Ljc1LDg0LjUgQyAxNy4xNTgwNzYsODQuNTAwMDAxIDIyLjQzOTY5OSw4NC41MjQ1MTQgMjguMzc1LDgyLjA5Mzc1IEMgMzQuMzEwMzAxLDc5LjY2Mjk4NiA0MC45MTE1MzYsNzQuNzUwNDg0IDQ2LjA2MjUsNjUuMjE4NzUgTCA0NC43NSw2NC41IEwgNDYuMDYyNSw2My43ODEyNSBDIDM1Ljc1OTM4Nyw0NC43MTU1OSAxOS41MDY1NzQsNDQuNSAxNC43NSw0NC41IEwgMC43NSw0NC41IEwgLTIuNDA2MjUsNDQuNSB6IE0gMy40Njg3NSw0Ny41IEwgMTQuNzUsNDcuNSBDIDE5LjQzNDE3Myw0Ny41IDMzLjAzNjg1LDQ3LjM2OTc5MyA0Mi43MTg3NSw2NC41IEMgMzcuOTUxOTY0LDcyLjkyOTA3NSAzMi4xOTc0NjksNzcuMTgzOTEgMjcsNzkuMzEyNSBDIDIxLjYzOTMzOSw4MS41MDc5MjQgMTcuMTU4MDc1LDgxLjUwMDAwMSAxNC43NSw4MS41IEwgMy41LDgxLjUgQyA1LjM3MzU4ODQsNzguMzkxNTY2IDguMjUsNzIuNDUwNjUgOC4yNSw2NC41IEMgOC4yNSw1Ni41MjY2NDYgNS4zNDE0Njg2LDUwLjU5OTgxNSAzLjQ2ODc1LDQ3LjUgeiIKICAgICAgICAgaWQ9InBhdGg0OTczIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc2NjY2NzY2NjY2NjY2Njc2Njc2MiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K"}}},{operation:function(t,e){return(!t||e)&&(t||!e)}}),lr=tr.define("logic.Xnor",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9IlhOT1IgQU5TSS5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMTUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxMCA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNzE0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MDYiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3NzciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNzUgOiA0MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxNTAgOiA2MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNjAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzI3NSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI1MCA6IDMzLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxMDAgOiA1MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTUzMyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzMiA6IDIxLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI2NCA6IDMyIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAzMiA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNTU3IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjI1IDogMTYuNjY2NjY3IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjUwIDogMjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDI1IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI0IgogICAgIGlua3NjYXBlOmN4PSI5NS43MjM2NiIKICAgICBpbmtzY2FwZTpjeT0iLTI2Ljc3NTAyMyIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzOTkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIzMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAwMDAwMDI0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDc4LjMzMzMzMiwyNSBDIDkxLjY2NjY2NiwyNSA5NSwyNSA5NSwyNSIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45OTk5OTk4ODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMC4zODU3MTcsMTUgTCA0Ljk5OTk5OTgsMTUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45OTk5OTk3NjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMS4zNjIwOTEsMzUgTCA0Ljk5OTk5OTgsMzUiCiAgICAgICBpZD0icGF0aDM5NDQiIC8+CiAgICA8ZwogICAgICAgaWQ9ImcyNTYwIgogICAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNi41LC0zOS41KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzUxNiIKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJNIC0yLjI1LDgxLjUwMDAwNSBDIC0zLjg0NzM3NCw4NC4xNDQ0MDUgLTQuNSw4NC41MDAwMDUgLTQuNSw4NC41MDAwMDUgTCAtOC4xNTYyNSw4NC41MDAwMDUgTCAtNi4xNTYyNSw4Mi4wNjI1MDUgQyAtNi4xNTYyNSw4Mi4wNjI1MDUgLTAuNSw3NS4wNjI0NTEgLTAuNSw2NC41IEMgLTAuNSw1My45Mzc1NDkgLTYuMTU2MjUsNDYuOTM3NSAtNi4xNTYyNSw0Ni45Mzc1IEwgLTguMTU2MjUsNDQuNSBMIC00LjUsNDQuNSBDIC0zLjcxODc1LDQ1LjQzNzUgLTMuMDc4MTI1LDQ2LjE1NjI1IC0yLjI4MTI1LDQ3LjUgQyAtMC40MDg1MzEsNTAuNTk5ODE1IDIuNSw1Ni41MjY2NDYgMi41LDY0LjUgQyAyLjUsNzIuNDUwNjUgLTAuMzk2Njk3LDc4LjM3OTQyNSAtMi4yNSw4MS41MDAwMDUgeiIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2Njc2NjY2NzYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJNIC0yLjQwNjI1LDQ0LjUgTCAtMC40MDYyNSw0Ni45Mzc1IEMgLTAuNDA2MjUsNDYuOTM3NSA1LjI1LDUzLjkzNzU0OSA1LjI1LDY0LjUgQyA1LjI1LDc1LjA2MjQ1MSAtMC40MDYyNSw4Mi4wNjI1IC0wLjQwNjI1LDgyLjA2MjUgTCAtMi40MDYyNSw4NC41IEwgMC43NSw4NC41IEwgMTQuNzUsODQuNSBDIDE3LjE1ODA3Niw4NC41MDAwMDEgMjIuNDM5Njk5LDg0LjUyNDUxNCAyOC4zNzUsODIuMDkzNzUgQyAzNC4zMTAzMDEsNzkuNjYyOTg2IDQwLjkxMTUzNiw3NC43NTA0ODQgNDYuMDYyNSw2NS4yMTg3NSBMIDQ0Ljc1LDY0LjUgTCA0Ni4wNjI1LDYzLjc4MTI1IEMgMzUuNzU5Mzg3LDQ0LjcxNTU5IDE5LjUwNjU3NCw0NC41IDE0Ljc1LDQ0LjUgTCAwLjc1LDQ0LjUgTCAtMi40MDYyNSw0NC41IHogTSAzLjQ2ODc1LDQ3LjUgTCAxNC43NSw0Ny41IEMgMTkuNDM0MTczLDQ3LjUgMzMuMDM2ODUsNDcuMzY5NzkzIDQyLjcxODc1LDY0LjUgQyAzNy45NTE5NjQsNzIuOTI5MDc1IDMyLjE5NzQ2OSw3Ny4xODM5MSAyNyw3OS4zMTI1IEMgMjEuNjM5MzM5LDgxLjUwNzkyNCAxNy4xNTgwNzUsODEuNTAwMDAxIDE0Ljc1LDgxLjUgTCAzLjUsODEuNSBDIDUuMzczNTg4NCw3OC4zOTE1NjYgOC4yNSw3Mi40NTA2NSA4LjI1LDY0LjUgQyA4LjI1LDU2LjUyNjY0NiA1LjM0MTQ2ODYsNTAuNTk5ODE1IDMuNDY4NzUsNDcuNSB6IgogICAgICAgICBpZD0icGF0aDQ5NzMiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NzY2NjY3NjY2NjY2NjY2NzY2NzYyIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICBpZD0icGF0aDM1NTEiCiAgICAgICBzb2RpcG9kaTpjeD0iNzUiCiAgICAgICBzb2RpcG9kaTpjeT0iMjUiCiAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgIHNvZGlwb2RpOnJ5PSI0IgogICAgICAgZD0iTSA3OSwyNSBBIDQsNCAwIDEgMSA3MSwyNSBBIDQsNCAwIDEgMSA3OSwyNSB6IiAvPgogIDwvZz4KPC9zdmc+Cg=="}}},{operation:function(t,e){return(!t||!e)&&(t||e)}}),cr={Gate:Qn,IO:_n,Input:Kn,Output:qn,Gate11:$n,Gate21:tr,Repeater:er,Not:ir,Or:nr,And:rr,Nor:or,Nand:sr,Xor:ar,Xnor:lr,Wire:We.define("logic.Wire",{attrs:{".connection":{"stroke-width":2},".marker-vertex":{r:7}},router:{name:"orthogonal"},connector:{name:"rounded",args:{radius:10}}},{arrowheadMarkup:['','',""].join(""),vertexMarkup:['','','','','',"Remove vertex.","","",""].join("")})},gr={KingWhite:In.define("chess.KingWhite",{size:{width:42,height:38}},{markup:' '}),KingBlack:In.define("chess.KingBlack",{size:{width:42,height:38}},{markup:' '}),QueenWhite:In.define("chess.QueenWhite",{size:{width:42,height:38}},{markup:' '}),QueenBlack:In.define("chess.QueenBlack",{size:{width:42,height:38}},{markup:' '}),RookWhite:In.define("chess.RookWhite",{size:{width:32,height:34}},{markup:' '}),RookBlack:In.define("chess.RookBlack",{size:{width:32,height:34}},{markup:' '}),BishopWhite:In.define("chess.BishopWhite",{size:{width:38,height:38}},{markup:' '}),BishopBlack:In.define("chess.BishopBlack",{size:{width:38,height:38}},{markup:' '}),KnightWhite:In.define("chess.KnightWhite",{size:{width:38,height:37}},{markup:' '}),KnightBlack:In.define("chess.KnightBlack",{size:{width:38,height:37}},{markup:' '}),PawnWhite:In.define("chess.PawnWhite",{size:{width:28,height:33}},{markup:''}),PawnBlack:In.define("chess.PawnBlack",{size:{width:28,height:33}},{markup:''})},hr=Fe.define("erd.Entity",{size:{width:150,height:60},attrs:{".outer":{fill:"#2ECC71",stroke:"#27AE60","stroke-width":2,points:"100,0 100,60 0,60 0,0"},".inner":{fill:"#2ECC71",stroke:"#27AE60","stroke-width":2,points:"95,5 95,55 5,55 5,5",display:"none"},text:{text:"Entity","font-family":"Arial","font-size":14,"ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),ur=hr.define("erd.WeakEntity",{attrs:{".inner":{display:"auto"},text:{text:"Weak Entity"}}}),dr=Fe.define("erd.Relationship",{size:{width:80,height:80},attrs:{".outer":{fill:"#3498DB",stroke:"#2980B9","stroke-width":2,points:"40,0 80,40 40,80 0,40"},".inner":{fill:"#3498DB",stroke:"#2980B9","stroke-width":2,points:"40,5 75,40 40,75 5,40",display:"none"},text:{text:"Relationship","font-family":"Arial","font-size":12,"ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),fr=dr.define("erd.IdentifyingRelationship",{attrs:{".inner":{display:"auto"},text:{text:"Identifying"}}}),pr=Fe.define("erd.Attribute",{size:{width:100,height:50},attrs:{ellipse:{transform:"translate(50, 25)"},".outer":{stroke:"#D35400","stroke-width":2,cx:0,cy:0,rx:50,ry:25,fill:"#E67E22"},".inner":{stroke:"#D35400","stroke-width":2,cx:0,cy:0,rx:45,ry:20,fill:"#E67E22",display:"none"},text:{"font-family":"Arial","font-size":14,"ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),Ir=pr.define("erd.Multivalued",{attrs:{".inner":{display:"block"},text:{text:"multivalued"}}}),mr=pr.define("erd.Derived",{attrs:{".outer":{"stroke-dasharray":"3,5"},text:{text:"derived"}}}),Ar=pr.define("erd.Key",{attrs:{ellipse:{"stroke-width":4},text:{text:"key","font-weight":"800","text-decoration":"underline"}}}),vr=pr.define("erd.Normal",{attrs:{text:{text:"Normal"}}}),Cr={Entity:hr,WeakEntity:ur,Relationship:dr,IdentifyingRelationship:fr,Attribute:pr,Multivalued:Ir,Derived:mr,Key:Ar,Normal:vr,ISA:Fe.define("erd.ISA",{type:"erd.ISA",size:{width:100,height:50},attrs:{polygon:{points:"0,0 50,50 100,0",fill:"#F1C40F",stroke:"#F39C12","stroke-width":2},text:{text:"ISA","font-size":18,"ref-x":.5,"ref-y":.3,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),Line:We.define("erd.Line",{},{cardinality:function(t){this.set("labels",[{position:-20,attrs:{text:{dy:-8,text:t}}}])}})},wr={State:Cn.define("fsa.State",{attrs:{circle:{"stroke-width":3},text:{"font-weight":"800"}}}),StartState:Fe.define("fsa.StartState",{size:{width:20,height:20},attrs:{circle:{transform:"translate(10, 10)",r:10,fill:"#000000"}}},{markup:''}),EndState:Fe.define("fsa.EndState",{size:{width:20,height:20},attrs:{".outer":{transform:"translate(10, 10)",r:10,fill:"#ffffff",stroke:"#000000"},".inner":{transform:"translate(10, 10)",r:6,fill:"#000000"}}},{markup:''}),Arrow:We.define("fsa.Arrow",{attrs:{".marker-target":{d:"M 10 0 L 0 5 L 10 10 z"}},smooth:!0})},yr={Member:Fe.define("org.Member",{size:{width:180,height:70},attrs:{rect:{width:170,height:60},".card":{fill:"#FFFFFF",stroke:"#000000","stroke-width":2,"pointer-events":"visiblePainted",rx:10,ry:10},image:{width:48,height:48,ref:".card","ref-x":10,"ref-y":5},".rank":{"text-decoration":"underline",ref:".card","ref-x":.9,"ref-y":.2,"font-family":"Courier New","font-size":14,"text-anchor":"end"},".name":{"font-weight":"800",ref:".card","ref-x":.9,"ref-y":.6,"font-family":"Courier New","font-size":14,"text-anchor":"end"}}},{markup:''}),Arrow:We.define("org.Arrow",{source:{selector:".card"},target:{selector:".card"},attrs:{".connection":{stroke:"#585858","stroke-width":3}},z:-1})},br={Place:In.define("pn.Place",{size:{width:50,height:50},attrs:{".root":{r:25,fill:"#ffffff",stroke:"#000000",transform:"translate(25, 25)"},".label":{"text-anchor":"middle","ref-x":.5,"ref-y":-20,ref:".root",fill:"#000000","font-size":12},".tokens > circle":{fill:"#000000",r:5},".tokens.one > circle":{transform:"translate(25, 25)"},".tokens.two > circle:nth-child(1)":{transform:"translate(19, 25)"},".tokens.two > circle:nth-child(2)":{transform:"translate(31, 25)"},".tokens.three > circle:nth-child(1)":{transform:"translate(18, 29)"},".tokens.three > circle:nth-child(2)":{transform:"translate(25, 19)"},".tokens.three > circle:nth-child(3)":{transform:"translate(32, 29)"},".tokens.alot > text":{transform:"translate(25, 18)","text-anchor":"middle",fill:"#000000"}}},{markup:''}),PlaceView:$e.extend({presentationAttributes:$e.addPresentationAttributes({tokens:["TOKENS"]}),initFlag:$e.prototype.initFlag.concat(["TOKENS"]),confirmUpdate:function(){for(var t,e=[],i=arguments.length;i--;)e[i]=arguments[i];var n=(t=$e.prototype.confirmUpdate).call.apply(t,[this].concat(e));return this.hasFlag(n,"TOKENS")&&(this.renderTokens(),this.update(),n=this.removeFlag(n,"TOKENS")),n},renderTokens:function(){var e=this.vel.findOne(".tokens").empty();["one","two","three","alot"].forEach(function(t){e.removeClass(t)});var t=this.model.get("tokens");if(t)switch(t){case 1:e.addClass("one"),e.append(q("circle"));break;case 2:e.addClass("two"),e.append([q("circle"),q("circle")]);break;case 3:e.addClass("three"),e.append([q("circle"),q("circle"),q("circle")]);break;default:e.addClass("alot"),e.append(q("text").text(t+""))}}}),Transition:In.define("pn.Transition",{size:{width:12,height:50},attrs:{rect:{width:12,height:50,fill:"#000000",stroke:"#000000"},".label":{"text-anchor":"middle","ref-x":.5,"ref-y":-20,ref:"rect",fill:"#000000","font-size":12}}},{markup:''}),Link:We.define("pn.Link",{attrs:{".marker-target":{d:"M 10 0 L 0 5 L 10 10 z"}}})},Nr=In.define("uml.Class",{attrs:{rect:{width:200},".uml-class-name-rect":{stroke:"black","stroke-width":2,fill:"#3498db"},".uml-class-attrs-rect":{stroke:"black","stroke-width":2,fill:"#2980b9"},".uml-class-methods-rect":{stroke:"black","stroke-width":2,fill:"#2980b9"},".uml-class-name-text":{ref:".uml-class-name-rect","ref-y":.5,"ref-x":.5,"text-anchor":"middle","y-alignment":"middle","font-weight":"bold",fill:"black","font-size":12,"font-family":"Times New Roman"},".uml-class-attrs-text":{ref:".uml-class-attrs-rect","ref-y":5,"ref-x":5,fill:"black","font-size":12,"font-family":"Times New Roman"},".uml-class-methods-text":{ref:".uml-class-methods-rect","ref-y":5,"ref-x":5,fill:"black","font-size":12,"font-family":"Times New Roman"}},name:[],attributes:[],methods:[]},{markup:['','','',"",'',""].join(""),initialize:function(){this.on("change:name change:attributes change:methods",function(){this.updateRectangles(),this.trigger("uml-update")},this),this.updateRectangles(),In.prototype.initialize.apply(this,arguments)},getClassName:function(){return this.get("name")},updateRectangles:function(){var n=this.get("attrs"),t=[{type:"name",text:this.getClassName()},{type:"attrs",text:this.get("attributes")},{type:"methods",text:this.get("methods")}],r=0;t.forEach(function(t){var e=Array.isArray(t.text)?t.text:[t.text],i=20*e.length+20;n[".uml-class-"+t.type+"-text"].text=e.join("\n"),n[".uml-class-"+t.type+"-rect"].height=i,n[".uml-class-"+t.type+"-rect"].transform="translate(0,"+r+")",r+=i})}}),Mr=$e.extend({initialize:function(){$e.prototype.initialize.apply(this,arguments),this.listenTo(this.model,"uml-update",function(){this.update(),this.resize()})}}),xr=Nr.define("uml.Abstract",{attrs:{".uml-class-name-rect":{fill:"#e74c3c"},".uml-class-attrs-rect":{fill:"#c0392b"},".uml-class-methods-rect":{fill:"#c0392b"}}},{getClassName:function(){return["<>",this.get("name")]}}),Sr=Mr,kr=Nr.define("uml.Interface",{attrs:{".uml-class-name-rect":{fill:"#f1c40f"},".uml-class-attrs-rect":{fill:"#f39c12"},".uml-class-methods-rect":{fill:"#f39c12"}}},{getClassName:function(){return["<>",this.get("name")]}}),Dr={basic:zn,standard:Xn,devs:Hn,logic:cr,chess:gr,erd:Cr,fsa:wr,org:yr,pn:br,uml:{Class:Nr,ClassView:Mr,Abstract:xr,AbstractView:Sr,Interface:kr,InterfaceView:Mr,Generalization:We.define("uml.Generalization",{attrs:{".marker-target":{d:"M 20 0 L 0 10 L 20 20 z",fill:"white"}}}),Implementation:We.define("uml.Implementation",{attrs:{".marker-target":{d:"M 20 0 L 0 10 L 20 20 z",fill:"white"},".connection":{"stroke-dasharray":"3,3"}}}),Aggregation:We.define("uml.Aggregation",{attrs:{".marker-target":{d:"M 40 10 L 20 20 L 0 10 L 20 0 z",fill:"white"}}}),Composition:We.define("uml.Composition",{attrs:{".marker-target":{d:"M 40 10 L 20 20 L 0 10 L 20 0 z",fill:"black"}}}),Association:We.define("uml.Association"),State:In.define("uml.State",{attrs:{".uml-state-body":{width:200,height:200,rx:10,ry:10,fill:"#ecf0f1",stroke:"#bdc3c7","stroke-width":3},".uml-state-separator":{stroke:"#bdc3c7","stroke-width":2},".uml-state-name":{ref:".uml-state-body","ref-x":.5,"ref-y":5,"text-anchor":"middle",fill:"#000000","font-family":"Courier New","font-size":14},".uml-state-events":{ref:".uml-state-separator","ref-x":5,"ref-y":5,fill:"#000000","font-family":"Courier New","font-size":14}},name:"State",events:[]},{markup:['','','',"",'','','',""].join(""),initialize:function(){this.on({"change:name":this.updateName,"change:events":this.updateEvents,"change:size":this.updatePath},this),this.updateName(),this.updateEvents(),this.updatePath(),In.prototype.initialize.apply(this,arguments)},updateName:function(){this.attr(".uml-state-name/text",this.get("name"))},updateEvents:function(){this.attr(".uml-state-events/text",this.get("events").join("\n"))},updatePath:function(){var t="M 0 20 L "+this.get("size").width+" 20";this.attr(".uml-state-separator/d",t,{silent:!0})}}),StartState:Cn.define("uml.StartState",{type:"uml.StartState",attrs:{circle:{fill:"#34495e",stroke:"#2c3e50","stroke-width":2,rx:1}}}),EndState:In.define("uml.EndState",{size:{width:20,height:20},attrs:{"circle.outer":{transform:"translate(10, 10)",r:10,fill:"#ffffff",stroke:"#2c3e50"},"circle.inner":{transform:"translate(10, 10)",r:6,fill:"#34495e"}}},{markup:''}),Transition:We.define("uml.Transition",{attrs:{".marker-target":{d:"M 10 0 L 0 5 L 10 10 z",fill:"#34495e",stroke:"#2c3e50"},".connection":{stroke:"#2c3e50"}}})}};function zr(t,e){return 0===e?"0%":Math.round(t/e*100)+"%"}function jr(r){return function(t,e,i,n){return(e.isNodeConnection(i)?Zr:Tr)(r,t,e,i,n)}}function Tr(t,e,i,n,r){var o=i.model.angle(),s=i.getNodeUnrotatedBBox(n),a=i.model.getBBox().center();r.rotate(a,o);var l=r.x-s.x,c=r.y-s.y;return t&&(l=zr(l,s.width),c=zr(c,s.height)),e.anchor={name:"topLeft",args:{dx:l,dy:c,rotate:!0}},e}function Zr(t,e,i,n,r){var o=i.getConnection();if(!o)return e;var s=o.closestPointLength(r);if(t){var a=o.length();e.anchor={name:"connectionRatio",args:{ratio:s/a}}}else e.anchor={name:"connectionLength",args:{length:s}};return e}var Lr=he,Pr=jr(!1),Gr=jr(!0),Br={useDefaults:Lr,pinAbsolute:Pr,pinRelative:Gr};function Or(t,e,i){return Gr.call(this.paper,{},e,i,t,this.model).anchor}function Er(t,e){var i=t.model;return e?i.getBBox():i.isLink()?t.getConnection().bbox():t.getNodeUnrotatedBBox(t.el)}var Yr=_e.extend({tagName:"circle",svgElement:!0,className:"marker-vertex",events:{mousedown:"onPointerDown",touchstart:"onPointerDown",dblclick:"onDoubleClick"},documentEvents:{mousemove:"onPointerMove",touchmove:"onPointerMove",mouseup:"onPointerUp",touchend:"onPointerUp",touchcancel:"onPointerUp"},attributes:{r:6,fill:"#33334F",stroke:"#FFFFFF","stroke-width":2,cursor:"move"},position:function(t,e){this.vel.attr({cx:t,cy:e})},onPointerDown:function(t){this.options.guard(t)||(t.stopPropagation(),t.preventDefault(),this.options.paper.undelegateEvents(),this.delegateDocumentEvents(null,t.data),this.trigger("will-change",this,t))},onPointerMove:function(t){this.trigger("changing",this,t)},onDoubleClick:function(t){this.trigger("remove",this,t)},onPointerUp:function(t){this.trigger("changed",this,t),this.undelegateDocumentEvents(),this.options.paper.delegateEvents()}}),Rr=hn.extend({name:"vertices",options:{handleClass:Yr,snapRadius:20,redundancyRemoval:!0,vertexAdding:!0,stopPropagation:!0},children:[{tagName:"path",selector:"connection",className:"joint-vertices-path",attributes:{fill:"none",stroke:"transparent","stroke-width":10,cursor:"cell"}}],handles:null,events:{"mousedown .joint-vertices-path":"onPathPointerDown","touchstart .joint-vertices-path":"onPathPointerDown"},onRender:function(){return this.options.vertexAdding&&(this.renderChildren(),this.updatePath()),this.resetHandles(),this.renderHandles(),this},update:function(){return this.relatedView.model.vertices().length===this.handles.length?this.updateHandles():(this.resetHandles(),this.renderHandles()),this.options.vertexAdding&&this.updatePath(),this},resetHandles:function(){var t=this.handles;if(this.handles=[],this.stopListening(),Array.isArray(t))for(var e=0,i=t.length;e>>0;if(0===n)return!1;var r,o,s=0|e,a=Math.max(0<=s?s:n-Math.abs(s),0);for(;a>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var n=arguments[1],r=0;r>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var n=arguments[1],r=0;r>8-r%1*8)){if(255<(i=n.charCodeAt(r+=.75)))throw new l("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");e=e<<8|i}return s}),t.atob||(t.atob=function(t){var e=String(t).replace(/=+$/,"");if(e.length%4==1)throw new l("'atob' failed: The string to be decoded is not correctly encoded.");for(var i,n,r=0,o=0,s="";n=e.charAt(o++);~n&&(i=r%4?64*i+n:n,r++%4)?s+=String.fromCharCode(255&i>>(-2*r&6)):0)n=a.indexOf(n);return s})}(),Number.isFinite=Number.isFinite||function(t){return"number"==typeof t&&isFinite(t)},Number.isNaN=Number.isNaN||function(t){return t!=t},String.prototype.includes||(String.prototype.includes=function(t,e){return"number"!=typeof e&&(e=0),!(e+t.length>this.length)&&-1!==this.indexOf(t,e)}),String.prototype.startsWith||(String.prototype.startsWith=function(t,e){return this.substr(e||0,t.length)===t}),function(){function n(t,e){return this.slice(t,e)}function r(t,e){arguments.length<2&&(e=0);for(var i=0,n=t.length;ia.x+o/2,h=na.x?r-30:r+30)-c)/(s*s*(n-l))+l:e=s*s/(r-c)-s*s*(n-l)*((i=r>a.y?n+30:n-30)-l)/(o*o*(r-c))+c,new E(i,e).theta(t)},toString:function(){return new E(this.x,this.y).toString()+" "+this.a+" "+this.b}};var B=function(t,e){return this instanceof B?t instanceof B?new B(t.start,t.end):(this.start=new E(t),void(this.end=new E(e))):new B(t,e)};B.prototype={angle:function(){var t=new E(this.start.x+1,this.start.y);return this.start.angleBetween(this.end,t)},bbox:function(){var t=P(this.start.x,this.end.x),e=P(this.start.y,this.end.y),i=G(this.start.x,this.end.x),n=G(this.start.y,this.end.y);return new H(t,e,i-t,n-e)},bearing:function(){var t=y(this.start.y),e=y(this.end.y),i=this.start.x,n=this.end.x,r=y(n-i),o=h(r)*g(e),s=g(t)*h(e)-h(t)*g(e)*g(r),a=A(u(o,s))-22.5;return a<0&&(a+=360),["NE","E","SE","S","SW","W","NW","N"][a=parseInt(a/45)]},clone:function(){return new B(this.start,this.end)},closestPoint:function(t){return this.pointAt(this.closestPointNormalizedLength(t))},closestPointLength:function(t){return this.closestPointNormalizedLength(t)*this.length()},closestPointNormalizedLength:function(t){var e=this.vector().dot(new B(this.start,t).vector()),i=P(1,G(0,e/this.squaredLength()));return i!=i?0:i},closestPointTangent:function(t){return this.tangentAt(this.closestPointNormalizedLength(t))},containsPoint:function(t){var e=this.start,i=this.end;if(0!==e.cross(t,i))return!1;var n=this.length();return!(new B(e,t).length()>n)&&!(new B(t,i).length()>n)},divideAt:function(t){var e=this.pointAt(t);return[new B(this.start,e),new B(e,this.end)]},divideAtLength:function(t){var e=this.pointAtLength(t);return[new B(this.start,e),new B(e,this.end)]},equals:function(t){return!!t&&this.start.x===t.start.x&&this.start.y===t.start.y&&this.end.x===t.end.x&&this.end.y===t.end.y},intersect:function(t,e){if(t instanceof B||t instanceof H||t instanceof D||t instanceof w||t instanceof O){var i=t.intersectionWithLine(this,e);return i&&t instanceof B&&(i=i[0]),i}return null},intersectionWithLine:function(t){var e=new E(this.end.x-this.start.x,this.end.y-this.start.y),i=new E(t.end.x-t.start.x,t.end.y-t.start.y),n=e.x*i.y-e.y*i.x,r=new E(t.start.x-this.start.x,t.start.y-this.start.y),o=r.x*i.y-r.y*i.x,s=r.x*e.y-r.y*e.x;if(0===n||o*n<0||s*n<0)return null;if(0c.y||r>l.y&&r<=c.y){var h=l.x-n>c.x-n?l.x-n:c.x-n;if(0<=h){var u=new E(n+h,r),d=new B(t,u);g.intersect(d)&&a++}}o=s}return a%2==1},convexHull:function(){var t,e,i,n=this.points,r=n.length;if(0===r)return new D;for(t=0;ti.x&&(i=n[t]);var o=[];for(t=0;t=this.x&&t.x<=this.x+this.width&&t.y>=this.y&&t.y<=this.y+this.height},containsRect:function(t){var e=new H(this).normalize(),i=new H(t).normalize(),n=e.width,r=e.height,o=i.width,s=i.height;if(!(n&&r&&o&&s))return!1;var a=e.x,l=e.y,c=i.x,g=i.y;return o+=c,n+=a,s+=g,r+=l,a<=c&&o<=n&&l<=g&&s<=r},corner:function(){return new E(this.x+this.width,this.y+this.height)},equals:function(t){var e=new H(this).normalize(),i=new H(t).normalize();return e.x===i.x&&e.y===i.y&&e.width===i.width&&e.height===i.height},inflate:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.x-=t,this.y-=e,this.width+=2*t,this.height+=2*e,this},intersect:function(t){var e=this.origin(),i=this.corner(),n=t.origin(),r=t.corner();if(r.x<=e.x||r.y<=e.y||n.x>=i.x||n.y>=i.y)return null;var o=G(e.x,n.x),s=G(e.y,n.y);return new H(o,s,P(i.x,r.x)-o,P(i.y,r.y)-s)},intersectionWithLine:function(t){var e,i,n=[this.topLine(),this.rightLine(),this.bottomLine(),this.leftLine()],r=[],o=[],s=n.length;for(i=0;ig&&(n=(this.x+this.width-g)/(d.x-g)),d.y>h&&(a=(this.y+this.height-h)/(d.y-h));var f=t.topRight();f.x>g&&(r=(this.x+this.width-g)/(f.x-g)),f.yh&&(c=(this.y+this.height-h)/(p.y-h)),{sx:P(i,n,r,o),sy:P(s,a,l,c)}},maxRectUniformScaleToFit:function(t,e){var i=this.maxRectScaleToFit(t,e);return P(i.sx,i.sy)},moveAndExpand:function(t){return this.x+=t.x||0,this.y+=t.y||0,this.width+=t.width||0,this.height+=t.height||0,this},normalize:function(){var t=this.x,e=this.y,i=this.width,n=this.height;return this.width<0&&(t=this.x+this.width,i=-this.width),this.height<0&&(e=this.y+this.height,n=-this.height),this.x=t,this.y=e,this.width=i,this.height=n,this},offset:function(t,e){return E.prototype.offset.call(this,t,e)},origin:function(){return new E(this.x,this.y)},pointNearestToPoint:function(t){if(t=new E(t),this.containsPoint(t))switch(this.sideNearestToPoint(t)){case"right":return new E(this.x+this.width,t.y);case"left":return new E(this.x,t.y);case"bottom":return new E(t.x,this.y+this.height);case"top":return new E(t.x,this.y)}return t.adhereToRect(this)},rightLine:function(){return new B(this.topRight(),this.bottomRight())},rightMiddle:function(){return new E(this.x+this.width,this.y+this.height/2)},round:function(t){var e=k(10,t||0);return this.x=a(this.x*e)/e,this.y=a(this.y*e)/e,this.width=a(this.width*e)/e,this.height=a(this.height*e)/e,this},scale:function(t,e,i){return i=this.origin().scale(t,e,i),this.x=i.x,this.y=i.y,this.width*=t,this.height*=e,this},sideNearestToPoint:function(t){var e=(t=new E(t)).x-this.x,i=this.x+this.width-t.x,n=t.y-this.y,r=e,o="left";return i'+t+"";return T.parseXML(e,{async:!1}).documentElement}var i=document.createElementNS(z.svg,"svg");return i.setAttributeNS(z.xmlns,"xmlns:xlink",z.xlink),i.setAttribute("version","1.1"),i},T.idCounter=0,T.uniqueId=function(){return"v-"+ ++T.idCounter},T.toNode=function(t){return T.isV(t)?t.node:t.nodeName&&t||t[0]},T.ensureId=function(t){return(t=T.toNode(t)).id||(t.id=T.uniqueId())},T.sanitizeText=function(t){return(t||"").replace(/ /g," ")},T.isUndefined=function(t){return void 0===t},T.isString=function(t){return"string"==typeof t},T.isObject=function(t){return t&&"object"==typeof t},T.isArray=Array.isArray,T.parseXML=function(t,e){var i;e=e||{};try{var n=new DOMParser;T.isUndefined(e.async)||(n.async=e.async),i=n.parseFromString(t,"text/xml")}catch(t){i=void 0}if(!i||i.getElementsByTagName("parsererror").length)throw new Error("Invalid XML: "+t);return i},T.qualifyAttr=function(t){if(-1===t.indexOf(":"))return{ns:null,local:t};var e=t.split(":");return{ns:z[e[0]],local:e[1]}},T.transformRegex=/(\w+)\(([^,)]+),?([^)]+)?\)/gi,T.transformSeparatorRegex=/[ ,]+/,T.transformationListRegex=/^(\w+)\((.*)\)/,T.transformStringToMatrix=function(t){var e=T.createSVGMatrix(),i=t&&t.match(T.transformRegex);if(!i)return e;for(var n=0,r=i.length;n=t.start&&et.start&&i<=t.end||t.start>=e&&t.end=e?t.end+=i:t.start>=e&&(t.start+=i,t.end+=i)}),t},T.convertLineToPathData=function(t){return["M",(t=T(t)).attr("x1"),t.attr("y1"),"L",t.attr("x2"),t.attr("y2")].join(" ")},T.convertPolygonToPathData=function(t){var e=T.getPointsFromSvgNode(t);return 0===e.length?null:T.svgPointsToPath(e)+" Z"},T.convertPolylineToPathData=function(t){var e=T.getPointsFromSvgNode(t);return 0===e.length?null:T.svgPointsToPath(e)},T.svgPointsToPath=function(t){for(var e=0,i=t.length;e=o[r]&&(s.push([e].concat(n.splice(0,o[r]))),o[r]););}),s}(t)),!t||!t.length)return[["M",0,0]];for(var e,i=[],n=0,r=0,o=0,s=0,a=t.length,l=0;lu){var x=N,S=l,k=c;f=t(l=w+n*F(N=b+u*(a&&bd)D=d-1;else if(void 0!==o){var z;if(void 0===I)I=(z="auto"===i.lineHeight?{value:1.5,unit:"em"}:pt(i.lineHeight,["em"])||{value:1,unit:"em"}).value,"em"===z.unit&&(I*=l.getBBox().height);I*v.length>o&&(D=Math.floor(o/I)-1)}if(null!==D){v.splice(D+1);var T=n.ellipsis;if(!T||D<0)break;"string"!=typeof T&&(T="…");var j=v[D];if(!j)break;var L,Z,P=j.length;do{if(Z=j[P],L=j.substring(0,P),Z?Z.match(g)&&(L+=Z):L+="string"==typeof g?g:" ",L+=T,c.data=L,a.getComputedTextLength()<=r){v[D]=L;break}P--}while(0<=P);break}}}return n.svgDocument?s.removeChild(l):document.body.removeChild(s),v.join(h)},mt=function(t){var e=S(S.parseHTML("
"+t+"
",null,!1));return e.find("*").each(function(){var i=this;S.each(i.attributes,function(){var t=this.name,e=this.value;(t.startsWith("on")||e.startsWith("javascript:")||e.startsWith("data:")||e.startsWith("vbscript:"))&&S(i).removeAttr(t)})}),e.html()},At=function(t,e){if(window.navigator.msSaveBlob)window.navigator.msSaveBlob(t,e);else{var i=window.URL.createObjectURL(t),n=document.createElement("a");n.href=i,n.download=e,document.body.appendChild(n),n.click(),document.body.removeChild(n),window.URL.revokeObjectURL(i)}},vt=function(t){t=t.replace(/\s/g,"");var e,i=(t=decodeURIComponent(t)).indexOf(","),n=t.slice(0,i),r=n.split(":")[1].split(";")[0],o=t.slice(i+1);e=0<=n.indexOf("base64")?atob(o):unescape(encodeURIComponent(o));for(var s=new Uint8Array(e.length),a=0;a')({color:t.color||"blue",opacity:Number.isFinite(t.opacity)?t.opacity:1,outerRadius:e+i,innerRadius:e})},highlight:function(t){return xt('')({color:t.color||"red",width:Number.isFinite(t.width)?t.width:1,blur:Number.isFinite(t.blur)?t.blur:0,opacity:Number.isFinite(t.opacity)?t.opacity:1})},blur:function(t){var e=Number.isFinite(t.x)?t.x:2;return xt('')({stdDeviation:Number.isFinite(t.y)?[e,t.y]:e})},dropShadow:function(t){var e="SVGFEDropShadowElement"in window?'':'';return xt(e)({dx:t.dx||0,dy:t.dy||0,opacity:Number.isFinite(t.opacity)?t.opacity:1,color:t.color||"black",blur:Number.isFinite(t.blur)?t.blur:4})},grayscale:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({a:.2126+.7874*(1-e),b:.7152-.7152*(1-e),c:.0722-.0722*(1-e),d:.2126-.2126*(1-e),e:.7152+.2848*(1-e),f:.0722-.0722*(1-e),g:.2126-.2126*(1-e),h:.0722+.9278*(1-e)})},sepia:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({a:.393+.607*(1-e),b:.769-.769*(1-e),c:.189-.189*(1-e),d:.349-.349*(1-e),e:.686+.314*(1-e),f:.168-.168*(1-e),g:.272-.272*(1-e),h:.534-.534*(1-e),i:.131+.869*(1-e)})},saturate:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({amount:1-e})},hueRotate:function(t){return xt('')({angle:t.angle||0})},invert:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({amount:e,amount2:1-e})},brightness:function(t){return xt('')({amount:Number.isFinite(t.amount)?t.amount:1})},contrast:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({amount:e,amount2:.5-e/2})}},Mt={number:function(t,e,o){o=o||{currency:["$",""],decimal:".",thousands:",",grouping:[3]};var i=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i.exec(t),n=i[1]||" ",r=i[2]||">",s=i[3]||"",a=i[4]||"",l=i[5],c=+i[6],g=i[7],h=i[8],u=i[9],d=1,f="",p="",I=!1;switch(h&&(h=+h.substring(1)),(l||"0"===n&&"="===r)&&(l=n="0",r="=",g&&(c-=Math.floor((c-1)/4))),u){case"n":g=!0,u="g";break;case"%":d=100,p="%",u="f";break;case"p":d=100,p="%",u="r";break;case"b":case"o":case"x":case"X":"#"===a&&(f="0"+u.toLowerCase());break;case"c":case"d":I=!0,h=0;break;case"s":d=-1,u="r"}"$"===a&&(f=o.currency[0],p=o.currency[1]),"r"!=u||h||(u="g"),null!=h&&("g"==u?h=Math.max(1,Math.min(21,h)):"e"!=u&&"f"!=u||(h=Math.max(0,Math.min(20,h))));var m=l&&g;if(I&&e%1)return"";var A=e<0||0===e&&1/e<0?(e=-e,"-"):s,v=p;if(d<0){var C=this.prefix(e,h);e=C.scale(e),v=C.symbol+p}else e*=d;var w=(e=this.convert(u,e,h)).lastIndexOf("."),y=w<0?e:e.substring(0,w),b=w<0?"":o.decimal+e.substring(w+1);function N(t){for(var e=t.length,i=[],n=0,r=o.grouping[0];0"===r?x+A+e:"^"===r?x.substring(0,M>>=1)+A+e+x.substring(M):A+(m?e:x+e))+v},string:function(t,e){for(var i,n="{",r=!1,o=[];-1!==(i=t.indexOf(n));){var s,a,l;if(s=t.slice(0,i),r){l=(a=s.split(":")).shift().split("."),s=e;for(var c=0;c|\$\{ ?([^{} ]+) ?\}|\{\{([^{} ]+)\}\}/g;return function(n){return n=n||{},t.replace(e,function(t){for(var e=Array.from(arguments).slice(1,4).find(function(t){return!!t}).split("."),i=n[e.shift()];void 0!==i&&e.length;)i=i[e.shift()];return void 0!==i?i:""})}},St=i.assign,kt=i.defaults,Dt=St,zt=i.defaultsDeep,Tt=i.assign,jt=i.defaults,Lt=i.defaultsDeep,Zt=i.invokeMap||i.invoke,Pt=i.sortedIndexBy||i.sortedIndex,Gt=i.uniqBy||i.uniq,Bt=i.clone,Ot=i.cloneDeep,Et=i.isEmpty,Yt=i.isEqual,Rt=i.isFunction,Wt=i.isPlainObject,Ut=i.toArray,Xt=i.debounce,Ft=i.groupBy,Vt=i.sortBy,Jt=i.flattenDeep,Ht=i.without,_t=i.difference,Qt=i.intersection,Kt=i.union,qt=i.has,$t=i.result,te=i.omit,ee=i.pick,ie=i.bindAll,ne=i.forIn,re=i.camelCase,oe=i.uniqueId,se=function(){if(i.mergeWith){var t=Array.from(arguments),e=t[t.length-1],n=Rt(e)?e:he;return t.push(function(t,e){var i=n(t,e);return void 0!==i?i:Array.isArray(t)&&!Array.isArray(e)?e:void 0}),i.mergeWith.apply(this,t)}return i.merge.apply(this,arguments)},ae=function(t){var e=Object.prototype.toString;return!0===t||!1===t||!!t&&"object"==typeof t&&"[object Boolean]"===e.call(t)},le=function(t){return!!t&&("object"==typeof t||"function"==typeof t)},ce=function(t){var e=Object.prototype.toString;return"number"==typeof t||!!t&&"object"==typeof t&&"[object Number]"===e.call(t)},ge=function(t){var e=Object.prototype.toString;return"string"==typeof t||!!t&&"object"==typeof t&&"[object String]"===e.call(t)},he=function(){};function ue(t){t=Gt(t);var s=Ut(t).reduce(function(t,e){return t[e.id]=e.clone(),t},{});return Ut(t).forEach(function(t){var e=s[t.id];if(e.isLink()){var i=e.source(),n=e.target();i.id&&s[i.id]&&e.prop("source/id",s[i.id].id),n.id&&s[n.id]&&e.prop("target/id",s[n.id].id)}var r=t.get("parent");r&&s[r]&&e.set("parent",s[r].id);var o=Ut(t.get("embeds")).reduce(function(t,e){return s[e]&&t.push(s[e].id),t},[]);Et(o)||e.set("embeds",o)}),s}function de(o,s){return function(t,e){var i=ft(t);t=parseFloat(t),i&&(t/=100);var n={};if(isFinite(t)){var r=i||0<=t&&t<=1?t*e[s]:Math.max(t+e[s],0);n[o]=r}return n}}function fe(s,a,l){return function(t,e){var i,n=ft(t);if(t=parseFloat(t),n&&(t/=100),isFinite(t)){var r=e[l]();i=n||0e.width?be:Ne)(t,e)})},refRCircumscribed:{set:function(t,e){var i=ft(t);t=parseFloat(t),i&&(t/=100);var n,r=Math.sqrt(e.height*e.height+e.width*e.width);return isFinite(t)&&(n=i||0<=t&&t<=1?t*r:Math.max(t+r,0)),{r:n}}},refCx:{set:de("cx","width")},refCy:{set:de("cy","height")},xAlignment:{offset:pe("x","width","right")},yAlignment:{offset:pe("y","height","bottom")},resetOffset:{offset:function(t,e){return t?{x:-e.x,y:-e.y}:{x:0,y:0}}},refDResetOffset:{set:me({resetOffset:!0})},refDKeepOffset:{set:me({resetOffset:!1})},refPointsResetOffset:{set:Ae({resetOffset:!0})},refPointsKeepOffset:{set:Ae({resetOffset:!1})},connection:{qualify:we,set:function(t){var e,i=t.stubs;if(void 0===i&&(i=0),isFinite(i)&&0!==i){var n;n=i<0?(this.getConnectionLength()+i)/2:i;var r=this.getConnection(),o=r.divideAtLength(n),s=r.divideAtLength(-n);o&&s&&(e=o[0].serialize()+" "+s[1].serialize())}return{d:e||this.getSerializedConnection()}}},atConnectionLengthKeepGradient:{qualify:we,set:ve("getTangentAtLength",{rotate:!0})},atConnectionLengthIgnoreGradient:{qualify:we,set:ve("getTangentAtLength",{rotate:!1})},atConnectionRatioKeepGradient:{qualify:we,set:ve("getTangentAtRatio",{rotate:!0})},atConnectionRatioIgnoreGradient:{qualify:we,set:ve("getTangentAtRatio",{rotate:!1})}};Me.refR=Me.refRInscribed,Me.refD=Me.refDResetOffset,Me.refPoints=Me.refPointsResetOffset,Me.atConnectionLength=Me.atConnectionLengthKeepGradient,Me.atConnectionRatio=Me.atConnectionRatioKeepGradient,Me.refX2=Me.refX,Me.refY2=Me.refY,Me.refWidth2=Me.refWidth,Me.refHeight2=Me.refHeight,Me["ref-x"]=Me.refX,Me["ref-y"]=Me.refY,Me["ref-dy"]=Me.refDy,Me["ref-dx"]=Me.refDx,Me["ref-width"]=Me.refWidth,Me["ref-height"]=Me.refHeight,Me["x-alignment"]=Me.xAlignment,Me["y-alignment"]=Me.yAlignment;var xe=Me,Se=s.Model.extend({constructor:function(t,e){var i,n=t||{};this.cid=oe("c"),this.attributes={},e&&e.collection&&(this.collection=e.collection),e&&e.parse&&(n=this.parse(n,e)||{}),(i=$t(this,"defaults"))&&(n=se({},i,n)),this.set(n,e),this.changed={},this.initialize.apply(this,arguments)},translate:function(t,e,i){throw new Error("Must define a translate() method.")},toJSON:function(){var e=this.constructor.prototype.defaults.attrs||{},t=this.attributes.attrs,o={};ne(t,function(t,n){var r=e[n];ne(t,function(t,i){le(t)&&!Array.isArray(t)?ne(t,function(t,e){r&&r[i]&&Yt(r[i][e],t)||(o[n]=o[n]||{},(o[n][i]||(o[n][i]={}))[e]=t)}):r&&Yt(r[i],t)||(o[n]=o[n]||{},o[n][i]=t)})});var i=Ot(te(this.attributes,"attrs"));return i.attrs=o,i},initialize:function(t){t&&t.id||this.set("id",this.generateId(),{silent:!0}),this._transitionIds={},this.processPorts(),this.on("change:attrs",this.processPorts,this)},generateId:function(){return lt()},processPorts:function(){var t=this.ports,i={};ne(this.get("attrs"),function(t,e){t&&t.port&&(void 0!==t.port.id?i[t.port.id]=t.port:i[t.port]={id:t.port})});var n={};(ne(t,function(t,e){i[e]||(n[e]=!0)}),this.graph&&!Et(n))&&(this.graph.getConnectedLinks(this,{inbound:!0}).forEach(function(t){n[t.get("target").port]&&t.remove()}),this.graph.getConnectedLinks(this,{outbound:!0}).forEach(function(t){n[t.get("source").port]&&t.remove()}));this.ports=i},remove:function(t){t=t||{};var e=this.graph;if(!e)return this.collection&&this.collection.remove(this,t),this;e.startBatch("remove");var i=this.getParentCell();i&&i.unembed(this);for(var n=this.getEmbeddedCells(),r=0,o=n.length;rc[2]?(s=".3em",r=g,o=0,"start"):lh[2]?(s=".3em",r=-c,o=0,"end"):l','','','','','','',''].join(""),toolMarkup:['','','','',"Remove link.","",'','','',"Link options.","",""].join(""),doubleToolMarkup:void 0,vertexMarkup:['','','','',"Remove vertex.","",""].join(""),arrowheadMarkup:['','',""].join(""),defaultLabel:void 0,labelMarkup:void 0,_builtins:{defaultLabel:{markup:[{tagName:"rect",selector:"rect"},{tagName:"text",selector:"text"}],attrs:{text:{fill:"#000000",fontSize:14,textAnchor:"middle",yAlignment:"middle",pointerEvents:"none"},rect:{ref:"text",fill:"#ffffff",rx:3,ry:3,refWidth:1,refHeight:1,refX:0,refY:0}},position:{distance:.5}}},defaults:{type:"link",source:{},target:{}},isLink:function(){return!0},disconnect:function(t){return this.set({source:{x:0,y:0},target:{x:0,y:0}},t)},source:function(t,e,i){return void 0===t?Bt(this.get("source")):(r=t instanceof Se?((n=Bt(e)||{}).id=t.id,i):Wt(t)?(n=t,e):((n=Bt(e)||{}).x=t.x,n.y=t.y,i),this.set("source",n,r));var n,r},target:function(t,e,i){return void 0===t?Bt(this.get("target")):(r=t instanceof Se?((n=Bt(e)||{}).id=t.id,i):Wt(t)?(n=t,e):((n=Bt(e)||{}).x=t.x,n.y=t.y,i),this.set("target",n,r));var n,r},router:function(t,e,i){if(void 0===t){var n=this.get("router");return n?"object"==typeof n?Bt(n):n:this.get("manhattan")?{name:"orthogonal"}:null}var r="object"==typeof t||"function"==typeof t,o=r?t:{name:t,args:e},s=r?e:i;return this.set("router",o,s)},connector:function(t,e,i){if(void 0===t){var n=this.get("connector");return n?"object"==typeof n?Bt(n):n:this.get("smooth")?{name:"smooth"}:null}var r="object"==typeof t||"function"==typeof t,o=r?t:{name:t,args:e},s=r?e:i;return this.set("connector",o,s)},label:function(t,e,i){var n=this.labels();return(t=isFinite(t)&&null!==t?0|t:0)<0&&(t=n.length+t),arguments.length<=1?this.prop(["labels",t]):this.prop(["labels",t],e,i)},labels:function(t,e){return 0===arguments.length?(t=this.get("labels"),Array.isArray(t)?t.slice():[]):(Array.isArray(t)||(t=[]),this.set("labels",t,e))},insertLabel:function(t,e,i){if(!e)throw new Error("dia.Link: no label provided");var n=this.labels(),r=n.length;return(t=isFinite(t)&&null!==t?0|t:r)<0&&(t=r+t+1),n.splice(t,0,e),this.labels(n,i)},appendLabel:function(t,e){return this.insertLabel(-1,t,e)},removeLabel:function(t,e){var i=this.labels();return t=isFinite(t)&&null!==t?0|t:-1,i.splice(t,1),this.labels(i,e)},vertex:function(t,e,i){var n=this.vertices();if((t=isFinite(t)&&null!==t?0|t:0)<0&&(t=n.length+t),arguments.length<=1)return this.prop(["vertices",t]);var r=this._normalizeVertex(e);return this.prop(["vertices",t],r,i)},vertices:function(t,e){if(0===arguments.length)return t=this.get("vertices"),Array.isArray(t)?t.slice():[];Array.isArray(t)||(t=[]);for(var i=[],n=0;n "+e),i=this.getSelector(t.parentNode,i)}return i},getLinkEnd:function(t){for(var e,i=[],n=arguments.length-1;0r.options.clickThreshold||this.notify("element:magnet:pointerclick",t,e,i,n)}});Tt($e.prototype,Fe);var ti={N:"S",S:"N",E:"W",W:"E"},ei={N:-Math.PI/2*3,S:-Math.PI/2,E:0,W:Math.PI};function ii(t,e,i){var n=new E(t.x,e.y);return i.containsPoint(n)&&(n=new E(e.x,t.y)),n}function ni(t,e){return t["W"===e||"E"===e?"width":"height"]}function ri(t,e){return t.x===e.x?t.y>e.y?"N":"S":t.y===e.y?t.x>e.x?"W":"E":null}function oi(t){return new H(t.x,t.y,0,0)}function si(t){var e=wt(t.padding||t.elementPadding||20);return{x:-e.left,y:-e.top,width:e.left+e.right,height:e.top+e.bottom}}function ai(t,e){return t.sourceBBox.clone().moveAndExpand(si(e))}function li(t,e){return t.targetBBox.clone().moveAndExpand(si(e))}function ci(t,e,i){var n=new E(t.x,e.y),r=new E(e.x,t.y),o=ri(t,n),s=ri(t,r),a=ti[i],l=o===i||o!==a&&(s===a||s!==i)?n:r;return{points:[l],direction:ri(l,e)}}function gi(t,e,i){var n=ii(t,e,i);return{points:[n],direction:ri(n,e)}}function hi(e,t,i,n){var r,o={},s=[new E(e.x,t.y),new E(t.x,e.y)],a=s.filter(function(t){return!i.containsPoint(t)}),l=a.filter(function(t){return ri(t,e)!==n});if(0c.center().distance(t),h=g?e:t,u=g?t:e;return s=ii(o=r?(o=E.fromPolar(c.width+c.height,ei[r],h),c.pointNearestToPoint(o).move(o,-1)):c.pointNearestToPoint(h).move(h,1),u,c),o.round().equals(s.round())?(s=E.fromPolar(c.width+c.height,y(o.theta(h))+Math.PI/2,u),a=ii(o,s=c.pointNearestToPoint(s).move(u,1).round(),c),l.points=g?[s,a,o]:[o,a,s]):l.points=g?[s,o]:[o,s],l.direction=ri(g?o:s,e),l}function fi(t,e,i){var n,r,o,s,a,l=ai(i,e),c=li(i,e),g=(r=e,(n=i).sourceAnchor?n.sourceAnchor:ai(n,r).center()),h=(s=e,(o=i).targetAnchor?o.targetAnchor:li(o,s).center());l=l.union(oi(g)),c=c.union(oi(h)),(t=Ut(t).map(E)).unshift(g),t.push(h);for(var u=[],d=0,f=t.length-1;dn.maxAllowedDirectionChange)){var F=Mi(O.clone().offset(k.gridOffsetX,k.gridOffsetY),v,l),V=xi(F);if(!C.isClose(V)&&i.isPointAccessible(F)){if(0<=Z.indexOf(V))if(!F.equals(d))if(yi(X,wi(F,d,L,v,n))>n.maxAllowedDirectionChange)continue;var J=Y+k.cost+(W?0:n.penalties[D]);(!C.isOpen(V)||J=Math.abs(t.y-e.y)){var c=(t.x+e.x)/2;l=O.createSegment("C",c,t.y,c,e.y,e.x,e.y),r.appendSegment(l)}else{var g=(t.y+e.y)/2;l=O.createSegment("C",t.x,g,e.x,g,e.x,e.y),r.appendSegment(l)}}return o?r:r.serialize()}},Fi=qe.extend({className:function(){var t=qe.prototype.className.apply(this).split(" ");return t.push("link"),t.join(" ")},options:{shortLinkLength:105,doubleLinkTools:!1,longLinkLength:155,linkToolsOffset:40,doubleLinkToolsOffset:65,sampleInterval:50},_labelCache:null,_labelSelectors:null,_markerCache:null,_V:null,_dragData:null,metrics:null,decimalsRounding:2,initialize:function(){qe.prototype.initialize.apply(this,arguments),this._labelCache={},this._labelSelectors={},this._markerCache={},this._V={},this.metrics={}},presentationAttributes:{markup:["RENDER"],attrs:["UPDATE"],router:["UPDATE"],connector:["UPDATE"],smooth:["UPDATE"],manhattan:["UPDATE"],toolMarkup:["TOOLS"],labels:["LABELS"],labelMarkup:["LABELS"],vertices:["VERTICES","UPDATE"],vertexMarkup:["VERTICES"],source:["SOURCE","UPDATE"],target:["TARGET","UPDATE"]},initFlag:["RENDER","SOURCE","TARGET"],UPDATE_PRIORITY:1,confirmUpdate:function(t,e){if(e||(e={}),this.hasFlag(t,"SOURCE")){if(!this.updateEndProperties("source"))return t;t=this.removeFlag(t,"SOURCE")}if(this.hasFlag(t,"TARGET")){if(!this.updateEndProperties("target"))return t;t=this.removeFlag(t,"TARGET")}var i=this.paper,n=this.sourceView,r=this.targetView;if(i&&(n&&!i.isViewMounted(n)||r&&!i.isViewMounted(r)))return t;if(this.hasFlag(t,"RENDER"))return this.render(),t=this.removeFlag(t,["RENDER","UPDATE","VERTICES","TOOLS","LABELS"]);this.hasFlag(t,"VERTICES")&&(this.renderVertexMarkers(),t=this.removeFlag(t,"VERTICES"));var o=this.model,s=o.attributes,a=this.hasFlag(t,"LABELS"),l=this.hasFlag(t,"TOOLS");return a&&(this.onLabelsChange(o,s.labels,e),t=this.removeFlag(t,"LABELS")),l&&(this.renderTools(),t=this.removeFlag(t,"TOOLS")),this.hasFlag(t,"UPDATE")&&(this.update(o,null,e),t=this.removeFlag(t,"UPDATE"),l=a=!1),a&&this.updateLabelPositions(),l&&this.updateToolsPosition(),t},requestConnectionUpdate:function(t){var e=this.paper,i=this.UPDATE_PRIORITY;e&&e.requestViewUpdate(this,this.getFlag("UPDATE"),i,t)},isLabelsRenderRequired:function(t){void 0===t&&(t={});var e=this.model.previous("labels");if(!e)return!0;if("propertyPathArray"in t&&"propertyValue"in t){var i=t.propertyPathArray||[],n=i.length;if(1=this.options.longLinkLength){var r=this.options.doubleLinkToolsOffset||e;n=this.getPointAtLength(i-r),this._tool2Cache.attr("transform","translate("+n.x+", "+n.y+") "+t),this._tool2Cache.attr("visibility","visible")}else this.options.doubleLinkTools&&this._tool2Cache.attr("visibility","hidden")}return this},updateArrowheadMarkers:function(){if(!this._V.markerArrowheads)return this;if("none"===S.css(this._V.markerArrowheads.node,"display"))return this;var t=this.getConnectionLength()'),o=["<"+i+">",Ut(n).map(function(t){return r({offset:t.offset,color:t.color,opacity:Number.isFinite(t.opacity)?t.opacity:1})}).join(""),""].join(""),s=Tt({id:e},t.attrs);q(o,s).appendTo(this.defs)}return e},defineMarker:function(t){if(!le(t))throw new TypeError("dia.Paper: defineMarker() requires 1. argument to be an object.");var e=t.id;if(e||(e=this.svg.id+nt(JSON.stringify(t))),!this.isDefined(e)){var i=te(t,"type","userSpaceOnUse");q("marker",{id:e,orient:"auto",overflow:"visible",markerUnits:t.markerUnits||"userSpaceOnUse"},[q(t.type||"path",i)]).appendTo(this.defs)}return e}},{sorting:an,backgroundPatterns:{flipXy:function(t){var e=document.createElement("canvas"),i=t.width,n=t.height;e.width=2*i,e.height=2*n;var r=e.getContext("2d");return r.drawImage(t,0,0,i,n),r.setTransform(-1,0,0,-1,e.width,e.height),r.drawImage(t,0,0,i,n),r.setTransform(-1,0,0,1,e.width,0),r.drawImage(t,0,0,i,n),r.setTransform(1,0,0,-1,0,e.height),r.drawImage(t,0,0,i,n),e},flipX:function(t){var e=document.createElement("canvas"),i=t.width,n=t.height;e.width=2*i,e.height=n;var r=e.getContext("2d");return r.drawImage(t,0,0,i,n),r.translate(2*i,0),r.scale(-1,1),r.drawImage(t,0,0,i,n),e},flipY:function(t){var e=document.createElement("canvas"),i=t.width,n=t.height;e.width=i,e.height=2*n;var r=e.getContext("2d");return r.drawImage(t,0,0,i,n),r.translate(0,2*n),r.scale(1,-1),r.drawImage(t,0,0,i,n),e},watermark:function(t,e){e=e||{};var i=t.width,n=t.height,r=document.createElement("canvas");r.width=3*i,r.height=3*n;for(var o=r.getContext("2d"),s=ce(e.watermarkAngle)?-e.watermarkAngle:-20,a=y(s),l=r.width/4,c=r.height/4,g=0;g<4;g++)for(var h=0;h<4;h++)0<(g+h)%2&&(o.setTransform(1,0,0,1,(2*g-1)*l,(2*h-1)*c),o.rotate(a),o.drawImage(t,-i/2,-n/2,i,n));return r}},gridPatterns:{dot:[{color:"#AAAAAA",thickness:1,markup:"rect",update:function(t,e){q(t).attr({width:e.thickness*e.sx,height:e.thickness*e.sy,fill:e.color})}}],fixedDot:[{color:"#AAAAAA",thickness:1,markup:"rect",update:function(t,e){var i=e.sx<=1?e.thickness*e.sx:e.thickness;q(t).attr({width:i,height:i,fill:e.color})}}],mesh:[{color:"#AAAAAA",thickness:1,markup:"path",update:function(t,e){var i,n=e.width,r=e.height,o=e.thickness;i=0<=n-o&&0<=r-o?["M",n,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",q(t).attr({d:i,stroke:e.color,"stroke-width":e.thickness})}}],doubleMesh:[{color:"#AAAAAA",thickness:1,markup:"path",update:function(t,e){var i,n=e.width,r=e.height,o=e.thickness;i=0<=n-o&&0<=r-o?["M",n,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",q(t).attr({d:i,stroke:e.color,"stroke-width":e.thickness})}},{color:"#000000",thickness:3,scaleFactor:4,markup:"path",update:function(t,e){var i,n=e.width,r=e.height,o=e.thickness;i=0<=n-o&&0<=r-o?["M",n,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",q(t).attr({d:i,stroke:e.color,"stroke-width":e.thickness})}}]}}),hn=Qe.extend({name:null,tagName:"g",className:"tool",svgElement:!0,_visible:!0,init:function(){var t=this.name;t&&this.vel.attr("data-tool-name",t)},configure:function(t,e){return this.relatedView=t,this.paper=t.paper,this.parentView=e,this.simulateRelatedView(this.el),this.delegateEvents(),this},simulateRelatedView:function(t){t&&t.setAttribute("model-id",this.relatedView.model.id)},getName:function(){return this.name},show:function(){this.el.style.display="",this._visible=!0},hide:function(){this.el.style.display="none",this._visible=!1},isVisible:function(){return!!this._visible},focus:function(){var t=this.options.focusOpacity;isFinite(t)&&(this.el.style.opacity=t),this.parentView.focusTool(this)},blur:function(){this.el.style.opacity="",this.parentView.blurTool(this)},update:function(){},guard:function(t){var e=this.paper,i=this.relatedView;return!e||!i||e.guard(t,i)}}),un=Qe.extend({tagName:"g",className:"tools",svgElement:!0,tools:null,options:{tools:null,relatedView:null,name:null,component:!1},configure:function(t){var e=(t=Tt(this.options,t)).tools;if(!Array.isArray(e))return this;var i=t.relatedView;if(!(i instanceof qe))return this;for(var n=this.tools=[],r=0,o=e.length;r'}),An=$e.extend({presentationAttributes:$e.addPresentationAttributes({attrs:["SCALE"]}),confirmUpdate:function(){var t=$e.prototype.confirmUpdate.apply(this,arguments);return this.hasFlag(t,"SCALE")&&(this.resize(),t=this.removeFlag(t,"SCALE")),t}}),vn=In.define("basic.Text",{attrs:{text:{"font-size":18,fill:"#000000"}}},{markup:''}),Cn=In.define("basic.Circle",{size:{width:60,height:60},attrs:{circle:{fill:"#ffffff",stroke:"#000000",r:30,cx:30,cy:30},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-y":.5,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),wn=In.define("basic.Ellipse",{size:{width:60,height:40},attrs:{ellipse:{fill:"#ffffff",stroke:"#000000",rx:30,ry:20,cx:30,cy:20},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-y":.5,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),yn=In.define("basic.Polygon",{size:{width:60,height:40},attrs:{polygon:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),bn=In.define("basic.Polyline",{size:{width:60,height:40},attrs:{polyline:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),Nn=In.define("basic.Image",{attrs:{text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),Mn=In.define("basic.Path",{size:{width:60,height:60},attrs:{path:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle",ref:"path","ref-x":.5,"ref-dy":10,fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),xn=Mn.define("basic.Rhombus",{attrs:{path:{d:"M 30 0 L 60 30 30 60 0 30 z"},text:{"ref-y":.5,"ref-dy":null,"y-alignment":"middle"}}}),Sn=pn.test("svgforeignobject"),kn=In.define("basic.TextBlock",{attrs:{rect:{fill:"#ffffff",stroke:"#000000",width:80,height:100},text:{fill:"#000000","font-size":14,"font-family":"Arial, helvetica, sans-serif"},".content":{text:"","ref-x":.5,"ref-y":.5,"y-alignment":"middle","x-alignment":"middle"}},content:""},{markup:['','',Sn?'
':'',""].join(""),initialize:function(){this.listenTo(this,"change:size",this.updateSize),this.listenTo(this,"change:content",this.updateContent),this.updateSize(this,this.get("size")),this.updateContent(this,this.get("content")),In.prototype.initialize.apply(this,arguments)},updateSize:function(t,e){this.attr({".fobj":Tt({},e),div:{style:Tt({},e)}})},updateContent:function(t,e){Sn?this.attr({".content":{html:mt(e)}}):this.attr({".content":{text:e}})},setForeignObjectSize:function(){this.updateSize.apply(this,arguments)},setDivContent:function(){this.updateContent.apply(this,arguments)}}),Dn=$e.extend({presentationAttributes:Sn?$e.prototype.presentationAttributes:$e.addPresentationAttributes({content:["CONTENT"],size:["CONTENT"]}),initFlag:["RENDER","CONTENT"],confirmUpdate:function(){var t=$e.prototype.confirmUpdate.apply(this,arguments);return this.hasFlag(t,"CONTENT")&&(this.updateContent(this.model),t=this.removeFlag(t,"CONTENT")),t},update:function(t,e){var i=this.model;if(Sn)$e.prototype.update.call(this,i,e);else{var n=te(e||i.get("attrs"),".content");$e.prototype.update.call(this,i,n),e&&!qt(e,".content")||this.updateContent(i,e)}},updateContent:function(t,e){var i=se({},(e||t.get("attrs"))[".content"]);i=te(i,"text");var n=It(t.get("content"),t.get("size"),i,{svgDocument:this.paper.svg}),r=ot({},".content",i,"/");r[".content"].text=n,$e.prototype.update.call(this,t,r)}}),zn={Generic:In,Rect:mn,TextView:An,Text:vn,Circle:Cn,Ellipse:wn,Polygon:yn,Polyline:bn,Image:Nn,Path:Mn,Rhombus:xn,TextBlock:kn,TextBlockView:Dn},Tn=Ve.define("standard.Rectangle",{attrs:{body:{refWidth:"100%",refHeight:"100%",strokeWidth:2,stroke:"#000000",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"body"},{tagName:"text",selector:"label"}]}),jn=Ve.define("standard.Circle",{attrs:{body:{refCx:"50%",refCy:"50%",refR:"50%",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"circle",selector:"body"},{tagName:"text",selector:"label"}]}),Ln=Ve.define("standard.Ellipse",{attrs:{body:{refCx:"50%",refCy:"50%",refRx:"50%",refRy:"50%",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"ellipse",selector:"body"},{tagName:"text",selector:"label"}]}),Zn=Ve.define("standard.Path",{attrs:{body:{refD:"M 0 0 L 10 0 10 10 0 10 Z",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"path",selector:"body"},{tagName:"text",selector:"label"}]}),Pn=Ve.define("standard.Polygon",{attrs:{body:{refPoints:"0 0 10 0 10 10 0 10",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"polygon",selector:"body"},{tagName:"text",selector:"label"}]}),Gn=Ve.define("standard.Polyline",{attrs:{body:{refPoints:"0 0 10 0 10 10 0 10 0 0",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"polyline",selector:"body"},{tagName:"text",selector:"label"}]}),Bn=Ve.define("standard.Image",{attrs:{image:{refWidth:"100%",refHeight:"100%"},label:{textVerticalAnchor:"top",textAnchor:"middle",refX:"50%",refY:"100%",refY2:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"image",selector:"image"},{tagName:"text",selector:"label"}]}),On=Ve.define("standard.BorderedImage",{attrs:{border:{refWidth:"100%",refHeight:"100%",stroke:"#333333",strokeWidth:2},background:{refWidth:-1,refHeight:-1,x:.5,y:.5,fill:"#FFFFFF"},image:{refWidth:-1,refHeight:-1,x:.5,y:.5},label:{textVerticalAnchor:"top",textAnchor:"middle",refX:"50%",refY:"100%",refY2:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"background",attributes:{stroke:"none"}},{tagName:"image",selector:"image"},{tagName:"rect",selector:"border",attributes:{fill:"none"}},{tagName:"text",selector:"label"}]}),En=Ve.define("standard.EmbeddedImage",{attrs:{body:{refWidth:"100%",refHeight:"100%",stroke:"#333333",fill:"#FFFFFF",strokeWidth:2},image:{refWidth:"30%",refHeight:-20,x:10,y:10,preserveAspectRatio:"xMidYMin"},label:{textVerticalAnchor:"top",textAnchor:"left",refX:"30%",refX2:20,refY:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"body"},{tagName:"image",selector:"image"},{tagName:"text",selector:"label"}]}),Yn=Ve.define("standard.InscribedImage",{attrs:{border:{refRx:"50%",refRy:"50%",refCx:"50%",refCy:"50%",stroke:"#333333",strokeWidth:2},background:{refRx:"50%",refRy:"50%",refCx:"50%",refCy:"50%",fill:"#FFFFFF"},image:{refWidth:"68%",refHeight:"68%",refX:"16%",refY:"16%",preserveAspectRatio:"xMidYMid"},label:{textVerticalAnchor:"top",textAnchor:"middle",refX:"50%",refY:"100%",refY2:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"ellipse",selector:"background"},{tagName:"image",selector:"image"},{tagName:"ellipse",selector:"border",attributes:{fill:"none"}},{tagName:"text",selector:"label"}]}),Rn=Ve.define("standard.HeaderedRectangle",{attrs:{body:{refWidth:"100%",refHeight:"100%",strokeWidth:2,stroke:"#000000",fill:"#FFFFFF"},header:{refWidth:"100%",height:30,strokeWidth:2,stroke:"#000000",fill:"#FFFFFF"},headerText:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:15,fontSize:16,fill:"#333333"},bodyText:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",refY2:15,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"body"},{tagName:"rect",selector:"header"},{tagName:"text",selector:"headerText"},{tagName:"text",selector:"bodyText"}]}),Wn=Ve.define("standard.Cylinder",{attrs:{body:{lateralArea:10,fill:"#FFFFFF",stroke:"#333333",strokeWidth:2},top:{refCx:"50%",cy:10,refRx:"50%",ry:10,fill:"#FFFFFF",stroke:"#333333",strokeWidth:2},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"100%",refY2:15,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"path",selector:"body"},{tagName:"ellipse",selector:"top"},{tagName:"text",selector:"label"}],topRy:function(t,e){if(void 0===t)return this.attr("body/lateralArea");var i={lateralArea:t},n=ft(t)?{refCy:t,refRy:t,cy:null,ry:null}:{refCy:null,refRy:null,cy:t,ry:t};return this.attr({body:i,top:n},e)}},{attributes:{lateralArea:{set:function(t,e){var i=ft(t);i&&(t=parseFloat(t)/100);var n=e.x,r=e.y,o=e.width,s=e.height,a=o/2,l=i?s*t:t,c=q.KAPPA,g=c*a,h=c*(i?s*t:t),u=n+o/2,d=n+o,f=r+l,p=f-l,I=r+s-l,m=r+s;return{d:["M",n,f,"L",n,I,"C",n,I+h,u-g,m,u,m,"C",u+g,m,d,I+h,d,I,"L",d,f,"C",d,f-h,u+g,p,u,p,"C",u-g,p,n,f-h,n,f,"Z"].join(" ")}}}}}),Un=pn.test("svgforeignobject")?{tagName:"foreignObject",selector:"foreignObject",attributes:{overflow:"hidden"},children:[{tagName:"div",namespaceURI:"http://www.w3.org/1999/xhtml",selector:"label",style:{width:"100%",height:"100%",position:"static",backgroundColor:"transparent",textAlign:"center",margin:0,padding:"0px 5px",boxSizing:"border-box",display:"flex",alignItems:"center",justifyContent:"center"}}]}:{tagName:"text",selector:"label",attributes:{"text-anchor":"middle"}},Xn={Rectangle:Tn,Circle:jn,Ellipse:Ln,Path:Zn,Polygon:Pn,Polyline:Gn,Image:Bn,BorderedImage:On,EmbeddedImage:En,InscribedImage:Yn,HeaderedRectangle:Rn,Cylinder:Wn,TextBlock:Ve.define("standard.TextBlock",{attrs:{body:{refWidth:"100%",refHeight:"100%",stroke:"#333333",fill:"#ffffff",strokeWidth:2},foreignObject:{refWidth:"100%",refHeight:"100%"},label:{style:{fontSize:14}}}},{markup:[{tagName:"rect",selector:"body"},Un]},{attributes:{text:{set:function(t,e,i,n){if(!(i instanceof HTMLElement)){var r=n.style||{},o={text:t,width:-5,height:"100%"},s=Tt({textVerticalAnchor:"middle"},r);return xe.textWrap.set.call(this,o,e,i,s),{fill:r.color||null}}i.textContent=t},position:function(t,e,i){if(i instanceof SVGElement)return e.center()}}}}),Link:We.define("standard.Link",{attrs:{line:{connection:!0,stroke:"#333333",strokeWidth:2,strokeLinejoin:"round",targetMarker:{type:"path",d:"M 10 -5 0 0 10 5 z"}},wrapper:{connection:!0,strokeWidth:10,strokeLinejoin:"round"}}},{markup:[{tagName:"path",selector:"wrapper",attributes:{fill:"none",cursor:"pointer",stroke:"transparent","stroke-linecap":"round"}},{tagName:"path",selector:"line",attributes:{fill:"none","pointer-events":"none"}}]}),DoubleLink:We.define("standard.DoubleLink",{attrs:{line:{connection:!0,stroke:"#DDDDDD",strokeWidth:4,strokeLinejoin:"round",targetMarker:{type:"path",stroke:"#000000",d:"M 10 -3 10 -10 -2 0 10 10 10 3"}},outline:{connection:!0,stroke:"#000000",strokeWidth:6,strokeLinejoin:"round"}}},{markup:[{tagName:"path",selector:"outline",attributes:{fill:"none"}},{tagName:"path",selector:"line",attributes:{fill:"none"}}]}),ShadowLink:We.define("standard.ShadowLink",{attrs:{line:{connection:!0,stroke:"#FF0000",strokeWidth:20,strokeLinejoin:"round",targetMarker:{type:"path",stroke:"none",d:"M 0 -10 -10 0 0 10 z"},sourceMarker:{type:"path",stroke:"none",d:"M -10 -10 0 0 -10 10 0 10 0 -10 z"}},shadow:{connection:!0,refX:3,refY:6,stroke:"#000000",strokeOpacity:.2,strokeWidth:20,strokeLinejoin:"round",targetMarker:{type:"path",d:"M 0 -10 -10 0 0 10 z",stroke:"none"},sourceMarker:{type:"path",stroke:"none",d:"M -10 -10 0 0 -10 10 0 10 0 -10 z"}}}},{markup:[{tagName:"path",selector:"shadow",attributes:{fill:"none"}},{tagName:"path",selector:"line",attributes:{fill:"none"}}]})},Fn=In.define("devs.Model",{inPorts:[],outPorts:[],size:{width:80,height:80},attrs:{".":{magnet:!1},".label":{text:"Model","ref-x":.5,"ref-y":10,"font-size":18,"text-anchor":"middle",fill:"#000"},".body":{"ref-width":"100%","ref-height":"100%",stroke:"#000"}},ports:{groups:{in:{position:{name:"left"},attrs:{".port-label":{fill:"#000"},".port-body":{fill:"#fff",stroke:"#000",r:10,magnet:!0}},label:{position:{name:"left",args:{y:10}}}},out:{position:{name:"right"},attrs:{".port-label":{fill:"#000"},".port-body":{fill:"#fff",stroke:"#000",r:10,magnet:!0}},label:{position:{name:"right",args:{y:10}}}}}}},{markup:'',portMarkup:'',portLabelMarkup:'',initialize:function(){In.prototype.initialize.apply(this,arguments),this.on("change:inPorts change:outPorts",this.updatePortItems,this),this.updatePortItems()},updatePortItems:function(t,e,i){var n=Gt(this.get("inPorts")),r=_t(Gt(this.get("outPorts")),n),o=this.createPortItems("in",n),s=this.createPortItems("out",r);this.prop("ports/items",o.concat(s),Tt({rewrite:!0},i))},createPortItem:function(t,e){return{id:e,group:t,attrs:{".port-label":{text:e}}}},createPortItems:function(t,e){return Ut(e).map(this.createPortItem.bind(this,t))},_addGroupPort:function(t,e,i){var n=this.get(e);return this.set(e,Array.isArray(n)?n.concat(t):[t],i)},addOutPort:function(t,e){return this._addGroupPort(t,"outPorts",e)},addInPort:function(t,e){return this._addGroupPort(t,"inPorts",e)},_removeGroupPort:function(t,e,i){return this.set(e,Ht(this.get(e),t),i)},removeOutPort:function(t,e){return this._removeGroupPort(t,"outPorts",e)},removeInPort:function(t,e){return this._removeGroupPort(t,"inPorts",e)},_changeGroup:function(t,e,i){return this.prop("ports/groups/"+t,le(e)?e:{},i)},changeInGroup:function(t,e){return this._changeGroup("in",t,e)},changeOutGroup:function(t,e){return this._changeGroup("out",t,e)}}),Vn=Fn.define("devs.Atomic",{size:{width:80,height:80},attrs:{".label":{text:"Atomic"}}}),Jn=Fn.define("devs.Coupled",{size:{width:200,height:300},attrs:{".label":{text:"Coupled"}}}),Hn={Model:Fn,Atomic:Vn,Coupled:Jn,Link:We.define("devs.Link",{attrs:{".connection":{"stroke-width":2}}})},_n=In.define("logic.Gate",{size:{width:80,height:40},attrs:{".":{magnet:!1},".body":{width:100,height:50},circle:{r:7,stroke:"black",fill:"transparent","stroke-width":2}}},{operation:function(){return!0}}),Qn=_n.define("logic.IO",{size:{width:60,height:30},attrs:{".body":{fill:"white",stroke:"black","stroke-width":2},".wire":{ref:".body","ref-y":.5,stroke:"black"},text:{fill:"black",ref:".body","ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle","font-weight":"bold","font-variant":"small-caps","text-transform":"capitalize","font-size":"14px"}}},{markup:''}),Kn=Qn.define("logic.Input",{attrs:{".wire":{"ref-dx":0,d:"M 0 0 L 23 0"},circle:{ref:".body","ref-dx":30,"ref-y":.5,magnet:!0,class:"output",port:"out"},text:{text:"input"}}}),qn=Qn.define("logic.Output",{attrs:{".wire":{"ref-x":0,d:"M 0 0 L -23 0"},circle:{ref:".body","ref-x":-30,"ref-y":.5,magnet:"passive",class:"input",port:"in"},text:{text:"output"}}}),$n=_n.define("logic.Gate11",{attrs:{".input":{ref:".body","ref-x":-2,"ref-y":.5,magnet:"passive",port:"in"},".output":{ref:".body","ref-dx":2,"ref-y":.5,magnet:!0,port:"out"}}},{markup:''}),tr=_n.define("logic.Gate21",{attrs:{".input1":{ref:".body","ref-x":-2,"ref-y":.3,magnet:"passive",port:"in1"},".input2":{ref:".body","ref-x":-2,"ref-y":.7,magnet:"passive",port:"in2"},".output":{ref:".body","ref-dx":2,"ref-y":.5,magnet:!0,port:"out"}}},{markup:''}),er=$n.define("logic.Repeater",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5PVCBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjgiCiAgICAgaW5rc2NhcGU6Y3g9Ijg0LjY4NTM1MiIKICAgICBpbmtzY2FwZTpjeT0iMTUuMjg4NjI4IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjMzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gNzIuMTU2OTEsMjUgTCA5NSwyNSIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAyOS4wNDM0NzgsMjUgTCA1LjA0MzQ3ODEsMjUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgZD0iTSAyOC45Njg3NSwyLjU5Mzc1IEwgMjguOTY4NzUsNSBMIDI4Ljk2ODc1LDQ1IEwgMjguOTY4NzUsNDcuNDA2MjUgTCAzMS4xMjUsNDYuMzQzNzUgTCA3Mi4xNTYyNSwyNi4zNDM3NSBMIDcyLjE1NjI1LDIzLjY1NjI1IEwgMzEuMTI1LDMuNjU2MjUgTCAyOC45Njg3NSwyLjU5Mzc1IHogTSAzMS45Njg3NSw3LjQwNjI1IEwgNjguMDkzNzUsMjUgTCAzMS45Njg3NSw0Mi41OTM3NSBMIDMxLjk2ODc1LDcuNDA2MjUgeiIKICAgICAgIGlkPSJwYXRoMjYzOCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjY2NjYyIgLz4KICA8L2c+Cjwvc3ZnPgo="}}},{operation:function(t){return t}}),ir=$n.define("logic.Not",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5PVCBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjgiCiAgICAgaW5rc2NhcGU6Y3g9Ijg0LjY4NTM1MiIKICAgICBpbmtzY2FwZTpjeT0iMTUuMjg4NjI4IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjMzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gNzkuMTU2OTEsMjUgTCA5NSwyNSIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAyOS4wNDM0NzgsMjUgTCA1LjA0MzQ3ODEsMjUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgZD0iTSAyOC45Njg3NSwyLjU5Mzc1IEwgMjguOTY4NzUsNSBMIDI4Ljk2ODc1LDQ1IEwgMjguOTY4NzUsNDcuNDA2MjUgTCAzMS4xMjUsNDYuMzQzNzUgTCA3Mi4xNTYyNSwyNi4zNDM3NSBMIDcyLjE1NjI1LDIzLjY1NjI1IEwgMzEuMTI1LDMuNjU2MjUgTCAyOC45Njg3NSwyLjU5Mzc1IHogTSAzMS45Njg3NSw3LjQwNjI1IEwgNjguMDkzNzUsMjUgTCAzMS45Njg3NSw0Mi41OTM3NSBMIDMxLjk2ODc1LDcuNDA2MjUgeiIKICAgICAgIGlkPSJwYXRoMjYzOCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICBpZD0icGF0aDI2NzEiCiAgICAgICBzb2RpcG9kaTpjeD0iNzYiCiAgICAgICBzb2RpcG9kaTpjeT0iMjUiCiAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgIHNvZGlwb2RpOnJ5PSI0IgogICAgICAgZD0iTSA4MCwyNSBBIDQsNCAwIDEgMSA3MiwyNSBBIDQsNCAwIDEgMSA4MCwyNSB6IgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEsMCkiIC8+CiAgPC9nPgo8L3N2Zz4K"}}},{operation:function(t){return!t}}),nr=tr.define("logic.Or",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik9SIEFOU0kuc3ZnIgogICBpbmtzY2FwZTpvdXRwdXRfZXh0ZW5zaW9uPSJvcmcuaW5rc2NhcGUub3V0cHV0LnN2Zy5pbmtzY2FwZSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjUwIDogMTUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjI1IDogMTAgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjcxNCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODA2IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODE5IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjM3Mi4wNDcyNCA6IDM1MC43ODczOSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI3NDQuMDk0NDggOiA1MjYuMTgxMDkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNzc3IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49Ijc1IDogNDAgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMTUwIDogNjAgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDYwIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTMyNzUiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNTAgOiAzMy4zMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMTAwIDogNTAgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDUwIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1MzMiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzIgOiAyMS4zMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNjQgOiAzMiA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMzIgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjU1NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDE2LjY2NjY2NyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDI1IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAyNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iNCIKICAgICBpbmtzY2FwZTpjeD0iMTEzLjAwMDM5IgogICAgIGlua3NjYXBlOmN5PSIxMi44OTM3MzEiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImcyNTYwIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTpncmlkLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1wb2ludHM9InRydWUiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAwMDAiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMzk5IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijg3NCIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMzciCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii00IgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gNzAsMjUgYyAyMCwwIDI1LDAgMjUsMCIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMSwxNSA1LDE1IgogICAgICAgaWQ9InBhdGgzMDYxIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzIsMzUgNSwzNSIKICAgICAgIGlkPSJwYXRoMzk0NCIgLz4KICAgIDxnCiAgICAgICBpZD0iZzI1NjAiCiAgICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2LjUsLTM5LjUpIj4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJNIC0yLjQwNjI1LDQ0LjUgTCAtMC40MDYyNSw0Ni45Mzc1IEMgLTAuNDA2MjUsNDYuOTM3NSA1LjI1LDUzLjkzNzU0OSA1LjI1LDY0LjUgQyA1LjI1LDc1LjA2MjQ1MSAtMC40MDYyNSw4Mi4wNjI1IC0wLjQwNjI1LDgyLjA2MjUgTCAtMi40MDYyNSw4NC41IEwgMC43NSw4NC41IEwgMTQuNzUsODQuNSBDIDE3LjE1ODA3Niw4NC41MDAwMDEgMjIuNDM5Njk5LDg0LjUyNDUxNCAyOC4zNzUsODIuMDkzNzUgQyAzNC4zMTAzMDEsNzkuNjYyOTg2IDQwLjkxMTUzNiw3NC43NTA0ODQgNDYuMDYyNSw2NS4yMTg3NSBMIDQ0Ljc1LDY0LjUgTCA0Ni4wNjI1LDYzLjc4MTI1IEMgMzUuNzU5Mzg3LDQ0LjcxNTU5IDE5LjUwNjU3NCw0NC41IDE0Ljc1LDQ0LjUgTCAwLjc1LDQ0LjUgTCAtMi40MDYyNSw0NC41IHogTSAzLjQ2ODc1LDQ3LjUgTCAxNC43NSw0Ny41IEMgMTkuNDM0MTczLDQ3LjUgMzMuMDM2ODUsNDcuMzY5NzkzIDQyLjcxODc1LDY0LjUgQyAzNy45NTE5NjQsNzIuOTI5MDc1IDMyLjE5NzQ2OSw3Ny4xODM5MSAyNyw3OS4zMTI1IEMgMjEuNjM5MzM5LDgxLjUwNzkyNCAxNy4xNTgwNzUsODEuNTAwMDAxIDE0Ljc1LDgxLjUgTCAzLjUsODEuNSBDIDUuMzczNTg4NCw3OC4zOTE1NjYgOC4yNSw3Mi40NTA2NSA4LjI1LDY0LjUgQyA4LjI1LDU2LjUyNjY0NiA1LjM0MTQ2ODYsNTAuNTk5ODE1IDMuNDY4NzUsNDcuNSB6IgogICAgICAgICBpZD0icGF0aDQ5NzMiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NzY2NjY3NjY2NjY2NjY2NzY2NzYyIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo="}}},{operation:function(t,e){return t||e}}),rr=tr.define("logic.And",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9IkFORCBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI4IgogICAgIGlua3NjYXBlOmN4PSI1Ni42OTgzNDgiCiAgICAgaW5rc2NhcGU6Y3k9IjI1LjMyNjg5OSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzOTkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIzMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJtIDcwLDI1IGMgMjAsMCAyNSwwIDI1LDAiCiAgICAgICBpZD0icGF0aDMwNTkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzEsMTUgNSwxNSIKICAgICAgIGlkPSJwYXRoMzA2MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDMyLDM1IDUsMzUiCiAgICAgICBpZD0icGF0aDM5NDQiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZvbnQtc2l6ZTptZWRpdW07Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDt0ZXh0LWluZGVudDowO3RleHQtYWxpZ246c3RhcnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bGluZS1oZWlnaHQ6bm9ybWFsO2xldHRlci1zcGFjaW5nOm5vcm1hbDt3b3JkLXNwYWNpbmc6bm9ybWFsO3RleHQtdHJhbnNmb3JtOm5vbmU7ZGlyZWN0aW9uOmx0cjtibG9jay1wcm9ncmVzc2lvbjp0Yjt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGU7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOkJpdHN0cmVhbSBWZXJhIFNhbnMiCiAgICAgICBkPSJNIDMwLDUgTCAzMCw2LjQyODU3MTQgTCAzMCw0My41NzE0MjkgTCAzMCw0NSBMIDMxLjQyODU3MSw0NSBMIDUwLjQ3NjE5LDQ1IEMgNjEuNzQ0MDk4LDQ1IDcwLjQ3NjE5LDM1Ljk5OTk1NSA3MC40NzYxOSwyNSBDIDcwLjQ3NjE5LDE0LjAwMDA0NSA2MS43NDQwOTksNS4wMDAwMDAyIDUwLjQ3NjE5LDUgQyA1MC40NzYxOSw1IDUwLjQ3NjE5LDUgMzEuNDI4NTcxLDUgTCAzMCw1IHogTSAzMi44NTcxNDMsNy44NTcxNDI5IEMgNDAuODM0MjY0LDcuODU3MTQyOSA0NS45MTgzNjgsNy44NTcxNDI5IDQ4LjA5NTIzOCw3Ljg1NzE0MjkgQyA0OS4yODU3MTQsNy44NTcxNDI5IDQ5Ljg4MDk1Miw3Ljg1NzE0MjkgNTAuMTc4NTcxLDcuODU3MTQyOSBDIDUwLjMyNzM4MSw3Ljg1NzE0MjkgNTAuNDA5MjI3LDcuODU3MTQyOSA1MC40NDY0MjksNy44NTcxNDI5IEMgNTAuNDY1MDI5LDcuODU3MTQyOSA1MC40NzE1NDMsNy44NTcxNDI5IDUwLjQ3NjE5LDcuODU3MTQyOSBDIDYwLjIzNjg1Myw3Ljg1NzE0MyA2Ny4xNDI4NTcsMTUuNDk3MDk4IDY3LjE0Mjg1NywyNSBDIDY3LjE0Mjg1NywzNC41MDI5MDIgNTkuNzYwNjYyLDQyLjE0Mjg1NyA1MCw0Mi4xNDI4NTcgTCAzMi44NTcxNDMsNDIuMTQyODU3IEwgMzIuODU3MTQzLDcuODU3MTQyOSB6IgogICAgICAgaWQ9InBhdGgyODg0IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NzY2NjY3Nzc3NzY2NjIiAvPgogIDwvZz4KPC9zdmc+Cg=="}}},{operation:function(t,e){return t&&e}}),or=tr.define("logic.Nor",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5PUiBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEiCiAgICAgaW5rc2NhcGU6Y3g9Ijc4LjY3NzY0NCIKICAgICBpbmtzY2FwZTpjeT0iMjIuMTAyMzQ0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjM3IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItNCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDc5LDI1IEMgOTksMjUgOTUsMjUgOTUsMjUiCiAgICAgICBpZD0icGF0aDMwNTkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzEsMTUgNSwxNSIKICAgICAgIGlkPSJwYXRoMzA2MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDMyLDM1IDUsMzUiCiAgICAgICBpZD0icGF0aDM5NDQiIC8+CiAgICA8ZwogICAgICAgaWQ9ImcyNTYwIgogICAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNi41LC0zOS41KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0iTSAtMi40MDYyNSw0NC41IEwgLTAuNDA2MjUsNDYuOTM3NSBDIC0wLjQwNjI1LDQ2LjkzNzUgNS4yNSw1My45Mzc1NDkgNS4yNSw2NC41IEMgNS4yNSw3NS4wNjI0NTEgLTAuNDA2MjUsODIuMDYyNSAtMC40MDYyNSw4Mi4wNjI1IEwgLTIuNDA2MjUsODQuNSBMIDAuNzUsODQuNSBMIDE0Ljc1LDg0LjUgQyAxNy4xNTgwNzYsODQuNTAwMDAxIDIyLjQzOTY5OSw4NC41MjQ1MTQgMjguMzc1LDgyLjA5Mzc1IEMgMzQuMzEwMzAxLDc5LjY2Mjk4NiA0MC45MTE1MzYsNzQuNzUwNDg0IDQ2LjA2MjUsNjUuMjE4NzUgTCA0NC43NSw2NC41IEwgNDYuMDYyNSw2My43ODEyNSBDIDM1Ljc1OTM4Nyw0NC43MTU1OSAxOS41MDY1NzQsNDQuNSAxNC43NSw0NC41IEwgMC43NSw0NC41IEwgLTIuNDA2MjUsNDQuNSB6IE0gMy40Njg3NSw0Ny41IEwgMTQuNzUsNDcuNSBDIDE5LjQzNDE3Myw0Ny41IDMzLjAzNjg1LDQ3LjM2OTc5MyA0Mi43MTg3NSw2NC41IEMgMzcuOTUxOTY0LDcyLjkyOTA3NSAzMi4xOTc0NjksNzcuMTgzOTEgMjcsNzkuMzEyNSBDIDIxLjYzOTMzOSw4MS41MDc5MjQgMTcuMTU4MDc1LDgxLjUwMDAwMSAxNC43NSw4MS41IEwgMy41LDgxLjUgQyA1LjM3MzU4ODQsNzguMzkxNTY2IDguMjUsNzIuNDUwNjUgOC4yNSw2NC41IEMgOC4yNSw1Ni41MjY2NDYgNS4zNDE0Njg2LDUwLjU5OTgxNSAzLjQ2ODc1LDQ3LjUgeiIKICAgICAgICAgaWQ9InBhdGg0OTczIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc2NjY2NzY2NjY2NjY2Njc2Njc2MiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBpZD0icGF0aDI2MDQiCiAgICAgICAgIHNvZGlwb2RpOmN4PSI3NSIKICAgICAgICAgc29kaXBvZGk6Y3k9IjI1IgogICAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgICAgc29kaXBvZGk6cnk9IjQiCiAgICAgICAgIGQ9Ik0gNzksMjUgQSA0LDQgMCAxIDEgNzEsMjUgQSA0LDQgMCAxIDEgNzksMjUgeiIKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2LjUsMzkuNSkiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K"}}},{operation:function(t,e){return!(t||e)}}),sr=tr.define("logic.Nand",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5BTkQgQU5TSS5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMTUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxMCA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNzE0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MDYiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3NzciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNzUgOiA0MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxNTAgOiA2MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNjAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzI3NSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI1MCA6IDMzLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxMDAgOiA1MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTUzMyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzMiA6IDIxLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI2NCA6IDMyIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAzMiA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMTYiCiAgICAgaW5rc2NhcGU6Y3g9Ijc4LjI4MzMwNyIKICAgICBpbmtzY2FwZTpjeT0iMTYuNDQyODQzIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjMzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gNzksMjUgQyA5MS44LDI1IDk1LDI1IDk1LDI1IgogICAgICAgaWQ9InBhdGgzMDU5IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDMxLDE1IDUsMTUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45OTk5OTk4ODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMiwzNSA1LDM1IgogICAgICAgaWQ9InBhdGgzOTQ0IiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmb250LXNpemU6bWVkaXVtO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7dGV4dC1pbmRlbnQ6MDt0ZXh0LWFsaWduOnN0YXJ0O3RleHQtZGVjb3JhdGlvbjpub25lO2xpbmUtaGVpZ2h0Om5vcm1hbDtsZXR0ZXItc3BhY2luZzpub3JtYWw7d29yZC1zcGFjaW5nOm5vcm1hbDt0ZXh0LXRyYW5zZm9ybTpub25lO2RpcmVjdGlvbjpsdHI7YmxvY2stcHJvZ3Jlc3Npb246dGI7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MzttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpCaXRzdHJlYW0gVmVyYSBTYW5zIgogICAgICAgZD0iTSAzMCw1IEwgMzAsNi40Mjg1NzE0IEwgMzAsNDMuNTcxNDI5IEwgMzAsNDUgTCAzMS40Mjg1NzEsNDUgTCA1MC40NzYxOSw0NSBDIDYxLjc0NDA5OCw0NSA3MC40NzYxOSwzNS45OTk5NTUgNzAuNDc2MTksMjUgQyA3MC40NzYxOSwxNC4wMDAwNDUgNjEuNzQ0MDk5LDUuMDAwMDAwMiA1MC40NzYxOSw1IEMgNTAuNDc2MTksNSA1MC40NzYxOSw1IDMxLjQyODU3MSw1IEwgMzAsNSB6IE0gMzIuODU3MTQzLDcuODU3MTQyOSBDIDQwLjgzNDI2NCw3Ljg1NzE0MjkgNDUuOTE4MzY4LDcuODU3MTQyOSA0OC4wOTUyMzgsNy44NTcxNDI5IEMgNDkuMjg1NzE0LDcuODU3MTQyOSA0OS44ODA5NTIsNy44NTcxNDI5IDUwLjE3ODU3MSw3Ljg1NzE0MjkgQyA1MC4zMjczODEsNy44NTcxNDI5IDUwLjQwOTIyNyw3Ljg1NzE0MjkgNTAuNDQ2NDI5LDcuODU3MTQyOSBDIDUwLjQ2NTAyOSw3Ljg1NzE0MjkgNTAuNDcxNTQzLDcuODU3MTQyOSA1MC40NzYxOSw3Ljg1NzE0MjkgQyA2MC4yMzY4NTMsNy44NTcxNDMgNjcuMTQyODU3LDE1LjQ5NzA5OCA2Ny4xNDI4NTcsMjUgQyA2Ny4xNDI4NTcsMzQuNTAyOTAyIDU5Ljc2MDY2Miw0Mi4xNDI4NTcgNTAsNDIuMTQyODU3IEwgMzIuODU3MTQzLDQyLjE0Mjg1NyBMIDMyLjg1NzE0Myw3Ljg1NzE0MjkgeiIKICAgICAgIGlkPSJwYXRoMjg4NCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2Njc2NjY2Nzc3Nzc2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICBpZD0icGF0aDQwMDgiCiAgICAgICBzb2RpcG9kaTpjeD0iNzUiCiAgICAgICBzb2RpcG9kaTpjeT0iMjUiCiAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgIHNvZGlwb2RpOnJ5PSI0IgogICAgICAgZD0iTSA3OSwyNSBBIDQsNCAwIDEgMSA3MSwyNSBBIDQsNCAwIDEgMSA3OSwyNSB6IiAvPgogIDwvZz4KPC9zdmc+Cg=="}}},{operation:function(t,e){return!(t&&e)}}),ar=tr.define("logic.Xor",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9IlhPUiBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjUuNjU2ODU0MiIKICAgICBpbmtzY2FwZTpjeD0iMjUuOTM4MTE2IgogICAgIGlua3NjYXBlOmN5PSIxNy4yMzAwNSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzOTkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIzMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJtIDcwLDI1IGMgMjAsMCAyNSwwIDI1LDAiCiAgICAgICBpZD0icGF0aDMwNTkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzAuMzg1NzE3LDE1IEwgNC45OTk5OTk4LDE1IgogICAgICAgaWQ9InBhdGgzMDYxIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5NzY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzEuMzYyMDkxLDM1IEwgNC45OTk5OTk4LDM1IgogICAgICAgaWQ9InBhdGgzOTQ0IiAvPgogICAgPGcKICAgICAgIGlkPSJnMjU2MCIKICAgICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjYuNSwtMzkuNSkiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDM1MTYiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0iTSAtMi4yNSw4MS41MDAwMDUgQyAtMy44NDczNzQsODQuMTQ0NDA1IC00LjUsODQuNTAwMDA1IC00LjUsODQuNTAwMDA1IEwgLTguMTU2MjUsODQuNTAwMDA1IEwgLTYuMTU2MjUsODIuMDYyNTA1IEMgLTYuMTU2MjUsODIuMDYyNTA1IC0wLjUsNzUuMDYyNDUxIC0wLjUsNjQuNSBDIC0wLjUsNTMuOTM3NTQ5IC02LjE1NjI1LDQ2LjkzNzUgLTYuMTU2MjUsNDYuOTM3NSBMIC04LjE1NjI1LDQ0LjUgTCAtNC41LDQ0LjUgQyAtMy43MTg3NSw0NS40Mzc1IC0zLjA3ODEyNSw0Ni4xNTYyNSAtMi4yODEyNSw0Ny41IEMgLTAuNDA4NTMxLDUwLjU5OTgxNSAyLjUsNTYuNTI2NjQ2IDIuNSw2NC41IEMgMi41LDcyLjQ1MDY1IC0wLjM5NjY5Nyw3OC4zNzk0MjUgLTIuMjUsODEuNTAwMDA1IHoiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY3NjY2Njc2MiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0iTSAtMi40MDYyNSw0NC41IEwgLTAuNDA2MjUsNDYuOTM3NSBDIC0wLjQwNjI1LDQ2LjkzNzUgNS4yNSw1My45Mzc1NDkgNS4yNSw2NC41IEMgNS4yNSw3NS4wNjI0NTEgLTAuNDA2MjUsODIuMDYyNSAtMC40MDYyNSw4Mi4wNjI1IEwgLTIuNDA2MjUsODQuNSBMIDAuNzUsODQuNSBMIDE0Ljc1LDg0LjUgQyAxNy4xNTgwNzYsODQuNTAwMDAxIDIyLjQzOTY5OSw4NC41MjQ1MTQgMjguMzc1LDgyLjA5Mzc1IEMgMzQuMzEwMzAxLDc5LjY2Mjk4NiA0MC45MTE1MzYsNzQuNzUwNDg0IDQ2LjA2MjUsNjUuMjE4NzUgTCA0NC43NSw2NC41IEwgNDYuMDYyNSw2My43ODEyNSBDIDM1Ljc1OTM4Nyw0NC43MTU1OSAxOS41MDY1NzQsNDQuNSAxNC43NSw0NC41IEwgMC43NSw0NC41IEwgLTIuNDA2MjUsNDQuNSB6IE0gMy40Njg3NSw0Ny41IEwgMTQuNzUsNDcuNSBDIDE5LjQzNDE3Myw0Ny41IDMzLjAzNjg1LDQ3LjM2OTc5MyA0Mi43MTg3NSw2NC41IEMgMzcuOTUxOTY0LDcyLjkyOTA3NSAzMi4xOTc0NjksNzcuMTgzOTEgMjcsNzkuMzEyNSBDIDIxLjYzOTMzOSw4MS41MDc5MjQgMTcuMTU4MDc1LDgxLjUwMDAwMSAxNC43NSw4MS41IEwgMy41LDgxLjUgQyA1LjM3MzU4ODQsNzguMzkxNTY2IDguMjUsNzIuNDUwNjUgOC4yNSw2NC41IEMgOC4yNSw1Ni41MjY2NDYgNS4zNDE0Njg2LDUwLjU5OTgxNSAzLjQ2ODc1LDQ3LjUgeiIKICAgICAgICAgaWQ9InBhdGg0OTczIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc2NjY2NzY2NjY2NjY2Njc2Njc2MiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K"}}},{operation:function(t,e){return(!t||e)&&(t||!e)}}),lr=tr.define("logic.Xnor",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9IlhOT1IgQU5TSS5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMTUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxMCA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNzE0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MDYiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3NzciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNzUgOiA0MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxNTAgOiA2MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNjAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzI3NSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI1MCA6IDMzLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxMDAgOiA1MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTUzMyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzMiA6IDIxLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI2NCA6IDMyIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAzMiA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNTU3IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjI1IDogMTYuNjY2NjY3IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjUwIDogMjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDI1IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI0IgogICAgIGlua3NjYXBlOmN4PSI5NS43MjM2NiIKICAgICBpbmtzY2FwZTpjeT0iLTI2Ljc3NTAyMyIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzOTkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIzMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAwMDAwMDI0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDc4LjMzMzMzMiwyNSBDIDkxLjY2NjY2NiwyNSA5NSwyNSA5NSwyNSIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45OTk5OTk4ODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMC4zODU3MTcsMTUgTCA0Ljk5OTk5OTgsMTUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45OTk5OTk3NjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMS4zNjIwOTEsMzUgTCA0Ljk5OTk5OTgsMzUiCiAgICAgICBpZD0icGF0aDM5NDQiIC8+CiAgICA8ZwogICAgICAgaWQ9ImcyNTYwIgogICAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNi41LC0zOS41KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzUxNiIKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJNIC0yLjI1LDgxLjUwMDAwNSBDIC0zLjg0NzM3NCw4NC4xNDQ0MDUgLTQuNSw4NC41MDAwMDUgLTQuNSw4NC41MDAwMDUgTCAtOC4xNTYyNSw4NC41MDAwMDUgTCAtNi4xNTYyNSw4Mi4wNjI1MDUgQyAtNi4xNTYyNSw4Mi4wNjI1MDUgLTAuNSw3NS4wNjI0NTEgLTAuNSw2NC41IEMgLTAuNSw1My45Mzc1NDkgLTYuMTU2MjUsNDYuOTM3NSAtNi4xNTYyNSw0Ni45Mzc1IEwgLTguMTU2MjUsNDQuNSBMIC00LjUsNDQuNSBDIC0zLjcxODc1LDQ1LjQzNzUgLTMuMDc4MTI1LDQ2LjE1NjI1IC0yLjI4MTI1LDQ3LjUgQyAtMC40MDg1MzEsNTAuNTk5ODE1IDIuNSw1Ni41MjY2NDYgMi41LDY0LjUgQyAyLjUsNzIuNDUwNjUgLTAuMzk2Njk3LDc4LjM3OTQyNSAtMi4yNSw4MS41MDAwMDUgeiIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2Njc2NjY2NzYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJNIC0yLjQwNjI1LDQ0LjUgTCAtMC40MDYyNSw0Ni45Mzc1IEMgLTAuNDA2MjUsNDYuOTM3NSA1LjI1LDUzLjkzNzU0OSA1LjI1LDY0LjUgQyA1LjI1LDc1LjA2MjQ1MSAtMC40MDYyNSw4Mi4wNjI1IC0wLjQwNjI1LDgyLjA2MjUgTCAtMi40MDYyNSw4NC41IEwgMC43NSw4NC41IEwgMTQuNzUsODQuNSBDIDE3LjE1ODA3Niw4NC41MDAwMDEgMjIuNDM5Njk5LDg0LjUyNDUxNCAyOC4zNzUsODIuMDkzNzUgQyAzNC4zMTAzMDEsNzkuNjYyOTg2IDQwLjkxMTUzNiw3NC43NTA0ODQgNDYuMDYyNSw2NS4yMTg3NSBMIDQ0Ljc1LDY0LjUgTCA0Ni4wNjI1LDYzLjc4MTI1IEMgMzUuNzU5Mzg3LDQ0LjcxNTU5IDE5LjUwNjU3NCw0NC41IDE0Ljc1LDQ0LjUgTCAwLjc1LDQ0LjUgTCAtMi40MDYyNSw0NC41IHogTSAzLjQ2ODc1LDQ3LjUgTCAxNC43NSw0Ny41IEMgMTkuNDM0MTczLDQ3LjUgMzMuMDM2ODUsNDcuMzY5NzkzIDQyLjcxODc1LDY0LjUgQyAzNy45NTE5NjQsNzIuOTI5MDc1IDMyLjE5NzQ2OSw3Ny4xODM5MSAyNyw3OS4zMTI1IEMgMjEuNjM5MzM5LDgxLjUwNzkyNCAxNy4xNTgwNzUsODEuNTAwMDAxIDE0Ljc1LDgxLjUgTCAzLjUsODEuNSBDIDUuMzczNTg4NCw3OC4zOTE1NjYgOC4yNSw3Mi40NTA2NSA4LjI1LDY0LjUgQyA4LjI1LDU2LjUyNjY0NiA1LjM0MTQ2ODYsNTAuNTk5ODE1IDMuNDY4NzUsNDcuNSB6IgogICAgICAgICBpZD0icGF0aDQ5NzMiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NzY2NjY3NjY2NjY2NjY2NzY2NzYyIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICBpZD0icGF0aDM1NTEiCiAgICAgICBzb2RpcG9kaTpjeD0iNzUiCiAgICAgICBzb2RpcG9kaTpjeT0iMjUiCiAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgIHNvZGlwb2RpOnJ5PSI0IgogICAgICAgZD0iTSA3OSwyNSBBIDQsNCAwIDEgMSA3MSwyNSBBIDQsNCAwIDEgMSA3OSwyNSB6IiAvPgogIDwvZz4KPC9zdmc+Cg=="}}},{operation:function(t,e){return(!t||!e)&&(t||e)}}),cr={Gate:_n,IO:Qn,Input:Kn,Output:qn,Gate11:$n,Gate21:tr,Repeater:er,Not:ir,Or:nr,And:rr,Nor:or,Nand:sr,Xor:ar,Xnor:lr,Wire:We.define("logic.Wire",{attrs:{".connection":{"stroke-width":2},".marker-vertex":{r:7}},router:{name:"orthogonal"},connector:{name:"rounded",args:{radius:10}}},{arrowheadMarkup:['','',""].join(""),vertexMarkup:['','','','','',"Remove vertex.","","",""].join("")})},gr={KingWhite:In.define("chess.KingWhite",{size:{width:42,height:38}},{markup:' '}),KingBlack:In.define("chess.KingBlack",{size:{width:42,height:38}},{markup:' '}),QueenWhite:In.define("chess.QueenWhite",{size:{width:42,height:38}},{markup:' '}),QueenBlack:In.define("chess.QueenBlack",{size:{width:42,height:38}},{markup:' '}),RookWhite:In.define("chess.RookWhite",{size:{width:32,height:34}},{markup:' '}),RookBlack:In.define("chess.RookBlack",{size:{width:32,height:34}},{markup:' '}),BishopWhite:In.define("chess.BishopWhite",{size:{width:38,height:38}},{markup:' '}),BishopBlack:In.define("chess.BishopBlack",{size:{width:38,height:38}},{markup:' '}),KnightWhite:In.define("chess.KnightWhite",{size:{width:38,height:37}},{markup:' '}),KnightBlack:In.define("chess.KnightBlack",{size:{width:38,height:37}},{markup:' '}),PawnWhite:In.define("chess.PawnWhite",{size:{width:28,height:33}},{markup:''}),PawnBlack:In.define("chess.PawnBlack",{size:{width:28,height:33}},{markup:''})},hr=Ve.define("erd.Entity",{size:{width:150,height:60},attrs:{".outer":{fill:"#2ECC71",stroke:"#27AE60","stroke-width":2,points:"100,0 100,60 0,60 0,0"},".inner":{fill:"#2ECC71",stroke:"#27AE60","stroke-width":2,points:"95,5 95,55 5,55 5,5",display:"none"},text:{text:"Entity","font-family":"Arial","font-size":14,"ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),ur=hr.define("erd.WeakEntity",{attrs:{".inner":{display:"auto"},text:{text:"Weak Entity"}}}),dr=Ve.define("erd.Relationship",{size:{width:80,height:80},attrs:{".outer":{fill:"#3498DB",stroke:"#2980B9","stroke-width":2,points:"40,0 80,40 40,80 0,40"},".inner":{fill:"#3498DB",stroke:"#2980B9","stroke-width":2,points:"40,5 75,40 40,75 5,40",display:"none"},text:{text:"Relationship","font-family":"Arial","font-size":12,"ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),fr=dr.define("erd.IdentifyingRelationship",{attrs:{".inner":{display:"auto"},text:{text:"Identifying"}}}),pr=Ve.define("erd.Attribute",{size:{width:100,height:50},attrs:{ellipse:{transform:"translate(50, 25)"},".outer":{stroke:"#D35400","stroke-width":2,cx:0,cy:0,rx:50,ry:25,fill:"#E67E22"},".inner":{stroke:"#D35400","stroke-width":2,cx:0,cy:0,rx:45,ry:20,fill:"#E67E22",display:"none"},text:{"font-family":"Arial","font-size":14,"ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),Ir=pr.define("erd.Multivalued",{attrs:{".inner":{display:"block"},text:{text:"multivalued"}}}),mr=pr.define("erd.Derived",{attrs:{".outer":{"stroke-dasharray":"3,5"},text:{text:"derived"}}}),Ar=pr.define("erd.Key",{attrs:{ellipse:{"stroke-width":4},text:{text:"key","font-weight":"800","text-decoration":"underline"}}}),vr=pr.define("erd.Normal",{attrs:{text:{text:"Normal"}}}),Cr={Entity:hr,WeakEntity:ur,Relationship:dr,IdentifyingRelationship:fr,Attribute:pr,Multivalued:Ir,Derived:mr,Key:Ar,Normal:vr,ISA:Ve.define("erd.ISA",{type:"erd.ISA",size:{width:100,height:50},attrs:{polygon:{points:"0,0 50,50 100,0",fill:"#F1C40F",stroke:"#F39C12","stroke-width":2},text:{text:"ISA","font-size":18,"ref-x":.5,"ref-y":.3,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),Line:We.define("erd.Line",{},{cardinality:function(t){this.set("labels",[{position:-20,attrs:{text:{dy:-8,text:t}}}])}})},wr={State:Cn.define("fsa.State",{attrs:{circle:{"stroke-width":3},text:{"font-weight":"800"}}}),StartState:Ve.define("fsa.StartState",{size:{width:20,height:20},attrs:{circle:{transform:"translate(10, 10)",r:10,fill:"#000000"}}},{markup:''}),EndState:Ve.define("fsa.EndState",{size:{width:20,height:20},attrs:{".outer":{transform:"translate(10, 10)",r:10,fill:"#ffffff",stroke:"#000000"},".inner":{transform:"translate(10, 10)",r:6,fill:"#000000"}}},{markup:''}),Arrow:We.define("fsa.Arrow",{attrs:{".marker-target":{d:"M 10 0 L 0 5 L 10 10 z"}},smooth:!0})},yr={Member:Ve.define("org.Member",{size:{width:180,height:70},attrs:{rect:{width:170,height:60},".card":{fill:"#FFFFFF",stroke:"#000000","stroke-width":2,"pointer-events":"visiblePainted",rx:10,ry:10},image:{width:48,height:48,ref:".card","ref-x":10,"ref-y":5},".rank":{"text-decoration":"underline",ref:".card","ref-x":.9,"ref-y":.2,"font-family":"Courier New","font-size":14,"text-anchor":"end"},".name":{"font-weight":"800",ref:".card","ref-x":.9,"ref-y":.6,"font-family":"Courier New","font-size":14,"text-anchor":"end"}}},{markup:''}),Arrow:We.define("org.Arrow",{source:{selector:".card"},target:{selector:".card"},attrs:{".connection":{stroke:"#585858","stroke-width":3}},z:-1})},br={Place:In.define("pn.Place",{size:{width:50,height:50},attrs:{".root":{r:25,fill:"#ffffff",stroke:"#000000",transform:"translate(25, 25)"},".label":{"text-anchor":"middle","ref-x":.5,"ref-y":-20,ref:".root",fill:"#000000","font-size":12},".tokens > circle":{fill:"#000000",r:5},".tokens.one > circle":{transform:"translate(25, 25)"},".tokens.two > circle:nth-child(1)":{transform:"translate(19, 25)"},".tokens.two > circle:nth-child(2)":{transform:"translate(31, 25)"},".tokens.three > circle:nth-child(1)":{transform:"translate(18, 29)"},".tokens.three > circle:nth-child(2)":{transform:"translate(25, 19)"},".tokens.three > circle:nth-child(3)":{transform:"translate(32, 29)"},".tokens.alot > text":{transform:"translate(25, 18)","text-anchor":"middle",fill:"#000000"}}},{markup:''}),PlaceView:$e.extend({presentationAttributes:$e.addPresentationAttributes({tokens:["TOKENS"]}),initFlag:$e.prototype.initFlag.concat(["TOKENS"]),confirmUpdate:function(){for(var t,e=[],i=arguments.length;i--;)e[i]=arguments[i];var n=(t=$e.prototype.confirmUpdate).call.apply(t,[this].concat(e));return this.hasFlag(n,"TOKENS")&&(this.renderTokens(),this.update(),n=this.removeFlag(n,"TOKENS")),n},renderTokens:function(){var e=this.vel.findOne(".tokens").empty();["one","two","three","alot"].forEach(function(t){e.removeClass(t)});var t=this.model.get("tokens");if(t)switch(t){case 1:e.addClass("one"),e.append(q("circle"));break;case 2:e.addClass("two"),e.append([q("circle"),q("circle")]);break;case 3:e.addClass("three"),e.append([q("circle"),q("circle"),q("circle")]);break;default:e.addClass("alot"),e.append(q("text").text(t+""))}}}),Transition:In.define("pn.Transition",{size:{width:12,height:50},attrs:{rect:{width:12,height:50,fill:"#000000",stroke:"#000000"},".label":{"text-anchor":"middle","ref-x":.5,"ref-y":-20,ref:"rect",fill:"#000000","font-size":12}}},{markup:''}),Link:We.define("pn.Link",{attrs:{".marker-target":{d:"M 10 0 L 0 5 L 10 10 z"}}})},Nr=In.define("uml.Class",{attrs:{rect:{width:200},".uml-class-name-rect":{stroke:"black","stroke-width":2,fill:"#3498db"},".uml-class-attrs-rect":{stroke:"black","stroke-width":2,fill:"#2980b9"},".uml-class-methods-rect":{stroke:"black","stroke-width":2,fill:"#2980b9"},".uml-class-name-text":{ref:".uml-class-name-rect","ref-y":.5,"ref-x":.5,"text-anchor":"middle","y-alignment":"middle","font-weight":"bold",fill:"black","font-size":12,"font-family":"Times New Roman"},".uml-class-attrs-text":{ref:".uml-class-attrs-rect","ref-y":5,"ref-x":5,fill:"black","font-size":12,"font-family":"Times New Roman"},".uml-class-methods-text":{ref:".uml-class-methods-rect","ref-y":5,"ref-x":5,fill:"black","font-size":12,"font-family":"Times New Roman"}},name:[],attributes:[],methods:[]},{markup:['','','',"",'',""].join(""),initialize:function(){this.on("change:name change:attributes change:methods",function(){this.updateRectangles(),this.trigger("uml-update")},this),this.updateRectangles(),In.prototype.initialize.apply(this,arguments)},getClassName:function(){return this.get("name")},updateRectangles:function(){var n=this.get("attrs"),t=[{type:"name",text:this.getClassName()},{type:"attrs",text:this.get("attributes")},{type:"methods",text:this.get("methods")}],r=0;t.forEach(function(t){var e=Array.isArray(t.text)?t.text:[t.text],i=20*e.length+20;n[".uml-class-"+t.type+"-text"].text=e.join("\n"),n[".uml-class-"+t.type+"-rect"].height=i,n[".uml-class-"+t.type+"-rect"].transform="translate(0,"+r+")",r+=i})}}),Mr=$e.extend({initialize:function(){$e.prototype.initialize.apply(this,arguments),this.listenTo(this.model,"uml-update",function(){this.update(),this.resize()})}}),xr=Nr.define("uml.Abstract",{attrs:{".uml-class-name-rect":{fill:"#e74c3c"},".uml-class-attrs-rect":{fill:"#c0392b"},".uml-class-methods-rect":{fill:"#c0392b"}}},{getClassName:function(){return["<>",this.get("name")]}}),Sr=Mr,kr=Nr.define("uml.Interface",{attrs:{".uml-class-name-rect":{fill:"#f1c40f"},".uml-class-attrs-rect":{fill:"#f39c12"},".uml-class-methods-rect":{fill:"#f39c12"}}},{getClassName:function(){return["<>",this.get("name")]}}),Dr={basic:zn,standard:Xn,devs:Hn,logic:cr,chess:gr,erd:Cr,fsa:wr,org:yr,pn:br,uml:{Class:Nr,ClassView:Mr,Abstract:xr,AbstractView:Sr,Interface:kr,InterfaceView:Mr,Generalization:We.define("uml.Generalization",{attrs:{".marker-target":{d:"M 20 0 L 0 10 L 20 20 z",fill:"white"}}}),Implementation:We.define("uml.Implementation",{attrs:{".marker-target":{d:"M 20 0 L 0 10 L 20 20 z",fill:"white"},".connection":{"stroke-dasharray":"3,3"}}}),Aggregation:We.define("uml.Aggregation",{attrs:{".marker-target":{d:"M 40 10 L 20 20 L 0 10 L 20 0 z",fill:"white"}}}),Composition:We.define("uml.Composition",{attrs:{".marker-target":{d:"M 40 10 L 20 20 L 0 10 L 20 0 z",fill:"black"}}}),Association:We.define("uml.Association"),State:In.define("uml.State",{attrs:{".uml-state-body":{width:200,height:200,rx:10,ry:10,fill:"#ecf0f1",stroke:"#bdc3c7","stroke-width":3},".uml-state-separator":{stroke:"#bdc3c7","stroke-width":2},".uml-state-name":{ref:".uml-state-body","ref-x":.5,"ref-y":5,"text-anchor":"middle",fill:"#000000","font-family":"Courier New","font-size":14},".uml-state-events":{ref:".uml-state-separator","ref-x":5,"ref-y":5,fill:"#000000","font-family":"Courier New","font-size":14}},name:"State",events:[]},{markup:['','','',"",'','','',""].join(""),initialize:function(){this.on({"change:name":this.updateName,"change:events":this.updateEvents,"change:size":this.updatePath},this),this.updateName(),this.updateEvents(),this.updatePath(),In.prototype.initialize.apply(this,arguments)},updateName:function(){this.attr(".uml-state-name/text",this.get("name"))},updateEvents:function(){this.attr(".uml-state-events/text",this.get("events").join("\n"))},updatePath:function(){var t="M 0 20 L "+this.get("size").width+" 20";this.attr(".uml-state-separator/d",t,{silent:!0})}}),StartState:Cn.define("uml.StartState",{type:"uml.StartState",attrs:{circle:{fill:"#34495e",stroke:"#2c3e50","stroke-width":2,rx:1}}}),EndState:In.define("uml.EndState",{size:{width:20,height:20},attrs:{"circle.outer":{transform:"translate(10, 10)",r:10,fill:"#ffffff",stroke:"#2c3e50"},"circle.inner":{transform:"translate(10, 10)",r:6,fill:"#34495e"}}},{markup:''}),Transition:We.define("uml.Transition",{attrs:{".marker-target":{d:"M 10 0 L 0 5 L 10 10 z",fill:"#34495e",stroke:"#2c3e50"},".connection":{stroke:"#2c3e50"}}})}};function zr(t,e){return 0===e?"0%":Math.round(t/e*100)+"%"}function Tr(r){return function(t,e,i,n){return(e.isNodeConnection(i)?Lr:jr)(r,t,e,i,n)}}function jr(t,e,i,n,r){var o=i.model.angle(),s=i.getNodeUnrotatedBBox(n),a=i.model.getBBox().center();r.rotate(a,o);var l=r.x-s.x,c=r.y-s.y;return t&&(l=zr(l,s.width),c=zr(c,s.height)),e.anchor={name:"topLeft",args:{dx:l,dy:c,rotate:!0}},e}function Lr(t,e,i,n,r){var o=i.getConnection();if(!o)return e;var s=o.closestPointLength(r);if(t){var a=o.length();e.anchor={name:"connectionRatio",args:{ratio:s/a}}}else e.anchor={name:"connectionLength",args:{length:s}};return e}var Zr=he,Pr=Tr(!1),Gr=Tr(!0),Br={useDefaults:Zr,pinAbsolute:Pr,pinRelative:Gr};function Or(t,e,i){return Gr.call(this.paper,{},e,i,t,this.model).anchor}function Er(t,e){var i=t.model;return e?i.getBBox():i.isLink()?t.getConnection().bbox():t.getNodeUnrotatedBBox(t.el)}var Yr=Qe.extend({tagName:"circle",svgElement:!0,className:"marker-vertex",events:{mousedown:"onPointerDown",touchstart:"onPointerDown",dblclick:"onDoubleClick"},documentEvents:{mousemove:"onPointerMove",touchmove:"onPointerMove",mouseup:"onPointerUp",touchend:"onPointerUp",touchcancel:"onPointerUp"},attributes:{r:6,fill:"#33334F",stroke:"#FFFFFF","stroke-width":2,cursor:"move"},position:function(t,e){this.vel.attr({cx:t,cy:e})},onPointerDown:function(t){this.options.guard(t)||(t.stopPropagation(),t.preventDefault(),this.options.paper.undelegateEvents(),this.delegateDocumentEvents(null,t.data),this.trigger("will-change",this,t))},onPointerMove:function(t){this.trigger("changing",this,t)},onDoubleClick:function(t){this.trigger("remove",this,t)},onPointerUp:function(t){this.trigger("changed",this,t),this.undelegateDocumentEvents(),this.options.paper.delegateEvents()}}),Rr=hn.extend({name:"vertices",options:{handleClass:Yr,snapRadius:20,redundancyRemoval:!0,vertexAdding:!0,stopPropagation:!0},children:[{tagName:"path",selector:"connection",className:"joint-vertices-path",attributes:{fill:"none",stroke:"transparent","stroke-width":10,cursor:"cell"}}],handles:null,events:{"mousedown .joint-vertices-path":"onPathPointerDown","touchstart .joint-vertices-path":"onPathPointerDown"},onRender:function(){return this.options.vertexAdding&&(this.renderChildren(),this.updatePath()),this.resetHandles(),this.renderHandles(),this},update:function(){return this.relatedView.model.vertices().length===this.handles.length?this.updateHandles():(this.resetHandles(),this.renderHandles()),this.options.vertexAdding&&this.updatePath(),this},resetHandles:function(){var t=this.handles;if(this.handles=[],this.stopListening(),Array.isArray(t))for(var e=0,i=t.length;e pointAt: function(t) { @@ -2049,6 +2061,11 @@ var joint = (function (exports, Backbone, _, $) { return this.start.toString() + ' ' + this.end.toString(); }, + serialize: function() { + + return this.start.serialize() + ' ' + this.end.serialize(); + }, + translate: function(tx, ty) { this.start.translate(tx, ty); @@ -3645,6 +3662,11 @@ var joint = (function (exports, Backbone, _, $) { return this.x + '@' + this.y; }, + serialize: function() { + + return this.x + ',' + this.y; + }, + update: function(x, y) { this.x = x || 0; @@ -8807,9 +8829,9 @@ var joint = (function (exports, Backbone, _, $) { }; var breakText = function(text, size, styles, opt) { + if ( styles === void 0 ) styles = {}; + if ( opt === void 0 ) opt = {}; - opt = opt || {}; - styles = styles || {}; var width = size.width; var height = size.height; @@ -8841,6 +8863,8 @@ var joint = (function (exports, Backbone, _, $) { var separator = opt.separator || ' '; var eol = opt.eol || '\n'; var hyphen = opt.hyphen ? new RegExp(opt.hyphen) : /[^\w\d]/; + var maxLineCount = opt.maxLineCount; + if (!isNumber(maxLineCount)) { maxLineCount = Infinity; } var words = text.split(separator); var full = []; @@ -8855,19 +8879,19 @@ var joint = (function (exports, Backbone, _, $) { if (!word) { continue; } if (eol && word.indexOf(eol) >= 0) { - // word cotains end-of-line character + // word contains end-of-line character if (word.length > 1) { // separate word and continue cycle var eolWords = word.split(eol); for (var j = 0, jl = eolWords.length - 1; j < jl; j++) { eolWords.splice(2 * j + 1, 0, eol); } - Array.prototype.splice.apply(words, [i, 1].concat(eolWords)); + words.splice.apply(words, [ i, 1 ].concat( eolWords.filter(function (word) { return word !== ''; }) )); i--; - len += eolWords.length - 1; + len = words.length; } else { - // creates new line - l++; + // creates a new line + lines[++l] = ''; } continue; } @@ -8966,9 +8990,16 @@ var joint = (function (exports, Backbone, _, $) { i--; } - // if size.height is defined we have to check whether the height of the entire - // text exceeds the rect height - if (height !== undefined) { + var lastL = null; + + if (lines.length > maxLineCount) { + + lastL = maxLineCount - 1; + + } else if (height !== undefined) { + + // if size.height is defined we have to check whether the height of the entire + // text exceeds the rect height if (lineHeight === undefined) { @@ -8990,37 +9021,42 @@ var joint = (function (exports, Backbone, _, $) { if (lineHeight * lines.length > height) { // remove overflowing lines - var lastL = Math.floor(height / lineHeight) - 1; - lines.splice(lastL + 1); - - // add ellipsis - var ellipsis = opt.ellipsis; - if (!ellipsis || lastL < 0) { break; } - if (typeof ellipsis !== 'string') { ellipsis = '\u2026'; } - - var lastLine = lines[lastL]; - var k = lastLine.length; - var lastLineWithOmission, lastChar, separatorChar; - do { - lastChar = lastLine[k]; - lastLineWithOmission = lastLine.substring(0, k); - if (!lastChar) { - separatorChar = (typeof separator === 'string') ? separator : ' '; - lastLineWithOmission += separatorChar; - } else if (lastChar.match(separator)) { - lastLineWithOmission += lastChar; - } - lastLineWithOmission += ellipsis; - textNode.data = lastLineWithOmission; - if (textSpan.getComputedTextLength() <= width) { - lines[lastL] = lastLineWithOmission; - break; - } - k--; - } while (k >= 0); - break; + lastL = Math.floor(height / lineHeight) - 1; } } + + if (lastL !== null) { + + lines.splice(lastL + 1); + + // add ellipsis + var ellipsis = opt.ellipsis; + if (!ellipsis || lastL < 0) { break; } + if (typeof ellipsis !== 'string') { ellipsis = '\u2026'; } + + var lastLine = lines[lastL]; + if (!lastLine) { break; } + var k = lastLine.length; + var lastLineWithOmission, lastChar, separatorChar; + do { + lastChar = lastLine[k]; + lastLineWithOmission = lastLine.substring(0, k); + if (!lastChar) { + separatorChar = (typeof separator === 'string') ? separator : ' '; + lastLineWithOmission += separatorChar; + } else if (lastChar.match(separator)) { + lastLineWithOmission += lastChar; + } + lastLineWithOmission += ellipsis; + textNode.data = lastLineWithOmission; + if (textSpan.getComputedTextLength() <= width) { + lines[lastL] = lastLineWithOmission; + break; + } + k--; + } while (k >= 0); + break; + } } if (opt.svgDocument) { @@ -9062,7 +9098,7 @@ var joint = (function (exports, Backbone, _, $) { // Remove attribute names that start with "on" (e.g. onload, onerror...). // Remove attribute values that start with "javascript:" pseudo protocol (e.g. `href="javascript:alert(1)"`). - if (attrName.indexOf('on') === 0 || attrValue.indexOf('javascript:') === 0) { + if (attrName.startsWith('on') || attrValue.startsWith('javascript:') || attrValue.startsWith('data:') || attrValue.startsWith('vbscript:')) { $(currentNode).removeAttr(attrName); } }); @@ -10469,7 +10505,8 @@ var joint = (function (exports, Backbone, _, $) { // instead of creating a temporary one over again. svgDocument: this.paper.svg, ellipsis: value.ellipsis, - hyphen: value.hyphen + hyphen: value.hyphen, + maxLineCount: value.maxLineCount }); } else { wrappedText = ''; @@ -12955,6 +12992,14 @@ var joint = (function (exports, Backbone, _, $) { return cloneDeep(this.prop('ports/items')) || []; }, + /** + * @returns {Array} + */ + getGroupPorts: function(groupName) { + var groupPorts = toArray(this.prop(['ports','items'])).filter(function (port) { return port.group === groupName; }); + return cloneDeep(groupPorts); + }, + /** * @param {string} id * @returns {object} @@ -13106,45 +13151,39 @@ var joint = (function (exports, Backbone, _, $) { }, removePort: function(port, opt) { - var options = opt || {}; - var ports = assign([], this.prop('ports/items')); - var index$1 = this.getPortIndex(port); - if (index$1 !== -1) { + var ports = assign([], this.prop(['ports', 'items'])); ports.splice(index$1, 1); options.rewrite = true; - this.prop('ports/items', ports, options); + this.startBatch('port-remove'); + this.prop(['ports', 'items'], ports, options); + this.stopBatch('port-remove'); } - return this; }, removePorts: function(portsForRemoval, opt) { - - var options; - + var options, newPorts; if (Array.isArray(portsForRemoval)) { options = opt || {}; - - if (portsForRemoval.length) { - options.rewrite = true; - var currentPorts = assign([], this.prop('ports/items')); - var remainingPorts = currentPorts.filter(function(cp) { - return !portsForRemoval.some(function(rp) { - var rpId = isObject(rp) ? rp.id : rp; - return cp.id === rpId; - }); + if (portsForRemoval.length === 0) { return this.this; } + var currentPorts = assign([], this.prop(['ports', 'items'])); + newPorts = currentPorts.filter(function(cp) { + return !portsForRemoval.some(function(rp) { + var rpId = isObject(rp) ? rp.id : rp; + return cp.id === rpId; }); - this.prop('ports/items', remainingPorts, options); - } + }); } else { options = portsForRemoval || {}; - options.rewrite = true; - this.prop('ports/items', [], options); + newPorts = []; } - + this.startBatch('port-remove'); + options.rewrite = true; + this.prop(['ports', 'items'], newPorts, options); + this.stopBatch('port-remove'); return this; }, @@ -13919,7 +13958,7 @@ var joint = (function (exports, Backbone, _, $) { var endDef = link.get(endType); if (!endDef) { return center; } var portId = endDef.port; - if (!portId) { return center; } + if (!portId || !this.hasPort(portId)) { return center; } var portGroup = this.portProp(portId, ['group']); var portsPositions = this.getPortsPositions(portGroup); var portCenter = new Point(portsPositions[portId]).offset(bbox.origin()); @@ -15088,7 +15127,10 @@ var joint = (function (exports, Backbone, _, $) { children: null, childNodes: null, + DETACHABLE: true, UPDATE_PRIORITY: 2, + FLAG_INSERT: 1<<30, + FLAG_REMOVE: 1<<29, constructor: function(options) { @@ -15720,7 +15762,11 @@ var joint = (function (exports, Backbone, _, $) { return selector; }, - getLinkEnd: function(magnet, x, y, link, endType) { + getLinkEnd: function(magnet) { + var ref; + + var args = [], len = arguments.length - 1; + while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ]; var model = this.model; var id = model.id; @@ -15740,13 +15786,18 @@ var joint = (function (exports, Backbone, _, $) { end.selector = this.getSelector(magnet); } - var paper = this.paper; - var connectionStrategy = paper.options.connectionStrategy; + return (ref = this).customizeLinkEnd.apply(ref, [ end, magnet ].concat( args )); + }, + + customizeLinkEnd: function(end, magnet, x, y, link, endType) { + var ref = this; + var paper = ref.paper; + var ref$1 = paper.options; + var connectionStrategy = ref$1.connectionStrategy; if (typeof connectionStrategy === 'function') { var strategy = connectionStrategy.call(paper, end, this, magnet, new Point(x, y), link, endType, paper); - if (strategy) { end = strategy; } + if (strategy) { return strategy; } } - return end; }, @@ -16318,9 +16369,12 @@ var joint = (function (exports, Backbone, _, $) { pointerdown: function(evt, x, y) { - if (this.model.graph) { - this.model.startBatch('pointer'); - this._graph = this.model.graph; + var ref = this; + var model = ref.model; + var graph = model.graph; + if (graph) { + model.startBatch('pointer'); + this.eventData(evt, { graph: graph }); } this.notify('cell:pointerdown', evt, x, y); @@ -16333,13 +16387,15 @@ var joint = (function (exports, Backbone, _, $) { pointerup: function(evt, x, y) { + var ref = this.eventData(evt); + var graph = ref.graph; + this.notify('cell:pointerup', evt, x, y); - if (this._graph) { + if (graph) { // we don't want to trigger event on model as model doesn't // need to be member of collection anymore (remove) - this._graph.stopBatch('pointer', { cell: this.model }); - delete this._graph; + graph.stopBatch('pointer', { cell: this.model }); } }, @@ -19094,25 +19150,44 @@ var joint = (function (exports, Backbone, _, $) { var ref$1 = this; var model = ref$1.model; var attributes = model.attributes; + var updateLabels = this.hasFlag(flags, 'LABELS'); + var updateTools = this.hasFlag(flags, 'TOOLS'); + + if (updateLabels) { + this.onLabelsChange(model, attributes.labels, opt); + flags = this.removeFlag(flags, 'LABELS'); + } + + if (updateTools) { + this.renderTools(); + flags = this.removeFlag(flags, 'TOOLS'); + } if (this.hasFlag(flags, 'UPDATE')) { this.update(model, null, opt); flags = this.removeFlag(flags, 'UPDATE'); + updateLabels = false; + updateTools = false; } - if (this.hasFlag(flags, 'LABELS')) { - this.onLabelsChange(model, attributes.labels, opt); - flags = this.removeFlag(flags, 'LABELS'); + if (updateLabels) { + this.updateLabelPositions(); } - if (this.hasFlag(flags, 'TOOLS')) { - this.renderTools().updateToolsPosition(); - flags = this.removeFlag(flags, 'TOOLS'); + if (updateTools) { + this.updateToolsPosition(); } return flags; }, + requestConnectionUpdate: function(opt) { + var ref = this; + var paper = ref.paper; + var UPDATE_PRIORITY = ref.UPDATE_PRIORITY; + if (paper) { paper.requestViewUpdate(this, this.getFlag('UPDATE'), UPDATE_PRIORITY, opt); } + }, + isLabelsRenderRequired: function(opt) { if ( opt === void 0 ) opt = {}; @@ -19153,8 +19228,6 @@ var joint = (function (exports, Backbone, _, $) { } else { this.updateLabels(); } - - this.updateLabelPositions(); }, // Rendering. @@ -19580,6 +19653,17 @@ var joint = (function (exports, Backbone, _, $) { } }, + getEndConnectionPoint: function(type) { + switch (type) { + case 'source': + return new Point(this.sourcePoint); + case 'target': + return new Point(this.targetPoint); + default: + throw new Error('dia.LinkView: type parameter required.'); + } + }, + getEndMagnet: function(type) { switch (type) { case 'source': @@ -19892,11 +19976,13 @@ var joint = (function (exports, Backbone, _, $) { var defaultPosition = merge({}, builtinDefaultLabelPosition, defaultLabelPosition); for (var idx = 0, n = labels.length; idx < n; idx++) { + var labelNode = this._labelCache[idx]; + if (!labelNode) { continue; } var label = labels[idx]; var labelPosition = this._normalizeLabelPosition(label.position); var position = merge({}, defaultPosition, labelPosition); var transformationMatrix = this._getLabelTransformationMatrix(position); - this._labelCache[idx].setAttribute('transform', V.matrixToTransformString(transformationMatrix)); + labelNode.setAttribute('transform', V.matrixToTransformString(transformationMatrix)); } return this; @@ -20711,6 +20797,7 @@ var joint = (function (exports, Backbone, _, $) { } this.notifyPointerdown(evt, x, y); + this.paper.delegateDragEvents(this, evt.data); } else { CellView.prototype.onevent.apply(this, arguments); @@ -20831,15 +20918,13 @@ var joint = (function (exports, Backbone, _, $) { dragArrowhead: function(evt, x, y) { - var data = this.eventData(evt); - if (this.paper.options.snapLinks) { - this._snapArrowhead(x, y, data); + this._snapArrowhead(evt, x, y); } else { - this._connectArrowhead(this.getEventTarget(evt), x, y, data); + this._connectArrowhead(this.getEventTarget(evt), x, y, this.eventData(evt)); } }, @@ -20930,8 +21015,9 @@ var joint = (function (exports, Backbone, _, $) { } }, - _snapArrowhead: function(x, y, data) { + _snapArrowhead: function(evt, x, y) { + var data = this.eventData(evt); // checking view in close area of the pointer var r = this.paper.options.snapLinks.radius || 50; @@ -20942,53 +21028,43 @@ var joint = (function (exports, Backbone, _, $) { data.closestView = data.closestMagnet = null; - var distance; var minDistance = Number.MAX_VALUE; - var pointer = Point(x, y); + var pointer = new Point(x, y); var paper = this.paper; viewsInArea.forEach(function(view) { - + var candidates = []; // skip connecting to the element in case '.': { magnet: false } attribute present if (view.el.getAttribute('magnet') !== 'false') { - - // find distance from the center of the model to pointer coordinates - distance = view.model.getBBox().center().distance(pointer); - - // the connection is looked up in a circle area by `distance < r` - if (distance < r && distance < minDistance) { - - if (prevClosestMagnet === view.el || paper.options.validateConnection.apply( - paper, data.validateConnectionArgs(view, null) - )) { - minDistance = distance; - data.closestView = view; - data.closestMagnet = view.el; - } - } + candidates.push({ + bbox: view.model.getBBox(), + magnet: view.el + }); } - view.$('[magnet]').each(function(index, magnet) { - - var bbox = view.getNodeBBox(magnet); - - distance = pointer.distance({ - x: bbox.x + bbox.width / 2, - y: bbox.y + bbox.height / 2 + view.$('[magnet]').toArray().forEach(function (magnet) { + candidates.push({ + bbox: view.getNodeBBox(magnet), + magnet: magnet }); + }); - if (distance < r && distance < minDistance) { - - if (prevClosestMagnet === magnet || paper.options.validateConnection.apply( - paper, data.validateConnectionArgs(view, magnet) + candidates.forEach(function (candidate) { + var magnet = candidate.magnet; + var bbox = candidate.bbox; + // find distance from the center of the model to pointer coordinates + var distance = bbox.center().squaredDistance(pointer); + // the connection is looked up in a circle area by `distance < r` + if (distance < minDistance) { + if (prevClosestMagnet === view.el || paper.options.validateConnection.apply( + paper, data.validateConnectionArgs(view, (view.el === magnet) ? null : magnet) )) { minDistance = distance; data.closestView = view; data.closestMagnet = magnet; } } - - }.bind(this)); + }); }, this); @@ -21015,10 +21091,19 @@ var joint = (function (exports, Backbone, _, $) { end = closestView.getLinkEnd(closestMagnet, x, y, this.model, endType); } else { + + end = { x: x, y: y }; } this.model.set(endType, end || { x: x, y: y }, { ui: true }); + + if (prevClosestView) { + this.notify('link:snap:disconnect', evt, prevClosestView, prevClosestMagnet, endType); + } + if (closestView) { + this.notify('link:snap:connect', evt, closestView, closestMagnet, endType); + } }, _snapArrowheadEnd: function(data) { @@ -21553,8 +21638,20 @@ var joint = (function (exports, Backbone, _, $) { connectionClosest: connectionClosest }); - function offset(p1, p2, offset) { - + function offsetPoint(p1, p2, offset) { + if (isPlainObject(offset)) { + var x = offset.x; + var y = offset.y; + if (isFinite(y)) { + var line = new Line(p2, p1); + var ref = line.parallel(y); + var start = ref.start; + var end = ref.end; + p2 = start; + p1 = end; + } + offset = x; + } if (!isFinite(offset)) { return p1; } var length = p1.distance(p2); if (offset === 0 && length > 0) { return p1; } @@ -21568,11 +21665,59 @@ var joint = (function (exports, Backbone, _, $) { return parseFloat(stroke) || 0; } - // Connection Points + function alignLine(line, type, offset) { + if ( offset === void 0 ) offset = 0; - function anchorIntersection(line, view, magnet, opt) { + var coordinate, a, b, direction; + var start = line.start; + var end = line.end; + switch (type) { + case 'left': + coordinate = 'x'; + a = end; + b = start; + direction = -1; + break; + case 'right': + coordinate = 'x'; + a = start; + b = end; + direction = 1; + break; + case 'top': + coordinate = 'y'; + a = end; + b = start; + direction = -1; + break; + case 'bottom': + coordinate = 'y'; + a = start; + b = end; + direction = 1; + break; + default: + return; + } + if (start[coordinate] < end[coordinate]) { + a[coordinate] = b[coordinate]; + } else { + b[coordinate] = a[coordinate]; + } + if (isFinite(offset)) { + a[coordinate] += direction * offset; + b[coordinate] += direction * offset; + } + } + + // Connection Points - return offset(line.end, line.start, opt.offset); + function anchorConnectionPoint(line, _view, _magnet, opt) { + var offset = opt.offset; + var alignOffset = opt.alignOffset; + var align = opt.align; + if (align) { alignLine(line, align, alignOffset); } + return offsetPoint(line.end, line.start, offset); } function bboxIntersection(line, view, magnet, opt) { @@ -21583,7 +21728,7 @@ var joint = (function (exports, Backbone, _, $) { var cp = (intersections) ? line.start.chooseClosest(intersections) : line.end; - return offset(cp, line.start, opt.offset); + return offsetPoint(cp, line.start, opt.offset); } function rectangleIntersection(line, view, magnet, opt) { @@ -21601,7 +21746,7 @@ var joint = (function (exports, Backbone, _, $) { var cp = (intersections) ? lineWORotation.start.chooseClosest(intersections).rotate(center, -angle) : line.end; - return offset(cp, line.start, opt.offset); + return offsetPoint(cp, line.start, opt.offset); } function findShapeNode(magnet) { @@ -21690,10 +21835,10 @@ var joint = (function (exports, Backbone, _, $) { var cpOffset = opt.offset || 0; if (opt.stroke) { cpOffset += stroke$1(node) / 2; } - return offset(cp, line.start, cpOffset); + return offsetPoint(cp, line.start, cpOffset); } - var anchor = anchorIntersection; + var anchor = anchorConnectionPoint; var bbox = bboxIntersection; var rectangle = rectangleIntersection; var boundary = boundaryIntersection; @@ -21845,12 +21990,30 @@ var joint = (function (exports, Backbone, _, $) { EXACT: 'sorting-exact' }; - var FLAG_INSERT = 1<<30; - var FLAG_REMOVE = 1<<29; - var MOUNT_BATCH_SIZE = 1000; var UPDATE_BATCH_SIZE = Infinity; - var MIN_PRIORITY = 2; + var MIN_PRIORITY = 9007199254740991; // Number.MAX_SAFE_INTEGER + + var defaultHighlighting = { + 'default': { + name: 'stroke', + options: { + padding: 3 + } + }, + magnetAvailability: { + name: 'addClass', + options: { + className: 'available-magnet' + } + }, + elementAvailability: { + name: 'addClass', + options: { + className: 'available-cell' + } + } + }; var Paper = View.extend({ @@ -21886,26 +22049,7 @@ var joint = (function (exports, Backbone, _, $) { return false; }, - highlighting: { - 'default': { - name: 'stroke', - options: { - padding: 3 - } - }, - magnetAvailability: { - name: 'addClass', - options: { - className: 'available-magnet' - } - }, - elementAvailability: { - name: 'addClass', - options: { - className: 'available-cell' - } - } - }, + highlighting: defaultHighlighting, // Prevent the default context menu from being displayed. preventContextMenu: true, @@ -21961,7 +22105,7 @@ var joint = (function (exports, Backbone, _, $) { // Check whether to allow or disallow the link connection while an arrowhead end (source/target) // being changed. - validateConnection: function(cellViewS, magnetS, cellViewT, magnetT, end, linkView) { + validateConnection: function(cellViewS, _magnetS, cellViewT, _magnetT, end, _linkView) { return (end === 'target' ? cellViewT : cellViewS) instanceof ElementView; }, @@ -22016,15 +22160,21 @@ var joint = (function (exports, Backbone, _, $) { frozen: false, - onViewUpdate: function(view, flag, opt, paper) { - if ((flag & FLAG_INSERT) || opt.mounting) { return; } - paper.requestConnectedLinksUpdate(view, opt); + // no docs yet + onViewUpdate: function(view, flag, priority, opt, paper) { + if ((flag & view.FLAG_INSERT) || opt.mounting) { return; } + paper.requestConnectedLinksUpdate(view, priority, opt); }, - onViewPostponed: function(view, flag /* paper */) { - return this.forcePostponedViewUpdate(view, flag); + // no docs yet + onViewPostponed: function(view, flag, paper) { + return paper.forcePostponedViewUpdate(view, flag); }, + beforeRender: null, // function(opt, paper) { }, + + afterRender: null, // function(stats, opt, paper) { + viewport: null, // Default namespaces @@ -22171,14 +22321,14 @@ var joint = (function (exports, Backbone, _, $) { onCellRemoved: function(cell, _, opt) { var view = this.findViewByModel(cell); - if (view) { this.requestViewUpdate(view, FLAG_REMOVE, view.UPDATE_PRIORITY, opt); } + if (view) { this.requestViewUpdate(view, view.FLAG_REMOVE, view.UPDATE_PRIORITY, opt); } }, onCellChange: function(cell, opt) { if (cell === this.model.attributes.cells) { return; } if (cell.hasChanged('z') && this.options.sorting === sortingTypes.APPROX) { var view = this.findViewByModel(cell); - if (view) { this.requestViewUpdate(view, FLAG_INSERT, view.UPDATE_PRIORITY, opt); } + if (view) { this.requestViewUpdate(view, view.FLAG_INSERT, view.UPDATE_PRIORITY, opt); } } }, @@ -22210,26 +22360,48 @@ var joint = (function (exports, Backbone, _, $) { cloneOptions: function() { - var options = this.options; - - // This is a fix for the case where two papers share the same options. - // Changing origin.x for one paper would change the value of origin.x for the other. - // This prevents that behavior. - options.origin = assign({}, options.origin); - options.defaultConnector = assign({}, options.defaultConnector); - // Return the default highlighting options into the user specified options. - options.highlighting = defaultsDeep( - {}, - options.highlighting, - this.constructor.prototype.options.highlighting - ); + var ref = this; + var options = ref.options; + var defaultConnector = options.defaultConnector; + var defaultRouter = options.defaultRouter; + var defaultConnectionPoint = options.defaultConnectionPoint; + var defaultAnchor = options.defaultAnchor; + var defaultLinkAnchor = options.defaultLinkAnchor; + var origin = options.origin; + var highlighting = options.highlighting; + var cellViewNamespace = options.cellViewNamespace; + var interactive = options.interactive; // Default cellView namespace for ES5 /* global joint: true */ - if (!options.cellViewNamespace && typeof joint !== 'undefined' && has(joint, 'shapes')) { + if (!cellViewNamespace && typeof joint !== 'undefined' && has(joint, 'shapes')) { options.cellViewNamespace = joint.shapes; } /* global joint: false */ + + // Here if a function was provided, we can not clone it, as this would result in loosing the function. + // If the default is used, the cloning is necessary in order to prevent modifying the options on prototype. + if (!isFunction(defaultConnector)) { + options.defaultConnector = cloneDeep(defaultConnector); + } + if (!isFunction(defaultRouter)) { + options.defaultRouter = cloneDeep(defaultRouter); + } + if (!isFunction(defaultConnectionPoint)) { + options.defaultConnectionPoint = cloneDeep(defaultConnectionPoint); + } + if (!isFunction(defaultAnchor)) { + options.defaultAnchor = cloneDeep(defaultAnchor); + } + if (!isFunction(defaultLinkAnchor)) { + options.defaultLinkAnchor = cloneDeep(defaultLinkAnchor); + } + if (isPlainObject(interactive)) { + options.interactive = assign({}, interactive); + } + options.origin = assign({}, origin); + // Return the default highlighting options into the user specified options. + options.highlighting = defaultsDeep({}, highlighting, defaultHighlighting); }, children: function() { @@ -22367,7 +22539,7 @@ var joint = (function (exports, Backbone, _, $) { return V.createSVGMatrix(this.cells.getScreenCTM()); }, - requestConnectedLinksUpdate: function(view, opt) { + requestConnectedLinksUpdate: function(view, priority, opt) { if (view instanceof CellView) { var model = view.model; var links = this.model.getConnectedLinks(model); @@ -22378,7 +22550,8 @@ var joint = (function (exports, Backbone, _, $) { var flagLabels = ['UPDATE']; if (link.getTargetCell() === model) { flagLabels.push('TARGET'); } if (link.getSourceCell() === model) { flagLabels.push('SOURCE'); } - this.scheduleViewUpdate(linkView, linkView.getFlag(flagLabels), linkView.UPDATE_PRIORITY, opt); + var nextPriority = Math.max(priority + 1, linkView.UPDATE_PRIORITY); + this.scheduleViewUpdate(linkView, linkView.getFlag(flagLabels), nextPriority, opt); } } }, @@ -22403,7 +22576,8 @@ var joint = (function (exports, Backbone, _, $) { view.updateEndMagnet('target'); } if (sourceFlag === 0 && targetFlag === 0) { - return !!this.dumpView(view); + // If leftover flag is 0, all view updates were done. + return !this.dumpView(view); } } return false; @@ -22416,27 +22590,47 @@ var joint = (function (exports, Backbone, _, $) { if (this.isFrozen() || (isAsync && opt.async !== false)) { return; } if (this.model.hasActiveBatch(this.UPDATE_DELAYING_BATCHES)) { return; } var stats = this.updateViews(opt); - if (isAsync) { this.trigger('render:done', stats, opt); } + if (isAsync) { this.notifyAfterRender(stats, opt); } }, scheduleViewUpdate: function(view, type, priority, opt) { - var updates = this._updates; + var ref = this; + var updates = ref._updates; + var options = ref.options; + var FLAG_REMOVE = view.FLAG_REMOVE; + var FLAG_INSERT = view.FLAG_INSERT; + var UPDATE_PRIORITY = view.UPDATE_PRIORITY; + var cid = view.cid; var priorityUpdates = updates.priorities[priority]; if (!priorityUpdates) { priorityUpdates = updates.priorities[priority] = {}; } - var currentType = priorityUpdates[view.cid] || 0; - // prevent cycling + // Move higher priority updates to this priority + if (priority > UPDATE_PRIORITY) { + // Not the default priority for this view. It's most likely a link view + // connected to another link view, which triggered the update. + // TODO: If there is an update scheduled with a lower priority already, we should + // change the requested priority to the lowest one. Does not seem to be critical + // right now, as it "only" results in multiple updates on the same view. + for (var i = priority - 1; i >= UPDATE_PRIORITY; i--) { + var prevPriorityUpdates = updates.priorities[i]; + if (!prevPriorityUpdates || !(cid in prevPriorityUpdates)) { continue; } + priorityUpdates[cid] |= prevPriorityUpdates[cid]; + delete prevPriorityUpdates[cid]; + } + } + var currentType = priorityUpdates[cid] || 0; + // Prevent cycling if ((currentType & type) === type) { return; } if (!currentType) { updates.count++; } if (type & FLAG_REMOVE && currentType & FLAG_INSERT) { // When a view is removed we need to remove the insert flag as this is a reinsert - priorityUpdates[view.cid] ^= FLAG_INSERT; + priorityUpdates[cid] ^= FLAG_INSERT; } else if (type & FLAG_INSERT && currentType & FLAG_REMOVE) { // When a view is added we need to remove the remove flag as this is view was previously removed - priorityUpdates[view.cid] ^= FLAG_REMOVE; + priorityUpdates[cid] ^= FLAG_REMOVE; } - priorityUpdates[view.cid] |= type; - var viewUpdateFn = this.options.onViewUpdate; - if (typeof viewUpdateFn === 'function') { viewUpdateFn.call(this, view, type, opt || {}, this); } + priorityUpdates[cid] |= type; + var viewUpdateFn = options.onViewUpdate; + if (typeof viewUpdateFn === 'function') { viewUpdateFn.call(this, view, type, priority, opt || {}, this); } }, dumpViewUpdate: function(view) { @@ -22457,9 +22651,12 @@ var joint = (function (exports, Backbone, _, $) { updateView: function(view, flag, opt) { if (!view) { return 0; } + var FLAG_REMOVE = view.FLAG_REMOVE; + var FLAG_INSERT = view.FLAG_INSERT; + var model = view.model; if (view instanceof CellView) { if (flag & FLAG_REMOVE) { - this.removeView(view.model); + this.removeView(model); return 0; } if (flag & FLAG_INSERT) { @@ -22482,7 +22679,7 @@ var joint = (function (exports, Backbone, _, $) { var cid = view.cid; var updates = this._updates; if (cid in updates.unmounted) { return 0; } - var flag = updates.unmounted[cid] |= FLAG_INSERT; + var flag = updates.unmounted[cid] |= view.FLAG_INSERT; updates.unmountedCids.push(cid); delete updates.mounted[cid]; return flag; @@ -22512,18 +22709,33 @@ var joint = (function (exports, Backbone, _, $) { this.updateViews(passingOpt); }, + // Synchronous views update updateViews: function(opt) { - var stats; + this.notifyBeforeRender(opt); + var batchStats; var updateCount = 0; var batchCount = 0; var priority = MIN_PRIORITY; do { batchCount++; - stats = this.updateViewsBatch(opt); - updateCount += stats.updated; - priority = Math.min(stats.priority, priority); - } while (!stats.empty); - return { updated: updateCount, batches: batchCount, priority: priority }; + batchStats = this.updateViewsBatch(opt); + updateCount += batchStats.updated; + priority = Math.min(batchStats.priority, priority); + } while (!batchStats.empty); + var stats = { updated: updateCount, batches: batchCount, priority: priority }; + this.notifyAfterRender(stats, opt); + return stats; + }, + + hasScheduledUpdates: function() { + var priorities = this._updates.priorities; + var priorityIndexes = Object.keys(priorities); // convert priorities to a dense array + var i = priorityIndexes.length; + while (i > 0 && i--) { + // a faster way how to check if an object is empty + for (var _key in priorities[priorityIndexes[i]]) { return true; } + } + return false; }, updateViewsAsync: function(opt, data) { @@ -22533,6 +22745,9 @@ var joint = (function (exports, Backbone, _, $) { var id = updates.id; if (id) { cancelFrame(id); + if (data.processed === 0 && this.hasScheduledUpdates()) { + this.notifyBeforeRender(opt); + } var stats = this.updateViewsBatch(opt); var passingOpt = defaults({}, opt, { mountBatchSize: MOUNT_BATCH_SIZE - stats.mounted, @@ -22552,7 +22767,7 @@ var joint = (function (exports, Backbone, _, $) { stats.unmounted += unmountCount; stats.mounted += mountCount; stats.priority = data.priority; - this.trigger('render:done', stats, opt); + this.notifyAfterRender(stats, opt); data.processed = 0; updates.count = 0; } else { @@ -22570,6 +22785,30 @@ var joint = (function (exports, Backbone, _, $) { updates.id = nextFrame(this.updateViewsAsync, this, opt, data); }, + notifyBeforeRender: function(opt) { + if ( opt === void 0 ) opt = {}; + + var beforeFn = opt.beforeRender; + if (typeof beforeFn !== 'function') { + beforeFn = this.options.beforeRender; + if (typeof beforeFn !== 'function') { return; } + } + beforeFn.call(this, opt, this); + }, + + notifyAfterRender: function(stats, opt) { + if ( opt === void 0 ) opt = {}; + + var afterFn = opt.afterRender; + if (typeof afterFn !== 'function') { + afterFn = this.options.afterRender; + } + if (typeof afterFn === 'function') { + afterFn.call(this, stats, opt, this); + } + this.trigger('render:done', stats, opt); + }, + updateViewsBatch: function(opt) { opt || (opt = {}); var batchSize = opt.batchSize || UPDATE_BATCH_SIZE; @@ -22586,7 +22825,9 @@ var joint = (function (exports, Backbone, _, $) { if (typeof viewportFn !== 'function') { viewportFn = null; } var postponeViewFn = options.onViewPostponed; if (typeof postponeViewFn !== 'function') { postponeViewFn = null; } - main: for (var priority = 0, n = priorities.length; priority < n; priority++) { + var priorityIndexes = Object.keys(priorities); // convert priorities to a dense array + main: for (var i = 0, n = priorityIndexes.length; i < n; i++) { + var priority = priorityIndexes[i]; var priorityUpdates = priorities[priority]; for (var cid in priorityUpdates) { if (updateCount >= batchSize) { @@ -22600,10 +22841,10 @@ var joint = (function (exports, Backbone, _, $) { continue; } var currentFlag = priorityUpdates[cid]; - if ((currentFlag & FLAG_REMOVE) === 0) { + if ((currentFlag & view.FLAG_REMOVE) === 0) { // We should never check a view for viewport if we are about to remove the view var isDetached = cid in updates.unmounted; - if (viewportFn && !viewportFn.call(this, view, isDetached, this)) { + if (view.DETACHABLE && viewportFn && !viewportFn.call(this, view, !isDetached, this)) { // Unmount View if (!isDetached) { this.registerUnmountedView(view); @@ -22616,7 +22857,7 @@ var joint = (function (exports, Backbone, _, $) { } // Mount View if (isDetached) { - currentFlag |= FLAG_INSERT; + currentFlag |= view.FLAG_INSERT; mountCount++; } currentFlag |= this.registerMountedView(view); @@ -22681,7 +22922,7 @@ var joint = (function (exports, Backbone, _, $) { if (!(cid in unmounted)) { continue; } var view = views[cid]; if (!view) { continue; } - if (viewportFn && !viewportFn.call(this, view, false, this)) { + if (view.DETACHABLE && viewportFn && !viewportFn.call(this, view, false, this)) { // Push at the end of all unmounted ids, so this can be check later again unmountedCids.push(cid); continue; @@ -22708,7 +22949,7 @@ var joint = (function (exports, Backbone, _, $) { if (!(cid in mounted)) { continue; } var view = views[cid]; if (!view) { continue; } - if (viewportFn.call(this, view, true, this)) { + if (!view.DETACHABLE || viewportFn.call(this, view, true, this)) { // Push at the end of all mounted ids, so this can be check later again mountedCids.push(cid); continue; @@ -22943,7 +23184,7 @@ var joint = (function (exports, Backbone, _, $) { //fittingBBox }); - var padding = opt.padding; + var padding = normalizeSides(opt.padding); var minScaleX = opt.minScaleX || opt.minScale; var maxScaleX = opt.maxScaleX || opt.maxScale; @@ -22964,7 +23205,12 @@ var joint = (function (exports, Backbone, _, $) { }; } - fittingBBox = new Rect(fittingBBox).inflate(-padding); + fittingBBox = new Rect(fittingBBox).moveAndExpand({ + x: padding.left, + y: padding.top, + width: -padding.left - padding.right, + height: -padding.top - padding.bottom + }); var currentScale = this.scale(); @@ -23012,7 +23258,7 @@ var joint = (function (exports, Backbone, _, $) { return this.localToPaperRect(this.getContentArea(opt)); }, - // Returns a geometry rectangle represeting the entire + // Returns a geometry rectangle representing the entire // paper area (coordinates from the left paper border to the right one // and the top border to the bottom one). getArea: function() { @@ -23103,7 +23349,7 @@ var joint = (function (exports, Backbone, _, $) { var view, flag; if (id in views) { view = views[id]; - flag = FLAG_INSERT; + flag = view.FLAG_INSERT; } else { view = views[cell.id] = this.createViewForModel(cell); view.paper = this; @@ -24185,7 +24431,7 @@ var joint = (function (exports, Backbone, _, $) { backgroundSize.width *= canvas.width / img.width; backgroundSize.height *= canvas.height / img.height; } else if (backgroundSize === undefined) { - // calcule the tile size if no provided + // calculate the tile size if no provided opt.size = { width: canvas.width / backgroundQuality, height: canvas.height / backgroundQuality @@ -24742,12 +24988,12 @@ var joint = (function (exports, Backbone, _, $) { var index$2 = ({ - ElementView: ElementView, Graph: Graph, + attributes: attributes, Cell: Cell, CellView: CellView, Element: Element$1, - attributes: attributes, + ElementView: ElementView, Link: Link, LinkView: LinkView, Paper: Paper, @@ -27788,7 +28034,8 @@ var joint = (function (exports, Backbone, _, $) { redundancyRemoval: true, anchor: getAnchor, snapRadius: 10, - snapHandle: true + snapHandle: true, + stopPropagation: true }, handles: null, onRender: function() { @@ -27877,6 +28124,8 @@ var joint = (function (exports, Backbone, _, $) { onHandleChanging: function(handle, evt) { + var ref = this; + var options = ref.options; var data = this.eventData(evt); var relatedView = this.relatedView; var paper = relatedView.paper; @@ -27976,34 +28225,46 @@ var joint = (function (exports, Backbone, _, $) { link.vertices(vertices, { ui: true, tool: this.cid }); this.updateHandle(handle, vertex, nextVertex, offset); + if (!options.stopPropagation) { relatedView.notifyPointermove(normalizedEvent, coords.x, coords.y); } }, onHandleChangeStart: function(handle, evt) { + var ref = this; + var options = ref.options; + var handles = ref.handles; + var linkView = ref.relatedView; + var model = linkView.model; + var paper = linkView.paper; var index$1 = handle.options.index; - var handles = this.handles; if (!Array.isArray(handles)) { return; } for (var i = 0, n = handles.length; i < n; i++) { if (i !== index$1) { handles[i].hide(); } } this.focus(); - var relatedView = this.relatedView; - var relatedModel = relatedView.model; this.eventData(evt, { - sourceAnchor: relatedView.sourceAnchor.clone(), - targetAnchor: relatedView.targetAnchor.clone(), - sourceAnchorDef: clone(relatedModel.prop(['source', 'anchor'])), - targetAnchorDef: clone(relatedModel.prop(['target', 'anchor'])) + sourceAnchor: linkView.sourceAnchor.clone(), + targetAnchor: linkView.targetAnchor.clone(), + sourceAnchorDef: clone(model.prop(['source', 'anchor'])), + targetAnchorDef: clone(model.prop(['target', 'anchor'])) }); - relatedView.model.startBatch('segment-move', { ui: true, tool: this.cid }); + model.startBatch('segment-move', { ui: true, tool: this.cid }); + if (!options.stopPropagation) { linkView.notifyPointerdown.apply(linkView, paper.getPointerArgs(evt)); } }, onHandleChangeEnd: function(_handle, evt) { - var linkView = this.relatedView; - if (this.options.redundancyRemoval) { + var ref= this; + var options = ref.options; + var linkView = ref.relatedView; + var paper = linkView.paper; + var model = linkView.model; + if (options.redundancyRemoval) { linkView.removeRedundantLinearVertices({ ui: true, tool: this.cid }); } + var normalizedEvent = normalizeEvent(evt); + var coords = paper.snapToGrid(normalizedEvent.clientX, normalizedEvent.clientY); this.render(); this.blur(); - linkView.model.stopBatch('segment-move', { ui: true, tool: this.cid }); - linkView.checkMouseleave(normalizeEvent(evt)); + model.stopBatch('segment-move', { ui: true, tool: this.cid }); + if (!options.stopPropagation) { linkView.notifyPointerup(normalizedEvent, coords.x, coords.y); } + linkView.checkMouseleave(normalizedEvent); }, updateHandle: function(handle, vertex, nextVertex, offset) { var vertical = Math.abs(vertex.x - nextVertex.x) < this.precision; @@ -28332,6 +28593,7 @@ var joint = (function (exports, Backbone, _, $) { options: { snap: snapAnchor, anchor: getAnchor, + resetAnchor: true, customAnchorAttributes: { 'stroke-width': 4, 'stroke': '#33334F', @@ -28496,7 +28758,10 @@ var joint = (function (exports, Backbone, _, $) { }, onPointerDblClick: function() { - this.resetAnchor(); + var anchor = this.options.resetAnchor; + if (anchor === false) { return; } // reset anchor disabled + if (anchor === true) { anchor = null; } // remove the current anchor + this.resetAnchor(cloneDeep(anchor)); this.update(); } }); @@ -28531,7 +28796,7 @@ var joint = (function (exports, Backbone, _, $) { Boundary: Boundary }); - var version = "3.1.1"; + var version = "3.2.0"; var Vectorizer = V; var layout = { PortLabel: PortLabel, Port: Port }; diff --git a/dist/joint.nowrap.min.js b/dist/joint.nowrap.min.js index 370069d29..d4e7e7308 100644 --- a/dist/joint.nowrap.min.js +++ b/dist/joint.nowrap.min.js @@ -1,8 +1,8 @@ -/*! JointJS v3.1.1 (2019-10-28) - JavaScript diagramming library +/*! JointJS v3.2.0 (2020-06-04) - JavaScript diagramming library This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -var joint=function(e,s,i,S){"use strict";var n,l,r,c;s=s&&s.hasOwnProperty("default")?s.default:s,i=i&&i.hasOwnProperty("default")?i.default:i,S=S&&S.hasOwnProperty("default")?S.default:S,Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(t,e){if(null==this)throw new TypeError('"this" is null or not defined');var i=Object(this),n=i.length>>>0;if(0===n)return!1;var r,o,s=0|e,a=Math.max(0<=s?s:n-Math.abs(s),0);for(;a>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var n=arguments[1],r=0;r>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var n=arguments[1],r=0;r>8-r%1*8)){if(255<(i=n.charCodeAt(r+=.75)))throw new l("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");e=e<<8|i}return s}),t.atob||(t.atob=function(t){var e=String(t).replace(/=+$/,"");if(e.length%4==1)throw new l("'atob' failed: The string to be decoded is not correctly encoded.");for(var i,n,r=0,o=0,s="";n=e.charAt(o++);~n&&(i=r%4?64*i+n:n,r++%4)?s+=String.fromCharCode(255&i>>(-2*r&6)):0)n=a.indexOf(n);return s})}(),Number.isFinite=Number.isFinite||function(t){return"number"==typeof t&&isFinite(t)},Number.isNaN=Number.isNaN||function(t){return t!=t},String.prototype.includes||(String.prototype.includes=function(t,e){return"number"!=typeof e&&(e=0),!(e+t.length>this.length)&&-1!==this.indexOf(t,e)}),String.prototype.startsWith||(String.prototype.startsWith=function(t,e){return this.substr(e||0,t.length)===t}),function(){function n(t,e){return this.slice(t,e)}function r(t,e){arguments.length<2&&(e=0);for(var i=0,n=t.length;ia.x+o/2,h=na.x?r-30:r+30)-c)/(s*s*(n-l))+l:e=s*s/(r-c)-s*s*(n-l)*((i=r>a.y?n+30:n-30)-l)/(o*o*(r-c))+c,new E(i,e).theta(t)},toString:function(){return new E(this.x,this.y).toString()+" "+this.a+" "+this.b}};var B=function(t,e){return this instanceof B?t instanceof B?new B(t.start,t.end):(this.start=new E(t),void(this.end=new E(e))):new B(t,e)};B.prototype={angle:function(){var t=new E(this.start.x+1,this.start.y);return this.start.angleBetween(this.end,t)},bbox:function(){var t=P(this.start.x,this.end.x),e=P(this.start.y,this.end.y),i=G(this.start.x,this.end.x),n=G(this.start.y,this.end.y);return new H(t,e,i-t,n-e)},bearing:function(){var t=y(this.start.y),e=y(this.end.y),i=this.start.x,n=this.end.x,r=y(n-i),o=h(r)*g(e),s=g(t)*h(e)-h(t)*g(e)*g(r),a=A(u(o,s))-22.5;return a<0&&(a+=360),["NE","E","SE","S","SW","W","NW","N"][a=parseInt(a/45)]},clone:function(){return new B(this.start,this.end)},closestPoint:function(t){return this.pointAt(this.closestPointNormalizedLength(t))},closestPointLength:function(t){return this.closestPointNormalizedLength(t)*this.length()},closestPointNormalizedLength:function(t){var e=this.vector().dot(new B(this.start,t).vector()),i=P(1,G(0,e/this.squaredLength()));return i!=i?0:i},closestPointTangent:function(t){return this.tangentAt(this.closestPointNormalizedLength(t))},containsPoint:function(t){var e=this.start,i=this.end;if(0!==e.cross(t,i))return!1;var n=this.length();return!(new B(e,t).length()>n)&&!(new B(t,i).length()>n)},divideAt:function(t){var e=this.pointAt(t);return[new B(this.start,e),new B(e,this.end)]},divideAtLength:function(t){var e=this.pointAtLength(t);return[new B(this.start,e),new B(e,this.end)]},equals:function(t){return!!t&&this.start.x===t.start.x&&this.start.y===t.start.y&&this.end.x===t.end.x&&this.end.y===t.end.y},intersect:function(t,e){if(t instanceof B||t instanceof H||t instanceof D||t instanceof w||t instanceof O){var i=t.intersectionWithLine(this,e);return i&&t instanceof B&&(i=i[0]),i}return null},intersectionWithLine:function(t){var e=new E(this.end.x-this.start.x,this.end.y-this.start.y),i=new E(t.end.x-t.start.x,t.end.y-t.start.y),n=e.x*i.y-e.y*i.x,r=new E(t.start.x-this.start.x,t.start.y-this.start.y),o=r.x*i.y-r.y*i.x,s=r.x*e.y-r.y*e.x;if(0===n||o*n<0||s*n<0)return null;if(0c.y||r>l.y&&r<=c.y){var h=l.x-n>c.x-n?l.x-n:c.x-n;if(0<=h){var u=new E(n+h,r),d=new B(t,u);g.intersect(d)&&a++}}o=s}return a%2==1},convexHull:function(){var t,e,i,n=this.points,r=n.length;if(0===r)return new D;for(t=0;ti.x&&(i=n[t]);var o=[];for(t=0;t=this.x&&t.x<=this.x+this.width&&t.y>=this.y&&t.y<=this.y+this.height},containsRect:function(t){var e=new H(this).normalize(),i=new H(t).normalize(),n=e.width,r=e.height,o=i.width,s=i.height;if(!(n&&r&&o&&s))return!1;var a=e.x,l=e.y,c=i.x,g=i.y;return o+=c,n+=a,s+=g,r+=l,a<=c&&o<=n&&l<=g&&s<=r},corner:function(){return new E(this.x+this.width,this.y+this.height)},equals:function(t){var e=new H(this).normalize(),i=new H(t).normalize();return e.x===i.x&&e.y===i.y&&e.width===i.width&&e.height===i.height},inflate:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.x-=t,this.y-=e,this.width+=2*t,this.height+=2*e,this},intersect:function(t){var e=this.origin(),i=this.corner(),n=t.origin(),r=t.corner();if(r.x<=e.x||r.y<=e.y||n.x>=i.x||n.y>=i.y)return null;var o=G(e.x,n.x),s=G(e.y,n.y);return new H(o,s,P(i.x,r.x)-o,P(i.y,r.y)-s)},intersectionWithLine:function(t){var e,i,n=[this.topLine(),this.rightLine(),this.bottomLine(),this.leftLine()],r=[],o=[],s=n.length;for(i=0;ig&&(n=(this.x+this.width-g)/(d.x-g)),d.y>h&&(a=(this.y+this.height-h)/(d.y-h));var f=t.topRight();f.x>g&&(r=(this.x+this.width-g)/(f.x-g)),f.yh&&(c=(this.y+this.height-h)/(p.y-h)),{sx:P(i,n,r,o),sy:P(s,a,l,c)}},maxRectUniformScaleToFit:function(t,e){var i=this.maxRectScaleToFit(t,e);return P(i.sx,i.sy)},moveAndExpand:function(t){return this.x+=t.x||0,this.y+=t.y||0,this.width+=t.width||0,this.height+=t.height||0,this},normalize:function(){var t=this.x,e=this.y,i=this.width,n=this.height;return this.width<0&&(t=this.x+this.width,i=-this.width),this.height<0&&(e=this.y+this.height,n=-this.height),this.x=t,this.y=e,this.width=i,this.height=n,this},offset:function(t,e){return E.prototype.offset.call(this,t,e)},origin:function(){return new E(this.x,this.y)},pointNearestToPoint:function(t){if(t=new E(t),this.containsPoint(t))switch(this.sideNearestToPoint(t)){case"right":return new E(this.x+this.width,t.y);case"left":return new E(this.x,t.y);case"bottom":return new E(t.x,this.y+this.height);case"top":return new E(t.x,this.y)}return t.adhereToRect(this)},rightLine:function(){return new B(this.topRight(),this.bottomRight())},rightMiddle:function(){return new E(this.x+this.width,this.y+this.height/2)},round:function(t){var e=k(10,t||0);return this.x=a(this.x*e)/e,this.y=a(this.y*e)/e,this.width=a(this.width*e)/e,this.height=a(this.height*e)/e,this},scale:function(t,e,i){return i=this.origin().scale(t,e,i),this.x=i.x,this.y=i.y,this.width*=t,this.height*=e,this},sideNearestToPoint:function(t){var e=(t=new E(t)).x-this.x,i=this.x+this.width-t.x,n=t.y-this.y,r=e,o="left";return i'+t+"";return j.parseXML(e,{async:!1}).documentElement}var i=document.createElementNS(z.svg,"svg");return i.setAttributeNS(z.xmlns,"xmlns:xlink",z.xlink),i.setAttribute("version","1.1"),i},j.idCounter=0,j.uniqueId=function(){return"v-"+ ++j.idCounter},j.toNode=function(t){return j.isV(t)?t.node:t.nodeName&&t||t[0]},j.ensureId=function(t){return(t=j.toNode(t)).id||(t.id=j.uniqueId())},j.sanitizeText=function(t){return(t||"").replace(/ /g," ")},j.isUndefined=function(t){return void 0===t},j.isString=function(t){return"string"==typeof t},j.isObject=function(t){return t&&"object"==typeof t},j.isArray=Array.isArray,j.parseXML=function(t,e){var i;e=e||{};try{var n=new DOMParser;j.isUndefined(e.async)||(n.async=e.async),i=n.parseFromString(t,"text/xml")}catch(t){i=void 0}if(!i||i.getElementsByTagName("parsererror").length)throw new Error("Invalid XML: "+t);return i},j.qualifyAttr=function(t){if(-1===t.indexOf(":"))return{ns:null,local:t};var e=t.split(":");return{ns:z[e[0]],local:e[1]}},j.transformRegex=/(\w+)\(([^,)]+),?([^)]+)?\)/gi,j.transformSeparatorRegex=/[ ,]+/,j.transformationListRegex=/^(\w+)\((.*)\)/,j.transformStringToMatrix=function(t){var e=j.createSVGMatrix(),i=t&&t.match(j.transformRegex);if(!i)return e;for(var n=0,r=i.length;n=t.start&&et.start&&i<=t.end||t.start>=e&&t.end=e?t.end+=i:t.start>=e&&(t.start+=i,t.end+=i)}),t},j.convertLineToPathData=function(t){return["M",(t=j(t)).attr("x1"),t.attr("y1"),"L",t.attr("x2"),t.attr("y2")].join(" ")},j.convertPolygonToPathData=function(t){var e=j.getPointsFromSvgNode(t);return 0===e.length?null:j.svgPointsToPath(e)+" Z"},j.convertPolylineToPathData=function(t){var e=j.getPointsFromSvgNode(t);return 0===e.length?null:j.svgPointsToPath(e)},j.svgPointsToPath=function(t){for(var e=0,i=t.length;e=o[r]&&(s.push([e].concat(n.splice(0,o[r]))),o[r]););}),s}(t)),!t||!t.length)return[["M",0,0]];for(var e,i=[],n=0,r=0,o=0,s=0,a=t.length,l=0;lu){var x=N,S=l,k=c;f=t(l=w+n*V(N=b+u*(a&&bo){var D=Math.floor(o/u)-1;A.splice(D+1);var z=n.ellipsis;if(!z||D<0)break;"string"!=typeof z&&(z="…");var j,T,Z=A[D],L=Z.length;do{if(T=Z[L],j=Z.substring(0,L),T?T.match(d)&&(j+=T):j+="string"==typeof d?d:" ",j+=z,c.data=j,a.getComputedTextLength()<=r){A[D]=j;break}L--}while(0<=L);break}}}}return n.svgDocument?s.removeChild(l):document.body.removeChild(s),A.join(f)},mt=function(t){var e=S(S.parseHTML("
"+t+"
",null,!1));return e.find("*").each(function(){var i=this;S.each(i.attributes,function(){var t=this.name,e=this.value;0!==t.indexOf("on")&&0!==e.indexOf("javascript:")||S(i).removeAttr(t)})}),e.html()},At=function(t,e){if(window.navigator.msSaveBlob)window.navigator.msSaveBlob(t,e);else{var i=window.URL.createObjectURL(t),n=document.createElement("a");n.href=i,n.download=e,document.body.appendChild(n),n.click(),document.body.removeChild(n),window.URL.revokeObjectURL(i)}},vt=function(t){t=t.replace(/\s/g,"");var e,i=(t=decodeURIComponent(t)).indexOf(","),n=t.slice(0,i),r=n.split(":")[1].split(";")[0],o=t.slice(i+1);e=0<=n.indexOf("base64")?atob(o):unescape(encodeURIComponent(o));for(var s=new Uint8Array(e.length),a=0;a')({color:t.color||"blue",opacity:Number.isFinite(t.opacity)?t.opacity:1,outerRadius:e+i,innerRadius:e})},highlight:function(t){return xt('')({color:t.color||"red",width:Number.isFinite(t.width)?t.width:1,blur:Number.isFinite(t.blur)?t.blur:0,opacity:Number.isFinite(t.opacity)?t.opacity:1})},blur:function(t){var e=Number.isFinite(t.x)?t.x:2;return xt('')({stdDeviation:Number.isFinite(t.y)?[e,t.y]:e})},dropShadow:function(t){var e="SVGFEDropShadowElement"in window?'':'';return xt(e)({dx:t.dx||0,dy:t.dy||0,opacity:Number.isFinite(t.opacity)?t.opacity:1,color:t.color||"black",blur:Number.isFinite(t.blur)?t.blur:4})},grayscale:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({a:.2126+.7874*(1-e),b:.7152-.7152*(1-e),c:.0722-.0722*(1-e),d:.2126-.2126*(1-e),e:.7152+.2848*(1-e),f:.0722-.0722*(1-e),g:.2126-.2126*(1-e),h:.0722+.9278*(1-e)})},sepia:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({a:.393+.607*(1-e),b:.769-.769*(1-e),c:.189-.189*(1-e),d:.349-.349*(1-e),e:.686+.314*(1-e),f:.168-.168*(1-e),g:.272-.272*(1-e),h:.534-.534*(1-e),i:.131+.869*(1-e)})},saturate:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({amount:1-e})},hueRotate:function(t){return xt('')({angle:t.angle||0})},invert:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({amount:e,amount2:1-e})},brightness:function(t){return xt('')({amount:Number.isFinite(t.amount)?t.amount:1})},contrast:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({amount:e,amount2:.5-e/2})}},Mt={number:function(t,e,o){o=o||{currency:["$",""],decimal:".",thousands:",",grouping:[3]};var i=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i.exec(t),n=i[1]||" ",r=i[2]||">",s=i[3]||"",a=i[4]||"",l=i[5],c=+i[6],g=i[7],h=i[8],u=i[9],d=1,f="",p="",I=!1;switch(h&&(h=+h.substring(1)),(l||"0"===n&&"="===r)&&(l=n="0",r="=",g&&(c-=Math.floor((c-1)/4))),u){case"n":g=!0,u="g";break;case"%":d=100,p="%",u="f";break;case"p":d=100,p="%",u="r";break;case"b":case"o":case"x":case"X":"#"===a&&(f="0"+u.toLowerCase());break;case"c":case"d":I=!0,h=0;break;case"s":d=-1,u="r"}"$"===a&&(f=o.currency[0],p=o.currency[1]),"r"!=u||h||(u="g"),null!=h&&("g"==u?h=Math.max(1,Math.min(21,h)):"e"!=u&&"f"!=u||(h=Math.max(0,Math.min(20,h))));var m=l&&g;if(I&&e%1)return"";var A=e<0||0===e&&1/e<0?(e=-e,"-"):s,v=p;if(d<0){var C=this.prefix(e,h);e=C.scale(e),v=C.symbol+p}else e*=d;var w=(e=this.convert(u,e,h)).lastIndexOf("."),y=w<0?e:e.substring(0,w),b=w<0?"":o.decimal+e.substring(w+1);function N(t){for(var e=t.length,i=[],n=0,r=o.grouping[0];0"===r?x+A+e:"^"===r?x.substring(0,M>>=1)+A+e+x.substring(M):A+(m?e:x+e))+v},string:function(t,e){for(var i,n="{",r=!1,o=[];-1!==(i=t.indexOf(n));){var s,a,l;if(s=t.slice(0,i),r){l=(a=s.split(":")).shift().split("."),s=e;for(var c=0;c|\$\{ ?([^{} ]+) ?\}|\{\{([^{} ]+)\}\}/g;return function(n){return n=n||{},t.replace(e,function(t){for(var e=Array.from(arguments).slice(1,4).find(function(t){return!!t}).split("."),i=n[e.shift()];void 0!==i&&e.length;)i=i[e.shift()];return void 0!==i?i:""})}},St=i.assign,kt=i.defaults,Dt=St,zt=i.defaultsDeep,jt=i.assign,Tt=i.defaults,Zt=i.defaultsDeep,Lt=i.invokeMap||i.invoke,Pt=i.sortedIndexBy||i.sortedIndex,Gt=i.uniqBy||i.uniq,Bt=i.clone,Ot=i.cloneDeep,Et=i.isEmpty,Yt=i.isEqual,Rt=i.isFunction,Wt=i.isPlainObject,Ut=i.toArray,Xt=i.debounce,Vt=i.groupBy,Ft=i.sortBy,Jt=i.flattenDeep,Ht=i.without,Qt=i.difference,_t=i.intersection,Kt=i.union,qt=i.has,$t=i.result,te=i.omit,ee=i.pick,ie=i.bindAll,ne=i.forIn,re=i.camelCase,oe=i.uniqueId,se=function(){if(i.mergeWith){var t=Array.from(arguments),e=t[t.length-1],n=Rt(e)?e:he;return t.push(function(t,e){var i=n(t,e);return void 0!==i?i:Array.isArray(t)&&!Array.isArray(e)?e:void 0}),i.mergeWith.apply(this,t)}return i.merge.apply(this,arguments)},ae=function(t){var e=Object.prototype.toString;return!0===t||!1===t||!!t&&"object"==typeof t&&"[object Boolean]"===e.call(t)},le=function(t){return!!t&&("object"==typeof t||"function"==typeof t)},ce=function(t){var e=Object.prototype.toString;return"number"==typeof t||!!t&&"object"==typeof t&&"[object Number]"===e.call(t)},ge=function(t){var e=Object.prototype.toString;return"string"==typeof t||!!t&&"object"==typeof t&&"[object String]"===e.call(t)},he=function(){};function ue(t){t=Gt(t);var s=Ut(t).reduce(function(t,e){return t[e.id]=e.clone(),t},{});return Ut(t).forEach(function(t){var e=s[t.id];if(e.isLink()){var i=e.source(),n=e.target();i.id&&s[i.id]&&e.prop("source/id",s[i.id].id),n.id&&s[n.id]&&e.prop("target/id",s[n.id].id)}var r=t.get("parent");r&&s[r]&&e.set("parent",s[r].id);var o=Ut(t.get("embeds")).reduce(function(t,e){return s[e]&&t.push(s[e].id),t},[]);Et(o)||e.set("embeds",o)}),s}function de(o,s){return function(t,e){var i=ft(t);t=parseFloat(t),i&&(t/=100);var n={};if(isFinite(t)){var r=i||0<=t&&t<=1?t*e[s]:Math.max(t+e[s],0);n[o]=r}return n}}function fe(s,a,l){return function(t,e){var i,n=ft(t);if(t=parseFloat(t),n&&(t/=100),isFinite(t)){var r=e[l]();i=n||0e.width?be:Ne)(t,e)})},refRCircumscribed:{set:function(t,e){var i=ft(t);t=parseFloat(t),i&&(t/=100);var n,r=Math.sqrt(e.height*e.height+e.width*e.width);return isFinite(t)&&(n=i||0<=t&&t<=1?t*r:Math.max(t+r,0)),{r:n}}},refCx:{set:de("cx","width")},refCy:{set:de("cy","height")},xAlignment:{offset:pe("x","width","right")},yAlignment:{offset:pe("y","height","bottom")},resetOffset:{offset:function(t,e){return t?{x:-e.x,y:-e.y}:{x:0,y:0}}},refDResetOffset:{set:me({resetOffset:!0})},refDKeepOffset:{set:me({resetOffset:!1})},refPointsResetOffset:{set:Ae({resetOffset:!0})},refPointsKeepOffset:{set:Ae({resetOffset:!1})},connection:{qualify:we,set:function(t){var e,i=t.stubs;if(void 0===i&&(i=0),isFinite(i)&&0!==i){var n;n=i<0?(this.getConnectionLength()+i)/2:i;var r=this.getConnection(),o=r.divideAtLength(n),s=r.divideAtLength(-n);o&&s&&(e=o[0].serialize()+" "+s[1].serialize())}return{d:e||this.getSerializedConnection()}}},atConnectionLengthKeepGradient:{qualify:we,set:ve("getTangentAtLength",{rotate:!0})},atConnectionLengthIgnoreGradient:{qualify:we,set:ve("getTangentAtLength",{rotate:!1})},atConnectionRatioKeepGradient:{qualify:we,set:ve("getTangentAtRatio",{rotate:!0})},atConnectionRatioIgnoreGradient:{qualify:we,set:ve("getTangentAtRatio",{rotate:!1})}};Me.refR=Me.refRInscribed,Me.refD=Me.refDResetOffset,Me.refPoints=Me.refPointsResetOffset,Me.atConnectionLength=Me.atConnectionLengthKeepGradient,Me.atConnectionRatio=Me.atConnectionRatioKeepGradient,Me.refX2=Me.refX,Me.refY2=Me.refY,Me.refWidth2=Me.refWidth,Me.refHeight2=Me.refHeight,Me["ref-x"]=Me.refX,Me["ref-y"]=Me.refY,Me["ref-dy"]=Me.refDy,Me["ref-dx"]=Me.refDx,Me["ref-width"]=Me.refWidth,Me["ref-height"]=Me.refHeight,Me["x-alignment"]=Me.xAlignment,Me["y-alignment"]=Me.yAlignment;var xe=Me,Se=s.Model.extend({constructor:function(t,e){var i,n=t||{};this.cid=oe("c"),this.attributes={},e&&e.collection&&(this.collection=e.collection),e&&e.parse&&(n=this.parse(n,e)||{}),(i=$t(this,"defaults"))&&(n=se({},i,n)),this.set(n,e),this.changed={},this.initialize.apply(this,arguments)},translate:function(t,e,i){throw new Error("Must define a translate() method.")},toJSON:function(){var e=this.constructor.prototype.defaults.attrs||{},t=this.attributes.attrs,o={};ne(t,function(t,n){var r=e[n];ne(t,function(t,i){le(t)&&!Array.isArray(t)?ne(t,function(t,e){r&&r[i]&&Yt(r[i][e],t)||(o[n]=o[n]||{},(o[n][i]||(o[n][i]={}))[e]=t)}):r&&Yt(r[i],t)||(o[n]=o[n]||{},o[n][i]=t)})});var i=Ot(te(this.attributes,"attrs"));return i.attrs=o,i},initialize:function(t){t&&t.id||this.set("id",this.generateId(),{silent:!0}),this._transitionIds={},this.processPorts(),this.on("change:attrs",this.processPorts,this)},generateId:function(){return lt()},processPorts:function(){var t=this.ports,i={};ne(this.get("attrs"),function(t,e){t&&t.port&&(void 0!==t.port.id?i[t.port.id]=t.port:i[t.port]={id:t.port})});var n={};(ne(t,function(t,e){i[e]||(n[e]=!0)}),this.graph&&!Et(n))&&(this.graph.getConnectedLinks(this,{inbound:!0}).forEach(function(t){n[t.get("target").port]&&t.remove()}),this.graph.getConnectedLinks(this,{outbound:!0}).forEach(function(t){n[t.get("source").port]&&t.remove()}));this.ports=i},remove:function(t){t=t||{};var e=this.graph;if(!e)return this.collection&&this.collection.remove(this,t),this;e.startBatch("remove");var i=this.getParentCell();i&&i.unembed(this);for(var n=this.getEmbeddedCells(),r=0,o=n.length;rc[2]?(s=".3em",r=g,o=0,"start"):lh[2]?(s=".3em",r=-c,o=0,"end"):l','','','','','','',''].join(""),toolMarkup:['','','','',"Remove link.","",'','','',"Link options.","",""].join(""),doubleToolMarkup:void 0,vertexMarkup:['','','','',"Remove vertex.","",""].join(""),arrowheadMarkup:['','',""].join(""),defaultLabel:void 0,labelMarkup:void 0,_builtins:{defaultLabel:{markup:[{tagName:"rect",selector:"rect"},{tagName:"text",selector:"text"}],attrs:{text:{fill:"#000000",fontSize:14,textAnchor:"middle",yAlignment:"middle",pointerEvents:"none"},rect:{ref:"text",fill:"#ffffff",rx:3,ry:3,refWidth:1,refHeight:1,refX:0,refY:0}},position:{distance:.5}}},defaults:{type:"link",source:{},target:{}},isLink:function(){return!0},disconnect:function(t){return this.set({source:{x:0,y:0},target:{x:0,y:0}},t)},source:function(t,e,i){return void 0===t?Bt(this.get("source")):(r=t instanceof Se?((n=Bt(e)||{}).id=t.id,i):Wt(t)?(n=t,e):((n=Bt(e)||{}).x=t.x,n.y=t.y,i),this.set("source",n,r));var n,r},target:function(t,e,i){return void 0===t?Bt(this.get("target")):(r=t instanceof Se?((n=Bt(e)||{}).id=t.id,i):Wt(t)?(n=t,e):((n=Bt(e)||{}).x=t.x,n.y=t.y,i),this.set("target",n,r));var n,r},router:function(t,e,i){if(void 0===t){var n=this.get("router");return n?"object"==typeof n?Bt(n):n:this.get("manhattan")?{name:"orthogonal"}:null}var r="object"==typeof t||"function"==typeof t,o=r?t:{name:t,args:e},s=r?e:i;return this.set("router",o,s)},connector:function(t,e,i){if(void 0===t){var n=this.get("connector");return n?"object"==typeof n?Bt(n):n:this.get("smooth")?{name:"smooth"}:null}var r="object"==typeof t||"function"==typeof t,o=r?t:{name:t,args:e},s=r?e:i;return this.set("connector",o,s)},label:function(t,e,i){var n=this.labels();return(t=isFinite(t)&&null!==t?0|t:0)<0&&(t=n.length+t),arguments.length<=1?this.prop(["labels",t]):this.prop(["labels",t],e,i)},labels:function(t,e){return 0===arguments.length?(t=this.get("labels"),Array.isArray(t)?t.slice():[]):(Array.isArray(t)||(t=[]),this.set("labels",t,e))},insertLabel:function(t,e,i){if(!e)throw new Error("dia.Link: no label provided");var n=this.labels(),r=n.length;return(t=isFinite(t)&&null!==t?0|t:r)<0&&(t=r+t+1),n.splice(t,0,e),this.labels(n,i)},appendLabel:function(t,e){return this.insertLabel(-1,t,e)},removeLabel:function(t,e){var i=this.labels();return t=isFinite(t)&&null!==t?0|t:-1,i.splice(t,1),this.labels(i,e)},vertex:function(t,e,i){var n=this.vertices();if((t=isFinite(t)&&null!==t?0|t:0)<0&&(t=n.length+t),arguments.length<=1)return this.prop(["vertices",t]);var r=this._normalizeVertex(e);return this.prop(["vertices",t],r,i)},vertices:function(t,e){if(0===arguments.length)return t=this.get("vertices"),Array.isArray(t)?t.slice():[];Array.isArray(t)||(t=[]);for(var i=[],n=0;n "+e),i=this.getSelector(t.parentNode,i)}return i},getLinkEnd:function(t,e,i,n,r){var o=this.model,s=o.id,a=this.findAttribute("port",t),l=t.getAttribute("joint-selector"),c={id:s};null!=l&&(c.magnet=l),null!=a?(c.port=a,o.hasPort(a)||l||(c.selector=this.getSelector(t))):null==l&&this.el!==t&&(c.selector=this.getSelector(t));var g=this.paper,h=g.options.connectionStrategy;if("function"==typeof h){var u=h.call(g,c,this,t,new E(e,i),n,r,g);u&&(c=u)}return c},getMagnetFromLinkEnd:function(t){var e=this.el,i=t.port,n=t.magnet,r=this.model;return null!=i&&r.isElement()&&r.hasPort(i)?this.findPortNode(i,n)||e:(n||(n=t.selector),n||null==i||(n='[port="'+i+'"]'),this.findBySelector(n,e,this.selectors)[0])},getAttributeDefinition:function(t){return this.model.constructor.getAttributeDefinition(t)},setNodeAttributes:function(t,e){Et(e)||(t instanceof SVGElement?q(t).attr(e):S(t).attr(e))},processNodeAttributes:function(t,e){var i,n,r,o,s,a,l,c,g,h=[];for(i in e)e.hasOwnProperty(i)&&(n=e[i],!(r=this.getAttributeDefinition(i))||Rt(r.qualify)&&!r.qualify.call(this,n,t,e)?(a||(a={}),a[gt(i)]=n):(ge(r.set)&&(a||(a={}),a[r.set]=n),null!==n&&h.push(i,r)));for(o=0,s=h.length;or.options.clickThreshold||this.notify("element:magnet:pointerclick",t,e,i,n)}});jt($e.prototype,Ve);var ti={N:"S",S:"N",E:"W",W:"E"},ei={N:-Math.PI/2*3,S:-Math.PI/2,E:0,W:Math.PI};function ii(t,e,i){var n=new E(t.x,e.y);return i.containsPoint(n)&&(n=new E(e.x,t.y)),n}function ni(t,e){return t["W"===e||"E"===e?"width":"height"]}function ri(t,e){return t.x===e.x?t.y>e.y?"N":"S":t.y===e.y?t.x>e.x?"W":"E":null}function oi(t){return new H(t.x,t.y,0,0)}function si(t){var e=wt(t.padding||t.elementPadding||20);return{x:-e.left,y:-e.top,width:e.left+e.right,height:e.top+e.bottom}}function ai(t,e){return t.sourceBBox.clone().moveAndExpand(si(e))}function li(t,e){return t.targetBBox.clone().moveAndExpand(si(e))}function ci(t,e,i){var n=new E(t.x,e.y),r=new E(e.x,t.y),o=ri(t,n),s=ri(t,r),a=ti[i],l=o===i||o!==a&&(s===a||s!==i)?n:r;return{points:[l],direction:ri(l,e)}}function gi(t,e,i){var n=ii(t,e,i);return{points:[n],direction:ri(n,e)}}function hi(e,t,i,n){var r,o={},s=[new E(e.x,t.y),new E(t.x,e.y)],a=s.filter(function(t){return!i.containsPoint(t)}),l=a.filter(function(t){return ri(t,e)!==n});if(0c.center().distance(t),h=g?e:t,u=g?t:e;return s=ii(o=r?(o=E.fromPolar(c.width+c.height,ei[r],h),c.pointNearestToPoint(o).move(o,-1)):c.pointNearestToPoint(h).move(h,1),u,c),o.round().equals(s.round())?(s=E.fromPolar(c.width+c.height,y(o.theta(h))+Math.PI/2,u),a=ii(o,s=c.pointNearestToPoint(s).move(u,1).round(),c),l.points=g?[s,a,o]:[o,a,s]):l.points=g?[s,o]:[o,s],l.direction=ri(g?o:s,e),l}function fi(t,e,i){var n,r,o,s,a,l=ai(i,e),c=li(i,e),g=(r=e,(n=i).sourceAnchor?n.sourceAnchor:ai(n,r).center()),h=(s=e,(o=i).targetAnchor?o.targetAnchor:li(o,s).center());l=l.union(oi(g)),c=c.union(oi(h)),(t=Ut(t).map(E)).unshift(g),t.push(h);for(var u=[],d=0,f=t.length-1;dn.maxAllowedDirectionChange)){var V=Mi(O.clone().offset(k.gridOffsetX,k.gridOffsetY),v,l),F=xi(V);if(!C.isClose(F)&&i.isPointAccessible(V)){if(0<=L.indexOf(F))if(!V.equals(d))if(yi(X,wi(V,d,Z,v,n))>n.maxAllowedDirectionChange)continue;var J=Y+k.cost+(W?0:n.penalties[D]);(!C.isOpen(F)||J=Math.abs(t.y-e.y)){var c=(t.x+e.x)/2;l=O.createSegment("C",c,t.y,c,e.y,e.x,e.y),r.appendSegment(l)}else{var g=(t.y+e.y)/2;l=O.createSegment("C",t.x,g,e.x,g,e.x,e.y),r.appendSegment(l)}}return o?r:r.serialize()}},Vi=qe.extend({className:function(){var t=qe.prototype.className.apply(this).split(" ");return t.push("link"),t.join(" ")},options:{shortLinkLength:105,doubleLinkTools:!1,longLinkLength:155,linkToolsOffset:40,doubleLinkToolsOffset:65,sampleInterval:50},_labelCache:null,_labelSelectors:null,_markerCache:null,_V:null,_dragData:null,metrics:null,decimalsRounding:2,initialize:function(){qe.prototype.initialize.apply(this,arguments),this._labelCache={},this._labelSelectors={},this._markerCache={},this._V={},this.metrics={}},presentationAttributes:{markup:["RENDER"],attrs:["UPDATE"],router:["UPDATE"],connector:["UPDATE"],smooth:["UPDATE"],manhattan:["UPDATE"],toolMarkup:["TOOLS"],labels:["LABELS"],labelMarkup:["LABELS"],vertices:["VERTICES","UPDATE"],vertexMarkup:["VERTICES"],source:["SOURCE","UPDATE"],target:["TARGET","UPDATE"]},initFlag:["RENDER","SOURCE","TARGET"],UPDATE_PRIORITY:1,confirmUpdate:function(t,e){if(e||(e={}),this.hasFlag(t,"SOURCE")){if(!this.updateEndProperties("source"))return t;t=this.removeFlag(t,"SOURCE")}if(this.hasFlag(t,"TARGET")){if(!this.updateEndProperties("target"))return t;t=this.removeFlag(t,"TARGET")}var i=this.paper,n=this.sourceView,r=this.targetView;if(i&&(n&&!i.isViewMounted(n)||r&&!i.isViewMounted(r)))return t;if(this.hasFlag(t,"RENDER"))return this.render(),t=this.removeFlag(t,["RENDER","UPDATE","VERTICES","TOOLS","LABELS"]);this.hasFlag(t,"VERTICES")&&(this.renderVertexMarkers(),t=this.removeFlag(t,"VERTICES"));var o=this.model,s=o.attributes;return this.hasFlag(t,"UPDATE")&&(this.update(o,null,e),t=this.removeFlag(t,"UPDATE")),this.hasFlag(t,"LABELS")&&(this.onLabelsChange(o,s.labels,e),t=this.removeFlag(t,"LABELS")),this.hasFlag(t,"TOOLS")&&(this.renderTools().updateToolsPosition(),t=this.removeFlag(t,"TOOLS")),t},isLabelsRenderRequired:function(t){void 0===t&&(t={});var e=this.model.previous("labels");if(!e)return!0;if("propertyPathArray"in t&&"propertyValue"in t){var i=t.propertyPathArray||[],n=i.length;if(1=this.options.longLinkLength){var r=this.options.doubleLinkToolsOffset||e;n=this.getPointAtLength(i-r),this._tool2Cache.attr("transform","translate("+n.x+", "+n.y+") "+t),this._tool2Cache.attr("visibility","visible")}else this.options.doubleLinkTools&&this._tool2Cache.attr("visibility","hidden")}return this},updateArrowheadMarkers:function(){if(!this._V.markerArrowheads)return this;if("none"===S.css(this._V.markerArrowheads.node,"display"))return this;var t=this.getConnectionLength()'),o=["<"+i+">",Ut(n).map(function(t){return r({offset:t.offset,color:t.color,opacity:Number.isFinite(t.opacity)?t.opacity:1})}).join(""),""].join(""),s=jt({id:e},t.attrs);q(o,s).appendTo(this.defs)}return e},defineMarker:function(t){if(!le(t))throw new TypeError("dia.Paper: defineMarker() requires 1. argument to be an object.");var e=t.id;if(e||(e=this.svg.id+nt(JSON.stringify(t))),!this.isDefined(e)){var i=te(t,"type","userSpaceOnUse");q("marker",{id:e,orient:"auto",overflow:"visible",markerUnits:t.markerUnits||"userSpaceOnUse"},[q(t.type||"path",i)]).appendTo(this.defs)}return e}},{sorting:an,backgroundPatterns:{flipXy:function(t){var e=document.createElement("canvas"),i=t.width,n=t.height;e.width=2*i,e.height=2*n;var r=e.getContext("2d");return r.drawImage(t,0,0,i,n),r.setTransform(-1,0,0,-1,e.width,e.height),r.drawImage(t,0,0,i,n),r.setTransform(-1,0,0,1,e.width,0),r.drawImage(t,0,0,i,n),r.setTransform(1,0,0,-1,0,e.height),r.drawImage(t,0,0,i,n),e},flipX:function(t){var e=document.createElement("canvas"),i=t.width,n=t.height;e.width=2*i,e.height=n;var r=e.getContext("2d");return r.drawImage(t,0,0,i,n),r.translate(2*i,0),r.scale(-1,1),r.drawImage(t,0,0,i,n),e},flipY:function(t){var e=document.createElement("canvas"),i=t.width,n=t.height;e.width=i,e.height=2*n;var r=e.getContext("2d");return r.drawImage(t,0,0,i,n),r.translate(0,2*n),r.scale(1,-1),r.drawImage(t,0,0,i,n),e},watermark:function(t,e){e=e||{};var i=t.width,n=t.height,r=document.createElement("canvas");r.width=3*i,r.height=3*n;for(var o=r.getContext("2d"),s=ce(e.watermarkAngle)?-e.watermarkAngle:-20,a=y(s),l=r.width/4,c=r.height/4,g=0;g<4;g++)for(var h=0;h<4;h++)0<(g+h)%2&&(o.setTransform(1,0,0,1,(2*g-1)*l,(2*h-1)*c),o.rotate(a),o.drawImage(t,-i/2,-n/2,i,n));return r}},gridPatterns:{dot:[{color:"#AAAAAA",thickness:1,markup:"rect",update:function(t,e){q(t).attr({width:e.thickness*e.sx,height:e.thickness*e.sy,fill:e.color})}}],fixedDot:[{color:"#AAAAAA",thickness:1,markup:"rect",update:function(t,e){var i=e.sx<=1?e.thickness*e.sx:e.thickness;q(t).attr({width:i,height:i,fill:e.color})}}],mesh:[{color:"#AAAAAA",thickness:1,markup:"path",update:function(t,e){var i,n=e.width,r=e.height,o=e.thickness;i=0<=n-o&&0<=r-o?["M",n,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",q(t).attr({d:i,stroke:e.color,"stroke-width":e.thickness})}}],doubleMesh:[{color:"#AAAAAA",thickness:1,markup:"path",update:function(t,e){var i,n=e.width,r=e.height,o=e.thickness;i=0<=n-o&&0<=r-o?["M",n,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",q(t).attr({d:i,stroke:e.color,"stroke-width":e.thickness})}},{color:"#000000",thickness:3,scaleFactor:4,markup:"path",update:function(t,e){var i,n=e.width,r=e.height,o=e.thickness;i=0<=n-o&&0<=r-o?["M",n,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",q(t).attr({d:i,stroke:e.color,"stroke-width":e.thickness})}}]}}),hn=_e.extend({name:null,tagName:"g",className:"tool",svgElement:!0,_visible:!0,init:function(){var t=this.name;t&&this.vel.attr("data-tool-name",t)},configure:function(t,e){return this.relatedView=t,this.paper=t.paper,this.parentView=e,this.simulateRelatedView(this.el),this.delegateEvents(),this},simulateRelatedView:function(t){t&&t.setAttribute("model-id",this.relatedView.model.id)},getName:function(){return this.name},show:function(){this.el.style.display="",this._visible=!0},hide:function(){this.el.style.display="none",this._visible=!1},isVisible:function(){return!!this._visible},focus:function(){var t=this.options.focusOpacity;isFinite(t)&&(this.el.style.opacity=t),this.parentView.focusTool(this)},blur:function(){this.el.style.opacity="",this.parentView.blurTool(this)},update:function(){},guard:function(t){var e=this.paper,i=this.relatedView;return!e||!i||e.guard(t,i)}}),un=_e.extend({tagName:"g",className:"tools",svgElement:!0,tools:null,options:{tools:null,relatedView:null,name:null,component:!1},configure:function(t){var e=(t=jt(this.options,t)).tools;if(!Array.isArray(e))return this;var i=t.relatedView;if(!(i instanceof qe))return this;for(var n=this.tools=[],r=0,o=e.length;r'}),An=$e.extend({presentationAttributes:$e.addPresentationAttributes({attrs:["SCALE"]}),confirmUpdate:function(){var t=$e.prototype.confirmUpdate.apply(this,arguments);return this.hasFlag(t,"SCALE")&&(this.resize(),t=this.removeFlag(t,"SCALE")),t}}),vn=In.define("basic.Text",{attrs:{text:{"font-size":18,fill:"#000000"}}},{markup:''}),Cn=In.define("basic.Circle",{size:{width:60,height:60},attrs:{circle:{fill:"#ffffff",stroke:"#000000",r:30,cx:30,cy:30},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-y":.5,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),wn=In.define("basic.Ellipse",{size:{width:60,height:40},attrs:{ellipse:{fill:"#ffffff",stroke:"#000000",rx:30,ry:20,cx:30,cy:20},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-y":.5,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),yn=In.define("basic.Polygon",{size:{width:60,height:40},attrs:{polygon:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),bn=In.define("basic.Polyline",{size:{width:60,height:40},attrs:{polyline:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),Nn=In.define("basic.Image",{attrs:{text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),Mn=In.define("basic.Path",{size:{width:60,height:60},attrs:{path:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle",ref:"path","ref-x":.5,"ref-dy":10,fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),xn=Mn.define("basic.Rhombus",{attrs:{path:{d:"M 30 0 L 60 30 30 60 0 30 z"},text:{"ref-y":.5,"ref-dy":null,"y-alignment":"middle"}}}),Sn=pn.test("svgforeignobject"),kn=In.define("basic.TextBlock",{attrs:{rect:{fill:"#ffffff",stroke:"#000000",width:80,height:100},text:{fill:"#000000","font-size":14,"font-family":"Arial, helvetica, sans-serif"},".content":{text:"","ref-x":.5,"ref-y":.5,"y-alignment":"middle","x-alignment":"middle"}},content:""},{markup:['','',Sn?'
':'',""].join(""),initialize:function(){this.listenTo(this,"change:size",this.updateSize),this.listenTo(this,"change:content",this.updateContent),this.updateSize(this,this.get("size")),this.updateContent(this,this.get("content")),In.prototype.initialize.apply(this,arguments)},updateSize:function(t,e){this.attr({".fobj":jt({},e),div:{style:jt({},e)}})},updateContent:function(t,e){Sn?this.attr({".content":{html:mt(e)}}):this.attr({".content":{text:e}})},setForeignObjectSize:function(){this.updateSize.apply(this,arguments)},setDivContent:function(){this.updateContent.apply(this,arguments)}}),Dn=$e.extend({presentationAttributes:Sn?$e.prototype.presentationAttributes:$e.addPresentationAttributes({content:["CONTENT"],size:["CONTENT"]}),initFlag:["RENDER","CONTENT"],confirmUpdate:function(){var t=$e.prototype.confirmUpdate.apply(this,arguments);return this.hasFlag(t,"CONTENT")&&(this.updateContent(this.model),t=this.removeFlag(t,"CONTENT")),t},update:function(t,e){var i=this.model;if(Sn)$e.prototype.update.call(this,i,e);else{var n=te(e||i.get("attrs"),".content");$e.prototype.update.call(this,i,n),e&&!qt(e,".content")||this.updateContent(i,e)}},updateContent:function(t,e){var i=se({},(e||t.get("attrs"))[".content"]);i=te(i,"text");var n=It(t.get("content"),t.get("size"),i,{svgDocument:this.paper.svg}),r=ot({},".content",i,"/");r[".content"].text=n,$e.prototype.update.call(this,t,r)}}),zn={Generic:In,Rect:mn,TextView:An,Text:vn,Circle:Cn,Ellipse:wn,Polygon:yn,Polyline:bn,Image:Nn,Path:Mn,Rhombus:xn,TextBlock:kn,TextBlockView:Dn},jn=Fe.define("standard.Rectangle",{attrs:{body:{refWidth:"100%",refHeight:"100%",strokeWidth:2,stroke:"#000000",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"body"},{tagName:"text",selector:"label"}]}),Tn=Fe.define("standard.Circle",{attrs:{body:{refCx:"50%",refCy:"50%",refR:"50%",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"circle",selector:"body"},{tagName:"text",selector:"label"}]}),Zn=Fe.define("standard.Ellipse",{attrs:{body:{refCx:"50%",refCy:"50%",refRx:"50%",refRy:"50%",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"ellipse",selector:"body"},{tagName:"text",selector:"label"}]}),Ln=Fe.define("standard.Path",{attrs:{body:{refD:"M 0 0 L 10 0 10 10 0 10 Z",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"path",selector:"body"},{tagName:"text",selector:"label"}]}),Pn=Fe.define("standard.Polygon",{attrs:{body:{refPoints:"0 0 10 0 10 10 0 10",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"polygon",selector:"body"},{tagName:"text",selector:"label"}]}),Gn=Fe.define("standard.Polyline",{attrs:{body:{refPoints:"0 0 10 0 10 10 0 10 0 0",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"polyline",selector:"body"},{tagName:"text",selector:"label"}]}),Bn=Fe.define("standard.Image",{attrs:{image:{refWidth:"100%",refHeight:"100%"},label:{textVerticalAnchor:"top",textAnchor:"middle",refX:"50%",refY:"100%",refY2:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"image",selector:"image"},{tagName:"text",selector:"label"}]}),On=Fe.define("standard.BorderedImage",{attrs:{border:{refWidth:"100%",refHeight:"100%",stroke:"#333333",strokeWidth:2},background:{refWidth:-1,refHeight:-1,x:.5,y:.5,fill:"#FFFFFF"},image:{refWidth:-1,refHeight:-1,x:.5,y:.5},label:{textVerticalAnchor:"top",textAnchor:"middle",refX:"50%",refY:"100%",refY2:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"background",attributes:{stroke:"none"}},{tagName:"image",selector:"image"},{tagName:"rect",selector:"border",attributes:{fill:"none"}},{tagName:"text",selector:"label"}]}),En=Fe.define("standard.EmbeddedImage",{attrs:{body:{refWidth:"100%",refHeight:"100%",stroke:"#333333",fill:"#FFFFFF",strokeWidth:2},image:{refWidth:"30%",refHeight:-20,x:10,y:10,preserveAspectRatio:"xMidYMin"},label:{textVerticalAnchor:"top",textAnchor:"left",refX:"30%",refX2:20,refY:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"body"},{tagName:"image",selector:"image"},{tagName:"text",selector:"label"}]}),Yn=Fe.define("standard.InscribedImage",{attrs:{border:{refRx:"50%",refRy:"50%",refCx:"50%",refCy:"50%",stroke:"#333333",strokeWidth:2},background:{refRx:"50%",refRy:"50%",refCx:"50%",refCy:"50%",fill:"#FFFFFF"},image:{refWidth:"68%",refHeight:"68%",refX:"16%",refY:"16%",preserveAspectRatio:"xMidYMid"},label:{textVerticalAnchor:"top",textAnchor:"middle",refX:"50%",refY:"100%",refY2:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"ellipse",selector:"background"},{tagName:"image",selector:"image"},{tagName:"ellipse",selector:"border",attributes:{fill:"none"}},{tagName:"text",selector:"label"}]}),Rn=Fe.define("standard.HeaderedRectangle",{attrs:{body:{refWidth:"100%",refHeight:"100%",strokeWidth:2,stroke:"#000000",fill:"#FFFFFF"},header:{refWidth:"100%",height:30,strokeWidth:2,stroke:"#000000",fill:"#FFFFFF"},headerText:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:15,fontSize:16,fill:"#333333"},bodyText:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",refY2:15,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"body"},{tagName:"rect",selector:"header"},{tagName:"text",selector:"headerText"},{tagName:"text",selector:"bodyText"}]}),Wn=Fe.define("standard.Cylinder",{attrs:{body:{lateralArea:10,fill:"#FFFFFF",stroke:"#333333",strokeWidth:2},top:{refCx:"50%",cy:10,refRx:"50%",ry:10,fill:"#FFFFFF",stroke:"#333333",strokeWidth:2},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"100%",refY2:15,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"path",selector:"body"},{tagName:"ellipse",selector:"top"},{tagName:"text",selector:"label"}],topRy:function(t,e){if(void 0===t)return this.attr("body/lateralArea");var i={lateralArea:t},n=ft(t)?{refCy:t,refRy:t,cy:null,ry:null}:{refCy:null,refRy:null,cy:t,ry:t};return this.attr({body:i,top:n},e)}},{attributes:{lateralArea:{set:function(t,e){var i=ft(t);i&&(t=parseFloat(t)/100);var n=e.x,r=e.y,o=e.width,s=e.height,a=o/2,l=i?s*t:t,c=q.KAPPA,g=c*a,h=c*(i?s*t:t),u=n+o/2,d=n+o,f=r+l,p=f-l,I=r+s-l,m=r+s;return{d:["M",n,f,"L",n,I,"C",n,I+h,u-g,m,u,m,"C",u+g,m,d,I+h,d,I,"L",d,f,"C",d,f-h,u+g,p,u,p,"C",u-g,p,n,f-h,n,f,"Z"].join(" ")}}}}}),Un=pn.test("svgforeignobject")?{tagName:"foreignObject",selector:"foreignObject",attributes:{overflow:"hidden"},children:[{tagName:"div",namespaceURI:"http://www.w3.org/1999/xhtml",selector:"label",style:{width:"100%",height:"100%",position:"static",backgroundColor:"transparent",textAlign:"center",margin:0,padding:"0px 5px",boxSizing:"border-box",display:"flex",alignItems:"center",justifyContent:"center"}}]}:{tagName:"text",selector:"label",attributes:{"text-anchor":"middle"}},Xn={Rectangle:jn,Circle:Tn,Ellipse:Zn,Path:Ln,Polygon:Pn,Polyline:Gn,Image:Bn,BorderedImage:On,EmbeddedImage:En,InscribedImage:Yn,HeaderedRectangle:Rn,Cylinder:Wn,TextBlock:Fe.define("standard.TextBlock",{attrs:{body:{refWidth:"100%",refHeight:"100%",stroke:"#333333",fill:"#ffffff",strokeWidth:2},foreignObject:{refWidth:"100%",refHeight:"100%"},label:{style:{fontSize:14}}}},{markup:[{tagName:"rect",selector:"body"},Un]},{attributes:{text:{set:function(t,e,i,n){if(!(i instanceof HTMLElement)){var r=n.style||{},o={text:t,width:-5,height:"100%"},s=jt({textVerticalAnchor:"middle"},r);return xe.textWrap.set.call(this,o,e,i,s),{fill:r.color||null}}i.textContent=t},position:function(t,e,i){if(i instanceof SVGElement)return e.center()}}}}),Link:We.define("standard.Link",{attrs:{line:{connection:!0,stroke:"#333333",strokeWidth:2,strokeLinejoin:"round",targetMarker:{type:"path",d:"M 10 -5 0 0 10 5 z"}},wrapper:{connection:!0,strokeWidth:10,strokeLinejoin:"round"}}},{markup:[{tagName:"path",selector:"wrapper",attributes:{fill:"none",cursor:"pointer",stroke:"transparent","stroke-linecap":"round"}},{tagName:"path",selector:"line",attributes:{fill:"none","pointer-events":"none"}}]}),DoubleLink:We.define("standard.DoubleLink",{attrs:{line:{connection:!0,stroke:"#DDDDDD",strokeWidth:4,strokeLinejoin:"round",targetMarker:{type:"path",stroke:"#000000",d:"M 10 -3 10 -10 -2 0 10 10 10 3"}},outline:{connection:!0,stroke:"#000000",strokeWidth:6,strokeLinejoin:"round"}}},{markup:[{tagName:"path",selector:"outline",attributes:{fill:"none"}},{tagName:"path",selector:"line",attributes:{fill:"none"}}]}),ShadowLink:We.define("standard.ShadowLink",{attrs:{line:{connection:!0,stroke:"#FF0000",strokeWidth:20,strokeLinejoin:"round",targetMarker:{type:"path",stroke:"none",d:"M 0 -10 -10 0 0 10 z"},sourceMarker:{type:"path",stroke:"none",d:"M -10 -10 0 0 -10 10 0 10 0 -10 z"}},shadow:{connection:!0,refX:3,refY:6,stroke:"#000000",strokeOpacity:.2,strokeWidth:20,strokeLinejoin:"round",targetMarker:{type:"path",d:"M 0 -10 -10 0 0 10 z",stroke:"none"},sourceMarker:{type:"path",stroke:"none",d:"M -10 -10 0 0 -10 10 0 10 0 -10 z"}}}},{markup:[{tagName:"path",selector:"shadow",attributes:{fill:"none"}},{tagName:"path",selector:"line",attributes:{fill:"none"}}]})},Vn=In.define("devs.Model",{inPorts:[],outPorts:[],size:{width:80,height:80},attrs:{".":{magnet:!1},".label":{text:"Model","ref-x":.5,"ref-y":10,"font-size":18,"text-anchor":"middle",fill:"#000"},".body":{"ref-width":"100%","ref-height":"100%",stroke:"#000"}},ports:{groups:{in:{position:{name:"left"},attrs:{".port-label":{fill:"#000"},".port-body":{fill:"#fff",stroke:"#000",r:10,magnet:!0}},label:{position:{name:"left",args:{y:10}}}},out:{position:{name:"right"},attrs:{".port-label":{fill:"#000"},".port-body":{fill:"#fff",stroke:"#000",r:10,magnet:!0}},label:{position:{name:"right",args:{y:10}}}}}}},{markup:'',portMarkup:'',portLabelMarkup:'',initialize:function(){In.prototype.initialize.apply(this,arguments),this.on("change:inPorts change:outPorts",this.updatePortItems,this),this.updatePortItems()},updatePortItems:function(t,e,i){var n=Gt(this.get("inPorts")),r=Qt(Gt(this.get("outPorts")),n),o=this.createPortItems("in",n),s=this.createPortItems("out",r);this.prop("ports/items",o.concat(s),jt({rewrite:!0},i))},createPortItem:function(t,e){return{id:e,group:t,attrs:{".port-label":{text:e}}}},createPortItems:function(t,e){return Ut(e).map(this.createPortItem.bind(this,t))},_addGroupPort:function(t,e,i){var n=this.get(e);return this.set(e,Array.isArray(n)?n.concat(t):[t],i)},addOutPort:function(t,e){return this._addGroupPort(t,"outPorts",e)},addInPort:function(t,e){return this._addGroupPort(t,"inPorts",e)},_removeGroupPort:function(t,e,i){return this.set(e,Ht(this.get(e),t),i)},removeOutPort:function(t,e){return this._removeGroupPort(t,"outPorts",e)},removeInPort:function(t,e){return this._removeGroupPort(t,"inPorts",e)},_changeGroup:function(t,e,i){return this.prop("ports/groups/"+t,le(e)?e:{},i)},changeInGroup:function(t,e){return this._changeGroup("in",t,e)},changeOutGroup:function(t,e){return this._changeGroup("out",t,e)}}),Fn=Vn.define("devs.Atomic",{size:{width:80,height:80},attrs:{".label":{text:"Atomic"}}}),Jn=Vn.define("devs.Coupled",{size:{width:200,height:300},attrs:{".label":{text:"Coupled"}}}),Hn={Model:Vn,Atomic:Fn,Coupled:Jn,Link:We.define("devs.Link",{attrs:{".connection":{"stroke-width":2}}})},Qn=In.define("logic.Gate",{size:{width:80,height:40},attrs:{".":{magnet:!1},".body":{width:100,height:50},circle:{r:7,stroke:"black",fill:"transparent","stroke-width":2}}},{operation:function(){return!0}}),_n=Qn.define("logic.IO",{size:{width:60,height:30},attrs:{".body":{fill:"white",stroke:"black","stroke-width":2},".wire":{ref:".body","ref-y":.5,stroke:"black"},text:{fill:"black",ref:".body","ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle","font-weight":"bold","font-variant":"small-caps","text-transform":"capitalize","font-size":"14px"}}},{markup:''}),Kn=_n.define("logic.Input",{attrs:{".wire":{"ref-dx":0,d:"M 0 0 L 23 0"},circle:{ref:".body","ref-dx":30,"ref-y":.5,magnet:!0,class:"output",port:"out"},text:{text:"input"}}}),qn=_n.define("logic.Output",{attrs:{".wire":{"ref-x":0,d:"M 0 0 L -23 0"},circle:{ref:".body","ref-x":-30,"ref-y":.5,magnet:"passive",class:"input",port:"in"},text:{text:"output"}}}),$n=Qn.define("logic.Gate11",{attrs:{".input":{ref:".body","ref-x":-2,"ref-y":.5,magnet:"passive",port:"in"},".output":{ref:".body","ref-dx":2,"ref-y":.5,magnet:!0,port:"out"}}},{markup:''}),tr=Qn.define("logic.Gate21",{attrs:{".input1":{ref:".body","ref-x":-2,"ref-y":.3,magnet:"passive",port:"in1"},".input2":{ref:".body","ref-x":-2,"ref-y":.7,magnet:"passive",port:"in2"},".output":{ref:".body","ref-dx":2,"ref-y":.5,magnet:!0,port:"out"}}},{markup:''}),er=$n.define("logic.Repeater",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5PVCBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjgiCiAgICAgaW5rc2NhcGU6Y3g9Ijg0LjY4NTM1MiIKICAgICBpbmtzY2FwZTpjeT0iMTUuMjg4NjI4IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjMzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gNzIuMTU2OTEsMjUgTCA5NSwyNSIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAyOS4wNDM0NzgsMjUgTCA1LjA0MzQ3ODEsMjUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgZD0iTSAyOC45Njg3NSwyLjU5Mzc1IEwgMjguOTY4NzUsNSBMIDI4Ljk2ODc1LDQ1IEwgMjguOTY4NzUsNDcuNDA2MjUgTCAzMS4xMjUsNDYuMzQzNzUgTCA3Mi4xNTYyNSwyNi4zNDM3NSBMIDcyLjE1NjI1LDIzLjY1NjI1IEwgMzEuMTI1LDMuNjU2MjUgTCAyOC45Njg3NSwyLjU5Mzc1IHogTSAzMS45Njg3NSw3LjQwNjI1IEwgNjguMDkzNzUsMjUgTCAzMS45Njg3NSw0Mi41OTM3NSBMIDMxLjk2ODc1LDcuNDA2MjUgeiIKICAgICAgIGlkPSJwYXRoMjYzOCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjY2NjYyIgLz4KICA8L2c+Cjwvc3ZnPgo="}}},{operation:function(t){return t}}),ir=$n.define("logic.Not",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5PVCBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjgiCiAgICAgaW5rc2NhcGU6Y3g9Ijg0LjY4NTM1MiIKICAgICBpbmtzY2FwZTpjeT0iMTUuMjg4NjI4IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjMzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gNzkuMTU2OTEsMjUgTCA5NSwyNSIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAyOS4wNDM0NzgsMjUgTCA1LjA0MzQ3ODEsMjUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgZD0iTSAyOC45Njg3NSwyLjU5Mzc1IEwgMjguOTY4NzUsNSBMIDI4Ljk2ODc1LDQ1IEwgMjguOTY4NzUsNDcuNDA2MjUgTCAzMS4xMjUsNDYuMzQzNzUgTCA3Mi4xNTYyNSwyNi4zNDM3NSBMIDcyLjE1NjI1LDIzLjY1NjI1IEwgMzEuMTI1LDMuNjU2MjUgTCAyOC45Njg3NSwyLjU5Mzc1IHogTSAzMS45Njg3NSw3LjQwNjI1IEwgNjguMDkzNzUsMjUgTCAzMS45Njg3NSw0Mi41OTM3NSBMIDMxLjk2ODc1LDcuNDA2MjUgeiIKICAgICAgIGlkPSJwYXRoMjYzOCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICBpZD0icGF0aDI2NzEiCiAgICAgICBzb2RpcG9kaTpjeD0iNzYiCiAgICAgICBzb2RpcG9kaTpjeT0iMjUiCiAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgIHNvZGlwb2RpOnJ5PSI0IgogICAgICAgZD0iTSA4MCwyNSBBIDQsNCAwIDEgMSA3MiwyNSBBIDQsNCAwIDEgMSA4MCwyNSB6IgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEsMCkiIC8+CiAgPC9nPgo8L3N2Zz4K"}}},{operation:function(t){return!t}}),nr=tr.define("logic.Or",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik9SIEFOU0kuc3ZnIgogICBpbmtzY2FwZTpvdXRwdXRfZXh0ZW5zaW9uPSJvcmcuaW5rc2NhcGUub3V0cHV0LnN2Zy5pbmtzY2FwZSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjUwIDogMTUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjI1IDogMTAgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjcxNCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODA2IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODE5IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjM3Mi4wNDcyNCA6IDM1MC43ODczOSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI3NDQuMDk0NDggOiA1MjYuMTgxMDkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNzc3IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49Ijc1IDogNDAgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMTUwIDogNjAgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDYwIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTMyNzUiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNTAgOiAzMy4zMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMTAwIDogNTAgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDUwIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1MzMiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzIgOiAyMS4zMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNjQgOiAzMiA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMzIgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjU1NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDE2LjY2NjY2NyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDI1IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAyNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iNCIKICAgICBpbmtzY2FwZTpjeD0iMTEzLjAwMDM5IgogICAgIGlua3NjYXBlOmN5PSIxMi44OTM3MzEiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImcyNTYwIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTpncmlkLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1wb2ludHM9InRydWUiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAwMDAiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMzk5IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijg3NCIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMzciCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii00IgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gNzAsMjUgYyAyMCwwIDI1LDAgMjUsMCIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMSwxNSA1LDE1IgogICAgICAgaWQ9InBhdGgzMDYxIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzIsMzUgNSwzNSIKICAgICAgIGlkPSJwYXRoMzk0NCIgLz4KICAgIDxnCiAgICAgICBpZD0iZzI1NjAiCiAgICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2LjUsLTM5LjUpIj4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJNIC0yLjQwNjI1LDQ0LjUgTCAtMC40MDYyNSw0Ni45Mzc1IEMgLTAuNDA2MjUsNDYuOTM3NSA1LjI1LDUzLjkzNzU0OSA1LjI1LDY0LjUgQyA1LjI1LDc1LjA2MjQ1MSAtMC40MDYyNSw4Mi4wNjI1IC0wLjQwNjI1LDgyLjA2MjUgTCAtMi40MDYyNSw4NC41IEwgMC43NSw4NC41IEwgMTQuNzUsODQuNSBDIDE3LjE1ODA3Niw4NC41MDAwMDEgMjIuNDM5Njk5LDg0LjUyNDUxNCAyOC4zNzUsODIuMDkzNzUgQyAzNC4zMTAzMDEsNzkuNjYyOTg2IDQwLjkxMTUzNiw3NC43NTA0ODQgNDYuMDYyNSw2NS4yMTg3NSBMIDQ0Ljc1LDY0LjUgTCA0Ni4wNjI1LDYzLjc4MTI1IEMgMzUuNzU5Mzg3LDQ0LjcxNTU5IDE5LjUwNjU3NCw0NC41IDE0Ljc1LDQ0LjUgTCAwLjc1LDQ0LjUgTCAtMi40MDYyNSw0NC41IHogTSAzLjQ2ODc1LDQ3LjUgTCAxNC43NSw0Ny41IEMgMTkuNDM0MTczLDQ3LjUgMzMuMDM2ODUsNDcuMzY5NzkzIDQyLjcxODc1LDY0LjUgQyAzNy45NTE5NjQsNzIuOTI5MDc1IDMyLjE5NzQ2OSw3Ny4xODM5MSAyNyw3OS4zMTI1IEMgMjEuNjM5MzM5LDgxLjUwNzkyNCAxNy4xNTgwNzUsODEuNTAwMDAxIDE0Ljc1LDgxLjUgTCAzLjUsODEuNSBDIDUuMzczNTg4NCw3OC4zOTE1NjYgOC4yNSw3Mi40NTA2NSA4LjI1LDY0LjUgQyA4LjI1LDU2LjUyNjY0NiA1LjM0MTQ2ODYsNTAuNTk5ODE1IDMuNDY4NzUsNDcuNSB6IgogICAgICAgICBpZD0icGF0aDQ5NzMiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NzY2NjY3NjY2NjY2NjY2NzY2NzYyIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo="}}},{operation:function(t,e){return t||e}}),rr=tr.define("logic.And",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9IkFORCBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI4IgogICAgIGlua3NjYXBlOmN4PSI1Ni42OTgzNDgiCiAgICAgaW5rc2NhcGU6Y3k9IjI1LjMyNjg5OSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzOTkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIzMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJtIDcwLDI1IGMgMjAsMCAyNSwwIDI1LDAiCiAgICAgICBpZD0icGF0aDMwNTkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzEsMTUgNSwxNSIKICAgICAgIGlkPSJwYXRoMzA2MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDMyLDM1IDUsMzUiCiAgICAgICBpZD0icGF0aDM5NDQiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZvbnQtc2l6ZTptZWRpdW07Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDt0ZXh0LWluZGVudDowO3RleHQtYWxpZ246c3RhcnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bGluZS1oZWlnaHQ6bm9ybWFsO2xldHRlci1zcGFjaW5nOm5vcm1hbDt3b3JkLXNwYWNpbmc6bm9ybWFsO3RleHQtdHJhbnNmb3JtOm5vbmU7ZGlyZWN0aW9uOmx0cjtibG9jay1wcm9ncmVzc2lvbjp0Yjt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGU7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOkJpdHN0cmVhbSBWZXJhIFNhbnMiCiAgICAgICBkPSJNIDMwLDUgTCAzMCw2LjQyODU3MTQgTCAzMCw0My41NzE0MjkgTCAzMCw0NSBMIDMxLjQyODU3MSw0NSBMIDUwLjQ3NjE5LDQ1IEMgNjEuNzQ0MDk4LDQ1IDcwLjQ3NjE5LDM1Ljk5OTk1NSA3MC40NzYxOSwyNSBDIDcwLjQ3NjE5LDE0LjAwMDA0NSA2MS43NDQwOTksNS4wMDAwMDAyIDUwLjQ3NjE5LDUgQyA1MC40NzYxOSw1IDUwLjQ3NjE5LDUgMzEuNDI4NTcxLDUgTCAzMCw1IHogTSAzMi44NTcxNDMsNy44NTcxNDI5IEMgNDAuODM0MjY0LDcuODU3MTQyOSA0NS45MTgzNjgsNy44NTcxNDI5IDQ4LjA5NTIzOCw3Ljg1NzE0MjkgQyA0OS4yODU3MTQsNy44NTcxNDI5IDQ5Ljg4MDk1Miw3Ljg1NzE0MjkgNTAuMTc4NTcxLDcuODU3MTQyOSBDIDUwLjMyNzM4MSw3Ljg1NzE0MjkgNTAuNDA5MjI3LDcuODU3MTQyOSA1MC40NDY0MjksNy44NTcxNDI5IEMgNTAuNDY1MDI5LDcuODU3MTQyOSA1MC40NzE1NDMsNy44NTcxNDI5IDUwLjQ3NjE5LDcuODU3MTQyOSBDIDYwLjIzNjg1Myw3Ljg1NzE0MyA2Ny4xNDI4NTcsMTUuNDk3MDk4IDY3LjE0Mjg1NywyNSBDIDY3LjE0Mjg1NywzNC41MDI5MDIgNTkuNzYwNjYyLDQyLjE0Mjg1NyA1MCw0Mi4xNDI4NTcgTCAzMi44NTcxNDMsNDIuMTQyODU3IEwgMzIuODU3MTQzLDcuODU3MTQyOSB6IgogICAgICAgaWQ9InBhdGgyODg0IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NzY2NjY3Nzc3NzY2NjIiAvPgogIDwvZz4KPC9zdmc+Cg=="}}},{operation:function(t,e){return t&&e}}),or=tr.define("logic.Nor",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5PUiBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEiCiAgICAgaW5rc2NhcGU6Y3g9Ijc4LjY3NzY0NCIKICAgICBpbmtzY2FwZTpjeT0iMjIuMTAyMzQ0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjM3IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItNCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDc5LDI1IEMgOTksMjUgOTUsMjUgOTUsMjUiCiAgICAgICBpZD0icGF0aDMwNTkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzEsMTUgNSwxNSIKICAgICAgIGlkPSJwYXRoMzA2MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDMyLDM1IDUsMzUiCiAgICAgICBpZD0icGF0aDM5NDQiIC8+CiAgICA8ZwogICAgICAgaWQ9ImcyNTYwIgogICAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNi41LC0zOS41KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0iTSAtMi40MDYyNSw0NC41IEwgLTAuNDA2MjUsNDYuOTM3NSBDIC0wLjQwNjI1LDQ2LjkzNzUgNS4yNSw1My45Mzc1NDkgNS4yNSw2NC41IEMgNS4yNSw3NS4wNjI0NTEgLTAuNDA2MjUsODIuMDYyNSAtMC40MDYyNSw4Mi4wNjI1IEwgLTIuNDA2MjUsODQuNSBMIDAuNzUsODQuNSBMIDE0Ljc1LDg0LjUgQyAxNy4xNTgwNzYsODQuNTAwMDAxIDIyLjQzOTY5OSw4NC41MjQ1MTQgMjguMzc1LDgyLjA5Mzc1IEMgMzQuMzEwMzAxLDc5LjY2Mjk4NiA0MC45MTE1MzYsNzQuNzUwNDg0IDQ2LjA2MjUsNjUuMjE4NzUgTCA0NC43NSw2NC41IEwgNDYuMDYyNSw2My43ODEyNSBDIDM1Ljc1OTM4Nyw0NC43MTU1OSAxOS41MDY1NzQsNDQuNSAxNC43NSw0NC41IEwgMC43NSw0NC41IEwgLTIuNDA2MjUsNDQuNSB6IE0gMy40Njg3NSw0Ny41IEwgMTQuNzUsNDcuNSBDIDE5LjQzNDE3Myw0Ny41IDMzLjAzNjg1LDQ3LjM2OTc5MyA0Mi43MTg3NSw2NC41IEMgMzcuOTUxOTY0LDcyLjkyOTA3NSAzMi4xOTc0NjksNzcuMTgzOTEgMjcsNzkuMzEyNSBDIDIxLjYzOTMzOSw4MS41MDc5MjQgMTcuMTU4MDc1LDgxLjUwMDAwMSAxNC43NSw4MS41IEwgMy41LDgxLjUgQyA1LjM3MzU4ODQsNzguMzkxNTY2IDguMjUsNzIuNDUwNjUgOC4yNSw2NC41IEMgOC4yNSw1Ni41MjY2NDYgNS4zNDE0Njg2LDUwLjU5OTgxNSAzLjQ2ODc1LDQ3LjUgeiIKICAgICAgICAgaWQ9InBhdGg0OTczIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc2NjY2NzY2NjY2NjY2Njc2Njc2MiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBpZD0icGF0aDI2MDQiCiAgICAgICAgIHNvZGlwb2RpOmN4PSI3NSIKICAgICAgICAgc29kaXBvZGk6Y3k9IjI1IgogICAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgICAgc29kaXBvZGk6cnk9IjQiCiAgICAgICAgIGQ9Ik0gNzksMjUgQSA0LDQgMCAxIDEgNzEsMjUgQSA0LDQgMCAxIDEgNzksMjUgeiIKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2LjUsMzkuNSkiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K"}}},{operation:function(t,e){return!(t||e)}}),sr=tr.define("logic.Nand",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5BTkQgQU5TSS5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMTUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxMCA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNzE0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MDYiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3NzciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNzUgOiA0MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxNTAgOiA2MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNjAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzI3NSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI1MCA6IDMzLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxMDAgOiA1MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTUzMyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzMiA6IDIxLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI2NCA6IDMyIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAzMiA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMTYiCiAgICAgaW5rc2NhcGU6Y3g9Ijc4LjI4MzMwNyIKICAgICBpbmtzY2FwZTpjeT0iMTYuNDQyODQzIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjMzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gNzksMjUgQyA5MS44LDI1IDk1LDI1IDk1LDI1IgogICAgICAgaWQ9InBhdGgzMDU5IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDMxLDE1IDUsMTUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45OTk5OTk4ODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMiwzNSA1LDM1IgogICAgICAgaWQ9InBhdGgzOTQ0IiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmb250LXNpemU6bWVkaXVtO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7dGV4dC1pbmRlbnQ6MDt0ZXh0LWFsaWduOnN0YXJ0O3RleHQtZGVjb3JhdGlvbjpub25lO2xpbmUtaGVpZ2h0Om5vcm1hbDtsZXR0ZXItc3BhY2luZzpub3JtYWw7d29yZC1zcGFjaW5nOm5vcm1hbDt0ZXh0LXRyYW5zZm9ybTpub25lO2RpcmVjdGlvbjpsdHI7YmxvY2stcHJvZ3Jlc3Npb246dGI7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MzttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpCaXRzdHJlYW0gVmVyYSBTYW5zIgogICAgICAgZD0iTSAzMCw1IEwgMzAsNi40Mjg1NzE0IEwgMzAsNDMuNTcxNDI5IEwgMzAsNDUgTCAzMS40Mjg1NzEsNDUgTCA1MC40NzYxOSw0NSBDIDYxLjc0NDA5OCw0NSA3MC40NzYxOSwzNS45OTk5NTUgNzAuNDc2MTksMjUgQyA3MC40NzYxOSwxNC4wMDAwNDUgNjEuNzQ0MDk5LDUuMDAwMDAwMiA1MC40NzYxOSw1IEMgNTAuNDc2MTksNSA1MC40NzYxOSw1IDMxLjQyODU3MSw1IEwgMzAsNSB6IE0gMzIuODU3MTQzLDcuODU3MTQyOSBDIDQwLjgzNDI2NCw3Ljg1NzE0MjkgNDUuOTE4MzY4LDcuODU3MTQyOSA0OC4wOTUyMzgsNy44NTcxNDI5IEMgNDkuMjg1NzE0LDcuODU3MTQyOSA0OS44ODA5NTIsNy44NTcxNDI5IDUwLjE3ODU3MSw3Ljg1NzE0MjkgQyA1MC4zMjczODEsNy44NTcxNDI5IDUwLjQwOTIyNyw3Ljg1NzE0MjkgNTAuNDQ2NDI5LDcuODU3MTQyOSBDIDUwLjQ2NTAyOSw3Ljg1NzE0MjkgNTAuNDcxNTQzLDcuODU3MTQyOSA1MC40NzYxOSw3Ljg1NzE0MjkgQyA2MC4yMzY4NTMsNy44NTcxNDMgNjcuMTQyODU3LDE1LjQ5NzA5OCA2Ny4xNDI4NTcsMjUgQyA2Ny4xNDI4NTcsMzQuNTAyOTAyIDU5Ljc2MDY2Miw0Mi4xNDI4NTcgNTAsNDIuMTQyODU3IEwgMzIuODU3MTQzLDQyLjE0Mjg1NyBMIDMyLjg1NzE0Myw3Ljg1NzE0MjkgeiIKICAgICAgIGlkPSJwYXRoMjg4NCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2Njc2NjY2Nzc3Nzc2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICBpZD0icGF0aDQwMDgiCiAgICAgICBzb2RpcG9kaTpjeD0iNzUiCiAgICAgICBzb2RpcG9kaTpjeT0iMjUiCiAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgIHNvZGlwb2RpOnJ5PSI0IgogICAgICAgZD0iTSA3OSwyNSBBIDQsNCAwIDEgMSA3MSwyNSBBIDQsNCAwIDEgMSA3OSwyNSB6IiAvPgogIDwvZz4KPC9zdmc+Cg=="}}},{operation:function(t,e){return!(t&&e)}}),ar=tr.define("logic.Xor",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9IlhPUiBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjUuNjU2ODU0MiIKICAgICBpbmtzY2FwZTpjeD0iMjUuOTM4MTE2IgogICAgIGlua3NjYXBlOmN5PSIxNy4yMzAwNSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzOTkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIzMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJtIDcwLDI1IGMgMjAsMCAyNSwwIDI1LDAiCiAgICAgICBpZD0icGF0aDMwNTkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzAuMzg1NzE3LDE1IEwgNC45OTk5OTk4LDE1IgogICAgICAgaWQ9InBhdGgzMDYxIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5NzY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzEuMzYyMDkxLDM1IEwgNC45OTk5OTk4LDM1IgogICAgICAgaWQ9InBhdGgzOTQ0IiAvPgogICAgPGcKICAgICAgIGlkPSJnMjU2MCIKICAgICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjYuNSwtMzkuNSkiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDM1MTYiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0iTSAtMi4yNSw4MS41MDAwMDUgQyAtMy44NDczNzQsODQuMTQ0NDA1IC00LjUsODQuNTAwMDA1IC00LjUsODQuNTAwMDA1IEwgLTguMTU2MjUsODQuNTAwMDA1IEwgLTYuMTU2MjUsODIuMDYyNTA1IEMgLTYuMTU2MjUsODIuMDYyNTA1IC0wLjUsNzUuMDYyNDUxIC0wLjUsNjQuNSBDIC0wLjUsNTMuOTM3NTQ5IC02LjE1NjI1LDQ2LjkzNzUgLTYuMTU2MjUsNDYuOTM3NSBMIC04LjE1NjI1LDQ0LjUgTCAtNC41LDQ0LjUgQyAtMy43MTg3NSw0NS40Mzc1IC0zLjA3ODEyNSw0Ni4xNTYyNSAtMi4yODEyNSw0Ny41IEMgLTAuNDA4NTMxLDUwLjU5OTgxNSAyLjUsNTYuNTI2NjQ2IDIuNSw2NC41IEMgMi41LDcyLjQ1MDY1IC0wLjM5NjY5Nyw3OC4zNzk0MjUgLTIuMjUsODEuNTAwMDA1IHoiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY3NjY2Njc2MiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0iTSAtMi40MDYyNSw0NC41IEwgLTAuNDA2MjUsNDYuOTM3NSBDIC0wLjQwNjI1LDQ2LjkzNzUgNS4yNSw1My45Mzc1NDkgNS4yNSw2NC41IEMgNS4yNSw3NS4wNjI0NTEgLTAuNDA2MjUsODIuMDYyNSAtMC40MDYyNSw4Mi4wNjI1IEwgLTIuNDA2MjUsODQuNSBMIDAuNzUsODQuNSBMIDE0Ljc1LDg0LjUgQyAxNy4xNTgwNzYsODQuNTAwMDAxIDIyLjQzOTY5OSw4NC41MjQ1MTQgMjguMzc1LDgyLjA5Mzc1IEMgMzQuMzEwMzAxLDc5LjY2Mjk4NiA0MC45MTE1MzYsNzQuNzUwNDg0IDQ2LjA2MjUsNjUuMjE4NzUgTCA0NC43NSw2NC41IEwgNDYuMDYyNSw2My43ODEyNSBDIDM1Ljc1OTM4Nyw0NC43MTU1OSAxOS41MDY1NzQsNDQuNSAxNC43NSw0NC41IEwgMC43NSw0NC41IEwgLTIuNDA2MjUsNDQuNSB6IE0gMy40Njg3NSw0Ny41IEwgMTQuNzUsNDcuNSBDIDE5LjQzNDE3Myw0Ny41IDMzLjAzNjg1LDQ3LjM2OTc5MyA0Mi43MTg3NSw2NC41IEMgMzcuOTUxOTY0LDcyLjkyOTA3NSAzMi4xOTc0NjksNzcuMTgzOTEgMjcsNzkuMzEyNSBDIDIxLjYzOTMzOSw4MS41MDc5MjQgMTcuMTU4MDc1LDgxLjUwMDAwMSAxNC43NSw4MS41IEwgMy41LDgxLjUgQyA1LjM3MzU4ODQsNzguMzkxNTY2IDguMjUsNzIuNDUwNjUgOC4yNSw2NC41IEMgOC4yNSw1Ni41MjY2NDYgNS4zNDE0Njg2LDUwLjU5OTgxNSAzLjQ2ODc1LDQ3LjUgeiIKICAgICAgICAgaWQ9InBhdGg0OTczIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc2NjY2NzY2NjY2NjY2Njc2Njc2MiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K"}}},{operation:function(t,e){return(!t||e)&&(t||!e)}}),lr=tr.define("logic.Xnor",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9IlhOT1IgQU5TSS5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMTUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxMCA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNzE0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MDYiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3NzciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNzUgOiA0MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxNTAgOiA2MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNjAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzI3NSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI1MCA6IDMzLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxMDAgOiA1MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTUzMyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzMiA6IDIxLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI2NCA6IDMyIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAzMiA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNTU3IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjI1IDogMTYuNjY2NjY3IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjUwIDogMjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDI1IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI0IgogICAgIGlua3NjYXBlOmN4PSI5NS43MjM2NiIKICAgICBpbmtzY2FwZTpjeT0iLTI2Ljc3NTAyMyIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzOTkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIzMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAwMDAwMDI0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDc4LjMzMzMzMiwyNSBDIDkxLjY2NjY2NiwyNSA5NSwyNSA5NSwyNSIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45OTk5OTk4ODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMC4zODU3MTcsMTUgTCA0Ljk5OTk5OTgsMTUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45OTk5OTk3NjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMS4zNjIwOTEsMzUgTCA0Ljk5OTk5OTgsMzUiCiAgICAgICBpZD0icGF0aDM5NDQiIC8+CiAgICA8ZwogICAgICAgaWQ9ImcyNTYwIgogICAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNi41LC0zOS41KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzUxNiIKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJNIC0yLjI1LDgxLjUwMDAwNSBDIC0zLjg0NzM3NCw4NC4xNDQ0MDUgLTQuNSw4NC41MDAwMDUgLTQuNSw4NC41MDAwMDUgTCAtOC4xNTYyNSw4NC41MDAwMDUgTCAtNi4xNTYyNSw4Mi4wNjI1MDUgQyAtNi4xNTYyNSw4Mi4wNjI1MDUgLTAuNSw3NS4wNjI0NTEgLTAuNSw2NC41IEMgLTAuNSw1My45Mzc1NDkgLTYuMTU2MjUsNDYuOTM3NSAtNi4xNTYyNSw0Ni45Mzc1IEwgLTguMTU2MjUsNDQuNSBMIC00LjUsNDQuNSBDIC0zLjcxODc1LDQ1LjQzNzUgLTMuMDc4MTI1LDQ2LjE1NjI1IC0yLjI4MTI1LDQ3LjUgQyAtMC40MDg1MzEsNTAuNTk5ODE1IDIuNSw1Ni41MjY2NDYgMi41LDY0LjUgQyAyLjUsNzIuNDUwNjUgLTAuMzk2Njk3LDc4LjM3OTQyNSAtMi4yNSw4MS41MDAwMDUgeiIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2Njc2NjY2NzYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJNIC0yLjQwNjI1LDQ0LjUgTCAtMC40MDYyNSw0Ni45Mzc1IEMgLTAuNDA2MjUsNDYuOTM3NSA1LjI1LDUzLjkzNzU0OSA1LjI1LDY0LjUgQyA1LjI1LDc1LjA2MjQ1MSAtMC40MDYyNSw4Mi4wNjI1IC0wLjQwNjI1LDgyLjA2MjUgTCAtMi40MDYyNSw4NC41IEwgMC43NSw4NC41IEwgMTQuNzUsODQuNSBDIDE3LjE1ODA3Niw4NC41MDAwMDEgMjIuNDM5Njk5LDg0LjUyNDUxNCAyOC4zNzUsODIuMDkzNzUgQyAzNC4zMTAzMDEsNzkuNjYyOTg2IDQwLjkxMTUzNiw3NC43NTA0ODQgNDYuMDYyNSw2NS4yMTg3NSBMIDQ0Ljc1LDY0LjUgTCA0Ni4wNjI1LDYzLjc4MTI1IEMgMzUuNzU5Mzg3LDQ0LjcxNTU5IDE5LjUwNjU3NCw0NC41IDE0Ljc1LDQ0LjUgTCAwLjc1LDQ0LjUgTCAtMi40MDYyNSw0NC41IHogTSAzLjQ2ODc1LDQ3LjUgTCAxNC43NSw0Ny41IEMgMTkuNDM0MTczLDQ3LjUgMzMuMDM2ODUsNDcuMzY5NzkzIDQyLjcxODc1LDY0LjUgQyAzNy45NTE5NjQsNzIuOTI5MDc1IDMyLjE5NzQ2OSw3Ny4xODM5MSAyNyw3OS4zMTI1IEMgMjEuNjM5MzM5LDgxLjUwNzkyNCAxNy4xNTgwNzUsODEuNTAwMDAxIDE0Ljc1LDgxLjUgTCAzLjUsODEuNSBDIDUuMzczNTg4NCw3OC4zOTE1NjYgOC4yNSw3Mi40NTA2NSA4LjI1LDY0LjUgQyA4LjI1LDU2LjUyNjY0NiA1LjM0MTQ2ODYsNTAuNTk5ODE1IDMuNDY4NzUsNDcuNSB6IgogICAgICAgICBpZD0icGF0aDQ5NzMiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NzY2NjY3NjY2NjY2NjY2NzY2NzYyIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICBpZD0icGF0aDM1NTEiCiAgICAgICBzb2RpcG9kaTpjeD0iNzUiCiAgICAgICBzb2RpcG9kaTpjeT0iMjUiCiAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgIHNvZGlwb2RpOnJ5PSI0IgogICAgICAgZD0iTSA3OSwyNSBBIDQsNCAwIDEgMSA3MSwyNSBBIDQsNCAwIDEgMSA3OSwyNSB6IiAvPgogIDwvZz4KPC9zdmc+Cg=="}}},{operation:function(t,e){return(!t||!e)&&(t||e)}}),cr={Gate:Qn,IO:_n,Input:Kn,Output:qn,Gate11:$n,Gate21:tr,Repeater:er,Not:ir,Or:nr,And:rr,Nor:or,Nand:sr,Xor:ar,Xnor:lr,Wire:We.define("logic.Wire",{attrs:{".connection":{"stroke-width":2},".marker-vertex":{r:7}},router:{name:"orthogonal"},connector:{name:"rounded",args:{radius:10}}},{arrowheadMarkup:['','',""].join(""),vertexMarkup:['','','','','',"Remove vertex.","","",""].join("")})},gr={KingWhite:In.define("chess.KingWhite",{size:{width:42,height:38}},{markup:' '}),KingBlack:In.define("chess.KingBlack",{size:{width:42,height:38}},{markup:' '}),QueenWhite:In.define("chess.QueenWhite",{size:{width:42,height:38}},{markup:' '}),QueenBlack:In.define("chess.QueenBlack",{size:{width:42,height:38}},{markup:' '}),RookWhite:In.define("chess.RookWhite",{size:{width:32,height:34}},{markup:' '}),RookBlack:In.define("chess.RookBlack",{size:{width:32,height:34}},{markup:' '}),BishopWhite:In.define("chess.BishopWhite",{size:{width:38,height:38}},{markup:' '}),BishopBlack:In.define("chess.BishopBlack",{size:{width:38,height:38}},{markup:' '}),KnightWhite:In.define("chess.KnightWhite",{size:{width:38,height:37}},{markup:' '}),KnightBlack:In.define("chess.KnightBlack",{size:{width:38,height:37}},{markup:' '}),PawnWhite:In.define("chess.PawnWhite",{size:{width:28,height:33}},{markup:''}),PawnBlack:In.define("chess.PawnBlack",{size:{width:28,height:33}},{markup:''})},hr=Fe.define("erd.Entity",{size:{width:150,height:60},attrs:{".outer":{fill:"#2ECC71",stroke:"#27AE60","stroke-width":2,points:"100,0 100,60 0,60 0,0"},".inner":{fill:"#2ECC71",stroke:"#27AE60","stroke-width":2,points:"95,5 95,55 5,55 5,5",display:"none"},text:{text:"Entity","font-family":"Arial","font-size":14,"ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),ur=hr.define("erd.WeakEntity",{attrs:{".inner":{display:"auto"},text:{text:"Weak Entity"}}}),dr=Fe.define("erd.Relationship",{size:{width:80,height:80},attrs:{".outer":{fill:"#3498DB",stroke:"#2980B9","stroke-width":2,points:"40,0 80,40 40,80 0,40"},".inner":{fill:"#3498DB",stroke:"#2980B9","stroke-width":2,points:"40,5 75,40 40,75 5,40",display:"none"},text:{text:"Relationship","font-family":"Arial","font-size":12,"ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),fr=dr.define("erd.IdentifyingRelationship",{attrs:{".inner":{display:"auto"},text:{text:"Identifying"}}}),pr=Fe.define("erd.Attribute",{size:{width:100,height:50},attrs:{ellipse:{transform:"translate(50, 25)"},".outer":{stroke:"#D35400","stroke-width":2,cx:0,cy:0,rx:50,ry:25,fill:"#E67E22"},".inner":{stroke:"#D35400","stroke-width":2,cx:0,cy:0,rx:45,ry:20,fill:"#E67E22",display:"none"},text:{"font-family":"Arial","font-size":14,"ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),Ir=pr.define("erd.Multivalued",{attrs:{".inner":{display:"block"},text:{text:"multivalued"}}}),mr=pr.define("erd.Derived",{attrs:{".outer":{"stroke-dasharray":"3,5"},text:{text:"derived"}}}),Ar=pr.define("erd.Key",{attrs:{ellipse:{"stroke-width":4},text:{text:"key","font-weight":"800","text-decoration":"underline"}}}),vr=pr.define("erd.Normal",{attrs:{text:{text:"Normal"}}}),Cr={Entity:hr,WeakEntity:ur,Relationship:dr,IdentifyingRelationship:fr,Attribute:pr,Multivalued:Ir,Derived:mr,Key:Ar,Normal:vr,ISA:Fe.define("erd.ISA",{type:"erd.ISA",size:{width:100,height:50},attrs:{polygon:{points:"0,0 50,50 100,0",fill:"#F1C40F",stroke:"#F39C12","stroke-width":2},text:{text:"ISA","font-size":18,"ref-x":.5,"ref-y":.3,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),Line:We.define("erd.Line",{},{cardinality:function(t){this.set("labels",[{position:-20,attrs:{text:{dy:-8,text:t}}}])}})},wr={State:Cn.define("fsa.State",{attrs:{circle:{"stroke-width":3},text:{"font-weight":"800"}}}),StartState:Fe.define("fsa.StartState",{size:{width:20,height:20},attrs:{circle:{transform:"translate(10, 10)",r:10,fill:"#000000"}}},{markup:''}),EndState:Fe.define("fsa.EndState",{size:{width:20,height:20},attrs:{".outer":{transform:"translate(10, 10)",r:10,fill:"#ffffff",stroke:"#000000"},".inner":{transform:"translate(10, 10)",r:6,fill:"#000000"}}},{markup:''}),Arrow:We.define("fsa.Arrow",{attrs:{".marker-target":{d:"M 10 0 L 0 5 L 10 10 z"}},smooth:!0})},yr={Member:Fe.define("org.Member",{size:{width:180,height:70},attrs:{rect:{width:170,height:60},".card":{fill:"#FFFFFF",stroke:"#000000","stroke-width":2,"pointer-events":"visiblePainted",rx:10,ry:10},image:{width:48,height:48,ref:".card","ref-x":10,"ref-y":5},".rank":{"text-decoration":"underline",ref:".card","ref-x":.9,"ref-y":.2,"font-family":"Courier New","font-size":14,"text-anchor":"end"},".name":{"font-weight":"800",ref:".card","ref-x":.9,"ref-y":.6,"font-family":"Courier New","font-size":14,"text-anchor":"end"}}},{markup:''}),Arrow:We.define("org.Arrow",{source:{selector:".card"},target:{selector:".card"},attrs:{".connection":{stroke:"#585858","stroke-width":3}},z:-1})},br={Place:In.define("pn.Place",{size:{width:50,height:50},attrs:{".root":{r:25,fill:"#ffffff",stroke:"#000000",transform:"translate(25, 25)"},".label":{"text-anchor":"middle","ref-x":.5,"ref-y":-20,ref:".root",fill:"#000000","font-size":12},".tokens > circle":{fill:"#000000",r:5},".tokens.one > circle":{transform:"translate(25, 25)"},".tokens.two > circle:nth-child(1)":{transform:"translate(19, 25)"},".tokens.two > circle:nth-child(2)":{transform:"translate(31, 25)"},".tokens.three > circle:nth-child(1)":{transform:"translate(18, 29)"},".tokens.three > circle:nth-child(2)":{transform:"translate(25, 19)"},".tokens.three > circle:nth-child(3)":{transform:"translate(32, 29)"},".tokens.alot > text":{transform:"translate(25, 18)","text-anchor":"middle",fill:"#000000"}}},{markup:''}),PlaceView:$e.extend({presentationAttributes:$e.addPresentationAttributes({tokens:["TOKENS"]}),initFlag:$e.prototype.initFlag.concat(["TOKENS"]),confirmUpdate:function(){for(var t,e=[],i=arguments.length;i--;)e[i]=arguments[i];var n=(t=$e.prototype.confirmUpdate).call.apply(t,[this].concat(e));return this.hasFlag(n,"TOKENS")&&(this.renderTokens(),this.update(),n=this.removeFlag(n,"TOKENS")),n},renderTokens:function(){var e=this.vel.findOne(".tokens").empty();["one","two","three","alot"].forEach(function(t){e.removeClass(t)});var t=this.model.get("tokens");if(t)switch(t){case 1:e.addClass("one"),e.append(q("circle"));break;case 2:e.addClass("two"),e.append([q("circle"),q("circle")]);break;case 3:e.addClass("three"),e.append([q("circle"),q("circle"),q("circle")]);break;default:e.addClass("alot"),e.append(q("text").text(t+""))}}}),Transition:In.define("pn.Transition",{size:{width:12,height:50},attrs:{rect:{width:12,height:50,fill:"#000000",stroke:"#000000"},".label":{"text-anchor":"middle","ref-x":.5,"ref-y":-20,ref:"rect",fill:"#000000","font-size":12}}},{markup:''}),Link:We.define("pn.Link",{attrs:{".marker-target":{d:"M 10 0 L 0 5 L 10 10 z"}}})},Nr=In.define("uml.Class",{attrs:{rect:{width:200},".uml-class-name-rect":{stroke:"black","stroke-width":2,fill:"#3498db"},".uml-class-attrs-rect":{stroke:"black","stroke-width":2,fill:"#2980b9"},".uml-class-methods-rect":{stroke:"black","stroke-width":2,fill:"#2980b9"},".uml-class-name-text":{ref:".uml-class-name-rect","ref-y":.5,"ref-x":.5,"text-anchor":"middle","y-alignment":"middle","font-weight":"bold",fill:"black","font-size":12,"font-family":"Times New Roman"},".uml-class-attrs-text":{ref:".uml-class-attrs-rect","ref-y":5,"ref-x":5,fill:"black","font-size":12,"font-family":"Times New Roman"},".uml-class-methods-text":{ref:".uml-class-methods-rect","ref-y":5,"ref-x":5,fill:"black","font-size":12,"font-family":"Times New Roman"}},name:[],attributes:[],methods:[]},{markup:['','','',"",'',""].join(""),initialize:function(){this.on("change:name change:attributes change:methods",function(){this.updateRectangles(),this.trigger("uml-update")},this),this.updateRectangles(),In.prototype.initialize.apply(this,arguments)},getClassName:function(){return this.get("name")},updateRectangles:function(){var n=this.get("attrs"),t=[{type:"name",text:this.getClassName()},{type:"attrs",text:this.get("attributes")},{type:"methods",text:this.get("methods")}],r=0;t.forEach(function(t){var e=Array.isArray(t.text)?t.text:[t.text],i=20*e.length+20;n[".uml-class-"+t.type+"-text"].text=e.join("\n"),n[".uml-class-"+t.type+"-rect"].height=i,n[".uml-class-"+t.type+"-rect"].transform="translate(0,"+r+")",r+=i})}}),Mr=$e.extend({initialize:function(){$e.prototype.initialize.apply(this,arguments),this.listenTo(this.model,"uml-update",function(){this.update(),this.resize()})}}),xr=Nr.define("uml.Abstract",{attrs:{".uml-class-name-rect":{fill:"#e74c3c"},".uml-class-attrs-rect":{fill:"#c0392b"},".uml-class-methods-rect":{fill:"#c0392b"}}},{getClassName:function(){return["<>",this.get("name")]}}),Sr=Mr,kr=Nr.define("uml.Interface",{attrs:{".uml-class-name-rect":{fill:"#f1c40f"},".uml-class-attrs-rect":{fill:"#f39c12"},".uml-class-methods-rect":{fill:"#f39c12"}}},{getClassName:function(){return["<>",this.get("name")]}}),Dr={basic:zn,standard:Xn,devs:Hn,logic:cr,chess:gr,erd:Cr,fsa:wr,org:yr,pn:br,uml:{Class:Nr,ClassView:Mr,Abstract:xr,AbstractView:Sr,Interface:kr,InterfaceView:Mr,Generalization:We.define("uml.Generalization",{attrs:{".marker-target":{d:"M 20 0 L 0 10 L 20 20 z",fill:"white"}}}),Implementation:We.define("uml.Implementation",{attrs:{".marker-target":{d:"M 20 0 L 0 10 L 20 20 z",fill:"white"},".connection":{"stroke-dasharray":"3,3"}}}),Aggregation:We.define("uml.Aggregation",{attrs:{".marker-target":{d:"M 40 10 L 20 20 L 0 10 L 20 0 z",fill:"white"}}}),Composition:We.define("uml.Composition",{attrs:{".marker-target":{d:"M 40 10 L 20 20 L 0 10 L 20 0 z",fill:"black"}}}),Association:We.define("uml.Association"),State:In.define("uml.State",{attrs:{".uml-state-body":{width:200,height:200,rx:10,ry:10,fill:"#ecf0f1",stroke:"#bdc3c7","stroke-width":3},".uml-state-separator":{stroke:"#bdc3c7","stroke-width":2},".uml-state-name":{ref:".uml-state-body","ref-x":.5,"ref-y":5,"text-anchor":"middle",fill:"#000000","font-family":"Courier New","font-size":14},".uml-state-events":{ref:".uml-state-separator","ref-x":5,"ref-y":5,fill:"#000000","font-family":"Courier New","font-size":14}},name:"State",events:[]},{markup:['','','',"",'','','',""].join(""),initialize:function(){this.on({"change:name":this.updateName,"change:events":this.updateEvents,"change:size":this.updatePath},this),this.updateName(),this.updateEvents(),this.updatePath(),In.prototype.initialize.apply(this,arguments)},updateName:function(){this.attr(".uml-state-name/text",this.get("name"))},updateEvents:function(){this.attr(".uml-state-events/text",this.get("events").join("\n"))},updatePath:function(){var t="M 0 20 L "+this.get("size").width+" 20";this.attr(".uml-state-separator/d",t,{silent:!0})}}),StartState:Cn.define("uml.StartState",{type:"uml.StartState",attrs:{circle:{fill:"#34495e",stroke:"#2c3e50","stroke-width":2,rx:1}}}),EndState:In.define("uml.EndState",{size:{width:20,height:20},attrs:{"circle.outer":{transform:"translate(10, 10)",r:10,fill:"#ffffff",stroke:"#2c3e50"},"circle.inner":{transform:"translate(10, 10)",r:6,fill:"#34495e"}}},{markup:''}),Transition:We.define("uml.Transition",{attrs:{".marker-target":{d:"M 10 0 L 0 5 L 10 10 z",fill:"#34495e",stroke:"#2c3e50"},".connection":{stroke:"#2c3e50"}}})}};function zr(t,e){return 0===e?"0%":Math.round(t/e*100)+"%"}function jr(r){return function(t,e,i,n){return(e.isNodeConnection(i)?Zr:Tr)(r,t,e,i,n)}}function Tr(t,e,i,n,r){var o=i.model.angle(),s=i.getNodeUnrotatedBBox(n),a=i.model.getBBox().center();r.rotate(a,o);var l=r.x-s.x,c=r.y-s.y;return t&&(l=zr(l,s.width),c=zr(c,s.height)),e.anchor={name:"topLeft",args:{dx:l,dy:c,rotate:!0}},e}function Zr(t,e,i,n,r){var o=i.getConnection();if(!o)return e;var s=o.closestPointLength(r);if(t){var a=o.length();e.anchor={name:"connectionRatio",args:{ratio:s/a}}}else e.anchor={name:"connectionLength",args:{length:s}};return e}var Lr=he,Pr=jr(!1),Gr=jr(!0),Br={useDefaults:Lr,pinAbsolute:Pr,pinRelative:Gr};function Or(t,e,i){return Gr.call(this.paper,{},e,i,t,this.model).anchor}function Er(t,e){var i=t.model;return e?i.getBBox():i.isLink()?t.getConnection().bbox():t.getNodeUnrotatedBBox(t.el)}var Yr=_e.extend({tagName:"circle",svgElement:!0,className:"marker-vertex",events:{mousedown:"onPointerDown",touchstart:"onPointerDown",dblclick:"onDoubleClick"},documentEvents:{mousemove:"onPointerMove",touchmove:"onPointerMove",mouseup:"onPointerUp",touchend:"onPointerUp",touchcancel:"onPointerUp"},attributes:{r:6,fill:"#33334F",stroke:"#FFFFFF","stroke-width":2,cursor:"move"},position:function(t,e){this.vel.attr({cx:t,cy:e})},onPointerDown:function(t){this.options.guard(t)||(t.stopPropagation(),t.preventDefault(),this.options.paper.undelegateEvents(),this.delegateDocumentEvents(null,t.data),this.trigger("will-change",this,t))},onPointerMove:function(t){this.trigger("changing",this,t)},onDoubleClick:function(t){this.trigger("remove",this,t)},onPointerUp:function(t){this.trigger("changed",this,t),this.undelegateDocumentEvents(),this.options.paper.delegateEvents()}}),Rr=hn.extend({name:"vertices",options:{handleClass:Yr,snapRadius:20,redundancyRemoval:!0,vertexAdding:!0,stopPropagation:!0},children:[{tagName:"path",selector:"connection",className:"joint-vertices-path",attributes:{fill:"none",stroke:"transparent","stroke-width":10,cursor:"cell"}}],handles:null,events:{"mousedown .joint-vertices-path":"onPathPointerDown","touchstart .joint-vertices-path":"onPathPointerDown"},onRender:function(){return this.options.vertexAdding&&(this.renderChildren(),this.updatePath()),this.resetHandles(),this.renderHandles(),this},update:function(){return this.relatedView.model.vertices().length===this.handles.length?this.updateHandles():(this.resetHandles(),this.renderHandles()),this.options.vertexAdding&&this.updatePath(),this},resetHandles:function(){var t=this.handles;if(this.handles=[],this.stopListening(),Array.isArray(t))for(var e=0,i=t.length;e>>0;if(0===n)return!1;var r,o,s=0|e,a=Math.max(0<=s?s:n-Math.abs(s),0);for(;a>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var n=arguments[1],r=0;r>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var n=arguments[1],r=0;r>8-r%1*8)){if(255<(i=n.charCodeAt(r+=.75)))throw new l("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");e=e<<8|i}return s}),t.atob||(t.atob=function(t){var e=String(t).replace(/=+$/,"");if(e.length%4==1)throw new l("'atob' failed: The string to be decoded is not correctly encoded.");for(var i,n,r=0,o=0,s="";n=e.charAt(o++);~n&&(i=r%4?64*i+n:n,r++%4)?s+=String.fromCharCode(255&i>>(-2*r&6)):0)n=a.indexOf(n);return s})}(),Number.isFinite=Number.isFinite||function(t){return"number"==typeof t&&isFinite(t)},Number.isNaN=Number.isNaN||function(t){return t!=t},String.prototype.includes||(String.prototype.includes=function(t,e){return"number"!=typeof e&&(e=0),!(e+t.length>this.length)&&-1!==this.indexOf(t,e)}),String.prototype.startsWith||(String.prototype.startsWith=function(t,e){return this.substr(e||0,t.length)===t}),function(){function n(t,e){return this.slice(t,e)}function r(t,e){arguments.length<2&&(e=0);for(var i=0,n=t.length;ia.x+o/2,h=na.x?r-30:r+30)-c)/(s*s*(n-l))+l:e=s*s/(r-c)-s*s*(n-l)*((i=r>a.y?n+30:n-30)-l)/(o*o*(r-c))+c,new E(i,e).theta(t)},toString:function(){return new E(this.x,this.y).toString()+" "+this.a+" "+this.b}};var B=function(t,e){return this instanceof B?t instanceof B?new B(t.start,t.end):(this.start=new E(t),void(this.end=new E(e))):new B(t,e)};B.prototype={angle:function(){var t=new E(this.start.x+1,this.start.y);return this.start.angleBetween(this.end,t)},bbox:function(){var t=P(this.start.x,this.end.x),e=P(this.start.y,this.end.y),i=G(this.start.x,this.end.x),n=G(this.start.y,this.end.y);return new H(t,e,i-t,n-e)},bearing:function(){var t=y(this.start.y),e=y(this.end.y),i=this.start.x,n=this.end.x,r=y(n-i),o=h(r)*g(e),s=g(t)*h(e)-h(t)*g(e)*g(r),a=A(u(o,s))-22.5;return a<0&&(a+=360),["NE","E","SE","S","SW","W","NW","N"][a=parseInt(a/45)]},clone:function(){return new B(this.start,this.end)},closestPoint:function(t){return this.pointAt(this.closestPointNormalizedLength(t))},closestPointLength:function(t){return this.closestPointNormalizedLength(t)*this.length()},closestPointNormalizedLength:function(t){var e=this.vector().dot(new B(this.start,t).vector()),i=P(1,G(0,e/this.squaredLength()));return i!=i?0:i},closestPointTangent:function(t){return this.tangentAt(this.closestPointNormalizedLength(t))},containsPoint:function(t){var e=this.start,i=this.end;if(0!==e.cross(t,i))return!1;var n=this.length();return!(new B(e,t).length()>n)&&!(new B(t,i).length()>n)},divideAt:function(t){var e=this.pointAt(t);return[new B(this.start,e),new B(e,this.end)]},divideAtLength:function(t){var e=this.pointAtLength(t);return[new B(this.start,e),new B(e,this.end)]},equals:function(t){return!!t&&this.start.x===t.start.x&&this.start.y===t.start.y&&this.end.x===t.end.x&&this.end.y===t.end.y},intersect:function(t,e){if(t instanceof B||t instanceof H||t instanceof D||t instanceof w||t instanceof O){var i=t.intersectionWithLine(this,e);return i&&t instanceof B&&(i=i[0]),i}return null},intersectionWithLine:function(t){var e=new E(this.end.x-this.start.x,this.end.y-this.start.y),i=new E(t.end.x-t.start.x,t.end.y-t.start.y),n=e.x*i.y-e.y*i.x,r=new E(t.start.x-this.start.x,t.start.y-this.start.y),o=r.x*i.y-r.y*i.x,s=r.x*e.y-r.y*e.x;if(0===n||o*n<0||s*n<0)return null;if(0c.y||r>l.y&&r<=c.y){var h=l.x-n>c.x-n?l.x-n:c.x-n;if(0<=h){var u=new E(n+h,r),d=new B(t,u);g.intersect(d)&&a++}}o=s}return a%2==1},convexHull:function(){var t,e,i,n=this.points,r=n.length;if(0===r)return new D;for(t=0;ti.x&&(i=n[t]);var o=[];for(t=0;t=this.x&&t.x<=this.x+this.width&&t.y>=this.y&&t.y<=this.y+this.height},containsRect:function(t){var e=new H(this).normalize(),i=new H(t).normalize(),n=e.width,r=e.height,o=i.width,s=i.height;if(!(n&&r&&o&&s))return!1;var a=e.x,l=e.y,c=i.x,g=i.y;return o+=c,n+=a,s+=g,r+=l,a<=c&&o<=n&&l<=g&&s<=r},corner:function(){return new E(this.x+this.width,this.y+this.height)},equals:function(t){var e=new H(this).normalize(),i=new H(t).normalize();return e.x===i.x&&e.y===i.y&&e.width===i.width&&e.height===i.height},inflate:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.x-=t,this.y-=e,this.width+=2*t,this.height+=2*e,this},intersect:function(t){var e=this.origin(),i=this.corner(),n=t.origin(),r=t.corner();if(r.x<=e.x||r.y<=e.y||n.x>=i.x||n.y>=i.y)return null;var o=G(e.x,n.x),s=G(e.y,n.y);return new H(o,s,P(i.x,r.x)-o,P(i.y,r.y)-s)},intersectionWithLine:function(t){var e,i,n=[this.topLine(),this.rightLine(),this.bottomLine(),this.leftLine()],r=[],o=[],s=n.length;for(i=0;ig&&(n=(this.x+this.width-g)/(d.x-g)),d.y>h&&(a=(this.y+this.height-h)/(d.y-h));var f=t.topRight();f.x>g&&(r=(this.x+this.width-g)/(f.x-g)),f.yh&&(c=(this.y+this.height-h)/(p.y-h)),{sx:P(i,n,r,o),sy:P(s,a,l,c)}},maxRectUniformScaleToFit:function(t,e){var i=this.maxRectScaleToFit(t,e);return P(i.sx,i.sy)},moveAndExpand:function(t){return this.x+=t.x||0,this.y+=t.y||0,this.width+=t.width||0,this.height+=t.height||0,this},normalize:function(){var t=this.x,e=this.y,i=this.width,n=this.height;return this.width<0&&(t=this.x+this.width,i=-this.width),this.height<0&&(e=this.y+this.height,n=-this.height),this.x=t,this.y=e,this.width=i,this.height=n,this},offset:function(t,e){return E.prototype.offset.call(this,t,e)},origin:function(){return new E(this.x,this.y)},pointNearestToPoint:function(t){if(t=new E(t),this.containsPoint(t))switch(this.sideNearestToPoint(t)){case"right":return new E(this.x+this.width,t.y);case"left":return new E(this.x,t.y);case"bottom":return new E(t.x,this.y+this.height);case"top":return new E(t.x,this.y)}return t.adhereToRect(this)},rightLine:function(){return new B(this.topRight(),this.bottomRight())},rightMiddle:function(){return new E(this.x+this.width,this.y+this.height/2)},round:function(t){var e=k(10,t||0);return this.x=a(this.x*e)/e,this.y=a(this.y*e)/e,this.width=a(this.width*e)/e,this.height=a(this.height*e)/e,this},scale:function(t,e,i){return i=this.origin().scale(t,e,i),this.x=i.x,this.y=i.y,this.width*=t,this.height*=e,this},sideNearestToPoint:function(t){var e=(t=new E(t)).x-this.x,i=this.x+this.width-t.x,n=t.y-this.y,r=e,o="left";return i'+t+"";return T.parseXML(e,{async:!1}).documentElement}var i=document.createElementNS(z.svg,"svg");return i.setAttributeNS(z.xmlns,"xmlns:xlink",z.xlink),i.setAttribute("version","1.1"),i},T.idCounter=0,T.uniqueId=function(){return"v-"+ ++T.idCounter},T.toNode=function(t){return T.isV(t)?t.node:t.nodeName&&t||t[0]},T.ensureId=function(t){return(t=T.toNode(t)).id||(t.id=T.uniqueId())},T.sanitizeText=function(t){return(t||"").replace(/ /g," ")},T.isUndefined=function(t){return void 0===t},T.isString=function(t){return"string"==typeof t},T.isObject=function(t){return t&&"object"==typeof t},T.isArray=Array.isArray,T.parseXML=function(t,e){var i;e=e||{};try{var n=new DOMParser;T.isUndefined(e.async)||(n.async=e.async),i=n.parseFromString(t,"text/xml")}catch(t){i=void 0}if(!i||i.getElementsByTagName("parsererror").length)throw new Error("Invalid XML: "+t);return i},T.qualifyAttr=function(t){if(-1===t.indexOf(":"))return{ns:null,local:t};var e=t.split(":");return{ns:z[e[0]],local:e[1]}},T.transformRegex=/(\w+)\(([^,)]+),?([^)]+)?\)/gi,T.transformSeparatorRegex=/[ ,]+/,T.transformationListRegex=/^(\w+)\((.*)\)/,T.transformStringToMatrix=function(t){var e=T.createSVGMatrix(),i=t&&t.match(T.transformRegex);if(!i)return e;for(var n=0,r=i.length;n=t.start&&et.start&&i<=t.end||t.start>=e&&t.end=e?t.end+=i:t.start>=e&&(t.start+=i,t.end+=i)}),t},T.convertLineToPathData=function(t){return["M",(t=T(t)).attr("x1"),t.attr("y1"),"L",t.attr("x2"),t.attr("y2")].join(" ")},T.convertPolygonToPathData=function(t){var e=T.getPointsFromSvgNode(t);return 0===e.length?null:T.svgPointsToPath(e)+" Z"},T.convertPolylineToPathData=function(t){var e=T.getPointsFromSvgNode(t);return 0===e.length?null:T.svgPointsToPath(e)},T.svgPointsToPath=function(t){for(var e=0,i=t.length;e=o[r]&&(s.push([e].concat(n.splice(0,o[r]))),o[r]););}),s}(t)),!t||!t.length)return[["M",0,0]];for(var e,i=[],n=0,r=0,o=0,s=0,a=t.length,l=0;lu){var x=N,S=l,k=c;f=t(l=w+n*F(N=b+u*(a&&bd)D=d-1;else if(void 0!==o){var z;if(void 0===I)I=(z="auto"===i.lineHeight?{value:1.5,unit:"em"}:pt(i.lineHeight,["em"])||{value:1,unit:"em"}).value,"em"===z.unit&&(I*=l.getBBox().height);I*v.length>o&&(D=Math.floor(o/I)-1)}if(null!==D){v.splice(D+1);var T=n.ellipsis;if(!T||D<0)break;"string"!=typeof T&&(T="…");var j=v[D];if(!j)break;var L,Z,P=j.length;do{if(Z=j[P],L=j.substring(0,P),Z?Z.match(g)&&(L+=Z):L+="string"==typeof g?g:" ",L+=T,c.data=L,a.getComputedTextLength()<=r){v[D]=L;break}P--}while(0<=P);break}}}return n.svgDocument?s.removeChild(l):document.body.removeChild(s),v.join(h)},mt=function(t){var e=S(S.parseHTML("
"+t+"
",null,!1));return e.find("*").each(function(){var i=this;S.each(i.attributes,function(){var t=this.name,e=this.value;(t.startsWith("on")||e.startsWith("javascript:")||e.startsWith("data:")||e.startsWith("vbscript:"))&&S(i).removeAttr(t)})}),e.html()},At=function(t,e){if(window.navigator.msSaveBlob)window.navigator.msSaveBlob(t,e);else{var i=window.URL.createObjectURL(t),n=document.createElement("a");n.href=i,n.download=e,document.body.appendChild(n),n.click(),document.body.removeChild(n),window.URL.revokeObjectURL(i)}},vt=function(t){t=t.replace(/\s/g,"");var e,i=(t=decodeURIComponent(t)).indexOf(","),n=t.slice(0,i),r=n.split(":")[1].split(";")[0],o=t.slice(i+1);e=0<=n.indexOf("base64")?atob(o):unescape(encodeURIComponent(o));for(var s=new Uint8Array(e.length),a=0;a')({color:t.color||"blue",opacity:Number.isFinite(t.opacity)?t.opacity:1,outerRadius:e+i,innerRadius:e})},highlight:function(t){return xt('')({color:t.color||"red",width:Number.isFinite(t.width)?t.width:1,blur:Number.isFinite(t.blur)?t.blur:0,opacity:Number.isFinite(t.opacity)?t.opacity:1})},blur:function(t){var e=Number.isFinite(t.x)?t.x:2;return xt('')({stdDeviation:Number.isFinite(t.y)?[e,t.y]:e})},dropShadow:function(t){var e="SVGFEDropShadowElement"in window?'':'';return xt(e)({dx:t.dx||0,dy:t.dy||0,opacity:Number.isFinite(t.opacity)?t.opacity:1,color:t.color||"black",blur:Number.isFinite(t.blur)?t.blur:4})},grayscale:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({a:.2126+.7874*(1-e),b:.7152-.7152*(1-e),c:.0722-.0722*(1-e),d:.2126-.2126*(1-e),e:.7152+.2848*(1-e),f:.0722-.0722*(1-e),g:.2126-.2126*(1-e),h:.0722+.9278*(1-e)})},sepia:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({a:.393+.607*(1-e),b:.769-.769*(1-e),c:.189-.189*(1-e),d:.349-.349*(1-e),e:.686+.314*(1-e),f:.168-.168*(1-e),g:.272-.272*(1-e),h:.534-.534*(1-e),i:.131+.869*(1-e)})},saturate:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({amount:1-e})},hueRotate:function(t){return xt('')({angle:t.angle||0})},invert:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({amount:e,amount2:1-e})},brightness:function(t){return xt('')({amount:Number.isFinite(t.amount)?t.amount:1})},contrast:function(t){var e=Number.isFinite(t.amount)?t.amount:1;return xt('')({amount:e,amount2:.5-e/2})}},Mt={number:function(t,e,o){o=o||{currency:["$",""],decimal:".",thousands:",",grouping:[3]};var i=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i.exec(t),n=i[1]||" ",r=i[2]||">",s=i[3]||"",a=i[4]||"",l=i[5],c=+i[6],g=i[7],h=i[8],u=i[9],d=1,f="",p="",I=!1;switch(h&&(h=+h.substring(1)),(l||"0"===n&&"="===r)&&(l=n="0",r="=",g&&(c-=Math.floor((c-1)/4))),u){case"n":g=!0,u="g";break;case"%":d=100,p="%",u="f";break;case"p":d=100,p="%",u="r";break;case"b":case"o":case"x":case"X":"#"===a&&(f="0"+u.toLowerCase());break;case"c":case"d":I=!0,h=0;break;case"s":d=-1,u="r"}"$"===a&&(f=o.currency[0],p=o.currency[1]),"r"!=u||h||(u="g"),null!=h&&("g"==u?h=Math.max(1,Math.min(21,h)):"e"!=u&&"f"!=u||(h=Math.max(0,Math.min(20,h))));var m=l&&g;if(I&&e%1)return"";var A=e<0||0===e&&1/e<0?(e=-e,"-"):s,v=p;if(d<0){var C=this.prefix(e,h);e=C.scale(e),v=C.symbol+p}else e*=d;var w=(e=this.convert(u,e,h)).lastIndexOf("."),y=w<0?e:e.substring(0,w),b=w<0?"":o.decimal+e.substring(w+1);function N(t){for(var e=t.length,i=[],n=0,r=o.grouping[0];0"===r?x+A+e:"^"===r?x.substring(0,M>>=1)+A+e+x.substring(M):A+(m?e:x+e))+v},string:function(t,e){for(var i,n="{",r=!1,o=[];-1!==(i=t.indexOf(n));){var s,a,l;if(s=t.slice(0,i),r){l=(a=s.split(":")).shift().split("."),s=e;for(var c=0;c|\$\{ ?([^{} ]+) ?\}|\{\{([^{} ]+)\}\}/g;return function(n){return n=n||{},t.replace(e,function(t){for(var e=Array.from(arguments).slice(1,4).find(function(t){return!!t}).split("."),i=n[e.shift()];void 0!==i&&e.length;)i=i[e.shift()];return void 0!==i?i:""})}},St=i.assign,kt=i.defaults,Dt=St,zt=i.defaultsDeep,Tt=i.assign,jt=i.defaults,Lt=i.defaultsDeep,Zt=i.invokeMap||i.invoke,Pt=i.sortedIndexBy||i.sortedIndex,Gt=i.uniqBy||i.uniq,Bt=i.clone,Ot=i.cloneDeep,Et=i.isEmpty,Yt=i.isEqual,Rt=i.isFunction,Wt=i.isPlainObject,Ut=i.toArray,Xt=i.debounce,Ft=i.groupBy,Vt=i.sortBy,Jt=i.flattenDeep,Ht=i.without,_t=i.difference,Qt=i.intersection,Kt=i.union,qt=i.has,$t=i.result,te=i.omit,ee=i.pick,ie=i.bindAll,ne=i.forIn,re=i.camelCase,oe=i.uniqueId,se=function(){if(i.mergeWith){var t=Array.from(arguments),e=t[t.length-1],n=Rt(e)?e:he;return t.push(function(t,e){var i=n(t,e);return void 0!==i?i:Array.isArray(t)&&!Array.isArray(e)?e:void 0}),i.mergeWith.apply(this,t)}return i.merge.apply(this,arguments)},ae=function(t){var e=Object.prototype.toString;return!0===t||!1===t||!!t&&"object"==typeof t&&"[object Boolean]"===e.call(t)},le=function(t){return!!t&&("object"==typeof t||"function"==typeof t)},ce=function(t){var e=Object.prototype.toString;return"number"==typeof t||!!t&&"object"==typeof t&&"[object Number]"===e.call(t)},ge=function(t){var e=Object.prototype.toString;return"string"==typeof t||!!t&&"object"==typeof t&&"[object String]"===e.call(t)},he=function(){};function ue(t){t=Gt(t);var s=Ut(t).reduce(function(t,e){return t[e.id]=e.clone(),t},{});return Ut(t).forEach(function(t){var e=s[t.id];if(e.isLink()){var i=e.source(),n=e.target();i.id&&s[i.id]&&e.prop("source/id",s[i.id].id),n.id&&s[n.id]&&e.prop("target/id",s[n.id].id)}var r=t.get("parent");r&&s[r]&&e.set("parent",s[r].id);var o=Ut(t.get("embeds")).reduce(function(t,e){return s[e]&&t.push(s[e].id),t},[]);Et(o)||e.set("embeds",o)}),s}function de(o,s){return function(t,e){var i=ft(t);t=parseFloat(t),i&&(t/=100);var n={};if(isFinite(t)){var r=i||0<=t&&t<=1?t*e[s]:Math.max(t+e[s],0);n[o]=r}return n}}function fe(s,a,l){return function(t,e){var i,n=ft(t);if(t=parseFloat(t),n&&(t/=100),isFinite(t)){var r=e[l]();i=n||0e.width?be:Ne)(t,e)})},refRCircumscribed:{set:function(t,e){var i=ft(t);t=parseFloat(t),i&&(t/=100);var n,r=Math.sqrt(e.height*e.height+e.width*e.width);return isFinite(t)&&(n=i||0<=t&&t<=1?t*r:Math.max(t+r,0)),{r:n}}},refCx:{set:de("cx","width")},refCy:{set:de("cy","height")},xAlignment:{offset:pe("x","width","right")},yAlignment:{offset:pe("y","height","bottom")},resetOffset:{offset:function(t,e){return t?{x:-e.x,y:-e.y}:{x:0,y:0}}},refDResetOffset:{set:me({resetOffset:!0})},refDKeepOffset:{set:me({resetOffset:!1})},refPointsResetOffset:{set:Ae({resetOffset:!0})},refPointsKeepOffset:{set:Ae({resetOffset:!1})},connection:{qualify:we,set:function(t){var e,i=t.stubs;if(void 0===i&&(i=0),isFinite(i)&&0!==i){var n;n=i<0?(this.getConnectionLength()+i)/2:i;var r=this.getConnection(),o=r.divideAtLength(n),s=r.divideAtLength(-n);o&&s&&(e=o[0].serialize()+" "+s[1].serialize())}return{d:e||this.getSerializedConnection()}}},atConnectionLengthKeepGradient:{qualify:we,set:ve("getTangentAtLength",{rotate:!0})},atConnectionLengthIgnoreGradient:{qualify:we,set:ve("getTangentAtLength",{rotate:!1})},atConnectionRatioKeepGradient:{qualify:we,set:ve("getTangentAtRatio",{rotate:!0})},atConnectionRatioIgnoreGradient:{qualify:we,set:ve("getTangentAtRatio",{rotate:!1})}};Me.refR=Me.refRInscribed,Me.refD=Me.refDResetOffset,Me.refPoints=Me.refPointsResetOffset,Me.atConnectionLength=Me.atConnectionLengthKeepGradient,Me.atConnectionRatio=Me.atConnectionRatioKeepGradient,Me.refX2=Me.refX,Me.refY2=Me.refY,Me.refWidth2=Me.refWidth,Me.refHeight2=Me.refHeight,Me["ref-x"]=Me.refX,Me["ref-y"]=Me.refY,Me["ref-dy"]=Me.refDy,Me["ref-dx"]=Me.refDx,Me["ref-width"]=Me.refWidth,Me["ref-height"]=Me.refHeight,Me["x-alignment"]=Me.xAlignment,Me["y-alignment"]=Me.yAlignment;var xe=Me,Se=s.Model.extend({constructor:function(t,e){var i,n=t||{};this.cid=oe("c"),this.attributes={},e&&e.collection&&(this.collection=e.collection),e&&e.parse&&(n=this.parse(n,e)||{}),(i=$t(this,"defaults"))&&(n=se({},i,n)),this.set(n,e),this.changed={},this.initialize.apply(this,arguments)},translate:function(t,e,i){throw new Error("Must define a translate() method.")},toJSON:function(){var e=this.constructor.prototype.defaults.attrs||{},t=this.attributes.attrs,o={};ne(t,function(t,n){var r=e[n];ne(t,function(t,i){le(t)&&!Array.isArray(t)?ne(t,function(t,e){r&&r[i]&&Yt(r[i][e],t)||(o[n]=o[n]||{},(o[n][i]||(o[n][i]={}))[e]=t)}):r&&Yt(r[i],t)||(o[n]=o[n]||{},o[n][i]=t)})});var i=Ot(te(this.attributes,"attrs"));return i.attrs=o,i},initialize:function(t){t&&t.id||this.set("id",this.generateId(),{silent:!0}),this._transitionIds={},this.processPorts(),this.on("change:attrs",this.processPorts,this)},generateId:function(){return lt()},processPorts:function(){var t=this.ports,i={};ne(this.get("attrs"),function(t,e){t&&t.port&&(void 0!==t.port.id?i[t.port.id]=t.port:i[t.port]={id:t.port})});var n={};(ne(t,function(t,e){i[e]||(n[e]=!0)}),this.graph&&!Et(n))&&(this.graph.getConnectedLinks(this,{inbound:!0}).forEach(function(t){n[t.get("target").port]&&t.remove()}),this.graph.getConnectedLinks(this,{outbound:!0}).forEach(function(t){n[t.get("source").port]&&t.remove()}));this.ports=i},remove:function(t){t=t||{};var e=this.graph;if(!e)return this.collection&&this.collection.remove(this,t),this;e.startBatch("remove");var i=this.getParentCell();i&&i.unembed(this);for(var n=this.getEmbeddedCells(),r=0,o=n.length;rc[2]?(s=".3em",r=g,o=0,"start"):lh[2]?(s=".3em",r=-c,o=0,"end"):l','','','','','','',''].join(""),toolMarkup:['','','','',"Remove link.","",'','','',"Link options.","",""].join(""),doubleToolMarkup:void 0,vertexMarkup:['','','','',"Remove vertex.","",""].join(""),arrowheadMarkup:['','',""].join(""),defaultLabel:void 0,labelMarkup:void 0,_builtins:{defaultLabel:{markup:[{tagName:"rect",selector:"rect"},{tagName:"text",selector:"text"}],attrs:{text:{fill:"#000000",fontSize:14,textAnchor:"middle",yAlignment:"middle",pointerEvents:"none"},rect:{ref:"text",fill:"#ffffff",rx:3,ry:3,refWidth:1,refHeight:1,refX:0,refY:0}},position:{distance:.5}}},defaults:{type:"link",source:{},target:{}},isLink:function(){return!0},disconnect:function(t){return this.set({source:{x:0,y:0},target:{x:0,y:0}},t)},source:function(t,e,i){return void 0===t?Bt(this.get("source")):(r=t instanceof Se?((n=Bt(e)||{}).id=t.id,i):Wt(t)?(n=t,e):((n=Bt(e)||{}).x=t.x,n.y=t.y,i),this.set("source",n,r));var n,r},target:function(t,e,i){return void 0===t?Bt(this.get("target")):(r=t instanceof Se?((n=Bt(e)||{}).id=t.id,i):Wt(t)?(n=t,e):((n=Bt(e)||{}).x=t.x,n.y=t.y,i),this.set("target",n,r));var n,r},router:function(t,e,i){if(void 0===t){var n=this.get("router");return n?"object"==typeof n?Bt(n):n:this.get("manhattan")?{name:"orthogonal"}:null}var r="object"==typeof t||"function"==typeof t,o=r?t:{name:t,args:e},s=r?e:i;return this.set("router",o,s)},connector:function(t,e,i){if(void 0===t){var n=this.get("connector");return n?"object"==typeof n?Bt(n):n:this.get("smooth")?{name:"smooth"}:null}var r="object"==typeof t||"function"==typeof t,o=r?t:{name:t,args:e},s=r?e:i;return this.set("connector",o,s)},label:function(t,e,i){var n=this.labels();return(t=isFinite(t)&&null!==t?0|t:0)<0&&(t=n.length+t),arguments.length<=1?this.prop(["labels",t]):this.prop(["labels",t],e,i)},labels:function(t,e){return 0===arguments.length?(t=this.get("labels"),Array.isArray(t)?t.slice():[]):(Array.isArray(t)||(t=[]),this.set("labels",t,e))},insertLabel:function(t,e,i){if(!e)throw new Error("dia.Link: no label provided");var n=this.labels(),r=n.length;return(t=isFinite(t)&&null!==t?0|t:r)<0&&(t=r+t+1),n.splice(t,0,e),this.labels(n,i)},appendLabel:function(t,e){return this.insertLabel(-1,t,e)},removeLabel:function(t,e){var i=this.labels();return t=isFinite(t)&&null!==t?0|t:-1,i.splice(t,1),this.labels(i,e)},vertex:function(t,e,i){var n=this.vertices();if((t=isFinite(t)&&null!==t?0|t:0)<0&&(t=n.length+t),arguments.length<=1)return this.prop(["vertices",t]);var r=this._normalizeVertex(e);return this.prop(["vertices",t],r,i)},vertices:function(t,e){if(0===arguments.length)return t=this.get("vertices"),Array.isArray(t)?t.slice():[];Array.isArray(t)||(t=[]);for(var i=[],n=0;n "+e),i=this.getSelector(t.parentNode,i)}return i},getLinkEnd:function(t){for(var e,i=[],n=arguments.length-1;0r.options.clickThreshold||this.notify("element:magnet:pointerclick",t,e,i,n)}});Tt($e.prototype,Fe);var ti={N:"S",S:"N",E:"W",W:"E"},ei={N:-Math.PI/2*3,S:-Math.PI/2,E:0,W:Math.PI};function ii(t,e,i){var n=new E(t.x,e.y);return i.containsPoint(n)&&(n=new E(e.x,t.y)),n}function ni(t,e){return t["W"===e||"E"===e?"width":"height"]}function ri(t,e){return t.x===e.x?t.y>e.y?"N":"S":t.y===e.y?t.x>e.x?"W":"E":null}function oi(t){return new H(t.x,t.y,0,0)}function si(t){var e=wt(t.padding||t.elementPadding||20);return{x:-e.left,y:-e.top,width:e.left+e.right,height:e.top+e.bottom}}function ai(t,e){return t.sourceBBox.clone().moveAndExpand(si(e))}function li(t,e){return t.targetBBox.clone().moveAndExpand(si(e))}function ci(t,e,i){var n=new E(t.x,e.y),r=new E(e.x,t.y),o=ri(t,n),s=ri(t,r),a=ti[i],l=o===i||o!==a&&(s===a||s!==i)?n:r;return{points:[l],direction:ri(l,e)}}function gi(t,e,i){var n=ii(t,e,i);return{points:[n],direction:ri(n,e)}}function hi(e,t,i,n){var r,o={},s=[new E(e.x,t.y),new E(t.x,e.y)],a=s.filter(function(t){return!i.containsPoint(t)}),l=a.filter(function(t){return ri(t,e)!==n});if(0c.center().distance(t),h=g?e:t,u=g?t:e;return s=ii(o=r?(o=E.fromPolar(c.width+c.height,ei[r],h),c.pointNearestToPoint(o).move(o,-1)):c.pointNearestToPoint(h).move(h,1),u,c),o.round().equals(s.round())?(s=E.fromPolar(c.width+c.height,y(o.theta(h))+Math.PI/2,u),a=ii(o,s=c.pointNearestToPoint(s).move(u,1).round(),c),l.points=g?[s,a,o]:[o,a,s]):l.points=g?[s,o]:[o,s],l.direction=ri(g?o:s,e),l}function fi(t,e,i){var n,r,o,s,a,l=ai(i,e),c=li(i,e),g=(r=e,(n=i).sourceAnchor?n.sourceAnchor:ai(n,r).center()),h=(s=e,(o=i).targetAnchor?o.targetAnchor:li(o,s).center());l=l.union(oi(g)),c=c.union(oi(h)),(t=Ut(t).map(E)).unshift(g),t.push(h);for(var u=[],d=0,f=t.length-1;dn.maxAllowedDirectionChange)){var F=Mi(O.clone().offset(k.gridOffsetX,k.gridOffsetY),v,l),V=xi(F);if(!C.isClose(V)&&i.isPointAccessible(F)){if(0<=Z.indexOf(V))if(!F.equals(d))if(yi(X,wi(F,d,L,v,n))>n.maxAllowedDirectionChange)continue;var J=Y+k.cost+(W?0:n.penalties[D]);(!C.isOpen(V)||J=Math.abs(t.y-e.y)){var c=(t.x+e.x)/2;l=O.createSegment("C",c,t.y,c,e.y,e.x,e.y),r.appendSegment(l)}else{var g=(t.y+e.y)/2;l=O.createSegment("C",t.x,g,e.x,g,e.x,e.y),r.appendSegment(l)}}return o?r:r.serialize()}},Fi=qe.extend({className:function(){var t=qe.prototype.className.apply(this).split(" ");return t.push("link"),t.join(" ")},options:{shortLinkLength:105,doubleLinkTools:!1,longLinkLength:155,linkToolsOffset:40,doubleLinkToolsOffset:65,sampleInterval:50},_labelCache:null,_labelSelectors:null,_markerCache:null,_V:null,_dragData:null,metrics:null,decimalsRounding:2,initialize:function(){qe.prototype.initialize.apply(this,arguments),this._labelCache={},this._labelSelectors={},this._markerCache={},this._V={},this.metrics={}},presentationAttributes:{markup:["RENDER"],attrs:["UPDATE"],router:["UPDATE"],connector:["UPDATE"],smooth:["UPDATE"],manhattan:["UPDATE"],toolMarkup:["TOOLS"],labels:["LABELS"],labelMarkup:["LABELS"],vertices:["VERTICES","UPDATE"],vertexMarkup:["VERTICES"],source:["SOURCE","UPDATE"],target:["TARGET","UPDATE"]},initFlag:["RENDER","SOURCE","TARGET"],UPDATE_PRIORITY:1,confirmUpdate:function(t,e){if(e||(e={}),this.hasFlag(t,"SOURCE")){if(!this.updateEndProperties("source"))return t;t=this.removeFlag(t,"SOURCE")}if(this.hasFlag(t,"TARGET")){if(!this.updateEndProperties("target"))return t;t=this.removeFlag(t,"TARGET")}var i=this.paper,n=this.sourceView,r=this.targetView;if(i&&(n&&!i.isViewMounted(n)||r&&!i.isViewMounted(r)))return t;if(this.hasFlag(t,"RENDER"))return this.render(),t=this.removeFlag(t,["RENDER","UPDATE","VERTICES","TOOLS","LABELS"]);this.hasFlag(t,"VERTICES")&&(this.renderVertexMarkers(),t=this.removeFlag(t,"VERTICES"));var o=this.model,s=o.attributes,a=this.hasFlag(t,"LABELS"),l=this.hasFlag(t,"TOOLS");return a&&(this.onLabelsChange(o,s.labels,e),t=this.removeFlag(t,"LABELS")),l&&(this.renderTools(),t=this.removeFlag(t,"TOOLS")),this.hasFlag(t,"UPDATE")&&(this.update(o,null,e),t=this.removeFlag(t,"UPDATE"),l=a=!1),a&&this.updateLabelPositions(),l&&this.updateToolsPosition(),t},requestConnectionUpdate:function(t){var e=this.paper,i=this.UPDATE_PRIORITY;e&&e.requestViewUpdate(this,this.getFlag("UPDATE"),i,t)},isLabelsRenderRequired:function(t){void 0===t&&(t={});var e=this.model.previous("labels");if(!e)return!0;if("propertyPathArray"in t&&"propertyValue"in t){var i=t.propertyPathArray||[],n=i.length;if(1=this.options.longLinkLength){var r=this.options.doubleLinkToolsOffset||e;n=this.getPointAtLength(i-r),this._tool2Cache.attr("transform","translate("+n.x+", "+n.y+") "+t),this._tool2Cache.attr("visibility","visible")}else this.options.doubleLinkTools&&this._tool2Cache.attr("visibility","hidden")}return this},updateArrowheadMarkers:function(){if(!this._V.markerArrowheads)return this;if("none"===S.css(this._V.markerArrowheads.node,"display"))return this;var t=this.getConnectionLength()'),o=["<"+i+">",Ut(n).map(function(t){return r({offset:t.offset,color:t.color,opacity:Number.isFinite(t.opacity)?t.opacity:1})}).join(""),""].join(""),s=Tt({id:e},t.attrs);q(o,s).appendTo(this.defs)}return e},defineMarker:function(t){if(!le(t))throw new TypeError("dia.Paper: defineMarker() requires 1. argument to be an object.");var e=t.id;if(e||(e=this.svg.id+nt(JSON.stringify(t))),!this.isDefined(e)){var i=te(t,"type","userSpaceOnUse");q("marker",{id:e,orient:"auto",overflow:"visible",markerUnits:t.markerUnits||"userSpaceOnUse"},[q(t.type||"path",i)]).appendTo(this.defs)}return e}},{sorting:an,backgroundPatterns:{flipXy:function(t){var e=document.createElement("canvas"),i=t.width,n=t.height;e.width=2*i,e.height=2*n;var r=e.getContext("2d");return r.drawImage(t,0,0,i,n),r.setTransform(-1,0,0,-1,e.width,e.height),r.drawImage(t,0,0,i,n),r.setTransform(-1,0,0,1,e.width,0),r.drawImage(t,0,0,i,n),r.setTransform(1,0,0,-1,0,e.height),r.drawImage(t,0,0,i,n),e},flipX:function(t){var e=document.createElement("canvas"),i=t.width,n=t.height;e.width=2*i,e.height=n;var r=e.getContext("2d");return r.drawImage(t,0,0,i,n),r.translate(2*i,0),r.scale(-1,1),r.drawImage(t,0,0,i,n),e},flipY:function(t){var e=document.createElement("canvas"),i=t.width,n=t.height;e.width=i,e.height=2*n;var r=e.getContext("2d");return r.drawImage(t,0,0,i,n),r.translate(0,2*n),r.scale(1,-1),r.drawImage(t,0,0,i,n),e},watermark:function(t,e){e=e||{};var i=t.width,n=t.height,r=document.createElement("canvas");r.width=3*i,r.height=3*n;for(var o=r.getContext("2d"),s=ce(e.watermarkAngle)?-e.watermarkAngle:-20,a=y(s),l=r.width/4,c=r.height/4,g=0;g<4;g++)for(var h=0;h<4;h++)0<(g+h)%2&&(o.setTransform(1,0,0,1,(2*g-1)*l,(2*h-1)*c),o.rotate(a),o.drawImage(t,-i/2,-n/2,i,n));return r}},gridPatterns:{dot:[{color:"#AAAAAA",thickness:1,markup:"rect",update:function(t,e){q(t).attr({width:e.thickness*e.sx,height:e.thickness*e.sy,fill:e.color})}}],fixedDot:[{color:"#AAAAAA",thickness:1,markup:"rect",update:function(t,e){var i=e.sx<=1?e.thickness*e.sx:e.thickness;q(t).attr({width:i,height:i,fill:e.color})}}],mesh:[{color:"#AAAAAA",thickness:1,markup:"path",update:function(t,e){var i,n=e.width,r=e.height,o=e.thickness;i=0<=n-o&&0<=r-o?["M",n,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",q(t).attr({d:i,stroke:e.color,"stroke-width":e.thickness})}}],doubleMesh:[{color:"#AAAAAA",thickness:1,markup:"path",update:function(t,e){var i,n=e.width,r=e.height,o=e.thickness;i=0<=n-o&&0<=r-o?["M",n,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",q(t).attr({d:i,stroke:e.color,"stroke-width":e.thickness})}},{color:"#000000",thickness:3,scaleFactor:4,markup:"path",update:function(t,e){var i,n=e.width,r=e.height,o=e.thickness;i=0<=n-o&&0<=r-o?["M",n,0,"H0 M0 0 V0",r].join(" "):"M 0 0 0 0",q(t).attr({d:i,stroke:e.color,"stroke-width":e.thickness})}}]}}),hn=Qe.extend({name:null,tagName:"g",className:"tool",svgElement:!0,_visible:!0,init:function(){var t=this.name;t&&this.vel.attr("data-tool-name",t)},configure:function(t,e){return this.relatedView=t,this.paper=t.paper,this.parentView=e,this.simulateRelatedView(this.el),this.delegateEvents(),this},simulateRelatedView:function(t){t&&t.setAttribute("model-id",this.relatedView.model.id)},getName:function(){return this.name},show:function(){this.el.style.display="",this._visible=!0},hide:function(){this.el.style.display="none",this._visible=!1},isVisible:function(){return!!this._visible},focus:function(){var t=this.options.focusOpacity;isFinite(t)&&(this.el.style.opacity=t),this.parentView.focusTool(this)},blur:function(){this.el.style.opacity="",this.parentView.blurTool(this)},update:function(){},guard:function(t){var e=this.paper,i=this.relatedView;return!e||!i||e.guard(t,i)}}),un=Qe.extend({tagName:"g",className:"tools",svgElement:!0,tools:null,options:{tools:null,relatedView:null,name:null,component:!1},configure:function(t){var e=(t=Tt(this.options,t)).tools;if(!Array.isArray(e))return this;var i=t.relatedView;if(!(i instanceof qe))return this;for(var n=this.tools=[],r=0,o=e.length;r'}),An=$e.extend({presentationAttributes:$e.addPresentationAttributes({attrs:["SCALE"]}),confirmUpdate:function(){var t=$e.prototype.confirmUpdate.apply(this,arguments);return this.hasFlag(t,"SCALE")&&(this.resize(),t=this.removeFlag(t,"SCALE")),t}}),vn=In.define("basic.Text",{attrs:{text:{"font-size":18,fill:"#000000"}}},{markup:''}),Cn=In.define("basic.Circle",{size:{width:60,height:60},attrs:{circle:{fill:"#ffffff",stroke:"#000000",r:30,cx:30,cy:30},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-y":.5,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),wn=In.define("basic.Ellipse",{size:{width:60,height:40},attrs:{ellipse:{fill:"#ffffff",stroke:"#000000",rx:30,ry:20,cx:30,cy:20},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-y":.5,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),yn=In.define("basic.Polygon",{size:{width:60,height:40},attrs:{polygon:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),bn=In.define("basic.Polyline",{size:{width:60,height:40},attrs:{polyline:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),Nn=In.define("basic.Image",{attrs:{text:{"font-size":14,text:"","text-anchor":"middle","ref-x":.5,"ref-dy":20,"y-alignment":"middle",fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),Mn=In.define("basic.Path",{size:{width:60,height:60},attrs:{path:{fill:"#ffffff",stroke:"#000000"},text:{"font-size":14,text:"","text-anchor":"middle",ref:"path","ref-x":.5,"ref-dy":10,fill:"#000000","font-family":"Arial, helvetica, sans-serif"}}},{markup:''}),xn=Mn.define("basic.Rhombus",{attrs:{path:{d:"M 30 0 L 60 30 30 60 0 30 z"},text:{"ref-y":.5,"ref-dy":null,"y-alignment":"middle"}}}),Sn=pn.test("svgforeignobject"),kn=In.define("basic.TextBlock",{attrs:{rect:{fill:"#ffffff",stroke:"#000000",width:80,height:100},text:{fill:"#000000","font-size":14,"font-family":"Arial, helvetica, sans-serif"},".content":{text:"","ref-x":.5,"ref-y":.5,"y-alignment":"middle","x-alignment":"middle"}},content:""},{markup:['','',Sn?'
':'',""].join(""),initialize:function(){this.listenTo(this,"change:size",this.updateSize),this.listenTo(this,"change:content",this.updateContent),this.updateSize(this,this.get("size")),this.updateContent(this,this.get("content")),In.prototype.initialize.apply(this,arguments)},updateSize:function(t,e){this.attr({".fobj":Tt({},e),div:{style:Tt({},e)}})},updateContent:function(t,e){Sn?this.attr({".content":{html:mt(e)}}):this.attr({".content":{text:e}})},setForeignObjectSize:function(){this.updateSize.apply(this,arguments)},setDivContent:function(){this.updateContent.apply(this,arguments)}}),Dn=$e.extend({presentationAttributes:Sn?$e.prototype.presentationAttributes:$e.addPresentationAttributes({content:["CONTENT"],size:["CONTENT"]}),initFlag:["RENDER","CONTENT"],confirmUpdate:function(){var t=$e.prototype.confirmUpdate.apply(this,arguments);return this.hasFlag(t,"CONTENT")&&(this.updateContent(this.model),t=this.removeFlag(t,"CONTENT")),t},update:function(t,e){var i=this.model;if(Sn)$e.prototype.update.call(this,i,e);else{var n=te(e||i.get("attrs"),".content");$e.prototype.update.call(this,i,n),e&&!qt(e,".content")||this.updateContent(i,e)}},updateContent:function(t,e){var i=se({},(e||t.get("attrs"))[".content"]);i=te(i,"text");var n=It(t.get("content"),t.get("size"),i,{svgDocument:this.paper.svg}),r=ot({},".content",i,"/");r[".content"].text=n,$e.prototype.update.call(this,t,r)}}),zn={Generic:In,Rect:mn,TextView:An,Text:vn,Circle:Cn,Ellipse:wn,Polygon:yn,Polyline:bn,Image:Nn,Path:Mn,Rhombus:xn,TextBlock:kn,TextBlockView:Dn},Tn=Ve.define("standard.Rectangle",{attrs:{body:{refWidth:"100%",refHeight:"100%",strokeWidth:2,stroke:"#000000",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"body"},{tagName:"text",selector:"label"}]}),jn=Ve.define("standard.Circle",{attrs:{body:{refCx:"50%",refCy:"50%",refR:"50%",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"circle",selector:"body"},{tagName:"text",selector:"label"}]}),Ln=Ve.define("standard.Ellipse",{attrs:{body:{refCx:"50%",refCy:"50%",refRx:"50%",refRy:"50%",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"ellipse",selector:"body"},{tagName:"text",selector:"label"}]}),Zn=Ve.define("standard.Path",{attrs:{body:{refD:"M 0 0 L 10 0 10 10 0 10 Z",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"path",selector:"body"},{tagName:"text",selector:"label"}]}),Pn=Ve.define("standard.Polygon",{attrs:{body:{refPoints:"0 0 10 0 10 10 0 10",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"polygon",selector:"body"},{tagName:"text",selector:"label"}]}),Gn=Ve.define("standard.Polyline",{attrs:{body:{refPoints:"0 0 10 0 10 10 0 10 0 0",strokeWidth:2,stroke:"#333333",fill:"#FFFFFF"},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",fontSize:14,fill:"#333333"}}},{markup:[{tagName:"polyline",selector:"body"},{tagName:"text",selector:"label"}]}),Bn=Ve.define("standard.Image",{attrs:{image:{refWidth:"100%",refHeight:"100%"},label:{textVerticalAnchor:"top",textAnchor:"middle",refX:"50%",refY:"100%",refY2:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"image",selector:"image"},{tagName:"text",selector:"label"}]}),On=Ve.define("standard.BorderedImage",{attrs:{border:{refWidth:"100%",refHeight:"100%",stroke:"#333333",strokeWidth:2},background:{refWidth:-1,refHeight:-1,x:.5,y:.5,fill:"#FFFFFF"},image:{refWidth:-1,refHeight:-1,x:.5,y:.5},label:{textVerticalAnchor:"top",textAnchor:"middle",refX:"50%",refY:"100%",refY2:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"background",attributes:{stroke:"none"}},{tagName:"image",selector:"image"},{tagName:"rect",selector:"border",attributes:{fill:"none"}},{tagName:"text",selector:"label"}]}),En=Ve.define("standard.EmbeddedImage",{attrs:{body:{refWidth:"100%",refHeight:"100%",stroke:"#333333",fill:"#FFFFFF",strokeWidth:2},image:{refWidth:"30%",refHeight:-20,x:10,y:10,preserveAspectRatio:"xMidYMin"},label:{textVerticalAnchor:"top",textAnchor:"left",refX:"30%",refX2:20,refY:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"body"},{tagName:"image",selector:"image"},{tagName:"text",selector:"label"}]}),Yn=Ve.define("standard.InscribedImage",{attrs:{border:{refRx:"50%",refRy:"50%",refCx:"50%",refCy:"50%",stroke:"#333333",strokeWidth:2},background:{refRx:"50%",refRy:"50%",refCx:"50%",refCy:"50%",fill:"#FFFFFF"},image:{refWidth:"68%",refHeight:"68%",refX:"16%",refY:"16%",preserveAspectRatio:"xMidYMid"},label:{textVerticalAnchor:"top",textAnchor:"middle",refX:"50%",refY:"100%",refY2:10,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"ellipse",selector:"background"},{tagName:"image",selector:"image"},{tagName:"ellipse",selector:"border",attributes:{fill:"none"}},{tagName:"text",selector:"label"}]}),Rn=Ve.define("standard.HeaderedRectangle",{attrs:{body:{refWidth:"100%",refHeight:"100%",strokeWidth:2,stroke:"#000000",fill:"#FFFFFF"},header:{refWidth:"100%",height:30,strokeWidth:2,stroke:"#000000",fill:"#FFFFFF"},headerText:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:15,fontSize:16,fill:"#333333"},bodyText:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"50%",refY2:15,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"rect",selector:"body"},{tagName:"rect",selector:"header"},{tagName:"text",selector:"headerText"},{tagName:"text",selector:"bodyText"}]}),Wn=Ve.define("standard.Cylinder",{attrs:{body:{lateralArea:10,fill:"#FFFFFF",stroke:"#333333",strokeWidth:2},top:{refCx:"50%",cy:10,refRx:"50%",ry:10,fill:"#FFFFFF",stroke:"#333333",strokeWidth:2},label:{textVerticalAnchor:"middle",textAnchor:"middle",refX:"50%",refY:"100%",refY2:15,fontSize:14,fill:"#333333"}}},{markup:[{tagName:"path",selector:"body"},{tagName:"ellipse",selector:"top"},{tagName:"text",selector:"label"}],topRy:function(t,e){if(void 0===t)return this.attr("body/lateralArea");var i={lateralArea:t},n=ft(t)?{refCy:t,refRy:t,cy:null,ry:null}:{refCy:null,refRy:null,cy:t,ry:t};return this.attr({body:i,top:n},e)}},{attributes:{lateralArea:{set:function(t,e){var i=ft(t);i&&(t=parseFloat(t)/100);var n=e.x,r=e.y,o=e.width,s=e.height,a=o/2,l=i?s*t:t,c=q.KAPPA,g=c*a,h=c*(i?s*t:t),u=n+o/2,d=n+o,f=r+l,p=f-l,I=r+s-l,m=r+s;return{d:["M",n,f,"L",n,I,"C",n,I+h,u-g,m,u,m,"C",u+g,m,d,I+h,d,I,"L",d,f,"C",d,f-h,u+g,p,u,p,"C",u-g,p,n,f-h,n,f,"Z"].join(" ")}}}}}),Un=pn.test("svgforeignobject")?{tagName:"foreignObject",selector:"foreignObject",attributes:{overflow:"hidden"},children:[{tagName:"div",namespaceURI:"http://www.w3.org/1999/xhtml",selector:"label",style:{width:"100%",height:"100%",position:"static",backgroundColor:"transparent",textAlign:"center",margin:0,padding:"0px 5px",boxSizing:"border-box",display:"flex",alignItems:"center",justifyContent:"center"}}]}:{tagName:"text",selector:"label",attributes:{"text-anchor":"middle"}},Xn={Rectangle:Tn,Circle:jn,Ellipse:Ln,Path:Zn,Polygon:Pn,Polyline:Gn,Image:Bn,BorderedImage:On,EmbeddedImage:En,InscribedImage:Yn,HeaderedRectangle:Rn,Cylinder:Wn,TextBlock:Ve.define("standard.TextBlock",{attrs:{body:{refWidth:"100%",refHeight:"100%",stroke:"#333333",fill:"#ffffff",strokeWidth:2},foreignObject:{refWidth:"100%",refHeight:"100%"},label:{style:{fontSize:14}}}},{markup:[{tagName:"rect",selector:"body"},Un]},{attributes:{text:{set:function(t,e,i,n){if(!(i instanceof HTMLElement)){var r=n.style||{},o={text:t,width:-5,height:"100%"},s=Tt({textVerticalAnchor:"middle"},r);return xe.textWrap.set.call(this,o,e,i,s),{fill:r.color||null}}i.textContent=t},position:function(t,e,i){if(i instanceof SVGElement)return e.center()}}}}),Link:We.define("standard.Link",{attrs:{line:{connection:!0,stroke:"#333333",strokeWidth:2,strokeLinejoin:"round",targetMarker:{type:"path",d:"M 10 -5 0 0 10 5 z"}},wrapper:{connection:!0,strokeWidth:10,strokeLinejoin:"round"}}},{markup:[{tagName:"path",selector:"wrapper",attributes:{fill:"none",cursor:"pointer",stroke:"transparent","stroke-linecap":"round"}},{tagName:"path",selector:"line",attributes:{fill:"none","pointer-events":"none"}}]}),DoubleLink:We.define("standard.DoubleLink",{attrs:{line:{connection:!0,stroke:"#DDDDDD",strokeWidth:4,strokeLinejoin:"round",targetMarker:{type:"path",stroke:"#000000",d:"M 10 -3 10 -10 -2 0 10 10 10 3"}},outline:{connection:!0,stroke:"#000000",strokeWidth:6,strokeLinejoin:"round"}}},{markup:[{tagName:"path",selector:"outline",attributes:{fill:"none"}},{tagName:"path",selector:"line",attributes:{fill:"none"}}]}),ShadowLink:We.define("standard.ShadowLink",{attrs:{line:{connection:!0,stroke:"#FF0000",strokeWidth:20,strokeLinejoin:"round",targetMarker:{type:"path",stroke:"none",d:"M 0 -10 -10 0 0 10 z"},sourceMarker:{type:"path",stroke:"none",d:"M -10 -10 0 0 -10 10 0 10 0 -10 z"}},shadow:{connection:!0,refX:3,refY:6,stroke:"#000000",strokeOpacity:.2,strokeWidth:20,strokeLinejoin:"round",targetMarker:{type:"path",d:"M 0 -10 -10 0 0 10 z",stroke:"none"},sourceMarker:{type:"path",stroke:"none",d:"M -10 -10 0 0 -10 10 0 10 0 -10 z"}}}},{markup:[{tagName:"path",selector:"shadow",attributes:{fill:"none"}},{tagName:"path",selector:"line",attributes:{fill:"none"}}]})},Fn=In.define("devs.Model",{inPorts:[],outPorts:[],size:{width:80,height:80},attrs:{".":{magnet:!1},".label":{text:"Model","ref-x":.5,"ref-y":10,"font-size":18,"text-anchor":"middle",fill:"#000"},".body":{"ref-width":"100%","ref-height":"100%",stroke:"#000"}},ports:{groups:{in:{position:{name:"left"},attrs:{".port-label":{fill:"#000"},".port-body":{fill:"#fff",stroke:"#000",r:10,magnet:!0}},label:{position:{name:"left",args:{y:10}}}},out:{position:{name:"right"},attrs:{".port-label":{fill:"#000"},".port-body":{fill:"#fff",stroke:"#000",r:10,magnet:!0}},label:{position:{name:"right",args:{y:10}}}}}}},{markup:'',portMarkup:'',portLabelMarkup:'',initialize:function(){In.prototype.initialize.apply(this,arguments),this.on("change:inPorts change:outPorts",this.updatePortItems,this),this.updatePortItems()},updatePortItems:function(t,e,i){var n=Gt(this.get("inPorts")),r=_t(Gt(this.get("outPorts")),n),o=this.createPortItems("in",n),s=this.createPortItems("out",r);this.prop("ports/items",o.concat(s),Tt({rewrite:!0},i))},createPortItem:function(t,e){return{id:e,group:t,attrs:{".port-label":{text:e}}}},createPortItems:function(t,e){return Ut(e).map(this.createPortItem.bind(this,t))},_addGroupPort:function(t,e,i){var n=this.get(e);return this.set(e,Array.isArray(n)?n.concat(t):[t],i)},addOutPort:function(t,e){return this._addGroupPort(t,"outPorts",e)},addInPort:function(t,e){return this._addGroupPort(t,"inPorts",e)},_removeGroupPort:function(t,e,i){return this.set(e,Ht(this.get(e),t),i)},removeOutPort:function(t,e){return this._removeGroupPort(t,"outPorts",e)},removeInPort:function(t,e){return this._removeGroupPort(t,"inPorts",e)},_changeGroup:function(t,e,i){return this.prop("ports/groups/"+t,le(e)?e:{},i)},changeInGroup:function(t,e){return this._changeGroup("in",t,e)},changeOutGroup:function(t,e){return this._changeGroup("out",t,e)}}),Vn=Fn.define("devs.Atomic",{size:{width:80,height:80},attrs:{".label":{text:"Atomic"}}}),Jn=Fn.define("devs.Coupled",{size:{width:200,height:300},attrs:{".label":{text:"Coupled"}}}),Hn={Model:Fn,Atomic:Vn,Coupled:Jn,Link:We.define("devs.Link",{attrs:{".connection":{"stroke-width":2}}})},_n=In.define("logic.Gate",{size:{width:80,height:40},attrs:{".":{magnet:!1},".body":{width:100,height:50},circle:{r:7,stroke:"black",fill:"transparent","stroke-width":2}}},{operation:function(){return!0}}),Qn=_n.define("logic.IO",{size:{width:60,height:30},attrs:{".body":{fill:"white",stroke:"black","stroke-width":2},".wire":{ref:".body","ref-y":.5,stroke:"black"},text:{fill:"black",ref:".body","ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle","font-weight":"bold","font-variant":"small-caps","text-transform":"capitalize","font-size":"14px"}}},{markup:''}),Kn=Qn.define("logic.Input",{attrs:{".wire":{"ref-dx":0,d:"M 0 0 L 23 0"},circle:{ref:".body","ref-dx":30,"ref-y":.5,magnet:!0,class:"output",port:"out"},text:{text:"input"}}}),qn=Qn.define("logic.Output",{attrs:{".wire":{"ref-x":0,d:"M 0 0 L -23 0"},circle:{ref:".body","ref-x":-30,"ref-y":.5,magnet:"passive",class:"input",port:"in"},text:{text:"output"}}}),$n=_n.define("logic.Gate11",{attrs:{".input":{ref:".body","ref-x":-2,"ref-y":.5,magnet:"passive",port:"in"},".output":{ref:".body","ref-dx":2,"ref-y":.5,magnet:!0,port:"out"}}},{markup:''}),tr=_n.define("logic.Gate21",{attrs:{".input1":{ref:".body","ref-x":-2,"ref-y":.3,magnet:"passive",port:"in1"},".input2":{ref:".body","ref-x":-2,"ref-y":.7,magnet:"passive",port:"in2"},".output":{ref:".body","ref-dx":2,"ref-y":.5,magnet:!0,port:"out"}}},{markup:''}),er=$n.define("logic.Repeater",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5PVCBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjgiCiAgICAgaW5rc2NhcGU6Y3g9Ijg0LjY4NTM1MiIKICAgICBpbmtzY2FwZTpjeT0iMTUuMjg4NjI4IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjMzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gNzIuMTU2OTEsMjUgTCA5NSwyNSIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAyOS4wNDM0NzgsMjUgTCA1LjA0MzQ3ODEsMjUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgZD0iTSAyOC45Njg3NSwyLjU5Mzc1IEwgMjguOTY4NzUsNSBMIDI4Ljk2ODc1LDQ1IEwgMjguOTY4NzUsNDcuNDA2MjUgTCAzMS4xMjUsNDYuMzQzNzUgTCA3Mi4xNTYyNSwyNi4zNDM3NSBMIDcyLjE1NjI1LDIzLjY1NjI1IEwgMzEuMTI1LDMuNjU2MjUgTCAyOC45Njg3NSwyLjU5Mzc1IHogTSAzMS45Njg3NSw3LjQwNjI1IEwgNjguMDkzNzUsMjUgTCAzMS45Njg3NSw0Mi41OTM3NSBMIDMxLjk2ODc1LDcuNDA2MjUgeiIKICAgICAgIGlkPSJwYXRoMjYzOCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjY2NjYyIgLz4KICA8L2c+Cjwvc3ZnPgo="}}},{operation:function(t){return t}}),ir=$n.define("logic.Not",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5PVCBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjgiCiAgICAgaW5rc2NhcGU6Y3g9Ijg0LjY4NTM1MiIKICAgICBpbmtzY2FwZTpjeT0iMTUuMjg4NjI4IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjMzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gNzkuMTU2OTEsMjUgTCA5NSwyNSIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAyOS4wNDM0NzgsMjUgTCA1LjA0MzQ3ODEsMjUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgZD0iTSAyOC45Njg3NSwyLjU5Mzc1IEwgMjguOTY4NzUsNSBMIDI4Ljk2ODc1LDQ1IEwgMjguOTY4NzUsNDcuNDA2MjUgTCAzMS4xMjUsNDYuMzQzNzUgTCA3Mi4xNTYyNSwyNi4zNDM3NSBMIDcyLjE1NjI1LDIzLjY1NjI1IEwgMzEuMTI1LDMuNjU2MjUgTCAyOC45Njg3NSwyLjU5Mzc1IHogTSAzMS45Njg3NSw3LjQwNjI1IEwgNjguMDkzNzUsMjUgTCAzMS45Njg3NSw0Mi41OTM3NSBMIDMxLjk2ODc1LDcuNDA2MjUgeiIKICAgICAgIGlkPSJwYXRoMjYzOCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICBpZD0icGF0aDI2NzEiCiAgICAgICBzb2RpcG9kaTpjeD0iNzYiCiAgICAgICBzb2RpcG9kaTpjeT0iMjUiCiAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgIHNvZGlwb2RpOnJ5PSI0IgogICAgICAgZD0iTSA4MCwyNSBBIDQsNCAwIDEgMSA3MiwyNSBBIDQsNCAwIDEgMSA4MCwyNSB6IgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEsMCkiIC8+CiAgPC9nPgo8L3N2Zz4K"}}},{operation:function(t){return!t}}),nr=tr.define("logic.Or",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik9SIEFOU0kuc3ZnIgogICBpbmtzY2FwZTpvdXRwdXRfZXh0ZW5zaW9uPSJvcmcuaW5rc2NhcGUub3V0cHV0LnN2Zy5pbmtzY2FwZSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjUwIDogMTUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjI1IDogMTAgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjcxNCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iMSA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMC41IDogMC4zMzMzMzMzMyA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODA2IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUyODE5IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjM3Mi4wNDcyNCA6IDM1MC43ODczOSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI3NDQuMDk0NDggOiA1MjYuMTgxMDkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNzc3IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49Ijc1IDogNDAgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMTUwIDogNjAgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDYwIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTMyNzUiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNTAgOiAzMy4zMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iMTAwIDogNTAgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDUwIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTU1MzMiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzIgOiAyMS4zMzMzMzMgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNjQgOiAzMiA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMzIgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjU1NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDE2LjY2NjY2NyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDI1IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAyNSA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iNCIKICAgICBpbmtzY2FwZTpjeD0iMTEzLjAwMDM5IgogICAgIGlua3NjYXBlOmN5PSIxMi44OTM3MzEiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9InB4IgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImcyNTYwIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTpncmlkLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1wb2ludHM9InRydWUiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAwMDAiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMzk5IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijg3NCIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMzciCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii00IgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gNzAsMjUgYyAyMCwwIDI1LDAgMjUsMCIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMSwxNSA1LDE1IgogICAgICAgaWQ9InBhdGgzMDYxIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzIsMzUgNSwzNSIKICAgICAgIGlkPSJwYXRoMzk0NCIgLz4KICAgIDxnCiAgICAgICBpZD0iZzI1NjAiCiAgICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2LjUsLTM5LjUpIj4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJNIC0yLjQwNjI1LDQ0LjUgTCAtMC40MDYyNSw0Ni45Mzc1IEMgLTAuNDA2MjUsNDYuOTM3NSA1LjI1LDUzLjkzNzU0OSA1LjI1LDY0LjUgQyA1LjI1LDc1LjA2MjQ1MSAtMC40MDYyNSw4Mi4wNjI1IC0wLjQwNjI1LDgyLjA2MjUgTCAtMi40MDYyNSw4NC41IEwgMC43NSw4NC41IEwgMTQuNzUsODQuNSBDIDE3LjE1ODA3Niw4NC41MDAwMDEgMjIuNDM5Njk5LDg0LjUyNDUxNCAyOC4zNzUsODIuMDkzNzUgQyAzNC4zMTAzMDEsNzkuNjYyOTg2IDQwLjkxMTUzNiw3NC43NTA0ODQgNDYuMDYyNSw2NS4yMTg3NSBMIDQ0Ljc1LDY0LjUgTCA0Ni4wNjI1LDYzLjc4MTI1IEMgMzUuNzU5Mzg3LDQ0LjcxNTU5IDE5LjUwNjU3NCw0NC41IDE0Ljc1LDQ0LjUgTCAwLjc1LDQ0LjUgTCAtMi40MDYyNSw0NC41IHogTSAzLjQ2ODc1LDQ3LjUgTCAxNC43NSw0Ny41IEMgMTkuNDM0MTczLDQ3LjUgMzMuMDM2ODUsNDcuMzY5NzkzIDQyLjcxODc1LDY0LjUgQyAzNy45NTE5NjQsNzIuOTI5MDc1IDMyLjE5NzQ2OSw3Ny4xODM5MSAyNyw3OS4zMTI1IEMgMjEuNjM5MzM5LDgxLjUwNzkyNCAxNy4xNTgwNzUsODEuNTAwMDAxIDE0Ljc1LDgxLjUgTCAzLjUsODEuNSBDIDUuMzczNTg4NCw3OC4zOTE1NjYgOC4yNSw3Mi40NTA2NSA4LjI1LDY0LjUgQyA4LjI1LDU2LjUyNjY0NiA1LjM0MTQ2ODYsNTAuNTk5ODE1IDMuNDY4NzUsNDcuNSB6IgogICAgICAgICBpZD0icGF0aDQ5NzMiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NzY2NjY3NjY2NjY2NjY2NzY2NzYyIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo="}}},{operation:function(t,e){return t||e}}),rr=tr.define("logic.And",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9IkFORCBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI4IgogICAgIGlua3NjYXBlOmN4PSI1Ni42OTgzNDgiCiAgICAgaW5rc2NhcGU6Y3k9IjI1LjMyNjg5OSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzOTkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIzMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJtIDcwLDI1IGMgMjAsMCAyNSwwIDI1LDAiCiAgICAgICBpZD0icGF0aDMwNTkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzEsMTUgNSwxNSIKICAgICAgIGlkPSJwYXRoMzA2MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDMyLDM1IDUsMzUiCiAgICAgICBpZD0icGF0aDM5NDQiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZvbnQtc2l6ZTptZWRpdW07Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDt0ZXh0LWluZGVudDowO3RleHQtYWxpZ246c3RhcnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bGluZS1oZWlnaHQ6bm9ybWFsO2xldHRlci1zcGFjaW5nOm5vcm1hbDt3b3JkLXNwYWNpbmc6bm9ybWFsO3RleHQtdHJhbnNmb3JtOm5vbmU7ZGlyZWN0aW9uOmx0cjtibG9jay1wcm9ncmVzc2lvbjp0Yjt3cml0aW5nLW1vZGU6bHItdGI7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDozO21hcmtlcjpub25lO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGU7Zm9udC1mYW1pbHk6Qml0c3RyZWFtIFZlcmEgU2FuczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOkJpdHN0cmVhbSBWZXJhIFNhbnMiCiAgICAgICBkPSJNIDMwLDUgTCAzMCw2LjQyODU3MTQgTCAzMCw0My41NzE0MjkgTCAzMCw0NSBMIDMxLjQyODU3MSw0NSBMIDUwLjQ3NjE5LDQ1IEMgNjEuNzQ0MDk4LDQ1IDcwLjQ3NjE5LDM1Ljk5OTk1NSA3MC40NzYxOSwyNSBDIDcwLjQ3NjE5LDE0LjAwMDA0NSA2MS43NDQwOTksNS4wMDAwMDAyIDUwLjQ3NjE5LDUgQyA1MC40NzYxOSw1IDUwLjQ3NjE5LDUgMzEuNDI4NTcxLDUgTCAzMCw1IHogTSAzMi44NTcxNDMsNy44NTcxNDI5IEMgNDAuODM0MjY0LDcuODU3MTQyOSA0NS45MTgzNjgsNy44NTcxNDI5IDQ4LjA5NTIzOCw3Ljg1NzE0MjkgQyA0OS4yODU3MTQsNy44NTcxNDI5IDQ5Ljg4MDk1Miw3Ljg1NzE0MjkgNTAuMTc4NTcxLDcuODU3MTQyOSBDIDUwLjMyNzM4MSw3Ljg1NzE0MjkgNTAuNDA5MjI3LDcuODU3MTQyOSA1MC40NDY0MjksNy44NTcxNDI5IEMgNTAuNDY1MDI5LDcuODU3MTQyOSA1MC40NzE1NDMsNy44NTcxNDI5IDUwLjQ3NjE5LDcuODU3MTQyOSBDIDYwLjIzNjg1Myw3Ljg1NzE0MyA2Ny4xNDI4NTcsMTUuNDk3MDk4IDY3LjE0Mjg1NywyNSBDIDY3LjE0Mjg1NywzNC41MDI5MDIgNTkuNzYwNjYyLDQyLjE0Mjg1NyA1MCw0Mi4xNDI4NTcgTCAzMi44NTcxNDMsNDIuMTQyODU3IEwgMzIuODU3MTQzLDcuODU3MTQyOSB6IgogICAgICAgaWQ9InBhdGgyODg0IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NzY2NjY3Nzc3NzY2NjIiAvPgogIDwvZz4KPC9zdmc+Cg=="}}},{operation:function(t,e){return t&&e}}),or=tr.define("logic.Nor",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5PUiBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEiCiAgICAgaW5rc2NhcGU6Y3g9Ijc4LjY3NzY0NCIKICAgICBpbmtzY2FwZTpjeT0iMjIuMTAyMzQ0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjM3IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItNCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDc5LDI1IEMgOTksMjUgOTUsMjUgOTUsMjUiCiAgICAgICBpZD0icGF0aDMwNTkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzEsMTUgNSwxNSIKICAgICAgIGlkPSJwYXRoMzA2MSIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjk5OTk5OTg4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDMyLDM1IDUsMzUiCiAgICAgICBpZD0icGF0aDM5NDQiIC8+CiAgICA8ZwogICAgICAgaWQ9ImcyNTYwIgogICAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNi41LC0zOS41KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0iTSAtMi40MDYyNSw0NC41IEwgLTAuNDA2MjUsNDYuOTM3NSBDIC0wLjQwNjI1LDQ2LjkzNzUgNS4yNSw1My45Mzc1NDkgNS4yNSw2NC41IEMgNS4yNSw3NS4wNjI0NTEgLTAuNDA2MjUsODIuMDYyNSAtMC40MDYyNSw4Mi4wNjI1IEwgLTIuNDA2MjUsODQuNSBMIDAuNzUsODQuNSBMIDE0Ljc1LDg0LjUgQyAxNy4xNTgwNzYsODQuNTAwMDAxIDIyLjQzOTY5OSw4NC41MjQ1MTQgMjguMzc1LDgyLjA5Mzc1IEMgMzQuMzEwMzAxLDc5LjY2Mjk4NiA0MC45MTE1MzYsNzQuNzUwNDg0IDQ2LjA2MjUsNjUuMjE4NzUgTCA0NC43NSw2NC41IEwgNDYuMDYyNSw2My43ODEyNSBDIDM1Ljc1OTM4Nyw0NC43MTU1OSAxOS41MDY1NzQsNDQuNSAxNC43NSw0NC41IEwgMC43NSw0NC41IEwgLTIuNDA2MjUsNDQuNSB6IE0gMy40Njg3NSw0Ny41IEwgMTQuNzUsNDcuNSBDIDE5LjQzNDE3Myw0Ny41IDMzLjAzNjg1LDQ3LjM2OTc5MyA0Mi43MTg3NSw2NC41IEMgMzcuOTUxOTY0LDcyLjkyOTA3NSAzMi4xOTc0NjksNzcuMTgzOTEgMjcsNzkuMzEyNSBDIDIxLjYzOTMzOSw4MS41MDc5MjQgMTcuMTU4MDc1LDgxLjUwMDAwMSAxNC43NSw4MS41IEwgMy41LDgxLjUgQyA1LjM3MzU4ODQsNzguMzkxNTY2IDguMjUsNzIuNDUwNjUgOC4yNSw2NC41IEMgOC4yNSw1Ni41MjY2NDYgNS4zNDE0Njg2LDUwLjU5OTgxNSAzLjQ2ODc1LDQ3LjUgeiIKICAgICAgICAgaWQ9InBhdGg0OTczIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc2NjY2NzY2NjY2NjY2Njc2Njc2MiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHNvZGlwb2RpOnR5cGU9ImFyYyIKICAgICAgICAgc3R5bGU9ImZpbGw6bm9uZTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWpvaW46bWl0ZXI7bWFya2VyOm5vbmU7c3Ryb2tlLW9wYWNpdHk6MTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgICBpZD0icGF0aDI2MDQiCiAgICAgICAgIHNvZGlwb2RpOmN4PSI3NSIKICAgICAgICAgc29kaXBvZGk6Y3k9IjI1IgogICAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgICAgc29kaXBvZGk6cnk9IjQiCiAgICAgICAgIGQ9Ik0gNzksMjUgQSA0LDQgMCAxIDEgNzEsMjUgQSA0LDQgMCAxIDEgNzksMjUgeiIKICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2LjUsMzkuNSkiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K"}}},{operation:function(t,e){return!(t||e)}}),sr=tr.define("logic.Nand",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9Ik5BTkQgQU5TSS5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMTUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxMCA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNzE0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MDYiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3NzciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNzUgOiA0MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxNTAgOiA2MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNjAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzI3NSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI1MCA6IDMzLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxMDAgOiA1MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTUzMyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzMiA6IDIxLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI2NCA6IDMyIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAzMiA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMTYiCiAgICAgaW5rc2NhcGU6Y3g9Ijc4LjI4MzMwNyIKICAgICBpbmtzY2FwZTpjeT0iMTYuNDQyODQzIgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgaW5rc2NhcGU6Z3JpZC1iYm94PSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtcG9pbnRzPSJ0cnVlIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwMDAwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTM5OSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjMzIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSI+CiAgICA8aW5rc2NhcGU6Z3JpZAogICAgICAgaWQ9IkdyaWRGcm9tUHJlMDQ2U2V0dGluZ3MiCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBvcmlnaW54PSIwcHgiCiAgICAgICBvcmlnaW55PSIwcHgiCiAgICAgICBzcGFjaW5neD0iMXB4IgogICAgICAgc3BhY2luZ3k9IjFweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgZW1wY29sb3I9IiMwMDAwZmYiCiAgICAgICBvcGFjaXR5PSIwLjIiCiAgICAgICBlbXBvcGFjaXR5PSIwLjQiCiAgICAgICBlbXBzcGFjaW5nPSI1IgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gNzksMjUgQyA5MS44LDI1IDk1LDI1IDk1LDI1IgogICAgICAgaWQ9InBhdGgzMDU5IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDMxLDE1IDUsMTUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45OTk5OTk4ODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMiwzNSA1LDM1IgogICAgICAgaWQ9InBhdGgzOTQ0IiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmb250LXNpemU6bWVkaXVtO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7dGV4dC1pbmRlbnQ6MDt0ZXh0LWFsaWduOnN0YXJ0O3RleHQtZGVjb3JhdGlvbjpub25lO2xpbmUtaGVpZ2h0Om5vcm1hbDtsZXR0ZXItc3BhY2luZzpub3JtYWw7d29yZC1zcGFjaW5nOm5vcm1hbDt0ZXh0LXRyYW5zZm9ybTpub25lO2RpcmVjdGlvbjpsdHI7YmxvY2stcHJvZ3Jlc3Npb246dGI7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MzttYXJrZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO2ZvbnQtZmFtaWx5OkJpdHN0cmVhbSBWZXJhIFNhbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpCaXRzdHJlYW0gVmVyYSBTYW5zIgogICAgICAgZD0iTSAzMCw1IEwgMzAsNi40Mjg1NzE0IEwgMzAsNDMuNTcxNDI5IEwgMzAsNDUgTCAzMS40Mjg1NzEsNDUgTCA1MC40NzYxOSw0NSBDIDYxLjc0NDA5OCw0NSA3MC40NzYxOSwzNS45OTk5NTUgNzAuNDc2MTksMjUgQyA3MC40NzYxOSwxNC4wMDAwNDUgNjEuNzQ0MDk5LDUuMDAwMDAwMiA1MC40NzYxOSw1IEMgNTAuNDc2MTksNSA1MC40NzYxOSw1IDMxLjQyODU3MSw1IEwgMzAsNSB6IE0gMzIuODU3MTQzLDcuODU3MTQyOSBDIDQwLjgzNDI2NCw3Ljg1NzE0MjkgNDUuOTE4MzY4LDcuODU3MTQyOSA0OC4wOTUyMzgsNy44NTcxNDI5IEMgNDkuMjg1NzE0LDcuODU3MTQyOSA0OS44ODA5NTIsNy44NTcxNDI5IDUwLjE3ODU3MSw3Ljg1NzE0MjkgQyA1MC4zMjczODEsNy44NTcxNDI5IDUwLjQwOTIyNyw3Ljg1NzE0MjkgNTAuNDQ2NDI5LDcuODU3MTQyOSBDIDUwLjQ2NTAyOSw3Ljg1NzE0MjkgNTAuNDcxNTQzLDcuODU3MTQyOSA1MC40NzYxOSw3Ljg1NzE0MjkgQyA2MC4yMzY4NTMsNy44NTcxNDMgNjcuMTQyODU3LDE1LjQ5NzA5OCA2Ny4xNDI4NTcsMjUgQyA2Ny4xNDI4NTcsMzQuNTAyOTAyIDU5Ljc2MDY2Miw0Mi4xNDI4NTcgNTAsNDIuMTQyODU3IEwgMzIuODU3MTQzLDQyLjE0Mjg1NyBMIDMyLjg1NzE0Myw3Ljg1NzE0MjkgeiIKICAgICAgIGlkPSJwYXRoMjg4NCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2Njc2NjY2Nzc3Nzc2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICBpZD0icGF0aDQwMDgiCiAgICAgICBzb2RpcG9kaTpjeD0iNzUiCiAgICAgICBzb2RpcG9kaTpjeT0iMjUiCiAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgIHNvZGlwb2RpOnJ5PSI0IgogICAgICAgZD0iTSA3OSwyNSBBIDQsNCAwIDEgMSA3MSwyNSBBIDQsNCAwIDEgMSA3OSwyNSB6IiAvPgogIDwvZz4KPC9zdmc+Cg=="}}},{operation:function(t,e){return!(t&&e)}}),ar=tr.define("logic.Xor",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9IlhPUiBBTlNJLnN2ZyIKICAgaW5rc2NhcGU6b3V0cHV0X2V4dGVuc2lvbj0ib3JnLmlua3NjYXBlLm91dHB1dC5zdmcuaW5rc2NhcGUiPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0Ij4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSI1MCA6IDE1IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIyNSA6IDEwIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3MTQiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEgOiAwLjUgOiAxIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjAuNSA6IDAuMzMzMzMzMzMgOiAxIgogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgwNiIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjgxOSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzNzIuMDQ3MjQgOiAzNTAuNzg3MzkgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNzQ0LjA5NDQ4IDogNTI2LjE4MTA5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MjYuMTgxMDkgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMjc3NyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI3NSA6IDQwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjE1MCA6IDYwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA2MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUzMjc1IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjUwIDogMzMuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjEwMCA6IDUwIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiA1MCA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmU1NTMzIgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjMyIDogMjEuMzMzMzMzIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjY0IDogMzIgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDMyIDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI1NTciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxNi42NjY2NjcgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAyNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMjUgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjUuNjU2ODU0MiIKICAgICBpbmtzY2FwZTpjeD0iMjUuOTM4MTE2IgogICAgIGlua3NjYXBlOmN5PSIxNy4yMzAwNSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzOTkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIzMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJtIDcwLDI1IGMgMjAsMCAyNSwwIDI1LDAiCiAgICAgICBpZD0icGF0aDMwNTkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5ODg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzAuMzg1NzE3LDE1IEwgNC45OTk5OTk4LDE1IgogICAgICAgaWQ9InBhdGgzMDYxIiAvPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEuOTk5OTk5NzY7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gMzEuMzYyMDkxLDM1IEwgNC45OTk5OTk4LDM1IgogICAgICAgaWQ9InBhdGgzOTQ0IiAvPgogICAgPGcKICAgICAgIGlkPSJnMjU2MCIKICAgICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjYuNSwtMzkuNSkiPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDM1MTYiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0iTSAtMi4yNSw4MS41MDAwMDUgQyAtMy44NDczNzQsODQuMTQ0NDA1IC00LjUsODQuNTAwMDA1IC00LjUsODQuNTAwMDA1IEwgLTguMTU2MjUsODQuNTAwMDA1IEwgLTYuMTU2MjUsODIuMDYyNTA1IEMgLTYuMTU2MjUsODIuMDYyNTA1IC0wLjUsNzUuMDYyNDUxIC0wLjUsNjQuNSBDIC0wLjUsNTMuOTM3NTQ5IC02LjE1NjI1LDQ2LjkzNzUgLTYuMTU2MjUsNDYuOTM3NSBMIC04LjE1NjI1LDQ0LjUgTCAtNC41LDQ0LjUgQyAtMy43MTg3NSw0NS40Mzc1IC0zLjA3ODEyNSw0Ni4xNTYyNSAtMi4yODEyNSw0Ny41IEMgLTAuNDA4NTMxLDUwLjU5OTgxNSAyLjUsNTYuNTI2NjQ2IDIuNSw2NC41IEMgMi41LDcyLjQ1MDY1IC0wLjM5NjY5Nyw3OC4zNzk0MjUgLTIuMjUsODEuNTAwMDA1IHoiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY3NjY2Njc2MiIC8+CiAgICAgIDxwYXRoCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgICAgZD0iTSAtMi40MDYyNSw0NC41IEwgLTAuNDA2MjUsNDYuOTM3NSBDIC0wLjQwNjI1LDQ2LjkzNzUgNS4yNSw1My45Mzc1NDkgNS4yNSw2NC41IEMgNS4yNSw3NS4wNjI0NTEgLTAuNDA2MjUsODIuMDYyNSAtMC40MDYyNSw4Mi4wNjI1IEwgLTIuNDA2MjUsODQuNSBMIDAuNzUsODQuNSBMIDE0Ljc1LDg0LjUgQyAxNy4xNTgwNzYsODQuNTAwMDAxIDIyLjQzOTY5OSw4NC41MjQ1MTQgMjguMzc1LDgyLjA5Mzc1IEMgMzQuMzEwMzAxLDc5LjY2Mjk4NiA0MC45MTE1MzYsNzQuNzUwNDg0IDQ2LjA2MjUsNjUuMjE4NzUgTCA0NC43NSw2NC41IEwgNDYuMDYyNSw2My43ODEyNSBDIDM1Ljc1OTM4Nyw0NC43MTU1OSAxOS41MDY1NzQsNDQuNSAxNC43NSw0NC41IEwgMC43NSw0NC41IEwgLTIuNDA2MjUsNDQuNSB6IE0gMy40Njg3NSw0Ny41IEwgMTQuNzUsNDcuNSBDIDE5LjQzNDE3Myw0Ny41IDMzLjAzNjg1LDQ3LjM2OTc5MyA0Mi43MTg3NSw2NC41IEMgMzcuOTUxOTY0LDcyLjkyOTA3NSAzMi4xOTc0NjksNzcuMTgzOTEgMjcsNzkuMzEyNSBDIDIxLjYzOTMzOSw4MS41MDc5MjQgMTcuMTU4MDc1LDgxLjUwMDAwMSAxNC43NSw4MS41IEwgMy41LDgxLjUgQyA1LjM3MzU4ODQsNzguMzkxNTY2IDguMjUsNzIuNDUwNjUgOC4yNSw2NC41IEMgOC4yNSw1Ni41MjY2NDYgNS4zNDE0Njg2LDUwLjU5OTgxNSAzLjQ2ODc1LDQ3LjUgeiIKICAgICAgICAgaWQ9InBhdGg0OTczIgogICAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc2NjY2NzY2NjY2NjY2Njc2Njc2MiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K"}}},{operation:function(t,e){return(!t||e)&&(t||!e)}}),lr=tr.define("logic.Xnor",{attrs:{image:{"xlink:href":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSIxMDAiCiAgIGhlaWdodD0iNTAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ2IgogICB2ZXJzaW9uPSIxLjAiCiAgIHNvZGlwb2RpOmRvY25hbWU9IlhOT1IgQU5TSS5zdmciCiAgIGlua3NjYXBlOm91dHB1dF9leHRlbnNpb249Im9yZy5pbmtzY2FwZS5vdXRwdXQuc3ZnLmlua3NjYXBlIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogMTUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfej0iNTAgOiAxNSA6IDEiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMjUgOiAxMCA6IDEiCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNzE0IiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDAuNSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxIDogMC41IDogMSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIwLjUgOiAwLjMzMzMzMzMzIDogMSIKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MDYiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI4MTkiCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iMzcyLjA0NzI0IDogMzUwLjc4NzM5IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9Ijc0NC4wOTQ0OCA6IDUyNi4xODEwOSA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTI2LjE4MTA5IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgICA8aW5rc2NhcGU6cGVyc3BlY3RpdmUKICAgICAgIGlkPSJwZXJzcGVjdGl2ZTI3NzciCiAgICAgICBpbmtzY2FwZTpwZXJzcDNkLW9yaWdpbj0iNzUgOiA0MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxNTAgOiA2MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNjAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlMzI3NSIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSI1MCA6IDMzLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSIxMDAgOiA1MCA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF95PSIwIDogMTAwMCA6IDAiCiAgICAgICBpbmtzY2FwZTp2cF94PSIwIDogNTAgOiAxIgogICAgICAgc29kaXBvZGk6dHlwZT0iaW5rc2NhcGU6cGVyc3AzZCIgLz4KICAgIDxpbmtzY2FwZTpwZXJzcGVjdGl2ZQogICAgICAgaWQ9InBlcnNwZWN0aXZlNTUzMyIKICAgICAgIGlua3NjYXBlOnBlcnNwM2Qtb3JpZ2luPSIzMiA6IDIxLjMzMzMzMyA6IDEiCiAgICAgICBpbmtzY2FwZTp2cF96PSI2NCA6IDMyIDogMSIKICAgICAgIGlua3NjYXBlOnZwX3k9IjAgOiAxMDAwIDogMCIKICAgICAgIGlua3NjYXBlOnZwX3g9IjAgOiAzMiA6IDEiCiAgICAgICBzb2RpcG9kaTp0eXBlPSJpbmtzY2FwZTpwZXJzcDNkIiAvPgogICAgPGlua3NjYXBlOnBlcnNwZWN0aXZlCiAgICAgICBpZD0icGVyc3BlY3RpdmUyNTU3IgogICAgICAgaW5rc2NhcGU6cGVyc3AzZC1vcmlnaW49IjI1IDogMTYuNjY2NjY3IDogMSIKICAgICAgIGlua3NjYXBlOnZwX3o9IjUwIDogMjUgOiAxIgogICAgICAgaW5rc2NhcGU6dnBfeT0iMCA6IDEwMDAgOiAwIgogICAgICAgaW5rc2NhcGU6dnBfeD0iMCA6IDI1IDogMSIKICAgICAgIHNvZGlwb2RpOnR5cGU9Imlua3NjYXBlOnBlcnNwM2QiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSI0IgogICAgIGlua3NjYXBlOmN4PSI5NS43MjM2NiIKICAgICBpbmtzY2FwZTpjeT0iLTI2Ljc3NTAyMyIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJ0cnVlIgogICAgIGlua3NjYXBlOmdyaWQtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpncmlkLXBvaW50cz0idHJ1ZSIKICAgICBncmlkdG9sZXJhbmNlPSIxMDAwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzOTkiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIzMyIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIGlkPSJHcmlkRnJvbVByZTA0NlNldHRpbmdzIgogICAgICAgdHlwZT0ieHlncmlkIgogICAgICAgb3JpZ2lueD0iMHB4IgogICAgICAgb3JpZ2lueT0iMHB4IgogICAgICAgc3BhY2luZ3g9IjFweCIKICAgICAgIHNwYWNpbmd5PSIxcHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIGVtcGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4yIgogICAgICAgZW1wb3BhY2l0eT0iMC40IgogICAgICAgZW1wc3BhY2luZz0iNSIKICAgICAgIHZpc2libGU9InRydWUiCiAgICAgICBlbmFibGVkPSJ0cnVlIiAvPgogIDwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyLjAwMDAwMDI0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIDc4LjMzMzMzMiwyNSBDIDkxLjY2NjY2NiwyNSA5NSwyNSA5NSwyNSIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45OTk5OTk4ODtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMC4zODU3MTcsMTUgTCA0Ljk5OTk5OTgsMTUiCiAgICAgICBpZD0icGF0aDMwNjEiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MS45OTk5OTk3NjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgZD0iTSAzMS4zNjIwOTEsMzUgTCA0Ljk5OTk5OTgsMzUiCiAgICAgICBpZD0icGF0aDM5NDQiIC8+CiAgICA8ZwogICAgICAgaWQ9ImcyNTYwIgogICAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNi41LC0zOS41KSI+CiAgICAgIDxwYXRoCiAgICAgICAgIGlkPSJwYXRoMzUxNiIKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJNIC0yLjI1LDgxLjUwMDAwNSBDIC0zLjg0NzM3NCw4NC4xNDQ0MDUgLTQuNSw4NC41MDAwMDUgLTQuNSw4NC41MDAwMDUgTCAtOC4xNTYyNSw4NC41MDAwMDUgTCAtNi4xNTYyNSw4Mi4wNjI1MDUgQyAtNi4xNTYyNSw4Mi4wNjI1MDUgLTAuNSw3NS4wNjI0NTEgLTAuNSw2NC41IEMgLTAuNSw1My45Mzc1NDkgLTYuMTU2MjUsNDYuOTM3NSAtNi4xNTYyNSw0Ni45Mzc1IEwgLTguMTU2MjUsNDQuNSBMIC00LjUsNDQuNSBDIC0zLjcxODc1LDQ1LjQzNzUgLTMuMDc4MTI1LDQ2LjE1NjI1IC0yLjI4MTI1LDQ3LjUgQyAtMC40MDg1MzEsNTAuNTk5ODE1IDIuNSw1Ni41MjY2NDYgMi41LDY0LjUgQyAyLjUsNzIuNDUwNjUgLTAuMzk2Njk3LDc4LjM3OTQyNSAtMi4yNSw4MS41MDAwMDUgeiIKICAgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2Njc2NjY2NzYyIgLz4KICAgICAgPHBhdGgKICAgICAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MztzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIgogICAgICAgICBkPSJNIC0yLjQwNjI1LDQ0LjUgTCAtMC40MDYyNSw0Ni45Mzc1IEMgLTAuNDA2MjUsNDYuOTM3NSA1LjI1LDUzLjkzNzU0OSA1LjI1LDY0LjUgQyA1LjI1LDc1LjA2MjQ1MSAtMC40MDYyNSw4Mi4wNjI1IC0wLjQwNjI1LDgyLjA2MjUgTCAtMi40MDYyNSw4NC41IEwgMC43NSw4NC41IEwgMTQuNzUsODQuNSBDIDE3LjE1ODA3Niw4NC41MDAwMDEgMjIuNDM5Njk5LDg0LjUyNDUxNCAyOC4zNzUsODIuMDkzNzUgQyAzNC4zMTAzMDEsNzkuNjYyOTg2IDQwLjkxMTUzNiw3NC43NTA0ODQgNDYuMDYyNSw2NS4yMTg3NSBMIDQ0Ljc1LDY0LjUgTCA0Ni4wNjI1LDYzLjc4MTI1IEMgMzUuNzU5Mzg3LDQ0LjcxNTU5IDE5LjUwNjU3NCw0NC41IDE0Ljc1LDQ0LjUgTCAwLjc1LDQ0LjUgTCAtMi40MDYyNSw0NC41IHogTSAzLjQ2ODc1LDQ3LjUgTCAxNC43NSw0Ny41IEMgMTkuNDM0MTczLDQ3LjUgMzMuMDM2ODUsNDcuMzY5NzkzIDQyLjcxODc1LDY0LjUgQyAzNy45NTE5NjQsNzIuOTI5MDc1IDMyLjE5NzQ2OSw3Ny4xODM5MSAyNyw3OS4zMTI1IEMgMjEuNjM5MzM5LDgxLjUwNzkyNCAxNy4xNTgwNzUsODEuNTAwMDAxIDE0Ljc1LDgxLjUgTCAzLjUsODEuNSBDIDUuMzczNTg4NCw3OC4zOTE1NjYgOC4yNSw3Mi40NTA2NSA4LjI1LDY0LjUgQyA4LjI1LDU2LjUyNjY0NiA1LjM0MTQ2ODYsNTAuNTk5ODE1IDMuNDY4NzUsNDcuNSB6IgogICAgICAgICBpZD0icGF0aDQ5NzMiCiAgICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NzY2NjY3NjY2NjY2NjY2NzY2NzYyIgLz4KICAgIDwvZz4KICAgIDxwYXRoCiAgICAgICBzb2RpcG9kaTp0eXBlPSJhcmMiCiAgICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1saW5lam9pbjptaXRlcjttYXJrZXI6bm9uZTtzdHJva2Utb3BhY2l0eToxO3Zpc2liaWxpdHk6dmlzaWJsZTtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiCiAgICAgICBpZD0icGF0aDM1NTEiCiAgICAgICBzb2RpcG9kaTpjeD0iNzUiCiAgICAgICBzb2RpcG9kaTpjeT0iMjUiCiAgICAgICBzb2RpcG9kaTpyeD0iNCIKICAgICAgIHNvZGlwb2RpOnJ5PSI0IgogICAgICAgZD0iTSA3OSwyNSBBIDQsNCAwIDEgMSA3MSwyNSBBIDQsNCAwIDEgMSA3OSwyNSB6IiAvPgogIDwvZz4KPC9zdmc+Cg=="}}},{operation:function(t,e){return(!t||!e)&&(t||e)}}),cr={Gate:_n,IO:Qn,Input:Kn,Output:qn,Gate11:$n,Gate21:tr,Repeater:er,Not:ir,Or:nr,And:rr,Nor:or,Nand:sr,Xor:ar,Xnor:lr,Wire:We.define("logic.Wire",{attrs:{".connection":{"stroke-width":2},".marker-vertex":{r:7}},router:{name:"orthogonal"},connector:{name:"rounded",args:{radius:10}}},{arrowheadMarkup:['','',""].join(""),vertexMarkup:['','','','','',"Remove vertex.","","",""].join("")})},gr={KingWhite:In.define("chess.KingWhite",{size:{width:42,height:38}},{markup:' '}),KingBlack:In.define("chess.KingBlack",{size:{width:42,height:38}},{markup:' '}),QueenWhite:In.define("chess.QueenWhite",{size:{width:42,height:38}},{markup:' '}),QueenBlack:In.define("chess.QueenBlack",{size:{width:42,height:38}},{markup:' '}),RookWhite:In.define("chess.RookWhite",{size:{width:32,height:34}},{markup:' '}),RookBlack:In.define("chess.RookBlack",{size:{width:32,height:34}},{markup:' '}),BishopWhite:In.define("chess.BishopWhite",{size:{width:38,height:38}},{markup:' '}),BishopBlack:In.define("chess.BishopBlack",{size:{width:38,height:38}},{markup:' '}),KnightWhite:In.define("chess.KnightWhite",{size:{width:38,height:37}},{markup:' '}),KnightBlack:In.define("chess.KnightBlack",{size:{width:38,height:37}},{markup:' '}),PawnWhite:In.define("chess.PawnWhite",{size:{width:28,height:33}},{markup:''}),PawnBlack:In.define("chess.PawnBlack",{size:{width:28,height:33}},{markup:''})},hr=Ve.define("erd.Entity",{size:{width:150,height:60},attrs:{".outer":{fill:"#2ECC71",stroke:"#27AE60","stroke-width":2,points:"100,0 100,60 0,60 0,0"},".inner":{fill:"#2ECC71",stroke:"#27AE60","stroke-width":2,points:"95,5 95,55 5,55 5,5",display:"none"},text:{text:"Entity","font-family":"Arial","font-size":14,"ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),ur=hr.define("erd.WeakEntity",{attrs:{".inner":{display:"auto"},text:{text:"Weak Entity"}}}),dr=Ve.define("erd.Relationship",{size:{width:80,height:80},attrs:{".outer":{fill:"#3498DB",stroke:"#2980B9","stroke-width":2,points:"40,0 80,40 40,80 0,40"},".inner":{fill:"#3498DB",stroke:"#2980B9","stroke-width":2,points:"40,5 75,40 40,75 5,40",display:"none"},text:{text:"Relationship","font-family":"Arial","font-size":12,"ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),fr=dr.define("erd.IdentifyingRelationship",{attrs:{".inner":{display:"auto"},text:{text:"Identifying"}}}),pr=Ve.define("erd.Attribute",{size:{width:100,height:50},attrs:{ellipse:{transform:"translate(50, 25)"},".outer":{stroke:"#D35400","stroke-width":2,cx:0,cy:0,rx:50,ry:25,fill:"#E67E22"},".inner":{stroke:"#D35400","stroke-width":2,cx:0,cy:0,rx:45,ry:20,fill:"#E67E22",display:"none"},text:{"font-family":"Arial","font-size":14,"ref-x":.5,"ref-y":.5,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),Ir=pr.define("erd.Multivalued",{attrs:{".inner":{display:"block"},text:{text:"multivalued"}}}),mr=pr.define("erd.Derived",{attrs:{".outer":{"stroke-dasharray":"3,5"},text:{text:"derived"}}}),Ar=pr.define("erd.Key",{attrs:{ellipse:{"stroke-width":4},text:{text:"key","font-weight":"800","text-decoration":"underline"}}}),vr=pr.define("erd.Normal",{attrs:{text:{text:"Normal"}}}),Cr={Entity:hr,WeakEntity:ur,Relationship:dr,IdentifyingRelationship:fr,Attribute:pr,Multivalued:Ir,Derived:mr,Key:Ar,Normal:vr,ISA:Ve.define("erd.ISA",{type:"erd.ISA",size:{width:100,height:50},attrs:{polygon:{points:"0,0 50,50 100,0",fill:"#F1C40F",stroke:"#F39C12","stroke-width":2},text:{text:"ISA","font-size":18,"ref-x":.5,"ref-y":.3,"y-alignment":"middle","text-anchor":"middle"}}},{markup:''}),Line:We.define("erd.Line",{},{cardinality:function(t){this.set("labels",[{position:-20,attrs:{text:{dy:-8,text:t}}}])}})},wr={State:Cn.define("fsa.State",{attrs:{circle:{"stroke-width":3},text:{"font-weight":"800"}}}),StartState:Ve.define("fsa.StartState",{size:{width:20,height:20},attrs:{circle:{transform:"translate(10, 10)",r:10,fill:"#000000"}}},{markup:''}),EndState:Ve.define("fsa.EndState",{size:{width:20,height:20},attrs:{".outer":{transform:"translate(10, 10)",r:10,fill:"#ffffff",stroke:"#000000"},".inner":{transform:"translate(10, 10)",r:6,fill:"#000000"}}},{markup:''}),Arrow:We.define("fsa.Arrow",{attrs:{".marker-target":{d:"M 10 0 L 0 5 L 10 10 z"}},smooth:!0})},yr={Member:Ve.define("org.Member",{size:{width:180,height:70},attrs:{rect:{width:170,height:60},".card":{fill:"#FFFFFF",stroke:"#000000","stroke-width":2,"pointer-events":"visiblePainted",rx:10,ry:10},image:{width:48,height:48,ref:".card","ref-x":10,"ref-y":5},".rank":{"text-decoration":"underline",ref:".card","ref-x":.9,"ref-y":.2,"font-family":"Courier New","font-size":14,"text-anchor":"end"},".name":{"font-weight":"800",ref:".card","ref-x":.9,"ref-y":.6,"font-family":"Courier New","font-size":14,"text-anchor":"end"}}},{markup:''}),Arrow:We.define("org.Arrow",{source:{selector:".card"},target:{selector:".card"},attrs:{".connection":{stroke:"#585858","stroke-width":3}},z:-1})},br={Place:In.define("pn.Place",{size:{width:50,height:50},attrs:{".root":{r:25,fill:"#ffffff",stroke:"#000000",transform:"translate(25, 25)"},".label":{"text-anchor":"middle","ref-x":.5,"ref-y":-20,ref:".root",fill:"#000000","font-size":12},".tokens > circle":{fill:"#000000",r:5},".tokens.one > circle":{transform:"translate(25, 25)"},".tokens.two > circle:nth-child(1)":{transform:"translate(19, 25)"},".tokens.two > circle:nth-child(2)":{transform:"translate(31, 25)"},".tokens.three > circle:nth-child(1)":{transform:"translate(18, 29)"},".tokens.three > circle:nth-child(2)":{transform:"translate(25, 19)"},".tokens.three > circle:nth-child(3)":{transform:"translate(32, 29)"},".tokens.alot > text":{transform:"translate(25, 18)","text-anchor":"middle",fill:"#000000"}}},{markup:''}),PlaceView:$e.extend({presentationAttributes:$e.addPresentationAttributes({tokens:["TOKENS"]}),initFlag:$e.prototype.initFlag.concat(["TOKENS"]),confirmUpdate:function(){for(var t,e=[],i=arguments.length;i--;)e[i]=arguments[i];var n=(t=$e.prototype.confirmUpdate).call.apply(t,[this].concat(e));return this.hasFlag(n,"TOKENS")&&(this.renderTokens(),this.update(),n=this.removeFlag(n,"TOKENS")),n},renderTokens:function(){var e=this.vel.findOne(".tokens").empty();["one","two","three","alot"].forEach(function(t){e.removeClass(t)});var t=this.model.get("tokens");if(t)switch(t){case 1:e.addClass("one"),e.append(q("circle"));break;case 2:e.addClass("two"),e.append([q("circle"),q("circle")]);break;case 3:e.addClass("three"),e.append([q("circle"),q("circle"),q("circle")]);break;default:e.addClass("alot"),e.append(q("text").text(t+""))}}}),Transition:In.define("pn.Transition",{size:{width:12,height:50},attrs:{rect:{width:12,height:50,fill:"#000000",stroke:"#000000"},".label":{"text-anchor":"middle","ref-x":.5,"ref-y":-20,ref:"rect",fill:"#000000","font-size":12}}},{markup:''}),Link:We.define("pn.Link",{attrs:{".marker-target":{d:"M 10 0 L 0 5 L 10 10 z"}}})},Nr=In.define("uml.Class",{attrs:{rect:{width:200},".uml-class-name-rect":{stroke:"black","stroke-width":2,fill:"#3498db"},".uml-class-attrs-rect":{stroke:"black","stroke-width":2,fill:"#2980b9"},".uml-class-methods-rect":{stroke:"black","stroke-width":2,fill:"#2980b9"},".uml-class-name-text":{ref:".uml-class-name-rect","ref-y":.5,"ref-x":.5,"text-anchor":"middle","y-alignment":"middle","font-weight":"bold",fill:"black","font-size":12,"font-family":"Times New Roman"},".uml-class-attrs-text":{ref:".uml-class-attrs-rect","ref-y":5,"ref-x":5,fill:"black","font-size":12,"font-family":"Times New Roman"},".uml-class-methods-text":{ref:".uml-class-methods-rect","ref-y":5,"ref-x":5,fill:"black","font-size":12,"font-family":"Times New Roman"}},name:[],attributes:[],methods:[]},{markup:['','','',"",'',""].join(""),initialize:function(){this.on("change:name change:attributes change:methods",function(){this.updateRectangles(),this.trigger("uml-update")},this),this.updateRectangles(),In.prototype.initialize.apply(this,arguments)},getClassName:function(){return this.get("name")},updateRectangles:function(){var n=this.get("attrs"),t=[{type:"name",text:this.getClassName()},{type:"attrs",text:this.get("attributes")},{type:"methods",text:this.get("methods")}],r=0;t.forEach(function(t){var e=Array.isArray(t.text)?t.text:[t.text],i=20*e.length+20;n[".uml-class-"+t.type+"-text"].text=e.join("\n"),n[".uml-class-"+t.type+"-rect"].height=i,n[".uml-class-"+t.type+"-rect"].transform="translate(0,"+r+")",r+=i})}}),Mr=$e.extend({initialize:function(){$e.prototype.initialize.apply(this,arguments),this.listenTo(this.model,"uml-update",function(){this.update(),this.resize()})}}),xr=Nr.define("uml.Abstract",{attrs:{".uml-class-name-rect":{fill:"#e74c3c"},".uml-class-attrs-rect":{fill:"#c0392b"},".uml-class-methods-rect":{fill:"#c0392b"}}},{getClassName:function(){return["<>",this.get("name")]}}),Sr=Mr,kr=Nr.define("uml.Interface",{attrs:{".uml-class-name-rect":{fill:"#f1c40f"},".uml-class-attrs-rect":{fill:"#f39c12"},".uml-class-methods-rect":{fill:"#f39c12"}}},{getClassName:function(){return["<>",this.get("name")]}}),Dr={basic:zn,standard:Xn,devs:Hn,logic:cr,chess:gr,erd:Cr,fsa:wr,org:yr,pn:br,uml:{Class:Nr,ClassView:Mr,Abstract:xr,AbstractView:Sr,Interface:kr,InterfaceView:Mr,Generalization:We.define("uml.Generalization",{attrs:{".marker-target":{d:"M 20 0 L 0 10 L 20 20 z",fill:"white"}}}),Implementation:We.define("uml.Implementation",{attrs:{".marker-target":{d:"M 20 0 L 0 10 L 20 20 z",fill:"white"},".connection":{"stroke-dasharray":"3,3"}}}),Aggregation:We.define("uml.Aggregation",{attrs:{".marker-target":{d:"M 40 10 L 20 20 L 0 10 L 20 0 z",fill:"white"}}}),Composition:We.define("uml.Composition",{attrs:{".marker-target":{d:"M 40 10 L 20 20 L 0 10 L 20 0 z",fill:"black"}}}),Association:We.define("uml.Association"),State:In.define("uml.State",{attrs:{".uml-state-body":{width:200,height:200,rx:10,ry:10,fill:"#ecf0f1",stroke:"#bdc3c7","stroke-width":3},".uml-state-separator":{stroke:"#bdc3c7","stroke-width":2},".uml-state-name":{ref:".uml-state-body","ref-x":.5,"ref-y":5,"text-anchor":"middle",fill:"#000000","font-family":"Courier New","font-size":14},".uml-state-events":{ref:".uml-state-separator","ref-x":5,"ref-y":5,fill:"#000000","font-family":"Courier New","font-size":14}},name:"State",events:[]},{markup:['','','',"",'','','',""].join(""),initialize:function(){this.on({"change:name":this.updateName,"change:events":this.updateEvents,"change:size":this.updatePath},this),this.updateName(),this.updateEvents(),this.updatePath(),In.prototype.initialize.apply(this,arguments)},updateName:function(){this.attr(".uml-state-name/text",this.get("name"))},updateEvents:function(){this.attr(".uml-state-events/text",this.get("events").join("\n"))},updatePath:function(){var t="M 0 20 L "+this.get("size").width+" 20";this.attr(".uml-state-separator/d",t,{silent:!0})}}),StartState:Cn.define("uml.StartState",{type:"uml.StartState",attrs:{circle:{fill:"#34495e",stroke:"#2c3e50","stroke-width":2,rx:1}}}),EndState:In.define("uml.EndState",{size:{width:20,height:20},attrs:{"circle.outer":{transform:"translate(10, 10)",r:10,fill:"#ffffff",stroke:"#2c3e50"},"circle.inner":{transform:"translate(10, 10)",r:6,fill:"#34495e"}}},{markup:''}),Transition:We.define("uml.Transition",{attrs:{".marker-target":{d:"M 10 0 L 0 5 L 10 10 z",fill:"#34495e",stroke:"#2c3e50"},".connection":{stroke:"#2c3e50"}}})}};function zr(t,e){return 0===e?"0%":Math.round(t/e*100)+"%"}function Tr(r){return function(t,e,i,n){return(e.isNodeConnection(i)?Lr:jr)(r,t,e,i,n)}}function jr(t,e,i,n,r){var o=i.model.angle(),s=i.getNodeUnrotatedBBox(n),a=i.model.getBBox().center();r.rotate(a,o);var l=r.x-s.x,c=r.y-s.y;return t&&(l=zr(l,s.width),c=zr(c,s.height)),e.anchor={name:"topLeft",args:{dx:l,dy:c,rotate:!0}},e}function Lr(t,e,i,n,r){var o=i.getConnection();if(!o)return e;var s=o.closestPointLength(r);if(t){var a=o.length();e.anchor={name:"connectionRatio",args:{ratio:s/a}}}else e.anchor={name:"connectionLength",args:{length:s}};return e}var Zr=he,Pr=Tr(!1),Gr=Tr(!0),Br={useDefaults:Zr,pinAbsolute:Pr,pinRelative:Gr};function Or(t,e,i){return Gr.call(this.paper,{},e,i,t,this.model).anchor}function Er(t,e){var i=t.model;return e?i.getBBox():i.isLink()?t.getConnection().bbox():t.getNodeUnrotatedBBox(t.el)}var Yr=Qe.extend({tagName:"circle",svgElement:!0,className:"marker-vertex",events:{mousedown:"onPointerDown",touchstart:"onPointerDown",dblclick:"onDoubleClick"},documentEvents:{mousemove:"onPointerMove",touchmove:"onPointerMove",mouseup:"onPointerUp",touchend:"onPointerUp",touchcancel:"onPointerUp"},attributes:{r:6,fill:"#33334F",stroke:"#FFFFFF","stroke-width":2,cursor:"move"},position:function(t,e){this.vel.attr({cx:t,cy:e})},onPointerDown:function(t){this.options.guard(t)||(t.stopPropagation(),t.preventDefault(),this.options.paper.undelegateEvents(),this.delegateDocumentEvents(null,t.data),this.trigger("will-change",this,t))},onPointerMove:function(t){this.trigger("changing",this,t)},onDoubleClick:function(t){this.trigger("remove",this,t)},onPointerUp:function(t){this.trigger("changed",this,t),this.undelegateDocumentEvents(),this.options.paper.delegateEvents()}}),Rr=hn.extend({name:"vertices",options:{handleClass:Yr,snapRadius:20,redundancyRemoval:!0,vertexAdding:!0,stopPropagation:!0},children:[{tagName:"path",selector:"connection",className:"joint-vertices-path",attributes:{fill:"none",stroke:"transparent","stroke-width":10,cursor:"cell"}}],handles:null,events:{"mousedown .joint-vertices-path":"onPathPointerDown","touchstart .joint-vertices-path":"onPathPointerDown"},onRender:function(){return this.options.vertexAdding&&(this.renderChildren(),this.updatePath()),this.resetHandles(),this.renderHandles(),this},update:function(){return this.relatedView.model.vertices().length===this.handles.length?this.updateHandles():(this.resetHandles(),this.renderHandles()),this.options.vertexAdding&&this.updatePath(),this},resetHandles:function(){var t=this.handles;if(this.handles=[],this.stopListening(),Array.isArray(t))for(var e=0,i=t.length;e pointAt: function(t) { @@ -1656,6 +1668,11 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return this.start.toString() + ' ' + this.end.toString(); }, + serialize: function() { + + return this.start.serialize() + ' ' + this.end.serialize(); + }, + translate: function(tx, ty) { this.start.translate(tx, ty); @@ -3249,6 +3266,11 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. return this.x + '@' + this.y; }, + serialize: function() { + + return this.x + ',' + this.y; + }, + update: function(x, y) { this.x = x || 0; diff --git a/dist/vectorizer.min.js b/dist/vectorizer.min.js index 53c4c5521..5b7fbb576 100644 --- a/dist/vectorizer.min.js +++ b/dist/vectorizer.min.js @@ -1,8 +1,8 @@ -/*! JointJS v3.1.1 (2019-10-28) - JavaScript diagramming library +/*! JointJS v3.2.0 (2020-06-04) - JavaScript diagramming library This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -if(function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t=t||self).V=n()}(this,function(){"use strict";var i=Math,F=i.abs,h=i.cos,u=i.sin,R=i.sqrt,q=i.min,M=i.max,c=i.atan2,e=i.round,r=i.floor,s=i.PI,E=i.pow,t={curveThroughPoints:function(t){return console.warn("deprecated"),new T(d.throughPoints(t)).serialize()},getCurveControlPoints:function(t){console.warn("deprecated");var n,e=[],i=[],r=t.length-1;if(1==r)return e[0]=new w((2*t[0].x+t[1].x)/3,(2*t[0].y+t[1].y)/3),i[0]=new w(2*e[0].x-t[0].x,2*e[0].y-t[0].y),[e,i];var s=[];for(n=1;na.x+s/2,l=ia.x?r-30:r+30)-u)/(o*o*(i-h))+h:n=o*o/(r-u)-o*o*(i-h)*((e=r>a.y?i+30:i-30)-h)/(s*s*(r-u))+u,new w(e,n).theta(t)},toString:function(){return new w(this.x,this.y).toString()+" "+this.a+" "+this.b}};var x=function(t,n){return this instanceof x?t instanceof x?new x(t.start,t.end):(this.start=new w(t),void(this.end=new w(n))):new x(t,n)};x.prototype={angle:function(){var t=new w(this.start.x+1,this.start.y);return this.start.angleBetween(this.end,t)},bbox:function(){var t=q(this.start.x,this.end.x),n=q(this.start.y,this.end.y),e=M(this.start.x,this.end.x),i=M(this.start.y,this.end.y);return new V(t,n,e-t,i-n)},bearing:function(){var t=l(this.start.y),n=l(this.end.y),e=this.start.x,i=this.end.x,r=l(i-e),s=u(r)*h(n),o=h(t)*u(n)-u(t)*h(n)*h(r),a=g(c(s,o))-22.5;return a<0&&(a+=360),["NE","E","SE","S","SW","W","NW","N"][a=parseInt(a/45)]},clone:function(){return new x(this.start,this.end)},closestPoint:function(t){return this.pointAt(this.closestPointNormalizedLength(t))},closestPointLength:function(t){return this.closestPointNormalizedLength(t)*this.length()},closestPointNormalizedLength:function(t){var n=this.vector().dot(new x(this.start,t).vector()),e=q(1,M(0,n/this.squaredLength()));return e!=e?0:e},closestPointTangent:function(t){return this.tangentAt(this.closestPointNormalizedLength(t))},containsPoint:function(t){var n=this.start,e=this.end;if(0!==n.cross(t,e))return!1;var i=this.length();return!(new x(n,t).length()>i)&&!(new x(t,e).length()>i)},divideAt:function(t){var n=this.pointAt(t);return[new x(this.start,n),new x(n,this.end)]},divideAtLength:function(t){var n=this.pointAtLength(t);return[new x(this.start,n),new x(n,this.end)]},equals:function(t){return!!t&&this.start.x===t.start.x&&this.start.y===t.start.y&&this.end.x===t.end.x&&this.end.y===t.end.y},intersect:function(t,n){if(t instanceof x||t instanceof V||t instanceof C||t instanceof y||t instanceof T){var e=t.intersectionWithLine(this,n);return e&&t instanceof x&&(e=e[0]),e}return null},intersectionWithLine:function(t){var n=new w(this.end.x-this.start.x,this.end.y-this.start.y),e=new w(t.end.x-t.start.x,t.end.y-t.start.y),i=n.x*e.y-n.y*e.x,r=new w(t.start.x-this.start.x,t.start.y-this.start.y),s=r.x*e.y-r.y*e.x,o=r.x*n.y-r.y*n.x;if(0===i||s*i<0||o*i<0)return null;if(0u.y||r>h.y&&r<=u.y){var l=h.x-i>u.x-i?h.x-i:u.x-i;if(0<=l){var f=new w(i+l,r),d=new x(t,f);c.intersect(d)&&a++}}s=o}return a%2==1},convexHull:function(){var t,n,e,i=this.points,r=i.length;if(0===r)return new C;for(t=0;te.x&&(e=i[t]);var s=[];for(t=0;t=this.x&&t.x<=this.x+this.width&&t.y>=this.y&&t.y<=this.y+this.height},containsRect:function(t){var n=new V(this).normalize(),e=new V(t).normalize(),i=n.width,r=n.height,s=e.width,o=e.height;if(!(i&&r&&s&&o))return!1;var a=n.x,h=n.y,u=e.x,c=e.y;return s+=u,i+=a,o+=c,r+=h,a<=u&&s<=i&&h<=c&&o<=r},corner:function(){return new w(this.x+this.width,this.y+this.height)},equals:function(t){var n=new V(this).normalize(),e=new V(t).normalize();return n.x===e.x&&n.y===e.y&&n.width===e.width&&n.height===e.height},inflate:function(t,n){return void 0===t&&(t=0),void 0===n&&(n=t),this.x-=t,this.y-=n,this.width+=2*t,this.height+=2*n,this},intersect:function(t){var n=this.origin(),e=this.corner(),i=t.origin(),r=t.corner();if(r.x<=n.x||r.y<=n.y||i.x>=e.x||i.y>=e.y)return null;var s=M(n.x,i.x),o=M(n.y,i.y);return new V(s,o,q(e.x,r.x)-s,q(e.y,r.y)-o)},intersectionWithLine:function(t){var n,e,i=[this.topLine(),this.rightLine(),this.bottomLine(),this.leftLine()],r=[],s=[],o=i.length;for(e=0;ec&&(i=(this.x+this.width-c)/(d.x-c)),d.y>l&&(a=(this.y+this.height-l)/(d.y-l));var g=t.topRight();g.x>c&&(r=(this.x+this.width-c)/(g.x-c)),g.yl&&(u=(this.y+this.height-l)/(v.y-l)),{sx:q(e,i,r,s),sy:q(o,a,h,u)}},maxRectUniformScaleToFit:function(t,n){var e=this.maxRectScaleToFit(t,n);return q(e.sx,e.sy)},moveAndExpand:function(t){return this.x+=t.x||0,this.y+=t.y||0,this.width+=t.width||0,this.height+=t.height||0,this},normalize:function(){var t=this.x,n=this.y,e=this.width,i=this.height;return this.width<0&&(t=this.x+this.width,e=-this.width),this.height<0&&(n=this.y+this.height,i=-this.height),this.x=t,this.y=n,this.width=e,this.height=i,this},offset:function(t,n){return w.prototype.offset.call(this,t,n)},origin:function(){return new w(this.x,this.y)},pointNearestToPoint:function(t){if(t=new w(t),this.containsPoint(t))switch(this.sideNearestToPoint(t)){case"right":return new w(this.x+this.width,t.y);case"left":return new w(this.x,t.y);case"bottom":return new w(t.x,this.y+this.height);case"top":return new w(t.x,this.y)}return t.adhereToRect(this)},rightLine:function(){return new x(this.topRight(),this.bottomRight())},rightMiddle:function(){return new w(this.x+this.width,this.y+this.height/2)},round:function(t){var n=E(10,t||0);return this.x=e(this.x*n)/n,this.y=e(this.y*n)/n,this.width=e(this.width*n)/n,this.height=e(this.height*n)/n,this},scale:function(t,n,e){return e=this.origin().scale(t,n,e),this.x=e.x,this.y=e.y,this.width*=t,this.height*=n,this},sideNearestToPoint:function(t){var n=(t=new w(t)).x-this.x,e=this.x+this.width-t.x,i=t.y-this.y,r=n,s="left";return e'+t+"";return O.parseXML(n,{async:!1}).documentElement}var e=document.createElementNS(I.svg,"svg");return e.setAttributeNS(I.xmlns,"xmlns:xlink",I.xlink),e.setAttribute("version","1.1"),e},O.idCounter=0,O.uniqueId=function(){return"v-"+ ++O.idCounter},O.toNode=function(t){return O.isV(t)?t.node:t.nodeName&&t||t[0]},O.ensureId=function(t){return(t=O.toNode(t)).id||(t.id=O.uniqueId())},O.sanitizeText=function(t){return(t||"").replace(/ /g," ")},O.isUndefined=function(t){return void 0===t},O.isString=function(t){return"string"==typeof t},O.isObject=function(t){return t&&"object"==typeof t},O.isArray=Array.isArray,O.parseXML=function(t,n){var e;n=n||{};try{var i=new DOMParser;O.isUndefined(n.async)||(i.async=n.async),e=i.parseFromString(t,"text/xml")}catch(t){e=void 0}if(!e||e.getElementsByTagName("parsererror").length)throw new Error("Invalid XML: "+t);return e},O.qualifyAttr=function(t){if(-1===t.indexOf(":"))return{ns:null,local:t};var n=t.split(":");return{ns:I[n[0]],local:n[1]}},O.transformRegex=/(\w+)\(([^,)]+),?([^)]+)?\)/gi,O.transformSeparatorRegex=/[ ,]+/,O.transformationListRegex=/^(\w+)\((.*)\)/,O.transformStringToMatrix=function(t){var n=O.createSVGMatrix(),e=t&&t.match(O.transformRegex);if(!e)return n;for(var i=0,r=e.length;i=t.start&&nt.start&&e<=t.end||t.start>=n&&t.end=n?t.end+=e:t.start>=n&&(t.start+=e,t.end+=e)}),t},O.convertLineToPathData=function(t){return["M",(t=O(t)).attr("x1"),t.attr("y1"),"L",t.attr("x2"),t.attr("y2")].join(" ")},O.convertPolygonToPathData=function(t){var n=O.getPointsFromSvgNode(t);return 0===n.length?null:O.svgPointsToPath(n)+" Z"},O.convertPolylineToPathData=function(t){var n=O.getPointsFromSvgNode(t);return 0===n.length?null:O.svgPointsToPath(n)},O.svgPointsToPath=function(t){for(var n=0,e=t.length;n=s[r]&&(o.push([n].concat(i.splice(0,s[r]))),s[r]););}),o}(t)),!t||!t.length)return[["M",0,0]];for(var n,e=[],i=0,r=0,s=0,o=0,a=t.length,h=0;hf){var L=A,E=h,C=u;g=t(h=b+i*Y(A=P+f*(a&&Pa.x+s/2,l=ia.x?r-30:r+30)-u)/(o*o*(i-h))+h:n=o*o/(r-u)-o*o*(i-h)*((e=r>a.y?i+30:i-30)-h)/(s*s*(r-u))+u,new w(e,n).theta(t)},toString:function(){return new w(this.x,this.y).toString()+" "+this.a+" "+this.b}};var x=function(t,n){return this instanceof x?t instanceof x?new x(t.start,t.end):(this.start=new w(t),void(this.end=new w(n))):new x(t,n)};x.prototype={angle:function(){var t=new w(this.start.x+1,this.start.y);return this.start.angleBetween(this.end,t)},bbox:function(){var t=q(this.start.x,this.end.x),n=q(this.start.y,this.end.y),e=M(this.start.x,this.end.x),i=M(this.start.y,this.end.y);return new V(t,n,e-t,i-n)},bearing:function(){var t=l(this.start.y),n=l(this.end.y),e=this.start.x,i=this.end.x,r=l(i-e),s=u(r)*h(n),o=h(t)*u(n)-u(t)*h(n)*h(r),a=g(c(s,o))-22.5;return a<0&&(a+=360),["NE","E","SE","S","SW","W","NW","N"][a=parseInt(a/45)]},clone:function(){return new x(this.start,this.end)},closestPoint:function(t){return this.pointAt(this.closestPointNormalizedLength(t))},closestPointLength:function(t){return this.closestPointNormalizedLength(t)*this.length()},closestPointNormalizedLength:function(t){var n=this.vector().dot(new x(this.start,t).vector()),e=q(1,M(0,n/this.squaredLength()));return e!=e?0:e},closestPointTangent:function(t){return this.tangentAt(this.closestPointNormalizedLength(t))},containsPoint:function(t){var n=this.start,e=this.end;if(0!==n.cross(t,e))return!1;var i=this.length();return!(new x(n,t).length()>i)&&!(new x(t,e).length()>i)},divideAt:function(t){var n=this.pointAt(t);return[new x(this.start,n),new x(n,this.end)]},divideAtLength:function(t){var n=this.pointAtLength(t);return[new x(this.start,n),new x(n,this.end)]},equals:function(t){return!!t&&this.start.x===t.start.x&&this.start.y===t.start.y&&this.end.x===t.end.x&&this.end.y===t.end.y},intersect:function(t,n){if(t instanceof x||t instanceof V||t instanceof C||t instanceof y||t instanceof T){var e=t.intersectionWithLine(this,n);return e&&t instanceof x&&(e=e[0]),e}return null},intersectionWithLine:function(t){var n=new w(this.end.x-this.start.x,this.end.y-this.start.y),e=new w(t.end.x-t.start.x,t.end.y-t.start.y),i=n.x*e.y-n.y*e.x,r=new w(t.start.x-this.start.x,t.start.y-this.start.y),s=r.x*e.y-r.y*e.x,o=r.x*n.y-r.y*n.x;if(0===i||s*i<0||o*i<0)return null;if(0u.y||r>h.y&&r<=u.y){var l=h.x-i>u.x-i?h.x-i:u.x-i;if(0<=l){var f=new w(i+l,r),d=new x(t,f);c.intersect(d)&&a++}}s=o}return a%2==1},convexHull:function(){var t,n,e,i=this.points,r=i.length;if(0===r)return new C;for(t=0;te.x&&(e=i[t]);var s=[];for(t=0;t=this.x&&t.x<=this.x+this.width&&t.y>=this.y&&t.y<=this.y+this.height},containsRect:function(t){var n=new V(this).normalize(),e=new V(t).normalize(),i=n.width,r=n.height,s=e.width,o=e.height;if(!(i&&r&&s&&o))return!1;var a=n.x,h=n.y,u=e.x,c=e.y;return s+=u,i+=a,o+=c,r+=h,a<=u&&s<=i&&h<=c&&o<=r},corner:function(){return new w(this.x+this.width,this.y+this.height)},equals:function(t){var n=new V(this).normalize(),e=new V(t).normalize();return n.x===e.x&&n.y===e.y&&n.width===e.width&&n.height===e.height},inflate:function(t,n){return void 0===t&&(t=0),void 0===n&&(n=t),this.x-=t,this.y-=n,this.width+=2*t,this.height+=2*n,this},intersect:function(t){var n=this.origin(),e=this.corner(),i=t.origin(),r=t.corner();if(r.x<=n.x||r.y<=n.y||i.x>=e.x||i.y>=e.y)return null;var s=M(n.x,i.x),o=M(n.y,i.y);return new V(s,o,q(e.x,r.x)-s,q(e.y,r.y)-o)},intersectionWithLine:function(t){var n,e,i=[this.topLine(),this.rightLine(),this.bottomLine(),this.leftLine()],r=[],s=[],o=i.length;for(e=0;ec&&(i=(this.x+this.width-c)/(d.x-c)),d.y>l&&(a=(this.y+this.height-l)/(d.y-l));var g=t.topRight();g.x>c&&(r=(this.x+this.width-c)/(g.x-c)),g.yl&&(u=(this.y+this.height-l)/(v.y-l)),{sx:q(e,i,r,s),sy:q(o,a,h,u)}},maxRectUniformScaleToFit:function(t,n){var e=this.maxRectScaleToFit(t,n);return q(e.sx,e.sy)},moveAndExpand:function(t){return this.x+=t.x||0,this.y+=t.y||0,this.width+=t.width||0,this.height+=t.height||0,this},normalize:function(){var t=this.x,n=this.y,e=this.width,i=this.height;return this.width<0&&(t=this.x+this.width,e=-this.width),this.height<0&&(n=this.y+this.height,i=-this.height),this.x=t,this.y=n,this.width=e,this.height=i,this},offset:function(t,n){return w.prototype.offset.call(this,t,n)},origin:function(){return new w(this.x,this.y)},pointNearestToPoint:function(t){if(t=new w(t),this.containsPoint(t))switch(this.sideNearestToPoint(t)){case"right":return new w(this.x+this.width,t.y);case"left":return new w(this.x,t.y);case"bottom":return new w(t.x,this.y+this.height);case"top":return new w(t.x,this.y)}return t.adhereToRect(this)},rightLine:function(){return new x(this.topRight(),this.bottomRight())},rightMiddle:function(){return new w(this.x+this.width,this.y+this.height/2)},round:function(t){var n=E(10,t||0);return this.x=e(this.x*n)/n,this.y=e(this.y*n)/n,this.width=e(this.width*n)/n,this.height=e(this.height*n)/n,this},scale:function(t,n,e){return e=this.origin().scale(t,n,e),this.x=e.x,this.y=e.y,this.width*=t,this.height*=n,this},sideNearestToPoint:function(t){var n=(t=new w(t)).x-this.x,e=this.x+this.width-t.x,i=t.y-this.y,r=n,s="left";return e'+t+"";return O.parseXML(n,{async:!1}).documentElement}var e=document.createElementNS(I.svg,"svg");return e.setAttributeNS(I.xmlns,"xmlns:xlink",I.xlink),e.setAttribute("version","1.1"),e},O.idCounter=0,O.uniqueId=function(){return"v-"+ ++O.idCounter},O.toNode=function(t){return O.isV(t)?t.node:t.nodeName&&t||t[0]},O.ensureId=function(t){return(t=O.toNode(t)).id||(t.id=O.uniqueId())},O.sanitizeText=function(t){return(t||"").replace(/ /g," ")},O.isUndefined=function(t){return void 0===t},O.isString=function(t){return"string"==typeof t},O.isObject=function(t){return t&&"object"==typeof t},O.isArray=Array.isArray,O.parseXML=function(t,n){var e;n=n||{};try{var i=new DOMParser;O.isUndefined(n.async)||(i.async=n.async),e=i.parseFromString(t,"text/xml")}catch(t){e=void 0}if(!e||e.getElementsByTagName("parsererror").length)throw new Error("Invalid XML: "+t);return e},O.qualifyAttr=function(t){if(-1===t.indexOf(":"))return{ns:null,local:t};var n=t.split(":");return{ns:I[n[0]],local:n[1]}},O.transformRegex=/(\w+)\(([^,)]+),?([^)]+)?\)/gi,O.transformSeparatorRegex=/[ ,]+/,O.transformationListRegex=/^(\w+)\((.*)\)/,O.transformStringToMatrix=function(t){var n=O.createSVGMatrix(),e=t&&t.match(O.transformRegex);if(!e)return n;for(var i=0,r=e.length;i=t.start&&nt.start&&e<=t.end||t.start>=n&&t.end=n?t.end+=e:t.start>=n&&(t.start+=e,t.end+=e)}),t},O.convertLineToPathData=function(t){return["M",(t=O(t)).attr("x1"),t.attr("y1"),"L",t.attr("x2"),t.attr("y2")].join(" ")},O.convertPolygonToPathData=function(t){var n=O.getPointsFromSvgNode(t);return 0===n.length?null:O.svgPointsToPath(n)+" Z"},O.convertPolylineToPathData=function(t){var n=O.getPointsFromSvgNode(t);return 0===n.length?null:O.svgPointsToPath(n)},O.svgPointsToPath=function(t){for(var n=0,e=t.length;n=s[r]&&(o.push([n].concat(i.splice(0,s[r]))),s[r]););}),o}(t)),!t||!t.length)return[["M",0,0]];for(var n,e=[],i=0,r=0,s=0,o=0,a=t.length,h=0;hf){var L=A,E=h,C=u;g=t(h=b+i*Y(A=P+f*(a&&P