diff --git a/dist/css/ueb-style.css b/dist/css/ueb-style.css index d41545f..498b8ba 100644 --- a/dist/css/ueb-style.css +++ b/dist/css/ueb-style.css @@ -740,11 +740,6 @@ ueb-pin[data-connectable=false] .ueb-pin-icon { visibility: hidden; } -.ueb-node-style-event ueb-pin[data-type=delegate] .ueb-pin-icon { - width: 11px; - height: 11px; -} - .ueb-node-inputs .ueb-pin-icon { margin-right: 6px; } diff --git a/dist/css/ueb-style.css.map b/dist/css/ueb-style.css.map index 0757baf..676a0ee 100644 --- a/dist/css/ueb-style.css.map +++ b/dist/css/ueb-style.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../../scss/style.scss","../../scss/ueb-knot.scss","../../scss/ueb-link.scss","../../scss/ueb-node.scss","../../scss/ueb-pin.scss","../../scss/ueb-ui-controls.scss","../../scss/ueb-window.scss"],"names":[],"mappings":"AAAA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;IACI;;EAGJ;IACI;;;AAIR;EACI;;;AAGJ;EACI;EACA;EACA;AACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAEI;EA0BJ,iBAEI;EAQJ;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAEI;EAmDJ,iBAEI;EAWJ,qBAEI;EAOJ;;;AAGJ;EACI;;;AAIJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AChQJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;ACvBJ;EACI;EACA;EACA;AACA;EACA;EACA;EACA;EACA;AACA;AAAA;AAAA;AAAA;EAIA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EAOA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;ACrFJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI,kBACI;EAIJ;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA,eACI;EAOJ;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;AACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA,YACI;EAEJ;EACA,YACI;;;AAIR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;AACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;EAEI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EAMA;EAMA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;EAGI;EACA;;;AAGJ;EACI;EACA;EACA;EACA,YACI;EAEJ;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;AACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAOJ;AAAA;EAEI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAgBR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AC1bJ;EACI;;;AAGJ;EACI;AAAA;AAAA;AAAA;AAAA;AAAA;EAMA;EACA;;;AAGJ;AAAA;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAQR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EAII;EACA;;;AAIR;AAAA;EAEI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;;;AAIR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;ACzQJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;AAEA;EAEI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;AAAA;EAEI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;AAEA;EACI;;;AAIR;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAKA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;;AAIR;AAAA;AAAA;EAGI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;EAGI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;ACnKJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA,YACI;;;AAWR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;AAEA;EAEI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;;AAIR;AAAA;EAEI;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;EAEI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA","file":"ueb-style.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../../scss/style.scss","../../scss/ueb-knot.scss","../../scss/ueb-link.scss","../../scss/ueb-node.scss","../../scss/ueb-pin.scss","../../scss/ueb-ui-controls.scss","../../scss/ueb-window.scss"],"names":[],"mappings":"AAAA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;IACI;;EAGJ;IACI;;;AAIR;EACI;;;AAGJ;EACI;EACA;EACA;AACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAEI;EA0BJ,iBAEI;EAQJ;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAEI;EAmDJ,iBAEI;EAWJ,qBAEI;EAOJ;;;AAGJ;EACI;;;AAIJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AChQJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;ACvBJ;EACI;EACA;EACA;AACA;EACA;EACA;EACA;EACA;AACA;AAAA;AAAA;AAAA;EAIA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EAOA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;ACrFJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI,kBACI;EAIJ;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA,eACI;EAOJ;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;AACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA,YACI;EAEJ;EACA,YACI;;;AAIR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;AACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;EAEI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EAMA;EAMA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;EAGI;EACA;;;AAGJ;EACI;EACA;EACA;EACA,YACI;EAEJ;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;AACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAOJ;AAAA;EAEI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAgBR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AC1bJ;EACI;;;AAGJ;EACI;AAAA;AAAA;AAAA;AAAA;AAAA;EAMA;EACA;;;AAGJ;AAAA;EAEI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAQR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EAII;EACA;;;AAIR;AAAA;EAEI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;;;AAIR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpQJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;AAEA;EAEI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;AAAA;EAEI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;AAEA;EACI;;;AAIR;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAKA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;;AAIR;AAAA;AAAA;EAGI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;EAGI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;ACnKJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA,YACI;;;AAWR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;AAEA;EAEI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;;AAIR;AAAA;EAEI;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;EAEI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA","file":"ueb-style.css"} \ No newline at end of file diff --git a/dist/css/ueb-style.min.css b/dist/css/ueb-style.min.css index 44e75f2..9896fa0 100644 --- a/dist/css/ueb-style.min.css +++ b/dist/css/ueb-style.min.css @@ -1 +1 @@ -@font-face{font-family:"Roboto";font-weight:normal;src:url("../font/roboto-regular.woff2") format("woff2")}@font-face{font-family:"Roboto";font-stretch:condensed;src:url("../font/roboto-condensed-regular.woff2") format("woff2")}ueb-blueprint{--ueb-scale: 1;--ueb-grid-actual-size: var(--ueb-grid-size);display:block;position:relative;font-family:Roboto,Noto,Oxygen,Ubuntu,"Open Sans","Helvetica Neue",sans-serif;font-size:var(--ueb-font-size);color:#fff;user-select:none}ueb-blueprint svg{overflow:visible}.ueb-viewport-header{display:flex;position:absolute;top:0;right:0;left:0;background:rgba(0,0,0,.5);z-index:1}@keyframes ueb-zoom-animation{0%{color:#7f7f7f}100%{color:#2b2b2b}}.ueb-zoom-changed .ueb-viewport-zoom{animation:600ms ueb-zoom-animation}.ueb-viewport-zoom{margin-left:auto;padding:5px;color:#2b2b2b;font-size:154%;font-weight:bold;letter-spacing:-1px}.ueb-viewport-body{position:relative;height:var(--ueb-height, 30rem);overflow:hidden;scrollbar-width:0}.ueb-grid{--ueb-grid-line-actual-width: calc(var(--ueb-grid-line-width) / var(--ueb-scale));position:absolute;min-width:100%;min-height:100%;width:calc((100% + 2*var(--ueb-grid-expand))/var(--ueb-scale));height:calc((100% + 2*var(--ueb-grid-expand))/var(--ueb-scale));background-color:#262626;background-image:linear-gradient(var(--ueb-grid-axis-line-color), var(--ueb-grid-axis-line-color)),linear-gradient(var(--ueb-grid-axis-line-color), var(--ueb-grid-axis-line-color)),linear-gradient(to right, var(--ueb-grid-set-line-color), var(--ueb-grid-set-line-color) var(--ueb-grid-line-actual-width), transparent var(--ueb-grid-line-actual-width), transparent),linear-gradient(to bottom, var(--ueb-grid-set-line-color), var(--ueb-grid-set-line-color) var(--ueb-grid-line-actual-width), transparent var(--ueb-grid-line-actual-width), transparent),linear-gradient(to right, var(--ueb-grid-line-color), var(--ueb-grid-line-color) var(--ueb-grid-line-actual-width), transparent var(--ueb-grid-line-actual-width), transparent),linear-gradient(to bottom, var(--ueb-grid-line-color), var(--ueb-grid-line-color) var(--ueb-grid-line-actual-width), transparent var(--ueb-grid-line-actual-width), transparent);background-size:100% var(--ueb-grid-line-actual-width),var(--ueb-grid-line-actual-width) 100%,calc(var(--ueb-grid-set)*var(--ueb-grid-actual-size)) calc(var(--ueb-grid-set)*var(--ueb-grid-actual-size)),calc(var(--ueb-grid-set)*var(--ueb-grid-actual-size)) calc(var(--ueb-grid-set)*var(--ueb-grid-actual-size)),var(--ueb-grid-actual-size) var(--ueb-grid-actual-size),var(--ueb-grid-actual-size) var(--ueb-grid-actual-size);background-position:calc(var(--ueb-translate-x)*1px) calc(var(--ueb-translate-y)*1px);background-repeat:repeat-x,repeat-y,repeat,repeat,repeat,repeat;scale:var(--ueb-scale) var(--ueb-scale);transform-origin:0 0;overflow:hidden}ueb-blueprint[data-scrolling=true] .ueb-grid{cursor:grabbing}ueb-blueprint[data-scrolling=false] .ueb-grid{cursor:default}ueb-blueprint.ueb-zoom--4{--ueb-grid-actual-size: calc(var(--ueb-grid-size) * 2);--ueb-node-radius: 0 !important}ueb-blueprint.ueb-zoom--6{--ueb-grid-actual-size: calc(var(--ueb-grid-size) * 3)}ueb-blueprint.ueb-zoom--11{--ueb-grid-actual-size: calc(var(--ueb-grid-size) * 6)}.ueb-grid-content{position:relative;width:0;height:0;transform:translateX(calc(var(--ueb-translate-x) * 1px)) translateY(calc(var(--ueb-translate-y) * 1px))}.ueb-grid-content>div{width:0;height:0}.ueb-positioned,ueb-blueprint[data-selecting=true] ueb-selector{position:absolute}ueb-selector{display:block;position:absolute;visibility:hidden;top:0;left:0;width:0;height:0;background-image:repeating-linear-gradient(90deg, transparent, transparent calc(1px / var(--ueb-scale)), white calc(2px / var(--ueb-scale)), white calc(7px / var(--ueb-scale)), transparent calc(7px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(90deg, black, black calc(8px / var(--ueb-scale)), transparent calc(9px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(90deg, transparent, transparent calc(1px / var(--ueb-scale)), white calc(2px / var(--ueb-scale)), white calc(7px / var(--ueb-scale)), transparent calc(7px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(90deg, black, black calc(8px / var(--ueb-scale)), transparent calc(9px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(180deg, transparent, transparent calc(1px / var(--ueb-scale)), white calc(1px / var(--ueb-scale)), white calc(7px / var(--ueb-scale)), transparent calc(7px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(180deg, black, black calc(8px / var(--ueb-scale)), transparent calc(9px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(0deg, transparent, transparent calc(1px / var(--ueb-scale)), white calc(2px / var(--ueb-scale)), white calc(7px / var(--ueb-scale)), transparent calc(7px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(0deg, black, black calc(8px / var(--ueb-scale)), transparent calc(9px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale)));background-size:100% calc(1px/var(--ueb-scale)),100% calc(3px/var(--ueb-scale)),100% calc(1px/var(--ueb-scale)),100% calc(3px/var(--ueb-scale)),calc(1px/var(--ueb-scale)) 100%,calc(3px/var(--ueb-scale)) 100%,calc(1px/var(--ueb-scale)) 100%,calc(3px/var(--ueb-scale)) 100%;background-position:0 calc(1px/var(--ueb-scale)),0 0,0 calc(100% - 1px/var(--ueb-scale)),0 100%,calc(1px/var(--ueb-scale)) 0,0 0,calc(100% - 1px/var(--ueb-scale)) 0,100% 0;background-repeat:no-repeat}ueb-blueprint[data-selecting=true] ueb-selector{visibility:visible}ueb-selector>*{visibility:visible}.ueb-ellipsis-nowrap-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}ueb-node.ueb-node-style-minimal{box-shadow:none}ueb-node.ueb-node-style-minimal ueb-pin{margin:0;padding:0;min-height:0}ueb-node.ueb-node-style-minimal ueb-pin[data-direction=input]{display:none}ueb-node.ueb-node-style-minimal .ueb-node-border{padding:8px 16px;background:none !important}ueb-node.ueb-node-style-minimal .ueb-pin-wrapper{margin:0;padding:4px 6px}ueb-node.ueb-node-style-minimal[data-selected=true] .ueb-node-border{box-shadow:inset 0 0 0px 6px #d29e07}ueb-link{position:absolute;--ueb-link-color: rgb(var(--ueb-link-color-rgb));--ueb-from-input-coefficient: calc(2 * var(--ueb-from-input) - 1);--ueb-y-reflected: clamp(0, var(--ueb-from-y) - var(--ueb-to-y) - 1, 1);display:block;margin-left:calc(var(--ueb-link-start)*-1px);min-width:calc(var(--ueb-link-min-width)*1px);visibility:hidden}ueb-link>svg{--ueb-y-reflected-coefficient: calc(2 * var(--ueb-y-reflected) - 1);position:absolute;width:100%;height:100%;min-height:1px;transform:scaleY(calc(var(--ueb-y-reflected-coefficient) * var(--ueb-from-input-coefficient)));z-index:1}ueb-link .ueb-link-path{visibility:visible;stroke:var(--ueb-link-color);stroke-width:calc(1.5px/var(--ueb-scale));transition:stroke-width .8s}ueb-link .ueb-link-area{visibility:visible;stroke-width:20px}ueb-link[data-dragging=true] .ueb-link-path,.ueb-link-area:hover~.ueb-link-path{stroke-width:calc(6px/var(--ueb-scale))}ueb-link[data-dragging=true] .ueb-link-message{display:block;visibility:visible}.ueb-link-message{display:none;position:absolute;top:calc(100%*(1 - var(--ueb-y-reflected)) + 22px);left:calc((1 - var(--ueb-from-input))*100% + (var(--ueb-from-input-coefficient))*var(--ueb-start-percentage) + 15px);border:1px solid #000;border-radius:2px;background:linear-gradient(to bottom, #2a2a2a 0, #151515 50%, #2a2a2a 100%);color:var(--ueb-pin-dim-color);white-space:nowrap;z-index:1000000}.ueb-link-message-icon{display:inline-block;padding:4px;width:16px;height:16px;vertical-align:middle}.ueb-link-message-text{padding:4px;padding-left:0;vertical-align:middle}.ueb-link-message-icon svg{width:100%;height:100%}ueb-node{display:block;position:absolute;min-width:100px;border-radius:var(--ueb-node-radius);box-shadow:0 0 1px 0 #000,1px 4px 6px 0 rgba(0,0,0,.6);font-weight:lighter}ueb-node.ueb-node-style-minimal,ueb-node.ueb-node-style-comment{min-width:0}.ueb-zoom--2 ueb-node{box-shadow:none}.ueb-node-border{margin:-3px;padding:3px;border-radius:calc(var(--ueb-node-radius)*1.4)}.ueb-zoom--2 .ueb-node-border{margin:0;padding:0}ueb-node[data-selected=true]>.ueb-node-border{background-image:linear-gradient(to right, #f1b000 0%, #f1b000 100%),linear-gradient(to bottom, #f1b000 0%, #cc6700 100%),linear-gradient(to right, #cc6700 0%, #cc6700 100%),linear-gradient(to bottom, #f1b000 0%, #cc6700 100%);background-size:100% 7px,7px 100%,100% 7px,7px 100%;background-position:top,right,bottom,left;background-repeat:repeat-x,repeat-y,repeat-x,repeat-y}.ueb-zoom--2 ueb-node[data-selected=true]>.ueb-node-border{background:none !important;outline:3px solid #ff8d00}.ueb-zoom--10 ueb-node[data-selected=true]>.ueb-node-border{outline-width:8px}.ueb-node-wrapper{display:grid;grid-template:"top top top" min-content "input center output" min-content "input center variadic" 1fr "development development development" min-content "expansion expansion expansion" min-content/min-content auto min-content;justify-items:space-between;padding:1px;box-sizing:border-box;box-shadow:inset 0 0 2px 0 #000;border-radius:var(--ueb-node-radius);background:rgba(14,16,10,.8);overflow:hidden}ueb-node.ueb-node-style-operation .ueb-node-wrapper{grid-template-rows:min-content auto auto min-content min-content;grid-template-columns:50% 0% 1fr;box-shadow:none}.ueb-node-outputs ueb-pin[data-type=exec] .ueb-pin-wrapper{min-height:26px}ueb-node.ueb-node-style-operation.ueb-node-has-inputs .ueb-node-inputs{align-self:center;padding-right:40px}.ueb-node-style-operation:not(.ueb-node-is-variadic) .ueb-node-outputs{grid-row:2/4;align-self:center}ueb-blueprint[data-scrolling=false][data-selecting=false] .ueb-draggable{cursor:move}.ueb-zoom--2 .ueb-node-wrapper{box-shadow:none;padding:0;background:#101010}.ueb-node-top{grid-area:top;color:#d0d0d0;font-size:103%;font-weight:bold;line-height:120%;white-space:nowrap}ueb-node.ueb-node-style-setter .ueb-node-top{max-height:5px}ueb-node.ueb-node-style-comment .ueb-node-top{white-space:normal}ueb-node.ueb-node-style-event .ueb-node-top{display:flex;justify-content:space-between;align-items:center;padding-right:2px}.ueb-node-style-default .ueb-node-top{padding:2px 20px 2px 8px;box-shadow:inset 5px 1px 5px -3px rgba(255,255,255,.2509803922),inset 0 1px 2px 0 rgba(255,255,255,.2509803922);border-radius:var(--ueb-node-radius) var(--ueb-node-radius) 0 0;background:linear-gradient(rgba(255, 255, 255, 0.1882352941) 1px, transparent 1px),linear-gradient(170deg, rgb(var(--ueb-node-color)) 0%, rgb(var(--ueb-node-color)) 50%, transparent 100%)}.ueb-zoom--2 .ueb-node-top{box-shadow:none}.ueb-zoom--2 .ueb-node-style-default .ueb-node-top{background:rgb(var(--ueb-node-color))}.ueb-node-name{display:flex;align-items:center;background:radial-gradient(ellipse 100% 100% at 35% 55%, rgba(0, 0, 0, 0.5) 15%, transparent 50%);margin:-1px -15px;padding:2px 15px}.ueb-node-style-setter .ueb-node-name{justify-content:center}.ueb-node-name:last-child{padding-right:26px}.ueb-zoom--2 .ueb-node-name{background:none}.ueb-zoom--8 .ueb-node-name{visibility:hidden}.ueb-node-name-symbol{align-self:flex-start;margin-right:5px;width:16px;height:16px;color:#74bff2}ueb-node[data-pure-function=true] .ueb-node-name-symbol{color:#aaeda0}.ueb-node-name-symbol path{vertical-align:middle}.ueb-node-subtitle-text{padding-top:1px;padding-right:5px;font-size:calc(.946154*var(--ueb-font-size));font-weight:100;font-style:italic;color:#a9b78f}.ueb-node-inputs{grid-area:input}ueb-node.ueb-node-has-inputs .ueb-node-inputs{padding-right:15px;padding-left:6px}.ueb-node-outputs{grid-area:output}.ueb-node-outputs,.ueb-node-variadic{padding-right:6px}.ueb-node-variadic{grid-area:variadic;margin-top:10px;margin-bottom:5px;align-self:start;justify-self:end;white-space:nowrap;cursor:pointer}.ueb-node-developmentonly{grid-area:development;margin-top:4px;padding:2px;background:repeating-linear-gradient(-45deg, transparent 0, #57590a 1px, #57590a 11px, transparent 12px, transparent 24px);background:repeating-linear-gradient(-45deg, transparent 0, #57590a 1px, #57590a 11px, transparent 12px, transparent 24px);text-align:center}.ueb-node-developmentonly-text{padding:0 10px;letter-spacing:.04em;text-shadow:1px 1px 1px #000;white-space:nowrap}.ueb-zoom--6 .ueb-node-developmentonly-text{visibility:hidden}.ueb-node-expansion{grid-area:expansion;display:none;text-align:center}ueb-node[data-advanced-display] .ueb-node-expansion{display:block}ueb-blueprint[data-scrolling=false][data-selecting=false] .ueb-node-expansion:hover{background-color:#656765;cursor:pointer}.ueb-zoom--8 .ueb-node-expansion{visibility:hidden}.ueb-node-variadic>svg,.ueb-node-expansion>svg{width:16px;height:16px;vertical-align:middle}ueb-node[data-advanced-display=Shown] .ueb-node-expansion>svg{transform:scaleY(-1)}ueb-node.ueb-node-style-glass .ueb-node-wrapper,ueb-node.ueb-node-style-glass .ueb-node-border,ueb-node.ueb-node-style-glass{min-width:128px;border-radius:15px}ueb-node.ueb-node-style-glass .ueb-node-wrapper{border:1px solid #000;box-shadow:0 1px 0 0 rgba(255,255,255,.6) inset;padding:3px;background:linear-gradient(to bottom, rgba(255, 255, 255, 0.3) 0, rgba(255, 255, 255, 0.2) 4px, rgba(0, 0, 0, 0.3) 14px),linear-gradient(to right, transparent 10%, rgba(var(--ueb-node-color), 0.3) 50%, transparent 90%);background-size:100%,100% 28px;background-repeat:repeat,no-repeat}ueb-node.ueb-node-style-glass .ueb-node-name{padding-right:0;padding-left:0}ueb-node[data-selected=true] .ueb-node-border{box-shadow:inset 0 0 0px 6px #ce8700;background:none}ueb-node.ueb-node-style-glass .ueb-node-top,ueb-node.ueb-node-style-glass .ueb-node-name{margin:0;box-shadow:none;border-radius:0;background:none}ueb-node.ueb-node-style-glass .ueb-node-outputs:first-child{padding-left:12px}ueb-node.ueb-node-style-operation .ueb-node-top{grid-area:center;align-self:center;justify-self:center;padding:0;font-size:215%;font-stretch:condensed;font-weight:bold;line-height:100%}ueb-node.ueb-node-style-operation.ueb-node-style-metasound .ueb-node-top{font-size:333%;font-stretch:expanded}ueb-node.ueb-node-style-operation.ueb-node-style-glass .ueb-node-top{z-index:-1}ueb-node.ueb-node-style-operation .ueb-node-outputs{align-self:end}ueb-node.ueb-node-style-operation .ueb-node-variadic{align-self:start;margin-top:12px;margin-left:-100px}ueb-node.ueb-node-style-metasound .ueb-node-wrapper{border:1px solid #000;box-shadow:0 1px 0 0 rgba(255,255,255,.4) inset;background:linear-gradient(to bottom, rgba(52, 55, 52, 0.9) 0, rgba(42, 44, 42, 0.9) 8px, rgba(31, 32, 31, 0.8) 16px, rgba(13, 14, 13, 0.9))}ueb-node.ueb-node-style-metasound .ueb-node-name-text,ueb-node.ueb-node-style-metasound .ueb-node-name-symbol{color:#8cc483}ueb-node.ueb-node-style-metasound.ueb-node-style-operation .ueb-node-name-text{color:#7c7c7c}ueb-node.ueb-node-style-metasound .ueb-node-name{margin:0px;padding:1px 15px;justify-content:center;background:none}ueb-node:not(.ueb-node-style-comment){z-index:10}ueb-node.ueb-node-style-comment .ueb-node-border{height:100%}ueb-node.ueb-node-style-comment .ueb-node-wrapper{position:relative;padding:0;height:100%;border-radius:0;background:rgba(var(--ueb-node-color), 0.35);box-shadow:none}ueb-node.ueb-node-style-comment .ueb-node-wrapper::after{content:"";display:block;position:absolute;right:3px;bottom:3px;width:16px;height:16px;background:linear-gradient(135deg, transparent 50%, #fff 50%, #fff calc(50% + 2px), transparent calc(50% + 2px), transparent calc(50% + 3px), #fff calc(50% + 3px), #fff calc(50% + 5px), transparent calc(50% + 5px), transparent calc(50% + 7px), #fff calc(50% + 7px), #fff calc(50% + 9px), transparent calc(50% + 9px))}ueb-node.ueb-node-style-comment .ueb-node-top{position:relative;margin:3px;padding:3px 10px;box-shadow:none;border-radius:0;background:rgb(var(--ueb-node-color));color:#fff;font-size:185%;text-shadow:2px 1px 1px #444,0 0 2px #bbb;line-height:1.22;z-index:1}ueb-node.ueb-node-style-conversion .ueb-node-wrapper::after{content:"";display:block;grid-area:center;align-self:center;justify-self:center;margin:10px 10px 10px -6px;width:6px;height:6px;border-radius:3px;background:#8f8f8f}ueb-blueprint{--ueb-pin-color-dim: #afafaf}ueb-pin{--ueb-pin-background: linear-gradient(90deg, rgba(var(--ueb-pin-color-rgb), 0.15), rgba(var(--ueb-pin-color-rgb), 0.8) 15%, rgba(var(--ueb-pin-color-rgb), 0.5) 60%, rgba(var(--ueb-pin-color-rgb), 0.35) 95%, transparent);--ueb-pin-color: rgb(var(--ueb-pin-color-rgb));display:block}.ueb-node-inputs ueb-pin,.ueb-node-outputs ueb-pin{margin:6px 0}ueb-pin.ueb-pin-input-wrap .ueb-pin-content{flex-direction:column;align-items:start}.ueb-node-top ueb-pin{min-height:0;margin-left:10px}.ueb-zoom--10 ueb-pin{visibility:hidden}ueb-node[data-advanced-display=Hidden] ueb-pin[data-advanced-view=true][data-linked=false]{display:none}.ueb-pin-wrapper{display:inline-flex;box-sizing:border-box;padding:3px 6px;min-height:24px;align-items:center}ueb-node.ueb-node-style-operation .ueb-pin-wrapper{padding:0}ueb-node.ueb-node-style-minimal .ueb-pin-wrapper{min-height:0}.ueb-node-top .ueb-pin-wrapper{padding:2px 4px 2px 10px;min-height:0;vertical-align:bottom}ueb-blueprint[data-scrolling=false][data-selecting=false] .ueb-pin-wrapper:hover{background:var(--ueb-pin-background);cursor:crosshair}.ueb-zoom--8 .ueb-pin-wrapper:hover{background:none !important}.ueb-pin-content{display:flex;align-items:center}.ueb-node-outputs ueb-pin{text-align:right}.ueb-pin-icon{color:var(--ueb-pin-color);text-align:left}ueb-pin[data-connectable=false] .ueb-pin-icon{visibility:hidden}.ueb-node-style-event ueb-pin[data-type=delegate] .ueb-pin-icon{width:11px;height:11px}.ueb-node-inputs .ueb-pin-icon{margin-right:6px}.ueb-node-outputs .ueb-pin-icon{margin-left:4px}.ueb-pin-icon>svg{display:block}ueb-pin[data-direction=output] .ueb-pin-reflect-output{transform:scaleX(-1)}ueb-pin[data-type=exec] .ueb-pin-icon{width:15px;height:15px;--ueb-pin-color: white}ueb-pin[data-linked=true] .ueb-pin-tofill{fill:currentColor}ueb-pin[data-linked=true] .ueb-pin-tostroke{stroke:#000}ueb-pin.ueb-node-variadic-default{position:relative;margin-top:14px}ueb-pin.ueb-node-variadic-default::before{content:"";display:block;position:absolute;width:100%;height:1px;top:-8px;left:6px;background:linear-gradient(90deg, transparent 0, #404240 6px, #404240 calc(100% - 6px), transparent 100%)}.ueb-zoom--6 .ueb-pin-content{visibility:hidden}ueb-node[data-type="/Script/BlueprintGraph.K2Node_VariableSet"] ueb-pin[data-direction=output] .ueb-pin-content{display:none}.ueb-pin-input-wrapper{display:flex;padding-left:8px}.ueb-pin-input{margin-left:5px;border:1px solid #a0a0a0;border-radius:3px;padding:0 4px 0 4px;color:#e0e0e0}.ueb-pin-input:hover,.ueb-pin-input:active,.ueb-pin-input:focus,.ueb-pin-input:focus-within{background:rgba(255,255,255,.2745098039);outline:none}ueb-pin[data-linked=true] .ueb-pin-input,ueb-pin[data-linked=true] .ueb-pin-input-wrapper{display:none}ueb-pin[data-type=bool] .ueb-pin-input{appearance:none;padding:0;height:18px;width:18px;background-color:#0f0f0f;color:var(--ueb-pin-color)}ueb-pin[data-type=bool] .ueb-pin-input:checked{background-image:url('data:image/svg+xml,')}ueb-pin[data-type="/Script/CoreUObject.LinearColor"] .ueb-pin-input{padding:0;width:18px;height:18px;border-color:#505050;border-radius:0;background-color:var(--ueb-linear-color)}.ueb-pin-input-label~.ueb-pin-input{margin-left:2px}.ueb-pin-input-label{margin-left:10px;color:#777}.ueb-pin-input-label:first-child{margin-left:2px}.ueb-pin-input-content{display:block;outline:none;border:none;padding:0;min-width:10px;max-width:400px;max-height:16em;font-size:97%;white-space:nowrap;background:none;color:inherit;overflow:auto}.ueb-pin-input-content::-webkit-scrollbar{width:10px;height:10px}.ueb-pin-input-content::-webkit-scrollbar-thumb{background:rgba(0,0,0,0);border-radius:10px;margin:4px}.ueb-pin-input-content:hover::-webkit-scrollbar-thumb{background:#575757}ueb-blueprint[data-scrolling=false][data-selecting=false] .ueb-pin-input-content:hover{cursor:text}ueb-dropdown{display:block}ueb-dropdown.ueb-pin-input{margin-right:5px;padding-right:10px;background:#101010 !important;color:silver;border-color:#404040}ueb-dropdown.ueb-pin-input .ueb-pin-input-content{padding:6px;width:max(170px,var(--ueb-dropdown-width));max-width:400px;background:none;font-size:10px;letter-spacing:-0.2px;cursor:default !important}.ueb-button{min-width:60px;border:1px solid #0f0f0f;border-radius:4px;padding:2px 10px;background:#383838;text-align:center;cursor:pointer}.ueb-button:hover{background:#575757}.ueb-buttons{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}.ueb-vertical-slider>ueb-ui-slider{position:relative;padding-bottom:10px}.ueb-vertical-slider>ueb-ui-slider::before,.ueb-vertical-slider>ueb-ui-slider::after{content:"";display:block;position:absolute;width:0;height:0;border:5px solid rgba(0,0,0,0)}.ueb-vertical-slider>ueb-ui-slider::before{left:-4px;border-left-color:#e0e0e0}.ueb-vertical-slider>ueb-ui-slider::after{right:-4px;border-right-color:#e0e0e0}.ueb-horizontal-slider,.ueb-text-input{position:relative;border:1px solid #383838;border-radius:6px;background:#0f0f0f}.ueb-horizontal-slider{position:relative;padding:1px}.ueb-horizontal-slider:hover{cursor:ew-resize}ueb-window .ueb-pin-input-content{padding:1px 10px}.ueb-horizontal-slider>ueb-ui-slider{display:block;position:relative;height:20px;border-radius:5px;background:#383838}.ueb-horizontal-slider-text{position:absolute;padding:0 5px;line-height:20px;z-index:1}.ueb-toggle-control::before{content:"";display:inline-block;border-top:5px solid #e0e0e0;border-left:5px solid rgba(0,0,0,0);border-right:5px solid rgba(0,0,0,0);vertical-align:middle}.ueb-toggle-control:hover{cursor:pointer}.ueb-resizeable-top,.ueb-resizeable-top-right,.ueb-resizeable-top-left{position:absolute;top:0;height:10px}.ueb-resizeable-top{right:0;left:0;cursor:ns-resize}.ueb-resizeable-top-right{right:0;width:10px;cursor:nesw-resize}.ueb-resizeable-top-left{left:0;width:10px;cursor:nwse-resize}.ueb-resizeable-right{position:absolute;top:0;right:0;bottom:0;width:10px;cursor:ew-resize}.ueb-resizeable-bottom,.ueb-resizeable-bottom-right,.ueb-resizeable-bottom-left{position:absolute;bottom:-3px;height:10px;cursor:ns-resize}.ueb-resizeable-bottom{right:0;left:0}.ueb-resizeable-bottom-right{right:0;width:10px;cursor:nwse-resize}.ueb-resizeable-bottom-left{left:0;width:10px;cursor:nesw-resize}.ueb-resizeable-left{position:absolute;top:0;bottom:0;left:0;width:10px;cursor:ew-resize}ueb-window{display:block;position:absolute;border:2px solid #101010;top:0;left:0;transform:translateX(calc(var(--ueb-position-x) * 1px)) translateY(calc(var(--ueb-position-y) * 1px));background:#242424;box-shadow:0 0 2px 0 rgba(0,0,0,.6274509804);z-index:1000}.ueb-window-top{display:flex;flex-direction:row;align-items:center;padding:4px 8px;height:30px;background:#1a1a1a}.ueb-window-content{padding:10px;border:1px solid #303030}.ueb-window-name{flex-grow:1;padding-left:28px;text-align:center}.ueb-window-close{padding:8px;height:12px;width:12px;cursor:pointer}.ueb-color-picker-theme,.ueb-color-picker-srgb{display:inline-block;vertical-align:middle}.ueb-color-picker-main{display:grid;grid-template:1fr/auto min-content min-content min-content}.ueb-color-picker-wheel{position:relative;padding-top:100%;min-width:200px;border-radius:100%;background:radial-gradient(white 5%, transparent 85%),conic-gradient(from 90deg, #FF0000 0deg, #FFFF00 60deg, #00FF00 120deg, #00FFFF 180deg, #0000FF 240deg, #FF00FF 300deg, #FF0000 360deg)}ueb-color-handler{display:block;position:absolute;margin-top:-3px;margin-left:-3px;width:4px;height:4px;border:1px solid #000;border-radius:4px}.ueb-color-picker-wheel ueb-color-handler{left:var(--ueb-color-wheel-x);top:var(--ueb-color-wheel-y)}.ueb-color-picker-saturation,.ueb-color-picker-value{margin:0 6px;padding-bottom:10px;width:25px}.ueb-color-picker-saturation{margin-left:25px;background-image:linear-gradient(to bottom, transparent 10px, #FFFFFF 100%)}.ueb-color-picker-value{margin-right:25px;background-image:linear-gradient(to bottom, transparent 10px, #000000 100%)}ueb-ui-slider{display:block}.ueb-color-picker-saturation ueb-ui-slider{top:calc(100% - var(--ueb-color-s)*100%)}.ueb-color-picker-value ueb-ui-slider{top:calc(100% - var(--ueb-color-v)*100%)}.ueb-color-picker-preview{position:relative;align-self:flex-start}.ueb-color-picker-preview::before,.ueb-color-picker-preview::after{content:"";display:block;position:absolute;top:calc(50% - 1px);width:5px;border-top:2px solid #000}.ueb-color-picker-preview::after{right:0}.ueb-color-picker-preview-old,.ueb-color-picker-preview-new{width:100px;height:40px}.ueb-color-picker-preview-new{display:flex}.ueb-color-picker-preview-1,.ueb-color-picker-preview-2{width:50%}.ueb-color-picker-advanced{display:flex;column-gap:10px;padding-top:5px}.ueb-color-picker-advanced .ueb-color-picker-column{display:flex;flex-direction:column;justify-content:space-between;flex-grow:1;width:50%}.ueb-color-picker-advanced .ueb-color-picker-column>div{display:flex;align-items:center;margin-bottom:8px}.ueb-color-picker-advanced .ueb-color-picker-column>div>div{flex-grow:1}.ueb-color-picker-advanced .ueb-horizontal-slider{flex-grow:1}ueb-ui-slider{max-width:100%}.ueb-color-picker-r .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-r)*100%)}.ueb-color-picker-g .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-g)*100%)}.ueb-color-picker-b .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-b)*100%)}.ueb-color-picker-a .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-a)*100%)}.ueb-color-picker-h .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-h)*100%)}.ueb-color-picker-s .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-s)*100%)}.ueb-color-picker-v .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-v)*100%)}.ueb-color-picker-gradient{height:6px}.ueb-color-control{align-self:flex-end}.ueb-color-control-label{margin-right:5px;color:silver}.ueb-color-control .ueb-pin-input-content{width:8ch;line-height:20px;font-family:monospace;color:silver}/*# sourceMappingURL=ueb-style.min.css.map */ +@font-face{font-family:"Roboto";font-weight:normal;src:url("../font/roboto-regular.woff2") format("woff2")}@font-face{font-family:"Roboto";font-stretch:condensed;src:url("../font/roboto-condensed-regular.woff2") format("woff2")}ueb-blueprint{--ueb-scale: 1;--ueb-grid-actual-size: var(--ueb-grid-size);display:block;position:relative;font-family:Roboto,Noto,Oxygen,Ubuntu,"Open Sans","Helvetica Neue",sans-serif;font-size:var(--ueb-font-size);color:#fff;user-select:none}ueb-blueprint svg{overflow:visible}.ueb-viewport-header{display:flex;position:absolute;top:0;right:0;left:0;background:rgba(0,0,0,.5);z-index:1}@keyframes ueb-zoom-animation{0%{color:#7f7f7f}100%{color:#2b2b2b}}.ueb-zoom-changed .ueb-viewport-zoom{animation:600ms ueb-zoom-animation}.ueb-viewport-zoom{margin-left:auto;padding:5px;color:#2b2b2b;font-size:154%;font-weight:bold;letter-spacing:-1px}.ueb-viewport-body{position:relative;height:var(--ueb-height, 30rem);overflow:hidden;scrollbar-width:0}.ueb-grid{--ueb-grid-line-actual-width: calc(var(--ueb-grid-line-width) / var(--ueb-scale));position:absolute;min-width:100%;min-height:100%;width:calc((100% + 2*var(--ueb-grid-expand))/var(--ueb-scale));height:calc((100% + 2*var(--ueb-grid-expand))/var(--ueb-scale));background-color:#262626;background-image:linear-gradient(var(--ueb-grid-axis-line-color), var(--ueb-grid-axis-line-color)),linear-gradient(var(--ueb-grid-axis-line-color), var(--ueb-grid-axis-line-color)),linear-gradient(to right, var(--ueb-grid-set-line-color), var(--ueb-grid-set-line-color) var(--ueb-grid-line-actual-width), transparent var(--ueb-grid-line-actual-width), transparent),linear-gradient(to bottom, var(--ueb-grid-set-line-color), var(--ueb-grid-set-line-color) var(--ueb-grid-line-actual-width), transparent var(--ueb-grid-line-actual-width), transparent),linear-gradient(to right, var(--ueb-grid-line-color), var(--ueb-grid-line-color) var(--ueb-grid-line-actual-width), transparent var(--ueb-grid-line-actual-width), transparent),linear-gradient(to bottom, var(--ueb-grid-line-color), var(--ueb-grid-line-color) var(--ueb-grid-line-actual-width), transparent var(--ueb-grid-line-actual-width), transparent);background-size:100% var(--ueb-grid-line-actual-width),var(--ueb-grid-line-actual-width) 100%,calc(var(--ueb-grid-set)*var(--ueb-grid-actual-size)) calc(var(--ueb-grid-set)*var(--ueb-grid-actual-size)),calc(var(--ueb-grid-set)*var(--ueb-grid-actual-size)) calc(var(--ueb-grid-set)*var(--ueb-grid-actual-size)),var(--ueb-grid-actual-size) var(--ueb-grid-actual-size),var(--ueb-grid-actual-size) var(--ueb-grid-actual-size);background-position:calc(var(--ueb-translate-x)*1px) calc(var(--ueb-translate-y)*1px);background-repeat:repeat-x,repeat-y,repeat,repeat,repeat,repeat;scale:var(--ueb-scale) var(--ueb-scale);transform-origin:0 0;overflow:hidden}ueb-blueprint[data-scrolling=true] .ueb-grid{cursor:grabbing}ueb-blueprint[data-scrolling=false] .ueb-grid{cursor:default}ueb-blueprint.ueb-zoom--4{--ueb-grid-actual-size: calc(var(--ueb-grid-size) * 2);--ueb-node-radius: 0 !important}ueb-blueprint.ueb-zoom--6{--ueb-grid-actual-size: calc(var(--ueb-grid-size) * 3)}ueb-blueprint.ueb-zoom--11{--ueb-grid-actual-size: calc(var(--ueb-grid-size) * 6)}.ueb-grid-content{position:relative;width:0;height:0;transform:translateX(calc(var(--ueb-translate-x) * 1px)) translateY(calc(var(--ueb-translate-y) * 1px))}.ueb-grid-content>div{width:0;height:0}.ueb-positioned,ueb-blueprint[data-selecting=true] ueb-selector{position:absolute}ueb-selector{display:block;position:absolute;visibility:hidden;top:0;left:0;width:0;height:0;background-image:repeating-linear-gradient(90deg, transparent, transparent calc(1px / var(--ueb-scale)), white calc(2px / var(--ueb-scale)), white calc(7px / var(--ueb-scale)), transparent calc(7px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(90deg, black, black calc(8px / var(--ueb-scale)), transparent calc(9px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(90deg, transparent, transparent calc(1px / var(--ueb-scale)), white calc(2px / var(--ueb-scale)), white calc(7px / var(--ueb-scale)), transparent calc(7px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(90deg, black, black calc(8px / var(--ueb-scale)), transparent calc(9px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(180deg, transparent, transparent calc(1px / var(--ueb-scale)), white calc(1px / var(--ueb-scale)), white calc(7px / var(--ueb-scale)), transparent calc(7px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(180deg, black, black calc(8px / var(--ueb-scale)), transparent calc(9px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(0deg, transparent, transparent calc(1px / var(--ueb-scale)), white calc(2px / var(--ueb-scale)), white calc(7px / var(--ueb-scale)), transparent calc(7px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale))),repeating-linear-gradient(0deg, black, black calc(8px / var(--ueb-scale)), transparent calc(9px / var(--ueb-scale)), transparent calc(11px / var(--ueb-scale)));background-size:100% calc(1px/var(--ueb-scale)),100% calc(3px/var(--ueb-scale)),100% calc(1px/var(--ueb-scale)),100% calc(3px/var(--ueb-scale)),calc(1px/var(--ueb-scale)) 100%,calc(3px/var(--ueb-scale)) 100%,calc(1px/var(--ueb-scale)) 100%,calc(3px/var(--ueb-scale)) 100%;background-position:0 calc(1px/var(--ueb-scale)),0 0,0 calc(100% - 1px/var(--ueb-scale)),0 100%,calc(1px/var(--ueb-scale)) 0,0 0,calc(100% - 1px/var(--ueb-scale)) 0,100% 0;background-repeat:no-repeat}ueb-blueprint[data-selecting=true] ueb-selector{visibility:visible}ueb-selector>*{visibility:visible}.ueb-ellipsis-nowrap-text{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}ueb-node.ueb-node-style-minimal{box-shadow:none}ueb-node.ueb-node-style-minimal ueb-pin{margin:0;padding:0;min-height:0}ueb-node.ueb-node-style-minimal ueb-pin[data-direction=input]{display:none}ueb-node.ueb-node-style-minimal .ueb-node-border{padding:8px 16px;background:none !important}ueb-node.ueb-node-style-minimal .ueb-pin-wrapper{margin:0;padding:4px 6px}ueb-node.ueb-node-style-minimal[data-selected=true] .ueb-node-border{box-shadow:inset 0 0 0px 6px #d29e07}ueb-link{position:absolute;--ueb-link-color: rgb(var(--ueb-link-color-rgb));--ueb-from-input-coefficient: calc(2 * var(--ueb-from-input) - 1);--ueb-y-reflected: clamp(0, var(--ueb-from-y) - var(--ueb-to-y) - 1, 1);display:block;margin-left:calc(var(--ueb-link-start)*-1px);min-width:calc(var(--ueb-link-min-width)*1px);visibility:hidden}ueb-link>svg{--ueb-y-reflected-coefficient: calc(2 * var(--ueb-y-reflected) - 1);position:absolute;width:100%;height:100%;min-height:1px;transform:scaleY(calc(var(--ueb-y-reflected-coefficient) * var(--ueb-from-input-coefficient)));z-index:1}ueb-link .ueb-link-path{visibility:visible;stroke:var(--ueb-link-color);stroke-width:calc(1.5px/var(--ueb-scale));transition:stroke-width .8s}ueb-link .ueb-link-area{visibility:visible;stroke-width:20px}ueb-link[data-dragging=true] .ueb-link-path,.ueb-link-area:hover~.ueb-link-path{stroke-width:calc(6px/var(--ueb-scale))}ueb-link[data-dragging=true] .ueb-link-message{display:block;visibility:visible}.ueb-link-message{display:none;position:absolute;top:calc(100%*(1 - var(--ueb-y-reflected)) + 22px);left:calc((1 - var(--ueb-from-input))*100% + (var(--ueb-from-input-coefficient))*var(--ueb-start-percentage) + 15px);border:1px solid #000;border-radius:2px;background:linear-gradient(to bottom, #2a2a2a 0, #151515 50%, #2a2a2a 100%);color:var(--ueb-pin-dim-color);white-space:nowrap;z-index:1000000}.ueb-link-message-icon{display:inline-block;padding:4px;width:16px;height:16px;vertical-align:middle}.ueb-link-message-text{padding:4px;padding-left:0;vertical-align:middle}.ueb-link-message-icon svg{width:100%;height:100%}ueb-node{display:block;position:absolute;min-width:100px;border-radius:var(--ueb-node-radius);box-shadow:0 0 1px 0 #000,1px 4px 6px 0 rgba(0,0,0,.6);font-weight:lighter}ueb-node.ueb-node-style-minimal,ueb-node.ueb-node-style-comment{min-width:0}.ueb-zoom--2 ueb-node{box-shadow:none}.ueb-node-border{margin:-3px;padding:3px;border-radius:calc(var(--ueb-node-radius)*1.4)}.ueb-zoom--2 .ueb-node-border{margin:0;padding:0}ueb-node[data-selected=true]>.ueb-node-border{background-image:linear-gradient(to right, #f1b000 0%, #f1b000 100%),linear-gradient(to bottom, #f1b000 0%, #cc6700 100%),linear-gradient(to right, #cc6700 0%, #cc6700 100%),linear-gradient(to bottom, #f1b000 0%, #cc6700 100%);background-size:100% 7px,7px 100%,100% 7px,7px 100%;background-position:top,right,bottom,left;background-repeat:repeat-x,repeat-y,repeat-x,repeat-y}.ueb-zoom--2 ueb-node[data-selected=true]>.ueb-node-border{background:none !important;outline:3px solid #ff8d00}.ueb-zoom--10 ueb-node[data-selected=true]>.ueb-node-border{outline-width:8px}.ueb-node-wrapper{display:grid;grid-template:"top top top" min-content "input center output" min-content "input center variadic" 1fr "development development development" min-content "expansion expansion expansion" min-content/min-content auto min-content;justify-items:space-between;padding:1px;box-sizing:border-box;box-shadow:inset 0 0 2px 0 #000;border-radius:var(--ueb-node-radius);background:rgba(14,16,10,.8);overflow:hidden}ueb-node.ueb-node-style-operation .ueb-node-wrapper{grid-template-rows:min-content auto auto min-content min-content;grid-template-columns:50% 0% 1fr;box-shadow:none}.ueb-node-outputs ueb-pin[data-type=exec] .ueb-pin-wrapper{min-height:26px}ueb-node.ueb-node-style-operation.ueb-node-has-inputs .ueb-node-inputs{align-self:center;padding-right:40px}.ueb-node-style-operation:not(.ueb-node-is-variadic) .ueb-node-outputs{grid-row:2/4;align-self:center}ueb-blueprint[data-scrolling=false][data-selecting=false] .ueb-draggable{cursor:move}.ueb-zoom--2 .ueb-node-wrapper{box-shadow:none;padding:0;background:#101010}.ueb-node-top{grid-area:top;color:#d0d0d0;font-size:103%;font-weight:bold;line-height:120%;white-space:nowrap}ueb-node.ueb-node-style-setter .ueb-node-top{max-height:5px}ueb-node.ueb-node-style-comment .ueb-node-top{white-space:normal}ueb-node.ueb-node-style-event .ueb-node-top{display:flex;justify-content:space-between;align-items:center;padding-right:2px}.ueb-node-style-default .ueb-node-top{padding:2px 20px 2px 8px;box-shadow:inset 5px 1px 5px -3px rgba(255,255,255,.2509803922),inset 0 1px 2px 0 rgba(255,255,255,.2509803922);border-radius:var(--ueb-node-radius) var(--ueb-node-radius) 0 0;background:linear-gradient(rgba(255, 255, 255, 0.1882352941) 1px, transparent 1px),linear-gradient(170deg, rgb(var(--ueb-node-color)) 0%, rgb(var(--ueb-node-color)) 50%, transparent 100%)}.ueb-zoom--2 .ueb-node-top{box-shadow:none}.ueb-zoom--2 .ueb-node-style-default .ueb-node-top{background:rgb(var(--ueb-node-color))}.ueb-node-name{display:flex;align-items:center;background:radial-gradient(ellipse 100% 100% at 35% 55%, rgba(0, 0, 0, 0.5) 15%, transparent 50%);margin:-1px -15px;padding:2px 15px}.ueb-node-style-setter .ueb-node-name{justify-content:center}.ueb-node-name:last-child{padding-right:26px}.ueb-zoom--2 .ueb-node-name{background:none}.ueb-zoom--8 .ueb-node-name{visibility:hidden}.ueb-node-name-symbol{align-self:flex-start;margin-right:5px;width:16px;height:16px;color:#74bff2}ueb-node[data-pure-function=true] .ueb-node-name-symbol{color:#aaeda0}.ueb-node-name-symbol path{vertical-align:middle}.ueb-node-subtitle-text{padding-top:1px;padding-right:5px;font-size:calc(.946154*var(--ueb-font-size));font-weight:100;font-style:italic;color:#a9b78f}.ueb-node-inputs{grid-area:input}ueb-node.ueb-node-has-inputs .ueb-node-inputs{padding-right:15px;padding-left:6px}.ueb-node-outputs{grid-area:output}.ueb-node-outputs,.ueb-node-variadic{padding-right:6px}.ueb-node-variadic{grid-area:variadic;margin-top:10px;margin-bottom:5px;align-self:start;justify-self:end;white-space:nowrap;cursor:pointer}.ueb-node-developmentonly{grid-area:development;margin-top:4px;padding:2px;background:repeating-linear-gradient(-45deg, transparent 0, #57590a 1px, #57590a 11px, transparent 12px, transparent 24px);background:repeating-linear-gradient(-45deg, transparent 0, #57590a 1px, #57590a 11px, transparent 12px, transparent 24px);text-align:center}.ueb-node-developmentonly-text{padding:0 10px;letter-spacing:.04em;text-shadow:1px 1px 1px #000;white-space:nowrap}.ueb-zoom--6 .ueb-node-developmentonly-text{visibility:hidden}.ueb-node-expansion{grid-area:expansion;display:none;text-align:center}ueb-node[data-advanced-display] .ueb-node-expansion{display:block}ueb-blueprint[data-scrolling=false][data-selecting=false] .ueb-node-expansion:hover{background-color:#656765;cursor:pointer}.ueb-zoom--8 .ueb-node-expansion{visibility:hidden}.ueb-node-variadic>svg,.ueb-node-expansion>svg{width:16px;height:16px;vertical-align:middle}ueb-node[data-advanced-display=Shown] .ueb-node-expansion>svg{transform:scaleY(-1)}ueb-node.ueb-node-style-glass .ueb-node-wrapper,ueb-node.ueb-node-style-glass .ueb-node-border,ueb-node.ueb-node-style-glass{min-width:128px;border-radius:15px}ueb-node.ueb-node-style-glass .ueb-node-wrapper{border:1px solid #000;box-shadow:0 1px 0 0 rgba(255,255,255,.6) inset;padding:3px;background:linear-gradient(to bottom, rgba(255, 255, 255, 0.3) 0, rgba(255, 255, 255, 0.2) 4px, rgba(0, 0, 0, 0.3) 14px),linear-gradient(to right, transparent 10%, rgba(var(--ueb-node-color), 0.3) 50%, transparent 90%);background-size:100%,100% 28px;background-repeat:repeat,no-repeat}ueb-node.ueb-node-style-glass .ueb-node-name{padding-right:0;padding-left:0}ueb-node[data-selected=true] .ueb-node-border{box-shadow:inset 0 0 0px 6px #ce8700;background:none}ueb-node.ueb-node-style-glass .ueb-node-top,ueb-node.ueb-node-style-glass .ueb-node-name{margin:0;box-shadow:none;border-radius:0;background:none}ueb-node.ueb-node-style-glass .ueb-node-outputs:first-child{padding-left:12px}ueb-node.ueb-node-style-operation .ueb-node-top{grid-area:center;align-self:center;justify-self:center;padding:0;font-size:215%;font-stretch:condensed;font-weight:bold;line-height:100%}ueb-node.ueb-node-style-operation.ueb-node-style-metasound .ueb-node-top{font-size:333%;font-stretch:expanded}ueb-node.ueb-node-style-operation.ueb-node-style-glass .ueb-node-top{z-index:-1}ueb-node.ueb-node-style-operation .ueb-node-outputs{align-self:end}ueb-node.ueb-node-style-operation .ueb-node-variadic{align-self:start;margin-top:12px;margin-left:-100px}ueb-node.ueb-node-style-metasound .ueb-node-wrapper{border:1px solid #000;box-shadow:0 1px 0 0 rgba(255,255,255,.4) inset;background:linear-gradient(to bottom, rgba(52, 55, 52, 0.9) 0, rgba(42, 44, 42, 0.9) 8px, rgba(31, 32, 31, 0.8) 16px, rgba(13, 14, 13, 0.9))}ueb-node.ueb-node-style-metasound .ueb-node-name-text,ueb-node.ueb-node-style-metasound .ueb-node-name-symbol{color:#8cc483}ueb-node.ueb-node-style-metasound.ueb-node-style-operation .ueb-node-name-text{color:#7c7c7c}ueb-node.ueb-node-style-metasound .ueb-node-name{margin:0px;padding:1px 15px;justify-content:center;background:none}ueb-node:not(.ueb-node-style-comment){z-index:10}ueb-node.ueb-node-style-comment .ueb-node-border{height:100%}ueb-node.ueb-node-style-comment .ueb-node-wrapper{position:relative;padding:0;height:100%;border-radius:0;background:rgba(var(--ueb-node-color), 0.35);box-shadow:none}ueb-node.ueb-node-style-comment .ueb-node-wrapper::after{content:"";display:block;position:absolute;right:3px;bottom:3px;width:16px;height:16px;background:linear-gradient(135deg, transparent 50%, #fff 50%, #fff calc(50% + 2px), transparent calc(50% + 2px), transparent calc(50% + 3px), #fff calc(50% + 3px), #fff calc(50% + 5px), transparent calc(50% + 5px), transparent calc(50% + 7px), #fff calc(50% + 7px), #fff calc(50% + 9px), transparent calc(50% + 9px))}ueb-node.ueb-node-style-comment .ueb-node-top{position:relative;margin:3px;padding:3px 10px;box-shadow:none;border-radius:0;background:rgb(var(--ueb-node-color));color:#fff;font-size:185%;text-shadow:2px 1px 1px #444,0 0 2px #bbb;line-height:1.22;z-index:1}ueb-node.ueb-node-style-conversion .ueb-node-wrapper::after{content:"";display:block;grid-area:center;align-self:center;justify-self:center;margin:10px 10px 10px -6px;width:6px;height:6px;border-radius:3px;background:#8f8f8f}ueb-blueprint{--ueb-pin-color-dim: #afafaf}ueb-pin{--ueb-pin-background: linear-gradient(90deg, rgba(var(--ueb-pin-color-rgb), 0.15), rgba(var(--ueb-pin-color-rgb), 0.8) 15%, rgba(var(--ueb-pin-color-rgb), 0.5) 60%, rgba(var(--ueb-pin-color-rgb), 0.35) 95%, transparent);--ueb-pin-color: rgb(var(--ueb-pin-color-rgb));display:block}.ueb-node-inputs ueb-pin,.ueb-node-outputs ueb-pin{margin:6px 0}ueb-pin.ueb-pin-input-wrap .ueb-pin-content{flex-direction:column;align-items:start}.ueb-node-top ueb-pin{min-height:0;margin-left:10px}.ueb-zoom--10 ueb-pin{visibility:hidden}ueb-node[data-advanced-display=Hidden] ueb-pin[data-advanced-view=true][data-linked=false]{display:none}.ueb-pin-wrapper{display:inline-flex;box-sizing:border-box;padding:3px 6px;min-height:24px;align-items:center}ueb-node.ueb-node-style-operation .ueb-pin-wrapper{padding:0}ueb-node.ueb-node-style-minimal .ueb-pin-wrapper{min-height:0}.ueb-node-top .ueb-pin-wrapper{padding:2px 4px 2px 10px;min-height:0;vertical-align:bottom}ueb-blueprint[data-scrolling=false][data-selecting=false] .ueb-pin-wrapper:hover{background:var(--ueb-pin-background);cursor:crosshair}.ueb-zoom--8 .ueb-pin-wrapper:hover{background:none !important}.ueb-pin-content{display:flex;align-items:center}.ueb-node-outputs ueb-pin{text-align:right}.ueb-pin-icon{color:var(--ueb-pin-color);text-align:left}ueb-pin[data-connectable=false] .ueb-pin-icon{visibility:hidden}.ueb-node-inputs .ueb-pin-icon{margin-right:6px}.ueb-node-outputs .ueb-pin-icon{margin-left:4px}.ueb-pin-icon>svg{display:block}ueb-pin[data-direction=output] .ueb-pin-reflect-output{transform:scaleX(-1)}ueb-pin[data-type=exec] .ueb-pin-icon{width:15px;height:15px;--ueb-pin-color: white}ueb-pin[data-linked=true] .ueb-pin-tofill{fill:currentColor}ueb-pin[data-linked=true] .ueb-pin-tostroke{stroke:#000}ueb-pin.ueb-node-variadic-default{position:relative;margin-top:14px}ueb-pin.ueb-node-variadic-default::before{content:"";display:block;position:absolute;width:100%;height:1px;top:-8px;left:6px;background:linear-gradient(90deg, transparent 0, #404240 6px, #404240 calc(100% - 6px), transparent 100%)}.ueb-zoom--6 .ueb-pin-content{visibility:hidden}ueb-node[data-type="/Script/BlueprintGraph.K2Node_VariableSet"] ueb-pin[data-direction=output] .ueb-pin-content{display:none}.ueb-pin-input-wrapper{display:flex;padding-left:8px}.ueb-pin-input{margin-left:5px;border:1px solid #a0a0a0;border-radius:3px;padding:0 4px 0 4px;color:#e0e0e0}.ueb-pin-input:hover,.ueb-pin-input:active,.ueb-pin-input:focus,.ueb-pin-input:focus-within{background:rgba(255,255,255,.2745098039);outline:none}ueb-pin[data-linked=true] .ueb-pin-input,ueb-pin[data-linked=true] .ueb-pin-input-wrapper{display:none}ueb-pin[data-type=bool] .ueb-pin-input{appearance:none;padding:0;height:18px;width:18px;background-color:#0f0f0f;color:var(--ueb-pin-color)}ueb-pin[data-type=bool] .ueb-pin-input:checked{background-image:url('data:image/svg+xml,')}ueb-pin[data-type="/Script/CoreUObject.LinearColor"] .ueb-pin-input{padding:0;width:18px;height:18px;border-color:#505050;border-radius:0;background-color:var(--ueb-linear-color)}.ueb-pin-input-label~.ueb-pin-input{margin-left:2px}.ueb-pin-input-label{margin-left:10px;color:#777}.ueb-pin-input-label:first-child{margin-left:2px}.ueb-pin-input-content{display:block;outline:none;border:none;padding:0;min-width:10px;max-width:400px;max-height:16em;font-size:97%;white-space:nowrap;background:none;color:inherit;overflow:auto}.ueb-pin-input-content::-webkit-scrollbar{width:10px;height:10px}.ueb-pin-input-content::-webkit-scrollbar-thumb{background:rgba(0,0,0,0);border-radius:10px;margin:4px}.ueb-pin-input-content:hover::-webkit-scrollbar-thumb{background:#575757}ueb-blueprint[data-scrolling=false][data-selecting=false] .ueb-pin-input-content:hover{cursor:text}ueb-dropdown{display:block}ueb-dropdown.ueb-pin-input{margin-right:5px;padding-right:10px;background:#101010 !important;color:silver;border-color:#404040}ueb-dropdown.ueb-pin-input .ueb-pin-input-content{padding:6px;width:max(170px,var(--ueb-dropdown-width));max-width:400px;background:none;font-size:10px;letter-spacing:-0.2px;cursor:default !important}.ueb-button{min-width:60px;border:1px solid #0f0f0f;border-radius:4px;padding:2px 10px;background:#383838;text-align:center;cursor:pointer}.ueb-button:hover{background:#575757}.ueb-buttons{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}.ueb-vertical-slider>ueb-ui-slider{position:relative;padding-bottom:10px}.ueb-vertical-slider>ueb-ui-slider::before,.ueb-vertical-slider>ueb-ui-slider::after{content:"";display:block;position:absolute;width:0;height:0;border:5px solid rgba(0,0,0,0)}.ueb-vertical-slider>ueb-ui-slider::before{left:-4px;border-left-color:#e0e0e0}.ueb-vertical-slider>ueb-ui-slider::after{right:-4px;border-right-color:#e0e0e0}.ueb-horizontal-slider,.ueb-text-input{position:relative;border:1px solid #383838;border-radius:6px;background:#0f0f0f}.ueb-horizontal-slider{position:relative;padding:1px}.ueb-horizontal-slider:hover{cursor:ew-resize}ueb-window .ueb-pin-input-content{padding:1px 10px}.ueb-horizontal-slider>ueb-ui-slider{display:block;position:relative;height:20px;border-radius:5px;background:#383838}.ueb-horizontal-slider-text{position:absolute;padding:0 5px;line-height:20px;z-index:1}.ueb-toggle-control::before{content:"";display:inline-block;border-top:5px solid #e0e0e0;border-left:5px solid rgba(0,0,0,0);border-right:5px solid rgba(0,0,0,0);vertical-align:middle}.ueb-toggle-control:hover{cursor:pointer}.ueb-resizeable-top,.ueb-resizeable-top-right,.ueb-resizeable-top-left{position:absolute;top:0;height:10px}.ueb-resizeable-top{right:0;left:0;cursor:ns-resize}.ueb-resizeable-top-right{right:0;width:10px;cursor:nesw-resize}.ueb-resizeable-top-left{left:0;width:10px;cursor:nwse-resize}.ueb-resizeable-right{position:absolute;top:0;right:0;bottom:0;width:10px;cursor:ew-resize}.ueb-resizeable-bottom,.ueb-resizeable-bottom-right,.ueb-resizeable-bottom-left{position:absolute;bottom:-3px;height:10px;cursor:ns-resize}.ueb-resizeable-bottom{right:0;left:0}.ueb-resizeable-bottom-right{right:0;width:10px;cursor:nwse-resize}.ueb-resizeable-bottom-left{left:0;width:10px;cursor:nesw-resize}.ueb-resizeable-left{position:absolute;top:0;bottom:0;left:0;width:10px;cursor:ew-resize}ueb-window{display:block;position:absolute;border:2px solid #101010;top:0;left:0;transform:translateX(calc(var(--ueb-position-x) * 1px)) translateY(calc(var(--ueb-position-y) * 1px));background:#242424;box-shadow:0 0 2px 0 rgba(0,0,0,.6274509804);z-index:1000}.ueb-window-top{display:flex;flex-direction:row;align-items:center;padding:4px 8px;height:30px;background:#1a1a1a}.ueb-window-content{padding:10px;border:1px solid #303030}.ueb-window-name{flex-grow:1;padding-left:28px;text-align:center}.ueb-window-close{padding:8px;height:12px;width:12px;cursor:pointer}.ueb-color-picker-theme,.ueb-color-picker-srgb{display:inline-block;vertical-align:middle}.ueb-color-picker-main{display:grid;grid-template:1fr/auto min-content min-content min-content}.ueb-color-picker-wheel{position:relative;padding-top:100%;min-width:200px;border-radius:100%;background:radial-gradient(white 5%, transparent 85%),conic-gradient(from 90deg, #FF0000 0deg, #FFFF00 60deg, #00FF00 120deg, #00FFFF 180deg, #0000FF 240deg, #FF00FF 300deg, #FF0000 360deg)}ueb-color-handler{display:block;position:absolute;margin-top:-3px;margin-left:-3px;width:4px;height:4px;border:1px solid #000;border-radius:4px}.ueb-color-picker-wheel ueb-color-handler{left:var(--ueb-color-wheel-x);top:var(--ueb-color-wheel-y)}.ueb-color-picker-saturation,.ueb-color-picker-value{margin:0 6px;padding-bottom:10px;width:25px}.ueb-color-picker-saturation{margin-left:25px;background-image:linear-gradient(to bottom, transparent 10px, #FFFFFF 100%)}.ueb-color-picker-value{margin-right:25px;background-image:linear-gradient(to bottom, transparent 10px, #000000 100%)}ueb-ui-slider{display:block}.ueb-color-picker-saturation ueb-ui-slider{top:calc(100% - var(--ueb-color-s)*100%)}.ueb-color-picker-value ueb-ui-slider{top:calc(100% - var(--ueb-color-v)*100%)}.ueb-color-picker-preview{position:relative;align-self:flex-start}.ueb-color-picker-preview::before,.ueb-color-picker-preview::after{content:"";display:block;position:absolute;top:calc(50% - 1px);width:5px;border-top:2px solid #000}.ueb-color-picker-preview::after{right:0}.ueb-color-picker-preview-old,.ueb-color-picker-preview-new{width:100px;height:40px}.ueb-color-picker-preview-new{display:flex}.ueb-color-picker-preview-1,.ueb-color-picker-preview-2{width:50%}.ueb-color-picker-advanced{display:flex;column-gap:10px;padding-top:5px}.ueb-color-picker-advanced .ueb-color-picker-column{display:flex;flex-direction:column;justify-content:space-between;flex-grow:1;width:50%}.ueb-color-picker-advanced .ueb-color-picker-column>div{display:flex;align-items:center;margin-bottom:8px}.ueb-color-picker-advanced .ueb-color-picker-column>div>div{flex-grow:1}.ueb-color-picker-advanced .ueb-horizontal-slider{flex-grow:1}ueb-ui-slider{max-width:100%}.ueb-color-picker-r .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-r)*100%)}.ueb-color-picker-g .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-g)*100%)}.ueb-color-picker-b .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-b)*100%)}.ueb-color-picker-a .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-a)*100%)}.ueb-color-picker-h .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-h)*100%)}.ueb-color-picker-s .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-s)*100%)}.ueb-color-picker-v .ueb-horizontal-slider>ueb-ui-slider{width:calc(var(--ueb-color-v)*100%)}.ueb-color-picker-gradient{height:6px}.ueb-color-control{align-self:flex-end}.ueb-color-control-label{margin-right:5px;color:silver}.ueb-color-control .ueb-pin-input-content{width:8ch;line-height:20px;font-family:monospace;color:silver}/*# sourceMappingURL=ueb-style.min.css.map */ diff --git a/dist/css/ueb-style.min.css.map b/dist/css/ueb-style.min.css.map index ad9c09b..45a93bb 100644 --- a/dist/css/ueb-style.min.css.map +++ b/dist/css/ueb-style.min.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../../scss/style.scss","../../scss/ueb-knot.scss","../../scss/ueb-link.scss","../../scss/ueb-node.scss","../../scss/ueb-pin.scss","../../scss/ueb-ui-controls.scss","../../scss/ueb-window.scss"],"names":[],"mappings":"AAAA,WACI,qBACA,mBACA,wDAGJ,WACI,qBACA,uBACA,kEAGJ,cACI,eACA,6CACA,cACA,kBACA,8EACA,+BACA,WACA,iBAGJ,kBACI,iBAGJ,qBACI,aACA,kBACA,MACA,QACA,OACA,0BACA,UAGJ,8BACI,GACI,cAGJ,KACI,eAIR,qCACI,mCAGJ,mBACI,iBACA,YACA,cAEA,eACA,iBACA,oBAGJ,mBACI,kBACA,gCACA,gBACA,kBAGJ,UACI,kFACA,kBACA,eACA,gBACA,+DACA,gEACA,yBACA,iBAEI,s3BA0BJ,gBAEI,sZAQJ,sFACA,gEACA,wCACA,qBACA,gBAGJ,6CACI,gBAGJ,8CACI,eAGJ,0BACI,uDACA,gCAGJ,0BACI,uDAGJ,2BACI,uDAGJ,kBACI,kBACA,QACA,SACA,wGAGJ,sBACI,QACA,SAGJ,gEACI,kBAGJ,aACI,cACA,kBACA,kBACA,MACA,OACA,QACA,SACA,iBAEI,wlDAmDJ,gBAEI,gQAWJ,oBAEI,wJAOJ,4BAGJ,gDACI,mBAIJ,eACI,mBAGJ,0BACI,mBACA,uBACA,gBChQJ,gCACI,gBAGJ,wCACI,SACA,UACA,aAGJ,8DACI,aAGJ,iDACI,iBACA,2BAGJ,iDACI,SACA,gBAGJ,qEACI,qCCvBJ,SACI,kBACA,iDACA,kEAEA,wEACA,cACA,6CACA,8CAKA,kBAGJ,aACI,oEACA,kBACA,WACA,YACA,eACA,+FACA,UAGJ,wBACI,mBACA,6BACA,0CACA,4BAGJ,wBACI,mBACA,kBAGJ,gFAEI,wCAGJ,+CACI,cACA,mBAGJ,kBACI,aACA,kBACA,mDACA,qHAOA,sBACA,kBACA,4EACA,+BACA,mBACA,gBAGJ,uBACI,qBACA,YACA,WACA,YACA,sBAGJ,uBACI,YACA,eACA,sBAGJ,2BACI,WACA,YCrFJ,SACI,cACA,kBACA,gBACA,qCACA,uDACA,oBAGJ,gEAEI,YAGJ,sBACI,gBAGJ,iBACI,YACA,YACA,+CAGJ,8BACI,SACA,UAGJ,8CACI,iBACI,kNAIJ,oDACA,0CACA,sDAGJ,2DACI,2BACA,0BAGJ,4DACI,kBAGJ,kBACI,aACA,cACI,mNAOJ,4BACA,YACA,sBACA,gCACA,qCACA,6BACA,gBAGJ,oDACI,iEACA,iCACA,gBAGJ,2DACI,gBAGJ,uEACI,kBACA,mBAGJ,uEACI,aACA,kBAGJ,yEACI,YAGJ,+BACI,gBACA,UACA,mBAGJ,cACI,cACA,cAEA,eACA,iBACA,iBACA,mBAGJ,6CACI,eAGJ,8CACI,mBAGJ,4CACI,aACA,8BACA,mBACA,kBAGJ,sCACI,yBACA,WACI,qGAEJ,gEACA,WACI,iLAIR,2BACI,gBAGJ,mDACI,sCAGJ,eACI,aACA,mBACA,kGACA,kBACA,iBAGJ,sCACI,uBAGJ,0BACI,mBAGJ,4BACI,gBAGJ,4BACI,kBAGJ,sBACI,sBACA,iBACA,WACA,YACA,cAGJ,wDACI,cAGJ,2BACI,sBAGJ,wBACI,gBACA,kBAEA,6CACA,gBACA,kBACA,cAGJ,iBACI,gBAGJ,8CACI,mBACA,iBAGJ,kBACI,iBAGJ,qCAEI,kBAGJ,mBACI,mBACA,gBACA,kBACA,iBACA,iBACA,mBACA,eAGJ,0BACI,sBACA,eACA,YACA,2HAMA,2HAMA,kBAGJ,+BACI,eACA,qBACA,6BACA,mBAGJ,4CACI,kBAGJ,oBACI,oBACA,aACA,kBAGJ,oDACI,cAGJ,oFACI,yBACA,eAGJ,iCACI,kBAGJ,+CAEI,WACA,YACA,sBAGJ,8DACI,qBAGJ,6HAGI,gBACA,mBAGJ,gDACI,sBACA,gDACA,YACA,WACI,gNAEJ,+BACA,mCAGJ,6CACI,gBACA,eAGJ,8CACI,qCACA,gBAGJ,yFAEI,SACA,gBACA,gBACA,gBAGJ,4DACI,kBAGJ,gDACI,iBACA,kBACA,oBACA,UAEA,eACA,uBACA,iBACA,iBAGJ,yEACI,eACA,sBAGJ,qEACI,WAGJ,oDACI,eAGJ,qDACI,iBACA,gBACA,mBAGJ,oDACI,sBACA,gDACA,6IAOJ,8GAEI,cAGJ,+EACI,cAGJ,iDACI,WACA,iBACA,uBACA,gBAGJ,sCACI,WAGJ,iDACI,YAGJ,kDACI,kBACA,UACA,YACA,gBACA,6CACA,gBAEA,yDACI,WACA,cACA,kBACA,UACA,WACA,WACA,YACA,6TAgBR,8CACI,kBACA,WACA,iBACA,gBACA,gBACA,sCACA,WAEA,eACA,0CACA,iBACA,UAGJ,4DACI,WACA,cACA,iBACA,kBACA,oBACA,2BACA,UACA,WACA,kBACA,mBC1bJ,cACI,6BAGJ,QACI,4NAMA,+CACA,cAGJ,mDAEI,aAGJ,4CACI,sBACA,kBAGJ,sBACI,aACA,iBAGJ,sBACI,kBAGJ,2FACI,aAGJ,iBACI,oBACA,sBACA,gBACA,gBACA,mBAGJ,mDACI,UAGJ,iDACI,aAGJ,+BACI,yBACA,aACA,sBAGJ,iFACI,qCACA,iBAGJ,oCACI,2BAGJ,iBACI,aACA,mBAGJ,0BACI,iBAGJ,cACI,2BACA,gBAGJ,8CACI,kBAGJ,gEACI,WACA,YAGJ,+BACI,iBAGJ,gCACI,gBAGJ,kBACI,cAGJ,uDACI,qBAGJ,sCACI,WACA,YACA,uBAGJ,0CACI,kBAGJ,4CACI,YAGJ,kCACI,kBACA,gBAEA,0CACI,WACA,cACA,kBACA,WACA,WACA,SACA,SACA,0GAQR,8BACI,kBAGJ,gHACI,aAGJ,uBACI,aACA,iBAGJ,eACI,gBACA,yBACA,kBACA,oBACA,cAEA,4FAII,yCACA,aAIR,0FAEI,aAGJ,uCACI,gBACA,UACA,YACA,WACA,yBACA,2BAGJ,+CACI,6OAGJ,oEACI,UACA,WACA,YACA,qBACA,gBACA,yCAGJ,oCACI,gBAGJ,qBACI,iBACA,WAGJ,iCACI,gBAGJ,uBACI,cACA,aACA,YACA,UACA,eACA,gBACA,gBAEA,cACA,mBACA,gBACA,cACA,cAEA,0CACI,WACA,YAGJ,gDACI,yBACA,mBACA,WAGJ,sDACI,mBAIR,uFACI,YAGJ,aACI,cAGJ,2BACI,iBACA,mBACA,8BACA,aACA,qBAGJ,kDACI,YACA,2CACA,gBACA,gBACA,eACA,sBACA,0BCzQJ,YACI,eACA,yBACA,kBACA,iBACA,mBACA,kBACA,eAEA,kBACI,mBAIR,aACI,aACA,yBACA,SACA,gBAGJ,mCACI,kBACA,oBAEA,qFAEI,WACA,cACA,kBACA,QACA,SACA,+BAGJ,2CACI,UACA,0BAGJ,0CACI,WACA,2BAIR,uCAEI,kBACA,yBACA,kBACA,mBAGJ,uBACI,kBACA,YAEA,6BACI,iBAIR,kCACI,iBAGJ,qCACI,cACA,kBACA,YACA,kBACA,mBAGJ,4BACI,kBACA,cACA,iBACA,UAKA,4BACI,WACA,qBACA,6BACA,oCACA,qCACA,sBAGJ,0BACI,eAIR,uEAGI,kBACA,MACA,YAGJ,oBACI,QACA,OACA,iBAGJ,0BACI,QACA,WACA,mBAGJ,yBACI,OACA,WACA,mBAGJ,sBACI,kBACA,MACA,QACA,SACA,WACA,iBAGJ,gFAGI,kBACA,YACA,YACA,iBAGJ,uBACI,QACA,OAGJ,6BACI,QACA,WACA,mBAGJ,4BACI,OACA,WACA,mBAGJ,qBACI,kBACA,MACA,SACA,OACA,WACA,iBCnKJ,WACI,cACA,kBACA,yBACA,MACA,OACA,sGACA,mBACA,6CACA,aAGJ,gBACI,aACA,mBACA,mBACA,gBACA,YACA,mBAGJ,oBACI,aACA,yBAGJ,iBACI,YACA,kBACA,kBAGJ,kBACI,YACA,YACA,WACA,eAGJ,+CAEI,qBACA,sBAGJ,uBACI,aACA,2DAGJ,wBACI,kBACA,iBACA,gBACA,mBACA,WACI,mLAWR,kBACI,cACA,kBACA,gBACA,iBACA,UACA,WACA,sBACA,kBAGJ,0CACI,8BACA,6BAGJ,qDAEI,aACA,oBACA,WAGJ,6BACI,iBACA,4EAGJ,wBACI,kBACA,4EAGJ,cACI,cAGJ,2CACI,yCAGJ,sCACI,yCAGJ,0BACI,kBACA,sBAEA,mEAEI,WACA,cACA,kBACA,oBACA,UACA,0BAGJ,iCACI,QAIR,4DAEI,YACA,YAGJ,8BACI,aAGJ,wDAEI,UAGJ,2BACI,aACA,gBACA,gBAGJ,oDACI,aACA,sBACA,8BACA,YACA,UAGJ,wDACI,aACA,mBACA,kBAEA,4DACI,YAIR,kDACI,YAGJ,cACI,eAGJ,yDACI,oCAGJ,yDACI,oCAGJ,yDACI,oCAGJ,yDACI,oCAGJ,yDACI,oCAGJ,yDACI,oCAGJ,yDACI,oCAGJ,2BACI,WAGJ,mBACI,oBAGJ,yBACI,iBACA,aAGJ,0CACI,UACA,iBACA,sBACA","file":"ueb-style.min.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../../scss/style.scss","../../scss/ueb-knot.scss","../../scss/ueb-link.scss","../../scss/ueb-node.scss","../../scss/ueb-pin.scss","../../scss/ueb-ui-controls.scss","../../scss/ueb-window.scss"],"names":[],"mappings":"AAAA,WACI,qBACA,mBACA,wDAGJ,WACI,qBACA,uBACA,kEAGJ,cACI,eACA,6CACA,cACA,kBACA,8EACA,+BACA,WACA,iBAGJ,kBACI,iBAGJ,qBACI,aACA,kBACA,MACA,QACA,OACA,0BACA,UAGJ,8BACI,GACI,cAGJ,KACI,eAIR,qCACI,mCAGJ,mBACI,iBACA,YACA,cAEA,eACA,iBACA,oBAGJ,mBACI,kBACA,gCACA,gBACA,kBAGJ,UACI,kFACA,kBACA,eACA,gBACA,+DACA,gEACA,yBACA,iBAEI,s3BA0BJ,gBAEI,sZAQJ,sFACA,gEACA,wCACA,qBACA,gBAGJ,6CACI,gBAGJ,8CACI,eAGJ,0BACI,uDACA,gCAGJ,0BACI,uDAGJ,2BACI,uDAGJ,kBACI,kBACA,QACA,SACA,wGAGJ,sBACI,QACA,SAGJ,gEACI,kBAGJ,aACI,cACA,kBACA,kBACA,MACA,OACA,QACA,SACA,iBAEI,wlDAmDJ,gBAEI,gQAWJ,oBAEI,wJAOJ,4BAGJ,gDACI,mBAIJ,eACI,mBAGJ,0BACI,mBACA,uBACA,gBChQJ,gCACI,gBAGJ,wCACI,SACA,UACA,aAGJ,8DACI,aAGJ,iDACI,iBACA,2BAGJ,iDACI,SACA,gBAGJ,qEACI,qCCvBJ,SACI,kBACA,iDACA,kEAEA,wEACA,cACA,6CACA,8CAKA,kBAGJ,aACI,oEACA,kBACA,WACA,YACA,eACA,+FACA,UAGJ,wBACI,mBACA,6BACA,0CACA,4BAGJ,wBACI,mBACA,kBAGJ,gFAEI,wCAGJ,+CACI,cACA,mBAGJ,kBACI,aACA,kBACA,mDACA,qHAOA,sBACA,kBACA,4EACA,+BACA,mBACA,gBAGJ,uBACI,qBACA,YACA,WACA,YACA,sBAGJ,uBACI,YACA,eACA,sBAGJ,2BACI,WACA,YCrFJ,SACI,cACA,kBACA,gBACA,qCACA,uDACA,oBAGJ,gEAEI,YAGJ,sBACI,gBAGJ,iBACI,YACA,YACA,+CAGJ,8BACI,SACA,UAGJ,8CACI,iBACI,kNAIJ,oDACA,0CACA,sDAGJ,2DACI,2BACA,0BAGJ,4DACI,kBAGJ,kBACI,aACA,cACI,mNAOJ,4BACA,YACA,sBACA,gCACA,qCACA,6BACA,gBAGJ,oDACI,iEACA,iCACA,gBAGJ,2DACI,gBAGJ,uEACI,kBACA,mBAGJ,uEACI,aACA,kBAGJ,yEACI,YAGJ,+BACI,gBACA,UACA,mBAGJ,cACI,cACA,cAEA,eACA,iBACA,iBACA,mBAGJ,6CACI,eAGJ,8CACI,mBAGJ,4CACI,aACA,8BACA,mBACA,kBAGJ,sCACI,yBACA,WACI,qGAEJ,gEACA,WACI,iLAIR,2BACI,gBAGJ,mDACI,sCAGJ,eACI,aACA,mBACA,kGACA,kBACA,iBAGJ,sCACI,uBAGJ,0BACI,mBAGJ,4BACI,gBAGJ,4BACI,kBAGJ,sBACI,sBACA,iBACA,WACA,YACA,cAGJ,wDACI,cAGJ,2BACI,sBAGJ,wBACI,gBACA,kBAEA,6CACA,gBACA,kBACA,cAGJ,iBACI,gBAGJ,8CACI,mBACA,iBAGJ,kBACI,iBAGJ,qCAEI,kBAGJ,mBACI,mBACA,gBACA,kBACA,iBACA,iBACA,mBACA,eAGJ,0BACI,sBACA,eACA,YACA,2HAMA,2HAMA,kBAGJ,+BACI,eACA,qBACA,6BACA,mBAGJ,4CACI,kBAGJ,oBACI,oBACA,aACA,kBAGJ,oDACI,cAGJ,oFACI,yBACA,eAGJ,iCACI,kBAGJ,+CAEI,WACA,YACA,sBAGJ,8DACI,qBAGJ,6HAGI,gBACA,mBAGJ,gDACI,sBACA,gDACA,YACA,WACI,gNAEJ,+BACA,mCAGJ,6CACI,gBACA,eAGJ,8CACI,qCACA,gBAGJ,yFAEI,SACA,gBACA,gBACA,gBAGJ,4DACI,kBAGJ,gDACI,iBACA,kBACA,oBACA,UAEA,eACA,uBACA,iBACA,iBAGJ,yEACI,eACA,sBAGJ,qEACI,WAGJ,oDACI,eAGJ,qDACI,iBACA,gBACA,mBAGJ,oDACI,sBACA,gDACA,6IAOJ,8GAEI,cAGJ,+EACI,cAGJ,iDACI,WACA,iBACA,uBACA,gBAGJ,sCACI,WAGJ,iDACI,YAGJ,kDACI,kBACA,UACA,YACA,gBACA,6CACA,gBAEA,yDACI,WACA,cACA,kBACA,UACA,WACA,WACA,YACA,6TAgBR,8CACI,kBACA,WACA,iBACA,gBACA,gBACA,sCACA,WAEA,eACA,0CACA,iBACA,UAGJ,4DACI,WACA,cACA,iBACA,kBACA,oBACA,2BACA,UACA,WACA,kBACA,mBC1bJ,cACI,6BAGJ,QACI,4NAMA,+CACA,cAGJ,mDAEI,aAGJ,4CACI,sBACA,kBAGJ,sBACI,aACA,iBAGJ,sBACI,kBAGJ,2FACI,aAGJ,iBACI,oBACA,sBACA,gBACA,gBACA,mBAGJ,mDACI,UAGJ,iDACI,aAGJ,+BACI,yBACA,aACA,sBAGJ,iFACI,qCACA,iBAGJ,oCACI,2BAGJ,iBACI,aACA,mBAGJ,0BACI,iBAGJ,cACI,2BACA,gBAGJ,8CACI,kBAGJ,+BACI,iBAGJ,gCACI,gBAGJ,kBACI,cAGJ,uDACI,qBAGJ,sCACI,WACA,YACA,uBAGJ,0CACI,kBAGJ,4CACI,YAGJ,kCACI,kBACA,gBAEA,0CACI,WACA,cACA,kBACA,WACA,WACA,SACA,SACA,0GAQR,8BACI,kBAGJ,gHACI,aAGJ,uBACI,aACA,iBAGJ,eACI,gBACA,yBACA,kBACA,oBACA,cAEA,4FAII,yCACA,aAIR,0FAEI,aAGJ,uCACI,gBACA,UACA,YACA,WACA,yBACA,2BAGJ,+CACI,6OAGJ,oEACI,UACA,WACA,YACA,qBACA,gBACA,yCAGJ,oCACI,gBAGJ,qBACI,iBACA,WAGJ,iCACI,gBAGJ,uBACI,cACA,aACA,YACA,UACA,eACA,gBACA,gBAEA,cACA,mBACA,gBACA,cACA,cAEA,0CACI,WACA,YAGJ,gDACI,yBACA,mBACA,WAGJ,sDACI,mBAIR,uFACI,YAGJ,aACI,cAGJ,2BACI,iBACA,mBACA,8BACA,aACA,qBAGJ,kDACI,YACA,2CACA,gBACA,gBACA,eACA,sBACA,0BCpQJ,YACI,eACA,yBACA,kBACA,iBACA,mBACA,kBACA,eAEA,kBACI,mBAIR,aACI,aACA,yBACA,SACA,gBAGJ,mCACI,kBACA,oBAEA,qFAEI,WACA,cACA,kBACA,QACA,SACA,+BAGJ,2CACI,UACA,0BAGJ,0CACI,WACA,2BAIR,uCAEI,kBACA,yBACA,kBACA,mBAGJ,uBACI,kBACA,YAEA,6BACI,iBAIR,kCACI,iBAGJ,qCACI,cACA,kBACA,YACA,kBACA,mBAGJ,4BACI,kBACA,cACA,iBACA,UAKA,4BACI,WACA,qBACA,6BACA,oCACA,qCACA,sBAGJ,0BACI,eAIR,uEAGI,kBACA,MACA,YAGJ,oBACI,QACA,OACA,iBAGJ,0BACI,QACA,WACA,mBAGJ,yBACI,OACA,WACA,mBAGJ,sBACI,kBACA,MACA,QACA,SACA,WACA,iBAGJ,gFAGI,kBACA,YACA,YACA,iBAGJ,uBACI,QACA,OAGJ,6BACI,QACA,WACA,mBAGJ,4BACI,OACA,WACA,mBAGJ,qBACI,kBACA,MACA,SACA,OACA,WACA,iBCnKJ,WACI,cACA,kBACA,yBACA,MACA,OACA,sGACA,mBACA,6CACA,aAGJ,gBACI,aACA,mBACA,mBACA,gBACA,YACA,mBAGJ,oBACI,aACA,yBAGJ,iBACI,YACA,kBACA,kBAGJ,kBACI,YACA,YACA,WACA,eAGJ,+CAEI,qBACA,sBAGJ,uBACI,aACA,2DAGJ,wBACI,kBACA,iBACA,gBACA,mBACA,WACI,mLAWR,kBACI,cACA,kBACA,gBACA,iBACA,UACA,WACA,sBACA,kBAGJ,0CACI,8BACA,6BAGJ,qDAEI,aACA,oBACA,WAGJ,6BACI,iBACA,4EAGJ,wBACI,kBACA,4EAGJ,cACI,cAGJ,2CACI,yCAGJ,sCACI,yCAGJ,0BACI,kBACA,sBAEA,mEAEI,WACA,cACA,kBACA,oBACA,UACA,0BAGJ,iCACI,QAIR,4DAEI,YACA,YAGJ,8BACI,aAGJ,wDAEI,UAGJ,2BACI,aACA,gBACA,gBAGJ,oDACI,aACA,sBACA,8BACA,YACA,UAGJ,wDACI,aACA,mBACA,kBAEA,4DACI,YAIR,kDACI,YAGJ,cACI,eAGJ,yDACI,oCAGJ,yDACI,oCAGJ,yDACI,oCAGJ,yDACI,oCAGJ,yDACI,oCAGJ,yDACI,oCAGJ,yDACI,oCAGJ,2BACI,WAGJ,mBACI,oBAGJ,yBACI,iBACA,aAGJ,0CACI,UACA,iBACA,sBACA","file":"ueb-style.min.css"} \ No newline at end of file diff --git a/dist/ueblueprint.js b/dist/ueblueprint.js index 477b3ae..cf8dd77 100755 --- a/dist/ueblueprint.js +++ b/dist/ueblueprint.js @@ -130,6 +130,7 @@ class Configuration { callArrayFunction: "/Script/BlueprintGraph.K2Node_CallArrayFunction", callDelegate: "/Script/BlueprintGraph.K2Node_CallDelegate", callFunction: "/Script/BlueprintGraph.K2Node_CallFunction", + clearDelegate: "/Script/BlueprintGraph.K2Node_ClearDelegate", comment: "/Script/UnrealEd.EdGraphNode_Comment", commutativeAssociativeBinaryOperator: "/Script/BlueprintGraph.K2Node_CommutativeAssociativeBinaryOperator", componentBoundEvent: "/Script/BlueprintGraph.K2Node_ComponentBoundEvent", @@ -218,6 +219,7 @@ class Configuration { pcgSubgraphSettings: "/Script/PCG.PCGSubgraphSettings", promotableOperator: "/Script/BlueprintGraph.K2Node_PromotableOperator", quat4f: "/Script/CoreUObject.Quat4f", + removeDelegate: "/Script/BlueprintGraph.K2Node_RemoveDelegate", reverseForEachLoop: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:ReverseForEachLoop", rotator: "/Script/CoreUObject.Rotator", select: "/Script/BlueprintGraph.K2Node_Select", @@ -982,7 +984,7 @@ class SVGIcon { ` static delegate = x` - + ` @@ -2685,6 +2687,14 @@ class IEntity { this.#ignored = value; } + #inlined = /** @type {typeof IEntity} */(this.constructor).inlined + get inlined() { + return this.#inlined + } + set inlined(value) { + this.#inlined = value; + } + #quoted get quoted() { return this.#quoted ?? /** @type {typeof IEntity} */(this.constructor).quoted ?? false @@ -2955,7 +2965,7 @@ class IEntity { if (keyValue.length && (Self.attributes[key]?.quoted || value.quoted)) { keyValue = `"${keyValue}"`; } - if (valueType.inlined) { + if (value.inlined) { const inlinedPrintKey = valueType.className() === "ArrayEntity" ? k => printKey(`${keyValue}${k}`) : k => printKey(`${keyValue}.${k}`); @@ -3271,9 +3281,17 @@ class Grammar { const attributeKey = attributeName.split(Configuration.keysSeparator); const attributeValue = this.getAttribute(entityType, attributeKey); const grammar = attributeValue ? attributeValue.grammar : IEntity.unknownEntityGrammar; + const inlined = attributeKey.length > 1; return grammar.map(attributeValue => values => { Utility.objectSet(values, attributeKey, attributeValue); + attributeKey.reduce( + (acc, cur, i) => { + acc[cur]["inlined"] = inlined && i < attributeKey.length - 1; + return acc[cur] + }, + values + ); handleObjectSet(values, attributeKey, attributeValue); } ) @@ -4026,8 +4044,17 @@ function keyName(value) { * @returns {String} */ function nodeTitle(entity) { - let input; + let value; switch (entity.getType()) { + case Configuration.paths.addDelegate: + value ??= "Bind Event to "; + case Configuration.paths.clearDelegate: + value ??= "Unbind all Events from "; + case Configuration.paths.removeDelegate: + value ??= "Unbind Event from "; + return value + Utility.formatStringName( + entity.DelegateReference?.MemberName?.toString().replace(/Delegate$/, "") ?? "None" + ) case Configuration.paths.asyncAction: if (entity.ProxyFactoryFunctionName) { return Utility.formatStringName(entity.ProxyFactoryFunctionName?.toString()) @@ -4080,25 +4107,26 @@ function nodeTitle(entity) { } } case Configuration.paths.materialExpressionConstant: - input ??= [entity.getCustomproperties().find(pinEntity => pinEntity.PinName.toString() == "Value")?.DefaultValue]; + value ??= [entity.getCustomproperties().find(pinEntity => pinEntity.PinName.toString() == "Value")?.DefaultValue]; case Configuration.paths.materialExpressionConstant2Vector: - input ??= [ + value ??= [ entity.getCustomproperties().find(pinEntity => pinEntity.PinName?.toString() == "X")?.DefaultValue, entity.getCustomproperties().find(pinEntity => pinEntity.PinName?.toString() == "Y")?.DefaultValue, ]; case Configuration.paths.materialExpressionConstant3Vector: case Configuration.paths.materialExpressionConstant4Vector: - if (!input) { + if (!value) { const vector = entity.getCustomproperties() .find(pinEntity => pinEntity.PinName?.toString() == "Constant") ?.DefaultValue; - input = vector instanceof VectorEntity ? [vector.X, vector.Y, vector.Z].map(v => v.valueOf()) + value = vector instanceof VectorEntity ? [vector.X, vector.Y, vector.Z].map(v => v.valueOf()) : vector instanceof LinearColorEntity ? [vector.R, vector.G, vector.B, vector.A].map(v => v.valueOf()) : /** @type {Number[]} */([]); } - if (input.length > 0) { - return input.map(v => Utility.printExponential(v)).join(",") + if (value?.length > 0) { + return value.map(v => Utility.printExponential(v)).join(",") } + value = undefined; break case Configuration.paths.materialExpressionFunctionInput: { const materialObject = entity.getMaterialSubobject(); @@ -4412,9 +4440,11 @@ function nodeIcon(entity) { case Configuration.paths.addDelegate: case Configuration.paths.asyncAction: case Configuration.paths.callDelegate: + case Configuration.paths.clearDelegate: case Configuration.paths.createDelegate: case Configuration.paths.functionEntry: case Configuration.paths.functionResult: + case Configuration.paths.removeDelegate: return SVGIcon.node case Configuration.paths.customEvent: return SVGIcon.event case Configuration.paths.doN: return SVGIcon.doN @@ -4726,7 +4756,7 @@ const pinColorMaterial = i$3`120, 120, 120`; /** @param {PinEntity} entity */ function pinColor(entity) { if (entity.PinType.PinCategory?.toString() === "mask") { - const result = colors[entity.PinType.PinSubCategory]; + const result = colors[entity.PinType.PinSubCategory?.toString()]; if (result) { return result } @@ -5294,7 +5324,7 @@ class PinTypeEntity extends IEntity { static attributes = { ...super.attributes, PinCategory: StringEntity.withDefault(), - PinSubCategory: StringEntity.withDefault(), + PinSubCategory: StringEntity, PinSubCategoryObject: ObjectReferenceEntity, PinSubCategoryMemberReference: FunctionReferenceEntity, ContainerType: SymbolEntity, @@ -5657,11 +5687,11 @@ class PinEntity extends IEntity { AutogeneratedDefaultValue: StringEntity, DefaultObject: ObjectReferenceEntity, PersistentGuid: GuidEntity, - bHidden: BooleanEntity.withDefault(), - bNotConnectable: BooleanEntity.withDefault(), - bDefaultValueIsReadOnly: BooleanEntity.withDefault(), - bDefaultValueIsIgnored: BooleanEntity.withDefault(), - bAdvancedView: BooleanEntity.withDefault(), + bHidden: BooleanEntity, + bNotConnectable: BooleanEntity, + bDefaultValueIsReadOnly: BooleanEntity, + bDefaultValueIsIgnored: BooleanEntity, + bAdvancedView: BooleanEntity, bOrphanedPin: BooleanEntity, } static grammar = this.createGrammar() @@ -6121,12 +6151,18 @@ class ScriptVariableEntity extends IEntity { class UnknownPinEntity extends PinEntity { + static attributes = { + ...super.attributes, + PinId: GuidEntity + } + static grammar = this.createGrammar() /** @returns {P} */ static createGrammar() { return Parsernostrum.seq( - Parsernostrum.reg(new RegExp(`(${Grammar.Regex.Symbol.source})\\s*\\(\\s*`), 1), + // Lookbehind + Parsernostrum.reg(new RegExp(`(${Grammar.Regex.Symbol.source}\\s*)\\(\\s*`), 1), Grammar.createAttributeGrammar(this).sepBy(Grammar.commaSeparation), Parsernostrum.reg(/\s*(?:,\s*)?\)/) ).map(([lookbehind, attributes, _2]) => { @@ -8475,6 +8511,29 @@ class MouseClickDrag extends MouseMoveDraggable { } } +/** + * @param {ObjectEntity} entity + * @returns {String?} + */ +function nodeSubtitle(entity) { + switch (entity.getType()) { + case Configuration.paths.addDelegate: + case Configuration.paths.clearDelegate: + case Configuration.paths.removeDelegate: + return null + } + const targetPin = entity + .getPinEntities() + .find(pin => pin.PinName?.toString() === "self" && pinTitle(pin) === "Target"); + if (targetPin) { + const target = entity.FunctionReference?.MemberParent?.getName() + ?? targetPin.PinType?.PinSubCategoryObject?.getName() + ?? "Untitled"; + return target.length > 0 ? `Target is ${Utility.formatStringName(target)}` : null + } + return null +} + /** @typedef {import("./IMouseClickDrag.js").Options} Options */ /** @extends {MouseMoveDraggable} */ @@ -8646,7 +8705,7 @@ class NodeTemplate extends ISelectableDraggableTemplate { static nodeStyleClasses = ["ueb-node-style-default"] - #hasSubtitle = false + #subtitle /** @type {() => PinEntity} */ pinInserter @@ -8692,6 +8751,7 @@ class NodeTemplate extends ISelectableDraggableTemplate { /** @param {NodeElement} element */ initialize(element) { super.initialize(element); + this.#subtitle = nodeSubtitle(element.entity); this.element.classList.add(.../** @type {typeof NodeTemplate} */(this.constructor).nodeStyleClasses); this.element.style.setProperty("--ueb-node-color", this.getColor().cssText); this.pinInserter = this.element.entity.additionalPinInserter(); @@ -8750,10 +8810,8 @@ class NodeTemplate extends ISelectableDraggableTemplate { ${name ? x`
${name} - ${this.#hasSubtitle && this.getTargetType().length > 0 ? x` -
- Target is ${Utility.formatStringName(this.getTargetType())} -
+ ${this.#subtitle ? x` +
${this.#subtitle}
`: A}
` : A} @@ -8774,7 +8832,7 @@ class NodeTemplate extends ISelectableDraggableTemplate { this.element.nodeNameElement = /** @type {HTMLElement} */(this.element.querySelector(".ueb-node-name-text")); let hasInput = false; let hasOutput = false; - for (const p of this.element.getPinElements()) { + for (const p of this.getPinElements()) { if (p === this.defaultPin) { continue } @@ -8797,26 +8855,14 @@ class NodeTemplate extends ISelectableDraggableTemplate { } } + getPinElements() { + return this.element.getPinElements() + } + createPinElements() { return this.element.getPinEntities() .filter(v => !v.isHidden()) - .map(pinEntity => { - this.#hasSubtitle = this.#hasSubtitle - || pinEntity.PinName.toString() === "self" && pinEntity.pinTitle() === "Target"; - return this.createPinElement(pinEntity) - }) - } - - getTargetType() { - return this.element.entity.FunctionReference?.MemberParent?.getName() ?? "Untitled" - } - - /** - * @param {NodeElement} node - * @returns {NodeListOf} - */ - getPinElements(node) { - return node.querySelectorAll("ueb-pin") + .map(pinEntity => this.createPinElement(pinEntity)) } linksChanged() { } @@ -9385,12 +9431,12 @@ class PinTemplate extends ITemplate { return SVGIcon.pcgStackPin } } - switch (this.element.entity.PinType?.ContainerType?.serialize()) { + switch (this.element.entity.PinType.ContainerType?.toString()) { case "Array": return SVGIcon.arrayPin case "Set": return SVGIcon.setPin case "Map": return SVGIcon.mapPin } - if (this.element.entity.PinType?.PinCategory?.toString().toLocaleLowerCase() === "delegate") { + if (this.element.entity.PinType.PinCategory?.toString().toLocaleLowerCase() === "delegate") { return SVGIcon.delegate } if (this.element.nodeElement?.template instanceof VariableOperationNodeTemplate) { @@ -9474,6 +9520,7 @@ class MinimalPinTemplate extends PinTemplate { class EventNodeTemplate extends NodeTemplate { static nodeStyleClasses = [...super.nodeStyleClasses, "ueb-node-style-event"] + #delegatePinElement /** @param {PropertyValues} changedProperties */ firstUpdated(changedProperties) { @@ -9505,22 +9552,32 @@ class EventNodeTemplate extends NodeTemplate { ` } + getPinElements() { + return this.element.getPinElements().filter(v => v.entity.PinType.PinCategory?.toString() !== "delegate") + } + createDelegatePinElement() { - const pin = /** @type {PinElementConstructor} */(ElementFactory.getConstructor("ueb-pin")).newObject( - this.element.getPinEntities().find(v => !v.isHidden() && v.PinType.PinCategory?.toString() === "delegate"), - new MinimalPinTemplate(), - this.element - ); - pin.template.isNameRendered = false; - return pin + if (!this.#delegatePinElement) { + this.#delegatePinElement = /** @type {PinElementConstructor} */(ElementFactory.getConstructor("ueb-pin")) + .newObject( + this.element.getPinEntities().find(v => !v.isHidden() && v.PinType.PinCategory?.toString() === "delegate"), + new MinimalPinTemplate(), + this.element + ); + this.#delegatePinElement.template.isNameRendered = false; + } + return this.#delegatePinElement } createPinElements() { - return this.element.getPinEntities() - .filter(v => !v.isHidden() && v.PinType.PinCategory?.toString() !== "delegate") - .map(pinEntity => /** @type {PinElementConstructor} */(ElementFactory.getConstructor("ueb-pin")) - .newObject(pinEntity, undefined, this.element) - ) + return [ + this.createDelegatePinElement(), + ...this.element.getPinEntities() + .filter(v => !v.isHidden() && v.PinType.PinCategory?.toString() !== "delegate") + .map(pinEntity => /** @type {PinElementConstructor} */(ElementFactory.getConstructor("ueb-pin")) + .newObject(pinEntity, undefined, this.element) + ) + ] } } @@ -9600,17 +9657,9 @@ class KnotNodeTemplate extends NodeTemplate { } setupPins() { - this.element.getPinElements().forEach( - p => /** @type {HTMLElement} */(this.element.querySelector(".ueb-node-border")).appendChild(p) - ); - } - - /** - * @param {NodeElement} node - * @returns {NodeListOf} - */ - getPinElements(node) { - return node.querySelectorAll("ueb-pin") + for (const p of this.getPinElements()) { + /** @type {HTMLElement} */(this.element.querySelector(".ueb-node-border")).appendChild(p); + } } createPinElements() { @@ -9915,7 +9964,7 @@ class NodeElement extends ISelectableDraggableElement { } /** @param {String} name */ - #redirectLinksAfterRename(name) { + #redirectLinksBeforeRename(name) { for (let sourcePinElement of this.getPinElements()) { for (let targetPinReference of sourcePinElement.getLinks()) { this.blueprint.getPin(targetPinReference).redirectLink( @@ -9950,9 +9999,9 @@ class NodeElement extends ISelectableDraggableElement { "Name", /** @param {InstanceType} newName */ newName => { + this.#redirectLinksBeforeRename(newName.value); this.nodeTitle = newName.value; this.nodeDisplayName = nodeTitle(entity); - this.#redirectLinksAfterRename(newName.value); } ); } @@ -10067,7 +10116,7 @@ class BlueprintEntity extends ObjectEntity { /** @param {ObjectEntity} entity */ getHomonymObjectEntity(entity) { - const name = entity.getObjectName(false); + const name = entity.getObjectName(); return this.#objectEntities.find(entity => entity.getObjectName() == name) } @@ -11319,8 +11368,9 @@ class Blueprint extends IElement { const name = element.entity.getObjectName(); const homonym = this.entity.getHomonymObjectEntity(element.entity); if (homonym) { - homonym.Name.value = this.entity.takeFreeName(name); - homonym.Name = homonym.Name; + const newName = this.entity.takeFreeName(name); + // @ts-expect-error + homonym.Name = new (homonym.Name.constructor)(newName); } this.nodes.push(element); this.entity.addObjectEntity(element.entity); @@ -12848,7 +12898,7 @@ class PinElement extends IElement { fromAttribute: (value, type) => value ? GuidEntity.grammar.parse(value) : null, - toAttribute: (value, type) => /** @type {String} */(value?.toString()), + toAttribute: (value, type) => value?.toString(), }, attribute: "data-id", reflect: true, @@ -12920,6 +12970,7 @@ class PinElement extends IElement { this.isLinked = false; this.connectable = !entity.bNotConnectable?.valueOf(); super.initialize(entity, template); + this.pinId = this.entity.PinId; this.pinType = this.entity.getType(); this.defaultValue = this.entity.getDefaultValue(); this.color = PinElement.properties.color.converter.fromAttribute(this.getColor().toString()); @@ -13058,7 +13109,7 @@ class PinElement extends IElement { && pinReference.pinGuid.toString() == originalPinElement.entity.PinId.toString() ); if (index >= 0) { - this.entity.LinkedTo[index] = newReference; + this.entity.LinkedTo.valueOf()[index] = newReference; return true } return false diff --git a/dist/ueblueprint.min.js b/dist/ueblueprint.min.js index 0d30e74..baf2054 100644 --- a/dist/ueblueprint.min.js +++ b/dist/ueblueprint.min.js @@ -3,31 +3,31 @@ * Copyright 2019 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ -const e=window,t=e.ShadowRoot&&(void 0===e.ShadyCSS||e.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;class r{constructor(e,t,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=t}get styleSheet(){let e=this.o;const i=this.t;if(t&&void 0===e){const t=void 0!==i&&1===i.length;t&&(e=s.get(i)),void 0===e&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),t&&s.set(i,e))}return e}toString(){return this.cssText}}const n=(e,...t)=>{const s=1===e.length?e[0]:t.reduce(((t,i,s)=>t+(e=>{if(!0===e._$cssResult$)return e.cssText;if("number"==typeof e)return e;throw Error("Value passed to 'css' function must be a 'css' function result: "+e+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+e[s+1]),e[0]);return new r(s,e,i)},a=t?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let t="";for(const i of e.cssRules)t+=i.cssText;return(e=>new r("string"==typeof e?e:e+"",void 0,i))(t)})(e):e +const e = window, t = e.ShadowRoot && (void 0 === e.ShadyCSS || e.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype, i = Symbol(), s = new WeakMap; class r { constructor(e, t, s) { if (this._$cssResult$ = !0, s !== i) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead."); this.cssText = e, this.t = t } get styleSheet() { let e = this.o; const i = this.t; if (t && void 0 === e) { const t = void 0 !== i && 1 === i.length; t && (e = s.get(i)), void 0 === e && ((this.o = e = new CSSStyleSheet).replaceSync(this.cssText), t && s.set(i, e)) } return e } toString() { return this.cssText } } const n = (e, ...t) => { const s = 1 === e.length ? e[0] : t.reduce(((t, i, s) => t + (e => { if (!0 === e._$cssResult$) return e.cssText; if ("number" == typeof e) return e; throw Error("Value passed to 'css' function must be a 'css' function result: " + e + ". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.") })(i) + e[s + 1]), e[0]); return new r(s, e, i) }, a = t ? e => e : e => e instanceof CSSStyleSheet ? (e => { let t = ""; for (const i of e.cssRules) t += i.cssText; return (e => new r("string" == typeof e ? e : e + "", void 0, i))(t) })(e) : e /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */;var o;const l=window,u=l.trustedTypes,c=u?u.emptyScript:"",h=l.reactiveElementPolyfillSupport,p={toAttribute(e,t){switch(t){case Boolean:e=e?c:null;break;case Object:case Array:e=null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){let i=e;switch(t){case Boolean:i=null!==e;break;case Number:i=null===e?null:Number(e);break;case Object:case Array:try{i=JSON.parse(e)}catch(e){i=null}}return i}},d=(e,t)=>t!==e&&(t==t||e==e),m={attribute:!0,type:String,converter:p,reflect:!1,hasChanged:d},g="finalized";class b extends HTMLElement{constructor(){super(),this._$Ei=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$El=null,this._$Eu()}static addInitializer(e){var t;this.finalize(),(null!==(t=this.h)&&void 0!==t?t:this.h=[]).push(e)}static get observedAttributes(){this.finalize();const e=[];return this.elementProperties.forEach(((t,i)=>{const s=this._$Ep(i,t);void 0!==s&&(this._$Ev.set(s,i),e.push(s))})),e}static createProperty(e,t=m){if(t.state&&(t.attribute=!1),this.finalize(),this.elementProperties.set(e,t),!t.noAccessor&&!this.prototype.hasOwnProperty(e)){const i="symbol"==typeof e?Symbol():"__"+e,s=this.getPropertyDescriptor(e,i,t);void 0!==s&&Object.defineProperty(this.prototype,e,s)}}static getPropertyDescriptor(e,t,i){return{get(){return this[t]},set(s){const r=this[e];this[t]=s,this.requestUpdate(e,r,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)||m}static finalize(){if(this.hasOwnProperty(g))return!1;this[g]=!0;const e=Object.getPrototypeOf(this);if(e.finalize(),void 0!==e.h&&(this.h=[...e.h]),this.elementProperties=new Map(e.elementProperties),this._$Ev=new Map,this.hasOwnProperty("properties")){const e=this.properties,t=[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)];for(const i of t)this.createProperty(i,e[i])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const i=new Set(e.flat(1/0).reverse());for(const e of i)t.unshift(a(e))}else void 0!==e&&t.push(a(e));return t}static _$Ep(e,t){const i=t.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof e?e.toLowerCase():void 0}_$Eu(){var e;this._$E_=new Promise((e=>this.enableUpdating=e)),this._$AL=new Map,this._$Eg(),this.requestUpdate(),null===(e=this.constructor.h)||void 0===e||e.forEach((e=>e(this)))}addController(e){var t,i;(null!==(t=this._$ES)&&void 0!==t?t:this._$ES=[]).push(e),void 0!==this.renderRoot&&this.isConnected&&(null===(i=e.hostConnected)||void 0===i||i.call(e))}removeController(e){var t;null===(t=this._$ES)||void 0===t||t.splice(this._$ES.indexOf(e)>>>0,1)}_$Eg(){this.constructor.elementProperties.forEach(((e,t)=>{this.hasOwnProperty(t)&&(this._$Ei.set(t,this[t]),delete this[t])}))}createRenderRoot(){var i;const s=null!==(i=this.shadowRoot)&&void 0!==i?i:this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{t?i.adoptedStyleSheets=s.map((e=>e instanceof CSSStyleSheet?e:e.styleSheet)):s.forEach((t=>{const s=document.createElement("style"),r=e.litNonce;void 0!==r&&s.setAttribute("nonce",r),s.textContent=t.cssText,i.appendChild(s)}))})(s,this.constructor.elementStyles),s}connectedCallback(){var e;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(e=this._$ES)||void 0===e||e.forEach((e=>{var t;return null===(t=e.hostConnected)||void 0===t?void 0:t.call(e)}))}enableUpdating(e){}disconnectedCallback(){var e;null===(e=this._$ES)||void 0===e||e.forEach((e=>{var t;return null===(t=e.hostDisconnected)||void 0===t?void 0:t.call(e)}))}attributeChangedCallback(e,t,i){this._$AK(e,i)}_$EO(e,t,i=m){var s;const r=this.constructor._$Ep(e,i);if(void 0!==r&&!0===i.reflect){const n=(void 0!==(null===(s=i.converter)||void 0===s?void 0:s.toAttribute)?i.converter:p).toAttribute(t,i.type);this._$El=e,null==n?this.removeAttribute(r):this.setAttribute(r,n),this._$El=null}}_$AK(e,t){var i;const s=this.constructor,r=s._$Ev.get(e);if(void 0!==r&&this._$El!==r){const e=s.getPropertyOptions(r),n="function"==typeof e.converter?{fromAttribute:e.converter}:void 0!==(null===(i=e.converter)||void 0===i?void 0:i.fromAttribute)?e.converter:p;this._$El=r,this[r]=n.fromAttribute(t,e.type),this._$El=null}}requestUpdate(e,t,i){let s=!0;void 0!==e&&(((i=i||this.constructor.getPropertyOptions(e)).hasChanged||d)(this[e],t)?(this._$AL.has(e)||this._$AL.set(e,t),!0===i.reflect&&this._$El!==e&&(void 0===this._$EC&&(this._$EC=new Map),this._$EC.set(e,i))):s=!1),!this.isUpdatePending&&s&&(this._$E_=this._$Ej())}async _$Ej(){this.isUpdatePending=!0;try{await this._$E_}catch(e){Promise.reject(e)}const e=this.scheduleUpdate();return null!=e&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var e;if(!this.isUpdatePending)return;this.hasUpdated,this._$Ei&&(this._$Ei.forEach(((e,t)=>this[t]=e)),this._$Ei=void 0);let t=!1;const i=this._$AL;try{t=this.shouldUpdate(i),t?(this.willUpdate(i),null===(e=this._$ES)||void 0===e||e.forEach((e=>{var t;return null===(t=e.hostUpdate)||void 0===t?void 0:t.call(e)})),this.update(i)):this._$Ek()}catch(e){throw t=!1,this._$Ek(),e}t&&this._$AE(i)}willUpdate(e){}_$AE(e){var t;null===(t=this._$ES)||void 0===t||t.forEach((e=>{var t;return null===(t=e.hostUpdated)||void 0===t?void 0:t.call(e)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$Ek(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$E_}shouldUpdate(e){return!0}update(e){void 0!==this._$EC&&(this._$EC.forEach(((e,t)=>this._$EO(t,this[t],e))),this._$EC=void 0),this._$Ek()}updated(e){}firstUpdated(e){}} + */; var o; const l = window, u = l.trustedTypes, c = u ? u.emptyScript : "", h = l.reactiveElementPolyfillSupport, p = { toAttribute(e, t) { switch (t) { case Boolean: e = e ? c : null; break; case Object: case Array: e = null == e ? e : JSON.stringify(e) }return e }, fromAttribute(e, t) { let i = e; switch (t) { case Boolean: i = null !== e; break; case Number: i = null === e ? null : Number(e); break; case Object: case Array: try { i = JSON.parse(e) } catch (e) { i = null } }return i } }, d = (e, t) => t !== e && (t == t || e == e), m = { attribute: !0, type: String, converter: p, reflect: !1, hasChanged: d }, g = "finalized"; class b extends HTMLElement { constructor() { super(), this._$Ei = new Map, this.isUpdatePending = !1, this.hasUpdated = !1, this._$El = null, this._$Eu() } static addInitializer(e) { var t; this.finalize(), (null !== (t = this.h) && void 0 !== t ? t : this.h = []).push(e) } static get observedAttributes() { this.finalize(); const e = []; return this.elementProperties.forEach(((t, i) => { const s = this._$Ep(i, t); void 0 !== s && (this._$Ev.set(s, i), e.push(s)) })), e } static createProperty(e, t = m) { if (t.state && (t.attribute = !1), this.finalize(), this.elementProperties.set(e, t), !t.noAccessor && !this.prototype.hasOwnProperty(e)) { const i = "symbol" == typeof e ? Symbol() : "__" + e, s = this.getPropertyDescriptor(e, i, t); void 0 !== s && Object.defineProperty(this.prototype, e, s) } } static getPropertyDescriptor(e, t, i) { return { get() { return this[t] }, set(s) { const r = this[e]; this[t] = s, this.requestUpdate(e, r, i) }, configurable: !0, enumerable: !0 } } static getPropertyOptions(e) { return this.elementProperties.get(e) || m } static finalize() { if (this.hasOwnProperty(g)) return !1; this[g] = !0; const e = Object.getPrototypeOf(this); if (e.finalize(), void 0 !== e.h && (this.h = [...e.h]), this.elementProperties = new Map(e.elementProperties), this._$Ev = new Map, this.hasOwnProperty("properties")) { const e = this.properties, t = [...Object.getOwnPropertyNames(e), ...Object.getOwnPropertySymbols(e)]; for (const i of t) this.createProperty(i, e[i]) } return this.elementStyles = this.finalizeStyles(this.styles), !0 } static finalizeStyles(e) { const t = []; if (Array.isArray(e)) { const i = new Set(e.flat(1 / 0).reverse()); for (const e of i) t.unshift(a(e)) } else void 0 !== e && t.push(a(e)); return t } static _$Ep(e, t) { const i = t.attribute; return !1 === i ? void 0 : "string" == typeof i ? i : "string" == typeof e ? e.toLowerCase() : void 0 } _$Eu() { var e; this._$E_ = new Promise((e => this.enableUpdating = e)), this._$AL = new Map, this._$Eg(), this.requestUpdate(), null === (e = this.constructor.h) || void 0 === e || e.forEach((e => e(this))) } addController(e) { var t, i; (null !== (t = this._$ES) && void 0 !== t ? t : this._$ES = []).push(e), void 0 !== this.renderRoot && this.isConnected && (null === (i = e.hostConnected) || void 0 === i || i.call(e)) } removeController(e) { var t; null === (t = this._$ES) || void 0 === t || t.splice(this._$ES.indexOf(e) >>> 0, 1) } _$Eg() { this.constructor.elementProperties.forEach(((e, t) => { this.hasOwnProperty(t) && (this._$Ei.set(t, this[t]), delete this[t]) })) } createRenderRoot() { var i; const s = null !== (i = this.shadowRoot) && void 0 !== i ? i : this.attachShadow(this.constructor.shadowRootOptions); return ((i, s) => { t ? i.adoptedStyleSheets = s.map((e => e instanceof CSSStyleSheet ? e : e.styleSheet)) : s.forEach((t => { const s = document.createElement("style"), r = e.litNonce; void 0 !== r && s.setAttribute("nonce", r), s.textContent = t.cssText, i.appendChild(s) })) })(s, this.constructor.elementStyles), s } connectedCallback() { var e; void 0 === this.renderRoot && (this.renderRoot = this.createRenderRoot()), this.enableUpdating(!0), null === (e = this._$ES) || void 0 === e || e.forEach((e => { var t; return null === (t = e.hostConnected) || void 0 === t ? void 0 : t.call(e) })) } enableUpdating(e) { } disconnectedCallback() { var e; null === (e = this._$ES) || void 0 === e || e.forEach((e => { var t; return null === (t = e.hostDisconnected) || void 0 === t ? void 0 : t.call(e) })) } attributeChangedCallback(e, t, i) { this._$AK(e, i) } _$EO(e, t, i = m) { var s; const r = this.constructor._$Ep(e, i); if (void 0 !== r && !0 === i.reflect) { const n = (void 0 !== (null === (s = i.converter) || void 0 === s ? void 0 : s.toAttribute) ? i.converter : p).toAttribute(t, i.type); this._$El = e, null == n ? this.removeAttribute(r) : this.setAttribute(r, n), this._$El = null } } _$AK(e, t) { var i; const s = this.constructor, r = s._$Ev.get(e); if (void 0 !== r && this._$El !== r) { const e = s.getPropertyOptions(r), n = "function" == typeof e.converter ? { fromAttribute: e.converter } : void 0 !== (null === (i = e.converter) || void 0 === i ? void 0 : i.fromAttribute) ? e.converter : p; this._$El = r, this[r] = n.fromAttribute(t, e.type), this._$El = null } } requestUpdate(e, t, i) { let s = !0; void 0 !== e && (((i = i || this.constructor.getPropertyOptions(e)).hasChanged || d)(this[e], t) ? (this._$AL.has(e) || this._$AL.set(e, t), !0 === i.reflect && this._$El !== e && (void 0 === this._$EC && (this._$EC = new Map), this._$EC.set(e, i))) : s = !1), !this.isUpdatePending && s && (this._$E_ = this._$Ej()) } async _$Ej() { this.isUpdatePending = !0; try { await this._$E_ } catch (e) { Promise.reject(e) } const e = this.scheduleUpdate(); return null != e && await e, !this.isUpdatePending } scheduleUpdate() { return this.performUpdate() } performUpdate() { var e; if (!this.isUpdatePending) return; this.hasUpdated, this._$Ei && (this._$Ei.forEach(((e, t) => this[t] = e)), this._$Ei = void 0); let t = !1; const i = this._$AL; try { t = this.shouldUpdate(i), t ? (this.willUpdate(i), null === (e = this._$ES) || void 0 === e || e.forEach((e => { var t; return null === (t = e.hostUpdate) || void 0 === t ? void 0 : t.call(e) })), this.update(i)) : this._$Ek() } catch (e) { throw t = !1, this._$Ek(), e } t && this._$AE(i) } willUpdate(e) { } _$AE(e) { var t; null === (t = this._$ES) || void 0 === t || t.forEach((e => { var t; return null === (t = e.hostUpdated) || void 0 === t ? void 0 : t.call(e) })), this.hasUpdated || (this.hasUpdated = !0, this.firstUpdated(e)), this.updated(e) } _$Ek() { this._$AL = new Map, this.isUpdatePending = !1 } get updateComplete() { return this.getUpdateComplete() } getUpdateComplete() { return this._$E_ } shouldUpdate(e) { return !0 } update(e) { void 0 !== this._$EC && (this._$EC.forEach(((e, t) => this._$EO(t, this[t], e))), this._$EC = void 0), this._$Ek() } updated(e) { } firstUpdated(e) { } } /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ -var v;b[g]=!0,b.elementProperties=new Map,b.elementStyles=[],b.shadowRootOptions={mode:"open"},null==h||h({ReactiveElement:b}),(null!==(o=l.reactiveElementVersions)&&void 0!==o?o:l.reactiveElementVersions=[]).push("1.6.3");const f=window,y=f.trustedTypes,w=y?y.createPolicy("lit-html",{createHTML:e=>e}):void 0,S="$lit$",E=`lit$${(Math.random()+"").slice(9)}$`,C="?"+E,N=`<${C}>`,x=document,P=()=>x.createComment(""),k=e=>null===e||"object"!=typeof e&&"function"!=typeof e,A=Array.isArray,L="[ \t\n\f\r]",M=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,T=/-->/g,I=/>/g,O=RegExp(`>|${L}(?:([^\\s"'>=/]+)(${L}*=${L}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),$=/'/g,D=/"/g,B=/^(?:script|style|textarea|title)$/i,G=(e=>(t,...i)=>({_$litType$:e,strings:t,values:i}))(1),H=Symbol.for("lit-noChange"),V=Symbol.for("lit-nothing"),R=new WeakMap,_=x.createTreeWalker(x,129,null,!1);function z(e,t){if(!Array.isArray(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==w?w.createHTML(t):t}const F=(e,t)=>{const i=e.length-1,s=[];let r,n=2===t?"":"",a=M;for(let t=0;t"===l[0]?(a=null!=r?r:M,u=-1):void 0===l[1]?u=-2:(u=a.lastIndex-l[2].length,o=l[1],a=void 0===l[3]?O:'"'===l[3]?D:$):a===D||a===$?a=O:a===T||a===I?a=M:(a=O,r=void 0);const h=a===O&&e[t+1].startsWith("/>")?" ":"";n+=a===M?i+N:u>=0?(s.push(o),i.slice(0,u)+S+i.slice(u)+E+h):i+E+(-2===u?(s.push(void 0),t):h)}return[z(e,n+(e[i]||"")+(2===t?"":"")),s]};class j{constructor({strings:e,_$litType$:t},i){let s;this.parts=[];let r=0,n=0;const a=e.length-1,o=this.parts,[l,u]=F(e,t);if(this.el=j.createElement(l,i),_.currentNode=this.el.content,2===t){const e=this.el.content,t=e.firstChild;t.remove(),e.append(...t.childNodes)}for(;null!==(s=_.nextNode())&&o.length0){s.textContent=y?y.emptyScript:"";for(let i=0;iA(e)||"function"==typeof(null==e?void 0:e[Symbol.iterator]))(e)?this.T(e):this._(e)}k(e){return this._$AA.parentNode.insertBefore(e,this._$AB)}$(e){this._$AH!==e&&(this._$AR(),this._$AH=this.k(e))}_(e){this._$AH!==V&&k(this._$AH)?this._$AA.nextSibling.data=e:this.$(x.createTextNode(e)),this._$AH=e}g(e){var t;const{values:i,_$litType$:s}=e,r="number"==typeof s?this._$AC(e):(void 0===s.el&&(s.el=j.createElement(z(s.h,s.h[0]),this.options)),s);if((null===(t=this._$AH)||void 0===t?void 0:t._$AD)===r)this._$AH.v(i);else{const e=new Y(r,this),t=e.u(this.options);e.v(i),this.$(t),this._$AH=e}}_$AC(e){let t=R.get(e.strings);return void 0===t&&R.set(e.strings,t=new j(e)),t}T(e){A(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let i,s=0;for(const r of e)s===t.length?t.push(i=new K(this.k(P()),this.k(P()),this,this.options)):i=t[s],i._$AI(r),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=V}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(e,t=this,i,s){const r=this.strings;let n=!1;if(void 0===r)e=U(this,e,t,0),n=!k(e)||e!==this._$AH&&e!==H,n&&(this._$AH=e);else{const s=e;let a,o;for(e=r[0],a=0;a e }) : void 0, S = "$lit$", E = `lit$${(Math.random() + "").slice(9)}$`, C = "?" + E, N = `<${C}>`, x = document, P = () => x.createComment(""), k = e => null === e || "object" != typeof e && "function" != typeof e, A = Array.isArray, L = "[ \t\n\f\r]", M = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g, T = /-->/g, I = />/g, O = RegExp(`>|${L}(?:([^\\s"'>=/]+)(${L}*=${L}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`, "g"), D = /'/g, $ = /"/g, B = /^(?:script|style|textarea|title)$/i, G = (e => (t, ...i) => ({ _$litType$: e, strings: t, values: i }))(1), H = Symbol.for("lit-noChange"), V = Symbol.for("lit-nothing"), R = new WeakMap, _ = x.createTreeWalker(x, 129, null, !1); function z(e, t) { if (!Array.isArray(e) || !e.hasOwnProperty("raw")) throw Error("invalid template strings array"); return void 0 !== w ? w.createHTML(t) : t } const F = (e, t) => { const i = e.length - 1, s = []; let n, r = 2 === t ? "" : "", a = M; for (let t = 0; t < i; t++) { const i = e[t]; let o, l, u = -1, c = 0; for (; c < i.length && (a.lastIndex = c, l = a.exec(i), null !== l);)c = a.lastIndex, a === M ? "!--" === l[1] ? a = T : void 0 !== l[1] ? a = I : void 0 !== l[2] ? (B.test(l[2]) && (n = RegExp("" === l[0] ? (a = null != n ? n : M, u = -1) : void 0 === l[1] ? u = -2 : (u = a.lastIndex - l[2].length, o = l[1], a = void 0 === l[3] ? O : '"' === l[3] ? $ : D) : a === $ || a === D ? a = O : a === T || a === I ? a = M : (a = O, n = void 0); const h = a === O && e[t + 1].startsWith("/>") ? " " : ""; r += a === M ? i + N : u >= 0 ? (s.push(o), i.slice(0, u) + S + i.slice(u) + E + h) : i + E + (-2 === u ? (s.push(void 0), t) : h) } return [z(e, r + (e[i] || "") + (2 === t ? "" : "")), s] }; class j { constructor({ strings: e, _$litType$: t }, i) { let s; this.parts = []; let n = 0, r = 0; const a = e.length - 1, o = this.parts, [l, u] = F(e, t); if (this.el = j.createElement(l, i), _.currentNode = this.el.content, 2 === t) { const e = this.el.content, t = e.firstChild; t.remove(), e.append(...t.childNodes) } for (; null !== (s = _.nextNode()) && o.length < a;) { if (1 === s.nodeType) { if (s.hasAttributes()) { const e = []; for (const t of s.getAttributeNames()) if (t.endsWith(S) || t.startsWith(E)) { const i = u[r++]; if (e.push(t), void 0 !== i) { const e = s.getAttribute(i.toLowerCase() + S).split(E), t = /([.?@])?(.*)/.exec(i); o.push({ type: 1, index: n, name: t[2], strings: e, ctor: "." === t[1] ? q : "?" === t[1] ? W : "@" === t[1] ? Q : X }) } else o.push({ type: 6, index: n }) } for (const t of e) s.removeAttribute(t) } if (B.test(s.tagName)) { const e = s.textContent.split(E), t = e.length - 1; if (t > 0) { s.textContent = y ? y.emptyScript : ""; for (let i = 0; i < t; i++)s.append(e[i], P()), _.nextNode(), o.push({ type: 2, index: ++n }); s.append(e[t], P()) } } } else if (8 === s.nodeType) if (s.data === C) o.push({ type: 2, index: n }); else { let e = -1; for (; -1 !== (e = s.data.indexOf(E, e + 1));)o.push({ type: 7, index: n }), e += E.length - 1 } n++ } } static createElement(e, t) { const i = x.createElement("template"); return i.innerHTML = e, i } } function U(e, t, i = e, s) { var n, r, a, o; if (t === H) return t; let l = void 0 !== s ? null === (n = i._$Co) || void 0 === n ? void 0 : n[s] : i._$Cl; const u = k(t) ? void 0 : t._$litDirective$; return (null == l ? void 0 : l.constructor) !== u && (null === (r = null == l ? void 0 : l._$AO) || void 0 === r || r.call(l, !1), void 0 === u ? l = void 0 : (l = new u(e), l._$AT(e, i, s)), void 0 !== s ? (null !== (a = (o = i)._$Co) && void 0 !== a ? a : o._$Co = [])[s] = l : i._$Cl = l), void 0 !== l && (t = U(e, l._$AS(e, t.values), l, s)), t } class Y { constructor(e, t) { this._$AV = [], this._$AN = void 0, this._$AD = e, this._$AM = t } get parentNode() { return this._$AM.parentNode } get _$AU() { return this._$AM._$AU } u(e) { var t; const { el: { content: i }, parts: s } = this._$AD, n = (null !== (t = null == e ? void 0 : e.creationScope) && void 0 !== t ? t : x).importNode(i, !0); _.currentNode = n; let r = _.nextNode(), a = 0, o = 0, l = s[0]; for (; void 0 !== l;) { if (a === l.index) { let t; 2 === l.type ? t = new K(r, r.nextSibling, this, e) : 1 === l.type ? t = new l.ctor(r, l.name, l.strings, this, e) : 6 === l.type && (t = new J(r, this, e)), this._$AV.push(t), l = s[++o] } a !== (null == l ? void 0 : l.index) && (r = _.nextNode(), a++) } return _.currentNode = x, n } v(e) { let t = 0; for (const i of this._$AV) void 0 !== i && (void 0 !== i.strings ? (i._$AI(e, i, t), t += i.strings.length - 2) : i._$AI(e[t])), t++ } } class K { constructor(e, t, i, s) { var n; this.type = 2, this._$AH = V, this._$AN = void 0, this._$AA = e, this._$AB = t, this._$AM = i, this.options = s, this._$Cp = null === (n = null == s ? void 0 : s.isConnected) || void 0 === n || n } get _$AU() { var e, t; return null !== (t = null === (e = this._$AM) || void 0 === e ? void 0 : e._$AU) && void 0 !== t ? t : this._$Cp } get parentNode() { let e = this._$AA.parentNode; const t = this._$AM; return void 0 !== t && 11 === (null == e ? void 0 : e.nodeType) && (e = t.parentNode), e } get startNode() { return this._$AA } get endNode() { return this._$AB } _$AI(e, t = this) { e = U(this, e, t), k(e) ? e === V || null == e || "" === e ? (this._$AH !== V && this._$AR(), this._$AH = V) : e !== this._$AH && e !== H && this._(e) : void 0 !== e._$litType$ ? this.g(e) : void 0 !== e.nodeType ? this.$(e) : (e => A(e) || "function" == typeof (null == e ? void 0 : e[Symbol.iterator]))(e) ? this.T(e) : this._(e) } k(e) { return this._$AA.parentNode.insertBefore(e, this._$AB) } $(e) { this._$AH !== e && (this._$AR(), this._$AH = this.k(e)) } _(e) { this._$AH !== V && k(this._$AH) ? this._$AA.nextSibling.data = e : this.$(x.createTextNode(e)), this._$AH = e } g(e) { var t; const { values: i, _$litType$: s } = e, n = "number" == typeof s ? this._$AC(e) : (void 0 === s.el && (s.el = j.createElement(z(s.h, s.h[0]), this.options)), s); if ((null === (t = this._$AH) || void 0 === t ? void 0 : t._$AD) === n) this._$AH.v(i); else { const e = new Y(n, this), t = e.u(this.options); e.v(i), this.$(t), this._$AH = e } } _$AC(e) { let t = R.get(e.strings); return void 0 === t && R.set(e.strings, t = new j(e)), t } T(e) { A(this._$AH) || (this._$AH = [], this._$AR()); const t = this._$AH; let i, s = 0; for (const n of e) s === t.length ? t.push(i = new K(this.k(P()), this.k(P()), this, this.options)) : i = t[s], i._$AI(n), s++; s < t.length && (this._$AR(i && i._$AB.nextSibling, s), t.length = s) } _$AR(e = this._$AA.nextSibling, t) { var i; for (null === (i = this._$AP) || void 0 === i || i.call(this, !1, !0, t); e && e !== this._$AB;) { const t = e.nextSibling; e.remove(), e = t } } setConnected(e) { var t; void 0 === this._$AM && (this._$Cp = e, null === (t = this._$AP) || void 0 === t || t.call(this, e)) } } class X { constructor(e, t, i, s, n) { this.type = 1, this._$AH = V, this._$AN = void 0, this.element = e, this.name = t, this._$AM = s, this.options = n, i.length > 2 || "" !== i[0] || "" !== i[1] ? (this._$AH = Array(i.length - 1).fill(new String), this.strings = i) : this._$AH = V } get tagName() { return this.element.tagName } get _$AU() { return this._$AM._$AU } _$AI(e, t = this, i, s) { const n = this.strings; let r = !1; if (void 0 === n) e = U(this, e, t, 0), r = !k(e) || e !== this._$AH && e !== H, r && (this._$AH = e); else { const s = e; let a, o; for (e = n[0], a = 0; a < n.length - 1; a++)o = U(this, s[i + a], t, a), o === H && (o = this._$AH[a]), r || (r = !k(o) || o !== this._$AH[a]), o === V ? e = V : e !== V && (e += (null != o ? o : "") + n[a + 1]), this._$AH[a] = o } r && !s && this.j(e) } j(e) { e === V ? this.element.removeAttribute(this.name) : this.element.setAttribute(this.name, null != e ? e : "") } } class q extends X { constructor() { super(...arguments), this.type = 3 } j(e) { this.element[this.name] = e === V ? void 0 : e } } const Z = y ? y.emptyScript : ""; class W extends X { constructor() { super(...arguments), this.type = 4 } j(e) { e && e !== V ? this.element.setAttribute(this.name, Z) : this.element.removeAttribute(this.name) } } class Q extends X { constructor(e, t, i, s, n) { super(e, t, i, s, n), this.type = 5 } _$AI(e, t = this) { var i; if ((e = null !== (i = U(this, e, t, 0)) && void 0 !== i ? i : V) === H) return; const s = this._$AH, n = e === V && s !== V || e.capture !== s.capture || e.once !== s.once || e.passive !== s.passive, r = e !== V && (s === V || n); n && this.element.removeEventListener(this.name, this, s), r && this.element.addEventListener(this.name, this, e), this._$AH = e } handleEvent(e) { var t, i; "function" == typeof this._$AH ? this._$AH.call(null !== (i = null === (t = this.options) || void 0 === t ? void 0 : t.host) && void 0 !== i ? i : this.element, e) : this._$AH.handleEvent(e) } } class J { constructor(e, t, i) { this.element = e, this.type = 6, this._$AN = void 0, this._$AM = t, this.options = i } get _$AU() { return this._$AM._$AU } _$AI(e) { U(this, e) } } const ee = f.litHtmlPolyfillSupport; null == ee || ee(j, K), (null !== (v = f.litHtmlVersions) && void 0 !== v ? v : f.litHtmlVersions = []).push("2.8.0") /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ -var te,ie;class se extends b{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){var e,t;const i=super.createRenderRoot();return null!==(e=(t=this.renderOptions).renderBefore)&&void 0!==e||(t.renderBefore=i.firstChild),i}update(e){const t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this._$Do=((e,t,i)=>{var s,r;const n=null!==(s=null==i?void 0:i.renderBefore)&&void 0!==s?s:t;let a=n._$litPart$;if(void 0===a){const e=null!==(r=null==i?void 0:i.renderBefore)&&void 0!==r?r:null;n._$litPart$=a=new K(t.insertBefore(P(),e),e,void 0,null!=i?i:{})}return a._$AI(e),a})(t,this.renderRoot,this.renderOptions)}connectedCallback(){var e;super.connectedCallback(),null===(e=this._$Do)||void 0===e||e.setConnected(!0)}disconnectedCallback(){var e;super.disconnectedCallback(),null===(e=this._$Do)||void 0===e||e.setConnected(!1)}render(){return H}}se.finalized=!0,se._$litElement$=!0,null===(te=globalThis.litElementHydrateSupport)||void 0===te||te.call(globalThis,{LitElement:se});const re=globalThis.litElementPolyfillSupport;null==re||re({LitElement:se}),(null!==(ie=globalThis.litElementVersions)&&void 0!==ie?ie:globalThis.litElementVersions=[]).push("3.3.3");class ne{static nodeColors={black:n``,blue:n``,darkBlue:n``,darkerBlue:n``,darkTurquoise:n``,gray:n``,green:n``,intenseGreen:n``,lime:n``,red:n``,turquoise:n``,violet:n``,yellow:n``};static alphaPattern="repeating-conic-gradient(#7c8184 0% 25%, #c2c3c4 0% 50%) 50% / 10px 10px";static colorDragEventName="ueb-color-drag";static colorPickEventName="ueb-color-pick";static colorWindowEventName="ueb-color-window";static colorWindowName="Color Picker";static defaultCommentHeight=96;static defaultCommentWidth=400;static distanceThreshold=5;static dragEventName="ueb-drag";static dragGeneralEventName="ueb-drag-general";static edgeScrollThreshold=50;static editTextEventName={begin:"ueb-edit-text-begin",end:"ueb-edit-text-end"};static expandGridSize=400;static focusEventName={begin:"blueprint-focus",end:"blueprint-unfocus"};static fontSize=n``;static gridAxisLineColor=n``;static gridExpandThreshold=.25;static gridLineColor=n``;static gridLineWidth=1;static gridSet=8;static gridSetLineColor=n``;static gridShrinkThreshold=4;static gridSize=16;static hexColorRegex=/^\s*#(?[0-9a-fA-F]{2})(?[0-9a-fA-F]{2})(?[0-9a-fA-F]{2})([0-9a-fA-F]{2})?|#(?[0-9a-fA-F])(?[0-9a-fA-F])(?[0-9a-fA-F])\s*$/;static indentation=" ";static keysSeparator=/[\.\(\)]/;static knotOffset=[-ne.gridSize,-.5*ne.gridSize];static lineTracePattern=/LineTrace(Single|Multi)(\w*)/;static linkCurveHeight=15;static linkCurveWidth=80;static linkMinWidth=100;static nameRegexSpaceReplacement=new RegExp("^K2(?:[Nn]ode)?_|(?<=[a-z])(?=[A-Z0-9])|(?<=[A-Z])(?{let s=100-e;return`M ${e} 0 C ${t.toFixed(3)} 0, ${i.toFixed(3)} 0, 50 50 S ${(s-t+e).toFixed(3)} 100, ${s.toFixed(3)} 100`};static maxZoom=7;static minZoom=-12;static mouseClickButton=0;static mouseRightClickButton=2;static mouseWheelZoomThreshold=80;static nodeDragEventName="ueb-node-drag";static nodeDragGeneralEventName="ueb-node-drag-general";static nodeTitle=(e,t)=>`${e}_${t}`;static nodeRadius=8;static nodeReflowEventName="ueb-node-reflow";static paths={actorBoundEvent:"/Script/BlueprintGraph.K2Node_ActorBoundEvent",addDelegate:"/Script/BlueprintGraph.K2Node_AddDelegate",ambientSound:"/Script/Engine.AmbientSound",asyncAction:"/Script/BlueprintGraph.K2Node_AsyncAction",blueprint:"/Script/Engine.Blueprint",blueprintGameplayTagLibrary:"/Script/GameplayTags.BlueprintGameplayTagLibrary",blueprintMapLibrary:"/Script/Engine.BlueprintMapLibrary",blueprintSetLibrary:"/Script/Engine.BlueprintSetLibrary",callArrayFunction:"/Script/BlueprintGraph.K2Node_CallArrayFunction",callDelegate:"/Script/BlueprintGraph.K2Node_CallDelegate",callFunction:"/Script/BlueprintGraph.K2Node_CallFunction",comment:"/Script/UnrealEd.EdGraphNode_Comment",commutativeAssociativeBinaryOperator:"/Script/BlueprintGraph.K2Node_CommutativeAssociativeBinaryOperator",componentBoundEvent:"/Script/BlueprintGraph.K2Node_ComponentBoundEvent",createDelegate:"/Script/BlueprintGraph.K2Node_CreateDelegate",customEvent:"/Script/BlueprintGraph.K2Node_CustomEvent",doN:"/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:Do N",doOnce:"/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:DoOnce",dynamicCast:"/Script/BlueprintGraph.K2Node_DynamicCast",eAttachmentRule:"/Script/Engine.EAttachmentRule",edGraph:"/Script/Engine.EdGraph",eDrawDebugTrace:"/Script/Engine.EDrawDebugTrace",eMaterialSamplerType:"/Script/Engine.EMaterialSamplerType",eNiagara_Float4Channel:"/Niagara/Enums/ENiagara_Float4Channel.ENiagara_Float4Channel",enum:"/Script/CoreUObject.Enum",enumLiteral:"/Script/BlueprintGraph.K2Node_EnumLiteral",eSamplerSourceMode:"/Script/Engine.ESamplerSourceMode",eSearchCase:"/Script/CoreUObject.ESearchCase",eSearchDir:"/Script/CoreUObject.ESearchDir",eSpawnActorCollisionHandlingMethod:"/Script/Engine.ESpawnActorCollisionHandlingMethod",eTextureMipValueMode:"/Script/Engine.ETextureMipValueMode",eTraceTypeQuery:"/Script/Engine.ETraceTypeQuery",event:"/Script/BlueprintGraph.K2Node_Event",eWorldPositionIncludedOffsets:"/Script/Engine.EWorldPositionIncludedOffsets",executionSequence:"/Script/BlueprintGraph.K2Node_ExecutionSequence",flipflop:"/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:FlipFlop",forEachElementInEnum:"/Script/BlueprintGraph.K2Node_ForEachElementInEnum",forEachLoop:"/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:ForEachLoop",forEachLoopWithBreak:"/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:ForEachLoopWithBreak",forLoop:"/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:ForLoop",forLoopWithBreak:"/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:ForLoopWithBreak",functionEntry:"/Script/BlueprintGraph.K2Node_FunctionEntry",functionResult:"/Script/BlueprintGraph.K2Node_FunctionResult",gameplayTag:"/Script/GameplayTags.GameplayTag",getInputAxisKeyValue:"/Script/BlueprintGraph.K2Node_GetInputAxisKeyValue",ifThenElse:"/Script/BlueprintGraph.K2Node_IfThenElse",inputAxisKeyEvent:"/Script/BlueprintGraph.K2Node_InputAxisKeyEvent",inputDebugKey:"/Script/InputBlueprintNodes.K2Node_InputDebugKey",inputKey:"/Script/BlueprintGraph.K2Node_InputKey",inputVectorAxisEvent:"/Script/BlueprintGraph.K2Node_InputVectorAxisEvent",isValid:"/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:IsValid",kismetArrayLibrary:"/Script/Engine.KismetArrayLibrary",kismetMathLibrary:"/Script/Engine.KismetMathLibrary",knot:"/Script/BlueprintGraph.K2Node_Knot",linearColor:"/Script/CoreUObject.LinearColor",literal:"/Script/BlueprintGraph.K2Node_Literal",macro:"/Script/BlueprintGraph.K2Node_MacroInstance",makeArray:"/Script/BlueprintGraph.K2Node_MakeArray",makeMap:"/Script/BlueprintGraph.K2Node_MakeMap",makeSet:"/Script/BlueprintGraph.K2Node_MakeSet",makeStruct:"/Script/BlueprintGraph.K2Node_MakeStruct",materialExpressionComponentMask:"/Script/Engine.MaterialExpressionComponentMask",materialExpressionConstant:"/Script/Engine.MaterialExpressionConstant",materialExpressionConstant2Vector:"/Script/Engine.MaterialExpressionConstant2Vector",materialExpressionConstant3Vector:"/Script/Engine.MaterialExpressionConstant3Vector",materialExpressionConstant4Vector:"/Script/Engine.MaterialExpressionConstant4Vector",materialExpressionFunctionInput:"/Script/Engine.MaterialExpressionFunctionInput",materialExpressionLogarithm:"/Script/InterchangeImport.MaterialExpressionLogarithm",materialExpressionLogarithm10:"/Script/Engine.MaterialExpressionLogarithm10",materialExpressionLogarithm2:"/Script/Engine.MaterialExpressionLogarithm2",materialExpressionMaterialFunctionCall:"/Script/Engine.MaterialExpressionMaterialFunctionCall",materialExpressionSquareRoot:"/Script/Engine.MaterialExpressionSquareRoot",materialExpressionSubtract:"/Script/Engine.MaterialExpressionSubtract",materialExpressionTextureCoordinate:"/Script/Engine.MaterialExpressionTextureCoordinate",materialExpressionTextureSample:"/Script/Engine.MaterialExpressionTextureSample",materialExpressionWorldPosition:"/Script/Engine.MaterialExpressionWorldPosition",materialGraphNode:"/Script/UnrealEd.MaterialGraphNode",materialGraphNodeComment:"/Script/UnrealEd.MaterialGraphNode_Comment",metasoundEditorGraphExternalNode:"/Script/MetasoundEditor.MetasoundEditorGraphExternalNode",multiGate:"/Script/BlueprintGraph.K2Node_MultiGate",niagaraBool:"/Script/Niagara.NiagaraBool",niagaraClipboardContent:"/Script/NiagaraEditor.NiagaraClipboardContent",niagaraDataInterfaceVolumeTexture:"/Script/Niagara.NiagaraDataInterfaceVolumeTexture",niagaraFloat:"/Script/Niagara.NiagaraFloat",NiagaraInt32:"/Script/Niagara.NiagaraInt32",niagaraMatrix:"/Script/Niagara.NiagaraMatrix",niagaraNodeConvert:"/Script/NiagaraEditor.NiagaraNodeConvert",niagaraNodeFunctionCall:"/Script/NiagaraEditor.NiagaraNodeFunctionCall",niagaraNodeOp:"/Script/NiagaraEditor.NiagaraNodeOp",niagaraNumeric:"/Script/Niagara.NiagaraNumeric",niagaraPosition:"/Script/Niagara.NiagaraPosition",pawn:"/Script/Engine.Pawn",pcgEditorGraphNode:"/Script/PCGEditor.PCGEditorGraphNode",pcgEditorGraphNodeInput:"/Script/PCGEditor.PCGEditorGraphNodeInput",pcgEditorGraphNodeOutput:"/Script/PCGEditor.PCGEditorGraphNodeOutput",pcgHiGenGridSizeSettings:"/Script/PCG.PCGHiGenGridSizeSettings",pcgSubgraphSettings:"/Script/PCG.PCGSubgraphSettings",promotableOperator:"/Script/BlueprintGraph.K2Node_PromotableOperator",quat4f:"/Script/CoreUObject.Quat4f",reverseForEachLoop:"/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:ReverseForEachLoop",rotator:"/Script/CoreUObject.Rotator",select:"/Script/BlueprintGraph.K2Node_Select",self:"/Script/BlueprintGraph.K2Node_Self",slateBlueprintLibrary:"/Script/UMG.SlateBlueprintLibrary",spawnActorFromClass:"/Script/BlueprintGraph.K2Node_SpawnActorFromClass",switchEnum:"/Script/BlueprintGraph.K2Node_SwitchEnum",switchGameplayTag:"/Script/GameplayTagsEditor.GameplayTagsK2Node_SwitchGameplayTag",switchInteger:"/Script/BlueprintGraph.K2Node_SwitchInteger",switchName:"/Script/BlueprintGraph.K2Node_SwitchName",switchString:"/Script/BlueprintGraph.K2Node_SwitchString",timeline:"/Script/BlueprintGraph.K2Node_Timeline",timeManagementBlueprintLibrary:"/Script/TimeManagement.TimeManagementBlueprintLibrary",transform:"/Script/CoreUObject.Transform",userDefinedEnum:"/Script/Engine.UserDefinedEnum",variableGet:"/Script/BlueprintGraph.K2Node_VariableGet",variableSet:"/Script/BlueprintGraph.K2Node_VariableSet",vector:"/Script/CoreUObject.Vector",vector2D:"/Script/CoreUObject.Vector2D",vector3f:"/Script/CoreUObject.Vector3f",vector4f:"/Script/CoreUObject.Vector4f",whileLoop:"/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:WhileLoop"};static pinInputWrapWidth=145;static removeEventName="ueb-element-delete";static scale={[-12]:.133333,[-11]:.166666,[-10]:.2,[-9]:.233333,[-8]:.266666,[-7]:.3,[-6]:.333333,[-5]:.375,[-4]:.5,[-3]:.675,[-2]:.75,[-1]:.875,0:1,1:1.25,2:1.375,3:1.5,4:1.675,5:1.75,6:1.875,7:2};static smoothScrollTime=1e3;static stringEscapedCharacters=/["\\]/g;static subObjectAttributeNamePrefix="#SubObject";static subObjectAttributeNameFromEntity=(e,t=!1)=>this.subObjectAttributeNamePrefix+(!t&&e.Class?`_${e.Class.type}`:"")+"_"+e.Name;static subObjectAttributeNameFromReference=(e,t=!1)=>this.subObjectAttributeNamePrefix+(t?"":"_"+e.type)+"_"+e.path;static subObjectAttributeNameFromName=e=>this.subObjectAttributeNamePrefix+"_"+e;static switchTargetPattern=/\/Script\/[\w\.\/\:]+K2Node_Switch([A-Z]\w+)+/;static trackingMouseEventName={begin:"ueb-tracking-mouse-begin",end:"ueb-tracking-mouse-end"};static unescapedBackslash=/(?<=(?:[^\\]|^)(?:\\\\)*)\\(?!\\)/;static windowApplyEventName="ueb-window-apply";static windowApplyButtonText="OK";static windowCancelEventName="ueb-window-cancel";static windowCancelButtonText="Cancel";static windowCloseEventName="ueb-window-close";static CommonEnums={[this.paths.eAttachmentRule]:["KeepRelative","KeepWorld","SnapToTarget"],[this.paths.eDrawDebugTrace]:["None","ForOneFrame","ForDuration","Persistent"],[this.paths.eMaterialSamplerType]:["Color","Grayscale","Alpha","Normal","Masks","Distance Field Font","Linear Color","Linear Grayscale","Data","External","Virtual Color","Virtual Grayscale","Virtual Alpha","Virtual Normal","Virtual Mask","Virtual Linear Color","Virtual Linear Grayscal"],[this.paths.eNiagara_Float4Channel]:[["NewEnumerator0","R"],["NewEnumerator1","G"],["NewEnumerator2","B"],["NewEnumerator3","A"]],[this.paths.eSamplerSourceMode]:["From texture asset","Shared: Wrap","Shared: Clamp","Hidden"],[this.paths.eSearchCase]:["CaseSensitive","IgnoreCase"],[this.paths.eWorldPositionIncludedOffsets]:["Absolute World Position (Including Material Shader Offsets)","Absolute World Position (Excluding Material Shader Offsets)","Camera Relative World Position (Including Material Shader Offsets)","Camera Relative World Position (Excluding Material Shader Offsets)"],[this.paths.eSearchDir]:["FromStart","FromEnd"],[this.paths.eSpawnActorCollisionHandlingMethod]:[["Undefined","Default"],["AlwaysSpawn","Always Spawn, Ignore Collisions"],["AdjustIfPossibleButAlwaysSpawn","Try To Adjust Location, But Always Spawn"],["AdjustIfPossibleButDontSpawnIfColliding","Try To Adjust Location, Don't Spawn If Still Colliding"],["DontSpawnIfColliding","Do Not Spawn"]],[this.paths.eTextureMipValueMode]:["None (use computed mip level)","MipLevel (absolute, 0 is full resolution)","MipBias (relative to the computed mip level)","Derivative (explicit derivative to compute mip level)"],[this.paths.eTraceTypeQuery]:[["TraceTypeQuery1","Visibility"],["TraceTypeQuery2","Camera"]]};static ModifierKeys=["Ctrl","Shift","Alt","Meta"];static rgba=["R","G","B","A"];static Keys={Backspace:"Backspace",Tab:"Tab",LeftControl:"ControlLeft",RightControl:"ControlRight",LeftShift:"ShiftLeft",RightShift:"ShiftRight",LeftAlt:"AltLeft",RightAlt:"AltRight",Enter:"Enter",Pause:"Pause",CapsLock:"CapsLock",Escape:"Escape",Space:"Space",PageUp:"PageUp",PageDown:"PageDown",End:"End",Home:"Home",ArrowLeft:"ArrowLeft",ArrowUp:"ArrowUp",ArrowRight:"ArrowRight",ArrowDown:"ArrowDown",PrintScreen:"PrintScreen",Insert:"Insert",Delete:"Delete",Zero:"Digit0",One:"Digit1",Two:"Digit2",Three:"Digit3",Four:"Digit4",Five:"Digit5",Six:"Digit6",Seven:"Digit7",Eight:"Digit8",Nine:"Digit9",A:"KeyA",B:"KeyB",C:"KeyC",D:"KeyD",E:"KeyE",F:"KeyF",G:"KeyG",H:"KeyH",I:"KeyI",K:"KeyK",L:"KeyL",M:"KeyM",N:"KeyN",O:"KeyO",P:"KeyP",Q:"KeyQ",R:"KeyR",S:"KeyS",T:"KeyT",U:"KeyU",V:"KeyV",W:"KeyW",X:"KeyX",Y:"KeyY",Z:"KeyZ",NumPadZero:"Numpad0",NumPadOne:"Numpad1",NumPadTwo:"Numpad2",NumPadThree:"Numpad3",NumPadFour:"Numpad4",NumPadFive:"Numpad5",NumPadSix:"Numpad6",NumPadSeven:"Numpad7",NumPadEight:"Numpad8",NumPadNine:"Numpad9",Multiply:"NumpadMultiply",Add:"NumpadAdd",Subtract:"NumpadSubtract",Decimal:"NumpadDecimal",Divide:"NumpadDivide",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",NumLock:"NumLock",ScrollLock:"ScrollLock"}}class ae{static clamp(e,t=-1/0,i=1/0){return Math.min(Math.max(e,t),i)}static getScale(e){const t=e.blueprint?.getScale()??getComputedStyle(e).getPropertyValue("--ueb-scale");return""!=t?parseFloat(t):1}static minDecimals(e,t=1,i=1e-8){const s=e*10**t;return Math.abs(s%1)>i?e.toString():e.toFixed(t)}static roundDecimals(e,t=1){const i=10**t;return Math.round(e*i)/i}static printExponential(e){if(e==Number.POSITIVE_INFINITY)return"inf";if(e==Number.NEGATIVE_INFINITY)return"-inf";const t=Math.round(e);if(t>=1e3){const i=Math.floor(Math.log10(t));return`${Math.round(e/10**(i-2))/100}e+${i<10?"0":""}${i}`}return 0==Math.floor(e)?e.toString():this.roundDecimals(e,Math.max(0,3-Math.floor(e).toString().length)).toString()}static approximatelyEqual(e,t,i=1e-8){return!(Math.abs(e-t)>i)}static convertLocation(e,t,i=!1){const s=i?1:1/ae.getScale(t),r=t.getBoundingClientRect();return[Math.round((e[0]-r.x)*s),Math.round((e[1]-r.y)*s)]}static isSerialized(e,t){return e.attributes?.[t]?.serialized??e.constructor.attributes?.[t]?.serialized??!1}static objectGet(e,t,i=void 0){if(void 0!==e){if(!(t instanceof Array))throw new TypeError("UEBlueprint: Expected keys to be an array");return 0!=t.length&&t[0]in e&&void 0!==e[t[0]]?1==t.length?e[t[0]]:ae.objectGet(e[t[0]],t.slice(1),i):i}}static objectSet(e,t,i,s=Object){if(!(t instanceof Array))throw new TypeError("Expected keys to be an array.");if(1==t.length){if(t[0]in e||void 0===e[t[0]])return e[t[0]]=i,!0}else if(t.length>0)return e[t[0]]instanceof Object||(e[t[0]]=new s),ae.objectSet(e[t[0]],t.slice(1),i,s);return!1}static snapToGrid(e,t,i){return 1===i?[e,t]:[i*Math.floor(e/i),i*Math.floor(t/i)]}static mergeArrays(e=[],t=[],i=(e,t)=>e==t){let s=[];e=[...e],t=[...t];e:for(;;){for(let r=0;r|
/g,"\n").replaceAll(/(\)/g,"")}static encodeHTMLWhitespace(e){return e.replaceAll(" "," ")}static capitalFirstLetter(e){return 0===e.length?e:e.charAt(0).toUpperCase()+e.slice(1)}static formatStringName(e=""){return e.replace(/^\s*b(?=[A-Z])/,"").replaceAll(ne.nameRegexSpaceReplacement," ").trim().split(" ").map((e=>ae.capitalFirstLetter(e))).join(" ")}static getIdFromReference(e){return e.replace(/(?:.+\.)?([^\.]+)$/,"$1").replaceAll(/(?<=[a-z\d])(?=[A-Z])|(?<=[a-zA-Z])(?=\d)|(?<=[A-Z]{2})(?=[A-Z][a-z])/g,"-").toLowerCase()}static getNameFromPath(e,t=!1){const i=t?/([^\.\/]+?)(?:_\d+)$/:/([^\.\/]+)$/;return e.match(i)?.[1]??""}static getPolarCoordinates(e,t,i=!1){let s=Math.atan2(t,e);return i&&s<0&&(s=2*Math.PI+s),[Math.sqrt(e*e+t*t),s]}static getCartesianCoordinates(e,t){return[e*Math.cos(t),e*Math.sin(t)]}static range(e=0,t=0,i=(t>=e?1:-1)){return Array.from({length:Math.ceil((t-e)/i)},((t,s)=>e+s*i))}static getFirstWordOrder(e){return new RegExp(/\s*/.source+e.join(/[^\n]+\n\s*/.source)+/\s*/.source)}static paste(e,t){const i=new ClipboardEvent("paste",{bubbles:!0,cancelable:!0,clipboardData:new DataTransfer});i.clipboardData.setData("text",t),e.dispatchEvent(i)}static async copy(e){const t=new ClipboardEvent("copy",{bubbles:!0,cancelable:!0,clipboardData:new DataTransfer});e.dispatchEvent(t)}static animate(e,t,i,s,r=e=>{},n=e=>{const t=e**3.5;return t/(t+(1-e)**3.5)}){let a;const o=l=>{void 0===a&&(a=l);let u=(l-a)/i;ae.approximatelyEqual(u,1)||u>1?u=1:r(requestAnimationFrame(o));const c=e+(t-e)*n(u);s(c)};r(requestAnimationFrame(o))}}class oe extends se{#e;get blueprint(){return this.#e}set blueprint(e){this.#e=e}#t;get entity(){return this.#t}set entity(e){this.#t=e}#i;get template(){return this.#i}isInitialized=!1;isSetup=!1;inputObjects=[];initialize(e,t){this.requestUpdate(),this.#t=e,this.#i=t,this.#i.initialize(this),this.isConnected&&this.updateComplete.then((()=>this.setup())),this.isInitialized=!0}connectedCallback(){super.connectedCallback(),this.blueprint=this.closest("ueb-blueprint"),this.isInitialized&&(this.requestUpdate(),this.updateComplete.then((()=>this.setup())))}disconnectedCallback(){super.disconnectedCallback(),this.isSetup&&this.updateComplete.then((()=>this.cleanup())),this.acknowledgeDelete()}createRenderRoot(){return this}setup(){this.template.setup(),this.isSetup=!0}cleanup(){this.template.cleanup(),this.isSetup=!1}willUpdate(e){super.willUpdate(e),this.template.willUpdate(e)}update(e){super.update(e),this.template.update(e)}render(){return this.template.render()}firstUpdated(e){super.firstUpdated(e),this.template.firstUpdated(e),this.template.inputSetup()}updated(e){super.updated(e),this.template.updated(e)}acknowledgeDelete(){let e=new CustomEvent(ne.removeEventName);this.dispatchEvent(e)}isSameGraph(e){return this.blueprint&&this.blueprint==e?.blueprint}}class le{static arrayPin=G``;static branchNode=G``;static breakStruct=G``;static cast=G``;static close=G``;static convert=G``;static correct=G``;static delegate=G``;static doN=G``;static doOnce=G``;static enum=G``;static event=G``;static execPin=G``;static expandIcon=G``;static flipflop=G``;static forEachLoop=G``;static functionSymbol=G``;static gamepad=G``;static genericPin=G``;static keyboard=G``;static loop=G``;static macro=G``;static mapPin=G``;static makeArray=G``;static makeMap=G``;static makeSet=G``;static makeStruct=G``;static metasoundFunction=G``;static mouse=G``;static node=G``;static operationPin=G``;static pcgStackPin=G``;static pcgPin=G``;static pcgParamPin=G``;static pcgSpatialPin=G``;static plusCircle=G``;static questionMark=G``;static referencePin=G``;static reject=G``;static setPin=G``;static select=G``;static sequence=G``;static sound=G``;static spawnActor=G``;static switch=G``;static timer=G``;static touchpad=G``}class ue{static makeSuccess(e,t,i=null,s=0){return{status:!0,value:t,position:e,bestParser:i,bestPosition:s}}static makeFailure(e=0,t=null,i=0){return{status:!1,value:null,position:e,bestParser:t,bestPosition:i}}static makeContext(e=null,t=""){return{parsernostrum:e,input:t,highlighted:null}}static makePathNode(e,t=0,i=null){return{parent:i,current:e,index:t}}}class ce{static indentation=" ";static highlight="Last valid parser";Self;static frame(e,t="",i=""){t=e?"[ "+t+" ]":"";let s=e.split("\n");const r=Math.max(...s.map((e=>e.length))),n=r";const r=this.isVisited(i),n=this.isHighlighted(e,i);let a=r?"<...>":this.doToString(e,n?"":t,i,s);return n&&(a=ce.frame(a,ce.highlight,t)),a}doToString(e,t,i,s){return`${this.constructor.name} does not implement toString()`}}class he extends ce{#s;get value(){return this.#s}constructor(e){super(),this.#s=e}parse(e,t,i,s){i=this.makePath(i,s);const r=t+this.#s.length,n=e.input.substring(t,r);return this.#s===n?ue.makeSuccess(r,this.#s,i,r):ue.makeFailure()}doToString(e,t,i,s){return`"${this.value.replaceAll("\n","\\n").replaceAll('"','\\"')}"`}}class pe extends ce{static instance=new pe;parse(e,t,i,s){return i=this.makePath(i,s),ue.makeSuccess(t,"",i,0)}doToString(e,t,i,s){return""}}class de extends ce{#r;get parsers(){return this.#r}constructor(...e){super(),this.#r=e}parse(e,t,i,s){i=this.makePath(i,s);const r=ue.makeSuccess(0,"");for(let s=0;sr.bestPosition&&(r.bestParser=n.bestParser,r.bestPosition=n.bestPosition),n.status)return r.value=n.value,r.position=n.position,r}return r.status=!1,r.value=null,r}doToString(e,t,i,s){if(2===this.#r.length&&this.#r[1]instanceof pe){let s=this.#r[0].toString(e,t,i,0);return this.#r[0]instanceof he||(s="<"+s+">"),s+="?",s}const r=t+ce.indentation;let n="ALT<\n"+r+this.#r.map(((t,s)=>t.toString(e,r+" ".repeat(0===s?0:ce.indentation.length-2),i,s))).join("\n"+r+"| ")+"\n"+t+">";return n}}class me extends ce{#n;get parser(){return this.#n}#a;constructor(e,t){super(),this.#n=e,this.#a=t}parse(e,t,i,s){i=this.makePath(i,s);const r=this.#n.parse(e,t,i,0);if(!r.status)return r;const n=this.#a(r.value,e.input,r.position).getParser().parse(e,r.position,i,0);return r.bestPosition>n.bestPosition&&(n.bestParser=r.bestParser,n.bestPosition=r.bestPosition),n}doToString(e,t,i,s){return this.#n.toString(e,t,i,0)+" => chained"}}class ge extends ce{static instance=new ge;parse(e,t,i,s){return ue.makeFailure()}doToString(e,t,i,s){return""}}class be extends ce{#n;get parser(){return this.#n}#o="";constructor(e,t){super(),this.#n=e,this.#o=t}makePath(e,t){return e}parse(e,t,i,s){return this.parse=this.#n.parse.bind(this.#n),this.parse(e,t,i,s)}doToString(e,t,i,s){let r=this.#n.toString(e,"",i,s);return r=ce.frame(r,this.#o,t),r}}class ve extends ce{#n;#l;constructor(e){super(),this.#n=e}makePath(e,t){return e}isHighlighted(e,t){if(super.isHighlighted(e,t)){const i={parent:t,parser:this.#l,index:0};e.highlighted=e.highlighted instanceof ce?this.#l:i}return!1}resolve(){return this.#l||(this.#l=this.#n().getParser()),this.#l}parse(e,t,i,s){return this.resolve(),this.parse=this.#l.parse.bind(this.#l),this.parse(e,t,i,s)}doToString(e,t,i,s){return this.resolve(),this.doToString=this.#l.toString.bind(this.#l),this.doToString(e,t,i,s)}}class fe extends ce{#n;get parser(){return this.#n}#u;get type(){return this.#u}static Type={NEGATIVE_AHEAD:"?!",NEGATIVE_BEHIND:"?String.raw`[^${e}\\]*(?:\\.[^${e}\\]*)*`;static#m=/[-\+]?(?:\d*\.)?\d+/;static common={number:new RegExp(this.#m.source+String.raw`(?!\.)`),numberInteger:/[\-\+]?\d+(?!\.\d)/,numberNatural:/\d+/,numberExponential:new RegExp(this.#m.source+String.raw`(?:[eE][\+\-]?\d+)?(?!\.)`),numberUnit:/\+?(?:0(?:\.\d+)?|1(?:\.0+)?)(?![\.\d])/,numberByte:/0*(?:25[0-5]|2[0-4]\d|1?\d?\d)(?!\d|\.)/,whitespace:/\s+/,whitespaceOpt:/\s*/,whitespaceInline:/[^\S\n]+/,whitespaceInlineOpt:/[^\S\n]*/,whitespaceMultiline:/\s*?\n\s*/,doubleQuotedString:new RegExp(`"(${this.#d('"')})"`),singleQuotedString:new RegExp(`'(${this.#d("'")})'`),backtickQuotedString:new RegExp("`("+this.#d("`")+")`")};constructor(e,t){super(),this.#c=e,this.#h=new RegExp(`^(?:${e.source})`,e.flags),this.#p=t}parse(e,t,i,s){i=this.makePath(i,s);const r=this.#h.exec(e.input.substring(t));r&&(t+=r[0].length);return r?ue.makeSuccess(t,this.#p(r),i,t):ue.makeFailure()}doToString(e,t,i,s){let r="/"+this.#c.source+"/";const n=Object.entries(ye.common).find((([e,t])=>t.source===this.#c.source))?.[0];return n&&(r="P."+n),r}}class we extends ce{#n;get parser(){return this.#n}#g;get mapper(){return this.#g}constructor(e,t){super(),this.#n=e,this.#g=t}isHighlighted(e,t){if(super.isHighlighted(e,t)){const i={parent:t,parser:this.#n,index:0};e.highlighted=e.highlighted instanceof ce?this.#n:i}return!1}parse(e,t,i,s){i=this.makePath(i,s);const r=this.#n.parse(e,t,i,0);return r.status&&(r.value=this.#g(r.value)),r}doToString(e,t,i,s){let r=this.#n.toString(e,t,i,0);if(this.#n instanceof ye&&Object.values(ye.common).includes(this.#n.regexp))return this.#n.regexp===ye.common.numberInteger&&this.#g===BigInt?"P.numberBigInteger":r;let n=this.#g.toString();return(n.length>60||n.includes("\n"))&&(n="(...) => { ... }"),r+=` -> map<${n}>`,r}}class Se extends ye{static#g=e=>e;constructor(e){super(e,Se.#g)}}class Ee extends ye{constructor(e,t=0){super(e,(e=>e[t]))}}class Ce extends ce{#r;get parsers(){return this.#r}constructor(...e){super(),this.#r=e}parse(e,t,i,s){i=this.makePath(i,s);const r=new Array(this.#r.length),n=ue.makeSuccess(t,r);for(let t=0;tn.bestPosition&&(n.bestParser=s.bestParser,n.bestPosition=s.bestPosition),!s.status){n.status=!1,n.value=null;break}n.value[t]=s.value,n.position=s.position}return n}doToString(e,t,i,s){const r=t+ce.indentation,n="SEQ<\n"+r+this.#r.map(((t,s)=>t.toString(e,r,i,s))).join("\n"+r)+"\n"+t+">";return n}}class Ne extends ce{#n;get parser(){return this.#n}#b;get min(){return this.#b}#v;get max(){return this.#v}constructor(e,t=0,i=Number.POSITIVE_INFINITY){if(super(),t>i)throw new Error("Min is greater than max");this.#n=e,this.#b=t,this.#v=i}parse(e,t,i,s){i=this.makePath(i,s);const r=ue.makeSuccess(t,[],i);for(let t=0;tr.bestPosition&&(r.bestParser=s.bestParser,r.bestPosition=s.bestPosition),!s.status){te;static#y=([e,t])=>t;static#w=([e,t])=>[e,...t];static#S=e=>e instanceof Array?e.join(""):e;static number=this.reg(ye.common.number).map(Number);static numberInteger=this.reg(ye.common.numberInteger).map(Number);static numberBigInteger=this.reg(this.numberInteger.getParser().parser.regexp).map(BigInt);static numberNatural=this.reg(ye.common.numberNatural).map(Number);static numberExponential=this.reg(ye.common.numberExponential).map(Number);static numberUnit=this.reg(ye.common.numberUnit).map(Number);static numberByte=this.reg(ye.common.numberByte).map(Number);static whitespace=this.reg(ye.common.whitespace);static whitespaceOpt=this.reg(ye.common.whitespaceOpt);static whitespaceInline=this.reg(ye.common.whitespaceInline);static whitespaceInlineOpt=this.reg(ye.common.whitespaceInlineOpt);static whitespaceMultiline=this.reg(ye.common.whitespaceMultiline);static doubleQuotedString=this.reg(ye.common.doubleQuotedString,1);static singleQuotedString=this.reg(ye.common.singleQuotedString,1);static backtickQuotedString=this.reg(ye.common.backtickQuotedString,1);constructor(e,t=!1){this.#n=e}static#E(e){const t=[];for(;e;)t.push(e),e=e.parent;t.reverse();let i=new Map;for(let e=1;ei<=s||i>e))),i.set(t[e].current,s),t.splice(s+1,e-s),e=s):i.set(t[e].current,e)}return t[t.length-1]}getParser(){return this.#n}run(e){const t=this.#n.parse(ue.makeContext(this,e),0,ue.makePathNode(),0);return t.position!==e.length&&(t.status=!1),t}parse(e,t=!0){const i=this.run(e);if(i.status)return i.value;const s=[Math.ceil(30),Math.floor(30)],r=xe.lineColumnFromOffset(e,i.bestPosition);let n=i.bestPosition;const a=e.replaceAll(/^(\s)+|\s{6,}|\s*?\n\s*/g,((e,t,s)=>{let r=t?"...":" ... ";return s<=i.bestPosition&&(i.bestPosition0&&(c="..."+c,u+=3),s[1]e.getParser()))))}static alt(...e){return new this(new de(...e.map((e=>e.getParser()))))}static lookahead(e){return new this(new fe(e.getParser(),fe.Type.POSITIVE_AHEAD))}static lazy(e){return new this(new ve(e))}times(e,t=e){return new xe(new Ne(this.#n,e,t))}many(){return this.times(0,Number.POSITIVE_INFINITY)}atLeast(e){return this.times(e,Number.POSITIVE_INFINITY)}atMost(e){return this.times(0,e)}opt(e=""){let t=xe.success();return""!==e&&(t=t.map((()=>e))),xe.alt(this,t)}sepBy(e,t=1,i=!1){let s=xe.seq(this,xe.seq(e,this).map(xe.#y).atLeast(t-1),...i?[e.opt([])]:[]).map(xe.#w);return 0===t&&(s=s.opt([])),s}skipSpace(){return xe.seq(this,xe.whitespaceOpt).map(xe.#f)}map(e){return new xe(new we(this.#n,e))}chain(e){return new xe(new me(this.#n,e))}assert(e){return this.chain(((t,i,s)=>e(t,i,s)?xe.success().map((()=>t)):xe.failure()))}join(e=""){return this.map(xe.#S)}label(e=""){return new xe(new be(this.#n,e))}toString(e="",t=!1,i=null){i instanceof xe&&(i=i.getParser());const s=ue.makeContext(this,"");s.highlighted=i;const r=ue.makePathNode();return(t?"\n"+e:"")+this.#n.toString(s,e,r)}}class Pe{static same=e=>e;static notWrapped=(e,t)=>t;static defaultWrapped=(e,t)=>`${e.#C}(${t})`;static wrap=this.defaultWrapped;static attributeSeparator=",";static keySeparator="=";static printKey=e=>e;static grammar=xe.lazy((()=>this.createGrammar()));static unknownEntityGrammar;static unknownEntity;static attributes={};static lookbehind="";static default;static nullable=!1;static ignored=!1;static serialized=!1;static expected=!1;static inlined=!1;static quoted;static silent=!1;static trailing=!1;#N;get keys(){return this.#N??Object.keys(this)}set keys(e){this.#N=[...new Set(e)]}#C=this.constructor.lookbehind;get lookbehind(){return this.#C.trim()}set lookbehind(e){this.#C=e}#x=this.constructor.ignored;get ignored(){return this.#x}set ignored(e){this.#x=e}#P;get quoted(){return this.#P??this.constructor.quoted??!1}set quoted(e){this.#P=e}#k;get trailing(){return this.#k??this.constructor.trailing??!1}set trailing(e){this.#k=e}constructor(e={}){const t=this.constructor.attributes,i=ae.mergeArrays(Object.keys(e),Object.entries(t).filter((([e,t])=>void 0!==t.default)).map((([e,t])=>e)));for(const s of i){if(void 0!==e[s]){e[s].constructor===Object&&(e[s]=new(void 0!==t[s]?t[s]:Pe.unknownEntity)(e[s]));const i=t[s];if(this[s]=e[s],i?.compute){const t=i.compute(this).grammar.run(e[s].toString());t.status&&(this[s]=t.value)}continue}const i=t[s];void 0===i.default||(this[s]=i.default(i))}}static createGrammar(){return this.unknownEntityGrammar}static actualClass(){let e=this;for(;!e.name;)e=Object.getPrototypeOf(e);return e}static className(){return this.actualClass().name}static asUniqueClass(){let e=this;return this.name.length&&(e=class extends(this){},e.grammar=e.createGrammar()),e}static withLookbehind(e){const t=this.asUniqueClass();return t.lookbehind=e,t}static withDefault(e=e=>new e){const t=this.asUniqueClass();return t.default=e,t}static flagNullable(e=!0){const t=this.asUniqueClass();return t.nullable=e,t}static flagIgnored(e=!0){const t=this.asUniqueClass();return t.ignored=e,t}static flagSerialized(e=!0){const t=this.asUniqueClass();return t.serialized=e,t}static flagInlined(e=!0){const t=this.asUniqueClass();return t.inlined=e,t}static flagQuoted(e=!0){const t=this.asUniqueClass();return t.quoted=e,t}static flagSilent(e=!0){const t=this.asUniqueClass();return t.silent=e,t}static flagTrailing(e=!0){const t=this.asUniqueClass();return t.trailing=e,t}static asSerializedString(e){return`"${e.replaceAll(/(?<=(?:[^\\]|^)(?:\\\\)*?)"/g,'\\"')}"`}showProperty(e){let t=this[e];const i=t.constructor;if(i.silent&&void 0!==i.default){void 0===i["#default"]&&(i["#default"]=i.default(i));const e=i["#default"];return!t.equals(e)}return!0}listenAttribute(e,t){const i=Object.getOwnPropertyDescriptor(this,e),s=i.set;s?(i.set=e=>{s(e),t(e)},Object.defineProperties(this,{[e]:i})):i.value&&Object.defineProperties(this,{["#"+e]:{value:i.value,writable:!0,enumerable:!1},[e]:{enumerable:!0,get(){return this["#"+e]},set(i){t(i),this["#"+e]=i}}})}doSerialize(e=!1,t="",i=this.constructor,s=i.printKey,r=i.keySeparator,n=i.attributeSeparator,a=i.wrap){const o=i!==this.constructor;let l="",u=!0;const c=this instanceof Pe?this.keys:Object.keys(this);for(const a of c){const o=this[a],c=o?.constructor;if(void 0===o||this instanceof Pe&&!this.showProperty(a))continue;u?u=!1:l+=n;let h=this instanceof Array?`(${a})`:a;if(h.length&&(i.attributes[a]?.quoted||o.quoted)&&(h=`"${h}"`),c.inlined){const a="ArrayEntity"===c.className()?e=>s(`${h}${e}`):e=>s(`${h}.${e}`);l+=o.serialize(e,t,void 0,a,r,n,i.notWrapped);continue}h=s(h),h.length&&(l+=(n.includes("\n")?t:"")+h+r);let p=o?.serialize(e,t);l+=p}return this instanceof Pe&&(o&&i.trailing||this.trailing)&&l.length&&(l+=n),a(this,l)}serialize(e=!1,t="",i=this.constructor,s=i.printKey,r=i.keySeparator,n=i.attributeSeparator,a=i.wrap){this.constructor;let o=this instanceof Array?Pe.prototype.doSerialize.bind(this)(e,t,i,s,r,n,a):this.doSerialize(e,t,i,s,r,n,a);return i.serialized&&(o=Pe.asSerializedString(o)),o}equals(e){if(!(e instanceof Pe))return!1;const t=Object.keys(this),i=Object.keys(e),s=this.constructor.actualClass(),r=e.constructor.actualClass();if(!(t.length===i.length&&this.lookbehind==e.lookbehind&&(e instanceof s||this instanceof r)))return!1;for(let s=0;s{},toAttribute:(e,t)=>!0===e?"true":!1===e?"false":""};#A=!0;get uppercase(){return this.#A}set uppercase(e){this.#A=e}static createGrammar(){return xe.regArray(/(true)|(True)|(false)|(False)/).map((e=>{const t=e[1]??e[2]?new this(!0):new this(!1);return t.uppercase=void 0!==(e[2]??e[4]),t})).label("BooleanEntity")}constructor(e=!1){super(),this.value=e}serialize(e=!1,t="",i=this.constructor){let s=this.value?this.#A?"True":"true":this.#A?"False":"false";return i.serialized&&(s=`"${s}"`),s}valueOf(){return this.value}}class Ae{static#L=new Map;static registerElement(e,t){Ae.#L.set(e,t)}static getConstructor(e){return Ae.#L.get(e)}}class Le extends Pe{static alternatives=[];static className(){let e=super.className();return this.alternatives.length&&(e+=".accepting("+this.alternatives.map((e=>e.className())).join(", ")+")"),e}static createGrammar(){const e=this.alternatives.map((e=>e.grammar));return 0==this.alternatives.length||e.includes(this.unknownEntityGrammar)?this.unknownEntityGrammar:xe.alt(...e)}static accepting(...e){const t=this.asUniqueClass();return t.alternatives=e,t.grammar=t.createGrammar(),t}}class Me{static numberRegexSource=xe.number.getParser().parser.regexp.source;static separatedBy=(e,t,i=1)=>new RegExp(e+"(?:"+t+e+")"+(1===i?"*":2===i?"+":`{${i},}`));static Regex=class{static HexDigit=/[0-9a-fA-F]/;static InsideString=/(?:[^"\\]|\\.)*/;static InsideSingleQuotedString=/(?:[^'\\]|\\.)*/;static Integer=/[\-\+]?\d+(?!\d|\.)/;static Number=/[-\+]?(?:\d*\.)?\d+(?!\d|\.)/;static RealUnit=/\+?(?:0(?:\.\d+)?|1(?:\.0+)?)(?![\.\d])/;static Word=Me.separatedBy("[a-zA-Z]","_");static Symbol=/[a-zA-Z_]\w*/;static DotSeparatedSymbols=Me.separatedBy(this.Symbol.source,"\\.");static MultipleWordsSymbols=Me.separatedBy(this.Symbol.source,"(?:\\.|\\ +)");static PathFragment=Me.separatedBy(this.Symbol.source,"[\\.:]");static PathSpaceFragment=Me.separatedBy(this.Symbol.source,"[\\.:\\ ]");static Path=new RegExp(`(?:\\/${this.PathFragment.source}){2,}`)};static null=xe.reg(/\(\s*\)/).map((()=>null));static true=xe.reg(/true/i).map((()=>!0));static false=xe.reg(/false/i).map((()=>!1));static number=xe.regArray(new RegExp(`(${xe.number.getParser().parser.regexp.source})|(\\+?inf)|(-inf)`)).map((([e,t,i,s])=>t?Number(t):i?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY));static bigInt=xe.reg(new RegExp(xe.number.getParser().parser.regexp.source)).map(BigInt).map((e=>void 0!==e[2]?Number.POSITIVE_INFINITY:void 0!==e[3]?Number.NEGATIVE_INFINITY:Number(e[1])));static naturalNumber=xe.lazy((()=>xe.reg(/\d+/).map(Number)));static string=xe.doubleQuotedString.map((e=>ae.unescapeString(e)));static colorValue=xe.numberByte;static word=xe.reg(Me.Regex.Word);static symbol=xe.reg(Me.Regex.Symbol);static symbolQuoted=xe.reg(new RegExp('"('+Me.Regex.Symbol.source+')"'),1);static attributeName=xe.reg(Me.Regex.DotSeparatedSymbols);static attributeNameQuoted=xe.reg(new RegExp('"('+Me.Regex.InsideString.source+')"'),1);static guid=xe.reg(new RegExp(`${Me.Regex.HexDigit.source}{32}`));static commaSeparation=xe.reg(/\s*,\s*(?!\))/);static commaOrSpaceSeparation=xe.reg(/\s*,\s*(?!\))|\s+/);static equalSeparation=xe.reg(/\s*=\s*/);static hexColorChannel=xe.reg(new RegExp(Me.Regex.HexDigit.source+"{2}"));static getAttribute(e,[t,...i]){const s=e?.attributes?.[t];if(s){if(s.prototype instanceof Le)for(const e of s.alternatives){const t=this.getAttribute(e,i);if(t)return t}return i.length>0?this.getAttribute(s,i):s}}static createAttributeGrammar(e,t=this.attributeName,i=this.equalSeparation,s=(e,t,i)=>{}){return xe.seq(t,i).chain((([t,i])=>{const r=t.split(ne.keysSeparator),n=this.getAttribute(e,r);return(n?n.grammar:Pe.unknownEntityGrammar).map((e=>t=>{ae.objectSet(t,r,e),s(t,r,e)}))}))}static createEntityGrammar(e,t=this.commaSeparation,i=null,s=1){const r=e.lookbehind instanceof Array?e.lookbehind.join("|"):e.lookbehind;return xe.seq(xe.reg(new RegExp(String.raw`(${r}\s*)\(\s*`),1),this.createAttributeGrammar(e).sepBy(t,s),xe.reg(/\s*(,\s*)?\)/,1)).map((([e,t,i])=>{let s={};return e.length&&(s.lookbehind=e),t.forEach((e=>e(s))),s.trailing=void 0!==i,s})).chain((t=>{(e.lookbehind instanceof Array||e.lookbehind!==r)&&(e=e.withLookbehind(r));const s=Object.keys(t),n=Object.keys(e.attributes);return null!=i?xe.success().assert((e=>s.filter((e=>n.includes(e))).length/n.length>=i)).map((()=>new e(t))):xe.success().map((()=>new e(t)))}))}}class Te extends Pe{static grammar=this.createGrammar();constructor(e=0){super(),this.value=e}static createGrammar(){return xe.number.map((e=>new this(e)))}serialize(e=!1,t="",i=this.constructor){let s=this.value.toFixed(6);return i.serialized&&(s=`"${s}"`),s}valueOf(){return this.value}}class Ie extends Pe{static attributes={...super.attributes,R:Te.withDefault(),G:Te.withDefault(),B:Te.withDefault(),A:Te.withDefault((e=>new e(1)))};static grammar=this.createGrammar();#M=new Te;get H(){return this.#M}set H(e){this.#M=e}#T=new Te;get S(){return this.#T}set S(e){this.#T=e}#I=new Te;get V(){return this.#I}set V(e){this.#I=e}constructor(e){super(e),e instanceof Array&&(e={R:e[0]??0,G:e[1]??0,B:e[2]??0,A:e[3]??1}),this.R,this.G,this.B,this.A,this.#O()}static createGrammar(){return Me.createEntityGrammar(this,Me.commaSeparation,.5).label("LinearColorEntity")}static printLinearColor(e){return`${Math.round(255*e.R.valueOf())}, ${Math.round(255*e.G.valueOf())}, ${Math.round(255*e.B.valueOf())}`}static linearToSRGB(e){return e<=0?0:e>=1?1:e<.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055}static sRGBtoLinear(e){return e<=0?0:e>=1?1:e<.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}static getWhite(){return new Ie({R:new Te(1),G:new Te(1),B:new Te(1)})}static getLinearColorFromHexGrammar(){const e=/[0-9a-fA-F]/;return xe.regArray(new RegExp("#("+e.source+"{2})("+e.source+"{2})("+e.source+"{2})("+e.source+"{2})?")).map((([e,t,i,s,r])=>new this({R:parseInt(t,16)/255,G:parseInt(i,16)/255,B:parseInt(s,16)/255,A:parseInt(r??"FF",16)/255})))}static getLinearColorRGBListGrammar(){return xe.seq(xe.numberByte,Me.commaSeparation,xe.numberByte,Me.commaSeparation,xe.numberByte).map((([e,t,i,s,r])=>new this({R:e/255,G:i/255,B:r/255,A:1})))}static getLinearColorRGBGrammar(){return xe.seq(xe.reg(/rgb\s*\(\s*/),this.getLinearColorRGBListGrammar(),xe.reg(/\s*\)/)).map((([e,t,i])=>t))}static getLinearColorRGBAGrammar(){return xe.seq(xe.reg(/rgba\s*\(\s*/),this.getLinearColorRGBListGrammar(),xe.reg(/\s*\)/)).map((([e,t,i])=>t))}static getLinearColorFromAnyFormat(){return xe.alt(this.getLinearColorFromHexGrammar(),this.getLinearColorRGBAGrammar(),this.getLinearColorRGBGrammar(),this.getLinearColorRGBListGrammar())}#O(){const e=this.R.value,t=this.G.value,i=this.B.value;if(ae.approximatelyEqual(e,t)&&ae.approximatelyEqual(e,i)&&ae.approximatelyEqual(t,i))return this.S.value=0,void(this.V.value=e);const s=Math.max(e,t,i),r=Math.min(e,t,i),n=s-r;let a;switch(s){case r:a=0;break;case e:a=(t-i)/n+(te.toString(16).toUpperCase().padStart(2,"0"))).join("")}toSRGBAString(){return this.toSRGBA().map((e=>e.toString(16).toUpperCase().padStart(2,"0"))).join("")}toHSVA(){return[this.H.value,this.S.value,this.V.value,this.A.value]}toNumber(){return(Math.round(255*this.R.value)<<24)+(Math.round(255*this.G.value)<<16)+(Math.round(255*this.B.value)<<8)+Math.round(255*this.A.value)}toArray(){return[this.R.value,this.G.value,this.B.value,this.A.value]}setFromRGBANumber(e){this.A.value=(255&e)/255,this.B.value=(e>>8&255)/255,this.G.value=(e>>16&255)/255,this.R.value=(e>>24&255)/255,this.#O()}setFromSRGBANumber(e){this.A.value=(255&e)/255,this.B.value=Ie.sRGBtoLinear((e>>8&255)/255),this.G.value=Ie.sRGBtoLinear((e>>16&255)/255),this.R.value=Ie.sRGBtoLinear((e>>24&255)/255),this.#O()}toString(){return Ie.printLinearColor(this)}}class Oe extends Pe{static type;constructor(e=null){super();const t=this.constructor;e??=void 0!==t.default?t.default(t).getter:e,this.getter=e}static createGrammar(e=this.type?.grammar??xe.lazy((()=>this.unknownEntityGrammar))){return this.type?.grammar.map((e=>new this((()=>e))))}static withDefault(e=e=>new e((()=>new e.type))){return super.withDefault(e)}static of(e){const t=this.asUniqueClass();return t.type=e,t.grammar=t.createGrammar(),t}doSerialize(e=!1,t="",i=this.constructor,s=i.printKey,r=i.keySeparator,n=i.attributeSeparator,a=i.wrap){return this.getter().serialize(e,t,i.type,s,r,n,a)}equals(e){return e instanceof Oe&&(e=e.getter?.()),this.getter?.().equals(e)}valueOf(){return this.getter().valueOf()}toString(){return this.getter().toString()}}class $e extends Pe{static numberRegexSource=String.raw`${Me.numberRegexSource}(?<=(?:\.(\d*0+))?)`;static grammar=this.createGrammar();static precision;#$;get precision(){return this.constructor.precision??this.#$}set precision(e){this.#$=e}_value;get value(){return this._value}set value(e){-0===e&&(e=0),this._value=e}constructor(e=0,t=null){super(),this.value=Number(e),null!==t&&(this.#$=Number(t))}static createGrammar(){return xe.regArray(new RegExp(`(?${this.numberRegexSource})|(?\\+?inf)|(?-inf)`)).map((({2:e,groups:{n:t,posInf:i,negInf:s}})=>new this(t?Number(t):i?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY,e?.length))).label("NumberEntity")}static withPrecision(e=0){const t=this.asUniqueClass();return t.precision=e,t}static printNumber(e){return e==Number.POSITIVE_INFINITY?"inf":e==Number.NEGATIVE_INFINITY?"-inf":ae.minDecimals(e)}serialize(e=!1,t="",i=this.constructor){if(this.value===Number.POSITIVE_INFINITY)return"+inf";if(this.value===Number.NEGATIVE_INFINITY)return"-inf";const s=i.precision??this.precision;let r=void 0!==s?this.value.toFixed(s):this.value.toString();return i.serialized&&(r=`"${r}"`),r}valueOf(){return this.value}toString(){return this.value.toString()}}class De extends Pe{static attributes={...super.attributes,X:$e.withDefault(),Y:$e.withDefault(),Z:$e.withDefault()};static grammar=this.createGrammar();constructor(e){super(e),this.X,this.Y,this.Z}static createGrammar(){return Me.createEntityGrammar(this,Me.commaSeparation,1).label("VectorEntity")}toArray(){return[this.X.valueOf(),this.Y.valueOf(),this.Z.valueOf()]}}const Be=/\/Script\/SequencerScripting\.MovieSceneScripting(.+)Channel/,Ge={A_AccentGrave:"à",Add:"Num +",C_Cedille:"ç",Decimal:"Num .",Divide:"Num /",E_AccentAigu:"é",E_AccentGrave:"è",F1:"F1",F10:"F10",F11:"F11",F12:"F12",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",Gamepad_Special_Left_X:"Touchpad Button X Axis",Gamepad_Special_Left_Y:"Touchpad Button Y Axis",Mouse2D:"Mouse XY 2D-Axis",Multiply:"Num *",Section:"§",Subtract:"Num -",Tilde:"`"};function He(e=""){switch(e=e.toLowerCase()){case"zero":return 0;case"one":return 1;case"two":return 2;case"three":return 3;case"four":return 4;case"five":return 5;case"six":return 6;case"seven":return 7;case"eight":return 8;case"nine":return 9}}function Ve(e){let t;switch(e.getType()){case ne.paths.asyncAction:if(e.ProxyFactoryFunctionName)return ae.formatStringName(e.ProxyFactoryFunctionName?.toString());case ne.paths.actorBoundEvent:case ne.paths.componentBoundEvent:return`${ae.formatStringName(e.DelegatePropertyName?.toString())} (${e.ComponentPropertyName?.toString()??"Unknown"})`;case ne.paths.callDelegate:return`Call ${e.DelegateReference?.MemberName?.toString()??"None"}`;case ne.paths.createDelegate:return"Create Event";case ne.paths.customEvent:if(e.CustomFunctionName)return e.CustomFunctionName?.toString();case ne.paths.dynamicCast:return e.TargetType?`Cast To ${e.TargetType?.getName()}`:"Bad cast node";case ne.paths.enumLiteral:return`Literal enum ${e.Enum?.getName()}`;case ne.paths.event:return`Event ${(e.EventReference?.MemberName?.toString()??"").replace(/^Receive/,"")}`;case ne.paths.executionSequence:return"Sequence";case ne.paths.forEachElementInEnum:return`For Each ${e.Enum?.getName()}`;case ne.paths.forEachLoopWithBreak:return"For Each Loop with Break";case ne.paths.functionEntry:return"UserConstructionScript"===e.FunctionReference?.MemberName?.toString()?"Construction Script":e.FunctionReference?.MemberName?.toString();case ne.paths.functionResult:return"Return Node";case ne.paths.ifThenElse:return"Branch";case ne.paths.makeStruct:if(e.StructType)return`Make ${e.StructType.getName()}`;case ne.paths.materialExpressionComponentMask:{const t=e.getMaterialSubobject();if(t)return`Mask ( ${ne.rgba.filter((e=>!0===t[e].getter().value)).map((e=>e+" ")).join("")})`}case ne.paths.materialExpressionConstant:t??=[e.getCustomproperties().find((e=>"Value"==e.PinName.toString()))?.DefaultValue];case ne.paths.materialExpressionConstant2Vector:t??=[e.getCustomproperties().find((e=>"X"==e.PinName?.toString()))?.DefaultValue,e.getCustomproperties().find((e=>"Y"==e.PinName?.toString()))?.DefaultValue];case ne.paths.materialExpressionConstant3Vector:case ne.paths.materialExpressionConstant4Vector:if(!t){const i=e.getCustomproperties().find((e=>"Constant"==e.PinName?.toString()))?.DefaultValue;t=i instanceof De?[i.X,i.Y,i.Z].map((e=>e.valueOf())):i instanceof Ie?[i.R,i.G,i.B,i.A].map((e=>e.valueOf())):[]}if(t.length>0)return t.map((e=>ae.printExponential(e))).join(",");break;case ne.paths.materialExpressionFunctionInput:{const t=e.getMaterialSubobject();return`Input ${t?.InputName??"In"} (${t?.InputType?.value.match(/^.+?_(\w+)$/)?.[1]??"Vector3"})`}case ne.paths.materialExpressionLogarithm:return"Ln";case ne.paths.materialExpressionLogarithm10:return"Log10";case ne.paths.materialExpressionLogarithm2:return"Log2";case ne.paths.materialExpressionMaterialFunctionCall:const i=e.getMaterialSubobject()?.MaterialFunction;if(i)return i.getName();break;case ne.paths.materialExpressionSquareRoot:return"Sqrt";case ne.paths.materialExpressionSubtract:const s=e.getMaterialSubobject();if(s)return`Subtract(${s.ConstA??"1"},${s.ConstB??"1"})`;case ne.paths.metasoundEditorGraphExternalNode:{const t=e.ClassName?.Name;if(t)return"Add"===t?"+":t}case ne.paths.niagaraNodeConvert:return`Make ${(e.AutowireMakeType?.ClassStructOrEnum??"").toString().match(/(?:Niagara)?(\w+)['"]*$/)?.[1]??""}`;case ne.paths.pcgEditorGraphNodeInput:return"Input";case ne.paths.pcgEditorGraphNodeOutput:return"Output";case ne.paths.spawnActorFromClass:let r=e.getCustomproperties().find((e=>"ReturnValue"==e.PinName.toString()))?.PinType?.PinSubCategoryObject?.getName();return"Actor"===r&&(r=null),`SpawnActor ${ae.formatStringName(r??"NONE")}`;case ne.paths.switchEnum:return`Switch on ${e.Enum?.getName()??"Enum"}`;case ne.paths.switchInteger:return"Switch on Int";case ne.paths.variableGet:return"";case ne.paths.variableSet:return"SET"}const i=e.getClass();let s=e.switchTarget();if(s)return"E"!==s[0]&&(s=ae.formatStringName(s)),`Switch on ${s}`;if(e.isComment())return e.NodeComment.toString();const r=e.getHIDAttribute();if(r){const e=r.toString();let t=function(e){let t=Ge[e];if(t)return t;if(t=He(e)?.toString(),t)return t;const i=e.match(/NumPad([a-zA-Z]+)/);return i&&(t=He(i[1]).toString(),t)?"Num "+t:void 0}(e)??ae.formatStringName(e);return i===ne.paths.inputDebugKey?t="Debug Key "+t:i===ne.paths.getInputAxisKeyValue&&(t="Get "+t),t}if(i===ne.paths.macro)return ae.formatStringName(e.MacroGraphReference?.getMacroName());if(e.isMaterial()&&e.getMaterialSubobject()){let t=Ve(e.getMaterialSubobject());return t=t.match(/Material Expression (.+)/)?.[1]??t,t}if(e.isPcg()&&e.getPcgSubobject()){let t=e.getPcgSubobject();return t.NodeTitle?t.NodeTitle.toString():Ve(t)}const n=e.getSubgraphObject();if(n)return n.Graph.getName();const a=e.getSettingsObject();if(a){if(a.ExportPath?.valueOf()?.type===ne.paths.pcgHiGenGridSizeSettings)return`Grid Size: ${a.HiGenGridSize?.toString().match(/\d+/)?.[0]?.concat("00")??a.HiGenGridSize?.toString().match(/^\w+$/)?.[0]??"256"}`;if(a.BlueprintElementInstance)return ae.formatStringName(a.BlueprintElementType.getName());if(a.Operation){const e=a.Name?.toString().match(/PCGMetadata(\w+)Settings_\d+/);if(e)return ae.formatStringName(e[1]+": "+a.Operation)}const e=a.getSubgraphObject();if(e&&e.Graph)return e.Graph.getName()}let o,l=e.FunctionReference?.MemberName?.toString();if(l){const t=e.FunctionReference.MemberParent?.path??"";switch(l){case"AddKey":let e=t.match(Be);if(e)return`Add Key (${ae.formatStringName(e[1])})`;case"Concat_StrStr":return"Append"}const i=l.match(ne.lineTracePattern);if(i)return"Line Trace"+("Multi"===i[1]?" Multi ":" ")+(""===i[2]?"By Channel":ae.formatStringName(i[2]));switch(t){case ne.paths.blueprintGameplayTagLibrary:case ne.paths.kismetMathLibrary:case ne.paths.slateBlueprintLibrary:case ne.paths.timeManagementBlueprintLibrary:const e=l.match(/[BF]([A-Z]\w+)/);switch(e&&(l=e[1]),l){case"Abs":return"ABS";case"BooleanAND":return"AND";case"BooleanNAND":return"NAND";case"BooleanOR":return"OR";case"Exp":return"e";case"LineTraceSingle":return"Line Trace By Channel";case"Max":case"MaxInt64":return"MAX";case"Min":case"MinInt64":return"MIN";case"Not_PreBool":return"NOT";case"Sin":return"SIN";case"Sqrt":return"SQRT";case"Square":return"^2";case"CrossProduct2D":return"cross";case"Vector4_CrossProduct3":return"cross3";case"DotProduct2D":case"Vector4_DotProduct":return"dot";case"Vector4_DotProduct3":return"dot3"}if(l.startsWith("Add_"))return"+";if(l.startsWith("And_"))return"&";if(l.startsWith("Conv_"))return"";if(l.startsWith("Cross_"))return"cross";if(l.startsWith("Divide_"))return String.fromCharCode(247);if(l.startsWith("Dot_"))return"dot";if(l.startsWith("EqualEqual_"))return"==";if(l.startsWith("Greater_"))return">";if(l.startsWith("GreaterEqual_"))return">=";if(l.startsWith("Less_"))return"<";if(l.startsWith("LessEqual_"))return"<=";if(l.startsWith("Multiply_"))return String.fromCharCode(10799);if(l.startsWith("Not_"))return"~";if(l.startsWith("NotEqual_"))return"!=";if(l.startsWith("Or_"))return"|";if(l.startsWith("Percent_"))return"%";if(l.startsWith("Subtract_"))return"-";if(l.startsWith("Xor_"))return"^";break;case ne.paths.blueprintSetLibrary:{const e=l.match(/Set_(\w+)/);if(e)return ae.formatStringName(e[1]).toUpperCase()}break;case ne.paths.blueprintMapLibrary:{const e=l.match(/Map_(\w+)/);if(e)return ae.formatStringName(e[1]).toUpperCase()}break;case ne.paths.kismetArrayLibrary:{const e=l.match(/Array_(\w+)/);if(e)return e[1].toUpperCase()}}return ae.formatStringName(l)}if(e.OpName){switch(e.OpName.toString()){case"Boolean::LogicAnd":return"Logic AND";case"Boolean::LogicEq":return"==";case"Boolean::LogicNEq":return"!=";case"Boolean::LogicNot":return"Logic NOT";case"Boolean::LogicOr":return"Logic OR";case"Matrix::MatrixMultiply":return"Multiply (Matrix * Matrix)";case"Matrix::MatrixVectorMultiply":return"Multiply (Matrix * Vector4)";case"Numeric::Abs":return"Abs";case"Numeric::Add":return"+";case"Numeric::DistancePos":return"Distance";case"Numeric::Mul":return String.fromCharCode(10799);case"Integer::BitLShift":return"Bitwise Left Shift";case"Integer::BitAnd":return"Bitwise AND";case"Integer::BitNot":return"Bitwise NOT";case"Integer::BitOr":return"Bitwise OR";case"Integer::BitRShift":return"Bitwise Right Shift";case"Integer::BitXOr":return"Bitwise XOR"}return ae.formatStringName(e.OpName.toString()).replaceAll("::"," ")}return i.startsWith(o="/Script/NiagaraEditor.NiagaraNodeParameter")||i.startsWith(o="/Script/NiagaraEditor.NiagaraNode")?ae.formatStringName(i.substring(o.length)):e.FunctionDisplayName?ae.formatStringName(e.FunctionDisplayName.toString()):e.ObjectRef?e.ObjectRef.getName():ae.formatStringName(e.getNameAndCounter()[0])}class Re extends Pe{static type;static grammar=this.createGrammar();get length(){return this.values.length}constructor(e=[]){super(),this.values=e}static createGrammar(e=this.type?.grammar??xe.lazy((()=>this.unknownEntityGrammar))){return this.inlined?e:xe.seq(xe.reg(/\(\s*/),e.sepBy(Me.commaSeparation).opt(),xe.reg(/\s*(,\s*)?\)/,1)).map((([e,t,i])=>{t=t instanceof Array?t:[];let s=this;return void 0!==i!==s.trailing&&(s=s.flagTrailing(void 0!==i)),new s(t)})).label(`ArrayEntity of ${this.type?.className()??"unknown values"}`)}static flagInlined(e=!0){const t=this.asUniqueClass();return t.inlined=e,t.grammar=t.createGrammar(),t}static of(e){const t=this.asUniqueClass();return t.type=e,t.grammar=t.createGrammar(),t}doSerialize(e=!1,t="",i=this.constructor,s=i.printKey,r=i.keySeparator,n=i.attributeSeparator,a=i.wrap){if(i.inlined)return super.serialize.bind(this.values,e,t,i,s,r,n,a)();let o=this.values.map((t=>t?.serialize(e))).join(i.attributeSeparator);return this.trailing&&(o+=i.attributeSeparator),`(${o})`}valueOf(){return this.values}equals(e){if(!(e instanceof Re)||this.values.length!==e.values.length)return!1;for(let t=0;t_e=e.default)).catch():_e=window.crypto;class ze extends Pe{static grammar=this.createGrammar();static generateGuid(){let e=new Uint32Array(4);_e.getRandomValues(e);let t="";return e.forEach((e=>{t+=("0".repeat(8)+e.toString(16).toUpperCase()).slice(-8)})),t}constructor(e=ze.generateGuid()){super(),this.value=e}static createGrammar(){return xe.reg(/[0-9A-F]{32}/i).map((e=>new this(e))).label("GuidEntity")}serialize(e=!1,t="",i=this.constructor){let s=this.value;return i.serialized&&(s=`"${s}"`),s}toString(){return this.value}}class Fe extends $e{static grammar=this.createGrammar();get value(){return super.value}set value(e){(e=Math.trunc(e))>=1<<31&&e<-(1<<31)&&(e=Math.floor(e),super.value=e)}static createGrammar(){return xe.numberInteger.map((e=>new this(e)))}}class je extends Fe{static grammar=this.createGrammar();get value(){return super.value}set value(e){e=Math.round(ae.clamp(e,0)),super.value=e}static createGrammar(){return xe.numberNatural.map((e=>new this(e)))}}const Ue={Any:n``,"Any[]":n``,audio:n``,blue:n``,bool:n``,byte:n``,class:n``,default:n``,delegate:n``,enum:n``,exec:n``,float:n``,green:n``,int:n``,int32:n``,int64:n``,interface:n``,name:n``,object:n``,Param:n``,"Param[]":n``,Point:n``,"Point[]":n``,real:n``,red:n``,string:n``,struct:n``,Surface:n``,"Surface[]":n``,text:n``,time:n``,Volume:n``,"Volume[]":n``,wildcard:n``,[ne.paths.niagaraBool]:n``,[ne.paths.niagaraDataInterfaceVolumeTexture]:n``,[ne.paths.niagaraFloat]:n``,[ne.paths.NiagaraInt32]:n``,[ne.paths.niagaraMatrix]:n``,[ne.paths.niagaraNumeric]:n``,[ne.paths.niagaraPosition]:n``,[ne.paths.quat4f]:n``,[ne.paths.rotator]:n``,[ne.paths.transform]:n``,[ne.paths.vector]:n``,[ne.paths.vector3f]:n``,[ne.paths.vector4f]:n``},Ye=n``;class Ke extends Fe{static grammar=this.createGrammar();get value(){return super.value}set value(e){(e=Math.trunc(e))>=0&&e<256&&(super.value=e)}createGrammar(){return xe.numberByte.map((e=>new this(e)))}}class Xe extends Pe{static grammar=this.createGrammar();static escapedCharacters=/['"\\]/g;static unescapedBackslash=/(?<=(?:[^\\]|^)(?:\\\\)*)\\(?!\\)/;constructor(e=""){super(),this.value=e}static createGrammar(){return xe.doubleQuotedString.map((e=>new this(Xe.unescape(e)))).label("StringEntity")}static escape(e,t=!0){let i=e.replaceAll(new RegExp(`(${Xe.escapedCharacters.source})`,"g"),"\\$1");return t&&(i=i.replaceAll("\n","\\n").replaceAll("\t","\\t")),i}static unescape(e){return e.replaceAll(new RegExp(Xe.unescapedBackslash.source+"t","g"),"\t").replaceAll(new RegExp(Xe.unescapedBackslash.source+"n","g"),"\n").replaceAll(new RegExp(`\\\\(${Xe.escapedCharacters.source})`,"g"),"$1")}doSerialize(e=!1){let t=`"${Xe.escape(this.value)}"`;return e&&(t=Xe.escape(t,!1)),t}valueOf(){return this.value}toString(){return this.value}}class qe extends Pe{static grammar=this.createGrammar();static f;static createGrammar(){return Xe.grammar}static from(e){const t=this.asUniqueClass();return t.f=e,t}static compute(e){return this.f(e)}}class Ze extends Pe{static attributeConverter={fromAttribute:(e,t)=>new this(e),toAttribute:(e,t)=>e.toString()};static grammar=this.createGrammar();static createGrammar(){return Me.symbol.map((e=>new this(e))).label("SymbolEntity")}constructor(e=""){super(),this.value=e}serialize(e=!1,t="",i=this.constructor){let s=this.value;return i.serialized&&(s=`"${s}"`),s}toString(){return this.value}}class We extends Ze{static grammar=this.createGrammar();static createGrammar(){return Me.symbol.map((e=>new this(e)))}}class Qe extends We{static grammar=this.createGrammar();static createGrammar(){return xe.reg(Me.Regex.InsideString).map((e=>new this(e)))}}class Je extends Pe{static lookbehind="INVTEXT";static grammar=this.createGrammar();constructor(e=""){super(),this.value=e}static createGrammar(){return xe.alt(xe.seq(xe.reg(new RegExp(`${this.lookbehind}\\s*\\(`)),xe.doubleQuotedString,xe.reg(/\s*\)/)).map((([e,t,i])=>t)),xe.reg(new RegExp(this.lookbehind)).map((()=>""))).map((e=>new this(e))).label("InvariantTextEntity")}doSerialize(){return this.lookbehind+'("'+this.value+'")'}valueOf(){return this.value}toString(){return this.value}}class et extends Pe{static attributeSeparator=", ";static printKey=e=>"";static lookbehind="NSLOCTEXT";static attributes={...super.attributes,namespace:Xe.withDefault(),key:Xe.withDefault(),value:Xe.withDefault()};static grammar=this.createGrammar();constructor(e={}){super(e),this.namespace,this.key,this.value}static createGrammar(){return xe.regArray(new RegExp(String.raw`${et.lookbehind}\s*\(`+String.raw`\s*"(?${Me.Regex.InsideString.source})"\s*,`+String.raw`\s*"(?${Me.Regex.InsideString.source})"\s*,`+String.raw`\s*"(?${Me.Regex.InsideString.source})"\s*`+String.raw`(?,\s+)?`+String.raw`\)`,"m")).map((({groups:{namespace:e,key:t,value:i,trailing:s}})=>new this({namespace:new this.attributes.namespace(ae.unescapeString(e)),key:new this.attributes.namespace(ae.unescapeString(t)),value:new this.attributes.namespace(ae.unescapeString(i)),trailing:void 0!==s}))).label("LocalizedTextEntity")}toString(){return ae.capitalFirstLetter(this.value.valueOf())}}class tt extends Pe{static attributeSeparator=", ";static lookbehind=["LOCGEN_FORMAT_NAMED","LOCGEN_FORMAT_ORDERED"];static grammar=this.createGrammar();constructor(e){super(),this.values=e}static createGrammar(){return xe.lazy((()=>xe.seq(xe.reg(new RegExp(String.raw`(${this.lookbehind.join("|")})\s*\(\s*`),1),xe.alt(...[Xe,et,Je,tt].map((e=>e.grammar))).sepBy(xe.reg(/\s*\,\s*/)),xe.reg(/\s*\)/)).map((([e,t])=>{const i=new this(t);return i.lookbehind=e,i})))).label("FormatTextEntity")}doSerialize(e=!1,t="",i=this.constructor,s=i.printKey,r=i.keySeparator,n=i.attributeSeparator,a=i.wrap){const o=i.attributeSeparator;return this.lookbehind+"("+this.values.map((t=>t.serialize(e))).join(o)+(i.trailing?o:"")+")"}toString(){const e=this.values?.[0]?.toString();if(!e)return"";const t=this.values.slice(1).map((e=>e?.valueOf()));return"LOCGEN_FORMAT_NAMED"==this.lookbehind?e.replaceAll(/\{([a-zA-Z]\w*)\}/g,((e,i)=>{const s=t.indexOf(i)+1;return s>0&&s{const s=Number(i);return s=-(1n<<63n)&&e<1n<<63n&&(this._value=e)}constructor(e=0n){super(),this.value=BigInt(e)}static createGrammar(){return xe.numberBigInteger.map((e=>new this(e)))}serialize(e=!1,t="",i=this.constructor){let s=this.value.toString();return i.serialized&&(s=`"${s}"`),s}valueOf(){return this.value}toString(){return this.value.toString()}}class st extends Pe{static typeReference=xe.reg(new RegExp(Me.Regex.Path.source+"|"+Me.symbol.getParser().regexp.source));static fullReferenceGrammar=this.createFullReferenceGrammar();static grammar=this.createGrammar();#u;get type(){return this.#u}set type(e){this.#u=e}#D;get path(){return this.#D}set path(e){this.#D=e}#B;get full(){return this.#B}set full(e){this.#B=e}constructor(e="None",t="",i=(e.includes("/")||t?(e,t)=>`"${e+(t?`'${t}'`:"")}"`:(e,t)=>e)){super(),this.#u=e,this.#D=t,this.#B=i}static createGrammar(){return xe.alt(this.createFullReferenceSerializedGrammar(),this.createFullReferenceGrammar(),this.createTypeReferenceGrammar()).label("ObjectReferenceEntity")}static createFullReferenceGrammar(){return xe.regArray(new RegExp("("+this.typeReference.getParser().regexp.source+")(?:"+`'"(${Me.Regex.InsideString.source})"'|`+`'(${Me.Regex.InsideSingleQuotedString.source})')`)).map((([e,t,i,s])=>{let r=!!i,n=r?["'\"","\"'"]:["'","'"];return new this(t,r?i:s,((e,t)=>e+n[0]+t+n[1]))}))}static createFullReferenceSerializedGrammar(){return xe.regArray(new RegExp('"('+Me.Regex.InsideString.source+"?)(?:'("+Me.Regex.InsideSingleQuotedString.source+"?)')?\"")).map((([e,t,i])=>new this(t,i,((e,t)=>`"${e}${t?`'${t}'`:""}"`))))}static createTypeReferenceGrammar(){return this.typeReference.map((e=>new this(e,"",((e,t)=>e))))}static createNoneInstance(){return new this("None")}getName(e=!1){return ae.getNameFromPath(this.path.replace(/_C$/,""),e)}doSerialize(e=!1){let t=this.full(this.type,this.path);return e&&(t=ae.escapeString(t,!1)),t}equals(e){return e instanceof st&&(this.type==e.type&&this.path==e.path)}toString(){return this.full(this.type,this.path)}}class rt extends Pe{static grammar=this.createGrammar();constructor(e=null,t=null){super(),this.objectName=e,this.pinGuid=t}static createGrammar(){return xe.seq(Ze.grammar,xe.whitespace,ze.grammar).map((([e,t,i])=>new this(e,i))).label("PinReferenceEntity")}doSerialize(){return this.objectName.serialize()+" "+this.pinGuid.serialize()}}class nt extends Pe{static attributes={...super.attributes,MemberParent:st,MemberName:Xe,MemberGuid:ze};static grammar=this.createGrammar();constructor(e){super(e),this.MemberParent,this.MemberName,this.MemberGuid}static createGrammar(){return Me.createEntityGrammar(this,Me.commaSeparation,0,0)}}class at extends Pe{static attributes={...super.attributes,PinCategory:Xe.withDefault(),PinSubCategory:Xe.withDefault(),PinSubCategoryObject:st,PinSubCategoryMemberReference:nt,ContainerType:Ze,bIsReference:ke,bIsConst:ke,bIsWeakPointer:ke,bIsUObjectWrapper:ke,bSerializeAsSinglePrecisionFloat:ke};static grammar=this.createGrammar();constructor(e={}){super(e),this.PinCategory,this.PinSubCategory,this.PinSubCategoryObject,this.PinSubCategoryMemberReference,this.ContainerType,this.bIsReference,this.bIsConst,this.bIsWeakPointer,this.bIsUObjectWrapper,this.bIsUObjectWrapper,this.bSerializeAsSinglePrecisionFloat}static createGrammar(){return Me.createEntityGrammar(this).label("PinTypeEntity")}copyTypeFrom(e){for(const t of this.keys)void 0!==e[t]&&(this[t]=e[t])}}class ot extends Pe{static attributes={...super.attributes,X:$e.withDefault(),Y:$e.withDefault()};static grammar=this.createGrammar();constructor(e){super(e),this.X,this.Y}static createGrammar(){return Me.createEntityGrammar(this,Me.commaSeparation,1).label("Vector2DEntity")}toArray(){return[this.X.valueOf(),this.Y.valueOf()]}}class lt extends ot{static grammar=this.createGrammar();static createGrammar(){return xe.alt(xe.regArray(new RegExp(/X\s*=\s*/.source+"(?"+Me.numberRegexSource+")\\s+"+/Y\s*=\s*/.source+"(?"+Me.numberRegexSource+")")).map((({groups:{x:e,y:t}})=>new this({X:new ot.attributes.X(e),Y:new ot.attributes.Y(t)}))),ot.grammar.map((e=>new this({X:e.X,Y:e.Y})))).label("RBSerializationVector2DEntity")}}class ut extends Pe{static attributes={...super.attributes,R:$e.withDefault(),P:$e.withDefault(),Y:$e.withDefault()};static grammar=this.createGrammar();constructor(e){super(e),this.R,this.P,this.Y}static createGrammar(){return Me.createEntityGrammar(this,Me.commaSeparation,1).label("RotatorEntity")}getRoll(){return this.R}getPitch(){return this.P}getYaw(){return this.Y}}class ct extends ut{static attributeSeparator=", ";static grammar=this.createGrammar();static createGrammar(){return xe.alt(xe.regArray(new RegExp(`(${$e.numberRegexSource})`+String.raw`\s*,\s*`+`(${$e.numberRegexSource})`+String.raw`\s*,\s*`+`(${$e.numberRegexSource})`)).map((([e,t,i,s,r,n,a])=>new this({R:new ut.attributes.R(n,a?.length),P:new ut.attributes.P(t,i?.length),Y:new ut.attributes.Y(s,r?.length)}))),ut.grammar.map((e=>new this({R:e.R,P:e.P,Y:e.Y})))).label("SimpleSerializationRotatorEntity")}doSerialize(){const e=this.constructor.attributeSeparator;return this.P.serialize()+e+this.Y.serialize()+e+this.R.serialize()+(this.trailing?e:"")}}class ht extends ot{static attributeSeparator=", ";static grammar=this.createGrammar();static createGrammar(){return xe.alt(xe.regArray(new RegExp(`(${$e.numberRegexSource})`+String.raw`\s*,\s*`+`(${$e.numberRegexSource})`)).map((([e,t,i,s,r])=>new this({X:new ot.attributes.X(t,i?.length),Y:new ot.attributes.Y(s,r?.length)}))),ot.grammar.map((e=>new this({X:e.X,Y:e.Y})))).label("SimpleSerializationVector2DEntity")}doSerialize(){const e=this.constructor.attributeSeparator;return this.X.serialize()+e+this.Y.serialize()+(this.trailing?e:"")}}class pt extends Pe{static attributes={...super.attributes,X:$e.withDefault(),Y:$e.withDefault(),Z:$e.withDefault(),W:$e.withDefault()};static grammar=this.createGrammar();constructor(e){super(e),this.X,this.Y,this.Z,this.W}static createGrammar(){return Me.createEntityGrammar(this,Me.commaSeparation,1).label("Vector4DEntity")}toArray(){return[this.X.valueOf(),this.Y.valueOf(),this.Z.valueOf(),this.W.valueOf()]}}class dt extends pt{static grammar=this.createGrammar();static createGrammar(){return xe.alt(xe.regArray(new RegExp(`(${Me.numberRegexSource})`+String.raw`\s*,\s*`+`(${Me.numberRegexSource})`+String.raw`\s*,\s*`+`(${Me.numberRegexSource})`+String.raw`\s*,\s*`+`(${Me.numberRegexSource})`)).map((([e,t,i,s,r])=>new this({X:new pt.attributes.X(t),Y:new pt.attributes.Y(i),Z:new pt.attributes.Z(s),W:new pt.attributes.W(r)}))),pt.grammar)}}class mt extends De{static allowShortSerialization=!1;static attributeSeparator=", ";static grammar=this.createGrammar();static createGrammar(){return xe.alt(xe.regArray(new RegExp(`(${$e.numberRegexSource})`+(this.allowShortSerialization?"(?:":"")+String.raw`\s*,\s*`+`(${$e.numberRegexSource})`+String.raw`\s*,\s*`+`(${$e.numberRegexSource})`+(this.allowShortSerialization?")?":""))).map((([e,t,i,s,r,n,a])=>new this({X:new De.attributes.X(t,i?.length),Y:new De.attributes.Y(s,r?.length),Z:new De.attributes.Z(n,a?.length)}))),De.grammar.map((e=>new this({X:e.X,Y:e.Y,Z:e.Z}))))}static flagAllowShortSerialization(e=!0){const t=this.asUniqueClass();return e!==t.allowShortSerialization&&(t.allowShortSerialization=e,t.grammar=t.createGrammar()),t}doSerialize(){const e=this.constructor.attributeSeparator;return this.X.serialize()+e+this.Y.serialize()+e+this.Z.serialize()+(this.trailing?e:"")}}class gt extends Pe{static lookbehind="Pin";static#G={bool:ke,byte:Ke,enum:We,exec:Xe,int:Fe,int64:it,name:Xe,real:$e,string:Xe,[ne.paths.linearColor]:Ie,[ne.paths.niagaraBool]:ke,[ne.paths.niagaraPosition]:De,[ne.paths.rotator]:ut,[ne.paths.vector]:De,[ne.paths.vector2D]:ot,[ne.paths.vector4f]:pt};static#H={enum:Qe,rg:lt,[ne.paths.niagaraPosition]:mt.flagAllowShortSerialization(),[ne.paths.rotator]:ct,[ne.paths.vector]:mt,[ne.paths.vector2D]:ht,[ne.paths.vector3f]:mt,[ne.paths.vector4f]:dt};static attributes={PinId:ze.withDefault(),PinName:Xe.withDefault(),PinFriendlyName:Le.accepting(et,tt,Je,Xe),PinToolTip:Xe,Direction:Xe,PinType:at.withDefault().flagInlined(),LinkedTo:Re.of(rt).withDefault().flagSilent(),SubPins:Re.of(rt),ParentPin:rt,DefaultValue:qe.from((e=>e.getEntityType(!0)?.flagSerialized()??Xe)),AutogeneratedDefaultValue:Xe,DefaultObject:st,PersistentGuid:ze,bHidden:ke.withDefault(),bNotConnectable:ke.withDefault(),bDefaultValueIsReadOnly:ke.withDefault(),bDefaultValueIsIgnored:ke.withDefault(),bAdvancedView:ke.withDefault(),bOrphanedPin:ke};static grammar=this.createGrammar();#V=!1;set recomputesNodeTitleOnChange(e){this.#V=e}get recomputesNodeTitleOnChange(){return this.#V}#R=null;get objectEntity(){try{return this.#R}catch(e){return null}}set objectEntity(e){this.#R=e}#_;get pinIndex(){return this.#_}set pinIndex(e){this.#_=e}constructor(e={}){super(e),this.PinId,this.PinName,this.PinFriendlyName,this.PinToolTip,this.Direction,this.PinType,this.LinkedTo,this.DefaultValue,this.AutogeneratedDefaultValue,this.DefaultObject,this.PersistentGuid,this.bHidden,this.bNotConnectable,this.bDefaultValueIsReadOnly,this.bDefaultValueIsIgnored,this.bAdvancedView,this.bOrphanedPin,this.objectEntity}static createGrammar(){return Me.createEntityGrammar(this)}static fromLegacyObject(e){return new gt(e)}getType(){const e=this.PinType.PinCategory?.toString().toLocaleLowerCase();if("struct"===e||"class"===e||"object"===e||"type"===e)return this.PinType.PinSubCategoryObject?.path;if(this.isEnum())return"enum";if(this.objectEntity?.isPcg()){const e=this.objectEntity.getPcgSubobject(),t=this.isInput()?e.InputPins?.valueOf()[this.pinIndex]:e.OutputPins?.valueOf()[this.pinIndex];if(t){const i=e[ne.subObjectAttributeNameFromReference(t,!0)];let s=i.Properties?.AllowedTypes?.toString()??"";if(""==s&&(s=this.PinType.PinCategory??"",""==s&&(s="Any")),s)return!1!==i.Properties.bAllowMultipleData?.valueOf()&&!1!==i.Properties.bAllowMultipleConnections?.valueOf()&&(s+="[]"),s}}if("optional"===e){const e=this.PinType.PinSubCategory?.toString();switch(e){case"red":return"real";case"rg":return"rg";case"rgb":return ne.paths.vector;case"rgba":return ne.paths.linearColor;default:return e}}return e}getEntityType(e=!1){const t=this.getType(),i=gt.#G[t],s=gt.#H[t];return e&&void 0!==s?s:i}pinTitle(){return function(e){let t,i=e.PinFriendlyName?e.PinFriendlyName.toString():ae.formatStringName(e.PinName?.toString()??"");return(t=e.PinToolTip?.toString().match(/\s*(.+?(?=\n)|.+\S)\s*/))&&t[1].toLowerCase()===i.toLowerCase()?t[1]:(i=i.replace(/^Module\./,""),i)}(this)}copyTypeFrom(e){this.PinType=e.PinType}getDefaultValue(e=!1){return void 0===this.DefaultValue&&e&&(this.DefaultValue=new(this.getEntityType(!0))),this.DefaultValue}isEnum(){const e=this.PinType.PinSubCategoryObject?.type;return e===ne.paths.enum||e===ne.paths.userDefinedEnum||"enum"===e?.toLowerCase()}isExecution(){return"exec"===this.PinType.PinCategory.toString()}isHidden(){return this.bHidden?.valueOf()}isInput(){return!this.isHidden()&&"EGPD_Output"!=this.Direction?.toString()}isOutput(){return!this.isHidden()&&"EGPD_Output"==this.Direction?.toString()}isLinked(){return this.LinkedTo?.length>0??!1}linkTo(e,t){const i=this.LinkedTo.values?.some((i=>i.objectName.toString()==e&&i.pinGuid.toString()==t.PinId.toString()));return!i&&(this.LinkedTo.values.push(new rt(new Ze(e),t.PinId)),!0)}unlinkFrom(e,t){const i=this.LinkedTo.values?.findIndex((i=>i.objectName.toString()==e&&i.pinGuid.toString()==t.PinId.toString()));return i>=0&&(this.LinkedTo.values.splice(i,1),0===this.LinkedTo.length&&void 0===gt.attributes.LinkedTo.default&&(this.LinkedTo.values=[]),!0)}getSubCategory(){return this.PinType.PinSubCategoryObject?.path}pinColor(){return function(e){if("mask"===e.PinType.PinCategory?.toString()){const t=Ue[e.PinType.PinSubCategory];if(t)return t}else if("optional"===e.PinType.PinCategory?.toString())return Ye;return Ue[e.getType()]??Ue[e.PinType.PinCategory?.toString().toLowerCase()]??Ue.default}(this)}}const bt=e=>e.PinName?.toString().match(/^\s*([A-Z])\s*$/)?.[1]?.charCodeAt(0)-"A".charCodeAt(0);class vt extends Pe{static attributes={...super.attributes,MacroGraph:st,GraphBlueprint:st,GraphGuid:ze};static grammar=this.createGrammar();constructor(e){super(e),this.MacroGraph,this.GraphBlueprint,this.GraphGuid}static createGrammar(){return Me.createEntityGrammar(this)}getMacroName(){const e=this.MacroGraph.path.search(":");return this.MacroGraph.path.substring(e+1)}}class ft extends Pe{static grammar=this.createGrammar();static createGrammar(){return xe.reg(new RegExp(String.raw`\(${xe.whitespaceInlineOpt.getParser().regexp.source}\)`)).map((e=>new this)).label("NullEntity")}serialize(e=!1,t="",i=this.constructor){let s="()";return i.serialized&&(s=`"${s}"`),s}}class yt extends Pe{static attributes={...super.attributes,ScriptVariable:st,OriginalChangeId:ze};static grammar=this.createGrammar();constructor(e={}){super(e),this.ScriptVariable,this.OriginalChangeId}static createGrammar(){return Me.createEntityGrammar(this).label("ScriptVariableEntity")}}class wt extends gt{static grammar=this.createGrammar();static createGrammar(){return xe.seq(xe.reg(new RegExp(`(${Me.Regex.Symbol.source})\\s*\\(\\s*`),1),Me.createAttributeGrammar(this).sepBy(Me.commaSeparation),xe.reg(/\s*(?:,\s*)?\)/)).map((([e,t,i])=>{e??="";let s={};return e.length&&(s.lookbehind=e),t.forEach((e=>e(s))),new this(s)})).label("UnknownPinEntity")}}class St extends Pe{static attributes={...super.attributes,MemberScope:Xe,MemberName:Xe.withDefault(),MemberGuid:ze,bSelfContext:ke};static grammar=this.createGrammar();constructor(e){super(e),this.MemberScope,this.MemberName,this.MemberGuid,this.bSelfContext}static createGrammar(){return Me.createEntityGrammar(this).label("VariableReferenceEntity")}}class Et extends Pe{#z=!1;get exported(){return this.#z}set exported(e){this.#z=e}static#F=/^(\w+?)(?:_(\d+))?$/;static printKey=e=>e.startsWith(ne.subObjectAttributeNamePrefix)?"":e;static attributeSeparator="\n";static wrap=this.notWrapped;static trailing=!0;static attributes={...super.attributes,Class:st,Name:Xe,Archetype:st,ExportPath:Oe.of(st),ObjectRef:st,BlueprintElementType:st,BlueprintElementInstance:st,ConstA:Oe.of($e),ConstB:Oe.of($e),PinTags:Re.of(ft).flagInlined(),PinNames:Re.of(Xe).flagInlined(),AxisKey:Ze,InputAxisKey:Ze,InputName:Xe,InputType:Ze,NumAdditionalInputs:je,bIsPureFunc:ke,bIsConstFunc:ke,bIsCaseSensitive:ke,VariableReference:St,SelfContextInfo:Ze,DelegatePropertyName:Xe,DelegateOwnerClass:st,ComponentPropertyName:Xe,EventReference:nt,FunctionReference:nt,FunctionScript:st,CustomFunctionName:Xe,TargetType:st,MacroGraphReference:vt,Enum:st,EnumEntries:Re.of(Xe).flagInlined(),InputKey:Ze,OpName:Xe,CachedChangeId:ze,FunctionDisplayName:Xe,AddedPins:Re.of(wt).withDefault().flagInlined().flagSilent(),ChangeId:ze,MaterialFunction:st,bOverrideFunction:ke,bInternalEvent:ke,bConsumeInput:ke,bExecuteWhenPaused:ke,bOverrideParentBinding:ke,bControl:ke,bAlt:ke,bShift:ke,bCommand:ke,CommentColor:Ie,bCommentBubbleVisible_InDetailsPanel:ke,bColorCommentBubble:ke,ProxyFactoryFunctionName:Xe,ProxyFactoryClass:st,ProxyClass:st,StructType:st,MaterialExpression:st,MaterialExpressionComment:st,MoveMode:Ze,TimelineName:Xe,TimelineGuid:ze,SizeX:Oe.of(Fe),SizeY:Oe.of(Fe),Text:Oe.of(Xe),MaterialExpressionEditorX:Oe.of(Fe),MaterialExpressionEditorY:Oe.of(Fe),NodeTitle:Xe,NodeTitleColor:Ie,PositionX:Oe.of(Fe),PositionY:Oe.of(Fe),SettingsInterface:st,PCGNode:st,HiGenGridSize:Ze,Operation:Ze,NodePosX:Fe,NodePosY:Fe,NodeHeight:Fe,NodeWidth:Fe,Graph:st,SubgraphInstance:Xe,InputPins:Re.of(st).flagInlined(),OutputPins:Re.of(st).flagInlined(),bExposeToLibrary:ke,bCanRenameNode:ke,bCommentBubblePinned:ke,bCommentBubbleVisible:ke,NodeComment:Xe,AdvancedPinDisplay:Ze,DelegateReference:St,EnabledState:Ze,NodeGuid:ze,ErrorType:Fe,ErrorMsg:Xe,ScriptVariables:Re.flagInlined().of(yt),Node:Oe.of(st),ExportedNodes:Xe,CustomProperties:Re.of(Le.accepting(gt,wt)).withDefault().flagSilent()};static customPropertyGrammar=xe.seq(xe.reg(/CustomProperties\s+/),this.attributes.CustomProperties.type.grammar).map((([e,t])=>e=>{(e.CustomProperties??=new this.attributes.CustomProperties).values.push(t)}));static inlinedArrayEntryGrammar=xe.seq(xe.alt(Me.symbolQuoted.map((e=>[e,!0])),Me.symbol.map((e=>[e,!1]))),xe.reg(new RegExp(String.raw`\s*\(\s*(\d+)\s*\)\s*\=\s*`),1).map(Number)).chain((([[e,t],i])=>(this.attributes[e]?.grammar??Pe.unknownEntityGrammar).map((s=>r=>{if(void 0===r[e]){let i=Re;t!=i.quoted&&(i=i.flagQuoted(t)),i.inlined||(i=i.flagInlined()),r[e]=new i}r[e].values[i]=s}))));static grammar=this.createGrammar();static grammarMultipleObjects=xe.seq(xe.whitespaceOpt,this.grammar,xe.seq(xe.whitespace,this.grammar).map((([e,t])=>t)).many(),xe.whitespaceOpt).map((([e,t,i,s])=>[t,...i]));constructor(e={}){if("NodePosX"in e!="NodePosY"in e){const t=Object.entries(e),[i,s]="NodePosX"in e?["NodePosY",Object.keys(e).indexOf("NodePosX")+1]:["NodePosX",Object.keys(e).indexOf("NodePosY")];t.splice(s,0,[i,new Fe(0)]),e=Object.fromEntries(t)}super(e),this.AddedPins,this.AdvancedPinDisplay,this.Archetype,this.AxisKey,this.bIsPureFunc,this.BlueprintElementInstance,this.ConstA,this.ConstB,this.BlueprintElementType,this.Class,this.CommentColor,this.ComponentPropertyName,this.CustomFunctionName,this.CustomProperties,this.DelegatePropertyName,this.DelegateReference,this.EnabledState,this.Enum,this.EnumEntries,this.EventReference,this.ExportedNodes,this.ExportPath,this.FunctionDisplayName,this.FunctionReference,this.FunctionScript,this.Graph,this.HiGenGridSize,this.InputAxisKey,this.InputKey,this.InputName,this.InputPins,this.InputType,this.MacroGraphReference,this.MaterialExpression,this.MaterialExpressionComment,this.MaterialExpressionEditorX,this.MaterialExpressionEditorY,this.MaterialFunction,this.Name,this.Node,this.NodeComment,this.NodeHeight,this.NodePosX,this.NodePosY,this.NodeTitle,this.NodeTitleColor,this.NodeWidth,this.NumAdditionalInputs,this.ObjectRef,this.Operation,this.OpName,this.OutputPins,this.PCGNode,this.PinTags,this.PinNames,this.PositionX,this.PositionY,this.ProxyFactoryFunctionName,this.ScriptVariables,this.SettingsInterface,this.SizeX,this.SizeY,this.StructType,this.SubgraphInstance,this.TargetType,this.Text,this.Text,this.VariableReference,this.Pins instanceof Re&&this.Pins.valueOf().forEach((e=>{const t=this[ne.subObjectAttributeNameFromReference(e,!0)];if(t){const e=gt.fromLegacyObject(t);e.LinkedTo=new gt.attributes.LinkedTo,this.getCustomproperties(!0).push(e),this.CustomProperties.ignored=!0}}));const t=this.getMaterialSubobject();if(t){const e=t;if(void 0!==e.SizeX&&(e.SizeX.getter=()=>this.NodeWidth),e.SizeY&&(e.SizeY.getter=()=>this.NodeHeight),e.Text&&(e.Text.getter=()=>this.NodeComment),e.MaterialExpressionEditorX&&(e.MaterialExpressionEditorX.getter=()=>this.NodePosX),e.MaterialExpressionEditorY&&(e.MaterialExpressionEditorY.getter=()=>this.NodePosY),this.getType()===ne.paths.materialExpressionComponentMask){const t=ne.rgba.map((e=>{const t=this.getPinEntities().find((t=>t.PinName.toString()===e));return t.recomputesNodeTitleOnChange=!0,t}));e.keys=[...ne.rgba,...e.keys];const i=Oe.of(ke).withDefault().flagSilent();e.R=new i((()=>t[0].DefaultValue)),e.G=new i((()=>t[1].DefaultValue)),e.B=new i((()=>t[2].DefaultValue)),e.A=new i((()=>t[3].DefaultValue))}else if(this.getType()===ne.paths.materialExpressionSubtract){const t=Oe.of($e.withPrecision(6)).withDefault((()=>new Oe((()=>new $e(1))))).flagSilent(),i=this.getCustomproperties().find((e=>"A"===e.PinName?.toString())),s=this.getCustomproperties().find((e=>"B"===e.PinName?.toString()));(i||s)&&(e.keys=["ConstA","ConstB",...e.keys],i&&(i.recomputesNodeTitleOnChange=!0,e.ConstA=new t((()=>i.DefaultValue))),s&&(s.recomputesNodeTitleOnChange=!0,e.ConstB=new t((()=>s.DefaultValue))))}}const i=this.getPcgSubobject();i&&(i.PositionX&&(i.PositionX.getter=()=>this.NodePosX),i.PositionY&&(i.PositionY.getter=()=>this.NodePosY),i.getSubobjects().forEach((e=>{if(void 0!==e.Node){const t=e.Node.getter();t.type===this.PCGNode.type&&t.path===`${this.Name}.${this.PCGNode.path}`&&(e.Node.getter=()=>new st(this.PCGNode.type,`${this.Name}.${this.PCGNode.path}`,t.full))}})));let s=0,r=0;this.getCustomproperties().forEach(((e,t)=>{e.objectEntity=this,e.pinIndex=e.isInput()?s++:e.isOutput()?r++:t}));const n=this.ExportPath?.valueOf();if(n?.path.endsWith(this.Name?.valueOf())){const e=this.constructor.attributes.ExportPath,t=e.type,i=this.Name.valueOf().length;this.ExportPath=new e((()=>new t(n.type,n.path.substring(0,n.path.length-i)+this.Name,n.full)))}}static createGrammar(){return xe.seq(xe.reg(/Begin +Object/),xe.seq(xe.whitespace,xe.alt(this.createSubObjectGrammar(),this.customPropertyGrammar,Me.createAttributeGrammar(this,xe.reg(Me.Regex.MultipleWordsSymbols)),Me.createAttributeGrammar(this,Me.attributeNameQuoted,void 0,((e,t,i)=>{ae.objectSet(e,[...t,"quoted"],!0)})),this.inlinedArrayEntryGrammar)).map((([e,t])=>t)).many(),xe.reg(/\s+End +Object/)).map((([e,t,i])=>{const s={};return t.forEach((e=>e(s))),new this(s)})).label("ObjectEntity")}static createSubObjectGrammar(){return xe.lazy((()=>this.grammar)).map((e=>t=>{e.trailing=!1,t[ne.subObjectAttributeNameFromEntity(e)]=e}))}#j;getClass(){if(!this.#j&&(this.#j=(this.Class?.path?this.Class.path:this.Class?.type)??this.ExportPath?.valueOf()?.type??"",this.#j&&!this.#j.startsWith("/"))){let e=Object.values(ne.paths).find((e=>e.endsWith("."+this.#j)));e&&(this.#j=e)}return this.#j}getType(){let e=this.getClass();return this.MacroGraphReference?.MacroGraph?.path?this.MacroGraphReference.MacroGraph.path:this.MaterialExpression?this.MaterialExpression.type:e}getObjectName(e=!1){return e?this.getNameAndCounter()[0]:this.Name.toString()}getNameAndCounter(){const e=this.getObjectName().match(Et.#F);return e?[e[1]??"",parseInt(e[2]??"0")]:["",0]}getCounter(){return this.getNameAndCounter()[1]}getNodeWidth(){return this.NodeWidth??this.isComment()?ne.defaultCommentWidth:void 0}setNodeWidth(e){this.NodeWidth||(this.NodeWidth=new Fe),this.NodeWidth.value=e}getNodeHeight(){return this.NodeHeight??this.isComment()?ne.defaultCommentHeight:void 0}setNodeHeight(e){this.NodeHeight||(this.NodeHeight=new Fe),this.NodeHeight.value=e}getNodePosX(){return this.NodePosX?.value??0}setNodePosX(e){this.NodePosX||(this.NodePosX=new Fe),this.NodePosX.value=Math.round(e)}getNodePosY(){return this.NodePosY?.value??0}setNodePosY(e){this.NodePosY||(this.NodePosY=new Fe),this.NodePosY.value=Math.round(e)}getCustomproperties(e=!1){return this.CustomProperties.values}getPinEntities(){return this.getCustomproperties().filter((e=>e.constructor===gt))}getSubobjects(){return Object.keys(this).filter((e=>e.startsWith(ne.subObjectAttributeNamePrefix))).flatMap((e=>[this[e],...this[e].getSubobjects()]))}switchTarget(){const e=this.getClass().match(ne.switchTargetPattern);if(e)return e[1]}isEvent(){switch(this.getClass()){case ne.paths.actorBoundEvent:case ne.paths.componentBoundEvent:case ne.paths.customEvent:case ne.paths.event:case ne.paths.inputAxisKeyEvent:case ne.paths.inputVectorAxisEvent:return!0}return!1}isComment(){switch(this.getClass()){case ne.paths.comment:case ne.paths.materialGraphNodeComment:return!0}return!1}isMaterial(){return this.getClass()===ne.paths.materialGraphNode}getMaterialSubobject(){const e=this.MaterialExpression??this.MaterialExpressionComment;return e?this[ne.subObjectAttributeNameFromReference(e,!0)]:null}isPcg(){return this.getClass()===ne.paths.pcgEditorGraphNode||null!=this.getPcgSubobject()}isNiagara(){return this.Class&&(this.Class.type?this.Class.type:this.Class.path)?.startsWith("/Script/NiagaraEditor.")}getPcgSubobject(){const e=this.PCGNode;return e?this[ne.subObjectAttributeNameFromReference(e,!0)]:null}getSettingsObject(){const e=this.SettingsInterface;return e?this[ne.subObjectAttributeNameFromReference(e,!0)]:null}getSubgraphObject(){const e=this.SubgraphInstance;return e?this[ne.subObjectAttributeNameFromName(e)]:null}isDevelopmentOnly(){const e=this.getClass();return"DevelopmentOnly"===this.EnabledState?.toString()||e.includes("Debug",Math.max(0,e.lastIndexOf(".")))}getHIDAttribute(){return this.InputKey??this.AxisKey??this.InputAxisKey}getDelegatePin(){return this.getCustomproperties().find((e=>"delegate"===e.PinType.PinCategory.toString()))}nodeColor(){return function(e){switch(e.getType()){case ne.paths.materialExpressionConstant2Vector:case ne.paths.materialExpressionConstant3Vector:case ne.paths.materialExpressionConstant4Vector:return ne.nodeColors.yellow;case ne.paths.materialExpressionFunctionInput:case ne.paths.materialExpressionTextureCoordinate:case ne.paths.materialExpressionWorldPosition:case ne.paths.pcgEditorGraphNodeInput:case ne.paths.pcgEditorGraphNodeOutput:return ne.nodeColors.red;case ne.paths.makeStruct:return ne.nodeColors.darkBlue;case ne.paths.materialExpressionMaterialFunctionCall:return ne.nodeColors.blue;case ne.paths.materialExpressionTextureSample:return ne.nodeColors.darkTurquoise}switch(e.getClass()){case ne.paths.callFunction:return e.bIsPureFunc?.valueOf()?ne.nodeColors.green:ne.nodeColors.blue;case ne.paths.niagaraNodeFunctionCall:return ne.nodeColors.darkerBlue;case ne.paths.dynamicCast:return ne.nodeColors.turquoise;case ne.paths.inputDebugKey:case ne.paths.inputKey:return ne.nodeColors.red;case ne.paths.createDelegate:case ne.paths.enumLiteral:case ne.paths.makeArray:case ne.paths.makeMap:case ne.paths.materialGraphNode:case ne.paths.select:return ne.nodeColors.green;case ne.paths.executionSequence:case ne.paths.ifThenElse:case ne.paths.macro:case ne.paths.multiGate:return ne.nodeColors.gray;case ne.paths.functionEntry:case ne.paths.functionResult:return ne.nodeColors.violet;case ne.paths.timeline:return ne.nodeColors.yellow}if(e.switchTarget())return ne.nodeColors.lime;if(e.isEvent())return ne.nodeColors.red;if(e.isComment())return(e.CommentColor?e.CommentColor:Ie.getWhite()).toDimmedColor().toCSSRGBValues();const t=e.getPcgSubobject();if(t){if(t.NodeTitleColor)return t.NodeTitleColor.toDimmedColor(.1).toCSSRGBValues();switch(e.PCGNode?.getName(!0)){case"Branch":case"Select":return ne.nodeColors.intenseGreen}}return e.bIsPureFunc?.valueOf()?ne.nodeColors.green:ne.nodeColors.blue}(this)}nodeIcon(){return function(e){if(e.isMaterial()||e.isPcg()||e.isNiagara())return null;switch(e.getType()){case ne.paths.addDelegate:case ne.paths.asyncAction:case ne.paths.callDelegate:case ne.paths.createDelegate:case ne.paths.functionEntry:case ne.paths.functionResult:return le.node;case ne.paths.customEvent:return le.event;case ne.paths.doN:return le.doN;case ne.paths.doOnce:return le.doOnce;case ne.paths.dynamicCast:return le.cast;case ne.paths.enumLiteral:return le.enum;case ne.paths.event:return le.event;case ne.paths.executionSequence:case ne.paths.multiGate:return le.sequence;case ne.paths.flipflop:return le.flipflop;case ne.paths.forEachElementInEnum:case ne.paths.forLoop:case ne.paths.forLoopWithBreak:case ne.paths.whileLoop:return le.loop;case ne.paths.forEachLoop:case ne.paths.forEachLoopWithBreak:return le.forEachLoop;case ne.paths.ifThenElse:return le.branchNode;case ne.paths.isValid:return le.questionMark;case ne.paths.makeArray:return le.makeArray;case ne.paths.makeMap:return le.makeMap;case ne.paths.makeSet:return le.makeSet;case ne.paths.makeStruct:return le.makeStruct;case ne.paths.metasoundEditorGraphExternalNode:return le.metasoundFunction;case ne.paths.select:return le.select;case ne.paths.spawnActorFromClass:return le.spawnActor;case ne.paths.timeline:return le.timer}if(e.switchTarget())return le.switch;if(Ve(e).startsWith("Break"))return le.breakStruct;if(e.getClass()===ne.paths.macro)return le.macro;const t=e.getHIDAttribute()?.toString();return t?t.includes("Mouse")?le.mouse:t.includes("Gamepad_Special")?le.keyboard:t.includes("Gamepad")||t.includes("Steam")?le.gamepad:t.includes("Touch")?le.touchpad:le.keyboard:e.getDelegatePin()?le.event:e.ObjectRef?.type===ne.paths.ambientSound?le.sound:le.functionSymbol}(this)}additionalPinInserter(){return function(e){let t,i,s,r,n;switch(e.getType()){case ne.paths.commutativeAssociativeBinaryOperator:case ne.paths.promotableOperator:switch(n=e.FunctionReference?.MemberName?.toString(),n){default:if(!(n?.startsWith("Add_")||n?.startsWith("Subtract_")||n?.startsWith("Multiply_")||n?.startsWith("Divide_")))break;case"And_Int64Int64":case"And_IntInt":case"BMax":case"BMin":case"BooleanAND":case"BooleanNAND":case"BooleanOR":case"Concat_StrStr":case"FMax":case"FMin":case"Max":case"MaxInt64":case"Min":case"MinInt64":case"Or_Int64Int64":case"Or_IntInt":t??=()=>e.getPinEntities().filter((e=>e.isInput())),i??=bt,s??=(i,s=-1,r=-1)=>{const n=String.fromCharCode(i>=0?i:r+"A".charCodeAt(0)+1);return e.NumAdditionalInputs=new je(t().length-1),n}}break;case ne.paths.executionSequence:r??="Then";case ne.paths.multiGate:r??="Out",t??=()=>e.getPinEntities().filter((e=>e.isOutput())),i??=e=>Number(e.PinName?.toString().match(new RegExp(String.raw`^\s*${r}[_\s]+(\d+)\s*$`,"i"))?.[1]),s??=(e,t=-1,i=-1,s)=>`${r} ${e>=0?e:t>0?`${r} 0`:i+1}`;break;case ne.paths.switchInteger:t??=()=>e.getPinEntities().filter((e=>e.isOutput())),i??=e=>Number(e.PinName?.toString().match(/^\s*(\d+)\s*$/)?.[1]),s??=(e,t=-1,i=-1,s)=>(e<0?i+1:e).toString();break;case ne.paths.switchGameplayTag:s??=(t,i=-1,s=-1,r)=>{const n=`Case_${t>=0?t:i>0?"0":s+1}`;return e.PinNames??=new Re,e.PinNames.valueOf().push(new Xe(n)),delete e.PinTags.valueOf()[e.PinTags.length-1],e.PinTags.valueOf()[e.PinTags.length]=null,n};case ne.paths.switchName:case ne.paths.switchString:t??=()=>e.getPinEntities().filter((e=>e.isOutput())),i??=e=>Number(e.PinName.toString().match(/^\s*Case[_\s]+(\d+)\s*$/i)?.[1]),s??=(t,i=-1,s=-1,r)=>{const n=`Case_${t>=0?t:i>0?"0":s+1}`;return e.PinNames??=new Re,e.PinNames.valueOf().push(new Xe(n)),n}}if(t)return()=>{let r=Number.MAX_SAFE_INTEGER,n=Number.MIN_SAFE_INTEGER,a=[];const o=t().reduce(((e,t)=>{const s=i(t);if(isNaN(s)){if(void 0===e)return t}else if(a.push(s),r=Math.min(s,r),s>n)return n=s,t;return e}),void 0);if(r!==Number.MAX_SAFE_INTEGER&&n!==Number.MIN_SAFE_INTEGER||(r=void 0,n=void 0),!o)return null;a.sort(((e,t)=>e{const t=e-l>1;return l=e,t}));const c=new gt(o);return c.PinId=new ze,c.PinName=new Xe(s(u,r,n,c)),c.PinToolTip=void 0,c.DefaultValue&&(c.DefaultValue=new c.DefaultValue.constructor),e.getCustomproperties(!0).push(c),c}}(this)}showProperty(e){switch(e){case"Class":case"Name":case"Archetype":case"ExportPath":case"CustomProperties":return!1}return super.showProperty(e)}doSerialize(e=!1,t="",i=this.constructor,s=i.printKey,r=i.keySeparator,n=i.attributeSeparator,a=i.wrap){const o=t+ne.indentation,l=this.trailing;this.trailing=!1;const u=super.doSerialize(e,o,i,s,r,n,a);return this.trailing=l,t+"Begin Object"+(this.Class?.type||this.Class?.path?` Class${r}${this.Class.serialize(e)}`:"")+(this.Name?` Name${r}${this.Name.serialize(e)}`:"")+(this.Archetype?` Archetype${r}${this.Archetype.serialize(e)}`:"")+(this.ExportPath?.valueOf()?.type||this.ExportPath?.valueOf()?.path?` ExportPath${r}${this.ExportPath.serialize(e)}`:"")+(u?n+u:"")+(!0!==i.attributes.CustomProperties.ignored&&!0!==this.CustomProperties.ignored?this.getCustomproperties().map((t=>n+o+s("CustomProperties ")+t.serialize(e))).join(""):"")+n+t+"End Object"+(this.trailing?n:"")}}class Ct extends Et{constructor(e={},t=void 0){e.Class=new st(ne.paths.knot),e.Name=new Et.attributes.Name("K2Node_Knot");const i=new gt({PinName:new gt.attributes.PinName("InputPin")}),s=new gt({PinName:new gt.attributes.PinName("OutputPin"),Direction:new gt.attributes.Direction("EGPD_Output")});t&&(i.copyTypeFrom(t),s.copyTypeFrom(t)),e.CustomProperties=new Et.attributes.CustomProperties([i,s]),super(e)}}class Nt{#U;get target(){return this.#U}#e;get blueprint(){return this.#e}consumeEvent;options;listenHandler=()=>this.listenEvents();unlistenHandler=()=>this.unlistenEvents();constructor(e,t,i={}){i.consumeEvent??=!1,i.listenOnFocus??=!1,i.unlistenOnTextEdit??=!1,this.#U=e,this.#e=t,this.consumeEvent=i.consumeEvent,this.options=i}setup(){this.options.listenOnFocus&&(this.blueprint.addEventListener(ne.focusEventName.begin,this.listenHandler),this.blueprint.addEventListener(ne.focusEventName.end,this.unlistenHandler)),this.options.unlistenOnTextEdit&&(this.blueprint.addEventListener(ne.editTextEventName.begin,this.unlistenHandler),this.blueprint.addEventListener(ne.editTextEventName.end,this.listenHandler)),this.blueprint.focused&&this.listenEvents()}cleanup(){this.unlistenEvents(),this.blueprint.removeEventListener(ne.focusEventName.begin,this.listenHandler),this.blueprint.removeEventListener(ne.focusEventName.end,this.unlistenHandler),this.blueprint.removeEventListener(ne.editTextEventName.begin,this.unlistenHandler),this.blueprint.removeEventListener(ne.editTextEventName.end,this.listenHandler)}listenEvents(){}unlistenEvents(){}}class xt extends Pe{static attributes={...super.attributes,ActionName:Xe,bShift:ke,bCtrl:ke,bAlt:ke,bCmd:ke,Key:Ze};static grammar=this.createGrammar();constructor(e){super(e),this.ActionName,this.bShift,this.bCtrl,this.bAlt,this.bCmd,this.Key}static createGrammar(){return xe.alt(Ze.grammar.map((e=>new this({Key:e}))),Me.createEntityGrammar(this))}}class Pt extends Nt{static#Y=e=>{};#K;pressedKey="";constructor(e,t,i={},s=Pt.#Y,r=Pt.#Y){i.activationKeys??=[],i.consumeEvent??=!0,i.listenOnFocus??=!0,i.unlistenOnTextEdit??=!0,i.activationKeys instanceof Array||(i.activationKeys=[i.activationKeys]),i.activationKeys=i.activationKeys.map((e=>{if(e instanceof xt)return e;if(e.constructor===String){const t=xt.grammar.run(e);if(t.status)return t.value}throw new Error("Unexpected key value")})),super(e,t,i),this.onKeyDown=s,this.onKeyUp=r,this.#K=this.options.activationKeys??[];let n=this;this.keyDownHandler=e=>{n.#K.some((t=>(e=>e.bShift?.valueOf()||"LeftShift"==e.Key.valueOf()||"RightShift"==e.Key.valueOf())(t)==e.shiftKey&&(e=>e.bCtrl?.valueOf()||"LeftControl"==e.Key.valueOf()||"RightControl"==e.Key.valueOf())(t)==e.ctrlKey&&(e=>e.bAlt?.valueOf()||"LeftAlt"==e.Key.valueOf()||"RightAlt"==e.Key.valueOf())(t)==e.altKey&&ne.Keys[t.Key.value]==e.code))&&(this.consumeEvent&&(e.preventDefault(),e.stopImmediatePropagation()),this.pressedKey=e.code,n.fire(),document.removeEventListener("keydown",n.keyDownHandler),document.addEventListener("keyup",n.keyUpHandler))},this.keyUpHandler=e=>{n.#K.some((t=>t.bShift?.valueOf()&&"Shift"==e.key||t.bCtrl?.valueOf()&&"Control"==e.key||t.bAlt?.valueOf()&&"Alt"==e.key||t.bCmd?.valueOf()&&"Meta"==e.key||ne.Keys[t.Key.value]==e.code))&&(this.consumeEvent&&e.stopImmediatePropagation(),n.unfire(),this.pressedKey="",document.removeEventListener("keyup",this.keyUpHandler),document.addEventListener("keydown",this.keyDownHandler))}}listenEvents(){document.addEventListener("keydown",this.keyDownHandler)}unlistenEvents(){document.removeEventListener("keydown",this.keyDownHandler)}fire(){this.onKeyDown(this)}unfire(){this.onKeyUp(this)}}class kt extends Nt{#X=[0,0];get location(){return this.#X}#q;get enablerKey(){return this.#q}#Z=!0;get enablerActivated(){return this.#Z}constructor(e,t,i={}){i.ignoreTranslateCompensate??=!1,i.ignoreScale??=!1,i.movementSpace??=t.getGridDOMElement()??document.documentElement,super(e,t,i),this.movementSpace=i.movementSpace,i.enablerKey&&(this.#q=i.enablerKey,this.#q.onKeyDown=()=>this.#Z=!0,this.#q.onKeyUp=()=>this.#Z=!1,this.#q.consumeEvent=!1,this.#q.listenEvents(),this.#Z=!1)}setLocationFromEvent(e){let t=ae.convertLocation([e.clientX,e.clientY],this.movementSpace,this.options.ignoreScale);return t=this.options.ignoreTranslateCompensate?t:this.blueprint.compensateTranslation(t[0],t[1]),this.#X=[...t],this.#X}}class At extends kt{static#Y=e=>{};#W=e=>{if(this.blueprint.setFocused(!0),!this.enablerKey||this.enablerActivated)if(e.button===this.options.clickButton)this.options.strictTarget&&e.target!==e.currentTarget||(this.consumeEvent&&e.stopImmediatePropagation(),document.addEventListener("mouseup",this.#Q),this.setLocationFromEvent(e),this.clickedPosition[0]=this.location[0],this.clickedPosition[1]=this.location[1],this.blueprint.mousePosition[0]=this.location[0],this.blueprint.mousePosition[1]=this.location[1],this.clicked(this.clickedPosition));else this.options.exitAnyButton||this.#Q(e)};#Q=e=>{this.options.exitAnyButton&&e.button!=this.options.clickButton||(this.consumeEvent&&e.stopImmediatePropagation(),document.removeEventListener("mouseup",this.#Q),this.unclicked())};clickedPosition=[0,0];constructor(e,t,i={},s=At.#Y,r=At.#Y){i.clickButton??=ne.mouseClickButton,i.consumeEvent??=!0,i.exitAnyButton??=!0,i.strictTarget??=!1,super(e,t,i),this.onClick=s,this.onUnclick=r,this.listenEvents()}listenEvents(){this.target.addEventListener("mousedown",this.#W),this.options.clickButton===ne.mouseRightClickButton&&this.target.addEventListener("contextmenu",(e=>e.preventDefault()))}unlistenEvents(){this.target.removeEventListener("mousedown",this.#W)}clicked(e){this.onClick(this)}unclicked(e){this.onUnclick(this)}}class Lt extends kt{static ignoreDbClick=e=>{};#J=e=>{this.options.strictTarget&&e.target!==e.currentTarget||(this.consumeEvent&&e.stopImmediatePropagation(),this.clickedPosition=this.setLocationFromEvent(e),this.blueprint.mousePosition=[...this.clickedPosition],this.dbclicked(this.clickedPosition))};#ee;get onDbClick(){return this.#ee}set onDbClick(e){this.#ee=e}clickedPosition=[0,0];constructor(e,t,i={},s=Lt.ignoreDbClick){i.consumeEvent??=!0,i.strictTarget??=!1,super(e,t,i),this.#ee=s,this.listenEvents()}listenEvents(){this.target.addEventListener("dblclick",this.#J)}unlistenEvents(){this.target.removeEventListener("dblclick",this.#J)}dbclicked(e){this.onDbClick(e)}}class Mt{static deleteNodes="Delete";static duplicateNodes="(bCtrl=True,Key=D)";static enableLinkDelete="LeftAlt";static enableZoomIn=["LeftControl","RightControl"];static selectAllNodes="(bCtrl=True,Key=A)"}class Tt{element;get blueprint(){return this.element.blueprint}#te=[];get inputObjects(){return this.#te}initialize(e){this.element=e}createInputObjects(){return[]}setup(){this.#te.forEach((e=>e.setup()))}cleanup(){this.#te.forEach((e=>e.cleanup()))}willUpdate(e){}update(e){}render(){return G``}firstUpdated(e){}updated(e){}inputSetup(){this.#te=this.createInputObjects()}}class It extends Tt{update(e){super.update(e);const[t,i,s,r]=[Math.round(this.element.fromX),Math.round(this.element.fromY),Math.round(this.element.toX),Math.round(this.element.toY)],[n,a,o,l]=[Math.min(t,s),Math.min(i,r),Math.abs(t-s),Math.abs(i-r)];(e.has("fromX")||e.has("toX"))&&(this.element.style.left=`${n}px`,this.element.style.width=`${o}px`),(e.has("fromY")||e.has("toY"))&&(this.element.style.top=`${a}px`,this.element.style.height=`${l}px`)}}class Ot extends It{static sigmoidPositive(e,t=3.7,i=1.1){return 1-Math.exp(-((e/i)**t))}static decreasingValue(e,t){const i=-e*t[0]**2,s=t[1]-i/t[0];return e=>i/e+s}static clampedLine(e,t){if(e[0]>t[0]){const i=e;e=t,t=i}const i=(t[1]-e[1])/(t[0]-e[0]),s=e[1]-i*e[0];return r=>rt[0]?t[1]:i*r+s}static c1DecreasingValue=Ot.decreasingValue(-.15,[100,15]);static c2DecreasingValue=Ot.decreasingValue(-.05,[500,130]);static c2Clamped=Ot.clampedLine([0,80],[200,40]);#ie=`ueb-id-${Math.floor(1e12*Math.random())}`;#se=e=>{const t=new Ct({},this.element.source.entity),i=Ae.getConstructor("ueb-node").newObject(t);i.setLocation(...this.blueprint.snapToGrid(...e));const s=i.template;this.blueprint.addGraphElement(i);const r=this.element.getInputPin(),n=this.element.getOutputPin();this.element.source=null,this.element.destination=null;const a=Ae.getConstructor("ueb-link").newObject(n,s.inputPin);this.blueprint.addGraphElement(a),this.element.source=s.outputPin,this.element.destination=r};createInputObjects(){const e=this.element.querySelector(".ueb-link-area");return[...super.createInputObjects(),new Lt(e,this.blueprint,void 0,(e=>{e[0]+=ne.knotOffset[0],e[1]+=ne.knotOffset[1],e=ae.snapToGrid(e[0],e[1],ne.gridSize),this.#se(e)})),new At(e,this.blueprint,{enablerKey:new Pt(this.blueprint,this.blueprint,{activationKeys:Mt.enableLinkDelete})},(()=>this.blueprint.removeGraphElement(this.element)))]}willUpdate(e){super.willUpdate(e);const t=this.element.source,i=this.element.destination;if(e.has("fromX")||e.has("toX")){const e=this.element.fromX,s=this.element.toX,r=t?.nodeElement.getType()==ne.paths.knot,n=i?.nodeElement.getType()==ne.paths.knot;!r||i&&!n||(t?.isInput()&&s>e+ne.distanceThreshold?this.element.source=t.nodeElement.template.outputPin:t?.isOutput()&&se+ne.distanceThreshold&&(this.element.destination=i.nodeElement.template.inputPin))}const s=Math.max(Math.abs(this.element.fromX-this.element.toX),1),r=Math.max(Math.abs(this.element.fromY-this.element.toY),1),n=Math.max(s,ne.linkMinWidth),a=s/n,o=this.element.originatesFromInput?this.element.fromXthis.element.toY?1:0)),this.element.style.setProperty("--ueb-start-percentage",`${Math.round(this.element.startPercentage)}%`),this.element.style.setProperty("--ueb-link-start",`${Math.round(this.element.startPixels)}`)}render(){return G` ${this.element.linkMessageIcon||this.element.linkMessageText?G``:V}`}}class $t extends oe{static properties={...super.properties,fromX:{type:Number,attribute:!1},fromY:{type:Number,attribute:!1},toX:{type:Number,attribute:!1},toY:{type:Number,attribute:!1}};constructor(){super(),this.fromX=0,this.fromY=0,this.toX=0,this.toY=0}setBothLocations([e,t]){this.fromX=e,this.fromY=t,this.toX=e,this.toY=t}addSourceLocation(e,t){this.fromX+=e,this.fromY+=t}addDestinationLocation(e,t){this.toX+=e,this.toY+=t}}class Dt extends $t{static properties={...super.properties,dragging:{type:Boolean,attribute:"data-dragging",converter:ke.booleanConverter,reflect:!0},originatesFromInput:{type:Boolean,attribute:!1},svgPathD:{type:String,attribute:!1},linkMessageIcon:{type:String,attribute:!1},linkMessageText:{type:String,attribute:!1}};#re;get source(){return this.#re}set source(e){this.#ne(e,!1)}#ae;get destination(){return this.#ae}set destination(e){this.#ne(e,!0)}#oe=()=>this.remove();#le=e=>this.addSourceLocation(...e.detail.value);#ue=e=>this.addDestinationLocation(...e.detail.value);#ce=e=>this.setSourceLocation();#he=e=>this.setDestinationLocation();linkMessageIcon=V;linkMessageText=V;pathElement;constructor(){super(),this.dragging=!1,this.originatesFromInput=!1,this.startPercentage=0,this.svgPathD="",this.startPixels=0}static newObject(e,t){const i=new Dt;return i.initialize(e,t),i}initialize(e,t){super.initialize({},new Ot),e&&(this.source=e,t||(this.toX=this.fromX,this.toY=this.fromY)),t&&(this.destination=t,e||(this.fromX=this.toX,this.fromY=this.toY))}#ne(e,t){const i=()=>t?this.destination:this.source;if(i()!=e){if(i()){const e=i().getNodeElement();e.removeEventListener(ne.removeEventName,this.#oe),e.removeEventListener(ne.nodeDragEventName,t?this.#ue:this.#le),e.removeEventListener(ne.nodeReflowEventName,t?this.#he:this.#ce),this.#pe()}if(t?this.#ae=e:this.#re=e,i()){const e=i().getNodeElement();e.addEventListener(ne.removeEventName,this.#oe),e.addEventListener(ne.nodeDragEventName,t?this.#ue:this.#le),e.addEventListener(ne.nodeReflowEventName,t?this.#he:this.#ce),t?this.setDestinationLocation():(this.setSourceLocation(),this.originatesFromInput=this.source.isInput()),this.#de()}}}#de(){this.source&&this.destination&&(this.source.linkTo(this.destination),this.destination.linkTo(this.source))}#pe(){this.source&&this.destination&&(this.source.unlinkFrom(this.destination,!1),this.destination.unlinkFrom(this.source,!1))}cleanup(){super.cleanup(),this.#pe(),this.source=null,this.destination=null}setSourceLocation(e=null,t=!0){if(null==e){const i=this;if(t&&(!this.hasUpdated||!this.source.hasUpdated))return void Promise.all([this.updateComplete,this.source.updateComplete]).then((()=>i.setSourceLocation(null,!1)));e=this.source.template.getLinkLocation()}const[i,s]=e;this.fromX=i,this.fromY=s}setDestinationLocation(e=null,t=!0){if(null==e){const i=this;if(t&&(!this.hasUpdated||!this.destination.hasUpdated))return void Promise.all([this.updateComplete,this.destination.updateComplete]).then((()=>i.setDestinationLocation(null,!1)));e=this.destination.template.getLinkLocation()}this.toX=e[0],this.toY=e[1]}getInputPin(e=!1){return this.source?.isInput()?this.source:this.destination?.isInput()?this.destination:e?this.source??this.destination:void 0}setInputPin(e){this.source?.isInput()&&(this.source=e),this.destination=e}getOutputPin(e=!1){return this.source?.isOutput()?this.source:this.destination?.isOutput()?this.destination:e?this.source??this.destination:void 0}setOutputPin(e){this.destination?.isOutput()&&(this.destination=e),this.source=e}startDragging(){this.dragging=!0}finishDragging(){this.dragging=!1}removeMessage(){this.linkMessageIcon=V,this.linkMessageText=V}setMessageConvertType(){this.linkMessageIcon=le.convert,this.linkMessageText=G`Convert ${this.source.pinType} to ${this.destination.pinType}.`}setMessageCorrect(){this.linkMessageIcon=le.correct,this.linkMessageText=V}setMessageReplace(){this.linkMessageIcon=le.correct,this.linkMessageText=V}setMessageDirectionsIncompatible(){this.linkMessageIcon=le.reject,this.linkMessageText=G`Directions are not compatbile.`}setMessagePlaceNode(){this.linkMessageIcon=V,this.linkMessageText=G`Place a new node.`}setMessageReplaceLink(){this.linkMessageIcon=le.correct,this.linkMessageText=G`Replace existing input connections.`}setMessageReplaceOutputLink(){this.linkMessageIcon=le.correct,this.linkMessageText=G`Replace existing output connections.`}setMessageSameNode(){this.linkMessageIcon=le.reject,this.linkMessageText=G`Both are on the same node.`}setMessageTypesIncompatible(e,t){this.linkMessageIcon=le.reject,this.linkMessageText=G`${ae.capitalFirstLetter(e.pinType)} is not compatible with ${ae.capitalFirstLetter(t.pinType)}.`}}class Bt extends oe{static properties={...super.properties,locationX:{type:Number,attribute:!1},locationY:{type:Number,attribute:!1},sizeX:{type:Number,attribute:!1},sizeY:{type:Number,attribute:!1}};static dragEventName=ne.dragEventName;static dragGeneralEventName=ne.dragGeneralEventName;constructor(){super(),this.locationX=0,this.locationY=0,this.sizeX=0,this.sizeY=0}computeSizes(){const e=this.getBoundingClientRect();this.sizeX=this.blueprint.scaleCorrect(e.width),this.sizeY=this.blueprint.scaleCorrect(e.height)}firstUpdated(e){super.firstUpdated(e),this.computeSizes()}setLocation(e,t,i=!0){const s=e-this.locationX,r=t-this.locationY;if(this.locationX=e,this.locationY=t,this.blueprint&&i){const e=new CustomEvent(this.constructor.dragEventName,{detail:{value:[s,r]},bubbles:!1,cancelable:!0});this.dispatchEvent(e)}}addLocation(e,t,i=!0){this.setLocation(this.locationX+e,this.locationY+t,i)}acknowledgeDrag(e){const t=new CustomEvent(this.constructor.dragGeneralEventName,{detail:{value:e},bubbles:!0,cancelable:!0});this.dispatchEvent(t)}snapToGrid(){const e=ae.snapToGrid(this.locationX,this.locationY,ne.gridSize);this.locationX==e[0]&&this.locationY==e[1]||this.setLocation(e[0],e[1])}topBoundary(e=!1){return this.template.topBoundary(e)}rightBoundary(e=!1){return this.template.rightBoundary(e)}bottomBoundary(e=!1){return this.template.bottomBoundary(e)}leftBoundary(e=!1){return this.template.leftBoundary(e)}}class Gt extends kt{#W=e=>{if(this.blueprint.setFocused(!0),e.button===this.options.clickButton)this.options.strictTarget&&e.target!=e.currentTarget||(this.consumeEvent&&e.stopImmediatePropagation(),this.#me.addEventListener("mousemove",this.#ge),document.addEventListener("mouseup",this.#Q),this.setLocationFromEvent(e),this.clickedPosition[0]=this.location[0],this.clickedPosition[1]=this.location[1],this.blueprint.mousePosition[0]=this.location[0],this.blueprint.mousePosition[1]=this.location[1],this.target instanceof Bt&&(this.clickedOffset=[this.clickedPosition[0]-this.target.locationX,this.clickedPosition[1]-this.target.locationY]),this.clicked(this.clickedPosition));else this.options.exitAnyButton||this.#Q(e)};#ge=e=>{this.consumeEvent&&e.stopImmediatePropagation(),this.#me.removeEventListener("mousemove",this.#ge),this.#me.addEventListener("mousemove",this.#be);const t=this.getEvent(ne.trackingMouseEventName.begin);this.#ve=0==this.target.dispatchEvent(t),this.setLocationFromEvent(e),this.lastLocation=ae.snapToGrid(this.clickedPosition[0],this.clickedPosition[1],this.stepSize),this.startDrag(this.location),this.started=!0,this.#be(e)};#be=e=>{this.consumeEvent&&e.stopImmediatePropagation();const t=this.setLocationFromEvent(e),i=[e.movementX,e.movementY];if(this.dragTo(t,i),this.#ve&&(this.blueprint.mousePosition=t),this.options.scrollGraphEdge){const e=Math.sqrt(i[0]*i[0]+i[1]*i[1]),s=this.blueprint.scaleCorrect(ne.edgeScrollThreshold),r=this.blueprint.template.gridLeftVisibilityBoundary()+s,n=this.blueprint.template.gridRightVisibilityBoundary()-s;let a=0;t[0]n&&(a=t[0]-n);const o=this.blueprint.template.gridTopVisibilityBoundary()+s,l=this.blueprint.template.gridBottomVisibilityBoundary()-s;let u=0;t[1]l&&(u=t[1]-l),a=ae.clamp(this.blueprint.scaleCorrectReverse(a)**3*e*.6,-20,20),u=ae.clamp(this.blueprint.scaleCorrectReverse(u)**3*e*.6,-20,20),this.blueprint.scrollDelta(a,u)}};#Q=e=>{if(!this.options.exitAnyButton||e.button==this.options.clickButton){if(this.consumeEvent&&e.stopImmediatePropagation(),this.#me.removeEventListener("mousemove",this.#ge),this.#me.removeEventListener("mousemove",this.#be),document.removeEventListener("mouseup",this.#Q),this.started&&this.endDrag(),this.unclicked(),this.#ve){const e=this.getEvent(ne.trackingMouseEventName.end);this.target.dispatchEvent(e),this.#ve=!1}this.started=!1}};#ve=!1;#me;#fe;get draggableElement(){return this.#fe}clickedOffset=[0,0];clickedPosition=[0,0];lastLocation=[0,0];started=!1;stepSize=1;constructor(e,t,i={}){i.clickButton??=ne.mouseClickButton,i.consumeEvent??=!0,i.draggableElement??=e,i.exitAnyButton??=!0,i.moveEverywhere??=!1,i.movementSpace??=t?.getGridDOMElement(),i.repositionOnClick??=!1,i.scrollGraphEdge??=!1,i.strictTarget??=!1,super(e,t,i),this.stepSize=Number(i.stepSize??ne.gridSize),this.#me=this.options.moveEverywhere?document.documentElement:this.movementSpace,this.#fe=this.options.draggableElement,this.listenEvents()}listenEvents(){super.listenEvents(),this.#fe.addEventListener("mousedown",this.#W),this.options.clickButton===ne.mouseRightClickButton&&this.#fe.addEventListener("contextmenu",(e=>e.preventDefault()))}unlistenEvents(){super.unlistenEvents(),this.#fe.removeEventListener("mousedown",this.#W)}getEvent(e){return new CustomEvent(e,{detail:{tracker:this},bubbles:!0,cancelable:!0})}clicked(e){}startDrag(e){}dragTo(e,t){}endDrag(){}unclicked(e){}}class Ht extends Gt{clicked(e){this.options.repositionOnClick&&(this.target.setLocation(...this.stepSize>1?ae.snapToGrid(e[0],e[1],this.stepSize):e),this.clickedOffset=[0,0])}dragTo(e,t){const i=[this.target.locationX??this.lastLocation[0],this.target.locationY??this.lastLocation[1]],[s,r]=this.stepSize>1?[ae.snapToGrid(e[0],e[1],this.stepSize),ae.snapToGrid(i[0],i[1],this.stepSize)]:[e,i];0==(t=[s[0]-this.lastLocation[0],s[1]-this.lastLocation[1]])[0]&&0==t[1]||(t[0]+=r[0]-i[0],t[1]+=r[1]-i[1],this.dragAction(s,t),this.lastLocation=s)}dragAction(e,t){this.target.setLocation(e[0]-this.clickedOffset[0],e[1]-this.clickedOffset[1])}}class Vt extends Ht{#ye;#we;#Se;#Ee;constructor(e,t,i={}){super(e,t,i),i.onClicked&&(this.#ye=i.onClicked),i.onStartDrag&&(this.#we=i.onStartDrag),i.onDrag&&(this.#Se=i.onDrag),i.onEndDrag&&(this.#Ee=i.onEndDrag)}clicked(e){super.clicked(e),this.#ye?.()}startDrag(){super.startDrag(),this.#we?.()}dragAction(e,t){this.#Se?.(e,t)}endDrag(){super.endDrag(),this.#Ee?.()}}class Rt extends Ht{constructor(e,t,i={}){super(e,t,i),this.draggableElement.classList.add("ueb-draggable")}startDrag(){this.target.selected||(this.blueprint.unselectAll(),this.target.setSelected(!0))}dragAction(e,t){this.target.acknowledgeDrag(t)}unclicked(){this.started?(this.blueprint.getNodes(!0).forEach((e=>e.boundComments.filter((t=>!e.isInsideComment(t))).forEach((t=>e.unbindFromComment(t))))),this.blueprint.getCommentNodes().forEach((e=>e.template.manageNodesBind()))):(this.blueprint.unselectAll(),this.target.setSelected(!0))}}class _t extends Tt{getDraggableElement(){return this.element}createDraggableObject(){const e=this.getDraggableElement();return new Ht(this.element,this.blueprint,{draggableElement:e})}createInputObjects(){return[...super.createInputObjects(),this.createDraggableObject(),new Pt(this.element,this.blueprint,{activationKeys:[ne.Keys.ArrowUp,ne.Keys.ArrowRight,ne.Keys.ArrowDown,ne.Keys.ArrowLeft]},(e=>e.target.acknowledgeDrag([e.pressedKey===ne.Keys.ArrowLeft?-ne.gridSize:e.pressedKey===ne.Keys.ArrowRight?ne.gridSize:0,e.pressedKey===ne.Keys.ArrowUp?-ne.gridSize:e.pressedKey===ne.Keys.ArrowDown?ne.gridSize:0])))]}topBoundary(e=!1){return this.element.locationY}rightBoundary(e=!1){return this.element.locationX+this.element.sizeX}bottomBoundary(e=!1){return this.element.locationY+this.element.sizeY}leftBoundary(e=!1){return this.element.locationX}centerInViewport(){const e=Math.min(this.blueprint.template.viewportSize[0]/10,this.blueprint.template.viewportSize[1]/10),t=this.leftBoundary()-this.blueprint.template.gridLeftVisibilityBoundary(),i=this.blueprint.template.gridRightVisibilityBoundary()-this.rightBoundary();let s=Math.max((t+i)/2,e);const r=this.topBoundary()-this.blueprint.template.gridTopVisibilityBoundary(),n=this.blueprint.template.gridBottomVisibilityBoundary()-this.bottomBoundary();let a=Math.max((r+n)/2,e);this.blueprint.scrollDelta(t-s,r-a,!0)}}class zt extends _t{update(e){super.update(e),e.has("locationX")&&(this.element.style.left=`${this.element.locationX}px`),e.has("locationY")&&(this.element.style.top=`${this.element.locationY}px`)}}class Ft extends zt{getDraggableElement(){return this.element}createDraggableObject(){return new Rt(this.element,this.blueprint,{draggableElement:this.getDraggableElement(),scrollGraphEdge:!0})}firstUpdated(e){super.firstUpdated(e),this.element.selected&&!this.element.listeningDrag&&this.element.setSelected(!0)}}class jt extends Ft{static nodeStyleClasses=["ueb-node-style-default"];#Ce=!1;pinInserter;inputContainer;outputContainer;pinElement;addPinHandler=()=>{const e=this.pinInserter?.();e&&(this.defaultPin&&this.defaultPin.isInput()===e.isInput()?this.defaultPin.before(this.createPinElement(e)):(e.isInput()?this.inputContainer:this.outputContainer).appendChild(this.createPinElement(e)),this.element.acknowledgeReflow())};toggleAdvancedDisplayHandler=()=>{this.element.toggleShowAdvancedPinDisplay(),this.element.requestUpdate(),this.element.updateComplete.then((()=>this.element.acknowledgeReflow()))};createPinElement(e){const t=Ae.getConstructor("ueb-pin").newObject(e,void 0,this.element);return this.pinInserter&&!this.defaultPin&&"Default"===t.getPinName()&&(this.defaultPin=t,this.defaultPin.classList.add("ueb-node-variadic-default")),t}initialize(e){super.initialize(e),this.element.classList.add(...this.constructor.nodeStyleClasses),this.element.style.setProperty("--ueb-node-color",this.getColor().cssText),this.pinInserter=this.element.entity.additionalPinInserter(),this.pinInserter&&this.element.classList.add("ueb-node-is-variadic")}getColor(){return this.element.entity.nodeColor()}render(){return G`
${this.renderTop()}
${this.pinInserter?G`
Add pin ${le.plusCircle}
`:V} ${this.element.entity.isDevelopmentOnly()?G`
Development Only
`:V} ${this.element.advancedPinDisplay?G`
${le.expandIcon}
`:V}
`}renderNodeIcon(){return this.element.entity.nodeIcon()}renderNodeName(){return this.element.nodeDisplayName}renderTop(){const e=this.renderNodeIcon(),t=this.renderNodeName();return G`
${e?G`
${e}
`:V} ${t?G`
${t} ${this.#Ce&&this.getTargetType().length>0?G`
Target is ${ae.formatStringName(this.getTargetType())}
`:V}
`:V}
`}firstUpdated(e){super.firstUpdated(e),this.inputContainer=this.element.querySelector(".ueb-node-inputs"),this.outputContainer=this.element.querySelector(".ueb-node-outputs"),this.setupPins(),this.element.updateComplete.then((()=>this.element.acknowledgeReflow()))}setupPins(){this.element.nodeNameElement=this.element.querySelector(".ueb-node-name-text");let e=!1,t=!1;for(const i of this.element.getPinElements())i!==this.defaultPin&&(i.isInput()?(this.inputContainer.appendChild(i),e=!0):i.isOutput()&&(this.outputContainer.appendChild(i),t=!0));this.defaultPin&&(this.defaultPin.isInput()?this.inputContainer:this.outputContainer).appendChild(this.defaultPin),e&&this.element.classList.add("ueb-node-has-inputs"),t&&this.element.classList.add("ueb-node-has-outputs")}createPinElements(){return this.element.getPinEntities().filter((e=>!e.isHidden())).map((e=>(this.#Ce=this.#Ce||"self"===e.PinName.toString()&&"Target"===e.pinTitle(),this.createPinElement(e))))}getTargetType(){return this.element.entity.FunctionReference?.MemberParent?.getName()??"Untitled"}getPinElements(e){return e.querySelectorAll("ueb-pin")}linksChanged(){}}class Ut extends jt{#Ne=document.createElement("div");#xe=document.createElement("div");#Pe=document.createElement("div");#ke=document.createElement("div");#Ae=document.createElement("div");#Le=document.createElement("div");#Me=document.createElement("div");#Te=document.createElement("div");initialize(e){super.initialize(e),this.element.classList.add("ueb-resizeable"),this.#Ne.classList.add("ueb-resizeable-top"),this.#xe.classList.add("ueb-resizeable-right"),this.#Pe.classList.add("ueb-resizeable-bottom"),this.#ke.classList.add("ueb-resizeable-left"),this.#Ae.classList.add("ueb-resizeable-top-right"),this.#Le.classList.add("ueb-resizeable-bottom-right"),this.#Me.classList.add("ueb-resizeable-bottom-left"),this.#Te.classList.add("ueb-resizeable-top-left")}update(e){super.update(e),this.element.sizeX>=0&&e.has("sizeX")&&(this.element.style.width=`${this.element.sizeX}px`),this.element.sizeY>=0&&e.has("sizeY")&&(this.element.style.height=`${this.element.sizeY}px`)}firstUpdated(e){super.firstUpdated(e),this.element.append(this.#Ne,this.#xe,this.#Pe,this.#ke,this.#Ae,this.#Le,this.#Me,this.#Te)}createInputObjects(){return[...super.createInputObjects(),new Vt(this.#Ne,this.blueprint,{onDrag:(e,t)=>{t[1]=e[1]-this.element.topBoundary(),this.setSizeY(this.element.sizeY-t[1])&&this.element.addLocation(0,t[1],!1)},onEndDrag:()=>this.endResize()}),new Vt(this.#xe,this.blueprint,{onDrag:(e,t)=>{t[0]=e[0]-this.element.rightBoundary(),this.setSizeX(this.element.sizeX+t[0])},onEndDrag:()=>this.endResize()}),new Vt(this.#Pe,this.blueprint,{onDrag:(e,t)=>{t[1]=e[1]-this.element.bottomBoundary(),this.setSizeY(this.element.sizeY+t[1])},onEndDrag:()=>this.endResize()}),new Vt(this.#ke,this.blueprint,{onDrag:(e,t)=>{t[0]=e[0]-this.element.leftBoundary(),this.setSizeX(this.element.sizeX-t[0])&&this.element.addLocation(t[0],0,!1)},onEndDrag:()=>this.endResize()}),new Vt(this.#Ae,this.blueprint,{onDrag:(e,t)=>{t[0]=e[0]-this.element.rightBoundary(),t[1]=e[1]-this.element.topBoundary(),this.setSizeX(this.element.sizeX+t[0]),this.setSizeY(this.element.sizeY-t[1])&&this.element.addLocation(0,t[1],!1)},onEndDrag:()=>this.endResize()}),new Vt(this.#Le,this.blueprint,{onDrag:(e,t)=>{t[0]=e[0]-this.element.rightBoundary(),t[1]=e[1]-this.element.bottomBoundary(),this.setSizeX(this.element.sizeX+t[0]),this.setSizeY(this.element.sizeY+t[1])},onEndDrag:()=>this.endResize()}),new Vt(this.#Me,this.blueprint,{onDrag:(e,t)=>{t[0]=e[0]-this.element.leftBoundary(),t[1]=e[1]-this.element.bottomBoundary(),this.setSizeX(this.element.sizeX-t[0])&&this.element.addLocation(t[0],0,!1),this.setSizeY(this.element.sizeY+t[1])},onEndDrag:()=>this.endResize()}),new Vt(this.#Te,this.blueprint,{onDrag:(e,t)=>{t[0]=e[0]-this.element.leftBoundary(),t[1]=e[1]-this.element.topBoundary(),this.setSizeX(this.element.sizeX-t[0])&&this.element.addLocation(t[0],0,!1),this.setSizeY(this.element.sizeY-t[1])&&this.element.addLocation(0,t[1],!1)},onEndDrag:()=>this.endResize()})]}setSizeX(e){return this.element.setNodeWidth(e),!0}setSizeY(e){return this.element.setNodeHeight(e),!0}endResize(){}}class Yt extends Ut{#Ie=0;initialize(e){super.initialize(e),e.classList.add("ueb-node-style-comment","ueb-node-resizeable"),e.sizeX=25*ne.gridSize,e.sizeY=6*ne.gridSize,super.initialize(e)}getDraggableElement(){return this.element.querySelector(".ueb-node-top")}render(){return G`
`}firstUpdated(e){super.firstUpdated(e);const t=this.getDraggableElement().getBoundingClientRect();this.#Ie=t.height}manageNodesBind(){let e=this.blueprint.getNodes();for(let t of e)t.topBoundary()>=this.element.topBoundary()&&t.rightBoundary()<=this.element.rightBoundary()&&t.bottomBoundary()<=this.element.bottomBoundary()&&t.leftBoundary()>=this.element.leftBoundary()?t.bindToComment(this.element):t.unbindFromComment(this.element)}setSizeX(e){return(e=Math.round(e))>=2*ne.gridSize&&(this.element.setNodeWidth(e),!0)}setSizeY(e){return(e=Math.round(e))>=2*ne.gridSize&&(this.element.setNodeHeight(e),!0)}endResize(){this.manageNodesBind()}topBoundary(e=!1){return this.element.locationY}rightBoundary(e=!1){return this.element.locationX+this.element.sizeX}bottomBoundary(e=!1){return e?this.element.locationY+this.#Ie:super.bottomBoundary()}leftBoundary(e=!1){return this.element.locationX}}class Kt extends Gt{#Oe;#$e=null;#De=e=>{if(!this.enteredPin){this.linkValid=!1,this.enteredPin=e.target;const t=this.link.source??this.target,i=this.enteredPin,s=t.isOutput()?t:i;t.nodeElement.getType()===ne.paths.knot||i.nodeElement.getType()===ne.paths.knot?(this.link.setMessageCorrect(),this.linkValid=!0):t.getNodeElement()===i.getNodeElement()?this.link.setMessageSameNode():t.isOutput()===i.isOutput()?this.link.setMessageDirectionsIncompatible():this.blueprint.getLinks(t,i).length?(this.link.setMessageReplaceLink(),this.linkValid=!0):"exec"===s.entity.getType()&&s.isLinked?(this.link.setMessageReplaceOutputLink(),this.linkValid=!0):"object"==t.entity.PinType.PinCategory.valueOf()&&"object"==i.entity.PinType.PinCategory.valueOf()||t.pinType==i.pinType?(this.link.setMessageCorrect(),this.linkValid=!0):(this.link.setMessageTypesIncompatible(t,i),this.linkValid=!1)}};#Be=e=>{this.enteredPin==e.target&&(this.enteredPin=null,this.linkValid=!1,this.link?.setMessagePlaceNode())};link;enteredPin;linkValid=!1;constructor(e,t,i={}){i.scrollGraphEdge??=!0,super(e,t,i)}startDrag(e){this.target.nodeElement.getType()==ne.paths.knot&&(this.#$e=this.target),this.link=Ae.getConstructor("ueb-link").newObject(this.target,null),this.blueprint.template.linksContainerElement.prepend(this.link),this.link.setMessagePlaceNode(),this.#Oe=this.blueprint.querySelectorAll("ueb-pin"),this.#Oe.forEach((e=>{e!=this.target&&(e.addEventListener("mouseenter",this.#De),e.addEventListener("mouseleave",this.#Be))})),this.link.startDragging(),this.link.setDestinationLocation(e)}dragTo(e,t){this.link.setDestinationLocation(e)}endDrag(){if(this.#Oe.forEach((e=>{e.removeEventListener("mouseenter",this.#De),e.removeEventListener("mouseleave",this.#Be)})),this.#Oe=null,this.enteredPin&&this.linkValid){if(this.#$e){const e=this.#$e!==this.link.source?this.link.source:this.enteredPin;if(this.#$e.isInput()&&e.isInput()||this.#$e.isOutput()&&e.isOutput()){const e=this.#$e.template.getOppositePin();this.#$e===this.link.source?this.link.source=e:this.enteredPin=e}}else this.enteredPin.nodeElement.getType()===ne.paths.knot&&(this.#$e=this.enteredPin,this.link.source.isOutput()&&(this.enteredPin=this.enteredPin.template.getOppositePin()));this.link.source.getLinks().find((e=>e.equals(this.enteredPin.createPinReference())))?this.link.remove():(this.blueprint.addGraphElement(this.link),this.link.destination=this.enteredPin)}else this.link.remove();this.enteredPin=null,this.link.removeMessage(),this.link.finishDragging(),this.link=null}}class Xt extends jt{#Ge=!1;#He=!1;displayName="";static nodeStyleClasses=["ueb-node-style-glass"];initialize(e){super.initialize(e),this.displayName=this.element.nodeDisplayName}render(){return G`
${this.displayName?G`
${this.displayName}
`:V} ${this.#Ge?G`
`:V} ${this.#He?G`
`:V} ${this.pinInserter?G`
Add pin ${le.plusCircle}
`:V}
`}createPinElements(){return this.element.getPinEntities().filter((e=>!e.isHidden())).map((e=>{this.#Ge||=e.isInput(),this.#He||=e.isOutput();return Ae.getConstructor("ueb-pin").newObject(e,void 0,this.element)}))}}class qt extends Xt{static nodeStyleClasses=["ueb-node-style-metasound","ueb-node-style-operation"]}class Zt extends Xt{static nodeStyleClasses=[...super.nodeStyleClasses,"ueb-node-style-conversion"]}class Wt extends Xt{static nodeStyleClasses=[...super.nodeStyleClasses,"ueb-node-style-operation"]}class Qt extends Tt{static canWrapInput=!0;#Ve;get iconElement(){return this.#Ve}#Re;get wrapperElement(){return this.#Re}isNameRendered=!0;initialize(e){if(super.initialize(e),this.element.nodeElement){const e=this.element.nodeElement.template;this.isNameRendered=!(e instanceof Zt||e instanceof Wt||e instanceof qt)}}setup(){super.setup(),this.element.nodeElement=this.element.closest("ueb-node");const e=this.element.nodeElement.template;(e instanceof Zt||e instanceof Wt)&&(this.isNameRendered=!1,this.element.requestUpdate())}createInputObjects(){return[new Kt(this.element,this.blueprint,{moveEverywhere:!0,draggableElement:this.getClickableElement()})]}render(){const e=G`
${this.renderIcon()}
`,t=G`
${this.isNameRendered?this.renderName():V} ${this.isInputRendered()?this.renderInput():G``}
`;return G`
${this.element.isInput()?G`${e}${t}`:G`${t}${e}`}
`}renderIcon(){if(this.element.nodeElement.entity.isPcg())switch(this.element.entity.getType()){case"Any":return le.pcgPin;case"Param":case"Param[]":return le.pcgParamPin;case"Spatial":case"Spatial[]":return le.pcgSpatialPin;case"Any[]":case"Point[]":case"Surface[]":case"Volume[]":if(this.element.isOutput())return le.pcgPin;case"Point":case"Surface":case"Volume":return le.pcgStackPin}switch(this.element.entity.PinType?.ContainerType?.serialize()){case"Array":return le.arrayPin;case"Set":return le.setPin;case"Map":return le.mapPin}return"delegate"===this.element.entity.PinType?.PinCategory?.toString().toLocaleLowerCase()?le.delegate:this.element.nodeElement?.template instanceof Wt?le.operationPin:le.genericPin}renderName(){let e=this.element.getPinDisplayName();const t=this.element.nodeElement,i=this.element.getPinName();return t.getType()==ne.paths.makeStruct&&i==t.entity.StructType.getName()&&(e=i),G`${e}`}isInputRendered(){return this.element.isInput()&&!this.element.entity.bDefaultValueIsIgnored?.valueOf()&&!this.element.entity.PinType.bIsReference?.valueOf()}renderInput(){return G``}updated(e){if(super.updated(e),this.element.isInput()&&e.has("isLinked")){const e=this.element.nodeElement;this.element.requestUpdate(),this.element.updateComplete.then((()=>e.acknowledgeReflow()))}}firstUpdated(e){super.firstUpdated(e),this.element.style.setProperty("--ueb-pin-color-rgb",this.element.entity.pinColor().cssText),this.#Ve=this.element.querySelector(".ueb-pin-icon svg")??this.element,this.#Re=this.element.querySelector(".ueb-pin-wrapper")}getLinkLocation(){const e=this.iconElement.getBoundingClientRect(),t=[this.element.isInput()?e.left:e.right+1,(e.top+e.bottom)/2],i=ae.convertLocation(t,this.blueprint.template.gridElement);return this.blueprint.compensateTranslation(i[0],i[1])}getClickableElement(){return this.#Re??this.element}}class Jt extends Qt{render(){return G`
${this.renderIcon()}
`}}class ei extends jt{static nodeStyleClasses=[...super.nodeStyleClasses,"ueb-node-style-event"];firstUpdated(e){super.firstUpdated(e),this.element.querySelector(".ueb-node-top").appendChild(this.createDelegatePinElement())}renderTop(){const e=this.renderNodeIcon(),t=this.renderNodeName(),i=this.element.getType()===ne.paths.customEvent&&(this.element.entity.CustomFunctionName||this.element.entity.FunctionReference.MemberParent);return G`
${e?G`
${e}
`:V} ${t?G`
${t} ${i?G`
Custom Event
`:V}
`:V}
`}createDelegatePinElement(){const e=Ae.getConstructor("ueb-pin").newObject(this.element.getPinEntities().find((e=>!e.isHidden()&&"delegate"===e.PinType.PinCategory?.toString())),new Jt,this.element);return e.template.isNameRendered=!1,e}createPinElements(){return this.element.getPinEntities().filter((e=>!e.isHidden()&&"delegate"!==e.PinType.PinCategory?.toString())).map((e=>Ae.getConstructor("ueb-pin").newObject(e,void 0,this.element)))}}class ti extends Jt{render(){return this.element.isOutput()?super.render():G``}getOppositePin(){const e=this.element.nodeElement.template;return this.element.isOutput()?e.inputPin:e.outputPin}getLinkLocation(){const e=(this.element.isInput()?this.element.nodeElement.template.outputPin.template:this).iconElement.getBoundingClientRect(),t=[this.element.isInput()?e.left:e.right+1,(e.top+e.bottom)/2],i=ae.convertLocation(t,this.blueprint.template.gridElement);return this.blueprint.compensateTranslation(i[0],i[1])}}class ii extends jt{static#_e=new Set;#ze=null;#Fe;get inputPin(){return this.#Fe}#je;get outputPin(){return this.#je}initialize(e){super.initialize(e),this.element.classList.add("ueb-node-style-minimal")}findDirectionaPin(e){if(e.nodeElement.getType()!==ne.paths.knot||ii.#_e.has(e))return ii.#_e.clear(),!0;ii.#_e.add(e);for(let t of e.getLinks().map((e=>this.blueprint.getPin(e))))if(this.findDirectionaPin(t))return!0;return!1}render(){return G`
`}setupPins(){this.element.getPinElements().forEach((e=>this.element.querySelector(".ueb-node-border").appendChild(e)))}getPinElements(e){return e.querySelectorAll("ueb-pin")}createPinElements(){const e=this.element.getPinEntities().filter((e=>!e.isHidden())),t=e[e[0].isInput()?0:1],i=e[e[0].isOutput()?0:1],s=Ae.getConstructor("ueb-pin");return[this.#Fe=s.newObject(t,new ti,this.element),this.#je=s.newObject(i,new ti,this.element)]}linksChanged(){}}class si extends jt{static nodeStyleClasses=["ueb-node-style-metasound"]}class ri extends Xt{initialize(e){super.initialize(e);const t=e.getType();t===ne.paths.variableGet||t===ne.paths.self?(this.element.classList.add("ueb-node-style-getter"),this.displayName=""):t===ne.paths.variableSet&&this.element.classList.add("ueb-node-style-setter")}setupPins(){super.setupPins();let e=this.element.getPinElements().find((e=>!e.entity.isHidden()&&!e.entity.isExecution()));this.element.style.setProperty("--ueb-node-color",e.getColor().cssText)}}function ni(e){if(e.getClass()===ne.paths.callFunction||e.getClass()===ne.paths.commutativeAssociativeBinaryOperator||e.getClass()===ne.paths.callArrayFunction){const t=e.FunctionReference?.MemberParent?.path??"",i=e.FunctionReference?.MemberName?.toString();if(i&&(t===ne.paths.kismetMathLibrary||t===ne.paths.kismetArrayLibrary)){if(i.startsWith("Conv_"))return Zt;if(i.startsWith("Add_")||i.startsWith("And_")||i.startsWith("Boolean")||i.startsWith("Cross_")||i.startsWith("Dot_")||i.startsWith("Not_")||i.startsWith("Or_")||i.startsWith("Percent_")||i.startsWith("Xor_"))return Wt;switch(i){case"Abs":case"Array_Add":case"Array_AddUnique":case"Array_Identical":case"BMax":case"BMin":case"CrossProduct2D":case"DotProduct2D":case"Exp":case"FMax":case"FMin":case"GetPI":case"Max":case"MaxInt64":case"Min":case"MinInt64":case"Sqrt":case"Square":case"Vector4_CrossProduct3":case"Vector4_DotProduct":case"Vector4_DotProduct3":case"Acos":case"Asin":case"Cos":case"DegAcos":case"DegCos":case"DegSin":case"DegTan":case"Sin":case"Tan":return Wt}}if(t===ne.paths.blueprintSetLibrary)return Wt;if(t===ne.paths.blueprintMapLibrary)return Wt}switch(e.getClass()){case ne.paths.comment:case ne.paths.materialGraphNodeComment:return Yt;case ne.paths.createDelegate:return jt;case ne.paths.metasoundEditorGraphExternalNode:return"Add"==e.ClassName?.Name?qt:si;case ne.paths.niagaraNodeOp:if(["Boolean::LogicEq","Boolean::LogicNEq","Numeric::Abs","Numeric::Add","Numeric::Mul"].includes(e.OpName?.toString()))return Wt;break;case ne.paths.promotableOperator:return Wt;case ne.paths.knot:return ii;case ne.paths.literal:case ne.paths.self:case ne.paths.variableGet:case ne.paths.variableSet:return ri}return e.isEvent()?ei:jt}class ai extends Bt{static properties={...super.properties,selected:{type:Boolean,attribute:"data-selected",reflect:!0,converter:ke.booleanConverter}};dragHandler=e=>this.addLocation(...e.detail.value);constructor(){super(),this.selected=!1,this.listeningDrag=!1}setup(){super.setup(),this.setSelected(this.selected)}cleanup(){super.cleanup(),this.blueprint.removeEventListener(ne.nodeDragGeneralEventName,this.dragHandler)}setSelected(e=!0){this.selected=e,this.blueprint&&(this.selected?(this.listeningDrag=!0,this.blueprint.addEventListener(ne.nodeDragGeneralEventName,this.dragHandler)):(this.blueprint.removeEventListener(ne.nodeDragGeneralEventName,this.dragHandler),this.listeningDrag=!1))}}class oi extends ai{static properties={...ai.properties,typePath:{type:String,attribute:"data-type",reflect:!0},nodeTitle:{type:String,attribute:"data-title",reflect:!0},advancedPinDisplay:{type:String,attribute:"data-advanced-display",converter:Ze.attributeConverter,reflect:!0},enabledState:{type:String,attribute:"data-enabled-state",reflect:!0},nodeDisplayName:{type:String,attribute:!1},pureFunction:{type:Boolean,converter:ke.booleanConverter,attribute:"data-pure-function",reflect:!0}};static dragEventName=ne.nodeDragEventName;static dragGeneralEventName=ne.nodeDragGeneralEventName;get blueprint(){return super.blueprint}set blueprint(e){super.blueprint=e,this.#Ue.forEach((t=>t.blueprint=e))}#Ye;get nodeNameElement(){return this.#Ye}set nodeNameElement(e){this.#Ye=e}#Ue=[];boundComments=[];#Ke=!1;#Xe=e=>{this.selected||this.#Ke||(this.#Ke=!0,this.requestUpdate(),this.updateComplete.then((()=>this.#Ke=!1)),this.addLocation(...e.detail.value))};static fromSerializedObject(e){e=e.trim();let t=Et.grammar.parse(e);return oi.newObject(t)}static newObject(e=new Et,t=new(ni(e))){const i=new oi;return i.initialize(e,t),i}#qe(e){for(let t of this.getPinElements())for(let i of t.getLinks())this.blueprint.getPin(i).redirectLink(t,new rt(new Ze(e),t.entity.PinId))}initialize(e=new Et,t=new(ni(e))){this.typePath=e.getType(),this.nodeTitle=e.getObjectName(),this.advancedPinDisplay=e.AdvancedPinDisplay?.toString(),this.enabledState=e.EnabledState,this.nodeDisplayName=Ve(e),this.pureFunction=e.bIsPureFunc?.valueOf(),this.dragLinkObjects=[],super.initialize(e,t),this.#Ue=this.template.createPinElements(),super.setLocation(this.entity.getNodePosX(),this.entity.getNodePosY()),this.entity.NodeWidth&&this.entity.NodeHeight?(this.sizeX=this.entity.NodeWidth.value,this.sizeY=this.entity.NodeHeight.value):this.updateComplete.then((()=>this.computeSizes())),e.listenAttribute("Name",(t=>{this.nodeTitle=t.value,this.nodeDisplayName=Ve(e),this.#qe(t.value)}))}async getUpdateComplete(){let e=await super.getUpdateComplete();for(const t of this.getPinElements())e&&=await t.updateComplete;return e}bindToComment(e){e==this||this.boundComments.includes(e)||(e.addEventListener(ne.nodeDragEventName,this.#Xe),this.boundComments.push(e))}unbindFromComment(e){const t=this.boundComments.indexOf(e);t>=0&&(e.removeEventListener(ne.nodeDragEventName,this.#Xe),this.boundComments[t]=this.boundComments[this.boundComments.length-1],this.boundComments.pop())}isInsideComment(e){return this.topBoundary()>=e.topBoundary()&&this.rightBoundary()<=e.rightBoundary()&&this.bottomBoundary()<=e.bottomBoundary()&&this.leftBoundary()>=e.leftBoundary()}getType(){return this.entity.getType()}getNodeName(){return this.entity.getObjectName()}computeNodeDisplayName(){this.nodeDisplayName=Ve(this.entity)}setNodeWidth(e){this.entity.setNodeWidth(e),this.sizeX=e,this.acknowledgeReflow()}setNodeHeight(e){this.entity.setNodeHeight(e),this.sizeY=e,this.acknowledgeReflow()}sanitizeLinks(e=[]){this.getPinElements().forEach((t=>t.sanitizeLinks(e)))}getPinElements(){return this.#Ue}getPinEntities(){return this.entity.getPinEntities()}setLocation(e=0,t=0,i=!0){this.entity.setNodePosX(e),this.entity.setNodePosY(t),super.setLocation(e,t,i)}acknowledgeReflow(){this.requestUpdate(),this.updateComplete.then((()=>this.computeSizes()));let e=new CustomEvent(ne.nodeReflowEventName);this.dispatchEvent(e)}setShowAdvancedPinDisplay(e){this.entity.AdvancedPinDisplay=new Ze(e?"Shown":"Hidden"),this.advancedPinDisplay=this.entity.AdvancedPinDisplay}toggleShowAdvancedPinDisplay(){this.setShowAdvancedPinDisplay("Shown"!=this.entity.AdvancedPinDisplay?.toString())}}class li extends Et{#Ze=new Map;#We=[];get objectEntities(){return this.#We}getHomonymObjectEntity(e){const t=e.getObjectName(!1);return this.#We.find((e=>e.getObjectName()==t))}takeFreeName(e){e=e.replace(/_\d+$/,"");const t=(this.#Ze.get(e)??-1)+1;return this.#Ze.set(e,t),ne.nodeTitle(e,t)}addObjectEntity(e){if(!this.#We.includes(e)){this.#We.push(e);const[t,i]=e.getNameAndCounter();return this.#Ze.set(t,Math.max(this.#Ze.get(t)??0,i)),!0}return!1}removeObjectEntity(e){const t=this.#We.indexOf(e);if(t>=0){const e=this.#We.pop();return te.OriginalChangeId.value==t.OriginalChangeId.value));if(t.length===this.ScriptVariables.length)return this;const i=t.concat(t).map(((i,s)=>{const r=ne.subObjectAttributeNameFromReference(i.ScriptVariable,s>=t.length);return[r,this[r]??e[r]]}));return i.push(...Object.entries(this).filter((([e,t])=>!e.startsWith(ne.subObjectAttributeNamePrefix)&&"ExportedNodes"!==e))),new li(Object.fromEntries(i))}}class ui extends Et{constructor(e,t){const i=ne.paths.niagaraClipboardContent,s=e.takeFreeName("NiagaraClipboardContent"),r=`/Engine/Transient.${s}`;let n="";for(const e of t)e.exported&&(n+=e.serialize());t.filter((e=>!e.exported)).map((e=>e.serialize())),super({Class:new st(i),Name:new Xe(s),ExportPath:new st(i,r),ExportedNodes:new Xe(btoa(n))})}}class ci extends Nt{#Qe;constructor(e,t,i={}){i.listenOnFocus??=!0,i.unlistenOnTextEdit??=!0,super(e,t,i);let s=this;this.#Qe=()=>s.copied()}listenEvents(){window.addEventListener("copy",this.#Qe)}unlistenEvents(){window.removeEventListener("copy",this.#Qe)}getSerializedText(){const e=this.blueprint.getNodes(!0).map((e=>e.entity));let t=!1,i=e.filter((e=>(t||=e.exported,!e.exported))).reduce(((e,t)=>e+t.serialize()),"");if(t){i=new ui(this.blueprint.entity,e).serialize()+i}return i}copied(){const e=this.getSerializedText();return navigator.clipboard.writeText(e),e}}class hi extends Nt{#Je;constructor(e,t,i={}){i.listenOnFocus??=!0,i.unlistenOnTextEdit??=!0,super(e,t,i);let s=this;this.#Je=()=>s.cut()}listenEvents(){window.addEventListener("cut",this.#Je)}unlistenEvents(){window.removeEventListener("cut",this.#Je)}getSerializedText(){return this.blueprint.getNodes(!0).map((e=>e.entity.serialize())).join("")}cut(){this.blueprint.template.getCopyInputObject().copied(),this.blueprint.removeGraphElement(...this.blueprint.getNodes(!0))}}class pi extends Nt{#et;constructor(e,t,i={}){i.listenOnFocus??=!0,i.unlistenOnTextEdit??=!0,super(e,t,i);let s=this;this.#et=e=>s.pasted(e.clipboardData.getData("Text"))}listenEvents(){window.addEventListener("paste",this.#et)}unlistenEvents(){window.removeEventListener("paste",this.#et)}pasted(e){let t=0,i=0,s=0,r=Et.grammarMultipleObjects.parse(e).map((e=>{let r=Ae.getConstructor("ueb-node").newObject(e);return t+=r.locationY,i+=r.locationX,++s,r}));t/=s,i/=s,r.length>0&&this.blueprint.unselectAll();let n=this.blueprint.mousePosition;for(const e of r)e.addLocation(n[0]-i,n[1]-t),e.snapToGrid(),e.setSelected(!0);return this.blueprint.addGraphElement(...r),r}}class di extends kt{static#Y=e=>{};#tt=0;get variation(){return this.#tt}#it=e=>{this.enablerKey&&!this.enablerActivated||(e.preventDefault(),this.#tt=e.deltaY,this.setLocationFromEvent(e),this.wheel())};#st=e=>e.preventDefault();constructor(e,t,i={},s=di.#Y){i.listenOnFocus=!0,i.strictTarget??=!1,super(e,t,i),this.strictTarget=i.strictTarget,this.onWheel=s}listenEvents(){this.movementSpace.addEventListener("wheel",this.#it,!1),this.movementSpace.parentElement?.addEventListener("wheel",this.#st)}unlistenEvents(){this.movementSpace.removeEventListener("wheel",this.#it,!1),this.movementSpace.parentElement?.removeEventListener("wheel",this.#st)}wheel(){this.onWheel(this)}}class mi extends di{#rt=0;#nt=!1;get enableZoonIn(){return this.#nt}set enableZoonIn(e){e!=this.#nt&&(this.#nt=e)}wheel(){if(this.#rt+=-this.variation,Math.abs(this.#rt)0||(e+=Math.sign(this.#rt),this.blueprint.setZoom(e,this.location),this.#rt=0)}}class gi extends Pt{#at;constructor(e,t,i={}){i.activationKeys=Mt.enableZoomIn,super(e,t,i)}fire(){this.#at=this.blueprint.template.getZoomInputObject(),this.#at.enableZoonIn=!0}unfire(){this.#at.enableZoonIn=!1}}class bi extends Gt{startDrag(){this.blueprint.scrolling=!0}dragTo(e,t){this.blueprint.scrollDelta(-t[0],-t[1])}endDrag(){this.blueprint.scrolling=!1}}class vi extends kt{#ot=null;#lt=e=>{e.preventDefault(),this.setLocationFromEvent(e),this.blueprint.mousePosition=[...this.location]};#ut=e=>{this.#ot||(e.preventDefault(),this.#ot=e.detail.tracker,this.unlistenMouseMove())};#ct=e=>{this.#ot==e.detail.tracker&&(e.preventDefault(),this.#ot=null,this.listenMouseMove())};constructor(e,t,i={}){i.listenOnFocus=!0,super(e,t,i)}listenMouseMove(){this.target.addEventListener("mousemove",this.#lt)}unlistenMouseMove(){this.target.removeEventListener("mousemove",this.#lt)}listenEvents(){this.listenMouseMove(),this.blueprint.addEventListener(ne.trackingMouseEventName.begin,this.#ut),this.blueprint.addEventListener(ne.trackingMouseEventName.end,this.#ct)}unlistenEvents(){this.unlistenMouseMove(),this.blueprint.removeEventListener(ne.trackingMouseEventName.begin,this.#ut),this.blueprint.removeEventListener(ne.trackingMouseEventName.end,this.#ct)}}class fi extends Gt{constructor(e,t,i={}){i.scrollGraphEdge??=!0,super(e,t,i),this.selectorElement=this.blueprint.template.selectorElement}startDrag(){this.selectorElement.beginSelect(this.clickedPosition)}dragTo(e,t){this.selectorElement.selectTo(e)}endDrag(){this.started&&this.selectorElement.endSelect()}unclicked(){this.started||this.blueprint.unselectAll()}}class yi extends Nt{#ht=e=>this.clickedSomewhere(e.target);constructor(e,t,i={}){i.listenOnFocus=!0,super(e,t,i),this.blueprint.focus&&document.addEventListener("click",this.#ht)}clickedSomewhere(e){e.closest("ueb-blueprint")||this.blueprint.setFocused(!1)}listenEvents(){document.addEventListener("click",this.#ht)}unlistenEvents(){document.removeEventListener("click",this.#ht)}}class wi extends Tt{static styleVariables={"--ueb-font-size":`${ne.fontSize}`,"--ueb-grid-axis-line-color":`${ne.gridAxisLineColor}`,"--ueb-grid-expand":`${ne.expandGridSize}px`,"--ueb-grid-line-color":`${ne.gridLineColor}`,"--ueb-grid-line-width":`${ne.gridLineWidth}px`,"--ueb-grid-set-line-color":`${ne.gridSetLineColor}`,"--ueb-grid-set":`${ne.gridSet}`,"--ueb-grid-size":`${ne.gridSize}px`,"--ueb-link-min-width":`${ne.linkMinWidth}`,"--ueb-node-radius":`${ne.nodeRadius}px`};#pt=new ResizeObserver((e=>{const t=e.find((e=>e.target===this.viewportElement))?.devicePixelContentBoxSize?.[0];t&&(this.viewportSize[0]=t.inlineSize,this.viewportSize[1]=t.blockSize)}));#dt;#mt;#at;headerElement;overlayElement;viewportElement;selectorElement;gridElement;linksContainerElement;nodesContainerElement;viewportSize=[0,0];initialize(e){super.initialize(e),this.element.style.cssText=Object.entries(wi.styleVariables).map((([e,t])=>`${e}:${t};`)).join("");const t=this.element.querySelector(":scope > template")?.content.textContent;t&&(this.element.requestUpdate(),this.element.updateComplete.then((()=>{this.blueprint.mousePosition=[Math.round(this.viewportSize[0]/2),Math.round(this.viewportSize[1]/2)],this.getPasteInputObject().pasted(t),this.blueprint.unselectAll()})))}setup(){super.setup(),this.#pt.observe(this.viewportElement,{box:"device-pixel-content-box"});const e=this.viewportElement.getBoundingClientRect();this.viewportSize[0]=e.width,this.viewportSize[1]=e.height,this.blueprint.nodes.length>0&&(this.blueprint.requestUpdate(),this.blueprint.updateComplete.then((()=>this.centerContentInViewport())))}cleanup(){super.cleanup(),this.#pt.unobserve(this.viewportElement)}createInputObjects(){const e=this.element.getGridDOMElement();return this.#dt=new ci(e,this.blueprint),this.#mt=new pi(e,this.blueprint),this.#at=new mi(e,this.blueprint),[...super.createInputObjects(),this.#dt,this.#mt,this.#at,new hi(e,this.blueprint),new Pt(e,this.blueprint,{activationKeys:Mt.duplicateNodes},(()=>this.blueprint.template.getPasteInputObject().pasted(this.blueprint.template.getCopyInputObject().copied()))),new Pt(e,this.blueprint,{activationKeys:Mt.deleteNodes},(()=>this.blueprint.removeGraphElement(...this.blueprint.getNodes(!0)))),new Pt(e,this.blueprint,{activationKeys:Mt.selectAllNodes},(()=>this.blueprint.selectAll())),new fi(e,this.blueprint,{clickButton:ne.mouseClickButton,exitAnyButton:!0,moveEverywhere:!0}),new bi(e,this.blueprint,{clickButton:ne.mouseRightClickButton,exitAnyButton:!1,moveEverywhere:!0}),new yi(e,this.blueprint),new vi(e,this.blueprint),new gi(e,this.blueprint)]}render(){return G`
Zoom ${0==this.blueprint.zoom?"1:1":(this.blueprint.zoom>0?"+":"")+this.blueprint.zoom}
`}firstUpdated(e){super.firstUpdated(e),this.headerElement=this.blueprint.querySelector(".ueb-viewport-header"),this.overlayElement=this.blueprint.querySelector(".ueb-viewport-overlay"),this.viewportElement=this.blueprint.querySelector(".ueb-viewport-body"),this.selectorElement=this.blueprint.querySelector("ueb-selector"),this.gridElement=this.viewportElement.querySelector(".ueb-grid"),this.linksContainerElement=this.blueprint.querySelector("[data-links]"),this.linksContainerElement.append(...this.blueprint.getLinks()),this.nodesContainerElement=this.blueprint.querySelector("[data-nodes]"),this.nodesContainerElement.append(...this.blueprint.getNodes()),this.viewportElement.scroll(ne.expandGridSize,ne.expandGridSize)}willUpdate(e){super.willUpdate(e),this.headerElement&&e.has("zoom")&&(this.headerElement.classList.add("ueb-zoom-changed"),this.headerElement.addEventListener("animationend",(()=>this.headerElement.classList.remove("ueb-zoom-changed"))))}updated(e){if(super.updated(e),(e.has("scrollX")||e.has("scrollY"))&&this.viewportElement.scroll(this.blueprint.scrollX,this.blueprint.scrollY),e.has("zoom")){this.blueprint.style.setProperty("--ueb-scale",this.blueprint.getScale());const t=e.get("zoom"),i=Math.min(t,this.blueprint.zoom),s=Math.max(t,this.blueprint.zoom),r=ae.range(i,s),n=e=>`ueb-zoom-${e}`;te<0)).map(n)),this.blueprint.classList.add(...r.filter((e=>e>0)).map(n))):(this.blueprint.classList.remove(...r.filter((e=>e>0)).map(n)),this.blueprint.classList.add(...r.filter((e=>e<0)).map(n)))}}getCommentNodes(e=!1){return this.blueprint.querySelectorAll(`ueb-node[data-type="${ne.paths.comment}"]${e?'[data-selected="true"]':""}, ueb-node[data-type="${ne.paths.materialGraphNodeComment}"]${e?'[data-selected="true"]':""}`)}getPin(e){return this.blueprint.querySelector(`ueb-node[data-title="${e.objectName}"] ueb-pin[data-id="${e.pinGuid}"]`)}getCopyInputObject(){return this.#dt}getPasteInputObject(){return this.#mt}getZoomInputObject(){return this.#at}isPointVisible(e,t){return!1}gridTopVisibilityBoundary(){return this.blueprint.scaleCorrect(this.blueprint.scrollY)-this.blueprint.translateY}gridRightVisibilityBoundary(){return this.gridLeftVisibilityBoundary()+this.blueprint.scaleCorrect(this.viewportSize[0])}gridBottomVisibilityBoundary(){return this.gridTopVisibilityBoundary()+this.blueprint.scaleCorrect(this.viewportSize[1])}gridLeftVisibilityBoundary(){return this.blueprint.scaleCorrect(this.blueprint.scrollX)-this.blueprint.translateX}centerViewport(e=0,t=0,i=!0){const s=this.gridLeftVisibilityBoundary()+this.blueprint.scaleCorrect(this.viewportSize[0]/2),r=this.gridTopVisibilityBoundary()+this.blueprint.scaleCorrect(this.viewportSize[1]/2);this.blueprint.scrollDelta(this.blueprint.scaleCorrectReverse(e-s),this.blueprint.scaleCorrectReverse(t-r),i)}centerContentInViewport(e=!0){let t=0,i=0,s=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER,n=Number.MAX_SAFE_INTEGER,a=Number.MIN_SAFE_INTEGER;const o=this.blueprint.getNodes();for(const e of o)t+=e.leftBoundary()+e.rightBoundary(),i+=e.topBoundary()+e.bottomBoundary(),s=Math.min(s,e.leftBoundary()),r=Math.max(r,e.rightBoundary()),n=Math.min(n,e.topBoundary()),a=Math.max(a,e.bottomBoundary());t=Math.round(r-s<=this.viewportSize[0]?(r+s)/2:t/(2*o.length)),i=Math.round(a-n<=this.viewportSize[1]?(a+n)/2:i/(2*o.length)),this.centerViewport(t,i,e)}}class Si extends oe{static properties={selecting:{type:Boolean,attribute:"data-selecting",reflect:!0,converter:ke.booleanConverter},scrolling:{type:Boolean,attribute:"data-scrolling",reflect:!0,converter:ke.booleanConverter},focused:{type:Boolean,attribute:"data-focused",reflect:!0,converter:ke.booleanConverter},zoom:{type:Number,attribute:"data-zoom",reflect:!0},scrollX:{type:Number,attribute:!1},scrollY:{type:Number,attribute:!1},additionalX:{type:Number,attribute:!1},additionalY:{type:Number,attribute:!1},translateX:{type:Number,attribute:!1},translateY:{type:Number,attribute:!1}};static nodeBoundariesSupplier=e=>({primaryInf:e.leftBoundary(!0),primarySup:e.rightBoundary(!0),secondaryInf:e.topBoundary(!0),secondarySup:e.bottomBoundary(!0)});static nodeSelectToggleFunction=(e,t)=>{e.setSelected(t)};#gt=0;#bt=0;nodes=[];links=[];nodesNames=new Map;mousePosition=[0,0];waitingExpandUpdate=!1;constructor(){super(),this.selecting=!1,this.scrolling=!1,this.focused=!1,this.zoom=0,this.scrollX=ne.expandGridSize,this.scrollY=ne.expandGridSize,this.translateX=ne.expandGridSize,this.translateY=ne.expandGridSize,super.initialize(new li,new wi)}initialize(){}getGridDOMElement(){return this.template.gridElement}getScroll(){return[this.scrollX,this.scrollY]}setScroll(e,t){this.scrollX=e,this.scrollY=t}scrollDelta(e=0,t=0,i=!1,s=ne.smoothScrollTime){if(i){let i=[0,0];this.#gt&&cancelAnimationFrame(this.#gt),this.#bt&&cancelAnimationFrame(this.#bt),ae.animate(0,e,s,(e=>{this.scrollDelta(e-i[0],0,!1),i[0]=e}),(e=>this.#gt=e)),ae.animate(0,t,s,(e=>{this.scrollDelta(0,e-i[1],!1),i[1]=e}),(e=>this.#bt=e))}else{const i=[2*ne.expandGridSize,2*ne.expandGridSize];let s=this.getScroll(),r=[s[0]+e,s[1]+t],n=[0,0];for(let e=0;e<2;++e)r[e]i[e]-ne.gridExpandThreshold*ne.expandGridSize&&(n[e]=1);0==n[0]&&0==n[1]||this.seamlessExpand(n[0],n[1]),s=this.getScroll(),r=[s[0]+e,s[1]+t],this.setScroll(r[0],r[1])}}scrollCenter(e=!1){const t=this.getScroll(),i=[this.translateX-t[0],this.translateY-t[1]],s=this.getViewportSize().map((e=>e/2)),r=[i[0]-s[0],i[1]-s[1]];this.scrollDelta(r[0],r[1],e)}getViewportSize(){return[this.template.viewportElement.clientWidth,this.template.viewportElement.clientHeight]}getScrollMax(){return[this.template.viewportElement.scrollWidth-this.template.viewportElement.clientWidth,this.template.viewportElement.scrollHeight-this.template.viewportElement.clientHeight]}snapToGrid(e,t){return ae.snapToGrid(e,t,ne.gridSize)}seamlessExpand(e,t){e=Math.round(e),t=Math.round(t);let i=this.getScale();[e,t]=[-e*ne.expandGridSize,-t*ne.expandGridSize],0!=e&&(this.scrollX+=e,e/=i),0!=t&&(this.scrollY+=t,t/=i),this.translateX+=e,this.translateY+=t}progressiveSnapToGrid(e){return ne.expandGridSize*Math.round(e/ne.expandGridSize+.5*Math.sign(e))}getZoom(){return this.zoom}setZoom(e,t){if((e=ae.clamp(e,ne.minZoom,ne.maxZoom))==this.zoom)return;let i=this.getScale();if(this.zoom=e,t){t[0]+=this.translateX,t[1]+=this.translateY;let e=this.getScale()/i,s=[e*t[0],e*t[1]];this.scrollDelta((s[0]-t[0])*i,(s[1]-t[1])*i)}}getScale(){return ne.scale[this.getZoom()]}scaleCorrect(e){return e/this.getScale()}scaleCorrectReverse(e){return e*this.getScale()}compensateTranslation(e,t){return[e-=this.translateX,t-=this.translateY]}getNodes(e=!1,[t,i,s,r]=[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,Number.MIN_SAFE_INTEGER]){let n=this.nodes;return e&&(n=n.filter((e=>e.selected))),(t>Number.MIN_SAFE_INTEGER||iNumber.MIN_SAFE_INTEGER)&&(n=n.filter((e=>e.topBoundary()>=t&&e.rightBoundary()<=i&&e.bottomBoundary()<=s&&e.leftBoundary()>=r))),n}getCommentNodes(e=!1){let t=[...this.template.getCommentNodes(e)];return 0===t.length&&(t=this.nodes.filter((t=>t.getType()===ne.paths.comment&&(!e||t.selected)))),t}getPin(e){let t=this.template.getPin(e);return t&&t.nodeElement.getNodeName()==e.objectName.toString()||(t=[...this.nodes.find((t=>e.objectName.toString()==t.getNodeName()))?.getPinElements()??[]].find((t=>e.pinGuid.toString()==t.getPinId().toString()))),t}getLinks(e=null,t=null){if(null==e!=(null==t)){const i=e??t;return this.links.filter((e=>e.source==i||e.destination==i))}return null!=e&&null!=t?this.links.filter((i=>i.source==e&&i.destination==t||i.source==t&&i.destination==e)):this.links}getLink(e,t,i=!1){return this.links.find((s=>s.source==e&&s.destination==t||!i&&s.source==t&&s.destination==e))}selectAll(){this.getNodes().forEach((e=>Si.nodeSelectToggleFunction(e,!0)))}unselectAll(){this.getNodes().forEach((e=>Si.nodeSelectToggleFunction(e,!1)))}addGraphElement(...e){const t=e=>{const i=e.currentTarget;i.removeEventListener(ne.removeEventName,t);const[s,r]=i instanceof oi?[this.nodes,i.entity]:i instanceof Dt?[this.links]:null,n=s?.indexOf(i);if(n>=0){const e=s.pop();ne.entity.exported=!0));continue}const e=i.entity.getObjectName(),s=this.entity.getHomonymObjectEntity(i.entity);s&&(s.Name.value=this.entity.takeFreeName(e),s.Name=s.Name),this.nodes.push(i),this.entity.addObjectEntity(i.entity),i.addEventListener(ne.removeEventName,t),this.template.nodesContainerElement?.appendChild(i)}else i instanceof Dt&&!this.links.includes(i)&&(this.links.push(i),i.addEventListener(ne.removeEventName,t),this.template.linksContainerElement&&!this.template.linksContainerElement.contains(i)&&this.template.linksContainerElement.appendChild(i));e.filter((e=>e instanceof oi)).forEach((t=>t.sanitizeLinks(e))),e.filter((e=>e instanceof oi&&e.getType()==ne.paths.comment)).forEach((e=>e.updateComplete.then((()=>e.template.manageNodesBind()))))}removeGraphElement(...e){for(let t of e){if(t.closest("ueb-blueprint")!==this)return;t.remove()}}setFocused(e=!0){if(this.focused==e)return;let t=new CustomEvent(e?ne.focusEventName.begin:ne.focusEventName.end);this.focused=e,this.focused||this.unselectAll(),this.dispatchEvent(t)}acknowledgeEditText(e){const t=new CustomEvent(e?ne.editTextEventName.begin:ne.editTextEventName.end);this.dispatchEvent(t)}}customElements.define("ueb-blueprint",Si);class Ei extends _t{#vt;get locationChangeCallback(){return this.#vt}set locationChangeCallback(e){this.#vt=e}movementSpace;movementSpaceSize=[0,0];firstUpdated(e){super.firstUpdated(e),this.movementSpace=this.element.parentElement}setup(){super.setup();const e=this.movementSpace.getBoundingClientRect();this.movementSpaceSize=[e.width,e.height]}createDraggableObject(){return new Ht(this.element,this.blueprint,{draggableElement:this.movementSpace,ignoreTranslateCompensate:!0,moveEverywhere:!0,movementSpace:this.movementSpace,repositionOnClick:!0,stepSize:1})}adjustLocation(e,t){return this.locationChangeCallback?.(e,t),[e,t]}}class Ci extends Ei{adjustLocation(e,t){const i=Math.round(this.movementSpaceSize[0]/2);e-=i,t=-(t-i);let[s,r]=ae.getPolarCoordinates(e,t);return s=Math.min(s,i),[e,t]=ae.getCartesianCoordinates(s,r),this.locationChangeCallback?.(e/i,t/i),[e=Math.round(e+i),t=Math.round(-t+i)]}}class Ni extends Bt{windowElement;setup(){super.setup(),this.windowElement=this.closest("ueb-window")}setLocation(e,t){super.setLocation(...this.template.adjustLocation(e,t))}}class xi extends Ni{constructor(){super(),super.initialize({},new Ci)}static newObject(){return new xi}initialize(){}}class Pi extends Ei{adjustLocation(e,t){return e=ae.clamp(e,0,this.movementSpaceSize[0]),t=ae.clamp(t,0,this.movementSpaceSize[1]),this.locationChangeCallback?.(e/this.movementSpaceSize[0],1-t/this.movementSpaceSize[1]),[e,t]}}class ki extends Ni{constructor(){super(),super.initialize({},new Pi)}static newObject(){return new ki}initialize(){}}class Ai extends Gt{constructor(e,t,i={}){i.consumeEvent=!0,super(e,t,i)}}class Li extends Tt{#ft;#yt;#wt=e=>this.element.selectedOption=e.target.selectedOptions[0].value;render(){return G` `}firstUpdated(e){super.firstUpdated(e),this.#ft=this.element.querySelector("select:first-child"),this.#yt=this.element.querySelector("select:last-child");const t=new Event("input",{bubbles:!0});this.#ft.dispatchEvent(t)}updated(e){super.updated(e);const t=this.#yt.getBoundingClientRect();this.element.style.setProperty("--ueb-dropdown-width",t.width+"px")}createInputObjects(){return[...super.createInputObjects(),new Ai(this.element,this.blueprint)]}setSelectedValue(e){this.element.querySelector(`option[value="${e}"]`).defaultSelected=!0}getSelectedValue(){return this.#ft.value}}class Mi extends oe{static properties={...super.properties,options:{type:Object},selectedOption:{type:String}};constructor(){super(),super.initialize({},new Li),this.options=[],this.selectedOption=""}static newObject(e){return new Mi}initialize(){}getValue(){return this.template.getSelectedValue()}}class Ti extends Tt{#St=()=>{this.blueprint.acknowledgeEditText(!0),this.element.selectOnFocus&&getSelection().selectAllChildren(this.element)};#Et=()=>{this.blueprint.acknowledgeEditText(!1),getSelection().removeAllRanges()};#Ct=e=>e.target.querySelectorAll("br").forEach((e=>e.remove()));#Nt=e=>{"Enter"!=e.code||e.shiftKey||e.target.blur()};initialize(e){super.initialize(e),this.element.classList.add("ueb-pin-input-content"),this.element.setAttribute("role","textbox"),this.element.contentEditable="true"}firstUpdated(e){super.firstUpdated(e);const t=new Event("input",{bubbles:!0});this.element.dispatchEvent(t)}createInputObjects(){return[...super.createInputObjects(),new Ai(this.element,this.blueprint)]}setup(){super.setup(),this.element.addEventListener("focus",this.#St),this.element.addEventListener("focusout",this.#Et),this.element.singleLine&&this.element.addEventListener("input",this.#Ct),this.element.blurOnEnter&&this.element.addEventListener("keydown",this.#Nt)}cleanup(){super.cleanup(),this.element.removeEventListener("focus",this.#St),this.element.removeEventListener("focusout",this.#Et),this.element.removeEventListener("input",this.#Ct),this.element.removeEventListener("keydown",this.#Nt)}}class Ii extends oe{static properties={...super.properties,singleLine:{type:Boolean,attribute:"data-single-line",converter:ke.booleanConverter,reflect:!0},selectOnFocus:{type:Boolean,attribute:"data-select-focus",converter:ke.booleanConverter,reflect:!0},blurOnEnter:{type:Boolean,attribute:"data-blur-enter",converter:ke.booleanConverter,reflect:!0}};constructor(){super(),this.singleLine=!1,this.selectOnFocus=!0,this.blurOnEnter=!0,super.initialize({},new Ti)}static newObject(){return new Ii}initialize(){}}class Oi extends Qt{#xt;#Pt=()=>{const e=this.element.getDefaultValue(!0);e.value=this.#xt.checked,this.element.setDefaultValue(e)};firstUpdated(e){super.firstUpdated(e),this.#xt=this.element.querySelector(".ueb-pin-input")}setup(){super.setup(),this.#xt?.addEventListener("change",this.#Pt)}cleanup(){super.cleanup(),this.#xt?.removeEventListener("change",this.#Pt)}createInputObjects(){return[...super.createInputObjects(),new Ai(this.#xt,this.blueprint)]}renderInput(){return G``}}class $i extends Qt{static singleLineInput=!1;static selectOnFocus=!0;static saveEachInputChange=!1;#kt;get inputWrapper(){return this.#kt}#At;static stringFromInputToUE(e){return e.replace(/(?=\n\s*)\n$/,"")}static stringFromUEToInput(e){return e.replaceAll(/(?:\r|(?<=(?:^|[^\\])(?:\\\\)*)\\r)(?=\n)/g,"").replace(/(?<=\n\s*)$/,"\n")}#Lt=()=>this.setInputs(this.getInputs(),!0);#Mt=e=>this.#Tt(e.target);#Tt(e){if(this.element.querySelector(".ueb-pin-name")?.getBoundingClientRect().width<20)return;const t=this.blueprint.scaleCorrect(this.#kt.getBoundingClientRect().width)+this.nameWidth,i=this.element.classList.contains("ueb-pin-input-wrap");!i&&t>ne.pinInputWrapWidth?this.element.classList.add("ueb-pin-input-wrap"):i&&t<=ne.pinInputWrapWidth&&this.element.classList.remove("ueb-pin-input-wrap")}firstUpdated(e){super.firstUpdated(e);this.constructor.canWrapInput&&this.isInputRendered()&&(this.element.addEventListener("input",this.#Mt),this.nameWidth=this.blueprint.scaleCorrect(this.element.querySelector(".ueb-pin-name")?.getBoundingClientRect().width??0)),this.#kt=this.element.querySelector(".ueb-pin-input-wrapper"),this.#At=[...this.element.querySelectorAll("ueb-input")]}setup(){super.setup();const e=this.constructor;e.saveEachInputChange?this.element.addEventListener("input",this.#Lt):this.element.addEventListener("focusout",this.#Lt),e.canWrapInput&&this.isInputRendered()&&(this.element.addEventListener("input",this.#Mt),this.element.nodeElement.addEventListener(ne.nodeReflowEventName,this.#Mt))}cleanup(){super.cleanup(),this.element.nodeElement.removeEventListener(ne.nodeReflowEventName,this.#Mt),this.element.removeEventListener("input",this.#Mt),this.element.removeEventListener("input",this.#Lt),this.element.removeEventListener("focusout",this.#Lt)}getInput(){return this.getInputs().reduce(((e,t)=>e+t),"")}getInputs(){return this.#At.map((e=>ae.clearHTMLWhitespace(e.innerHTML)))}setInputs(e=[],t=!0){this.#At.forEach(this.constructor.singleLineInput?(t,i)=>t.innerText=e[i]:(t,i)=>t.innerText=e[i].replaceAll("\n","")),t&&this.setDefaultValue(e.map((e=>$i.stringFromInputToUE(e))),e),this.element.requestUpdate(),this.element.nodeElement.acknowledgeReflow()}setDefaultValue(e=[],t=e){this.element.setDefaultValue(e.join(""))}renderInput(){const e=this.constructor,t=e.singleLineInput,i=e.selectOnFocus;return G`
`}}class Di extends Qt{renderIcon(){return le.execPin}renderName(){let e=this.element.entity.PinName?.toString();if(this.element.entity.PinFriendlyName)e=this.element.entity.PinFriendlyName.toString();else if("execute"===e||"then"===e)return G``;return G`${this.element.getPinDisplayName()}`}}class Bi extends $i{static singleLineInput=!0;setInputs(e=[],t=!1){if(e&&0!=e.length||(e=[this.getInput()]),super.setInputs(e,!1),t){let i=[];for(const s of e){let e=parseFloat(s);isNaN(e)&&(e=0,t=!1),i.push(e)}this.setDefaultValue(i,e)}}setDefaultValue(e=[],t){const i=this.element.getDefaultValue();i.value=e[0],this.element.setDefaultValue(i),this.element.requestUpdate()}}class Gi extends Bi{renderInput(){return G`
`}} +var te, ie; class se extends b { constructor() { super(...arguments), this.renderOptions = { host: this }, this._$Do = void 0 } createRenderRoot() { var e, t; const i = super.createRenderRoot(); return null !== (e = (t = this.renderOptions).renderBefore) && void 0 !== e || (t.renderBefore = i.firstChild), i } update(e) { const t = this.render(); this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(e), this._$Do = ((e, t, i) => { var s, n; const r = null !== (s = null == i ? void 0 : i.renderBefore) && void 0 !== s ? s : t; let a = r._$litPart$; if (void 0 === a) { const e = null !== (n = null == i ? void 0 : i.renderBefore) && void 0 !== n ? n : null; r._$litPart$ = a = new K(t.insertBefore(P(), e), e, void 0, null != i ? i : {}) } return a._$AI(e), a })(t, this.renderRoot, this.renderOptions) } connectedCallback() { var e; super.connectedCallback(), null === (e = this._$Do) || void 0 === e || e.setConnected(!0) } disconnectedCallback() { var e; super.disconnectedCallback(), null === (e = this._$Do) || void 0 === e || e.setConnected(!1) } render() { return H } } se.finalized = !0, se._$litElement$ = !0, null === (te = globalThis.litElementHydrateSupport) || void 0 === te || te.call(globalThis, { LitElement: se }); const ne = globalThis.litElementPolyfillSupport; null == ne || ne({ LitElement: se }), (null !== (ie = globalThis.litElementVersions) && void 0 !== ie ? ie : globalThis.litElementVersions = []).push("3.3.3"); class re { static nodeColors = { black: r``, blue: r``, darkBlue: r``, darkerBlue: r``, darkTurquoise: r``, gray: r``, green: r``, intenseGreen: r``, lime: r``, red: r``, turquoise: r``, violet: r``, yellow: r`` }; static alphaPattern = "repeating-conic-gradient(#7c8184 0% 25%, #c2c3c4 0% 50%) 50% / 10px 10px"; static colorDragEventName = "ueb-color-drag"; static colorPickEventName = "ueb-color-pick"; static colorWindowEventName = "ueb-color-window"; static colorWindowName = "Color Picker"; static defaultCommentHeight = 96; static defaultCommentWidth = 400; static distanceThreshold = 5; static dragEventName = "ueb-drag"; static dragGeneralEventName = "ueb-drag-general"; static edgeScrollThreshold = 50; static editTextEventName = { begin: "ueb-edit-text-begin", end: "ueb-edit-text-end" }; static expandGridSize = 400; static focusEventName = { begin: "blueprint-focus", end: "blueprint-unfocus" }; static fontSize = r``; static gridAxisLineColor = r``; static gridExpandThreshold = .25; static gridLineColor = r``; static gridLineWidth = 1; static gridSet = 8; static gridSetLineColor = r``; static gridShrinkThreshold = 4; static gridSize = 16; static hexColorRegex = /^\s*#(?[0-9a-fA-F]{2})(?[0-9a-fA-F]{2})(?[0-9a-fA-F]{2})([0-9a-fA-F]{2})?|#(?[0-9a-fA-F])(?[0-9a-fA-F])(?[0-9a-fA-F])\s*$/; static indentation = " "; static keysSeparator = /[\.\(\)]/; static knotOffset = [-re.gridSize, -.5 * re.gridSize]; static lineTracePattern = /LineTrace(Single|Multi)(\w*)/; static linkCurveHeight = 15; static linkCurveWidth = 80; static linkMinWidth = 100; static nameRegexSpaceReplacement = new RegExp("^K2(?:[Nn]ode)?_|(?<=[a-z])(?=[A-Z0-9])|(?<=[A-Z])(? { let s = 100 - e; return `M ${e} 0 C ${t.toFixed(3)} 0, ${i.toFixed(3)} 0, 50 50 S ${(s - t + e).toFixed(3)} 100, ${s.toFixed(3)} 100` }; static maxZoom = 7; static minZoom = -12; static mouseClickButton = 0; static mouseRightClickButton = 2; static mouseWheelZoomThreshold = 80; static nodeDragEventName = "ueb-node-drag"; static nodeDragGeneralEventName = "ueb-node-drag-general"; static nodeTitle = (e, t) => `${e}_${t}`; static nodeRadius = 8; static nodeReflowEventName = "ueb-node-reflow"; static paths = { actorBoundEvent: "/Script/BlueprintGraph.K2Node_ActorBoundEvent", addDelegate: "/Script/BlueprintGraph.K2Node_AddDelegate", ambientSound: "/Script/Engine.AmbientSound", asyncAction: "/Script/BlueprintGraph.K2Node_AsyncAction", blueprint: "/Script/Engine.Blueprint", blueprintGameplayTagLibrary: "/Script/GameplayTags.BlueprintGameplayTagLibrary", blueprintMapLibrary: "/Script/Engine.BlueprintMapLibrary", blueprintSetLibrary: "/Script/Engine.BlueprintSetLibrary", callArrayFunction: "/Script/BlueprintGraph.K2Node_CallArrayFunction", callDelegate: "/Script/BlueprintGraph.K2Node_CallDelegate", callFunction: "/Script/BlueprintGraph.K2Node_CallFunction", clearDelegate: "/Script/BlueprintGraph.K2Node_ClearDelegate", comment: "/Script/UnrealEd.EdGraphNode_Comment", commutativeAssociativeBinaryOperator: "/Script/BlueprintGraph.K2Node_CommutativeAssociativeBinaryOperator", componentBoundEvent: "/Script/BlueprintGraph.K2Node_ComponentBoundEvent", createDelegate: "/Script/BlueprintGraph.K2Node_CreateDelegate", customEvent: "/Script/BlueprintGraph.K2Node_CustomEvent", doN: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:Do N", doOnce: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:DoOnce", dynamicCast: "/Script/BlueprintGraph.K2Node_DynamicCast", eAttachmentRule: "/Script/Engine.EAttachmentRule", edGraph: "/Script/Engine.EdGraph", eDrawDebugTrace: "/Script/Engine.EDrawDebugTrace", eMaterialSamplerType: "/Script/Engine.EMaterialSamplerType", eNiagara_Float4Channel: "/Niagara/Enums/ENiagara_Float4Channel.ENiagara_Float4Channel", enum: "/Script/CoreUObject.Enum", enumLiteral: "/Script/BlueprintGraph.K2Node_EnumLiteral", eSamplerSourceMode: "/Script/Engine.ESamplerSourceMode", eSearchCase: "/Script/CoreUObject.ESearchCase", eSearchDir: "/Script/CoreUObject.ESearchDir", eSpawnActorCollisionHandlingMethod: "/Script/Engine.ESpawnActorCollisionHandlingMethod", eTextureMipValueMode: "/Script/Engine.ETextureMipValueMode", eTraceTypeQuery: "/Script/Engine.ETraceTypeQuery", event: "/Script/BlueprintGraph.K2Node_Event", eWorldPositionIncludedOffsets: "/Script/Engine.EWorldPositionIncludedOffsets", executionSequence: "/Script/BlueprintGraph.K2Node_ExecutionSequence", flipflop: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:FlipFlop", forEachElementInEnum: "/Script/BlueprintGraph.K2Node_ForEachElementInEnum", forEachLoop: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:ForEachLoop", forEachLoopWithBreak: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:ForEachLoopWithBreak", forLoop: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:ForLoop", forLoopWithBreak: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:ForLoopWithBreak", functionEntry: "/Script/BlueprintGraph.K2Node_FunctionEntry", functionResult: "/Script/BlueprintGraph.K2Node_FunctionResult", gameplayTag: "/Script/GameplayTags.GameplayTag", getInputAxisKeyValue: "/Script/BlueprintGraph.K2Node_GetInputAxisKeyValue", ifThenElse: "/Script/BlueprintGraph.K2Node_IfThenElse", inputAxisKeyEvent: "/Script/BlueprintGraph.K2Node_InputAxisKeyEvent", inputDebugKey: "/Script/InputBlueprintNodes.K2Node_InputDebugKey", inputKey: "/Script/BlueprintGraph.K2Node_InputKey", inputVectorAxisEvent: "/Script/BlueprintGraph.K2Node_InputVectorAxisEvent", isValid: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:IsValid", kismetArrayLibrary: "/Script/Engine.KismetArrayLibrary", kismetMathLibrary: "/Script/Engine.KismetMathLibrary", knot: "/Script/BlueprintGraph.K2Node_Knot", linearColor: "/Script/CoreUObject.LinearColor", literal: "/Script/BlueprintGraph.K2Node_Literal", macro: "/Script/BlueprintGraph.K2Node_MacroInstance", makeArray: "/Script/BlueprintGraph.K2Node_MakeArray", makeMap: "/Script/BlueprintGraph.K2Node_MakeMap", makeSet: "/Script/BlueprintGraph.K2Node_MakeSet", makeStruct: "/Script/BlueprintGraph.K2Node_MakeStruct", materialExpressionComponentMask: "/Script/Engine.MaterialExpressionComponentMask", materialExpressionConstant: "/Script/Engine.MaterialExpressionConstant", materialExpressionConstant2Vector: "/Script/Engine.MaterialExpressionConstant2Vector", materialExpressionConstant3Vector: "/Script/Engine.MaterialExpressionConstant3Vector", materialExpressionConstant4Vector: "/Script/Engine.MaterialExpressionConstant4Vector", materialExpressionFunctionInput: "/Script/Engine.MaterialExpressionFunctionInput", materialExpressionLogarithm: "/Script/InterchangeImport.MaterialExpressionLogarithm", materialExpressionLogarithm10: "/Script/Engine.MaterialExpressionLogarithm10", materialExpressionLogarithm2: "/Script/Engine.MaterialExpressionLogarithm2", materialExpressionMaterialFunctionCall: "/Script/Engine.MaterialExpressionMaterialFunctionCall", materialExpressionSquareRoot: "/Script/Engine.MaterialExpressionSquareRoot", materialExpressionSubtract: "/Script/Engine.MaterialExpressionSubtract", materialExpressionTextureCoordinate: "/Script/Engine.MaterialExpressionTextureCoordinate", materialExpressionTextureSample: "/Script/Engine.MaterialExpressionTextureSample", materialExpressionWorldPosition: "/Script/Engine.MaterialExpressionWorldPosition", materialGraphNode: "/Script/UnrealEd.MaterialGraphNode", materialGraphNodeComment: "/Script/UnrealEd.MaterialGraphNode_Comment", metasoundEditorGraphExternalNode: "/Script/MetasoundEditor.MetasoundEditorGraphExternalNode", multiGate: "/Script/BlueprintGraph.K2Node_MultiGate", niagaraBool: "/Script/Niagara.NiagaraBool", niagaraClipboardContent: "/Script/NiagaraEditor.NiagaraClipboardContent", niagaraDataInterfaceVolumeTexture: "/Script/Niagara.NiagaraDataInterfaceVolumeTexture", niagaraFloat: "/Script/Niagara.NiagaraFloat", niagaraMatrix: "/Script/Niagara.NiagaraMatrix", niagaraNodeFunctionCall: "/Script/NiagaraEditor.NiagaraNodeFunctionCall", niagaraNodeOp: "/Script/NiagaraEditor.NiagaraNodeOp", niagaraNumeric: "/Script/Niagara.NiagaraNumeric", niagaraPosition: "/Script/Niagara.NiagaraPosition", pawn: "/Script/Engine.Pawn", pcgEditorGraphNode: "/Script/PCGEditor.PCGEditorGraphNode", pcgEditorGraphNodeInput: "/Script/PCGEditor.PCGEditorGraphNodeInput", pcgEditorGraphNodeOutput: "/Script/PCGEditor.PCGEditorGraphNodeOutput", pcgHiGenGridSizeSettings: "/Script/PCG.PCGHiGenGridSizeSettings", pcgSubgraphSettings: "/Script/PCG.PCGSubgraphSettings", promotableOperator: "/Script/BlueprintGraph.K2Node_PromotableOperator", quat4f: "/Script/CoreUObject.Quat4f", removeDelegate: "/Script/BlueprintGraph.K2Node_RemoveDelegate", reverseForEachLoop: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:ReverseForEachLoop", rotator: "/Script/CoreUObject.Rotator", select: "/Script/BlueprintGraph.K2Node_Select", self: "/Script/BlueprintGraph.K2Node_Self", slateBlueprintLibrary: "/Script/UMG.SlateBlueprintLibrary", spawnActorFromClass: "/Script/BlueprintGraph.K2Node_SpawnActorFromClass", switchEnum: "/Script/BlueprintGraph.K2Node_SwitchEnum", switchGameplayTag: "/Script/GameplayTagsEditor.GameplayTagsK2Node_SwitchGameplayTag", switchInteger: "/Script/BlueprintGraph.K2Node_SwitchInteger", switchName: "/Script/BlueprintGraph.K2Node_SwitchName", switchString: "/Script/BlueprintGraph.K2Node_SwitchString", timeline: "/Script/BlueprintGraph.K2Node_Timeline", timeManagementBlueprintLibrary: "/Script/TimeManagement.TimeManagementBlueprintLibrary", transform: "/Script/CoreUObject.Transform", userDefinedEnum: "/Script/Engine.UserDefinedEnum", variableGet: "/Script/BlueprintGraph.K2Node_VariableGet", variableSet: "/Script/BlueprintGraph.K2Node_VariableSet", vector: "/Script/CoreUObject.Vector", vector2D: "/Script/CoreUObject.Vector2D", vector3f: "/Script/CoreUObject.Vector3f", vector4f: "/Script/CoreUObject.Vector4f", whileLoop: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:WhileLoop" }; static pinInputWrapWidth = 145; static removeEventName = "ueb-element-delete"; static scale = { [-12]: .133333, [-11]: .166666, [-10]: .2, [-9]: .233333, [-8]: .266666, [-7]: .3, [-6]: .333333, [-5]: .375, [-4]: .5, [-3]: .675, [-2]: .75, [-1]: .875, 0: 1, 1: 1.25, 2: 1.375, 3: 1.5, 4: 1.675, 5: 1.75, 6: 1.875, 7: 2 }; static smoothScrollTime = 1e3; static stringEscapedCharacters = /["\\]/g; static subObjectAttributeNamePrefix = "#SubObject"; static subObjectAttributeNameFromEntity = (e, t = !1) => this.subObjectAttributeNamePrefix + (!t && e.Class ? `_${e.Class.type}` : "") + "_" + e.Name; static subObjectAttributeNameFromReference = (e, t = !1) => this.subObjectAttributeNamePrefix + (t ? "" : "_" + e.type) + "_" + e.path; static subObjectAttributeNameFromName = e => this.subObjectAttributeNamePrefix + "_" + e; static switchTargetPattern = /\/Script\/[\w\.\/\:]+K2Node_Switch([A-Z]\w+)+/; static trackingMouseEventName = { begin: "ueb-tracking-mouse-begin", end: "ueb-tracking-mouse-end" }; static unescapedBackslash = /(?<=(?:[^\\]|^)(?:\\\\)*)\\(?!\\)/; static windowApplyEventName = "ueb-window-apply"; static windowApplyButtonText = "OK"; static windowCancelEventName = "ueb-window-cancel"; static windowCancelButtonText = "Cancel"; static windowCloseEventName = "ueb-window-close"; static CommonEnums = { [this.paths.eAttachmentRule]: ["KeepRelative", "KeepWorld", "SnapToTarget"], [this.paths.eDrawDebugTrace]: ["None", "ForOneFrame", "ForDuration", "Persistent"], [this.paths.eMaterialSamplerType]: ["Color", "Grayscale", "Alpha", "Normal", "Masks", "Distance Field Font", "Linear Color", "Linear Grayscale", "Data", "External", "Virtual Color", "Virtual Grayscale", "Virtual Alpha", "Virtual Normal", "Virtual Mask", "Virtual Linear Color", "Virtual Linear Grayscal"], [this.paths.eNiagara_Float4Channel]: [["NewEnumerator0", "R"], ["NewEnumerator1", "G"], ["NewEnumerator2", "B"], ["NewEnumerator3", "A"]], [this.paths.eSamplerSourceMode]: ["From texture asset", "Shared: Wrap", "Shared: Clamp", "Hidden"], [this.paths.eSearchCase]: ["CaseSensitive", "IgnoreCase"], [this.paths.eWorldPositionIncludedOffsets]: ["Absolute World Position (Including Material Shader Offsets)", "Absolute World Position (Excluding Material Shader Offsets)", "Camera Relative World Position (Including Material Shader Offsets)", "Camera Relative World Position (Excluding Material Shader Offsets)"], [this.paths.eSearchDir]: ["FromStart", "FromEnd"], [this.paths.eSpawnActorCollisionHandlingMethod]: [["Undefined", "Default"], ["AlwaysSpawn", "Always Spawn, Ignore Collisions"], ["AdjustIfPossibleButAlwaysSpawn", "Try To Adjust Location, But Always Spawn"], ["AdjustIfPossibleButDontSpawnIfColliding", "Try To Adjust Location, Don't Spawn If Still Colliding"], ["DontSpawnIfColliding", "Do Not Spawn"]], [this.paths.eTextureMipValueMode]: ["None (use computed mip level)", "MipLevel (absolute, 0 is full resolution)", "MipBias (relative to the computed mip level)", "Derivative (explicit derivative to compute mip level)"], [this.paths.eTraceTypeQuery]: [["TraceTypeQuery1", "Visibility"], ["TraceTypeQuery2", "Camera"]] }; static ModifierKeys = ["Ctrl", "Shift", "Alt", "Meta"]; static rgba = ["R", "G", "B", "A"]; static Keys = { Backspace: "Backspace", Tab: "Tab", LeftControl: "ControlLeft", RightControl: "ControlRight", LeftShift: "ShiftLeft", RightShift: "ShiftRight", LeftAlt: "AltLeft", RightAlt: "AltRight", Enter: "Enter", Pause: "Pause", CapsLock: "CapsLock", Escape: "Escape", Space: "Space", PageUp: "PageUp", PageDown: "PageDown", End: "End", Home: "Home", ArrowLeft: "ArrowLeft", ArrowUp: "ArrowUp", ArrowRight: "ArrowRight", ArrowDown: "ArrowDown", PrintScreen: "PrintScreen", Insert: "Insert", Delete: "Delete", Zero: "Digit0", One: "Digit1", Two: "Digit2", Three: "Digit3", Four: "Digit4", Five: "Digit5", Six: "Digit6", Seven: "Digit7", Eight: "Digit8", Nine: "Digit9", A: "KeyA", B: "KeyB", C: "KeyC", D: "KeyD", E: "KeyE", F: "KeyF", G: "KeyG", H: "KeyH", I: "KeyI", K: "KeyK", L: "KeyL", M: "KeyM", N: "KeyN", O: "KeyO", P: "KeyP", Q: "KeyQ", R: "KeyR", S: "KeyS", T: "KeyT", U: "KeyU", V: "KeyV", W: "KeyW", X: "KeyX", Y: "KeyY", Z: "KeyZ", NumPadZero: "Numpad0", NumPadOne: "Numpad1", NumPadTwo: "Numpad2", NumPadThree: "Numpad3", NumPadFour: "Numpad4", NumPadFive: "Numpad5", NumPadSix: "Numpad6", NumPadSeven: "Numpad7", NumPadEight: "Numpad8", NumPadNine: "Numpad9", Multiply: "NumpadMultiply", Add: "NumpadAdd", Subtract: "NumpadSubtract", Decimal: "NumpadDecimal", Divide: "NumpadDivide", F1: "F1", F2: "F2", F3: "F3", F4: "F4", F5: "F5", F6: "F6", F7: "F7", F8: "F8", F9: "F9", F10: "F10", F11: "F11", F12: "F12", NumLock: "NumLock", ScrollLock: "ScrollLock" } } class ae { static clamp(e, t = -1 / 0, i = 1 / 0) { return Math.min(Math.max(e, t), i) } static getScale(e) { const t = e.blueprint?.getScale() ?? getComputedStyle(e).getPropertyValue("--ueb-scale"); return "" != t ? parseFloat(t) : 1 } static minDecimals(e, t = 1, i = 1e-8) { const s = e * 10 ** t; return Math.abs(s % 1) > i ? e.toString() : e.toFixed(t) } static roundDecimals(e, t = 1) { const i = 10 ** t; return Math.round(e * i) / i } static printExponential(e) { if (e == Number.POSITIVE_INFINITY) return "inf"; if (e == Number.NEGATIVE_INFINITY) return "-inf"; const t = Math.round(e); if (t >= 1e3) { const i = Math.floor(Math.log10(t)); return `${Math.round(e / 10 ** (i - 2)) / 100}e+${i < 10 ? "0" : ""}${i}` } return 0 == Math.floor(e) ? e.toString() : this.roundDecimals(e, Math.max(0, 3 - Math.floor(e).toString().length)).toString() } static approximatelyEqual(e, t, i = 1e-8) { return !(Math.abs(e - t) > i) } static convertLocation(e, t, i = !1) { const s = i ? 1 : 1 / ae.getScale(t), n = t.getBoundingClientRect(); return [Math.round((e[0] - n.x) * s), Math.round((e[1] - n.y) * s)] } static isSerialized(e, t) { return e.attributes?.[t]?.serialized ?? e.constructor.attributes?.[t]?.serialized ?? !1 } static objectGet(e, t, i = void 0) { if (void 0 !== e) { if (!(t instanceof Array)) throw new TypeError("UEBlueprint: Expected keys to be an array"); return 0 != t.length && t[0] in e && void 0 !== e[t[0]] ? 1 == t.length ? e[t[0]] : ae.objectGet(e[t[0]], t.slice(1), i) : i } } static objectSet(e, t, i, s = Object) { if (!(t instanceof Array)) throw new TypeError("Expected keys to be an array."); if (1 == t.length) { if (t[0] in e || void 0 === e[t[0]]) return e[t[0]] = i, !0 } else if (t.length > 0) return e[t[0]] instanceof Object || (e[t[0]] = new s), ae.objectSet(e[t[0]], t.slice(1), i, s); return !1 } static snapToGrid(e, t, i) { return 1 === i ? [e, t] : [i * Math.floor(e / i), i * Math.floor(t / i)] } static mergeArrays(e = [], t = [], i = (e, t) => e == t) { let s = []; e = [...e], t = [...t]; e: for (; ;) { for (let n = 0; n < t.length; ++n)for (let r = 0; r < e.length; ++r)if (i(e[r], t[n])) { s.push(...e.splice(0, r), ...t.splice(0, n), ...e.splice(0, 1)), t.shift(); continue e } break e } return [...new Set(s.concat(...e, ...t))] } static escapeNewlines(e) { return e.replaceAll("\n", "\\n").replaceAll("\t", "\\t") } static escapeString(e, t = !0) { let i = e.replaceAll(new RegExp(`(${re.stringEscapedCharacters.source})`, "g"), "\\$1"); return t && (i = i.replaceAll("\n", "\\n").replaceAll("\t", "\\t")), i } static unescapeString(e) { return e.replaceAll(new RegExp(re.unescapedBackslash.source + "t", "g"), "\t").replaceAll(new RegExp(re.unescapedBackslash.source + "n", "g"), "\n").replaceAll(new RegExp(`\\\\(${re.stringEscapedCharacters.source})`, "g"), "$1") } static clearHTMLWhitespace(e) { return e.replaceAll(" ", " ").replaceAll(/|
/g, "\n").replaceAll(/(\)/g, "") } static encodeHTMLWhitespace(e) { return e.replaceAll(" ", " ") } static capitalFirstLetter(e) { return 0 === e.length ? e : e.charAt(0).toUpperCase() + e.slice(1) } static formatStringName(e = "") { return e.replace(/^\s*b(?=[A-Z])/, "").replaceAll(re.nameRegexSpaceReplacement, " ").trim().split(" ").map((e => ae.capitalFirstLetter(e))).join(" ") } static getIdFromReference(e) { return e.replace(/(?:.+\.)?([^\.]+)$/, "$1").replaceAll(/(?<=[a-z\d])(?=[A-Z])|(?<=[a-zA-Z])(?=\d)|(?<=[A-Z]{2})(?=[A-Z][a-z])/g, "-").toLowerCase() } static getNameFromPath(e, t = !1) { const i = t ? /([^\.\/]+?)(?:_\d+)$/ : /([^\.\/]+)$/; return e.match(i)?.[1] ?? "" } static getPolarCoordinates(e, t, i = !1) { let s = Math.atan2(t, e); return i && s < 0 && (s = 2 * Math.PI + s), [Math.sqrt(e * e + t * t), s] } static getCartesianCoordinates(e, t) { return [e * Math.cos(t), e * Math.sin(t)] } static range(e = 0, t = 0, i = (t >= e ? 1 : -1)) { return Array.from({ length: Math.ceil((t - e) / i) }, ((t, s) => e + s * i)) } static getFirstWordOrder(e) { return new RegExp(/\s*/.source + e.join(/[^\n]+\n\s*/.source) + /\s*/.source) } static paste(e, t) { const i = new ClipboardEvent("paste", { bubbles: !0, cancelable: !0, clipboardData: new DataTransfer }); i.clipboardData.setData("text", t), e.dispatchEvent(i) } static async copy(e) { const t = new ClipboardEvent("copy", { bubbles: !0, cancelable: !0, clipboardData: new DataTransfer }); e.dispatchEvent(t) } static animate(e, t, i, s, n = e => { }, r = e => { const t = e ** 3.5; return t / (t + (1 - e) ** 3.5) }) { let a; const o = l => { void 0 === a && (a = l); let u = (l - a) / i; ae.approximatelyEqual(u, 1) || u > 1 ? u = 1 : n(requestAnimationFrame(o)); const c = e + (t - e) * r(u); s(c) }; n(requestAnimationFrame(o)) } } class oe extends se { #e; get blueprint() { return this.#e } set blueprint(e) { this.#e = e } #t; get entity() { return this.#t } set entity(e) { this.#t = e } #i; get template() { return this.#i } isInitialized = !1; isSetup = !1; inputObjects = []; initialize(e, t) { this.requestUpdate(), this.#t = e, this.#i = t, this.#i.initialize(this), this.isConnected && this.updateComplete.then((() => this.setup())), this.isInitialized = !0 } connectedCallback() { super.connectedCallback(), this.blueprint = this.closest("ueb-blueprint"), this.isInitialized && (this.requestUpdate(), this.updateComplete.then((() => this.setup()))) } disconnectedCallback() { super.disconnectedCallback(), this.isSetup && this.updateComplete.then((() => this.cleanup())), this.acknowledgeDelete() } createRenderRoot() { return this } setup() { this.template.setup(), this.isSetup = !0 } cleanup() { this.template.cleanup(), this.isSetup = !1 } willUpdate(e) { super.willUpdate(e), this.template.willUpdate(e) } update(e) { super.update(e), this.template.update(e) } render() { return this.template.render() } firstUpdated(e) { super.firstUpdated(e), this.template.firstUpdated(e), this.template.inputSetup() } updated(e) { super.updated(e), this.template.updated(e) } acknowledgeDelete() { let e = new CustomEvent(re.removeEventName); this.dispatchEvent(e) } isSameGraph(e) { return this.blueprint && this.blueprint == e?.blueprint } } class le { static arrayPin = G``; static branchNode = G``; static breakStruct = G``; static cast = G``; static close = G``; static convert = G``; static correct = G``; static delegate = G``; static doN = G``; static doOnce = G``; static enum = G``; static event = G``; static execPin = G``; static expandIcon = G``; static flipflop = G``; static forEachLoop = G``; static functionSymbol = G``; static gamepad = G``; static genericPin = G``; static keyboard = G``; static loop = G``; static macro = G``; static mapPin = G``; static makeArray = G``; static makeMap = G``; static makeSet = G``; static makeStruct = G``; static metasoundFunction = G``; static mouse = G``; static node = G``; static operationPin = G``; static pcgStackPin = G``; static pcgPin = G``; static pcgParamPin = G``; static pcgSpatialPin = G``; static plusCircle = G``; static questionMark = G``; static referencePin = G``; static reject = G``; static setPin = G``; static select = G``; static sequence = G``; static sound = G``; static spawnActor = G``; static switch = G``; static timer = G``; static touchpad = G`` } class ue { static makeSuccess(e, t, i = null, s = 0) { return { status: !0, value: t, position: e, bestParser: i, bestPosition: s } } static makeFailure(e = 0, t = null, i = 0) { return { status: !1, value: null, position: e, bestParser: t, bestPosition: i } } static makeContext(e = null, t = "") { return { parsernostrum: e, input: t, highlighted: null } } static makePathNode(e, t = 0, i = null) { return { parent: i, current: e, index: t } } } class ce { static indentation = " "; static highlight = "Last valid parser"; Self; static frame(e, t = "", i = "") { t = e ? "[ " + t + " ]" : ""; let s = e.split("\n"); const n = Math.max(...s.map((e => e.length))), r = n < t.length ? " ".repeat(t.length - n) : ""; for (let e = 0; e < s.length; ++e)s[e] = i + "| " + s[e] + " ".repeat(n - s[e].length) + r + " |"; t.length < n && (t += "─".repeat(n - t.length)); const a = "┌─" + t + "─┐", o = i + "└─" + "─".repeat(t.length) + "─┘"; return s = [a, ...s, o], s.join("\n") } makePath(e, t) { return { current: this, parent: e, index: t } } isHighlighted(e, t) { if (e.highlighted instanceof ce) return e.highlighted === this; if (!e.highlighted || !t?.current) return !1; let i, s; for (i = t, s = e.highlighted; i.current && s.current; i = i.parent, s = s.parent)if (i.current !== s.current || i.index !== s.index) return !1; return !i.current && !s.current } isVisited(e) { if (!e) return !1; for (e = e.parent; null != e; e = e.parent)if (e.current === this) return !0; return !1 } parse(e, t, i, s) { return null } toString(e = ue.makeContext(null, ""), t = "", i = null, s = 0) { if (i = this.makePath(i, s), this.isVisited(i)) return "<...>"; const n = this.isVisited(i), r = this.isHighlighted(e, i); let a = n ? "<...>" : this.doToString(e, r ? "" : t, i, s); return r && (a = ce.frame(a, ce.highlight, t)), a } doToString(e, t, i, s) { return `${this.constructor.name} does not implement toString()` } } class he extends ce { #s; get value() { return this.#s } constructor(e) { super(), this.#s = e } parse(e, t, i, s) { i = this.makePath(i, s); const n = t + this.#s.length, r = e.input.substring(t, n); return this.#s === r ? ue.makeSuccess(n, this.#s, i, n) : ue.makeFailure() } doToString(e, t, i, s) { return `"${this.value.replaceAll("\n", "\\n").replaceAll('"', '\\"')}"` } } class pe extends ce { static instance = new pe; parse(e, t, i, s) { return i = this.makePath(i, s), ue.makeSuccess(t, "", i, 0) } doToString(e, t, i, s) { return "" } } class de extends ce { #n; get parsers() { return this.#n } constructor(...e) { super(), this.#n = e } parse(e, t, i, s) { i = this.makePath(i, s); const n = ue.makeSuccess(0, ""); for (let s = 0; s < this.#n.length; ++s) { const r = this.#n[s].parse(e, t, i, s); if (r.bestPosition > n.bestPosition && (n.bestParser = r.bestParser, n.bestPosition = r.bestPosition), r.status) return n.value = r.value, n.position = r.position, n } return n.status = !1, n.value = null, n } doToString(e, t, i, s) { if (2 === this.#n.length && this.#n[1] instanceof pe) { let s = this.#n[0].toString(e, t, i, 0); return this.#n[0] instanceof he || (s = "<" + s + ">"), s += "?", s } const n = t + ce.indentation; let r = "ALT<\n" + n + this.#n.map(((t, s) => t.toString(e, n + " ".repeat(0 === s ? 0 : ce.indentation.length - 2), i, s))).join("\n" + n + "| ") + "\n" + t + ">"; return r } } class me extends ce { #r; get parser() { return this.#r } #a; constructor(e, t) { super(), this.#r = e, this.#a = t } parse(e, t, i, s) { i = this.makePath(i, s); const n = this.#r.parse(e, t, i, 0); if (!n.status) return n; const r = this.#a(n.value, e.input, n.position).getParser().parse(e, n.position, i, 0); return n.bestPosition > r.bestPosition && (r.bestParser = n.bestParser, r.bestPosition = n.bestPosition), r } doToString(e, t, i, s) { return this.#r.toString(e, t, i, 0) + " => chained" } } class ge extends ce { static instance = new ge; parse(e, t, i, s) { return ue.makeFailure() } doToString(e, t, i, s) { return "" } } class be extends ce { #r; get parser() { return this.#r } #o = ""; constructor(e, t) { super(), this.#r = e, this.#o = t } makePath(e, t) { return e } parse(e, t, i, s) { return this.parse = this.#r.parse.bind(this.#r), this.parse(e, t, i, s) } doToString(e, t, i, s) { let n = this.#r.toString(e, "", i, s); return n = ce.frame(n, this.#o, t), n } } class ve extends ce { #r; #l; constructor(e) { super(), this.#r = e } makePath(e, t) { return e } isHighlighted(e, t) { if (super.isHighlighted(e, t)) { const i = { parent: t, parser: this.#l, index: 0 }; e.highlighted = e.highlighted instanceof ce ? this.#l : i } return !1 } resolve() { return this.#l || (this.#l = this.#r().getParser()), this.#l } parse(e, t, i, s) { return this.resolve(), this.parse = this.#l.parse.bind(this.#l), this.parse(e, t, i, s) } doToString(e, t, i, s) { return this.resolve(), this.doToString = this.#l.toString.bind(this.#l), this.doToString(e, t, i, s) } } class fe extends ce { #r; get parser() { return this.#r } #u; get type() { return this.#u } static Type = { NEGATIVE_AHEAD: "?!", NEGATIVE_BEHIND: "? String.raw`[^${e}\\]*(?:\\.[^${e}\\]*)*`; static #m = /[-\+]?(?:\d*\.)?\d+/; static common = { number: new RegExp(this.#m.source + String.raw`(?!\.)`), numberInteger: /[\-\+]?\d+(?!\.\d)/, numberNatural: /\d+/, numberExponential: new RegExp(this.#m.source + String.raw`(?:[eE][\+\-]?\d+)?(?!\.)`), numberUnit: /\+?(?:0(?:\.\d+)?|1(?:\.0+)?)(?![\.\d])/, numberByte: /0*(?:25[0-5]|2[0-4]\d|1?\d?\d)(?!\d|\.)/, whitespace: /\s+/, whitespaceOpt: /\s*/, whitespaceInline: /[^\S\n]+/, whitespaceInlineOpt: /[^\S\n]*/, whitespaceMultiline: /\s*?\n\s*/, doubleQuotedString: new RegExp(`"(${this.#d('"')})"`), singleQuotedString: new RegExp(`'(${this.#d("'")})'`), backtickQuotedString: new RegExp("`(" + this.#d("`") + ")`") }; constructor(e, t) { super(), this.#c = e, this.#h = new RegExp(`^(?:${e.source})`, e.flags), this.#p = t } parse(e, t, i, s) { i = this.makePath(i, s); const n = this.#h.exec(e.input.substring(t)); n && (t += n[0].length); return n ? ue.makeSuccess(t, this.#p(n), i, t) : ue.makeFailure() } doToString(e, t, i, s) { let n = "/" + this.#c.source + "/"; const r = Object.entries(ye.common).find((([e, t]) => t.source === this.#c.source))?.[0]; return r && (n = "P." + r), n } } class we extends ce { #r; get parser() { return this.#r } #g; get mapper() { return this.#g } constructor(e, t) { super(), this.#r = e, this.#g = t } isHighlighted(e, t) { if (super.isHighlighted(e, t)) { const i = { parent: t, parser: this.#r, index: 0 }; e.highlighted = e.highlighted instanceof ce ? this.#r : i } return !1 } parse(e, t, i, s) { i = this.makePath(i, s); const n = this.#r.parse(e, t, i, 0); return n.status && (n.value = this.#g(n.value)), n } doToString(e, t, i, s) { let n = this.#r.toString(e, t, i, 0); if (this.#r instanceof ye && Object.values(ye.common).includes(this.#r.regexp)) return this.#r.regexp === ye.common.numberInteger && this.#g === BigInt ? "P.numberBigInteger" : n; let r = this.#g.toString(); return (r.length > 60 || r.includes("\n")) && (r = "(...) => { ... }"), n += ` -> map<${r}>`, n } } class Se extends ye { static #g = e => e; constructor(e) { super(e, Se.#g) } } class Ee extends ye { constructor(e, t = 0) { super(e, (e => e[t])) } } class Ce extends ce { #n; get parsers() { return this.#n } constructor(...e) { super(), this.#n = e } parse(e, t, i, s) { i = this.makePath(i, s); const n = new Array(this.#n.length), r = ue.makeSuccess(t, n); for (let t = 0; t < this.#n.length; ++t) { const s = this.#n[t].parse(e, r.position, i, t); if (s.bestPosition > r.bestPosition && (r.bestParser = s.bestParser, r.bestPosition = s.bestPosition), !s.status) { r.status = !1, r.value = null; break } r.value[t] = s.value, r.position = s.position } return r } doToString(e, t, i, s) { const n = t + ce.indentation, r = "SEQ<\n" + n + this.#n.map(((t, s) => t.toString(e, n, i, s))).join("\n" + n) + "\n" + t + ">"; return r } } class Ne extends ce { #r; get parser() { return this.#r } #b; get min() { return this.#b } #v; get max() { return this.#v } constructor(e, t = 0, i = Number.POSITIVE_INFINITY) { if (super(), t > i) throw new Error("Min is greater than max"); this.#r = e, this.#b = t, this.#v = i } parse(e, t, i, s) { i = this.makePath(i, s); const n = ue.makeSuccess(t, [], i); for (let t = 0; t < this.#v; ++t) { const s = this.#r.parse(e, n.position, i, 0); if (s.bestPosition > n.bestPosition && (n.bestParser = s.bestParser, n.bestPosition = s.bestPosition), !s.status) { t < this.#b && (n.status = !1, n.value = null); break } n.value.push(s.value), n.position = s.position } return n } doToString(e, t, i, s) { let n = this.parser.toString(e, t, i, 0); return n += 0 === this.#b && 1 === this.#v ? "?" : 0 === this.#b && this.#v === Number.POSITIVE_INFINITY ? "*" : 1 === this.#b && this.#v === Number.POSITIVE_INFINITY ? "+" : "{" + this.#b + (this.#b !== this.#v ? "," + this.#v : "") + "}", n } } class xe { #r; Self; static lineColumnFromOffset(e, t) { const i = e.substring(0, t).split("\n"); return { line: i.length, column: i[i.length - 1].length + 1 } } static #f = ([e, t]) => e; static #y = ([e, t]) => t; static #w = ([e, t]) => [e, ...t]; static #S = e => e instanceof Array ? e.join("") : e; static number = this.reg(ye.common.number).map(Number); static numberInteger = this.reg(ye.common.numberInteger).map(Number); static numberBigInteger = this.reg(this.numberInteger.getParser().parser.regexp).map(BigInt); static numberNatural = this.reg(ye.common.numberNatural).map(Number); static numberExponential = this.reg(ye.common.numberExponential).map(Number); static numberUnit = this.reg(ye.common.numberUnit).map(Number); static numberByte = this.reg(ye.common.numberByte).map(Number); static whitespace = this.reg(ye.common.whitespace); static whitespaceOpt = this.reg(ye.common.whitespaceOpt); static whitespaceInline = this.reg(ye.common.whitespaceInline); static whitespaceInlineOpt = this.reg(ye.common.whitespaceInlineOpt); static whitespaceMultiline = this.reg(ye.common.whitespaceMultiline); static doubleQuotedString = this.reg(ye.common.doubleQuotedString, 1); static singleQuotedString = this.reg(ye.common.singleQuotedString, 1); static backtickQuotedString = this.reg(ye.common.backtickQuotedString, 1); constructor(e, t = !1) { this.#r = e } static #E(e) { const t = []; for (; e;)t.push(e), e = e.parent; t.reverse(); let i = new Map; for (let e = 1; e < t.length; ++e) { const s = i.get(t[e].current); void 0 !== s ? (t[e + 1] && (t[e + 1].parent = t[s]), i = new Map([...i.entries()].filter((([t, i]) => i <= s || i > e))), i.set(t[e].current, s), t.splice(s + 1, e - s), e = s) : i.set(t[e].current, e) } return t[t.length - 1] } getParser() { return this.#r } run(e) { const t = this.#r.parse(ue.makeContext(this, e), 0, ue.makePathNode(), 0); return t.position !== e.length && (t.status = !1), t } parse(e, t = !0) { const i = this.run(e); if (i.status) return i.value; const s = [Math.ceil(30), Math.floor(30)], n = xe.lineColumnFromOffset(e, i.bestPosition); let r = i.bestPosition; const a = e.replaceAll(/^(\s)+|\s{6,}|\s*?\n\s*/g, ((e, t, s) => { let n = t ? "..." : " ... "; return s <= i.bestPosition && (i.bestPosition < s + e.length ? r -= i.bestPosition - s : r -= e.length - n.length), n })), o = a.substring(0, 60).trimEnd(), l = Math.min(e.substring(i.bestPosition - s[0]).match(/^\s*/)[0].length, s[0] - 1); let u = Math.min(r, s[0] - l); s[0] = Math.max(0, r - s[0]) + l, s[1] = Math.min(e.length, s[0] + 60); let c = a.substring(...s); s[0] > 0 && (c = "..." + c, u += 3), s[1] < a.length - 1 && (c += "..."); const h = this.toString(ce.indentation, !0, xe.#E(i.bestParser)); throw new Error(`Could not parse: ${o}\n\nInput: ${c}\n ` + " ".repeat(u) + `^ From here (line: ${n.line}, ` + `column: ${n.column}, ` + `offset: ${i.bestPosition})${i.bestPosition === e.length ? ", end of string" : ""}\n` + (t ? "\n" + (i.bestParser ? "Last valid parser matched:" : "No parser matched:") + h + "\n" : "")) } static str(e) { return new this(new he(e)) } static reg(e, t = 0) { return new this(new Ee(e, t)) } static regArray(e) { return new this(new Se(e)) } static success() { return new this(pe.instance) } static failure() { return new this(ge.instance) } static seq(...e) { return new this(new Ce(...e.map((e => e.getParser())))) } static alt(...e) { return new this(new de(...e.map((e => e.getParser())))) } static lookahead(e) { return new this(new fe(e.getParser(), fe.Type.POSITIVE_AHEAD)) } static lazy(e) { return new this(new ve(e)) } times(e, t = e) { return new xe(new Ne(this.#r, e, t)) } many() { return this.times(0, Number.POSITIVE_INFINITY) } atLeast(e) { return this.times(e, Number.POSITIVE_INFINITY) } atMost(e) { return this.times(0, e) } opt(e = "") { let t = xe.success(); return "" !== e && (t = t.map((() => e))), xe.alt(this, t) } sepBy(e, t = 1, i = !1) { let s = xe.seq(this, xe.seq(e, this).map(xe.#y).atLeast(t - 1), ...i ? [e.opt([])] : []).map(xe.#w); return 0 === t && (s = s.opt([])), s } skipSpace() { return xe.seq(this, xe.whitespaceOpt).map(xe.#f) } map(e) { return new xe(new we(this.#r, e)) } chain(e) { return new xe(new me(this.#r, e)) } assert(e) { return this.chain(((t, i, s) => e(t, i, s) ? xe.success().map((() => t)) : xe.failure())) } join(e = "") { return this.map(xe.#S) } label(e = "") { return new xe(new be(this.#r, e)) } toString(e = "", t = !1, i = null) { i instanceof xe && (i = i.getParser()); const s = ue.makeContext(this, ""); s.highlighted = i; const n = ue.makePathNode(); return (t ? "\n" + e : "") + this.#r.toString(s, e, n) } } class Pe { static same = e => e; static notWrapped = (e, t) => t; static defaultWrapped = (e, t) => `${e.#C}(${t})`; static wrap = this.defaultWrapped; static attributeSeparator = ","; static keySeparator = "="; static printKey = e => e; static grammar = xe.lazy((() => this.createGrammar())); static unknownEntityGrammar; static unknownEntity; static attributes = {}; static lookbehind = ""; static default; static nullable = !1; static ignored = !1; static serialized = !1; static expected = !1; static inlined = !1; static quoted; static silent = !1; static trailing = !1; #N; get keys() { return this.#N ?? Object.keys(this) } set keys(e) { this.#N = [...new Set(e)] } #C = this.constructor.lookbehind; get lookbehind() { return this.#C.trim() } set lookbehind(e) { this.#C = e } #x = this.constructor.ignored; get ignored() { return this.#x } set ignored(e) { this.#x = e } #P = this.constructor.inlined; get inlined() { return this.#P } set inlined(e) { this.#P = e } #k; get quoted() { return this.#k ?? this.constructor.quoted ?? !1 } set quoted(e) { this.#k = e } #A; get trailing() { return this.#A ?? this.constructor.trailing ?? !1 } set trailing(e) { this.#A = e } constructor(e = {}) { const t = this.constructor.attributes, i = ae.mergeArrays(Object.keys(e), Object.entries(t).filter((([e, t]) => void 0 !== t.default)).map((([e, t]) => e))); for (const s of i) { if (void 0 !== e[s]) { e[s].constructor === Object && (e[s] = new (void 0 !== t[s] ? t[s] : Pe.unknownEntity)(e[s])); const i = t[s]; if (this[s] = e[s], i?.compute) { const t = i.compute(this).grammar.run(e[s].toString()); t.status && (this[s] = t.value) } continue } const i = t[s]; void 0 === i.default || (this[s] = i.default(i)) } } static createGrammar() { return this.unknownEntityGrammar } static actualClass() { let e = this; for (; !e.name;)e = Object.getPrototypeOf(e); return e } static className() { return this.actualClass().name } static asUniqueClass() { let e = this; return this.name.length && (e = class extends (this) { }, e.grammar = e.createGrammar()), e } static withLookbehind(e) { const t = this.asUniqueClass(); return t.lookbehind = e, t } static withDefault(e = e => new e) { const t = this.asUniqueClass(); return t.default = e, t } static flagNullable(e = !0) { const t = this.asUniqueClass(); return t.nullable = e, t } static flagIgnored(e = !0) { const t = this.asUniqueClass(); return t.ignored = e, t } static flagSerialized(e = !0) { const t = this.asUniqueClass(); return t.serialized = e, t } static flagInlined(e = !0) { const t = this.asUniqueClass(); return t.inlined = e, t } static flagQuoted(e = !0) { const t = this.asUniqueClass(); return t.quoted = e, t } static flagSilent(e = !0) { const t = this.asUniqueClass(); return t.silent = e, t } static flagTrailing(e = !0) { const t = this.asUniqueClass(); return t.trailing = e, t } static asSerializedString(e) { return `"${e.replaceAll(/(?<=(?:[^\\]|^)(?:\\\\)*?)"/g, '\\"')}"` } showProperty(e) { let t = this[e]; const i = t.constructor; if (i.silent && void 0 !== i.default) { void 0 === i["#default"] && (i["#default"] = i.default(i)); const e = i["#default"]; return !t.equals(e) } return !0 } listenAttribute(e, t) { const i = Object.getOwnPropertyDescriptor(this, e), s = i.set; s ? (i.set = e => { s(e), t(e) }, Object.defineProperties(this, { [e]: i })) : i.value && Object.defineProperties(this, { ["#" + e]: { value: i.value, writable: !0, enumerable: !1 }, [e]: { enumerable: !0, get() { return this["#" + e] }, set(i) { t(i), this["#" + e] = i } } }) } doSerialize(e = !1, t = "", i = this.constructor, s = i.printKey, n = i.keySeparator, r = i.attributeSeparator, a = i.wrap) { const o = i !== this.constructor; let l = "", u = !0; const c = this instanceof Pe ? this.keys : Object.keys(this); for (const a of c) { const o = this[a], c = o?.constructor; if (void 0 === o || this instanceof Pe && !this.showProperty(a)) continue; u ? u = !1 : l += r; let h = this instanceof Array ? `(${a})` : a; if (h.length && (i.attributes[a]?.quoted || o.quoted) && (h = `"${h}"`), o.inlined) { const a = "ArrayEntity" === c.className() ? e => s(`${h}${e}`) : e => s(`${h}.${e}`); l += o.serialize(e, t, void 0, a, n, r, i.notWrapped); continue } h = s(h), h.length && (l += (r.includes("\n") ? t : "") + h + n); let p = o?.serialize(e, t); l += p } return this instanceof Pe && (o && i.trailing || this.trailing) && l.length && (l += r), a(this, l) } serialize(e = !1, t = "", i = this.constructor, s = i.printKey, n = i.keySeparator, r = i.attributeSeparator, a = i.wrap) { this.constructor; let o = this instanceof Array ? Pe.prototype.doSerialize.bind(this)(e, t, i, s, n, r, a) : this.doSerialize(e, t, i, s, n, r, a); return i.serialized && (o = Pe.asSerializedString(o)), o } equals(e) { if (!(e instanceof Pe)) return !1; const t = Object.keys(this), i = Object.keys(e), s = this.constructor.actualClass(), n = e.constructor.actualClass(); if (!(t.length === i.length && this.lookbehind == e.lookbehind && (e instanceof s || this instanceof n))) return !1; for (let s = 0; s < t.length; ++s) { const n = t[s]; if (!i.includes(n)) return !1; const r = this[n], a = e[n]; if (r instanceof Pe) { if (!r.equals(a)) return !1 } else if (r instanceof Array && a instanceof Array) { if (r.length !== a.length) return !1; for (let e = 0; e < r.length; ++e)if (!(r[e] instanceof Pe && r[e].equals(a[e])) && r[e] !== a[e]) return !1 } else if (r !== a) return !1 } return !0 } } class ke extends Pe { static grammar = this.createGrammar(); static booleanConverter = { fromAttribute: (e, t) => { }, toAttribute: (e, t) => !0 === e ? "true" : !1 === e ? "false" : "" }; #L = !0; get uppercase() { return this.#L } set uppercase(e) { this.#L = e } static createGrammar() { return xe.regArray(/(true)|(True)|(false)|(False)/).map((e => { const t = e[1] ?? e[2] ? new this(!0) : new this(!1); return t.uppercase = void 0 !== (e[2] ?? e[4]), t })).label("BooleanEntity") } constructor(e = !1) { super(), this.value = e } serialize(e = !1, t = "", i = this.constructor) { let s = this.value ? this.#L ? "True" : "true" : this.#L ? "False" : "false"; return i.serialized && (s = `"${s}"`), s } valueOf() { return this.value } } class Ae { static #M = new Map; static registerElement(e, t) { Ae.#M.set(e, t) } static getConstructor(e) { return Ae.#M.get(e) } } class Le extends Pe { static alternatives = []; static className() { let e = super.className(); return this.alternatives.length && (e += ".accepting(" + this.alternatives.map((e => e.className())).join(", ") + ")"), e } static createGrammar() { const e = this.alternatives.map((e => e.grammar)); return 0 == this.alternatives.length || e.includes(this.unknownEntityGrammar) ? this.unknownEntityGrammar : xe.alt(...e) } static accepting(...e) { const t = this.asUniqueClass(); return t.alternatives = e, t.grammar = t.createGrammar(), t } } class Me { static numberRegexSource = xe.number.getParser().parser.regexp.source; static separatedBy = (e, t, i = 1) => new RegExp(e + "(?:" + t + e + ")" + (1 === i ? "*" : 2 === i ? "+" : `{${i},}`)); static Regex = class { static HexDigit = /[0-9a-fA-F]/; static InsideString = /(?:[^"\\]|\\.)*/; static InsideSingleQuotedString = /(?:[^'\\]|\\.)*/; static Integer = /[\-\+]?\d+(?!\d|\.)/; static Number = /[-\+]?(?:\d*\.)?\d+(?!\d|\.)/; static RealUnit = /\+?(?:0(?:\.\d+)?|1(?:\.0+)?)(?![\.\d])/; static Word = Me.separatedBy("[a-zA-Z]", "_"); static Symbol = /[a-zA-Z_]\w*/; static DotSeparatedSymbols = Me.separatedBy(this.Symbol.source, "\\."); static MultipleWordsSymbols = Me.separatedBy(this.Symbol.source, "(?:\\.|\\ +)"); static PathFragment = Me.separatedBy(this.Symbol.source, "[\\.:]"); static PathSpaceFragment = Me.separatedBy(this.Symbol.source, "[\\.:\\ ]"); static Path = new RegExp(`(?:\\/${this.PathFragment.source}){2,}`) }; static null = xe.reg(/\(\s*\)/).map((() => null)); static true = xe.reg(/true/i).map((() => !0)); static false = xe.reg(/false/i).map((() => !1)); static number = xe.regArray(new RegExp(`(${xe.number.getParser().parser.regexp.source})|(\\+?inf)|(-inf)`)).map((([e, t, i, s]) => t ? Number(t) : i ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY)); static bigInt = xe.reg(new RegExp(xe.number.getParser().parser.regexp.source)).map(BigInt).map((e => void 0 !== e[2] ? Number.POSITIVE_INFINITY : void 0 !== e[3] ? Number.NEGATIVE_INFINITY : Number(e[1]))); static naturalNumber = xe.lazy((() => xe.reg(/\d+/).map(Number))); static string = xe.doubleQuotedString.map((e => ae.unescapeString(e))); static colorValue = xe.numberByte; static word = xe.reg(Me.Regex.Word); static symbol = xe.reg(Me.Regex.Symbol); static symbolQuoted = xe.reg(new RegExp('"(' + Me.Regex.Symbol.source + ')"'), 1); static attributeName = xe.reg(Me.Regex.DotSeparatedSymbols); static attributeNameQuoted = xe.reg(new RegExp('"(' + Me.Regex.InsideString.source + ')"'), 1); static guid = xe.reg(new RegExp(`${Me.Regex.HexDigit.source}{32}`)); static commaSeparation = xe.reg(/\s*,\s*(?!\))/); static commaOrSpaceSeparation = xe.reg(/\s*,\s*(?!\))|\s+/); static equalSeparation = xe.reg(/\s*=\s*/); static hexColorChannel = xe.reg(new RegExp(Me.Regex.HexDigit.source + "{2}")); static getAttribute(e, [t, ...i]) { const s = e?.attributes?.[t]; if (s) { if (s.prototype instanceof Le) for (const e of s.alternatives) { const t = this.getAttribute(e, i); if (t) return t } return i.length > 0 ? this.getAttribute(s, i) : s } } static createAttributeGrammar(e, t = this.attributeName, i = this.equalSeparation, s = (e, t, i) => { }) { return xe.seq(t, i).chain((([t, i]) => { const n = t.split(re.keysSeparator), r = this.getAttribute(e, n), a = r ? r.grammar : Pe.unknownEntityGrammar, o = n.length > 1; return a.map((e => t => { ae.objectSet(t, n, e), n.reduce(((e, t, i) => (e[t].inlined = o && i < n.length - 1, e[t])), t), s(t, n, e) })) })) } static createEntityGrammar(e, t = this.commaSeparation, i = null, s = 1) { const n = e.lookbehind instanceof Array ? e.lookbehind.join("|") : e.lookbehind; return xe.seq(xe.reg(new RegExp(String.raw`(${n}\s*)\(\s*`), 1), this.createAttributeGrammar(e).sepBy(t, s), xe.reg(/\s*(,\s*)?\)/, 1)).map((([e, t, i]) => { let s = {}; return e.length && (s.lookbehind = e), t.forEach((e => e(s))), s.trailing = void 0 !== i, s })).chain((t => { (e.lookbehind instanceof Array || e.lookbehind !== n) && (e = e.withLookbehind(n)); const s = Object.keys(t), r = Object.keys(e.attributes); return null != i ? xe.success().assert((e => s.filter((e => r.includes(e))).length / r.length >= i)).map((() => new e(t))) : xe.success().map((() => new e(t))) })) } } class Te extends Pe { static grammar = this.createGrammar(); constructor(e = 0) { super(), this.value = e } static createGrammar() { return xe.number.map((e => new this(e))) } serialize(e = !1, t = "", i = this.constructor) { let s = this.value.toFixed(6); return i.serialized && (s = `"${s}"`), s } valueOf() { return this.value } } class Ie extends Pe { static attributes = { ...super.attributes, R: Te.withDefault(), G: Te.withDefault(), B: Te.withDefault(), A: Te.withDefault((e => new e(1))) }; static grammar = this.createGrammar(); #T = new Te; get H() { return this.#T } set H(e) { this.#T = e } #I = new Te; get S() { return this.#I } set S(e) { this.#I = e } #O = new Te; get V() { return this.#O } set V(e) { this.#O = e } constructor(e) { super(e), e instanceof Array && (e = { R: e[0] ?? 0, G: e[1] ?? 0, B: e[2] ?? 0, A: e[3] ?? 1 }), this.R, this.G, this.B, this.A, this.#D() } static createGrammar() { return Me.createEntityGrammar(this, Me.commaSeparation, .5).label("LinearColorEntity") } static printLinearColor(e) { return `${Math.round(255 * e.R.valueOf())}, ${Math.round(255 * e.G.valueOf())}, ${Math.round(255 * e.B.valueOf())}` } static linearToSRGB(e) { return e <= 0 ? 0 : e >= 1 ? 1 : e < .0031308 ? 12.92 * e : 1.055 * Math.pow(e, 1 / 2.4) - .055 } static sRGBtoLinear(e) { return e <= 0 ? 0 : e >= 1 ? 1 : e < .04045 ? e / 12.92 : Math.pow((e + .055) / 1.055, 2.4) } static getWhite() { return new Ie({ R: new Te(1), G: new Te(1), B: new Te(1) }) } static getLinearColorFromHexGrammar() { const e = /[0-9a-fA-F]/; return xe.regArray(new RegExp("#(" + e.source + "{2})(" + e.source + "{2})(" + e.source + "{2})(" + e.source + "{2})?")).map((([e, t, i, s, n]) => new this({ R: parseInt(t, 16) / 255, G: parseInt(i, 16) / 255, B: parseInt(s, 16) / 255, A: parseInt(n ?? "FF", 16) / 255 }))) } static getLinearColorRGBListGrammar() { return xe.seq(xe.numberByte, Me.commaSeparation, xe.numberByte, Me.commaSeparation, xe.numberByte).map((([e, t, i, s, n]) => new this({ R: e / 255, G: i / 255, B: n / 255, A: 1 }))) } static getLinearColorRGBGrammar() { return xe.seq(xe.reg(/rgb\s*\(\s*/), this.getLinearColorRGBListGrammar(), xe.reg(/\s*\)/)).map((([e, t, i]) => t)) } static getLinearColorRGBAGrammar() { return xe.seq(xe.reg(/rgba\s*\(\s*/), this.getLinearColorRGBListGrammar(), xe.reg(/\s*\)/)).map((([e, t, i]) => t)) } static getLinearColorFromAnyFormat() { return xe.alt(this.getLinearColorFromHexGrammar(), this.getLinearColorRGBAGrammar(), this.getLinearColorRGBGrammar(), this.getLinearColorRGBListGrammar()) } #D() { const e = this.R.value, t = this.G.value, i = this.B.value; if (ae.approximatelyEqual(e, t) && ae.approximatelyEqual(e, i) && ae.approximatelyEqual(t, i)) return this.S.value = 0, void (this.V.value = e); const s = Math.max(e, t, i), n = Math.min(e, t, i), r = s - n; let a; switch (s) { case n: a = 0; break; case e: a = (t - i) / r + (t < i ? 6 : 0); break; case t: a = (i - e) / r + 2; break; case i: a = (e - t) / r + 4 }a /= 6, this.H.value = a, this.S.value = 0 == s ? 0 : r / s, this.V.value = s } setFromRGBA(e, t, i, s = 1) { this.R.value = e, this.G.value = t, this.B.value = i, this.A.value = s, this.#D() } setFromHSVA(e, t, i, s = 1) { const n = Math.floor(6 * e), r = 6 * e - n, a = i * (1 - t), o = [i, i * (1 - r * t), a, a, i * (1 - (1 - r) * t), i], [l, u, c] = [o[n % 6], o[(n + 4) % 6], o[(n + 2) % 6]]; this.R.value = l, this.G.value = u, this.B.value = c, this.A.value = s, this.H.value = e, this.S.value = t, this.V.value = i } setFromWheelLocation(e, t, i, s) { const [n, r] = ae.getPolarCoordinates(e, t, !0); this.setFromHSVA(1 - r / (2 * Math.PI), n, i, s) } toDimmedColor(e = 0) { const t = new Ie; return t.setFromRGBANumber(this.toNumber()), t.setFromHSVA(t.H.value, .6 * t.S.value, .7 * Math.pow(t.V.value + e, .55)), t } toCSSRGBValues() { const e = Math.round(255 * this.R.value), t = Math.round(255 * this.G.value), i = Math.round(255 * this.B.value); return r`${e}${t}${i}` } toRGBA() { return [Math.round(255 * this.R.value), Math.round(255 * this.G.value), Math.round(255 * this.B.value), Math.round(255 * this.A.value)] } toSRGBA() { return [Math.round(255 * Ie.linearToSRGB(this.R.value)), Math.round(255 * Ie.linearToSRGB(this.G.value)), Math.round(255 * Ie.linearToSRGB(this.B.value)), Math.round(255 * this.A.value)] } toRGBAString() { return this.toRGBA().map((e => e.toString(16).toUpperCase().padStart(2, "0"))).join("") } toSRGBAString() { return this.toSRGBA().map((e => e.toString(16).toUpperCase().padStart(2, "0"))).join("") } toHSVA() { return [this.H.value, this.S.value, this.V.value, this.A.value] } toNumber() { return (Math.round(255 * this.R.value) << 24) + (Math.round(255 * this.G.value) << 16) + (Math.round(255 * this.B.value) << 8) + Math.round(255 * this.A.value) } toArray() { return [this.R.value, this.G.value, this.B.value, this.A.value] } setFromRGBANumber(e) { this.A.value = (255 & e) / 255, this.B.value = (e >> 8 & 255) / 255, this.G.value = (e >> 16 & 255) / 255, this.R.value = (e >> 24 & 255) / 255, this.#D() } setFromSRGBANumber(e) { this.A.value = (255 & e) / 255, this.B.value = Ie.sRGBtoLinear((e >> 8 & 255) / 255), this.G.value = Ie.sRGBtoLinear((e >> 16 & 255) / 255), this.R.value = Ie.sRGBtoLinear((e >> 24 & 255) / 255), this.#D() } toString() { return Ie.printLinearColor(this) } } class Oe extends Pe { static type; constructor(e = null) { super(); const t = this.constructor; e ??= void 0 !== t.default ? t.default(t).getter : e, this.getter = e } static createGrammar(e = this.type?.grammar ?? xe.lazy((() => this.unknownEntityGrammar))) { return this.type?.grammar.map((e => new this((() => e)))) } static withDefault(e = e => new e((() => new e.type))) { return super.withDefault(e) } static of(e) { const t = this.asUniqueClass(); return t.type = e, t.grammar = t.createGrammar(), t } doSerialize(e = !1, t = "", i = this.constructor, s = i.printKey, n = i.keySeparator, r = i.attributeSeparator, a = i.wrap) { return this.getter().serialize(e, t, i.type, s, n, r, a) } equals(e) { return e instanceof Oe && (e = e.getter?.()), this.getter?.().equals(e) } valueOf() { return this.valueOf = this.getter().valueOf.bind(this.getter()), this.valueOf() } toString() { return this.toString = this.getter().toString.bind(this.getter()), this.toString() } } class De extends Pe { static numberRegexSource = String.raw`${Me.numberRegexSource}(?<=(?:\.(\d*0+))?)`; static grammar = this.createGrammar(); static precision; #$; get precision() { return this.constructor.precision ?? this.#$ } set precision(e) { this.#$ = e } _value; get value() { return this._value } set value(e) { -0 === e && (e = 0), this._value = e } constructor(e = 0, t = null) { super(), this.value = Number(e), null !== t && (this.#$ = Number(t)) } static createGrammar() { return xe.regArray(new RegExp(`(?${this.numberRegexSource})|(?\\+?inf)|(?-inf)`)).map((({ 2: e, groups: { n: t, posInf: i, negInf: s } }) => new this(t ? Number(t) : i ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY, e?.length))).label("NumberEntity") } static withPrecision(e = 0) { const t = this.asUniqueClass(); return t.precision = e, t } static printNumber(e) { return e == Number.POSITIVE_INFINITY ? "inf" : e == Number.NEGATIVE_INFINITY ? "-inf" : ae.minDecimals(e) } serialize(e = !1, t = "", i = this.constructor) { if (this.value === Number.POSITIVE_INFINITY) return "+inf"; if (this.value === Number.NEGATIVE_INFINITY) return "-inf"; const s = i.precision ?? this.precision; let n = void 0 !== s ? this.value.toFixed(s) : this.value.toString(); return i.serialized && (n = `"${n}"`), n } valueOf() { return this.value } toString() { return this.value.toString() } } class $e extends Pe { static attributes = { ...super.attributes, X: De.withDefault(), Y: De.withDefault(), Z: De.withDefault() }; static grammar = this.createGrammar(); constructor(e) { super(e), this.X, this.Y, this.Z } static createGrammar() { return Me.createEntityGrammar(this, Me.commaSeparation, 1).label("VectorEntity") } toArray() { return [this.X.valueOf(), this.Y.valueOf(), this.Z.valueOf()] } } const Be = /\/Script\/SequencerScripting\.MovieSceneScripting(.+)Channel/, Ge = { A_AccentGrave: "à", Add: "Num +", C_Cedille: "ç", Decimal: "Num .", Divide: "Num /", E_AccentAigu: "é", E_AccentGrave: "è", F1: "F1", F10: "F10", F11: "F11", F12: "F12", F2: "F2", F3: "F3", F4: "F4", F5: "F5", F6: "F6", F7: "F7", F8: "F8", F9: "F9", Gamepad_Special_Left_X: "Touchpad Button X Axis", Gamepad_Special_Left_Y: "Touchpad Button Y Axis", Mouse2D: "Mouse XY 2D-Axis", Multiply: "Num *", Section: "§", Subtract: "Num -", Tilde: "`" }; function He(e = "") { switch (e = e.toLowerCase()) { case "zero": return 0; case "one": return 1; case "two": return 2; case "three": return 3; case "four": return 4; case "five": return 5; case "six": return 6; case "seven": return 7; case "eight": return 8; case "nine": return 9 } } function Ve(e) { let t; switch (e.getType()) { case re.paths.addDelegate: t ??= "Bind Event to "; case re.paths.clearDelegate: t ??= "Unbind all Events from "; case re.paths.removeDelegate: return t ??= "Unbind Event from ", t + ae.formatStringName(e.DelegateReference?.MemberName?.toString().replace(/Delegate$/, "") ?? "None"); case re.paths.asyncAction: if (e.ProxyFactoryFunctionName) return ae.formatStringName(e.ProxyFactoryFunctionName?.toString()); case re.paths.actorBoundEvent: case re.paths.componentBoundEvent: return `${ae.formatStringName(e.DelegatePropertyName?.toString())} (${e.ComponentPropertyName?.toString() ?? "Unknown"})`; case re.paths.callDelegate: return `Call ${e.DelegateReference?.MemberName?.toString() ?? "None"}`; case re.paths.createDelegate: return "Create Event"; case re.paths.customEvent: if (e.CustomFunctionName) return e.CustomFunctionName?.toString(); case re.paths.dynamicCast: return e.TargetType ? `Cast To ${e.TargetType?.getName()}` : "Bad cast node"; case re.paths.enumLiteral: return `Literal enum ${e.Enum?.getName()}`; case re.paths.event: return `Event ${(e.EventReference?.MemberName?.toString() ?? "").replace(/^Receive/, "")}`; case re.paths.executionSequence: return "Sequence"; case re.paths.forEachElementInEnum: return `For Each ${e.Enum?.getName()}`; case re.paths.forEachLoopWithBreak: return "For Each Loop with Break"; case re.paths.functionEntry: return "UserConstructionScript" === e.FunctionReference?.MemberName?.toString() ? "Construction Script" : e.FunctionReference?.MemberName?.toString(); case re.paths.functionResult: return "Return Node"; case re.paths.ifThenElse: return "Branch"; case re.paths.makeStruct: if (e.StructType) return `Make ${e.StructType.getName()}`; case re.paths.materialExpressionComponentMask: { const t = e.getMaterialSubobject(); if (t) return `Mask ( ${re.rgba.filter((e => !0 === t[e].getter().value)).map((e => e + " ")).join("")})` } case re.paths.materialExpressionConstant: t ??= [e.getCustomproperties().find((e => "Value" == e.PinName.toString()))?.DefaultValue]; case re.paths.materialExpressionConstant2Vector: t ??= [e.getCustomproperties().find((e => "X" == e.PinName?.toString()))?.DefaultValue, e.getCustomproperties().find((e => "Y" == e.PinName?.toString()))?.DefaultValue]; case re.paths.materialExpressionConstant3Vector: case re.paths.materialExpressionConstant4Vector: if (!t) { const i = e.getCustomproperties().find((e => "Constant" == e.PinName?.toString()))?.DefaultValue; t = i instanceof $e ? [i.X, i.Y, i.Z].map((e => e.valueOf())) : i instanceof Ie ? [i.R, i.G, i.B, i.A].map((e => e.valueOf())) : [] } if (t?.length > 0) return t.map((e => ae.printExponential(e))).join(","); t = void 0; break; case re.paths.materialExpressionFunctionInput: { const t = e.getMaterialSubobject(); return `Input ${t?.InputName ?? "In"} (${t?.InputType?.value.match(/^.+?_(\w+)$/)?.[1] ?? "Vector3"})` } case re.paths.materialExpressionLogarithm: return "Ln"; case re.paths.materialExpressionLogarithm10: return "Log10"; case re.paths.materialExpressionLogarithm2: return "Log2"; case re.paths.materialExpressionMaterialFunctionCall: const i = e.getMaterialSubobject()?.MaterialFunction; if (i) return i.getName(); break; case re.paths.materialExpressionSquareRoot: return "Sqrt"; case re.paths.materialExpressionSubtract: const s = e.getMaterialSubobject(); if (s) return `Subtract(${s.ConstA ?? "1"},${s.ConstB ?? "1"})`; case re.paths.metasoundEditorGraphExternalNode: { const t = e.ClassName?.Name; if (t) return "Add" === t ? "+" : t } case re.paths.pcgEditorGraphNodeInput: return "Input"; case re.paths.pcgEditorGraphNodeOutput: return "Output"; case re.paths.spawnActorFromClass: let n = e.getCustomproperties().find((e => "ReturnValue" == e.PinName.toString()))?.PinType?.PinSubCategoryObject?.getName(); return "Actor" === n && (n = null), `SpawnActor ${ae.formatStringName(n ?? "NONE")}`; case re.paths.switchEnum: return `Switch on ${e.Enum?.getName() ?? "Enum"}`; case re.paths.switchInteger: return "Switch on Int"; case re.paths.variableGet: return ""; case re.paths.variableSet: return "SET" }let i = e.switchTarget(); if (i) return "E" !== i[0] && (i = ae.formatStringName(i)), `Switch on ${i}`; if (e.isComment()) return e.NodeComment.toString(); const s = e.getHIDAttribute(); if (s) { const t = s.toString(); let i = function (e) { let t = Ge[e]; if (t) return t; if (t = He(e)?.toString(), t) return t; const i = e.match(/NumPad([a-zA-Z]+)/); return i && (t = He(i[1]).toString(), t) ? "Num " + t : void 0 }(t) ?? ae.formatStringName(t); return e.getClass() === re.paths.inputDebugKey ? i = "Debug Key " + i : e.getClass() === re.paths.getInputAxisKeyValue && (i = "Get " + i), i } if (e.getClass() === re.paths.macro) return ae.formatStringName(e.MacroGraphReference?.getMacroName()); if (e.isMaterial() && e.getMaterialSubobject()) { let t = Ve(e.getMaterialSubobject()); return t = t.match(/Material Expression (.+)/)?.[1] ?? t, t } if (e.isPcg() && e.getPcgSubobject()) { let t = e.getPcgSubobject(); return t.NodeTitle ? t.NodeTitle.toString() : Ve(t) } const n = e.getSubgraphObject(); if (n) return n.Graph.getName(); const r = e.getSettingsObject(); if (r) { if (r.ExportPath.type === re.paths.pcgHiGenGridSizeSettings) return `Grid Size: ${r.HiGenGridSize?.toString().match(/\d+/)?.[0]?.concat("00") ?? r.HiGenGridSize?.toString().match(/^\w+$/)?.[0] ?? "256"}`; if (r.BlueprintElementInstance) return ae.formatStringName(r.BlueprintElementType.getName()); if (r.Operation) { const e = r.Name?.toString().match(/PCGMetadata(\w+)Settings_\d+/); if (e) return ae.formatStringName(e[1] + ": " + r.Operation) } const e = r.getSubgraphObject(); if (e && e.Graph) return e.Graph.getName() } let a = e.FunctionReference?.MemberName?.toString(); if (a) { const t = e.FunctionReference.MemberParent?.path ?? ""; switch (a) { case "AddKey": let e = t.match(Be); if (e) return `Add Key (${ae.formatStringName(e[1])})`; case "Concat_StrStr": return "Append" }const i = a.match(re.lineTracePattern); if (i) return "Line Trace" + ("Multi" === i[1] ? " Multi " : " ") + ("" === i[2] ? "By Channel" : ae.formatStringName(i[2])); switch (t) { case re.paths.blueprintGameplayTagLibrary: case re.paths.kismetMathLibrary: case re.paths.slateBlueprintLibrary: case re.paths.timeManagementBlueprintLibrary: const e = a.match(/[BF]([A-Z]\w+)/); switch (e && (a = e[1]), a) { case "Abs": return "ABS"; case "BooleanAND": return "AND"; case "BooleanNAND": return "NAND"; case "BooleanOR": return "OR"; case "Exp": return "e"; case "LineTraceSingle": return "Line Trace By Channel"; case "Max": case "MaxInt64": return "MAX"; case "Min": case "MinInt64": return "MIN"; case "Not_PreBool": return "NOT"; case "Sin": return "SIN"; case "Sqrt": return "SQRT"; case "Square": return "^2"; case "CrossProduct2D": return "cross"; case "Vector4_CrossProduct3": return "cross3"; case "DotProduct2D": case "Vector4_DotProduct": return "dot"; case "Vector4_DotProduct3": return "dot3" }if (a.startsWith("Add_")) return "+"; if (a.startsWith("And_")) return "&"; if (a.startsWith("Conv_")) return ""; if (a.startsWith("Cross_")) return "cross"; if (a.startsWith("Divide_")) return String.fromCharCode(247); if (a.startsWith("Dot_")) return "dot"; if (a.startsWith("EqualEqual_")) return "=="; if (a.startsWith("Greater_")) return ">"; if (a.startsWith("GreaterEqual_")) return ">="; if (a.startsWith("Less_")) return "<"; if (a.startsWith("LessEqual_")) return "<="; if (a.startsWith("Multiply_")) return String.fromCharCode(10799); if (a.startsWith("Not_")) return "~"; if (a.startsWith("NotEqual_")) return "!="; if (a.startsWith("Or_")) return "|"; if (a.startsWith("Percent_")) return "%"; if (a.startsWith("Subtract_")) return "-"; if (a.startsWith("Xor_")) return "^"; break; case re.paths.blueprintSetLibrary: { const e = a.match(/Set_(\w+)/); if (e) return ae.formatStringName(e[1]).toUpperCase() } break; case re.paths.blueprintMapLibrary: { const e = a.match(/Map_(\w+)/); if (e) return ae.formatStringName(e[1]).toUpperCase() } break; case re.paths.kismetArrayLibrary: { const e = a.match(/Array_(\w+)/); if (e) return e[1].toUpperCase() } }return ae.formatStringName(a) } if (e.OpName) { switch (e.OpName.toString()) { case "Boolean::LogicAnd": return "Logic AND"; case "Boolean::LogicEq": return "=="; case "Boolean::LogicNEq": return "!="; case "Boolean::LogicNot": return "Logic NOT"; case "Boolean::LogicOr": return "Logic OR"; case "Matrix::MatrixMultiply": return "Multiply (Matrix * Matrix)"; case "Matrix::MatrixVectorMultiply": return "Multiply (Matrix * Vector4)"; case "Numeric::Abs": return "Abs"; case "Numeric::Add": return "+"; case "Numeric::DistancePos": return "Distance"; case "Numeric::Mul": return String.fromCharCode(10799) }return ae.formatStringName(e.OpName.toString()).replaceAll("::", " ") } return e.FunctionDisplayName ? ae.formatStringName(e.FunctionDisplayName.toString()) : e.ObjectRef ? e.ObjectRef.getName() : ae.formatStringName(e.getNameAndCounter()[0]) } class Re extends Pe { static type; static grammar = this.createGrammar(); get length() { return this.values.length } constructor(e = []) { super(), this.values = e } static createGrammar(e = this.type?.grammar ?? xe.lazy((() => this.unknownEntityGrammar))) { return this.inlined ? e : xe.seq(xe.reg(/\(\s*/), e.sepBy(Me.commaSeparation).opt(), xe.reg(/\s*(,\s*)?\)/, 1)).map((([e, t, i]) => { t = t instanceof Array ? t : []; let s = this; void 0 !== i !== s.trailing && (s = s.flagTrailing(void 0 !== i)); return new s(t) })).label(`ArrayEntity of ${this.type?.className() ?? "unknown values"}`) } static flagInlined(e = !0) { const t = this.asUniqueClass(); return t.inlined = e, t.grammar = t.createGrammar(), t } static of(e) { const t = this.asUniqueClass(); return t.type = e, t.grammar = t.createGrammar(), t } doSerialize(e = !1, t = "", i = this.constructor, s = i.printKey, n = i.keySeparator, r = i.attributeSeparator, a = i.wrap) { if (i.inlined) return super.serialize.bind(this.values, e, t, i, s, n, r, a)(); let o = this.values.map((t => t?.serialize(e))).join(i.attributeSeparator); return this.trailing && (o += i.attributeSeparator), `(${o})` } valueOf() { return this.values } equals(e) { if (!(e instanceof Re) || this.values.length !== e.values.length) return !1; for (let t = 0; t < this.values.length; ++t)if (!this.values[t].equals(e.values[t])) return !1; return !0 } } var _e; "undefined" == typeof window ? import("crypto").then((e => _e = e.default)).catch() : _e = window.crypto; class ze extends Pe { static grammar = this.createGrammar(); static generateGuid() { let e = new Uint32Array(4); _e.getRandomValues(e); let t = ""; return e.forEach((e => { t += ("0".repeat(8) + e.toString(16).toUpperCase()).slice(-8) })), t } constructor(e = ze.generateGuid()) { super(), this.value = e } static createGrammar() { return xe.reg(/[0-9A-F]{32}/i).map((e => new this(e))).label("GuidEntity") } serialize(e = !1, t = "", i = this.constructor) { let s = this.value; return i.serialized && (s = `"${s}"`), s } toString() { return this.value } } class Fe extends De { static grammar = this.createGrammar(); get value() { return super.value } set value(e) { (e = Math.trunc(e)) >= 1 << 31 && e < -(1 << 31) && (e = Math.floor(e), super.value = e) } static createGrammar() { return xe.numberInteger.map((e => new this(e))) } } class je extends Fe { static grammar = this.createGrammar(); get value() { return super.value } set value(e) { e = Math.round(ae.clamp(e, 0)), super.value = e } static createGrammar() { return xe.numberNatural.map((e => new this(e))) } } const Ue = { [re.paths.niagaraBool]: r``, [re.paths.niagaraDataInterfaceVolumeTexture]: r``, [re.paths.niagaraFloat]: r``, [re.paths.niagaraMatrix]: r``, [re.paths.niagaraNumeric]: r``, [re.paths.niagaraPosition]: r``, [re.paths.quat4f]: r``, [re.paths.rotator]: r``, [re.paths.transform]: r``, [re.paths.vector]: r``, [re.paths.vector3f]: r``, [re.paths.vector4f]: r``, Any: r``, "Any[]": r``, audio: r``, blue: r``, bool: r``, byte: r``, class: r``, default: r``, delegate: r``, enum: r``, exec: r``, float: r``, green: r``, int: r``, int32: r``, int64: r``, interface: r``, name: r``, object: r``, Param: r``, "Param[]": r``, Point: r``, "Point[]": r``, real: r``, red: r``, string: r``, struct: r``, Surface: r``, "Surface[]": r``, text: r``, time: r``, Volume: r``, "Volume[]": r``, wildcard: r`` }, Ye = r``; function Ke(e) { let t, i = e.PinFriendlyName ? e.PinFriendlyName.toString() : ae.formatStringName(e.PinName?.toString() ?? ""); return (t = e.PinToolTip?.toString().match(/\s*(.+?(?=\n)|.+\S)\s*/)) && t[1].toLowerCase() === i.toLowerCase() ? t[1] : i } class Xe extends Fe { static grammar = this.createGrammar(); get value() { return super.value } set value(e) { (e = Math.trunc(e)) >= 0 && e < 256 && (super.value = e) } createGrammar() { return xe.numberByte.map((e => new this(e))) } } class qe extends Pe { static grammar = this.createGrammar(); static escapedCharacters = /['"\\]/g; static unescapedBackslash = /(?<=(?:[^\\]|^)(?:\\\\)*)\\(?!\\)/; constructor(e = "") { super(), this.value = e } static createGrammar() { return xe.doubleQuotedString.map((e => new this(qe.unescape(e)))).label("StringEntity") } static escape(e, t = !0) { let i = e.replaceAll(new RegExp(`(${qe.escapedCharacters.source})`, "g"), "\\$1"); return t && (i = i.replaceAll("\n", "\\n").replaceAll("\t", "\\t")), i } static unescape(e) { return e.replaceAll(new RegExp(qe.unescapedBackslash.source + "t", "g"), "\t").replaceAll(new RegExp(qe.unescapedBackslash.source + "n", "g"), "\n").replaceAll(new RegExp(`\\\\(${qe.escapedCharacters.source})`, "g"), "$1") } doSerialize(e = !1) { let t = `"${qe.escape(this.value)}"`; return e && (t = qe.escape(t, !1)), t } valueOf() { return this.value } toString() { return this.value } } class Ze extends Pe { static grammar = this.createGrammar(); static f; static createGrammar() { return qe.grammar } static from(e) { const t = this.asUniqueClass(); return t.f = e, t } static compute(e) { return this.f(e) } } class We extends Pe { static attributeConverter = { fromAttribute: (e, t) => new this(e), toAttribute: (e, t) => e.toString() }; static grammar = this.createGrammar(); static createGrammar() { return Me.symbol.map((e => new this(e))).label("SymbolEntity") } constructor(e = "") { super(), this.value = e } serialize(e = !1, t = "", i = this.constructor) { let s = this.value; return i.serialized && (s = `"${s}"`), s } toString() { return this.value } } class Qe extends We { static grammar = this.createGrammar(); static createGrammar() { return Me.symbol.map((e => new this(e))) } } class Je extends Qe { static grammar = this.createGrammar(); static createGrammar() { return xe.reg(Me.Regex.InsideString).map((e => new this(e))) } } class et extends Pe { static lookbehind = "INVTEXT"; static grammar = this.createGrammar(); constructor(e = "") { super(), this.value = e } static createGrammar() { return xe.alt(xe.seq(xe.reg(new RegExp(`${this.lookbehind}\\s*\\(`)), xe.doubleQuotedString, xe.reg(/\s*\)/)).map((([e, t, i]) => Number(t))), xe.reg(new RegExp(this.lookbehind)).map((() => 0))).map((e => new this(e))).label("InvariantTextEntity") } doSerialize() { return this.lookbehind + "(" + this.value + ")" } valueOf() { return this.value } } class tt extends Pe { static attributeSeparator = ", "; static printKey = e => ""; static lookbehind = "NSLOCTEXT"; static attributes = { ...super.attributes, namespace: qe.withDefault(), key: qe.withDefault(), value: qe.withDefault() }; static grammar = this.createGrammar(); constructor(e = {}) { super(e), this.namespace, this.key, this.value } static createGrammar() { return xe.regArray(new RegExp(String.raw`${tt.lookbehind}\s*\(` + String.raw`\s*"(?${Me.Regex.InsideString.source})"\s*,` + String.raw`\s*"(?${Me.Regex.InsideString.source})"\s*,` + String.raw`\s*"(?${Me.Regex.InsideString.source})"\s*` + String.raw`(?,\s+)?` + String.raw`\)`, "m")).map((({ groups: { namespace: e, key: t, value: i, trailing: s } }) => new this({ namespace: new this.attributes.namespace(ae.unescapeString(e)), key: new this.attributes.namespace(ae.unescapeString(t)), value: new this.attributes.namespace(ae.unescapeString(i)), trailing: void 0 !== s }))).label("LocalizedTextEntity") } toString() { return ae.capitalFirstLetter(this.value.valueOf()) } } class it extends Pe { static attributeSeparator = ", "; static lookbehind = ["LOCGEN_FORMAT_NAMED", "LOCGEN_FORMAT_ORDERED"]; static grammar = this.createGrammar(); constructor(e) { super(), this.values = e } static createGrammar() { return xe.lazy((() => xe.seq(xe.reg(new RegExp(String.raw`(${this.lookbehind.join("|")})\s*\(\s*`), 1), xe.alt(...[qe, tt, et, it].map((e => e.grammar))).sepBy(xe.reg(/\s*\,\s*/)), xe.reg(/\s*\)/)).map((([e, t]) => { const i = new this(t); return i.lookbehind = e, i })))).label("FormatTextEntity") } doSerialize(e = !1, t = "", i = this.constructor, s = i.printKey, n = i.keySeparator, r = i.attributeSeparator, a = i.wrap) { const o = i.attributeSeparator; return this.lookbehind + "(" + this.values.map((t => t.serialize(e))).join(o) + (i.trailing ? o : "") + ")" } toString() { const e = this.values?.[0]?.toString(); if (!e) return ""; const t = this.values.slice(1).map((e => e?.valueOf())); return "LOCGEN_FORMAT_NAMED" == this.lookbehind ? e.replaceAll(/\{([a-zA-Z]\w*)\}/g, ((e, i) => { const s = t.indexOf(i) + 1; return s > 0 && s < t.length ? t[s] : e })) : "LOCGEN_FORMAT_ORDERED" == this.lookbehind ? e.replaceAll(/\{(\d+)\}/g, ((e, i) => { const s = Number(i); return s < t.length ? t[s] : e })) : "" } } class st extends Pe { static grammar = this.createGrammar(); _value; get value() { return this._value } set value(e) { e >= -(1n << 63n) && e < 1n << 63n && (this._value = e) } constructor(e = 0n) { super(), this.value = BigInt(e) } static createGrammar() { return xe.numberBigInteger.map((e => new this(e))) } serialize(e = !1, t = "", i = this.constructor) { let s = this.value.toString(); return i.serialized && (s = `"${s}"`), s } valueOf() { return this.value } toString() { return this.value.toString() } } class nt extends Pe { static _quotedParser = xe.regArray(new RegExp(`'"(${Me.Regex.InsideString.source})"'|'(${Me.Regex.InsideSingleQuotedString.source})'`)).map((([e, t, i]) => t ?? i)); static typeReference = xe.reg(new RegExp(Me.Regex.Path.source + "|" + Me.symbol.getParser().regexp.source)); static fullReferenceGrammar = this.createFullReferenceGrammar(); static grammar = this.createGrammar(); #u; get type() { return this.#u } set type(e) { this.#u = e } #B; get path() { return this.#B } set path(e) { this.#B = e } #G; #H; get full() { return this.#H } set full(e) { this.#H = e } constructor(e = "None", t = "", i = null) { super(), this.#u = e, this.#B = t, this.#H = i ?? (this.type.includes("/") || this.path ? `"${this.type + (this.path ? `'${this.path}'` : "")}"` : this.type) } static createGrammar() { return xe.alt(this.createFullReferenceSerializedGrammar(), this.createFullReferenceGrammar(), this.createTypeReferenceGrammar()).label("ObjectReferenceEntity") } static createFullReferenceGrammar() { return xe.regArray(new RegExp("(" + this.typeReference.getParser().regexp.source + ")(?:" + this._quotedParser.getParser().parser.regexp.source + ")")).map((([e, t, ...i]) => new this(t, i.find((e => e)), e))) } static createFullReferenceSerializedGrammar() { return xe.regArray(new RegExp('"(' + Me.Regex.InsideString.source + "?)(?:'(" + Me.Regex.InsideSingleQuotedString.source + "?)')?\"")).map((([e, t, i]) => new this(t, i, e))) } static createTypeReferenceGrammar() { return this.typeReference.map((e => new this(e, "", e))) } static createNoneInstance() { return new nt("None", "", "None") } getName(e = !1) { return ae.getNameFromPath(this.path.replace(/_C$/, ""), e) } doSerialize(e = !1) { return e ? (void 0 === this.#G && (this.#G = ae.escapeString(this.#H, !1)), this.#G) : this.full } equals(e) { return e instanceof nt && (this.type == e.type && this.path == e.path) } } class rt extends Pe { static grammar = this.createGrammar(); constructor(e = null, t = null) { super(), this.objectName = e, this.pinGuid = t } static createGrammar() { return xe.seq(We.grammar, xe.whitespace, ze.grammar).map((([e, t, i]) => new this(e, i))).label("PinReferenceEntity") } doSerialize() { return this.objectName.serialize() + " " + this.pinGuid.serialize() } } class at extends Pe { static attributes = { ...super.attributes, MemberParent: nt, MemberName: qe, MemberGuid: ze }; static grammar = this.createGrammar(); constructor(e) { super(e), this.MemberParent, this.MemberName, this.MemberGuid } static createGrammar() { return Me.createEntityGrammar(this, Me.commaSeparation, 0, 0) } } class ot extends Pe { static attributes = { ...super.attributes, PinCategory: qe.withDefault(), PinSubCategory: qe, PinSubCategoryObject: nt, PinSubCategoryMemberReference: at, ContainerType: We, bIsReference: ke, bIsConst: ke, bIsWeakPointer: ke, bIsUObjectWrapper: ke, bSerializeAsSinglePrecisionFloat: ke }; static grammar = this.createGrammar(); constructor(e = {}) { super(e), this.PinCategory, this.PinSubCategory, this.PinSubCategoryObject, this.PinSubCategoryMemberReference, this.ContainerType, this.bIsReference, this.bIsConst, this.bIsWeakPointer, this.bIsUObjectWrapper, this.bIsUObjectWrapper, this.bSerializeAsSinglePrecisionFloat } static createGrammar() { return Me.createEntityGrammar(this).label("PinTypeEntity") } copyTypeFrom(e) { for (const t of this.keys) void 0 !== e[t] && (this[t] = e[t]) } } class lt extends Pe { static attributes = { ...super.attributes, X: De.withDefault(), Y: De.withDefault() }; static grammar = this.createGrammar(); constructor(e) { super(e), this.X, this.Y } static createGrammar() { return Me.createEntityGrammar(this, Me.commaSeparation, 1).label("Vector2DEntity") } toArray() { return [this.X.valueOf(), this.Y.valueOf()] } } class ut extends lt { static grammar = this.createGrammar(); static createGrammar() { return xe.alt(xe.regArray(new RegExp(/X\s*=\s*/.source + "(?" + Me.numberRegexSource + ")\\s+" + /Y\s*=\s*/.source + "(?" + Me.numberRegexSource + ")")).map((({ groups: { x: e, y: t } }) => new this({ X: new lt.attributes.X(e), Y: new lt.attributes.Y(t) }))), lt.grammar.map((e => new this({ X: e.X, Y: e.Y })))).label("RBSerializationVector2DEntity") } } class ct extends Pe { static attributes = { ...super.attributes, R: De.withDefault(), P: De.withDefault(), Y: De.withDefault() }; static grammar = this.createGrammar(); constructor(e) { super(e), this.R, this.P, this.Y } static createGrammar() { return Me.createEntityGrammar(this, Me.commaSeparation, 1).label("RotatorEntity") } getRoll() { return this.R } getPitch() { return this.P } getYaw() { return this.Y } } class ht extends ct { static attributeSeparator = ", "; static grammar = this.createGrammar(); static createGrammar() { return xe.alt(xe.regArray(new RegExp(`(${De.numberRegexSource})` + String.raw`\s*,\s*` + `(${De.numberRegexSource})` + String.raw`\s*,\s*` + `(${De.numberRegexSource})`)).map((([e, t, i, s, n, r, a]) => new this({ R: new ct.attributes.R(r, a?.length), P: new ct.attributes.P(t, i?.length), Y: new ct.attributes.Y(s, n?.length) }))), ct.grammar.map((e => new this({ R: e.R, P: e.P, Y: e.Y })))).label("SimpleSerializationRotatorEntity") } doSerialize() { const e = this.constructor.attributeSeparator; return this.P.serialize() + e + this.Y.serialize() + e + this.R.serialize() + (this.trailing ? e : "") } } class pt extends lt { static attributeSeparator = ", "; static grammar = this.createGrammar(); static createGrammar() { return xe.alt(xe.regArray(new RegExp(`(${De.numberRegexSource})` + String.raw`\s*,\s*` + `(${De.numberRegexSource})`)).map((([e, t, i, s, n]) => new this({ X: new lt.attributes.X(t, i?.length), Y: new lt.attributes.Y(s, n?.length) }))), lt.grammar.map((e => new this({ X: e.X, Y: e.Y })))).label("SimpleSerializationVector2DEntity") } doSerialize() { const e = this.constructor.attributeSeparator; return this.X.serialize() + e + this.Y.serialize() + (this.trailing ? e : "") } } class dt extends Pe { static attributes = { ...super.attributes, X: De.withDefault(), Y: De.withDefault(), Z: De.withDefault(), W: De.withDefault() }; static grammar = this.createGrammar(); constructor(e) { super(e), this.X, this.Y, this.Z, this.W } static createGrammar() { return Me.createEntityGrammar(this, Me.commaSeparation, 1).label("Vector4DEntity") } toArray() { return [this.X.valueOf(), this.Y.valueOf(), this.Z.valueOf(), this.W.valueOf()] } } class mt extends dt { static grammar = this.createGrammar(); static createGrammar() { return xe.alt(xe.regArray(new RegExp(`(${Me.numberRegexSource})` + String.raw`\s*,\s*` + `(${Me.numberRegexSource})` + String.raw`\s*,\s*` + `(${Me.numberRegexSource})` + String.raw`\s*,\s*` + `(${Me.numberRegexSource})`)).map((([e, t, i, s, n]) => new this({ X: new dt.attributes.X(t), Y: new dt.attributes.Y(i), Z: new dt.attributes.Z(s), W: new dt.attributes.W(n) }))), dt.grammar) } } class gt extends $e { static allowShortSerialization = !1; static attributeSeparator = ", "; static grammar = this.createGrammar(); static createGrammar() { return xe.alt(xe.regArray(new RegExp(`(${De.numberRegexSource})` + (this.allowShortSerialization ? "(?:" : "") + String.raw`\s*,\s*` + `(${De.numberRegexSource})` + String.raw`\s*,\s*` + `(${De.numberRegexSource})` + (this.allowShortSerialization ? ")?" : ""))).map((([e, t, i, s, n, r, a]) => new this({ X: new $e.attributes.X(t, i?.length), Y: new $e.attributes.Y(s, n?.length), Z: new $e.attributes.Z(r, a?.length) }))), $e.grammar.map((e => new this({ X: e.X, Y: e.Y, Z: e.Z })))) } static flagAllowShortSerialization(e = !0) { const t = this.asUniqueClass(); return e !== t.allowShortSerialization && (t.allowShortSerialization = e, t.grammar = t.createGrammar()), t } doSerialize() { const e = this.constructor.attributeSeparator; return this.X.serialize() + e + this.Y.serialize() + e + this.Z.serialize() + (this.trailing ? e : "") } } class bt extends Pe { static lookbehind = "Pin"; static #V = { bool: ke, byte: Xe, enum: Qe, exec: qe, int: Fe, int64: st, name: qe, real: De, string: qe, [re.paths.linearColor]: Ie, [re.paths.niagaraPosition]: $e, [re.paths.rotator]: ct, [re.paths.vector]: $e, [re.paths.vector2D]: lt, [re.paths.vector4f]: dt }; static #R = { enum: Je, rg: ut, [re.paths.niagaraPosition]: gt.flagAllowShortSerialization(), [re.paths.rotator]: ht, [re.paths.vector]: gt, [re.paths.vector2D]: pt, [re.paths.vector3f]: gt, [re.paths.vector4f]: mt }; static attributes = { PinId: ze.withDefault(), PinName: qe.withDefault(), PinFriendlyName: Le.accepting(tt, it, et, qe), PinToolTip: qe, Direction: qe, PinType: ot.withDefault().flagInlined(), LinkedTo: Re.of(rt).withDefault().flagSilent(), SubPins: Re.of(rt), ParentPin: rt, DefaultValue: Ze.from((e => e.getEntityType(!0)?.flagSerialized() ?? qe)), AutogeneratedDefaultValue: qe, DefaultObject: nt, PersistentGuid: ze, bHidden: ke, bNotConnectable: ke, bDefaultValueIsReadOnly: ke, bDefaultValueIsIgnored: ke, bAdvancedView: ke, bOrphanedPin: ke }; static grammar = this.createGrammar(); #_ = !1; set recomputesNodeTitleOnChange(e) { this.#_ = e } get recomputesNodeTitleOnChange() { return this.#_ } #z = null; get objectEntity() { try { return this.#z } catch (e) { return null } } set objectEntity(e) { this.#z = e } #F; get pinIndex() { return this.#F } set pinIndex(e) { this.#F = e } constructor(e = {}) { super(e), this.PinId, this.PinName, this.PinFriendlyName, this.PinToolTip, this.Direction, this.PinType, this.LinkedTo, this.DefaultValue, this.AutogeneratedDefaultValue, this.DefaultObject, this.PersistentGuid, this.bHidden, this.bNotConnectable, this.bDefaultValueIsReadOnly, this.bDefaultValueIsIgnored, this.bAdvancedView, this.bOrphanedPin, this.objectEntity } static createGrammar() { return Me.createEntityGrammar(this) } static fromLegacyObject(e) { return new bt(e) } getType() { const e = this.PinType.PinCategory?.toString().toLocaleLowerCase(); if ("struct" === e || "class" === e || "object" === e || "type" === e) return this.PinType.PinSubCategoryObject?.path; if (this.isEnum()) return "enum"; if (this.objectEntity?.isPcg()) { const e = this.objectEntity.getPcgSubobject(), t = this.isInput() ? e.InputPins?.valueOf()[this.pinIndex] : e.OutputPins?.valueOf()[this.pinIndex]; if (t) { const i = e[re.subObjectAttributeNameFromReference(t, !0)]; let s = i.Properties?.AllowedTypes?.toString() ?? ""; if ("" == s && (s = this.PinType.PinCategory ?? "", "" == s && (s = "Any")), s) return !1 !== i.Properties.bAllowMultipleData?.valueOf() && !1 !== i.Properties.bAllowMultipleConnections?.valueOf() && (s += "[]"), s } } if ("optional" === e) { const e = this.PinType.PinSubCategory?.toString(); switch (e) { case "red": return "real"; case "rg": return "rg"; case "rgb": return re.paths.vector; case "rgba": return re.paths.linearColor; default: return e } } return e } getEntityType(e = !1) { const t = this.getType(), i = bt.#V[t], s = bt.#R[t]; return e && void 0 !== s ? s : i } pinTitle() { return Ke(this) } copyTypeFrom(e) { this.PinType = e.PinType } getDefaultValue(e = !1) { return void 0 === this.DefaultValue && e && (this.DefaultValue = new (this.getEntityType(!0))), this.DefaultValue } isEnum() { const e = this.PinType.PinSubCategoryObject?.type; return e === re.paths.enum || e === re.paths.userDefinedEnum || "enum" === e?.toLowerCase() } isExecution() { return "exec" === this.PinType.PinCategory.toString() } isHidden() { return this.bHidden?.valueOf() } isInput() { return !this.isHidden() && "EGPD_Output" != this.Direction?.toString() } isOutput() { return !this.isHidden() && "EGPD_Output" == this.Direction?.toString() } isLinked() { return this.LinkedTo?.length > 0 ?? !1 } linkTo(e, t) { const i = this.LinkedTo.values?.some((i => i.objectName.toString() == e && i.pinGuid.toString() == t.PinId.toString())); return !i && (this.LinkedTo.values.push(new rt(new We(e), t.PinId)), !0) } unlinkFrom(e, t) { const i = this.LinkedTo.values?.findIndex((i => i.objectName.toString() == e && i.pinGuid.toString() == t.PinId.toString())); return i >= 0 && (this.LinkedTo.values.splice(i, 1), 0 === this.LinkedTo.length && void 0 === bt.attributes.LinkedTo.default && (this.LinkedTo.values = []), !0) } getSubCategory() { return this.PinType.PinSubCategoryObject?.path } pinColor() { return function (e) { if ("mask" === e.PinType.PinCategory?.toString()) { const t = Ue[e.PinType.PinSubCategory?.toString()]; if (t) return t } else if ("optional" === e.PinType.PinCategory?.toString()) return Ye; return Ue[e.getType()] ?? Ue[e.PinType.PinCategory?.toString().toLowerCase()] ?? Ue.default }(this) } } const vt = e => e.PinName?.toString().match(/^\s*([A-Z])\s*$/)?.[1]?.charCodeAt(0) - "A".charCodeAt(0); class ft extends Pe { static attributes = { ...super.attributes, MacroGraph: nt, GraphBlueprint: nt, GraphGuid: ze }; static grammar = this.createGrammar(); constructor(e) { super(e), this.MacroGraph, this.GraphBlueprint, this.GraphGuid } static createGrammar() { return Me.createEntityGrammar(this) } getMacroName() { const e = this.MacroGraph.path.search(":"); return this.MacroGraph.path.substring(e + 1) } } class yt extends Pe { static grammar = this.createGrammar(); static createGrammar() { return xe.reg(new RegExp(String.raw`\(${xe.whitespaceInlineOpt.getParser().regexp.source}\)`)).map((e => new this)).label("NullEntity") } serialize(e = !1, t = "", i = this.constructor) { let s = "()"; return i.serialized && (s = `"${s}"`), s } } class wt extends Pe { static attributes = { ...super.attributes, ScriptVariable: nt, OriginalChangeId: ze }; static grammar = this.createGrammar(); constructor(e = {}) { super(e), this.ScriptVariable, this.OriginalChangeId } static createGrammar() { return Me.createEntityGrammar(this).label("ScriptVariableEntity") } } class St extends bt { static attributes = { ...super.attributes, PinId: ze }; static grammar = this.createGrammar(); static createGrammar() { return xe.seq(xe.reg(new RegExp(`(${Me.Regex.Symbol.source}\\s*)\\(\\s*`), 1), Me.createAttributeGrammar(this).sepBy(Me.commaSeparation), xe.reg(/\s*(?:,\s*)?\)/)).map((([e, t, i]) => { e ??= ""; let s = {}; return e.length && (s.lookbehind = e), t.forEach((e => e(s))), new this(s) })).label("UnknownPinEntity") } } class Et extends Pe { static attributes = { ...super.attributes, MemberScope: qe, MemberName: qe.withDefault(), MemberGuid: ze, bSelfContext: ke }; static grammar = this.createGrammar(); constructor(e) { super(e), this.MemberScope, this.MemberName, this.MemberGuid, this.bSelfContext } static createGrammar() { return Me.createEntityGrammar(this).label("VariableReferenceEntity") } } class Ct extends Pe { #j = !1; get exported() { return this.#j } set exported(e) { this.#j = e } static #U = /^(\w+?)(?:_(\d+))?$/; static printKey = e => e.startsWith(re.subObjectAttributeNamePrefix) ? "" : e; static attributeSeparator = "\n"; static wrap = this.notWrapped; static trailing = !0; static attributes = { ...super.attributes, Class: nt, Name: qe, Archetype: nt, ExportPath: nt, ObjectRef: nt, BlueprintElementType: nt, BlueprintElementInstance: nt, ConstA: Oe.of(De), ConstB: Oe.of(De), PinTags: Re.of(yt).flagInlined(), PinNames: Re.of(qe).flagInlined(), AxisKey: We, InputAxisKey: We, InputName: qe, InputType: We, NumAdditionalInputs: je, bIsPureFunc: ke, bIsConstFunc: ke, bIsCaseSensitive: ke, VariableReference: Et, SelfContextInfo: We, DelegatePropertyName: qe, DelegateOwnerClass: nt, ComponentPropertyName: qe, EventReference: at, FunctionReference: at, FunctionScript: nt, CustomFunctionName: qe, TargetType: nt, MacroGraphReference: ft, Enum: nt, EnumEntries: Re.of(qe).flagInlined(), InputKey: We, OpName: qe, CachedChangeId: ze, FunctionDisplayName: qe, AddedPins: Re.of(St).withDefault().flagInlined().flagSilent(), ChangeId: ze, MaterialFunction: nt, bOverrideFunction: ke, bInternalEvent: ke, bConsumeInput: ke, bExecuteWhenPaused: ke, bOverrideParentBinding: ke, bControl: ke, bAlt: ke, bShift: ke, bCommand: ke, CommentColor: Ie, bCommentBubbleVisible_InDetailsPanel: ke, bColorCommentBubble: ke, ProxyFactoryFunctionName: qe, ProxyFactoryClass: nt, ProxyClass: nt, StructType: nt, MaterialExpression: nt, MaterialExpressionComment: nt, MoveMode: We, TimelineName: qe, TimelineGuid: ze, SizeX: Oe.of(Fe), SizeY: Oe.of(Fe), Text: Oe.of(qe), MaterialExpressionEditorX: Oe.of(Fe), MaterialExpressionEditorY: Oe.of(Fe), NodeTitle: qe, NodeTitleColor: Ie, PositionX: Oe.of(Fe), PositionY: Oe.of(Fe), SettingsInterface: nt, PCGNode: nt, HiGenGridSize: We, Operation: We, NodePosX: Fe, NodePosY: Fe, NodeHeight: Fe, NodeWidth: Fe, Graph: nt, SubgraphInstance: qe, InputPins: Re.of(nt).flagInlined(), OutputPins: Re.of(nt).flagInlined(), bExposeToLibrary: ke, bCanRenameNode: ke, bCommentBubblePinned: ke, bCommentBubbleVisible: ke, NodeComment: qe, AdvancedPinDisplay: We, DelegateReference: Et, EnabledState: We, NodeGuid: ze, ErrorType: Fe, ErrorMsg: qe, ScriptVariables: Re.of(wt), Node: Oe.of(nt), ExportedNodes: qe, CustomProperties: Re.of(Le.accepting(bt, St)).withDefault().flagSilent() }; static customPropertyGrammar = xe.seq(xe.reg(/CustomProperties\s+/), this.attributes.CustomProperties.type.grammar).map((([e, t]) => e => { (e.CustomProperties ??= new this.attributes.CustomProperties).values.push(t) })); static inlinedArrayEntryGrammar = xe.seq(xe.alt(Me.symbolQuoted.map((e => [e, !0])), Me.symbol.map((e => [e, !1]))), xe.reg(new RegExp(String.raw`\s*\(\s*(\d+)\s*\)\s*\=\s*`), 1).map(Number)).chain((([[e, t], i]) => (this.attributes[e]?.grammar ?? Pe.unknownEntityGrammar).map((s => n => { if (void 0 === n[e]) { let i = Re; t != i.quoted && (i = i.flagQuoted(t)), i.inlined || (i = i.flagInlined()), n[e] = new i } n[e].values[i] = s })))); static grammar = this.createGrammar(); static grammarMultipleObjects = xe.seq(xe.whitespaceOpt, this.grammar, xe.seq(xe.whitespace, this.grammar).map((([e, t]) => t)).many(), xe.whitespaceOpt).map((([e, t, i, s]) => [t, ...i])); constructor(e = {}) { if ("NodePosX" in e != "NodePosY" in e) { const t = Object.entries(e), [i, s] = "NodePosX" in e ? ["NodePosY", Object.keys(e).indexOf("NodePosX") + 1] : ["NodePosX", Object.keys(e).indexOf("NodePosY")]; t.splice(s, 0, [i, new Fe(0)]), e = Object.fromEntries(t) } super(e), this.AddedPins, this.AdvancedPinDisplay, this.Archetype, this.AxisKey, this.bIsPureFunc, this.BlueprintElementInstance, this.ConstA, this.ConstB, this.BlueprintElementType, this.Class, this.CommentColor, this.ComponentPropertyName, this.CustomFunctionName, this.CustomProperties, this.DelegatePropertyName, this.DelegateReference, this.EnabledState, this.Enum, this.EnumEntries, this.EventReference, this.ExportedNodes, this.ExportPath, this.FunctionDisplayName, this.FunctionReference, this.FunctionScript, this.Graph, this.HiGenGridSize, this.InputAxisKey, this.InputKey, this.InputName, this.InputPins, this.InputType, this.MacroGraphReference, this.MaterialExpression, this.MaterialExpressionComment, this.MaterialExpressionEditorX, this.MaterialExpressionEditorY, this.MaterialFunction, this.Name, this.Node, this.NodeComment, this.NodeHeight, this.NodePosX, this.NodePosY, this.NodeTitle, this.NodeTitleColor, this.NodeWidth, this.NumAdditionalInputs, this.ObjectRef, this.Operation, this.OpName, this.OutputPins, this.PCGNode, this.PinTags, this.PinNames, this.PositionX, this.PositionY, this.ProxyFactoryFunctionName, this.ScriptVariables, this.SettingsInterface, this.SizeX, this.SizeY, this.StructType, this.SubgraphInstance, this.TargetType, this.Text, this.Text, this.VariableReference, this.Pins instanceof Re && this.Pins.valueOf().forEach((e => { const t = this[re.subObjectAttributeNameFromReference(e, !0)]; if (t) { const e = bt.fromLegacyObject(t); e.LinkedTo = new bt.attributes.LinkedTo, this.getCustomproperties(!0).push(e), this.CustomProperties.ignored = !0 } })); const t = this.getMaterialSubobject(); if (t) { const e = t; if (void 0 !== e.SizeX && (e.SizeX.getter = () => this.NodeWidth), e.SizeY && (e.SizeY.getter = () => this.NodeHeight), e.Text && (e.Text.getter = () => this.NodeComment), e.MaterialExpressionEditorX && (e.MaterialExpressionEditorX.getter = () => this.NodePosX), e.MaterialExpressionEditorY && (e.MaterialExpressionEditorY.getter = () => this.NodePosY), this.getType() === re.paths.materialExpressionComponentMask) { const t = re.rgba.map((e => { const t = this.getPinEntities().find((t => t.PinName.toString() === e)); return t.recomputesNodeTitleOnChange = !0, t })); e.keys = [...re.rgba, ...e.keys]; const i = Oe.of(ke).withDefault().flagSilent(); e.R = new i((() => t[0].DefaultValue)), e.G = new i((() => t[1].DefaultValue)), e.B = new i((() => t[2].DefaultValue)), e.A = new i((() => t[3].DefaultValue)) } else if (this.getType() === re.paths.materialExpressionSubtract) { const t = Oe.of(De.withPrecision(6)).withDefault((() => new Oe((() => new De(1))))).flagSilent(), i = this.getCustomproperties().find((e => "A" === e.PinName?.toString())), s = this.getCustomproperties().find((e => "B" === e.PinName?.toString())); (i || s) && (e.keys = ["ConstA", "ConstB", ...e.keys], i && (i.recomputesNodeTitleOnChange = !0, e.ConstA = new t((() => i.DefaultValue))), s && (s.recomputesNodeTitleOnChange = !0, e.ConstB = new t((() => s.DefaultValue)))) } } const i = this.getPcgSubobject(); i && (i.PositionX && (i.PositionX.getter = () => this.NodePosX), i.PositionY && (i.PositionY.getter = () => this.NodePosY), i.getSubobjects().forEach((e => { if (void 0 !== e.Node) { const t = e.Node.getter(); t.type === this.PCGNode.type && t.path === `${this.Name}.${this.PCGNode.path}` && (e.Node.getter = () => new nt(this.PCGNode.type, `${this.Name}.${this.PCGNode.path}`, t.full)) } }))); let s = 0, n = 0; this.getCustomproperties().forEach(((e, t) => { e.objectEntity = this, e.pinIndex = e.isInput() ? s++ : e.isOutput() ? n++ : t })) } static createGrammar() { return xe.seq(xe.reg(/Begin +Object/), xe.seq(xe.whitespace, xe.alt(this.createSubObjectGrammar(), this.customPropertyGrammar, Me.createAttributeGrammar(this, xe.reg(Me.Regex.MultipleWordsSymbols)), Me.createAttributeGrammar(this, Me.attributeNameQuoted, void 0, ((e, t, i) => { ae.objectSet(e, [...t, "quoted"], !0) })), this.inlinedArrayEntryGrammar)).map((([e, t]) => t)).many(), xe.reg(/\s+End +Object/)).map((([e, t, i]) => { const s = {}; return t.forEach((e => e(s))), new this(s) })).label("ObjectEntity") } static createSubObjectGrammar() { return xe.lazy((() => this.grammar)).map((e => t => { e.trailing = !1, t[re.subObjectAttributeNameFromEntity(e)] = e })) } #Y; getClass() { if (!this.#Y && (this.#Y = (this.Class?.path ? this.Class.path : this.Class?.type) ?? this.ExportPath?.type ?? "", this.#Y && !this.#Y.startsWith("/"))) { let e = Object.values(re.paths).find((e => e.endsWith("." + this.#Y))); e && (this.#Y = e) } return this.#Y } getType() { let e = this.getClass(); return this.MacroGraphReference?.MacroGraph?.path ? this.MacroGraphReference.MacroGraph.path : this.MaterialExpression ? this.MaterialExpression.type : e } getObjectName(e = !1) { return e ? this.getNameAndCounter()[0] : this.Name.toString() } getNameAndCounter() { const e = this.getObjectName().match(Ct.#U); return e ? [e[1] ?? "", parseInt(e[2] ?? "0")] : ["", 0] } getCounter() { return this.getNameAndCounter()[1] } getNodeWidth() { return this.NodeWidth ?? this.isComment() ? re.defaultCommentWidth : void 0 } setNodeWidth(e) { this.NodeWidth || (this.NodeWidth = new Fe), this.NodeWidth.value = e } getNodeHeight() { return this.NodeHeight ?? this.isComment() ? re.defaultCommentHeight : void 0 } setNodeHeight(e) { this.NodeHeight || (this.NodeHeight = new Fe), this.NodeHeight.value = e } getNodePosX() { return this.NodePosX?.value ?? 0 } setNodePosX(e) { this.NodePosX || (this.NodePosX = new Fe), this.NodePosX.value = Math.round(e) } getNodePosY() { return this.NodePosY?.value ?? 0 } setNodePosY(e) { this.NodePosY || (this.NodePosY = new Fe), this.NodePosY.value = Math.round(e) } getCustomproperties(e = !1) { return this.CustomProperties.values } getPinEntities() { return this.getCustomproperties().filter((e => e.constructor === bt)) } getSubobjects() { return Object.keys(this).filter((e => e.startsWith(re.subObjectAttributeNamePrefix))).flatMap((e => [this[e], ...this[e].getSubobjects()])) } switchTarget() { const e = this.getClass().match(re.switchTargetPattern); if (e) return e[1] } isEvent() { switch (this.getClass()) { case re.paths.actorBoundEvent: case re.paths.componentBoundEvent: case re.paths.customEvent: case re.paths.event: case re.paths.inputAxisKeyEvent: case re.paths.inputVectorAxisEvent: return !0 }return !1 } isComment() { switch (this.getClass()) { case re.paths.comment: case re.paths.materialGraphNodeComment: return !0 }return !1 } isMaterial() { return this.getClass() === re.paths.materialGraphNode } getMaterialSubobject() { const e = this.MaterialExpression ?? this.MaterialExpressionComment; return e ? this[re.subObjectAttributeNameFromReference(e, !0)] : null } isPcg() { return this.getClass() === re.paths.pcgEditorGraphNode || null != this.getPcgSubobject() } isNiagara() { return this.Class && (this.Class.type ? this.Class.type : this.Class.path)?.startsWith("/Script/NiagaraEditor.") } getPcgSubobject() { const e = this.PCGNode; return e ? this[re.subObjectAttributeNameFromReference(e, !0)] : null } getSettingsObject() { const e = this.SettingsInterface; return e ? this[re.subObjectAttributeNameFromReference(e, !0)] : null } getSubgraphObject() { const e = this.SubgraphInstance; return e ? this[re.subObjectAttributeNameFromName(e)] : null } isDevelopmentOnly() { const e = this.getClass(); return "DevelopmentOnly" === this.EnabledState?.toString() || e.includes("Debug", Math.max(0, e.lastIndexOf("."))) } getHIDAttribute() { return this.InputKey ?? this.AxisKey ?? this.InputAxisKey } getDelegatePin() { return this.getCustomproperties().find((e => "delegate" === e.PinType.PinCategory.toString())) } nodeColor() { return function (e) { switch (e.getType()) { case re.paths.materialExpressionConstant2Vector: case re.paths.materialExpressionConstant3Vector: case re.paths.materialExpressionConstant4Vector: return re.nodeColors.yellow; case re.paths.materialExpressionFunctionInput: case re.paths.materialExpressionTextureCoordinate: case re.paths.materialExpressionWorldPosition: case re.paths.pcgEditorGraphNodeInput: case re.paths.pcgEditorGraphNodeOutput: return re.nodeColors.red; case re.paths.makeStruct: return re.nodeColors.darkBlue; case re.paths.materialExpressionMaterialFunctionCall: return re.nodeColors.blue; case re.paths.materialExpressionTextureSample: return re.nodeColors.darkTurquoise }switch (e.getClass()) { case re.paths.callFunction: return e.bIsPureFunc?.valueOf() ? re.nodeColors.green : re.nodeColors.blue; case re.paths.niagaraNodeFunctionCall: return re.nodeColors.darkerBlue; case re.paths.dynamicCast: return re.nodeColors.turquoise; case re.paths.inputDebugKey: case re.paths.inputKey: return re.nodeColors.red; case re.paths.createDelegate: case re.paths.enumLiteral: case re.paths.makeArray: case re.paths.makeMap: case re.paths.materialGraphNode: case re.paths.select: return re.nodeColors.green; case re.paths.executionSequence: case re.paths.ifThenElse: case re.paths.macro: case re.paths.multiGate: return re.nodeColors.gray; case re.paths.functionEntry: case re.paths.functionResult: return re.nodeColors.violet; case re.paths.timeline: return re.nodeColors.yellow }if (e.switchTarget()) return re.nodeColors.lime; if (e.isEvent()) return re.nodeColors.red; if (e.isComment()) return (e.CommentColor ? e.CommentColor : Ie.getWhite()).toDimmedColor().toCSSRGBValues(); const t = e.getPcgSubobject(); if (t) { if (t.NodeTitleColor) return t.NodeTitleColor.toDimmedColor(.1).toCSSRGBValues(); switch (e.PCGNode?.getName(!0)) { case "Branch": case "Select": return re.nodeColors.intenseGreen } } return e.bIsPureFunc?.valueOf() ? re.nodeColors.green : re.nodeColors.blue }(this) } nodeIcon() { return function (e) { if (e.isMaterial() || e.isPcg() || e.isNiagara()) return null; switch (e.getType()) { case re.paths.addDelegate: case re.paths.asyncAction: case re.paths.callDelegate: case re.paths.clearDelegate: case re.paths.createDelegate: case re.paths.functionEntry: case re.paths.functionResult: case re.paths.removeDelegate: return le.node; case re.paths.customEvent: return le.event; case re.paths.doN: return le.doN; case re.paths.doOnce: return le.doOnce; case re.paths.dynamicCast: return le.cast; case re.paths.enumLiteral: return le.enum; case re.paths.event: return le.event; case re.paths.executionSequence: case re.paths.multiGate: return le.sequence; case re.paths.flipflop: return le.flipflop; case re.paths.forEachElementInEnum: case re.paths.forLoop: case re.paths.forLoopWithBreak: case re.paths.whileLoop: return le.loop; case re.paths.forEachLoop: case re.paths.forEachLoopWithBreak: return le.forEachLoop; case re.paths.ifThenElse: return le.branchNode; case re.paths.isValid: return le.questionMark; case re.paths.makeArray: return le.makeArray; case re.paths.makeMap: return le.makeMap; case re.paths.makeSet: return le.makeSet; case re.paths.makeStruct: return le.makeStruct; case re.paths.metasoundEditorGraphExternalNode: return le.metasoundFunction; case re.paths.select: return le.select; case re.paths.spawnActorFromClass: return le.spawnActor; case re.paths.timeline: return le.timer }if (e.switchTarget()) return le.switch; if (Ve(e).startsWith("Break")) return le.breakStruct; if (e.getClass() === re.paths.macro) return le.macro; const t = e.getHIDAttribute()?.toString(); return t ? t.includes("Mouse") ? le.mouse : t.includes("Gamepad_Special") ? le.keyboard : t.includes("Gamepad") || t.includes("Steam") ? le.gamepad : t.includes("Touch") ? le.touchpad : le.keyboard : e.getDelegatePin() ? le.event : e.ObjectRef?.type === re.paths.ambientSound ? le.sound : le.functionSymbol }(this) } additionalPinInserter() { return function (e) { let t, i, s, n, r; switch (e.getType()) { case re.paths.commutativeAssociativeBinaryOperator: case re.paths.promotableOperator: switch (r = e.FunctionReference?.MemberName?.toString(), r) { default: if (!(r?.startsWith("Add_") || r?.startsWith("Subtract_") || r?.startsWith("Multiply_") || r?.startsWith("Divide_"))) break; case "And_Int64Int64": case "And_IntInt": case "BMax": case "BMin": case "BooleanAND": case "BooleanNAND": case "BooleanOR": case "Concat_StrStr": case "FMax": case "FMin": case "Max": case "MaxInt64": case "Min": case "MinInt64": case "Or_Int64Int64": case "Or_IntInt": t ??= () => e.getPinEntities().filter((e => e.isInput())), i ??= vt, s ??= (i, s = -1, n = -1) => { const r = String.fromCharCode(i >= 0 ? i : n + "A".charCodeAt(0) + 1); return e.NumAdditionalInputs = new je(t().length - 1), r } }break; case re.paths.executionSequence: n ??= "Then"; case re.paths.multiGate: n ??= "Out", t ??= () => e.getPinEntities().filter((e => e.isOutput())), i ??= e => Number(e.PinName?.toString().match(new RegExp(String.raw`^\s*${n}[_\s]+(\d+)\s*$`, "i"))?.[1]), s ??= (e, t = -1, i = -1, s) => `${n} ${e >= 0 ? e : t > 0 ? `${n} 0` : i + 1}`; break; case re.paths.switchInteger: t ??= () => e.getPinEntities().filter((e => e.isOutput())), i ??= e => Number(e.PinName?.toString().match(/^\s*(\d+)\s*$/)?.[1]), s ??= (e, t = -1, i = -1, s) => (e < 0 ? i + 1 : e).toString(); break; case re.paths.switchGameplayTag: s ??= (t, i = -1, s = -1, n) => { const r = `Case_${t >= 0 ? t : i > 0 ? "0" : s + 1}`; return e.PinNames ??= new Re, e.PinNames.valueOf().push(new qe(r)), delete e.PinTags.valueOf()[e.PinTags.length - 1], e.PinTags.valueOf()[e.PinTags.length] = null, r }; case re.paths.switchName: case re.paths.switchString: t ??= () => e.getPinEntities().filter((e => e.isOutput())), i ??= e => Number(e.PinName.toString().match(/^\s*Case[_\s]+(\d+)\s*$/i)?.[1]), s ??= (t, i = -1, s = -1, n) => { const r = `Case_${t >= 0 ? t : i > 0 ? "0" : s + 1}`; return e.PinNames ??= new Re, e.PinNames.valueOf().push(new qe(r)), r } }if (t) return () => { let n = Number.MAX_SAFE_INTEGER, r = Number.MIN_SAFE_INTEGER, a = []; const o = t().reduce(((e, t) => { const s = i(t); if (isNaN(s)) { if (void 0 === e) return t } else if (a.push(s), n = Math.min(s, n), s > r) return r = s, t; return e }), void 0); if (n !== Number.MAX_SAFE_INTEGER && r !== Number.MIN_SAFE_INTEGER || (n = void 0, r = void 0), !o) return null; a.sort(((e, t) => e < t ? -1 : e === t ? 0 : 1)); let l = a[0], u = a.findIndex((e => { const t = e - l > 1; return l = e, t })); const c = new bt(o); return c.PinId = new ze, c.PinName = new qe(s(u, n, r, c)), c.PinToolTip = void 0, c.DefaultValue && (c.DefaultValue = new c.DefaultValue.constructor), e.getCustomproperties(!0).push(c), c } }(this) } showProperty(e) { switch (e) { case "Class": case "Name": case "Archetype": case "ExportPath": case "CustomProperties": return !1 }return super.showProperty(e) } doSerialize(e = !1, t = "", i = this.constructor, s = i.printKey, n = i.keySeparator, r = i.attributeSeparator, a = i.wrap) { const o = t + re.indentation, l = this.trailing; this.trailing = !1; const u = super.doSerialize(e, o, i, s, n, r, a); return this.trailing = l, t + "Begin Object" + (this.Class?.type || this.Class?.path ? ` Class${n}${this.Class.serialize(e)}` : "") + (this.Name ? ` Name${n}${this.Name.serialize(e)}` : "") + (this.Archetype ? ` Archetype${n}${this.Archetype.serialize(e)}` : "") + (this.ExportPath?.type || this.ExportPath?.path ? ` ExportPath${n}${this.ExportPath.serialize(e)}` : "") + (u ? r + u : "") + (!0 !== i.attributes.CustomProperties.ignored && !0 !== this.CustomProperties.ignored ? this.getCustomproperties().map((t => r + o + s("CustomProperties ") + t.serialize(e))).join("") : "") + r + t + "End Object" + (this.trailing ? r : "") } } class Nt extends Ct { constructor(e = {}, t = void 0) { e.Class = new nt(re.paths.knot), e.Name = new Ct.attributes.Name("K2Node_Knot"); const i = new bt({ PinName: new bt.attributes.PinName("InputPin") }), s = new bt({ PinName: new bt.attributes.PinName("OutputPin"), Direction: new bt.attributes.Direction("EGPD_Output") }); t && (i.copyTypeFrom(t), s.copyTypeFrom(t)), e.CustomProperties = new Ct.attributes.CustomProperties([i, s]), super(e) } } class xt { #K; get target() { return this.#K } #e; get blueprint() { return this.#e } consumeEvent; options; listenHandler = () => this.listenEvents(); unlistenHandler = () => this.unlistenEvents(); constructor(e, t, i = {}) { i.consumeEvent ??= !1, i.listenOnFocus ??= !1, i.unlistenOnTextEdit ??= !1, this.#K = e, this.#e = t, this.consumeEvent = i.consumeEvent, this.options = i } setup() { this.options.listenOnFocus && (this.blueprint.addEventListener(re.focusEventName.begin, this.listenHandler), this.blueprint.addEventListener(re.focusEventName.end, this.unlistenHandler)), this.options.unlistenOnTextEdit && (this.blueprint.addEventListener(re.editTextEventName.begin, this.unlistenHandler), this.blueprint.addEventListener(re.editTextEventName.end, this.listenHandler)), this.blueprint.focused && this.listenEvents() } cleanup() { this.unlistenEvents(), this.blueprint.removeEventListener(re.focusEventName.begin, this.listenHandler), this.blueprint.removeEventListener(re.focusEventName.end, this.unlistenHandler), this.blueprint.removeEventListener(re.editTextEventName.begin, this.unlistenHandler), this.blueprint.removeEventListener(re.editTextEventName.end, this.listenHandler) } listenEvents() { } unlistenEvents() { } } class Pt extends Pe { static attributes = { ...super.attributes, ActionName: qe, bShift: ke, bCtrl: ke, bAlt: ke, bCmd: ke, Key: We }; static grammar = this.createGrammar(); constructor(e) { super(e), this.ActionName, this.bShift, this.bCtrl, this.bAlt, this.bCmd, this.Key } static createGrammar() { return xe.alt(We.grammar.map((e => new this({ Key: e }))), Me.createEntityGrammar(this)) } } class kt extends xt { static #X = e => { }; #q; pressedKey = ""; constructor(e, t, i = {}, s = kt.#X, n = kt.#X) { i.activationKeys ??= [], i.consumeEvent ??= !0, i.listenOnFocus ??= !0, i.unlistenOnTextEdit ??= !0, i.activationKeys instanceof Array || (i.activationKeys = [i.activationKeys]), i.activationKeys = i.activationKeys.map((e => { if (e instanceof Pt) return e; if (e.constructor === String) { const t = Pt.grammar.run(e); if (t.status) return t.value } throw new Error("Unexpected key value") })), super(e, t, i), this.onKeyDown = s, this.onKeyUp = n, this.#q = this.options.activationKeys ?? []; let r = this; this.keyDownHandler = e => { r.#q.some((t => (e => e.bShift?.valueOf() || "LeftShift" == e.Key.valueOf() || "RightShift" == e.Key.valueOf())(t) == e.shiftKey && (e => e.bCtrl?.valueOf() || "LeftControl" == e.Key.valueOf() || "RightControl" == e.Key.valueOf())(t) == e.ctrlKey && (e => e.bAlt?.valueOf() || "LeftAlt" == e.Key.valueOf() || "RightAlt" == e.Key.valueOf())(t) == e.altKey && re.Keys[t.Key.value] == e.code)) && (this.consumeEvent && (e.preventDefault(), e.stopImmediatePropagation()), this.pressedKey = e.code, r.fire(), document.removeEventListener("keydown", r.keyDownHandler), document.addEventListener("keyup", r.keyUpHandler)) }, this.keyUpHandler = e => { r.#q.some((t => t.bShift?.valueOf() && "Shift" == e.key || t.bCtrl?.valueOf() && "Control" == e.key || t.bAlt?.valueOf() && "Alt" == e.key || t.bCmd?.valueOf() && "Meta" == e.key || re.Keys[t.Key.value] == e.code)) && (this.consumeEvent && e.stopImmediatePropagation(), r.unfire(), this.pressedKey = "", document.removeEventListener("keyup", this.keyUpHandler), document.addEventListener("keydown", this.keyDownHandler)) } } listenEvents() { document.addEventListener("keydown", this.keyDownHandler) } unlistenEvents() { document.removeEventListener("keydown", this.keyDownHandler) } fire() { this.onKeyDown(this) } unfire() { this.onKeyUp(this) } } class At extends xt { #Z = [0, 0]; get location() { return this.#Z } #W; get enablerKey() { return this.#W } #Q = !0; get enablerActivated() { return this.#Q } constructor(e, t, i = {}) { i.ignoreTranslateCompensate ??= !1, i.ignoreScale ??= !1, i.movementSpace ??= t.getGridDOMElement() ?? document.documentElement, super(e, t, i), this.movementSpace = i.movementSpace, i.enablerKey && (this.#W = i.enablerKey, this.#W.onKeyDown = () => this.#Q = !0, this.#W.onKeyUp = () => this.#Q = !1, this.#W.consumeEvent = !1, this.#W.listenEvents(), this.#Q = !1) } setLocationFromEvent(e) { let t = ae.convertLocation([e.clientX, e.clientY], this.movementSpace, this.options.ignoreScale); return t = this.options.ignoreTranslateCompensate ? t : this.blueprint.compensateTranslation(t[0], t[1]), this.#Z = [...t], this.#Z } } class Lt extends At { static #X = e => { }; #J = e => { if (this.blueprint.setFocused(!0), !this.enablerKey || this.enablerActivated) if (e.button === this.options.clickButton) this.options.strictTarget && e.target !== e.currentTarget || (this.consumeEvent && e.stopImmediatePropagation(), document.addEventListener("mouseup", this.#ee), this.setLocationFromEvent(e), this.clickedPosition[0] = this.location[0], this.clickedPosition[1] = this.location[1], this.blueprint.mousePosition[0] = this.location[0], this.blueprint.mousePosition[1] = this.location[1], this.clicked(this.clickedPosition)); else this.options.exitAnyButton || this.#ee(e) }; #ee = e => { this.options.exitAnyButton && e.button != this.options.clickButton || (this.consumeEvent && e.stopImmediatePropagation(), document.removeEventListener("mouseup", this.#ee), this.unclicked()) }; clickedPosition = [0, 0]; constructor(e, t, i = {}, s = Lt.#X, n = Lt.#X) { i.clickButton ??= re.mouseClickButton, i.consumeEvent ??= !0, i.exitAnyButton ??= !0, i.strictTarget ??= !1, super(e, t, i), this.onClick = s, this.onUnclick = n, this.listenEvents() } listenEvents() { this.target.addEventListener("mousedown", this.#J), this.options.clickButton === re.mouseRightClickButton && this.target.addEventListener("contextmenu", (e => e.preventDefault())) } unlistenEvents() { this.target.removeEventListener("mousedown", this.#J) } clicked(e) { this.onClick(this) } unclicked(e) { this.onUnclick(this) } } class Mt extends At { static ignoreDbClick = e => { }; #te = e => { this.options.strictTarget && e.target !== e.currentTarget || (this.consumeEvent && e.stopImmediatePropagation(), this.clickedPosition = this.setLocationFromEvent(e), this.blueprint.mousePosition = [...this.clickedPosition], this.dbclicked(this.clickedPosition)) }; #ie; get onDbClick() { return this.#ie } set onDbClick(e) { this.#ie = e } clickedPosition = [0, 0]; constructor(e, t, i = {}, s = Mt.ignoreDbClick) { i.consumeEvent ??= !0, i.strictTarget ??= !1, super(e, t, i), this.#ie = s, this.listenEvents() } listenEvents() { this.target.addEventListener("dblclick", this.#te) } unlistenEvents() { this.target.removeEventListener("dblclick", this.#te) } dbclicked(e) { this.onDbClick(e) } } class Tt { static deleteNodes = "Delete"; static duplicateNodes = "(bCtrl=True,Key=D)"; static enableLinkDelete = "LeftAlt"; static enableZoomIn = ["LeftControl", "RightControl"]; static selectAllNodes = "(bCtrl=True,Key=A)" } class It { element; get blueprint() { return this.element.blueprint } #se = []; get inputObjects() { return this.#se } initialize(e) { this.element = e } createInputObjects() { return [] } setup() { this.#se.forEach((e => e.setup())) } cleanup() { this.#se.forEach((e => e.cleanup())) } willUpdate(e) { } update(e) { } render() { return G`` } firstUpdated(e) { } updated(e) { } inputSetup() { this.#se = this.createInputObjects() } } class Ot extends It { update(e) { super.update(e); const [t, i, s, n] = [Math.round(this.element.fromX), Math.round(this.element.fromY), Math.round(this.element.toX), Math.round(this.element.toY)], [r, a, o, l] = [Math.min(t, s), Math.min(i, n), Math.abs(t - s), Math.abs(i - n)]; (e.has("fromX") || e.has("toX")) && (this.element.style.left = `${r}px`, this.element.style.width = `${o}px`), (e.has("fromY") || e.has("toY")) && (this.element.style.top = `${a}px`, this.element.style.height = `${l}px`) } } class Dt extends Ot { static sigmoidPositive(e, t = 3.7, i = 1.1) { return 1 - Math.exp(-((e / i) ** t)) } static decreasingValue(e, t) { const i = -e * t[0] ** 2, s = t[1] - i / t[0]; return e => i / e + s } static clampedLine(e, t) { if (e[0] > t[0]) { const i = e; e = t, t = i } const i = (t[1] - e[1]) / (t[0] - e[0]), s = e[1] - i * e[0]; return n => n < e[0] ? e[1] : n > t[0] ? t[1] : i * n + s } static c1DecreasingValue = Dt.decreasingValue(-.15, [100, 15]); static c2DecreasingValue = Dt.decreasingValue(-.05, [500, 130]); static c2Clamped = Dt.clampedLine([0, 80], [200, 40]); #ne = `ueb-id-${Math.floor(1e12 * Math.random())}`; #re = e => { const t = new Nt({}, this.element.source.entity), i = Ae.getConstructor("ueb-node").newObject(t); i.setLocation(...this.blueprint.snapToGrid(...e)); const s = i.template; this.blueprint.addGraphElement(i); const n = this.element.getInputPin(), r = this.element.getOutputPin(); this.element.source = null, this.element.destination = null; const a = Ae.getConstructor("ueb-link").newObject(r, s.inputPin); this.blueprint.addGraphElement(a), this.element.source = s.outputPin, this.element.destination = n }; createInputObjects() { const e = this.element.querySelector(".ueb-link-area"); return [...super.createInputObjects(), new Mt(e, this.blueprint, void 0, (e => { e[0] += re.knotOffset[0], e[1] += re.knotOffset[1], e = ae.snapToGrid(e[0], e[1], re.gridSize), this.#re(e) })), new Lt(e, this.blueprint, { enablerKey: new kt(this.blueprint, this.blueprint, { activationKeys: Tt.enableLinkDelete }) }, (() => this.blueprint.removeGraphElement(this.element)))] } willUpdate(e) { super.willUpdate(e); const t = this.element.source, i = this.element.destination; if (e.has("fromX") || e.has("toX")) { const e = this.element.fromX, s = this.element.toX, n = t?.nodeElement.getType() == re.paths.knot, r = i?.nodeElement.getType() == re.paths.knot; !n || i && !r || (t?.isInput() && s > e + re.distanceThreshold ? this.element.source = t.nodeElement.template.outputPin : t?.isOutput() && s < e - re.distanceThreshold && (this.element.source = t.nodeElement.template.inputPin)), !r || t && !n || (i?.isInput() && s < e - re.distanceThreshold ? this.element.destination = i.nodeElement.template.outputPin : i?.isOutput() && s > e + re.distanceThreshold && (this.element.destination = i.nodeElement.template.inputPin)) } const s = Math.max(Math.abs(this.element.fromX - this.element.toX), 1), n = Math.max(Math.abs(this.element.fromY - this.element.toY), 1), r = Math.max(s, re.linkMinWidth), a = s / r, o = this.element.originatesFromInput ? this.element.fromX < this.element.toX : this.element.toX < this.element.fromX; this.element.startPixels = s < r ? (r - s) / 2 : 0, this.element.startPercentage = o ? this.element.startPixels + 100 * a : this.element.startPixels; const l = this.element.startPercentage + (o ? Dt.c1DecreasingValue(r) : 10) * a, u = n / Math.max(30, s), c = Dt.c2Clamped(s) * Dt.sigmoidPositive(1.2 * a + .5 * u, 1.5, 1.8) + this.element.startPercentage; this.element.svgPathD = re.linkRightSVGPath(this.element.startPercentage, l, c) } update(e) { super.update(e), e.has("originatesFromInput") && this.element.style.setProperty("--ueb-from-input", this.element.originatesFromInput ? "1" : "0"); const t = this.element.getOutputPin(!0); t && this.element.style.setProperty("--ueb-link-color-rgb", Ie.printLinearColor(t.color)), this.element.style.setProperty("--ueb-y-reflected", "" + (this.element.fromY > this.element.toY ? 1 : 0)), this.element.style.setProperty("--ueb-start-percentage", `${Math.round(this.element.startPercentage)}%`), this.element.style.setProperty("--ueb-link-start", `${Math.round(this.element.startPixels)}`) } render() { return G` ${this.element.linkMessageIcon || this.element.linkMessageText ? G`` : V}` } } class $t extends oe { static properties = { ...super.properties, fromX: { type: Number, attribute: !1 }, fromY: { type: Number, attribute: !1 }, toX: { type: Number, attribute: !1 }, toY: { type: Number, attribute: !1 } }; constructor() { super(), this.fromX = 0, this.fromY = 0, this.toX = 0, this.toY = 0 } setBothLocations([e, t]) { this.fromX = e, this.fromY = t, this.toX = e, this.toY = t } addSourceLocation(e, t) { this.fromX += e, this.fromY += t } addDestinationLocation(e, t) { this.toX += e, this.toY += t } } class Bt extends $t { static properties = { ...super.properties, dragging: { type: Boolean, attribute: "data-dragging", converter: ke.booleanConverter, reflect: !0 }, originatesFromInput: { type: Boolean, attribute: !1 }, svgPathD: { type: String, attribute: !1 }, linkMessageIcon: { type: String, attribute: !1 }, linkMessageText: { type: String, attribute: !1 } }; #ae; get source() { return this.#ae } set source(e) { this.#oe(e, !1) } #le; get destination() { return this.#le } set destination(e) { this.#oe(e, !0) } #ue = () => this.remove(); #ce = e => this.addSourceLocation(...e.detail.value); #he = e => this.addDestinationLocation(...e.detail.value); #pe = e => this.setSourceLocation(); #de = e => this.setDestinationLocation(); linkMessageIcon = V; linkMessageText = V; pathElement; constructor() { super(), this.dragging = !1, this.originatesFromInput = !1, this.startPercentage = 0, this.svgPathD = "", this.startPixels = 0 } static newObject(e, t) { const i = new Bt; return i.initialize(e, t), i } initialize(e, t) { super.initialize({}, new Dt), e && (this.source = e, t || (this.toX = this.fromX, this.toY = this.fromY)), t && (this.destination = t, e || (this.fromX = this.toX, this.fromY = this.toY)) } #oe(e, t) { const i = () => t ? this.destination : this.source; if (i() != e) { if (i()) { const e = i().getNodeElement(); e.removeEventListener(re.removeEventName, this.#ue), e.removeEventListener(re.nodeDragEventName, t ? this.#he : this.#ce), e.removeEventListener(re.nodeReflowEventName, t ? this.#de : this.#pe), this.#me() } if (t ? this.#le = e : this.#ae = e, i()) { const e = i().getNodeElement(); e.addEventListener(re.removeEventName, this.#ue), e.addEventListener(re.nodeDragEventName, t ? this.#he : this.#ce), e.addEventListener(re.nodeReflowEventName, t ? this.#de : this.#pe), t ? this.setDestinationLocation() : (this.setSourceLocation(), this.originatesFromInput = this.source.isInput()), this.#ge() } } } #ge() { this.source && this.destination && (this.source.linkTo(this.destination), this.destination.linkTo(this.source)) } #me() { this.source && this.destination && (this.source.unlinkFrom(this.destination, !1), this.destination.unlinkFrom(this.source, !1)) } cleanup() { super.cleanup(), this.#me(), this.source = null, this.destination = null } setSourceLocation(e = null, t = !0) { if (null == e) { const i = this; if (t && (!this.hasUpdated || !this.source.hasUpdated)) return void Promise.all([this.updateComplete, this.source.updateComplete]).then((() => i.setSourceLocation(null, !1))); e = this.source.template.getLinkLocation() } const [i, s] = e; this.fromX = i, this.fromY = s } setDestinationLocation(e = null, t = !0) { if (null == e) { const i = this; if (t && (!this.hasUpdated || !this.destination.hasUpdated)) return void Promise.all([this.updateComplete, this.destination.updateComplete]).then((() => i.setDestinationLocation(null, !1))); e = this.destination.template.getLinkLocation() } this.toX = e[0], this.toY = e[1] } getInputPin(e = !1) { return this.source?.isInput() ? this.source : this.destination?.isInput() ? this.destination : e ? this.source ?? this.destination : void 0 } setInputPin(e) { this.source?.isInput() && (this.source = e), this.destination = e } getOutputPin(e = !1) { return this.source?.isOutput() ? this.source : this.destination?.isOutput() ? this.destination : e ? this.source ?? this.destination : void 0 } setOutputPin(e) { this.destination?.isOutput() && (this.destination = e), this.source = e } startDragging() { this.dragging = !0 } finishDragging() { this.dragging = !1 } removeMessage() { this.linkMessageIcon = V, this.linkMessageText = V } setMessageConvertType() { this.linkMessageIcon = le.convert, this.linkMessageText = G`Convert ${this.source.pinType} to ${this.destination.pinType}.` } setMessageCorrect() { this.linkMessageIcon = le.correct, this.linkMessageText = V } setMessageReplace() { this.linkMessageIcon = le.correct, this.linkMessageText = V } setMessageDirectionsIncompatible() { this.linkMessageIcon = le.reject, this.linkMessageText = G`Directions are not compatbile.` } setMessagePlaceNode() { this.linkMessageIcon = V, this.linkMessageText = G`Place a new node.` } setMessageReplaceLink() { this.linkMessageIcon = le.correct, this.linkMessageText = G`Replace existing input connections.` } setMessageReplaceOutputLink() { this.linkMessageIcon = le.correct, this.linkMessageText = G`Replace existing output connections.` } setMessageSameNode() { this.linkMessageIcon = le.reject, this.linkMessageText = G`Both are on the same node.` } setMessageTypesIncompatible(e, t) { this.linkMessageIcon = le.reject, this.linkMessageText = G`${ae.capitalFirstLetter(e.pinType)} is not compatible with ${ae.capitalFirstLetter(t.pinType)}.` } } class Gt extends oe { static properties = { ...super.properties, locationX: { type: Number, attribute: !1 }, locationY: { type: Number, attribute: !1 }, sizeX: { type: Number, attribute: !1 }, sizeY: { type: Number, attribute: !1 } }; static dragEventName = re.dragEventName; static dragGeneralEventName = re.dragGeneralEventName; constructor() { super(), this.locationX = 0, this.locationY = 0, this.sizeX = 0, this.sizeY = 0 } computeSizes() { const e = this.getBoundingClientRect(); this.sizeX = this.blueprint.scaleCorrect(e.width), this.sizeY = this.blueprint.scaleCorrect(e.height) } firstUpdated(e) { super.firstUpdated(e), this.computeSizes() } setLocation(e, t, i = !0) { const s = e - this.locationX, n = t - this.locationY; if (this.locationX = e, this.locationY = t, this.blueprint && i) { const e = new CustomEvent(this.constructor.dragEventName, { detail: { value: [s, n] }, bubbles: !1, cancelable: !0 }); this.dispatchEvent(e) } } addLocation(e, t, i = !0) { this.setLocation(this.locationX + e, this.locationY + t, i) } acknowledgeDrag(e) { const t = new CustomEvent(this.constructor.dragGeneralEventName, { detail: { value: e }, bubbles: !0, cancelable: !0 }); this.dispatchEvent(t) } snapToGrid() { const e = ae.snapToGrid(this.locationX, this.locationY, re.gridSize); this.locationX == e[0] && this.locationY == e[1] || this.setLocation(e[0], e[1]) } topBoundary(e = !1) { return this.template.topBoundary(e) } rightBoundary(e = !1) { return this.template.rightBoundary(e) } bottomBoundary(e = !1) { return this.template.bottomBoundary(e) } leftBoundary(e = !1) { return this.template.leftBoundary(e) } } class Ht extends At { #J = e => { if (this.blueprint.setFocused(!0), e.button === this.options.clickButton) this.options.strictTarget && e.target != e.currentTarget || (this.consumeEvent && e.stopImmediatePropagation(), this.#be.addEventListener("mousemove", this.#ve), document.addEventListener("mouseup", this.#ee), this.setLocationFromEvent(e), this.clickedPosition[0] = this.location[0], this.clickedPosition[1] = this.location[1], this.blueprint.mousePosition[0] = this.location[0], this.blueprint.mousePosition[1] = this.location[1], this.target instanceof Gt && (this.clickedOffset = [this.clickedPosition[0] - this.target.locationX, this.clickedPosition[1] - this.target.locationY]), this.clicked(this.clickedPosition)); else this.options.exitAnyButton || this.#ee(e) }; #ve = e => { this.consumeEvent && e.stopImmediatePropagation(), this.#be.removeEventListener("mousemove", this.#ve), this.#be.addEventListener("mousemove", this.#fe); const t = this.getEvent(re.trackingMouseEventName.begin); this.#ye = 0 == this.target.dispatchEvent(t), this.setLocationFromEvent(e), this.lastLocation = ae.snapToGrid(this.clickedPosition[0], this.clickedPosition[1], this.stepSize), this.startDrag(this.location), this.started = !0, this.#fe(e) }; #fe = e => { this.consumeEvent && e.stopImmediatePropagation(); const t = this.setLocationFromEvent(e), i = [e.movementX, e.movementY]; if (this.dragTo(t, i), this.#ye && (this.blueprint.mousePosition = t), this.options.scrollGraphEdge) { const e = Math.sqrt(i[0] * i[0] + i[1] * i[1]), s = this.blueprint.scaleCorrect(re.edgeScrollThreshold), n = this.blueprint.template.gridLeftVisibilityBoundary() + s, r = this.blueprint.template.gridRightVisibilityBoundary() - s; let a = 0; t[0] < n ? a = t[0] - n : t[0] > r && (a = t[0] - r); const o = this.blueprint.template.gridTopVisibilityBoundary() + s, l = this.blueprint.template.gridBottomVisibilityBoundary() - s; let u = 0; t[1] < o ? u = t[1] - o : t[1] > l && (u = t[1] - l), a = ae.clamp(this.blueprint.scaleCorrectReverse(a) ** 3 * e * .6, -20, 20), u = ae.clamp(this.blueprint.scaleCorrectReverse(u) ** 3 * e * .6, -20, 20), this.blueprint.scrollDelta(a, u) } }; #ee = e => { if (!this.options.exitAnyButton || e.button == this.options.clickButton) { if (this.consumeEvent && e.stopImmediatePropagation(), this.#be.removeEventListener("mousemove", this.#ve), this.#be.removeEventListener("mousemove", this.#fe), document.removeEventListener("mouseup", this.#ee), this.started && this.endDrag(), this.unclicked(), this.#ye) { const e = this.getEvent(re.trackingMouseEventName.end); this.target.dispatchEvent(e), this.#ye = !1 } this.started = !1 } }; #ye = !1; #be; #we; get draggableElement() { return this.#we } clickedOffset = [0, 0]; clickedPosition = [0, 0]; lastLocation = [0, 0]; started = !1; stepSize = 1; constructor(e, t, i = {}) { i.clickButton ??= re.mouseClickButton, i.consumeEvent ??= !0, i.draggableElement ??= e, i.exitAnyButton ??= !0, i.moveEverywhere ??= !1, i.movementSpace ??= t?.getGridDOMElement(), i.repositionOnClick ??= !1, i.scrollGraphEdge ??= !1, i.strictTarget ??= !1, super(e, t, i), this.stepSize = Number(i.stepSize ?? re.gridSize), this.#be = this.options.moveEverywhere ? document.documentElement : this.movementSpace, this.#we = this.options.draggableElement, this.listenEvents() } listenEvents() { super.listenEvents(), this.#we.addEventListener("mousedown", this.#J), this.options.clickButton === re.mouseRightClickButton && this.#we.addEventListener("contextmenu", (e => e.preventDefault())) } unlistenEvents() { super.unlistenEvents(), this.#we.removeEventListener("mousedown", this.#J) } getEvent(e) { return new CustomEvent(e, { detail: { tracker: this }, bubbles: !0, cancelable: !0 }) } clicked(e) { } startDrag(e) { } dragTo(e, t) { } endDrag() { } unclicked(e) { } } class Vt extends Ht { clicked(e) { this.options.repositionOnClick && (this.target.setLocation(...this.stepSize > 1 ? ae.snapToGrid(e[0], e[1], this.stepSize) : e), this.clickedOffset = [0, 0]) } dragTo(e, t) { const i = [this.target.locationX ?? this.lastLocation[0], this.target.locationY ?? this.lastLocation[1]], [s, n] = this.stepSize > 1 ? [ae.snapToGrid(e[0], e[1], this.stepSize), ae.snapToGrid(i[0], i[1], this.stepSize)] : [e, i]; 0 == (t = [s[0] - this.lastLocation[0], s[1] - this.lastLocation[1]])[0] && 0 == t[1] || (t[0] += n[0] - i[0], t[1] += n[1] - i[1], this.dragAction(s, t), this.lastLocation = s) } dragAction(e, t) { this.target.setLocation(e[0] - this.clickedOffset[0], e[1] - this.clickedOffset[1]) } } class Rt extends Vt { #Se; #Ee; #Ce; #Ne; constructor(e, t, i = {}) { super(e, t, i), i.onClicked && (this.#Se = i.onClicked), i.onStartDrag && (this.#Ee = i.onStartDrag), i.onDrag && (this.#Ce = i.onDrag), i.onEndDrag && (this.#Ne = i.onEndDrag) } clicked(e) { super.clicked(e), this.#Se?.() } startDrag() { super.startDrag(), this.#Ee?.() } dragAction(e, t) { this.#Ce?.(e, t) } endDrag() { super.endDrag(), this.#Ne?.() } } class _t extends Vt { constructor(e, t, i = {}) { super(e, t, i), this.draggableElement.classList.add("ueb-draggable") } startDrag() { this.target.selected || (this.blueprint.unselectAll(), this.target.setSelected(!0)) } dragAction(e, t) { this.target.acknowledgeDrag(t) } unclicked() { this.started ? (this.blueprint.getNodes(!0).forEach((e => e.boundComments.filter((t => !e.isInsideComment(t))).forEach((t => e.unbindFromComment(t))))), this.blueprint.getCommentNodes().forEach((e => e.template.manageNodesBind()))) : (this.blueprint.unselectAll(), this.target.setSelected(!0)) } } class zt extends It { getDraggableElement() { return this.element } createDraggableObject() { const e = this.getDraggableElement(); return new Vt(this.element, this.blueprint, { draggableElement: e }) } createInputObjects() { return [...super.createInputObjects(), this.createDraggableObject(), new kt(this.element, this.blueprint, { activationKeys: [re.Keys.ArrowUp, re.Keys.ArrowRight, re.Keys.ArrowDown, re.Keys.ArrowLeft] }, (e => e.target.acknowledgeDrag([e.pressedKey === re.Keys.ArrowLeft ? -re.gridSize : e.pressedKey === re.Keys.ArrowRight ? re.gridSize : 0, e.pressedKey === re.Keys.ArrowUp ? -re.gridSize : e.pressedKey === re.Keys.ArrowDown ? re.gridSize : 0])))] } topBoundary(e = !1) { return this.element.locationY } rightBoundary(e = !1) { return this.element.locationX + this.element.sizeX } bottomBoundary(e = !1) { return this.element.locationY + this.element.sizeY } leftBoundary(e = !1) { return this.element.locationX } centerInViewport() { const e = Math.min(this.blueprint.template.viewportSize[0] / 10, this.blueprint.template.viewportSize[1] / 10), t = this.leftBoundary() - this.blueprint.template.gridLeftVisibilityBoundary(), i = this.blueprint.template.gridRightVisibilityBoundary() - this.rightBoundary(); let s = Math.max((t + i) / 2, e); const n = this.topBoundary() - this.blueprint.template.gridTopVisibilityBoundary(), r = this.blueprint.template.gridBottomVisibilityBoundary() - this.bottomBoundary(); let a = Math.max((n + r) / 2, e); this.blueprint.scrollDelta(t - s, n - a, !0) } } class Ft extends zt { update(e) { super.update(e), e.has("locationX") && (this.element.style.left = `${this.element.locationX}px`), e.has("locationY") && (this.element.style.top = `${this.element.locationY}px`) } } class jt extends Ft { getDraggableElement() { return this.element } createDraggableObject() { return new _t(this.element, this.blueprint, { draggableElement: this.getDraggableElement(), scrollGraphEdge: !0 }) } firstUpdated(e) { super.firstUpdated(e), this.element.selected && !this.element.listeningDrag && this.element.setSelected(!0) } } class Ut extends jt { static nodeStyleClasses = ["ueb-node-style-default"]; #xe; pinInserter; inputContainer; outputContainer; pinElement; addPinHandler = () => { const e = this.pinInserter?.(); e && (this.defaultPin && this.defaultPin.isInput() === e.isInput() ? this.defaultPin.before(this.createPinElement(e)) : (e.isInput() ? this.inputContainer : this.outputContainer).appendChild(this.createPinElement(e)), this.element.acknowledgeReflow()) }; toggleAdvancedDisplayHandler = () => { this.element.toggleShowAdvancedPinDisplay(), this.element.requestUpdate(), this.element.updateComplete.then((() => this.element.acknowledgeReflow())) }; createPinElement(e) { const t = Ae.getConstructor("ueb-pin").newObject(e, void 0, this.element); return this.pinInserter && !this.defaultPin && "Default" === t.getPinName() && (this.defaultPin = t, this.defaultPin.classList.add("ueb-node-variadic-default")), t } initialize(e) { super.initialize(e), this.#xe = function (e) { switch (e.getType()) { case re.paths.addDelegate: case re.paths.clearDelegate: case re.paths.removeDelegate: return null }const t = e.getPinEntities().find((e => "self" === e.PinName?.toString() && "Target" === Ke(e))); if (t) { const i = e.FunctionReference?.MemberParent?.getName() ?? t.PinType?.PinSubCategoryObject?.getName() ?? "Untitled"; return i.length > 0 ? `Target is ${ae.formatStringName(i)}` : null } return null }(e.entity), this.element.classList.add(...this.constructor.nodeStyleClasses), this.element.style.setProperty("--ueb-node-color", this.getColor().cssText), this.pinInserter = this.element.entity.additionalPinInserter(), this.pinInserter && this.element.classList.add("ueb-node-is-variadic") } getColor() { return this.element.entity.nodeColor() } render() { return G`
${this.renderTop()}
${this.pinInserter ? G`
Add pin ${le.plusCircle}
` : V} ${this.element.entity.isDevelopmentOnly() ? G`
Development Only
` : V} ${this.element.advancedPinDisplay ? G`
${le.expandIcon}
` : V}
` } renderNodeIcon() { return this.element.entity.nodeIcon() } renderNodeName() { return this.element.nodeDisplayName } renderTop() { const e = this.renderNodeIcon(), t = this.renderNodeName(); return G`
${e ? G`
${e}
` : V} ${t ? G`
${t} ${this.#xe ? G`
${this.#xe}
` : V}
` : V}
` } firstUpdated(e) { super.firstUpdated(e), this.inputContainer = this.element.querySelector(".ueb-node-inputs"), this.outputContainer = this.element.querySelector(".ueb-node-outputs"), this.setupPins(), this.element.updateComplete.then((() => this.element.acknowledgeReflow())) } setupPins() { this.element.nodeNameElement = this.element.querySelector(".ueb-node-name-text"); let e = !1, t = !1; for (const i of this.getPinElements()) i !== this.defaultPin && (i.isInput() ? (this.inputContainer.appendChild(i), e = !0) : i.isOutput() && (this.outputContainer.appendChild(i), t = !0)); this.defaultPin && (this.defaultPin.isInput() ? this.inputContainer : this.outputContainer).appendChild(this.defaultPin), e && this.element.classList.add("ueb-node-has-inputs"), t && this.element.classList.add("ueb-node-has-outputs") } getPinElements() { return this.element.getPinElements() } createPinElements() { return this.element.getPinEntities().filter((e => !e.isHidden())).map((e => this.createPinElement(e))) } linksChanged() { } } class Yt extends Ut { #Pe = document.createElement("div"); #ke = document.createElement("div"); #Ae = document.createElement("div"); #Le = document.createElement("div"); #Me = document.createElement("div"); #Te = document.createElement("div"); #Ie = document.createElement("div"); #Oe = document.createElement("div"); initialize(e) { super.initialize(e), this.element.classList.add("ueb-resizeable"), this.#Pe.classList.add("ueb-resizeable-top"), this.#ke.classList.add("ueb-resizeable-right"), this.#Ae.classList.add("ueb-resizeable-bottom"), this.#Le.classList.add("ueb-resizeable-left"), this.#Me.classList.add("ueb-resizeable-top-right"), this.#Te.classList.add("ueb-resizeable-bottom-right"), this.#Ie.classList.add("ueb-resizeable-bottom-left"), this.#Oe.classList.add("ueb-resizeable-top-left") } update(e) { super.update(e), this.element.sizeX >= 0 && e.has("sizeX") && (this.element.style.width = `${this.element.sizeX}px`), this.element.sizeY >= 0 && e.has("sizeY") && (this.element.style.height = `${this.element.sizeY}px`) } firstUpdated(e) { super.firstUpdated(e), this.element.append(this.#Pe, this.#ke, this.#Ae, this.#Le, this.#Me, this.#Te, this.#Ie, this.#Oe) } createInputObjects() { return [...super.createInputObjects(), new Rt(this.#Pe, this.blueprint, { onDrag: (e, t) => { t[1] = e[1] - this.element.topBoundary(), this.setSizeY(this.element.sizeY - t[1]) && this.element.addLocation(0, t[1], !1) }, onEndDrag: () => this.endResize() }), new Rt(this.#ke, this.blueprint, { onDrag: (e, t) => { t[0] = e[0] - this.element.rightBoundary(), this.setSizeX(this.element.sizeX + t[0]) }, onEndDrag: () => this.endResize() }), new Rt(this.#Ae, this.blueprint, { onDrag: (e, t) => { t[1] = e[1] - this.element.bottomBoundary(), this.setSizeY(this.element.sizeY + t[1]) }, onEndDrag: () => this.endResize() }), new Rt(this.#Le, this.blueprint, { onDrag: (e, t) => { t[0] = e[0] - this.element.leftBoundary(), this.setSizeX(this.element.sizeX - t[0]) && this.element.addLocation(t[0], 0, !1) }, onEndDrag: () => this.endResize() }), new Rt(this.#Me, this.blueprint, { onDrag: (e, t) => { t[0] = e[0] - this.element.rightBoundary(), t[1] = e[1] - this.element.topBoundary(), this.setSizeX(this.element.sizeX + t[0]), this.setSizeY(this.element.sizeY - t[1]) && this.element.addLocation(0, t[1], !1) }, onEndDrag: () => this.endResize() }), new Rt(this.#Te, this.blueprint, { onDrag: (e, t) => { t[0] = e[0] - this.element.rightBoundary(), t[1] = e[1] - this.element.bottomBoundary(), this.setSizeX(this.element.sizeX + t[0]), this.setSizeY(this.element.sizeY + t[1]) }, onEndDrag: () => this.endResize() }), new Rt(this.#Ie, this.blueprint, { onDrag: (e, t) => { t[0] = e[0] - this.element.leftBoundary(), t[1] = e[1] - this.element.bottomBoundary(), this.setSizeX(this.element.sizeX - t[0]) && this.element.addLocation(t[0], 0, !1), this.setSizeY(this.element.sizeY + t[1]) }, onEndDrag: () => this.endResize() }), new Rt(this.#Oe, this.blueprint, { onDrag: (e, t) => { t[0] = e[0] - this.element.leftBoundary(), t[1] = e[1] - this.element.topBoundary(), this.setSizeX(this.element.sizeX - t[0]) && this.element.addLocation(t[0], 0, !1), this.setSizeY(this.element.sizeY - t[1]) && this.element.addLocation(0, t[1], !1) }, onEndDrag: () => this.endResize() })] } setSizeX(e) { return this.element.setNodeWidth(e), !0 } setSizeY(e) { return this.element.setNodeHeight(e), !0 } endResize() { } } class Kt extends Yt { #De = 0; initialize(e) { super.initialize(e), e.classList.add("ueb-node-style-comment", "ueb-node-resizeable"), e.sizeX = 25 * re.gridSize, e.sizeY = 6 * re.gridSize, super.initialize(e) } getDraggableElement() { return this.element.querySelector(".ueb-node-top") } render() { return G`
` } firstUpdated(e) { super.firstUpdated(e); const t = this.getDraggableElement().getBoundingClientRect(); this.#De = t.height } manageNodesBind() { let e = this.blueprint.getNodes(); for (let t of e) t.topBoundary() >= this.element.topBoundary() && t.rightBoundary() <= this.element.rightBoundary() && t.bottomBoundary() <= this.element.bottomBoundary() && t.leftBoundary() >= this.element.leftBoundary() ? t.bindToComment(this.element) : t.unbindFromComment(this.element) } setSizeX(e) { return (e = Math.round(e)) >= 2 * re.gridSize && (this.element.setNodeWidth(e), !0) } setSizeY(e) { return (e = Math.round(e)) >= 2 * re.gridSize && (this.element.setNodeHeight(e), !0) } endResize() { this.manageNodesBind() } topBoundary(e = !1) { return this.element.locationY } rightBoundary(e = !1) { return this.element.locationX + this.element.sizeX } bottomBoundary(e = !1) { return e ? this.element.locationY + this.#De : super.bottomBoundary() } leftBoundary(e = !1) { return this.element.locationX } } class Xt extends Ht { #$e; #Be = null; #Ge = e => { if (!this.enteredPin) { this.linkValid = !1, this.enteredPin = e.target; const t = this.link.source ?? this.target, i = this.enteredPin, s = t.isOutput() ? t : i; t.nodeElement.getType() === re.paths.knot || i.nodeElement.getType() === re.paths.knot ? (this.link.setMessageCorrect(), this.linkValid = !0) : t.getNodeElement() === i.getNodeElement() ? this.link.setMessageSameNode() : t.isOutput() === i.isOutput() ? this.link.setMessageDirectionsIncompatible() : this.blueprint.getLinks(t, i).length ? (this.link.setMessageReplaceLink(), this.linkValid = !0) : "exec" === s.entity.getType() && s.isLinked ? (this.link.setMessageReplaceOutputLink(), this.linkValid = !0) : "object" == t.entity.PinType.PinCategory.valueOf() && "object" == i.entity.PinType.PinCategory.valueOf() || t.pinType == i.pinType ? (this.link.setMessageCorrect(), this.linkValid = !0) : (this.link.setMessageTypesIncompatible(t, i), this.linkValid = !1) } }; #He = e => { this.enteredPin == e.target && (this.enteredPin = null, this.linkValid = !1, this.link?.setMessagePlaceNode()) }; link; enteredPin; linkValid = !1; constructor(e, t, i = {}) { i.scrollGraphEdge ??= !0, super(e, t, i) } startDrag(e) { this.target.nodeElement.getType() == re.paths.knot && (this.#Be = this.target), this.link = Ae.getConstructor("ueb-link").newObject(this.target, null), this.blueprint.template.linksContainerElement.prepend(this.link), this.link.setMessagePlaceNode(), this.#$e = this.blueprint.querySelectorAll("ueb-pin"), this.#$e.forEach((e => { e != this.target && (e.addEventListener("mouseenter", this.#Ge), e.addEventListener("mouseleave", this.#He)) })), this.link.startDragging(), this.link.setDestinationLocation(e) } dragTo(e, t) { this.link.setDestinationLocation(e) } endDrag() { if (this.#$e.forEach((e => { e.removeEventListener("mouseenter", this.#Ge), e.removeEventListener("mouseleave", this.#He) })), this.#$e = null, this.enteredPin && this.linkValid) { if (this.#Be) { const e = this.#Be !== this.link.source ? this.link.source : this.enteredPin; if (this.#Be.isInput() && e.isInput() || this.#Be.isOutput() && e.isOutput()) { const e = this.#Be.template.getOppositePin(); this.#Be === this.link.source ? this.link.source = e : this.enteredPin = e } } else this.enteredPin.nodeElement.getType() === re.paths.knot && (this.#Be = this.enteredPin, this.link.source.isOutput() && (this.enteredPin = this.enteredPin.template.getOppositePin())); this.link.source.getLinks().find((e => e.equals(this.enteredPin.createPinReference()))) ? this.link.remove() : (this.blueprint.addGraphElement(this.link), this.link.destination = this.enteredPin) } else this.link.remove(); this.enteredPin = null, this.link.removeMessage(), this.link.finishDragging(), this.link = null } } class qt extends Ut { #Ve = !1; #Re = !1; displayName = ""; static nodeStyleClasses = ["ueb-node-style-glass"]; initialize(e) { super.initialize(e), this.displayName = this.element.nodeDisplayName } render() { return G`
${this.displayName ? G`
${this.displayName}
` : V} ${this.#Ve ? G`
` : V} ${this.#Re ? G`
` : V} ${this.pinInserter ? G`
Add pin ${le.plusCircle}
` : V}
` } createPinElements() { return this.element.getPinEntities().filter((e => !e.isHidden())).map((e => { this.#Ve ||= e.isInput(), this.#Re ||= e.isOutput(); return Ae.getConstructor("ueb-pin").newObject(e, void 0, this.element) })) } } class Zt extends qt { static nodeStyleClasses = ["ueb-node-style-metasound", "ueb-node-style-operation"] } class Wt extends qt { static nodeStyleClasses = [...super.nodeStyleClasses, "ueb-node-style-conversion"] } class Qt extends qt { static nodeStyleClasses = [...super.nodeStyleClasses, "ueb-node-style-operation"] } class Jt extends It { static canWrapInput = !0; #_e; get iconElement() { return this.#_e } #ze; get wrapperElement() { return this.#ze } isNameRendered = !0; initialize(e) { if (super.initialize(e), this.element.nodeElement) { const e = this.element.nodeElement.template; this.isNameRendered = !(e instanceof Wt || e instanceof Qt || e instanceof Zt) } } setup() { super.setup(), this.element.nodeElement = this.element.closest("ueb-node"); const e = this.element.nodeElement.template; (e instanceof Wt || e instanceof Qt) && (this.isNameRendered = !1, this.element.requestUpdate()) } createInputObjects() { return [new Xt(this.element, this.blueprint, { moveEverywhere: !0, draggableElement: this.getClickableElement() })] } render() { const e = G`
${this.renderIcon()}
`, t = G`
${this.isNameRendered ? this.renderName() : V} ${this.isInputRendered() ? this.renderInput() : G``}
`; return G`
${this.element.isInput() ? G`${e}${t}` : G`${t}${e}`}
` } renderIcon() { if (this.element.nodeElement.entity.isPcg()) switch (this.element.entity.getType()) { case "Any": return le.pcgPin; case "Param": case "Param[]": return le.pcgParamPin; case "Spatial": case "Spatial[]": return le.pcgSpatialPin; case "Any[]": case "Point[]": case "Surface[]": case "Volume[]": if (this.element.isOutput()) return le.pcgPin; case "Point": case "Surface": case "Volume": return le.pcgStackPin }switch (this.element.entity.PinType.ContainerType?.toString()) { case "Array": return le.arrayPin; case "Set": return le.setPin; case "Map": return le.mapPin }return "delegate" === this.element.entity.PinType.PinCategory?.toString().toLocaleLowerCase() ? le.delegate : this.element.nodeElement?.template instanceof Qt ? le.operationPin : le.genericPin } renderName() { let e = this.element.getPinDisplayName(); const t = this.element.nodeElement, i = this.element.getPinName(); return t.getType() == re.paths.makeStruct && i == t.entity.StructType.getName() && (e = i), G`${e}` } isInputRendered() { return this.element.isInput() && !this.element.entity.bDefaultValueIsIgnored?.valueOf() && !this.element.entity.PinType.bIsReference?.valueOf() } renderInput() { return G`` } updated(e) { if (super.updated(e), this.element.isInput() && e.has("isLinked")) { const e = this.element.nodeElement; this.element.requestUpdate(), this.element.updateComplete.then((() => e.acknowledgeReflow())) } } firstUpdated(e) { super.firstUpdated(e), this.element.style.setProperty("--ueb-pin-color-rgb", this.element.entity.pinColor().cssText), this.#_e = this.element.querySelector(".ueb-pin-icon svg") ?? this.element, this.#ze = this.element.querySelector(".ueb-pin-wrapper") } getLinkLocation() { const e = this.iconElement.getBoundingClientRect(), t = [this.element.isInput() ? e.left : e.right + 1, (e.top + e.bottom) / 2], i = ae.convertLocation(t, this.blueprint.template.gridElement); return this.blueprint.compensateTranslation(i[0], i[1]) } getClickableElement() { return this.#ze ?? this.element } } class ei extends Jt { render() { return G`
${this.renderIcon()}
` } } class ti extends Ut { static nodeStyleClasses = [...super.nodeStyleClasses, "ueb-node-style-event"]; #Fe; firstUpdated(e) { super.firstUpdated(e), this.element.querySelector(".ueb-node-top").appendChild(this.createDelegatePinElement()) } renderTop() { const e = this.renderNodeIcon(), t = this.renderNodeName(), i = this.element.getType() === re.paths.customEvent && (this.element.entity.CustomFunctionName || this.element.entity.FunctionReference.MemberParent); return G`
${e ? G`
${e}
` : V} ${t ? G`
${t} ${i ? G`
Custom Event
` : V}
` : V}
` } getPinElements() { return this.element.getPinElements().filter((e => "delegate" !== e.entity.PinType.PinCategory?.toString())) } createDelegatePinElement() { return this.#Fe || (this.#Fe = Ae.getConstructor("ueb-pin").newObject(this.element.getPinEntities().find((e => !e.isHidden() && "delegate" === e.PinType.PinCategory?.toString())), new ei, this.element), this.#Fe.template.isNameRendered = !1), this.#Fe } createPinElements() { return [this.createDelegatePinElement(), ...this.element.getPinEntities().filter((e => !e.isHidden() && "delegate" !== e.PinType.PinCategory?.toString())).map((e => Ae.getConstructor("ueb-pin").newObject(e, void 0, this.element)))] } } class ii extends ei { render() { return this.element.isOutput() ? super.render() : G`` } getOppositePin() { const e = this.element.nodeElement.template; return this.element.isOutput() ? e.inputPin : e.outputPin } getLinkLocation() { const e = (this.element.isInput() ? this.element.nodeElement.template.outputPin.template : this).iconElement.getBoundingClientRect(), t = [this.element.isInput() ? e.left : e.right + 1, (e.top + e.bottom) / 2], i = ae.convertLocation(t, this.blueprint.template.gridElement); return this.blueprint.compensateTranslation(i[0], i[1]) } } class si extends Ut { static #je = new Set; #Ue = null; #Ye; get inputPin() { return this.#Ye } #Ke; get outputPin() { return this.#Ke } initialize(e) { super.initialize(e), this.element.classList.add("ueb-node-style-minimal") } findDirectionaPin(e) { if (e.nodeElement.getType() !== re.paths.knot || si.#je.has(e)) return si.#je.clear(), !0; si.#je.add(e); for (let t of e.getLinks().map((e => this.blueprint.getPin(e)))) if (this.findDirectionaPin(t)) return !0; return !1 } render() { return G`
` } setupPins() { for (const e of this.getPinElements()) this.element.querySelector(".ueb-node-border").appendChild(e) } createPinElements() { const e = this.element.getPinEntities().filter((e => !e.isHidden())), t = e[e[0].isInput() ? 0 : 1], i = e[e[0].isOutput() ? 0 : 1], s = Ae.getConstructor("ueb-pin"); return [this.#Ye = s.newObject(t, new ii, this.element), this.#Ke = s.newObject(i, new ii, this.element)] } linksChanged() { } } class ni extends Ut { static nodeStyleClasses = ["ueb-node-style-metasound"] } class ri extends qt { initialize(e) { super.initialize(e); const t = e.getType(); t === re.paths.variableGet || t === re.paths.self ? (this.element.classList.add("ueb-node-style-getter"), this.displayName = "") : t === re.paths.variableSet && this.element.classList.add("ueb-node-style-setter") } setupPins() { super.setupPins(); let e = this.element.getPinElements().find((e => !e.entity.isHidden() && !e.entity.isExecution())); this.element.style.setProperty("--ueb-node-color", e.getColor().cssText) } } function ai(e) { if (e.getClass() === re.paths.callFunction || e.getClass() === re.paths.commutativeAssociativeBinaryOperator || e.getClass() === re.paths.callArrayFunction) { const t = e.FunctionReference?.MemberParent?.path ?? "", i = e.FunctionReference?.MemberName?.toString(); if (i && (t === re.paths.kismetMathLibrary || t === re.paths.kismetArrayLibrary)) { if (i.startsWith("Conv_")) return Wt; if (i.startsWith("Add_") || i.startsWith("And_") || i.startsWith("Boolean") || i.startsWith("Cross_") || i.startsWith("Dot_") || i.startsWith("Not_") || i.startsWith("Or_") || i.startsWith("Percent_") || i.startsWith("Xor_")) return Qt; switch (i) { case "Abs": case "Array_Add": case "Array_AddUnique": case "Array_Identical": case "BMax": case "BMin": case "CrossProduct2D": case "DotProduct2D": case "Exp": case "FMax": case "FMin": case "GetPI": case "Max": case "MaxInt64": case "Min": case "MinInt64": case "Sqrt": case "Square": case "Vector4_CrossProduct3": case "Vector4_DotProduct": case "Vector4_DotProduct3": case "Acos": case "Asin": case "Cos": case "DegAcos": case "DegCos": case "DegSin": case "DegTan": case "Sin": case "Tan": return Qt } } if (t === re.paths.blueprintSetLibrary) return Qt; if (t === re.paths.blueprintMapLibrary) return Qt } switch (e.getClass()) { case re.paths.comment: case re.paths.materialGraphNodeComment: return Kt; case re.paths.createDelegate: return Ut; case re.paths.metasoundEditorGraphExternalNode: return "Add" == e.ClassName?.Name ? Zt : ni; case re.paths.niagaraNodeOp: if (["Boolean::LogicEq", "Boolean::LogicNEq", "Numeric::Abs", "Numeric::Add", "Numeric::Mul"].includes(e.OpName?.toString())) return Qt; break; case re.paths.promotableOperator: return Qt; case re.paths.knot: return si; case re.paths.literal: case re.paths.self: case re.paths.variableGet: case re.paths.variableSet: return ri }return e.isEvent() ? ti : Ut } class oi extends Gt { static properties = { ...super.properties, selected: { type: Boolean, attribute: "data-selected", reflect: !0, converter: ke.booleanConverter } }; dragHandler = e => this.addLocation(...e.detail.value); constructor() { super(), this.selected = !1, this.listeningDrag = !1 } setup() { super.setup(), this.setSelected(this.selected) } cleanup() { super.cleanup(), this.blueprint.removeEventListener(re.nodeDragGeneralEventName, this.dragHandler) } setSelected(e = !0) { this.selected = e, this.blueprint && (this.selected ? (this.listeningDrag = !0, this.blueprint.addEventListener(re.nodeDragGeneralEventName, this.dragHandler)) : (this.blueprint.removeEventListener(re.nodeDragGeneralEventName, this.dragHandler), this.listeningDrag = !1)) } } class li extends oi { static properties = { ...oi.properties, typePath: { type: String, attribute: "data-type", reflect: !0 }, nodeTitle: { type: String, attribute: "data-title", reflect: !0 }, advancedPinDisplay: { type: String, attribute: "data-advanced-display", converter: We.attributeConverter, reflect: !0 }, enabledState: { type: String, attribute: "data-enabled-state", reflect: !0 }, nodeDisplayName: { type: String, attribute: !1 }, pureFunction: { type: Boolean, converter: ke.booleanConverter, attribute: "data-pure-function", reflect: !0 } }; static dragEventName = re.nodeDragEventName; static dragGeneralEventName = re.nodeDragGeneralEventName; get blueprint() { return super.blueprint } set blueprint(e) { super.blueprint = e, this.#Xe.forEach((t => t.blueprint = e)) } #qe; get nodeNameElement() { return this.#qe } set nodeNameElement(e) { this.#qe = e } #Xe = []; boundComments = []; #Ze = !1; #We = e => { this.selected || this.#Ze || (this.#Ze = !0, this.requestUpdate(), this.updateComplete.then((() => this.#Ze = !1)), this.addLocation(...e.detail.value)) }; static fromSerializedObject(e) { e = e.trim(); let t = Ct.grammar.parse(e); return li.newObject(t) } static newObject(e = new Ct, t = new (ai(e))) { const i = new li; return i.initialize(e, t), i } #Qe(e) { for (let t of this.getPinElements()) for (let i of t.getLinks()) this.blueprint.getPin(i).redirectLink(t, new rt(new We(e), t.entity.PinId)) } initialize(e = new Ct, t = new (ai(e))) { this.typePath = e.getType(), this.nodeTitle = e.getObjectName(), this.advancedPinDisplay = e.AdvancedPinDisplay?.toString(), this.enabledState = e.EnabledState, this.nodeDisplayName = Ve(e), this.pureFunction = e.bIsPureFunc?.valueOf(), this.dragLinkObjects = [], super.initialize(e, t), this.#Xe = this.template.createPinElements(), super.setLocation(this.entity.getNodePosX(), this.entity.getNodePosY()), this.entity.NodeWidth && this.entity.NodeHeight ? (this.sizeX = this.entity.NodeWidth.value, this.sizeY = this.entity.NodeHeight.value) : this.updateComplete.then((() => this.computeSizes())), e.listenAttribute("Name", (t => { this.#Qe(t.value), this.nodeTitle = t.value, this.nodeDisplayName = Ve(e) })) } async getUpdateComplete() { let e = await super.getUpdateComplete(); for (const t of this.getPinElements()) e &&= await t.updateComplete; return e } bindToComment(e) { e == this || this.boundComments.includes(e) || (e.addEventListener(re.nodeDragEventName, this.#We), this.boundComments.push(e)) } unbindFromComment(e) { const t = this.boundComments.indexOf(e); t >= 0 && (e.removeEventListener(re.nodeDragEventName, this.#We), this.boundComments[t] = this.boundComments[this.boundComments.length - 1], this.boundComments.pop()) } isInsideComment(e) { return this.topBoundary() >= e.topBoundary() && this.rightBoundary() <= e.rightBoundary() && this.bottomBoundary() <= e.bottomBoundary() && this.leftBoundary() >= e.leftBoundary() } getType() { return this.entity.getType() } getNodeName() { return this.entity.getObjectName() } computeNodeDisplayName() { this.nodeDisplayName = Ve(this.entity) } setNodeWidth(e) { this.entity.setNodeWidth(e), this.sizeX = e, this.acknowledgeReflow() } setNodeHeight(e) { this.entity.setNodeHeight(e), this.sizeY = e, this.acknowledgeReflow() } sanitizeLinks(e = []) { this.getPinElements().forEach((t => t.sanitizeLinks(e))) } getPinElements() { return this.#Xe } getPinEntities() { return this.entity.getPinEntities() } setLocation(e = 0, t = 0, i = !0) { this.entity.setNodePosX(e), this.entity.setNodePosY(t), super.setLocation(e, t, i) } acknowledgeReflow() { this.requestUpdate(), this.updateComplete.then((() => this.computeSizes())); let e = new CustomEvent(re.nodeReflowEventName); this.dispatchEvent(e) } setShowAdvancedPinDisplay(e) { this.entity.AdvancedPinDisplay = new We(e ? "Shown" : "Hidden"), this.advancedPinDisplay = this.entity.AdvancedPinDisplay } toggleShowAdvancedPinDisplay() { this.setShowAdvancedPinDisplay("Shown" != this.entity.AdvancedPinDisplay?.toString()) } } class ui extends Ct { #Je = new Map; #et = []; get objectEntities() { return this.#et } getHomonymObjectEntity(e) { const t = e.getObjectName(); return this.#et.find((e => e.getObjectName() == t)) } takeFreeName(e) { e = e.replace(/_\d+$/, ""); const t = (this.#Je.get(e) ?? -1) + 1; return this.#Je.set(e, t), re.nodeTitle(e, t) } addObjectEntity(e) { if (!this.#et.includes(e)) { this.#et.push(e); const [t, i] = e.getNameAndCounter(); return this.#Je.set(t, Math.max(this.#Je.get(t) ?? 0, i)), !0 } return !1 } removeObjectEntity(e) { const t = this.#et.indexOf(e); if (t >= 0) { const e = this.#et.pop(); return t < this.#et.length && (this.#et[t] = e), !0 } return !1 } mergeWith(e) { if (!e.ScriptVariables || 0 === e.ScriptVariables.length) return this; this.ScriptVariables && 0 !== this.ScriptVariables.length || (this.ScriptVariables = e.ScriptVariables); let t = ae.mergeArrays(this.ScriptVariables.valueOf(), e.ScriptVariables.valueOf(), ((e, t) => e.OriginalChangeId.value == t.OriginalChangeId.value)); if (t.length === this.ScriptVariables.length) return this; const i = t.concat(t).map(((i, s) => { const n = re.subObjectAttributeNameFromReference(i.ScriptVariable, s >= t.length); return [n, this[n] ?? e[n]] })); return i.push(...Object.entries(this).filter((([e, t]) => !e.startsWith(re.subObjectAttributeNamePrefix) && "ExportedNodes" !== e))), new ui(Object.fromEntries(i)) } } class ci extends xt { #tt; constructor(e, t, i = {}) { i.listenOnFocus ??= !0, i.unlistenOnTextEdit ??= !0, super(e, t, i); let s = this; this.#tt = () => s.copied() } listenEvents() { window.addEventListener("copy", this.#tt) } unlistenEvents() { window.removeEventListener("copy", this.#tt) } getSerializedText() { const e = this.blueprint.getNodes(!0).map((e => e.entity)), t = e.filter((e => e.exported)).map((e => e.serialize())), i = e.filter((e => !e.exported)).map((e => e.serialize())); return t.length && (this.blueprint.entity.ExportedNodes.value = btoa(t.join("")), i.splice(0, 0, this.blueprint.entity.serialize(!1)), delete this.blueprint.entity.ExportedNodes), i.join("") } copied() { const e = this.getSerializedText(); return navigator.clipboard.writeText(e), e } } class hi extends xt { #it; constructor(e, t, i = {}) { i.listenOnFocus ??= !0, i.unlistenOnTextEdit ??= !0, super(e, t, i); let s = this; this.#it = () => s.cut() } listenEvents() { window.addEventListener("cut", this.#it) } unlistenEvents() { window.removeEventListener("cut", this.#it) } getSerializedText() { return this.blueprint.getNodes(!0).map((e => e.entity.serialize())).join("") } cut() { this.blueprint.template.getCopyInputObject().copied(), this.blueprint.removeGraphElement(...this.blueprint.getNodes(!0)) } } class pi extends xt { #st; constructor(e, t, i = {}) { i.listenOnFocus ??= !0, i.unlistenOnTextEdit ??= !0, super(e, t, i); let s = this; this.#st = e => s.pasted(e.clipboardData.getData("Text")) } listenEvents() { window.addEventListener("paste", this.#st) } unlistenEvents() { window.removeEventListener("paste", this.#st) } pasted(e) { let t = 0, i = 0, s = 0, n = Ct.grammarMultipleObjects.parse(e).map((e => { let n = Ae.getConstructor("ueb-node").newObject(e); return t += n.locationY, i += n.locationX, ++s, n })); t /= s, i /= s, n.length > 0 && this.blueprint.unselectAll(); let r = this.blueprint.mousePosition; for (const e of n) e.addLocation(r[0] - i, r[1] - t), e.snapToGrid(), e.setSelected(!0); return this.blueprint.addGraphElement(...n), n } } class di extends At { static #X = e => { }; #nt = 0; get variation() { return this.#nt } #rt = e => { this.enablerKey && !this.enablerActivated || (e.preventDefault(), this.#nt = e.deltaY, this.setLocationFromEvent(e), this.wheel()) }; #at = e => e.preventDefault(); constructor(e, t, i = {}, s = di.#X) { i.listenOnFocus = !0, i.strictTarget ??= !1, super(e, t, i), this.strictTarget = i.strictTarget, this.onWheel = s } listenEvents() { this.movementSpace.addEventListener("wheel", this.#rt, !1), this.movementSpace.parentElement?.addEventListener("wheel", this.#at) } unlistenEvents() { this.movementSpace.removeEventListener("wheel", this.#rt, !1), this.movementSpace.parentElement?.removeEventListener("wheel", this.#at) } wheel() { this.onWheel(this) } } class mi extends di { #ot = 0; #lt = !1; get enableZoonIn() { return this.#lt } set enableZoonIn(e) { e != this.#lt && (this.#lt = e) } wheel() { if (this.#ot += -this.variation, Math.abs(this.#ot) < re.mouseWheelZoomThreshold) return; let e = this.blueprint.getZoom(); !this.enableZoonIn && 0 == e && this.#ot > 0 || (e += Math.sign(this.#ot), this.blueprint.setZoom(e, this.location), this.#ot = 0) } } class gi extends kt { #ut; constructor(e, t, i = {}) { i.activationKeys = Tt.enableZoomIn, super(e, t, i) } fire() { this.#ut = this.blueprint.template.getZoomInputObject(), this.#ut.enableZoonIn = !0 } unfire() { this.#ut.enableZoonIn = !1 } } class bi extends Ht { startDrag() { this.blueprint.scrolling = !0 } dragTo(e, t) { this.blueprint.scrollDelta(-t[0], -t[1]) } endDrag() { this.blueprint.scrolling = !1 } } class vi extends At { #ct = null; #ht = e => { e.preventDefault(), this.setLocationFromEvent(e), this.blueprint.mousePosition = [...this.location] }; #pt = e => { this.#ct || (e.preventDefault(), this.#ct = e.detail.tracker, this.unlistenMouseMove()) }; #dt = e => { this.#ct == e.detail.tracker && (e.preventDefault(), this.#ct = null, this.listenMouseMove()) }; constructor(e, t, i = {}) { i.listenOnFocus = !0, super(e, t, i) } listenMouseMove() { this.target.addEventListener("mousemove", this.#ht) } unlistenMouseMove() { this.target.removeEventListener("mousemove", this.#ht) } listenEvents() { this.listenMouseMove(), this.blueprint.addEventListener(re.trackingMouseEventName.begin, this.#pt), this.blueprint.addEventListener(re.trackingMouseEventName.end, this.#dt) } unlistenEvents() { this.unlistenMouseMove(), this.blueprint.removeEventListener(re.trackingMouseEventName.begin, this.#pt), this.blueprint.removeEventListener(re.trackingMouseEventName.end, this.#dt) } } class fi extends Ht { constructor(e, t, i = {}) { i.scrollGraphEdge ??= !0, super(e, t, i), this.selectorElement = this.blueprint.template.selectorElement } startDrag() { this.selectorElement.beginSelect(this.clickedPosition) } dragTo(e, t) { this.selectorElement.selectTo(e) } endDrag() { this.started && this.selectorElement.endSelect() } unclicked() { this.started || this.blueprint.unselectAll() } } class yi extends xt { #mt = e => this.clickedSomewhere(e.target); constructor(e, t, i = {}) { i.listenOnFocus = !0, super(e, t, i), this.blueprint.focus && document.addEventListener("click", this.#mt) } clickedSomewhere(e) { e.closest("ueb-blueprint") || this.blueprint.setFocused(!1) } listenEvents() { document.addEventListener("click", this.#mt) } unlistenEvents() { document.removeEventListener("click", this.#mt) } } class wi extends It { static styleVariables = { "--ueb-font-size": `${re.fontSize}`, "--ueb-grid-axis-line-color": `${re.gridAxisLineColor}`, "--ueb-grid-expand": `${re.expandGridSize}px`, "--ueb-grid-line-color": `${re.gridLineColor}`, "--ueb-grid-line-width": `${re.gridLineWidth}px`, "--ueb-grid-set-line-color": `${re.gridSetLineColor}`, "--ueb-grid-set": `${re.gridSet}`, "--ueb-grid-size": `${re.gridSize}px`, "--ueb-link-min-width": `${re.linkMinWidth}`, "--ueb-node-radius": `${re.nodeRadius}px` }; #gt = new ResizeObserver((e => { const t = e.find((e => e.target === this.viewportElement))?.devicePixelContentBoxSize?.[0]; t && (this.viewportSize[0] = t.inlineSize, this.viewportSize[1] = t.blockSize) })); #bt; #vt; #ut; headerElement; overlayElement; viewportElement; selectorElement; gridElement; linksContainerElement; nodesContainerElement; viewportSize = [0, 0]; initialize(e) { super.initialize(e), this.element.style.cssText = Object.entries(wi.styleVariables).map((([e, t]) => `${e}:${t};`)).join(""); const t = this.element.querySelector(":scope > template")?.content.textContent; t && (this.element.requestUpdate(), this.element.updateComplete.then((() => { this.blueprint.mousePosition = [Math.round(this.viewportSize[0] / 2), Math.round(this.viewportSize[1] / 2)], this.getPasteInputObject().pasted(t), this.blueprint.unselectAll() }))) } setup() { super.setup(), this.#gt.observe(this.viewportElement, { box: "device-pixel-content-box" }); const e = this.viewportElement.getBoundingClientRect(); this.viewportSize[0] = e.width, this.viewportSize[1] = e.height, this.blueprint.nodes.length > 0 && (this.blueprint.requestUpdate(), this.blueprint.updateComplete.then((() => this.centerContentInViewport()))) } cleanup() { super.cleanup(), this.#gt.unobserve(this.viewportElement) } createInputObjects() { const e = this.element.getGridDOMElement(); return this.#bt = new ci(e, this.blueprint), this.#vt = new pi(e, this.blueprint), this.#ut = new mi(e, this.blueprint), [...super.createInputObjects(), this.#bt, this.#vt, this.#ut, new hi(e, this.blueprint), new kt(e, this.blueprint, { activationKeys: Tt.duplicateNodes }, (() => this.blueprint.template.getPasteInputObject().pasted(this.blueprint.template.getCopyInputObject().copied()))), new kt(e, this.blueprint, { activationKeys: Tt.deleteNodes }, (() => this.blueprint.removeGraphElement(...this.blueprint.getNodes(!0)))), new kt(e, this.blueprint, { activationKeys: Tt.selectAllNodes }, (() => this.blueprint.selectAll())), new fi(e, this.blueprint, { clickButton: re.mouseClickButton, exitAnyButton: !0, moveEverywhere: !0 }), new bi(e, this.blueprint, { clickButton: re.mouseRightClickButton, exitAnyButton: !1, moveEverywhere: !0 }), new yi(e, this.blueprint), new vi(e, this.blueprint), new gi(e, this.blueprint)] } render() { return G`
Zoom ${0 == this.blueprint.zoom ? "1:1" : (this.blueprint.zoom > 0 ? "+" : "") + this.blueprint.zoom}
` } firstUpdated(e) { super.firstUpdated(e), this.headerElement = this.blueprint.querySelector(".ueb-viewport-header"), this.overlayElement = this.blueprint.querySelector(".ueb-viewport-overlay"), this.viewportElement = this.blueprint.querySelector(".ueb-viewport-body"), this.selectorElement = this.blueprint.querySelector("ueb-selector"), this.gridElement = this.viewportElement.querySelector(".ueb-grid"), this.linksContainerElement = this.blueprint.querySelector("[data-links]"), this.linksContainerElement.append(...this.blueprint.getLinks()), this.nodesContainerElement = this.blueprint.querySelector("[data-nodes]"), this.nodesContainerElement.append(...this.blueprint.getNodes()), this.viewportElement.scroll(re.expandGridSize, re.expandGridSize) } willUpdate(e) { super.willUpdate(e), this.headerElement && e.has("zoom") && (this.headerElement.classList.add("ueb-zoom-changed"), this.headerElement.addEventListener("animationend", (() => this.headerElement.classList.remove("ueb-zoom-changed")))) } updated(e) { if (super.updated(e), (e.has("scrollX") || e.has("scrollY")) && this.viewportElement.scroll(this.blueprint.scrollX, this.blueprint.scrollY), e.has("zoom")) { this.blueprint.style.setProperty("--ueb-scale", this.blueprint.getScale()); const t = e.get("zoom"), i = Math.min(t, this.blueprint.zoom), s = Math.max(t, this.blueprint.zoom), n = ae.range(i, s), r = e => `ueb-zoom-${e}`; t < this.blueprint.zoom ? (this.blueprint.classList.remove(...n.filter((e => e < 0)).map(r)), this.blueprint.classList.add(...n.filter((e => e > 0)).map(r))) : (this.blueprint.classList.remove(...n.filter((e => e > 0)).map(r)), this.blueprint.classList.add(...n.filter((e => e < 0)).map(r))) } } getCommentNodes(e = !1) { return this.blueprint.querySelectorAll(`ueb-node[data-type="${re.paths.comment}"]${e ? '[data-selected="true"]' : ""}, ueb-node[data-type="${re.paths.materialGraphNodeComment}"]${e ? '[data-selected="true"]' : ""}`) } getPin(e) { return this.blueprint.querySelector(`ueb-node[data-title="${e.objectName}"] ueb-pin[data-id="${e.pinGuid}"]`) } getCopyInputObject() { return this.#bt } getPasteInputObject() { return this.#vt } getZoomInputObject() { return this.#ut } isPointVisible(e, t) { return !1 } gridTopVisibilityBoundary() { return this.blueprint.scaleCorrect(this.blueprint.scrollY) - this.blueprint.translateY } gridRightVisibilityBoundary() { return this.gridLeftVisibilityBoundary() + this.blueprint.scaleCorrect(this.viewportSize[0]) } gridBottomVisibilityBoundary() { return this.gridTopVisibilityBoundary() + this.blueprint.scaleCorrect(this.viewportSize[1]) } gridLeftVisibilityBoundary() { return this.blueprint.scaleCorrect(this.blueprint.scrollX) - this.blueprint.translateX } centerViewport(e = 0, t = 0, i = !0) { const s = this.gridLeftVisibilityBoundary() + this.blueprint.scaleCorrect(this.viewportSize[0] / 2), n = this.gridTopVisibilityBoundary() + this.blueprint.scaleCorrect(this.viewportSize[1] / 2); this.blueprint.scrollDelta(this.blueprint.scaleCorrectReverse(e - s), this.blueprint.scaleCorrectReverse(t - n), i) } centerContentInViewport(e = !0) { let t = 0, i = 0, s = Number.MAX_SAFE_INTEGER, n = Number.MIN_SAFE_INTEGER, r = Number.MAX_SAFE_INTEGER, a = Number.MIN_SAFE_INTEGER; const o = this.blueprint.getNodes(); for (const e of o) t += e.leftBoundary() + e.rightBoundary(), i += e.topBoundary() + e.bottomBoundary(), s = Math.min(s, e.leftBoundary()), n = Math.max(n, e.rightBoundary()), r = Math.min(r, e.topBoundary()), a = Math.max(a, e.bottomBoundary()); t = Math.round(n - s <= this.viewportSize[0] ? (n + s) / 2 : t / (2 * o.length)), i = Math.round(a - r <= this.viewportSize[1] ? (a + r) / 2 : i / (2 * o.length)), this.centerViewport(t, i, e) } } class Si extends oe { static properties = { selecting: { type: Boolean, attribute: "data-selecting", reflect: !0, converter: ke.booleanConverter }, scrolling: { type: Boolean, attribute: "data-scrolling", reflect: !0, converter: ke.booleanConverter }, focused: { type: Boolean, attribute: "data-focused", reflect: !0, converter: ke.booleanConverter }, zoom: { type: Number, attribute: "data-zoom", reflect: !0 }, scrollX: { type: Number, attribute: !1 }, scrollY: { type: Number, attribute: !1 }, additionalX: { type: Number, attribute: !1 }, additionalY: { type: Number, attribute: !1 }, translateX: { type: Number, attribute: !1 }, translateY: { type: Number, attribute: !1 } }; static nodeBoundariesSupplier = e => ({ primaryInf: e.leftBoundary(!0), primarySup: e.rightBoundary(!0), secondaryInf: e.topBoundary(!0), secondarySup: e.bottomBoundary(!0) }); static nodeSelectToggleFunction = (e, t) => { e.setSelected(t) }; #ft = 0; #yt = 0; nodes = []; links = []; nodesNames = new Map; mousePosition = [0, 0]; waitingExpandUpdate = !1; constructor() { super(), this.selecting = !1, this.scrolling = !1, this.focused = !1, this.zoom = 0, this.scrollX = re.expandGridSize, this.scrollY = re.expandGridSize, this.translateX = re.expandGridSize, this.translateY = re.expandGridSize, super.initialize(new ui, new wi) } initialize() { } getGridDOMElement() { return this.template.gridElement } getScroll() { return [this.scrollX, this.scrollY] } setScroll(e, t) { this.scrollX = e, this.scrollY = t } scrollDelta(e = 0, t = 0, i = !1, s = re.smoothScrollTime) { if (i) { let i = [0, 0]; this.#ft && cancelAnimationFrame(this.#ft), this.#yt && cancelAnimationFrame(this.#yt), ae.animate(0, e, s, (e => { this.scrollDelta(e - i[0], 0, !1), i[0] = e }), (e => this.#ft = e)), ae.animate(0, t, s, (e => { this.scrollDelta(0, e - i[1], !1), i[1] = e }), (e => this.#yt = e)) } else { const i = [2 * re.expandGridSize, 2 * re.expandGridSize]; let s = this.getScroll(), n = [s[0] + e, s[1] + t], r = [0, 0]; for (let e = 0; e < 2; ++e)n[e] < re.gridExpandThreshold * re.expandGridSize ? r[e] = -1 : n[e] > i[e] - re.gridExpandThreshold * re.expandGridSize && (r[e] = 1); 0 == r[0] && 0 == r[1] || this.seamlessExpand(r[0], r[1]), s = this.getScroll(), n = [s[0] + e, s[1] + t], this.setScroll(n[0], n[1]) } } scrollCenter(e = !1) { const t = this.getScroll(), i = [this.translateX - t[0], this.translateY - t[1]], s = this.getViewportSize().map((e => e / 2)), n = [i[0] - s[0], i[1] - s[1]]; this.scrollDelta(n[0], n[1], e) } getViewportSize() { return [this.template.viewportElement.clientWidth, this.template.viewportElement.clientHeight] } getScrollMax() { return [this.template.viewportElement.scrollWidth - this.template.viewportElement.clientWidth, this.template.viewportElement.scrollHeight - this.template.viewportElement.clientHeight] } snapToGrid(e, t) { return ae.snapToGrid(e, t, re.gridSize) } seamlessExpand(e, t) { e = Math.round(e), t = Math.round(t); let i = this.getScale();[e, t] = [-e * re.expandGridSize, -t * re.expandGridSize], 0 != e && (this.scrollX += e, e /= i), 0 != t && (this.scrollY += t, t /= i), this.translateX += e, this.translateY += t } progressiveSnapToGrid(e) { return re.expandGridSize * Math.round(e / re.expandGridSize + .5 * Math.sign(e)) } getZoom() { return this.zoom } setZoom(e, t) { if ((e = ae.clamp(e, re.minZoom, re.maxZoom)) == this.zoom) return; let i = this.getScale(); if (this.zoom = e, t) { t[0] += this.translateX, t[1] += this.translateY; let e = this.getScale() / i, s = [e * t[0], e * t[1]]; this.scrollDelta((s[0] - t[0]) * i, (s[1] - t[1]) * i) } } getScale() { return re.scale[this.getZoom()] } scaleCorrect(e) { return e / this.getScale() } scaleCorrectReverse(e) { return e * this.getScale() } compensateTranslation(e, t) { return [e -= this.translateX, t -= this.translateY] } getNodes(e = !1, [t, i, s, n] = [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER]) { let r = this.nodes; return e && (r = r.filter((e => e.selected))), (t > Number.MIN_SAFE_INTEGER || i < Number.MAX_SAFE_INTEGER || s < Number.MAX_SAFE_INTEGER || n > Number.MIN_SAFE_INTEGER) && (r = r.filter((e => e.topBoundary() >= t && e.rightBoundary() <= i && e.bottomBoundary() <= s && e.leftBoundary() >= n))), r } getCommentNodes(e = !1) { let t = [...this.template.getCommentNodes(e)]; return 0 === t.length && (t = this.nodes.filter((t => t.getType() === re.paths.comment && (!e || t.selected)))), t } getPin(e) { let t = this.template.getPin(e); return t && t.nodeElement.getNodeName() == e.objectName.toString() || (t = [...this.nodes.find((t => e.objectName.toString() == t.getNodeName()))?.getPinElements() ?? []].find((t => e.pinGuid.toString() == t.getPinId().toString()))), t } getLinks(e = null, t = null) { if (null == e != (null == t)) { const i = e ?? t; return this.links.filter((e => e.source == i || e.destination == i)) } return null != e && null != t ? this.links.filter((i => i.source == e && i.destination == t || i.source == t && i.destination == e)) : this.links } getLink(e, t, i = !1) { return this.links.find((s => s.source == e && s.destination == t || !i && s.source == t && s.destination == e)) } selectAll() { this.getNodes().forEach((e => Si.nodeSelectToggleFunction(e, !0))) } unselectAll() { this.getNodes().forEach((e => Si.nodeSelectToggleFunction(e, !1))) } addGraphElement(...e) { const t = e => { const i = e.currentTarget; i.removeEventListener(re.removeEventName, t); const [s, n] = i instanceof li ? [this.nodes, i.entity] : i instanceof Bt ? [this.links] : null, r = s?.indexOf(i); if (r >= 0) { const e = s.pop(); r < s.length && (s[r] = e) } n && this.entity.removeObjectEntity(n) }; for (const i of e) if (i.blueprint = this, i instanceof li && !this.nodes.includes(i)) { if (i.getType() == re.paths.niagaraClipboardContent) { this.entity = this.entity.mergeWith(i.entity); const e = atob(i.entity.ExportedNodes.toString()); this.template.getPasteInputObject().pasted(e).forEach((e => e.entity._exported = !0)); continue } const e = i.entity.getObjectName(), s = this.entity.getHomonymObjectEntity(i.entity); if (s) { const t = this.entity.takeFreeName(e); s.Name = new s.Name.constructor(t) } this.nodes.push(i), this.entity.addObjectEntity(i.entity), i.addEventListener(re.removeEventName, t), this.template.nodesContainerElement?.appendChild(i) } else i instanceof Bt && !this.links.includes(i) && (this.links.push(i), i.addEventListener(re.removeEventName, t), this.template.linksContainerElement && !this.template.linksContainerElement.contains(i) && this.template.linksContainerElement.appendChild(i)); e.filter((e => e instanceof li)).forEach((t => t.sanitizeLinks(e))), e.filter((e => e instanceof li && e.getType() == re.paths.comment)).forEach((e => e.updateComplete.then((() => e.template.manageNodesBind())))) } removeGraphElement(...e) { for (let t of e) { if (t.closest("ueb-blueprint") !== this) return; t.remove() } } setFocused(e = !0) { if (this.focused == e) return; let t = new CustomEvent(e ? re.focusEventName.begin : re.focusEventName.end); this.focused = e, this.focused || this.unselectAll(), this.dispatchEvent(t) } acknowledgeEditText(e) { const t = new CustomEvent(e ? re.editTextEventName.begin : re.editTextEventName.end); this.dispatchEvent(t) } } customElements.define("ueb-blueprint", Si); class Ei extends zt { #wt; get locationChangeCallback() { return this.#wt } set locationChangeCallback(e) { this.#wt = e } movementSpace; movementSpaceSize = [0, 0]; firstUpdated(e) { super.firstUpdated(e), this.movementSpace = this.element.parentElement } setup() { super.setup(); const e = this.movementSpace.getBoundingClientRect(); this.movementSpaceSize = [e.width, e.height] } createDraggableObject() { return new Vt(this.element, this.blueprint, { draggableElement: this.movementSpace, ignoreTranslateCompensate: !0, moveEverywhere: !0, movementSpace: this.movementSpace, repositionOnClick: !0, stepSize: 1 }) } adjustLocation(e, t) { return this.locationChangeCallback?.(e, t), [e, t] } } class Ci extends Ei { adjustLocation(e, t) { const i = Math.round(this.movementSpaceSize[0] / 2); e -= i, t = -(t - i); let [s, n] = ae.getPolarCoordinates(e, t); return s = Math.min(s, i), [e, t] = ae.getCartesianCoordinates(s, n), this.locationChangeCallback?.(e / i, t / i), [e = Math.round(e + i), t = Math.round(-t + i)] } } class Ni extends Gt { windowElement; setup() { super.setup(), this.windowElement = this.closest("ueb-window") } setLocation(e, t) { super.setLocation(...this.template.adjustLocation(e, t)) } } class xi extends Ni { constructor() { super(), super.initialize({}, new Ci) } static newObject() { return new xi } initialize() { } } class Pi extends Ei { adjustLocation(e, t) { return e = ae.clamp(e, 0, this.movementSpaceSize[0]), t = ae.clamp(t, 0, this.movementSpaceSize[1]), this.locationChangeCallback?.(e / this.movementSpaceSize[0], 1 - t / this.movementSpaceSize[1]), [e, t] } } class ki extends Ni { constructor() { super(), super.initialize({}, new Pi) } static newObject() { return new ki } initialize() { } } class Ai extends Ht { constructor(e, t, i = {}) { i.consumeEvent = !0, super(e, t, i) } } class Li extends It { #St; #Et; #Ct = e => this.element.selectedOption = e.target.selectedOptions[0].value; render() { return G` ` } firstUpdated(e) { super.firstUpdated(e), this.#St = this.element.querySelector("select:first-child"), this.#Et = this.element.querySelector("select:last-child"); const t = new Event("input", { bubbles: !0 }); this.#St.dispatchEvent(t) } updated(e) { super.updated(e); const t = this.#Et.getBoundingClientRect(); this.element.style.setProperty("--ueb-dropdown-width", t.width + "px") } createInputObjects() { return [...super.createInputObjects(), new Ai(this.element, this.blueprint)] } setSelectedValue(e) { this.element.querySelector(`option[value="${e}"]`).defaultSelected = !0 } getSelectedValue() { return this.#St.value } } class Mi extends oe { static properties = { ...super.properties, options: { type: Object }, selectedOption: { type: String } }; constructor() { super(), super.initialize({}, new Li), this.options = [], this.selectedOption = "" } static newObject(e) { return new Mi } initialize() { } getValue() { return this.template.getSelectedValue() } } class Ti extends It { #Nt = () => { this.blueprint.acknowledgeEditText(!0), this.element.selectOnFocus && getSelection().selectAllChildren(this.element) }; #xt = () => { this.blueprint.acknowledgeEditText(!1), getSelection().removeAllRanges() }; #Pt = e => e.target.querySelectorAll("br").forEach((e => e.remove())); #kt = e => { "Enter" != e.code || e.shiftKey || e.target.blur() }; initialize(e) { super.initialize(e), this.element.classList.add("ueb-pin-input-content"), this.element.setAttribute("role", "textbox"), this.element.contentEditable = "true" } firstUpdated(e) { super.firstUpdated(e); const t = new Event("input", { bubbles: !0 }); this.element.dispatchEvent(t) } createInputObjects() { return [...super.createInputObjects(), new Ai(this.element, this.blueprint)] } setup() { super.setup(), this.element.addEventListener("focus", this.#Nt), this.element.addEventListener("focusout", this.#xt), this.element.singleLine && this.element.addEventListener("input", this.#Pt), this.element.blurOnEnter && this.element.addEventListener("keydown", this.#kt) } cleanup() { super.cleanup(), this.element.removeEventListener("focus", this.#Nt), this.element.removeEventListener("focusout", this.#xt), this.element.removeEventListener("input", this.#Pt), this.element.removeEventListener("keydown", this.#kt) } } class Ii extends oe { static properties = { ...super.properties, singleLine: { type: Boolean, attribute: "data-single-line", converter: ke.booleanConverter, reflect: !0 }, selectOnFocus: { type: Boolean, attribute: "data-select-focus", converter: ke.booleanConverter, reflect: !0 }, blurOnEnter: { type: Boolean, attribute: "data-blur-enter", converter: ke.booleanConverter, reflect: !0 } }; constructor() { super(), this.singleLine = !1, this.selectOnFocus = !0, this.blurOnEnter = !0, super.initialize({}, new Ti) } static newObject() { return new Ii } initialize() { } } class Oi extends Jt { #At; #Lt = () => { const e = this.element.getDefaultValue(); e.value = this.#At.checked, this.element.setDefaultValue(e) }; firstUpdated(e) { super.firstUpdated(e), this.#At = this.element.querySelector(".ueb-pin-input") } setup() { super.setup(), this.#At?.addEventListener("change", this.#Lt) } cleanup() { super.cleanup(), this.#At?.removeEventListener("change", this.#Lt) } createInputObjects() { return [...super.createInputObjects(), new Ai(this.#At, this.blueprint)] } renderInput() { return G`` } } class Di extends Jt { static singleLineInput = !1; static selectOnFocus = !0; static saveEachInputChange = !1; #Mt; get inputWrapper() { return this.#Mt } #Tt; static stringFromInputToUE(e) { return e.replace(/(?=\n\s*)\n$/, "") } static stringFromUEToInput(e) { return e.replaceAll(/(?:\r|(?<=(?:^|[^\\])(?:\\\\)*)\\r)(?=\n)/g, "").replace(/(?<=\n\s*)$/, "\n") } #It = () => this.setInputs(this.getInputs(), !0); #Ot = e => this.#Dt(e.target); #Dt(e) { if (this.element.querySelector(".ueb-pin-name")?.getBoundingClientRect().width < 20) return; const t = this.blueprint.scaleCorrect(this.#Mt.getBoundingClientRect().width) + this.nameWidth, i = this.element.classList.contains("ueb-pin-input-wrap"); !i && t > re.pinInputWrapWidth ? this.element.classList.add("ueb-pin-input-wrap") : i && t <= re.pinInputWrapWidth && this.element.classList.remove("ueb-pin-input-wrap") } firstUpdated(e) { super.firstUpdated(e); this.constructor.canWrapInput && this.isInputRendered() && (this.element.addEventListener("input", this.#Ot), this.nameWidth = this.blueprint.scaleCorrect(this.element.querySelector(".ueb-pin-name")?.getBoundingClientRect().width ?? 0)), this.#Mt = this.element.querySelector(".ueb-pin-input-wrapper"), this.#Tt = [...this.element.querySelectorAll("ueb-input")] } setup() { super.setup(); const e = this.constructor; e.saveEachInputChange ? this.element.addEventListener("input", this.#It) : this.element.addEventListener("focusout", this.#It), e.canWrapInput && this.isInputRendered() && (this.element.addEventListener("input", this.#Ot), this.element.nodeElement.addEventListener(re.nodeReflowEventName, this.#Ot)) } cleanup() { super.cleanup(), this.element.nodeElement.removeEventListener(re.nodeReflowEventName, this.#Ot), this.element.removeEventListener("input", this.#Ot), this.element.removeEventListener("input", this.#It), this.element.removeEventListener("focusout", this.#It) } getInput() { return this.getInputs().reduce(((e, t) => e + t), "") } getInputs() { return this.#Tt.map((e => ae.clearHTMLWhitespace(e.innerHTML))) } setInputs(e = [], t = !0) { this.#Tt.forEach(this.constructor.singleLineInput ? (t, i) => t.innerText = e[i] : (t, i) => t.innerText = e[i].replaceAll("\n", "")), t && this.setDefaultValue(e.map((e => Di.stringFromInputToUE(e))), e), this.element.requestUpdate(), this.element.nodeElement.acknowledgeReflow() } setDefaultValue(e = [], t = e) { this.element.setDefaultValue(e.join("")) } renderInput() { const e = this.constructor, t = e.singleLineInput, i = e.selectOnFocus; return G`
` } } class $i extends Jt { renderIcon() { return le.execPin } renderName() { let e = this.element.entity.PinName?.toString(); if (this.element.entity.PinFriendlyName) e = this.element.entity.PinFriendlyName.toString(); else if ("execute" === e || "then" === e) return G``; return G`${this.element.getPinDisplayName()}` } } class Bi extends Di { static singleLineInput = !0; setInputs(e = [], t = !1) { if (e && 0 != e.length || (e = [this.getInput()]), super.setInputs(e, !1), t) { let i = []; for (const s of e) { let e = parseFloat(s); isNaN(e) && (e = 0, t = !1), i.push(e) } this.setDefaultValue(i, e) } } setDefaultValue(e = [], t) { const i = this.element.getDefaultValue(); i.value = e[0], this.element.setDefaultValue(i), this.element.requestUpdate() } } class Gi extends Bi { renderInput() { return G`
` } } /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */const Hi=1;class Vi{constructor(e){}get _$AU(){return this._$AM._$AU}_$AT(e,t,i){this._$Ct=e,this._$AM=t,this._$Ci=i}_$AS(e,t){return this.update(e,t)}update(e,t){return this.render(...t)}} + */const Hi = 1; class Vi { constructor(e) { } get _$AU() { return this._$AM._$AU } _$AT(e, t, i) { this._$Ct = e, this._$AM = t, this._$Ci = i } _$AS(e, t) { return this.update(e, t) } update(e, t) { return this.render(...t) } } /** * @license * Copyright 2018 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */const Ri="important",_i=" !"+Ri,zi=(e=>(...t)=>({_$litDirective$:e,values:t}))(class extends Vi{constructor(e){var t;if(super(e),e.type!==Hi||"style"!==e.name||(null===(t=e.strings)||void 0===t?void 0:t.length)>2)throw Error("The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.")}render(e){return Object.keys(e).reduce(((t,i)=>{const s=e[i];return null==s?t:t+`${i=i.includes("-")?i:i.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,"-$&").toLowerCase()}:${s};`}),"")}update(e,[t]){const{style:i}=e.element;if(void 0===this.ht){this.ht=new Set;for(const e in t)this.ht.add(e);return this.render(t)}this.ht.forEach((e=>{null==t[e]&&(this.ht.delete(e),e.includes("-")?i.removeProperty(e):i[e]="")}));for(const e in t){const s=t[e];if(null!=s){this.ht.add(e);const t="string"==typeof s&&s.endsWith(_i);e.includes("-")||t?i.setProperty(e,t?s.slice(0,-11):s,t?Ri:""):i[e]=s}}return H}});class Fi extends zt{toggleAdvancedDisplayHandler;getDraggableElement(){return this.element.querySelector(".ueb-window-top")}createDraggableObject(){return new Ht(this.element,this.blueprint,{draggableElement:this.getDraggableElement(),ignoreScale:!0,ignoreTranslateCompensate:!1,movementSpace:this.blueprint,stepSize:1})}setup(){const e=this.blueprint.template.gridLeftVisibilityBoundary(),t=this.blueprint.template.gridTopVisibilityBoundary();this.element.locationX=this.blueprint.scaleCorrectReverse(this.blueprint.mousePosition[0]-e),this.element.locationY=this.blueprint.scaleCorrectReverse(this.blueprint.mousePosition[1]-t),this.element.updateComplete.then((()=>{const e=this.blueprint.getBoundingClientRect();this.element.locationX+this.element.sizeX>e.width&&(this.element.locationX=e.width-this.element.sizeX),this.element.locationX=Math.max(0,this.element.locationX),this.element.locationY+this.element.sizeY>e.height&&(this.element.locationY=e.height-this.element.sizeY),this.element.locationY=Math.max(0,this.element.locationY)}))}render(){return G`
${this.renderWindowName()}
${le.close}
${this.renderContent()}
`}renderWindowName(){return G`Window`}renderContent(){return G``}apply(){this.element.dispatchEvent(new CustomEvent(ne.windowApplyEventName)),this.element.remove()}cancel(){this.element.dispatchEvent(new CustomEvent(ne.windowCancelEventName)),this.element.remove()}}class ji extends Fi{#It;#Ot;#$t;#Dt;#Bt;#Gt;#Ht;#Vt;#Rt;#_t;#zt=e=>{const t=ae.clearHTMLWhitespace(e.target.innerHTML),i=parseInt(t,16);isNaN(i)||(this.color.setFromRGBANumber(i),this.element.requestUpdate())};#Ft=e=>{const t=ae.clearHTMLWhitespace(e.target.innerHTML),i=parseInt(t,16);isNaN(i)||(this.color.setFromSRGBANumber(i),this.element.requestUpdate())};#jt=e=>t=>{"Enter"==t.code&&(t.preventDefault(),e(t))};#Ut=new Ie;get color(){return this.#Ut}set color(e){e.toNumber()!=this.color?.toNumber()&&(this.element.requestUpdate("color",this.#Ut),this.#Ut=e)}#Yt=new Ie;get fullColor(){return this.#Yt}#Kt;get initialColor(){return this.#Kt}#Xt=new Ie;#qt(e,t,i=!1){const s=this.color.toRGBAString(),r=`${s.substring(0,2*e)}${t}${s.substring(2+2*e)}`;return i?`${r.substring(0,6)}FF`:r}initialize(e){super.initialize(e),this.#Kt=this.element.windowOptions.getPinColor(),this.color.setFromHSVA(this.initialColor.H.value,this.initialColor.S.value,this.initialColor.V.value,this.initialColor.A.value),this.fullColor.setFromHSVA(this.color.H.value,1,1,1)}firstUpdated(e){this.#It=this.element.querySelector(".ueb-color-picker-wheel ueb-color-handler"),this.#Ot=this.element.querySelector(".ueb-color-picker-saturation ueb-ui-slider"),this.#$t=this.element.querySelector(".ueb-color-picker-value ueb-ui-slider"),this.#Dt=this.element.querySelector(".ueb-color-picker-r ueb-ui-slider"),this.#Bt=this.element.querySelector(".ueb-color-picker-g ueb-ui-slider"),this.#Gt=this.element.querySelector(".ueb-color-picker-b ueb-ui-slider"),this.#Ht=this.element.querySelector(".ueb-color-picker-a ueb-ui-slider"),this.#Vt=this.element.querySelector(".ueb-color-picker-h ueb-ui-slider"),this.#Rt=this.element.querySelector(".ueb-color-picker-s ueb-ui-slider"),this.#_t=this.element.querySelector(".ueb-color-picker-v ueb-ui-slider"),this.#It.template.locationChangeCallback=(e,t)=>{this.color.setFromWheelLocation(e,t,this.color.V.value,this.color.A.value),this.fullColor.setFromHSVA(this.color.H.value,1,1,1),this.element.requestUpdate()},this.#Ot.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(this.color.H.value,t,this.color.V.value,this.color.A.value),this.element.requestUpdate()},this.#$t.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(this.color.H.value,this.color.S.value,t,this.color.A.value),this.element.requestUpdate()},this.#Dt.template.locationChangeCallback=(e,t)=>{this.color.setFromRGBA(e,this.color.G.value,this.color.B.value,this.color.A.value),this.element.requestUpdate()},this.#Bt.template.locationChangeCallback=(e,t)=>{this.color.setFromRGBA(this.color.R.value,e,this.color.B.value,this.color.A.value),this.element.requestUpdate()},this.#Gt.template.locationChangeCallback=(e,t)=>{this.color.setFromRGBA(this.color.R.value,this.color.G.value,e,this.color.A.value),this.element.requestUpdate()},this.#Ht.template.locationChangeCallback=(e,t)=>{this.color.setFromRGBA(this.color.R.value,this.color.G.value,this.color.B.value,e),this.element.requestUpdate()},this.#Vt.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(e,this.color.S.value,this.color.V.value,this.color.A.value),this.element.requestUpdate()},this.#Rt.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(this.color.H.value,e,this.color.V.value,this.color.A.value),this.element.requestUpdate()},this.#_t.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(this.color.H.value,this.color.S.value,e,this.color.A.value),this.element.requestUpdate()}}renderSlider(e){let t="",i=0,s="";const r=e=>`linear-gradient(to right, #${this.#qt(e,"00",!0)}, #${this.#qt(e,"ff",!0)})`;switch(e){case 0:t="r",i=this.color.R.value,s=r(e);break;case 1:t="g",i=this.color.G.value,s=r(e);break;case 2:t="b",i=this.color.B.value,s=r(e);break;case 3:t="a",i=this.color.A.value,s=`${ne.alphaPattern}, ${r(e)}`;break;case 4:t="h",i=360*this.color.H.value,s="linear-gradient(to right, #f00 0%, #ff0 16.666%, #0f0 33.333%, #0ff 50%, #00f 66.666%, #f0f 83.333%, #f00 100%)";break;case 5:t="s",i=this.color.S.value,s=`linear-gradient(to right,#${this.#Xt.setFromHSVA(this.color.H.value,0,this.color.V.value,1),this.#Xt.toRGBAString()},#${this.#Xt.setFromHSVA(this.color.H.value,1,this.color.V.value,1),this.#Xt.toRGBAString()})`;break;case 6:t="v",i=this.color.V.value,s=`linear-gradient(to right, #000, #${this.fullColor.toRGBAString()})`}return s=`background: ${s};`,G`
${t.toUpperCase()}
`}renderContent(){const e=2*this.color.H.value*Math.PI,t={"--ueb-color-r":this.color.R.toString(),"--ueb-color-g":this.color.G.toString(),"--ueb-color-b":this.color.B.toString(),"--ueb-color-a":this.color.A.toString(),"--ueb-color-h":this.color.H.toString(),"--ueb-color-s":this.color.S.toString(),"--ueb-color-v":this.color.V.toString(),"--ueb-color-wheel-x":100*(this.color.S.value*Math.cos(e)*.5+.5)+"%","--ueb-color-wheel-y":100*(this.color.S.value*Math.sin(e)*.5+.5)+"%"},i=this.color.toRGBAString(),s=this.color.toSRGBAString(),r=this.fullColor.toRGBAString();return G`
Old
New
Advanced
${this.renderSlider(0)} ${this.renderSlider(1)} ${this.renderSlider(2)} ${this.renderSlider(3)}
${this.renderSlider(4)} ${this.renderSlider(5)} ${this.renderSlider(6)}
Hex Linear
Hex sRGB
${ne.windowApplyButtonText}
${ne.windowCancelButtonText}
`}renderWindowName(){return G`${ne.colorWindowName}`}}class Ui extends Bi{#Zt(){return $e.printNumber(this.element.getDefaultValue()?.X.valueOf()??0)}#Wt(){return $e.printNumber(this.element.getDefaultValue()?.Y.valueOf()??0)}setDefaultValue(e,t){const i=this.element.getDefaultValue(!0);i.X.value=e[0],i.Y.value=e[1],this.element.setDefaultValue(i)}renderInput(){return G`
X
Y
`}}class Yi extends Bi{#Zt(){return $e.printNumber(this.element.getDefaultValue()?.X.valueOf()??0)}#Wt(){return $e.printNumber(this.element.getDefaultValue()?.Y.valueOf()??0)}#Qt(){return $e.printNumber(this.element.getDefaultValue()?.Z.valueOf()??0)}setDefaultValue(e,t){const i=this.element.getDefaultValue(!0);if(!(i instanceof De))throw new TypeError("Expected DefaultValue to be a VectorEntity");i.X.value=e[0],i.Y.value=e[1],i.Z.value=e[2],this.element.requestUpdate("DefaultValue",i)}renderInput(){return G`
X
Y
Z
`}}const Ki={bool:Oi,byte:Gi,enum:class extends $i{static saveEachInputChange=!0;#Jt;#ei=[];setup(){super.setup();const e=this.element.nodeElement.entity.EnumEntries?.valueOf();this.#ei=e?.map((e=>(""===e.valueOf()&&(e=new Xe("None")),[e,this.element.nodeElement.getPinEntities().find((t=>e===t.PinName))?.PinFriendlyName.toString()??e])))??ne.CommonEnums[this.element.entity.getSubCategory()]?.map((e=>e instanceof Array?e:[e,ae.formatStringName(e)]))??[];const t=this.element.getDefaultValue().toString();this.#ei.find((([e,i])=>e===t))||this.#ei.push([t,ae.formatStringName(t)]),this.element.requestUpdate()}renderInput(){return G``}firstUpdated(e){super.firstUpdated(e),this.#Jt=this.element.querySelector("ueb-dropdown")}getInputs(){return[this.#Jt.getValue()]}setDefaultValue(e=[],t){const i=this.element.getDefaultValue();i.value=e[0],this.element.setDefaultValue(i),this.element.requestUpdate()}},int:Gi,int64:class extends Bi{setDefaultValue(e=[],t){const i=this.element.getDefaultValue();i.value=BigInt(e[0]),this.element.setDefaultValue(i),this.element.requestUpdate()}renderInput(){return G`
`}},MUTABLE_REFERENCE:class extends Qt{renderIcon(){return le.referencePin}},name:class extends $i{static singleLineInput=!0},real:class extends Bi{renderInput(){return G`
`}},rg:Ui,string:class extends $i{},[ne.paths.linearColor]:class extends Qt{#ti;#ii=e=>{e.preventDefault(),this.blueprint.setFocused(!0),this.#ti=Ae.getConstructor("ueb-window").newObject({type:new ji,windowOptions:{getPinColor:()=>this.element.defaultValue,setPinColor:e=>this.element.setDefaultValue(e)}}),this.blueprint.append(this.#ti);const t=()=>{this.element.setDefaultValue(this.#ti.template.color)},i=()=>{this.#ti.removeEventListener(ne.windowApplyEventName,t),this.#ti.removeEventListener(ne.windowCloseEventName,i),this.#ti=null};this.#ti.addEventListener(ne.windowApplyEventName,t),this.#ti.addEventListener(ne.windowCloseEventName,i)};renderInput(){return G``}},[ne.paths.niagaraBool]:Oi,[ne.paths.NiagaraInt32]:Gi,[ne.paths.niagaraPosition]:Yi,[ne.paths.rotator]:class extends Bi{#si(){return $e.printNumber(this.element.getDefaultValue()?.R.valueOf()??0)}#ri(){return $e.printNumber(this.element.getDefaultValue()?.P.valueOf()??0)}#Wt(){return $e.printNumber(this.element.getDefaultValue()?.Y.valueOf()??0)}setDefaultValue(e=[],t=e){const i=this.element.getDefaultValue(!0);if(!(i instanceof ut))throw new TypeError("Expected DefaultValue to be a RotatorEntity");i.R.value=e[0],i.P.value=e[1],i.Y.value=e[2],this.element.requestUpdate("DefaultValue",i)}renderInput(){return G`
X
Y
Z
`}},[ne.paths.vector]:Yi,[ne.paths.vector2D]:Ui,[ne.paths.vector3f]:Yi,[ne.paths.vector4f]:class extends Bi{#Zt(){return $e.printNumber(this.element.getDefaultValue()?.X.valueOf()??0)}#Wt(){return $e.printNumber(this.element.getDefaultValue()?.Y.valueOf()??0)}#Qt(){return $e.printNumber(this.element.getDefaultValue()?.Z.valueOf()??0)}#ni(){return $e.printNumber(this.element.getDefaultValue()?.W.valueOf()??0)}setDefaultValue(e,t){const i=this.element.getDefaultValue(!0);if(!(i instanceof pt))throw new TypeError("Expected DefaultValue to be a Vector4DEntity");i.X.value=e[0],i.Y.value=e[1],i.Z.value=e[2],i.W.value=e[3],this.element.requestUpdate("DefaultValue",i)}renderInput(){return G`
X
Y
Z
W
`}}};function Xi(e){if("Array"===e.PinType.ContainerType?.toString())return Qt;if(e.PinType.bIsReference?.valueOf()&&!e.PinType.bIsConst?.valueOf())return Ki.MUTABLE_REFERENCE;const t=e.getType();return"exec"===t?Di:(e.isInput()?Ki[t]:Qt)??Qt}class qi extends oe{static properties={pinId:{type:ze,converter:{fromAttribute:(e,t)=>e?ze.grammar.parse(e):null,toAttribute:(e,t)=>e?.toString()},attribute:"data-id",reflect:!0},pinType:{type:String,attribute:"data-type",reflect:!0},advancedView:{type:String,attribute:"data-advanced-view",reflect:!0},color:{type:Ie,converter:{fromAttribute:(e,t)=>e?Ie.getLinearColorFromAnyFormat().parse(e):null,toAttribute:(e,t)=>e?Ie.printLinearColor(e):null},attribute:"data-color",reflect:!0},defaultValue:{type:String,attribute:!1},isLinked:{type:Boolean,converter:ke.booleanConverter,attribute:"data-linked",reflect:!0},pinDirection:{type:String,attribute:"data-direction",reflect:!0},connectable:{type:Boolean,converter:ke.booleanConverter,attribute:"data-connectable",reflect:!0}};nodeElement;static newObject(e=new gt,t=new(Xi(e)),i=void 0){const s=new qi;return s.initialize(e,t,i),s}initialize(e=new gt,t=new(Xi(e)),i=void 0){this.nodeElement=i,this.advancedView=e.bAdvancedView?.valueOf(),this.isLinked=!1,this.connectable=!e.bNotConnectable?.valueOf(),super.initialize(e,t),this.pinType=this.entity.getType(),this.defaultValue=this.entity.getDefaultValue(),this.color=qi.properties.color.converter.fromAttribute(this.getColor().toString()),this.pinDirection=e.isInput()?"input":e.isOutput()?"output":"hidden"}setup(){super.setup(),this.nodeElement=this.closest("ueb-node")}createPinReference(){return new rt(new Ze(this.nodeElement.getNodeName()),this.getPinId())}getPinId(){return this.entity.PinId}getPinName(){return this.entity.PinName?.toString()??""}getPinDisplayName(){return this.entity.pinTitle()}getColor(){return this.entity.pinColor()}isInput(){return this.entity.isInput()}isOutput(){return this.entity.isOutput()}getLinkLocation(){return this.template.getLinkLocation()}getNodeElement(){return this.nodeElement}getLinks(){return this.entity.LinkedTo?.valueOf()??[]}getDefaultValue(e=!1){return this.defaultValue=this.entity.getDefaultValue(e)}setDefaultValue(e){this.entity.DefaultValue=e,this.defaultValue=e,this.entity.recomputesNodeTitleOnChange&&this.nodeElement?.computeNodeDisplayName()}sanitizeLinks(e=[]){this.entity.LinkedTo=new gt.attributes.LinkedTo(this.entity.LinkedTo?.valueOf().filter((t=>{let i=this.blueprint.getPin(t);if(i){if(e.length&&!e.includes(i.nodeElement))return!1;let t=this.blueprint.getLink(this,i);t||(t=Ae.getConstructor("ueb-link").newObject(this,i),this.blueprint.addGraphElement(t))}return i}))),this.isLinked=this.entity.isLinked()}linkTo(e){const t=this.createPinReference();!this.isLinked||!this.isOutput()||"exec"!==this.pinType&&"exec"!==e.pinType||this.getLinks().some((e=>t.equals(e)))||this.unlinkFromAll(),this.entity.linkTo(e.getNodeElement().getNodeName(),e.entity)&&(this.isLinked=this.entity.isLinked(),this.nodeElement?.template.linksChanged(),this.entity.recomputesNodeTitleOnChange&&this.nodeElement?.computeNodeDisplayName())}unlinkFrom(e,t=!0){this.entity.unlinkFrom(e.getNodeElement().getNodeName(),e.entity)&&(this.isLinked=this.entity.isLinked(),this.nodeElement?.template.linksChanged(),t&&this.blueprint.getLink(this,e)?.remove(),this.entity.recomputesNodeTitleOnChange&&this.nodeElement?.computeNodeDisplayName())}unlinkFromAll(){const e=this.getLinks().length;this.getLinks().map((e=>this.blueprint.getPin(e))).forEach((e=>this.unlinkFrom(e))),e&&this.nodeElement?.template.linksChanged()}redirectLink(e,t){const i=this.getLinks().findIndex((t=>t.objectName.toString()==e.getNodeElement().getNodeName()&&t.pinGuid.toString()==e.entity.PinId.toString()));return i>=0&&(this.entity.LinkedTo[i]=t,!0)}}class Zi{constructor(e=e=>e,t=null){this.array=new Uint32Array(t),this.comparisonValueSupplier=e,this.length=0,this.currentPosition=0}get(e){return e>=0&&e=0&&this.currentPosition=0&&this.currentPosition0?this.get(this.currentPosition-1):null}getPrevValue(){return this.currentPosition>0?this.comparisonValueSupplier(this.get(this.currentPosition-1)):Number.MIN_SAFE_INTEGER}shiftLeft(e,t=1){this.array.set(this.array.subarray(e+t),e)}shiftRight(e,t=1){this.array.set(this.array.subarray(e,-t),e+t)}}class Wi{constructor(e,t,i,s){this.initialPosition=e,this.finalPosition=e,this.metadata=new Array(t.length),this.primaryOrder=new Zi((e=>this.metadata[e].primaryBoundary)),this.secondaryOrder=new Zi((e=>this.metadata[e].secondaryBoundary)),this.selectFunc=s,this.rectangles=t,this.primaryOrder.reserve(this.rectangles.length),this.secondaryOrder.reserve(this.rectangles.length),t.forEach(((e,t)=>{let r={primaryBoundary:this.initialPosition[0],secondaryBoundary:this.initialPosition[1],rectangle:t,onSecondaryAxis:!1};this.metadata[t]=r,s(e,!1);const n=i(e);this.initialPosition[1]{if(this.metadata[i].onSecondaryAxis)this.selectFunc(this.rectangles[i],s);else if(s){this.secondaryOrder.insert(i,e[1]);const s=this.metadata[i].secondaryBoundary;Math.sign(e[1]-s)==t[1]&&Math.sign(s-this.initialPosition[1])==t[1]&&this.selectFunc(this.rectangles[i],!0)}else this.selectFunc(this.rectangles[i],!1),this.secondaryOrder.remove(i);this.computeBoundaries(),this.selectTo(e)};e[0]this.boundaries.primaryN.v&&e[0]this.boundaries.primaryP.v&&(++this.primaryOrder.currentPosition,i(this.boundaries.primaryP.i,this.initialPosition[0]{this.selectFunc(this.rectangles[t],i),this.computeBoundaries(),this.selectTo(e)};e[1]this.boundaries.secondaryN.v&&e[1]this.boundaries.secondaryP.v&&(++this.secondaryOrder.currentPosition,s(this.boundaries.secondaryP.i,this.initialPosition[1]es.#ai[e],toAttribute:(e,t)=>Object.entries(es.#ai).find((([t,i])=>e.constructor===i))?.[0]}}};static newObject(e={},t=e.type??new Fi){const i=new es;return i.initialize(e,t),i}initialize(e={},t=e.type??new Fi){e.windowOptions??={},this.type=e.type,this.windowOptions=e.windowOptions,super.initialize(e,t)}computeSizes(){const e=this.getBoundingClientRect();this.sizeX=e.width,this.sizeY=e.height}cleanup(){super.cleanup(),this.acknowledgeClose()}acknowledgeClose(){let e=new CustomEvent(ne.windowCloseEventName);this.dispatchEvent(e)}}class ts extends Pe{static grammar=this.createGrammar();static{Pe.unknownEntity=this}static createGrammar(){return xe.seq(xe.reg(new RegExp(`(${Me.Regex.Path.source}|${Me.Regex.Symbol.source}\\s*)?\\(\\s*`),1),xe.seq(Me.attributeName,Me.equalSeparation).map((([e,t])=>e)).chain((e=>this.unknownEntityGrammar.map((t=>i=>i[e]=t)))).sepBy(Me.commaSeparation),xe.reg(/\s*(?:,\s*)?\)/)).map((([e,t,i])=>{e??="";let s={};return e.length&&(s.lookbehind=e),t.forEach((e=>e(s))),new this(s)})).label("UnknownKeysEntity")}}Pe.unknownEntityGrammar=xe.alt(ke.grammar,ze.grammar,xe.str("None").map((()=>st.createNoneInstance())),ft.grammar,$e.grammar,xe.alt(st.fullReferenceGrammar,xe.regArray(new RegExp(`"(${Me.Regex.Path.source})'(${Me.Regex.Path.source}|${Me.symbol.getParser().regexp.source})'"`)).map((([e,t,i])=>new st(t,i,((e,t)=>`"${e}'${t}'"`))))),Xe.grammar,et.grammar,Je.grammar,tt.grammar,rt.grammar,pt.grammar,De.grammar,ot.grammar,ut.grammar,Ie.grammar,ts.grammar,Ze.grammar,Re.of(rt).grammar,Re.of(Le.accepting($e,Xe,Ze)).grammar,xe.lazy((()=>Re.createGrammar(Pe.unknownEntityGrammar)))),function(){const e=(e,t)=>{customElements.define(e,t),Ae.registerElement(e,t)};e("ueb-color-handler",xi),e("ueb-dropdown",Mi),e("ueb-input",Ii),e("ueb-link",Dt),e("ueb-node",oi),e("ueb-pin",qi),e("ueb-selector",Ji),e("ueb-ui-slider",ki),e("ueb-window",es)}();export{Si as Blueprint,ne as Configuration,Dt as LinkElement,oi as NodeElement,ae as Utility}; + */const Ri = "important", _i = " !" + Ri, zi = (e => (...t) => ({ _$litDirective$: e, values: t }))(class extends Vi { constructor(e) { var t; if (super(e), e.type !== Hi || "style" !== e.name || (null === (t = e.strings) || void 0 === t ? void 0 : t.length) > 2) throw Error("The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.") } render(e) { return Object.keys(e).reduce(((t, i) => { const s = e[i]; return null == s ? t : t + `${i = i.includes("-") ? i : i.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g, "-$&").toLowerCase()}:${s};` }), "") } update(e, [t]) { const { style: i } = e.element; if (void 0 === this.ht) { this.ht = new Set; for (const e in t) this.ht.add(e); return this.render(t) } this.ht.forEach((e => { null == t[e] && (this.ht.delete(e), e.includes("-") ? i.removeProperty(e) : i[e] = "") })); for (const e in t) { const s = t[e]; if (null != s) { this.ht.add(e); const t = "string" == typeof s && s.endsWith(_i); e.includes("-") || t ? i.setProperty(e, t ? s.slice(0, -11) : s, t ? Ri : "") : i[e] = s } } return H } }); class Fi extends Ft { toggleAdvancedDisplayHandler; getDraggableElement() { return this.element.querySelector(".ueb-window-top") } createDraggableObject() { return new Vt(this.element, this.blueprint, { draggableElement: this.getDraggableElement(), ignoreScale: !0, ignoreTranslateCompensate: !1, movementSpace: this.blueprint, stepSize: 1 }) } setup() { const e = this.blueprint.template.gridLeftVisibilityBoundary(), t = this.blueprint.template.gridTopVisibilityBoundary(); this.element.locationX = this.blueprint.scaleCorrectReverse(this.blueprint.mousePosition[0] - e), this.element.locationY = this.blueprint.scaleCorrectReverse(this.blueprint.mousePosition[1] - t), this.element.updateComplete.then((() => { const e = this.blueprint.getBoundingClientRect(); this.element.locationX + this.element.sizeX > e.width && (this.element.locationX = e.width - this.element.sizeX), this.element.locationX = Math.max(0, this.element.locationX), this.element.locationY + this.element.sizeY > e.height && (this.element.locationY = e.height - this.element.sizeY), this.element.locationY = Math.max(0, this.element.locationY) })) } render() { return G`
${this.renderWindowName()}
${le.close}
${this.renderContent()}
` } renderWindowName() { return G`Window` } renderContent() { return G`` } apply() { this.element.dispatchEvent(new CustomEvent(re.windowApplyEventName)), this.element.remove() } cancel() { this.element.dispatchEvent(new CustomEvent(re.windowCancelEventName)), this.element.remove() } } class ji extends Fi { #$t; #Bt; #Gt; #Ht; #Vt; #Rt; #_t; #zt; #Ft; #jt; #Ut = e => { const t = ae.clearHTMLWhitespace(e.target.innerHTML), i = parseInt(t, 16); isNaN(i) || (this.color.setFromRGBANumber(i), this.element.requestUpdate()) }; #Yt = e => { const t = ae.clearHTMLWhitespace(e.target.innerHTML), i = parseInt(t, 16); isNaN(i) || (this.color.setFromSRGBANumber(i), this.element.requestUpdate()) }; #Kt = e => t => { "Enter" == t.code && (t.preventDefault(), e(t)) }; #Xt = new Ie; get color() { return this.#Xt } set color(e) { e.toNumber() != this.color?.toNumber() && (this.element.requestUpdate("color", this.#Xt), this.#Xt = e) } #qt = new Ie; get fullColor() { return this.#qt } #Zt; get initialColor() { return this.#Zt } #Wt = new Ie; #Qt(e, t, i = !1) { const s = this.color.toRGBAString(), n = `${s.substring(0, 2 * e)}${t}${s.substring(2 + 2 * e)}`; return i ? `${n.substring(0, 6)}FF` : n } initialize(e) { super.initialize(e), this.#Zt = this.element.windowOptions.getPinColor(), this.color.setFromHSVA(this.initialColor.H.value, this.initialColor.S.value, this.initialColor.V.value, this.initialColor.A.value), this.fullColor.setFromHSVA(this.color.H.value, 1, 1, 1) } firstUpdated(e) { this.#$t = this.element.querySelector(".ueb-color-picker-wheel ueb-color-handler"), this.#Bt = this.element.querySelector(".ueb-color-picker-saturation ueb-ui-slider"), this.#Gt = this.element.querySelector(".ueb-color-picker-value ueb-ui-slider"), this.#Ht = this.element.querySelector(".ueb-color-picker-r ueb-ui-slider"), this.#Vt = this.element.querySelector(".ueb-color-picker-g ueb-ui-slider"), this.#Rt = this.element.querySelector(".ueb-color-picker-b ueb-ui-slider"), this.#_t = this.element.querySelector(".ueb-color-picker-a ueb-ui-slider"), this.#zt = this.element.querySelector(".ueb-color-picker-h ueb-ui-slider"), this.#Ft = this.element.querySelector(".ueb-color-picker-s ueb-ui-slider"), this.#jt = this.element.querySelector(".ueb-color-picker-v ueb-ui-slider"), this.#$t.template.locationChangeCallback = (e, t) => { this.color.setFromWheelLocation(e, t, this.color.V.value, this.color.A.value), this.fullColor.setFromHSVA(this.color.H.value, 1, 1, 1), this.element.requestUpdate() }, this.#Bt.template.locationChangeCallback = (e, t) => { this.color.setFromHSVA(this.color.H.value, t, this.color.V.value, this.color.A.value), this.element.requestUpdate() }, this.#Gt.template.locationChangeCallback = (e, t) => { this.color.setFromHSVA(this.color.H.value, this.color.S.value, t, this.color.A.value), this.element.requestUpdate() }, this.#Ht.template.locationChangeCallback = (e, t) => { this.color.setFromRGBA(e, this.color.G.value, this.color.B.value, this.color.A.value), this.element.requestUpdate() }, this.#Vt.template.locationChangeCallback = (e, t) => { this.color.setFromRGBA(this.color.R.value, e, this.color.B.value, this.color.A.value), this.element.requestUpdate() }, this.#Rt.template.locationChangeCallback = (e, t) => { this.color.setFromRGBA(this.color.R.value, this.color.G.value, e, this.color.A.value), this.element.requestUpdate() }, this.#_t.template.locationChangeCallback = (e, t) => { this.color.setFromRGBA(this.color.R.value, this.color.G.value, this.color.B.value, e), this.element.requestUpdate() }, this.#zt.template.locationChangeCallback = (e, t) => { this.color.setFromHSVA(e, this.color.S.value, this.color.V.value, this.color.A.value), this.element.requestUpdate() }, this.#Ft.template.locationChangeCallback = (e, t) => { this.color.setFromHSVA(this.color.H.value, e, this.color.V.value, this.color.A.value), this.element.requestUpdate() }, this.#jt.template.locationChangeCallback = (e, t) => { this.color.setFromHSVA(this.color.H.value, this.color.S.value, e, this.color.A.value), this.element.requestUpdate() } } renderSlider(e) { let t = "", i = 0, s = ""; const n = e => `linear-gradient(to right, #${this.#Qt(e, "00", !0)}, #${this.#Qt(e, "ff", !0)})`; switch (e) { case 0: t = "r", i = this.color.R.value, s = n(e); break; case 1: t = "g", i = this.color.G.value, s = n(e); break; case 2: t = "b", i = this.color.B.value, s = n(e); break; case 3: t = "a", i = this.color.A.value, s = `${re.alphaPattern}, ${n(e)}`; break; case 4: t = "h", i = 360 * this.color.H.value, s = "linear-gradient(to right, #f00 0%, #ff0 16.666%, #0f0 33.333%, #0ff 50%, #00f 66.666%, #f0f 83.333%, #f00 100%)"; break; case 5: t = "s", i = this.color.S.value, s = `linear-gradient(to right,#${this.#Wt.setFromHSVA(this.color.H.value, 0, this.color.V.value, 1), this.#Wt.toRGBAString()},#${this.#Wt.setFromHSVA(this.color.H.value, 1, this.color.V.value, 1), this.#Wt.toRGBAString()})`; break; case 6: t = "v", i = this.color.V.value, s = `linear-gradient(to right, #000, #${this.fullColor.toRGBAString()})` }return s = `background: ${s};`, G`
${t.toUpperCase()}
` } renderContent() { const e = 2 * this.color.H.value * Math.PI, t = { "--ueb-color-r": this.color.R.toString(), "--ueb-color-g": this.color.G.toString(), "--ueb-color-b": this.color.B.toString(), "--ueb-color-a": this.color.A.toString(), "--ueb-color-h": this.color.H.toString(), "--ueb-color-s": this.color.S.toString(), "--ueb-color-v": this.color.V.toString(), "--ueb-color-wheel-x": 100 * (this.color.S.value * Math.cos(e) * .5 + .5) + "%", "--ueb-color-wheel-y": 100 * (this.color.S.value * Math.sin(e) * .5 + .5) + "%" }, i = this.color.toRGBAString(), s = this.color.toSRGBAString(), n = this.fullColor.toRGBAString(); return G`
Old
New
Advanced
${this.renderSlider(0)} ${this.renderSlider(1)} ${this.renderSlider(2)} ${this.renderSlider(3)}
${this.renderSlider(4)} ${this.renderSlider(5)} ${this.renderSlider(6)}
Hex Linear
Hex sRGB
${re.windowApplyButtonText}
${re.windowCancelButtonText}
` } renderWindowName() { return G`${re.colorWindowName}` } } class Ui extends Bi { #Jt() { return De.printNumber(this.element.getDefaultValue()?.X.valueOf() ?? 0) } #ei() { return De.printNumber(this.element.getDefaultValue()?.Y.valueOf() ?? 0) } setDefaultValue(e, t) { const i = this.element.getDefaultValue(!0); i.X.value = e[0], i.Y.value = e[1], this.element.setDefaultValue(i) } renderInput() { return G`
X
Y
` } } class Yi extends Bi { #Jt() { return De.printNumber(this.element.getDefaultValue()?.X.valueOf() ?? 0) } #ei() { return De.printNumber(this.element.getDefaultValue()?.Y.valueOf() ?? 0) } #ti() { return De.printNumber(this.element.getDefaultValue()?.Z.valueOf() ?? 0) } setDefaultValue(e, t) { const i = this.element.getDefaultValue(!0); if (!(i instanceof $e)) throw new TypeError("Expected DefaultValue to be a VectorEntity"); i.X.value = e[0], i.Y.value = e[1], i.Z.value = e[2], this.element.requestUpdate("DefaultValue", i) } renderInput() { return G`
X
Y
Z
` } } const Ki = { bool: Oi, byte: Gi, enum: class extends Di { static saveEachInputChange = !0; #ii; #si = []; setup() { super.setup(); const e = this.element.nodeElement.entity.EnumEntries?.valueOf(); this.#si = e?.map((e => ("" === e.valueOf() && (e = new qe("None")), [e, this.element.nodeElement.getPinEntities().find((t => e === t.PinName))?.PinFriendlyName.toString() ?? e]))) ?? re.CommonEnums[this.element.entity.getSubCategory()]?.map((e => e instanceof Array ? e : [e, ae.formatStringName(e)])) ?? []; const t = this.element.getDefaultValue().toString(); this.#si.find((([e, i]) => e === t)) || this.#si.push([t, ae.formatStringName(t)]), this.element.requestUpdate() } renderInput() { return G`` } firstUpdated(e) { super.firstUpdated(e), this.#ii = this.element.querySelector("ueb-dropdown") } getInputs() { return [this.#ii.getValue()] } setDefaultValue(e = [], t) { const i = this.element.getDefaultValue(); i.value = e[0], this.element.setDefaultValue(i), this.element.requestUpdate() } }, int: Gi, int64: class extends Bi { setDefaultValue(e = [], t) { const i = this.element.getDefaultValue(); i.value = BigInt(e[0]), this.element.setDefaultValue(i), this.element.requestUpdate() } renderInput() { return G`
` } }, MUTABLE_REFERENCE: class extends Jt { renderIcon() { return le.referencePin } }, name: class extends Di { static singleLineInput = !0 }, real: class extends Bi { renderInput() { return G`
` } }, rg: Ui, string: class extends Di { }, [re.paths.linearColor]: class extends Jt { #ni; #ri = e => { e.preventDefault(), this.blueprint.setFocused(!0), this.#ni = Ae.getConstructor("ueb-window").newObject({ type: new ji, windowOptions: { getPinColor: () => this.element.defaultValue, setPinColor: e => this.element.setDefaultValue(e) } }), this.blueprint.append(this.#ni); const t = () => { this.element.setDefaultValue(this.#ni.template.color) }, i = () => { this.#ni.removeEventListener(re.windowApplyEventName, t), this.#ni.removeEventListener(re.windowCloseEventName, i), this.#ni = null }; this.#ni.addEventListener(re.windowApplyEventName, t), this.#ni.addEventListener(re.windowCloseEventName, i) }; renderInput() { return G`` } }, [re.paths.niagaraBool]: Oi, [re.paths.niagaraPosition]: Yi, [re.paths.rotator]: class extends Bi { #ai() { return De.printNumber(this.element.getDefaultValue()?.R.valueOf() ?? 0) } #oi() { return De.printNumber(this.element.getDefaultValue()?.P.valueOf() ?? 0) } #ei() { return De.printNumber(this.element.getDefaultValue()?.Y.valueOf() ?? 0) } setDefaultValue(e = [], t = e) { const i = this.element.getDefaultValue(!0); if (!(i instanceof ct)) throw new TypeError("Expected DefaultValue to be a RotatorEntity"); i.R.value = e[0], i.P.value = e[1], i.Y.value = e[2], this.element.requestUpdate("DefaultValue", i) } renderInput() { return G`
X
Y
Z
` } }, [re.paths.vector]: Yi, [re.paths.vector2D]: Ui, [re.paths.vector3f]: Yi, [re.paths.vector4f]: class extends Bi { #Jt() { return De.printNumber(this.element.getDefaultValue()?.X.valueOf() ?? 0) } #ei() { return De.printNumber(this.element.getDefaultValue()?.Y.valueOf() ?? 0) } #ti() { return De.printNumber(this.element.getDefaultValue()?.Z.valueOf() ?? 0) } #li() { return De.printNumber(this.element.getDefaultValue()?.W.valueOf() ?? 0) } setDefaultValue(e, t) { const i = this.element.getDefaultValue(!0); if (!(i instanceof dt)) throw new TypeError("Expected DefaultValue to be a Vector4DEntity"); i.X.value = e[0], i.Y.value = e[1], i.Z.value = e[2], i.W.value = e[3], this.element.requestUpdate("DefaultValue", i) } renderInput() { return G`
X
Y
Z
W
` } } }; function Xi(e) { if ("Array" === e.PinType.ContainerType?.toString()) return Jt; if (e.PinType.bIsReference?.valueOf() && !e.PinType.bIsConst?.valueOf()) return Ki.MUTABLE_REFERENCE; const t = e.getType(); return "exec" === t ? $i : (e.isInput() ? Ki[t] : Jt) ?? Jt } class qi extends oe { static properties = { pinId: { type: ze, converter: { fromAttribute: (e, t) => e ? ze.grammar.parse(e) : null, toAttribute: (e, t) => e?.toString() }, attribute: "data-id", reflect: !0 }, pinType: { type: String, attribute: "data-type", reflect: !0 }, advancedView: { type: String, attribute: "data-advanced-view", reflect: !0 }, color: { type: Ie, converter: { fromAttribute: (e, t) => e ? Ie.getLinearColorFromAnyFormat().parse(e) : null, toAttribute: (e, t) => e ? Ie.printLinearColor(e) : null }, attribute: "data-color", reflect: !0 }, defaultValue: { type: String, attribute: !1 }, isLinked: { type: Boolean, converter: ke.booleanConverter, attribute: "data-linked", reflect: !0 }, pinDirection: { type: String, attribute: "data-direction", reflect: !0 }, connectable: { type: Boolean, converter: ke.booleanConverter, attribute: "data-connectable", reflect: !0 } }; nodeElement; static newObject(e = new bt, t = new (Xi(e)), i = void 0) { const s = new qi; return s.initialize(e, t, i), s } initialize(e = new bt, t = new (Xi(e)), i = void 0) { this.nodeElement = i, this.advancedView = e.bAdvancedView?.valueOf(), this.isLinked = !1, this.connectable = !e.bNotConnectable?.valueOf(), super.initialize(e, t), this.pinId = this.entity.PinId, this.pinType = this.entity.getType(), this.defaultValue = this.entity.getDefaultValue(), this.color = qi.properties.color.converter.fromAttribute(this.getColor().toString()), this.pinDirection = e.isInput() ? "input" : e.isOutput() ? "output" : "hidden" } setup() { super.setup(), this.nodeElement = this.closest("ueb-node") } createPinReference() { return new rt(new We(this.nodeElement.getNodeName()), this.getPinId()) } getPinId() { return this.entity.PinId } getPinName() { return this.entity.PinName?.toString() ?? "" } getPinDisplayName() { return this.entity.pinTitle() } getColor() { return this.entity.pinColor() } isInput() { return this.entity.isInput() } isOutput() { return this.entity.isOutput() } getLinkLocation() { return this.template.getLinkLocation() } getNodeElement() { return this.nodeElement } getLinks() { return this.entity.LinkedTo?.valueOf() ?? [] } getDefaultValue(e = !1) { return this.defaultValue = this.entity.getDefaultValue(e) } setDefaultValue(e) { this.entity.DefaultValue = e, this.defaultValue = e, this.entity.recomputesNodeTitleOnChange && this.nodeElement?.computeNodeDisplayName() } sanitizeLinks(e = []) { this.entity.LinkedTo = new bt.attributes.LinkedTo(this.entity.LinkedTo?.valueOf().filter((t => { let i = this.blueprint.getPin(t); if (i) { if (e.length && !e.includes(i.nodeElement)) return !1; let t = this.blueprint.getLink(this, i); t || (t = Ae.getConstructor("ueb-link").newObject(this, i), this.blueprint.addGraphElement(t)) } return i }))), this.isLinked = this.entity.isLinked() } linkTo(e) { const t = this.createPinReference(); !this.isLinked || !this.isOutput() || "exec" !== this.pinType && "exec" !== e.pinType || this.getLinks().some((e => t.equals(e))) || this.unlinkFromAll(), this.entity.linkTo(e.getNodeElement().getNodeName(), e.entity) && (this.isLinked = this.entity.isLinked(), this.nodeElement?.template.linksChanged(), this.entity.recomputesNodeTitleOnChange && this.nodeElement?.computeNodeDisplayName()) } unlinkFrom(e, t = !0) { this.entity.unlinkFrom(e.getNodeElement().getNodeName(), e.entity) && (this.isLinked = this.entity.isLinked(), this.nodeElement?.template.linksChanged(), t && this.blueprint.getLink(this, e)?.remove(), this.entity.recomputesNodeTitleOnChange && this.nodeElement?.computeNodeDisplayName()) } unlinkFromAll() { const e = this.getLinks().length; this.getLinks().map((e => this.blueprint.getPin(e))).forEach((e => this.unlinkFrom(e))), e && this.nodeElement?.template.linksChanged() } redirectLink(e, t) { const i = this.getLinks().findIndex((t => t.objectName.toString() == e.getNodeElement().getNodeName() && t.pinGuid.toString() == e.entity.PinId.toString())); return i >= 0 && (this.entity.LinkedTo.valueOf()[i] = t, !0) } } class Zi { constructor(e = e => e, t = null) { this.array = new Uint32Array(t), this.comparisonValueSupplier = e, this.length = 0, this.currentPosition = 0 } get(e) { return e >= 0 && e < this.length ? this.array[e] : null } getArray() { return this.array } getPosition(e) { let t = 0, i = this.length; for (; t < i;) { let s = Math.floor((t + i) / 2); this.comparisonValueSupplier(this.array[s]) < e ? t = s + 1 : i = s } return t } reserve(e) { if (this.array.length < e) { let t = new Uint32Array(e); t.set(this.array), this.array = t } } insert(e, t = null) { let i = this.getPosition(this.comparisonValueSupplier(e)); return (i < this.currentPosition || null != t && i == this.currentPosition && this.comparisonValueSupplier(e) < t) && ++this.currentPosition, this.shiftRight(i), this.array[i] = e, ++this.length, i } remove(e) { let t = this.getPosition(this.comparisonValueSupplier(e)); this.array[t] == e && this.removeAt(t) } removeAt(e) { return e < this.currentPosition && --this.currentPosition, this.shiftLeft(e), --this.length, e } getNext() { return this.currentPosition >= 0 && this.currentPosition < this.length ? this.get(this.currentPosition) : null } getNextValue() { return this.currentPosition >= 0 && this.currentPosition < this.length ? this.comparisonValueSupplier(this.get(this.currentPosition)) : Number.MAX_SAFE_INTEGER } getPrev() { return this.currentPosition > 0 ? this.get(this.currentPosition - 1) : null } getPrevValue() { return this.currentPosition > 0 ? this.comparisonValueSupplier(this.get(this.currentPosition - 1)) : Number.MIN_SAFE_INTEGER } shiftLeft(e, t = 1) { this.array.set(this.array.subarray(e + t), e) } shiftRight(e, t = 1) { this.array.set(this.array.subarray(e, -t), e + t) } } class Wi { constructor(e, t, i, s) { this.initialPosition = e, this.finalPosition = e, this.metadata = new Array(t.length), this.primaryOrder = new Zi((e => this.metadata[e].primaryBoundary)), this.secondaryOrder = new Zi((e => this.metadata[e].secondaryBoundary)), this.selectFunc = s, this.rectangles = t, this.primaryOrder.reserve(this.rectangles.length), this.secondaryOrder.reserve(this.rectangles.length), t.forEach(((e, t) => { let n = { primaryBoundary: this.initialPosition[0], secondaryBoundary: this.initialPosition[1], rectangle: t, onSecondaryAxis: !1 }; this.metadata[t] = n, s(e, !1); const r = i(e); this.initialPosition[1] < r.secondaryInf ? n.secondaryBoundary = r.secondaryInf : r.secondarySup < this.initialPosition[1] ? n.secondaryBoundary = r.secondarySup : n.onSecondaryAxis = !0, this.initialPosition[0] < r.primaryInf ? (n.primaryBoundary = r.primaryInf, this.primaryOrder.insert(t)) : r.primarySup < this.initialPosition[0] ? (n.primaryBoundary = r.primarySup, this.primaryOrder.insert(t)) : r.secondarySup < this.initialPosition[1] || this.initialPosition[1] < r.secondaryInf ? this.secondaryOrder.insert(t) : s(e, !0) })), this.primaryOrder.currentPosition = this.primaryOrder.getPosition(this.initialPosition[0]), this.secondaryOrder.currentPosition = this.secondaryOrder.getPosition(this.initialPosition[1]), this.computeBoundaries() } computeBoundaries() { this.boundaries = { primaryN: { v: this.primaryOrder.getPrevValue(), i: this.primaryOrder.getPrev() }, primaryP: { v: this.primaryOrder.getNextValue(), i: this.primaryOrder.getNext() }, secondaryN: { v: this.secondaryOrder.getPrevValue(), i: this.secondaryOrder.getPrev() }, secondaryP: { v: this.secondaryOrder.getNextValue(), i: this.secondaryOrder.getNext() } } } selectTo(e) { const t = [Math.sign(e[0] - this.initialPosition[0]), Math.sign(e[1] - this.initialPosition[1])], i = (i, s) => { if (this.metadata[i].onSecondaryAxis) this.selectFunc(this.rectangles[i], s); else if (s) { this.secondaryOrder.insert(i, e[1]); const s = this.metadata[i].secondaryBoundary; Math.sign(e[1] - s) == t[1] && Math.sign(s - this.initialPosition[1]) == t[1] && this.selectFunc(this.rectangles[i], !0) } else this.selectFunc(this.rectangles[i], !1), this.secondaryOrder.remove(i); this.computeBoundaries(), this.selectTo(e) }; e[0] < this.boundaries.primaryN.v ? (--this.primaryOrder.currentPosition, i(this.boundaries.primaryN.i, this.initialPosition[0] > this.boundaries.primaryN.v && e[0] < this.initialPosition[0])) : e[0] > this.boundaries.primaryP.v && (++this.primaryOrder.currentPosition, i(this.boundaries.primaryP.i, this.initialPosition[0] < this.boundaries.primaryP.v && this.initialPosition[0] < e[0])); const s = (t, i) => { this.selectFunc(this.rectangles[t], i), this.computeBoundaries(), this.selectTo(e) }; e[1] < this.boundaries.secondaryN.v ? (--this.secondaryOrder.currentPosition, s(this.boundaries.secondaryN.i, this.initialPosition[1] > this.boundaries.secondaryN.v && e[1] < this.initialPosition[1])) : e[1] > this.boundaries.secondaryP.v && (++this.secondaryOrder.currentPosition, s(this.boundaries.secondaryP.i, this.initialPosition[1] < this.boundaries.secondaryP.v && this.initialPosition[1] < e[1])), this.finalPosition = e } } class Qi extends Ot { } class Ji extends $t { selectionModel = null; constructor() { super(), super.initialize({}, new Qi) } static newObject() { return new Ji } initialize() { } beginSelect(e) { const t = this.blueprint.constructor; this.blueprint.selecting = !0, this.setBothLocations(e), this.selectionModel = new Wi(e, this.blueprint.getNodes(), t.nodeBoundariesSupplier, t.nodeSelectToggleFunction) } selectTo(e) { this.selectionModel.selectTo(e), this.toX = e[0], this.toY = e[1] } endSelect() { this.blueprint.selecting = !1, this.selectionModel = null, this.fromX = 0, this.fromY = 0, this.toX = 0, this.toY = 0 } } class es extends Gt { static #ui = { window: Fi, "color-picker": ji }; static properties = { ...Gt.properties, type: { type: Fi, attribute: "data-type", reflect: !0, converter: { fromAttribute: (e, t) => es.#ui[e], toAttribute: (e, t) => Object.entries(es.#ui).find((([t, i]) => e.constructor === i))?.[0] } } }; static newObject(e = {}, t = e.type ?? new Fi) { const i = new es; return i.initialize(e, t), i } initialize(e = {}, t = e.type ?? new Fi) { e.windowOptions ??= {}, this.type = e.type, this.windowOptions = e.windowOptions, super.initialize(e, t) } computeSizes() { const e = this.getBoundingClientRect(); this.sizeX = e.width, this.sizeY = e.height } cleanup() { super.cleanup(), this.acknowledgeClose() } acknowledgeClose() { let e = new CustomEvent(re.windowCloseEventName); this.dispatchEvent(e) } } class ts extends Pe { static grammar = this.createGrammar(); static { Pe.unknownEntity = this } static createGrammar() { return xe.seq(xe.reg(new RegExp(`(${Me.Regex.Path.source}|${Me.Regex.Symbol.source}\\s*)?\\(\\s*`), 1), xe.seq(Me.attributeName, Me.equalSeparation).map((([e, t]) => e)).chain((e => this.unknownEntityGrammar.map((t => i => i[e] = t)))).sepBy(Me.commaSeparation), xe.reg(/\s*(?:,\s*)?\)/)).map((([e, t, i]) => { e ??= ""; let s = {}; return e.length && (s.lookbehind = e), t.forEach((e => e(s))), new this(s) })).label("UnknownKeysEntity") } } Pe.unknownEntityGrammar = xe.alt(ke.grammar, ze.grammar, xe.str("None").map((() => nt.createNoneInstance())), yt.grammar, De.grammar, xe.alt(nt.fullReferenceGrammar, xe.regArray(new RegExp(`"(${Me.Regex.Path.source})'(${Me.Regex.Path.source}|${Me.symbol.getParser().regexp.source})'"`)).map((([e, t, i]) => new nt(t, i, e)))), qe.grammar, tt.grammar, et.grammar, it.grammar, rt.grammar, dt.grammar, $e.grammar, lt.grammar, ct.grammar, Ie.grammar, ts.grammar, We.grammar, Re.of(rt).grammar, Re.of(Le.accepting(De, qe, We)).grammar, xe.lazy((() => Re.createGrammar(Pe.unknownEntityGrammar)))), function () { const e = (e, t) => { customElements.define(e, t), Ae.registerElement(e, t) }; e("ueb-color-handler", xi), e("ueb-dropdown", Mi), e("ueb-input", Ii), e("ueb-link", Bt), e("ueb-node", li), e("ueb-pin", qi), e("ueb-selector", Ji), e("ueb-ui-slider", ki), e("ueb-window", es) }(); export { Si as Blueprint, re as Configuration, Bt as LinkElement, li as NodeElement, ae as Utility } diff --git a/js/Blueprint.js b/js/Blueprint.js index d02b3dd..c32cf9a 100755 --- a/js/Blueprint.js +++ b/js/Blueprint.js @@ -420,8 +420,9 @@ export default class Blueprint extends IElement { const name = element.entity.getObjectName() const homonym = this.entity.getHomonymObjectEntity(element.entity) if (homonym) { - homonym.Name.value = this.entity.takeFreeName(name) - homonym.Name = homonym.Name + const newName = this.entity.takeFreeName(name) + // @ts-expect-error + homonym.Name = new (homonym.Name.constructor)(newName) } this.nodes.push(element) this.entity.addObjectEntity(element.entity) diff --git a/js/Configuration.js b/js/Configuration.js index f2a436c..08b36c7 100755 --- a/js/Configuration.js +++ b/js/Configuration.js @@ -106,6 +106,7 @@ export default class Configuration { callArrayFunction: "/Script/BlueprintGraph.K2Node_CallArrayFunction", callDelegate: "/Script/BlueprintGraph.K2Node_CallDelegate", callFunction: "/Script/BlueprintGraph.K2Node_CallFunction", + clearDelegate: "/Script/BlueprintGraph.K2Node_ClearDelegate", comment: "/Script/UnrealEd.EdGraphNode_Comment", commutativeAssociativeBinaryOperator: "/Script/BlueprintGraph.K2Node_CommutativeAssociativeBinaryOperator", componentBoundEvent: "/Script/BlueprintGraph.K2Node_ComponentBoundEvent", @@ -194,6 +195,7 @@ export default class Configuration { pcgSubgraphSettings: "/Script/PCG.PCGSubgraphSettings", promotableOperator: "/Script/BlueprintGraph.K2Node_PromotableOperator", quat4f: "/Script/CoreUObject.Quat4f", + removeDelegate: "/Script/BlueprintGraph.K2Node_RemoveDelegate", reverseForEachLoop: "/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:ReverseForEachLoop", rotator: "/Script/CoreUObject.Rotator", select: "/Script/BlueprintGraph.K2Node_Select", diff --git a/js/SVGIcon.js b/js/SVGIcon.js index aa2c9f6..9b8c47a 100644 --- a/js/SVGIcon.js +++ b/js/SVGIcon.js @@ -67,7 +67,7 @@ export default class SVGIcon { ` static delegate = html` - + ` diff --git a/js/decoding/nodeIcon.js b/js/decoding/nodeIcon.js index ab327a6..ef4c211 100644 --- a/js/decoding/nodeIcon.js +++ b/js/decoding/nodeIcon.js @@ -11,9 +11,11 @@ export default function nodeIcon(entity) { case Configuration.paths.addDelegate: case Configuration.paths.asyncAction: case Configuration.paths.callDelegate: + case Configuration.paths.clearDelegate: case Configuration.paths.createDelegate: case Configuration.paths.functionEntry: case Configuration.paths.functionResult: + case Configuration.paths.removeDelegate: return SVGIcon.node case Configuration.paths.customEvent: return SVGIcon.event case Configuration.paths.doN: return SVGIcon.doN diff --git a/js/decoding/nodeSubtitle.js b/js/decoding/nodeSubtitle.js new file mode 100644 index 0000000..8e46743 --- /dev/null +++ b/js/decoding/nodeSubtitle.js @@ -0,0 +1,26 @@ +import Configuration from "../Configuration.js" +import Utility from "../Utility.js" +import pinTitle from "./pinTitle.js" + +/** + * @param {ObjectEntity} entity + * @returns {String?} + */ +export default function nodeSubtitle(entity) { + switch (entity.getType()) { + case Configuration.paths.addDelegate: + case Configuration.paths.clearDelegate: + case Configuration.paths.removeDelegate: + return null + } + const targetPin = entity + .getPinEntities() + .find(pin => pin.PinName?.toString() === "self" && pinTitle(pin) === "Target") + if (targetPin) { + const target = entity.FunctionReference?.MemberParent?.getName() + ?? targetPin.PinType?.PinSubCategoryObject?.getName() + ?? "Untitled" + return target.length > 0 ? `Target is ${Utility.formatStringName(target)}` : null + } + return null +} diff --git a/js/decoding/nodeTitle.js b/js/decoding/nodeTitle.js index fe18a6d..d904252 100644 --- a/js/decoding/nodeTitle.js +++ b/js/decoding/nodeTitle.js @@ -76,8 +76,17 @@ function keyName(value) { * @returns {String} */ export default function nodeTitle(entity) { - let input + let value switch (entity.getType()) { + case Configuration.paths.addDelegate: + value ??= "Bind Event to " + case Configuration.paths.clearDelegate: + value ??= "Unbind all Events from " + case Configuration.paths.removeDelegate: + value ??= "Unbind Event from " + return value + Utility.formatStringName( + entity.DelegateReference?.MemberName?.toString().replace(/Delegate$/, "") ?? "None" + ) case Configuration.paths.asyncAction: if (entity.ProxyFactoryFunctionName) { return Utility.formatStringName(entity.ProxyFactoryFunctionName?.toString()) @@ -130,25 +139,26 @@ export default function nodeTitle(entity) { } } case Configuration.paths.materialExpressionConstant: - input ??= [entity.getCustomproperties().find(pinEntity => pinEntity.PinName.toString() == "Value")?.DefaultValue] + value ??= [entity.getCustomproperties().find(pinEntity => pinEntity.PinName.toString() == "Value")?.DefaultValue] case Configuration.paths.materialExpressionConstant2Vector: - input ??= [ + value ??= [ entity.getCustomproperties().find(pinEntity => pinEntity.PinName?.toString() == "X")?.DefaultValue, entity.getCustomproperties().find(pinEntity => pinEntity.PinName?.toString() == "Y")?.DefaultValue, ] case Configuration.paths.materialExpressionConstant3Vector: case Configuration.paths.materialExpressionConstant4Vector: - if (!input) { + if (!value) { const vector = entity.getCustomproperties() .find(pinEntity => pinEntity.PinName?.toString() == "Constant") ?.DefaultValue - input = vector instanceof VectorEntity ? [vector.X, vector.Y, vector.Z].map(v => v.valueOf()) + value = vector instanceof VectorEntity ? [vector.X, vector.Y, vector.Z].map(v => v.valueOf()) : vector instanceof LinearColorEntity ? [vector.R, vector.G, vector.B, vector.A].map(v => v.valueOf()) : /** @type {Number[]} */([]) } - if (input.length > 0) { - return input.map(v => Utility.printExponential(v)).join(",") + if (value?.length > 0) { + return value.map(v => Utility.printExponential(v)).join(",") } + value = undefined break case Configuration.paths.materialExpressionFunctionInput: { const materialObject = entity.getMaterialSubobject() diff --git a/js/decoding/pinColor.js b/js/decoding/pinColor.js index fdc33e1..8a73125 100644 --- a/js/decoding/pinColor.js +++ b/js/decoding/pinColor.js @@ -56,7 +56,7 @@ const pinColorMaterial = css`120, 120, 120` /** @param {PinEntity} entity */ export default function pinColor(entity) { if (entity.PinType.PinCategory?.toString() === "mask") { - const result = colors[entity.PinType.PinSubCategory] + const result = colors[entity.PinType.PinSubCategory?.toString()] if (result) { return result } diff --git a/js/element/NodeElement.js b/js/element/NodeElement.js index ab61b47..cec7314 100644 --- a/js/element/NodeElement.js +++ b/js/element/NodeElement.js @@ -100,7 +100,7 @@ export default class NodeElement extends ISelectableDraggableElement { } /** @param {String} name */ - #redirectLinksAfterRename(name) { + #redirectLinksBeforeRename(name) { for (let sourcePinElement of this.getPinElements()) { for (let targetPinReference of sourcePinElement.getLinks()) { this.blueprint.getPin(targetPinReference).redirectLink( @@ -135,9 +135,9 @@ export default class NodeElement extends ISelectableDraggableElement { "Name", /** @param {InstanceType} newName */ newName => { + this.#redirectLinksBeforeRename(newName.value) this.nodeTitle = newName.value this.nodeDisplayName = nodeTitle(entity) - this.#redirectLinksAfterRename(newName.value) } ) } diff --git a/js/element/PinElement.js b/js/element/PinElement.js index ed15347..78a45d9 100644 --- a/js/element/PinElement.js +++ b/js/element/PinElement.js @@ -23,7 +23,7 @@ export default class PinElement extends IElement { fromAttribute: (value, type) => value ? GuidEntity.grammar.parse(value) : null, - toAttribute: (value, type) => /** @type {String} */(value?.toString()), + toAttribute: (value, type) => value?.toString(), }, attribute: "data-id", reflect: true, @@ -95,6 +95,7 @@ export default class PinElement extends IElement { this.isLinked = false this.connectable = !entity.bNotConnectable?.valueOf() super.initialize(entity, template) + this.pinId = this.entity.PinId this.pinType = this.entity.getType() this.defaultValue = this.entity.getDefaultValue() this.color = PinElement.properties.color.converter.fromAttribute(this.getColor().toString()) @@ -233,7 +234,7 @@ export default class PinElement extends IElement { && pinReference.pinGuid.toString() == originalPinElement.entity.PinId.toString() ) if (index >= 0) { - this.entity.LinkedTo[index] = newReference + this.entity.LinkedTo.valueOf()[index] = newReference return true } return false diff --git a/js/entity/BlueprintEntity.js b/js/entity/BlueprintEntity.js index a82f5bb..221e2ae 100644 --- a/js/entity/BlueprintEntity.js +++ b/js/entity/BlueprintEntity.js @@ -15,7 +15,7 @@ export default class BlueprintEntity extends ObjectEntity { /** @param {ObjectEntity} entity */ getHomonymObjectEntity(entity) { - const name = entity.getObjectName(false) + const name = entity.getObjectName() return this.#objectEntities.find(entity => entity.getObjectName() == name) } diff --git a/js/entity/IEntity.js b/js/entity/IEntity.js index 46a9f0a..5f2a61a 100644 --- a/js/entity/IEntity.js +++ b/js/entity/IEntity.js @@ -61,6 +61,14 @@ export default class IEntity { this.#ignored = value } + #inlined = /** @type {typeof IEntity} */(this.constructor).inlined + get inlined() { + return this.#inlined + } + set inlined(value) { + this.#inlined = value + } + #quoted get quoted() { return this.#quoted ?? /** @type {typeof IEntity} */(this.constructor).quoted ?? false @@ -331,7 +339,7 @@ export default class IEntity { if (keyValue.length && (Self.attributes[key]?.quoted || value.quoted)) { keyValue = `"${keyValue}"` } - if (valueType.inlined) { + if (value.inlined) { const inlinedPrintKey = valueType.className() === "ArrayEntity" ? k => printKey(`${keyValue}${k}`) : k => printKey(`${keyValue}.${k}`) diff --git a/js/entity/PinEntity.js b/js/entity/PinEntity.js index 814f6c1..0222994 100755 --- a/js/entity/PinEntity.js +++ b/js/entity/PinEntity.js @@ -89,11 +89,11 @@ export default class PinEntity extends IEntity { AutogeneratedDefaultValue: StringEntity, DefaultObject: ObjectReferenceEntity, PersistentGuid: GuidEntity, - bHidden: BooleanEntity.withDefault(), - bNotConnectable: BooleanEntity.withDefault(), - bDefaultValueIsReadOnly: BooleanEntity.withDefault(), - bDefaultValueIsIgnored: BooleanEntity.withDefault(), - bAdvancedView: BooleanEntity.withDefault(), + bHidden: BooleanEntity, + bNotConnectable: BooleanEntity, + bDefaultValueIsReadOnly: BooleanEntity, + bDefaultValueIsIgnored: BooleanEntity, + bAdvancedView: BooleanEntity, bOrphanedPin: BooleanEntity, } static grammar = this.createGrammar() diff --git a/js/entity/PinTypeEntity.js b/js/entity/PinTypeEntity.js index d5277a3..90b5b72 100755 --- a/js/entity/PinTypeEntity.js +++ b/js/entity/PinTypeEntity.js @@ -12,7 +12,7 @@ export default class PinTypeEntity extends IEntity { static attributes = { ...super.attributes, PinCategory: StringEntity.withDefault(), - PinSubCategory: StringEntity.withDefault(), + PinSubCategory: StringEntity, PinSubCategoryObject: ObjectReferenceEntity, PinSubCategoryMemberReference: FunctionReferenceEntity, ContainerType: SymbolEntity, diff --git a/js/entity/UnknownPinEntity.js b/js/entity/UnknownPinEntity.js index ca7c73b..7f910c8 100755 --- a/js/entity/UnknownPinEntity.js +++ b/js/entity/UnknownPinEntity.js @@ -1,15 +1,22 @@ import P from "parsernostrum" import Grammar from "../serialization/Grammar.js" +import GuidEntity from "./GuidEntity.js" import PinEntity from "./PinEntity.js" export default class UnknownPinEntity extends PinEntity { + static attributes = { + ...super.attributes, + PinId: GuidEntity + } + static grammar = this.createGrammar() /** @returns {P} */ static createGrammar() { return P.seq( - P.reg(new RegExp(`(${Grammar.Regex.Symbol.source})\\s*\\(\\s*`), 1), + // Lookbehind + P.reg(new RegExp(`(${Grammar.Regex.Symbol.source}\\s*)\\(\\s*`), 1), Grammar.createAttributeGrammar(this).sepBy(Grammar.commaSeparation), P.reg(/\s*(?:,\s*)?\)/) ).map(([lookbehind, attributes, _2]) => { diff --git a/js/serialization/Grammar.js b/js/serialization/Grammar.js index df45d15..a5c8af2 100755 --- a/js/serialization/Grammar.js +++ b/js/serialization/Grammar.js @@ -107,9 +107,17 @@ export default class Grammar { const attributeKey = attributeName.split(Configuration.keysSeparator) const attributeValue = this.getAttribute(entityType, attributeKey) const grammar = attributeValue ? attributeValue.grammar : IEntity.unknownEntityGrammar + const inlined = attributeKey.length > 1 return grammar.map(attributeValue => values => { Utility.objectSet(values, attributeKey, attributeValue) + attributeKey.reduce( + (acc, cur, i) => { + acc[cur]["inlined"] = inlined && i < attributeKey.length - 1 + return acc[cur] + }, + values + ) handleObjectSet(values, attributeKey, attributeValue) } ) diff --git a/js/template/node/EventNodeTemplate.js b/js/template/node/EventNodeTemplate.js index 7fc0617..5240db6 100755 --- a/js/template/node/EventNodeTemplate.js +++ b/js/template/node/EventNodeTemplate.js @@ -7,6 +7,7 @@ import NodeTemplate from "./NodeTemplate.js" export default class EventNodeTemplate extends NodeTemplate { static nodeStyleClasses = [...super.nodeStyleClasses, "ueb-node-style-event"] + #delegatePinElement /** @param {PropertyValues} changedProperties */ firstUpdated(changedProperties) { @@ -38,21 +39,31 @@ export default class EventNodeTemplate extends NodeTemplate { ` } + getPinElements() { + return this.element.getPinElements().filter(v => v.entity.PinType.PinCategory?.toString() !== "delegate") + } + createDelegatePinElement() { - const pin = /** @type {PinElementConstructor} */(ElementFactory.getConstructor("ueb-pin")).newObject( - this.element.getPinEntities().find(v => !v.isHidden() && v.PinType.PinCategory?.toString() === "delegate"), - new MinimalPinTemplate(), - this.element - ) - pin.template.isNameRendered = false - return pin + if (!this.#delegatePinElement) { + this.#delegatePinElement = /** @type {PinElementConstructor} */(ElementFactory.getConstructor("ueb-pin")) + .newObject( + this.element.getPinEntities().find(v => !v.isHidden() && v.PinType.PinCategory?.toString() === "delegate"), + new MinimalPinTemplate(), + this.element + ) + this.#delegatePinElement.template.isNameRendered = false + } + return this.#delegatePinElement } createPinElements() { - return this.element.getPinEntities() - .filter(v => !v.isHidden() && v.PinType.PinCategory?.toString() !== "delegate") - .map(pinEntity => /** @type {PinElementConstructor} */(ElementFactory.getConstructor("ueb-pin")) - .newObject(pinEntity, undefined, this.element) - ) + return [ + this.createDelegatePinElement(), + ...this.element.getPinEntities() + .filter(v => !v.isHidden() && v.PinType.PinCategory?.toString() !== "delegate") + .map(pinEntity => /** @type {PinElementConstructor} */(ElementFactory.getConstructor("ueb-pin")) + .newObject(pinEntity, undefined, this.element) + ) + ] } } diff --git a/js/template/node/KnotNodeTemplate.js b/js/template/node/KnotNodeTemplate.js index fcb2119..0d06f6e 100644 --- a/js/template/node/KnotNodeTemplate.js +++ b/js/template/node/KnotNodeTemplate.js @@ -54,17 +54,9 @@ export default class KnotNodeTemplate extends NodeTemplate { } setupPins() { - this.element.getPinElements().forEach( - p => /** @type {HTMLElement} */(this.element.querySelector(".ueb-node-border")).appendChild(p) - ) - } - - /** - * @param {NodeElement} node - * @returns {NodeListOf} - */ - getPinElements(node) { - return node.querySelectorAll("ueb-pin") + for (const p of this.getPinElements()) { + /** @type {HTMLElement} */(this.element.querySelector(".ueb-node-border")).appendChild(p) + } } createPinElements() { diff --git a/js/template/node/NodeTemplate.js b/js/template/node/NodeTemplate.js index 2ac331d..e9e474a 100755 --- a/js/template/node/NodeTemplate.js +++ b/js/template/node/NodeTemplate.js @@ -1,7 +1,7 @@ import { html, nothing } from "lit" -import SVGIcon from "../../SVGIcon.js" -import Utility from "../../Utility.js" +import nodeSubtitle from "../../decoding/nodeSubtitle.js" import ElementFactory from "../../element/ElementFactory.js" +import SVGIcon from "../../SVGIcon.js" import ISelectableDraggableTemplate from "../ISelectableDraggableTemplate.js" /** @extends {ISelectableDraggableTemplate} */ @@ -9,7 +9,7 @@ export default class NodeTemplate extends ISelectableDraggableTemplate { static nodeStyleClasses = ["ueb-node-style-default"] - #hasSubtitle = false + #subtitle /** @type {() => PinEntity} */ pinInserter @@ -55,6 +55,7 @@ export default class NodeTemplate extends ISelectableDraggableTemplate { /** @param {NodeElement} element */ initialize(element) { super.initialize(element) + this.#subtitle = nodeSubtitle(element.entity) this.element.classList.add(.../** @type {typeof NodeTemplate} */(this.constructor).nodeStyleClasses) this.element.style.setProperty("--ueb-node-color", this.getColor().cssText) this.pinInserter = this.element.entity.additionalPinInserter() @@ -113,10 +114,8 @@ export default class NodeTemplate extends ISelectableDraggableTemplate { ${name ? html`
${name} - ${this.#hasSubtitle && this.getTargetType().length > 0 ? html` -
- Target is ${Utility.formatStringName(this.getTargetType())} -
+ ${this.#subtitle ? html` +
${this.#subtitle}
`: nothing}
` : nothing} @@ -137,7 +136,7 @@ export default class NodeTemplate extends ISelectableDraggableTemplate { this.element.nodeNameElement = /** @type {HTMLElement} */(this.element.querySelector(".ueb-node-name-text")) let hasInput = false let hasOutput = false - for (const p of this.element.getPinElements()) { + for (const p of this.getPinElements()) { if (p === this.defaultPin) { continue } @@ -160,26 +159,14 @@ export default class NodeTemplate extends ISelectableDraggableTemplate { } } + getPinElements() { + return this.element.getPinElements() + } + createPinElements() { return this.element.getPinEntities() .filter(v => !v.isHidden()) - .map(pinEntity => { - this.#hasSubtitle = this.#hasSubtitle - || pinEntity.PinName.toString() === "self" && pinEntity.pinTitle() === "Target" - return this.createPinElement(pinEntity) - }) - } - - getTargetType() { - return this.element.entity.FunctionReference?.MemberParent?.getName() ?? "Untitled" - } - - /** - * @param {NodeElement} node - * @returns {NodeListOf} - */ - getPinElements(node) { - return node.querySelectorAll("ueb-pin") + .map(pinEntity => this.createPinElement(pinEntity)) } linksChanged() { } diff --git a/js/template/pin/PinTemplate.js b/js/template/pin/PinTemplate.js index 8d574fc..b527578 100755 --- a/js/template/pin/PinTemplate.js +++ b/js/template/pin/PinTemplate.js @@ -110,12 +110,12 @@ export default class PinTemplate extends ITemplate { return SVGIcon.pcgStackPin } } - switch (this.element.entity.PinType?.ContainerType?.serialize()) { + switch (this.element.entity.PinType.ContainerType?.toString()) { case "Array": return SVGIcon.arrayPin case "Set": return SVGIcon.setPin case "Map": return SVGIcon.mapPin } - if (this.element.entity.PinType?.PinCategory?.toString().toLocaleLowerCase() === "delegate") { + if (this.element.entity.PinType.PinCategory?.toString().toLocaleLowerCase() === "delegate") { return SVGIcon.delegate } if (this.element.nodeElement?.template instanceof VariableOperationNodeTemplate) { diff --git a/scss/ueb-pin.scss b/scss/ueb-pin.scss index 7200b5d..9dee905 100644 --- a/scss/ueb-pin.scss +++ b/scss/ueb-pin.scss @@ -85,11 +85,6 @@ ueb-pin[data-connectable="false"] .ueb-pin-icon { visibility: hidden; } -.ueb-node-style-event ueb-pin[data-type="delegate"] .ueb-pin-icon { - width: 11px; - height: 11px; -} - .ueb-node-inputs .ueb-pin-icon { margin-right: 6px; } diff --git a/tests/issues.spec.js b/tests/issues.spec.js new file mode 100644 index 0000000..e1ab2b3 --- /dev/null +++ b/tests/issues.spec.js @@ -0,0 +1,53 @@ +import { expect, test } from "./fixtures/test.js" + + +test.beforeEach(async ({ blueprintPage }) => { + await blueprintPage.removeNodes() +}) + +test("Issue 27", async ({ blueprintPage }) => { + await blueprintPage.paste(String.raw` + Begin Object Class=/Script/BlueprintGraph.K2Node_CustomEvent Name="K2Node_CustomEvent_0" ExportPath="/Script/BlueprintGraph.K2Node_CustomEvent'/Game/Examples/BallShooter/Blueprints/BallShooterEnvironment.BallShooterEnvironment:EventGraph.K2Node_CustomEvent_0'" + CustomFunctionName="CustomEvent" + NodePosX=1984 + NodePosY=1600 + ErrorType=3 + NodeGuid=8955D806490FF62840F229BD64AC0F8B + CustomProperties Pin (PinId=DA10B1984E92B126FB09CE9D0F767D2E,PinName="OutputDelegate",Direction="EGPD_Output",PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent="/Script/Engine.BlueprintGeneratedClass'/Game/Examples/BallShooter/Blueprints/BallShooterEnvironment.BallShooterEnvironment_C'",MemberName="CustomEvent",MemberGuid=8955D806490FF62840F229BD64AC0F8B),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Knot_7 6014BE7344D4B71DCD1CC39ACD1DB9EE,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=A52A36F047563A99081BB3ADC0C688CB,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=E88FACB54D1595FDCF2A0BAABA7969CE,PinName="Actor",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.Actor'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=8183CC924CB230BE8E6DE1963A4145BE,PinName="EndPlayReason",Direction="EGPD_Output",PinType.PinCategory="byte",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Enum'/Script/Engine.EEndPlayReason'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="Destroyed",AutogeneratedDefaultValue="Destroyed",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties UserDefinedPin (PinName="Actor",PinType=(PinCategory="object",PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.Actor'"),DesiredPinDirection=EGPD_Output) + CustomProperties UserDefinedPin (PinName="EndPlayReason",PinType=(PinCategory="byte",PinSubCategoryObject="/Script/CoreUObject.Enum'/Script/Engine.EEndPlayReason'"),DesiredPinDirection=EGPD_Output,PinDefaultValue="Destroyed") + End Object + Begin Object Class=/Script/BlueprintGraph.K2Node_AssignDelegate Name="K2Node_AssignDelegate_0" ExportPath="/Script/BlueprintGraph.K2Node_AssignDelegate'/Game/Examples/BallShooter/Blueprints/BallShooterEnvironment.BallShooterEnvironment:EventGraph.K2Node_AssignDelegate_0'" + DelegateReference=(MemberParent="/Script/CoreUObject.Class'/Script/Engine.Actor'",MemberName="OnEndPlay") + NodePosX=2240 + NodePosY=1584 + NodeGuid=AD2E460940AE6B07C5FE518E111B2909 + CustomProperties Pin (PinId=86FA158D4EBB8E99A0063BBFB5CAFA7D,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=98DFCE7B49E479343BD765BE8D9CF13A,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=9EEC18F94EE45E5F2DEBCC950A1059E7,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "BaseMCDelegateSelfPinName", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.Actor'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=3C0089524CDDA9E63853BEA28156FACD,PinName="Delegate",PinFriendlyName=NSLOCTEXT("K2Node", "PinFriendlyDelegatetName", "Event"),PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent="/Script/CoreUObject.Package'/Script/Engine'",MemberName="ActorEndPlaySignature__DelegateSignature"),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=True,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Knot_7 424DC49B456B27D825A8F690E6CAA096,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + End Object + Begin Object Class=/Script/BlueprintGraph.K2Node_Knot Name="K2Node_Knot_7" ExportPath="/Script/BlueprintGraph.K2Node_Knot'/Game/Examples/BallShooter/Blueprints/BallShooterEnvironment.BallShooterEnvironment:EventGraph.K2Node_Knot_7'" + NodePosX=2160 + NodePosY=1648 + NodeGuid=A98222664329B5AA6D32FCBFC43C062C + CustomProperties Pin (PinId=6014BE7344D4B71DCD1CC39ACD1DB9EE,PinName="InputPin",PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent="/Script/Engine.BlueprintGeneratedClass'/Game/Examples/BallShooter/Blueprints/BallShooterEnvironment.BallShooterEnvironment_C'",MemberName="CustomEvent",MemberGuid=8955D806490FF62840F229BD64AC0F8B),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CustomEvent_0 DA10B1984E92B126FB09CE9D0F767D2E,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=True,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=424DC49B456B27D825A8F690E6CAA096,PinName="OutputPin",Direction="EGPD_Output",PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent="/Script/Engine.BlueprintGeneratedClass'/Game/Examples/BallShooter/Blueprints/BallShooterEnvironment.BallShooterEnvironment_C'",MemberName="CustomEvent",MemberGuid=8955D806490FF62840F229BD64AC0F8B),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_AssignDelegate_0 3C0089524CDDA9E63853BEA28156FACD,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + End Object + `) + const eventNode = await blueprintPage.blueprintLocator.locator("ueb-node").nth(0) + const knotNode = await blueprintPage.blueprintLocator.locator("ueb-node").nth(2) + const assignNode = await blueprintPage.blueprintLocator.locator("ueb-node").nth(1) + const pin1 = eventNode.locator("ueb-pin").nth(0) + const pin2A = knotNode.locator("ueb-pin").nth(0) + const pin2B = knotNode.locator("ueb-pin").nth(1) + const pin3 = assignNode.locator("ueb-pin").nth(2) + expect(await pin1.evaluate(/** @param {PinElement} pin */ pin => pin.isLinked)).toBeTruthy() + expect(await pin2A.evaluate(/** @param {PinElement} pin */ pin => pin.isLinked)).toBeTruthy() + expect(await pin2B.evaluate(/** @param {PinElement} pin */ pin => pin.isLinked)).toBeTruthy() + expect(await pin3.evaluate(/** @param {PinElement} pin */ pin => pin.isLinked)).toBeTruthy() + expect(await blueprintPage.blueprintLocator.locator("ueb-link")).toHaveCount(2) +}) diff --git a/tests/resources/EventNodes.js b/tests/resources/EventNodes.js index b3de0c3..867c252 100644 --- a/tests/resources/EventNodes.js +++ b/tests/resources/EventNodes.js @@ -81,9 +81,116 @@ export default class EventNodes extends NodeTests { color: Configuration.nodeColors.blue, icon: SVGIcon.node, pins: 3, - pinNames: [ - "Target", - ], + pinNames: ["Target"], + delegate: false, + development: false, + }, + { + name: "Bind Event to On Actor Hit", + value: String.raw` + Begin Object Class=/Script/BlueprintGraph.K2Node_AddDelegate Name="K2Node_AddDelegate_0" ExportPath="/Script/BlueprintGraph.K2Node_AddDelegate'/Game/Examples/MazeSolver/Blueprints/MazeSolverTrainer.MazeSolverTrainer:EventGraph.K2Node_AddDelegate_0'" + DelegateReference=(MemberParent="/Script/CoreUObject.Class'/Script/Engine.Actor'",MemberName="OnActorHit") + NodePosX=256 + NodePosY=-48 + NodeGuid=A94C879148610E75EBAC94807E94F5DD + CustomProperties Pin (PinId=252C72EA45F1370E8B00FFB6D5C87B3A,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Event_0 F135CD17D40347269BBBD101437B6AF0,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=66AE85F346F350F62B127B97DFC49563,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=D7358C004BE0EF6651DE69A7346E77D4,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "BaseMCDelegateSelfPinName", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.Actor'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_0 EDE2516A4F187C93CBF2D7AE88066240,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=180DE95D4FD5AF2404F1CB80F0FBD29E,PinName="Delegate",PinFriendlyName=NSLOCTEXT("K2Node", "PinFriendlyDelegatetName", "Event"),PinType.PinCategory="Delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent="/Script/CoreUObject.Package'/Script/Engine'",MemberName="ActorHitSignature__DelegateSignature"),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=True,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + End Object + `, + size: [13.5, 8], + color: Configuration.nodeColors.blue, + icon: SVGIcon.node, + pins: 4, + pinNames: ["Target", "Event"], + delegate: false, + development: false, + }, + { + name: "Bind Event to Modified Event Dynamic", + value: String.raw` + Begin Object Class=/Script/BlueprintGraph.K2Node_AddDelegate Name="K2Node_AddDelegate_1" ExportPath="/Script/BlueprintGraph.K2Node_AddDelegate'/Engine/Maps/Templates/NewWorld.NewWorld:PersistentLevel.NewWorld.EventGraph.K2Node_AddDelegate_1'" + DelegateReference=(MemberParent="/Script/CoreUObject.Class'/Script/Engine.AnimDataModel'",MemberName="ModifiedEventDynamic") + NodePosX=1920 + NodePosY=-384 + NodeGuid=9F798056B9CB474A9EE2FE88063D4D20 + CustomProperties Pin (PinId=4D2AF198B99A445C925AA2A8380C533E,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=46363EE0231F4EA186E029977F586416,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=D3AD4B9A6EA745BD8EC70EE4B33FDB44,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "BaseMCDelegateSelfPinName", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.AnimDataModel'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=48F1FF2C45A147C7B390B9D1A35FC3A2,PinName="Delegate",PinFriendlyName=NSLOCTEXT("K2Node", "PinFriendlyDelegatetName", "Event"),PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent="/Script/CoreUObject.Package'/Script/Engine'",MemberName="AnimDataModelModifiedDynamicEvent__DelegateSignature"),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=True,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + End Object + `, + size: [18, 8], + color: Configuration.nodeColors.blue, + icon: SVGIcon.node, + pins: 4, + pinNames: ["Target", "Event"], + delegate: false, + development: false, + }, + { + name: "Unbind all Events from On Scroll Bar Visibility Changed", + value: String.raw` + Begin Object Class=/Script/BlueprintGraph.K2Node_ClearDelegate Name="K2Node_ClearDelegate_1" ExportPath="/Script/BlueprintGraph.K2Node_ClearDelegate'/Engine/Maps/Templates/NewWorld.NewWorld:PersistentLevel.NewWorld.EventGraph.K2Node_ClearDelegate_1'" + DelegateReference=(MemberParent="/Script/CoreUObject.Class'/Script/UMG.ScrollBox'",MemberName="OnScrollBarVisibilityChanged") + NodePosX=2688 + NodePosY=-640 + NodeGuid=48B5357C4A6344B685D58484C8CA6100 + CustomProperties Pin (PinId=0186059A7F58440D9CDE09CF2E4211BE,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=CB57C7A59EC4491EAC932C4AF3B43254,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=C088A6049D2C4A238885632C5D33C490,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "BaseMCDelegateSelfPinName", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/UMG.ScrollBox'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + End Object + `, + size: [24, 6], + color: Configuration.nodeColors.blue, + icon: SVGIcon.node, + pins: 3, + pinNames: ["Target"], + delegate: false, + development: false, + }, + { + name: "Unbind Event from On Pre Initialize", + value: String.raw` + Begin Object Class=/Script/BlueprintGraph.K2Node_RemoveDelegate Name="K2Node_RemoveDelegate_0" ExportPath="/Script/BlueprintGraph.K2Node_RemoveDelegate'/Engine/Maps/Templates/NewWorld.NewWorld:PersistentLevel.NewWorld.EventGraph.K2Node_RemoveDelegate_0'" + DelegateReference=(MemberParent="/Script/CoreUObject.Class'/Script/ControlRig.ControlRigComponent'",MemberName="OnPreInitializeDelegate") + NodePosX=2688 + NodePosY=-512 + NodeGuid=68504A8520394A2F9B8AACFD2F457D9E + CustomProperties Pin (PinId=1D7D2FBFEB344721B4EE9D149F615BBD,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=2AB22AF068E943BEB99DAAE276EA0C9A,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=42FC9475607C479097689D14713CCC43,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "BaseMCDelegateSelfPinName", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/ControlRig.ControlRigComponent'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=7729342B171248D8A6EF908ED8E1D8B7,PinName="Delegate",PinFriendlyName=NSLOCTEXT("K2Node", "PinFriendlyDelegatetName", "Event"),PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent="/Script/CoreUObject.Package'/Script/ControlRig'",MemberName="ControlRigComponentDelegate__DelegateSignature"),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=True,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + End Object + `, + size: [16.5, 8], + color: Configuration.nodeColors.blue, + icon: SVGIcon.node, + pins: 4, + pinNames: ["Target", "Event"], + delegate: false, + development: false, + }, + { + name: "Bind Event to On Pre Initialize", + value: String.raw` + Begin Object Class=/Script/BlueprintGraph.K2Node_AddDelegate Name="K2Node_AddDelegate_4" ExportPath="/Script/BlueprintGraph.K2Node_AddDelegate'/Engine/Maps/Templates/NewWorld.NewWorld:PersistentLevel.NewWorld.EventGraph.K2Node_AddDelegate_4'" + DelegateReference=(MemberParent="/Script/CoreUObject.Class'/Script/ControlRig.ControlRigComponent'",MemberName="OnPreInitializeDelegate") + NodePosX=1760 + NodePosY=-688 + NodeGuid=12A5D8F5736842F7B70C88C26D36B422 + CustomProperties Pin (PinId=CF6740C1F0A4487E91E6C33CA32F78B7,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=AD533F241A0B44A68FCDFDFE2F698A95,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=6E432C9EE60143F4890F0BDC6BCF4637,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "BaseMCDelegateSelfPinName", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/ControlRig.ControlRigComponent'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + CustomProperties Pin (PinId=8C762AAFD03F4B89A4150D17A3C20598,PinName="Delegate",PinFriendlyName=NSLOCTEXT("K2Node", "PinFriendlyDelegatetName", "Event"),PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent="/Script/CoreUObject.Package'/Script/ControlRig'",MemberName="ControlRigComponentDelegate__DelegateSignature"),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=True,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) + End Object + `, + size: [15, 8], + color: Configuration.nodeColors.blue, + icon: SVGIcon.node, + pins: 4, + pinNames: ["Target", "Event"], delegate: false, development: false, },