diff --git a/glue/crumble/README.md b/glue/crumble/README.md
index f3b0d61c..7fa4b1fb 100644
--- a/glue/crumble/README.md
+++ b/glue/crumble/README.md
@@ -116,15 +116,15 @@ button (now labelled "Hide Import/Export") again.
- `escape`: Unselect. Set current selection to the empty set.
- `delete`: Delete gates at current selection.
- `backspace`: Delete gates at current selection.
-- `ctrl+delete`: Delete current circuit layer.
+- `ctrl+delete` or `cmd+delete`: Delete current circuit layer.
- `ctrl+backspace`: Delete current circuit layer.
-- `ctrl+insert`: Insert empty layer at current circuit layer, pushing current circuit layer ahead in time.
-- `ctrl+z`: Undo
-- `ctrl+y`: Redo
-- `ctrl+shift+z`: Redo
-- `ctrl+c`: Copy selection to clipboard (or entire layer if nothing selected).
-- `ctrl+v`: Past clipboard contents at current selection (or entire layer if nothing selected).
-- `ctrl+x`: Cut selection to clipboard (or entire layer if nothing selected).
+- `ctrl+insert` or `cmd+enter`: Insert empty layer at current circuit layer, pushing current circuit layer ahead in time.
+- `ctrl+z` or `cmd+z`: Undo
+- `ctrl+y` or `cmd+y`: Redo
+- `ctrl+shift+z` or `cmd+shift+z`: Redo
+- `ctrl+c` or `cmd+c`: Copy selection to clipboard (or entire layer if nothing selected).
+- `ctrl+v` or `cmd+v`: Paste clipboard contents at current selection (or entire layer if nothing selected).
+- `ctrl+x` or `cmd+x`: Cut selection to clipboard (or entire layer if nothing selected).
- `f`: Reverse direction of selected two qubit gates (e.g. exchange the controls and targets of a CNOT).
- `g`: Reverse order of circuit layers, from the current layer to the next empty layer.
- `home`: Jump to the first layer of the circuit.
diff --git a/glue/crumble/crumble.html b/glue/crumble/crumble.html
index ebb6189a..5415f119 100644
--- a/glue/crumble/crumble.html
+++ b/glue/crumble/crumble.html
@@ -118,8 +118,8 @@
Clear Selected Marks (space)
- Redo (ctrl+Y)
- Undo (ctrl+Z)
+ Redo (ctrl/cmd+Y)
+ Undo (ctrl/cmd+Z)
Next Layer (e)
@@ -134,8 +134,8 @@
Clear Timeline Focus
- Insert Layer (ctrl+insert)
- Delete Layer (ctrl+delete)
+ Insert Layer (ctrl+insert or cmd+enter)
+ Delete Layer (ctrl/cmd+delete)
diff --git a/glue/crumble/keyboard/toolbox.js b/glue/crumble/keyboard/toolbox.js
index 0334b2f7..557064df 100644
--- a/glue/crumble/keyboard/toolbox.js
+++ b/glue/crumble/keyboard/toolbox.js
@@ -14,7 +14,7 @@ let DEF_ROW = [1, 2, 2, 2, 2, 0, 2, 2, 2, -1, -1, -1];
* @returns {undefined|!{row: !int, strength: !number}}
*/
function getFocusedRow(ev) {
- if (ev.ctrlKey) {
+ if (ev.ctrlKey || ev.metaKey) {
return undefined;
}
let hasX = +ev.chord.has('x');
@@ -36,7 +36,7 @@ function getFocusedRow(ev) {
* @returns {undefined|!{col: !int, strength: !number}}
*/
function getFocusedCol(ev) {
- if (ev.ctrlKey) {
+ if (ev.ctrlKey || ev.metaKey) {
return undefined;
}
let best = undefined;
diff --git a/glue/crumble/main.js b/glue/crumble/main.js
index 6a14d452..6c0cd979 100644
--- a/glue/crumble/main.js
+++ b/glue/crumble/main.js
@@ -197,7 +197,7 @@ editorState.canvas.addEventListener('mouseup', ev => {
editorState.mouseDownY = undefined;
editorState.curMouseX = ev.offsetX + OFFSET_X;
editorState.curMouseY = ev.offsetY + OFFSET_Y;
- editorState.changeFocus(highlightedArea, ev.shiftKey, ev.ctrlKey);
+ editorState.changeFocus(highlightedArea, ev.shiftKey, ev.ctrlKey || ev.metaKey);
if (ev.buttons === 1) {
isInScrubber = false;
}
@@ -222,17 +222,8 @@ function makeChordHandlers() {
res.set('ctrl+shift+z', preview => { if (!preview) editorState.redo() });
res.set('ctrl+c', async preview => { await copyToClipboard(); });
res.set('ctrl+v', pasteFromClipboard);
- res.set('ctrl+x', async preview => {
- await copyToClipboard();
- if (editorState.focusedSet.size === 0) {
- let c = editorState.copyOfCurCircuit();
- c.layers[editorState.curLayer].id_ops.clear();
- c.layers[editorState.curLayer].markers.length = 0;
- editorState.commit_or_preview(c, preview);
- } else {
- editorState.deleteAtFocus(preview);
- }
- });
+ res.set('ctrl+x', cutToClipboard);
+
res.set('l', preview => {
if (!preview) {
editorState.timelineSet = new Map(editorState.focusedSet.entries());
@@ -360,6 +351,8 @@ function makeChordHandlers() {
}
let fallbackEmulatedClipboard = undefined;
+let pendingMetaPaste = false;
+let pendingMetaPasteTimeout = undefined;
async function copyToClipboard() {
let c = editorState.copyOfCurCircuit();
c.layers = [c.layers[editorState.curLayer]]
@@ -397,6 +390,19 @@ async function pasteFromClipboard(preview) {
return;
}
+ pasteTextAtFocus(text, preview);
+}
+
+/**
+ * Applies already-read clipboard text at the current focus.
+ *
+ * Text can come from navigator.clipboard for Ctrl+V, or from a browser paste
+ * event for Cmd+V. Keeping this shared avoids duplicating paste behavior.
+ *
+ * @param {!string} text
+ * @param {!boolean} preview
+ */
+function pasteTextAtFocus(text, preview) {
let pastedCircuit = Circuit.fromStimCircuit(text);
if (pastedCircuit.layers.length !== 1) {
throw new Error(text);
@@ -442,12 +448,86 @@ async function pasteFromClipboard(preview) {
editorState.commit_or_preview(newCircuit, preview);
}
+function clearPendingMetaPaste() {
+ pendingMetaPaste = false;
+ if (pendingMetaPasteTimeout !== undefined) {
+ clearTimeout(pendingMetaPasteTimeout);
+ pendingMetaPasteTimeout = undefined;
+ }
+}
+
+async function cutToClipboard(preview) {
+ await copyToClipboard();
+ if (editorState.focusedSet.size === 0) {
+ let c = editorState.copyOfCurCircuit();
+ c.layers[editorState.curLayer].id_ops.clear();
+ c.layers[editorState.curLayer].markers.length = 0;
+ editorState.commit_or_preview(c, preview);
+ } else {
+ editorState.deleteAtFocus(preview);
+ }
+}
+
const CHORD_HANDLERS = makeChordHandlers();
/**
* @param {!KeyboardEvent} ev
*/
-function handleKeyboardEvent(ev) {
+async function handleKeyboardEvent(ev) {
+ if (ev.type === 'keydown' && ev.metaKey) {
+ if (ev.repeat) {
+ ev.preventDefault();
+ editorState.chorder.handleFocusChanged();
+ return;
+ }
+
+ let key = ev.key.toLowerCase();
+
+ if (key === 'z' && !ev.shiftKey) {
+ ev.preventDefault();
+ editorState.chorder.handleFocusChanged();
+ editorState.undo();
+ return;
+ }
+ if ((key === 'z' && ev.shiftKey) || key === 'y') {
+ ev.preventDefault();
+ editorState.chorder.handleFocusChanged();
+ editorState.redo();
+ return;
+ }
+ if (key === 'c') {
+ ev.preventDefault();
+ editorState.chorder.handleFocusChanged();
+ await copyToClipboard();
+ return;
+ }
+ if (key === 'v') {
+ editorState.chorder.handleFocusChanged();
+ pendingMetaPaste = true;
+ pendingMetaPasteTimeout = setTimeout(clearPendingMetaPaste, 1000);
+ return;
+ }
+ if (key === 'x') {
+ ev.preventDefault();
+ editorState.chorder.handleFocusChanged();
+ await cutToClipboard(false);
+ return;
+ }
+ if (key === 'backspace' || key === 'delete') {
+ ev.preventDefault();
+ editorState.chorder.handleFocusChanged();
+ editorState.deleteCurLayer(false);
+ return;
+ }
+ if (key === 'enter') {
+ ev.preventDefault();
+ editorState.chorder.handleFocusChanged();
+ editorState.insertLayer(false);
+ return;
+ }
+ }
+
editorState.chorder.handleKeyEvent(ev);
+
if (ev.type === 'keydown') {
if (ev.key.toLowerCase() === 'q') {
let d = ev.shiftKey ? 5 : 1;
@@ -511,6 +591,20 @@ function handleKeyboardEvent(ev) {
}
}
+document.addEventListener('paste', ev => {
+ if (!pendingMetaPaste) {
+ return;
+ }
+ clearPendingMetaPaste();
+
+ let text = ev.clipboardData.getData('text/plain');
+ if (text === '') {
+ return;
+ }
+
+ ev.preventDefault();
+ pasteTextAtFocus(text, false);
+});
document.addEventListener('keydown', handleKeyboardEvent);
document.addEventListener('keyup', handleKeyboardEvent);
@@ -532,7 +626,7 @@ window.addEventListener('blur', () => {
for (let anchor of document.getElementById('examples-div').querySelectorAll('a')) {
anchor.onclick = ev => {
// Don't stop the user from e.g. opening the example in a new tab using ctrl+click.
- if (ev.shiftKey || ev.ctrlKey || ev.altKey || ev.button !== 0) {
+ if (ev.shiftKey || ev.ctrlKey || ev.metaKey || ev.altKey || ev.button !== 0) {
return undefined;
}
let circuitText = anchor.href.split('#circuit=')[1];
diff --git a/src/stim/diagram/crumble_data.cc b/src/stim/diagram/crumble_data.cc
index 0d11b307..9ebe87ca 100644
--- a/src/stim/diagram/crumble_data.cc
+++ b/src/stim/diagram/crumble_data.cc
@@ -243,9 +243,9 @@ std::string stim_draw_internal::make_crumble_html() {
)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(
)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART( Redo (ctrl+Y)
+ result.append(R"CRUMBLE_PART( Redo (ctrl/cmd+Y)
)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART( Undo (ctrl+Z)
+ result.append(R"CRUMBLE_PART( Undo (ctrl/cmd+Z)
)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(
)CRUMBLE_PART");
@@ -275,9 +275,9 @@ std::string stim_draw_internal::make_crumble_html() {
)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(
)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART( Insert Layer (ctrl+insert)
+ result.append(R"CRUMBLE_PART( Insert Layer (ctrl+insert or cmd+enter)
)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART( Delete Layer (ctrl+delete)
+ result.append(R"CRUMBLE_PART( Delete Layer (ctrl/cmd+delete)
)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(
)CRUMBLE_PART");
@@ -732,7 +732,7 @@ std::string stim_draw_internal::make_crumble_html() {
result.append(R"CRUMBLE_PART(fillStyle="yellow",e.fillRect(i-Rt,o-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(i-Rt,o-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√ZZ†",i,o)}),yield*A(),yield new l("C_XYZ",1,!0,!1,new Map([["X","Y"],["Z","X"]]),(t,r)=>t.j(r),(t,r)=>t.J(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("XYZ",r,t+Rt/3)}),yield new l("C_NXYZ",1,!0,!1,new Map([["X","Y"],["Z","X"]]),(t,r)=>t.j(r),(t,r)=>t.J(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("NXYZ",r,t+Rt/3)}),yield new l("C_XNYZ",1,!0,!1,new Map([["X","Y"],["Z","X"]]),(t,r)=>t.j(r),(t,r)=>t.J(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="t)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(eal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("XNYZ",r,t+Rt/3)}),yield new l("C_XYNZ",1,!0,!1,new Map([["X","Y"],["Z","X"]]),(t,r)=>t.j(r),(t,r)=>t.J(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("XYNZ",r,t+Rt/3)}),yield new l("C_ZYX",1,!0,!1,new Map([["X","Z"],["Z","Y"]]),(t,r)=>t.J(r),(t,r)=>t.j(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("ZYX",r,t+Rt/3)}),yield new l("C_ZYNX",1,!0,!1,new Map([["X","Z"],["Z","Y"]]),(t,r)=>t.J(r),(t,r)=>t.j(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillSt)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(yle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("ZYNX",r,t+Rt/3)}),yield new l("C_ZNYX",1,!0,!1,new Map([["X","Z"],["Z","Y"]]),(t,r)=>t.J(r),(t,r)=>t.j(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("ZNYX",r,t+Rt/3)}),yield new l("C_NZYX",1,!0,!1,new Map([["X","Z"],["Z","Y"]]),(t,r)=>t.J(r),(t,r)=>t.j(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("NZYX",r,t+Rt/3)})}const B=function(){var t,r=new Map;for(t of E())r.set(t.name,t);return r.set("MZ",r.get("M")),r.set("RZ",r.get("R")),)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(r.set("MRZ",r.get("MR")),r}(),H=((t=new Map).set("CNOT",{name:"CX"}),t.set("MZ",{name:"M"}),t.set("MRZ",{name:"MR"}),t.set("RZ",{name:"R"}),t.set("H_XZ",{name:"H"}),t.set("SQRT_Z",{name:"S"}),t.set("SQRT_Z_DAG",{name:"S_DAG"}),t.set("ZCX",{name:"CX"}),t.set("ZCY",{name:"CY"}),t.set("ZCZ",{name:"CZ"}),t.set("SWAPCZ",{name:"CZSWAP"}),t.set("XCZ",{name:"CX",tt:!0}),t.set("YCX",{name:"XCY",tt:!0}),t.set("YCZ",{name:"CY",tt:!0}),t.set("SWAPCX",{name:"CXSWAP",tt:!0}),t.set("CORRELATED_ERROR",{rt:!0}),t.set("DEPOLARIZE1",{rt:!0}),t.set("DEPOLARIZE2",{rt:!0}),t.set("E",{rt:!0}),t.set("ELSE_CORRELATED_ERROR",{rt:!0}),t.set("PAULI_CHANNEL_1",{rt:!0}),t.set("PAULI_CHANNEL_2",{rt:!0}),t.set("X_ERROR",{rt:!0}),t.set("I_ERROR",{rt:!0}),t.set("II_ERROR",{rt:!0}),t.set("Y_ERROR",{rt:!0}),t.set("Z_ERROR",{rt:!0}),t.set("HERALDED_ERASE",{rt:!0}),t.set("HERALDED_PAULI_CHANNEL_1",{rt:!0}),t.set("MPAD",{rt:!0}),t.set("SHIFT_COORDS",{rt:!0}),t);function k(t,r){var e,i=new Map;for(e of t){var o=r(e),a=i.get(o);void 0===a?i.set(o,[e)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(r.set("MRZ",r.get("MR")),r}(),z=((t=new Map).set("CNOT",{name:"CX"}),t.set("MZ",{name:"M"}),t.set("MRZ",{name:"MR"}),t.set("RZ",{name:"R"}),t.set("H_XZ",{name:"H"}),t.set("SQRT_Z",{name:"S"}),t.set("SQRT_Z_DAG",{name:"S_DAG"}),t.set("ZCX",{name:"CX"}),t.set("ZCY",{name:"CY"}),t.set("ZCZ",{name:"CZ"}),t.set("SWAPCZ",{name:"CZSWAP"}),t.set("XCZ",{name:"CX",tt:!0}),t.set("YCX",{name:"XCY",tt:!0}),t.set("YCZ",{name:"CY",tt:!0}),t.set("SWAPCX",{name:"CXSWAP",tt:!0}),t.set("CORRELATED_ERROR",{rt:!0}),t.set("DEPOLARIZE1",{rt:!0}),t.set("DEPOLARIZE2",{rt:!0}),t.set("E",{rt:!0}),t.set("ELSE_CORRELATED_ERROR",{rt:!0}),t.set("PAULI_CHANNEL_1",{rt:!0}),t.set("PAULI_CHANNEL_2",{rt:!0}),t.set("X_ERROR",{rt:!0}),t.set("I_ERROR",{rt:!0}),t.set("II_ERROR",{rt:!0}),t.set("Y_ERROR",{rt:!0}),t.set("Z_ERROR",{rt:!0}),t.set("HERALDED_ERASE",{rt:!0}),t.set("HERALDED_PAULI_CHANNEL_1",{rt:!0}),t.set("MPAD",{rt:!0}),t.set("SHIFT_COORDS",{rt:!0}),t);function k(t,r){var e,i=new Map;for(e of t){var o=r(e),a=i.get(o);void 0===a?i.set(o,[e)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(]):a.push(e)}return i}class U{constructor(){this.et=new Map,this.it=[]}toString(){let t="Layer {\n";t+=" id_ops {\n";for(var[r,e]of this.et.entries())t+=` ${r}: ${e}
)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(`;t+=" }\n markers {\n";for(var i of this.it)t+=` ${i}
@@ -740,25 +740,25 @@ std::string stim_draw_internal::make_crumble_html() {
result.append(R"CRUMBLE_PART(`;return t=t+" }\n"+"}"}ot(){let r=k(this.nt(),t=>{let r=t.Z.name;return(r=(r=r.startsWith("MPP:")&&!B.has(r)?"MPP":r).startsWith("SPP:")&&!B.has(r)?"SPP":r).startsWith("SPP_DAG:")&&!B.has(r)&&(r="SPP_DAG"),""!==t.tag&&(r+="["+t.tag.replace("\\","\\B").replace("\r","\\r").replace("\n","\\n").replace("]","\\C")+"]"),0{var e=t.startsWith("MARK")||t.startsWith("POLY"),i=r.startsWith("MARK")||r.startsWith("POLY");return e!==i?e[t,r.get(t)]))}st(){var t=new U;return t.et=new Map(this.et),t.it=[...this.it],t}m(){let t=0;for(var[r,e]of this.et.entries())e.R[0]===r&&(t+=e.m());return t}ht(){var t,r=["M","MX","MY","MR","MRX","MRY","MXX","MYY","MZZ","RX","RY","R"];for(t of this.et.values())if(t.Z.name.startsWith("MPP:")||-1!==r.indexOf(t.Z.name))return!0;return!1}lt(){var t,r=["M","MX","MY","MR","MRX","MRY","MXX","MYY","MZZ","RX","RY","R"];for(t of this.et.values())if(1===t.R.length&&-1)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(===r.indexOf(t.Z.name)&&0===t.m())return!0;return!1}ft(){var t,r=["MR","MRX","MRY","RX","RY","R"];for(t of this.et.values())if(-1!==r.indexOf(t.Z.name))return!0;return!1}vt(){var t,r=["M","MX","MY","MR","MRX","MRY","MXX","MYY","MZZ"];for(t of this.et.values())if(t.Z.name.startsWith("MPP:")||-1!==r.indexOf(t.Z.name))return!0;return!1}empty(){return 0===this.et.size&&0===this.it.length}ct(t){var r,e,i=new U;for(r of this.et.values())t(r)&&i.put(r);for(e of this.it)t(e)&&i.it.push(e);return i}dt(r){return this.ct(t=>!t.R.every(t=>!r(t)))}wt(e,t){var r,i,o=new Map,a=new Set;for(r of e.keys()){var n=e.get(r),s=this.et.get(r);if(void 0!==s){let r="";for(var h of s.R){a.has(h),a.add(h);let t=e.get(h);void 0===t&&(t="I"),r+=t}var l=s.p(r),f=l.startsWith("ERR:");for(let t=0;t-1===t.R.indexOf(r)),this.et.has(r)){var t,e=this.et.get(r);for(t of e.R)this.et.delete(t);return e}}Mt(r,e=void 0){this.it=this.it.filter(t=>void 0!==e&&t.Y[0]!==e||"MARKX"!==t.Z.name&&"MARKY"!==t.Z.name&&"MARKZ"!==t.Z.name||t.R[0]!==r)}put(t,r=!0){if(t.Z.i)"MARKX"!==t.Z.name&&"MARKY"!==t.Z.name&&"MARKZ"!==t.Z.name||this.Mt(t.R[0],t.Y[0]),this.it.push(t);else{for(var e of t.R)if(this.et.has(e)){if(!r)throw new Error("Collision");this.Xt(e)}for(var i of t.R)this.et.set(i,t)}}*nt(){for(var t of this.et.keys()){var r=this.et.get(t);r.R[0]===t&&(yield r)}yield*this.it}}function T(t){let r=void 0,e=void 0;for(var[i,o]of t)(void 0=)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(==r||it.Zt(f,r),(t,r)=>t.Zt(f,r),(r,e,i)=>{let o=void 0,a=void 0;for(let t=0;td){a.push("[...]");break}e=G(e,o-1),i=G(i,o-1);a.push(e+": "+i)}return`Map{${a.join(", ")}}`}if(t instanceof Set){var n,s=r,h=[];for(n of t){if(h.length>d){h.push("[...]");break}h.push(G(n,s-1))}return`Set{${h.join(", ")}}`}if(void 0!==t[Symbol.iterator]){var l,f=r,v=[])CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(;for(l of t){if(v.length>d){v.push("[...]");break}v.push(G(l,f-1))}return`${t=Array.isArray(t)?"":t.constructor.name}[${v.join(", ")}]`}}function K(t,r){try{var e=String(t);if(e!==g)return e}catch{}var i=t,o=r,a=[];for(s in i)if(i.hasOwnProperty(s)){if(a.length>d){a.push("[...]");break}var n=i[s],s=G(s,o-1),n=G(n,o-1);a.push(s+": "+n)}return void 0===i.constructor?"[an unknown non-primitive value with no constructor]":(e=(e=i.constructor.name)==={}.constructor.name?"":`(Type: ${e})`)+`{${a.join(", ")}}`}function G(t,r=P){return(null===(e=t)?"null":void 0===e?"undefined":"string"==typeof e?`"${e}"`:"number"==typeof e?""+e:void 0)||z(t,r)||K(t,r);var e}function Q(t){let r=[];var e,i=()=>{""!==o&&(r.push(o),o="")};let o="";for(e of t)" "===e?i():"*"===e?(i(),r.push("*")):o+=e;return i(),r}function $(e){var t=[];let i=0;for(;ie.length)throw Error(`Dangling combiner in ${e}.`);var o=[];for(let t=i;tt.Zt(f,r),(t,r)=>t.Zt(f,r),(r,e,i)=>{let o=void 0,a=void 0;for(let t=0;td){a.push("[...]");break}e=G(e,o-1),i=G(i,o-1);a.push(e+": "+i)}return`Map{${a.join(", ")}}`}if(t instanceof Set){var n,s=r,h=[];for(n of t){if(h.length>d){h.push("[...]");break}h.push(G(n,s-1))}return`Set{${h.join(", ")}}`}if(void 0!==t[Symbol.iterator]){var l,f=r,v=[])CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(;for(l of t){if(v.length>d){v.push("[...]");break}v.push(G(l,f-1))}return`${t=Array.isArray(t)?"":t.constructor.name}[${v.join(", ")}]`}}function K(t,r){try{var e=String(t);if(e!==g)return e}catch{}var i=t,o=r,a=[];for(s in i)if(i.hasOwnProperty(s)){if(a.length>d){a.push("[...]");break}var n=i[s],s=G(s,o-1),n=G(n,o-1);a.push(s+": "+n)}return void 0===i.constructor?"[an unknown non-primitive value with no constructor]":(e=(e=i.constructor.name)==={}.constructor.name?"":`(Type: ${e})`)+`{${a.join(", ")}}`}function G(t,r=P){return(null===(e=t)?"null":void 0===e?"undefined":"string"==typeof e?`"${e}"`:"number"==typeof e?""+e:void 0)||H(t,r)||K(t,r);var e}function Q(t){let r=[];var e,i=()=>{""!==o&&(r.push(o),o="")};let o="";for(e of t)" "===e?i():"*"===e?(i(),r.push("*")):o+=e;return i(),r}function $(e){var t=[];let i=0;for(;ie.length)throw Error(`Dangling combiner in ${e}.`);var o=[];for(let t=i;tt.Yt(f,r),(t,r)=>t.Yt(f,r),(r,e,i)=>{let o=void 0,a=void 0;for(let t=0;tt instanceof U))throw new Error("!layers.every(e => e instanceof Layer)");this.Rt=t,this.yt=r}static It(t){t=t.replaceAll(";","\n").replaceAll("#!pragma ERR","ERR").replaceAll("#!pragma MARK","MARK").replaceAll("#!pragma POLYGON","POLYGON").replaceAll("_"," ").replaceAll("Q(","QUBIT_COORDS(").replaceAll("DT","DETECTOR").replaceAll("OI","OBSERVABLE_INCLUDE").replaceAll(" COORDS","_COORDS").replaceAll(" ERROR","_ERROR").replaceAll("C XYZ","C_)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(,n,s,o,a),o=n,a=s}for(let t=0;tt instanceof U))throw new Error("!layers.every(e => e instanceof Layer)");this.Rt=t,this.yt=r}static It(t){t=t.replaceAll(";","\n").replaceAll("#!pragma ERR","ERR").replaceAll("#!pragma MARK","MARK").replaceAll("#!pragma POLYGON","POLYGON").replaceAll("_"," ").replaceAll("Q(","QUBIT_COORDS(").replaceAll("DT","DETECTOR").replaceAll("OI","OBSERVABLE_INCLUDE").replaceAll(" COORDS","_COORDS").replaceAll(" ERROR","_ERROR").replaceAll("C XYZ","C_)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(XYZ").replaceAll("C NXYZ","C_NXYZ").replaceAll("C XNYZ","C_XNYZ").replaceAll("C XYNZ","C_XYNZ").replaceAll("H XY","H_XY").replaceAll("H XZ","H_XZ").replaceAll("H YZ","H_YZ").replaceAll("H NXY","H_NXY").replaceAll("H NXZ","H_NXZ").replaceAll("H NYZ","H_NYZ").replaceAll(" INCLUDE","_INCLUDE").replaceAll("SQRT ","SQRT_").replaceAll(" DAG ","_DAG ").replaceAll("C ZYX","C_ZYX").replaceAll("C NZYX","C_NZYX").replaceAll("C ZNYX","C_ZNYX").replaceAll("C ZYNX","C_ZYNX").split("\n");let T=[new U],N=0,D=new Map,x=new Set,s=(e,i,o,r)=>{T[T.length-1].empty()||T.push(new U);for(let t=0;t{let o=0;for(let r=t;r{let a=[],n=[],e="",s="",t=o.indexOf(" "),r=o.indexOf("("),i=o.indexOf("["),h)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(=o.indexOf("]");if(i!==-1&&t!==-1&&ti){e=o.substring(i+1,h).replaceAll("\\C","]").replaceAll("\\r","\r").replaceAll("\\n","\n").replaceAll("\\B","\\");o=o.substring(0,i)+" "+o.substring(h+1)}if(o.indexOf(")")!==-1){let[t,r]=o.split(")");let[e,i]=t.split("(");s=e.trim();a=i.split(",").map(t=>t.trim()).map(parseFloat);n=Q(r)}else{let t=o.split(" ").map(t=>t.trim()).filter(t=>t!=="");if(t.length===0)return;let[r,...e]=t;s=r.trim();a=[];n=e.flatMap(Q)}let l=false;if(""!==s){0i){e=o.substring(i+1,h).replaceAll("\\C","]").replaceAll("\\r","\r").replaceAll("\\n","\n").replaceAll("\\B","\\");o=o.substring(0,i)+" "+o.substring(h+1)}if(o.indexOf(")")!==-1){let[t,r]=o.split(")");let[e,i]=t.split("(");s=e.trim();a=i.split(",").map(t=>t.trim()).map(parseFloat);n=Q(r)}else{let t=o.split(" ").map(t=>t.trim()).filter(t=>t!=="");if(t.length===0)return;let[r,...e]=t;s=r.trim();a=[];n=e.flatMap(Q)}let l=false;if(""!==s){0=L.length)return console.warn("Ignoring instruction due to out of range record target: "+o);var Y=L[Z];T[Y.bt].it.push(new F(B.get(s),e,new Float32Array([X]),new Uint32Array([Y._t[0]])))}return N+=u}if("SPP"===s||"SPP_DAG"===s){var R="SPP_DAG"===s,y=$(n),m;let r=T[T.length-1];for(m of y)try{r.put(W(e,new Float32Array(a),R,m),!1)}catch(t){T.push(new U),(r=T[T.length-1]).put(W(e,new Float32Array(a),R,m),!1)}return}if(s.startsWith("QUBIT_COORDS")){var p=a.length<1?0:a[0],I=a.length<2?0:a[1],b;for(b of n){var _=parseInt(b);D.has(_)?console.warn(`Ignoring "${o}" because there's already coordinate data for qubit ${_}.`):x.has(p+","+I)?console.warn(`Ignoring "${o}" because there's already a qubit placed at ${p},${I}.`):(D.set(_,[p,I]),x)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(.add(p+","+I))}return}}let t=!1;for(v of n)if(v.startsWith("rec["))"CX"!==s&&"CY"!==s&&"CZ"!==s&&"ZCX"!==s&&"ZCY"!==s||(t=!0);else if("number"!=typeof parseInt(v))throw new Error(o);if(t){var A=[];for(let t=0;t{let r=!0;for(;!D.has(t);){var e=r?t:o,i=e+",0";x.has(i)||(x.add(i),D.set(t,[e,0])),o+=!r,r=!1}};for(r of T)for(var i of r.nt())for(var a of i.R)e(a);var n=Math.max(...D.keys(),0)+1,h=new Float64Array(2*n);for(let t=0;t[t-r,t+r])}gt(){var t,r,e=new Map;for(let t=0;t1/256;)s/=2;let h;if(s<=1/256)h=1;else{h=1/s;let t=0;for(var[l,f]of e.values()){var v=(l-a+f-n)%(2*s),l=(l-a-f+n)%(2*s);t=t|(0==v?1:2)|(0==l?4:8)}5===t?h/=2:10===t&&(a-=s,h/=2)}let c=-a,d=-n;return(t,r)=>[)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART((t+c)*h,(r+d)*h]}St(){return this.kt(this.gt())}Ct(e,i){return this.kt((t,r)=>[t+e,r+i])}st(){return this.Ct(0,0)}kt(r){var e=new Float64Array(this.Rt.length);for(let t=0;tt.st());return new u(e,t)}Pt(r){var e=new Map;for(let t=0;tr-t),u=w.Tt.join(":"),Z.has(u)||(Z.add(u),Y.push(w)));for([X,M]of f.entries())(M=[...new Set(M)]).sort((t,r)=>r-t),f.set(X,M);return Y.sort((t,r)=>t.Tt[0]-r.Tt[0]),{Nt:Y,Dt:f}}xt(){var t,r=new Set;for(t of this.yt)for(var N of t.nt())for(var D of N.R)r.add(D);var{Nt:a,Dt:e}=this.Pt(!0);a.reverse();let n=0;var i,s=this.m(),o=[];for(i of r){var x=this.Rt[2*i],L=this.Rt[2*i+1];o.push({Lt:i,x:x,y:L})}o.sort((t,r)=>t.x!==r.x?t.x-r.x:t.y!==r.y?t.y-r.y:t.Lt-r.Lt);var h=new Map,l=[];for(let t=0;t=g.length&&(t=0,i+=1),e=`DETECTOR(${g[t]}, ${S[t]}, ${i})`,X.has(e);t++);X.add(e);var O,T=[e];for(O of A.Tt)T.push(`rec[${O+E}]`);l.push(T.join(" ")),o=Math.max(o,i+1)}f=o;for([w,u]of[...e.entries()]){var K=s-n;if(!(0<=u[0]+K)){e.delete(w);var Q,$=[`OBSERVABLE_INCLUDE(${w})`];for(Q of u)$.push(`rec[${Q+K}]`);l.push($.join(" "))}}l.push("TICK")}for(;0t.st()))}Ut(){var r=new Map;for(let t=0;t!(e instanceof t))){var s=t,h=r;if(s.length!==h.length)return!1;for(let t=0;t{let r=!0;for(;!D.has(t);){var e=r?t:o,i=e+",0";x.has(i)||(x.add(i),D.set(t,[e,0])),o+=!r,r=!1}};for(r of T)for(var i of r.nt())for(var a of i.R)e(a);var n=Math.max(...D.keys(),0)+1,h=new Float64Array(2*n);for(let t=0;t[t-r,t+r])}gt(){var t,r,e=new Map;for(let t=0;t1/256;)s/=2;let h;if(s<=1/256)h=1;else{h=1/s;let t=0;for(var[l,f]of e.values()){var v=(l-a+f-n)%(2*s),l=(l-a-f+n)%(2*s);t=t|(0==v?1:2)|(0==l?4:8)}5===t?h/=2:10===t&&(a-=s,h/=2)}let c=-a,d=-n;return(t,r)=>[)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART((t+c)*h,(r+d)*h]}St(){return this.kt(this.gt())}Ct(e,i){return this.kt((t,r)=>[t+e,r+i])}st(){return this.Ct(0,0)}kt(r){var e=new Float64Array(this.Rt.length);for(let t=0;tt.st());return new w(e,t)}Pt(r){var e=new Map;for(let t=0;tr-t),u=w.Tt.join(":"),Z.has(u)||(Z.add(u),Y.push(w)));for([X,M]of f.entries())(M=[...new Set(M)]).sort((t,r)=>r-t),f.set(X,M);return Y.sort((t,r)=>t.Tt[0]-r.Tt[0]),{Nt:Y,Dt:f}}xt(){var t,r=new Set;for(t of this.yt)for(var N of t.nt())for(var D of N.R)r.add(D);var{Nt:a,Dt:e}=this.Pt(!0);a.reverse();let n=0;var i,s=this.m(),o=[];for(i of r){var x=this.Rt[2*i],L=this.Rt[2*i+1];o.push({Lt:i,x:x,y:L})}o.sort((t,r)=>t.x!==r.x?t.x-r.x:t.y!==r.y?t.y-r.y:t.Lt-r.Lt);var h=new Map,l=[];for(let t=0;t=g.length&&(t=0,i+=1),e=`DETECTOR(${g[t]}, ${S[t]}, ${i})`,X.has(e);t++);X.add(e);var O,T=[e];for(O of A.Tt)T.push(`rec[${O+E}]`);l.push(T.join(" ")),o=Math.max(o,i+1)}f=o;for([w,u]of[...e.entries()]){var K=s-n;if(!(0<=u[0]+K)){e.delete(w);var Q,$=[`OBSERVABLE_INCLUDE(${w})`];for(Q of u)$.push(`rec[${Q+K}]`);l.push($.join(" "))}}l.push("TICK")}for(;0t.st()))}Ut(){var r=new Map;for(let t=0;t!(e instanceof t))){var s=t,h=r;if(s.length!==h.length)return!1;for(let t=0;t{performance.now(){this.er="idle",this.ir=-1/0,this.sr()},e)}}class i{constructor(t){this.hr=t}subscribe(t){return this.hr(t)}static of(...e){return new i(t=>{for(var r of e)t(r);return()=>{}})}lr(){let r=[];return this.subscribe(t=>r.push(t))(),r}map(e){return new i(r=>this.subscribe(t=>r(e(t))))}filter(e){return new i(r=>this.subscribe(t=>{e(t)&&r(t)}))}vr(s,h){return new i(r=>{)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(let e=!1,i=!1,o,a,t=this.subscribe(t=>{o=t,e=!0,i&&r(h(o,a))}),n=s.subscribe(t=>{a=t,i=!0,e&&r(h(o,a))});return()=>{t(),n()}})}static cr(){return new i(t=>{let r,e=!1;return(r=()=>{e||(t(void 0),window.requestAnimationFrame(r))})(),()=>{e=!0}})}dr(){return new i(e=>{let i=()=>{},o=!1,t=this.subscribe(t=>{var r;o||(r=i,i=t.subscribe(e),r())});return()=>{o=!0,i(),t()}})}wr(r){return this.map(t=>(r(t),t))}ur(){return new i(r=>{let e=[];return e.push(this.subscribe(t=>e.push(t.subscribe(r)))),()=>{for(var t of e)t()}})}Xr(a){return new i(t=>{let r=void 0,e=!1,i=new at(()=>{e||t(r)},a),o=this.subscribe(t=>{r=t,i.sr()});return()=>{e=!0,o()}})}static Mr(r,e){return new i(t=>(r.addEventListener(e,t),()=>r.removeEventListener(e,t)))}Zr(t){return new i(r=>{let e=t;return this.subscribe(t=>{0t===r);return new i(r=>{let e=!1,i=void 0;return this.subscribe(t=>{e&&o(i,t)||(i=t,e=!0,r(t))})})}}class nt{constructor(){this.Rr=[],this.yr=new i(t=>{this.Rr.push(t);let r=!1;return()=)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(>{r||(r=!0,this.Rr.splice(this.Rr.indexOf(t),1))}})}mr(){return this.yr}send(t){for(var r of this.Rr)r(t)}}class st{constructor(t=void 0){this.pr=t,this.Ir=new nt,this.yr=new i(t=>(t(this.pr),this.Ir.mr().subscribe(t)))}mr(){return this.yr}set(t){this.pr=t,this.Ir.send(t)}get(){return this.pr}}class ht{constructor(t,r,e){if(r<0||r>=t.length)throw new Error("Bad index: "+{history:t,index:r,br:e});if(!Array.isArray(t))throw new Error("Bad history: "+{history:t,index:r,br:e});this.history=t,this.index=r,this.br=e,this._r=new nt,this.Ar=new st(this.history[this.index])}Er(){return this._r.mr()}kr(){return this.Ar.mr()}gr(){return this.Ar.get()}static Sr(t){return new ht([t],0,!1)}Cr(){return 0===this.index&&!this.br}Pr(){return this.index===this.history.length-1}clear(t){this.history=[t],this.index=0,this.br=!1,this.Ar.set(t),this._r.send(t)}Or(t){this.br=t!==this.history[this.index],this._r.send(void 0)}Tr(){this.br=!1;var t=this.history[this.index];return this.Ar.set(t),this._r.send(t),t}commit(t){t===this.hist)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(ory[this.index]?this.Tr():(this.br=!1,this.index+=1,this.history.splice(this.index,this.history.length-this.index),this.history.push(t),this.Ar.set(t),this._r.send(t))}Nr(){if(!this.br){if(0===this.index)return;--this.index}this.br=!1;var t=this.history[this.index];return this.Ar.set(t),this._r.send(t),t}Dr(){var t;if(this.index+1!==this.history.length)return this.index+=1,this.br=!1,t=this.history[this.index],this.Ar.set(t),this._r.send(t),t}toString(){return"Revision("+G({index:this.index,count:this.history.length,Lr:this.br,head:this.history[this.index]})+")"}Gt(t){return t instanceof ht&&this.index===t.index&&this.br===t.br&&w(this.history,t.history)}}let It=32;function lt(t,e,N,o,D){var x,r=Math.floor(t.canvas.clientWidth/2),i=e.Fr();i.sort((t,r)=>{var[t,e]=o(t),[r,i]=o(r);return e!==i?e-i:t-r});let a=new Map,L=void 0,n=0,s=0,h=0,l=0;for(x of i){var[F,f]=o(x);s+=It,L!==f?(L=f,n=1.5*r,h=Math.max(h,l),l=0,s+=.25*It):(n+=.25*Rt,l++),a.set(F+","+f,[Math.round(n)+.5,Math.round(s)+.5])}let v=It+Math.ceil(Rt*h*)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(.25);var c=Math.floor(t.canvas.clientWidth/4/v);let U=e.Ur-c+1,d=Math.max(0,Math.min(U,D-2*c+1));var w=Math.min(d+2*c+2,D);let G=t=>{t-=e.Ur;return(t-=d-U)*v},u=(t,r)=>{var[t,e]=o(t);return[t,e,r]=[[t,e,r]][0],t=t+","+e,a.has(t)?([e,t]=a.get(t),[e+G(r),t]):[void 0,void 0]};t.save();try{t.clearRect(r,0,r,t.canvas.clientHeight);var H,z,K=new Map;for([H,z]of N.entries()){A=_=b=et=rt=tt=J=I=P=C=j=V=W=S=p=m=q=g=k=B=E=y=R=$=Q=Y=Z=M=X=void 0;var X=t,M=u,Z=z,Y=H,Q=d,$=w,R=v,y=K;for(let o=Q-1;o<=$;o++){y.has(o)||y.set(o,new Map);var m,p,I,b,_,A,E=y.get(o),B=Z.Gr(o+.5),k=Z.Gr(o);for([m,p]of B.Hr.entries()){let{dx:t,dy:r,_:e,A:i}=pt(Y,m,E);0<=Y&&Y<4?(t=0,e=R,i=5,0===Y?r=10:1===Y?r=5:2===Y?r=0:3===Y&&(r=-5)):t-=R/2;var[g,q]=M(m,o);if(void 0!==g&&void 0!==q){if("X"===p)X.fillStyle="red";else if("Y"===p)X.fillStyle="green";else{if("Z"!==p)throw new Error("Not a pauli: "+p);X.fillStyle="blue"}X.fillRect(g-t,q-r,e,i)}}for(I of k.zr){var{dx:S,dy:W,_:V,A:j}=pt(Y,I,E),[C,P]=(S-=R/2,M(I,o-.5));void 0!==C&&void 0!==P&&(X.strokeSt)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(ory[this.index]?this.Tr():(this.br=!1,this.index+=1,this.history.splice(this.index,this.history.length-this.index),this.history.push(t),this.Ar.set(t),this._r.send(t))}Nr(){if(!this.br){if(0===this.index)return;--this.index}this.br=!1;var t=this.history[this.index];return this.Ar.set(t),this._r.send(t),t}Dr(){var t;if(this.index+1!==this.history.length)return this.index+=1,this.br=!1,t=this.history[this.index],this.Ar.set(t),this._r.send(t),t}toString(){return"Revision("+G({index:this.index,count:this.history.length,Lr:this.br,head:this.history[this.index]})+")"}Gt(t){return t instanceof ht&&this.index===t.index&&this.br===t.br&&u(this.history,t.history)}}let It=32;function lt(t,e,N,o,D){var x,r=Math.floor(t.canvas.clientWidth/2),i=e.Fr();i.sort((t,r)=>{var[t,e]=o(t),[r,i]=o(r);return e!==i?e-i:t-r});let a=new Map,L=void 0,n=0,s=0,h=0,l=0;for(x of i){var[F,f]=o(x);s+=It,L!==f?(L=f,n=1.5*r,h=Math.max(h,l),l=0,s+=.25*It):(n+=.25*Rt,l++),a.set(F+","+f,[Math.round(n)+.5,Math.round(s)+.5])}let v=It+Math.ceil(Rt*h*)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(.25);var c=Math.floor(t.canvas.clientWidth/4/v);let U=e.Ur-c+1,d=Math.max(0,Math.min(U,D-2*c+1));var w=Math.min(d+2*c+2,D);let G=t=>{t-=e.Ur;return(t-=d-U)*v},u=(t,r)=>{var[t,e]=o(t);return[t,e,r]=[[t,e,r]][0],t=t+","+e,a.has(t)?([e,t]=a.get(t),[e+G(r),t]):[void 0,void 0]};t.save();try{t.clearRect(r,0,r,t.canvas.clientHeight);var z,H,K=new Map;for([z,H]of N.entries()){A=_=b=et=rt=tt=J=I=P=C=j=V=W=S=p=m=q=g=k=B=E=y=R=$=Q=Y=Z=M=X=void 0;var X=t,M=u,Z=H,Y=z,Q=d,$=w,R=v,y=K;for(let o=Q-1;o<=$;o++){y.has(o)||y.set(o,new Map);var m,p,I,b,_,A,E=y.get(o),B=Z.Gr(o+.5),k=Z.Gr(o);for([m,p]of B.zr.entries()){let{dx:t,dy:r,_:e,A:i}=pt(Y,m,E);0<=Y&&Y<4?(t=0,e=R,i=5,0===Y?r=10:1===Y?r=5:2===Y?r=0:3===Y&&(r=-5)):t-=R/2;var[g,q]=M(m,o);if(void 0!==g&&void 0!==q){if("X"===p)X.fillStyle="red";else if("Y"===p)X.fillStyle="green";else{if("Z"!==p)throw new Error("Not a pauli: "+p);X.fillStyle="blue"}X.fillRect(g-t,q-r,e,i)}}for(I of k.Hr){var{dx:S,dy:W,_:V,A:j}=pt(Y,I,E),[C,P]=(S-=R/2,M(I,o-.5));void 0!==C&&void 0!==P&&(X.strokeSt)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(yle="magenta",X.lineWidth=8,X.strokeRect(C-S,P-W,V,j),X.lineWidth=1,X.fillStyle="black",X.fillRect(C-S,P-W,V,j))}for({Kr:b,Qr:_,color:A}of k.$r){var[J,tt]=M(b,o),[rt,et]=M(_,o);"X"===A?X.strokeStyle="red":"Y"===A?X.strokeStyle="green":"Z"===A?X.strokeStyle="blue":X.strokeStyle="purple",X.lineWidth=8,mt(X,J,tt,rt,et),X.lineWidth=1}}}t.globalAlpha*=.5,t.fillStyle="black";var it,O,ot,at=G(e.Ur)+1.5*r-v/2;t.fillRect(at,0,v,t.canvas.clientHeight),t.globalAlpha*=2,t.strokeStyle="black",t.fillStyle="black";for(it of i){var[nt,st]=u(it,d-1),[ht,lt]=u(it,w+1);t.beginPath(),t.moveTo(nt,st),t.lineTo(ht,lt),t.stroke()}t.textAlign="right",t.textBaseline="middle";for(O of i){var[ft,vt]=u(O,d-1),ct=e.Br.Rt[2*O],dt=e.Br.Rt[2*O+1];t.fillText(ct+`,${dt}:`,ft,vt)}for(let r=d;r<=w;r++){var wt=t=>u(t,r),ut=e.Br.yt[r];if(void 0!==ut)for(var Xt of ut.nt())Xt.I(wt,t)}t.globalAlpha=.5;for(ot of i){var[Mt,T]=u(ot,d-1),[Zt,Yt]=o(ot);e.qr>t.canvas.clientWidth/2&&e.Wr>=T+yt-.55*It&&e.Wr<=T+.55*It+yt&&(t.beginPath(),t.moveTo(Mt,T),t.lineT)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(o(Zt,Yt),t.stroke(),t.fillStyle="black",t.fillRect(Zt-20,Yt-20,40,40),t.fillRect(t.canvas.clientWidth/2,T-It/3,t.canvas.clientWidth/2,2*It/3))}}finally{t.restore()}}class Z{constructor(t,r){if(32 32");this.t=r,this.Vr=t,this.jr=new Uint32Array(r),this.Jr=new Uint32Array(r),this.flags=new Uint32Array(r)}st(){var r=new Z(this.Vr,this.t);for(let t=0;t>=1,r>>=1,e>>=1,i>>=1}return s}static re(e){var t=e.length;if(0===t)throw new Error("strings.length === 0");var r,i=e[0].length;for(r of e)if(r.length!==i)throw new Error("Inconsistent string length.");var o=new Z(t,i);for)CRUMBLE_PART");
result.append(R"CRUMBLE_PART((let r=0;r>e&1,o=this.jr[t]>>e&1,a=this.Jr[t]>>e&1;r+="_XZY!%$&"[o+2*a+4*i]}t.push(r)}return t}static ie(e,i){var o=new Z(e.length,i.length);for(let r=0;rt-r),["PropagatedPauliFrames {"]);for(t of r)e.push(` ${t}: `+this.he.get(t));return e.push("}"),e.join("\n")}Gr(t){let r=this.he.get(t);return r=void 0===r?new Y(new Map,new Set,[]):r}static le(r,e){var i=new N(new Map);let o=new Map;for(let t=0;tt-r),["PropagatedPauliFrames {"]);for(t of r)e.push(` ${t}: `+this.he.get(t));return e.push("}"),e.join("\n")}Gr(t){let r=this.he.get(t);return r=void 0===r?new Y(new Map,new Set,[]):r}static le(r,e){var i=new N(new Map);let o=new Map;for(let t=0;tt[1]-r[1]);for(let r=t.yt.length-1;-1<=r;r--){var s,h=0<=r?t.yt[r]:new U,l=[...h.et.keys()];l.reverse();for(s of l){var f=h.et.get(s);if(f.R[0]===s){o.ae(f.Z,[...f.R]);for(let t=f.m();0"X"===t[0])?c.fillStyle="red":Y.every(t=>"Y"===t[0])?c.fillStyle="green":Y.every(t=>"Z"===t[0])?c.fillStyle="blue":c.fillStyle="black",c.strokeStyle=c.fillStyle;var R,y,Z=Y.map(t=>t[1]);let n=0,s=0;for([R,y]of Z)n+=R,s+=y;n/=Z.length,s/=Z.length,Z.sort((t,r)=>{var[t,e]=t,[r,i]=r;let o=Math.atan2(e-s,t-n),a=Math.atan2(i-s,r-n);return t===n&&e===s&&(o=-100),r===n&&i===s&&(a=-100),o-a}),C(c,Z),c.globalAlpha*=.25,c.fill(),c.globalAlpha*=4,c.lineWidth=2,c.stroke(),c.lineWidth=1}for([l,[f,v]]of Y){var{dx:m,dy:p,_:I,A:b}=pt(X,f+":"+v,M);if("X"===l)c.fillStyle="red";else if("Y"===l)c.fillStyle="green";else{if("Z"!==l)throw new Error("Not a pauli: "+l);c.fillStyle="blue"}c.fillRect(f-m,v-p,I,b)}for(_ of Z=u.Gr(d.Ur).zr){var[_,A]=w(_),{dx:E,dy:k,_:g,A:S}=pt(X,_+":"+A,M);c.lineWidth=X<0?2:8,c.strokeStyle="magen)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART([o,a]of i.entries()){_=S=g=k=E=A=v=f=l=b=I=p=m=y=R=h=s=Y=Z=M=X=u=w=d=c=void 0;var s,h,l,f,v,c=t,d=r,w=e,u=a,X=o,M=n,Z=u.Gr(d.Ur+.5).zr,Y=[];for([s,h]of Z.entries())Y.push([h,w(s)]);if(0<=X&&0"X"===t[0])?c.fillStyle="red":Y.every(t=>"Y"===t[0])?c.fillStyle="green":Y.every(t=>"Z"===t[0])?c.fillStyle="blue":c.fillStyle="black",c.strokeStyle=c.fillStyle;var R,y,Z=Y.map(t=>t[1]);let n=0,s=0;for([R,y]of Z)n+=R,s+=y;n/=Z.length,s/=Z.length,Z.sort((t,r)=>{var[t,e]=t,[r,i]=r;let o=Math.atan2(e-s,t-n),a=Math.atan2(i-s,r-n);return t===n&&e===s&&(o=-100),r===n&&i===s&&(a=-100),o-a}),C(c,Z),c.globalAlpha*=.25,c.fill(),c.globalAlpha*=4,c.lineWidth=2,c.stroke(),c.lineWidth=1}for([l,[f,v]]of Y){var{dx:m,dy:p,_:I,A:b}=pt(X,f+":"+v,M);if("X"===l)c.fillStyle="red";else if("Y"===l)c.fillStyle="green";else{if("Z"!==l)throw new Error("Not a pauli: "+l);c.fillStyle="blue"}c.fillRect(f-m,v-p,I,b)}for(_ of Z=u.Gr(d.Ur).Hr){var[_,A]=w(_),{dx:E,dy:k,_:g,A:S}=pt(X,_+":"+A,M);c.lineWidth=X<0?2:8,c.strokeStyle="magen)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(ta",c.strokeRect(_-E,A-k,g,S),c.lineWidth=1,c.fillStyle="black",c.fillRect(_-E,A-k,g,S)}}}let vt=!0;function x(t,r){t.save();try{vt&&r()}finally{t.restore()}}function ct(Z,Y){var t,r=window.devicePixelRatio||1;Z.save(),Z.scale(r,r);let R=Y.Br,e=0;for(t of R.yt)for(var i of t.it){var o=i.Z;"MARKX"!==o.name&&"MARKY"!==o.name&&"MARKZ"!==o.name||(e=Math.max(e,i.Y[0]+1))}let y=(t,r)=>[t*O-L,r*O-yt],m=t=>{var r=R.Rt[2*t],t=R.Rt[2*t+1];return y(r,t)},p=new Map;for(let t=0;t{Z.fillStyle="white",Z.clearRect(0,0,Z.canvas.clientWidth,Z.canvas.clientHeight);var[t,r]=D(Y.qr,Y.Wr);let e=Y.Ur;for(let)CRUMBLE_PART");
result.append(R"CRUMBLE_PART( t=0;t<=Y.Ur;t++)for(var i of R.yt[t].it)if("POLYGON"===i.Z.name){e=t;break}var o,a,n,s,h=[...R.yt[e].it];h.sort((t,r)=>r.R.length-t.R.length);for(o of h)"POLYGON"===o.Z.name&&o.I(m,Z);x(Z,()=>{for(let t=0;t<100;t+=.5){var[r,,]=y(t,0),e=""+t;Z.fillStyle="black",Z.fillText(e,r-Z.measureText(e).width/2,15)}for(let t=0;t<100;t+=.5){var[,i]=y(0,t),o=""+t;Z.fillStyle="black",Z.fillText(o,18-Z.measureText(o).width,i)}Z.strokeStyle="black";for(let r=0;r<100;r+=.5){var[t,,]=y(r,0),a=""+r;Z.fillStyle="black",Z.fillText(a,t-Z.measureText(a).width/2,15);for(let t=r%1;t<100;t+=1){var[n,s]=y(r,t),h=(Z.fillStyle="white",!I.has(r+","+t)),l=!b.has(r+","+t);h&&(Z.globalAlpha*=.25),l&&(Z.globalAlpha*=.25),Z.fillRect(n-Rt,s-Rt,2*Rt,2*Rt),Z.strokeRect(n-Rt,s-Rt,2*Rt,2*Rt),h&&(Z.globalAlpha*=4),l&&(Z.globalAlpha*=4)}}});for([a,n]of p.entries()){u=w=d=M=X=c=v=f=l=void 0;var l=Z,f=Y,v=m,c=n;if(a,void 0!==(c=c.Gr(f.Ur).$r))for(var{Kr:d,Qr:w,color:u}of c){var[d,X]=v(d),[w,M]=v(w);"X"===u?l.strokeStyle="red":"Y"===u?l.strokeStyle="gre)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(en":"Z"===u?l.strokeStyle="blue":l.strokeStyle="purple",l.lineWidth=8,mt(l,d,X,w,M),l.lineWidth=1}}for(s of R.yt[Y.Ur].nt())"POLYGON"!==s.Z.name&&s.I(m,Z);x(Z,()=>{Z.globalAlpha*=.25;for(var[t,r]of Y.de.values()){var[t,r]=y(t,r);Z.fillStyle="yellow",Z.fillRect(t-1.25*Rt,r-1.25*Rt,2.5*Rt,2.5*Rt)}}),x(Z,()=>{Z.globalAlpha*=.5;var r,e,[i,o]=T(Y.we.values());for([r,e]of Y.we.values()){var[a,n]=y(r,e);Z.fillStyle="blue";let t=1.25;r===i&&e===o&&(t=1.5),Z.fillRect(a-Rt*t,n-Rt*t,2*t*Rt,2*t*Rt)}}),ft(Z,Y,m,p),void 0!==t&&(Z.save(),Z.globalAlpha*=.5,[h,t]=y(t,r),Z.fillStyle="red",Z.fillRect(h-Rt,t-Rt,2*Rt,2*Rt),Z.restore()),x(Z,()=>{var t,r,e,i,o,a;Z.globalAlpha*=.25,Z.fillStyle="blue",void 0!==Y.ue&&void 0!==Y.qr&&(t=Math.min(Y.qr,Y.ue),r=Math.max(Y.qr,Y.ue),e=Math.min(Y.Wr,Y.Xe),i=Math.max(Y.Wr,Y.Xe),--t,r+=1,--e,i+=1,t-=L,r-=L,e-=yt,i-=yt,Z.fillRect(t,e,r-t,i-e));for([o,a]of Y.Me){var[n,s]=y(o,a);Z.fillRect(n-Rt,s-Rt,2*Rt,2*Rt)}})}),lt(Z,Y,p,m,R.yt.length),Z.save();try{Z.strokeStyle="black",Z.translate(Math.floor(Z)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(.canvas.clientWidth/2),0);for(let n=0;n0===t.Gr(r).zr.size);0r.has(t))}}function wt(r){let e=[1,0],i=[0,1];var o=(t,r)=>[t-r,t+r];r=(r%8+8)%8;for(let t=0;t[e[0]*t+i[0]*r,e[1]*t+i[1]*r]}function ut(){try{r)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(,Z.moveTo(8*Y.Ur+.5+4,16),Z.lineTo(8*Y.Ur+.5-2,28),Z.lineTo(8*Y.Ur+.5+10,28),Z.closePath(),Z.fill();for(let r=0;r0===t.Gr(r).Hr.size);0r.has(t))}}function wt(r){let e=[1,0],i=[0,1];var o=(t,r)=>[t-r,t+r];r=(r%8+8)%8;for(let t=0;t[e[0]*t+i[0]*r,e[1]*t+i[1]*r]}function ut(){try{r)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(eturn window.self===window.top}catch(t){}}class Xt{constructor(){this.Ye=!1,this.Re=void 0}ye(){this.Re={me:!0}}pe(t){this.Re=t}Ie(){this.Re=void 0}be(t,r){if(!r.startsWith("#"))throw new Error('"Expected a hash URL: '+{_e:t,Ae:r});if(ut()&&this.Re!==t)if(this.Ye)document.location.hash=r;else try{void 0===this.Re?history.replaceState(t,"",r):(history.pushState(t,"",r),this.Re=void 0)}catch(t){console.warn("Calling 'history.replaceState/pushState' failed. Falling back to setting location.hash.",t),this.Ye=!0,document.location.hash=r}}}function Mt(t){return"#circuit="+(t=-1===(t=t.replaceAll("QUBIT_COORDS","Q").replaceAll("DETECTOR","DT").replaceAll("OBSERVABLE_INCLUDE","OI").replaceAll(", ",",").replaceAll(") ",")").replaceAll(" ","_").replaceAll("\n",";")).indexOf("%")&&-1===t.indexOf("&")?t:encodeURIComponent(t))}let o=document.getElementById("toolbox"),M=10.5,R=["H","S","R","M","MR","C","W","SC","MC","P","1-9"],Zt=[1,2,2,2,2,0,2,2,2,-1,-1,-1];let Yt=function(){var r=new Map([["0,0",B.get("H_YZ")],["0,1",B.g)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(et("H")],["0,2",B.get("H_XY")],["1,0",B.get("SQRT_X")],["1,1",B.get("SQRT_Y")],["1,2",B.get("S")],["2,0",B.get("RX")],["2,1",B.get("RY")],["2,2",B.get("R")],["3,0",B.get("MX")],["3,1",B.get("MY")],["3,2",B.get("M")],["4,0",B.get("MRX")],["4,1",B.get("MRY")],["4,2",B.get("MRZ")],["5,0",B.get("CX")],["5,1",B.get("CY")],["5,2",B.get("CZ")],["6,0",B.get("CXSWAP")],["6,1",B.get("SWAP")],["6,2",B.get("CZSWAP")],["7,0",B.get("SQRT_XX")],["7,1",B.get("SQRT_YY")],["7,2",B.get("SQRT_ZZ")],["8,0",B.get("MXX")],["8,1",B.get("MYY")],["8,2",B.get("MZZ")]]);let e=9;for(let t=0;t<4;t++)r.set(e+",0",B.get("MARKX").M(t)),r.set(e+",1",B.get("MARKY").M(t)),r.set(e+",2",B.get("MARKZ").M(t)),r.set(e+",-1",B.get("MARK").M(t)),e+=1;return r}();function bt(t){var r,e=function(t){var r,e;if(!t.ctrlKey)return r=+t.zt.has("x"),e=+t.zt.has("y"),t=+t.zt.has("z"),r&&!e&&!t||!r&&e&&t?{Ee:0,strength:Math.max(r,Math.min(e,t))}:!r&&e&&!t||r&&!e&&t?{Ee:1,strength:Math.max(e,Math.min(r,t))}:!r&&!e&&t||r&&e&&!t?{Ee:2,strength:Math.max(t,Math.min()CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(r,e))}:void 0}(t),t=function(i){if(!i.ctrlKey){let e=void 0;for(let r=0;r=e.strength)&&(e={ke:r,strength:t/R[r].length})}return e}}(t);let i=e,o=(void 0!==t&&void 0===e&&(r=Zt[t.ke],i=void 0===r?void 0:{strength:0,Ee:r}),void 0);return void 0!==i&&void 0!==t&&(r=t.ke+","+i.Ee,Yt.has(r))&&(o=Yt.get(r)),{ge:e,Se:i,Ce:t,Pe:o}}const e=-O+Math.floor(O/4)+.5,_t=-O+Math.floor(O/4)+.5;var t=document.getElementById("btnInsertLayer"),At=document.getElementById("btnDeleteLayer"),Et=document.getElementById("btnUndo"),kt=document.getElementById("btnRedo"),gt=document.getElementById("btnClearMarkers");const St=document.getElementById("btnShowHideImportExport");var Ct=document.getElementById("btnNextLayer"),Pt=document.getElementById("btnPrevLayer"),Ot=document.getElementById("btnRotate45"),Tt=document.getElementById("btnRotate45Counter"),Nt=document.getElementById("btnExport"),Dt=document.getElementById("btnI)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(mport"),xt=document.getElementById("clear");const v=document.getElementById("txtStimCircuit");var Lt=document.getElementById("btnTimelineFocus"),Ft=document.getElementById("btnClearTimelineFocus"),Ut=document.getElementById("btnClearSelectedMarkers"),Gt=document.getElementById("btnShowExamples");const y=document.getElementById("examples-dialog");var Ht=document.getElementById("examples-close-button");v.addEventListener("keyup",t=>t.stopPropagation()),v.addEventListener("keydown",t=>t.stopPropagation());let m=new class{constructor(t){this.rev=ht.Sr(""),this.canvas=t,this.Wr=void 0,this.qr=void 0,this.Oe=new ot,this.Ur=0,this.we=new Map,this.de=new Map,this.ue=void 0,this.Xe=void 0,this.Te=new st(this.Ne(void 0))}De(t){var r,e,i,o=this.xe(),a=o.yt[this.Ur],n=new Set,s=new Map;for(r of[["CX","reverse"],["CY","reverse"],["XCY","reverse"],["CXSWAP","reverse"],["XCZ","reverse"],["XCY","reverse"],["YCX","reverse"],["SWAPCX","reverse"],["RX","MX"],["R","M"],["RY","MY"]])s.set(r[0],r[1]),s.set(r[1],r[0]);for(e of this)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(.we.keys()){var h=a.et.get(o.Ut().get(e));void 0!==h&&s.has(h.Z.name)&&n.add(h.R[0])}for(i of n){var l=a.et.get(i),f=s.get(l.Z.name);"reverse"===f?a.et.get(i).R.reverse():l.Z=B.get(f)}this.Le(o,t)}Fe(t){var r=this.xe();let e=this.Ur;for(;e"MARKX"!==t.Z.name&&"MARKY"!==t.Z.name&&"MARKZ"!==t.Z.name);this.commit(r)}$e(i){var t=this.qr,r=this.Wr,o=this.ue,a=this.Xe,n=[];if(void 0!==t&&void 0!==o){var[s,h]=D(o,a),l=Math.min(t,o),f=Math.max(t,o),v=Math.min(r,a),c=Math.max(r,a),t=O/4-Rt;l+=t,f-=t,v+=t,c-=t,l=Math.floor(2*l/O+.5)/2,f=Math.floor(2*f/O+.5)/2,v=Math.floor(2*v/O+.5)/2,c=Math.floor(2*c/O+.5)/2;let e=1;l!=f&&v!=c||(e=2);for(let r=l;r<=f;r+=.5)for(let t=v;t<=c;t+=.5)r%1!=t%1||i&&(s%e!=r%e||h%e!=t%e)||n.push([r,t])}return n}We(o,t,r){let e=this.xe();e=e.kt(o),!t&&r&&(this.de=(r=t=>{var r,e,i=new Map;for([r,e]of t.values())[r,e]=o(r,e),i.set(r+","+e,[r,e]);return i})(this.de),this.we=r(this.we)),this.Le(e,t)}Ve(t){var[r,e]=D(this.qr,this.Wr),[i,o]=T(this.we.values());let a=new Map;if(void 0!==r&&void 0!==i){va)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(r n,s,h,l=r-i,f=e-o,v=new Map;for([n,s]of this.we.values()){var c=n+","+s,d=n+l,w=s+f,u=d+","+w;a.set(c,[d,w]),v.set(u,[n,s])}for(h of v.keys())if(!a.has(h)){let[t,r]=v.get(h);for(;;){var X=v.get(t+","+r);if(void 0===X)break;[t,r]=X}a.set(h,[t,r])}}else{if(2!==this.we.size)return;var[[r,i],[e,o]]=[...this.we.values()],M=e+","+o;a.set(r+","+i,[e,o]),a.set(M,[r,i])}this.We((t,r)=>{var e=a.get(t+","+r);return void 0!==e?e:[t,r]},t,!0)}je(t,r){let e=wt(t),i=this.xe().kt(e).gt();this.We((t,r)=>([t,r]=e(t,r),i(t,r)),r,!0)}Je(t){this.Ur=Math.max(t,0),this.Ge()}ti(t,r,e){r||e||this.we.clear();for(var[i,o]of t){var a=i+","+o;e&&this.we.has(a)?this.we.delete(a):this.we.set(a,[i,o])}this.Ge()}ri(t){var r,e=new Map,i=this.xe().yt[this.Ur];for(r of[...t]){var o=i.et.get(r);if(void 0!==o)if("RX"===o.Z.name||"MX"===o.Z.name||"MRX"===o.Z.name)e.set(r,"X");else if("RY"===o.Z.name||"MY"===o.Z.name||"MRY"===o.Z.name)e.set(r,"Y");else if("R"===o.Z.name||"M"===o.Z.name||"MR"===o.Z.name)e.set(r,"Z");else if("MXX"===o.Z.name||"MYY")CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(===o.Z.name||"MZZ"===o.Z.name){var a,n=o.Z.name[1];for(a of o.R)e.set(a,n)}else if(o.Z.name.startsWith("MPP:")&&void 0===o.Z.h&&o.R.length===o.Z.name.length-4){var s=o.Z.name.substring(4);for(let t=0;t{var[t,e]=t,[r,i]=r;return Math.atan2(e-a,t-o)-Math.atan2(i-a,r-o)});var s=this.xe().Ft(this.we.values()),h=s.Ut(),l=new Uint32Array(this.we.size);for(let t=0;t!t.Z.name.startsWith("MARK")||t.Y[0]!==r)}this.Le(i,t)}vi(t,i){var r,e=this.xe(),o=N.le(e,i),a=this.Ur,n=0===a?new Y(new Map,new Set,[]):o.Gr(a-.5),s=o.Gr(a+.5),h=e.yt[a],l=new Set;for(r of new Set([...n.Hr.keys(),...s.Hr.keys()]))if(!l.has(r)){var f=n.Hr.get(r),v=s.Hr.get(r),c=h.et.get(r);if(void 0!==c){var d=c.Z.name;let e=void 0;if("R"===d||"M"===d||"MR"===d)e="Z";else)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART( if("RX"===d||"MX"===d||"MRX"===d)e="X";else{if("RY"!==d&&"MY"!==d&&"MRY"!==d){if("MXX"===d||"MYY"===d||"MZZ"===d){e=d[1];let t=0;for(var w of c.R){if(l.has(w)){t=-1;break}t+=n.Hr.get(w)===e}if(2===t)for(var u of c.R)l.add(u),h.it.push(new F(B.get("MARK"+e),"",new Float32Array([i]),new Uint32Array([u])));continue}if(d.startsWith("MPP:")){let r=0;for(let t=0;tc.R.length/2)for(let t=0;t{var t,r,{Nt:e,Dt:i}=n.Pt(!1);for(let t=0;tt.Z.name!==e.Z.name||t.Y[0]!==e.Y[0])}this.Le(a,t)}}}(document.getElementById("cvn"));function zt(){var t=window.devicePixelRatio||1;m.canvas.width=m.canvas.scrollWidth*t,m.canvas.height=m.canvas.scrollHeight*t}function Kt(){var t=m.xe().xt().replaceAll("\nPOL)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(YGON","\n#!pragma POLYGON").replaceAll("\nERR","\n#!pragma ERR").replaceAll("\nMARK","\n#!pragma MARK"),r=v;r.value=t+"\n",r.focus(),r.select()}Nt.addEventListener("click",t=>{Kt()}),Dt.addEventListener("click",t=>{var r=v.value,r=u.It(r);m.commit(r)}),St.addEventListener("click",t=>{var r=document.getElementById("divImportExport");"none"===r.style.display?(r.style.display="block",St.textContent="Hide Import/Export",Kt()):(r.style.display="none",St.textContent="Show Import/Export",v.value=""),setTimeout(()=>{window.scrollTo(0,0),zt(),m.Ge()},0)}),xt.addEventListener("click",t=>{m.Be()}),Et.addEventListener("click",t=>{m.Nr()}),Lt.addEventListener("click",t=>{m.de=new Map(m.we.entries()),m.Ge()}),Ut.addEventListener("click",t=>{m.ii(!1),m.Ge()}),Gt.addEventListener("click",t=>{y.open?y.close():y.showModal()}),Ht.addEventListener("click",t=>{y.close()}),y.addEventListener("click",t=>{t.target===y&&y.close()}),Ft.addEventListener("click",t=>{m.de=new Map,m.Ge()}),kt.addEventListener("click",t=>{m.Dr()}),gt.addEv)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(entListener("click",t=>{m.qe()}),Ot.addEventListener("click",t=>{m.je(1,!1)}),Tt.addEventListener("click",t=>{m.je(-1,!1)}),t.addEventListener("click",t=>{m.Ke(!1)}),At.addEventListener("click",t=>{m.ze(!1)}),Ct.addEventListener("click",t=>{m.Je(m.Ur+1)}),Pt.addEventListener("click",t=>{m.Je(m.Ur-1)}),window.addEventListener("resize",t=>{zt(),m.Ge()}),m.canvas.addEventListener("mousemove",t=>{m.qr=t.offsetX+e,m.Wr=t.offsetY+_t;var r=m.canvas.scrollWidth/2;Qt&&1===t.buttons?m.Je(Math.floor((t.offsetX-r)/8)):m.Ge()});let Qt=!1;m.canvas.addEventListener("mousedown",t=>{m.qr=t.offsetX+e,m.Wr=t.offsetY+_t,m.ue=t.offsetX+e,m.Xe=t.offsetY+_t;var r=m.canvas.scrollWidth/2;(Qt=t.offsetY<20&&t.offsetX>r&&1===t.buttons)?m.Je(Math.floor((t.offsetX-r)/8)):m.Ge()}),m.canvas.addEventListener("mouseup",t=>{var r=m.$e(t.altKey);m.ue=void 0,m.Xe=void 0,m.qr=t.offsetX+e,m.Wr=t.offsetY+_t,m.ti(r,t.shiftKey,t.ctrlKey),1===t.buttons&&(Qt=!1)});let $t=void 0;async function Bt(){let e=m.xe();e.yt=[e.yt[m.Ur]],0{var r=e.Rt[2*t],t=e.Rt[2*t+1];return m.we.has(r+","+t)}),[r,t]=T(m.we.values()),e=e.Ct(-r,-t));var t,r=e.xt();$t=r;try{await navigator.clipboard.writeText(r)}catch(t){console.warn("Failed to write to clipboard. Using fallback emulated clipboard.",t)}}async function qt(e){let i;try{i=await navigator.clipboard.readText()}catch(t){console.warn("Failed to read from clipboard. Using fallback emulated clipboard.",t),i=$t}if(void 0!==i){let r=u.It(i);if(1!==r.yt.length)throw new Error(i);let t=m.xe();0m.je(-1,t)),o.set("t",t=>m.je(1,t)),o.set("escape",()=>{y.open?y.close():m.U)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(e()}),o.set("delete",t=>m.He(t)),o.set("backspace",t=>m.He(t)),o.set("ctrl+delete",t=>m.ze(t)),o.set("ctrl+insert",t=>m.Ke(t)),o.set("ctrl+backspace",t=>m.ze(t)),o.set("ctrl+z",t=>{t||m.Nr()}),o.set("ctrl+y",t=>{t||m.Dr()}),o.set("ctrl+shift+z",t=>{t||m.Dr()}),o.set("ctrl+c",async t=>{await Bt()}),o.set("ctrl+v",qt),o.set("ctrl+x",async t=>{var r;await Bt(),0===m.we.size?((r=m.xe()).yt[m.Ur].et.clear(),r.yt[m.Ur].it.length=0,m.Le(r,t)):m.He(t)}),o.set("l",t=>{t||(m.de=new Map(m.we.entries()),m.Ge())}),o.set(" ",t=>m.ii(t));for(let[t,r]of[["1",0],["2",1],["3",2],["4",3],["5",4],["6",5],["7",6],["8",7],["9",8],["0",9],["-",10],["=",11],["\\",12],["`",13]])o.set(""+t,t=>m.ei(t,r)),o.set(t+"+x",t=>m.si(t,B.get("MARKX").M(r))),o.set(t+"+y",t=>m.si(t,B.get("MARKY").M(r))),o.set(t+"+z",t=>m.si(t,B.get("MARKZ").M(r))),o.set(t+"+d",t=>m.fi(t,r)),o.set(t+"+o",t=>m.hi(t,r)),o.set(t+"+j",t=>m.ci(t,r)),o.set(t+"+k",t=>m.vi(t,r));let r=.25;function a(t,r,e=void 0){for(var i of t){if(o.has(i))throw new Error("Chord collisio)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(n: "+i);o.set(i,t=>m.si(t,B.get(r)))}void 0!==e&&a(t.map(t=>"shift+"+t),e)}return o.set("p",t=>m.si(t,B.get("POLYGON"),[1,0,0,r])),o.set("alt+p",t=>m.si(t,B.get("POLYGON"),[0,1,0,r])),o.set("shift+p",t=>m.si(t,B.get("POLYGON"),[0,0,1,r])),o.set("p+x",t=>m.si(t,B.get("POLYGON"),[1,0,0,r])),o.set("p+y",t=>m.si(t,B.get("POLYGON"),[0,1,0,r])),o.set("p+z",t=>m.si(t,B.get("POLYGON"),[0,0,1,r])),o.set("p+x+y",t=>m.si(t,B.get("POLYGON"),[1,1,0,r])),o.set("p+x+z",t=>m.si(t,B.get("POLYGON"),[1,0,1,r])),o.set("p+y+z",t=>m.si(t,B.get("POLYGON"),[0,1,1,r])),o.set("p+x+y+z",t=>m.si(t,B.get("POLYGON"),[1,1,1,r])),o.set("m+p+x",t=>m.si(t,f("X".repeat(m.we.size)),[])),o.set("m+p+y",t=>m.si(t,f("Y".repeat(m.we.size)),[])),o.set("m+p+z",t=>m.si(t,f("Z".repeat(m.we.size)),[])),o.set("f",t=>m.De(t)),o.set("g",t=>m.Fe(t)),o.set("shift+>",t=>m.We((t,r)=>[t+1,r],t,!1)),o.set("shift+<",t=>m.We((t,r)=>[t-1,r],t,!1)),o.set("shift+v",t=>m.We((t,r)=>[t,r+1],t,!1)),o.set("shift+^",t=>m.We((t,r)=>[t,r-1],t,!1)),o.set(">",t=>m.We((t,r)=>[t+)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(1,r],t,!1)),o.set("<",t=>m.We((t,r)=>[t-1,r],t,!1)),o.set("v",t=>m.We((t,r)=>[t,r+1],t,!1)),o.set("^",t=>m.We((t,r)=>[t,r-1],t,!1)),o.set(".",t=>m.We((t,r)=>[t+.5,r+.5],t,!1)),o.set("b",t=>m.Ve(t)),a(["h","h+y","h+x+z"],"H","H"),a(["h+z","h+x+y"],"H_XY","H_XY"),a(["h+x","h+y+z"],"H_YZ","H_YZ"),a(["s+x","s+y+z"],"SQRT_X","SQRT_X_DAG"),a(["s+y","s+x+z"],"SQRT_Y","SQRT_Y_DAG"),a(["s","s+z","s+x+y"],"S","S_DAG"),a(["r+x","r+y+z"],"RX"),a(["r+y","r+x+z"],"RY"),a(["r","r+z","r+x+y"],"R"),a(["m+x","m+y+z"],"MX"),a(["m+y","m+x+z"],"MY"),a(["m","m+z","m+x+y"],"M"),a(["m+r+x","m+r+y+z"],"MRX"),a(["m+r+y","m+r+x+z"],"MRY"),a(["m+r","m+r+z","m+r+x+y"],"MR"),a(["c"],"CX","CX"),a(["c+x"],"CX","CX"),a(["c+y"],"CY","CY"),a(["c+z"],"CZ","CZ"),a(["j+x"],"X","X"),a(["j+y"],"Y","Y"),a(["j+z"],"Z","Z"),a(["c+x+y"],"XCY","XCY"),a(["alt+c+x"],"XCX","XCX"),a(["alt+c+y"],"YCY","YCY"),a(["w"],"SWAP","SWAP"),a(["w+x"],"CXSWAP",void 0),a(["c+w+x"],"CXSWAP",void 0),a(["i+w"],"ISWAP","ISWAP_DAG"),a(["w+z"],"CZSWAP",void 0),a(["c+w+z"],"CZ)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(SWAP",void 0),a(["c+w"],"CZSWAP",void 0),a(["c+t"],"C_XYZ","C_ZYX"),a(["c+s+x"],"SQRT_XX","SQRT_XX_DAG"),a(["c+s+y"],"SQRT_YY","SQRT_YY_DAG"),a(["c+s+z"],"SQRT_ZZ","SQRT_ZZ_DAG"),a(["c+s"],"SQRT_ZZ","SQRT_ZZ_DAG"),a(["c+m+x"],"MXX","MXX"),a(["c+m+y"],"MYY","MYY"),a(["c+m+z"],"MZZ","MZZ"),a(["c+m"],"MZZ","MZZ"),o}();function Vt(r){if(m.Oe.jt(r),"keydown"===r.type){if("q"===r.key.toLowerCase())return e=r.shiftKey?5:1,void m.Je(m.Ur-e);if("e"===r.key.toLowerCase())return e=r.shiftKey?5:1,void m.Je(m.Ur+e);if("Home"===r.key)return m.Je(0),void r.preventDefault();if("End"===r.key)return m.Je(m.xe().yt.length-1),void r.preventDefault()}var t=m.Oe.Bt;if(0!==t.length){for(var e=t[t.length-1];0{m.Te.set(m.Ne(void 0));var t=m.Oe.qt(!1),r=window.devicePixelRatio||1,a=(o.width=o.scrollWidth*r,o.height=o.scrollHeight*r,o.getContext("2d"));a.save(),a.scale(r,r),a.clearRect(0,0,o.scrollWidth,o.scrollHeight),a.textAlign="right",a.textBaseline="middle",a.fillText("X",7.5,24.5),a.fillText("Y",7.5,56.5),a.fillText("Z",7.5,88.5),a.textAlign="center",a.textBaseline="bottom";for(let t=0;t{try{var t,r=(()=>{var t=document.location.hash.substring(1),r=new Map;if(""!==t)for(var e of t.split("&")){var i,o=e.indexOf("=");-1!==o&&(i=e.substring(0,o),e=decodeURIComponent(e.substring(o+1)),r.set(i,e))}return r})(),e=(r.has("circuit")||("[[[DEFAULT-CIRCUIT-CONTENT-LITERAL]]]"===(t=document.getElementById("txtDefaultCircuit")).value.r)CRUMBLE_PART");
- result.append(R"CRUMBLE_PART(eplaceAll("_","-")?r.set("circuit",""):r.set("circuit",t.value)),u.It(r.get("circuit"))),i=e.xt();jt.clear(i),e.yt.every(t=>t.ut())&&1===r.size&&i===r.get("circuit")?Jt.Ie():Jt.be(i,Mt(i))}catch(t){throw new Error(t)}},window.addEventListener("popstate",Nt),Nt(),jt.kr().Yr().Zr(1).subscribe(t=>{Jt.be(t,Mt(t))})}m.Te.mr().subscribe(t=>requestAnimationFrame(()=>ct(m.canvas.getContext("2d"),t))),window.addEventListener("focus",()=>{m.Oe.Vt()}),window.addEventListener("blur",()=>{m.Oe.Vt()});for(let r of document.getElementById("examples-div").querySelectorAll("a"))r.onclick=t=>{if(!(t.shiftKey||t.ctrlKey||t.altKey||0!==t.button))return t=r.href.split("#circuit=")[1],m.rev.commit(t),y.close(),!1};
+ result.append(R"CRUMBLE_PART(et("H")],["0,2",B.get("H_XY")],["1,0",B.get("SQRT_X")],["1,1",B.get("SQRT_Y")],["1,2",B.get("S")],["2,0",B.get("RX")],["2,1",B.get("RY")],["2,2",B.get("R")],["3,0",B.get("MX")],["3,1",B.get("MY")],["3,2",B.get("M")],["4,0",B.get("MRX")],["4,1",B.get("MRY")],["4,2",B.get("MRZ")],["5,0",B.get("CX")],["5,1",B.get("CY")],["5,2",B.get("CZ")],["6,0",B.get("CXSWAP")],["6,1",B.get("SWAP")],["6,2",B.get("CZSWAP")],["7,0",B.get("SQRT_XX")],["7,1",B.get("SQRT_YY")],["7,2",B.get("SQRT_ZZ")],["8,0",B.get("MXX")],["8,1",B.get("MYY")],["8,2",B.get("MZZ")]]);let e=9;for(let t=0;t<4;t++)r.set(e+",0",B.get("MARKX").M(t)),r.set(e+",1",B.get("MARKY").M(t)),r.set(e+",2",B.get("MARKZ").M(t)),r.set(e+",-1",B.get("MARK").M(t)),e+=1;return r}();function bt(t){var r,e=function(t){var r,e;if(!t.ctrlKey&&!t.metaKey)return r=+t.Ht.has("x"),e=+t.Ht.has("y"),t=+t.Ht.has("z"),r&&!e&&!t||!r&&e&&t?{Ee:0,strength:Math.max(r,Math.min(e,t))}:!r&&e&&!t||r&&!e&&t?{Ee:1,strength:Math.max(e,Math.min(r,t))}:!r&&!e&&t||r&&e&&!t?{Ee:2,strength:Math.max)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART((t,Math.min(r,e))}:void 0}(t),t=function(i){if(!i.ctrlKey&&!i.metaKey){let e=void 0;for(let r=0;r=e.strength)&&(e={ke:r,strength:t/R[r].length})}return e}}(t);let i=e,o=(void 0!==t&&void 0===e&&(r=Zt[t.ke],i=void 0===r?void 0:{strength:0,Ee:r}),void 0);return void 0!==i&&void 0!==t&&(r=t.ke+","+i.Ee,Yt.has(r))&&(o=Yt.get(r)),{ge:e,Se:i,Ce:t,Pe:o}}const e=-O+Math.floor(O/4)+.5,_t=-O+Math.floor(O/4)+.5;var t=document.getElementById("btnInsertLayer"),At=document.getElementById("btnDeleteLayer"),Et=document.getElementById("btnUndo"),kt=document.getElementById("btnRedo"),gt=document.getElementById("btnClearMarkers");const St=document.getElementById("btnShowHideImportExport");var Ct=document.getElementById("btnNextLayer"),Pt=document.getElementById("btnPrevLayer"),Ot=document.getElementById("btnRotate45"),Tt=document.getElementById("btnRotate45Counter"),Nt=document.getElementById("btnExport"),Dt=docum)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(ent.getElementById("btnImport"),xt=document.getElementById("clear");const v=document.getElementById("txtStimCircuit");var Lt=document.getElementById("btnTimelineFocus"),Ft=document.getElementById("btnClearTimelineFocus"),Ut=document.getElementById("btnClearSelectedMarkers"),Gt=document.getElementById("btnShowExamples");const y=document.getElementById("examples-dialog");var zt=document.getElementById("examples-close-button");v.addEventListener("keyup",t=>t.stopPropagation()),v.addEventListener("keydown",t=>t.stopPropagation());let m=new class{constructor(t){this.rev=ht.Sr(""),this.canvas=t,this.Wr=void 0,this.qr=void 0,this.Oe=new ot,this.Ur=0,this.we=new Map,this.de=new Map,this.ue=void 0,this.Xe=void 0,this.Te=new st(this.Ne(void 0))}De(t){var r,e,i,o=this.xe(),a=o.yt[this.Ur],n=new Set,s=new Map;for(r of[["CX","reverse"],["CY","reverse"],["XCY","reverse"],["CXSWAP","reverse"],["XCZ","reverse"],["XCY","reverse"],["YCX","reverse"],["SWAPCX","reverse"],["RX","MX"],["R","M"],["RY","MY"]])s.set(r[0],r[1]),s.set()CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(r[1],r[0]);for(e of this.we.keys()){var h=a.et.get(o.Ut().get(e));void 0!==h&&s.has(h.Z.name)&&n.add(h.R[0])}for(i of n){var l=a.et.get(i),f=s.get(l.Z.name);"reverse"===f?a.et.get(i).R.reverse():l.Z=B.get(f)}this.Le(o,t)}Fe(t){var r=this.xe();let e=this.Ur;for(;e"MARKX"!==t.Z.name&&"MARKY"!==t.Z.name&&"MARKZ"!==t.Z.name);this.commit(r)}$e(i){var t=this.qr,r=this.Wr,o=this.ue,a=this.Xe,n=[];if(void 0!==t&&void 0!==o){var[s,h]=D(o,a),l=Math.min(t,o),f=Math.max(t,o),v=Math.min(r,a),c=Math.max(r,a),t=O/4-Rt;l+=t,f-=t,v+=t,c-=t,l=Math.floor(2*l/O+.5)/2,f=Math.floor(2*f/O+.5)/2,v=Math.floor(2*v/O+.5)/2,c=Math.floor(2*c/O+.5)/2;let e=1;l!=f&&v!=c||(e=2);for(let r=l;r<=f;r+=.5)for(let t=v;t<=c;t+=.5)r%1!=t%1||i&&(s%e!=r%e||h%e!=t%e)||n.push([r,t])}return n}We(o,t,r){let e=this.xe();e=e.kt(o),!t&&r&&(this.de=(r=t=>{var r,e,i=new Map;for([r,e]of t.values())[r,e]=o(r,e),i.set(r+","+e,[r,e]);return i})(this.de),this.we=r(this.we)),this.Le(e,t)}Ve(t){var[r,e]=D(this.qr,this.Wr),[i,o]=T(this.we.values());let a=new Map;if(vo)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(id 0!==r&&void 0!==i){var n,s,h,l=r-i,f=e-o,v=new Map;for([n,s]of this.we.values()){var c=n+","+s,d=n+l,w=s+f,u=d+","+w;a.set(c,[d,w]),v.set(u,[n,s])}for(h of v.keys())if(!a.has(h)){let[t,r]=v.get(h);for(;;){var X=v.get(t+","+r);if(void 0===X)break;[t,r]=X}a.set(h,[t,r])}}else{if(2!==this.we.size)return;var[[r,i],[e,o]]=[...this.we.values()],M=e+","+o;a.set(r+","+i,[e,o]),a.set(M,[r,i])}this.We((t,r)=>{var e=a.get(t+","+r);return void 0!==e?e:[t,r]},t,!0)}je(t,r){let e=wt(t),i=this.xe().kt(e).gt();this.We((t,r)=>([t,r]=e(t,r),i(t,r)),r,!0)}Je(t){this.Ur=Math.max(t,0),this.Ge()}ti(t,r,e){r||e||this.we.clear();for(var[i,o]of t){var a=i+","+o;e&&this.we.has(a)?this.we.delete(a):this.we.set(a,[i,o])}this.Ge()}ri(t){var r,e=new Map,i=this.xe().yt[this.Ur];for(r of[...t]){var o=i.et.get(r);if(void 0!==o)if("RX"===o.Z.name||"MX"===o.Z.name||"MRX"===o.Z.name)e.set(r,"X");else if("RY"===o.Z.name||"MY"===o.Z.name||"MRY"===o.Z.name)e.set(r,"Y");else if("R"===o.Z.name||"M"===o.Z.name||"MR"===o.Z.name)e.set(r,"Z");else if)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(("MXX"===o.Z.name||"MYY"===o.Z.name||"MZZ"===o.Z.name){var a,n=o.Z.name[1];for(a of o.R)e.set(a,n)}else if(o.Z.name.startsWith("MPP:")&&void 0===o.Z.h&&o.R.length===o.Z.name.length-4){var s=o.Z.name.substring(4);for(let t=0;t{var[t,e]=t,[r,i]=r;return Math.atan2(e-a,t-o)-Math.atan2(i-a,r-o)});var s=this.xe().Ft(this.we.values()),h=s.Ut(),l=new Uint32Array(this.we.size);for(let t=0;t!t.Z.name.startsWith("MARK")||t.Y[0]!==r)}this.Le(i,t)}vi(t,i){var r,e=this.xe(),o=N.le(e,i),a=this.Ur,n=0===a?new Y(new Map,new Set,[]):o.Gr(a-.5),s=o.Gr(a+.5),h=e.yt[a],l=new Set;for(r of new Set([...n.zr.keys(),...s.zr.keys()]))if(!l.has(r)){var f=n.zr.get(r),v=s.zr.get(r),c=h.et.get(r);if(void 0!==c){var d=c.Z.name;let e=void 0;if("R"===d||"M"=)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(==d||"MR"===d)e="Z";else if("RX"===d||"MX"===d||"MRX"===d)e="X";else{if("RY"!==d&&"MY"!==d&&"MRY"!==d){if("MXX"===d||"MYY"===d||"MZZ"===d){e=d[1];let t=0;for(var w of c.R){if(l.has(w)){t=-1;break}t+=n.zr.get(w)===e}if(2===t)for(var u of c.R)l.add(u),h.it.push(new F(B.get("MARK"+e),"",new Float32Array([i]),new Uint32Array([u])));continue}if(d.startsWith("MPP:")){let r=0;for(let t=0;tc.R.length/2)for(let t=0;t{var t,r,{Nt:e,Dt:i}=n.Pt(!1);for(let t=0;tt.Z.name!==e.Z.name||t.Y[0]!==e.Y[0])}this.Le(a,t)}}}(document.getElementById("cvn"));function Ht(){var t=window.devicePixelRatio||1;m.canvas.width=m.canvas.scrollWidth*t,m.canvas.height=m.canvas.scrollHeight*t}function Kt(){var t=m.xe()CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART().xt().replaceAll("\nPOLYGON","\n#!pragma POLYGON").replaceAll("\nERR","\n#!pragma ERR").replaceAll("\nMARK","\n#!pragma MARK"),r=v;r.value=t+"\n",r.focus(),r.select()}Nt.addEventListener("click",t=>{Kt()}),Dt.addEventListener("click",t=>{var r=v.value,r=w.It(r);m.commit(r)}),St.addEventListener("click",t=>{var r=document.getElementById("divImportExport");"none"===r.style.display?(r.style.display="block",St.textContent="Hide Import/Export",Kt()):(r.style.display="none",St.textContent="Show Import/Export",v.value=""),setTimeout(()=>{window.scrollTo(0,0),Ht(),m.Ge()},0)}),xt.addEventListener("click",t=>{m.Be()}),Et.addEventListener("click",t=>{m.Nr()}),Lt.addEventListener("click",t=>{m.de=new Map(m.we.entries()),m.Ge()}),Ut.addEventListener("click",t=>{m.ii(!1),m.Ge()}),Gt.addEventListener("click",t=>{y.open?y.close():y.showModal()}),zt.addEventListener("click",t=>{y.close()}),y.addEventListener("click",t=>{t.target===y&&y.close()}),Ft.addEventListener("click",t=>{m.de=new Map,m.Ge()}),kt.addEventListener("clic)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(k",t=>{m.Dr()}),gt.addEventListener("click",t=>{m.qe()}),Ot.addEventListener("click",t=>{m.je(1,!1)}),Tt.addEventListener("click",t=>{m.je(-1,!1)}),t.addEventListener("click",t=>{m.Ke(!1)}),At.addEventListener("click",t=>{m.He(!1)}),Ct.addEventListener("click",t=>{m.Je(m.Ur+1)}),Pt.addEventListener("click",t=>{m.Je(m.Ur-1)}),window.addEventListener("resize",t=>{Ht(),m.Ge()}),m.canvas.addEventListener("mousemove",t=>{m.qr=t.offsetX+e,m.Wr=t.offsetY+_t;var r=m.canvas.scrollWidth/2;Qt&&1===t.buttons?m.Je(Math.floor((t.offsetX-r)/8)):m.Ge()});let Qt=!1;m.canvas.addEventListener("mousedown",t=>{m.qr=t.offsetX+e,m.Wr=t.offsetY+_t,m.ue=t.offsetX+e,m.Xe=t.offsetY+_t;var r=m.canvas.scrollWidth/2;(Qt=t.offsetY<20&&t.offsetX>r&&1===t.buttons)?m.Je(Math.floor((t.offsetX-r)/8)):m.Ge()}),m.canvas.addEventListener("mouseup",t=>{var r=m.$e(t.altKey);m.ue=void 0,m.Xe=void 0,m.qr=t.offsetX+e,m.Wr=t.offsetY+_t,m.ti(r,t.shiftKey,t.ctrlKey||t.metaKey),1===t.buttons&&(Qt=!1)});let $t=void 0,Bt=!1,qt=void 0;async function Wt(){let )CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(e=m.xe();e.yt=[e.yt[m.Ur]],0{var r=e.Rt[2*t],t=e.Rt[2*t+1];return m.we.has(r+","+t)}),[r,t]=T(m.we.values()),e=e.Ct(-r,-t));var t,r=e.xt();$t=r;try{await navigator.clipboard.writeText(r)}catch(t){console.warn("Failed to write to clipboard. Using fallback emulated clipboard.",t)}}async function Vt(t){let r;try{r=await navigator.clipboard.readText()}catch(t){console.warn("Failed to read from clipboard. Using fallback emulated clipboard.",t),r=$t}void 0!==r&&jt(r,t)}function jt(t,r){let e=w.It(t);if(1!==e.yt.length)throw new Error(t);let i=m.xe();0m.je(-1,t)),o.set("t",t=>m.je(1,t)),o.set("escape",()=>{y.open?y.close():m.Ue()}),o.set("delete",t=>m.ze(t)),o.set("backspace",t=>m.ze(t)),o.set("ctrl+delete",t=>m.He(t)),o.set("ctrl+insert",t=>m.Ke(t)),o.set("ctrl+backspace",t=>m.He(t)),o.set("ctrl+z",t=>{t||m.Nr()}),o.set("ctrl+y",t=>{t||m.Dr()}),o.set("ctrl+shift+z",t=>{t||m.Dr()}),o.set("ctrl+c",async t=>{await Wt()}),o.set("ctrl+v",Vt),o.set("ctrl+x",tr),o.set("l",t=>{t||(m.de=new Map(m.we.entries()),m.Ge())}),o.set(" ",t=>m.ii(t));for(let[t,r]of[["1",0],["2",1],["3",2],["4",3],["5",4],["6",5],["7",6],["8",7],["9",8],["0",9],["-",10],["=",11],["\\",12],["`",13]])o.set(""+t,t=>m.ei(t,r)),o.set(t+"+x",t=>m.si(t,B.get("MARKX").M(r))),o.set(t+"+y",t=>m.si(t,B.get("MARKY").M(r))),o.set(t+"+z",t=>m.si(t,B.get("MARKZ").M(r))),o.set(t+"+d",t=>m.fi(t,r)),o.set(t+"+o",t=>m.hi(t,r)),o.s)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(et(t+"+j",t=>m.ci(t,r)),o.set(t+"+k",t=>m.vi(t,r));let r=.25;function a(t,r,e=void 0){for(var i of t){if(o.has(i))throw new Error("Chord collision: "+i);o.set(i,t=>m.si(t,B.get(r)))}void 0!==e&&a(t.map(t=>"shift+"+t),e)}return o.set("p",t=>m.si(t,B.get("POLYGON"),[1,0,0,r])),o.set("alt+p",t=>m.si(t,B.get("POLYGON"),[0,1,0,r])),o.set("shift+p",t=>m.si(t,B.get("POLYGON"),[0,0,1,r])),o.set("p+x",t=>m.si(t,B.get("POLYGON"),[1,0,0,r])),o.set("p+y",t=>m.si(t,B.get("POLYGON"),[0,1,0,r])),o.set("p+z",t=>m.si(t,B.get("POLYGON"),[0,0,1,r])),o.set("p+x+y",t=>m.si(t,B.get("POLYGON"),[1,1,0,r])),o.set("p+x+z",t=>m.si(t,B.get("POLYGON"),[1,0,1,r])),o.set("p+y+z",t=>m.si(t,B.get("POLYGON"),[0,1,1,r])),o.set("p+x+y+z",t=>m.si(t,B.get("POLYGON"),[1,1,1,r])),o.set("m+p+x",t=>m.si(t,f("X".repeat(m.we.size)),[])),o.set("m+p+y",t=>m.si(t,f("Y".repeat(m.we.size)),[])),o.set("m+p+z",t=>m.si(t,f("Z".repeat(m.we.size)),[])),o.set("f",t=>m.De(t)),o.set("g",t=>m.Fe(t)),o.set("shift+>",t=>m.We((t,r)=>[t+1,r],t,!1)),o.set("shift+<",t=>m.)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(We((t,r)=>[t-1,r],t,!1)),o.set("shift+v",t=>m.We((t,r)=>[t,r+1],t,!1)),o.set("shift+^",t=>m.We((t,r)=>[t,r-1],t,!1)),o.set(">",t=>m.We((t,r)=>[t+1,r],t,!1)),o.set("<",t=>m.We((t,r)=>[t-1,r],t,!1)),o.set("v",t=>m.We((t,r)=>[t,r+1],t,!1)),o.set("^",t=>m.We((t,r)=>[t,r-1],t,!1)),o.set(".",t=>m.We((t,r)=>[t+.5,r+.5],t,!1)),o.set("b",t=>m.Ve(t)),a(["h","h+y","h+x+z"],"H","H"),a(["h+z","h+x+y"],"H_XY","H_XY"),a(["h+x","h+y+z"],"H_YZ","H_YZ"),a(["s+x","s+y+z"],"SQRT_X","SQRT_X_DAG"),a(["s+y","s+x+z"],"SQRT_Y","SQRT_Y_DAG"),a(["s","s+z","s+x+y"],"S","S_DAG"),a(["r+x","r+y+z"],"RX"),a(["r+y","r+x+z"],"RY"),a(["r","r+z","r+x+y"],"R"),a(["m+x","m+y+z"],"MX"),a(["m+y","m+x+z"],"MY"),a(["m","m+z","m+x+y"],"M"),a(["m+r+x","m+r+y+z"],"MRX"),a(["m+r+y","m+r+x+z"],"MRY"),a(["m+r","m+r+z","m+r+x+y"],"MR"),a(["c"],"CX","CX"),a(["c+x"],"CX","CX"),a(["c+y"],"CY","CY"),a(["c+z"],"CZ","CZ"),a(["j+x"],"X","X"),a(["j+y"],"Y","Y"),a(["j+z"],"Z","Z"),a(["c+x+y"],"XCY","XCY"),a(["alt+c+x"],"XCX","XCX"),a(["alt+c+y"],"YCY","YCY"),a(["w"])CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(,"SWAP","SWAP"),a(["w+x"],"CXSWAP",void 0),a(["c+w+x"],"CXSWAP",void 0),a(["i+w"],"ISWAP","ISWAP_DAG"),a(["w+z"],"CZSWAP",void 0),a(["c+w+z"],"CZSWAP",void 0),a(["c+w"],"CZSWAP",void 0),a(["c+t"],"C_XYZ","C_ZYX"),a(["c+s+x"],"SQRT_XX","SQRT_XX_DAG"),a(["c+s+y"],"SQRT_YY","SQRT_YY_DAG"),a(["c+s+z"],"SQRT_ZZ","SQRT_ZZ_DAG"),a(["c+s"],"SQRT_ZZ","SQRT_ZZ_DAG"),a(["c+m+x"],"MXX","MXX"),a(["c+m+y"],"MYY","MYY"),a(["c+m+z"],"MZZ","MZZ"),a(["c+m"],"MZZ","MZZ"),o}();async function er(r){if("keydown"===r.type&&r.metaKey){if(r.repeat)return r.preventDefault(),void m.Oe.Vt();var e=r.key.toLowerCase();if("z"===e&&!r.shiftKey)return r.preventDefault(),m.Oe.Vt(),void m.Nr();if("z"===e&&r.shiftKey||"y"===e)return r.preventDefault(),m.Oe.Vt(),void m.Dr();if("c"===e)return r.preventDefault(),m.Oe.Vt(),void await Wt();if("v"===e)return m.Oe.Vt(),Bt=!0,void(qt=setTimeout(Jt,1e3));if("x"===e)return r.preventDefault(),m.Oe.Vt(),void await tr(!1);if("backspace"===e||"delete"===e)return r.preventDefault(),m.Oe.Vt(),void m.He(!1);if()CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART("enter"===e)return r.preventDefault(),m.Oe.Vt(),void m.Ke(!1)}if(m.Oe.jt(r),"keydown"===r.type){if("q"===r.key.toLowerCase())return e=r.shiftKey?5:1,void m.Je(m.Ur-e);if("e"===r.key.toLowerCase())return e=r.shiftKey?5:1,void m.Je(m.Ur+e);if("Home"===r.key)return m.Je(0),void r.preventDefault();if("End"===r.key)return m.Je(m.xe().yt.length-1),void r.preventDefault()}var t=m.Oe.Bt;if(0!==t.length){for(e=t[t.length-1];0{var r;Bt&&(Jt(),""!==(r=t.clipboardData.getData("text/plain")))&&(t.preventDefault(),jt(r,!1))}),document.addEventListener("keydown",er),document.addEventListener("keyup",er),Ht(),m.rev.Er().subscribe(()=>{m.Te.set(m.Ne(void 0));var t=m.Oe.qt(!1),r=window.devicePixelRatio||1,a=(o.)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(width=o.scrollWidth*r,o.height=o.scrollHeight*r,o.getContext("2d"));a.save(),a.scale(r,r),a.clearRect(0,0,o.scrollWidth,o.scrollHeight),a.textAlign="right",a.textBaseline="middle",a.fillText("X",7.5,24.5),a.fillText("Y",7.5,56.5),a.fillText("Z",7.5,88.5),a.textAlign="center",a.textBaseline="bottom";for(let t=0;t{try{var t,r=(()=>{var t=document.location.hash.substring(1),r=new Map;if(""!==t)for(var e of t.split("&")){var i,o=e.indexOf("=");-1!==o&&(i=e.substring(0,o),e=decodeURIComponent(e.substring(o+1)),r.set(i,e))}return r})(),e=(r.has("circuit")||("[[[DEFAULT-CIRCUIT-CONTENT-LITERAL]]]"===(t=document.getElementById("txtDefaultCircuit")).value.replaceAll("_","-")?r.set("circuit",""):r.set("circuit",t.value)),w.It(r.get("circuit"))),i=e.xt();ir.clear(i),e.yt.every(t=>t.ut())&&1===r.)CRUMBLE_PART");
+ result.append(R"CRUMBLE_PART(size&&i===r.get("circuit")?or.Ie():or.be(i,Mt(i))}catch(t){throw new Error(t)}},window.addEventListener("popstate",Nt),Nt(),ir.kr().Yr().Zr(1).subscribe(t=>{or.be(t,Mt(t))})}m.Te.mr().subscribe(t=>requestAnimationFrame(()=>ct(m.canvas.getContext("2d"),t))),window.addEventListener("focus",()=>{m.Oe.Vt()}),window.addEventListener("blur",()=>{m.Oe.Vt()});for(let r of document.getElementById("examples-div").querySelectorAll("a"))r.onclick=t=>{if(!(t.shiftKey||t.ctrlKey||t.metaKey||t.altKey||0!==t.button))return t=r.href.split("#circuit=")[1],m.rev.commit(t),y.close(),!1};
)CRUMBLE_PART");
result.append(R"CRUMBLE_PART(
)CRUMBLE_PART");