From ad950869c3e7615d987b7fd30f946787d54caef2 Mon Sep 17 00:00:00 2001 From: Chris Vanderloo Date: Wed, 11 Nov 2020 10:04:22 -0500 Subject: [PATCH] Updates --- asset-manifest.json | 8 ++++---- index.html | 2 +- ... precache-manifest.6bd20d8da09ea1bdc0935e9643a16a68.js | 8 ++++---- service-worker.js | 2 +- static/js/main.87c18d69.chunk.js | 2 -- static/js/main.87c18d69.chunk.js.map | 1 - static/js/main.dbec2f34.chunk.js | 2 ++ static/js/main.dbec2f34.chunk.js.map | 1 + 8 files changed, 13 insertions(+), 13 deletions(-) rename precache-manifest.582db41f32394a08650f46a59fd2cf2f.js => precache-manifest.6bd20d8da09ea1bdc0935e9643a16a68.js (97%) delete mode 100644 static/js/main.87c18d69.chunk.js delete mode 100644 static/js/main.87c18d69.chunk.js.map create mode 100644 static/js/main.dbec2f34.chunk.js create mode 100644 static/js/main.dbec2f34.chunk.js.map diff --git a/asset-manifest.json b/asset-manifest.json index d4305a7..a5d3ffd 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,15 +1,15 @@ { "files": { "main.css": "/existential-graphs/static/css/main.276ace8f.chunk.css", - "main.js": "/existential-graphs/static/js/main.87c18d69.chunk.js", - "main.js.map": "/existential-graphs/static/js/main.87c18d69.chunk.js.map", + "main.js": "/existential-graphs/static/js/main.dbec2f34.chunk.js", + "main.js.map": "/existential-graphs/static/js/main.dbec2f34.chunk.js.map", "runtime-main.js": "/existential-graphs/static/js/runtime-main.1b28495f.js", "runtime-main.js.map": "/existential-graphs/static/js/runtime-main.1b28495f.js.map", "static/css/2.dea1b1f8.chunk.css": "/existential-graphs/static/css/2.dea1b1f8.chunk.css", "static/js/2.21b569ea.chunk.js": "/existential-graphs/static/js/2.21b569ea.chunk.js", "static/js/2.21b569ea.chunk.js.map": "/existential-graphs/static/js/2.21b569ea.chunk.js.map", "index.html": "/existential-graphs/index.html", - "precache-manifest.582db41f32394a08650f46a59fd2cf2f.js": "/existential-graphs/precache-manifest.582db41f32394a08650f46a59fd2cf2f.js", + "precache-manifest.6bd20d8da09ea1bdc0935e9643a16a68.js": "/existential-graphs/precache-manifest.6bd20d8da09ea1bdc0935e9643a16a68.js", "service-worker.js": "/existential-graphs/service-worker.js", "static/css/2.dea1b1f8.chunk.css.map": "/existential-graphs/static/css/2.dea1b1f8.chunk.css.map", "static/css/main.276ace8f.chunk.css.map": "/existential-graphs/static/css/main.276ace8f.chunk.css.map", @@ -21,6 +21,6 @@ "static/css/2.dea1b1f8.chunk.css", "static/js/2.21b569ea.chunk.js", "static/css/main.276ace8f.chunk.css", - "static/js/main.87c18d69.chunk.js" + "static/js/main.dbec2f34.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index f6470e9..eff9dbb 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -React App
\ No newline at end of file +React App
\ No newline at end of file diff --git a/precache-manifest.582db41f32394a08650f46a59fd2cf2f.js b/precache-manifest.6bd20d8da09ea1bdc0935e9643a16a68.js similarity index 97% rename from precache-manifest.582db41f32394a08650f46a59fd2cf2f.js rename to precache-manifest.6bd20d8da09ea1bdc0935e9643a16a68.js index 4cf1f6d..c3f5506 100644 --- a/precache-manifest.582db41f32394a08650f46a59fd2cf2f.js +++ b/precache-manifest.6bd20d8da09ea1bdc0935e9643a16a68.js @@ -1,6 +1,6 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ { - "revision": "700453708a6f19dcfee6e5eb18c9fb3e", + "revision": "e9e0f8a76b1a24a5ad133772a8e94362", "url": "/existential-graphs/index.html" }, { @@ -8,7 +8,7 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/existential-graphs/static/css/2.dea1b1f8.chunk.css" }, { - "revision": "ed7eaeda1e3d3106e564", + "revision": "70ee5cdd5f08644a0b15", "url": "/existential-graphs/static/css/main.276ace8f.chunk.css" }, { @@ -20,8 +20,8 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/existential-graphs/static/js/2.21b569ea.chunk.js.LICENSE.txt" }, { - "revision": "ed7eaeda1e3d3106e564", - "url": "/existential-graphs/static/js/main.87c18d69.chunk.js" + "revision": "70ee5cdd5f08644a0b15", + "url": "/existential-graphs/static/js/main.dbec2f34.chunk.js" }, { "revision": "dc57d5fed269a7aa898b", diff --git a/service-worker.js b/service-worker.js index bb42176..5ba2898 100644 --- a/service-worker.js +++ b/service-worker.js @@ -14,7 +14,7 @@ importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); importScripts( - "/existential-graphs/precache-manifest.582db41f32394a08650f46a59fd2cf2f.js" + "/existential-graphs/precache-manifest.6bd20d8da09ea1bdc0935e9643a16a68.js" ); self.addEventListener('message', (event) => { diff --git a/static/js/main.87c18d69.chunk.js b/static/js/main.87c18d69.chunk.js deleted file mode 100644 index f92d6bc..0000000 --- a/static/js/main.87c18d69.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this["webpackJsonpexistential-graphs"]=this["webpackJsonpexistential-graphs"]||[]).push([[0],{15:function(e){e.exports=JSON.parse('{"binary":{"<->":"\\\\leftrightarrow","%":"\\\\leftrightarrow","->":"\\\\rightarrow","$":"\\\\rightarrow","&":"\\\\land","^":"\\\\land","|":"\\\\lor"},"unary":{"~":"\\\\lnot","!":"\\\\lnot"},"eg":{"<->":"($1($2))(($1)$2)","%":"($1($2))(($1)$2)","->":"($1($2))","$":"($1($2))","&":"$1$2","|":"(($1)($2))"}}')},27:function(e,t,n){e.exports=n(62)},32:function(e,t,n){},33:function(e,t,n){},38:function(e,t,n){},60:function(e,t,n){},61:function(e,t,n){},62:function(e,t,n){"use strict";n.r(t);var a=n(0),r=n.n(a),i=n(14),s=n.n(i),o=(n(32),n(3)),c=n(4),u=n(1),l=n(6),h=n(5),d=(n(33),n(7)),p=n.n(d),f=n(26),v=n(11),m=n(8),g=n(15),b=g.binary,y=g.unary;function k(e){return"(?:"+(e=e.map((function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}))).join("|")+")"}var C=k(Object.keys(y)),S="^(".concat(C,"*[A-Za-z]+|").concat(C,"*\\((.*)\\))(").concat(k(Object.keys(b)),")(").concat(C,"*[A-Za-z]+|").concat(C,"*\\((.*)\\))$"),E=new RegExp(S),O=new RegExp("^".concat(C,"*[A-Za-z]+$")),x=new RegExp("^".concat(C,"*\\((.*)\\)$"));var w=function(e){return function e(t){var n;return!!t.match(O)||(null!==(n=E.exec(t))?null!=n&&(n[2]&&n[5]?e(n[2])&&e(n[5]):n[2]?e(n[2]):!n[5]||e(n[5])):null!==(n=x.exec(t))?e(n[1]):void 0)}(e=e.replace(/\s/g,""))},j=n(15);function D(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var N=Object.keys(j.binary);N=N.map((function(e){return D(e)}));var I=new RegExp("(?:"+N.join("|")+")","g"),P=j.unary,z=function(e){if("string"===typeof e||e instanceof String){var t;for(e=e.replace(/\s/g,"");null!==(t=I.exec(e));)e=e.substr(0,t.index)+j.binary[t[0]]+" "+e.substr(t.index+t[0].length);for(var n in Object.keys(P))t=Object.keys(P)[n],e=e.replace(new RegExp(D(t),"g"),P[t]+" ");return e=e.replace(/[^()A-Za-z\\\s]/g,"")}return""};function F(e){var t=function(e){return function(t){return t===e}},n=0;for(n in e.split(""))if(!Object.keys(P).some(t(e.charAt(n))))break;return n}var R=function(e,t){null==t&&(t=!0);var n=F(e),a=e.substr(n);return a=t?M(a):"{"+a+"}","(".repeat(n)+a+")".repeat(n)},M=function e(t){if(("string"===typeof t||t instanceof String)&&w(t)){t=t.replace(/\s/g,"");var n=E.exec(t),a=x.exec(t),r=O.exec(t);if(n){var i=e(n[1]),s=e(n[4]);return j.eg[n[3]].replace(/\$1/g,i).replace(/\$2/g,s)}return a?0!==F(t)?R(t.substr(1,t.length-2),!0):e(a[1]):r?R(t,!1):null}return null},A=function(e){if("string"===typeof e||e instanceof String){var t=function(t){return e.length>0&&t===e[0]&&(e=e.substring(1),!0)};return function n(a){for(var r=[];;){if(t("(")){if(r.push(n(e)),!t(")"))return null}else if(t("{")){for(var i="";e.length>0&&!t("}");)i=i.concat(e[0]),e=e.substring(1);0===i.length&&r.push("\xa0"),r.push(i)}if(0===e.length||"("!==e[0]&&"{"!==e[0])break}return r}()}return null};console.log(A("((({P}(({Q}({R})))))({T}))({T}){P}"));var L=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).state={selected:null,functions:[{str:"Iterate",func:"iteration"},{str:"Deiterate",func:"deiteration"},{str:"Wrap in Double Cut",func:"doubleCutEnclose"},{str:"Add Double Cut",func:"doubleCutAdd"},{str:"Remove Double Cut",func:"doubleCutRemove"},{str:"Insertion",func:"insertion"},{str:"Erasure",func:"erasure"}]},a}return Object(c.a)(n,[{key:"componentDidMount",value:function(){}},{key:"render",value:function(){var e=this,t=this.props,n=t.hidden,a=t.modifyCanvas,i=t.cancelSelection,s=this.state.selected;return n?r.a.createElement(r.a.Fragment,null):r.a.createElement("div",{className:"toolbox",ref:this.canvas},r.a.createElement("h3",null,"Tools"),this.state.functions.map((function(t,n){return r.a.createElement("div",{className:"tool",style:s===n?{backgroundColor:"#AFAFAA"}:{},onClick:function(){e.state.selected===n?i():(e.setState({selected:n}),a(t.func,(function(){e.setState({selected:null})})))}},t.str)})))}}]),n}(r.a.Component),$=n(9),B=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).performRedo=a.performRedo.bind(Object(u.a)(a)),a.performUndo=a.performUndo.bind(Object(u.a)(a)),a.state={},a}return Object(c.a)(n,[{key:"handleClick",value:function(e,t,n){e.preventDefault(),n||this.props.setStep(t)}},{key:"performUndo",value:function(e){var t=this.props.state,n=t.changeHistory,a=t.steps,r=t.redoHistory,i=n.pop();i&&(r.push(a),this.props.setState(n,i.steps,r))}},{key:"performRedo",value:function(e){var t=this.props.state,n=t.changeHistory,a=t.steps,r=t.redoHistory,i=r.pop();i&&(n.push({redoHistory:r,steps:a}),this.props.setState(n,i,r))}},{key:"getColor",value:function(e){return e?"rgb(136, 136, 136)":"rgb(68, 68, 68)"}},{key:"disable",value:function(e,t){return e.concat(t.length>0?"":" disabled")}},{key:"render",value:function(){var e=this,t=this.props,n=t.hide,a=t.currentStep,i=t.stepInfo,s=t.state,o=s.changeHistory,c=s.redoHistory;if(n)return r.a.createElement(r.a.Fragment,null);var u=a===i.length-1,l=0===a;return r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"step-menu"},r.a.createElement("div",{style:{color:this.getColor(l)}},r.a.createElement("div",{onClick:function(t){return e.handleClick(t,0,l)}},r.a.createElement($.a,{src:"/existential-graphs/assets/step-first.svg"})),r.a.createElement("div",{onClick:function(t){return e.handleClick(t,a-1,l)}},r.a.createElement($.a,{src:"/existential-graphs/assets/step-prev.svg"}))),r.a.createElement("div",null,r.a.createElement("div",{className:this.disable("undo-btn",o),onClick:this.performUndo},r.a.createElement("div",{className:"undo-svg"},r.a.createElement($.a,{src:"/existential-graphs/assets/undo.svg"}))),r.a.createElement("div",{className:this.disable("redo-btn",c),onClick:this.performRedo},r.a.createElement("div",{className:"redo-svg"},r.a.createElement($.a,{src:"/existential-graphs/assets/redo.svg"})))),r.a.createElement("div",{style:{color:this.getColor(u)}},r.a.createElement("div",{onClick:function(t){return e.handleClick(t,a+1,u)}},r.a.createElement($.a,{src:"/existential-graphs/assets/step-next.svg"})),r.a.createElement("div",{onClick:function(t){return e.handleClick(t,i.length-1,u)}},r.a.createElement($.a,{src:"/existential-graphs/assets/step-last.svg"})))),r.a.createElement("div",{className:"step-text"},"Step ",a+1," of ",i.length))}}]),n}(r.a.Component),H={gridSize:1,cutPadding:{horizontal:10,vertical:5},cutCornerRadius:10,initialSeparation:50},T=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).text=r.a.createRef(),a.getCoords=a.props.getCoords,a.handleClick=a.handleClick.bind(Object(u.a)(a)),a.state={x:e.x,y:e.y,cursorOver:!1,dragging:!1},a.panzoom=a.props.panzoom,window.addEventListener("mousemove",a.onMouseMove.bind(Object(u.a)(a))),window.addEventListener("mousedown",a.handleDragStart.bind(Object(u.a)(a))),window.addEventListener("mouseup",a.handleDragEnd.bind(Object(u.a)(a))),window.addEventListener("click",a.handleClick),a}return Object(c.a)(n,[{key:"handleClick",value:function(){this.state.cursorOver&&this.props.enableHighlight&&this.props.selectedCallback&&(this.props.selectedCallback(this.props.id),this.setState({cursorOver:!1}))}},{key:"componentDidMount",value:function(){var e=this;this.text.current.style.cursor="pointer",this.props.subscribeMove((function(t,n){var a=e.state.x+t,r=e.state.y+n;e.props.setCoords(a,r),e.setState({x:a,y:r})}))}},{key:"handleDragStart",value:function(e){this.state.cursorOver&&(this.panzoom.pause(),this.setState({dragging:!0}))}},{key:"handleDragEnd",value:function(e){this.panzoom.resume();var t=this.state,n=t.x,a=t.y;this.props.setCoords(n,a),this.setState({dragging:!1})}},{key:"onMouseMove",value:function(e){if(this.state.dragging){var t=this.getCoords(e.clientX,e.clientY),n=t.x,a=t.y;n=Math.round(n/H.gridSize)*H.gridSize,a=Math.round(a/H.gridSize)*H.gridSize,this.props.setCoords(n,a),this.setState({x:n,y:a})}}},{key:"componentWillUnmount",value:function(){window.removeEventListener("click",this.handleClick),window.removeEventListener("mousemove",this.onMouseMove.bind(this)),window.removeEventListener("mousedown",this.handleDragStart.bind(this)),window.removeEventListener("mouseup",this.handleDragEnd.bind(this))}},{key:"render",value:function(){var e=this,t=this.state.cursorOver&&this.props.enableHighlight,n=null!=this.props.selectedCallback&&this.state.cursorOver&&!this.props.enableHighlight,a="black";return t?a="blue":n&&(a="red"),r.a.createElement("text",{className:"noselect",x:this.state.x,y:this.state.y,id:this.props.id,fill:a,onMouseEnter:function(){return e.setState({cursorOver:!0})},onMouseLeave:function(){return e.setState({cursorOver:!1})},ref:this.text},this.props.children)}}]),n}(r.a.Component),V=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).cut=r.a.createRef(),a.BB=r.a.createRef(),a.getBBoxData=a.getBBoxData.bind(Object(u.a)(a)),a.handleClick=a.handleClick.bind(Object(u.a)(a)),a.update=a.update.bind(Object(u.a)(a)),a.getCoords=a.props.getCoords,a.state={highlight:!1,cursorOver:!1,bounding:{_x:0,_y:0,_w:0,_h:0}},a.panzoom=a.props.panzoom,window.addEventListener("click",a.handleClick),window.addEventListener("mousemove",a.onMouseMove.bind(Object(u.a)(a))),window.addEventListener("mousedown",a.handleDragStart.bind(Object(u.a)(a))),window.addEventListener("mouseup",a.handleDragEnd.bind(Object(u.a)(a))),a}return Object(c.a)(n,[{key:"handleClick",value:function(){this.state.cursorOver&&this.props.enableHighlight&&this.props.selectedCallback&&(this.props.selectedCallback(this.props.id),this.setState({cursorOver:!1}))}},{key:"getBBoxData",value:function(){if(this.cut.current){var e=this.cut.current.getBBox(),t=e.x,n=e.y,a=e.width,r=e.height;return{_x:t-H.cutPadding.horizontal,_y:n-H.cutPadding.vertical,_w:a+2*H.cutPadding.horizontal,_h:r+2*H.cutPadding.vertical}}return{}}},{key:"update",value:function(){var e=this;this.interval||(this.interval=setInterval((function(){e.setState({bounding:e.getBBoxData()})}),1),setTimeout((function(){clearInterval(e.interval),e.interval=null}),100))}},{key:"componentDidMount",value:function(){this.update()}},{key:"componentDidUpdate",value:function(){this.update()}},{key:"componentWillUnmount",value:function(){window.removeEventListener("click",this.handleClick),this.interval&&clearInterval(this.interval)}},{key:"handleDragStart",value:function(e){if(this.state.cursorOver){this.panzoom.pause();var t=this.getCoords(e.clientX,e.clientY),n=t.x,a=t.y;this.setState({dragging:!0,x:n,y:a})}}},{key:"handleDragEnd",value:function(e){this.panzoom.resume(),this.setState({dragging:!1})}},{key:"onMouseMove",value:function(e){if(this.state.dragging){var t=this.state.x,n=this.state.y,a=this.getCoords(e.clientX,e.clientY),r=a.x,i=a.y;r=Math.round(r/H.gridSize)*H.gridSize,i=Math.round(i/H.gridSize)*H.gridSize,this.props.setCoords(r-t,i-n),this.setState({x:r,y:i})}}},{key:"render",value:function(){var e=this,t=this.state.cursorOver&&this.props.enableHighlight,n=null!=this.props.selectedCallback&&this.state.cursorOver&&!this.props.enableHighlight,a="black";t?a="blue":n&&(a="red");var i=this.state.bounding,s=i._x,o=i._y,c=i._w,u=i._h;return r.a.createElement(r.a.Fragment,null,r.a.createElement("rect",{x:s,y:o,width:c,height:u,fillOpacity:"0.7",strokeOpacity:"1",stroke:a,fill:t?"#DFDFDA":"white",onMouseEnter:function(t){return e.setState({cursorOver:!0})},onMouseLeave:function(t){return e.setState({cursorOver:!1})},rx:H.cutCornerRadius.toString(),ry:H.cutCornerRadius.toString()}),r.a.createElement("g",{ref:this.cut},this.props.children))}}]),n}(r.a.Component),W=(n(38),n(24)),G=n.n(W),_=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(){return Object(o.a)(this,n),t.apply(this,arguments)}return Object(c.a)(n,[{key:"render",value:function(){var e=this.props.menuItems;return r.a.createElement("div",{className:"dropdown-menu"},e.map((function(e){return e.title?r.a.createElement("div",{className:"menu-title",onClick:e.func},e.title):r.a.createElement("div",{className:e})})))}}]),n}(r.a.Component),U=n(16).nanoid,Z=function(e){var t=e.state,n=e.getSelection,a=e.getInsertionPoint,r=e.requestInput,i=e.initXY;return{state:t,insertion:function(){var e=Object(m.a)(p.a.mark((function e(){var n,s,o,c,u,l,h,d,f,m,g,b,y,k;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.state,s=n.steps,o=n.currentStep,c=n.data,u=this.copyStep(s[o]),e.next=4,a({cut:"even",canvas:!1});case 4:if((l=e.sent)&&l.id){e.next=7;break}return e.abrupt("return",null);case 7:return h=l.id,d=l.x,f=l.y,e.next=10,r();case 10:if(null!=(m=e.sent)&&m){e.next=13;break}return e.abrupt("return",null);case 13:if(g=i(A(m),t.data[h].level+1),console.log(g.stepZero),(b=this.findID(u,h)).data){e.next=19;break}return console.log("Insert ID could not be found in Iterate"),e.abrupt("return",null);case 19:for(y in b.data=b.data.concat(g.stepZero.data),g.data)"var"===(k=g.data[y]).type&&(k.x+=d,k.y+=f);return s.push(u),e.abrupt("return",{steps:s,currentStep:o+1,data:Object(v.a)({},c,{},g.data)});case 23:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),iteration:function(){var e=Object(m.a)(p.a.mark((function e(){var t,r,i,s,o,c,u,l,h,d,f,v,m,g;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n({cut:"all",var:"all"});case 2:if(t=e.sent){e.next=5;break}return e.abrupt("return",null);case 5:return e.next=7,a();case 7:if(r=e.sent){e.next=10;break}return e.abrupt("return",null);case 10:if(i=r.id,s=r.x,o=r.y,c=i){e.next=14;break}return e.abrupt("return",null);case 14:if(u=this.state,l=u.steps,h=u.currentStep,d=u.data,f=this.copyStep(l[h]),this.isInNestedGraph(f,c,t)){e.next=20;break}if(c===this.findParent(f,t).id){e.next=20;break}return console.log("Insert selection is not in a subgraph of Copy selection"),e.abrupt("return",null);case 20:if(v=this.copyContents(this.findID(f,t))){e.next=24;break}return console.log("Copy ID could not be found in Iterate"),e.abrupt("return",null);case 24:if((m=this.findID(f,c)).data){e.next=28;break}return console.log("Insert ID could not be found in Iterate"),e.abrupt("return",null);case 28:return m.data=m.data.concat(v),g=v,"string"!==typeof v&&(g=v.id),d[g].x=s,d[g].y=o,h+=1,l.push(f),e.abrupt("return",{steps:l,currentStep:h,data:d});case 36:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),deiteration:function(){var e=Object(m.a)(p.a.mark((function e(){var t,a,r,i,s,o,c,u,l,h,d=this;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.state,a=t.steps,r=t.currentStep,i=t.data,s=this.copyStep(a[r]),e.next=4,n({cut:"all",var:"all"});case 4:if(o=e.sent){e.next=7;break}return e.abrupt("return",null);case 7:if(c=this.findID(s,o)){e.next=10;break}return e.abrupt("return",null);case 10:if(u=function e(t,n){if("string"===typeof t)return"string"===typeof n&&i[t].var===i[n].var;var a=[];return t.data.map((function(t){return function(t,n){for(var r in n.data)if(!a.includes(r)&&e(t,n.data[r]))return!0;return!1}(t,n)})).every(Boolean)},function e(t,n){for(var a in t.data){var r=t.data[a];if("string"===typeof n&&"string"===typeof r&&r!==n&&i[n].var===i[r].var)return!0;if(r.id!==n.id&&u(r,n))return!0}return!!t.id&&e(d.findParent(s,t.id),n)}(this.findParent(s,o),c)){e.next=15;break}return e.abrupt("return",null);case 15:if(l=this.findParent(s,o)){e.next=18;break}return e.abrupt("return",null);case 18:if(!((h=l.data.indexOf(c))>-1)){e.next=23;break}l.data.splice(h,1),e.next=24;break;case 23:return e.abrupt("return",null);case 24:return a.push(s),r+=1,e.abrupt("return",{steps:a,currentStep:r,data:i});case 27:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),erasure:function(){var e=Object(m.a)(p.a.mark((function e(){var t,a,r,i,s,o,c,u,l;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n({cut:"even",var:"even"});case 2:if(null!=(t=e.sent)){e.next=5;break}return e.abrupt("return",this.state);case 5:if(a=this.state,r=a.steps,i=a.currentStep,s=a.data,o=this.copyStep(r[i]),c=this.findID(o,t)){e.next=10;break}return e.abrupt("return",null);case 10:if(u=this.findParent(o,t)){e.next=13;break}return e.abrupt("return",null);case 13:if(!((l=u.data.indexOf(c))>-1)){e.next=18;break}u.data.splice(l,1),e.next=19;break;case 18:return e.abrupt("return",null);case 19:return i+=1,r.push(o),e.abrupt("return",{steps:r,currentStep:i,data:s});case 22:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),doubleCutEnclose:function(){var e=Object(m.a)(p.a.mark((function e(){var t,a,r,i,s,o,c,u,l,h,d,f,v;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n({cut:"all",var:"all"});case 2:if(t=e.sent,a=this.state,r=a.steps,i=a.currentStep,s=a.data,o=this.copyStep(r[i]),c=this.findID(o,t)){e.next=8;break}return e.abrupt("return",null);case 8:if(u=U(),l=U(),h={data:[{data:[c],id:l,type:"cut"}],id:u,type:"cut"},d=s[t].level,s[l]={type:"cut",level:d+1},s[u]={type:"cut",level:d},this.changeCutLevel(o,t,2),f=this.findParent(o,t)){e.next=19;break}return e.abrupt("return",null);case 19:return(v=f.data.indexOf(c))>-1&&f.data.splice(v,1),f.data=f.data.concat(h),i+=1,r.push(o),e.abrupt("return",{steps:r,currentStep:i,data:s});case 25:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),doubleCutAdd:function(){var e=Object(m.a)(p.a.mark((function e(){var t,n,r,i,s,o,c,u,l,h,d,f,v,m;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,a();case 2:if(t=e.sent,n=t.id,r=t.x,i=t.y,r&&i){e.next=8;break}return e.abrupt("return",null);case 8:return s=this.state,o=s.steps,c=s.currentStep,u=s.data,l=this.copyStep(o[c]),h=U(),d=U(),f=U(),v={data:[{data:[f],id:d,type:"cut"}],id:h,type:"cut"},m=n?u[n].level:-1,u[d]={type:"cut",level:m+2},u[h]={type:"cut",level:m+1},u[f]={x:r,y:i,type:"emptyvar",var:"\xa0",level:m+3},n?this.findID(l,n).data.push(v):l.data.push(v),c+=1,o.push(l),e.abrupt("return",{steps:o,currentStep:c,data:u});case 23:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),doubleCutRemove:function(){var e=Object(m.a)(p.a.mark((function e(){var t,a,r,i,s,o,c,u,l,h,d;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n({cut:"all"});case 2:if(t=e.sent,a=this.state,r=a.steps,i=a.currentStep,s=a.data,o=this.copyStep(r[i]),!(c=this.findID(o,t))||"cut"!==c.type){e.next=25;break}if(!(u=c.data)||1!==u.length||"cut"!==u[0].type){e.next=22;break}if(l=u[0].data,h=this.findParent(o,t)){e.next=13;break}return e.abrupt("return",null);case 13:return this.changeCutLevel(o,u[0].id,-2),(d=h.data.indexOf(c))>-1&&h.data.splice(d,1),h.data=h.data.concat(l),i+=1,r.push(o),e.abrupt("return",{steps:r,currentStep:i,data:s});case 22:return e.abrupt("return",null);case 23:e.next=26;break;case 25:return e.abrupt("return",null);case 26:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),isInNestedGraph:function(e,t,n){var a=this.findParent(e,n);return a?!!this.findID(a,t)||(console.log("Child is not in nested graph of Parent"),!1):(console.log("Parent Data could not be found"),!1)},copyContents:function(e){var t=this.state.data;function n(e,n){if("string"===typeof e){var r=U();return t[r]={type:"var",var:t[e].var,x:t[e].x,y:t[e].y,level:t[e].level},r}var i={};for(var s in e)if("id"===s){var o=U();i[s]=o,t[o]={type:"cut",level:n}}else i[s]="data"!==s?e[s]:a(e[s],n+1);return i}function a(e,a){var r=[];for(var i in e)if("string"===typeof e[i]){var s=U();r.push(s),t[s]={type:"var",var:t[e[i]].var,x:t[e[i]].x,y:t[e[i]].y,level:t[e[i]].level}}else r.push(n(e[i],a));return r}var r=n(e,0);return this.state.data=t,r},changeCutLevel:function(e,t,n){var a=this.state.data;if(a[t]&&"var"===a[t].type)a[t].level+=n;else{var r=!1;s(e.data),this.state.data=a}function i(e){var i;e.id&&(i=e.id)===t&&(r=!0),r&&(a[i].level+=n),e.data&&s(e.data)}function s(e){for(var t in e)"string"!==typeof e[t]?i(e[t]):r&&(a[e[t]].level+=n)}},copyStep:function(e){var t={};function n(e){var t={};for(var n in e)"string"===typeof e[n]?t[n]=e[n]:t[n]=a(e[n]);return t}function a(e){var t=[];for(var a in e)"string"===typeof e[a]?t.push(e[a]):t.push(n(e[a]));return t}return t.data=a(e.data),t.h=e.h,t.w=e.w,t},findParent:function(e,t){var n=e;function a(e){for(var n in e)if("string"===typeof e[n]){if(e[n]===t)return!0}else{if(e[n].id&&e[n].id===t)return!0;r(e[n])}return!1}function r(e){e.data&&a(e.data)&&(n=e)}return a(e.data),n},findID:function(e,t){function n(e){for(var n in e)if("string"===typeof e[n]){if(e[n]===t)return t}else{if(e[n].id===t)return e[n];var r=a(e[n]);if(r)return r}}function a(e){if("string"===typeof e)return e===t?e:void 0;for(var a in e){if(e[a]instanceof Array)return n(e[a]);if("id"===a&&e[a]===t)return e}}return a(e)},offsetPosition:function(e,t,n){this.findID(t,n);return console.log(e),e}}},J=n(25),X=(n(20),n(10)),Y=n.n(X),q=n(16).nanoid;function Q(e,t){t||(t=0);var n={},a=0,r=0,i=0;return{stepZero:{data:function e(t,s,o){for(var c in t)if(t[c]instanceof Array&&t[c].length>0){var u=q();t[c]={data:e(t[c],s+1),id:u,type:"cut"},n[u]={type:"cut",level:s}}else{var l=a,h=q();n[h]={type:"var",var:t[c],x:Math.round(l/H.gridSize)*H.gridSize,y:Math.round(0/H.gridSize)*H.gridSize,level:s},t[c]=h,i=0>i?0:i,r=l>r?l:r,a+=H.initialSeparation}return t}(e,t),h:i,w:r},data:n}}var K=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;Object(o.a)(this,n),(a=t.call(this,e)).canvas=r.a.createRef(),a.canvasContainer=r.a.createRef(),a.renderStep=a.renderStep.bind(Object(u.a)(a)),a.checkLevelIntegrity=a.checkLevelIntegrity.bind(Object(u.a)(a)),a.changePos=a.changePos.bind(Object(u.a)(a)),a.getSVGCoords=a.getSVGCoords.bind(Object(u.a)(a)),a.highlightCut=a.highlightCut.bind(Object(u.a)(a)),a.modifyCanvas=a.modifyCanvas.bind(Object(u.a)(a)),a.getInsertionPoint=a.getInsertionPoint.bind(Object(u.a)(a)),a.requestInput=a.requestInput.bind(Object(u.a)(a)),a.cancelSelection=a.cancelSelection.bind(Object(u.a)(a)),a.createElement=a.createElement.bind(Object(u.a)(a)),a.clickedCanvas=a.clickedCanvas.bind(Object(u.a)(a)),a.initXY=Q,a.moveVars={},a.getSelection=a.getSelection.bind(Object(u.a)(a));var i=a.props.proof,s=i.premises,c=i.conclusion,l=i.steps,h=i.data;return a.state={proof:{premises:s,conclusion:c},changeHistory:[],redoHistory:[],steps:l||[],data:h||{},currentStep:0!==l.length?l.length-1:0,moveListeners:[],highlights:{cut:"none",var:"none",canvas:!1},cbFunction:null,finishCB:null,interaction:!0,functions:{insertion:function(){return Z(Object(u.a)(a)).insertion()},erasure:function(){return Z(Object(u.a)(a)).erasure()},iteration:function(){return Z(Object(u.a)(a)).iteration()},deiteration:function(){return Z(Object(u.a)(a)).deiteration()},doubleCutRemove:function(){return Z(Object(u.a)(a)).doubleCutRemove()},doubleCutEnclose:function(){return Z(Object(u.a)(a)).doubleCutEnclose()},doubleCutAdd:function(){return Z(Object(u.a)(a)).doubleCutAdd()}},formula:"",eg:"",fitchNotation:!1},a}return Object(c.a)(n,[{key:"getInsertionPoint",value:function(e){var t=this,n=new Promise((function(e,n){t.setState({canvasCb:function(n,a){t.setState({canvasCb:null}),setTimeout((function(){t.state.cbFunction?(t.state.cbFunction(null),t.setState({cbFunction:null},(function(){return e({x:n,y:a})}))):e({x:n,y:a})}),50)}})}));return new Promise(function(){var a=Object(m.a)(p.a.mark((function a(r,i){var s;return p.a.wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,Promise.all([t.getSelection(Object(v.a)({cut:"all",var:"none",canvas:!0},e)),n]);case 2:s=a.sent,t.state.finishCB&&t.state.finishCB(),t.setState({highlights:{cut:"none",var:"none",canvas:!1},finishCB:null,canvasCb:null,interaction:!0,cbFunction:null},(function(){var e=Object(f.a)(s,2),t=e[0],n=e[1],a=n.x,i=n.y;r({id:t,x:a,y:i})}));case 5:case"end":return a.stop()}}),a)})));return function(e,t){return a.apply(this,arguments)}}())}},{key:"getSelection",value:function(e){var t=this;return new Promise((function(n,a){var r=t.state,i=r.steps;r.currentStep+1===i.length&&t.setState({highlights:e,interaction:!1,cbFunction:function(e){t.setState({highlights:{cut:"none",var:"none",canvas:!1},interaction:!0,cbFunction:null},(function(){return n(e)}))}})}))}},{key:"modifyCanvas",value:function(e,t){var n=this,a=this.state,r=a.steps,i=a.changeHistory;(i=i.slice()).push({steps:Array.from(r)}),this.setState({finishCB:t},(function(){n.state.functions[e]().then((function(e){n.state.finishCB&&n.state.finishCB(),e&&(n.setState(Object(v.a)({changeHistory:i,redoHistory:[]},e)),n.checkLevelIntegrity())}))}))}},{key:"checkLevelIntegrity",value:function(){var e=this.state,t=e.steps,n=e.data,a=e.currentStep,r=t[a];t[a].data=function e(t,a){for(var r in t){var i=t[r],s=[];for(var o in i.type&&"cut"===i.type?(t[r].data=e(i.data,a+1),n[t[r].id].level=a,s.push(i.id)):s.push(i),s)n[s[o]].level=a}return t.length>1&&(t=t.filter((function(e){return e.id||!e.id&&"\xa0"!==n[e].var}))),t}(r.data,0),this.setState({steps:t,data:n})}},{key:"cancelSelection",value:function(){var e=this.state,t=e.cbFunction,n=e.canvasCb,a=e.finishCB;t&&t(),n&&n(),a&&a()}},{key:"changePos",value:function(e,t,n){var a=this.state.data;Object.assign(a[e],{x:t,y:n}),this.setState(a)}},{key:"highlightCut",value:function(e){if("all"===this.state.highlights.cut)return!0;var t=!1;return e%2===1&&(t=!0),!("odd"!==this.state.highlights.cut||!t)||"even"===this.state.highlights.cut&&!t}},{key:"highlightVar",value:function(e){if("all"===this.state.highlights.var)return!0;var t=!1;return e%2===1&&(t=!0),!("odd"!==this.state.highlights.var||!t)||"even"===this.state.highlights.var&&!t}},{key:"createElement",value:function(e,t,n,a,r){var i=this.state.data,s=q();i[s]={},i[s].x=a||0,i[s].y=r||0,i[s].type=t,i[s].var=e,n.push(s),this.setState({data:i})}},{key:"removeElement",value:function(e){this.state.steps[this.state.currentStep].push(e)}},{key:"renderStep",value:function(e){var t=this,n=this.state.data,a=this.state.steps[e];if(a){var i=function(e,a,r){n[e].x=a,n[e].y=r,t.setState({data:n})},s=function e(a){var s=[];0===a.length&&t.createElement("\xa0","emptyvar",a,0,0);var o=function(o){if("cut"===a[o].type){var c=n[a[o].id].level,u=[];!function e(t){if(t.data)for(var n in t.data)e(t.data[n]);else u.push(t)}(a[o]);var l=r.a.createElement(V,{level:c,enableHighlight:t.highlightCut(c),id:a[o].id,panzoom:t.panzoom,getCoords:t.getSVGCoords,setCoords:function(e,n){u.forEach((function(a){t.moveVars[a](e,n)}))},key:a[o].id,selectedCallback:t.state.cbFunction},e(a[o].data));s.push(l)}else if("var"===t.state.data[a[o]].type){var h=t.state.data[a[o]],d=n[a[o]].level;s.unshift(r.a.createElement(T,{x:h.x,y:h.y,id:a[o],enableHighlight:t.highlightVar(d),selectedCallback:t.state.cbFunction,panzoom:t.panzoom,interaction:t.state.interaction||t.highlightVar(d),getCoords:t.getSVGCoords,setCoords:function(e,t){return i(a[o],e,t)},subscribeMove:function(e){return t.moveVars[a[o]]=e},key:a[o]},h.var))}else if("emptyvar"===t.state.data[a[o]].type&&1===a.length){var p=t.state.data[a[o]];s.unshift(r.a.createElement(T,{x:p.x,y:p.y,id:a[o],enableHighlight:!1,selectedCallback:function(){},panzoom:t.panzoom,interaction:t.state.interaction,getCoords:t.getSVGCoords,setCoords:function(e,t){return i(a[o],e,t)},subscribeMove:function(e){return t.moveVars[a[o]]=e},key:a[o]},p.var))}};for(var c in a)o(c);return s};return s.bind(this),s(a.data)}}},{key:"componentDidMount",value:function(){this.panzoom=G()(this.canvas.current,{maxZoom:6,minZoom:.5});var e=Math.max(document.documentElement.clientWidth,window.innerWidth||0),t=Math.max(document.documentElement.clientHeight,window.innerHeight||0),n=this.state.steps;if(0===n.length){var a=this.state.proof.premises;console.log(a),console.log(a.join("")),console.log(A(a.join("")));var r=Q(A(a.join("")),0),i=r.stepZero,s=r.data;n.push(i),this.setState({steps:n,data:s})}this.setState({});var o=this.state.steps[this.state.currentStep];this.panzoom.moveTo(e/2-o.w,t/2-o.h),this.panzoom.zoomTo(e/2-o.w,t/2-o.h,2)}},{key:"componentWillUnmount",value:function(){window.removeEventListener("resize",this)}},{key:"getSVGCoords",value:function(e,t){var n=this.canvasContainer.current.createSVGPoint();return n.x=e,n.y=t,n.matrixTransform(this.canvas.current.getScreenCTM().inverse())}},{key:"clickedCanvas",value:function(e){if(this.state.canvasCb){var t=this.getSVGCoords(e.pageX,e.pageY),n=t.x,a=t.y;this.state.canvasCb(n,a)}}},{key:"requestInput",value:function(){var e=this;return new Promise((function(t,n){e.setState({showOverlay:!0,cbFunction:function(n){t(null==n?null:n),e.setState({showOverlay:!1,cbFunction:null})}})}))}},{key:"render",value:function(){var e=this,t=this.state,n=t.proof,a=t.data,i=t.steps,s=t.currentStep,o=(t.highlight,t.showOverlay);this.props.saveProof(Object(v.a)({},n,{data:a,steps:i}));var c=function(){};this.panzoom&&(c=this.panzoom.zoomWithWheel);var u=z(this.state.formula),l=M("(".concat(this.state.formula,")"));return r.a.createElement(J.CSSTransitionGroup,{transitionName:"fadein",transitionAppear:!0,transitionAppearTimeout:500,transitionEnter:!1,transitionLeaveTimeout:300},r.a.createElement("div",{className:"insertOverlay".concat(o?" shown":"")},r.a.createElement("h2",null,"Fitch-Style Formula to Insert"),!1,r.a.createElement("div",null,r.a.createElement("table",null,r.a.createElement("tbody",null,r.a.createElement("tr",null,r.a.createElement("td",{style:{width:"40%"}},r.a.createElement("input",{onChange:function(t){return e.setState({formula:t.target.value,eg:M(t.target.value)})}})),r.a.createElement("td",null,u&&r.a.createElement(Y.a,{math:u}))),r.a.createElement("tr",null))),"To insert: ",l&&r.a.createElement(Y.a,{math:l})),!1,r.a.createElement("span",{className:"buttons"},r.a.createElement("button",{onClick:function(){return e.state.cbFunction(e.state.eg)}},"Insert"),r.a.createElement("button",{onClick:function(){return e.state.cbFunction(null)}},"Cancel"))),r.a.createElement("div",{key:"main-div",className:"mainCanvas noselect".concat(o?" disabled":"")},r.a.createElement(_,{menuItems:this.props.menuItems}),r.a.createElement(L,{hidden:s+1!==i.length,functions:this.state.functions,modifyCanvas:this.modifyCanvas,cancelSelection:this.cancelSelection}),r.a.createElement("svg",{ref:this.canvasContainer,className:"canvas noselect",onWheel:c,onClick:this.clickedCanvas,onMouseEnter:function(){return e.setState({highlight:!0})},onMouseLeave:function(){return e.setState({highlight:!1})},style:this.state.canvasCb?{cursor:"crosshair",backgroundColor:"white"}:{}},r.a.createElement("g",{ref:this.canvas},this.panzoom&&this.renderStep(this.state.currentStep))),r.a.createElement(B,{currentStep:this.state.currentStep,stepInfo:this.state.steps,setStep:function(t){return e.setState({currentStep:t,interaction:t===e.state.steps.length-1})},state:this.state,setState:function(t,n,a){e.setState({changeHistory:t,steps:n,redoHistory:a,currentStep:n.length-1})}})))}}]),n}(r.a.Component),ee=(n(60),function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).state={premises:[""],conclusion:""},a.handleChange.bind(Object(u.a)(a)),a.removePremise.bind(Object(u.a)(a)),a.verify=a.verify.bind(Object(u.a)(a)),a.create=a.create.bind(Object(u.a)(a)),a.filename=r.a.createRef(),a}return Object(c.a)(n,[{key:"componentDidMount",value:function(){}},{key:"handleChange",value:function(e,t){if(null!=t){var n=this.state.premises;n[t]=e.target.value,this.setState({premises:n})}else this.setState({conclusion:e.target.value})}},{key:"removePremise",value:function(e){var t=this.state.premises;t.splice(e,1),this.setState({premises:t})}},{key:"verify",value:function(){var e=this.state,t=e.premises,n=e.conclusion;for(var a in t)if(""===t[a]||!t[a])return!1;return!(""===n||!n)}},{key:"create",value:function(){if(console.log("Creating..."),console.log("Verification concluded "+this.verify()),this.verify()){var e=this.state,t=e.premises,n=e.conclusion;for(var a in t)t[a]=M(t[a]),console.log(t[a]);n=M(n),this.props.setupFunc(this.filename.current.value,{premises:t,conclusion:n,steps:[]})}}},{key:"getFormulaCell",value:function(e,t){var n,a,i=this;w(e)&&(n=z(e),a=M(e));var s=r.a.createElement("td",{className:"close interactive",onClick:function(){return i.removePremise(t)}},"\u2715"),o=r.a.createElement("input",{onChange:function(e){return i.handleChange(e,t)}});return null==t&&(o=r.a.createElement("input",{onChange:function(e){return i.handleChange(e)}}),s=r.a.createElement("td",{className:"close"})),0===t&&(s=r.a.createElement("td",{className:"close"})),r.a.createElement("tr",null,r.a.createElement("td",null,o),r.a.createElement("td",null,n&&r.a.createElement(Y.a,{math:n})),r.a.createElement("td",null,a&&r.a.createElement(Y.a,{math:a})),s)}},{key:"render",value:function(){var e=this,t=this.state,n=t.premises,a=t.conclusion;return r.a.createElement("div",{className:"content full-width"},r.a.createElement("h1",null,"Create New"),r.a.createElement("h2",null,"File Name"),r.a.createElement("input",{ref:this.filename}),r.a.createElement("table",{className:"formulaTable"}),r.a.createElement("h2",null,"Premises"),r.a.createElement("table",{className:"formulaTable"},r.a.createElement("tbody",null,r.a.createElement("tr",null,r.a.createElement("td",null,"Formula"),r.a.createElement("td",null,"TeX notation"),r.a.createElement("td",null,"EG notation"),r.a.createElement("td",{className:"close"})),n.map((function(t,n){return e.getFormulaCell(t,n)})),r.a.createElement("tr",null,r.a.createElement("td",{className:"interactive",onClick:function(){return e.setState({premises:n.concat([""])})}},r.a.createElement("span",{className:"plus"}),"Add New Premise"),r.a.createElement("td",null),r.a.createElement("td",null),r.a.createElement("td",{className:"close"})))),r.a.createElement("h2",null,"Conclusion"),r.a.createElement("table",{className:"formulaTable"},r.a.createElement("tbody",null,this.getFormulaCell(a))))}}]),n}(r.a.Component)),te=(n(61),function(e){var t=e.recentDocs;return r.a.createElement("div",{className:"content"},r.a.createElement("div",{className:"column"},r.a.createElement("h1",null,"Existential Graphs"),r.a.createElement("p",null,"Using this tool, you can initialize proofs in the existential graph schema and then you can go through the process of solving them. You can save these proofs and look back at them later.")),r.a.createElement("div",{className:"divider"}),r.a.createElement("div",{className:"column"},r.a.createElement("h1",null,"Recent Proofs"),Object.keys(t).map((function(e){return r.a.createElement("div",{className:"proofField",style:{display:"flex",justifyContent:"space-between"}},r.a.createElement("span",{onClick:function(){return t[e].open()}},e),r.a.createElement("span",{style:{color:"gray"},onClick:function(){return t[e].delete()}},"Delete"))}))))}),ne=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).createView=r.a.createRef(),a.callCreate=a.callCreate.bind(Object(u.a)(a)),a.animateAway=a.animateAway.bind(Object(u.a)(a)),a.openFile=a.openFile.bind(Object(u.a)(a)),a.state={createShown:!1,floatingWindowCSS:"floating-window shown"},a}return Object(c.a)(n,[{key:"componentDidMount",value:function(){}},{key:"animateAway",value:function(){this.setState({floatingWindowCSS:"floating-window"})}},{key:"callCreate",value:function(){this.createView.current.create()}},{key:"openFile",value:function(){var e=this,t=document.createElement("input");t.setAttribute("type","file"),t.setAttribute("accept",".egprf"),t.onchange=function(t){console.log("ONCHANGE"),t.stopPropagation(),t.preventDefault();var n=t.target.files[0];console.log(n);var a=new FileReader;a.addEventListener("load",(function(t){try{var a=JSON.parse(t.target.result);console.log(a),e.props.setupFunc(n.name.split(".egprf")[0],a)}catch(r){console.error(r),alert("Corrupt file or improper formatting.")}})),a.readAsText(n)},t.click()}},{key:"render",value:function(){var e=this,t=this.state,n=t.createShown,a=t.floatingWindowCSS;return r.a.createElement("div",{className:a},!n&&r.a.createElement(te,{recentDocs:this.props.recentDocs}),n&&r.a.createElement(ee,{setupFunc:this.props.setupFunc,ref:this.createView}),!n&&r.a.createElement("div",{className:"toolbar"},r.a.createElement("button",{onClick:function(){return e.setState({createShown:!0})}},"New"),r.a.createElement("button",{onClick:this.openFile},"Open")),n&&r.a.createElement("div",{className:"toolbar"},r.a.createElement("button",{className:"back",onClick:function(){return e.setState({createShown:!1})}},r.a.createElement("span",null,r.a.createElement($.a,{className:"svg",src:"/existential-graphs/assets/back-caret.svg"})),"Back"),r.a.createElement("button",{onClick:this.callCreate},"Create")))}}]),n}(r.a.Component),ae=window.localStorage,re=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).createNewProof=a.createNewProof.bind(Object(u.a)(a)),a.setupProof=a.setupProof.bind(Object(u.a)(a)),a.openCanvas=a.openCanvas.bind(Object(u.a)(a)),a.saveProof=a.saveProof.bind(Object(u.a)(a)),a.getRecents=a.getRecents.bind(Object(u.a)(a)),a.introWindow=r.a.createRef(),a.state={initialCSS:"initial",canvasOpen:!1,popupOpen:!1,filename:"",proof:{premises:[],conclusion:"",steps:[]},recentDocs:a.getRecents()},console.log(a.state.recentDocs),a.menuItems=[{title:"Exit",func:function(){a.setState({initialCSS:"initial",canvasOpen:!1,popupOpen:!1,filename:"",proof:{premises:[],conclusion:"",steps:[]},recentDocs:a.getRecents()})}},"separator",{title:"Export",func:function(){var e=document.createElement("a"),t=new Blob([JSON.stringify(a.state.proof)],{type:"text/plain"});e.href=URL.createObjectURL(t),e.download=a.state.filename+".egprf",document.body.appendChild(e),e.click()}}],a}return Object(c.a)(n,[{key:"getRecents",value:function(){var e=this,t=ae.getItem("recentDocs");t=t?JSON.parse(t):{};var n=Object.keys(t),a=function(a){t[n[a]].open=function(){e.setState({filename:n[a],proof:t[n[a]]}),e.openCanvas()},t[n[a]].delete=function(){var t=ae.getItem("recentDocs");delete(t=t?JSON.parse(t):{})[n[a]],ae.setItem("recentDocs",JSON.stringify(t)),e.setState({recentDocs:t})}};for(var r in n)a(r);return t}},{key:"saveProof",value:function(e){var t=this.state.recentDocs;return t[e]=this.state.proof,function(n){t[e]=n,ae.setItem("recentDocs",JSON.stringify(t))}}},{key:"setupProof",value:function(e,t){this.setState({filename:e,proof:t}),this.openCanvas()}},{key:"openCanvas",value:function(){var e=this;this.setState({initialCSS:"initial whiteBG"}),this.introWindow.current.animateAway(),setTimeout((function(){return e.setState({canvasOpen:!0})}),1e3)}},{key:"createNewProof",value:function(){this.setState({popupOpen:!0})}},{key:"render",value:function(){return this.state.canvasOpen?r.a.createElement("div",{className:"App"},r.a.createElement(K,{menuItems:this.menuItems,saveProof:this.saveProof(this.state.filename),proof:this.state.proof})):r.a.createElement("div",{className:this.state.initialCSS},r.a.createElement(ne,{ref:this.introWindow,recentDocs:this.state.recentDocs,setupFunc:this.setupProof}))}}]),n}(r.a.Component);Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));s.a.render(r.a.createElement(re,null),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))}},[[27,1,2]]]); -//# sourceMappingURL=main.87c18d69.chunk.js.map \ No newline at end of file diff --git a/static/js/main.87c18d69.chunk.js.map b/static/js/main.87c18d69.chunk.js.map deleted file mode 100644 index 6addb53..0000000 --- a/static/js/main.87c18d69.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["verifySentence.js","converters.js","canvas/Toolbox.js","canvas/StepMenu.js","canvas/config.js","canvas/EGVariable.js","canvas/EGCut.js","canvas/DropdownMenu.js","canvas/manipulate.js","canvas/Canvas.js","intro/CreateNew.js","intro/IntroWindow.js","App.js","serviceWorker.js","index.js"],"names":["require","binary","unary","arrToRegex","arr","map","el","replace","join","uReg","Object","keys","regexStr","binaryRegex","RegExp","atomicRegex","parenthesisRegex","sentence","verifyRecursive","res","match","exec","operators","escapeRegExp","string","binarySymbReplace","unaryOperators","convertToTeX","formula","String","symbol","substr","length","i","countUnary","statement","matchesList","val","op","c","split","some","charAt","stripUnary","s","convertStatement","convertToEG","repeat","verifySentence","parenthesis","left","right","eg","convertToArray","consume","substring","parseExpression","expr","push","st","concat","console","log","Toolbox","props","state","selected","functions","str","func","this","hidden","modifyCanvas","cancelSelection","Fragment","className","ref","canvas","style","backgroundColor","onClick","setState","React","Component","StepMenu","performRedo","bind","performUndo","event","step","disabled","preventDefault","setStep","evt","changeHistory","steps","redoHistory","prev","pop","prevSteps","obj","hide","currentStep","stepInfo","backEnabled","forwardEnabled","color","getColor","handleClick","src","process","disable","gridSize","cutPadding","horizontal","vertical","cutCornerRadius","initialSeparation","EGVariable","text","createRef","getCoords","x","y","cursorOver","dragging","panzoom","window","addEventListener","onMouseMove","handleDragStart","handleDragEnd","enableHighlight","selectedCallback","id","current","cursor","subscribeMove","newx","newy","setCoords","pause","resume","clientX","clientY","Math","round","config","removeEventListener","highlight","reject","fill","onMouseEnter","onMouseLeave","children","EGCut","cut","BB","getBBoxData","update","bounding","_x","_y","_w","_h","getBBox","width","height","interval","setInterval","setTimeout","clearInterval","x_orig","y_orig","stroke","fillOpacity","strokeOpacity","e","rx","toString","ry","DropdownMenu","menuItems","title","nanoid","getSelection","getInsertionPoint","requestInput","initXY","insertion","a","data","copyStep","pt","input","initializedData","level","stepZero","insert","findID","type","iteration","copyID","insertData","insertID","isInNestedGraph","findParent","copy","copyContents","newCopyID","deiteration","deiterID","erased","equalTrees","tree1","tree2","var","matchedIDs","branch","secondTree","j","includes","matchBranch","every","Boolean","checkForSubgraph","structure","tree","subtree","parent","index","indexOf","splice","erasure","doubleCutEnclose","inside","cut1_id","cut2_id","cut1","changeCutLevel","doubleCutAdd","empty_id","doubleCutRemove","firstCut","secondCut","newContents","childID","parentID","parentStep","copyDataMap","newMap","m","copyDataArray","newArr","newStep","change","idFound","changeLevelArray","changeLevelMap","mapID","oldStep","oldData","newData","d","h","w","searchedStep","findInArray","findInMap","findIDArray","findIDMap","Array","offsetPosition","currentX","maxX","maxY","initXYRecurse","gapSize","X","Canvas","canvasContainer","renderStep","checkLevelIntegrity","changePos","getSVGCoords","highlightCut","createElement","clickedCanvas","moveVars","proof","premises","conclusion","moveListeners","highlights","cbFunction","finishCB","interaction","manipulate","fitchNotation","cutConfig","getCanvasInsertion","Promise","resolve","canvasCb","all","selectConfig","nameOfFunction","finishedCb","slice","from","then","verifyLevel","dobj","ob","ids","filter","assign","odd","stepIndex","setXY","renderRecurse","jsx","getIds","groupElement","forEach","key","unshift","highlightVar","f","Panzoom","maxZoom","minZoom","vw","max","document","documentElement","clientWidth","innerWidth","vh","clientHeight","innerHeight","moveTo","zoomTo","domX","domY","createSVGPoint","matrixTransform","getScreenCTM","inverse","pageX","pageY","showOverlay","saveProof","zoomWithWheel","tex","transitionName","transitionAppear","transitionAppearTimeout","transitionEnter","transitionLeaveTimeout","onChange","target","value","math","onWheel","newSteps","CreateNew","handleChange","removePremise","verify","create","filename","setupFunc","closeBtn","formulaInput","getFormulaCell","IntroContent","recentDocs","name","display","justifyContent","open","delete","IntroWindow","createView","callCreate","animateAway","openFile","createShown","floatingWindowCSS","setAttribute","onchange","stopPropagation","file","files","reader","FileReader","JSON","parse","result","error","alert","readAsText","click","localStorage","App","createNewProof","setupProof","openCanvas","getRecents","introWindow","initialCSS","canvasOpen","popupOpen","element","Blob","stringify","href","URL","createObjectURL","download","body","appendChild","recents","getItem","rArray","setItem","location","hostname","ReactDOM","render","getElementById","navigator","serviceWorker","ready","registration","unregister","catch","message"],"mappings":"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","file":"static/js/main.87c18d69.chunk.js","sourcesContent":["/* \n * Return a boolean indicating if the inputted sentence is \n * a correctly formatted. Utilizes a recursive technique,\n * evaluating each sentence as though it were an atomic\n * sentence or any phi and psi combined with a binary \n * operator. \n*/\n\nconst { binary, unary } = require('./operators.json')\n\nfunction escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\nfunction arrToRegex(arr) {\n arr = arr.map(el => escapeRegExp(el));\n return '(?:' + arr.join('|') + ')'\n} \n\nconst uReg = arrToRegex(Object.keys(unary));\nconst regexStr = `^(${uReg}*[A-Za-z]+|${uReg}*\\\\((.*)\\\\))(${arrToRegex(Object.keys(binary))})(${uReg}*[A-Za-z]+|${uReg}*\\\\((.*)\\\\))$`\nlet binaryRegex = new RegExp(regexStr) // eslint-disable-line\nlet atomicRegex = new RegExp(`^${uReg}*[A-Za-z]+$`)\nlet parenthesisRegex = new RegExp(`^${uReg}*\\\\((.*)\\\\)$`)\n\nfunction verifyRecursive(sentence) {\n let res\n if (sentence.match(atomicRegex)) return true;\n else if ((res = binaryRegex.exec(sentence)) !== null) {\n if (res == null) return false;\n if (res[2] && res[5]) \n return verifyRecursive(res[2]) && verifyRecursive(res[5]);\n else if (res[2]) \n return verifyRecursive(res[2]);\n else if (res[5]) \n return verifyRecursive(res[5]);\n else return true;\n } else if ((res = parenthesisRegex.exec(sentence)) !== null)\n return verifyRecursive(res[1])\n}\n\nexport {\n binaryRegex,\n atomicRegex,\n parenthesisRegex\n}\n\nexport default (sentence) => {\n // filter out spaces\n sentence = sentence.replace(/\\s/g, '')\n return verifyRecursive(sentence);\n}","import verifySentence, { \n parenthesisRegex, \n binaryRegex,\n atomicRegex\n} from './verifySentence';\n\nconst operators = require('./operators.json')\n\n/**\n * This file is responsible for holding many of the converters used throughout the \n * app.\n */\n\n/**\n * @param {string} the string to add escape characters for\n * @return {string} the string with all regex-safe characters\n */\nfunction escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\n/**\n * keys represents the ASCII notation for the input characters. \n * @type {array}\n */\nlet keys = Object.keys(operators.binary);\nkeys = keys.map(el => escapeRegExp(el));\nconst binarySymbReplace = new RegExp('(?:' + keys.join('|') + ')', 'g')\nconst unaryOperators = operators.unary\n\n/**\n * @param {string} Fitch-style sentence notation.\n * @return {string} TeX sentence notation.\n */\nconst convertToTeX = (formula) => {\n if (typeof formula === 'string' || formula instanceof String) {\n // filter out spaces\n formula = formula.replace(/\\s/g, '')\n let symbol\n // replace all binary operators\n while ((symbol = binarySymbReplace.exec(formula)) !== null) {\n formula = formula.substr(0,symbol['index']) \n + operators.binary[symbol[0]] + ' '\n + formula.substr(symbol['index'] + symbol[0].length);\n }\n // replace all unary operators\n for (let i in Object.keys(unaryOperators)) {\n symbol = Object.keys(unaryOperators)[i];\n formula = formula.replace(new RegExp(escapeRegExp(symbol), 'g'), unaryOperators[symbol] + ' ');\n }\n // filter out all other characters\n formula = formula.replace(/[^()A-Za-z\\\\\\s]/g, '')\n return formula\n }\n else return \"\"\n}\n\n/**\n * @param {string} statement\n * @return {int} counts the number of unary operators in the given input.\n *\n * For example, if passed a statement !!(P | Q), we notice two unary operators \n * encapsulating the statement (the ! symbols, representing NOT). These would \n * be counted out.\n */\nfunction countUnary(statement) {\n const matchesList = (val) => (op) => op === val;\n let c = 0;\n for (c in statement.split(\"\"))\n if (!Object.keys(unaryOperators).some(matchesList(statement.charAt(c))))\n break;\n return c;\n}\n\n/**\n * @param {string} the sentence being passed in, in Fitch-style notation.\n * @param {bool} whether to convert the statement to EG or just return without unary.\n * @return {[type]}\n */\nconst stripUnary = (s, convertStatement) => {\n if (convertStatement == null) \n convertStatement = true;\n let c = countUnary(s);\n let statement = s.substr(c)\n if (convertStatement) statement = convertToEG(statement)\n else statement = '{' + statement + '}'\n return \"(\".repeat(c) + statement + \")\".repeat(c)\n}\n\n/**\n * @param {string} Fitch-style sentence notation \n * @return {string} EG-style sentence notation.\n */\nconst convertToEG = (formula) => {\n if ((typeof formula === 'string' || formula instanceof String) && verifySentence(formula)) {\n // filter out spaces\n formula = formula.replace(/\\s/g, '')\n let binary = binaryRegex.exec(formula)\n let parenthesis = parenthesisRegex.exec(formula)\n let unary = atomicRegex.exec(formula)\n if (binary) {\n let left = convertToEG(binary[1])\n let right = convertToEG(binary[4])\n let symConversion = operators.eg[binary[3]];\n return symConversion.replace(/\\$1/g, left).replace(/\\$2/g, right)\n } else if (parenthesis) {\n if (countUnary(formula) !== 0) {\n return stripUnary(formula.substr(1,formula.length-2), true);\n }\n return convertToEG(parenthesis[1]);\n } else if (unary) {\n return stripUnary(formula, false);\n } else return null;\n }\n else return null;\n}\n\n/** \n * Converts a string representing an Existential Graph into\n * a nested array. Acts recursively, calling iteslf again\n * When a pair of parentehses are found. If given an index i,\n * this will start from that index.\n * \n * For example: \n * \"((({P})){Q}{R}){P}\" => [ [ [['P']],'Q','R' ],'P' ]\n */\nconst convertToArray = (formula) => {\n if (typeof formula === 'string' || formula instanceof String) {\n // hold the array of the current level that will be returned\n function consume(c) {\n if (formula.length > 0 && c === formula[0]) {\n formula = formula.substring(1);\n return true;\n }\n return false;\n }\n\n function parseExpression(expr) {\n let arr = []\n while (true) {\n if (consume('(')) {\n arr.push(parseExpression(formula));\n if (!consume(')')) \n return null;\n } else if (consume('{')) {\n let st = \"\";\n while (formula.length > 0 && !consume('}')) {\n st = st.concat(formula[0]);\n formula = formula.substring(1);\n }\n if (st.length === 0) arr.push('\\u00A0');\n arr.push(st);\n \n }\n if (formula.length === 0 || (formula[0] !== '(' && formula[0] !== '{')) {\n break;\n }\n }\n return arr;\n }\n return parseExpression(formula);\n }\n else return null\n}\n\nconsole.log(convertToArray('((({P}(({Q}({R})))))({T}))({T}){P}'))\n\n/**\n * Export all converters\n */\nexport {\n convertToTeX,\n convertToEG,\n convertToArray,\n verifySentence\n}","import React from 'react';\n\nclass Toolbox extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n selected: null,\n functions: [\n {\n str: \"Iterate\",\n func: 'iteration',\n },\n {\n str: \"Deiterate\",\n func: 'deiteration',\n },\n {\n str: \"Wrap in Double Cut\",\n func: 'doubleCutEnclose',\n },\n {\n str: \"Add Double Cut\",\n func: 'doubleCutAdd',\n },\n {\n str: \"Remove Double Cut\",\n func: 'doubleCutRemove',\n },\n {\n str: \"Insertion\",\n func: 'insertion',\n },\n {\n str: \"Erasure\",\n func: 'erasure',\n }\n ]\n };\n }\n\n componentDidMount() { \n }\n\n render() {\n let { hidden, modifyCanvas, cancelSelection } = this.props;\n let { selected } = this.state;\n if (hidden) return ;\n return (\n
\n

Tools

\n {this.state.functions.map((el, i) => (\n
{\n if (this.state.selected === i) {\n cancelSelection();\n }\n else {\n this.setState({ selected: i });\n modifyCanvas(el.func, () => {\n this.setState({ selected: null });\n });\n }\n }\n }\n >{el.str}
\n ))}\n
\n );\n }\n}\n\nexport default Toolbox;","import React from 'react';\nimport { ReactSVG } from 'react-svg';\n\nclass StepMenu extends React.Component {\n constructor(props) {\n super(props);\n \n this.performRedo = this.performRedo.bind(this);\n this.performUndo = this.performUndo.bind(this);\n this.state = {};\n }\n handleClick(event, step, disabled) {\n event.preventDefault();\n if (!disabled) {\n // Must update color before updating props to allow component to\n // render with the proper current color rather than the state before\n this.props.setStep(step);\n }\n }\n\n performUndo(evt) {\n let { changeHistory, steps, redoHistory } = this.props.state;\n let prev = changeHistory.pop();\n\n if (prev) {\n redoHistory.push(steps);\n this.props.setState(changeHistory, prev.steps, redoHistory);\n }\n }\n\n performRedo(evt) {\n let { changeHistory, steps, redoHistory } = this.props.state;\n let prevSteps = redoHistory.pop();\n\n if (prevSteps) {\n changeHistory.push({ redoHistory, steps });\n this.props.setState(changeHistory, prevSteps, redoHistory);\n }\n }\n\n getColor(disabled) {\n return disabled ? \"rgb(136, 136, 136)\" : \"rgb(68, 68, 68)\";\n }\n\n disable(st, obj) {\n return st.concat(obj.length > 0 ? \"\" : \" disabled\")\n }\n\n render() {\n let { hide, currentStep, stepInfo, state } = this.props;\n let { changeHistory, redoHistory } = state;\n if (hide) return ();\n let backEnabled = currentStep === (stepInfo.length - 1);\n let forwardEnabled = currentStep === 0;\n return (\n \n
\n
\n
this.handleClick(event, 0, forwardEnabled)}>\n \n
\n
this.handleClick(event, currentStep - 1, forwardEnabled)}>\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
this.handleClick(event, currentStep + 1, backEnabled)}>\n \n
\n
this.handleClick(event, stepInfo.length - 1, backEnabled)}>\n \n
\n
\n
\n
\n Step {currentStep + 1} of {stepInfo.length}\n
\n
\n );\n }\n}\n\nexport default StepMenu;","export default {\n gridSize: 1,\n cutPadding: {\n horizontal: 10,\n vertical: 5\n },\n cutCornerRadius: 10,\n initialSeparation: 50,\n}","import React from 'react';\nimport config from './config';\n\nclass EGVariable extends React.Component {\n constructor(props) {\n super(props);\n this.text = React.createRef()\n this.getCoords = this.props.getCoords\n this.handleClick = this.handleClick.bind(this);\n this.state = {\n x: props.x,\n y: props.y,\n cursorOver: false,\n dragging: false\n };\n\n this.panzoom = this.props.panzoom\n\n window.addEventListener('mousemove', this.onMouseMove.bind(this))\n window.addEventListener('mousedown', this.handleDragStart.bind(this))\n window.addEventListener('mouseup', this.handleDragEnd.bind(this))\n window.addEventListener('click', this.handleClick)\n }\n\n handleClick() {\n if (this.state.cursorOver \n && this.props.enableHighlight \n && this.props.selectedCallback) \n {\n this.props.selectedCallback(this.props.id);\n this.setState({ cursorOver: false });\n }\n }\n\n componentDidMount() { \n this.text.current.style.cursor = \"pointer\";\n this.props.subscribeMove((x,y) => {\n let newx = this.state.x + x;\n let newy = this.state.y + y;\n this.props.setCoords(newx, newy);\n this.setState({ x: newx, y: newy });\n })\n }\n\n handleDragStart(evt) {\n if (this.state.cursorOver) {\n this.panzoom.pause()\n this.setState({ dragging: true })\n }\n }\n\n handleDragEnd(evt) {\n this.panzoom.resume()\n let { x, y } = this.state;\n this.props.setCoords(x, y);\n this.setState({ dragging: false })\n }\n\n onMouseMove(evt) {\n if (this.state.dragging) {\n let { x, y } = this.getCoords(evt.clientX, evt.clientY)\n x = Math.round(x/config.gridSize)*config.gridSize\n y = Math.round(y/config.gridSize)*config.gridSize\n this.props.setCoords(x, y);\n this.setState({ x: x, y: y });\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('click', this.handleClick);\n window.removeEventListener('mousemove', this.onMouseMove.bind(this))\n window.removeEventListener('mousedown', this.handleDragStart.bind(this))\n window.removeEventListener('mouseup', this.handleDragEnd.bind(this))\n }\n\n render() {\n let highlight = this.state.cursorOver && this.props.enableHighlight;\n let reject = this.props.selectedCallback != null && this.state.cursorOver && !this.props.enableHighlight;\n let fill = \"black\";\n if (highlight) fill = \"blue\";\n else if (reject) fill = \"red\";\n return (\n this.setState({ cursorOver: true })}\n onMouseLeave={() => this.setState({ cursorOver: false })}\n ref={this.text}>\n {this.props.children}\n \n );\n }\n}\n\nexport default EGVariable;","import React from 'react';\nimport config from './config';\n\nclass EGCut extends React.Component {\n constructor(props) {\n super(props);\n this.cut = React.createRef();\n this.BB = React.createRef();\n this.getBBoxData = this.getBBoxData.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.update = this.update.bind(this);\n this.getCoords = this.props.getCoords\n this.state = { \n highlight: false,\n cursorOver: false,\n bounding: {_x:0,_y:0,_w:0,_h:0}\n };\n\n this.panzoom = this.props.panzoom\n\n window.addEventListener('click', this.handleClick)\n window.addEventListener('mousemove', this.onMouseMove.bind(this))\n window.addEventListener('mousedown', this.handleDragStart.bind(this))\n window.addEventListener('mouseup', this.handleDragEnd.bind(this))\n }\n\n handleClick() {\n if (this.state.cursorOver \n && this.props.enableHighlight \n && this.props.selectedCallback) \n {\n this.props.selectedCallback(this.props.id);\n this.setState({ cursorOver: false });\n }\n }\n\n getBBoxData() {\n if (this.cut.current) {\n let { x, y, width, height } = this.cut.current.getBBox();\n let _x = x - config.cutPadding.horizontal;\n let _y = y - config.cutPadding.vertical;\n let _w = width + config.cutPadding.horizontal * 2;\n let _h = height + config.cutPadding.vertical * 2;\n return { _x, _y, _w, _h };\n }\n return {};\n }\n\n update() {\n if (!this.interval) {\n this.interval = setInterval(() => {\n this.setState({ bounding: this.getBBoxData() });\n }, 1);\n setTimeout(() => {\n clearInterval(this.interval);\n this.interval = null;\n }, 100);\n }\n }\n\n componentDidMount() { \n this.update()\n }\n\n componentDidUpdate() {\n this.update()\n }\n\n componentWillUnmount() {\n window.removeEventListener('click', this.handleClick);\n if (this.interval)\n clearInterval(this.interval);\n }\n\n handleDragStart(evt) {\n if (this.state.cursorOver) {\n this.panzoom.pause();\n let { x, y } = this.getCoords(evt.clientX, evt.clientY);\n this.setState({ dragging: true, x, y })\n }\n }\n\n handleDragEnd(evt) {\n this.panzoom.resume();\n this.setState({ dragging: false });\n }\n\n onMouseMove(evt) {\n if (this.state.dragging) {\n let x_orig = this.state.x;\n let y_orig = this.state.y;\n let { x, y } = this.getCoords(evt.clientX, evt.clientY)\n x = Math.round(x/config.gridSize)*config.gridSize\n y = Math.round(y/config.gridSize)*config.gridSize\n this.props.setCoords(x-x_orig, y-y_orig);\n this.setState({ x: x, y: y });\n }\n }\n\n render() {\n let highlight = this.state.cursorOver && this.props.enableHighlight;\n let reject = this.props.selectedCallback != null && this.state.cursorOver && !this.props.enableHighlight;\n let stroke = \"black\";\n if (highlight) stroke = \"blue\";\n else if (reject) stroke = \"red\";\n let { _x, _y, _w, _h } = this.state.bounding;\n return (\n \n this.setState({ cursorOver: true })}\n onMouseLeave={(e) => this.setState({ cursorOver: false })}\n rx={config.cutCornerRadius.toString()} \n ry={config.cutCornerRadius.toString()}\n />\n \n {this.props.children}\n \n \n );\n }\n}\n\nexport default EGCut;","import React from 'react';\n\nclass DropdownMenu extends React.Component {\n render() {\n const menuItems = this.props.menuItems;\n return (\n
\n {menuItems.map(el => {\n if (el.title) return
{el.title}
;\n else return
\n }\n )}\n
\n );\n }\n}\n\nexport default DropdownMenu;","import { convertToArray } from '../converters';\n\nconst nanoid = require('nanoid').nanoid;\n\nexport default ({ state, getSelection, getInsertionPoint, requestInput, initXY }) => { \n return {\n state: state,\n\n insertion: async function () {\n let { steps, currentStep, data } = this.state;\n // create a new step\n let step = this.copyStep(steps[currentStep]);\n\n let pt = await getInsertionPoint({ 'cut': 'even', canvas: false });\n if (!pt || !pt.id) return null;\n let { id, x, y } = pt;\n let input = await requestInput();\n if (input == null || !input) return null;\n\n let initializedData = initXY(convertToArray(input), state.data[id].level + 1);\n console.log(initializedData.stepZero)\n\n let insert = this.findID(step, id);\n if (!insert.data) {\n console.log(\"Insert ID could not be found in Iterate\");\n return null;\n }\n insert.data = insert.data.concat(initializedData.stepZero.data);\n for (let i in initializedData.data) {\n let obj = initializedData.data[i];\n if (obj.type === 'var') {\n obj.x += x;\n obj.y += y;\n }\n }\n\n steps.push(step);\n\n return { steps, currentStep: currentStep + 1, data: { ...data, ...initializedData.data }};\n },\n\n /* Given a copyID and insertID, the iteration function creates a new step,\n * and adds a copy of the data represented by copyID at the location of insertID\n * only if the location of insertID is a child of copyID\n */\n iteration: async function () {\n let copyID = await getSelection({ 'cut': 'all', 'var': 'all' });\n if (!copyID) return null;\n let insertData = await getInsertionPoint();\n if (!insertData) return null;\n let { id, x, y } = insertData;\n let insertID = id;\n if (!insertID) return null;\n let { steps, currentStep, data } = this.state;\n let step = this.copyStep(steps[currentStep]);\n // If the insertID data is not in a subgraph of the copyID data, return\n if (!this.isInNestedGraph(step, insertID, copyID)) {\n if (insertID !== this.findParent(step, copyID).id) {\n console.log(\"Insert selection is not in a subgraph of Copy selection\");\n return null;\n }\n }\n // use findID to find the data represented by the two IDs\n let copy = this.copyContents(this.findID(step, copyID));\n if (!copy) {\n console.log(\"Copy ID could not be found in Iterate\");\n return null;\n }\n \n let insert = this.findID(step, insertID);\n if (!insert.data) {\n console.log(\"Insert ID could not be found in Iterate\");\n return null;\n }\n insert.data = insert.data.concat(copy);\n let newCopyID = copy;\n if (typeof copy !== 'string')\n newCopyID = copy.id\n\n data[newCopyID].x = x;\n data[newCopyID].y = y;\n\n // Update the state\n currentStep += 1;\n steps.push(step);\n return { steps: steps, currentStep: currentStep, data: data };\n },\n\n deiteration: async function () {\n let { steps, currentStep, data } = this.state;\n let step = this.copyStep(steps[currentStep]);\n\n let deiterID = await getSelection({ 'cut': 'all', 'var': 'all' });\n if (!deiterID) return null;\n\n let erased = this.findID(step, deiterID);\n if (!erased) {\n return null;\n }\n\n const equalTrees = (tree1, tree2) => {\n if (typeof tree1 === 'string') {\n if (typeof tree2 === 'string' && \n data[tree1].var === data[tree2].var) {\n return true;\n }\n return false;\n }\n\n let matchedIDs = []\n const matchBranch = (branch, secondTree) => {\n for (let j in secondTree.data) {\n if (!matchedIDs.includes(j) && \n equalTrees(branch, secondTree.data[j])) {\n return true;\n }\n }\n return false;\n }\n let res = tree1.data.map(el => matchBranch(el, tree2));\n return res.every(Boolean);\n }\n\n const checkForSubgraph = (structure, tree) => {\n for (let i in structure.data) {\n let subtree = structure.data[i];\n if (\n typeof tree === 'string' && \n typeof subtree === 'string' && \n subtree !== tree &&\n data[tree].var === data[subtree].var\n ) {\n return true;\n } else if (subtree.id !== tree.id && equalTrees(subtree, tree)) {\n return true;\n }\n }\n if (structure.id) {\n return checkForSubgraph(this.findParent(step, structure.id), tree);\n }\n return false;\n }\n \n const foundSubtree = checkForSubgraph(this.findParent(step, deiterID), erased);\n if (!foundSubtree) return null;\n \n // Get the parent of the erased section\n let parent = this.findParent(step, deiterID)\n if (!parent) {\n return null;\n }\n // Remove the erased data from the parent's data array\n const index = parent.data.indexOf(erased);\n if (index > -1)\n parent.data.splice(index, 1);\n else {\n return null;\n }\n\n steps.push(step);\n currentStep += 1;\n return { steps: steps, currentStep: currentStep, data: data };\n },\n\n erasure: async function () {\n let id = await getSelection({ 'cut': 'even', 'var': 'even' });\n if (id == null) return this.state;\n let { steps, currentStep, data } = this.state;\n // Create a new step\n let step = this.copyStep(steps[currentStep]);\n // Find the data that will be erased\n let erased = this.findID(step, id);\n if (!erased) {\n return null;\n }\n // Get the parent of the erased section\n let parent = this.findParent(step, id)\n if (!parent) {\n return null;\n }\n // Remove the erased data from the parent's data array\n const index = parent.data.indexOf(erased);\n if (index > -1)\n parent.data.splice(index, 1);\n else {\n return null;\n }\n // Update the state\n currentStep += 1;\n steps.push(step);\n return { steps: steps, currentStep: currentStep, data: data };\n },\n\n /* Adds a double cut given the ID of the data that will be inside the cut.\n * Will only run if the current step is the last step.\n */\n doubleCutEnclose: async function () {\n var id = await getSelection({ 'cut': 'all', 'var': 'all' });\n let { steps, currentStep, data } = this.state;\n // create a new step\n let step = this.copyStep(steps[currentStep]);\n // use findID to find the data represented by the id\n // this is the data that will be inside the two new cuts\n let inside = this.findID(step, id);\n if (!inside) {\n return null;\n }\n // create a new cut with another one inside it\n let cut1_id = nanoid();\n let cut2_id = nanoid();\n let cut2 = {\n data: [inside],\n id: cut2_id,\n type: \"cut\"\n }\n let cut1 = {\n data: [cut2],\n id: cut1_id,\n type: \"cut\"\n }\n // Set the levels of the two cuts\n let level = data[id].level\n data[cut2_id] = { type: \"cut\", level: level + 1};\n data[cut1_id] = { type: \"cut\", level: level};\n // increase the level of the inside cut along with all cuts inside of it by 2\n this.changeCutLevel(step, id, 2)\n\n // get the parent of the selection\n let parent = this.findParent(step, id)\n if (!parent) {\n return null;\n }\n // Add the contents of the new cuts to the data array\n // after removing the original contents\n const index = parent.data.indexOf(inside);\n if (index > -1) {\n parent.data.splice(index, 1);\n }\n parent.data = parent.data.concat(cut1);\n // Change the state data accordingly\n currentStep+=1;\n steps.push(step);\n return { steps: steps, currentStep: currentStep, data:data };\n },\n\n /* Adds a double cut given the ID of the data that will be inside the cut.\n * Will only run if the current step is the last step.\n */\n doubleCutAdd: async function () {\n let { id, x, y } = await getInsertionPoint();\n if (!x || !y) return null;\n let { steps, currentStep, data } = this.state;\n // create a new step\n let step = this.copyStep(steps[currentStep]);\n // create a new cut with another one inside it\n let cut1_id = nanoid();\n let cut2_id = nanoid();\n let empty_id = nanoid();\n let cut2 = {\n data: [empty_id],\n id: cut2_id,\n type: \"cut\"\n }\n let cut1 = {\n data: [cut2],\n id: cut1_id,\n type: \"cut\"\n }\n // Set the levels of the two cuts\n let level = id ? data[id].level : -1;\n data[cut2_id] = { type: \"cut\", level: level + 2 };\n data[cut1_id] = { type: \"cut\", level: level + 1 };\n data[empty_id] = {\n x, y,\n type: \"emptyvar\", \n var: \"\\xa0\",\n level: level + 3 \n };\n\n // get the parent of the selection\n if (id) {\n let stepEl = this.findID(step, id);\n // append new cuts\n stepEl.data.push(cut1);\n }\n else {\n step.data.push(cut1);\n }\n \n // Change the state data accordingly\n currentStep += 1;\n steps.push(step);\n return { steps: steps, currentStep: currentStep, data: data };\n },\n\n /* Removes a double cut given the ID of the outside cut.\n * Will only run if the current step is the last step.\n * Creates a deep copy of the current step, and replaces the cut with\n * the given ID with the contents of the second cut, only if they exist.\n * Then adds the edited copy of the current step to the end of the step array.\n */\n doubleCutRemove: async function () {\n let id = await getSelection({ 'cut': 'all' });\n let { steps, currentStep, data } = this.state;\n // Create a new step\n let step = this.copyStep(steps[currentStep]);\n\n // use findID to find the cut with the given ID\n let firstCut = this.findID(step, id);\n // If it is actually a cut and has another cut inside\n if (firstCut && firstCut.type === \"cut\") {\n let secondCut = firstCut.data;\n if (secondCut && secondCut.length === 1 && secondCut[0].type === \"cut\") {\n // Get the data inside the second cut\n let newContents = secondCut[0].data;\n // Get the parent of the original cut being removed\n let parent = this.findParent(step, id)\n if (!parent) {\n return null;\n }\n this.changeCutLevel(step, secondCut[0].id, -2)\n // Remove the first cut from the data array\n const index = parent.data.indexOf(firstCut);\n if (index > -1) {\n parent.data.splice(index, 1);\n }\n // Add the contents of the second cut to the data array\n parent.data = parent.data.concat(newContents);\n // Update the state\n currentStep+=1;\n steps.push(step);\n return { steps: steps, currentStep: currentStep, data:data };\n }\n else return null;\n }\n else return null;\n },\n\n\n /* Given a step and two IDs, will return true if the data of ChildID is\n * in a nested graph of parentID in the current step.\n */\n isInNestedGraph: function (step, childID, parentID) {\n let parentStep = this.findParent(step, parentID);\n if (!parentStep) {\n console.log(\"Parent Data could not be found\");\n return false;\n }\n let childStep = this.findID(parentStep, childID);\n if (!childStep) {\n console.log(\"Child is not in nested graph of Parent\");\n return false;\n }\n return true;\n },\n\n /* Given a step or a cut, will copy the contents inside with new IDs\n * and return the new data. This permits inserting new data into the graph.\n * Levels for cuts will start at 0 and increase accordingly\n */\n copyContents: function (step) {\n let { data } = this.state;\n // Copies the data of a map and returns it\n // Also updates the state.data map according to new generated IDs\n function copyDataMap(map, level) {\n // If a variable is passed it, add it to the data and return the new ID\n if (typeof map === 'string') {\n let id = nanoid();\n data[id] = {\n type: \"var\",\n var: data[map].var,\n x: data[map].x,\n y: data[map].y,\n level: data[map].level\n }\n return id;\n }\n let newMap = {};\n for (let m in map) {\n // If an ID is found, generate a new one\n if (m === 'id') {\n let id = nanoid();\n newMap[m] = id;\n // Add the new data to state.data via a deep copy\n data[id] = {\n type: \"cut\",\n level: level\n }\n }\n // Otherwise, if not a data array, copy the contents\n else if (m !== 'data'){\n newMap[m] = map[m]\n }\n // If a data array, copy using helper function\n else {\n newMap[m] = copyDataArray(map[m], level+1)\n }\n }\n return newMap;\n }\n // Copies the data of an array and returns it\n // Also updates state.data according to new generated IDs\n function copyDataArray(arr, level) {\n let newArr = [];\n for (let a in arr) {\n // If an ID found, generate a new one\n if (typeof arr[a] === 'string') {\n let id = nanoid();\n newArr.push(id);\n // Add the new data to state.data via a deep copy\n data[id] = {\n type: \"var\",\n var: data[arr[a]].var,\n x: data[arr[a]].x,\n y: data[arr[a]].y,\n level: data[arr[a]].level\n }\n }\n // otherwise, call the other helper function to copy contents\n else {\n newArr.push(copyDataMap(arr[a], level))\n }\n }\n return newArr;\n }\n let newStep = copyDataMap(step, 0);\n this.state.data = data;\n return newStep;\n },\n\n /* Given a step and the ID of a cut, will iterate through all cuts within\n * that cut and change their level by a specified amount.\n */\n changeCutLevel: function (step, id, change) {\n let { data } = this.state\n // If the ID is for a variable, only increase it's level\n if (data[id] && data[id].type === \"var\") {\n data[id].level += change;\n return\n }\n // when true, the levels should change in the functions below\n let idFound = false\n // Changes the \n function changeLevelMap(map) {\n // get the id for the current map\n let mapID;\n if (map.id) {\n mapID = map.id\n // if it matches the id being searched, update the boolean\n if (mapID === id) {\n idFound = true;\n }\n }\n // If the ID has been found, update the level of the current cut\n if (idFound) {\n data[mapID].level += change;\n }\n // call the function of the data array if it exists\n if (map.data){\n changeLevelArray(map.data);\n }\n }\n function changeLevelArray(arr) {\n for (let a in arr) {\n // If a non-string is found (a cut)\n if (typeof arr[a] !== 'string') {\n // Change the level of the cut\n changeLevelMap(arr[a])\n }\n // If string is found, change the level of the variable\n else if (idFound){\n data[arr[a]].level += change;\n }\n }\n }\n changeLevelArray(step.data)\n this.state.data = data;\n },\n\n // Performs a deep copy of oldStep into newStep, used to not change previous steps\n // By allowing them to be copied without using a reference\n copyStep: function (oldStep) {\n let newStep = {};\n function copyDataMap(oldData) {\n let newData = {};\n for (let d in oldData) {\n // If an id or type if found, copy directly\n if(typeof oldData[d] === 'string') {\n newData[d] = oldData[d];\n }\n // Otherwise if an array is found, copy using helper function\n else {\n newData[d] = copyDataArray(oldData[d]);\n }\n }\n return newData;\n }\n function copyDataArray(oldData) {\n let newData = [];\n for (let d in oldData) {\n // If an ID is found (variable), copy directly\n if(typeof oldData[d] === 'string') {\n newData.push(oldData[d]);\n }\n // If a map was found (cut), copy using helper function\n else {\n newData.push(copyDataMap(oldData[d]));\n }\n }\n return newData;\n }\n // Copy the data, width, and height of the original into the new step\n newStep.data = copyDataArray(oldStep.data);\n newStep.h = oldStep.h;\n newStep.w = oldStep.w;\n return newStep;\n },\n\n /* Finds and returns the item that is the parent of the item\n * with the specified ID, given the step to search as well.\n */\n findParent: function (searchedStep, id) {\n // holds the parent of the id\n let parent = searchedStep\n // Searches an array for the ID, returns true if it is found\n function findInArray(arr) {\n for (let a in arr) {\n // If an ID is found, compare it\n if (typeof arr[a] === 'string') {\n if (arr[a] === id) {\n return true;\n }\n }\n // Otherwise if a datamap is found, check the ID\n else {\n // If ID matches, return true\n if (arr[a].id && arr[a].id === id) {\n return true;\n }\n // Otherwise, search the datamap\n else {\n findInMap(arr[a])\n }\n }\n }\n return false;\n }\n function findInMap(map) {\n // if the map contains data, search the data\n if (map.data) {\n // if found, set parent to this map\n if(findInArray(map.data)) {\n parent = map;\n }\n }\n }\n findInArray(searchedStep.data);\n return parent;\n },\n\n // finds and returns the item with the specified ID in a given step\n findID: function (searchedStep, id) {\n // Find the ID in an array\n function findIDArray(arr) {\n for (let a in arr) {\n // if a string, aka an ID\n if (typeof arr[a] === 'string') {\n // return the ID if found\n if (arr[a] === id) {\n return id;\n }\n }\n // if a data map is found with the correct id, return the data map\n else if (arr[a].id === id) {\n return arr[a];\n // otherwise, call findID step on the datamap that has the incorrect ID\n } else {\n let s = findIDMap(arr[a]);\n if (s)\n return s;\n }\n }\n }\n // Finds the ID in a data map representing a step\n function findIDMap(step) {\n if (typeof step === 'string') {\n if (step === id)\n return step;\n else\n return\n }\n for (let s in step) {\n // if an array is found, call findIDArray on each element\n if (step[s] instanceof Array) {\n return findIDArray(step[s]);\n // if an id is found, check if it matches and return the data if so\n } else if (s === \"id\") {\n if (step[s] === id)\n return step;\n }\n }\n }\n return findIDMap(searchedStep);\n },\n\n /**\n * Provided a data array, adds an x,y offset to the elements contained\n * inside the provided id for visual differentiation\n * @return {data} Data object\n */\n offsetPosition: function(data, step, id) {\n let toSearch = this.findID(step, id);\n console.log(data)\n return data;\n }\n };\n}","import React from 'react';\nimport { convertToArray, convertToTeX, convertToEG } from '../converters';\nimport Toolbox from './Toolbox';\nimport StepMenu from './StepMenu';\nimport EGVariable from './EGVariable';\nimport EGCut from './EGCut';\nimport './Canvas.scss';\nimport Panzoom from 'panzoom';\nimport DropdownMenu from './DropdownMenu';\nimport config from './config';\nimport manipulate from './manipulate';\nimport { CSSTransitionGroup } from 'react-transition-group';\n// KATEX\nimport 'katex/dist/katex.min.css';\nimport TeX from '@matejmazur/react-katex';\n\nconst nanoid = require('nanoid').nanoid;\n\n/**\n * Where a lot of the action happens. This component renders the Canvas for \n * the Existential Graphs workspace. Meant to take up an entire page.\n */\n\nfunction initXY(step, level) {\n if (!level) level = 0\n let data = {}\n let currentX = 0\n let currentY = 0\n let maxX = 0\n let maxY = 0\n\n // gapSize should be equal to the number of level changes\n // in between two variables, so that we can evenly place \n // them initially across the screen\n function initXYRecurse(step, level, gapSize) {\n for (let s in step) {\n if (step[s] instanceof Array && step[s].length > 0) {\n let id = nanoid()\n step[s] = { data: initXYRecurse(step[s], level + 1), id: id, type: \"cut\" }\n data[id] = { type: \"cut\", level: level }\n } else {\n let X = currentX;\n let Y = currentY;\n let id = nanoid()\n data[id] = { \n type: \"var\",\n var: step[s], \n x: Math.round(X/config.gridSize)*config.gridSize, \n y: Math.round(Y/config.gridSize)*config.gridSize,\n level: level\n }\n step[s] = id\n maxY = Y > maxY ? Y : maxY;\n maxX = X > maxX ? X : maxX;\n currentX += config.initialSeparation\n }\n }\n return step\n }\n return { stepZero: { data: initXYRecurse(step, level), h: maxY, w: maxX }, data: data }\n}\n\nclass Canvas extends React.Component {\n constructor(props) {\n super(props);\n this.canvas = React.createRef();\n this.canvasContainer = React.createRef();\n\n this.renderStep = this.renderStep.bind(this);\n this.checkLevelIntegrity = this.checkLevelIntegrity.bind(this);\n this.changePos = this.changePos.bind(this);\n this.getSVGCoords = this.getSVGCoords.bind(this);\n this.highlightCut = this.highlightCut.bind(this);\n this.modifyCanvas = this.modifyCanvas.bind(this);\n this.getInsertionPoint = this.getInsertionPoint.bind(this);\n this.requestInput = this.requestInput.bind(this);\n this.cancelSelection = this.cancelSelection.bind(this);\n this.createElement = this.createElement.bind(this);\n this.clickedCanvas = this.clickedCanvas.bind(this);\n this.initXY = initXY;\n\n this.moveVars = {};\n this.getSelection = this.getSelection.bind(this);\n\n let { premises, conclusion, steps, data } = this.props.proof;\n this.state = {\n proof: {\n premises: premises,\n conclusion: conclusion\n },\n changeHistory: [], \n redoHistory: [],\n steps: steps || [],\n data: data || {},\n currentStep: steps.length !== 0 ? steps.length - 1 : 0,\n moveListeners: [],\n highlights: {\n cut: 'none', // 'none', 'odd', 'even', 'all'\n var: 'none',\n canvas: false\n },\n cbFunction: null,\n finishCB: null,\n interaction: true,\n functions: {\n insertion: () => manipulate(this).insertion(),\n erasure: () => manipulate(this).erasure(),\n iteration: () => manipulate(this).iteration(),\n deiteration: () => manipulate(this).deiteration(),\n doubleCutRemove: () => manipulate(this).doubleCutRemove(),\n doubleCutEnclose: () => manipulate(this).doubleCutEnclose(),\n doubleCutAdd: () => manipulate(this).doubleCutAdd(),\n },\n formula: '',\n eg: '',\n fitchNotation: false\n }\n }\n\n /**\n * Function to select a point on the canvas or inside a cut, where the x,y coordinate\n * gets returned along with a cut ID, if selected.\n */\n getInsertionPoint(cutConfig) {\n let getCanvasInsertion = new Promise((resolve, reject) => {\n this.setState({\n canvasCb: (x,y) => {\n this.setState({ canvasCb: null })\n \n setTimeout(() => {\n if (this.state.cbFunction) {\n this.state.cbFunction(null);\n this.setState({ cbFunction: null }, () => resolve({ x, y }));\n } else resolve({ x, y });\n }, 50);\n }\n })\n });\n return new Promise(async (resolve, reject) => {\n let data = await Promise.all([this.getSelection({\n 'cut': 'all',\n 'var': 'none',\n 'canvas': true,\n ...cutConfig\n }), getCanvasInsertion])\n if (this.state.finishCB) {\n this.state.finishCB();\n }\n this.setState({ \n highlights: {\n cut: 'none', \n var: 'none',\n canvas: false\n },\n finishCB: null,\n canvasCb: null,\n interaction: true, \n cbFunction: null }, () => {\n let [id, { x, y }] = data;\n resolve({ id, x, y });\n });\n })\n }\n\n /**\n * Function to enable selection of a cut or variable.\n * @param {Object} selectConfig object that contains highlight selection params\n *\n * selectConfig object should look like { 'cut': 'all', 'var': 'all' }\n * Omitted 'cut' or 'var' will result in either not allowing selection. Beyond 'all',\n * 'even' or 'odd' level cuts can be specified.\n */\n getSelection(selectConfig) {\n return new Promise((resolve, reject) => {\n let { steps, currentStep } = this.state;\n // only allow steps to be conducted at the end of a proof\n if (currentStep+1 !== steps.length) {\n return\n }\n this.setState({ \n highlights: selectConfig, \n interaction: false, \n cbFunction: (id) => {\n this.setState({ \n highlights: {\n cut: 'none', \n var: 'none',\n canvas: false\n },\n interaction: true, \n cbFunction: null }, () => resolve(id));\n }\n });\n });\n }\n\n modifyCanvas(nameOfFunction, finishedCb) {\n // before we modify the canvas, let's save the current state\n let { steps, changeHistory } = this.state;\n changeHistory = changeHistory.slice()\n changeHistory.push({ steps: Array.from(steps) });\n // okay, now we call the requested function from Toolbox\n this.setState({ finishCB: finishedCb }, () => {\n this.state.functions[nameOfFunction]().then(state => {\n if (this.state.finishCB) {\n this.state.finishCB();\n }\n if (state) {\n // now we can apply the new changeHistory\n this.setState({ \n changeHistory: changeHistory, \n redoHistory: [],\n ...state });\n this.checkLevelIntegrity();\n }\n });\n });\n }\n\n checkLevelIntegrity() {\n let { steps, data, currentStep } = this.state;\n let step = steps[currentStep];\n function verifyLevel(dobj, level) {\n for (let i in dobj) {\n let ob = dobj[i];\n let ids = []\n if (ob.type && ob.type === 'cut') {\n dobj[i].data = verifyLevel(ob.data, level+1);\n data[dobj[i].id].level = level;\n ids.push(ob.id);\n }\n else ids.push(ob);\n for (let i in ids) {\n data[ids[i]].level = level;\n }\n }\n if (dobj.length > 1)\n dobj = dobj.filter(el => el.id || (!el.id && data[el].var !== '\\xa0'));\n return dobj\n }\n steps[currentStep].data = verifyLevel(step.data, 0);\n this.setState({ steps, data });\n }\n\n cancelSelection() {\n let { cbFunction, canvasCb, finishCB } = this.state;\n if (cbFunction) cbFunction();\n if (canvasCb) canvasCb();\n if (finishCB) finishCB();\n }\n\n changePos(id, x, y) {\n let { data } = this.state;\n Object.assign(data[id], { x: x, y: y })\n this.setState(data)\n }\n\n highlightCut(level) {\n if (this.state.highlights.cut === 'all') return true;\n let odd = false;\n if (level % 2 === 1) odd = true;\n if (this.state.highlights.cut === 'odd' && odd) return true;\n else if (this.state.highlights.cut === 'even' && !odd) return true;\n return false;\n }\n\n highlightVar(level) {\n if (this.state.highlights.var === 'all') return true;\n let odd = false;\n if (level % 2 === 1) odd = true;\n if (this.state.highlights.var === 'odd' && odd) return true;\n else if (this.state.highlights.var === 'even' && !odd) return true;\n return false;\n }\n\n createElement(text, type, currentStep, x, y) {\n let { data } = this.state;\n let id = nanoid();\n data[id] = {};\n data[id].x = x || 0;\n data[id].y = y || 0;\n data[id].type = type;\n data[id].var = text;\n currentStep.push(id);\n this.setState({ data });\n }\n\n removeElement(id) {\n let { steps } = this.state;\n steps[this.state.currentStep].push(id);\n }\n\n renderStep(stepIndex) {\n let { data } = this.state;\n let step = this.state.steps[stepIndex];\n if (step) {\n const setXY = (id,x,y) => {\n data[id].x = x;\n data[id].y = y;\n this.setState({ data: data });\n }\n\n const renderRecurse = (step) => {\n let jsx = [];\n if (step.length === 0) {\n this.createElement(\"\\xa0\", \"emptyvar\", step, 0, 0);\n }\n for (let s in step) {\n if (step[s].type === \"cut\") {\n let level = data[step[s].id].level;\n const ids = [];\n const getIds = (step) => {\n if (step.data) \n for (let i in step.data)\n getIds(step.data[i]);\n else ids.push(step);\n }\n getIds(step[s])\n let groupElement = (\n {\n ids.forEach(id => {\n this.moveVars[id](x,y);\n });\n }}\n key={step[s].id}\n selectedCallback={this.state.cbFunction}>\n {renderRecurse(step[s].data)}\n \n );\n jsx.push(groupElement);\n } else if (this.state.data[step[s]].type === \"var\") {\n let el = this.state.data[step[s]];\n let level = data[step[s]].level;\n jsx.unshift(\n setXY(step[s],x,y)}\n subscribeMove={f => this.moveVars[step[s]] = f}\n key={step[s]}>\n {el.var}\n \n );\n } else if (this.state.data[step[s]].type === \"emptyvar\" && step.length === 1) {\n let el = this.state.data[step[s]];\n jsx.unshift(\n {}}\n panzoom={this.panzoom}\n interaction={this.state.interaction}\n getCoords={this.getSVGCoords}\n setCoords={(x,y) => setXY(step[s],x,y)}\n subscribeMove={f => this.moveVars[step[s]] = f}\n key={step[s]}>\n {el.var}\n \n );\n }\n }\n return jsx;\n }\n renderRecurse.bind(this);\n return renderRecurse(step.data, (f)=>{})\n }\n }\n\n componentDidMount() { \n this.panzoom = Panzoom(this.canvas.current, {\n maxZoom: 6,\n minZoom: 0.5\n });\n // this.canvasContainer.current.addEventListener('wheel', this.panzoom.zoomWithWheel);\n const vw = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n const vh = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n // if there are no existing steps, init first step\n let { steps } = this.state;\n if (steps.length === 0) {\n let { premises } = this.state.proof;\n console.log(premises)\n console.log(premises.join(''))\n console.log(convertToArray(premises.join('')));\n let { stepZero, data } = initXY(convertToArray(premises.join('')), 0);\n steps.push(stepZero);\n this.setState({ steps: steps, data: data });\n }\n // required to use setState to trigger re-render after creation of panzoom\n this.setState({ });\n let step = this.state.steps[this.state.currentStep];\n\n // center the canvas elements\n this.panzoom.moveTo(vw/2 - step.w, vh/2 - step.h);\n this.panzoom.zoomTo(vw/2 - step.w, vh/2 - step.h, 2);\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this);\n }\n\n /**\n * @param {int} X on the DOM\n * @param {int} Y on the DOM\n * @return {(int, int)} x,y pair representing point on Canvas\n */\n getSVGCoords(domX, domY) {\n var pt = this.canvasContainer.current.createSVGPoint();\n pt.x = domX;\n pt.y = domY;\n return pt.matrixTransform(this.canvas.current.getScreenCTM().inverse());\n }\n\n clickedCanvas(e) {\n if (this.state.canvasCb) {\n let { x, y } = this.getSVGCoords(e.pageX,e.pageY)\n this.state.canvasCb(x,y);\n }\n }\n\n requestInput() {\n return new Promise((resolve, reject) => {\n this.setState({ \n showOverlay: true,\n cbFunction: (formula) => {\n if (formula == null) resolve(null);\n else resolve(formula);\n this.setState({ showOverlay: false, cbFunction: null });\n } \n });\n });\n }\n\n render() {\n let { proof, data, steps, currentStep, highlight, showOverlay } = this.state;\n // every time a re-render happens, ensure top-level state is up-to-date\n this.props.saveProof({...proof, data, steps});\n // zooming function does nothing unless panzoom is initialized\n let zoomWithWheel = () => {}\n if (this.panzoom)\n zoomWithWheel = this.panzoom.zoomWithWheel\n // CSSTransitionGroup lets us have entry fade-in\n let tex = convertToTeX(this.state.formula);\n let eg = convertToEG(`(${this.state.formula})`);\n\n return (\n \n
\n

Fitch-Style Formula to Insert

\n {false && (\n {\n this.setState({ fitchNotation: !this.state.fitchNotation }); \n }} />\n
)}\n
\n \n \n \n \n \n \n \n \n
\n this.setState({ formula: e.target.value, eg: convertToEG(e.target.value) }) } />\n \n {tex && }\n
\n To insert: {eg && }\n
\n { false &&
\n this.setState({ formula: e.target.value, eg: e.target.value }) } />
\n To insert: \n
}\n \n \n \n \n
\n
\n \n
\n \n );\n }\n}\n\nexport default Canvas;\n","import React from 'react';\nimport verify from '../verifySentence';\nimport { convertToTeX, convertToEG } from '../converters';\n// KATEX\nimport 'katex/dist/katex.min.css';\nimport TeX from '@matejmazur/react-katex';\nimport './CreateNew.scss';\n\nclass CreateNew extends React.Component {\n constructor(props) {\n super(props);\n \n this.state = {\n premises: [\n ''\n ],\n conclusion: ''\n };\n\n this.handleChange.bind(this)\n this.removePremise.bind(this)\n this.verify = this.verify.bind(this)\n this.create = this.create.bind(this)\n this.filename = React.createRef()\n }\n\n componentDidMount() {\n\n }\n\n handleChange(e, i) {\n if (i != null) {\n let { premises } = this.state;\n premises[i] = e.target.value;\n this.setState({ premises: premises })\n }\n else this.setState({ conclusion: e.target.value })\n }\n\n removePremise(index) {\n let { premises } = this.state;\n premises.splice(index, 1);\n this.setState({ premises: premises })\n }\n\n verify() {\n let { premises, conclusion } = this.state;\n for (let i in premises) {\n if (premises[i] === '' || !premises[i])\n return false;\n }\n if (conclusion === '' || !conclusion)\n return false;\n return true;\n }\n\n create() {\n console.log(\"Creating...\")\n console.log(\"Verification concluded \" + this.verify())\n if (this.verify()) {\n let { premises, conclusion } = this.state;\n for (let i in premises) {\n premises[i] = convertToEG(premises[i])\n console.log(premises[i])\n }\n conclusion = convertToEG(conclusion)\n this.props.setupFunc(this.filename.current.value, { premises, conclusion, steps: [] })\n }\n }\n\n getFormulaCell(formula, i) {\n let tex, eg\n if (verify(formula)) {\n tex = convertToTeX(formula);\n eg = convertToEG(formula);\n }\n let closeBtn = this.removePremise(i)}>\n ✕\n ;\n let formulaInput = this.handleChange(e,i) } />;\n if (i == null) {\n formulaInput = this.handleChange(e) } />;\n closeBtn = ;\n }\n if (i === 0) \n closeBtn = ;\n return (\n \n \n {formulaInput}\n \n \n {tex && }\n \n \n {eg && }\n \n { closeBtn }\n \n );\n }\n\n render() {\n let { premises, conclusion } = this.state;\n return (\n
\n

Create New

\n

File Name

\n \n \n \n
\n

Premises

\n \n \n \n \n \n {premises.map((formula,i) => this.getFormulaCell(formula, i))}\n \n \n \n \n
\n Formula\n TeX notationEG notation\n
this.setState({ premises: premises.concat(['']) }) }>\n Add New Premise\n \n
\n

Conclusion

\n \n \n {this.getFormulaCell(conclusion)}\n \n
\n
\n );\n }\n}\n\nexport default CreateNew;","import React from 'react';\nimport CreateNew from './CreateNew';\nimport { ReactSVG } from 'react-svg';\nimport './intro.scss';\n\nconst IntroContent = ({ recentDocs }) => (\n
\n
\n

Existential Graphs

\n

\n Using this tool, you can initialize proofs in the existential graph schema and then you can go through the process of solving them. You can save these proofs and look back at them later.\n

\n
\n
\n
\n

Recent Proofs

\n {Object.keys(recentDocs).map(name => (\n
\n recentDocs[name].open()}>\n {name}\n \n recentDocs[name].delete()}\n >Delete\n
\n ))}\n
\n
\n);\n\nclass IntroWindow extends React.Component {\n constructor(props) {\n super(props);\n this.createView = React.createRef();\n this.callCreate = this.callCreate.bind(this);\n this.animateAway = this.animateAway.bind(this);\n this.openFile = this.openFile.bind(this);\n this.state = {\n createShown: false,\n floatingWindowCSS: 'floating-window shown'\n };\n }\n\n componentDidMount() {\n }\n\n animateAway() {\n this.setState({ floatingWindowCSS: 'floating-window' })\n }\n\n callCreate() {\n this.createView.current.create();\n }\n\n openFile() {\n const input = document.createElement(\"input\");\n input.setAttribute(\"type\", \"file\");\n input.setAttribute(\"accept\", \".egprf\");\n input.onchange = (evt) => {\n console.log(\"ONCHANGE\")\n evt.stopPropagation();\n evt.preventDefault();\n var file = evt.target.files[0];\n console.log(file);\n var reader = new FileReader();\n reader.addEventListener('load', (evt) => {\n try {\n let res = JSON.parse(evt.target.result);\n console.log(res);\n this.props.setupFunc(file.name.split(\".egprf\")[0], res);\n } catch (e) {\n console.error(e);\n alert(\"Corrupt file or improper formatting.\");\n }\n });\n reader.readAsText(file);\n };\n input.click();\n }\n\n render() {\n const { createShown, floatingWindowCSS } = this.state;\n return (\n
\n {!createShown && }\n {createShown && }\n {!createShown && (\n
\n \n \n
\n )}\n {createShown && (\n
\n \n \n
\n )}\n
\n );\n }\n}\n\nexport default IntroWindow;","import React from 'react';\nimport './App.scss';\nimport Canvas from './canvas/Canvas';\nimport IntroWindow from './intro/IntroWindow';\n\nvar localStorage = window.localStorage;\n\nclass App extends React.Component {\n constructor(props) {\n super(props);\n \n this.createNewProof = this.createNewProof.bind(this);\n this.setupProof = this.setupProof.bind(this);\n this.openCanvas = this.openCanvas.bind(this);\n this.saveProof = this.saveProof.bind(this);\n this.getRecents = this.getRecents.bind(this);\n this.introWindow = React.createRef();\n this.state = {\n initialCSS: 'initial',\n canvasOpen: false,\n popupOpen: false,\n filename: '',\n proof: {\n premises: [],\n conclusion: '',\n steps: []\n },\n recentDocs: this.getRecents()\n };\n \n console.log(this.state.recentDocs)\n // this.state = {\n // initialCSS: 'initial',\n // canvasOpen: true,\n // popupOpen: false,\n // proof: {premises: [\"({Q})(({P}){Q})\"], conclusion: \"{Q}\", steps:[] }\n // };\n\n this.menuItems = [\n { \n title: 'Exit', \n func: () => {\n this.setState({ \n initialCSS: 'initial',\n canvasOpen: false,\n popupOpen: false,\n filename: '',\n proof: {\n premises: [],\n conclusion: '',\n steps: []\n },\n recentDocs: this.getRecents()\n }) \n }\n },\n 'separator',\n { \n title: 'Export',\n func: () => {\n const element = document.createElement(\"a\");\n const file = new Blob([JSON.stringify(this.state.proof)], {type: 'text/plain'});\n element.href = URL.createObjectURL(file);\n element.download = this.state.filename + \".egprf\";\n document.body.appendChild(element);\n element.click();\n } \n }\n ]\n }\n\n getRecents() {\n let recents = localStorage.getItem('recentDocs');\n recents = recents ? JSON.parse(recents) : {}\n let keys = Object.keys(recents)\n for (let i in keys) {\n recents[keys[i]].open = () => {\n this.setState({ \n filename: keys[i],\n proof: recents[keys[i]] \n });\n this.openCanvas();\n }\n recents[keys[i]].delete = () => {\n let rArray = localStorage.getItem('recentDocs');\n rArray = rArray ? JSON.parse(rArray) : {}\n delete rArray[keys[i]];\n localStorage.setItem('recentDocs', JSON.stringify(rArray));\n this.setState({ recentDocs: rArray });\n }\n }\n return recents;\n }\n\n saveProof(filename) {\n let { recentDocs } = this.state;\n recentDocs[filename] = this.state.proof;\n return (proof) => {\n recentDocs[filename] = proof;\n localStorage.setItem('recentDocs', JSON.stringify(recentDocs));\n }\n }\n\n setupProof(filename, proof) {\n this.setState({ \n filename: filename,\n proof: proof\n });\n this.openCanvas();\n }\n\n openCanvas() {\n this.setState({ initialCSS: 'initial whiteBG' });\n this.introWindow.current.animateAway();\n setTimeout(() => this.setState({ \n canvasOpen: true\n }), 1000);\n }\n\n createNewProof() {\n this.setState({ popupOpen: true })\n }\n\n render() {\n if (this.state.canvasOpen) {\n return (\n
\n \n
\n );\n }\n return (\n
\n \n
\n );\n }\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.scss';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\n// Root React element, renders the App onload.\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.dbec2f34.chunk.js b/static/js/main.dbec2f34.chunk.js new file mode 100644 index 0000000..b270eac --- /dev/null +++ b/static/js/main.dbec2f34.chunk.js @@ -0,0 +1,2 @@ +(this["webpackJsonpexistential-graphs"]=this["webpackJsonpexistential-graphs"]||[]).push([[0],{15:function(e){e.exports=JSON.parse('{"binary":{"<->":"\\\\leftrightarrow","%":"\\\\leftrightarrow","->":"\\\\rightarrow","$":"\\\\rightarrow","&":"\\\\land","^":"\\\\land","|":"\\\\lor"},"unary":{"~":"\\\\lnot","!":"\\\\lnot"},"symb":{"^":"\\\\bot"},"eg":{"<->":"($1($2))(($1)$2)","%":"($1($2))(($1)$2)","->":"($1($2))","$":"($1($2))","&":"$1$2","|":"(($1)($2))"}}')},27:function(e,t,n){e.exports=n(62)},32:function(e,t,n){},33:function(e,t,n){},38:function(e,t,n){},60:function(e,t,n){},61:function(e,t,n){},62:function(e,t,n){"use strict";n.r(t);var a=n(0),r=n.n(a),i=n(14),s=n.n(i),o=(n(32),n(3)),c=n(4),u=n(1),l=n(6),h=n(5),d=(n(33),n(7)),p=n.n(d),f=n(26),v=n(11),m=n(8),g=n(15),b=g.binary,y=g.unary;function k(e){return"(?:"+(e=e.map((function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}))).join("|")+")"}var C=k(Object.keys(y)),S="^(".concat(C,"*[A-Za-z]+|").concat(C,"*\\((.*)\\))(").concat(k(Object.keys(b)),")(").concat(C,"*[A-Za-z]+|").concat(C,"*\\((.*)\\))$"),E=new RegExp(S),O=new RegExp("^([A-Za-z])*"),x=new RegExp("^".concat(C,"*\\((.*)\\)$"));var w=function(e){return function e(t){var n;return!!t.match(O)||(null!==(n=E.exec(t))?null!=n&&(n[2]&&n[5]?e(n[2])&&e(n[5]):n[2]?e(n[2]):!n[5]||e(n[5])):null!==(n=x.exec(t))?e(n[1]):void 0)}(e=e.replace(/\s/g,""))},j=n(15);function D(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var N=Object.keys(j.binary);N=N.map((function(e){return D(e)}));var I=new RegExp("(?:"+N.join("|")+")","g"),P=j.unary,z=function(e){if("string"===typeof e||e instanceof String){var t;for(e=e.replace(/\s/g,"");null!==(t=I.exec(e));)e=e.substr(0,t.index)+j.binary[t[0]]+" "+e.substr(t.index+t[0].length);for(var n in Object.keys(P))t=Object.keys(P)[n],e=e.replace(new RegExp(D(t),"g"),P[t]+" ");return e=e.replace(/[^()A-Za-z\\\s]/g,"")}return""};var F=function e(t){if(!w(t))return null;if(("string"===typeof t||t instanceof String)&&w(t)){t=t.replace(/\s/g,"");var n=E.exec(t),a=(x.exec(t),O.exec(t));if(n){var r=e(n[1]),i=e(n[4]);return j.eg[n[3]].replace(/\$1/g,r).replace(/\$2/g,i)}if("("===t[0]){var s=e(t.substr(1,t.length-2));return s||null}if(Object.keys(P).includes(t[0])){var o=e(t.substr(1));return o?"("+o+")":null}return a?"{"+a[0]+"}":null}return null},R=function(e){if("string"===typeof e||e instanceof String){var t=function(t){return e.length>0&&t===e[0]&&(e=e.substring(1),!0)};return function n(a){for(var r=[];;){if(t("(")){if(r.push(n(e)),!t(")"))return null}else if(t("{")){for(var i="";e.length>0&&!t("}");)i=i.concat(e[0]),e=e.substring(1);0===i.length&&r.push("\xa0"),r.push(i)}if(0===e.length||"("!==e[0]&&"{"!==e[0])break}return r}()}return null};console.log(R("((({P}(({Q}({R})))))({T}))({T}){P}"));var M=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).state={selected:null,functions:[{str:"Iterate",func:"iteration"},{str:"Deiterate",func:"deiteration"},{str:"Wrap in Double Cut",func:"doubleCutEnclose"},{str:"Add Double Cut",func:"doubleCutAdd"},{str:"Remove Double Cut",func:"doubleCutRemove"},{str:"Insertion",func:"insertion"},{str:"Erasure",func:"erasure"}]},a}return Object(c.a)(n,[{key:"componentDidMount",value:function(){}},{key:"render",value:function(){var e=this,t=this.props,n=t.hidden,a=t.modifyCanvas,i=t.cancelSelection,s=this.state.selected;return n?r.a.createElement(r.a.Fragment,null):r.a.createElement("div",{className:"toolbox",ref:this.canvas},r.a.createElement("h3",null,"Tools"),this.state.functions.map((function(t,n){return r.a.createElement("div",{className:"tool",style:s===n?{backgroundColor:"#AFAFAA"}:{},onClick:function(){e.state.selected===n?(e.setState({selected:null}),i()):(e.setState({selected:n}),a(t.func,(function(){})))}},t.str)})))}}]),n}(r.a.Component),A=n(9),H=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).performRedo=a.performRedo.bind(Object(u.a)(a)),a.performUndo=a.performUndo.bind(Object(u.a)(a)),a.state={},a}return Object(c.a)(n,[{key:"handleClick",value:function(e,t,n){e.preventDefault(),n||this.props.setStep(t)}},{key:"performUndo",value:function(e){var t=this.props.state,n=t.changeHistory,a=t.steps,r=t.redoHistory,i=n.pop();i&&(r.push(a),this.props.setState(n,i.steps,r))}},{key:"performRedo",value:function(e){var t=this.props.state,n=t.changeHistory,a=t.steps,r=t.redoHistory,i=r.pop();i&&(n.push({redoHistory:r,steps:a}),this.props.setState(n,i,r))}},{key:"getColor",value:function(e){return e?"rgb(136, 136, 136)":"rgb(68, 68, 68)"}},{key:"disable",value:function(e,t){return e.concat(t.length>0?"":" disabled")}},{key:"render",value:function(){var e=this,t=this.props,n=t.hide,a=t.currentStep,i=t.stepInfo,s=t.state,o=s.changeHistory,c=s.redoHistory;if(n)return r.a.createElement(r.a.Fragment,null);var u=a===i.length-1,l=0===a;return r.a.createElement(r.a.Fragment,null,r.a.createElement("div",{className:"step-menu"},r.a.createElement("div",{style:{color:this.getColor(l)}},r.a.createElement("div",{onClick:function(t){return e.handleClick(t,0,l)}},r.a.createElement(A.a,{src:"/existential-graphs/assets/step-first.svg"})),r.a.createElement("div",{onClick:function(t){return e.handleClick(t,a-1,l)}},r.a.createElement(A.a,{src:"/existential-graphs/assets/step-prev.svg"}))),r.a.createElement("div",null,r.a.createElement("div",{className:this.disable("undo-btn",o),onClick:this.performUndo},r.a.createElement("div",{className:"undo-svg"},r.a.createElement(A.a,{src:"/existential-graphs/assets/undo.svg"}))),r.a.createElement("div",{className:this.disable("redo-btn",c),onClick:this.performRedo},r.a.createElement("div",{className:"redo-svg"},r.a.createElement(A.a,{src:"/existential-graphs/assets/redo.svg"})))),r.a.createElement("div",{style:{color:this.getColor(u)}},r.a.createElement("div",{onClick:function(t){return e.handleClick(t,a+1,u)}},r.a.createElement(A.a,{src:"/existential-graphs/assets/step-next.svg"})),r.a.createElement("div",{onClick:function(t){return e.handleClick(t,i.length-1,u)}},r.a.createElement(A.a,{src:"/existential-graphs/assets/step-last.svg"})))),r.a.createElement("div",{className:"step-text"},"Step ",a+1," of ",i.length))}}]),n}(r.a.Component),L={gridSize:1,cutPadding:{horizontal:10,vertical:5},cutCornerRadius:10,initialSeparation:50},$=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).text=r.a.createRef(),a.getCoords=a.props.getCoords,a.handleClick=a.handleClick.bind(Object(u.a)(a)),a.state={x:e.x,y:e.y,cursorOver:!1,dragging:!1},a.panzoom=a.props.panzoom,window.addEventListener("mousemove",a.onMouseMove.bind(Object(u.a)(a))),window.addEventListener("mousedown",a.handleDragStart.bind(Object(u.a)(a))),window.addEventListener("mouseup",a.handleDragEnd.bind(Object(u.a)(a))),window.addEventListener("click",a.handleClick),a}return Object(c.a)(n,[{key:"handleClick",value:function(){this.state.cursorOver&&this.props.enableHighlight&&this.props.selectedCallback&&(this.props.selectedCallback(this.props.id),this.setState({cursorOver:!1}))}},{key:"componentDidMount",value:function(){var e=this;this.text.current.style.cursor="pointer",this.props.subscribeMove((function(t,n){var a=e.state.x+t,r=e.state.y+n;e.props.setCoords(a,r),e.setState({x:a,y:r})}))}},{key:"handleDragStart",value:function(e){this.state.cursorOver&&(this.panzoom.pause(),this.setState({dragging:!0}))}},{key:"handleDragEnd",value:function(e){this.panzoom.resume();var t=this.state,n=t.x,a=t.y;this.props.setCoords(n,a),this.setState({dragging:!1})}},{key:"onMouseMove",value:function(e){if(this.state.dragging){var t=this.getCoords(e.clientX,e.clientY),n=t.x,a=t.y;n=Math.round(n/L.gridSize)*L.gridSize,a=Math.round(a/L.gridSize)*L.gridSize,this.props.setCoords(n,a),this.setState({x:n,y:a})}}},{key:"componentWillUnmount",value:function(){window.removeEventListener("click",this.handleClick),window.removeEventListener("mousemove",this.onMouseMove.bind(this)),window.removeEventListener("mousedown",this.handleDragStart.bind(this)),window.removeEventListener("mouseup",this.handleDragEnd.bind(this))}},{key:"render",value:function(){var e=this,t=this.state.cursorOver&&this.props.enableHighlight,n=null!=this.props.selectedCallback&&this.state.cursorOver&&!this.props.enableHighlight,a="black";return t?a="blue":n&&(a="red"),r.a.createElement("text",{className:"noselect",x:this.state.x,y:this.state.y,id:this.props.id,fill:a,onMouseEnter:function(){return e.setState({cursorOver:!0})},onMouseLeave:function(){return e.setState({cursorOver:!1})},ref:this.text},this.props.children)}}]),n}(r.a.Component),B=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).cut=r.a.createRef(),a.BB=r.a.createRef(),a.getBBoxData=a.getBBoxData.bind(Object(u.a)(a)),a.handleClick=a.handleClick.bind(Object(u.a)(a)),a.update=a.update.bind(Object(u.a)(a)),a.getCoords=a.props.getCoords,a.state={highlight:!1,cursorOver:!1,bounding:{_x:0,_y:0,_w:0,_h:0}},a.panzoom=a.props.panzoom,window.addEventListener("click",a.handleClick),window.addEventListener("mousemove",a.onMouseMove.bind(Object(u.a)(a))),window.addEventListener("mousedown",a.handleDragStart.bind(Object(u.a)(a))),window.addEventListener("mouseup",a.handleDragEnd.bind(Object(u.a)(a))),a}return Object(c.a)(n,[{key:"handleClick",value:function(){this.state.cursorOver&&this.props.enableHighlight&&this.props.selectedCallback&&(this.props.selectedCallback(this.props.id),this.setState({cursorOver:!1}))}},{key:"getBBoxData",value:function(){if(this.cut.current){var e=this.cut.current.getBBox(),t=e.x,n=e.y,a=e.width,r=e.height;return{_x:t-L.cutPadding.horizontal,_y:n-L.cutPadding.vertical,_w:a+2*L.cutPadding.horizontal,_h:r+2*L.cutPadding.vertical}}return{}}},{key:"update",value:function(){var e=this;this.interval||(this.interval=setInterval((function(){e.setState({bounding:e.getBBoxData()})}),1),setTimeout((function(){clearInterval(e.interval),e.interval=null}),100))}},{key:"componentDidMount",value:function(){this.update()}},{key:"componentDidUpdate",value:function(){this.update()}},{key:"componentWillUnmount",value:function(){window.removeEventListener("click",this.handleClick),this.interval&&clearInterval(this.interval)}},{key:"handleDragStart",value:function(e){if(this.state.cursorOver){this.panzoom.pause();var t=this.getCoords(e.clientX,e.clientY),n=t.x,a=t.y;this.setState({dragging:!0,x:n,y:a})}}},{key:"handleDragEnd",value:function(e){this.panzoom.resume(),this.setState({dragging:!1})}},{key:"onMouseMove",value:function(e){if(this.state.dragging){var t=this.state.x,n=this.state.y,a=this.getCoords(e.clientX,e.clientY),r=a.x,i=a.y;r=Math.round(r/L.gridSize)*L.gridSize,i=Math.round(i/L.gridSize)*L.gridSize,this.props.setCoords(r-t,i-n),this.setState({x:r,y:i})}}},{key:"render",value:function(){var e=this,t=this.state.cursorOver&&this.props.enableHighlight,n=null!=this.props.selectedCallback&&this.state.cursorOver&&!this.props.enableHighlight,a="black";t?a="blue":n&&(a="red");var i=this.state.bounding,s=i._x,o=i._y,c=i._w,u=i._h;return r.a.createElement(r.a.Fragment,null,r.a.createElement("rect",{x:s,y:o,width:c,height:u,fillOpacity:"0.7",strokeOpacity:"1",stroke:a,fill:t?"#DFDFDA":"white",onMouseEnter:function(t){return e.setState({cursorOver:!0})},onMouseLeave:function(t){return e.setState({cursorOver:!1})},rx:L.cutCornerRadius.toString(),ry:L.cutCornerRadius.toString()}),r.a.createElement("g",{ref:this.cut},this.props.children))}}]),n}(r.a.Component),T=(n(38),n(24)),V=n.n(T),W=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(){return Object(o.a)(this,n),t.apply(this,arguments)}return Object(c.a)(n,[{key:"render",value:function(){var e=this.props.menuItems;return r.a.createElement("div",{className:"dropdown-menu"},e.map((function(e){return e.title?r.a.createElement("div",{className:"menu-title",onClick:e.func},e.title):r.a.createElement("div",{className:e})})))}}]),n}(r.a.Component),G=n(16).nanoid,_=function(e){var t=e.state,n=e.getSelection,a=e.getInsertionPoint,r=e.requestInput,i=e.initXY;return{state:t,insertion:function(){var e=Object(m.a)(p.a.mark((function e(){var n,s,o,c,u,l,h,d,f,m,g,b,y,k;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.state,s=n.steps,o=n.currentStep,c=n.data,u=this.copyStep(s[o]),e.next=4,a({cut:"even",canvas:!1});case 4:if((l=e.sent)&&l.id){e.next=7;break}return e.abrupt("return",null);case 7:return h=l.id,d=l.x,f=l.y,e.next=10,r();case 10:if(null!=(m=e.sent)&&m){e.next=13;break}return e.abrupt("return",null);case 13:if(g=i(R(m),t.data[h].level+1),(b=this.findID(u,h)).data){e.next=18;break}return console.log("Insert ID could not be found in Iterate"),e.abrupt("return",null);case 18:for(y in b.data=b.data.concat(g.stepZero.data),g.data)"var"===(k=g.data[y]).type&&(k.x+=d,k.y+=f);return s.push(u),e.abrupt("return",{steps:s,currentStep:o+1,data:Object(v.a)({},c,{},g.data)});case 22:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),iteration:function(){var e=Object(m.a)(p.a.mark((function e(){var t,r,i,s,o,c,u,l,h,d,f,v,m,g;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n({cut:"all",var:"all"});case 2:if(t=e.sent){e.next=5;break}return e.abrupt("return",null);case 5:return e.next=7,a();case 7:if(r=e.sent){e.next=10;break}return e.abrupt("return",null);case 10:if(i=r.id,s=r.x,o=r.y,c=i){e.next=14;break}return e.abrupt("return",null);case 14:if(u=this.state,l=u.steps,h=u.currentStep,d=u.data,f=this.copyStep(l[h]),this.isInNestedGraph(f,c,t)){e.next=20;break}if(c===this.findParent(f,t).id){e.next=20;break}return console.log("Insert selection is not in a subgraph of Copy selection"),e.abrupt("return",null);case 20:if(v=this.copyContents(this.findID(f,t))){e.next=24;break}return console.log("Copy ID could not be found in Iterate"),e.abrupt("return",null);case 24:if((m=this.findID(f,c)).data){e.next=28;break}return console.log("Insert ID could not be found in Iterate"),e.abrupt("return",null);case 28:return m.data=m.data.concat(v),g=v,"string"!==typeof v&&(g=v.id),d[g].x=s,d[g].y=o,h+=1,l.push(f),e.abrupt("return",{steps:l,currentStep:h,data:d});case 36:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),deiteration:function(){var e=Object(m.a)(p.a.mark((function e(){var t,a,r,i,s,o,c,u,l,h,d=this;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.state,a=t.steps,r=t.currentStep,i=t.data,s=this.copyStep(a[r]),e.next=4,n({cut:"all",var:"all"});case 4:if(o=e.sent){e.next=7;break}return e.abrupt("return",null);case 7:if(c=this.findID(s,o)){e.next=10;break}return e.abrupt("return",null);case 10:if(u=function e(t,n){if("string"===typeof t)return"string"===typeof n&&i[t].var===i[n].var;var a=[];return t.data.map((function(t){return function(t,n){for(var r in n.data)if(!a.includes(r)&&e(t,n.data[r]))return!0;return!1}(t,n)})).every(Boolean)},function e(t,n){for(var a in t.data){var r=t.data[a];if("string"===typeof n&&"string"===typeof r&&r!==n&&i[n].var===i[r].var)return!0;if(r.id!==n.id&&u(r,n))return!0}return!!t.id&&e(d.findParent(s,t.id),n)}(this.findParent(s,o),c)){e.next=15;break}return e.abrupt("return",null);case 15:if(l=this.findParent(s,o)){e.next=18;break}return e.abrupt("return",null);case 18:if(!((h=l.data.indexOf(c))>-1)){e.next=23;break}l.data.splice(h,1),e.next=24;break;case 23:return e.abrupt("return",null);case 24:return a.push(s),r+=1,e.abrupt("return",{steps:a,currentStep:r,data:i});case 27:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),erasure:function(){var e=Object(m.a)(p.a.mark((function e(){var t,a,r,i,s,o,c,u,l;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n({cut:"even",var:"even"});case 2:if(null!=(t=e.sent)){e.next=5;break}return e.abrupt("return",null);case 5:if(a=this.state,r=a.steps,i=a.currentStep,s=a.data,o=this.copyStep(r[i]),c=this.findID(o,t)){e.next=10;break}return e.abrupt("return",null);case 10:if(u=this.findParent(o,t)){e.next=13;break}return e.abrupt("return",null);case 13:if(!((l=u.data.indexOf(c))>-1)){e.next=18;break}u.data.splice(l,1),e.next=19;break;case 18:return e.abrupt("return",null);case 19:return i+=1,r.push(o),e.abrupt("return",{steps:r,currentStep:i,data:s});case 22:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),doubleCutEnclose:function(){var e=Object(m.a)(p.a.mark((function e(){var t,a,r,i,s,o,c,u,l,h,d,f,v;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n({cut:"all",var:"all"});case 2:if(t=e.sent,a=this.state,r=a.steps,i=a.currentStep,s=a.data,o=this.copyStep(r[i]),c=this.findID(o,t)){e.next=8;break}return e.abrupt("return",null);case 8:if(u=G(),l=G(),h={data:[{data:[c],id:l,type:"cut"}],id:u,type:"cut"},d=s[t].level,s[l]={type:"cut",level:d+1},s[u]={type:"cut",level:d},this.changeCutLevel(o,t,2),f=this.findParent(o,t)){e.next=19;break}return e.abrupt("return",null);case 19:return(v=f.data.indexOf(c))>-1&&f.data.splice(v,1),f.data=f.data.concat(h),i+=1,r.push(o),e.abrupt("return",{steps:r,currentStep:i,data:s});case 25:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),doubleCutAdd:function(){var e=Object(m.a)(p.a.mark((function e(){var t,n,r,i,s,o,c,u,l,h,d,f,v,m;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,a();case 2:if(t=e.sent,n=t.id,r=t.x,i=t.y,r&&i){e.next=8;break}return e.abrupt("return",null);case 8:return s=this.state,o=s.steps,c=s.currentStep,u=s.data,l=this.copyStep(o[c]),h=G(),d=G(),f=G(),v={data:[{data:[f],id:d,type:"cut"}],id:h,type:"cut"},m=n?u[n].level:-1,u[d]={type:"cut",level:m+2},u[h]={type:"cut",level:m+1},u[f]={x:r,y:i,type:"emptyvar",var:"\xa0",level:m+3},n?this.findID(l,n).data.push(v):l.data.push(v),c+=1,o.push(l),e.abrupt("return",{steps:o,currentStep:c,data:u});case 23:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),doubleCutRemove:function(){var e=Object(m.a)(p.a.mark((function e(){var t,a,r,i,s,o,c,u,l,h,d;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n({cut:"all"});case 2:if(t=e.sent,a=this.state,r=a.steps,i=a.currentStep,s=a.data,o=this.copyStep(r[i]),!(c=this.findID(o,t))||"cut"!==c.type){e.next=25;break}if(!(u=c.data)||1!==u.length||"cut"!==u[0].type){e.next=22;break}if(l=u[0].data,h=this.findParent(o,t)){e.next=13;break}return e.abrupt("return",null);case 13:return this.changeCutLevel(o,u[0].id,-2),(d=h.data.indexOf(c))>-1&&h.data.splice(d,1),h.data=h.data.concat(l),i+=1,r.push(o),e.abrupt("return",{steps:r,currentStep:i,data:s});case 22:return e.abrupt("return",null);case 23:e.next=26;break;case 25:return e.abrupt("return",null);case 26:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),isInNestedGraph:function(e,t,n){var a=this.findParent(e,n);return a?!!this.findID(a,t)||(console.log("Child is not in nested graph of Parent"),!1):(console.log("Parent Data could not be found"),!1)},copyContents:function(e){var t=this.state.data;function n(e,n){if("string"===typeof e){var r=G();return t[r]={type:"var",var:t[e].var,x:t[e].x,y:t[e].y,level:t[e].level},r}var i={};for(var s in e)if("id"===s){var o=G();i[s]=o,t[o]={type:"cut",level:n}}else i[s]="data"!==s?e[s]:a(e[s],n+1);return i}function a(e,a){var r=[];for(var i in e)if("string"===typeof e[i]){var s=G();r.push(s),t[s]={type:"var",var:t[e[i]].var,x:t[e[i]].x,y:t[e[i]].y,level:t[e[i]].level}}else r.push(n(e[i],a));return r}var r=n(e,0);return this.state.data=t,r},changeCutLevel:function(e,t,n){var a=this.state.data;if(a[t]&&"var"===a[t].type)a[t].level+=n;else{var r=!1;s(e.data),this.state.data=a}function i(e){var i;e.id&&(i=e.id)===t&&(r=!0),r&&(a[i].level+=n),e.data&&s(e.data)}function s(e){for(var t in e)"string"!==typeof e[t]?i(e[t]):r&&(a[e[t]].level+=n)}},copyStep:function(e){var t={};function n(e){var t={};for(var n in e)"string"===typeof e[n]?t[n]=e[n]:t[n]=a(e[n]);return t}function a(e){var t=[];for(var a in e)"string"===typeof e[a]?t.push(e[a]):t.push(n(e[a]));return t}return t.data=a(e.data),t.h=e.h,t.w=e.w,t},findParent:function(e,t){var n=e;function a(e){for(var n in e)if("string"===typeof e[n]){if(e[n]===t)return!0}else{if(e[n].id&&e[n].id===t)return!0;r(e[n])}return!1}function r(e){e.data&&a(e.data)&&(n=e)}return a(e.data),n},findID:function(e,t){function n(e){for(var n in e)if("string"===typeof e[n]){if(e[n]===t)return t}else{if(e[n].id===t)return e[n];var r=a(e[n]);if(r)return r}}function a(e){if("string"===typeof e)return e===t?e:void 0;for(var a in e){if(e[a]instanceof Array)return n(e[a]);if("id"===a&&e[a]===t)return e}}return a(e)},offsetPosition:function(e,t,n){this.findID(t,n);return console.log(e),e}}},U=n(25),J=(n(20),n(10)),Z=n.n(J),X=n(16).nanoid;function Y(e,t){t||(t=0);var n={},a=0,r=0,i=0;return{stepZero:{data:function e(t,s,o){for(var c in t)if(t[c]instanceof Array&&t[c].length>0){var u=X();t[c]={data:e(t[c],s+1),id:u,type:"cut"},n[u]={type:"cut",level:s}}else{var l=a,h=X();n[h]={type:"var",var:t[c],x:Math.round(l/L.gridSize)*L.gridSize,y:Math.round(0/L.gridSize)*L.gridSize,level:s},t[c]=h,i=0>i?0:i,r=l>r?l:r,a+=L.initialSeparation}return t}(e,t),h:i,w:r},data:n}}var q=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;Object(o.a)(this,n),(a=t.call(this,e)).canvas=r.a.createRef(),a.canvasContainer=r.a.createRef(),a.renderStep=a.renderStep.bind(Object(u.a)(a)),a.checkLevelIntegrity=a.checkLevelIntegrity.bind(Object(u.a)(a)),a.changePos=a.changePos.bind(Object(u.a)(a)),a.getSVGCoords=a.getSVGCoords.bind(Object(u.a)(a)),a.highlightCut=a.highlightCut.bind(Object(u.a)(a)),a.modifyCanvas=a.modifyCanvas.bind(Object(u.a)(a)),a.getInsertionPoint=a.getInsertionPoint.bind(Object(u.a)(a)),a.requestInput=a.requestInput.bind(Object(u.a)(a)),a.cancelSelection=a.cancelSelection.bind(Object(u.a)(a)),a.createElement=a.createElement.bind(Object(u.a)(a)),a.clickedCanvas=a.clickedCanvas.bind(Object(u.a)(a)),a.initXY=Y,a.moveVars={},a.getSelection=a.getSelection.bind(Object(u.a)(a));var i=a.props.proof,s=i.premises,c=i.conclusion,l=i.steps,h=i.data,d=i.changeHistory;return a.state={proof:{premises:s,conclusion:c},changeHistory:d||[],redoHistory:[],steps:l||[],data:h||{},currentStep:0!==l.length?l.length-1:0,moveListeners:[],highlights:{cut:"none",var:"none",canvas:!1},cbFunction:null,finishCB:null,interaction:!0,functions:{insertion:function(){return _(Object(u.a)(a)).insertion()},erasure:function(){return _(Object(u.a)(a)).erasure()},iteration:function(){return _(Object(u.a)(a)).iteration()},deiteration:function(){return _(Object(u.a)(a)).deiteration()},doubleCutRemove:function(){return _(Object(u.a)(a)).doubleCutRemove()},doubleCutEnclose:function(){return _(Object(u.a)(a)).doubleCutEnclose()},doubleCutAdd:function(){return _(Object(u.a)(a)).doubleCutAdd()}},formula:"",eg:"",fitchNotation:!1},a}return Object(c.a)(n,[{key:"getInsertionPoint",value:function(e){var t=this,n=new Promise((function(e,n){t.setState({canvasCb:function(n,a){t.setState({canvasCb:null}),setTimeout((function(){t.state.cbFunction?(t.state.cbFunction(null),t.setState({cbFunction:null},(function(){return e({x:n,y:a})}))):e({x:n,y:a})}),50)}})}));return new Promise(function(){var a=Object(m.a)(p.a.mark((function a(r,i){var s;return p.a.wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,Promise.all([t.getSelection(Object(v.a)({cut:"all",var:"none",canvas:!0},e)),n]);case 2:s=a.sent,t.state.finishCB&&t.state.finishCB(),t.setState({highlights:{cut:"none",var:"none",canvas:!1},finishCB:null,canvasCb:null,interaction:!0,cbFunction:null},(function(){var e=Object(f.a)(s,2),t=e[0],n=e[1],a=n.x,i=n.y;r({id:t,x:a,y:i})}));case 5:case"end":return a.stop()}}),a)})));return function(e,t){return a.apply(this,arguments)}}())}},{key:"getSelection",value:function(e){var t=this;return new Promise((function(n,a){var r=t.state,i=r.steps;r.currentStep+1===i.length&&t.setState({highlights:e,interaction:!1,cbFunction:function(e){t.setState({highlights:{cut:"none",var:"none",canvas:!1},interaction:!0,cbFunction:null},(function(){return n(e)}))}})}))}},{key:"modifyCanvas",value:function(e,t){var n=this,a=this.state,r=a.steps,i=a.changeHistory;(i=i.slice()).push({steps:Array.from(r)}),this.setState({finishCB:t},(function(){n.state.functions[e]().then((function(t){n.state.finishCB&&n.state.finishCB(),t&&n.setState(Object(v.a)({changeHistory:i,redoHistory:[]},t),(function(){n.checkLevelIntegrity(),n.modifyCanvas(e,(function(){}))}))}))}))}},{key:"checkLevelIntegrity",value:function(){var e=this.state,t=e.steps,n=e.data,a=e.currentStep,r=t[a];t[a].data=function e(t,a){for(var r in t){var i=t[r],s=[];for(var o in i.type&&"cut"===i.type?(t[r].data=e(i.data,a+1),n[t[r].id].level=a,s.push(i.id)):s.push(i),s)n[s[o]].level=a}return t.length>1&&(t=t.filter((function(e){return e.id||!e.id&&"\xa0"!==n[e].var}))),t}(r.data,0),this.setState({steps:t,data:n})}},{key:"cancelSelection",value:function(){var e=this.state,t=e.cbFunction,n=e.canvasCb,a=e.finishCB;t&&t(),n&&n(),a&&a()}},{key:"changePos",value:function(e,t,n){var a=this.state.data;Object.assign(a[e],{x:t,y:n}),this.setState(a)}},{key:"highlightCut",value:function(e){if("all"===this.state.highlights.cut)return!0;var t=!1;return e%2===1&&(t=!0),!("odd"!==this.state.highlights.cut||!t)||"even"===this.state.highlights.cut&&!t}},{key:"highlightVar",value:function(e){if("all"===this.state.highlights.var)return!0;var t=!1;return e%2===1&&(t=!0),!("odd"!==this.state.highlights.var||!t)||"even"===this.state.highlights.var&&!t}},{key:"createElement",value:function(e,t,n,a,r){var i=this.state.data,s=X();i[s]={},i[s].x=a||0,i[s].y=r||0,i[s].type=t,i[s].var=e,n.push(s),this.setState({data:i})}},{key:"removeElement",value:function(e){this.state.steps[this.state.currentStep].push(e)}},{key:"renderStep",value:function(e){var t=this,n=this.state.data,a=this.state.steps[e];if(a){var i=function(e,n,a){var r=t.state.data;r[e].x=n,r[e].y=a,t.setState({data:r})},s=function e(a){var s=[];0===a.length&&t.createElement("\xa0","emptyvar",a,0,0);var o=function(o){if("cut"===a[o].type){var c=n[a[o].id].level,u=[];!function e(t){if(t.data)for(var n in t.data)e(t.data[n]);else u.push(t)}(a[o]);var l=r.a.createElement(B,{level:c,enableHighlight:t.highlightCut(c),id:a[o].id,panzoom:t.panzoom,getCoords:t.getSVGCoords,setCoords:function(e,n){u.forEach((function(a){t.moveVars[a](e,n)}))},key:a[o].id,selectedCallback:t.state.cbFunction},e(a[o].data));s.push(l)}else if("var"===t.state.data[a[o]].type){var h=t.state.data[a[o]],d=n[a[o]].level;s.unshift(r.a.createElement($,{x:h.x,y:h.y,id:a[o],enableHighlight:t.highlightVar(d),selectedCallback:t.state.cbFunction,panzoom:t.panzoom,interaction:t.state.interaction||t.highlightVar(d),getCoords:t.getSVGCoords,setCoords:function(e,t){return i(a[o],e,t)},subscribeMove:function(e){return t.moveVars[a[o]]=e},key:a[o]},h.var))}else if("emptyvar"===t.state.data[a[o]].type&&1===a.length){var p=t.state.data[a[o]];s.unshift(r.a.createElement($,{x:p.x,y:p.y,id:a[o],enableHighlight:!1,selectedCallback:function(){},panzoom:t.panzoom,interaction:t.state.interaction,getCoords:t.getSVGCoords,setCoords:function(e,t){return i(a[o],e,t)},subscribeMove:function(e){return t.moveVars[a[o]]=e},key:a[o]},p.var))}};for(var c in a)o(c);return s};return s.bind(this),s(a.data)}}},{key:"componentDidMount",value:function(){this.panzoom=V()(this.canvas.current,{maxZoom:6,minZoom:.5});var e=Math.max(document.documentElement.clientWidth,window.innerWidth||0),t=Math.max(document.documentElement.clientHeight,window.innerHeight||0),n=this.state.steps;if(0===n.length){var a=this.state.proof.premises;console.log(a),console.log(a.join("")),console.log(R(a.join("")));var r=Y(R(a.join("")),0),i=r.stepZero,s=r.data;n.push(i),this.setState({steps:n,data:s})}this.setState({});var o=this.state.steps[this.state.currentStep];this.panzoom.moveTo(e/2-o.w,t/2-o.h),this.panzoom.zoomTo(e/2-o.w,t/2-o.h,2)}},{key:"componentWillUnmount",value:function(){window.removeEventListener("resize",this)}},{key:"getSVGCoords",value:function(e,t){var n=this.canvasContainer.current.createSVGPoint();return n.x=e,n.y=t,n.matrixTransform(this.canvas.current.getScreenCTM().inverse())}},{key:"clickedCanvas",value:function(e){if(this.state.canvasCb){var t=this.getSVGCoords(e.pageX,e.pageY),n=t.x,a=t.y;this.state.canvasCb(n,a)}}},{key:"requestInput",value:function(){var e=this;return new Promise((function(t,n){e.setState({showOverlay:!0,cbFunction:function(n){t(null==n?null:n),e.setState({showOverlay:!1,cbFunction:null})}})}))}},{key:"render",value:function(){var e=this,t=this.state,n=t.proof,a=t.data,i=t.steps,s=t.currentStep,o=(t.highlight,t.showOverlay),c=t.changeHistory;this.props.saveProof(Object(v.a)({},n,{data:a,steps:i,changeHistory:c}));var u=function(){};this.panzoom&&(u=this.panzoom.zoomWithWheel);var l=z(this.state.formula),h=F(this.state.formula);return r.a.createElement(U.CSSTransitionGroup,{transitionName:"fadein",transitionAppear:!0,transitionAppearTimeout:500,transitionEnter:!1,transitionLeaveTimeout:300},r.a.createElement("div",{className:"insertOverlay".concat(o?" shown":"")},r.a.createElement("h2",null,"Fitch-Style Formula to Insert"),!1,r.a.createElement("div",null,r.a.createElement("table",null,r.a.createElement("tbody",null,r.a.createElement("tr",null,r.a.createElement("td",{style:{width:"40%"}},r.a.createElement("input",{onChange:function(t){return e.setState({formula:t.target.value,eg:F(t.target.value)})}})),r.a.createElement("td",null,l&&r.a.createElement(Z.a,{math:l}))),r.a.createElement("tr",null))),"To insert: ",h&&r.a.createElement(Z.a,{math:h})),!1,r.a.createElement("span",{className:"buttons"},r.a.createElement("button",{onClick:function(){return e.state.cbFunction(e.state.eg)}},"Insert"),r.a.createElement("button",{onClick:function(){return e.state.cbFunction(null)}},"Cancel"))),r.a.createElement("div",{key:"main-div",className:"mainCanvas noselect".concat(o?" disabled":"")},r.a.createElement(W,{menuItems:this.props.menuItems}),r.a.createElement(M,{hidden:s+1!==i.length,functions:this.state.functions,modifyCanvas:this.modifyCanvas,cancelSelection:this.cancelSelection}),r.a.createElement("svg",{ref:this.canvasContainer,className:"canvas noselect",onWheel:u,onClick:this.clickedCanvas,onMouseEnter:function(){return e.setState({highlight:!0})},onMouseLeave:function(){return e.setState({highlight:!1})},style:this.state.canvasCb?{cursor:"crosshair",backgroundColor:"white"}:{}},r.a.createElement("g",{ref:this.canvas},this.panzoom&&this.renderStep(this.state.currentStep))),r.a.createElement(H,{currentStep:this.state.currentStep,stepInfo:this.state.steps,setStep:function(t){return e.setState({currentStep:t,interaction:t===e.state.steps.length-1})},state:this.state,setState:function(t,n,a){e.setState({changeHistory:t,steps:n,redoHistory:a,currentStep:n.length-1})}})))}}]),n}(r.a.Component),Q=(n(60),function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).state={premises:[""],conclusion:""},a.handleChange.bind(Object(u.a)(a)),a.removePremise.bind(Object(u.a)(a)),a.verify=a.verify.bind(Object(u.a)(a)),a.create=a.create.bind(Object(u.a)(a)),a.filename=r.a.createRef(),a}return Object(c.a)(n,[{key:"componentDidMount",value:function(){}},{key:"handleChange",value:function(e,t){if(null!=t){var n=this.state.premises;n[t]=e.target.value,this.setState({premises:n})}else this.setState({conclusion:e.target.value})}},{key:"removePremise",value:function(e){var t=this.state.premises;t.splice(e,1),this.setState({premises:t})}},{key:"verify",value:function(){var e=this.state,t=e.premises,n=e.conclusion;for(var a in t)if(""===t[a]||!t[a])return!1;return!(""===n||!n)}},{key:"create",value:function(){if(console.log("Creating..."),console.log("Verification concluded "+this.verify()),this.verify()){var e=this.state,t=e.premises,n=e.conclusion;for(var a in t)t[a]=F(t[a]),console.log(t[a]);n=F(n),this.props.setupFunc(this.filename.current.value,{premises:t,conclusion:n,steps:[]})}}},{key:"getFormulaCell",value:function(e,t){var n,a,i=this;w(e)&&(n=z(e),a=F(e));var s=r.a.createElement("td",{className:"close interactive",onClick:function(){return i.removePremise(t)}},"\u2715"),o=r.a.createElement("input",{onChange:function(e){return i.handleChange(e,t)}});return null==t&&(o=r.a.createElement("input",{onChange:function(e){return i.handleChange(e)}}),s=r.a.createElement("td",{className:"close"})),0===t&&(s=r.a.createElement("td",{className:"close"})),r.a.createElement("tr",null,r.a.createElement("td",null,o),r.a.createElement("td",null,n&&r.a.createElement(Z.a,{math:n})),r.a.createElement("td",null,a&&r.a.createElement(Z.a,{math:a})),s)}},{key:"render",value:function(){var e=this,t=this.state,n=t.premises,a=t.conclusion;return r.a.createElement("div",{className:"content full-width"},r.a.createElement("h1",null,"Create New"),r.a.createElement("h2",null,"File Name"),r.a.createElement("input",{ref:this.filename}),r.a.createElement("table",{className:"formulaTable"}),r.a.createElement("h2",null,"Premises"),r.a.createElement("table",{className:"formulaTable"},r.a.createElement("tbody",null,r.a.createElement("tr",null,r.a.createElement("td",null,"Formula"),r.a.createElement("td",null,"TeX notation"),r.a.createElement("td",null,"EG notation"),r.a.createElement("td",{className:"close"})),n.map((function(t,n){return e.getFormulaCell(t,n)})),r.a.createElement("tr",null,r.a.createElement("td",{className:"interactive",onClick:function(){return e.setState({premises:n.concat([""])})}},r.a.createElement("span",{className:"plus"}),"Add New Premise"),r.a.createElement("td",null),r.a.createElement("td",null),r.a.createElement("td",{className:"close"})))),r.a.createElement("h2",null,"Conclusion"),r.a.createElement("table",{className:"formulaTable"},r.a.createElement("tbody",null,this.getFormulaCell(a))))}}]),n}(r.a.Component)),K=(n(61),function(e){var t=e.recentDocs;return r.a.createElement("div",{className:"content"},r.a.createElement("div",{className:"column"},r.a.createElement("h1",null,"Existential Graphs"),r.a.createElement("p",null,"Using this tool, you can initialize proofs in the existential graph schema and then you can go through the process of solving them. You can save these proofs and look back at them later.")),r.a.createElement("div",{className:"divider"}),r.a.createElement("div",{className:"column"},r.a.createElement("h1",null,"Recent Proofs"),Object.keys(t).map((function(e){return r.a.createElement("div",{className:"proofField",style:{display:"flex",justifyContent:"space-between"}},r.a.createElement("span",{onClick:function(){return t[e].open()}},e),r.a.createElement("span",{style:{color:"gray"},onClick:function(){return t[e].delete()}},"Delete"))}))))}),ee=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).createView=r.a.createRef(),a.callCreate=a.callCreate.bind(Object(u.a)(a)),a.animateAway=a.animateAway.bind(Object(u.a)(a)),a.openFile=a.openFile.bind(Object(u.a)(a)),a.state={createShown:!1,floatingWindowCSS:"floating-window shown"},a}return Object(c.a)(n,[{key:"componentDidMount",value:function(){}},{key:"animateAway",value:function(){this.setState({floatingWindowCSS:"floating-window"})}},{key:"callCreate",value:function(){this.createView.current.create()}},{key:"openFile",value:function(){var e=this,t=document.createElement("input");t.setAttribute("type","file"),t.setAttribute("accept",".egprf"),t.onchange=function(t){console.log("ONCHANGE"),t.stopPropagation(),t.preventDefault();var n=t.target.files[0];console.log(n);var a=new FileReader;a.addEventListener("load",(function(t){try{var a=JSON.parse(t.target.result);console.log(a),e.props.setupFunc(n.name.split(".egprf")[0],a)}catch(r){console.error(r),alert("Corrupt file or improper formatting.")}})),a.readAsText(n)},t.click()}},{key:"render",value:function(){var e=this,t=this.state,n=t.createShown,a=t.floatingWindowCSS;return r.a.createElement("div",{className:a},!n&&r.a.createElement(K,{recentDocs:this.props.recentDocs}),n&&r.a.createElement(Q,{setupFunc:this.props.setupFunc,ref:this.createView}),!n&&r.a.createElement("div",{className:"toolbar"},r.a.createElement("button",{onClick:function(){return e.setState({createShown:!0})}},"New"),r.a.createElement("button",{onClick:this.openFile},"Open")),n&&r.a.createElement("div",{className:"toolbar"},r.a.createElement("button",{className:"back",onClick:function(){return e.setState({createShown:!1})}},r.a.createElement("span",null,r.a.createElement(A.a,{className:"svg",src:"/existential-graphs/assets/back-caret.svg"})),"Back"),r.a.createElement("button",{onClick:this.callCreate},"Create")))}}]),n}(r.a.Component),te=window.localStorage,ne=function(e){Object(l.a)(n,e);var t=Object(h.a)(n);function n(e){var a;return Object(o.a)(this,n),(a=t.call(this,e)).createNewProof=a.createNewProof.bind(Object(u.a)(a)),a.setupProof=a.setupProof.bind(Object(u.a)(a)),a.openCanvas=a.openCanvas.bind(Object(u.a)(a)),a.saveProof=a.saveProof.bind(Object(u.a)(a)),a.getRecents=a.getRecents.bind(Object(u.a)(a)),a.introWindow=r.a.createRef(),a.state={initialCSS:"initial",canvasOpen:!1,popupOpen:!1,filename:"",proof:{premises:[],conclusion:"",steps:[]},recentDocs:a.getRecents()},console.log(a.state.recentDocs),a.menuItems=[{title:"Exit",func:function(){a.setState({initialCSS:"initial",canvasOpen:!1,popupOpen:!1,filename:"",proof:{premises:[],conclusion:"",steps:[]},recentDocs:a.getRecents()})}},"separator",{title:"Export",func:function(){var e=document.createElement("a"),t=new Blob([JSON.stringify(a.state.proof)],{type:"text/plain"});e.href=URL.createObjectURL(t),e.download=a.state.filename+".egprf",document.body.appendChild(e),e.click()}}],a}return Object(c.a)(n,[{key:"getRecents",value:function(){var e=this,t=te.getItem("recentDocs");t=t?JSON.parse(t):{};var n=Object.keys(t),a=function(a){t[n[a]].open=function(){e.setState({filename:n[a],proof:t[n[a]]}),e.openCanvas()},t[n[a]].delete=function(){var t=te.getItem("recentDocs");delete(t=t?JSON.parse(t):{})[n[a]],te.setItem("recentDocs",JSON.stringify(t)),e.setState({recentDocs:t})}};for(var r in n)a(r);return t}},{key:"saveProof",value:function(e){var t=this.state.recentDocs;return t[e]=this.state.proof,function(n){t[e]=n,te.setItem("recentDocs",JSON.stringify(t))}}},{key:"setupProof",value:function(e,t){this.setState({filename:e,proof:t}),this.openCanvas()}},{key:"openCanvas",value:function(){var e=this;this.setState({initialCSS:"initial whiteBG"}),this.introWindow.current.animateAway(),setTimeout((function(){return e.setState({canvasOpen:!0})}),1e3)}},{key:"createNewProof",value:function(){this.setState({popupOpen:!0})}},{key:"render",value:function(){return this.state.canvasOpen?r.a.createElement("div",{className:"App"},r.a.createElement(q,{menuItems:this.menuItems,saveProof:this.saveProof(this.state.filename),proof:this.state.proof})):r.a.createElement("div",{className:this.state.initialCSS},r.a.createElement(ee,{ref:this.introWindow,recentDocs:this.state.recentDocs,setupFunc:this.setupProof}))}}]),n}(r.a.Component);Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));s.a.render(r.a.createElement(ne,null),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))}},[[27,1,2]]]); +//# sourceMappingURL=main.dbec2f34.chunk.js.map \ No newline at end of file diff --git a/static/js/main.dbec2f34.chunk.js.map b/static/js/main.dbec2f34.chunk.js.map new file mode 100644 index 0000000..eb3e4d8 --- /dev/null +++ b/static/js/main.dbec2f34.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["verifySentence.js","converters.js","canvas/Toolbox.js","canvas/StepMenu.js","canvas/config.js","canvas/EGVariable.js","canvas/EGCut.js","canvas/DropdownMenu.js","canvas/manipulate.js","canvas/Canvas.js","intro/CreateNew.js","intro/IntroWindow.js","App.js","serviceWorker.js","index.js"],"names":["require","binary","unary","arrToRegex","arr","map","el","replace","join","uReg","Object","keys","regexStr","binaryRegex","RegExp","atomicRegex","parenthesisRegex","sentence","verifyRecursive","res","match","exec","operators","escapeRegExp","string","binarySymbReplace","unaryOperators","convertToTeX","formula","String","symbol","substr","length","i","convertToEG","verifySentence","atom","left","right","eg","includes","convertToArray","consume","c","substring","parseExpression","expr","push","st","concat","console","log","Toolbox","props","state","selected","functions","str","func","this","hidden","modifyCanvas","cancelSelection","Fragment","className","ref","canvas","style","backgroundColor","onClick","setState","React","Component","StepMenu","performRedo","bind","performUndo","event","step","disabled","preventDefault","setStep","evt","changeHistory","steps","redoHistory","prev","pop","prevSteps","obj","hide","currentStep","stepInfo","backEnabled","forwardEnabled","color","getColor","handleClick","src","process","disable","gridSize","cutPadding","horizontal","vertical","cutCornerRadius","initialSeparation","EGVariable","text","createRef","getCoords","x","y","cursorOver","dragging","panzoom","window","addEventListener","onMouseMove","handleDragStart","handleDragEnd","enableHighlight","selectedCallback","id","current","cursor","subscribeMove","newx","newy","setCoords","pause","resume","clientX","clientY","Math","round","config","removeEventListener","highlight","reject","fill","onMouseEnter","onMouseLeave","children","EGCut","cut","BB","getBBoxData","update","bounding","_x","_y","_w","_h","getBBox","width","height","interval","setInterval","setTimeout","clearInterval","x_orig","y_orig","stroke","fillOpacity","strokeOpacity","e","rx","toString","ry","DropdownMenu","menuItems","title","nanoid","getSelection","getInsertionPoint","requestInput","initXY","insertion","a","data","copyStep","pt","input","initializedData","level","insert","findID","stepZero","type","iteration","copyID","insertData","insertID","isInNestedGraph","findParent","copy","copyContents","newCopyID","deiteration","deiterID","erased","equalTrees","tree1","tree2","var","matchedIDs","branch","secondTree","j","matchBranch","every","Boolean","checkForSubgraph","structure","tree","subtree","parent","index","indexOf","splice","erasure","doubleCutEnclose","inside","cut1_id","cut2_id","cut1","changeCutLevel","doubleCutAdd","empty_id","doubleCutRemove","firstCut","secondCut","newContents","childID","parentID","parentStep","copyDataMap","newMap","m","copyDataArray","newArr","newStep","change","idFound","changeLevelArray","changeLevelMap","mapID","oldStep","oldData","newData","d","h","w","searchedStep","findInArray","findInMap","findIDArray","s","findIDMap","Array","offsetPosition","currentX","maxX","maxY","initXYRecurse","gapSize","X","Canvas","canvasContainer","renderStep","checkLevelIntegrity","changePos","getSVGCoords","highlightCut","createElement","clickedCanvas","moveVars","proof","premises","conclusion","moveListeners","highlights","cbFunction","finishCB","interaction","manipulate","fitchNotation","cutConfig","getCanvasInsertion","Promise","resolve","canvasCb","all","selectConfig","nameOfFunction","finishedCb","slice","from","then","verifyLevel","dobj","ob","ids","filter","assign","odd","stepIndex","setXY","renderRecurse","jsx","getIds","groupElement","forEach","key","unshift","highlightVar","f","Panzoom","maxZoom","minZoom","vw","max","document","documentElement","clientWidth","innerWidth","vh","clientHeight","innerHeight","moveTo","zoomTo","domX","domY","createSVGPoint","matrixTransform","getScreenCTM","inverse","pageX","pageY","showOverlay","saveProof","zoomWithWheel","tex","transitionName","transitionAppear","transitionAppearTimeout","transitionEnter","transitionLeaveTimeout","onChange","target","value","math","onWheel","newSteps","CreateNew","handleChange","removePremise","verify","create","filename","setupFunc","closeBtn","formulaInput","getFormulaCell","IntroContent","recentDocs","name","display","justifyContent","open","delete","IntroWindow","createView","callCreate","animateAway","openFile","createShown","floatingWindowCSS","setAttribute","onchange","stopPropagation","file","files","reader","FileReader","JSON","parse","result","split","error","alert","readAsText","click","localStorage","App","createNewProof","setupProof","openCanvas","getRecents","introWindow","initialCSS","canvasOpen","popupOpen","element","Blob","stringify","href","URL","createObjectURL","download","body","appendChild","recents","getItem","rArray","setItem","location","hostname","ReactDOM","render","getElementById","navigator","serviceWorker","ready","registration","unregister","catch","message"],"mappings":"qwBAQ0BA,EAAQ,IAA1BC,E,EAAAA,OAAQC,E,EAAAA,MAMhB,SAASC,EAAWC,GAElB,MAAO,OADPA,EAAMA,EAAIC,KAAI,SAAAC,GAAE,OAAiBA,EAJnBC,QAAQ,sBAAuB,YAK1BC,KAAK,KAAO,IAGjC,IAAMC,EAAON,EAAWO,OAAOC,KAAKT,IAC9BU,EAAQ,YAAQH,EAAR,sBAA0BA,EAA1B,wBAA8CN,EAAWO,OAAOC,KAAKV,IAArE,aAAkFQ,EAAlF,sBAAoGA,EAApG,iBACVI,EAAc,IAAIC,OAAOF,GACzBG,EAAc,IAAID,OAAJ,gBACdE,EAAmB,IAAIF,OAAJ,WAAeL,EAAf,iBAwBR,eAACQ,GAGd,OAzBF,SAASC,EAAgBD,GACvB,IAAIE,EACJ,QAAIF,EAASG,MAAML,KAC6B,QAAtCI,EAAMN,EAAYQ,KAAKJ,IACpB,MAAPE,IACAA,EAAI,IAAMA,EAAI,GACTD,EAAgBC,EAAI,KAAOD,EAAgBC,EAAI,IAC/CA,EAAI,GACJD,EAAgBC,EAAI,KACpBA,EAAI,IACJD,EAAgBC,EAAI,KAEwB,QAA3CA,EAAMH,EAAiBK,KAAKJ,IAC/BC,EAAgBC,EAAI,SADtB,GAaAD,CADPD,EAAWA,EAASV,QAAQ,MAAO,MC3C/Be,EAAYtB,EAAQ,IAW1B,SAASuB,EAAaC,GACpB,OAAOA,EAAOjB,QAAQ,sBAAuB,QAO/C,IAAII,EAAOD,OAAOC,KAAKW,EAAUrB,QACjCU,EAAOA,EAAKN,KAAI,SAAAC,GAAE,OAAIiB,EAAajB,MACnC,IAAMmB,EAAoB,IAAIX,OAAO,MAAQH,EAAKH,KAAK,KAAO,IAAK,KAC7DkB,EAAiBJ,EAAUpB,MAM3ByB,EAAe,SAACC,GACpB,GAAuB,kBAAZA,GAAwBA,aAAmBC,OAAQ,CAG5D,IAAIC,EAEJ,IAHAF,EAAUA,EAAQrB,QAAQ,MAAO,IAGqB,QAA9CuB,EAASL,EAAkBJ,KAAKO,KACtCA,EAAUA,EAAQG,OAAO,EAAED,EAAM,OACjBR,EAAUrB,OAAO6B,EAAO,IAAM,IAC9BF,EAAQG,OAAOD,EAAM,MAAYA,EAAO,GAAGE,QAG7D,IAAK,IAAIC,KAAKvB,OAAOC,KAAKe,GACxBI,EAASpB,OAAOC,KAAKe,GAAgBO,GACrCL,EAAUA,EAAQrB,QAAQ,IAAIO,OAAOS,EAAaO,GAAS,KAAMJ,EAAeI,GAAU,KAI5F,OADAF,EAAUA,EAAQrB,QAAQ,mBAAoB,IAG3C,MAAO,IAyBd,IAgBM2B,EAAc,SAAdA,EAAeN,GACnB,IAAKO,EAAeP,GAAU,OAAO,KACrC,IAAwB,kBAAZA,GAAwBA,aAAmBC,SAAWM,EAAeP,GAAU,CAEzFA,EAAUA,EAAQrB,QAAQ,MAAO,IACjC,IAAIN,EAASY,EAAYQ,KAAKO,GAE1BQ,GADcpB,EAAiBK,KAAKO,GAC7Bb,EAAYM,KAAKO,IAC5B,GAAI3B,EAAQ,CACV,IAAIoC,EAAOH,EAAYjC,EAAO,IAC1BqC,EAAQJ,EAAYjC,EAAO,IAE/B,OADoBqB,EAAUiB,GAAGtC,EAAO,IACnBM,QAAQ,OAAQ8B,GAAM9B,QAAQ,OAAQ+B,GACtD,GAAmB,MAAfV,EAAQ,GAAY,CAC7B,IAAIT,EAAMe,EAAYN,EAAQG,OAAO,EAAEH,EAAQI,OAAO,IACtD,OAAIb,GACQ,KACP,GAAIT,OAAOC,KAAKe,GAAgBc,SAASZ,EAAQ,IAAK,CAC3D,IAAIT,EAAMe,EAAYN,EAAQG,OAAO,IACrC,OAAIZ,EAAY,IAAMA,EAAM,IAChB,KACP,OAAIiB,EACF,IAAMA,EAAK,GAAK,IAElB,KACF,OAAO,MAYVK,EAAiB,SAACb,GACtB,GAAuB,kBAAZA,GAAwBA,aAAmBC,OAAQ,KAEnDa,EAAT,SAAiBC,GACf,OAAIf,EAAQI,OAAS,GAAKW,IAAMf,EAAQ,KACtCA,EAAUA,EAAQgB,UAAU,IACrB,IA4BX,OAvBA,SAASC,EAAgBC,GAEvB,IADA,IAAI1C,EAAM,KACG,CACX,GAAIsC,EAAQ,MAEV,GADAtC,EAAI2C,KAAKF,EAAgBjB,KACpBc,EAAQ,KACX,OAAO,UACJ,GAAIA,EAAQ,KAAM,CAEvB,IADA,IAAIM,EAAK,GACFpB,EAAQI,OAAS,IAAMU,EAAQ,MACpCM,EAAKA,EAAGC,OAAOrB,EAAQ,IACvBA,EAAUA,EAAQgB,UAAU,GAEZ,IAAdI,EAAGhB,QAAc5B,EAAI2C,KAAK,QAC9B3C,EAAI2C,KAAKC,GAGX,GAAuB,IAAnBpB,EAAQI,QAAgC,MAAfJ,EAAQ,IAA6B,MAAfA,EAAQ,GACzD,MAGJ,OAAOxB,EAEFyC,GAEJ,OAAO,MAGdK,QAAQC,IAAIV,EAAe,uC,ICjGZW,E,kDAvEb,WAAYC,GAAQ,IAAD,8BACjB,cAAMA,IACDC,MAAQ,CACXC,SAAU,KACVC,UAAW,CACT,CACEC,IAAK,UACLC,KAAM,aAER,CACED,IAAK,YACLC,KAAM,eAER,CACED,IAAK,qBACLC,KAAM,oBAER,CACED,IAAK,iBACLC,KAAM,gBAER,CACED,IAAK,oBACLC,KAAM,mBAER,CACED,IAAK,YACLC,KAAM,aAER,CACED,IAAK,UACLC,KAAM,aA/BK,E,kGAwCT,IAAD,SACyCC,KAAKN,MAA/CO,EADC,EACDA,OAAQC,EADP,EACOA,aAAcC,EADrB,EACqBA,gBACtBP,EAAaI,KAAKL,MAAlBC,SACN,OAAIK,EAAe,kBAAC,IAAMG,SAAP,MAEjB,yBAAKC,UAAU,UAAUC,IAAKN,KAAKO,QACjC,qCACCP,KAAKL,MAAME,UAAUnD,KAAI,SAACC,EAAI2B,GAAL,OACxB,yBACE+B,UAAU,OACVG,MAAOZ,IAAatB,EAAI,CAAEmC,gBAAiB,WAAc,GACzDC,QAAS,WACH,EAAKf,MAAMC,WAAatB,GAC1B,EAAKqC,SAAS,CAAEf,SAAU,OAC1BO,MAGA,EAAKQ,SAAS,CAAEf,SAAUtB,IAC1B4B,EAAavD,EAAGoD,MAAM,kBAM1BpD,EAAGmD,a,GAjEOc,IAAMC,W,OC8FbC,E,kDA5Fb,WAAYpB,GAAQ,IAAD,8BACjB,cAAMA,IAEDqB,YAAc,EAAKA,YAAYC,KAAjB,gBACnB,EAAKC,YAAc,EAAKA,YAAYD,KAAjB,gBACnB,EAAKrB,MAAQ,GALI,E,wDAQPuB,EAAOC,EAAMC,GACvBF,EAAMG,iBACDD,GAGHpB,KAAKN,MAAM4B,QAAQH,K,kCAIXI,GAAM,IAAD,EAC6BvB,KAAKN,MAAMC,MAAjD6B,EADS,EACTA,cAAeC,EADN,EACMA,MAAOC,EADb,EACaA,YACxBC,EAAOH,EAAcI,MAErBD,IACFD,EAAYtC,KAAKqC,GACjBzB,KAAKN,MAAMiB,SAASa,EAAeG,EAAKF,MAAOC,M,kCAIvCH,GAAM,IAAD,EAC6BvB,KAAKN,MAAMC,MAAjD6B,EADS,EACTA,cAAeC,EADN,EACMA,MAAOC,EADb,EACaA,YACxBG,EAAYH,EAAYE,MAExBC,IACFL,EAAcpC,KAAK,CAAEsC,cAAaD,UAClCzB,KAAKN,MAAMiB,SAASa,EAAeK,EAAWH,M,+BAIzCN,GACP,OAAOA,EAAW,qBAAuB,oB,8BAGnC/B,EAAIyC,GACV,OAAOzC,EAAGC,OAAOwC,EAAIzD,OAAS,EAAI,GAAK,e,+BAG/B,IAAD,SACsC2B,KAAKN,MAA5CqC,EADC,EACDA,KAAMC,EADL,EACKA,YAAaC,EADlB,EACkBA,SAAUtC,EAD5B,EAC4BA,MAC7B6B,EAA+B7B,EAA/B6B,cAAeE,EAAgB/B,EAAhB+B,YACrB,GAAIK,EAAM,OAAQ,kBAAC,IAAM3B,SAAP,MAClB,IAAI8B,EAAcF,IAAiBC,EAAS5D,OAAS,EACjD8D,EAAiC,IAAhBH,EACrB,OACE,kBAAC,IAAM5B,SAAP,KACE,yBAAKC,UAAU,aACf,yBAAKG,MAAO,CAAE4B,MAAOpC,KAAKqC,SAASF,KACjC,yBAAKzB,QAAS,SAACQ,GAAD,OAAW,EAAKoB,YAAYpB,EAAO,EAAGiB,KAClD,kBAAC,IAAD,CAAUI,IAAKC,+CAEjB,yBAAK9B,QAAS,SAACQ,GAAD,OAAW,EAAKoB,YAAYpB,EAAOc,EAAc,EAAGG,KAChE,kBAAC,IAAD,CAAUI,IAAKC,+CAGnB,6BACE,yBAAKnC,UAAWL,KAAKyC,QAAQ,WAAYjB,GAAgBd,QAASV,KAAKiB,aACrE,yBAAKZ,UAAU,YACb,kBAAC,IAAD,CAAUkC,IAAKC,0CAGnB,yBAAKnC,UAAWL,KAAKyC,QAAQ,WAAYf,GAAchB,QAASV,KAAKe,aACnE,yBAAKV,UAAU,YACb,kBAAC,IAAD,CAAUkC,IAAKC,2CAKrB,yBAAKhC,MAAO,CAAE4B,MAAOpC,KAAKqC,SAASH,KACjC,yBAAKxB,QAAS,SAACQ,GAAD,OAAW,EAAKoB,YAAYpB,EAAOc,EAAc,EAAGE,KAChE,kBAAC,IAAD,CAAUK,IAAKC,8CAEjB,yBAAK9B,QAAS,SAACQ,GAAD,OAAW,EAAKoB,YAAYpB,EAAOe,EAAS5D,OAAS,EAAG6D,KACpE,kBAAC,IAAD,CAAUK,IAAKC,gDAInB,yBAAKnC,UAAU,aAAf,QACQ2B,EAAc,EADtB,OAC6BC,EAAS5D,a,GAtFvBuC,IAAMC,WCHd,GACb6B,SAAU,EACVC,WAAY,CACVC,WAAY,GACZC,SAAU,GAEZC,gBAAiB,GACjBC,kBAAmB,IC0FNC,E,kDA7Fb,WAAYtD,GAAQ,IAAD,8BACjB,cAAMA,IACDuD,KAAOrC,IAAMsC,YAClB,EAAKC,UAAY,EAAKzD,MAAMyD,UAC5B,EAAKb,YAAc,EAAKA,YAAYtB,KAAjB,gBACnB,EAAKrB,MAAQ,CACXyD,EAAG1D,EAAM0D,EACTC,EAAG3D,EAAM2D,EACTC,YAAY,EACZC,UAAU,GAGZ,EAAKC,QAAU,EAAK9D,MAAM8D,QAE1BC,OAAOC,iBAAiB,YAAa,EAAKC,YAAY3C,KAAjB,iBACrCyC,OAAOC,iBAAiB,YAAa,EAAKE,gBAAgB5C,KAArB,iBACrCyC,OAAOC,iBAAiB,UAAW,EAAKG,cAAc7C,KAAnB,iBACnCyC,OAAOC,iBAAiB,QAAS,EAAKpB,aAjBrB,E,0DAqBbtC,KAAKL,MAAM2D,YACVtD,KAAKN,MAAMoE,iBACX9D,KAAKN,MAAMqE,mBAEd/D,KAAKN,MAAMqE,iBAAiB/D,KAAKN,MAAMsE,IACvChE,KAAKW,SAAS,CAAE2C,YAAY,O,0CAIX,IAAD,OAClBtD,KAAKiD,KAAKgB,QAAQzD,MAAM0D,OAAS,UACjClE,KAAKN,MAAMyE,eAAc,SAACf,EAAEC,GAC1B,IAAIe,EAAO,EAAKzE,MAAMyD,EAAIA,EACtBiB,EAAO,EAAK1E,MAAM0D,EAAIA,EAC1B,EAAK3D,MAAM4E,UAAUF,EAAMC,GAC3B,EAAK1D,SAAS,CAAEyC,EAAGgB,EAAMf,EAAGgB,S,sCAIhB9C,GACVvB,KAAKL,MAAM2D,aACbtD,KAAKwD,QAAQe,QACbvE,KAAKW,SAAS,CAAE4C,UAAU,O,oCAIhBhC,GACZvB,KAAKwD,QAAQgB,SADI,MAEFxE,KAAKL,MAAdyD,EAFW,EAEXA,EAAGC,EAFQ,EAERA,EACTrD,KAAKN,MAAM4E,UAAUlB,EAAGC,GACxBrD,KAAKW,SAAS,CAAE4C,UAAU,M,kCAGhBhC,GACV,GAAIvB,KAAKL,MAAM4D,SAAU,CAAC,IAAD,EACRvD,KAAKmD,UAAU5B,EAAIkD,QAASlD,EAAImD,SAAzCtB,EADiB,EACjBA,EAAGC,EADc,EACdA,EACTD,EAAIuB,KAAKC,MAAMxB,EAAEyB,EAAOnC,UAAUmC,EAAOnC,SACzCW,EAAIsB,KAAKC,MAAMvB,EAAEwB,EAAOnC,UAAUmC,EAAOnC,SACzC1C,KAAKN,MAAM4E,UAAUlB,EAAGC,GACxBrD,KAAKW,SAAS,CAAEyC,EAAGA,EAAGC,EAAGA,O,6CAK3BI,OAAOqB,oBAAoB,QAAS9E,KAAKsC,aACzCmB,OAAOqB,oBAAoB,YAAa9E,KAAK2D,YAAY3C,KAAKhB,OAC9DyD,OAAOqB,oBAAoB,YAAa9E,KAAK4D,gBAAgB5C,KAAKhB,OAClEyD,OAAOqB,oBAAoB,UAAW9E,KAAK6D,cAAc7C,KAAKhB,S,+BAGtD,IAAD,OACH+E,EAAY/E,KAAKL,MAAM2D,YAActD,KAAKN,MAAMoE,gBAChDkB,EAAwC,MAA/BhF,KAAKN,MAAMqE,kBAA4B/D,KAAKL,MAAM2D,aAAetD,KAAKN,MAAMoE,gBACrFmB,EAAO,QAGX,OAFIF,EAAWE,EAAO,OACbD,IAAQC,EAAO,OAEtB,0BACE5E,UAAU,WACV+C,EAAGpD,KAAKL,MAAMyD,EACdC,EAAGrD,KAAKL,MAAM0D,EACdW,GAAIhE,KAAKN,MAAMsE,GACfiB,KAAMA,EACNC,aAAc,kBAAM,EAAKvE,SAAS,CAAE2C,YAAY,KAChD6B,aAAc,kBAAM,EAAKxE,SAAS,CAAE2C,YAAY,KAChDhD,IAAKN,KAAKiD,MACTjD,KAAKN,MAAM0F,c,GAxFKxE,IAAMC,WC+HhBwE,E,kDA9Hb,WAAY3F,GAAQ,IAAD,8BACjB,cAAMA,IACD4F,IAAM1E,IAAMsC,YACjB,EAAKqC,GAAK3E,IAAMsC,YAChB,EAAKsC,YAAc,EAAKA,YAAYxE,KAAjB,gBACnB,EAAKsB,YAAc,EAAKA,YAAYtB,KAAjB,gBACnB,EAAKyE,OAAS,EAAKA,OAAOzE,KAAZ,gBACd,EAAKmC,UAAY,EAAKzD,MAAMyD,UAC5B,EAAKxD,MAAQ,CACXoF,WAAW,EACXzB,YAAY,EACZoC,SAAU,CAACC,GAAG,EAAEC,GAAG,EAAEC,GAAG,EAAEC,GAAG,IAG/B,EAAKtC,QAAU,EAAK9D,MAAM8D,QAE1BC,OAAOC,iBAAiB,QAAS,EAAKpB,aACtCmB,OAAOC,iBAAiB,YAAa,EAAKC,YAAY3C,KAAjB,iBACrCyC,OAAOC,iBAAiB,YAAa,EAAKE,gBAAgB5C,KAArB,iBACrCyC,OAAOC,iBAAiB,UAAW,EAAKG,cAAc7C,KAAnB,iBAnBlB,E,0DAuBbhB,KAAKL,MAAM2D,YACVtD,KAAKN,MAAMoE,iBACX9D,KAAKN,MAAMqE,mBAEd/D,KAAKN,MAAMqE,iBAAiB/D,KAAKN,MAAMsE,IACvChE,KAAKW,SAAS,CAAE2C,YAAY,O,oCAK9B,GAAItD,KAAKsF,IAAIrB,QAAS,CAAC,IAAD,EACUjE,KAAKsF,IAAIrB,QAAQ8B,UAAzC3C,EADc,EACdA,EAAGC,EADW,EACXA,EAAG2C,EADQ,EACRA,MAAOC,EADC,EACDA,OAKnB,MAAO,CAAEN,GAJAvC,EAAIyB,EAAOlC,WAAWC,WAIlBgD,GAHJvC,EAAIwB,EAAOlC,WAAWE,SAGdgD,GAFRG,EAAuC,EAA/BnB,EAAOlC,WAAWC,WAEdkD,GADZG,EAAsC,EAA7BpB,EAAOlC,WAAWE,UAGtC,MAAO,K,+BAGC,IAAD,OACF7C,KAAKkG,WACRlG,KAAKkG,SAAWC,aAAY,WAC1B,EAAKxF,SAAS,CAAE+E,SAAU,EAAKF,kBAC9B,GACHY,YAAW,WACTC,cAAc,EAAKH,UACnB,EAAKA,SAAW,OACf,Q,0CAKLlG,KAAKyF,W,2CAILzF,KAAKyF,W,6CAILhC,OAAOqB,oBAAoB,QAAS9E,KAAKsC,aACrCtC,KAAKkG,UACPG,cAAcrG,KAAKkG,Y,sCAGP3E,GACd,GAAIvB,KAAKL,MAAM2D,WAAY,CACzBtD,KAAKwD,QAAQe,QADY,MAEVvE,KAAKmD,UAAU5B,EAAIkD,QAASlD,EAAImD,SAAzCtB,EAFmB,EAEnBA,EAAGC,EAFgB,EAEhBA,EACTrD,KAAKW,SAAS,CAAE4C,UAAU,EAAMH,IAAGC,S,oCAIzB9B,GACZvB,KAAKwD,QAAQgB,SACbxE,KAAKW,SAAS,CAAE4C,UAAU,M,kCAGhBhC,GACV,GAAIvB,KAAKL,MAAM4D,SAAU,CACvB,IAAI+C,EAAStG,KAAKL,MAAMyD,EACpBmD,EAASvG,KAAKL,MAAM0D,EAFD,EAGRrD,KAAKmD,UAAU5B,EAAIkD,QAASlD,EAAImD,SAAzCtB,EAHiB,EAGjBA,EAAGC,EAHc,EAGdA,EACTD,EAAIuB,KAAKC,MAAMxB,EAAEyB,EAAOnC,UAAUmC,EAAOnC,SACzCW,EAAIsB,KAAKC,MAAMvB,EAAEwB,EAAOnC,UAAUmC,EAAOnC,SACzC1C,KAAKN,MAAM4E,UAAUlB,EAAEkD,EAAQjD,EAAEkD,GACjCvG,KAAKW,SAAS,CAAEyC,EAAGA,EAAGC,EAAGA,O,+BAInB,IAAD,OACH0B,EAAY/E,KAAKL,MAAM2D,YAActD,KAAKN,MAAMoE,gBAChDkB,EAAwC,MAA/BhF,KAAKN,MAAMqE,kBAA4B/D,KAAKL,MAAM2D,aAAetD,KAAKN,MAAMoE,gBACrF0C,EAAS,QACTzB,EAAWyB,EAAS,OACfxB,IAAQwB,EAAS,OALnB,MAMkBxG,KAAKL,MAAM+F,SAA9BC,EANC,EAMDA,GAAIC,EANH,EAMGA,GAAIC,EANP,EAMOA,GAAIC,EANX,EAMWA,GAClB,OACE,kBAAC,IAAM1F,SAAP,KACE,0BACEgD,EAAGuC,EACHtC,EAAGuC,EACHI,MAAOH,EACPI,OAAQH,EACRW,YAAY,MACZC,cAAc,IACdF,OAAQA,EACRvB,KAAMF,EAAY,UAAY,QAC9BG,aAAc,SAACyB,GAAD,OAAO,EAAKhG,SAAS,CAAE2C,YAAY,KACjD6B,aAAc,SAACwB,GAAD,OAAO,EAAKhG,SAAS,CAAE2C,YAAY,KACjDsD,GAAI/B,EAAO/B,gBAAgB+D,WAC3BC,GAAIjC,EAAO/B,gBAAgB+D,aAE7B,uBAAGvG,IAAKN,KAAKsF,KACVtF,KAAKN,MAAM0F,e,GAxHFxE,IAAMC,W,yBCcXkG,E,uKAbX,IAAMC,EAAYhH,KAAKN,MAAMsH,UAC7B,OACE,yBAAK3G,UAAU,iBACZ2G,EAAUtK,KAAI,SAAAC,GACX,OAAIA,EAAGsK,MAAc,yBAAK5G,UAAU,aAAaK,QAAS/D,EAAGoD,MAAOpD,EAAGsK,OAC3D,yBAAK5G,UAAW1D,Y,GAPbiE,IAAMC,WCA3BqG,EAAS7K,EAAQ,IAAU6K,OAElB,cAAuE,IAApEvH,EAAmE,EAAnEA,MAAOwH,EAA4D,EAA5DA,aAAcC,EAA8C,EAA9CA,kBAAmBC,EAA2B,EAA3BA,aAAcC,EAAa,EAAbA,OACtE,MAAO,CACL3H,MAAOA,EAEP4H,UAAU,WAAD,4BAAE,sDAAAC,EAAA,+DAC0BxH,KAAKL,MAAlC8B,EADG,EACHA,MAAOO,EADJ,EACIA,YAAayF,EADjB,EACiBA,KAEtBtG,EAAOnB,KAAK0H,SAASjG,EAAMO,IAHtB,SAKMoF,EAAkB,CAAE,IAAO,OAAQ7G,QAAQ,IALjD,WAKLoH,EALK,SAMGA,EAAG3D,GANN,yCAMiB,MANjB,cAOHA,EAAa2D,EAAb3D,GAAIZ,EAASuE,EAATvE,EAAGC,EAAMsE,EAANtE,EAPJ,UAQSgE,IART,WASI,OADTO,EARK,SASaA,EATb,0CAS2B,MAT3B,WAWLC,EAAkBP,EAAOxI,EAAe8I,GAAQjI,EAAM8H,KAAKzD,GAAI8D,MAAQ,IAEvEC,EAAS/H,KAAKgI,OAAO7G,EAAM6C,IACnByD,KAdH,wBAePlI,QAAQC,IAAI,2CAfL,kBAgBA,MAhBA,QAmBT,IAASlB,KADTyJ,EAAON,KAAOM,EAAON,KAAKnI,OAAOuI,EAAgBI,SAASR,MAC5CI,EAAgBJ,KAEX,SADb3F,EAAM+F,EAAgBJ,KAAKnJ,IACvB4J,OACNpG,EAAIsB,GAAKA,EACTtB,EAAIuB,GAAKA,GAvBJ,OA2BT5B,EAAMrC,KAAK+B,GA3BF,kBA4BF,CAAEM,QAAOO,YAAaA,EAAc,EAAGyF,KAAK,eAAMA,EAAP,GAAgBI,EAAgBJ,QA5BzE,iDAAF,kDAAC,GAmCVU,UAAU,WAAD,4BAAE,sDAAAX,EAAA,sEACUL,EAAa,CAAE,IAAO,MAAO,IAAO,QAD9C,UACLiB,EADK,gDAEW,MAFX,uBAGchB,IAHd,UAGLiB,EAHK,iDAIe,MAJf,WAKHrE,EAAaqE,EAAbrE,GAAIZ,EAASiF,EAATjF,EAAGC,EAAMgF,EAANhF,EACTiF,EAAWtE,EANN,0CAOa,MAPb,aAQ0BhE,KAAKL,MAAlC8B,EARG,EAQHA,MAAOO,EARJ,EAQIA,YAAayF,EARjB,EAQiBA,KACtBtG,EAAOnB,KAAK0H,SAASjG,EAAMO,IAE1BhC,KAAKuI,gBAAgBpH,EAAMmH,EAAUF,GAXjC,oBAYHE,IAAatI,KAAKwI,WAAWrH,EAAMiH,GAAQpE,GAZxC,wBAaLzE,QAAQC,IAAI,2DAbP,kBAcE,MAdF,WAkBLiJ,EAAOzI,KAAK0I,aAAa1I,KAAKgI,OAAO7G,EAAMiH,IAlBtC,wBAoBP7I,QAAQC,IAAI,yCApBL,kBAqBA,MArBA,YAwBLuI,EAAS/H,KAAKgI,OAAO7G,EAAMmH,IACnBb,KAzBH,wBA0BPlI,QAAQC,IAAI,2CA1BL,kBA2BA,MA3BA,eA6BTuI,EAAON,KAAOM,EAAON,KAAKnI,OAAOmJ,GAC7BE,EAAYF,EACI,kBAATA,IACTE,EAAYF,EAAKzE,IAEnByD,EAAKkB,GAAWvF,EAAIA,EACpBqE,EAAKkB,GAAWtF,EAAIA,EAGpBrB,GAAe,EACfP,EAAMrC,KAAK+B,GAvCF,kBAwCF,CAAEM,MAAOA,EAAOO,YAAaA,EAAayF,KAAMA,IAxC9C,iDAAF,kDAAC,GA2CVmB,YAAY,WAAD,4BAAE,qDAAApB,EAAA,+DACwBxH,KAAKL,MAAlC8B,EADK,EACLA,MAAOO,EADF,EACEA,YAAayF,EADf,EACeA,KACtBtG,EAAOnB,KAAK0H,SAASjG,EAAMO,IAFpB,SAIUmF,EAAa,CAAE,IAAO,MAAO,IAAO,QAJ9C,UAIP0B,EAJO,gDAKW,MALX,UAOPC,EAAS9I,KAAKgI,OAAO7G,EAAM0H,GAPpB,0CASF,MATE,WAYLE,EAAa,SAAbA,EAAcC,EAAOC,GACzB,GAAqB,kBAAVD,EACT,MAAqB,kBAAVC,GACTxB,EAAKuB,GAAOE,MAAQzB,EAAKwB,GAAOC,IAMpC,IAAIC,EAAa,GAWjB,OADUH,EAAMvB,KAAK/K,KAAI,SAAAC,GAAE,OATP,SAACyM,EAAQC,GAC3B,IAAK,IAAIC,KAAKD,EAAW5B,KACvB,IAAK0B,EAAWtK,SAASyK,IACvBP,EAAWK,EAAQC,EAAW5B,KAAK6B,IACnC,OAAO,EAGX,OAAO,EAEsBC,CAAY5M,EAAIsM,MACpCO,MAAMC,UAGM,SAAnBC,EAAoBC,EAAWC,GACnC,IAAK,IAAItL,KAAKqL,EAAUlC,KAAM,CAC5B,IAAIoC,EAAUF,EAAUlC,KAAKnJ,GAC7B,GACkB,kBAATsL,GACY,kBAAZC,GACPA,IAAYD,GACZnC,EAAKmC,GAAMV,MAAQzB,EAAKoC,GAASX,IAEjC,OAAO,EACF,GAAIW,EAAQ7F,KAAO4F,EAAK5F,IAAM+E,EAAWc,EAASD,GACvD,OAAO,EAGX,QAAID,EAAU3F,IACL0F,EAAiB,EAAKlB,WAAWrH,EAAMwI,EAAU3F,IAAK4F,GAK5CF,CAAiB1J,KAAKwI,WAAWrH,EAAM0H,GAAWC,GAvD5D,0CAwDe,MAxDf,WA2DPgB,EAAS9J,KAAKwI,WAAWrH,EAAM0H,GA3DxB,0CA6DF,MA7DE,cAgELkB,EAAQD,EAAOrC,KAAKuC,QAAQlB,KACrB,GAjEF,iBAkETgB,EAAOrC,KAAKwC,OAAOF,EAAO,GAlEjB,iDAoEF,MApEE,eAuEXtI,EAAMrC,KAAK+B,GACXa,GAAe,EAxEJ,kBAyEJ,CAAEP,MAAOA,EAAOO,YAAaA,EAAayF,KAAMA,IAzE5C,iDAAF,kDAAC,GA4EZyC,QAAQ,WAAD,4BAAE,4CAAA1C,EAAA,sEACQL,EAAa,CAAE,IAAO,OAAQ,IAAO,SAD7C,UAEG,OADNnD,EADG,iDAEgB,MAFhB,YAG4BhE,KAAKL,MAAlC8B,EAHC,EAGDA,MAAOO,EAHN,EAGMA,YAAayF,EAHnB,EAGmBA,KAEtBtG,EAAOnB,KAAK0H,SAASjG,EAAMO,IAE3B8G,EAAS9I,KAAKgI,OAAO7G,EAAM6C,GAPxB,0CASE,MATF,WAYH8F,EAAS9J,KAAKwI,WAAWrH,EAAM6C,GAZ5B,0CAcE,MAdF,cAiBD+F,EAAQD,EAAOrC,KAAKuC,QAAQlB,KACrB,GAlBN,iBAmBLgB,EAAOrC,KAAKwC,OAAOF,EAAO,GAnBrB,iDAqBE,MArBF,eAwBP/H,GAAe,EACfP,EAAMrC,KAAK+B,GAzBJ,kBA0BA,CAAEM,MAAOA,EAAOO,YAAaA,EAAayF,KAAMA,IA1BhD,iDAAF,kDAAC,GAgCR0C,iBAAiB,WAAD,4BAAE,oDAAA3C,EAAA,sEACDL,EAAa,CAAE,IAAO,MAAO,IAAO,QADnC,UACZnD,EADY,SAEmBhE,KAAKL,MAAlC8B,EAFU,EAEVA,MAAOO,EAFG,EAEHA,YAAayF,EAFV,EAEUA,KAEtBtG,EAAOnB,KAAK0H,SAASjG,EAAMO,IAG3BoI,EAASpK,KAAKgI,OAAO7G,EAAM6C,GAPf,yCASP,MATO,UAYZqG,EAAUnD,IACVoD,EAAUpD,IAMVqD,EAAO,CACT9C,KAAM,CANG,CACTA,KAAM,CAAC2C,GACPpG,GAAIsG,EACJpC,KAAM,QAINlE,GAAIqG,EACJnC,KAAM,OAGJJ,EAAQL,EAAKzD,GAAI8D,MACrBL,EAAK6C,GAAW,CAAEpC,KAAM,MAAOJ,MAAOA,EAAQ,GAC9CL,EAAK4C,GAAW,CAAEnC,KAAM,MAAOJ,MAAOA,GAEtC9H,KAAKwK,eAAerJ,EAAM6C,EAAI,GAG1B8F,EAAS9J,KAAKwI,WAAWrH,EAAM6C,GAhCnB,0CAkCP,MAlCO,eAsCV+F,EAAQD,EAAOrC,KAAKuC,QAAQI,KACrB,GACXN,EAAOrC,KAAKwC,OAAOF,EAAO,GAE5BD,EAAOrC,KAAOqC,EAAOrC,KAAKnI,OAAOiL,GAEjCvI,GAAa,EACbP,EAAMrC,KAAK+B,GA7CK,kBA8CT,CAAEM,MAAOA,EAAOO,YAAaA,EAAayF,KAAKA,IA9CtC,iDAAF,kDAAC,GAoDjBgD,aAAa,WAAD,4BAAE,sDAAAjD,EAAA,sEACaJ,IADb,mBACNpD,EADM,EACNA,GAAIZ,EADE,EACFA,EAAGC,EADD,EACCA,EACRD,GAAMC,EAFC,yCAES,MAFT,gBAGuBrD,KAAKL,MAAlC8B,EAHM,EAGNA,MAAOO,EAHD,EAGCA,YAAayF,EAHd,EAGcA,KAEtBtG,EAAOnB,KAAK0H,SAASjG,EAAMO,IAE3BqI,EAAUnD,IACVoD,EAAUpD,IACVwD,EAAWxD,IAMXqD,EAAO,CACT9C,KAAM,CANG,CACTA,KAAM,CAACiD,GACP1G,GAAIsG,EACJpC,KAAM,QAINlE,GAAIqG,EACJnC,KAAM,OAGJJ,EAAQ9D,EAAKyD,EAAKzD,GAAI8D,OAAS,EACnCL,EAAK6C,GAAW,CAAEpC,KAAM,MAAOJ,MAAOA,EAAQ,GAC9CL,EAAK4C,GAAW,CAAEnC,KAAM,MAAOJ,MAAOA,EAAQ,GAC9CL,EAAKiD,GAAY,CACftH,IAAGC,IACH6E,KAAM,WACNgB,IAAK,OACLpB,MAAOA,EAAQ,GAIb9D,EACWhE,KAAKgI,OAAO7G,EAAM6C,GAExByD,KAAKrI,KAAKmL,GAGjBpJ,EAAKsG,KAAKrI,KAAKmL,GAIjBvI,GAAe,EACfP,EAAMrC,KAAK+B,GA3CC,kBA4CL,CAAEM,MAAOA,EAAOO,YAAaA,EAAayF,KAAMA,IA5C3C,iDAAF,kDAAC,GAqDbkD,gBAAgB,WAAD,4BAAE,gDAAAnD,EAAA,sEACAL,EAAa,CAAE,IAAO,QADtB,UACXnD,EADW,SAEoBhE,KAAKL,MAAlC8B,EAFS,EAETA,MAAOO,EAFE,EAEFA,YAAayF,EAFX,EAEWA,KAEtBtG,EAAOnB,KAAK0H,SAASjG,EAAMO,MAG3B4I,EAAW5K,KAAKgI,OAAO7G,EAAM6C,KAEC,QAAlB4G,EAAS1C,KATV,sBAUT2C,EAAYD,EAASnD,OACa,IAArBoD,EAAUxM,QAAsC,QAAtBwM,EAAU,GAAG3C,KAX3C,oBAaP4C,EAAcD,EAAU,GAAGpD,KAE3BqC,EAAS9J,KAAKwI,WAAWrH,EAAM6C,GAfxB,0CAiBF,MAjBE,eAmBXhE,KAAKwK,eAAerJ,EAAM0J,EAAU,GAAG7G,IAAK,IAEtC+F,EAAQD,EAAOrC,KAAKuC,QAAQY,KACrB,GACXd,EAAOrC,KAAKwC,OAAOF,EAAO,GAG5BD,EAAOrC,KAAOqC,EAAOrC,KAAKnI,OAAOwL,GAEjC9I,GAAa,EACbP,EAAMrC,KAAK+B,GA7BA,kBA8BJ,CAAEM,MAAOA,EAAOO,YAAaA,EAAayF,KAAKA,IA9B3C,iCAgCD,MAhCC,yDAkCH,MAlCG,iDAAF,kDAAC,GAyChBc,gBAAiB,SAAUpH,EAAM4J,EAASC,GACxC,IAAIC,EAAajL,KAAKwI,WAAWrH,EAAM6J,GACvC,OAAKC,IAIWjL,KAAKgI,OAAOiD,EAAYF,KAEtCxL,QAAQC,IAAI,2CACL,IANPD,QAAQC,IAAI,mCACL,IAcXkJ,aAAc,SAAUvH,GAAO,IACvBsG,EAASzH,KAAKL,MAAd8H,KAGN,SAASyD,EAAYxO,EAAKoL,GAExB,GAAmB,kBAARpL,EAAkB,CAC3B,IAAIsH,EAAKkD,IAQT,OAPAO,EAAKzD,GAAM,CACPkE,KAAM,MACNgB,IAAKzB,EAAK/K,GAAKwM,IACf9F,EAAGqE,EAAK/K,GAAK0G,EACbC,EAAGoE,EAAK/K,GAAK2G,EACbyE,MAAOL,EAAK/K,GAAKoL,OAEd9D,EAET,IAAImH,EAAS,GACb,IAAK,IAAIC,KAAK1O,EAEZ,GAAU,OAAN0O,EAAY,CACd,IAAIpH,EAAKkD,IACTiE,EAAOC,GAAKpH,EAEZyD,EAAKzD,GAAM,CACTkE,KAAM,MACNJ,MAAOA,QAKTqD,EAAOC,GADM,SAANA,EACK1O,EAAI0O,GAIJC,EAAc3O,EAAI0O,GAAItD,EAAM,GAG5C,OAAOqD,EAIT,SAASE,EAAc5O,EAAKqL,GAC1B,IAAIwD,EAAS,GACb,IAAK,IAAI9D,KAAK/K,EAEZ,GAAsB,kBAAXA,EAAI+K,GAAiB,CAC9B,IAAIxD,EAAKkD,IACToE,EAAOlM,KAAK4E,GAEZyD,EAAKzD,GAAM,CACTkE,KAAM,MACNgB,IAAKzB,EAAKhL,EAAI+K,IAAI0B,IAClB9F,EAAGqE,EAAKhL,EAAI+K,IAAIpE,EAChBC,EAAGoE,EAAKhL,EAAI+K,IAAInE,EAChByE,MAAOL,EAAKhL,EAAI+K,IAAIM,YAKtBwD,EAAOlM,KAAK8L,EAAYzO,EAAI+K,GAAIM,IAGpC,OAAOwD,EAET,IAAIC,EAAUL,EAAY/J,EAAM,GAEhC,OADAnB,KAAKL,MAAM8H,KAAOA,EACX8D,GAMTf,eAAgB,SAAUrJ,EAAM6C,EAAIwH,GAAS,IACrC/D,EAASzH,KAAKL,MAAd8H,KAEN,GAAIA,EAAKzD,IAAyB,QAAlByD,EAAKzD,GAAIkE,KACvBT,EAAKzD,GAAI8D,OAAS0D,MADpB,CAKA,IAAIC,GAAU,EAkCdC,EAAiBvK,EAAKsG,MACtBzH,KAAKL,MAAM8H,KAAOA,EAjClB,SAASkE,EAAejP,GAEtB,IAAIkP,EACAlP,EAAIsH,KACN4H,EAAQlP,EAAIsH,MAEEA,IACZyH,GAAU,GAIVA,IACFhE,EAAKmE,GAAO9D,OAAS0D,GAGnB9O,EAAI+K,MACNiE,EAAiBhP,EAAI+K,MAGzB,SAASiE,EAAiBjP,GACxB,IAAK,IAAI+K,KAAK/K,EAEU,kBAAXA,EAAI+K,GAEbmE,EAAelP,EAAI+K,IAGZiE,IACPhE,EAAKhL,EAAI+K,IAAIM,OAAS0D,KAU9B9D,SAAU,SAAUmE,GAClB,IAAIN,EAAU,GACd,SAASL,EAAYY,GACnB,IAAIC,EAAU,GACd,IAAK,IAAIC,KAAKF,EAEa,kBAAfA,EAAQE,GAChBD,EAAQC,GAAKF,EAAQE,GAIrBD,EAAQC,GAAKX,EAAcS,EAAQE,IAGvC,OAAOD,EAET,SAASV,EAAcS,GACrB,IAAIC,EAAU,GACd,IAAK,IAAIC,KAAKF,EAEa,kBAAfA,EAAQE,GAChBD,EAAQ3M,KAAK0M,EAAQE,IAIrBD,EAAQ3M,KAAK8L,EAAYY,EAAQE,KAGrC,OAAOD,EAMT,OAHAR,EAAQ9D,KAAO4D,EAAcQ,EAAQpE,MACrC8D,EAAQU,EAAIJ,EAAQI,EACpBV,EAAQW,EAAIL,EAAQK,EACbX,GAMT/C,WAAY,SAAU2D,EAAcnI,GAElC,IAAI8F,EAASqC,EAEb,SAASC,EAAY3P,GACnB,IAAK,IAAI+K,KAAK/K,EAEZ,GAAsB,kBAAXA,EAAI+K,IACb,GAAI/K,EAAI+K,KAAOxD,EACb,OAAO,MAIN,CAEH,GAAIvH,EAAI+K,GAAGxD,IAAMvH,EAAI+K,GAAGxD,KAAOA,EAC7B,OAAO,EAIPqI,EAAU5P,EAAI+K,IAIpB,OAAO,EAET,SAAS6E,EAAU3P,GAEbA,EAAI+K,MAEH2E,EAAY1P,EAAI+K,QACjBqC,EAASpN,GAKf,OADA0P,EAAYD,EAAa1E,MAClBqC,GAIT9B,OAAQ,SAAUmE,EAAcnI,GAE9B,SAASsI,EAAY7P,GACnB,IAAK,IAAI+K,KAAK/K,EAEZ,GAAsB,kBAAXA,EAAI+K,IAEb,GAAI/K,EAAI+K,KAAOxD,EACb,OAAOA,MAIN,IAAIvH,EAAI+K,GAAGxD,KAAOA,EACrB,OAAOvH,EAAI+K,GAGX,IAAI+E,EAAIC,EAAU/P,EAAI+K,IACtB,GAAI+E,EACF,OAAOA,GAKf,SAASC,EAAUrL,GACjB,GAAoB,kBAATA,EACT,OAAIA,IAAS6C,EACJ7C,OAEP,EAEJ,IAAK,IAAIoL,KAAKpL,EAAM,CAElB,GAAIA,EAAKoL,aAAcE,MACrB,OAAOH,EAAYnL,EAAKoL,IAEnB,GAAU,OAANA,GACLpL,EAAKoL,KAAOvI,EACd,OAAO7C,GAIf,OAAOqL,EAAUL,IAQnBO,eAAgB,SAASjF,EAAMtG,EAAM6C,GACpBhE,KAAKgI,OAAO7G,EAAM6C,GAEjC,OADAzE,QAAQC,IAAIiI,GACLA,K,iCCnlBPP,EAAS7K,EAAQ,IAAU6K,OAOjC,SAASI,EAAOnG,EAAM2G,GACfA,IAAOA,EAAQ,GACpB,IAAIL,EAAO,GACPkF,EAAW,EAEXC,EAAO,EACPC,EAAO,EA8BX,MAAO,CAAE5E,SAAU,CAAER,KAzBrB,SAASqF,EAAc3L,EAAM2G,EAAOiF,GAClC,IAAK,IAAIR,KAAKpL,EACZ,GAAIA,EAAKoL,aAAcE,OAAStL,EAAKoL,GAAGlO,OAAS,EAAG,CAClD,IAAI2F,EAAKkD,IACT/F,EAAKoL,GAAK,CAAE9E,KAAMqF,EAAc3L,EAAKoL,GAAIzE,EAAQ,GAAI9D,GAAIA,EAAIkE,KAAM,OACnET,EAAKzD,GAAM,CAAEkE,KAAM,MAAOJ,MAAOA,OAC5B,CACL,IAAIkF,EAAIL,EAEJ3I,EAAKkD,IACTO,EAAKzD,GAAM,CACTkE,KAAM,MACNgB,IAAK/H,EAAKoL,GACVnJ,EAAGuB,KAAKC,MAAMoI,EAAEnI,EAAOnC,UAAUmC,EAAOnC,SACxCW,EAAGsB,KAAKC,MArBD,EAqBSC,EAAOnC,UAAUmC,EAAOnC,SACxCoF,MAAOA,GAET3G,EAAKoL,GAAKvI,EACV6I,EAzBS,EAyBEA,EAzBF,EAyBaA,EACtBD,EAAOI,EAAIJ,EAAOI,EAAIJ,EACtBD,GAAY9H,EAAO9B,kBAGvB,OAAO5B,EAEkB2L,CAAc3L,EAAM2G,GAAQmE,EAAGY,EAAMX,EAAGU,GAAQnF,KAAMA,G,IAyepEwF,E,kDAreb,WAAYvN,GAAQ,IAAD,uBACjB,cAAMA,IACDa,OAASK,IAAMsC,YACpB,EAAKgK,gBAAkBtM,IAAMsC,YAE7B,EAAKiK,WAAa,EAAKA,WAAWnM,KAAhB,gBAClB,EAAKoM,oBAAsB,EAAKA,oBAAoBpM,KAAzB,gBAC3B,EAAKqM,UAAY,EAAKA,UAAUrM,KAAf,gBACjB,EAAKsM,aAAe,EAAKA,aAAatM,KAAlB,gBACpB,EAAKuM,aAAe,EAAKA,aAAavM,KAAlB,gBACpB,EAAKd,aAAe,EAAKA,aAAac,KAAlB,gBACpB,EAAKoG,kBAAoB,EAAKA,kBAAkBpG,KAAvB,gBACzB,EAAKqG,aAAe,EAAKA,aAAarG,KAAlB,gBACpB,EAAKb,gBAAkB,EAAKA,gBAAgBa,KAArB,gBACvB,EAAKwM,cAAgB,EAAKA,cAAcxM,KAAnB,gBACrB,EAAKyM,cAAgB,EAAKA,cAAczM,KAAnB,gBACrB,EAAKsG,OAASA,EAEd,EAAKoG,SAAW,GAChB,EAAKvG,aAAe,EAAKA,aAAanG,KAAlB,gBAnBH,MAqB0C,EAAKtB,MAAMiO,MAAhEC,EArBW,EAqBXA,SAAUC,EArBC,EAqBDA,WAAYpM,EArBX,EAqBWA,MAAOgG,EArBlB,EAqBkBA,KAAMjG,EArBxB,EAqBwBA,cArBxB,OAsBjB,EAAK7B,MAAQ,CACXgO,MAAO,CACLC,SAAUA,EACVC,WAAYA,GAEdrM,cAAeA,GAAiB,GAChCE,YAAa,GACbD,MAAOA,GAAS,GAChBgG,KAAMA,GAAQ,GACdzF,YAA8B,IAAjBP,EAAMpD,OAAeoD,EAAMpD,OAAS,EAAI,EACrDyP,cAAe,GACfC,WAAY,CACVzI,IAAK,OACL4D,IAAK,OACL3I,QAAQ,GAEVyN,WAAY,KACZC,SAAU,KACVC,aAAa,EACbrO,UAAW,CACT0H,UAAW,kBAAM4G,EAAW,gBAAM5G,aAClC2C,QAAS,kBAAMiE,EAAW,gBAAMjE,WAChC/B,UAAW,kBAAMgG,EAAW,gBAAMhG,aAClCS,YAAa,kBAAMuF,EAAW,gBAAMvF,eACpC+B,gBAAiB,kBAAMwD,EAAW,gBAAMxD,mBACxCR,iBAAkB,kBAAMgE,EAAW,gBAAMhE,oBACzCM,aAAc,kBAAM0D,EAAW,gBAAM1D,iBAEvCxM,QAAS,GACTW,GAAI,GACJwP,eAAe,GApDA,E,8DA4DDC,GAAY,IAAD,OACvBC,EAAqB,IAAIC,SAAQ,SAACC,EAASxJ,GAC7C,EAAKrE,SAAS,CACZ8N,SAAU,SAACrL,EAAEC,GACX,EAAK1C,SAAS,CAAE8N,SAAU,OAE1BrI,YAAW,WACL,EAAKzG,MAAMqO,YACb,EAAKrO,MAAMqO,WAAW,MACtB,EAAKrN,SAAS,CAAEqN,WAAY,OAAQ,kBAAMQ,EAAQ,CAAEpL,IAAGC,UAClDmL,EAAQ,CAAEpL,IAAGC,QACnB,UAIT,OAAO,IAAIkL,QAAJ,uCAAY,WAAOC,EAASxJ,GAAhB,eAAAwC,EAAA,sEACA+G,QAAQG,IAAI,CAAC,EAAKvH,aAAL,aAC5B,IAAO,MACP,IAAO,OACP,QAAU,GACPkH,IACDC,IANa,OACb7G,EADa,OAOb,EAAK9H,MAAMsO,UACb,EAAKtO,MAAMsO,WAEb,EAAKtN,SAAS,CACZoN,WAAY,CACVzI,IAAK,OACL4D,IAAK,OACL3I,QAAQ,GAEV0N,SAAU,KACVQ,SAAU,KACVP,aAAa,EACbF,WAAY,OAAQ,WAAO,IAAD,cACHvG,EADG,GACnBzD,EADmB,YACbZ,EADa,EACbA,EAAGC,EADU,EACVA,EACdmL,EAAQ,CAAExK,KAAIZ,IAAGC,SArBJ,2CAAZ,2D,mCAkCIsL,GAAe,IAAD,OACzB,OAAO,IAAIJ,SAAQ,SAACC,EAASxJ,GAAY,IAAD,EACT,EAAKrF,MAA5B8B,EADgC,EAChCA,MADgC,EACzBO,YAEG,IAAMP,EAAMpD,QAG5B,EAAKsC,SAAS,CACZoN,WAAYY,EACZT,aAAa,EACbF,WAAY,SAAChK,GACX,EAAKrD,SAAS,CACZoN,WAAY,CACVzI,IAAK,OACL4D,IAAK,OACL3I,QAAQ,GAEV2N,aAAa,EACbF,WAAY,OAAQ,kBAAMQ,EAAQxK,c,mCAM/B4K,EAAgBC,GAAa,IAAD,SAER7O,KAAKL,MAA9B8B,EAFiC,EAEjCA,MAAOD,EAF0B,EAE1BA,eACbA,EAAgBA,EAAcsN,SAChB1P,KAAK,CAAEqC,MAAOgL,MAAMsC,KAAKtN,KAEvCzB,KAAKW,SAAS,CAAEsN,SAAUY,IAAc,WACtC,EAAKlP,MAAME,UAAU+O,KAAkBI,MAAK,SAAArP,GACtC,EAAKA,MAAMsO,UACb,EAAKtO,MAAMsO,WAETtO,GAEF,EAAKgB,SAAL,aACEa,cAAeA,EACfE,YAAa,IACV/B,IAAS,WACV,EAAKyN,sBACL,EAAKlN,aAAa0O,GAAgB,0B,4CAOvB,IAAD,EACe5O,KAAKL,MAAlC8B,EADc,EACdA,MAAOgG,EADO,EACPA,KAAMzF,EADC,EACDA,YACfb,EAAOM,EAAMO,GAmBjBP,EAAMO,GAAayF,KAlBnB,SAASwH,EAAYC,EAAMpH,GACzB,IAAK,IAAIxJ,KAAK4Q,EAAM,CAClB,IAAIC,EAAKD,EAAK5Q,GACV8Q,EAAM,GAOV,IAAK,IAAI9Q,KANL6Q,EAAGjH,MAAoB,QAAZiH,EAAGjH,MAChBgH,EAAK5Q,GAAGmJ,KAAOwH,EAAYE,EAAG1H,KAAMK,EAAM,GAC1CL,EAAKyH,EAAK5Q,GAAG0F,IAAI8D,MAAQA,EACzBsH,EAAIhQ,KAAK+P,EAAGnL,KAEToL,EAAIhQ,KAAK+P,GACAC,EACZ3H,EAAK2H,EAAI9Q,IAAIwJ,MAAQA,EAKzB,OAFIoH,EAAK7Q,OAAS,IAChB6Q,EAAOA,EAAKG,QAAO,SAAA1S,GAAE,OAAIA,EAAGqH,KAAQrH,EAAGqH,IAAuB,SAAjByD,EAAK9K,GAAIuM,QACjDgG,EAEiBD,CAAY9N,EAAKsG,KAAM,GACjDzH,KAAKW,SAAS,CAAEc,QAAOgG,W,wCAGN,IAAD,EACyBzH,KAAKL,MAAxCqO,EADU,EACVA,WAAYS,EADF,EACEA,SAAUR,EADZ,EACYA,SACxBD,GAAYA,IACZS,GAAUA,IACVR,GAAUA,M,gCAGNjK,EAAIZ,EAAGC,GAAI,IACboE,EAASzH,KAAKL,MAAd8H,KACN1K,OAAOuS,OAAO7H,EAAKzD,GAAK,CAAEZ,EAAGA,EAAGC,EAAGA,IACnCrD,KAAKW,SAAS8G,K,mCAGHK,GACX,GAAkC,QAA9B9H,KAAKL,MAAMoO,WAAWzI,IAAe,OAAO,EAChD,IAAIiK,GAAM,EAEV,OADIzH,EAAQ,IAAM,IAAGyH,GAAM,KACO,QAA9BvP,KAAKL,MAAMoO,WAAWzI,MAAiBiK,IACJ,SAA9BvP,KAAKL,MAAMoO,WAAWzI,MAAmBiK,I,mCAIvCzH,GACX,GAAkC,QAA9B9H,KAAKL,MAAMoO,WAAW7E,IAAe,OAAO,EAChD,IAAIqG,GAAM,EAEV,OADIzH,EAAQ,IAAM,IAAGyH,GAAM,KACO,QAA9BvP,KAAKL,MAAMoO,WAAW7E,MAAiBqG,IACJ,SAA9BvP,KAAKL,MAAMoO,WAAW7E,MAAmBqG,I,oCAItCtM,EAAMiF,EAAMlG,EAAaoB,EAAGC,GAAI,IACtCoE,EAASzH,KAAKL,MAAd8H,KACFzD,EAAKkD,IACTO,EAAKzD,GAAM,GACXyD,EAAKzD,GAAIZ,EAAIA,GAAK,EAClBqE,EAAKzD,GAAIX,EAAIA,GAAK,EAClBoE,EAAKzD,GAAIkE,KAAOA,EAChBT,EAAKzD,GAAIkF,IAAMjG,EACfjB,EAAY5C,KAAK4E,GACjBhE,KAAKW,SAAS,CAAE8G,W,oCAGJzD,GACIhE,KAAKL,MAAf8B,MACAzB,KAAKL,MAAMqC,aAAa5C,KAAK4E,K,iCAG1BwL,GAAY,IAAD,OACd/H,EAASzH,KAAKL,MAAd8H,KACFtG,EAAOnB,KAAKL,MAAM8B,MAAM+N,GAC5B,GAAIrO,EAAM,CACR,IAAMsO,EAAQ,SAACzL,EAAGZ,EAAEC,GAAO,IACnBoE,EAAS,EAAK9H,MAAd8H,KACNA,EAAKzD,GAAIZ,EAAIA,EACbqE,EAAKzD,GAAIX,EAAIA,EACb,EAAK1C,SAAS,CAAE8G,KAAMA,KAGlBiI,EAAgB,SAAhBA,EAAiBvO,GACrB,IAAIwO,EAAM,GACU,IAAhBxO,EAAK9C,QACP,EAAKmP,cAAc,OAAQ,WAAYrM,EAAM,EAAG,GAHpB,eAKrBoL,GACP,GAAqB,QAAjBpL,EAAKoL,GAAGrE,KAAgB,CAC1B,IAAIJ,EAAQL,EAAKtG,EAAKoL,GAAGvI,IAAI8D,MACvBsH,EAAM,IACG,SAATQ,EAAUzO,GACd,GAAIA,EAAKsG,KACP,IAAK,IAAInJ,KAAK6C,EAAKsG,KACjBmI,EAAOzO,EAAKsG,KAAKnJ,SAChB8Q,EAAIhQ,KAAK+B,GAEhByO,CAAOzO,EAAKoL,IACZ,IAAIsD,EACF,kBAAC,EAAD,CACE/H,MAAOA,EACPhE,gBAAiB,EAAKyJ,aAAazF,GACnC9D,GAAI7C,EAAKoL,GAAGvI,GACZR,QAAS,EAAKA,QACdL,UAAW,EAAKmK,aAChBhJ,UAAW,SAAClB,EAAEC,GACZ+L,EAAIU,SAAQ,SAAA9L,GACV,EAAK0J,SAAS1J,GAAIZ,EAAEC,OAGxB0M,IAAK5O,EAAKoL,GAAGvI,GACbD,iBAAkB,EAAKpE,MAAMqO,YAC5B0B,EAAcvO,EAAKoL,GAAG9E,OAG3BkI,EAAIvQ,KAAKyQ,QACJ,GAAsC,QAAlC,EAAKlQ,MAAM8H,KAAKtG,EAAKoL,IAAIrE,KAAgB,CAClD,IAAIvL,EAAK,EAAKgD,MAAM8H,KAAKtG,EAAKoL,IAC1BzE,EAAQL,EAAKtG,EAAKoL,IAAIzE,MAC1B6H,EAAIK,QACF,kBAAC,EAAD,CACE5M,EAAGzG,EAAGyG,EACNC,EAAG1G,EAAG0G,EACNW,GAAI7C,EAAKoL,GACTzI,gBAAiB,EAAKmM,aAAanI,GACnC/D,iBAAkB,EAAKpE,MAAMqO,WAC7BxK,QAAS,EAAKA,QACd0K,YAAa,EAAKvO,MAAMuO,aAAe,EAAK+B,aAAanI,GACzD3E,UAAW,EAAKmK,aAChBhJ,UAAW,SAAClB,EAAEC,GAAH,OAASoM,EAAMtO,EAAKoL,GAAGnJ,EAAEC,IACpCc,cAAe,SAAA+L,GAAC,OAAI,EAAKxC,SAASvM,EAAKoL,IAAM2D,GAC7CH,IAAK5O,EAAKoL,IACT5P,EAAGuM,WAGH,GAAsC,aAAlC,EAAKvJ,MAAM8H,KAAKtG,EAAKoL,IAAIrE,MAAuC,IAAhB/G,EAAK9C,OAAc,CAC5E,IAAI1B,EAAK,EAAKgD,MAAM8H,KAAKtG,EAAKoL,IAC9BoD,EAAIK,QACF,kBAAC,EAAD,CACE5M,EAAGzG,EAAGyG,EACNC,EAAG1G,EAAG0G,EACNW,GAAI7C,EAAKoL,GACTzI,iBAAiB,EACjBC,iBAAkB,aAClBP,QAAS,EAAKA,QACd0K,YAAa,EAAKvO,MAAMuO,YACxB/K,UAAW,EAAKmK,aAChBhJ,UAAW,SAAClB,EAAEC,GAAH,OAASoM,EAAMtO,EAAKoL,GAAGnJ,EAAEC,IACpCc,cAAe,SAAA+L,GAAC,OAAI,EAAKxC,SAASvM,EAAKoL,IAAM2D,GAC7CH,IAAK5O,EAAKoL,IACT5P,EAAGuM,QA/DZ,IAAK,IAAIqD,KAAKpL,EAAO,EAAZoL,GAoET,OAAOoD,GAGT,OADAD,EAAc1O,KAAKhB,MACZ0P,EAAcvO,EAAKsG,S,0CAK5BzH,KAAKwD,QAAU2M,IAAQnQ,KAAKO,OAAO0D,QAAS,CAC1CmM,QAAS,EACTC,QAAS,KAGX,IAAMC,EAAK3L,KAAK4L,IAAIC,SAASC,gBAAgBC,YAAajN,OAAOkN,YAAc,GACzEC,EAAKjM,KAAK4L,IAAIC,SAASC,gBAAgBI,aAAcpN,OAAOqN,aAAe,GAE3ErP,EAAUzB,KAAKL,MAAf8B,MACN,GAAqB,IAAjBA,EAAMpD,OAAc,CAAC,IACjBuP,EAAa5N,KAAKL,MAAMgO,MAAxBC,SACNrO,QAAQC,IAAIoO,GACZrO,QAAQC,IAAIoO,EAAS/Q,KAAK,KAC1B0C,QAAQC,IAAIV,EAAe8O,EAAS/Q,KAAK,MAJnB,MAKGyK,EAAOxI,EAAe8O,EAAS/Q,KAAK,KAAM,GAA7DoL,EALgB,EAKhBA,SAAUR,EALM,EAKNA,KAChBhG,EAAMrC,KAAK6I,GACXjI,KAAKW,SAAS,CAAEc,MAAOA,EAAOgG,KAAMA,IAGtCzH,KAAKW,SAAS,IACd,IAAIQ,EAAOnB,KAAKL,MAAM8B,MAAMzB,KAAKL,MAAMqC,aAGvChC,KAAKwD,QAAQuN,OAAOT,EAAG,EAAInP,EAAK+K,EAAG0E,EAAG,EAAIzP,EAAK8K,GAC/CjM,KAAKwD,QAAQwN,OAAOV,EAAG,EAAInP,EAAK+K,EAAG0E,EAAG,EAAIzP,EAAK8K,EAAG,K,6CAIlDxI,OAAOqB,oBAAoB,SAAU9E,Q,mCAQ1BiR,EAAMC,GACjB,IAAIvJ,EAAK3H,KAAKkN,gBAAgBjJ,QAAQkN,iBAGtC,OAFAxJ,EAAGvE,EAAI6N,EACPtJ,EAAGtE,EAAI6N,EACAvJ,EAAGyJ,gBAAgBpR,KAAKO,OAAO0D,QAAQoN,eAAeC,a,oCAGjD3K,GACZ,GAAI3G,KAAKL,MAAM8O,SAAU,CAAC,IAAD,EACRzO,KAAKsN,aAAa3G,EAAE4K,MAAM5K,EAAE6K,OAArCpO,EADiB,EACjBA,EAAGC,EADc,EACdA,EACTrD,KAAKL,MAAM8O,SAASrL,EAAEC,M,qCAIV,IAAD,OACb,OAAO,IAAIkL,SAAQ,SAACC,EAASxJ,GAC3B,EAAKrE,SAAS,CACZ8Q,aAAa,EACbzD,WAAY,SAAC/P,GACUuQ,EAAN,MAAXvQ,EAAyB,KAChBA,GACb,EAAK0C,SAAS,CAAE8Q,aAAa,EAAOzD,WAAY,e,+BAM9C,IAAD,SAC0EhO,KAAKL,MAAhFgO,EADC,EACDA,MAAOlG,EADN,EACMA,KAAMhG,EADZ,EACYA,MAAOO,EADnB,EACmBA,YAAwByP,GAD3C,EACgC1M,UADhC,EAC2C0M,aAAajQ,EADxD,EACwDA,cAE/DxB,KAAKN,MAAMgS,UAAX,eAA0B/D,EAA1B,CAAiClG,OAAMhG,QAAOD,mBAE9C,IAAImQ,EAAgB,aAChB3R,KAAKwD,UACPmO,EAAgB3R,KAAKwD,QAAQmO,eAE/B,IAAIC,EAAM5T,EAAagC,KAAKL,MAAM1B,SAC9BW,EAAKL,EAAYyB,KAAKL,MAAM1B,SAEhC,OACE,kBAAC,qBAAD,CACE4T,eAAe,SACfC,kBAAkB,EAClBC,wBAAyB,IACzBC,iBAAiB,EACjBC,uBAAwB,KACxB,yBAAK5R,UAAS,uBAAkBoR,EAAc,SAAW,KACvD,8DACC,EASD,6BACE,+BACE,+BACE,4BACE,wBAAIjR,MAAO,CAAEwF,MAAO,QAClB,2BAAOkM,SAAW,SAACvL,GAAD,OAAO,EAAKhG,SAAS,CAAE1C,QAAS0I,EAAEwL,OAAOC,MAAOxT,GAAIL,EAAYoI,EAAEwL,OAAOC,aAE7F,4BACGR,GAAO,kBAAC,IAAD,CAAKS,KAAMT,MAGvB,+BAXN,cAcchT,GAAM,kBAAC,IAAD,CAAKyT,KAAMzT,MAE7B,EAIF,0BAAMyB,UAAU,WACd,4BAAQK,QAAS,kBAAM,EAAKf,MAAMqO,WAAW,EAAKrO,MAAMf,MAAxD,UACA,4BAAQ8B,QAAS,kBAAM,EAAKf,MAAMqO,WAAW,QAA7C,YAGJ,yBAAK+B,IAAK,WAAY1P,UAAS,6BAAwBoR,EAAc,YAAc,KACjF,kBAAC,EAAD,CACEzK,UAAWhH,KAAKN,MAAMsH,YACxB,kBAAC,EAAD,CACE/G,OAAQ+B,EAAY,IAAMP,EAAMpD,OAChCwB,UAAWG,KAAKL,MAAME,UACtBK,aAAcF,KAAKE,aACnBC,gBAAiBH,KAAKG,kBAExB,yBACEG,IAAKN,KAAKkN,gBACV7M,UAAU,kBACViS,QAASX,EACTjR,QAASV,KAAKyN,cACdvI,aAAc,kBAAM,EAAKvE,SAAS,CAAEoE,WAAW,KAC/CI,aAAc,kBAAM,EAAKxE,SAAS,CAAEoE,WAAW,KAC/CvE,MAAOR,KAAKL,MAAM8O,SAAW,CAC3BvK,OAAQ,YACRzD,gBAAiB,SACf,IACJ,uBAAGH,IAAKN,KAAKO,QACVP,KAAKwD,SAAWxD,KAAKmN,WAAWnN,KAAKL,MAAMqC,eAGhD,kBAAC,EAAD,CACEA,YAAahC,KAAKL,MAAMqC,YACxBC,SAAUjC,KAAKL,MAAM8B,MACrBH,QAAS,SAAAiL,GAAC,OAAI,EAAK5L,SAAS,CAAEqB,YAAauK,EAAG2B,YAAa3B,IAAM,EAAK5M,MAAM8B,MAAMpD,OAAS,KAC3FsB,MAAOK,KAAKL,MACZgB,SAAU,SAACa,EAAe+Q,EAAU7Q,GAClC,EAAKf,SAAS,CACZa,cAAeA,EACfC,MAAO8Q,EACP7Q,YAAaA,EACbM,YAAauQ,EAASlU,OAAS,a,GA5d1BuC,IAAMC,WCiFZ2R,G,wDAtIb,WAAY9S,GAAQ,IAAD,8BACjB,cAAMA,IAEDC,MAAQ,CACXiO,SAAU,CACR,IAEFC,WAAY,IAGd,EAAK4E,aAAazR,KAAlB,gBACA,EAAK0R,cAAc1R,KAAnB,gBACA,EAAK2R,OAAS,EAAKA,OAAO3R,KAAZ,gBACd,EAAK4R,OAAS,EAAKA,OAAO5R,KAAZ,gBACd,EAAK6R,SAAWjS,IAAMsC,YAdL,E,sGAqBNyD,EAAGrI,GACd,GAAS,MAALA,EAAW,CAAC,IACRsP,EAAa5N,KAAKL,MAAlBiO,SACNA,EAAStP,GAAKqI,EAAEwL,OAAOC,MACvBpS,KAAKW,SAAS,CAAEiN,SAAUA,SAEvB5N,KAAKW,SAAS,CAAEkN,WAAYlH,EAAEwL,OAAOC,U,oCAG9BrI,GAAQ,IACd6D,EAAa5N,KAAKL,MAAlBiO,SACNA,EAAS3D,OAAOF,EAAO,GACvB/J,KAAKW,SAAS,CAAEiN,SAAUA,M,+BAGlB,IAAD,EACwB5N,KAAKL,MAA9BiO,EADC,EACDA,SAAUC,EADT,EACSA,WAChB,IAAK,IAAIvP,KAAKsP,EACZ,GAAoB,KAAhBA,EAAStP,KAAcsP,EAAStP,GAClC,OAAO,EAEX,QAAmB,KAAfuP,IAAsBA,K,+BAQ1B,GAFAtO,QAAQC,IAAI,eACZD,QAAQC,IAAI,0BAA4BQ,KAAK2S,UACzC3S,KAAK2S,SAAU,CAAC,IAAD,EACc3S,KAAKL,MAA9BiO,EADW,EACXA,SAAUC,EADC,EACDA,WAChB,IAAK,IAAIvP,KAAKsP,EACZA,EAAStP,GAAKC,EAAYqP,EAAStP,IACnCiB,QAAQC,IAAIoO,EAAStP,IAEvBuP,EAAatP,EAAYsP,GACzB7N,KAAKN,MAAMoT,UAAU9S,KAAK6S,SAAS5O,QAAQmO,MAAO,CAAExE,WAAUC,aAAYpM,MAAO,Q,qCAItExD,EAASK,GAAI,IACtBsT,EAAKhT,EADgB,OAErB+T,EAAO1U,KACT2T,EAAM5T,EAAaC,GACnBW,EAAKL,EAAYN,IAEnB,IAAI8U,EAAW,wBACb1S,UAAU,oBACVK,QAAS,kBAAM,EAAKgS,cAAcpU,KAFrB,UAKX0U,EAAe,2BAAOd,SAAW,SAACvL,GAAD,OAAO,EAAK8L,aAAa9L,EAAErI,MAOhE,OANS,MAALA,IACF0U,EAAe,2BAAOd,SAAW,SAACvL,GAAD,OAAO,EAAK8L,aAAa9L,MAC1DoM,EAAW,wBAAI1S,UAAU,WAEjB,IAAN/B,IACFyU,EAAW,wBAAI1S,UAAU,WAEzB,4BACE,4BACG2S,GAEH,4BACGpB,GAAO,kBAAC,IAAD,CAAKS,KAAMT,KAErB,4BACGhT,GAAM,kBAAC,IAAD,CAAKyT,KAAMzT,KAElBmU,K,+BAKE,IAAD,SACwB/S,KAAKL,MAA9BiO,EADC,EACDA,SAAUC,EADT,EACSA,WAChB,OACE,yBAAKxN,UAAU,sBACb,0CACA,yCACA,2BAAOC,IAAKN,KAAK6S,WACjB,2BAAOxS,UAAU,iBAGjB,wCACA,2BAAOA,UAAU,gBACf,+BACE,4BACI,uCAGF,4CAAqB,2CAAoB,wBAAIA,UAAU,WAExDuN,EAASlR,KAAI,SAACuB,EAAQK,GAAT,OAAe,EAAK2U,eAAehV,EAASK,MAC1D,4BACE,wBAAI+B,UAAU,cAAcK,QAAS,kBAAM,EAAKC,SAAS,CAAEiN,SAAUA,EAAStO,OAAO,CAAC,SACpF,0BAAMe,UAAU,SADlB,mBAGA,6BAAK,6BAAK,wBAAIA,UAAU,aAI9B,0CACA,2BAAOA,UAAU,gBACf,+BACGL,KAAKiT,eAAepF,U,GA/HTjN,IAAMC,YCHxBqS,G,MAAe,SAAC,GAAD,IAAGC,EAAH,EAAGA,WAAH,OACnB,yBAAK9S,UAAU,WACb,yBAAKA,UAAU,UACb,kDACA,0NAIF,yBAAKA,UAAU,YACf,yBAAKA,UAAU,UACb,6CACCtD,OAAOC,KAAKmW,GAAYzW,KAAI,SAAA0W,GAAI,OAC/B,yBAAK/S,UAAU,aAAaG,MAAO,CAAE6S,QAAS,OAAQC,eAAgB,kBACpE,0BAAM5S,QAAS,kBAAMyS,EAAWC,GAAMG,SACnCH,GAEH,0BACE5S,MAAO,CAAE4B,MAAO,QAChB1B,QAAS,kBAAMyS,EAAWC,GAAMI,WAFlC,kBA8FKC,G,kDAnFb,WAAY/T,GAAQ,IAAD,8BACjB,cAAMA,IACDgU,WAAa9S,IAAMsC,YACxB,EAAKyQ,WAAa,EAAKA,WAAW3S,KAAhB,gBAClB,EAAK4S,YAAc,EAAKA,YAAY5S,KAAjB,gBACnB,EAAK6S,SAAW,EAAKA,SAAS7S,KAAd,gBAChB,EAAKrB,MAAQ,CACXmU,aAAa,EACbC,kBAAmB,yBARJ,E,uGAgBjB/T,KAAKW,SAAS,CAAEoT,kBAAmB,sB,mCAInC/T,KAAK0T,WAAWzP,QAAQ2O,W,iCAGd,IAAD,OACHhL,EAAQ4I,SAAShD,cAAc,SACrC5F,EAAMoM,aAAa,OAAQ,QAC3BpM,EAAMoM,aAAa,SAAU,UAC7BpM,EAAMqM,SAAW,SAAC1S,GAChBhC,QAAQC,IAAI,YACZ+B,EAAI2S,kBACJ3S,EAAIF,iBACJ,IAAI8S,EAAO5S,EAAI4Q,OAAOiC,MAAM,GAC5B7U,QAAQC,IAAI2U,GACZ,IAAIE,EAAS,IAAIC,WACjBD,EAAO3Q,iBAAiB,QAAQ,SAACnC,GAC/B,IACE,IAAI/D,EAAM+W,KAAKC,MAAMjT,EAAI4Q,OAAOsC,QAChClV,QAAQC,IAAIhC,GACZ,EAAKkC,MAAMoT,UAAUqB,EAAKf,KAAKsB,MAAM,UAAU,GAAIlX,GACnD,MAAOmJ,GACPpH,QAAQoV,MAAMhO,GACdiO,MAAM,4CAGVP,EAAOQ,WAAWV,IAEpBvM,EAAMkN,U,+BAGE,IAAD,SACoC9U,KAAKL,MAAxCmU,EADD,EACCA,YAAaC,EADd,EACcA,kBACrB,OACE,yBAAK1T,UAAW0T,IACZD,GAAe,kBAAC,EAAD,CAAcX,WAAYnT,KAAKN,MAAMyT,aACrDW,GAAe,kBAAC,EAAD,CAAWhB,UAAW9S,KAAKN,MAAMoT,UAAWxS,IAAKN,KAAK0T,cAClEI,GACA,yBAAKzT,UAAU,WACf,4BAAQK,QAAS,kBAAM,EAAKC,SAAS,CAAEmT,aAAa,MAApD,OAGA,4BAAQpT,QAASV,KAAK6T,UAAtB,SAKDC,GACC,yBAAKzT,UAAU,WACb,4BAAQA,UAAU,OAAOK,QAAS,kBAAM,EAAKC,SAAS,CAAEmT,aAAa,MACnE,8BACE,kBAAC,IAAD,CAAUzT,UAAU,MAAMkC,IAAKC,+CAFnC,QAMA,4BAAQ9B,QAASV,KAAK2T,YAAtB,gB,GA1EY/S,IAAMC,WC1B5BkU,GAAetR,OAAOsR,aA4IXC,G,kDAzIb,WAAYtV,GAAQ,IAAD,8BACjB,cAAMA,IAEDuV,eAAiB,EAAKA,eAAejU,KAApB,gBACtB,EAAKkU,WAAa,EAAKA,WAAWlU,KAAhB,gBAClB,EAAKmU,WAAa,EAAKA,WAAWnU,KAAhB,gBAClB,EAAK0Q,UAAY,EAAKA,UAAU1Q,KAAf,gBACjB,EAAKoU,WAAa,EAAKA,WAAWpU,KAAhB,gBAClB,EAAKqU,YAAczU,IAAMsC,YACzB,EAAKvD,MAAQ,CACX2V,WAAY,UACZC,YAAY,EACZC,WAAW,EACX3C,SAAU,GACVlF,MAAO,CACLC,SAAU,GACVC,WAAY,GACZpM,MAAO,IAET0R,WAAY,EAAKiC,cAGnB7V,QAAQC,IAAI,EAAKG,MAAMwT,YAQvB,EAAKnM,UAAY,CACf,CACEC,MAAO,OACPlH,KAAM,WACJ,EAAKY,SAAS,CACZ2U,WAAY,UACZC,YAAY,EACZC,WAAW,EACX3C,SAAU,GACVlF,MAAO,CACLC,SAAU,GACVC,WAAY,GACZpM,MAAO,IAET0R,WAAY,EAAKiC,iBAIvB,YACA,CACEnO,MAAO,SACPlH,KAAM,WACJ,IAAM0V,EAAUjF,SAAShD,cAAc,KACjC2G,EAAO,IAAIuB,KAAK,CAACnB,KAAKoB,UAAU,EAAKhW,MAAMgO,QAAS,CAACzF,KAAM,eACjEuN,EAAQG,KAAOC,IAAIC,gBAAgB3B,GACnCsB,EAAQM,SAAW,EAAKpW,MAAMkT,SAAW,SACzCrC,SAASwF,KAAKC,YAAYR,GAC1BA,EAAQX,WAzDG,E,yDA+DL,IAAD,OACPoB,EAAUnB,GAAaoB,QAAQ,cACnCD,EAAUA,EAAU3B,KAAKC,MAAM0B,GAAW,GAC1C,IAAIlZ,EAAOD,OAAOC,KAAKkZ,GAHZ,WAIF5X,GACP4X,EAAQlZ,EAAKsB,IAAIiV,KAAO,WACtB,EAAK5S,SAAS,CACZkS,SAAU7V,EAAKsB,GACfqP,MAAOuI,EAAQlZ,EAAKsB,MAEtB,EAAK6W,cAEPe,EAAQlZ,EAAKsB,IAAIkV,OAAS,WACxB,IAAI4C,EAASrB,GAAaoB,QAAQ,qBAClCC,EAASA,EAAS7B,KAAKC,MAAM4B,GAAU,IACzBpZ,EAAKsB,IACnByW,GAAasB,QAAQ,aAAc9B,KAAKoB,UAAUS,IAClD,EAAKzV,SAAS,CAAEwS,WAAYiD,MAbhC,IAAK,IAAI9X,KAAKtB,EAAO,EAAZsB,GAgBT,OAAO4X,I,gCAGCrD,GAAW,IACbM,EAAenT,KAAKL,MAApBwT,WAEN,OADAA,EAAWN,GAAY7S,KAAKL,MAAMgO,MAC3B,SAACA,GACNwF,EAAWN,GAAYlF,EACvBoH,GAAasB,QAAQ,aAAc9B,KAAKoB,UAAUxC,O,iCAI3CN,EAAUlF,GACnB3N,KAAKW,SAAS,CACZkS,SAAUA,EACVlF,MAAOA,IAET3N,KAAKmV,e,mCAGO,IAAD,OACXnV,KAAKW,SAAS,CAAE2U,WAAY,oBAC5BtV,KAAKqV,YAAYpR,QAAQ2P,cACzBxN,YAAW,kBAAM,EAAKzF,SAAS,CAC7B4U,YAAY,MACV,O,uCAIJvV,KAAKW,SAAS,CAAE6U,WAAW,M,+BAI3B,OAAIxV,KAAKL,MAAM4V,WAEX,yBAAKlV,UAAU,OACb,kBAAC,EAAD,CACE2G,UAAWhH,KAAKgH,UAChB0K,UAAW1R,KAAK0R,UAAU1R,KAAKL,MAAMkT,UACrClF,MAAO3N,KAAKL,MAAMgO,SAKxB,yBAAKtN,UAAWL,KAAKL,MAAM2V,YACzB,kBAAC,GAAD,CACEhV,IAAKN,KAAKqV,YACVlC,WAAYnT,KAAKL,MAAMwT,WACvBL,UAAW9S,KAAKkV,kB,GApIRtU,IAAMC,WCKJ4I,QACW,cAA7BhG,OAAO6S,SAASC,UAEe,UAA7B9S,OAAO6S,SAASC,UAEhB9S,OAAO6S,SAASC,SAAS9Y,MACvB,2DCXN+Y,IAASC,OAAO,kBAAC,GAAD,MAASjG,SAASkG,eAAe,SD4H3C,kBAAmBC,WACrBA,UAAUC,cAAcC,MACrB7H,MAAK,SAAA8H,GACJA,EAAaC,gBAEdC,OAAM,SAAArC,GACLpV,QAAQoV,MAAMA,EAAMsC,c","file":"static/js/main.dbec2f34.chunk.js","sourcesContent":["/* \n * Return a boolean indicating if the inputted sentence is \n * a correctly formatted. Utilizes a recursive technique,\n * evaluating each sentence as though it were an atomic\n * sentence or any phi and psi combined with a binary \n * operator. \n*/\n\nconst { binary, unary } = require('./operators.json')\n\nfunction escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\nfunction arrToRegex(arr) {\n arr = arr.map(el => escapeRegExp(el));\n return '(?:' + arr.join('|') + ')'\n} \n\nconst uReg = arrToRegex(Object.keys(unary));\nconst regexStr = `^(${uReg}*[A-Za-z]+|${uReg}*\\\\((.*)\\\\))(${arrToRegex(Object.keys(binary))})(${uReg}*[A-Za-z]+|${uReg}*\\\\((.*)\\\\))$`\nlet binaryRegex = new RegExp(regexStr) // eslint-disable-line\nlet atomicRegex = new RegExp(`^([A-Za-z])*`)\nlet parenthesisRegex = new RegExp(`^${uReg}*\\\\((.*)\\\\)$`)\n\nfunction verifyRecursive(sentence) {\n let res\n if (sentence.match(atomicRegex)) return true;\n else if ((res = binaryRegex.exec(sentence)) !== null) {\n if (res == null) return false;\n if (res[2] && res[5]) \n return verifyRecursive(res[2]) && verifyRecursive(res[5]);\n else if (res[2]) \n return verifyRecursive(res[2]);\n else if (res[5]) \n return verifyRecursive(res[5]);\n else return true;\n } else if ((res = parenthesisRegex.exec(sentence)) !== null)\n return verifyRecursive(res[1])\n}\n\nexport {\n binaryRegex,\n atomicRegex,\n parenthesisRegex\n}\n\nexport default (sentence) => {\n // filter out spaces\n sentence = sentence.replace(/\\s/g, '')\n return verifyRecursive(sentence);\n}","import verifySentence, { \n parenthesisRegex, \n binaryRegex,\n atomicRegex\n} from './verifySentence';\n\nconst operators = require('./operators.json')\n\n/**\n * This file is responsible for holding many of the converters used throughout the \n * app.\n */\n\n/**\n * @param {string} the string to add escape characters for\n * @return {string} the string with all regex-safe characters\n */\nfunction escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\n/**\n * keys represents the ASCII notation for the input characters. \n * @type {array}\n */\nlet keys = Object.keys(operators.binary);\nkeys = keys.map(el => escapeRegExp(el));\nconst binarySymbReplace = new RegExp('(?:' + keys.join('|') + ')', 'g')\nconst unaryOperators = operators.unary\n\n/**\n * @param {string} Fitch-style sentence notation.\n * @return {string} TeX sentence notation.\n */\nconst convertToTeX = (formula) => {\n if (typeof formula === 'string' || formula instanceof String) {\n // filter out spaces\n formula = formula.replace(/\\s/g, '')\n let symbol\n // replace all binary operators\n while ((symbol = binarySymbReplace.exec(formula)) !== null) {\n formula = formula.substr(0,symbol['index']) \n + operators.binary[symbol[0]] + ' '\n + formula.substr(symbol['index'] + symbol[0].length);\n }\n // replace all unary operators\n for (let i in Object.keys(unaryOperators)) {\n symbol = Object.keys(unaryOperators)[i];\n formula = formula.replace(new RegExp(escapeRegExp(symbol), 'g'), unaryOperators[symbol] + ' ');\n }\n // filter out all other characters\n formula = formula.replace(/[^()A-Za-z\\\\\\s]/g, '')\n return formula\n }\n else return \"\"\n}\n\n/**\n * @param {string} statement\n * @return {int} counts the number of unary operators in the given input.\n *\n * For example, if passed a statement !!(P | Q), we notice two unary operators \n * encapsulating the statement (the ! symbols, representing NOT). These would \n * be counted out.\n */\nfunction countUnary(statement) {\n const matchesList = (val) => (op) => op === val;\n let c = 0;\n for (c in statement.split(\"\"))\n if (!Object.keys(unaryOperators).some(matchesList(statement.charAt(c))))\n break;\n return c;\n}\n\n/**\n * @param {string} the sentence being passed in, in Fitch-style notation.\n * @param {bool} whether to convert the statement to EG or just return without unary.\n * @return {[type]}\n */\nconst stripUnary = (s, convertStatement) => {\n if (convertStatement == null) \n convertStatement = true;\n let c = countUnary(s);\n console.log(c)\n console.log(s)\n let statement = s.substr(c)\n if (convertStatement) statement = convertToEG(statement)\n else statement = '{' + statement + '}'\n return \"(\".repeat(c) + statement + \")\".repeat(c)\n}\n\n/**\n * @param {string} Fitch-style sentence notation \n * @return {string} EG-style sentence notation.\n */\nconst convertToEG = (formula) => {\n if (!verifySentence(formula)) return null;\n if ((typeof formula === 'string' || formula instanceof String) && verifySentence(formula)) {\n // filter out spaces\n formula = formula.replace(/\\s/g, '')\n let binary = binaryRegex.exec(formula)\n let parenthesis = parenthesisRegex.exec(formula)\n let atom = atomicRegex.exec(formula)\n if (binary) {\n let left = convertToEG(binary[1])\n let right = convertToEG(binary[4])\n let symConversion = operators.eg[binary[3]];\n return symConversion.replace(/\\$1/g, left).replace(/\\$2/g, right)\n } else if (formula[0] === '(') {\n let res = convertToEG(formula.substr(1,formula.length-2));\n if (res) return res;\n else return null;\n } else if (Object.keys(unaryOperators).includes(formula[0])) {\n let res = convertToEG(formula.substr(1))\n if (res) return '(' + res + ')';\n else return null;\n } else if (atom) {\n return '{' + atom[0] + '}'\n }\n return null;\n } else return null;\n}\n\n/** \n * Converts a string representing an Existential Graph into\n * a nested array. Acts recursively, calling iteslf again\n * When a pair of parentehses are found. If given an index i,\n * this will start from that index.\n * \n * For example: \n * \"((({P})){Q}{R}){P}\" => [ [ [['P']],'Q','R' ],'P' ]\n */\nconst convertToArray = (formula) => {\n if (typeof formula === 'string' || formula instanceof String) {\n // hold the array of the current level that will be returned\n function consume(c) {\n if (formula.length > 0 && c === formula[0]) {\n formula = formula.substring(1);\n return true;\n }\n return false;\n }\n\n function parseExpression(expr) {\n let arr = []\n while (true) {\n if (consume('(')) {\n arr.push(parseExpression(formula));\n if (!consume(')')) \n return null;\n } else if (consume('{')) {\n let st = \"\";\n while (formula.length > 0 && !consume('}')) {\n st = st.concat(formula[0]);\n formula = formula.substring(1);\n }\n if (st.length === 0) arr.push('\\u00A0');\n arr.push(st);\n \n }\n if (formula.length === 0 || (formula[0] !== '(' && formula[0] !== '{')) {\n break;\n }\n }\n return arr;\n }\n return parseExpression(formula);\n }\n else return null\n}\n\nconsole.log(convertToArray('((({P}(({Q}({R})))))({T}))({T}){P}'))\n\n/**\n * Export all converters\n */\nexport {\n convertToTeX,\n convertToEG,\n convertToArray,\n verifySentence\n}","import React from 'react';\n\nclass Toolbox extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n selected: null,\n functions: [\n {\n str: \"Iterate\",\n func: 'iteration',\n },\n {\n str: \"Deiterate\",\n func: 'deiteration',\n },\n {\n str: \"Wrap in Double Cut\",\n func: 'doubleCutEnclose',\n },\n {\n str: \"Add Double Cut\",\n func: 'doubleCutAdd',\n },\n {\n str: \"Remove Double Cut\",\n func: 'doubleCutRemove',\n },\n {\n str: \"Insertion\",\n func: 'insertion',\n },\n {\n str: \"Erasure\",\n func: 'erasure',\n }\n ]\n };\n }\n\n componentDidMount() { \n }\n\n render() {\n let { hidden, modifyCanvas, cancelSelection } = this.props;\n let { selected } = this.state;\n if (hidden) return ;\n return (\n
\n

Tools

\n {this.state.functions.map((el, i) => (\n
{\n if (this.state.selected === i) {\n this.setState({ selected: null });\n cancelSelection();\n }\n else {\n this.setState({ selected: i });\n modifyCanvas(el.func, () => {\n // this.setState({ selected: null });\n });\n }\n }\n }\n >{el.str}
\n ))}\n
\n );\n }\n}\n\nexport default Toolbox;","import React from 'react';\nimport { ReactSVG } from 'react-svg';\n\nclass StepMenu extends React.Component {\n constructor(props) {\n super(props);\n \n this.performRedo = this.performRedo.bind(this);\n this.performUndo = this.performUndo.bind(this);\n this.state = {};\n }\n \n handleClick(event, step, disabled) {\n event.preventDefault();\n if (!disabled) {\n // Must update color before updating props to allow component to\n // render with the proper current color rather than the state before\n this.props.setStep(step);\n }\n }\n\n performUndo(evt) {\n let { changeHistory, steps, redoHistory } = this.props.state;\n let prev = changeHistory.pop();\n\n if (prev) {\n redoHistory.push(steps);\n this.props.setState(changeHistory, prev.steps, redoHistory);\n }\n }\n\n performRedo(evt) {\n let { changeHistory, steps, redoHistory } = this.props.state;\n let prevSteps = redoHistory.pop();\n\n if (prevSteps) {\n changeHistory.push({ redoHistory, steps });\n this.props.setState(changeHistory, prevSteps, redoHistory);\n }\n }\n\n getColor(disabled) {\n return disabled ? \"rgb(136, 136, 136)\" : \"rgb(68, 68, 68)\";\n }\n\n disable(st, obj) {\n return st.concat(obj.length > 0 ? \"\" : \" disabled\")\n }\n\n render() {\n let { hide, currentStep, stepInfo, state } = this.props;\n let { changeHistory, redoHistory } = state;\n if (hide) return ();\n let backEnabled = currentStep === (stepInfo.length - 1);\n let forwardEnabled = currentStep === 0;\n return (\n \n
\n
\n
this.handleClick(event, 0, forwardEnabled)}>\n \n
\n
this.handleClick(event, currentStep - 1, forwardEnabled)}>\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
this.handleClick(event, currentStep + 1, backEnabled)}>\n \n
\n
this.handleClick(event, stepInfo.length - 1, backEnabled)}>\n \n
\n
\n
\n
\n Step {currentStep + 1} of {stepInfo.length}\n
\n
\n );\n }\n}\n\nexport default StepMenu;","export default {\n gridSize: 1,\n cutPadding: {\n horizontal: 10,\n vertical: 5\n },\n cutCornerRadius: 10,\n initialSeparation: 50,\n}","import React from 'react';\nimport config from './config';\n\nclass EGVariable extends React.Component {\n constructor(props) {\n super(props);\n this.text = React.createRef()\n this.getCoords = this.props.getCoords\n this.handleClick = this.handleClick.bind(this);\n this.state = {\n x: props.x,\n y: props.y,\n cursorOver: false,\n dragging: false\n };\n\n this.panzoom = this.props.panzoom\n\n window.addEventListener('mousemove', this.onMouseMove.bind(this))\n window.addEventListener('mousedown', this.handleDragStart.bind(this))\n window.addEventListener('mouseup', this.handleDragEnd.bind(this))\n window.addEventListener('click', this.handleClick)\n }\n\n handleClick() {\n if (this.state.cursorOver \n && this.props.enableHighlight \n && this.props.selectedCallback) \n {\n this.props.selectedCallback(this.props.id);\n this.setState({ cursorOver: false });\n }\n }\n\n componentDidMount() { \n this.text.current.style.cursor = \"pointer\";\n this.props.subscribeMove((x,y) => {\n let newx = this.state.x + x;\n let newy = this.state.y + y;\n this.props.setCoords(newx, newy);\n this.setState({ x: newx, y: newy });\n })\n }\n\n handleDragStart(evt) {\n if (this.state.cursorOver) {\n this.panzoom.pause()\n this.setState({ dragging: true })\n }\n }\n\n handleDragEnd(evt) {\n this.panzoom.resume()\n let { x, y } = this.state;\n this.props.setCoords(x, y);\n this.setState({ dragging: false })\n }\n\n onMouseMove(evt) {\n if (this.state.dragging) {\n let { x, y } = this.getCoords(evt.clientX, evt.clientY)\n x = Math.round(x/config.gridSize)*config.gridSize\n y = Math.round(y/config.gridSize)*config.gridSize\n this.props.setCoords(x, y);\n this.setState({ x: x, y: y });\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('click', this.handleClick);\n window.removeEventListener('mousemove', this.onMouseMove.bind(this))\n window.removeEventListener('mousedown', this.handleDragStart.bind(this))\n window.removeEventListener('mouseup', this.handleDragEnd.bind(this))\n }\n\n render() {\n let highlight = this.state.cursorOver && this.props.enableHighlight;\n let reject = this.props.selectedCallback != null && this.state.cursorOver && !this.props.enableHighlight;\n let fill = \"black\";\n if (highlight) fill = \"blue\";\n else if (reject) fill = \"red\";\n return (\n this.setState({ cursorOver: true })}\n onMouseLeave={() => this.setState({ cursorOver: false })}\n ref={this.text}>\n {this.props.children}\n \n );\n }\n}\n\nexport default EGVariable;","import React from 'react';\nimport config from './config';\n\nclass EGCut extends React.Component {\n constructor(props) {\n super(props);\n this.cut = React.createRef();\n this.BB = React.createRef();\n this.getBBoxData = this.getBBoxData.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.update = this.update.bind(this);\n this.getCoords = this.props.getCoords\n this.state = { \n highlight: false,\n cursorOver: false,\n bounding: {_x:0,_y:0,_w:0,_h:0}\n };\n\n this.panzoom = this.props.panzoom\n\n window.addEventListener('click', this.handleClick)\n window.addEventListener('mousemove', this.onMouseMove.bind(this))\n window.addEventListener('mousedown', this.handleDragStart.bind(this))\n window.addEventListener('mouseup', this.handleDragEnd.bind(this))\n }\n\n handleClick() {\n if (this.state.cursorOver \n && this.props.enableHighlight \n && this.props.selectedCallback) \n {\n this.props.selectedCallback(this.props.id);\n this.setState({ cursorOver: false });\n }\n }\n\n getBBoxData() {\n if (this.cut.current) {\n let { x, y, width, height } = this.cut.current.getBBox();\n let _x = x - config.cutPadding.horizontal;\n let _y = y - config.cutPadding.vertical;\n let _w = width + config.cutPadding.horizontal * 2;\n let _h = height + config.cutPadding.vertical * 2;\n return { _x, _y, _w, _h };\n }\n return {};\n }\n\n update() {\n if (!this.interval) {\n this.interval = setInterval(() => {\n this.setState({ bounding: this.getBBoxData() });\n }, 1);\n setTimeout(() => {\n clearInterval(this.interval);\n this.interval = null;\n }, 100);\n }\n }\n\n componentDidMount() { \n this.update()\n }\n\n componentDidUpdate() {\n this.update()\n }\n\n componentWillUnmount() {\n window.removeEventListener('click', this.handleClick);\n if (this.interval)\n clearInterval(this.interval);\n }\n\n handleDragStart(evt) {\n if (this.state.cursorOver) {\n this.panzoom.pause();\n let { x, y } = this.getCoords(evt.clientX, evt.clientY);\n this.setState({ dragging: true, x, y })\n }\n }\n\n handleDragEnd(evt) {\n this.panzoom.resume();\n this.setState({ dragging: false });\n }\n\n onMouseMove(evt) {\n if (this.state.dragging) {\n let x_orig = this.state.x;\n let y_orig = this.state.y;\n let { x, y } = this.getCoords(evt.clientX, evt.clientY)\n x = Math.round(x/config.gridSize)*config.gridSize\n y = Math.round(y/config.gridSize)*config.gridSize\n this.props.setCoords(x-x_orig, y-y_orig);\n this.setState({ x: x, y: y });\n }\n }\n\n render() {\n let highlight = this.state.cursorOver && this.props.enableHighlight;\n let reject = this.props.selectedCallback != null && this.state.cursorOver && !this.props.enableHighlight;\n let stroke = \"black\";\n if (highlight) stroke = \"blue\";\n else if (reject) stroke = \"red\";\n let { _x, _y, _w, _h } = this.state.bounding;\n return (\n \n this.setState({ cursorOver: true })}\n onMouseLeave={(e) => this.setState({ cursorOver: false })}\n rx={config.cutCornerRadius.toString()} \n ry={config.cutCornerRadius.toString()}\n />\n \n {this.props.children}\n \n \n );\n }\n}\n\nexport default EGCut;","import React from 'react';\n\nclass DropdownMenu extends React.Component {\n render() {\n const menuItems = this.props.menuItems;\n return (\n
\n {menuItems.map(el => {\n if (el.title) return
{el.title}
;\n else return
\n }\n )}\n
\n );\n }\n}\n\nexport default DropdownMenu;","import { convertToArray } from '../converters';\n\nconst nanoid = require('nanoid').nanoid;\n\nexport default ({ state, getSelection, getInsertionPoint, requestInput, initXY }) => { \n return {\n state: state,\n\n insertion: async function () {\n let { steps, currentStep, data } = this.state;\n // create a new step\n let step = this.copyStep(steps[currentStep]);\n\n let pt = await getInsertionPoint({ 'cut': 'even', canvas: false });\n if (!pt || !pt.id) return null;\n let { id, x, y } = pt;\n let input = await requestInput();\n if (input == null || !input) return null;\n\n let initializedData = initXY(convertToArray(input), state.data[id].level + 1);\n\n let insert = this.findID(step, id);\n if (!insert.data) {\n console.log(\"Insert ID could not be found in Iterate\");\n return null;\n }\n insert.data = insert.data.concat(initializedData.stepZero.data);\n for (let i in initializedData.data) {\n let obj = initializedData.data[i];\n if (obj.type === 'var') {\n obj.x += x;\n obj.y += y;\n }\n }\n\n steps.push(step);\n return { steps, currentStep: currentStep + 1, data: { ...data, ...initializedData.data }};\n },\n\n /* Given a copyID and insertID, the iteration function creates a new step,\n * and adds a copy of the data represented by copyID at the location of insertID\n * only if the location of insertID is a child of copyID\n */\n iteration: async function () {\n let copyID = await getSelection({ 'cut': 'all', 'var': 'all' });\n if (!copyID) return null;\n let insertData = await getInsertionPoint();\n if (!insertData) return null;\n let { id, x, y } = insertData;\n let insertID = id;\n if (!insertID) return null;\n let { steps, currentStep, data } = this.state;\n let step = this.copyStep(steps[currentStep]);\n // If the insertID data is not in a subgraph of the copyID data, return\n if (!this.isInNestedGraph(step, insertID, copyID)) {\n if (insertID !== this.findParent(step, copyID).id) {\n console.log(\"Insert selection is not in a subgraph of Copy selection\");\n return null;\n }\n }\n // use findID to find the data represented by the two IDs\n let copy = this.copyContents(this.findID(step, copyID));\n if (!copy) {\n console.log(\"Copy ID could not be found in Iterate\");\n return null;\n }\n \n let insert = this.findID(step, insertID);\n if (!insert.data) {\n console.log(\"Insert ID could not be found in Iterate\");\n return null;\n }\n insert.data = insert.data.concat(copy);\n let newCopyID = copy;\n if (typeof copy !== 'string')\n newCopyID = copy.id\n\n data[newCopyID].x = x;\n data[newCopyID].y = y;\n\n // Update the state\n currentStep += 1;\n steps.push(step);\n return { steps: steps, currentStep: currentStep, data: data };\n },\n\n deiteration: async function () {\n let { steps, currentStep, data } = this.state;\n let step = this.copyStep(steps[currentStep]);\n\n let deiterID = await getSelection({ 'cut': 'all', 'var': 'all' });\n if (!deiterID) return null;\n\n let erased = this.findID(step, deiterID);\n if (!erased) {\n return null;\n }\n\n const equalTrees = (tree1, tree2) => {\n if (typeof tree1 === 'string') {\n if (typeof tree2 === 'string' && \n data[tree1].var === data[tree2].var) {\n return true;\n }\n return false;\n }\n\n let matchedIDs = []\n const matchBranch = (branch, secondTree) => {\n for (let j in secondTree.data) {\n if (!matchedIDs.includes(j) && \n equalTrees(branch, secondTree.data[j])) {\n return true;\n }\n }\n return false;\n }\n let res = tree1.data.map(el => matchBranch(el, tree2));\n return res.every(Boolean);\n }\n\n const checkForSubgraph = (structure, tree) => {\n for (let i in structure.data) {\n let subtree = structure.data[i];\n if (\n typeof tree === 'string' && \n typeof subtree === 'string' && \n subtree !== tree &&\n data[tree].var === data[subtree].var\n ) {\n return true;\n } else if (subtree.id !== tree.id && equalTrees(subtree, tree)) {\n return true;\n }\n }\n if (structure.id) {\n return checkForSubgraph(this.findParent(step, structure.id), tree);\n }\n return false;\n }\n \n const foundSubtree = checkForSubgraph(this.findParent(step, deiterID), erased);\n if (!foundSubtree) return null;\n \n // Get the parent of the erased section\n let parent = this.findParent(step, deiterID)\n if (!parent) {\n return null;\n }\n // Remove the erased data from the parent's data array\n const index = parent.data.indexOf(erased);\n if (index > -1)\n parent.data.splice(index, 1);\n else {\n return null;\n }\n\n steps.push(step);\n currentStep += 1;\n return { steps: steps, currentStep: currentStep, data: data };\n },\n\n erasure: async function () {\n let id = await getSelection({ 'cut': 'even', 'var': 'even' });\n if (id == null) return null;\n let { steps, currentStep, data } = this.state;\n // Create a new step\n let step = this.copyStep(steps[currentStep]);\n // Find the data that will be erased\n let erased = this.findID(step, id);\n if (!erased) {\n return null;\n }\n // Get the parent of the erased section\n let parent = this.findParent(step, id)\n if (!parent) {\n return null;\n }\n // Remove the erased data from the parent's data array\n const index = parent.data.indexOf(erased);\n if (index > -1)\n parent.data.splice(index, 1);\n else {\n return null;\n }\n // Update the state\n currentStep += 1;\n steps.push(step);\n return { steps: steps, currentStep: currentStep, data: data };\n },\n\n /* Adds a double cut given the ID of the data that will be inside the cut.\n * Will only run if the current step is the last step.\n */\n doubleCutEnclose: async function () {\n var id = await getSelection({ 'cut': 'all', 'var': 'all' });\n let { steps, currentStep, data } = this.state;\n // create a new step\n let step = this.copyStep(steps[currentStep]);\n // use findID to find the data represented by the id\n // this is the data that will be inside the two new cuts\n let inside = this.findID(step, id);\n if (!inside) {\n return null;\n }\n // create a new cut with another one inside it\n let cut1_id = nanoid();\n let cut2_id = nanoid();\n let cut2 = {\n data: [inside],\n id: cut2_id,\n type: \"cut\"\n }\n let cut1 = {\n data: [cut2],\n id: cut1_id,\n type: \"cut\"\n }\n // Set the levels of the two cuts\n let level = data[id].level\n data[cut2_id] = { type: \"cut\", level: level + 1};\n data[cut1_id] = { type: \"cut\", level: level};\n // increase the level of the inside cut along with all cuts inside of it by 2\n this.changeCutLevel(step, id, 2)\n\n // get the parent of the selection\n let parent = this.findParent(step, id)\n if (!parent) {\n return null;\n }\n // Add the contents of the new cuts to the data array\n // after removing the original contents\n const index = parent.data.indexOf(inside);\n if (index > -1) {\n parent.data.splice(index, 1);\n }\n parent.data = parent.data.concat(cut1);\n // Change the state data accordingly\n currentStep+=1;\n steps.push(step);\n return { steps: steps, currentStep: currentStep, data:data };\n },\n\n /* Adds a double cut given the ID of the data that will be inside the cut.\n * Will only run if the current step is the last step.\n */\n doubleCutAdd: async function () {\n let { id, x, y } = await getInsertionPoint();\n if (!x || !y) return null;\n let { steps, currentStep, data } = this.state;\n // create a new step\n let step = this.copyStep(steps[currentStep]);\n // create a new cut with another one inside it\n let cut1_id = nanoid();\n let cut2_id = nanoid();\n let empty_id = nanoid();\n let cut2 = {\n data: [empty_id],\n id: cut2_id,\n type: \"cut\"\n }\n let cut1 = {\n data: [cut2],\n id: cut1_id,\n type: \"cut\"\n }\n // Set the levels of the two cuts\n let level = id ? data[id].level : -1;\n data[cut2_id] = { type: \"cut\", level: level + 2 };\n data[cut1_id] = { type: \"cut\", level: level + 1 };\n data[empty_id] = {\n x, y,\n type: \"emptyvar\", \n var: \"\\xa0\",\n level: level + 3 \n };\n\n // get the parent of the selection\n if (id) {\n let stepEl = this.findID(step, id);\n // append new cuts\n stepEl.data.push(cut1);\n }\n else {\n step.data.push(cut1);\n }\n \n // Change the state data accordingly\n currentStep += 1;\n steps.push(step);\n return { steps: steps, currentStep: currentStep, data: data };\n },\n\n /* Removes a double cut given the ID of the outside cut.\n * Will only run if the current step is the last step.\n * Creates a deep copy of the current step, and replaces the cut with\n * the given ID with the contents of the second cut, only if they exist.\n * Then adds the edited copy of the current step to the end of the step array.\n */\n doubleCutRemove: async function () {\n let id = await getSelection({ 'cut': 'all' });\n let { steps, currentStep, data } = this.state;\n // Create a new step\n let step = this.copyStep(steps[currentStep]);\n\n // use findID to find the cut with the given ID\n let firstCut = this.findID(step, id);\n // If it is actually a cut and has another cut inside\n if (firstCut && firstCut.type === \"cut\") {\n let secondCut = firstCut.data;\n if (secondCut && secondCut.length === 1 && secondCut[0].type === \"cut\") {\n // Get the data inside the second cut\n let newContents = secondCut[0].data;\n // Get the parent of the original cut being removed\n let parent = this.findParent(step, id)\n if (!parent) {\n return null;\n }\n this.changeCutLevel(step, secondCut[0].id, -2)\n // Remove the first cut from the data array\n const index = parent.data.indexOf(firstCut);\n if (index > -1) {\n parent.data.splice(index, 1);\n }\n // Add the contents of the second cut to the data array\n parent.data = parent.data.concat(newContents);\n // Update the state\n currentStep+=1;\n steps.push(step);\n return { steps: steps, currentStep: currentStep, data:data };\n }\n else return null;\n }\n else return null;\n },\n\n\n /* Given a step and two IDs, will return true if the data of ChildID is\n * in a nested graph of parentID in the current step.\n */\n isInNestedGraph: function (step, childID, parentID) {\n let parentStep = this.findParent(step, parentID);\n if (!parentStep) {\n console.log(\"Parent Data could not be found\");\n return false;\n }\n let childStep = this.findID(parentStep, childID);\n if (!childStep) {\n console.log(\"Child is not in nested graph of Parent\");\n return false;\n }\n return true;\n },\n\n /* Given a step or a cut, will copy the contents inside with new IDs\n * and return the new data. This permits inserting new data into the graph.\n * Levels for cuts will start at 0 and increase accordingly\n */\n copyContents: function (step) {\n let { data } = this.state;\n // Copies the data of a map and returns it\n // Also updates the state.data map according to new generated IDs\n function copyDataMap(map, level) {\n // If a variable is passed it, add it to the data and return the new ID\n if (typeof map === 'string') {\n let id = nanoid();\n data[id] = {\n type: \"var\",\n var: data[map].var,\n x: data[map].x,\n y: data[map].y,\n level: data[map].level\n }\n return id;\n }\n let newMap = {};\n for (let m in map) {\n // If an ID is found, generate a new one\n if (m === 'id') {\n let id = nanoid();\n newMap[m] = id;\n // Add the new data to state.data via a deep copy\n data[id] = {\n type: \"cut\",\n level: level\n }\n }\n // Otherwise, if not a data array, copy the contents\n else if (m !== 'data'){\n newMap[m] = map[m]\n }\n // If a data array, copy using helper function\n else {\n newMap[m] = copyDataArray(map[m], level+1)\n }\n }\n return newMap;\n }\n // Copies the data of an array and returns it\n // Also updates state.data according to new generated IDs\n function copyDataArray(arr, level) {\n let newArr = [];\n for (let a in arr) {\n // If an ID found, generate a new one\n if (typeof arr[a] === 'string') {\n let id = nanoid();\n newArr.push(id);\n // Add the new data to state.data via a deep copy\n data[id] = {\n type: \"var\",\n var: data[arr[a]].var,\n x: data[arr[a]].x,\n y: data[arr[a]].y,\n level: data[arr[a]].level\n }\n }\n // otherwise, call the other helper function to copy contents\n else {\n newArr.push(copyDataMap(arr[a], level))\n }\n }\n return newArr;\n }\n let newStep = copyDataMap(step, 0);\n this.state.data = data;\n return newStep;\n },\n\n /* Given a step and the ID of a cut, will iterate through all cuts within\n * that cut and change their level by a specified amount.\n */\n changeCutLevel: function (step, id, change) {\n let { data } = this.state\n // If the ID is for a variable, only increase it's level\n if (data[id] && data[id].type === \"var\") {\n data[id].level += change;\n return\n }\n // when true, the levels should change in the functions below\n let idFound = false\n // Changes the \n function changeLevelMap(map) {\n // get the id for the current map\n let mapID;\n if (map.id) {\n mapID = map.id\n // if it matches the id being searched, update the boolean\n if (mapID === id) {\n idFound = true;\n }\n }\n // If the ID has been found, update the level of the current cut\n if (idFound) {\n data[mapID].level += change;\n }\n // call the function of the data array if it exists\n if (map.data){\n changeLevelArray(map.data);\n }\n }\n function changeLevelArray(arr) {\n for (let a in arr) {\n // If a non-string is found (a cut)\n if (typeof arr[a] !== 'string') {\n // Change the level of the cut\n changeLevelMap(arr[a])\n }\n // If string is found, change the level of the variable\n else if (idFound){\n data[arr[a]].level += change;\n }\n }\n }\n changeLevelArray(step.data)\n this.state.data = data;\n },\n\n // Performs a deep copy of oldStep into newStep, used to not change previous steps\n // By allowing them to be copied without using a reference\n copyStep: function (oldStep) {\n let newStep = {};\n function copyDataMap(oldData) {\n let newData = {};\n for (let d in oldData) {\n // If an id or type if found, copy directly\n if(typeof oldData[d] === 'string') {\n newData[d] = oldData[d];\n }\n // Otherwise if an array is found, copy using helper function\n else {\n newData[d] = copyDataArray(oldData[d]);\n }\n }\n return newData;\n }\n function copyDataArray(oldData) {\n let newData = [];\n for (let d in oldData) {\n // If an ID is found (variable), copy directly\n if(typeof oldData[d] === 'string') {\n newData.push(oldData[d]);\n }\n // If a map was found (cut), copy using helper function\n else {\n newData.push(copyDataMap(oldData[d]));\n }\n }\n return newData;\n }\n // Copy the data, width, and height of the original into the new step\n newStep.data = copyDataArray(oldStep.data);\n newStep.h = oldStep.h;\n newStep.w = oldStep.w;\n return newStep;\n },\n\n /* Finds and returns the item that is the parent of the item\n * with the specified ID, given the step to search as well.\n */\n findParent: function (searchedStep, id) {\n // holds the parent of the id\n let parent = searchedStep\n // Searches an array for the ID, returns true if it is found\n function findInArray(arr) {\n for (let a in arr) {\n // If an ID is found, compare it\n if (typeof arr[a] === 'string') {\n if (arr[a] === id) {\n return true;\n }\n }\n // Otherwise if a datamap is found, check the ID\n else {\n // If ID matches, return true\n if (arr[a].id && arr[a].id === id) {\n return true;\n }\n // Otherwise, search the datamap\n else {\n findInMap(arr[a])\n }\n }\n }\n return false;\n }\n function findInMap(map) {\n // if the map contains data, search the data\n if (map.data) {\n // if found, set parent to this map\n if(findInArray(map.data)) {\n parent = map;\n }\n }\n }\n findInArray(searchedStep.data);\n return parent;\n },\n\n // finds and returns the item with the specified ID in a given step\n findID: function (searchedStep, id) {\n // Find the ID in an array\n function findIDArray(arr) {\n for (let a in arr) {\n // if a string, aka an ID\n if (typeof arr[a] === 'string') {\n // return the ID if found\n if (arr[a] === id) {\n return id;\n }\n }\n // if a data map is found with the correct id, return the data map\n else if (arr[a].id === id) {\n return arr[a];\n // otherwise, call findID step on the datamap that has the incorrect ID\n } else {\n let s = findIDMap(arr[a]);\n if (s)\n return s;\n }\n }\n }\n // Finds the ID in a data map representing a step\n function findIDMap(step) {\n if (typeof step === 'string') {\n if (step === id)\n return step;\n else\n return\n }\n for (let s in step) {\n // if an array is found, call findIDArray on each element\n if (step[s] instanceof Array) {\n return findIDArray(step[s]);\n // if an id is found, check if it matches and return the data if so\n } else if (s === \"id\") {\n if (step[s] === id)\n return step;\n }\n }\n }\n return findIDMap(searchedStep);\n },\n\n /**\n * Provided a data array, adds an x,y offset to the elements contained\n * inside the provided id for visual differentiation\n * @return {data} Data object\n */\n offsetPosition: function(data, step, id) {\n let toSearch = this.findID(step, id);\n console.log(data)\n return data;\n }\n };\n}","import React from 'react';\nimport { convertToArray, convertToTeX, convertToEG } from '../converters';\nimport Toolbox from './Toolbox';\nimport StepMenu from './StepMenu';\nimport EGVariable from './EGVariable';\nimport EGCut from './EGCut';\nimport './Canvas.scss';\nimport Panzoom from 'panzoom';\nimport DropdownMenu from './DropdownMenu';\nimport config from './config';\nimport manipulate from './manipulate';\nimport { CSSTransitionGroup } from 'react-transition-group';\n// KATEX\nimport 'katex/dist/katex.min.css';\nimport TeX from '@matejmazur/react-katex';\n\nconst nanoid = require('nanoid').nanoid;\n\n/**\n * Where a lot of the action happens. This component renders the Canvas for \n * the Existential Graphs workspace. Meant to take up an entire page.\n */\n\nfunction initXY(step, level) {\n if (!level) level = 0\n let data = {}\n let currentX = 0\n let currentY = 0\n let maxX = 0\n let maxY = 0\n\n // gapSize should be equal to the number of level changes\n // in between two variables, so that we can evenly place \n // them initially across the screen\n function initXYRecurse(step, level, gapSize) {\n for (let s in step) {\n if (step[s] instanceof Array && step[s].length > 0) {\n let id = nanoid()\n step[s] = { data: initXYRecurse(step[s], level + 1), id: id, type: \"cut\" }\n data[id] = { type: \"cut\", level: level }\n } else {\n let X = currentX;\n let Y = currentY;\n let id = nanoid()\n data[id] = { \n type: \"var\",\n var: step[s], \n x: Math.round(X/config.gridSize)*config.gridSize, \n y: Math.round(Y/config.gridSize)*config.gridSize,\n level: level\n }\n step[s] = id\n maxY = Y > maxY ? Y : maxY;\n maxX = X > maxX ? X : maxX;\n currentX += config.initialSeparation\n }\n }\n return step\n }\n return { stepZero: { data: initXYRecurse(step, level), h: maxY, w: maxX }, data: data }\n}\n\nclass Canvas extends React.Component {\n constructor(props) {\n super(props);\n this.canvas = React.createRef();\n this.canvasContainer = React.createRef();\n\n this.renderStep = this.renderStep.bind(this);\n this.checkLevelIntegrity = this.checkLevelIntegrity.bind(this);\n this.changePos = this.changePos.bind(this);\n this.getSVGCoords = this.getSVGCoords.bind(this);\n this.highlightCut = this.highlightCut.bind(this);\n this.modifyCanvas = this.modifyCanvas.bind(this);\n this.getInsertionPoint = this.getInsertionPoint.bind(this);\n this.requestInput = this.requestInput.bind(this);\n this.cancelSelection = this.cancelSelection.bind(this);\n this.createElement = this.createElement.bind(this);\n this.clickedCanvas = this.clickedCanvas.bind(this);\n this.initXY = initXY;\n\n this.moveVars = {};\n this.getSelection = this.getSelection.bind(this);\n\n let { premises, conclusion, steps, data, changeHistory } = this.props.proof;\n this.state = {\n proof: {\n premises: premises,\n conclusion: conclusion\n },\n changeHistory: changeHistory || [], \n redoHistory: [],\n steps: steps || [],\n data: data || {},\n currentStep: steps.length !== 0 ? steps.length - 1 : 0,\n moveListeners: [],\n highlights: {\n cut: 'none', // 'none', 'odd', 'even', 'all'\n var: 'none',\n canvas: false\n },\n cbFunction: null,\n finishCB: null,\n interaction: true,\n functions: {\n insertion: () => manipulate(this).insertion(),\n erasure: () => manipulate(this).erasure(),\n iteration: () => manipulate(this).iteration(),\n deiteration: () => manipulate(this).deiteration(),\n doubleCutRemove: () => manipulate(this).doubleCutRemove(),\n doubleCutEnclose: () => manipulate(this).doubleCutEnclose(),\n doubleCutAdd: () => manipulate(this).doubleCutAdd(),\n },\n formula: '',\n eg: '',\n fitchNotation: false\n }\n }\n\n /**\n * Function to select a point on the canvas or inside a cut, where the x,y coordinate\n * gets returned along with a cut ID, if selected.\n */\n getInsertionPoint(cutConfig) {\n let getCanvasInsertion = new Promise((resolve, reject) => {\n this.setState({\n canvasCb: (x,y) => {\n this.setState({ canvasCb: null })\n \n setTimeout(() => {\n if (this.state.cbFunction) {\n this.state.cbFunction(null);\n this.setState({ cbFunction: null }, () => resolve({ x, y }));\n } else resolve({ x, y });\n }, 50);\n }\n })\n });\n return new Promise(async (resolve, reject) => {\n let data = await Promise.all([this.getSelection({\n 'cut': 'all',\n 'var': 'none',\n 'canvas': true,\n ...cutConfig\n }), getCanvasInsertion])\n if (this.state.finishCB) {\n this.state.finishCB();\n }\n this.setState({ \n highlights: {\n cut: 'none', \n var: 'none',\n canvas: false\n },\n finishCB: null,\n canvasCb: null,\n interaction: true, \n cbFunction: null }, () => {\n let [id, { x, y }] = data;\n resolve({ id, x, y });\n });\n })\n }\n\n /**\n * Function to enable selection of a cut or variable.\n * @param {Object} selectConfig object that contains highlight selection params\n *\n * selectConfig object should look like { 'cut': 'all', 'var': 'all' }\n * Omitted 'cut' or 'var' will result in either not allowing selection. Beyond 'all',\n * 'even' or 'odd' level cuts can be specified.\n */\n getSelection(selectConfig) {\n return new Promise((resolve, reject) => {\n let { steps, currentStep } = this.state;\n // only allow steps to be conducted at the end of a proof\n if (currentStep+1 !== steps.length) {\n return\n }\n this.setState({ \n highlights: selectConfig, \n interaction: false, \n cbFunction: (id) => {\n this.setState({ \n highlights: {\n cut: 'none', \n var: 'none',\n canvas: false\n },\n interaction: true, \n cbFunction: null }, () => resolve(id));\n }\n });\n });\n }\n\n modifyCanvas(nameOfFunction, finishedCb) {\n // before we modify the canvas, let's save the current state\n let { steps, changeHistory } = this.state;\n changeHistory = changeHistory.slice()\n changeHistory.push({ steps: Array.from(steps) });\n // okay, now we call the requested function from Toolbox\n this.setState({ finishCB: finishedCb }, () => {\n this.state.functions[nameOfFunction]().then(state => {\n if (this.state.finishCB) {\n this.state.finishCB();\n }\n if (state) {\n // now we can apply the new changeHistory\n this.setState({ \n changeHistory: changeHistory, \n redoHistory: [],\n ...state }, () => {\n this.checkLevelIntegrity();\n this.modifyCanvas(nameOfFunction, () => {});\n });\n }\n });\n });\n }\n\n checkLevelIntegrity() {\n let { steps, data, currentStep } = this.state;\n let step = steps[currentStep];\n function verifyLevel(dobj, level) {\n for (let i in dobj) {\n let ob = dobj[i];\n let ids = []\n if (ob.type && ob.type === 'cut') {\n dobj[i].data = verifyLevel(ob.data, level+1);\n data[dobj[i].id].level = level;\n ids.push(ob.id);\n }\n else ids.push(ob);\n for (let i in ids) {\n data[ids[i]].level = level;\n }\n }\n if (dobj.length > 1)\n dobj = dobj.filter(el => el.id || (!el.id && data[el].var !== '\\xa0'));\n return dobj\n }\n steps[currentStep].data = verifyLevel(step.data, 0);\n this.setState({ steps, data });\n }\n\n cancelSelection() {\n let { cbFunction, canvasCb, finishCB } = this.state;\n if (cbFunction) cbFunction();\n if (canvasCb) canvasCb();\n if (finishCB) finishCB();\n }\n\n changePos(id, x, y) {\n let { data } = this.state;\n Object.assign(data[id], { x: x, y: y })\n this.setState(data)\n }\n\n highlightCut(level) {\n if (this.state.highlights.cut === 'all') return true;\n let odd = false;\n if (level % 2 === 1) odd = true;\n if (this.state.highlights.cut === 'odd' && odd) return true;\n else if (this.state.highlights.cut === 'even' && !odd) return true;\n return false;\n }\n\n highlightVar(level) {\n if (this.state.highlights.var === 'all') return true;\n let odd = false;\n if (level % 2 === 1) odd = true;\n if (this.state.highlights.var === 'odd' && odd) return true;\n else if (this.state.highlights.var === 'even' && !odd) return true;\n return false;\n }\n\n createElement(text, type, currentStep, x, y) {\n let { data } = this.state;\n let id = nanoid();\n data[id] = {};\n data[id].x = x || 0;\n data[id].y = y || 0;\n data[id].type = type;\n data[id].var = text;\n currentStep.push(id);\n this.setState({ data });\n }\n\n removeElement(id) {\n let { steps } = this.state;\n steps[this.state.currentStep].push(id);\n }\n\n renderStep(stepIndex) {\n let { data } = this.state;\n let step = this.state.steps[stepIndex];\n if (step) {\n const setXY = (id,x,y) => {\n let { data } = this.state;\n data[id].x = x;\n data[id].y = y;\n this.setState({ data: data });\n }\n\n const renderRecurse = (step) => {\n let jsx = [];\n if (step.length === 0) {\n this.createElement(\"\\xa0\", \"emptyvar\", step, 0, 0);\n }\n for (let s in step) {\n if (step[s].type === \"cut\") {\n let level = data[step[s].id].level;\n const ids = [];\n const getIds = (step) => {\n if (step.data) \n for (let i in step.data)\n getIds(step.data[i]);\n else ids.push(step);\n }\n getIds(step[s])\n let groupElement = (\n {\n ids.forEach(id => {\n this.moveVars[id](x,y);\n });\n }}\n key={step[s].id}\n selectedCallback={this.state.cbFunction}>\n {renderRecurse(step[s].data)}\n \n );\n jsx.push(groupElement);\n } else if (this.state.data[step[s]].type === \"var\") {\n let el = this.state.data[step[s]];\n let level = data[step[s]].level;\n jsx.unshift(\n setXY(step[s],x,y)}\n subscribeMove={f => this.moveVars[step[s]] = f}\n key={step[s]}>\n {el.var}\n \n );\n } else if (this.state.data[step[s]].type === \"emptyvar\" && step.length === 1) {\n let el = this.state.data[step[s]];\n jsx.unshift(\n {}}\n panzoom={this.panzoom}\n interaction={this.state.interaction}\n getCoords={this.getSVGCoords}\n setCoords={(x,y) => setXY(step[s],x,y)}\n subscribeMove={f => this.moveVars[step[s]] = f}\n key={step[s]}>\n {el.var}\n \n );\n }\n }\n return jsx;\n }\n renderRecurse.bind(this);\n return renderRecurse(step.data, (f)=>{})\n }\n }\n\n componentDidMount() { \n this.panzoom = Panzoom(this.canvas.current, {\n maxZoom: 6,\n minZoom: 0.5\n });\n // this.canvasContainer.current.addEventListener('wheel', this.panzoom.zoomWithWheel);\n const vw = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n const vh = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n // if there are no existing steps, init first step\n let { steps } = this.state;\n if (steps.length === 0) {\n let { premises } = this.state.proof;\n console.log(premises)\n console.log(premises.join(''))\n console.log(convertToArray(premises.join('')));\n let { stepZero, data } = initXY(convertToArray(premises.join('')), 0);\n steps.push(stepZero);\n this.setState({ steps: steps, data: data });\n }\n // required to use setState to trigger re-render after creation of panzoom\n this.setState({ });\n let step = this.state.steps[this.state.currentStep];\n\n // center the canvas elements\n this.panzoom.moveTo(vw/2 - step.w, vh/2 - step.h);\n this.panzoom.zoomTo(vw/2 - step.w, vh/2 - step.h, 2);\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this);\n }\n\n /**\n * @param {int} X on the DOM\n * @param {int} Y on the DOM\n * @return {(int, int)} x,y pair representing point on Canvas\n */\n getSVGCoords(domX, domY) {\n var pt = this.canvasContainer.current.createSVGPoint();\n pt.x = domX;\n pt.y = domY;\n return pt.matrixTransform(this.canvas.current.getScreenCTM().inverse());\n }\n\n clickedCanvas(e) {\n if (this.state.canvasCb) {\n let { x, y } = this.getSVGCoords(e.pageX,e.pageY)\n this.state.canvasCb(x,y);\n }\n }\n\n requestInput() {\n return new Promise((resolve, reject) => {\n this.setState({ \n showOverlay: true,\n cbFunction: (formula) => {\n if (formula == null) resolve(null);\n else resolve(formula);\n this.setState({ showOverlay: false, cbFunction: null });\n } \n });\n });\n }\n\n render() {\n let { proof, data, steps, currentStep, highlight, showOverlay, changeHistory } = this.state;\n // every time a re-render happens, ensure top-level state is up-to-date\n this.props.saveProof({ ...proof, data, steps, changeHistory });\n // zooming function does nothing unless panzoom is initialized\n let zoomWithWheel = () => {}\n if (this.panzoom)\n zoomWithWheel = this.panzoom.zoomWithWheel\n // CSSTransitionGroup lets us have entry fade-in\n let tex = convertToTeX(this.state.formula);\n let eg = convertToEG(this.state.formula);\n\n return (\n \n
\n

Fitch-Style Formula to Insert

\n {false && (\n {\n this.setState({ fitchNotation: !this.state.fitchNotation }); \n }} />\n
)}\n
\n \n \n \n \n \n \n \n \n
\n this.setState({ formula: e.target.value, eg: convertToEG(e.target.value) }) } />\n \n {tex && }\n
\n To insert: {eg && }\n
\n { false &&
\n this.setState({ formula: e.target.value, eg: e.target.value }) } />
\n To insert: \n
}\n \n \n \n \n
\n
\n \n
\n \n );\n }\n}\n\nexport default Canvas;\n","import React from 'react';\nimport verify from '../verifySentence';\nimport { convertToTeX, convertToEG } from '../converters';\n// KATEX\nimport 'katex/dist/katex.min.css';\nimport TeX from '@matejmazur/react-katex';\nimport './CreateNew.scss';\n\nclass CreateNew extends React.Component {\n constructor(props) {\n super(props);\n \n this.state = {\n premises: [\n ''\n ],\n conclusion: ''\n };\n\n this.handleChange.bind(this)\n this.removePremise.bind(this)\n this.verify = this.verify.bind(this)\n this.create = this.create.bind(this)\n this.filename = React.createRef()\n }\n\n componentDidMount() {\n\n }\n\n handleChange(e, i) {\n if (i != null) {\n let { premises } = this.state;\n premises[i] = e.target.value;\n this.setState({ premises: premises })\n }\n else this.setState({ conclusion: e.target.value })\n }\n\n removePremise(index) {\n let { premises } = this.state;\n premises.splice(index, 1);\n this.setState({ premises: premises })\n }\n\n verify() {\n let { premises, conclusion } = this.state;\n for (let i in premises) {\n if (premises[i] === '' || !premises[i])\n return false;\n }\n if (conclusion === '' || !conclusion)\n return false;\n return true;\n }\n\n create() {\n console.log(\"Creating...\")\n console.log(\"Verification concluded \" + this.verify())\n if (this.verify()) {\n let { premises, conclusion } = this.state;\n for (let i in premises) {\n premises[i] = convertToEG(premises[i])\n console.log(premises[i])\n }\n conclusion = convertToEG(conclusion)\n this.props.setupFunc(this.filename.current.value, { premises, conclusion, steps: [] })\n }\n }\n\n getFormulaCell(formula, i) {\n let tex, eg\n if (verify(formula)) {\n tex = convertToTeX(formula);\n eg = convertToEG(formula);\n }\n let closeBtn = this.removePremise(i)}>\n ✕\n ;\n let formulaInput = this.handleChange(e,i) } />;\n if (i == null) {\n formulaInput = this.handleChange(e) } />;\n closeBtn = ;\n }\n if (i === 0) \n closeBtn = ;\n return (\n \n \n {formulaInput}\n \n \n {tex && }\n \n \n {eg && }\n \n { closeBtn }\n \n );\n }\n\n render() {\n let { premises, conclusion } = this.state;\n return (\n
\n

Create New

\n

File Name

\n \n \n \n
\n

Premises

\n \n \n \n \n \n {premises.map((formula,i) => this.getFormulaCell(formula, i))}\n \n \n \n \n
\n Formula\n TeX notationEG notation\n
this.setState({ premises: premises.concat(['']) }) }>\n Add New Premise\n \n
\n

Conclusion

\n \n \n {this.getFormulaCell(conclusion)}\n \n
\n
\n );\n }\n}\n\nexport default CreateNew;","import React from 'react';\nimport CreateNew from './CreateNew';\nimport { ReactSVG } from 'react-svg';\nimport './intro.scss';\n\nconst IntroContent = ({ recentDocs }) => (\n
\n
\n

Existential Graphs

\n

\n Using this tool, you can initialize proofs in the existential graph schema and then you can go through the process of solving them. You can save these proofs and look back at them later.\n

\n
\n
\n
\n

Recent Proofs

\n {Object.keys(recentDocs).map(name => (\n
\n recentDocs[name].open()}>\n {name}\n \n recentDocs[name].delete()}\n >Delete\n
\n ))}\n
\n
\n);\n\nclass IntroWindow extends React.Component {\n constructor(props) {\n super(props);\n this.createView = React.createRef();\n this.callCreate = this.callCreate.bind(this);\n this.animateAway = this.animateAway.bind(this);\n this.openFile = this.openFile.bind(this);\n this.state = {\n createShown: false,\n floatingWindowCSS: 'floating-window shown'\n };\n }\n\n componentDidMount() {\n }\n\n animateAway() {\n this.setState({ floatingWindowCSS: 'floating-window' })\n }\n\n callCreate() {\n this.createView.current.create();\n }\n\n openFile() {\n const input = document.createElement(\"input\");\n input.setAttribute(\"type\", \"file\");\n input.setAttribute(\"accept\", \".egprf\");\n input.onchange = (evt) => {\n console.log(\"ONCHANGE\")\n evt.stopPropagation();\n evt.preventDefault();\n var file = evt.target.files[0];\n console.log(file);\n var reader = new FileReader();\n reader.addEventListener('load', (evt) => {\n try {\n let res = JSON.parse(evt.target.result);\n console.log(res);\n this.props.setupFunc(file.name.split(\".egprf\")[0], res);\n } catch (e) {\n console.error(e);\n alert(\"Corrupt file or improper formatting.\");\n }\n });\n reader.readAsText(file);\n };\n input.click();\n }\n\n render() {\n const { createShown, floatingWindowCSS } = this.state;\n return (\n
\n {!createShown && }\n {createShown && }\n {!createShown && (\n
\n \n \n
\n )}\n {createShown && (\n
\n \n \n
\n )}\n
\n );\n }\n}\n\nexport default IntroWindow;","import React from 'react';\nimport './App.scss';\nimport Canvas from './canvas/Canvas';\nimport IntroWindow from './intro/IntroWindow';\n\nvar localStorage = window.localStorage;\n\nclass App extends React.Component {\n constructor(props) {\n super(props);\n \n this.createNewProof = this.createNewProof.bind(this);\n this.setupProof = this.setupProof.bind(this);\n this.openCanvas = this.openCanvas.bind(this);\n this.saveProof = this.saveProof.bind(this);\n this.getRecents = this.getRecents.bind(this);\n this.introWindow = React.createRef();\n this.state = {\n initialCSS: 'initial',\n canvasOpen: false,\n popupOpen: false,\n filename: '',\n proof: {\n premises: [],\n conclusion: '',\n steps: []\n },\n recentDocs: this.getRecents()\n };\n \n console.log(this.state.recentDocs)\n // this.state = {\n // initialCSS: 'initial',\n // canvasOpen: true,\n // popupOpen: false,\n // proof: {premises: [\"({Q})(({P}){Q})\"], conclusion: \"{Q}\", steps:[] }\n // };\n\n this.menuItems = [\n { \n title: 'Exit', \n func: () => {\n this.setState({ \n initialCSS: 'initial',\n canvasOpen: false,\n popupOpen: false,\n filename: '',\n proof: {\n premises: [],\n conclusion: '',\n steps: []\n },\n recentDocs: this.getRecents()\n }) \n }\n },\n 'separator',\n { \n title: 'Export',\n func: () => {\n const element = document.createElement(\"a\");\n const file = new Blob([JSON.stringify(this.state.proof)], {type: 'text/plain'});\n element.href = URL.createObjectURL(file);\n element.download = this.state.filename + \".egprf\";\n document.body.appendChild(element);\n element.click();\n } \n }\n ]\n }\n\n getRecents() {\n let recents = localStorage.getItem('recentDocs');\n recents = recents ? JSON.parse(recents) : {}\n let keys = Object.keys(recents)\n for (let i in keys) {\n recents[keys[i]].open = () => {\n this.setState({ \n filename: keys[i],\n proof: recents[keys[i]] \n });\n this.openCanvas();\n }\n recents[keys[i]].delete = () => {\n let rArray = localStorage.getItem('recentDocs');\n rArray = rArray ? JSON.parse(rArray) : {}\n delete rArray[keys[i]];\n localStorage.setItem('recentDocs', JSON.stringify(rArray));\n this.setState({ recentDocs: rArray });\n }\n }\n return recents;\n }\n\n saveProof(filename) {\n let { recentDocs } = this.state;\n recentDocs[filename] = this.state.proof;\n return (proof) => {\n recentDocs[filename] = proof;\n localStorage.setItem('recentDocs', JSON.stringify(recentDocs));\n }\n }\n\n setupProof(filename, proof) {\n this.setState({ \n filename: filename,\n proof: proof\n });\n this.openCanvas();\n }\n\n openCanvas() {\n this.setState({ initialCSS: 'initial whiteBG' });\n this.introWindow.current.animateAway();\n setTimeout(() => this.setState({ \n canvasOpen: true\n }), 1000);\n }\n\n createNewProof() {\n this.setState({ popupOpen: true })\n }\n\n render() {\n if (this.state.canvasOpen) {\n return (\n
\n \n
\n );\n }\n return (\n
\n \n
\n );\n }\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.scss';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\n// Root React element, renders the App onload.\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""} \ No newline at end of file -- 2.51.2