diff --git a/js/dist/admin.js b/js/dist/admin.js index c1367ac..ae383d5 100644 --- a/js/dist/admin.js +++ b/js/dist/admin.js @@ -3,7 +3,7 @@ module.exports=function(t){var e={};function r(n){if(e[n])return e[n].exports;va * tiptap-utils v1.13.0 * (c) 2021 überdosis GbR (limited liability) * @license MIT - */function o(t){return e=>function(t,e){for(let r=t.depth;r>0;r-=1){const n=t.node(r);if(e(n))return{pos:r>0?t.before(r):0,start:t.start(r),depth:r,node:n}}}(e.$from,t)}function i(t){return function(e){if(function(t){return t instanceof n.c}(e)){const{node:r}=e,{$from:n}=e;if(function(t,e){return Array.isArray(t)&&t.indexOf(e.type)>-1||e.type===t}(t,r))return{node:r,pos:n.pos,depth:n.depth}}}}function s(t,e){const{from:r,to:n}=t.selection;let o=[];t.doc.nodesBetween(r,n,t=>{o=[...o,...t.marks]});const i=o.find(t=>t.type.name===e.name);return i?i.attrs:{}}function a(t=null,e=null){if(!t||!e)return!1;const r=t.parent.childAfter(t.parentOffset);if(!r.node)return!1;const n=r.node.marks.find(t=>t.type===e);if(!n)return!1;let o=t.index(),i=t.start()+r.offset,s=o+1,a=i+r.node.nodeSize;for(;o>0&&n.isInSet(t.parent.child(o-1).marks);)o-=1,i-=t.parent.child(o).nodeSize;for(;st.type===e)(t.selection);return Object.keys(r).length&&n?n.node.hasMarkup(e,{...n.node.attrs,...r}):!!n}},function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));var n=r(6),o=r(2),i=function(t){function e(){return t.apply(this,arguments)||this}return Object(n.a)(e,t),e.initAttrs=function(t){t.command=Object(o.n)(t.mark)},e.prototype.onEditorUpdate=function(){this.$().toggleClass("active",!!this.state.markActive(this.attrs.mark))},e}(r(10).a)},function(t,e,r){"use strict";r.d(e,"a",(function(){return y})),r.d(e,"b",(function(){return g}));for(var n={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",229:"q"},o={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"',229:"Q"},i="undefined"!=typeof navigator&&/Chrome\/(\d+)/.exec(navigator.userAgent),s="undefined"!=typeof navigator&&/Apple Computer/.test(navigator.vendor),a="undefined"!=typeof navigator&&/Gecko\/\d+/.test(navigator.userAgent),c="undefined"!=typeof navigator&&/Mac/.test(navigator.platform),l="undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),u=i&&(c||+i[1]<57)||a&&c,p=0;p<10;p++)n[48+p]=n[96+p]=String(p);for(p=1;p<=24;p++)n[p+111]="F"+p;for(p=65;p<=90;p++)n[p]=String.fromCharCode(p+32),o[p]=String.fromCharCode(p);for(var h in n)o.hasOwnProperty(h)||(o[h]=n[h]);var f=r(1),d="undefined"!=typeof navigator&&/Mac/.test(navigator.platform);function m(t){var e,r,n,o,i=t.split(/-(?!$)/),s=i[i.length-1];"Space"==s&&(s=" ");for(var a=0;a127)&&(i=n[r.keyCode])&&i!=a){var h=e[v(i,r,!0)];if(h&&h(t.state,t.dispatch,t))return!0}else if(c&&r.shiftKey){var f=e[v(a,r,!0)];if(f&&f(t.state,t.dispatch,t))return!0}return!1}}},function(t,e){t.exports=flarum.core.compat["common/utils/ItemList"]},function(t,e){t.exports=flarum.core.compat["common/utils/Stream"]},function(t,e){t.exports=flarum.core.compat["common/components/Button"]},function(t,e){t.exports=flarum.core.compat["common/helpers/icon"]},function(t,e){t.exports=flarum.core.compat["common/components/Dropdown"]},function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));var n=r(6),o=r(54),i=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.className=function(){return"LoadingModal Modal--small"},r.title=function(){return this.attrs.title},r.oncreate=function(e){t.prototype.oncreate.call(this,e),this.$(".CommandButton").on("click",(function(){app.modal.close()}))},r.content=function(){var t=this.attrs.onsubmit?this.attrs.onsubmit.bind(this):function(){};return m("div",{className:"Modal-body"},m("form",{className:"Form",onsubmit:t},this.attrs.vnodeContent))},e}(r.n(o).a)},function(t,e,r){"use strict";r.d(e,"a",(function(){return v}));var n=r(6),o=r(18),i=r.n(o),s=r(20),a=r.n(s),c=r(9),l=r.n(c),u=r(19),p=r.n(u),h=r(16),f=r.n(h),d=r(21),v=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t),e.initAttrs=function(t){t.buttonClassName="Button Button--icon Button--link Button--menuDropdown"};var r=e.prototype;return r.oninit=function(e){t.prototype.oninit.call(this,e),this.state=this.attrs.state},r.oncreate=function(e){var r=this;t.prototype.oncreate.call(this,e),this.$().on("click",(function(t){$(".App").is(".mobile-safari")&&(app.modal.show(d.a,{title:r.attrs.tooltip,vnodeContent:r.fields().toArray(),onsubmit:r.onsubmit.bind(r)}),t.stopPropagation())})),this.$().on("shown.bs.dropdown",(function(){r.$(".Dropdown-menu").find("input, select, textarea").first().focus().select()}))},r.getButtonContent=function(t){return m(l.a,{text:this.attrs.tooltip},m("span",null,p()(this.attrs.icon)))},r.getMenu=function(t){return m("ul",{className:"Dropdown-menu dropdown-menu FormDropdown"},m("form",{className:"Form",onsubmit:this.onsubmit.bind(this)},this.fields().toArray()))},r.fields=function(){var t=new f.a;return t.add("insert",m(i.a,{type:"submit",className:"Button Button--primary"},app.translator.trans("askvortsov-rich-text.lib.composer.insert_button"))),t},r.onsubmit=function(t){app.modal.close(),t.preventDefault(),$("body").trigger("click"),this.insert(t),app.composer.editor.focus()},r.insert=function(t){},e}(a.a)},function(t,e){t.exports=flarum.core.compat["common/extend"]},function(t,e,r){"use strict";r.d(e,"a",(function(){return s}));var n=r(6),o=r(10),i=r(2),s=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.oninit=function(e){var r=this;e.attrs.command=function(t,n){return Object(i.m)(e.attrs.listType,r.active?t.schema.nodes.list_item:void 0)(t,n)},t.prototype.oninit.call(this,e)},r.onEditorUpdate=function(){this.active=!!this.state.nodeActive(this.attrs.listType),this.$().toggleClass("active",this.active)},e}(o.a)},function(t,e){t.exports=flarum.core.compat["common/components/TextEditor"]},function(t,e,r){"use strict";r.d(e,"a",(function(){return s}));var n=r(12),o=r(7);function i(t){return t.open instanceof Function||t.close instanceof Function?(error("markdown-serializer genMarkupAwareMarkSpec","Unable to extend mark config with open/close as functions",t),t):Object(n.a)({},t,{open:function(e,r){return r.attrs.markup||t.open},close:function(e,r){var n=r.attrs.markup;return(n=/^<[a-z]+>$/i.test(n)?n.replace(/^! ",null,e,(function(){return t.renderContent(e)}))},math_block:function(t,e){t.write("$$\n"),t.text(e.textContent,!1),t.ensureNewLine(),t.write("$$"),t.closeBlock(e)},paragraph:function(t,e){0===e.content.size?t.write("\n"):o.e.nodes.paragraph(t,e)},hard_break:function(t,e,r,n){for(var o=n+1;o!",close:"!<",mixable:!0,expelEnclosingWhitespace:!0}),strike:i({open:"~~",close:"~~",mixable:!0,expelEnclosingWhitespace:!0}),sub:i({open:"~",close:"~",mixable:!0,expelEnclosingWhitespace:!0}),sup:i({open:"^",close:"^",mixable:!0,expelEnclosingWhitespace:!0}),math_inline:Object(n.a)({},i({open:"$",close:"$",mixable:!1,expelEnclosingWhitespace:!0}),{escape:!1})})},e.build=function(){return new o.b(this.buildNodes(),this.buildMarks())},t}()},function(t,e,r){"use strict";t.exports=r(55)},function(t,e,r){"use strict";r.d(e,"a",(function(){return l}));var n=r(12),o=r(7),i=r(0);function s(){for(var t=arguments.length,e=new Array(t),r=0;r=e?o.empty:this.sliceInner(Math.max(0,t),Math.min(this.length,e))},o.prototype.get=function(t){if(!(t<0||t>=this.length))return this.getInner(t)},o.prototype.forEach=function(t,e,r){void 0===e&&(e=0),void 0===r&&(r=this.length),e<=r?this.forEachInner(t,e,r,0):this.forEachInvertedInner(t,e,r,0)},o.prototype.map=function(t,e,r){void 0===e&&(e=0),void 0===r&&(r=this.length);var n=[];return this.forEach((function(e,r){return n.push(t(e,r))}),e,r),n},o.from=function(t){return t instanceof o?t:t&&t.length?new i(t):o.empty};var i=function(t){function e(e){t.call(this),this.values=e}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={length:{configurable:!0},depth:{configurable:!0}};return e.prototype.flatten=function(){return this.values},e.prototype.sliceInner=function(t,r){return 0==t&&r==this.length?this:new e(this.values.slice(t,r))},e.prototype.getInner=function(t){return this.values[t]},e.prototype.forEachInner=function(t,e,r,n){for(var o=e;o=r;o--)if(!1===t(this.values[o],n+o))return!1},e.prototype.leafAppend=function(t){if(this.length+t.length<=200)return new e(this.values.concat(t.flatten()))},e.prototype.leafPrepend=function(t){if(this.length+t.length<=200)return new e(t.flatten().concat(this.values))},r.length.get=function(){return this.values.length},r.depth.get=function(){return 0},Object.defineProperties(e.prototype,r),e}(o);o.empty=new i([]);var s=function(t){function e(e,r){t.call(this),this.left=e,this.right=r,this.length=e.length+r.length,this.depth=Math.max(e.depth,r.depth)+1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},e.prototype.getInner=function(t){return to&&!1===this.right.forEachInner(t,Math.max(e-o,0),Math.min(this.length,r)-o,n+o))&&void 0)},e.prototype.forEachInvertedInner=function(t,e,r,n){var o=this.left.length;return!(e>o&&!1===this.right.forEachInvertedInner(t,e-o,Math.max(r,o)-o,n+o))&&(!(r=r?this.right.slice(t-r,e-r):this.left.slice(t,r).append(this.right.slice(0,e-r))},e.prototype.leafAppend=function(t){var r=this.right.leafAppend(t);if(r)return new e(this.left,r)},e.prototype.leafPrepend=function(t){var r=this.left.leafPrepend(t);if(r)return new e(r,this.right)},e.prototype.appendInner=function(t){return this.left.depth>=Math.max(this.right.depth,t.depth)+1?new e(this.left,new e(this.right,t)):new e(this,t)},e}(o),a=o,c=r(3),l=r(1),u=function(t,e){this.items=t,this.eventCount=e};u.prototype.popEvent=function(t,e){var r=this;if(0==this.eventCount)return null;for(var n,o,i=this.items.length;;i--){if(this.items.get(i-1).selection){--i;break}}e&&(n=this.remapping(i,this.items.length),o=n.maps.length);var s,a,c=t.tr,l=[],h=[];return this.items.forEach((function(t,e){if(!t.step)return n||(n=r.remapping(i,e+1),o=n.maps.length),o--,void h.push(t);if(n){h.push(new p(t.map));var f,d=t.step.map(n.slice(o));d&&c.maybeStep(d).doc&&(f=c.mapping.maps[c.mapping.maps.length-1],l.push(new p(f,null,null,l.length+h.length))),o--,f&&n.appendMap(f,o)}else c.maybeStep(t.step);return t.selection?(s=n?t.selection.map(n.slice(o)):t.selection,a=new u(r.items.slice(0,i).append(h.reverse().concat(l)),r.eventCount-1),!1):void 0}),this.items.length,0),{remaining:a,transform:c,selection:s}},u.prototype.addTransform=function(t,e,r,n){for(var o=[],i=this.eventCount,s=this.items,a=!n&&s.length?s.get(s.length-1):null,c=0;cf&&(v=y,(m=s).forEach((function(t,e){if(t.selection&&0==v--)return g=e,!1})),s=m.slice(g),i-=y),new u(s.append(o),i)},u.prototype.remapping=function(t,e){var r=new c.a;return this.items.forEach((function(e,n){var o=null!=e.mirrorOffset&&n-e.mirrorOffset>=t?r.maps.length-e.mirrorOffset:null;r.appendMap(e.map,o)}),t,e),r},u.prototype.addMaps=function(t){return 0==this.eventCount?this:new u(this.items.append(t.map((function(t){return new p(t)}))),this.eventCount)},u.prototype.rebased=function(t,e){if(!this.eventCount)return this;var r=[],n=Math.max(0,this.items.length-e),o=t.mapping,i=t.steps.length,s=this.eventCount;this.items.forEach((function(t){t.selection&&s--}),n);var a=e;this.items.forEach((function(e){var n=o.getMirror(--a);if(null!=n){i=Math.min(i,n);var c=o.maps[n];if(e.step){var l=t.steps[n].invert(t.docs[n]),u=e.selection&&e.selection.map(o.slice(a+1,n));u&&s++,r.push(new p(c,l,u))}else r.push(new p(c))}}),n);for(var c=[],l=e;l500&&(f=f.compress(this.items.length-r.length)),f},u.prototype.emptyItemCount=function(){var t=0;return this.items.forEach((function(e){e.step||t++})),t},u.prototype.compress=function(t){void 0===t&&(t=this.items.length);var e=this.remapping(0,t),r=e.maps.length,n=[],o=0;return this.items.forEach((function(i,s){if(s>=t)n.push(i),i.selection&&o++;else if(i.step){var a=i.step.map(e.slice(r)),c=a&&a.getMap();if(r--,c&&e.appendMap(c,r),a){var l=i.selection&&i.selection.map(e.slice(r));l&&o++;var u,h=new p(c.invert(),a,l),f=n.length-1;(u=n.length&&n[f].merge(h))?n[f]=u:n.push(h)}}else i.map&&r--}),this.items.length,0),new u(a.from(n.reverse()),o)},u.empty=new u(a.empty,0);var p=function(t,e,r,n){this.map=t,this.step=e,this.selection=r,this.mirrorOffset=n};p.prototype.merge=function(t){if(this.step&&t.step&&!t.selection){var e=t.step.merge(this.step);if(e)return new p(e.getMap().invert(),e,this.selection)}};var h=function(t,e,r,n){this.done=t,this.undone=e,this.prevRanges=r,this.prevTime=n},f=20;function d(t){var e=[];return t.forEach((function(t,r,n,o){return e.push(n,o)})),e}function v(t,e){if(!t)return null;for(var r=[],n=0;n=e[o]&&(r=!0)})),r}(r,t.prevRanges)),c=s?v(t.prevRanges,r.mapping):d(r.mapping.maps[r.steps.length-1]);return new h(t.done.addTransform(r,a?e.selection.getBookmark():null,n,k(e)),u.empty,c,r.time)}(r,n,e,t)}},config:t})}function C(t,e){var r=w.getState(t);return!(!r||0==r.done.eventCount)&&(e&&g(r,t,e,!1),!0)}function S(t,e){var r=w.getState(t);return!(!r||0==r.undone.eventCount)&&(e&&g(r,t,e,!0),!0)}var A=r(15),O=r(0),M={};if("undefined"!=typeof navigator&&"undefined"!=typeof document){var D=/Edge\/(\d+)/.exec(navigator.userAgent),E=/MSIE \d/.test(navigator.userAgent),T=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);M.mac=/Mac/.test(navigator.platform);var N=M.ie=!!(E||T||D);M.ie_version=E?document.documentMode||6:T?+T[1]:D?+D[1]:null,M.gecko=!N&&/gecko\/(\d+)/i.test(navigator.userAgent),M.gecko_version=M.gecko&&+(/Firefox\/(\d+)/.exec(navigator.userAgent)||[0,0])[1];var I=!N&&/Chrome\/(\d+)/.exec(navigator.userAgent);M.chrome=!!I,M.chrome_version=I&&+I[1],M.safari=!N&&/Apple Computer/.test(navigator.vendor),M.ios=M.safari&&(/Mobile\/\w+/.test(navigator.userAgent)||navigator.maxTouchPoints>2),M.android=/Android \d/.test(navigator.userAgent),M.webkit="webkitFontSmoothing"in document.documentElement.style,M.webkit_version=M.webkit&&+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]}var z=function(t){for(var e=0;;e++)if(!(t=t.previousSibling))return e},R=function(t){var e=t.parentNode;return e&&11==e.nodeType?e.host:e},F=null,j=function(t,e,r){var n=F||(F=document.createRange());return n.setEnd(t,null==r?t.nodeValue.length:r),n.setStart(t,e||0),n},q=function(t,e,r,n){return r&&(P(t,e,r,n,-1)||P(t,e,r,n,1))},B=/^(img|br|input|textarea|hr)$/i;function P(t,e,r,n,o){for(;;){if(t==r&&e==n)return!0;if(e==(o<0?0:L(t))){var i=t.parentNode;if(1!=i.nodeType||V(t)||B.test(t.nodeName)||"false"==t.contentEditable)return!1;e=z(t)+(o<0?0:1),t=i}else{if(1!=t.nodeType)return!1;if("false"==(t=t.childNodes[e+(o<0?-1:0)]).contentEditable)return!1;e=o<0?L(t):0}}}function L(t){return 3==t.nodeType?t.nodeValue.length:t.childNodes.length}function V(t){for(var e,r=t;r&&!(e=r.pmViewDesc);r=r.parentNode);return e&&e.node&&e.node.isBlock&&(e.dom==t||e.contentDOM==t)}var U=function(t){var e=t.isCollapsed;return e&&M.chrome&&t.rangeCount&&!t.getRangeAt(0).collapsed&&(e=!1),e};function J(t,e){var r=document.createEvent("Event");return r.initEvent("keydown",!0,!0),r.keyCode=t,r.key=r.code=e,r}function W(t){return{left:0,right:t.documentElement.clientWidth,top:0,bottom:t.documentElement.clientHeight}}function K(t,e){return"number"==typeof t?t:t[e]}function H(t){var e=t.getBoundingClientRect();return{left:e.left,right:e.left+t.clientWidth,top:e.top,bottom:e.top+t.clientHeight}}function G(t,e,r){for(var n=t.someProp("scrollThreshold")||0,o=t.someProp("scrollMargin")||5,i=t.dom.ownerDocument,s=r||t.dom;s;s=R(s))if(1==s.nodeType){var a=s==i.body||1!=s.nodeType,c=a?W(i):H(s),l=0,u=0;if(e.topc.bottom-K(n,"bottom")&&(u=e.bottom-c.bottom+K(o,"bottom")),e.leftc.right-K(n,"right")&&(l=e.right-c.right+K(o,"right")),l||u)if(a)i.defaultView.scrollBy(l,u);else{var p=s.scrollLeft,h=s.scrollTop;u&&(s.scrollTop+=u),l&&(s.scrollLeft+=l);var f=s.scrollLeft-p,d=s.scrollTop-h;e={left:e.left-f,top:e.top-d,right:e.right-f,bottom:e.bottom-d}}if(a)break}}function Z(t){for(var e=[],r=t.ownerDocument;t&&(e.push({dom:t,top:t.scrollTop,left:t.scrollLeft}),t!=r);t=R(t));return e}function Y(t,e){for(var r=0;r=a){s=Math.max(h.bottom,s),a=Math.min(h.top,a);var f=h.left>e.left?h.left-e.left:h.right=(h.left+h.right)/2?1:0));continue}}!r&&(e.left>=h.right&&e.top>=h.top||e.left>=h.left&&e.top>=h.bottom)&&(i=l+1)}}return r&&3==r.nodeType?function(t,e){for(var r=t.nodeValue.length,n=document.createRange(),o=0;o=(i.left+i.right)/2?1:0)}}return{node:t,offset:0}}(r,n):!r||o&&1==r.nodeType?{node:t,offset:i}:Q(r,n)}function tt(t,e){return t.left>=e.left-1&&t.left<=e.right+1&&t.top>=e.top-1&&t.top<=e.bottom+1}function et(t,e){var r,n,o,i,s=t.root;if(s.caretPositionFromPoint)try{var a=s.caretPositionFromPoint(e.left,e.top);a&&(o=(r=a).offsetNode,i=r.offset)}catch(t){}if(!o&&s.caretRangeFromPoint){var c=s.caretRangeFromPoint(e.left,e.top);c&&(o=(n=c).startContainer,i=n.startOffset)}var l,u=s.elementFromPoint(e.left,e.top+1);if(!u||!t.dom.contains(1!=u.nodeType?u.parentNode:u)){var p=t.dom.getBoundingClientRect();if(!tt(e,p))return null;if(!(u=function t(e,r,n){var o=e.childNodes.length;if(o&&n.tope.top&&i++}o==t.dom&&i==o.childNodes.length-1&&1==o.lastChild.nodeType&&e.top>o.lastChild.getBoundingClientRect().bottom?l=t.state.doc.content.size:0!=i&&1==o.nodeType&&"BR"==o.childNodes[i-1].nodeName||(l=function(t,e,r,n){for(var o=-1,i=e;i!=t.dom;){var s=t.docView.nearestDesc(i,!0);if(!s)return null;if(s.node.isBlock&&s.parent){var a=s.dom.getBoundingClientRect();if(a.left>n.left||a.top>n.top)o=s.posBefore;else{if(!(a.right-1?o:t.docView.posFromDOM(e,r)}(t,o,i,e))}null==l&&(l=function(t,e,r){var n=Q(e,r),o=n.node,i=n.offset,s=-1;if(1==o.nodeType&&!o.firstChild){var a=o.getBoundingClientRect();s=a.left!=a.right&&r.left>(a.left+a.right)/2?1:-1}return t.docView.posFromDOM(o,i,s)}(t,u,e));var d=t.docView.nearestDesc(u,!0);return{pos:l,inside:d?d.posAtStart-d.border:-1}}function rt(t,e){var r=t.getClientRects();return r.length?r[e<0?0:r.length-1]:t.getBoundingClientRect()}var nt=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;function ot(t,e,r){var n=t.docView.domFromPos(e,r<0?-1:1),o=n.node,i=n.offset,s=M.webkit||M.gecko;if(3==o.nodeType){if(!s||!nt.test(o.nodeValue)&&(r<0?i:i!=o.nodeValue.length)){var a=i,c=i,l=r<0?1:-1;return r<0&&!i?(c++,l=-1):r>=0&&i==o.nodeValue.length?(a--,l=1):r<0?a--:c++,it(rt(j(o,a,c),l),l<0)}var u=rt(j(o,i,i),r);if(M.gecko&&i&&/\s/.test(o.nodeValue[i-1])&&i=0)}if(i&&(r<0||i==L(o))){var m=o.childNodes[i-1],v=3==m.nodeType?j(m,L(m)-(s?0:1)):1!=m.nodeType||"BR"==m.nodeName&&m.nextSibling?null:m;if(v)return it(rt(v,1),!1)}if(i=0)}function it(t,e){if(0==t.width)return t;var r=e?t.left:t.right;return{top:t.top,bottom:t.bottom,left:r,right:r}}function st(t,e){if(0==t.height)return t;var r=e?t.top:t.bottom;return{top:r,bottom:r,left:t.left,right:t.right}}function at(t,e,r){var n=t.state,o=t.root.activeElement;n!=e&&t.updateState(e),o!=t.dom&&t.focus();try{return r()}finally{n!=e&&t.updateState(n),o!=t.dom&&o&&o.focus()}}var ct=/[\u0590-\u08ac]/;var lt=null,ut=null,pt=!1;function ht(t,e,r){return lt==e&&ut==r?pt:(lt=e,ut=r,pt="up"==r||"down"==r?function(t,e,r){var n=e.selection,o="up"==r?n.$from:n.$to;return at(t,e,(function(){for(var e=t.docView.domFromPos(o.pos,"up"==r?-1:1).node;;){var n=t.docView.nearestDesc(e,!0);if(!n)break;if(n.node.isBlock){e=n.dom;break}e=n.dom.parentNode}for(var i=ot(t,o.pos,1),s=e.firstChild;s;s=s.nextSibling){var a=void 0;if(1==s.nodeType)a=s.getClientRects();else{if(3!=s.nodeType)continue;a=j(s,0,s.nodeValue.length).getClientRects()}for(var c=0;cl.top&&("up"==r?l.bottomi.bottom-1))return!1}}return!0}))}(t,e,r):function(t,e,r){var n=e.selection.$head;if(!n.parent.isTextblock)return!1;var o=n.parentOffset,i=!o,s=o==n.parent.content.size,a=getSelection();return ct.test(n.parent.textContent)&&a.modify?at(t,e,(function(){var e=a.getRangeAt(0),o=a.focusNode,i=a.focusOffset,s=a.caretBidiLevel;a.modify("move",r,"character");var c=!(n.depth?t.docView.domAfterPos(n.before()):t.dom).contains(1==a.focusNode.nodeType?a.focusNode:a.focusNode.parentNode)||o==a.focusNode&&i==a.focusOffset;return a.removeAllRanges(),a.addRange(e),null!=s&&(a.caretBidiLevel=s),c})):"left"==r||"backward"==r?i:s}(t,e,r))}var ft=function(t,e,r,n){this.parent=t,this.children=e,this.dom=r,r.pmViewDesc=this,this.contentDOM=n,this.dirty=0},dt={beforePosition:{configurable:!0},size:{configurable:!0},border:{configurable:!0},posBefore:{configurable:!0},posAtStart:{configurable:!0},posAfter:{configurable:!0},posAtEnd:{configurable:!0},contentLost:{configurable:!0},domAtom:{configurable:!0}};ft.prototype.matchesWidget=function(){return!1},ft.prototype.matchesMark=function(){return!1},ft.prototype.matchesNode=function(){return!1},ft.prototype.matchesHack=function(){return!1},dt.beforePosition.get=function(){return!1},ft.prototype.parseRule=function(){return null},ft.prototype.stopEvent=function(){return!1},dt.size.get=function(){for(var t=0,e=0;e0:a)?this.posAtEnd:this.posAtStart},ft.prototype.nearestDesc=function(t,e){for(var r=!0,n=t;n;n=n.parentNode){var o=this.getDesc(n);if(o&&(!e||o.node)){if(!r||!o.nodeDOM||(1==o.nodeDOM.nodeType?o.nodeDOM.contains(1==t.nodeType?t:t.parentNode):o.nodeDOM==t))return o;r=!1}}},ft.prototype.getDesc=function(t){for(var e=t.pmViewDesc,r=e;r;r=r.parent)if(r==this)return e},ft.prototype.posFromDOM=function(t,e,r){for(var n=t;n;n=n.parentNode){var o=this.getDesc(n);if(o)return o.localPosFromDOM(t,e,r)}return-1},ft.prototype.descAt=function(t){for(var e=0,r=0;e=t:s>t))return i.domFromPos(t-r-i.border,e);r=s}},ft.prototype.parseRange=function(t,e,r){if(void 0===r&&(r=0),0==this.children.length)return{node:this.contentDOM,from:t,to:e,fromOffset:0,toOffset:this.contentDOM.childNodes.length};for(var n=-1,o=-1,i=r,s=0;;s++){var a=this.children[s],c=i+a.size;if(-1==n&&t<=c){var l=i+a.border;if(t>=l&&e<=c-a.border&&a.node&&a.contentDOM&&this.contentDOM.contains(a.contentDOM))return a.parseRange(t,e,l);t=i;for(var u=s;u>0;u--){var p=this.children[u-1];if(p.size&&p.dom.parentNode==this.contentDOM&&!p.emptyChildAt(1)){n=z(p.dom)+1;break}t-=p.size}-1==n&&(n=0)}if(n>-1&&(c>e||s==this.children.length-1)){e=c;for(var h=s+1;ha&&ie){var y=u;u=p,p=y}var b=document.createRange();b.setEnd(p.node,p.offset),b.setStart(u.node,u.offset),h.removeAllRanges(),h.addRange(b)}}},ft.prototype.ignoreMutation=function(t){return!this.contentDOM&&"selection"!=t.type},dt.contentLost.get=function(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)},ft.prototype.markDirty=function(t,e){for(var r=0,n=0;n=r:tr){var s=r+o.border,a=i-o.border;if(t>=s&&e<=a)return this.dirty=t==r||e==i?2:1,void(t!=s||e!=a||!o.contentLost&&o.dom.parentNode==this.contentDOM?o.markDirty(t-s,e-s):o.dirty=3);o.dirty=3}r=i}this.dirty=2},ft.prototype.markParentsDirty=function(){for(var t=1,e=this.parent;e;e=e.parent,t++){var r=1==t?2:1;e.dirty0&&(i=zt(i,0,t,n));for(var a=0;ai;)l.push(o[c++]);var y=i+m.nodeSize;if(m.isText){var b=y;c=0&&!a&&s.syncToMarks(i==r.node.childCount?O.d.none:r.node.child(i).marks,n,t),s.placeWidget(e,t,o)}),(function(e,r,i,a){s.syncToMarks(e.marks,n,t),s.findNodeMatch(e,r,i,a)||s.updateNextNode(e,r,i,t,a)||s.addNode(e,r,i,t,o),o+=e.nodeSize})),s.syncToMarks(mt,n,t),this.node.isTextblock&&s.addTextblockHacks(),s.destroyRest(),(s.changed||2==this.dirty)&&(i&&this.protectLocalComposition(t,i),function t(e,r,n){for(var o=e.firstChild,i=!1,s=0;se+this.node.content.size)){var i=t.root.getSelection(),s=function(t,e){for(;;){if(3==t.nodeType)return t;if(1==t.nodeType&&e>0){if(t.childNodes.length>e&&3==t.childNodes[e].nodeType)return t.childNodes[e];t=t.childNodes[e-1],e=L(t)}else{if(!(1==t.nodeType&&e=r){var u=c.lastIndexOf(e,n-a);if(u>=0&&u+e.length+a>=r)return a+u}}}return-1}(this.node.content,a,n-e,o-e);return c<0?null:{node:s,pos:c,text:a}}}},e.prototype.protectLocalComposition=function(t,e){var r=e.node,n=e.pos,o=e.text;if(!this.getDesc(r)){for(var i=r;i.parentNode!=this.contentDOM;i=i.parentNode){for(;i.previousSibling;)i.parentNode.removeChild(i.previousSibling);for(;i.nextSibling;)i.parentNode.removeChild(i.nextSibling);i.pmViewDesc&&(i.pmViewDesc=null)}var s=new gt(this,i,r,o);t.compositionNodes.push(s),this.children=zt(this.children,n,n+o.length,t,s)}},e.prototype.update=function(t,e,r,n){return!(3==this.dirty||!t.sameMarkup(this.node))&&(this.updateInner(t,e,r,n),!0)},e.prototype.updateInner=function(t,e,r,n){this.updateOuterDeco(e),this.node=t,this.innerDeco=r,this.contentDOM&&this.updateChildren(n,this.posAtStart),this.dirty=0},e.prototype.updateOuterDeco=function(t){if(!Et(t,this.outerDeco)){var e=1!=this.nodeDOM.nodeType,r=this.dom;this.dom=Ot(this.dom,this.nodeDOM,At(this.outerDeco,this.node,e),At(t,this.node,e)),this.dom!=r&&(r.pmViewDesc=null,this.dom.pmViewDesc=this),this.outerDeco=t}},e.prototype.selectNode=function(){this.nodeDOM.classList.add("ProseMirror-selectednode"),!this.contentDOM&&this.node.type.spec.draggable||(this.dom.draggable=!0)},e.prototype.deselectNode=function(){this.nodeDOM.classList.remove("ProseMirror-selectednode"),!this.contentDOM&&this.node.type.spec.draggable||this.dom.removeAttribute("draggable")},r.domAtom.get=function(){return this.node.isAtom},Object.defineProperties(e.prototype,r),e}(ft);function kt(t,e,r,n,o){return Dt(n,e,t),new bt(null,t,e,r,n,n,n,o,0)}var wt=function(t){function e(e,r,n,o,i,s,a){t.call(this,e,r,n,o,i,null,s,a)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={domAtom:{configurable:!0}};return e.prototype.parseRule=function(){for(var t=this.nodeDOM.parentNode;t&&t!=this.dom&&!t.pmIsDeco;)t=t.parentNode;return{skip:t||!0}},e.prototype.update=function(t,e,r,n){return!(3==this.dirty||0!=this.dirty&&!this.inParent()||!t.sameMarkup(this.node))&&(this.updateOuterDeco(e),0==this.dirty&&t.text==this.node.text||t.text==this.nodeDOM.nodeValue||(this.nodeDOM.nodeValue=t.text,n.trackWrites==this.nodeDOM&&(n.trackWrites=null)),this.node=t,this.dirty=0,!0)},e.prototype.inParent=function(){for(var t=this.parent.contentDOM,e=this.nodeDOM;e;e=e.parentNode)if(e==t)return!0;return!1},e.prototype.domFromPos=function(t){return{node:this.nodeDOM,offset:t}},e.prototype.localPosFromDOM=function(e,r,n){return e==this.nodeDOM?this.posAtStart+Math.min(r,this.node.text.length):t.prototype.localPosFromDOM.call(this,e,r,n)},e.prototype.ignoreMutation=function(t){return"characterData"!=t.type&&"selection"!=t.type},e.prototype.slice=function(t,r,n){var o=this.node.cut(t,r),i=document.createTextNode(o.text);return new e(this.parent,o,this.outerDeco,this.innerDeco,i,i,n)},r.domAtom.get=function(){return!1},Object.defineProperties(e.prototype,r),e}(bt),xt=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={domAtom:{configurable:!0}};return e.prototype.parseRule=function(){return{ignore:!0}},e.prototype.matchesHack=function(){return 0==this.dirty},r.domAtom.get=function(){return!0},Object.defineProperties(e.prototype,r),e}(ft),_t=function(t){function e(e,r,n,o,i,s,a,c,l,u){t.call(this,e,r,n,o,i,s,a,l,u),this.spec=c}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.update=function(e,r,n,o){if(3==this.dirty)return!1;if(this.spec.update){var i=this.spec.update(e,r);return i&&this.updateInner(e,r,n,o),i}return!(!this.contentDOM&&!e.isLeaf)&&t.prototype.update.call(this,e,r,n,o)},e.prototype.selectNode=function(){this.spec.selectNode?this.spec.selectNode():t.prototype.selectNode.call(this)},e.prototype.deselectNode=function(){this.spec.deselectNode?this.spec.deselectNode():t.prototype.deselectNode.call(this)},e.prototype.setSelection=function(e,r,n,o){this.spec.setSelection?this.spec.setSelection(e,r,n):t.prototype.setSelection.call(this,e,r,n,o)},e.prototype.destroy=function(){this.spec.destroy&&this.spec.destroy(),t.prototype.destroy.call(this)},e.prototype.stopEvent=function(t){return!!this.spec.stopEvent&&this.spec.stopEvent(t)},e.prototype.ignoreMutation=function(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):t.prototype.ignoreMutation.call(this,e)},e}(bt);function Ct(t){t&&(this.nodeName=t)}Ct.prototype=Object.create(null);var St=[new Ct];function At(t,e,r){if(0==t.length)return St;for(var n=r?St[0]:new Ct,o=[n],i=0;i0&&o>=0;o--){var i=e[o],s=i.node;if(s){if(s!=t.child(n-1))break;r.push(i),--n}}return{nodes:r.reverse(),offset:n}}(t.node.content,t.children);this.preMatched=r.nodes,this.preMatchOffset=r.offset};function It(t,e){return t.type.side-e.type.side}function zt(t,e,r,n,o){for(var i=[],s=0,a=0;s=r||u<=e?i.push(c):(lr&&i.push(c.slice(r-l,c.size,n)))}return i}function Rt(t,e){var r=t.root.getSelection(),n=t.state.doc;if(!r.focusNode)return null;var o=t.docView.nearestDesc(r.focusNode),i=o&&0==o.size,s=t.docView.posFromDOM(r.focusNode,r.focusOffset);if(s<0)return null;var a,c,u=n.resolve(s);if(U(r)){for(a=u;o&&!o.node;)o=o.parent;if(o&&o.node.isAtom&&l.c.isSelectable(o.node)&&o.parent&&(!o.node.isInline||!function(t,e,r){for(var n=0==e,o=e==L(t);n||o;){if(t==r)return!0;var i=z(t);if(!(t=t.parentNode))return!1;n=n&&0==i,o=o&&i==L(t)}}(r.focusNode,r.focusOffset,o.dom))){var p=o.posBefore;c=new l.c(s==p?u:n.resolve(p))}}else{var h=t.docView.posFromDOM(r.anchorNode,r.anchorOffset);if(h<0)return null;a=n.resolve(h)}c||(c=Vt(t,a,u,"pointer"==e||t.state.selection.head=this.preMatchOffset?this.preMatched[t-this.preMatchOffset]:null},Nt.prototype.destroyBetween=function(t,e){if(t!=e){for(var r=t;r>1,i=Math.min(o,t.length);n-1)s>this.index&&(this.changed=!0,this.destroyBetween(this.index,s)),this.top=this.top.children[this.index];else{var c=yt.create(this.top,t[o],e,r);this.top.children.splice(this.index,0,c),this.top=c,this.changed=!0}this.index=0,o++}},Nt.prototype.findNodeMatch=function(t,e,r,n){var o=-1,i=n<0?void 0:this.getPreMatch(n),s=this.top.children;if(i&&i.matchesNode(t,e,r))o=s.indexOf(i);else for(var a=this.index,c=Math.min(s.length,a+5);a-1&&a+this.preMatchOffset!=o)return!1;var c=s.dom;if(!(this.lock&&(c==this.lock||1==c.nodeType&&c.contains(this.lock.parentNode))&&!(t.isText&&s.node&&s.node.isText&&s.nodeDOM.nodeValue==t.text&&3!=s.dirty&&Et(e,s.outerDeco)))&&s.update(t,e,r,n))return this.destroyBetween(this.index,i),s.dom!=c&&(this.changed=!0),this.index++,!0;break}}return!1},Nt.prototype.addNode=function(t,e,r,n,o){this.top.children.splice(this.index++,0,bt.create(this.top,t,e,r,n,o)),this.changed=!0},Nt.prototype.placeWidget=function(t,e,r){var n=this.index0?n.max(o):n.min(o),s=i.parent.inlineContent?i.depth?t.doc.resolve(e>0?i.after():i.before()):null:i;return s&&l.f.findFrom(s,e)}function Wt(t,e){return t.dispatch(t.state.tr.setSelection(e).scrollIntoView()),!0}function Kt(t,e,r){var n=t.state.selection;if(!(n instanceof l.g)){if(n instanceof l.c&&n.node.isInline)return Wt(t,new l.g(e>0?n.$to:n.$from));var o=Jt(t.state,e);return!!o&&Wt(t,o)}if(!n.empty||r.indexOf("s")>-1)return!1;if(t.endOfTextblock(e>0?"right":"left")){var i=Jt(t.state,e);return!!(i&&i instanceof l.c)&&Wt(t,i)}if(!(M.mac&&r.indexOf("m")>-1)){var s,a=n.$head,c=a.textOffset?null:e<0?a.nodeBefore:a.nodeAfter;if(!c||c.isText)return!1;var u=e<0?a.pos-c.nodeSize:a.pos;return!!(c.isAtom||(s=t.docView.descAt(u))&&!s.contentDOM)&&(l.c.isSelectable(c)?Wt(t,new l.c(e<0?t.state.doc.resolve(a.pos-c.nodeSize):a)):!!M.webkit&&Wt(t,new l.g(t.state.doc.resolve(e<0?u:u+c.nodeSize))))}}function Ht(t){return 3==t.nodeType?t.nodeValue.length:t.childNodes.length}function Gt(t){var e=t.pmViewDesc;return e&&0==e.size&&(t.nextSibling||"BR"!=t.nodeName)}function Zt(t){var e=t.root.getSelection(),r=e.focusNode,n=e.focusOffset;if(r){var o,i,s=!1;for(M.gecko&&1==r.nodeType&&n0){if(1!=r.nodeType)break;var a=r.childNodes[n-1];if(Gt(a))o=r,i=--n;else{if(3!=a.nodeType)break;n=(r=a).nodeValue.length}}else{if(Xt(r))break;for(var c=r.previousSibling;c&&Gt(c);)o=r.parentNode,i=z(c),c=c.previousSibling;if(c)n=Ht(r=c);else{if((r=r.parentNode)==t.dom)break;n=0}}s?Qt(t,e,r,n):o&&Qt(t,e,o,i)}}function Yt(t){var e=t.root.getSelection(),r=e.focusNode,n=e.focusOffset;if(r){for(var o,i,s=Ht(r);;)if(n-1)return!1;if(M.mac&&r.indexOf("m")>-1)return!1;var o=n.$from,i=n.$to;if(!o.parent.inlineContent||t.endOfTextblock(e<0?"up":"down")){var s=Jt(t.state,e);if(s&&s instanceof l.c)return Wt(t,s)}if(!o.parent.inlineContent){var a=l.f.findFrom(e<0?o:i,e);return!a||Wt(t,a)}return!1}function ee(t,e){if(!(t.state.selection instanceof l.g))return!0;var r=t.state.selection,n=r.$head,o=r.$anchor,i=r.empty;if(!n.sameParent(o))return!0;if(!i)return!1;if(t.endOfTextblock(e>0?"forward":"backward"))return!0;var s=!n.textOffset&&(e<0?n.nodeBefore:n.nodeAfter);if(s&&!s.isText){var a=t.state.tr;return e<0?a.delete(n.pos-s.nodeSize,n.pos):a.delete(n.pos,n.pos+s.nodeSize),t.dispatch(a),!0}return!1}function re(t,e,r){t.domObserver.stop(),e.contentEditable=r,t.domObserver.start()}function ne(t,e){var r=e.keyCode,n=function(t){var e="";return t.ctrlKey&&(e+="c"),t.metaKey&&(e+="m"),t.altKey&&(e+="a"),t.shiftKey&&(e+="s"),e}(e);return 8==r||M.mac&&72==r&&"c"==n?ee(t,-1)||Zt(t):46==r||M.mac&&68==r&&"c"==n?ee(t,1)||Yt(t):13==r||27==r||(37==r?Kt(t,-1,n)||Zt(t):39==r?Kt(t,1,n)||Yt(t):38==r?te(t,-1,n)||Zt(t):40==r?function(t){if(M.safari&&!(t.state.selection.$head.parentOffset>0)){var e=t.root.getSelection(),r=e.focusNode,n=e.focusOffset;if(r&&1==r.nodeType&&0==n&&r.firstChild&&"false"==r.firstChild.contentEditable){var o=r.firstChild;re(t,o,!0),setTimeout((function(){return re(t,o,!1)}),20)}}}(t)||te(t,1,n)||Yt(t):n==(M.mac?"m":"c")&&(66==r||73==r||89==r||90==r))}function oe(t){var e=t.pmViewDesc;if(e)return e.parseRule();if("BR"==t.nodeName&&t.parentNode){if(M.safari&&/^(ul|ol)$/i.test(t.parentNode.nodeName)){var r=document.createElement("div");return r.appendChild(document.createElement("li")),{skip:r}}if(t.parentNode.lastChild==t||M.safari&&/^(tr|table)$/i.test(t.parentNode.nodeName))return{ignore:!0}}else if("IMG"==t.nodeName&&t.getAttribute("mark-placeholder"))return{ignore:!0}}function ie(t,e,r,n,o){if(e<0){var i=t.lastSelectionTime>Date.now()-50?t.lastSelectionOrigin:null,s=Rt(t,i);if(s&&!t.state.selection.eq(s)){var a=t.state.tr.setSelection(s);"pointer"==i?a.setMeta("pointer",!0):"key"==i&&a.scrollIntoView(),t.dispatch(a)}}else{var c=t.state.doc.resolve(e),u=c.sharedDepth(r);e=c.before(u+1),r=t.state.doc.resolve(r).after(u+1);var p=t.state.selection,h=function(t,e,r){var n=t.docView.parseRange(e,r),o=n.node,i=n.fromOffset,s=n.toOffset,a=n.from,c=n.to,l=t.root.getSelection(),u=null,p=l.anchorNode;if(p&&t.dom.contains(1==p.nodeType?p:p.parentNode)&&(u=[{node:p,offset:l.anchorOffset}],U(l)||u.push({node:l.focusNode,offset:l.focusOffset})),M.chrome&&8===t.lastKeyCode)for(var h=s;h>i;h--){var f=o.childNodes[h-1],d=f.pmViewDesc;if("BR"==f.nodeType&&!d){s=h;break}if(!d||d.size)break}var m=t.state.doc,v=t.someProp("domParser")||O.a.fromSchema(t.state.schema),g=m.resolve(a),y=null,b=v.parse(o,{topNode:g.parent,topMatch:g.parent.contentMatchAt(g.index()),topOpen:!0,from:i,to:s,preserveWhitespace:!g.parent.type.spec.code||"full",editableContent:!0,findPositions:u,ruleFromNode:oe,context:g});if(u&&null!=u[0].pos){var k=u[0].pos,w=u[1]&&u[1].pos;null==w&&(w=k),y={anchor:k+a,head:w+a}}return{doc:b,sel:y,from:a,to:c}}(t,e,r);if(M.chrome&&t.cursorWrapper&&h.sel&&h.sel.anchor==t.cursorWrapper.deco.from){var f=t.cursorWrapper.deco.type.toDOM.nextSibling,d=f&&f.nodeValue?f.nodeValue.length:1;h.sel={anchor:h.sel.anchor+d,head:h.sel.anchor+d}}var m,v,g=t.state.doc,y=g.slice(h.from,h.to);8===t.lastKeyCode&&Date.now()-100=a?i-n:0)+(c-a),a=i}else if(c=c?i-n:0)+(a-c),c=i}return{start:i,endA:a,endB:c}}(y.content,h.doc.content,h.from,m,v);if(!b){if(!(n&&p instanceof l.g&&!p.empty&&p.$head.sameParent(p.$anchor))||t.composing||h.sel&&h.sel.anchor!=h.sel.head){if(M.ios&&t.lastIOSEnter>Date.now()-225&&o.some((function(t){return"DIV"==t.nodeName||"P"==t.nodeName}))&&t.someProp("handleKeyDown",(function(e){return e(t,J(13,"Enter"))})))return void(t.lastIOSEnter=0);if(h.sel){var k=se(t,t.state.doc,h.sel);k&&!k.eq(t.state.selection)&&t.dispatch(t.state.tr.setSelection(k))}return}b={start:p.from,endA:p.to,endB:p.to}}t.domChangeCount++,t.state.selection.fromt.state.selection.from&&b.start<=t.state.selection.from+2?b.start=t.state.selection.from:b.endA=t.state.selection.to-2&&(b.endB+=t.state.selection.to-b.endA,b.endA=t.state.selection.to)),M.ie&&M.ie_version<=11&&b.endB==b.start+1&&b.endA==b.start&&b.start>h.from&&"  "==h.doc.textBetween(b.start-h.from-1,b.start-h.from+1)&&(b.start--,b.endA--,b.endB--);var w,x=h.doc.resolveNoCache(b.start-h.from),_=h.doc.resolveNoCache(b.endB-h.from),C=x.sameParent(_)&&x.parent.inlineContent;if((M.ios&&t.lastIOSEnter>Date.now()-225&&(!C||o.some((function(t){return"DIV"==t.nodeName||"P"==t.nodeName})))||!C&&x.posb.start&&function(t,e,r,n,o){if(!n.parent.isTextblock||r-e<=o.pos-n.pos||ae(n,!0,!1)r||ae(s,!0,!1)e.content.size?null:Vt(t,e.resolve(r.anchor),e.resolve(r.head))}function ae(t,e,r){for(var n=t.depth,o=e?t.end():t.pos;n>0&&(e||t.indexAfter(n)==t.node(n).childCount);)n--,o++,e=!1;if(r)for(var i=t.node(n).maybeChild(t.indexAfter(n));i&&!i.isLeaf;)i=i.firstChild,o++;return o}function ce(t,e){for(var r=[],n=e.content,o=e.openStart,i=e.openEnd;o>1&&i>1&&1==n.childCount&&1==n.firstChild.childCount;){o--,i--;var s=n.firstChild;r.push(s.type.name,s.attrs!=s.type.defaultAttrs?s.attrs:null),n=s.content}var a=t.someProp("clipboardSerializer")||O.b.fromSchema(t.state.schema),c=de(),l=c.createElement("div");l.appendChild(a.serializeFragment(n,{document:c}));for(var u,p=l.firstChild;p&&1==p.nodeType&&(u=he[p.nodeName.toLowerCase()]);){for(var h=u.length-1;h>=0;h--){for(var f=c.createElement(u[h]);l.firstChild;)f.appendChild(l.firstChild);l.appendChild(f)}p=l.firstChild}return p&&1==p.nodeType&&p.setAttribute("data-pm-slice",o+" "+i+" "+JSON.stringify(r)),{dom:l,text:t.someProp("clipboardTextSerializer",(function(t){return t(e)}))||e.content.textBetween(0,e.content.size,"\n\n")}}function le(t,e,r,n,o){var i,s,a=o.parent.type.spec.code;if(!r&&!e)return null;var c=e&&(n||a||!r);if(c){if(t.someProp("transformPastedText",(function(t){e=t(e,a||n)})),a)return new O.j(O.c.from(t.state.schema.text(e)),0,0);var l=t.someProp("clipboardTextParser",(function(t){return t(e,o,n)}));l?s=l:(i=document.createElement("div"),e.trim().split(/(?:\r\n?|\n)+/).forEach((function(t){i.appendChild(document.createElement("p")).textContent=t})))}else t.someProp("transformPastedHTML",(function(t){r=t(r)})),i=function(t){var e=/(\s*]*>)*/.exec(t);e&&(t=t.slice(e[0].length));var r,n=de().createElement("div"),o=/(?:]*>)*<([a-z][^>\s]+)/i.exec(t),i=0;(r=o&&he[o[1].toLowerCase()])&&(t=r.map((function(t){return"<"+t+">"})).join("")+t+r.map((function(t){return""})).reverse().join(""),i=r.length);n.innerHTML=t;for(var s=0;s=0;a-=2){var c=n.nodes[r[a]];if(!c||c.hasRequiredAttrs())break;o=O.c.from(c.create(r[a+1],o)),i++,s++}return new O.j(o,i,s)}(function(t,e,r){e=0;n--){var o=r(n);if(o)return o.v}return t}(s.content,o),!1),t.someProp("transformPasted",(function(t){s=t(s)})),s}function ue(t,e,r){void 0===r&&(r=0);for(var n=e.length-1;n>=r;n--)t=e[n].create(null,O.c.from(t));return t}function pe(t,e,r,n,o,i){var s=e<0?t.firstChild:t.lastChild,a=s.content;return o=r&&(a=e<0?s.contentMatchAt(0).fillBefore(a,t.childCount>1||i<=o).append(a):a.append(s.contentMatchAt(s.childCount).fillBefore(O.c.empty,!0))),t.replaceChild(e<0?0:t.childCount-1,s.copy(a))}var he={thead:["table"],tbody:["table"],tfoot:["table"],caption:["table"],colgroup:["table"],col:["table","colgroup"],tr:["table","tbody"],td:["table","tbody","tr"],th:["table","tbody","tr"]},fe=null;function de(){return fe||(fe=document.implementation.createHTMLDocument("title"))}var me={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},ve=M.ie&&M.ie_version<=11,ge=function(){this.anchorNode=this.anchorOffset=this.focusNode=this.focusOffset=null};ge.prototype.set=function(t){this.anchorNode=t.anchorNode,this.anchorOffset=t.anchorOffset,this.focusNode=t.focusNode,this.focusOffset=t.focusOffset},ge.prototype.eq=function(t){return t.anchorNode==this.anchorNode&&t.anchorOffset==this.anchorOffset&&t.focusNode==this.focusNode&&t.focusOffset==this.focusOffset};var ye=function(t,e){var r=this;this.view=t,this.handleDOMChange=e,this.queue=[],this.flushingSoon=-1,this.observer=window.MutationObserver&&new window.MutationObserver((function(t){for(var e=0;et.target.nodeValue.length}))?r.flushSoon():r.flush()})),this.currentSelection=new ge,ve&&(this.onCharData=function(t){r.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),r.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.suppressingSelectionUpdates=!1};ye.prototype.flushSoon=function(){var t=this;this.flushingSoon<0&&(this.flushingSoon=window.setTimeout((function(){t.flushingSoon=-1,t.flush()}),20))},ye.prototype.forceFlush=function(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())},ye.prototype.start=function(){this.observer&&this.observer.observe(this.view.dom,me),ve&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()},ye.prototype.stop=function(){var t=this;if(this.observer){var e=this.observer.takeRecords();if(e.length){for(var r=0;r-1)){var t=this.observer?this.observer.takeRecords():[];this.queue.length&&(t=this.queue.concat(t),this.queue.length=0);var e=this.view.root.getSelection(),r=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(e)&&Ut(this.view)&&!this.ignoreSelectionChange(e),n=-1,o=-1,i=!1,s=[];if(this.view.editable)for(var a=0;a1){var l=s.filter((function(t){return"BR"==t.nodeName}));if(2==l.length){var u=l[0],p=l[1];u.parentNode&&u.parentNode.parentNode==p.parentNode?p.remove():u.remove()}}(n>-1||r)&&(n>-1&&(this.view.docView.markDirty(n,o),function(t){if(be)return;be=!0,"normal"==getComputedStyle(t.dom).whiteSpace&&console.warn("ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.")}(this.view)),this.handleDOMChange(n,o,i,s),this.view.docView.dirty?this.view.updateState(this.view.state):this.currentSelection.eq(e)||Ft(this.view),this.currentSelection.set(e))}},ye.prototype.registerMutation=function(t,e){if(e.indexOf(t.target)>-1)return null;var r=this.view.docView.nearestDesc(t.target);if("attributes"==t.type&&(r==this.view.docView||"contenteditable"==t.attributeName||"style"==t.attributeName&&!t.oldValue&&!t.target.getAttribute("style")))return null;if(!r||r.ignoreMutation(t))return null;if("childList"==t.type){var n=t.previousSibling,o=t.nextSibling;if(M.ie&&M.ie_version<=11&&t.addedNodes.length)for(var i=0;ii.depth?e(t,r,i.nodeAfter,i.before(n),o,!0):e(t,r,i.node(n),i.before(n),o,!1)})))return{v:!0}},a=i.depth+1;a>0;a--){var c=s(a);if(c)return c.v}return!1}function Oe(t,e,r){t.focused||t.focus();var n=t.state.tr.setSelection(e);"pointer"==r&&n.setMeta("pointer",!0),t.dispatch(n)}function Me(t,e,r,n,o){return Ae(t,"handleClickOn",e,r,n)||t.someProp("handleClick",(function(r){return r(t,e,n)}))||(o?function(t,e){if(-1==e)return!1;var r,n,o=t.state.selection;o instanceof l.c&&(r=o.node);for(var i=t.state.doc.resolve(e),s=i.depth+1;s>0;s--){var a=s>i.depth?i.nodeAfter:i.node(s);if(l.c.isSelectable(a)){n=r&&o.$from.depth>0&&s>=o.$from.depth&&i.before(o.$from.depth+1)==o.$from.pos?i.before(o.$from.depth):i.before(s);break}}return null!=n&&(Oe(t,l.c.create(t.state.doc,n),"pointer"),!0)}(t,r):function(t,e){if(-1==e)return!1;var r=t.state.doc.resolve(e),n=r.nodeAfter;return!!(n&&n.isAtom&&l.c.isSelectable(n))&&(Oe(t,new l.c(r),"pointer"),!0)}(t,r))}function De(t,e,r,n){return Ae(t,"handleDoubleClickOn",e,r,n)||t.someProp("handleDoubleClick",(function(r){return r(t,e,n)}))}function Ee(t,e,r,n){return Ae(t,"handleTripleClickOn",e,r,n)||t.someProp("handleTripleClick",(function(r){return r(t,e,n)}))||function(t,e){var r=t.state.doc;if(-1==e)return!!r.inlineContent&&(Oe(t,l.g.create(r,0,r.content.size),"pointer"),!0);for(var n=r.resolve(e),o=n.depth+1;o>0;o--){var i=o>n.depth?n.nodeAfter:n.node(o),s=n.before(o);if(i.inlineContent)Oe(t,l.g.create(r,s+1,s+1+i.content.size),"pointer");else{if(!l.c.isSelectable(i))continue;Oe(t,l.c.create(r,s),"pointer")}return!0}}(t,r)}function Te(t){return qe(t)}we.keydown=function(t,e){if(t.shiftKey=16==e.keyCode||e.shiftKey,!ze(t,e))if(t.domObserver.forceFlush(),t.lastKeyCode=e.keyCode,t.lastKeyCodeTime=Date.now(),!M.ios||13!=e.keyCode||e.ctrlKey||e.altKey||e.metaKey)t.someProp("handleKeyDown",(function(r){return r(t,e)}))||ne(t,e)?e.preventDefault():xe(t,"key");else{var r=Date.now();t.lastIOSEnter=r,t.lastIOSEnterFallbackTimeout=setTimeout((function(){t.lastIOSEnter==r&&(t.someProp("handleKeyDown",(function(e){return e(t,J(13,"Enter"))})),t.lastIOSEnter=0)}),200)}},we.keyup=function(t,e){16==e.keyCode&&(t.shiftKey=!1)},we.keypress=function(t,e){if(!(ze(t,e)||!e.charCode||e.ctrlKey&&!e.altKey||M.mac&&e.metaKey))if(t.someProp("handleKeyPress",(function(r){return r(t,e)})))e.preventDefault();else{var r=t.state.selection;if(!(r instanceof l.g&&r.$from.sameParent(r.$to))){var n=String.fromCharCode(e.charCode);t.someProp("handleTextInput",(function(e){return e(t,r.$from.pos,r.$to.pos,n)}))||t.dispatch(t.state.tr.insertText(n).scrollIntoView()),e.preventDefault()}}};var Ne=M.mac?"metaKey":"ctrlKey";ke.mousedown=function(t,e){t.shiftKey=e.shiftKey;var r=Te(t),n=Date.now(),o="singleClick";n-t.lastClick.time<500&&function(t,e){var r=e.x-t.clientX,n=e.y-t.clientY;return r*r+n*n<100}(e,t.lastClick)&&!e[Ne]&&("singleClick"==t.lastClick.type?o="doubleClick":"doubleClick"==t.lastClick.type&&(o="tripleClick")),t.lastClick={time:n,x:e.clientX,y:e.clientY,type:o};var i=t.posAtCoords(Se(e));i&&("singleClick"==o?t.mouseDown=new Ie(t,i,e,r):("doubleClick"==o?De:Ee)(t,i.pos,i.inside,e)?e.preventDefault():xe(t,"pointer"))};var Ie=function(t,e,r,n){var o,i,s=this;if(this.view=t,this.startDoc=t.state.doc,this.pos=e,this.event=r,this.flushed=n,this.selectNode=r[Ne],this.allowDefault=r.shiftKey,e.inside>-1)o=t.state.doc.nodeAt(e.inside),i=e.inside;else{var a=t.state.doc.resolve(e.pos);o=a.parent,i=a.depth?a.before():0}this.mightDrag=null;var c=n?null:r.target,u=c?t.docView.nearestDesc(c,!0):null;this.target=u?u.dom:null,(o.type.spec.draggable&&!1!==o.type.spec.selectable||t.state.selection instanceof l.c&&i==t.state.selection.from)&&(this.mightDrag={node:o,pos:i,addAttr:this.target&&!this.target.draggable,setUneditable:this.target&&M.gecko&&!this.target.hasAttribute("contentEditable")}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout((function(){return s.target.setAttribute("contentEditable","false")}),20),this.view.domObserver.start()),t.root.addEventListener("mouseup",this.up=this.up.bind(this)),t.root.addEventListener("mousemove",this.move=this.move.bind(this)),xe(t,"pointer")};function ze(t,e){return!!t.composing||!!(M.safari&&Math.abs(e.timeStamp-t.compositionEndedAt)<500)&&(t.compositionEndedAt=-2e8,!0)}Ie.prototype.done=function(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.view.mouseDown=null},Ie.prototype.up=function(t){if(this.done(),this.view.dom.contains(3==t.target.nodeType?t.target.parentNode:t.target)){var e=this.pos;this.view.state.doc!=this.startDoc&&(e=this.view.posAtCoords(Se(t))),this.allowDefault||!e?xe(this.view,"pointer"):Me(this.view,e.pos,e.inside,t,this.selectNode)?t.preventDefault():this.flushed||M.safari&&this.mightDrag&&!this.mightDrag.node.isAtom||M.chrome&&!(this.view.state.selection instanceof l.g)&&(e.pos==this.view.state.selection.from||e.pos==this.view.state.selection.to)?(Oe(this.view,l.f.near(this.view.state.doc.resolve(e.pos)),"pointer"),t.preventDefault()):xe(this.view,"pointer")}},Ie.prototype.move=function(t){!this.allowDefault&&(Math.abs(this.event.x-t.clientX)>4||Math.abs(this.event.y-t.clientY)>4)&&(this.allowDefault=!0),xe(this.view,"pointer")},ke.touchdown=function(t){Te(t),xe(t,"pointer")},ke.contextmenu=function(t){return Te(t)};var Re=M.android?5e3:-1;function Fe(t,e){clearTimeout(t.composingTimeout),e>-1&&(t.composingTimeout=setTimeout((function(){return qe(t)}),e))}function je(t){for(t.composing=!1;t.compositionNodes.length>0;)t.compositionNodes.pop().markParentsDirty()}function qe(t,e){if(t.domObserver.forceFlush(),je(t),e||t.docView.dirty){var r=Rt(t);return r&&!r.eq(t.state.selection)?t.dispatch(t.state.tr.setSelection(r)):t.updateState(t.state),!0}return!1}we.compositionstart=we.compositionupdate=function(t){if(!t.composing){t.domObserver.flush();var e=t.state,r=e.selection.$from;if(e.selection.empty&&(e.storedMarks||!r.textOffset&&r.parentOffset&&r.nodeBefore.marks.some((function(t){return!1===t.type.spec.inclusive}))))t.markCursor=t.state.storedMarks||r.marks(),qe(t,!0),t.markCursor=null;else if(qe(t),M.gecko&&e.selection.empty&&r.parentOffset&&!r.textOffset&&r.nodeBefore.marks.length)for(var n=t.root.getSelection(),o=n.focusNode,i=n.focusOffset;o&&1==o.nodeType&&0!=i;){var s=i<0?o.lastChild:o.childNodes[i-1];if(!s)break;if(3==s.nodeType){n.collapse(s,s.nodeValue.length);break}o=s,i=-1}t.composing=!0}Fe(t,Re)},we.compositionend=function(t,e){t.composing&&(t.composing=!1,t.compositionEndedAt=e.timeStamp,Fe(t,20))};var Be=M.ie&&M.ie_version<15||M.ios&&M.webkit_version<604;function $e(t,e,r,n){var o=le(t,e,r,t.shiftKey,t.state.selection.$from);if(t.someProp("handlePaste",(function(e){return e(t,n,o||O.j.empty)})))return!0;if(!o)return!1;var i=function(t){return 0==t.openStart&&0==t.openEnd&&1==t.content.childCount?t.content.firstChild:null}(o),s=i?t.state.tr.replaceSelectionWith(i,t.shiftKey):t.state.tr.replaceSelection(o);return t.dispatch(s.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}ke.copy=we.cut=function(t,e){var r=t.state.selection,n="cut"==e.type;if(!r.empty){var o=Be?null:e.clipboardData,i=ce(t,r.content()),s=i.dom,a=i.text;o?(e.preventDefault(),o.clearData(),o.setData("text/html",s.innerHTML),o.setData("text/plain",a)):function(t,e){if(t.dom.parentNode){var r=t.dom.parentNode.appendChild(document.createElement("div"));r.appendChild(e),r.style.cssText="position: fixed; left: -10000px; top: 10px";var n=getSelection(),o=document.createRange();o.selectNodeContents(e),t.dom.blur(),n.removeAllRanges(),n.addRange(o),setTimeout((function(){r.parentNode&&r.parentNode.removeChild(r),t.focus()}),50)}}(t,s),n&&t.dispatch(t.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))}},we.paste=function(t,e){var r=Be?null:e.clipboardData;r&&$e(t,r.getData("text/plain"),r.getData("text/html"),e)?e.preventDefault():function(t,e){if(t.dom.parentNode){var r=t.shiftKey||t.state.selection.$from.parent.type.spec.code,n=t.dom.parentNode.appendChild(document.createElement(r?"textarea":"div"));r||(n.contentEditable="true"),n.style.cssText="position: fixed; left: -10000px; top: 10px",n.focus(),setTimeout((function(){t.focus(),n.parentNode&&n.parentNode.removeChild(n),r?$e(t,n.value,null,e):$e(t,n.textContent,n.innerHTML,e)}),50)}}(t,e)};var Pe=function(t,e){this.slice=t,this.move=e},Le=M.mac?"altKey":"ctrlKey";for(var Ve in ke.dragstart=function(t,e){var r=t.mouseDown;if(r&&r.done(),e.dataTransfer){var n=t.state.selection,o=n.empty?null:t.posAtCoords(Se(e));if(o&&o.pos>=n.from&&o.pos<=(n instanceof l.c?n.to-1:n.to));else if(r&&r.mightDrag)t.dispatch(t.state.tr.setSelection(l.c.create(t.state.doc,r.mightDrag.pos)));else if(e.target&&1==e.target.nodeType){var i=t.docView.nearestDesc(e.target,!0);if(!i||!i.node.type.spec.draggable||i==t.docView)return;t.dispatch(t.state.tr.setSelection(l.c.create(t.state.doc,i.posBefore)))}var s=t.state.selection.content(),a=ce(t,s),c=a.dom,u=a.text;e.dataTransfer.clearData(),e.dataTransfer.setData(Be?"Text":"text/html",c.innerHTML),Be||e.dataTransfer.setData("text/plain",u),t.dragging=new Pe(s,!e[Le])}},ke.dragend=function(t){var e=t.dragging;window.setTimeout((function(){t.dragging==e&&(t.dragging=null)}),50)},we.dragover=we.dragenter=function(t,e){return e.preventDefault()},we.drop=function(t,e){var r=t.dragging;if(t.dragging=null,e.dataTransfer){var n=t.posAtCoords(Se(e));if(n){var o=t.state.doc.resolve(n.pos);if(o){var i=r&&r.slice||le(t,e.dataTransfer.getData(Be?"Text":"text/plain"),Be?null:e.dataTransfer.getData("text/html"),!1,o),s=r&&!e[Le];if(t.someProp("handleDrop",(function(r){return r(t,e,i||O.j.empty,s)})))e.preventDefault();else if(i){e.preventDefault();var a=i?Object(c.g)(t.state.doc,o.pos,i):o.pos;null==a&&(a=o.pos);var u=t.state.tr;s&&u.deleteSelection();var p=u.mapping.map(a),h=0==i.openStart&&0==i.openEnd&&1==i.content.childCount,f=u.doc;if(h?u.replaceRangeWith(p,p,i.content.firstChild):u.replaceRange(p,p,i),!u.doc.eq(f)){var d=u.doc.resolve(p);if(h&&l.c.isSelectable(i.content.firstChild)&&d.nodeAfter&&d.nodeAfter.sameMarkup(i.content.firstChild))u.setSelection(new l.c(d));else{var m=u.mapping.map(a);u.mapping.maps[u.mapping.maps.length-1].forEach((function(t,e,r,n){return m=n})),u.setSelection(Vt(t,d,u.doc.resolve(m)))}t.focus(),t.dispatch(u.setMeta("uiEvent","drop"))}}}}}},ke.focus=function(t){t.focused||(t.domObserver.stop(),t.dom.classList.add("ProseMirror-focused"),t.domObserver.start(),t.focused=!0,setTimeout((function(){t.docView&&t.hasFocus()&&!t.domObserver.currentSelection.eq(t.root.getSelection())&&Ft(t)}),20))},ke.blur=function(t){t.focused&&(t.domObserver.stop(),t.dom.classList.remove("ProseMirror-focused"),t.domObserver.start(),t.domObserver.currentSelection.set({}),t.focused=!1)},ke.beforeinput=function(t,e){if(M.chrome&&M.android&&"deleteContentBackward"==e.inputType){var r=t.domChangeCount;setTimeout((function(){if(t.domChangeCount==r&&(t.dom.blur(),t.focus(),!t.someProp("handleKeyDown",(function(e){return e(t,J(8,"Backspace"))})))){var e=t.state.selection.$cursor;e&&e.pos>0&&t.dispatch(t.state.tr.delete(e.pos-1,e.pos).scrollIntoView())}}),50)}},we)ke[Ve]=we[Ve];function Ue(t,e){if(t==e)return!0;for(var r in t)if(t[r]!==e[r])return!1;for(var n in e)if(!(n in t))return!1;return!0}var Je=function(t,e){this.spec=e||Ye,this.side=this.spec.side||0,this.toDOM=t};Je.prototype.map=function(t,e,r,n){var o=t.mapResult(e.from+n,this.side<0?-1:1),i=o.pos;return o.deleted?null:new He(i-r,i-r,this)},Je.prototype.valid=function(){return!0},Je.prototype.eq=function(t){return this==t||t instanceof Je&&(this.spec.key&&this.spec.key==t.spec.key||this.toDOM==t.toDOM&&Ue(this.spec,t.spec))};var We=function(t,e){this.spec=e||Ye,this.attrs=t};We.prototype.map=function(t,e,r,n){var o=t.map(e.from+n,this.spec.inclusiveStart?-1:1)-r,i=t.map(e.to+n,this.spec.inclusiveEnd?1:-1)-r;return o>=i?null:new He(o,i,this)},We.prototype.valid=function(t,e){return e.from=t&&(!o||o(s.spec))&&r.push(s.copy(s.from+n,s.to+n))}for(var a=0;at){var c=this.children[a]+1;this.children[a+2].findInner(t-c,e-c,r,n+c,o)}},Xe.prototype.map=function(t,e,r){return this==Qe||0==t.maps.length?this:this.mapInner(t,e,0,0,r||Ye)},Xe.prototype.mapInner=function(t,e,r,n,o){for(var i,s=0;sc+i||(e>=a[s]+i?a[s+1]=-1:r>=o&&(l=n-r-(e-t))&&(a[s]+=l,a[s+1]+=l))}},l=0;l=n.content.size){u=!0;continue}var d=r.map(t[p+1]+i,-1)-o,m=n.content.findIndex(f),v=m.index,g=m.offset,y=n.maybeChild(v);if(y&&g==f&&g+y.nodeSize==d){var b=a[p+2].mapInner(r,y,h+1,t[p]+i+1,s);b!=Qe?(a[p]=f,a[p+1]=d,a[p+2]=b):(a[p+1]=-2,u=!0)}else u=!0}if(u){var k=or(function(t,e,r,n,o,i,s){function a(t,e){for(var i=0;is&&l.to=t){this.children[o]==t&&(r=this.children[o+2]);break}for(var i=t+1,s=i+e.content.size,a=0;ai&&c.type instanceof We){var l=Math.max(i,c.from)-i,u=Math.min(s,c.to)-i;lr&&s.to0;)e++;t.splice(e,0,r)}function cr(t){var e=[];return t.someProp("decorations",(function(r){var n=r(t.state);n&&n!=Qe&&e.push(n)})),t.cursorWrapper&&e.push(Xe.create(t.state.doc,[t.cursorWrapper.deco])),tr.from(e)}tr.prototype.forChild=function(t,e){if(e.isLeaf)return Xe.empty;for(var r=[],n=0;nn.scrollToSelection?"to selection":"preserve",p=o||!this.docView.matchesNode(t.doc,c,a);!p&&t.selection.eq(n.selection)||(i=!0);var h,f,d,m,v,g,y,b,k,w,x,_="preserve"==u&&i&&null==this.dom.style.overflowAnchor&&function(t){for(var e,r,n=t.dom.getBoundingClientRect(),o=Math.max(0,n.top),i=(n.left+n.right)/2,s=o+1;s=o-20){e=a,r=c.top;break}}}return{refDOM:e,refTop:r,stack:Z(t.dom)}}(this);if(i){this.domObserver.stop();var C=p&&(M.ie||M.chrome)&&!this.composing&&!n.selection.empty&&!t.selection.empty&&(m=n.selection,v=t.selection,g=Math.min(m.$anchor.sharedDepth(m.head),v.$anchor.sharedDepth(v.head)),m.$anchor.start(g)!=v.$anchor.start(g));if(p){var S=M.chrome?this.trackWrites=this.root.getSelection().focusNode:null;!o&&this.docView.update(t.doc,c,a,this)||(this.docView.updateOuterDeco([]),this.docView.destroy(),this.docView=kt(t.doc,c,a,this.dom,this)),S&&!this.trackWrites&&(C=!0)}C||!(this.mouseDown&&this.domObserver.currentSelection.eq(this.root.getSelection())&&(h=this,f=h.docView.domFromPos(h.state.selection.anchor,0),d=h.root.getSelection(),q(f.node,f.offset,d.anchorNode,d.anchorOffset)))?Ft(this,C):(Pt(this,t.selection),this.domObserver.setCurSelection()),this.domObserver.start()}if(this.updatePluginViews(n),"reset"==u)this.dom.scrollTop=0;else if("to selection"==u){var A=this.root.getSelection().focusNode;this.someProp("handleScrollToSelection",(function(t){return t(r)}))||(t.selection instanceof l.c?G(this,this.docView.domAfterPos(t.selection.from).getBoundingClientRect(),A):G(this,this.coordsAtPos(t.selection.head,1),A))}else _&&(b=(y=_).refDOM,k=y.refTop,w=y.stack,x=b?b.getBoundingClientRect().top:0,Y(w,0==x?0:x-k))},lr.prototype.destroyPluginViews=function(){for(var t;t=this.pluginViews.pop();)t.destroy&&t.destroy()},lr.prototype.updatePluginViews=function(t){if(t&&t.plugins==this.state.plugins)for(var e=0;e=0;e--){var r=t.index(e);if(0!=r)for(var n=t.node(e).child(r-1);;n=n.lastChild){if(0==n.childCount&&!n.inlineContent||n.isAtom||n.type.spec.isolating)return!0;if(n.inlineContent)return!1}}return!0}(t)||!function(t){for(var e=t.depth;e>=0;e--){var r=t.indexAfter(e),n=t.node(e);if(r!=n.childCount)for(var o=n.child(r);;o=o.firstChild){if(0==o.childCount&&!o.inlineContent||o.isAtom||o.type.spec.isolating)return!0;if(o.inlineContent)return!1}}return!0}(t))return!1;var r=e.type.spec.allowGapCursor;if(null!=r)return r;var n=e.contentMatchAt(t.index()).defaultType;return n&&n.isTextblock},e.findFrom=function(t,r,n){t:for(;;){if(!n&&e.valid(t))return t;for(var o=t.pos,i=null,s=t.depth;;s--){var a=t.node(s);if(r>0?t.indexAfter(s)0){i=a.child(r>0?t.indexAfter(s):t.index(s)-1);break}if(0==s)return null;o+=r;var c=t.doc.resolve(o);if(e.valid(c))return c}for(;;){var u=r>0?i.firstChild:i.lastChild;if(!u){if(i.isAtom&&!i.isText&&!l.c.isSelectable(i)){t=t.doc.resolve(o+i.nodeSize*r),n=!1;continue t}break}i=u,o+=r;var p=t.doc.resolve(o);if(e.valid(p))return p}return null}},e}(l.f);vr.prototype.visible=!1,l.f.jsonID("gapcursor",vr);var gr=function(t){this.pos=t};gr.prototype.map=function(t){return new gr(t.map(this.pos))},gr.prototype.resolve=function(t){var e=t.resolve(this.pos);return vr.valid(e)?new vr(e):l.f.near(e)};var yr=Object(A.a)({ArrowLeft:br("horiz",-1),ArrowRight:br("horiz",1),ArrowUp:br("vert",-1),ArrowDown:br("vert",1)});function br(t,e){var r="vert"==t?e>0?"down":"up":e>0?"right":"left";return function(t,n,o){var i=t.selection,s=e>0?i.$to:i.$from,a=i.empty;if(i instanceof l.g){if(!o.endOfTextblock(r)||0==s.depth)return!1;a=!1,s=t.doc.resolve(e>0?s.after():s.before())}var c=vr.findFrom(s,e,a);return!!c&&(n&&n(t.tr.setSelection(new vr(c))),!0)}}function kr(t,e,r){if(!t.editable)return!1;var n=t.state.doc.resolve(e);if(!vr.valid(n))return!1;var o=t.posAtCoords({left:r.clientX,top:r.clientY}).inside;return!(o>-1&&l.c.isSelectable(t.state.doc.nodeAt(o)))&&(t.dispatch(t.state.tr.setSelection(new vr(n))),!0)}function wr(t){if(!(t.selection instanceof vr))return null;var e=document.createElement("div");return e.className="ProseMirror-gapcursor",Xe.create(t.doc,[He.widget(t.selection.head,e,{key:"gapcursor"})])}var xr=r(16),_r=r.n(xr);var Cr=/^data:((?:\w+\/(?:(?!;).)+)?)((?:;[\w\W]*?[^;])*),(.+)$/,Sr=new DOMParser;function Ar(t){return function(e,r,n,o,i,s){if(s&&n.type===t.nodes.spoiler&&"P"!==i.target.tagName)return n.attrs.open=!n.attrs.open,e.focus(),i.stopPropagation(),i.preventDefault(),!1}}var Or=r(5);function Mr(t){return Object(Or.f)(/^(\d+)(\.|\))\s$/,t,(function(t){return{order:+t[1]}}),(function(t,e){return e.childCount+e.attrs.order==+t[1]}))}function Dr(t){return Object(Or.f)(/^\s*([-+*])\s$/,t)}function Er(t){return Object(Or.d)(/^```$/,t)}function Tr(t,e){return Object(Or.d)(new RegExp("^(#{1,"+e+"})\\s$"),t,(function(t){return{level:t[1].length}}))}function Nr(t){return Object(Or.f)(/^\s*>!\s$/,t)}var Ir=r(26),zr=r(34),Rr=r(28),Fr=function(){function t(t,e){this.build(t,e)}var e=t.prototype;return e.build=function(t,e){var r=this;this.attrs=e,this.schema=(new Rr.a).build(),this.parser=new zr.a(this.schema).build(),this.serializer=new Ir.a(this.schema).build(),this.state=l.b.create(this.buildEditorStateConfig()),this.view=new lr(t,this.buildEditorProps()),(e.classNames||[]).forEach((function(t){return r.view.dom.classList.add(t)}));var n=function(e){r.attrs.inputListeners.forEach((function(e){e.call(t)})),e.redraw=!1};t.oninput=n,t.onclick=n,t.onkeyup=n},e.buildEditorStateConfig=function(){return{doc:this.parseInitialValue(this.attrs.value),disabled:this.attrs.disabled,schema:this.schema,plugins:this.buildPluginItems().toArray()}},e.buildPluginItems=function(){var t,e,r,o,i=new _r.a;return i.add("markdownInputrules",Object(Or.c)({rules:this.buildInputRules(this.schema)})),i.add("submit",Object(A.b)({"Mod-Enter":this.attrs.onsubmit})),i.add("escape",Object(A.b)({Escape:this.attrs.escape})),i.add("richTextKeymap",Object(A.b)(function(t){var e=function(e,r){return r(e.tr.replaceSelectionWith(t.nodes.hard_break.create()).scrollIntoView()),!0},r=[function(t,e){var r=$(".EmojiDropdown:visible"),n=$(".MentionsDropdown:visible");if(r[0]||n[0])return!0},Object(n.k)(t.nodes.list_item),function(t,e,r){var o=t.selection,i=o.$head,s=o.$anchor;if(!i.parent.type.spec.code||!i.sameParent(s))return!1;var a=t.selection.$from.nodeBefore,c=t.selection.$from.nodeAfter;return a&&"\n"!==a.text.slice(-1)||c?Object(n.f)(t,e):(r.dispatch(r.state.tr.delete(t.selection.from-1,t.selection.from)),r.dispatch(r.state.tr.setSelection(l.g.near(r.state.doc.resolve(r.state.selection.from)))),Object(n.c)(r.state,r.dispatch))}];app.session.user.preferences().richTextCompactParagraphs&&r.push((function(t,r,n){var o=t.selection,i=o.$head,s=o.$anchor;if("paragraph"!==i.parent.type.name||!i.sameParent(s))return!1;var a=t.selection.$from.nodeBefore,c=t.selection.$from.nodeAfter;if(a&&a.text&&"\n"!==a.text.slice(-1))return e(n.state,n.dispatch);!a||a.text||c||(n.dispatch(n.state.tr.delete(t.selection.from-1,t.selection.from)),n.dispatch(n.state.tr.setSelection(l.g.near(n.state.doc.resolve(n.state.selection.from)))))}));var o=n.b.apply(void 0,r);return{"Mod-z":C,"Mod-y":S,"Mod-Shift-z":S,Backspace:Or.e,"Mod-b":Object(n.n)(t.marks.strong),"Mod-i":Object(n.n)(t.marks.em),"Mod-`":Object(n.n)(t.marks.code),"Alt-Shift-5":Object(n.n)(t.marks.strike),"Mod-,":Object(n.n)(t.marks.sub),"Mod-.":Object(n.n)(t.marks.sup),"Mod-;":Object(n.n)(t.marks.spoiler_inline),"Shift-Mod-8":Object(n.m)(t.nodes.bullet_list),"Shift-Mod-9":Object(n.m)(t.nodes.ordered_list),"Mod-q":Object(n.q)(t.nodes.blockquote),"Shift-Ctrl-0":Object(n.i)(t.nodes.paragraph),"Shift-Ctrl-1":Object(n.i)(t.nodes.heading,{level:1}),"Shift-Ctrl-2":Object(n.i)(t.nodes.heading,{level:2}),"Shift-Ctrl-3":Object(n.i)(t.nodes.heading,{level:3}),"Shift-Ctrl-4":Object(n.i)(t.nodes.heading,{level:4}),"Shift-Ctrl-5":Object(n.i)(t.nodes.heading,{level:5}),"Shift-Ctrl-6":Object(n.i)(t.nodes.heading,{level:6}),"Shift-Ctrl-\\":Object(n.i)(t.nodes.code_block),"Mod-]":Object(n.j)(t.nodes.list_item),"Mod-m":Object(n.j)(t.nodes.list_item),"Mod-[":Object(n.d)(t.nodes.list_item),"Mod-Shift-m":Object(n.d)(t.nodes.list_item),Enter:o,"Shift-Enter":Object(n.b)(n.f,e)}}(this.schema))),i.add("baseKeymap",Object(A.b)(n.a)),i.add("placeholder",(t=this.attrs.placeholder,new l.d({props:{decorations:function(e){var r=[];if(1===e.doc.childCount){var n=e.doc.child(0);n.type.isBlock&&0===n.childCount&&n.type==e.schema.nodes.paragraph&&r.push(He.node(0,n.nodeSize,{class:"placeholder","data-before":t}))}return Xe.create(e.doc,r)}}}))),i.add("history",_()),i.add("disabled",new l.d({key:new l.e("disabled"),props:{editable:function(t){return!t.disabled$}},state:{init:function(t){return t.disabled},apply:function(t,e){var r=t.getMeta("disabled");return void 0!==r?r:e}}})),i.add("disableBase64Paste",new l.d({props:{transformPastedHTML:function(t){var e=Sr.parseFromString(t,"text/html");return e.querySelectorAll("img").forEach((function(t){Cr.test(t.src)&&t.remove()})),e.documentElement.outerHTML}}})),i.add("dropCursor",(void 0===e&&(e={}),new l.d({view:function(t){return new mr(t,e)}}))),i.add("gapCursor",new l.d({props:{decorations:wr,createSelectionBetween:function(t,e,r){if(e.pos==r.pos&&vr.valid(r))return new vr(r)},handleClick:kr,handleKeyDown:yr}})),i.add("menu",(r=this.attrs.menuState,new l.d({view:function(t){return r.attachEditorView(t),r}}))),i.add("toggleSpoiler",(o=this.schema,new l.d({props:{handleClickOn:Ar(o),handleDoubleClickOn:Ar(o)}}))),i},e.buildEditorProps=function(){var t=this;return{state:this.state,dispatchTransaction:function(e){var r=this.state.apply(e);this.updateState(r);var n=this.state.doc,o=t.serializeContent(n,t.schema);t.attrs.oninput(o)}}},e.buildInputRules=function(t){return function(t){var e;return[Or.b,(e=t.nodes.blockquote,Object(Or.f)(/^\s*>\s$/,e)),Mr(t.nodes.ordered_list),Dr(t.nodes.bullet_list),Er(t.nodes.code_block),Tr(t.nodes.heading,6),Nr(t.nodes.spoiler),Object(n.g)(/(?:___\s|\*\*\*\s|---)$/,t.nodes.horizontal_rule),Object(Or.d)(/^\s*\$\$\s$/,t.nodes.math_block),Object(n.e)(/(?:\*\*|__)([^\*_]+)(?:\*\*|__)$/,t.marks.strong),Object(n.e)(/(?:^|[^_])(_([^_]+)_)$/,t.marks.em),Object(n.e)(/(?:^|[^*])(\*([^*]+)\*)$/,t.marks.em),Object(n.e)(/(?:`)([^`]+)(?:`)$/,t.marks.code),Object(n.e)(/(?:~~)([^~]+)(?:~~)$/,t.marks.strike),Object(n.e)(/(?:[^~]~)([^~]+)(?:~)$/,t.marks.sub),Object(n.e)(/(?:\^)([^^]+)(?:\^)$/,t.marks.sup),Object(n.e)(/(?:\|\|)([^\|]+)(?:\|\|)$/,t.marks.spoiler_inline),Object(n.e)(/(?:>!)(.+)(?:!<)$/,t.marks.spoiler_inline),Object(n.e)(/(?:\$)([^$]+)(?:\$)$/,t.marks.math_inline)]}(t)},e.parseInitialValue=function(t){return this.parser.parse(t)},e.serializeContent=function(t){return this.serializer.serialize(t,{tightLists:!0})},e.moveCursorTo=function(t){this.setSelectionRange(t,t)},e.getSelectionRange=function(){return[this.view.state.selection.from,this.view.state.selection.to]},e.getLastNChars=function(t){var e=this.view.state.selection.$from.nodeBefore;return e&&e.text?e.text.slice(Math.max(0,e.text.length-t)):""},e.insertAtCursor=function(t,e){this.insertAt(this.getSelectionRange()[0],t,e),$(this.view.dom).trigger("click")},e.insertAt=function(t,e,r){this.insertBetween(t,t,e,r)},e.insertBetween=function(t,e,r,o){var i,s=this;void 0===o&&(o=!0),o?this.view.dispatch(this.view.state.tr.insertText(r,t,e)):(t-=1,this.view.dispatch(this.view.state.tr.replaceRangeWith(t,e,this.parseInitialValue(r))),i=r.match(/\s+$/)[0].split("\n").length-1),this.moveCursorTo(Math.min(t+r.length,l.f.atEnd(this.view.state.doc).to)),m.redraw(),r.endsWith(" ")&&!o&&this.insertAtCursor(" "),Array(i).fill(0).forEach((function(){n.a.Enter(s.view.state,s.view.dispatch)}))},e.replaceBeforeCursor=function(t,e,r){this.insertBetween(t,this.getSelectionRange()[0],e,r)},e.setSelectionRange=function(t,e){var r=this.view.state.tr.doc.resolve(t),n=this.view.state.tr.doc.resolve(e);this.view.dispatch(this.view.state.tr.setSelection(new l.g(r,n))),this.focus()},e.getCaretCoordinates=function(t){var e=this.view.coordsAtPos(t),r=this.view.dom.getBoundingClientRect();return{left:e.left-r.left,top:e.top-r.top}},e.focus=function(){this.view.focus()},e.destroy=function(){this.view.destroy()},e.disabled=function(t){this.view.dispatch(this.view.state.tr.setMeta("disabled",t))},t}()},function(t,e,r){"use strict";r.d(e,"a",(function(){return D}));var n=r(12),o=r(27),i=r.n(o),s=r(51),a=r.n(s),c=r(52),l=r.n(c),u=r(53),p=r.n(u),h=r(7);function f(t){switch(t){case 10:case 33:case 35:case 36:case 37:case 38:case 42:case 43:case 45:case 58:case 60:case 61:case 62:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}var d=function(t,e){for(var r=t.pos;r=4)return!1;if(62!==e.src.charCodeAt(O)||!t.followingCharRegex.test(e.src[O+1]))return!1;if(O+=t.markup.length,o)return!0;c=f=e.sCount[r]+O-(e.bMarks[r]+e.tShift[r]),32===e.src.charCodeAt(O)?(O++,c++,f++,i=!1,w=!0):9===e.src.charCodeAt(O)?(w=!0,(e.bsCount[r]+f)%4==3?(O++,c++,f++,i=!1):i=!0):w=!1;var D=!1,E=!1,T=O;if(">!"===t.markup)for(;O=M,b=[e.sCount[r]],e.sCount[r]=f-c,k=[e.tShift[r]],e.tShift[r]=O-e.bMarks[r],_=e.md.block.ruler.getRules("spoiler"),y=e.parentType,e.parentType="spoiler",S=!1,h=r+1;h=(M=e.eMarks[h])));h++)if(O+=t.markup.length,62!==e.src.charCodeAt(O-t.markup.length)||!t.followingCharRegex.test(e.src[O-t.markup.length+1])||S){if(u)break;for(x=!1,a=0,l=_.length;a=M,m.push(e.bsCount[h]),e.bsCount[h]=e.sCount[h]+1+(w?1:0),b.push(e.sCount[h]),e.sCount[h]=f-c,k.push(e.tShift[h]),e.tShift[h]=O-e.bMarks[h]}for(g=e.blkIndent,e.blkIndent=0,(C=e.push(t.name+"_open",t.name,1)).markup=t.markup,C.map=p=[r,0],e.md.block.tokenize(e,r,h),(C=e.push(t.name+"_close",t.name,-1)).markup=t.markup,e.lineMax=A,e.parentType=y,p[1]=e.line,a=0;a!",name:"spoiler"},t,e,r,n)}function b(t,e,r,n){return g({followingCharRegex:/[^!]/,markup:">",name:"blockquote"},t,e,r,n)}function k(t){t.block.ruler.__rules__.forEach((function(t){var e=t.alt.indexOf("blockquote");e>-1&&t.alt.splice(e,0,"spoiler")})),t.block.ruler.before("blockquote","spoiler",y,{alt:["paragraph","reference","spoiler","blockquote","list"]}),t.block.ruler.at("blockquote",b,{alt:["paragraph","reference","spoiler","blockquote","list"]})} + */function o(t){return e=>function(t,e){for(let r=t.depth;r>0;r-=1){const n=t.node(r);if(e(n))return{pos:r>0?t.before(r):0,start:t.start(r),depth:r,node:n}}}(e.$from,t)}function i(t){return function(e){if(function(t){return t instanceof n.c}(e)){const{node:r}=e,{$from:n}=e;if(function(t,e){return Array.isArray(t)&&t.indexOf(e.type)>-1||e.type===t}(t,r))return{node:r,pos:n.pos,depth:n.depth}}}}function s(t,e){const{from:r,to:n}=t.selection;let o=[];t.doc.nodesBetween(r,n,t=>{o=[...o,...t.marks]});const i=o.find(t=>t.type.name===e.name);return i?i.attrs:{}}function a(t=null,e=null){if(!t||!e)return!1;const r=t.parent.childAfter(t.parentOffset);if(!r.node)return!1;const n=r.node.marks.find(t=>t.type===e);if(!n)return!1;let o=t.index(),i=t.start()+r.offset,s=o+1,a=i+r.node.nodeSize;for(;o>0&&n.isInSet(t.parent.child(o-1).marks);)o-=1,i-=t.parent.child(o).nodeSize;for(;st.type===e)(t.selection);return Object.keys(r).length&&n?n.node.hasMarkup(e,{...n.node.attrs,...r}):!!n}},function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));var n=r(6),o=r(2),i=function(t){function e(){return t.apply(this,arguments)||this}return Object(n.a)(e,t),e.initAttrs=function(t){t.command=Object(o.n)(t.mark)},e.prototype.onEditorUpdate=function(){this.$().toggleClass("active",!!this.state.markActive(this.attrs.mark))},e}(r(10).a)},function(t,e,r){"use strict";r.d(e,"a",(function(){return y})),r.d(e,"b",(function(){return g}));for(var n={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",229:"q"},o={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"',229:"Q"},i="undefined"!=typeof navigator&&/Chrome\/(\d+)/.exec(navigator.userAgent),s="undefined"!=typeof navigator&&/Apple Computer/.test(navigator.vendor),a="undefined"!=typeof navigator&&/Gecko\/\d+/.test(navigator.userAgent),c="undefined"!=typeof navigator&&/Mac/.test(navigator.platform),l="undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),u=i&&(c||+i[1]<57)||a&&c,p=0;p<10;p++)n[48+p]=n[96+p]=String(p);for(p=1;p<=24;p++)n[p+111]="F"+p;for(p=65;p<=90;p++)n[p]=String.fromCharCode(p+32),o[p]=String.fromCharCode(p);for(var h in n)o.hasOwnProperty(h)||(o[h]=n[h]);var f=r(1),d="undefined"!=typeof navigator&&/Mac/.test(navigator.platform);function m(t){var e,r,n,o,i=t.split(/-(?!$)/),s=i[i.length-1];"Space"==s&&(s=" ");for(var a=0;a127)&&(i=n[r.keyCode])&&i!=a){var h=e[v(i,r,!0)];if(h&&h(t.state,t.dispatch,t))return!0}else if(c&&r.shiftKey){var f=e[v(a,r,!0)];if(f&&f(t.state,t.dispatch,t))return!0}return!1}}},function(t,e){t.exports=flarum.core.compat["common/utils/ItemList"]},function(t,e){t.exports=flarum.core.compat["common/utils/Stream"]},function(t,e){t.exports=flarum.core.compat["common/components/Button"]},function(t,e){t.exports=flarum.core.compat["common/helpers/icon"]},function(t,e){t.exports=flarum.core.compat["common/components/Dropdown"]},function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));var n=r(6),o=r(54),i=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.className=function(){return"LoadingModal Modal--small"},r.title=function(){return this.attrs.title},r.oncreate=function(e){t.prototype.oncreate.call(this,e),this.$(".CommandButton").on("click",(function(){app.modal.close()}))},r.content=function(){var t=this.attrs.onsubmit?this.attrs.onsubmit.bind(this):function(){};return m("div",{className:"Modal-body"},m("form",{className:"Form",onsubmit:t},this.attrs.vnodeContent))},e}(r.n(o).a)},function(t,e,r){"use strict";r.d(e,"a",(function(){return v}));var n=r(6),o=r(18),i=r.n(o),s=r(20),a=r.n(s),c=r(9),l=r.n(c),u=r(19),p=r.n(u),h=r(16),f=r.n(h),d=r(21),v=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t),e.initAttrs=function(t){t.buttonClassName="Button Button--icon Button--link Button--menuDropdown"};var r=e.prototype;return r.oninit=function(e){t.prototype.oninit.call(this,e),this.state=this.attrs.state},r.oncreate=function(e){var r=this;t.prototype.oncreate.call(this,e),this.$().on("click",(function(t){$(".App").is(".mobile-safari")&&(app.modal.show(d.a,{title:r.attrs.tooltip,vnodeContent:r.fields().toArray(),onsubmit:r.onsubmit.bind(r)}),t.stopPropagation())})),this.$().on("shown.bs.dropdown",(function(){r.$(".Dropdown-menu").find("input, select, textarea").first().focus().select()}))},r.getButtonContent=function(t){return m(l.a,{text:this.attrs.tooltip},m("span",null,p()(this.attrs.icon)))},r.getMenu=function(t){return m("ul",{className:"Dropdown-menu dropdown-menu FormDropdown"},m("form",{className:"Form",onsubmit:this.onsubmit.bind(this)},this.fields().toArray()))},r.fields=function(){var t=new f.a;return t.add("insert",m(i.a,{type:"submit",className:"Button Button--primary"},app.translator.trans("askvortsov-rich-text.lib.composer.insert_button"))),t},r.onsubmit=function(t){app.modal.close(),t.preventDefault(),$("body").trigger("click"),this.insert(t),app.composer.editor.focus()},r.insert=function(t){},e}(a.a)},function(t,e){t.exports=flarum.core.compat["common/extend"]},function(t,e,r){"use strict";r.d(e,"a",(function(){return s}));var n=r(6),o=r(10),i=r(2),s=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.oninit=function(e){var r=this;e.attrs.command=function(t,n){return Object(i.m)(e.attrs.listType,r.active?t.schema.nodes.list_item:void 0)(t,n)},t.prototype.oninit.call(this,e)},r.onEditorUpdate=function(){this.active=!!this.state.nodeActive(this.attrs.listType),this.$().toggleClass("active",this.active)},e}(o.a)},function(t,e){t.exports=flarum.core.compat["common/components/TextEditor"]},function(t,e,r){"use strict";r.d(e,"a",(function(){return s}));var n=r(12),o=r(7);function i(t){return t.open instanceof Function||t.close instanceof Function?(error("markdown-serializer genMarkupAwareMarkSpec","Unable to extend mark config with open/close as functions",t),t):Object(n.a)({},t,{open:function(e,r){return r.attrs.markup||t.open},close:function(e,r){var n=r.attrs.markup;return(n=/^<[a-z]+>$/i.test(n)?n.replace(/^! ",null,e,(function(){return t.renderContent(e)}))},math_block:function(t,e){t.write("$$\n"),t.text(e.textContent,!1),t.ensureNewLine(),t.write("$$"),t.closeBlock(e)},paragraph:function(t,e){0===e.content.size?t.write("\n"):o.e.nodes.paragraph(t,e)},hard_break:function(t,e,r,n){for(var o=n+1;o!",close:"!<",mixable:!0,expelEnclosingWhitespace:!0}),strike:i({open:"~~",close:"~~",mixable:!0,expelEnclosingWhitespace:!0}),sub:i({open:"~",close:"~",mixable:!0,expelEnclosingWhitespace:!0}),sup:i({open:"^",close:"^",mixable:!0,expelEnclosingWhitespace:!0}),math_inline:Object(n.a)({},i({open:"$",close:"$",mixable:!1,expelEnclosingWhitespace:!0}),{escape:!1})})},e.build=function(){return new o.b(this.buildNodes(),this.buildMarks())},t}()},function(t,e,r){"use strict";t.exports=r(55)},function(t,e,r){"use strict";r.d(e,"a",(function(){return l}));var n=r(12),o=r(7),i=r(0);function s(){for(var t=arguments.length,e=new Array(t),r=0;r=e?o.empty:this.sliceInner(Math.max(0,t),Math.min(this.length,e))},o.prototype.get=function(t){if(!(t<0||t>=this.length))return this.getInner(t)},o.prototype.forEach=function(t,e,r){void 0===e&&(e=0),void 0===r&&(r=this.length),e<=r?this.forEachInner(t,e,r,0):this.forEachInvertedInner(t,e,r,0)},o.prototype.map=function(t,e,r){void 0===e&&(e=0),void 0===r&&(r=this.length);var n=[];return this.forEach((function(e,r){return n.push(t(e,r))}),e,r),n},o.from=function(t){return t instanceof o?t:t&&t.length?new i(t):o.empty};var i=function(t){function e(e){t.call(this),this.values=e}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={length:{configurable:!0},depth:{configurable:!0}};return e.prototype.flatten=function(){return this.values},e.prototype.sliceInner=function(t,r){return 0==t&&r==this.length?this:new e(this.values.slice(t,r))},e.prototype.getInner=function(t){return this.values[t]},e.prototype.forEachInner=function(t,e,r,n){for(var o=e;o=r;o--)if(!1===t(this.values[o],n+o))return!1},e.prototype.leafAppend=function(t){if(this.length+t.length<=200)return new e(this.values.concat(t.flatten()))},e.prototype.leafPrepend=function(t){if(this.length+t.length<=200)return new e(t.flatten().concat(this.values))},r.length.get=function(){return this.values.length},r.depth.get=function(){return 0},Object.defineProperties(e.prototype,r),e}(o);o.empty=new i([]);var s=function(t){function e(e,r){t.call(this),this.left=e,this.right=r,this.length=e.length+r.length,this.depth=Math.max(e.depth,r.depth)+1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},e.prototype.getInner=function(t){return to&&!1===this.right.forEachInner(t,Math.max(e-o,0),Math.min(this.length,r)-o,n+o))&&void 0)},e.prototype.forEachInvertedInner=function(t,e,r,n){var o=this.left.length;return!(e>o&&!1===this.right.forEachInvertedInner(t,e-o,Math.max(r,o)-o,n+o))&&(!(r=r?this.right.slice(t-r,e-r):this.left.slice(t,r).append(this.right.slice(0,e-r))},e.prototype.leafAppend=function(t){var r=this.right.leafAppend(t);if(r)return new e(this.left,r)},e.prototype.leafPrepend=function(t){var r=this.left.leafPrepend(t);if(r)return new e(r,this.right)},e.prototype.appendInner=function(t){return this.left.depth>=Math.max(this.right.depth,t.depth)+1?new e(this.left,new e(this.right,t)):new e(this,t)},e}(o),a=o,c=r(3),l=r(1),u=function(t,e){this.items=t,this.eventCount=e};u.prototype.popEvent=function(t,e){var r=this;if(0==this.eventCount)return null;for(var n,o,i=this.items.length;;i--){if(this.items.get(i-1).selection){--i;break}}e&&(n=this.remapping(i,this.items.length),o=n.maps.length);var s,a,c=t.tr,l=[],h=[];return this.items.forEach((function(t,e){if(!t.step)return n||(n=r.remapping(i,e+1),o=n.maps.length),o--,void h.push(t);if(n){h.push(new p(t.map));var f,d=t.step.map(n.slice(o));d&&c.maybeStep(d).doc&&(f=c.mapping.maps[c.mapping.maps.length-1],l.push(new p(f,null,null,l.length+h.length))),o--,f&&n.appendMap(f,o)}else c.maybeStep(t.step);return t.selection?(s=n?t.selection.map(n.slice(o)):t.selection,a=new u(r.items.slice(0,i).append(h.reverse().concat(l)),r.eventCount-1),!1):void 0}),this.items.length,0),{remaining:a,transform:c,selection:s}},u.prototype.addTransform=function(t,e,r,n){for(var o=[],i=this.eventCount,s=this.items,a=!n&&s.length?s.get(s.length-1):null,c=0;cf&&(v=y,(m=s).forEach((function(t,e){if(t.selection&&0==v--)return g=e,!1})),s=m.slice(g),i-=y),new u(s.append(o),i)},u.prototype.remapping=function(t,e){var r=new c.a;return this.items.forEach((function(e,n){var o=null!=e.mirrorOffset&&n-e.mirrorOffset>=t?r.maps.length-e.mirrorOffset:null;r.appendMap(e.map,o)}),t,e),r},u.prototype.addMaps=function(t){return 0==this.eventCount?this:new u(this.items.append(t.map((function(t){return new p(t)}))),this.eventCount)},u.prototype.rebased=function(t,e){if(!this.eventCount)return this;var r=[],n=Math.max(0,this.items.length-e),o=t.mapping,i=t.steps.length,s=this.eventCount;this.items.forEach((function(t){t.selection&&s--}),n);var a=e;this.items.forEach((function(e){var n=o.getMirror(--a);if(null!=n){i=Math.min(i,n);var c=o.maps[n];if(e.step){var l=t.steps[n].invert(t.docs[n]),u=e.selection&&e.selection.map(o.slice(a+1,n));u&&s++,r.push(new p(c,l,u))}else r.push(new p(c))}}),n);for(var c=[],l=e;l500&&(f=f.compress(this.items.length-r.length)),f},u.prototype.emptyItemCount=function(){var t=0;return this.items.forEach((function(e){e.step||t++})),t},u.prototype.compress=function(t){void 0===t&&(t=this.items.length);var e=this.remapping(0,t),r=e.maps.length,n=[],o=0;return this.items.forEach((function(i,s){if(s>=t)n.push(i),i.selection&&o++;else if(i.step){var a=i.step.map(e.slice(r)),c=a&&a.getMap();if(r--,c&&e.appendMap(c,r),a){var l=i.selection&&i.selection.map(e.slice(r));l&&o++;var u,h=new p(c.invert(),a,l),f=n.length-1;(u=n.length&&n[f].merge(h))?n[f]=u:n.push(h)}}else i.map&&r--}),this.items.length,0),new u(a.from(n.reverse()),o)},u.empty=new u(a.empty,0);var p=function(t,e,r,n){this.map=t,this.step=e,this.selection=r,this.mirrorOffset=n};p.prototype.merge=function(t){if(this.step&&t.step&&!t.selection){var e=t.step.merge(this.step);if(e)return new p(e.getMap().invert(),e,this.selection)}};var h=function(t,e,r,n){this.done=t,this.undone=e,this.prevRanges=r,this.prevTime=n},f=20;function d(t){var e=[];return t.forEach((function(t,r,n,o){return e.push(n,o)})),e}function v(t,e){if(!t)return null;for(var r=[],n=0;n=e[o]&&(r=!0)})),r}(r,t.prevRanges)),c=s?v(t.prevRanges,r.mapping):d(r.mapping.maps[r.steps.length-1]);return new h(t.done.addTransform(r,a?e.selection.getBookmark():null,n,k(e)),u.empty,c,r.time)}(r,n,e,t)}},config:t})}function C(t,e){var r=w.getState(t);return!(!r||0==r.done.eventCount)&&(e&&g(r,t,e,!1),!0)}function S(t,e){var r=w.getState(t);return!(!r||0==r.undone.eventCount)&&(e&&g(r,t,e,!0),!0)}var A=r(15),O=r(0),M={};if("undefined"!=typeof navigator&&"undefined"!=typeof document){var D=/Edge\/(\d+)/.exec(navigator.userAgent),E=/MSIE \d/.test(navigator.userAgent),T=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);M.mac=/Mac/.test(navigator.platform);var N=M.ie=!!(E||T||D);M.ie_version=E?document.documentMode||6:T?+T[1]:D?+D[1]:null,M.gecko=!N&&/gecko\/(\d+)/i.test(navigator.userAgent),M.gecko_version=M.gecko&&+(/Firefox\/(\d+)/.exec(navigator.userAgent)||[0,0])[1];var I=!N&&/Chrome\/(\d+)/.exec(navigator.userAgent);M.chrome=!!I,M.chrome_version=I&&+I[1],M.safari=!N&&/Apple Computer/.test(navigator.vendor),M.ios=M.safari&&(/Mobile\/\w+/.test(navigator.userAgent)||navigator.maxTouchPoints>2),M.android=/Android \d/.test(navigator.userAgent),M.webkit="webkitFontSmoothing"in document.documentElement.style,M.webkit_version=M.webkit&&+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]}var z=function(t){for(var e=0;;e++)if(!(t=t.previousSibling))return e},R=function(t){var e=t.parentNode;return e&&11==e.nodeType?e.host:e},F=null,j=function(t,e,r){var n=F||(F=document.createRange());return n.setEnd(t,null==r?t.nodeValue.length:r),n.setStart(t,e||0),n},q=function(t,e,r,n){return r&&(P(t,e,r,n,-1)||P(t,e,r,n,1))},B=/^(img|br|input|textarea|hr)$/i;function P(t,e,r,n,o){for(;;){if(t==r&&e==n)return!0;if(e==(o<0?0:L(t))){var i=t.parentNode;if(1!=i.nodeType||V(t)||B.test(t.nodeName)||"false"==t.contentEditable)return!1;e=z(t)+(o<0?0:1),t=i}else{if(1!=t.nodeType)return!1;if("false"==(t=t.childNodes[e+(o<0?-1:0)]).contentEditable)return!1;e=o<0?L(t):0}}}function L(t){return 3==t.nodeType?t.nodeValue.length:t.childNodes.length}function V(t){for(var e,r=t;r&&!(e=r.pmViewDesc);r=r.parentNode);return e&&e.node&&e.node.isBlock&&(e.dom==t||e.contentDOM==t)}var U=function(t){var e=t.isCollapsed;return e&&M.chrome&&t.rangeCount&&!t.getRangeAt(0).collapsed&&(e=!1),e};function J(t,e){var r=document.createEvent("Event");return r.initEvent("keydown",!0,!0),r.keyCode=t,r.key=r.code=e,r}function W(t){return{left:0,right:t.documentElement.clientWidth,top:0,bottom:t.documentElement.clientHeight}}function K(t,e){return"number"==typeof t?t:t[e]}function H(t){var e=t.getBoundingClientRect();return{left:e.left,right:e.left+t.clientWidth,top:e.top,bottom:e.top+t.clientHeight}}function G(t,e,r){for(var n=t.someProp("scrollThreshold")||0,o=t.someProp("scrollMargin")||5,i=t.dom.ownerDocument,s=r||t.dom;s;s=R(s))if(1==s.nodeType){var a=s==i.body||1!=s.nodeType,c=a?W(i):H(s),l=0,u=0;if(e.topc.bottom-K(n,"bottom")&&(u=e.bottom-c.bottom+K(o,"bottom")),e.leftc.right-K(n,"right")&&(l=e.right-c.right+K(o,"right")),l||u)if(a)i.defaultView.scrollBy(l,u);else{var p=s.scrollLeft,h=s.scrollTop;u&&(s.scrollTop+=u),l&&(s.scrollLeft+=l);var f=s.scrollLeft-p,d=s.scrollTop-h;e={left:e.left-f,top:e.top-d,right:e.right-f,bottom:e.bottom-d}}if(a)break}}function Z(t){for(var e=[],r=t.ownerDocument;t&&(e.push({dom:t,top:t.scrollTop,left:t.scrollLeft}),t!=r);t=R(t));return e}function Y(t,e){for(var r=0;r=a){s=Math.max(h.bottom,s),a=Math.min(h.top,a);var f=h.left>e.left?h.left-e.left:h.right=(h.left+h.right)/2?1:0));continue}}!r&&(e.left>=h.right&&e.top>=h.top||e.left>=h.left&&e.top>=h.bottom)&&(i=l+1)}}return r&&3==r.nodeType?function(t,e){for(var r=t.nodeValue.length,n=document.createRange(),o=0;o=(i.left+i.right)/2?1:0)}}return{node:t,offset:0}}(r,n):!r||o&&1==r.nodeType?{node:t,offset:i}:Q(r,n)}function tt(t,e){return t.left>=e.left-1&&t.left<=e.right+1&&t.top>=e.top-1&&t.top<=e.bottom+1}function et(t,e){var r,n,o,i,s=t.root;if(s.caretPositionFromPoint)try{var a=s.caretPositionFromPoint(e.left,e.top);a&&(o=(r=a).offsetNode,i=r.offset)}catch(t){}if(!o&&s.caretRangeFromPoint){var c=s.caretRangeFromPoint(e.left,e.top);c&&(o=(n=c).startContainer,i=n.startOffset)}var l,u=s.elementFromPoint(e.left,e.top+1);if(!u||!t.dom.contains(1!=u.nodeType?u.parentNode:u)){var p=t.dom.getBoundingClientRect();if(!tt(e,p))return null;if(!(u=function t(e,r,n){var o=e.childNodes.length;if(o&&n.tope.top&&i++}o==t.dom&&i==o.childNodes.length-1&&1==o.lastChild.nodeType&&e.top>o.lastChild.getBoundingClientRect().bottom?l=t.state.doc.content.size:0!=i&&1==o.nodeType&&"BR"==o.childNodes[i-1].nodeName||(l=function(t,e,r,n){for(var o=-1,i=e;i!=t.dom;){var s=t.docView.nearestDesc(i,!0);if(!s)return null;if(s.node.isBlock&&s.parent){var a=s.dom.getBoundingClientRect();if(a.left>n.left||a.top>n.top)o=s.posBefore;else{if(!(a.right-1?o:t.docView.posFromDOM(e,r)}(t,o,i,e))}null==l&&(l=function(t,e,r){var n=Q(e,r),o=n.node,i=n.offset,s=-1;if(1==o.nodeType&&!o.firstChild){var a=o.getBoundingClientRect();s=a.left!=a.right&&r.left>(a.left+a.right)/2?1:-1}return t.docView.posFromDOM(o,i,s)}(t,u,e));var d=t.docView.nearestDesc(u,!0);return{pos:l,inside:d?d.posAtStart-d.border:-1}}function rt(t,e){var r=t.getClientRects();return r.length?r[e<0?0:r.length-1]:t.getBoundingClientRect()}var nt=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;function ot(t,e,r){var n=t.docView.domFromPos(e,r<0?-1:1),o=n.node,i=n.offset,s=M.webkit||M.gecko;if(3==o.nodeType){if(!s||!nt.test(o.nodeValue)&&(r<0?i:i!=o.nodeValue.length)){var a=i,c=i,l=r<0?1:-1;return r<0&&!i?(c++,l=-1):r>=0&&i==o.nodeValue.length?(a--,l=1):r<0?a--:c++,it(rt(j(o,a,c),l),l<0)}var u=rt(j(o,i,i),r);if(M.gecko&&i&&/\s/.test(o.nodeValue[i-1])&&i=0)}if(i&&(r<0||i==L(o))){var m=o.childNodes[i-1],v=3==m.nodeType?j(m,L(m)-(s?0:1)):1!=m.nodeType||"BR"==m.nodeName&&m.nextSibling?null:m;if(v)return it(rt(v,1),!1)}if(i=0)}function it(t,e){if(0==t.width)return t;var r=e?t.left:t.right;return{top:t.top,bottom:t.bottom,left:r,right:r}}function st(t,e){if(0==t.height)return t;var r=e?t.top:t.bottom;return{top:r,bottom:r,left:t.left,right:t.right}}function at(t,e,r){var n=t.state,o=t.root.activeElement;n!=e&&t.updateState(e),o!=t.dom&&t.focus();try{return r()}finally{n!=e&&t.updateState(n),o!=t.dom&&o&&o.focus()}}var ct=/[\u0590-\u08ac]/;var lt=null,ut=null,pt=!1;function ht(t,e,r){return lt==e&&ut==r?pt:(lt=e,ut=r,pt="up"==r||"down"==r?function(t,e,r){var n=e.selection,o="up"==r?n.$from:n.$to;return at(t,e,(function(){for(var e=t.docView.domFromPos(o.pos,"up"==r?-1:1).node;;){var n=t.docView.nearestDesc(e,!0);if(!n)break;if(n.node.isBlock){e=n.dom;break}e=n.dom.parentNode}for(var i=ot(t,o.pos,1),s=e.firstChild;s;s=s.nextSibling){var a=void 0;if(1==s.nodeType)a=s.getClientRects();else{if(3!=s.nodeType)continue;a=j(s,0,s.nodeValue.length).getClientRects()}for(var c=0;cl.top&&("up"==r?l.bottomi.bottom-1))return!1}}return!0}))}(t,e,r):function(t,e,r){var n=e.selection.$head;if(!n.parent.isTextblock)return!1;var o=n.parentOffset,i=!o,s=o==n.parent.content.size,a=getSelection();return ct.test(n.parent.textContent)&&a.modify?at(t,e,(function(){var e=a.getRangeAt(0),o=a.focusNode,i=a.focusOffset,s=a.caretBidiLevel;a.modify("move",r,"character");var c=!(n.depth?t.docView.domAfterPos(n.before()):t.dom).contains(1==a.focusNode.nodeType?a.focusNode:a.focusNode.parentNode)||o==a.focusNode&&i==a.focusOffset;return a.removeAllRanges(),a.addRange(e),null!=s&&(a.caretBidiLevel=s),c})):"left"==r||"backward"==r?i:s}(t,e,r))}var ft=function(t,e,r,n){this.parent=t,this.children=e,this.dom=r,r.pmViewDesc=this,this.contentDOM=n,this.dirty=0},dt={beforePosition:{configurable:!0},size:{configurable:!0},border:{configurable:!0},posBefore:{configurable:!0},posAtStart:{configurable:!0},posAfter:{configurable:!0},posAtEnd:{configurable:!0},contentLost:{configurable:!0},domAtom:{configurable:!0}};ft.prototype.matchesWidget=function(){return!1},ft.prototype.matchesMark=function(){return!1},ft.prototype.matchesNode=function(){return!1},ft.prototype.matchesHack=function(){return!1},dt.beforePosition.get=function(){return!1},ft.prototype.parseRule=function(){return null},ft.prototype.stopEvent=function(){return!1},dt.size.get=function(){for(var t=0,e=0;e0:a)?this.posAtEnd:this.posAtStart},ft.prototype.nearestDesc=function(t,e){for(var r=!0,n=t;n;n=n.parentNode){var o=this.getDesc(n);if(o&&(!e||o.node)){if(!r||!o.nodeDOM||(1==o.nodeDOM.nodeType?o.nodeDOM.contains(1==t.nodeType?t:t.parentNode):o.nodeDOM==t))return o;r=!1}}},ft.prototype.getDesc=function(t){for(var e=t.pmViewDesc,r=e;r;r=r.parent)if(r==this)return e},ft.prototype.posFromDOM=function(t,e,r){for(var n=t;n;n=n.parentNode){var o=this.getDesc(n);if(o)return o.localPosFromDOM(t,e,r)}return-1},ft.prototype.descAt=function(t){for(var e=0,r=0;e=t:s>t))return i.domFromPos(t-r-i.border,e);r=s}},ft.prototype.parseRange=function(t,e,r){if(void 0===r&&(r=0),0==this.children.length)return{node:this.contentDOM,from:t,to:e,fromOffset:0,toOffset:this.contentDOM.childNodes.length};for(var n=-1,o=-1,i=r,s=0;;s++){var a=this.children[s],c=i+a.size;if(-1==n&&t<=c){var l=i+a.border;if(t>=l&&e<=c-a.border&&a.node&&a.contentDOM&&this.contentDOM.contains(a.contentDOM))return a.parseRange(t,e,l);t=i;for(var u=s;u>0;u--){var p=this.children[u-1];if(p.size&&p.dom.parentNode==this.contentDOM&&!p.emptyChildAt(1)){n=z(p.dom)+1;break}t-=p.size}-1==n&&(n=0)}if(n>-1&&(c>e||s==this.children.length-1)){e=c;for(var h=s+1;ha&&ie){var y=u;u=p,p=y}var b=document.createRange();b.setEnd(p.node,p.offset),b.setStart(u.node,u.offset),h.removeAllRanges(),h.addRange(b)}}},ft.prototype.ignoreMutation=function(t){return!this.contentDOM&&"selection"!=t.type},dt.contentLost.get=function(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)},ft.prototype.markDirty=function(t,e){for(var r=0,n=0;n=r:tr){var s=r+o.border,a=i-o.border;if(t>=s&&e<=a)return this.dirty=t==r||e==i?2:1,void(t!=s||e!=a||!o.contentLost&&o.dom.parentNode==this.contentDOM?o.markDirty(t-s,e-s):o.dirty=3);o.dirty=3}r=i}this.dirty=2},ft.prototype.markParentsDirty=function(){for(var t=1,e=this.parent;e;e=e.parent,t++){var r=1==t?2:1;e.dirty0&&(i=zt(i,0,t,n));for(var a=0;ai;)l.push(o[c++]);var y=i+m.nodeSize;if(m.isText){var b=y;c=0&&!a&&s.syncToMarks(i==r.node.childCount?O.d.none:r.node.child(i).marks,n,t),s.placeWidget(e,t,o)}),(function(e,r,i,a){s.syncToMarks(e.marks,n,t),s.findNodeMatch(e,r,i,a)||s.updateNextNode(e,r,i,t,a)||s.addNode(e,r,i,t,o),o+=e.nodeSize})),s.syncToMarks(mt,n,t),this.node.isTextblock&&s.addTextblockHacks(),s.destroyRest(),(s.changed||2==this.dirty)&&(i&&this.protectLocalComposition(t,i),function t(e,r,n){for(var o=e.firstChild,i=!1,s=0;se+this.node.content.size)){var i=t.root.getSelection(),s=function(t,e){for(;;){if(3==t.nodeType)return t;if(1==t.nodeType&&e>0){if(t.childNodes.length>e&&3==t.childNodes[e].nodeType)return t.childNodes[e];t=t.childNodes[e-1],e=L(t)}else{if(!(1==t.nodeType&&e=r){var u=c.lastIndexOf(e,n-a);if(u>=0&&u+e.length+a>=r)return a+u}}}return-1}(this.node.content,a,n-e,o-e);return c<0?null:{node:s,pos:c,text:a}}}},e.prototype.protectLocalComposition=function(t,e){var r=e.node,n=e.pos,o=e.text;if(!this.getDesc(r)){for(var i=r;i.parentNode!=this.contentDOM;i=i.parentNode){for(;i.previousSibling;)i.parentNode.removeChild(i.previousSibling);for(;i.nextSibling;)i.parentNode.removeChild(i.nextSibling);i.pmViewDesc&&(i.pmViewDesc=null)}var s=new gt(this,i,r,o);t.compositionNodes.push(s),this.children=zt(this.children,n,n+o.length,t,s)}},e.prototype.update=function(t,e,r,n){return!(3==this.dirty||!t.sameMarkup(this.node))&&(this.updateInner(t,e,r,n),!0)},e.prototype.updateInner=function(t,e,r,n){this.updateOuterDeco(e),this.node=t,this.innerDeco=r,this.contentDOM&&this.updateChildren(n,this.posAtStart),this.dirty=0},e.prototype.updateOuterDeco=function(t){if(!Et(t,this.outerDeco)){var e=1!=this.nodeDOM.nodeType,r=this.dom;this.dom=Ot(this.dom,this.nodeDOM,At(this.outerDeco,this.node,e),At(t,this.node,e)),this.dom!=r&&(r.pmViewDesc=null,this.dom.pmViewDesc=this),this.outerDeco=t}},e.prototype.selectNode=function(){this.nodeDOM.classList.add("ProseMirror-selectednode"),!this.contentDOM&&this.node.type.spec.draggable||(this.dom.draggable=!0)},e.prototype.deselectNode=function(){this.nodeDOM.classList.remove("ProseMirror-selectednode"),!this.contentDOM&&this.node.type.spec.draggable||this.dom.removeAttribute("draggable")},r.domAtom.get=function(){return this.node.isAtom},Object.defineProperties(e.prototype,r),e}(ft);function kt(t,e,r,n,o){return Dt(n,e,t),new bt(null,t,e,r,n,n,n,o,0)}var wt=function(t){function e(e,r,n,o,i,s,a){t.call(this,e,r,n,o,i,null,s,a)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={domAtom:{configurable:!0}};return e.prototype.parseRule=function(){for(var t=this.nodeDOM.parentNode;t&&t!=this.dom&&!t.pmIsDeco;)t=t.parentNode;return{skip:t||!0}},e.prototype.update=function(t,e,r,n){return!(3==this.dirty||0!=this.dirty&&!this.inParent()||!t.sameMarkup(this.node))&&(this.updateOuterDeco(e),0==this.dirty&&t.text==this.node.text||t.text==this.nodeDOM.nodeValue||(this.nodeDOM.nodeValue=t.text,n.trackWrites==this.nodeDOM&&(n.trackWrites=null)),this.node=t,this.dirty=0,!0)},e.prototype.inParent=function(){for(var t=this.parent.contentDOM,e=this.nodeDOM;e;e=e.parentNode)if(e==t)return!0;return!1},e.prototype.domFromPos=function(t){return{node:this.nodeDOM,offset:t}},e.prototype.localPosFromDOM=function(e,r,n){return e==this.nodeDOM?this.posAtStart+Math.min(r,this.node.text.length):t.prototype.localPosFromDOM.call(this,e,r,n)},e.prototype.ignoreMutation=function(t){return"characterData"!=t.type&&"selection"!=t.type},e.prototype.slice=function(t,r,n){var o=this.node.cut(t,r),i=document.createTextNode(o.text);return new e(this.parent,o,this.outerDeco,this.innerDeco,i,i,n)},r.domAtom.get=function(){return!1},Object.defineProperties(e.prototype,r),e}(bt),xt=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={domAtom:{configurable:!0}};return e.prototype.parseRule=function(){return{ignore:!0}},e.prototype.matchesHack=function(){return 0==this.dirty},r.domAtom.get=function(){return!0},Object.defineProperties(e.prototype,r),e}(ft),_t=function(t){function e(e,r,n,o,i,s,a,c,l,u){t.call(this,e,r,n,o,i,s,a,l,u),this.spec=c}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.update=function(e,r,n,o){if(3==this.dirty)return!1;if(this.spec.update){var i=this.spec.update(e,r);return i&&this.updateInner(e,r,n,o),i}return!(!this.contentDOM&&!e.isLeaf)&&t.prototype.update.call(this,e,r,n,o)},e.prototype.selectNode=function(){this.spec.selectNode?this.spec.selectNode():t.prototype.selectNode.call(this)},e.prototype.deselectNode=function(){this.spec.deselectNode?this.spec.deselectNode():t.prototype.deselectNode.call(this)},e.prototype.setSelection=function(e,r,n,o){this.spec.setSelection?this.spec.setSelection(e,r,n):t.prototype.setSelection.call(this,e,r,n,o)},e.prototype.destroy=function(){this.spec.destroy&&this.spec.destroy(),t.prototype.destroy.call(this)},e.prototype.stopEvent=function(t){return!!this.spec.stopEvent&&this.spec.stopEvent(t)},e.prototype.ignoreMutation=function(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):t.prototype.ignoreMutation.call(this,e)},e}(bt);function Ct(t){t&&(this.nodeName=t)}Ct.prototype=Object.create(null);var St=[new Ct];function At(t,e,r){if(0==t.length)return St;for(var n=r?St[0]:new Ct,o=[n],i=0;i0&&o>=0;o--){var i=e[o],s=i.node;if(s){if(s!=t.child(n-1))break;r.push(i),--n}}return{nodes:r.reverse(),offset:n}}(t.node.content,t.children);this.preMatched=r.nodes,this.preMatchOffset=r.offset};function It(t,e){return t.type.side-e.type.side}function zt(t,e,r,n,o){for(var i=[],s=0,a=0;s=r||u<=e?i.push(c):(lr&&i.push(c.slice(r-l,c.size,n)))}return i}function Rt(t,e){var r=t.root.getSelection(),n=t.state.doc;if(!r.focusNode)return null;var o=t.docView.nearestDesc(r.focusNode),i=o&&0==o.size,s=t.docView.posFromDOM(r.focusNode,r.focusOffset);if(s<0)return null;var a,c,u=n.resolve(s);if(U(r)){for(a=u;o&&!o.node;)o=o.parent;if(o&&o.node.isAtom&&l.c.isSelectable(o.node)&&o.parent&&(!o.node.isInline||!function(t,e,r){for(var n=0==e,o=e==L(t);n||o;){if(t==r)return!0;var i=z(t);if(!(t=t.parentNode))return!1;n=n&&0==i,o=o&&i==L(t)}}(r.focusNode,r.focusOffset,o.dom))){var p=o.posBefore;c=new l.c(s==p?u:n.resolve(p))}}else{var h=t.docView.posFromDOM(r.anchorNode,r.anchorOffset);if(h<0)return null;a=n.resolve(h)}c||(c=Vt(t,a,u,"pointer"==e||t.state.selection.head=this.preMatchOffset?this.preMatched[t-this.preMatchOffset]:null},Nt.prototype.destroyBetween=function(t,e){if(t!=e){for(var r=t;r>1,i=Math.min(o,t.length);n-1)s>this.index&&(this.changed=!0,this.destroyBetween(this.index,s)),this.top=this.top.children[this.index];else{var c=yt.create(this.top,t[o],e,r);this.top.children.splice(this.index,0,c),this.top=c,this.changed=!0}this.index=0,o++}},Nt.prototype.findNodeMatch=function(t,e,r,n){var o=-1,i=n<0?void 0:this.getPreMatch(n),s=this.top.children;if(i&&i.matchesNode(t,e,r))o=s.indexOf(i);else for(var a=this.index,c=Math.min(s.length,a+5);a-1&&a+this.preMatchOffset!=o)return!1;var c=s.dom;if(!(this.lock&&(c==this.lock||1==c.nodeType&&c.contains(this.lock.parentNode))&&!(t.isText&&s.node&&s.node.isText&&s.nodeDOM.nodeValue==t.text&&3!=s.dirty&&Et(e,s.outerDeco)))&&s.update(t,e,r,n))return this.destroyBetween(this.index,i),s.dom!=c&&(this.changed=!0),this.index++,!0;break}}return!1},Nt.prototype.addNode=function(t,e,r,n,o){this.top.children.splice(this.index++,0,bt.create(this.top,t,e,r,n,o)),this.changed=!0},Nt.prototype.placeWidget=function(t,e,r){var n=this.index0?n.max(o):n.min(o),s=i.parent.inlineContent?i.depth?t.doc.resolve(e>0?i.after():i.before()):null:i;return s&&l.f.findFrom(s,e)}function Wt(t,e){return t.dispatch(t.state.tr.setSelection(e).scrollIntoView()),!0}function Kt(t,e,r){var n=t.state.selection;if(!(n instanceof l.g)){if(n instanceof l.c&&n.node.isInline)return Wt(t,new l.g(e>0?n.$to:n.$from));var o=Jt(t.state,e);return!!o&&Wt(t,o)}if(!n.empty||r.indexOf("s")>-1)return!1;if(t.endOfTextblock(e>0?"right":"left")){var i=Jt(t.state,e);return!!(i&&i instanceof l.c)&&Wt(t,i)}if(!(M.mac&&r.indexOf("m")>-1)){var s,a=n.$head,c=a.textOffset?null:e<0?a.nodeBefore:a.nodeAfter;if(!c||c.isText)return!1;var u=e<0?a.pos-c.nodeSize:a.pos;return!!(c.isAtom||(s=t.docView.descAt(u))&&!s.contentDOM)&&(l.c.isSelectable(c)?Wt(t,new l.c(e<0?t.state.doc.resolve(a.pos-c.nodeSize):a)):!!M.webkit&&Wt(t,new l.g(t.state.doc.resolve(e<0?u:u+c.nodeSize))))}}function Ht(t){return 3==t.nodeType?t.nodeValue.length:t.childNodes.length}function Gt(t){var e=t.pmViewDesc;return e&&0==e.size&&(t.nextSibling||"BR"!=t.nodeName)}function Zt(t){var e=t.root.getSelection(),r=e.focusNode,n=e.focusOffset;if(r){var o,i,s=!1;for(M.gecko&&1==r.nodeType&&n0){if(1!=r.nodeType)break;var a=r.childNodes[n-1];if(Gt(a))o=r,i=--n;else{if(3!=a.nodeType)break;n=(r=a).nodeValue.length}}else{if(Xt(r))break;for(var c=r.previousSibling;c&&Gt(c);)o=r.parentNode,i=z(c),c=c.previousSibling;if(c)n=Ht(r=c);else{if((r=r.parentNode)==t.dom)break;n=0}}s?Qt(t,e,r,n):o&&Qt(t,e,o,i)}}function Yt(t){var e=t.root.getSelection(),r=e.focusNode,n=e.focusOffset;if(r){for(var o,i,s=Ht(r);;)if(n-1)return!1;if(M.mac&&r.indexOf("m")>-1)return!1;var o=n.$from,i=n.$to;if(!o.parent.inlineContent||t.endOfTextblock(e<0?"up":"down")){var s=Jt(t.state,e);if(s&&s instanceof l.c)return Wt(t,s)}if(!o.parent.inlineContent){var a=l.f.findFrom(e<0?o:i,e);return!a||Wt(t,a)}return!1}function ee(t,e){if(!(t.state.selection instanceof l.g))return!0;var r=t.state.selection,n=r.$head,o=r.$anchor,i=r.empty;if(!n.sameParent(o))return!0;if(!i)return!1;if(t.endOfTextblock(e>0?"forward":"backward"))return!0;var s=!n.textOffset&&(e<0?n.nodeBefore:n.nodeAfter);if(s&&!s.isText){var a=t.state.tr;return e<0?a.delete(n.pos-s.nodeSize,n.pos):a.delete(n.pos,n.pos+s.nodeSize),t.dispatch(a),!0}return!1}function re(t,e,r){t.domObserver.stop(),e.contentEditable=r,t.domObserver.start()}function ne(t,e){var r=e.keyCode,n=function(t){var e="";return t.ctrlKey&&(e+="c"),t.metaKey&&(e+="m"),t.altKey&&(e+="a"),t.shiftKey&&(e+="s"),e}(e);return 8==r||M.mac&&72==r&&"c"==n?ee(t,-1)||Zt(t):46==r||M.mac&&68==r&&"c"==n?ee(t,1)||Yt(t):13==r||27==r||(37==r?Kt(t,-1,n)||Zt(t):39==r?Kt(t,1,n)||Yt(t):38==r?te(t,-1,n)||Zt(t):40==r?function(t){if(M.safari&&!(t.state.selection.$head.parentOffset>0)){var e=t.root.getSelection(),r=e.focusNode,n=e.focusOffset;if(r&&1==r.nodeType&&0==n&&r.firstChild&&"false"==r.firstChild.contentEditable){var o=r.firstChild;re(t,o,!0),setTimeout((function(){return re(t,o,!1)}),20)}}}(t)||te(t,1,n)||Yt(t):n==(M.mac?"m":"c")&&(66==r||73==r||89==r||90==r))}function oe(t){var e=t.pmViewDesc;if(e)return e.parseRule();if("BR"==t.nodeName&&t.parentNode){if(M.safari&&/^(ul|ol)$/i.test(t.parentNode.nodeName)){var r=document.createElement("div");return r.appendChild(document.createElement("li")),{skip:r}}if(t.parentNode.lastChild==t||M.safari&&/^(tr|table)$/i.test(t.parentNode.nodeName))return{ignore:!0}}else if("IMG"==t.nodeName&&t.getAttribute("mark-placeholder"))return{ignore:!0}}function ie(t,e,r,n,o){if(e<0){var i=t.lastSelectionTime>Date.now()-50?t.lastSelectionOrigin:null,s=Rt(t,i);if(s&&!t.state.selection.eq(s)){var a=t.state.tr.setSelection(s);"pointer"==i?a.setMeta("pointer",!0):"key"==i&&a.scrollIntoView(),t.dispatch(a)}}else{var c=t.state.doc.resolve(e),u=c.sharedDepth(r);e=c.before(u+1),r=t.state.doc.resolve(r).after(u+1);var p=t.state.selection,h=function(t,e,r){var n=t.docView.parseRange(e,r),o=n.node,i=n.fromOffset,s=n.toOffset,a=n.from,c=n.to,l=t.root.getSelection(),u=null,p=l.anchorNode;if(p&&t.dom.contains(1==p.nodeType?p:p.parentNode)&&(u=[{node:p,offset:l.anchorOffset}],U(l)||u.push({node:l.focusNode,offset:l.focusOffset})),M.chrome&&8===t.lastKeyCode)for(var h=s;h>i;h--){var f=o.childNodes[h-1],d=f.pmViewDesc;if("BR"==f.nodeType&&!d){s=h;break}if(!d||d.size)break}var m=t.state.doc,v=t.someProp("domParser")||O.a.fromSchema(t.state.schema),g=m.resolve(a),y=null,b=v.parse(o,{topNode:g.parent,topMatch:g.parent.contentMatchAt(g.index()),topOpen:!0,from:i,to:s,preserveWhitespace:!g.parent.type.spec.code||"full",editableContent:!0,findPositions:u,ruleFromNode:oe,context:g});if(u&&null!=u[0].pos){var k=u[0].pos,w=u[1]&&u[1].pos;null==w&&(w=k),y={anchor:k+a,head:w+a}}return{doc:b,sel:y,from:a,to:c}}(t,e,r);if(M.chrome&&t.cursorWrapper&&h.sel&&h.sel.anchor==t.cursorWrapper.deco.from){var f=t.cursorWrapper.deco.type.toDOM.nextSibling,d=f&&f.nodeValue?f.nodeValue.length:1;h.sel={anchor:h.sel.anchor+d,head:h.sel.anchor+d}}var m,v,g=t.state.doc,y=g.slice(h.from,h.to);8===t.lastKeyCode&&Date.now()-100=a?i-n:0)+(c-a),a=i}else if(c=c?i-n:0)+(a-c),c=i}return{start:i,endA:a,endB:c}}(y.content,h.doc.content,h.from,m,v);if(!b){if(!(n&&p instanceof l.g&&!p.empty&&p.$head.sameParent(p.$anchor))||t.composing||h.sel&&h.sel.anchor!=h.sel.head){if(M.ios&&t.lastIOSEnter>Date.now()-225&&o.some((function(t){return"DIV"==t.nodeName||"P"==t.nodeName}))&&t.someProp("handleKeyDown",(function(e){return e(t,J(13,"Enter"))})))return void(t.lastIOSEnter=0);if(h.sel){var k=se(t,t.state.doc,h.sel);k&&!k.eq(t.state.selection)&&t.dispatch(t.state.tr.setSelection(k))}return}b={start:p.from,endA:p.to,endB:p.to}}t.domChangeCount++,t.state.selection.fromt.state.selection.from&&b.start<=t.state.selection.from+2?b.start=t.state.selection.from:b.endA=t.state.selection.to-2&&(b.endB+=t.state.selection.to-b.endA,b.endA=t.state.selection.to)),M.ie&&M.ie_version<=11&&b.endB==b.start+1&&b.endA==b.start&&b.start>h.from&&"  "==h.doc.textBetween(b.start-h.from-1,b.start-h.from+1)&&(b.start--,b.endA--,b.endB--);var w,x=h.doc.resolveNoCache(b.start-h.from),_=h.doc.resolveNoCache(b.endB-h.from),C=x.sameParent(_)&&x.parent.inlineContent;if((M.ios&&t.lastIOSEnter>Date.now()-225&&(!C||o.some((function(t){return"DIV"==t.nodeName||"P"==t.nodeName})))||!C&&x.posb.start&&function(t,e,r,n,o){if(!n.parent.isTextblock||r-e<=o.pos-n.pos||ae(n,!0,!1)r||ae(s,!0,!1)e.content.size?null:Vt(t,e.resolve(r.anchor),e.resolve(r.head))}function ae(t,e,r){for(var n=t.depth,o=e?t.end():t.pos;n>0&&(e||t.indexAfter(n)==t.node(n).childCount);)n--,o++,e=!1;if(r)for(var i=t.node(n).maybeChild(t.indexAfter(n));i&&!i.isLeaf;)i=i.firstChild,o++;return o}function ce(t,e){for(var r=[],n=e.content,o=e.openStart,i=e.openEnd;o>1&&i>1&&1==n.childCount&&1==n.firstChild.childCount;){o--,i--;var s=n.firstChild;r.push(s.type.name,s.attrs!=s.type.defaultAttrs?s.attrs:null),n=s.content}var a=t.someProp("clipboardSerializer")||O.b.fromSchema(t.state.schema),c=de(),l=c.createElement("div");l.appendChild(a.serializeFragment(n,{document:c}));for(var u,p=l.firstChild;p&&1==p.nodeType&&(u=he[p.nodeName.toLowerCase()]);){for(var h=u.length-1;h>=0;h--){for(var f=c.createElement(u[h]);l.firstChild;)f.appendChild(l.firstChild);l.appendChild(f)}p=l.firstChild}return p&&1==p.nodeType&&p.setAttribute("data-pm-slice",o+" "+i+" "+JSON.stringify(r)),{dom:l,text:t.someProp("clipboardTextSerializer",(function(t){return t(e)}))||e.content.textBetween(0,e.content.size,"\n\n")}}function le(t,e,r,n,o){var i,s,a=o.parent.type.spec.code;if(!r&&!e)return null;var c=e&&(n||a||!r);if(c){if(t.someProp("transformPastedText",(function(t){e=t(e,a||n)})),a)return new O.j(O.c.from(t.state.schema.text(e)),0,0);var l=t.someProp("clipboardTextParser",(function(t){return t(e,o,n)}));l?s=l:(i=document.createElement("div"),e.trim().split(/(?:\r\n?|\n)+/).forEach((function(t){i.appendChild(document.createElement("p")).textContent=t})))}else t.someProp("transformPastedHTML",(function(t){r=t(r)})),i=function(t){var e=/(\s*]*>)*/.exec(t);e&&(t=t.slice(e[0].length));var r,n=de().createElement("div"),o=/(?:]*>)*<([a-z][^>\s]+)/i.exec(t),i=0;(r=o&&he[o[1].toLowerCase()])&&(t=r.map((function(t){return"<"+t+">"})).join("")+t+r.map((function(t){return""})).reverse().join(""),i=r.length);n.innerHTML=t;for(var s=0;s=0;a-=2){var c=n.nodes[r[a]];if(!c||c.hasRequiredAttrs())break;o=O.c.from(c.create(r[a+1],o)),i++,s++}return new O.j(o,i,s)}(function(t,e,r){e=0;n--){var o=r(n);if(o)return o.v}return t}(s.content,o),!1),t.someProp("transformPasted",(function(t){s=t(s)})),s}function ue(t,e,r){void 0===r&&(r=0);for(var n=e.length-1;n>=r;n--)t=e[n].create(null,O.c.from(t));return t}function pe(t,e,r,n,o,i){var s=e<0?t.firstChild:t.lastChild,a=s.content;return o=r&&(a=e<0?s.contentMatchAt(0).fillBefore(a,t.childCount>1||i<=o).append(a):a.append(s.contentMatchAt(s.childCount).fillBefore(O.c.empty,!0))),t.replaceChild(e<0?0:t.childCount-1,s.copy(a))}var he={thead:["table"],tbody:["table"],tfoot:["table"],caption:["table"],colgroup:["table"],col:["table","colgroup"],tr:["table","tbody"],td:["table","tbody","tr"],th:["table","tbody","tr"]},fe=null;function de(){return fe||(fe=document.implementation.createHTMLDocument("title"))}var me={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},ve=M.ie&&M.ie_version<=11,ge=function(){this.anchorNode=this.anchorOffset=this.focusNode=this.focusOffset=null};ge.prototype.set=function(t){this.anchorNode=t.anchorNode,this.anchorOffset=t.anchorOffset,this.focusNode=t.focusNode,this.focusOffset=t.focusOffset},ge.prototype.eq=function(t){return t.anchorNode==this.anchorNode&&t.anchorOffset==this.anchorOffset&&t.focusNode==this.focusNode&&t.focusOffset==this.focusOffset};var ye=function(t,e){var r=this;this.view=t,this.handleDOMChange=e,this.queue=[],this.flushingSoon=-1,this.observer=window.MutationObserver&&new window.MutationObserver((function(t){for(var e=0;et.target.nodeValue.length}))?r.flushSoon():r.flush()})),this.currentSelection=new ge,ve&&(this.onCharData=function(t){r.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),r.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.suppressingSelectionUpdates=!1};ye.prototype.flushSoon=function(){var t=this;this.flushingSoon<0&&(this.flushingSoon=window.setTimeout((function(){t.flushingSoon=-1,t.flush()}),20))},ye.prototype.forceFlush=function(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())},ye.prototype.start=function(){this.observer&&this.observer.observe(this.view.dom,me),ve&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()},ye.prototype.stop=function(){var t=this;if(this.observer){var e=this.observer.takeRecords();if(e.length){for(var r=0;r-1)){var t=this.observer?this.observer.takeRecords():[];this.queue.length&&(t=this.queue.concat(t),this.queue.length=0);var e=this.view.root.getSelection(),r=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(e)&&Ut(this.view)&&!this.ignoreSelectionChange(e),n=-1,o=-1,i=!1,s=[];if(this.view.editable)for(var a=0;a1){var l=s.filter((function(t){return"BR"==t.nodeName}));if(2==l.length){var u=l[0],p=l[1];u.parentNode&&u.parentNode.parentNode==p.parentNode?p.remove():u.remove()}}(n>-1||r)&&(n>-1&&(this.view.docView.markDirty(n,o),function(t){if(be)return;be=!0,"normal"==getComputedStyle(t.dom).whiteSpace&&console.warn("ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.")}(this.view)),this.handleDOMChange(n,o,i,s),this.view.docView.dirty?this.view.updateState(this.view.state):this.currentSelection.eq(e)||Ft(this.view),this.currentSelection.set(e))}},ye.prototype.registerMutation=function(t,e){if(e.indexOf(t.target)>-1)return null;var r=this.view.docView.nearestDesc(t.target);if("attributes"==t.type&&(r==this.view.docView||"contenteditable"==t.attributeName||"style"==t.attributeName&&!t.oldValue&&!t.target.getAttribute("style")))return null;if(!r||r.ignoreMutation(t))return null;if("childList"==t.type){var n=t.previousSibling,o=t.nextSibling;if(M.ie&&M.ie_version<=11&&t.addedNodes.length)for(var i=0;ii.depth?e(t,r,i.nodeAfter,i.before(n),o,!0):e(t,r,i.node(n),i.before(n),o,!1)})))return{v:!0}},a=i.depth+1;a>0;a--){var c=s(a);if(c)return c.v}return!1}function Oe(t,e,r){t.focused||t.focus();var n=t.state.tr.setSelection(e);"pointer"==r&&n.setMeta("pointer",!0),t.dispatch(n)}function Me(t,e,r,n,o){return Ae(t,"handleClickOn",e,r,n)||t.someProp("handleClick",(function(r){return r(t,e,n)}))||(o?function(t,e){if(-1==e)return!1;var r,n,o=t.state.selection;o instanceof l.c&&(r=o.node);for(var i=t.state.doc.resolve(e),s=i.depth+1;s>0;s--){var a=s>i.depth?i.nodeAfter:i.node(s);if(l.c.isSelectable(a)){n=r&&o.$from.depth>0&&s>=o.$from.depth&&i.before(o.$from.depth+1)==o.$from.pos?i.before(o.$from.depth):i.before(s);break}}return null!=n&&(Oe(t,l.c.create(t.state.doc,n),"pointer"),!0)}(t,r):function(t,e){if(-1==e)return!1;var r=t.state.doc.resolve(e),n=r.nodeAfter;return!!(n&&n.isAtom&&l.c.isSelectable(n))&&(Oe(t,new l.c(r),"pointer"),!0)}(t,r))}function De(t,e,r,n){return Ae(t,"handleDoubleClickOn",e,r,n)||t.someProp("handleDoubleClick",(function(r){return r(t,e,n)}))}function Ee(t,e,r,n){return Ae(t,"handleTripleClickOn",e,r,n)||t.someProp("handleTripleClick",(function(r){return r(t,e,n)}))||function(t,e){var r=t.state.doc;if(-1==e)return!!r.inlineContent&&(Oe(t,l.g.create(r,0,r.content.size),"pointer"),!0);for(var n=r.resolve(e),o=n.depth+1;o>0;o--){var i=o>n.depth?n.nodeAfter:n.node(o),s=n.before(o);if(i.inlineContent)Oe(t,l.g.create(r,s+1,s+1+i.content.size),"pointer");else{if(!l.c.isSelectable(i))continue;Oe(t,l.c.create(r,s),"pointer")}return!0}}(t,r)}function Te(t){return qe(t)}we.keydown=function(t,e){if(t.shiftKey=16==e.keyCode||e.shiftKey,!ze(t,e))if(t.domObserver.forceFlush(),t.lastKeyCode=e.keyCode,t.lastKeyCodeTime=Date.now(),!M.ios||13!=e.keyCode||e.ctrlKey||e.altKey||e.metaKey)t.someProp("handleKeyDown",(function(r){return r(t,e)}))||ne(t,e)?e.preventDefault():xe(t,"key");else{var r=Date.now();t.lastIOSEnter=r,t.lastIOSEnterFallbackTimeout=setTimeout((function(){t.lastIOSEnter==r&&(t.someProp("handleKeyDown",(function(e){return e(t,J(13,"Enter"))})),t.lastIOSEnter=0)}),200)}},we.keyup=function(t,e){16==e.keyCode&&(t.shiftKey=!1)},we.keypress=function(t,e){if(!(ze(t,e)||!e.charCode||e.ctrlKey&&!e.altKey||M.mac&&e.metaKey))if(t.someProp("handleKeyPress",(function(r){return r(t,e)})))e.preventDefault();else{var r=t.state.selection;if(!(r instanceof l.g&&r.$from.sameParent(r.$to))){var n=String.fromCharCode(e.charCode);t.someProp("handleTextInput",(function(e){return e(t,r.$from.pos,r.$to.pos,n)}))||t.dispatch(t.state.tr.insertText(n).scrollIntoView()),e.preventDefault()}}};var Ne=M.mac?"metaKey":"ctrlKey";ke.mousedown=function(t,e){t.shiftKey=e.shiftKey;var r=Te(t),n=Date.now(),o="singleClick";n-t.lastClick.time<500&&function(t,e){var r=e.x-t.clientX,n=e.y-t.clientY;return r*r+n*n<100}(e,t.lastClick)&&!e[Ne]&&("singleClick"==t.lastClick.type?o="doubleClick":"doubleClick"==t.lastClick.type&&(o="tripleClick")),t.lastClick={time:n,x:e.clientX,y:e.clientY,type:o};var i=t.posAtCoords(Se(e));i&&("singleClick"==o?t.mouseDown=new Ie(t,i,e,r):("doubleClick"==o?De:Ee)(t,i.pos,i.inside,e)?e.preventDefault():xe(t,"pointer"))};var Ie=function(t,e,r,n){var o,i,s=this;if(this.view=t,this.startDoc=t.state.doc,this.pos=e,this.event=r,this.flushed=n,this.selectNode=r[Ne],this.allowDefault=r.shiftKey,e.inside>-1)o=t.state.doc.nodeAt(e.inside),i=e.inside;else{var a=t.state.doc.resolve(e.pos);o=a.parent,i=a.depth?a.before():0}this.mightDrag=null;var c=n?null:r.target,u=c?t.docView.nearestDesc(c,!0):null;this.target=u?u.dom:null,(o.type.spec.draggable&&!1!==o.type.spec.selectable||t.state.selection instanceof l.c&&i==t.state.selection.from)&&(this.mightDrag={node:o,pos:i,addAttr:this.target&&!this.target.draggable,setUneditable:this.target&&M.gecko&&!this.target.hasAttribute("contentEditable")}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout((function(){return s.target.setAttribute("contentEditable","false")}),20),this.view.domObserver.start()),t.root.addEventListener("mouseup",this.up=this.up.bind(this)),t.root.addEventListener("mousemove",this.move=this.move.bind(this)),xe(t,"pointer")};function ze(t,e){return!!t.composing||!!(M.safari&&Math.abs(e.timeStamp-t.compositionEndedAt)<500)&&(t.compositionEndedAt=-2e8,!0)}Ie.prototype.done=function(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.view.mouseDown=null},Ie.prototype.up=function(t){if(this.done(),this.view.dom.contains(3==t.target.nodeType?t.target.parentNode:t.target)){var e=this.pos;this.view.state.doc!=this.startDoc&&(e=this.view.posAtCoords(Se(t))),this.allowDefault||!e?xe(this.view,"pointer"):Me(this.view,e.pos,e.inside,t,this.selectNode)?t.preventDefault():this.flushed||M.safari&&this.mightDrag&&!this.mightDrag.node.isAtom||M.chrome&&!(this.view.state.selection instanceof l.g)&&(e.pos==this.view.state.selection.from||e.pos==this.view.state.selection.to)?(Oe(this.view,l.f.near(this.view.state.doc.resolve(e.pos)),"pointer"),t.preventDefault()):xe(this.view,"pointer")}},Ie.prototype.move=function(t){!this.allowDefault&&(Math.abs(this.event.x-t.clientX)>4||Math.abs(this.event.y-t.clientY)>4)&&(this.allowDefault=!0),xe(this.view,"pointer")},ke.touchdown=function(t){Te(t),xe(t,"pointer")},ke.contextmenu=function(t){return Te(t)};var Re=M.android?5e3:-1;function Fe(t,e){clearTimeout(t.composingTimeout),e>-1&&(t.composingTimeout=setTimeout((function(){return qe(t)}),e))}function je(t){for(t.composing=!1;t.compositionNodes.length>0;)t.compositionNodes.pop().markParentsDirty()}function qe(t,e){if(t.domObserver.forceFlush(),je(t),e||t.docView.dirty){var r=Rt(t);return r&&!r.eq(t.state.selection)?t.dispatch(t.state.tr.setSelection(r)):t.updateState(t.state),!0}return!1}we.compositionstart=we.compositionupdate=function(t){if(!t.composing){t.domObserver.flush();var e=t.state,r=e.selection.$from;if(e.selection.empty&&(e.storedMarks||!r.textOffset&&r.parentOffset&&r.nodeBefore.marks.some((function(t){return!1===t.type.spec.inclusive}))))t.markCursor=t.state.storedMarks||r.marks(),qe(t,!0),t.markCursor=null;else if(qe(t),M.gecko&&e.selection.empty&&r.parentOffset&&!r.textOffset&&r.nodeBefore.marks.length)for(var n=t.root.getSelection(),o=n.focusNode,i=n.focusOffset;o&&1==o.nodeType&&0!=i;){var s=i<0?o.lastChild:o.childNodes[i-1];if(!s)break;if(3==s.nodeType){n.collapse(s,s.nodeValue.length);break}o=s,i=-1}t.composing=!0}Fe(t,Re)},we.compositionend=function(t,e){t.composing&&(t.composing=!1,t.compositionEndedAt=e.timeStamp,Fe(t,20))};var Be=M.ie&&M.ie_version<15||M.ios&&M.webkit_version<604;function $e(t,e,r,n){var o=le(t,e,r,t.shiftKey,t.state.selection.$from);if(t.someProp("handlePaste",(function(e){return e(t,n,o||O.j.empty)})))return!0;if(!o)return!1;var i=function(t){return 0==t.openStart&&0==t.openEnd&&1==t.content.childCount?t.content.firstChild:null}(o),s=i?t.state.tr.replaceSelectionWith(i,t.shiftKey):t.state.tr.replaceSelection(o);return t.dispatch(s.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}ke.copy=we.cut=function(t,e){var r=t.state.selection,n="cut"==e.type;if(!r.empty){var o=Be?null:e.clipboardData,i=ce(t,r.content()),s=i.dom,a=i.text;o?(e.preventDefault(),o.clearData(),o.setData("text/html",s.innerHTML),o.setData("text/plain",a)):function(t,e){if(t.dom.parentNode){var r=t.dom.parentNode.appendChild(document.createElement("div"));r.appendChild(e),r.style.cssText="position: fixed; left: -10000px; top: 10px";var n=getSelection(),o=document.createRange();o.selectNodeContents(e),t.dom.blur(),n.removeAllRanges(),n.addRange(o),setTimeout((function(){r.parentNode&&r.parentNode.removeChild(r),t.focus()}),50)}}(t,s),n&&t.dispatch(t.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))}},we.paste=function(t,e){var r=Be?null:e.clipboardData;r&&$e(t,r.getData("text/plain"),r.getData("text/html"),e)?e.preventDefault():function(t,e){if(t.dom.parentNode){var r=t.shiftKey||t.state.selection.$from.parent.type.spec.code,n=t.dom.parentNode.appendChild(document.createElement(r?"textarea":"div"));r||(n.contentEditable="true"),n.style.cssText="position: fixed; left: -10000px; top: 10px",n.focus(),setTimeout((function(){t.focus(),n.parentNode&&n.parentNode.removeChild(n),r?$e(t,n.value,null,e):$e(t,n.textContent,n.innerHTML,e)}),50)}}(t,e)};var Pe=function(t,e){this.slice=t,this.move=e},Le=M.mac?"altKey":"ctrlKey";for(var Ve in ke.dragstart=function(t,e){var r=t.mouseDown;if(r&&r.done(),e.dataTransfer){var n=t.state.selection,o=n.empty?null:t.posAtCoords(Se(e));if(o&&o.pos>=n.from&&o.pos<=(n instanceof l.c?n.to-1:n.to));else if(r&&r.mightDrag)t.dispatch(t.state.tr.setSelection(l.c.create(t.state.doc,r.mightDrag.pos)));else if(e.target&&1==e.target.nodeType){var i=t.docView.nearestDesc(e.target,!0);if(!i||!i.node.type.spec.draggable||i==t.docView)return;t.dispatch(t.state.tr.setSelection(l.c.create(t.state.doc,i.posBefore)))}var s=t.state.selection.content(),a=ce(t,s),c=a.dom,u=a.text;e.dataTransfer.clearData(),e.dataTransfer.setData(Be?"Text":"text/html",c.innerHTML),Be||e.dataTransfer.setData("text/plain",u),t.dragging=new Pe(s,!e[Le])}},ke.dragend=function(t){var e=t.dragging;window.setTimeout((function(){t.dragging==e&&(t.dragging=null)}),50)},we.dragover=we.dragenter=function(t,e){return e.preventDefault()},we.drop=function(t,e){var r=t.dragging;if(t.dragging=null,e.dataTransfer){var n=t.posAtCoords(Se(e));if(n){var o=t.state.doc.resolve(n.pos);if(o){var i=r&&r.slice||le(t,e.dataTransfer.getData(Be?"Text":"text/plain"),Be?null:e.dataTransfer.getData("text/html"),!1,o),s=r&&!e[Le];if(t.someProp("handleDrop",(function(r){return r(t,e,i||O.j.empty,s)})))e.preventDefault();else if(i){e.preventDefault();var a=i?Object(c.g)(t.state.doc,o.pos,i):o.pos;null==a&&(a=o.pos);var u=t.state.tr;s&&u.deleteSelection();var p=u.mapping.map(a),h=0==i.openStart&&0==i.openEnd&&1==i.content.childCount,f=u.doc;if(h?u.replaceRangeWith(p,p,i.content.firstChild):u.replaceRange(p,p,i),!u.doc.eq(f)){var d=u.doc.resolve(p);if(h&&l.c.isSelectable(i.content.firstChild)&&d.nodeAfter&&d.nodeAfter.sameMarkup(i.content.firstChild))u.setSelection(new l.c(d));else{var m=u.mapping.map(a);u.mapping.maps[u.mapping.maps.length-1].forEach((function(t,e,r,n){return m=n})),u.setSelection(Vt(t,d,u.doc.resolve(m)))}t.focus(),t.dispatch(u.setMeta("uiEvent","drop"))}}}}}},ke.focus=function(t){t.focused||(t.domObserver.stop(),t.dom.classList.add("ProseMirror-focused"),t.domObserver.start(),t.focused=!0,setTimeout((function(){t.docView&&t.hasFocus()&&!t.domObserver.currentSelection.eq(t.root.getSelection())&&Ft(t)}),20))},ke.blur=function(t){t.focused&&(t.domObserver.stop(),t.dom.classList.remove("ProseMirror-focused"),t.domObserver.start(),t.domObserver.currentSelection.set({}),t.focused=!1)},ke.beforeinput=function(t,e){if(M.chrome&&M.android&&"deleteContentBackward"==e.inputType){var r=t.domChangeCount;setTimeout((function(){if(t.domChangeCount==r&&(t.dom.blur(),t.focus(),!t.someProp("handleKeyDown",(function(e){return e(t,J(8,"Backspace"))})))){var e=t.state.selection.$cursor;e&&e.pos>0&&t.dispatch(t.state.tr.delete(e.pos-1,e.pos).scrollIntoView())}}),50)}},we)ke[Ve]=we[Ve];function Ue(t,e){if(t==e)return!0;for(var r in t)if(t[r]!==e[r])return!1;for(var n in e)if(!(n in t))return!1;return!0}var Je=function(t,e){this.spec=e||Ye,this.side=this.spec.side||0,this.toDOM=t};Je.prototype.map=function(t,e,r,n){var o=t.mapResult(e.from+n,this.side<0?-1:1),i=o.pos;return o.deleted?null:new He(i-r,i-r,this)},Je.prototype.valid=function(){return!0},Je.prototype.eq=function(t){return this==t||t instanceof Je&&(this.spec.key&&this.spec.key==t.spec.key||this.toDOM==t.toDOM&&Ue(this.spec,t.spec))};var We=function(t,e){this.spec=e||Ye,this.attrs=t};We.prototype.map=function(t,e,r,n){var o=t.map(e.from+n,this.spec.inclusiveStart?-1:1)-r,i=t.map(e.to+n,this.spec.inclusiveEnd?1:-1)-r;return o>=i?null:new He(o,i,this)},We.prototype.valid=function(t,e){return e.from=t&&(!o||o(s.spec))&&r.push(s.copy(s.from+n,s.to+n))}for(var a=0;at){var c=this.children[a]+1;this.children[a+2].findInner(t-c,e-c,r,n+c,o)}},Xe.prototype.map=function(t,e,r){return this==Qe||0==t.maps.length?this:this.mapInner(t,e,0,0,r||Ye)},Xe.prototype.mapInner=function(t,e,r,n,o){for(var i,s=0;sc+i||(e>=a[s]+i?a[s+1]=-1:r>=o&&(l=n-r-(e-t))&&(a[s]+=l,a[s+1]+=l))}},l=0;l=n.content.size){u=!0;continue}var d=r.map(t[p+1]+i,-1)-o,m=n.content.findIndex(f),v=m.index,g=m.offset,y=n.maybeChild(v);if(y&&g==f&&g+y.nodeSize==d){var b=a[p+2].mapInner(r,y,h+1,t[p]+i+1,s);b!=Qe?(a[p]=f,a[p+1]=d,a[p+2]=b):(a[p+1]=-2,u=!0)}else u=!0}if(u){var k=or(function(t,e,r,n,o,i,s){function a(t,e){for(var i=0;is&&l.to=t){this.children[o]==t&&(r=this.children[o+2]);break}for(var i=t+1,s=i+e.content.size,a=0;ai&&c.type instanceof We){var l=Math.max(i,c.from)-i,u=Math.min(s,c.to)-i;lr&&s.to0;)e++;t.splice(e,0,r)}function cr(t){var e=[];return t.someProp("decorations",(function(r){var n=r(t.state);n&&n!=Qe&&e.push(n)})),t.cursorWrapper&&e.push(Xe.create(t.state.doc,[t.cursorWrapper.deco])),tr.from(e)}tr.prototype.forChild=function(t,e){if(e.isLeaf)return Xe.empty;for(var r=[],n=0;nn.scrollToSelection?"to selection":"preserve",p=o||!this.docView.matchesNode(t.doc,c,a);!p&&t.selection.eq(n.selection)||(i=!0);var h,f,d,m,v,g,y,b,k,w,x,_="preserve"==u&&i&&null==this.dom.style.overflowAnchor&&function(t){for(var e,r,n=t.dom.getBoundingClientRect(),o=Math.max(0,n.top),i=(n.left+n.right)/2,s=o+1;s=o-20){e=a,r=c.top;break}}}return{refDOM:e,refTop:r,stack:Z(t.dom)}}(this);if(i){this.domObserver.stop();var C=p&&(M.ie||M.chrome)&&!this.composing&&!n.selection.empty&&!t.selection.empty&&(m=n.selection,v=t.selection,g=Math.min(m.$anchor.sharedDepth(m.head),v.$anchor.sharedDepth(v.head)),m.$anchor.start(g)!=v.$anchor.start(g));if(p){var S=M.chrome?this.trackWrites=this.root.getSelection().focusNode:null;!o&&this.docView.update(t.doc,c,a,this)||(this.docView.updateOuterDeco([]),this.docView.destroy(),this.docView=kt(t.doc,c,a,this.dom,this)),S&&!this.trackWrites&&(C=!0)}C||!(this.mouseDown&&this.domObserver.currentSelection.eq(this.root.getSelection())&&(h=this,f=h.docView.domFromPos(h.state.selection.anchor,0),d=h.root.getSelection(),q(f.node,f.offset,d.anchorNode,d.anchorOffset)))?Ft(this,C):(Pt(this,t.selection),this.domObserver.setCurSelection()),this.domObserver.start()}if(this.updatePluginViews(n),"reset"==u)this.dom.scrollTop=0;else if("to selection"==u){var A=this.root.getSelection().focusNode;this.someProp("handleScrollToSelection",(function(t){return t(r)}))||(t.selection instanceof l.c?G(this,this.docView.domAfterPos(t.selection.from).getBoundingClientRect(),A):G(this,this.coordsAtPos(t.selection.head,1),A))}else _&&(b=(y=_).refDOM,k=y.refTop,w=y.stack,x=b?b.getBoundingClientRect().top:0,Y(w,0==x?0:x-k))},lr.prototype.destroyPluginViews=function(){for(var t;t=this.pluginViews.pop();)t.destroy&&t.destroy()},lr.prototype.updatePluginViews=function(t){if(t&&t.plugins==this.state.plugins)for(var e=0;e=0;e--){var r=t.index(e);if(0!=r)for(var n=t.node(e).child(r-1);;n=n.lastChild){if(0==n.childCount&&!n.inlineContent||n.isAtom||n.type.spec.isolating)return!0;if(n.inlineContent)return!1}}return!0}(t)||!function(t){for(var e=t.depth;e>=0;e--){var r=t.indexAfter(e),n=t.node(e);if(r!=n.childCount)for(var o=n.child(r);;o=o.firstChild){if(0==o.childCount&&!o.inlineContent||o.isAtom||o.type.spec.isolating)return!0;if(o.inlineContent)return!1}}return!0}(t))return!1;var r=e.type.spec.allowGapCursor;if(null!=r)return r;var n=e.contentMatchAt(t.index()).defaultType;return n&&n.isTextblock},e.findFrom=function(t,r,n){t:for(;;){if(!n&&e.valid(t))return t;for(var o=t.pos,i=null,s=t.depth;;s--){var a=t.node(s);if(r>0?t.indexAfter(s)0){i=a.child(r>0?t.indexAfter(s):t.index(s)-1);break}if(0==s)return null;o+=r;var c=t.doc.resolve(o);if(e.valid(c))return c}for(;;){var u=r>0?i.firstChild:i.lastChild;if(!u){if(i.isAtom&&!i.isText&&!l.c.isSelectable(i)){t=t.doc.resolve(o+i.nodeSize*r),n=!1;continue t}break}i=u,o+=r;var p=t.doc.resolve(o);if(e.valid(p))return p}return null}},e}(l.f);vr.prototype.visible=!1,l.f.jsonID("gapcursor",vr);var gr=function(t){this.pos=t};gr.prototype.map=function(t){return new gr(t.map(this.pos))},gr.prototype.resolve=function(t){var e=t.resolve(this.pos);return vr.valid(e)?new vr(e):l.f.near(e)};var yr=Object(A.a)({ArrowLeft:br("horiz",-1),ArrowRight:br("horiz",1),ArrowUp:br("vert",-1),ArrowDown:br("vert",1)});function br(t,e){var r="vert"==t?e>0?"down":"up":e>0?"right":"left";return function(t,n,o){var i=t.selection,s=e>0?i.$to:i.$from,a=i.empty;if(i instanceof l.g){if(!o.endOfTextblock(r)||0==s.depth)return!1;a=!1,s=t.doc.resolve(e>0?s.after():s.before())}var c=vr.findFrom(s,e,a);return!!c&&(n&&n(t.tr.setSelection(new vr(c))),!0)}}function kr(t,e,r){if(!t.editable)return!1;var n=t.state.doc.resolve(e);if(!vr.valid(n))return!1;var o=t.posAtCoords({left:r.clientX,top:r.clientY}).inside;return!(o>-1&&l.c.isSelectable(t.state.doc.nodeAt(o)))&&(t.dispatch(t.state.tr.setSelection(new vr(n))),!0)}function wr(t){if(!(t.selection instanceof vr))return null;var e=document.createElement("div");return e.className="ProseMirror-gapcursor",Xe.create(t.doc,[He.widget(t.selection.head,e,{key:"gapcursor"})])}var xr=r(16),_r=r.n(xr);var Cr=/^data:((?:\w+\/(?:(?!;).)+)?)((?:;[\w\W]*?[^;])*),(.+)$/,Sr=new DOMParser;function Ar(t){return function(e,r,n,o,i,s){if(s&&n.type===t.nodes.spoiler&&"P"!==i.target.tagName)return n.attrs.open=!n.attrs.open,e.focus(),i.stopPropagation(),i.preventDefault(),!1}}var Or=r(5);function Mr(t){return Object(Or.f)(/^(\d+)(\.|\))\s$/,t,(function(t){return{order:+t[1]}}),(function(t,e){return e.childCount+e.attrs.order==+t[1]}))}function Dr(t){return Object(Or.f)(/^\s*([-+*])\s$/,t)}function Er(t){return Object(Or.d)(/^```$/,t)}function Tr(t,e){return Object(Or.d)(new RegExp("^(#{1,"+e+"})\\s$"),t,(function(t){return{level:t[1].length}}))}function Nr(t){return Object(Or.f)(/^\s*>!\s$/,t)}var Ir=r(26),zr=r(34),Rr=r(28),Fr=function(){function t(t,e){this.build(t,e)}var e=t.prototype;return e.build=function(t,e){var r=this;this.attrs=e,this.schema=(new Rr.a).build(),this.parser=new zr.a(this.schema).build(),this.serializer=new Ir.a(this.schema).build(),this.state=l.b.create(this.buildEditorStateConfig()),this.view=new lr(t,this.buildEditorProps()),(e.classNames||[]).forEach((function(t){return r.view.dom.classList.add(t)}));var n=function(e){r.attrs.inputListeners.forEach((function(e){e.call(t)})),e.redraw=!1};t.oninput=n,t.onclick=n,t.onkeyup=n},e.buildEditorStateConfig=function(){return{doc:this.parseInitialValue(this.attrs.value),disabled:this.attrs.disabled,schema:this.schema,plugins:this.buildPluginItems().toArray()}},e.buildPluginItems=function(){var t,e,r,o,i=new _r.a;return i.add("markdownInputrules",Object(Or.c)({rules:this.buildInputRules(this.schema)})),i.add("submit",Object(A.b)({"Mod-Enter":this.attrs.onsubmit})),i.add("escape",Object(A.b)({Escape:this.attrs.escape})),i.add("richTextKeymap",Object(A.b)(function(t){var e=function(e,r){return r(e.tr.replaceSelectionWith(t.nodes.hard_break.create()).scrollIntoView()),!0},r=[function(t,e){var r=$(".EmojiDropdown:visible"),n=$(".MentionsDropdown:visible");if(r[0]||n[0])return!0},Object(n.k)(t.nodes.list_item),function(t,e,r){var o=t.selection,i=o.$head,s=o.$anchor;if(!i.parent.type.spec.code||!i.sameParent(s))return!1;var a=t.selection.$from.nodeBefore,c=t.selection.$from.nodeAfter;return a&&"\n"!==a.text.slice(-1)||c?Object(n.f)(t,e):(r.dispatch(r.state.tr.delete(t.selection.from-1,t.selection.from)),r.dispatch(r.state.tr.setSelection(l.g.near(r.state.doc.resolve(r.state.selection.from)))),Object(n.c)(r.state,r.dispatch))}];app.session.user.preferences().richTextCompactParagraphs&&r.push((function(t,r,n){var o=t.selection,i=o.$head,s=o.$anchor;if("paragraph"!==i.parent.type.name||!i.sameParent(s))return!1;var a=t.selection.$from.nodeBefore,c=t.selection.$from.nodeAfter;if(a&&a.text&&"\n"!==a.text.slice(-1))return e(n.state,n.dispatch);!a||a.text||c||(n.dispatch(n.state.tr.delete(t.selection.from-1,t.selection.from)),n.dispatch(n.state.tr.setSelection(l.g.near(n.state.doc.resolve(n.state.selection.from)))))}));var o=n.b.apply(void 0,r);return{"Mod-z":C,"Mod-y":S,"Mod-Shift-z":S,Backspace:Or.e,"Mod-b":Object(n.n)(t.marks.strong),"Mod-i":Object(n.n)(t.marks.em),"Mod-`":Object(n.n)(t.marks.code),"Alt-Shift-5":Object(n.n)(t.marks.strike),"Mod-,":Object(n.n)(t.marks.sub),"Mod-.":Object(n.n)(t.marks.sup),"Mod-;":Object(n.n)(t.marks.spoiler_inline),"Shift-Mod-8":Object(n.m)(t.nodes.bullet_list),"Shift-Mod-9":Object(n.m)(t.nodes.ordered_list),"Mod-q":Object(n.q)(t.nodes.blockquote),"Shift-Ctrl-0":Object(n.i)(t.nodes.paragraph),"Shift-Ctrl-1":Object(n.i)(t.nodes.heading,{level:1}),"Shift-Ctrl-2":Object(n.i)(t.nodes.heading,{level:2}),"Shift-Ctrl-3":Object(n.i)(t.nodes.heading,{level:3}),"Shift-Ctrl-4":Object(n.i)(t.nodes.heading,{level:4}),"Shift-Ctrl-5":Object(n.i)(t.nodes.heading,{level:5}),"Shift-Ctrl-6":Object(n.i)(t.nodes.heading,{level:6}),"Shift-Ctrl-\\":Object(n.i)(t.nodes.code_block),"Mod-]":Object(n.j)(t.nodes.list_item),"Mod-m":Object(n.j)(t.nodes.list_item),"Mod-[":Object(n.d)(t.nodes.list_item),"Mod-Shift-m":Object(n.d)(t.nodes.list_item),Enter:o,"Shift-Enter":Object(n.b)(n.f,e)}}(this.schema))),i.add("baseKeymap",Object(A.b)(n.a)),i.add("placeholder",(t=this.attrs.placeholder,new l.d({props:{decorations:function(e){var r=[];if(1===e.doc.childCount){var n=e.doc.child(0);n.type.isBlock&&0===n.childCount&&n.type==e.schema.nodes.paragraph&&r.push(He.node(0,n.nodeSize,{class:"placeholder","data-before":t}))}return Xe.create(e.doc,r)}}}))),i.add("history",_()),i.add("disabled",new l.d({key:new l.e("disabled"),props:{editable:function(t){return!t.disabled$}},state:{init:function(t){return t.disabled},apply:function(t,e){var r=t.getMeta("disabled");return void 0!==r?r:e}}})),i.add("disableBase64Paste",new l.d({props:{transformPastedHTML:function(t){var e=Sr.parseFromString(t,"text/html");return e.querySelectorAll("img").forEach((function(t){Cr.test(t.src)&&t.remove()})),e.documentElement.outerHTML}}})),i.add("dropCursor",(void 0===e&&(e={}),new l.d({view:function(t){return new mr(t,e)}}))),i.add("gapCursor",new l.d({props:{decorations:wr,createSelectionBetween:function(t,e,r){if(e.pos==r.pos&&vr.valid(r))return new vr(r)},handleClick:kr,handleKeyDown:yr}})),i.add("menu",(r=this.attrs.menuState,new l.d({view:function(t){return r.attachEditorView(t),r}}))),i.add("toggleSpoiler",(o=this.schema,new l.d({props:{handleClickOn:Ar(o),handleDoubleClickOn:Ar(o)}}))),i},e.buildEditorProps=function(){var t=this;return{state:this.state,dispatchTransaction:function(e){var r=this.state.apply(e);this.updateState(r);var n=this.state.doc,o=t.serializeContent(n,t.schema);t.attrs.oninput(o)}}},e.buildInputRules=function(t){return function(t){var e;return[Or.b,(e=t.nodes.blockquote,Object(Or.f)(/^\s*>\s$/,e)),Mr(t.nodes.ordered_list),Dr(t.nodes.bullet_list),Er(t.nodes.code_block),Tr(t.nodes.heading,6),Nr(t.nodes.spoiler),Object(n.g)(/(?:___\s|\*\*\*\s|---)$/,t.nodes.horizontal_rule),Object(Or.d)(/^\s*\$\$\s$/,t.nodes.math_block),Object(n.e)(/(?:\*\*|__)([^\*_]+)(?:\*\*|__)$/,t.marks.strong),Object(n.e)(/(?:^|[^_])(_([^_]+)_)$/,t.marks.em),Object(n.e)(/(?:^|[^*])(\*([^*]+)\*)$/,t.marks.em),Object(n.e)(/(?:`)([^`]+)(?:`)$/,t.marks.code),Object(n.e)(/(?:~~)([^~]+)(?:~~)$/,t.marks.strike),Object(n.e)(/(?:[^~]~)([^~]+)(?:~)$/,t.marks.sub),Object(n.e)(/(?:\^)([^^]+)(?:\^)$/,t.marks.sup),Object(n.e)(/(?:\|\|)([^\|]+)(?:\|\|)$/,t.marks.spoiler_inline),Object(n.e)(/(?:>!)(.+)(?:!<)$/,t.marks.spoiler_inline),Object(n.e)(/(?:\$)([^$]+)(?:\$)$/,t.marks.math_inline)]}(t)},e.parseInitialValue=function(t){return this.parser.parse(t)},e.serializeContent=function(t){return this.serializer.serialize(t,{tightLists:!0})},e.moveCursorTo=function(t){this.setSelectionRange(t,t)},e.getSelectionRange=function(){return[this.view.state.selection.from,this.view.state.selection.to]},e.getLastNChars=function(t){var e=this.view.state.selection.$from.nodeBefore;return e&&e.text?e.text.slice(Math.max(0,e.text.length-t)):""},e.insertAtCursor=function(t,e){this.insertAt(this.getSelectionRange()[0],t,e),$(this.view.dom).trigger("click")},e.insertAt=function(t,e,r){this.insertBetween(t,t,e,r)},e.insertBetween=function(t,e,r,o){var i=this;void 0===o&&(o=!0);var s=0;o?this.view.dispatch(this.view.state.tr.insertText(r,t,e)):(t-=1,this.view.dispatch(this.view.state.tr.replaceRangeWith(t,e,this.parseInitialValue(r))),s=r.match(/\s+$/)[0].split("\n").length-1),this.moveCursorTo(Math.min(t+r.length,l.f.atEnd(this.view.state.doc).to)),m.redraw(),r.endsWith(" ")&&!o&&this.insertAtCursor(" "),Array(s).fill(0).forEach((function(){n.a.Enter(i.view.state,i.view.dispatch)}))},e.replaceBeforeCursor=function(t,e,r){this.insertBetween(t,this.getSelectionRange()[0],e,r)},e.setSelectionRange=function(t,e){var r=this.view.state.tr.doc.resolve(t),n=this.view.state.tr.doc.resolve(e);this.view.dispatch(this.view.state.tr.setSelection(new l.g(r,n))),this.focus()},e.getCaretCoordinates=function(t){var e=this.view.coordsAtPos(t),r=this.view.dom.getBoundingClientRect();return{left:e.left-r.left,top:e.top-r.top}},e.focus=function(){this.view.focus()},e.destroy=function(){this.view.destroy()},e.disabled=function(t){this.view.dispatch(this.view.state.tr.setMeta("disabled",t))},t}()},function(t,e,r){"use strict";r.d(e,"a",(function(){return D}));var n=r(12),o=r(27),i=r.n(o),s=r(51),a=r.n(s),c=r(52),l=r.n(c),u=r(53),p=r.n(u),h=r(7);function f(t){switch(t){case 10:case 33:case 35:case 36:case 37:case 38:case 42:case 43:case 45:case 58:case 60:case 61:case 62:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}var d=function(t,e){for(var r=t.pos;r=4)return!1;if(62!==e.src.charCodeAt(O)||!t.followingCharRegex.test(e.src[O+1]))return!1;if(O+=t.markup.length,o)return!0;c=f=e.sCount[r]+O-(e.bMarks[r]+e.tShift[r]),32===e.src.charCodeAt(O)?(O++,c++,f++,i=!1,w=!0):9===e.src.charCodeAt(O)?(w=!0,(e.bsCount[r]+f)%4==3?(O++,c++,f++,i=!1):i=!0):w=!1;var D=!1,E=!1,T=O;if(">!"===t.markup)for(;O=M,b=[e.sCount[r]],e.sCount[r]=f-c,k=[e.tShift[r]],e.tShift[r]=O-e.bMarks[r],_=e.md.block.ruler.getRules("spoiler"),y=e.parentType,e.parentType="spoiler",S=!1,h=r+1;h=(M=e.eMarks[h])));h++)if(O+=t.markup.length,62!==e.src.charCodeAt(O-t.markup.length)||!t.followingCharRegex.test(e.src[O-t.markup.length+1])||S){if(u)break;for(x=!1,a=0,l=_.length;a=M,m.push(e.bsCount[h]),e.bsCount[h]=e.sCount[h]+1+(w?1:0),b.push(e.sCount[h]),e.sCount[h]=f-c,k.push(e.tShift[h]),e.tShift[h]=O-e.bMarks[h]}for(g=e.blkIndent,e.blkIndent=0,(C=e.push(t.name+"_open",t.name,1)).markup=t.markup,C.map=p=[r,0],e.md.block.tokenize(e,r,h),(C=e.push(t.name+"_close",t.name,-1)).markup=t.markup,e.lineMax=A,e.parentType=y,p[1]=e.line,a=0;a!",name:"spoiler"},t,e,r,n)}function b(t,e,r,n){return g({followingCharRegex:/[^!]/,markup:">",name:"blockquote"},t,e,r,n)}function k(t){t.block.ruler.__rules__.forEach((function(t){var e=t.alt.indexOf("blockquote");e>-1&&t.alt.splice(e,0,"spoiler")})),t.block.ruler.before("blockquote","spoiler",y,{alt:["paragraph","reference","spoiler","blockquote","list"]}),t.block.ruler.at("blockquote",b,{alt:["paragraph","reference","spoiler","blockquote","list"]})} /**! * markdown-it-mark * @@ -28,5 +28,5 @@ module.exports=function(t){var e={};function r(n){if(e[n])return e[n].exports;va * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. - */function w(t,e){var r;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(r=function(t,e){if(!t)return;if("string"==typeof t)return x(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);"Object"===r&&t.constructor&&(r=t.constructor.name);if("Map"===r||"Set"===r)return Array.from(t);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return x(t,e)}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(r=t[Symbol.iterator]()).next.bind(r)}function x(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(r=t[Symbol.iterator]()).next.bind(r)}function A(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r=0;r--)">!<"===(n=e[r]).marker&&-1!==n.end&&(o=e[n.end],(i=t.tokens[n.token]).type="spoiler_inline_open",i.nesting=1,i.markup=">!",i.content="",(i=t.tokens[o.token]).type="spoiler_inline_close",i.nesting=-1,i.markup="!<",i.content="")}var M=function(t,e){void 0===e&&(e=!1),t.inline.ruler.before("emphasis","spoiler_inline_tags",(function(t,e){if(e)return!1;var r=t.posMax,n=t.pos;return 62===t.src.charCodeAt(n)&&n+3<=r&&33===t.src.charCodeAt(n+1)?(t.scanDelims(t.pos,!0),t.push("text","",0),t.delimiters.push({marker:">!<",length:2,jump:0,token:t.tokens.length-1,end:-1,open:!0,close:!1}),t.pos+=2,!0):33===t.src.charCodeAt(n)&&n+2<=r&&60===t.src.charCodeAt(n+1)&&(t.push("text","",0),t.delimiters.push({marker:">!<",length:2,jump:0,token:t.tokens.length-1,end:-1,open:!1,close:!0}),t.pos+=2,!0)})),t.inline.ruler2.before("emphasis","spoiler_inline_bars",(function(t){if(O(t,t.delimiters),t.tokens_meta)for(var e,r=S(t.tokens_meta);!(e=r()).done;){var n=e.value;n&&n.delimiters&&O(t,n.delimiters)}}))},D=function(){function t(t){this.schema=t}var e=t.prototype;return e.tokenizerParams=function(){return{html:!1}},e.buildTokenizer=function(){return i()("commonmark",this.tokenizerParams()).enable("strikethrough").use(m).use(k).use(p.a).use(a.a).use(l.a).use(C).use(M)},e.buildTokens=function(){return Object(n.a)({},h.d.tokens,{s:{mark:"strike"},softbreak:{node:"hard_break"},spoiler:{block:"spoiler"},spoiler_inline:{mark:"spoiler_inline"},sub:{mark:"sub"},sup:{mark:"sup"},math_block:{block:"math_block",noCloseToken:!0},math_inline:{mark:"math_inline",noCloseToken:!0}})},e.build=function(){return new h.a(this.schema,this.buildTokenizer(),this.buildTokens())},t}()},function(t,e,r){"use strict";r.d(e,"a",(function(){return C}));var n=r(6),o=r(2),i=r(29),s=r.n(i),a=r(16),c=r.n(a),l=r(10),u=r(14),p=r(30),h=r(31),f=r(36),d=r(24);var v=r(20),g=r.n(v),y=r(9),b=r.n(y),k=r(19),w=r.n(k),x=r(21),_=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t),e.initAttrs=function(t){t.buttonClassName="Button Button--icon Button--link Button--menuDropdown"};var r=e.prototype;return r.oninit=function(e){t.prototype.oninit.call(this,e),this.state=this.attrs.state},r.oncreate=function(e){var r=this;t.prototype.oncreate.call(this,e),this.$().on("click",(function(t){$(".App").is(".mobile-safari")&&(app.modal.show(x.a,{title:r.attrs.tooltip,vnodeContent:r.attrs.buttons.map((function(t){return t}))}),t.stopPropagation())}))},r.getButtonContent=function(t){return m(b.a,{text:this.attrs.tooltip},m("span",null,w()(this.attrs.icon)))},r.getMenu=function(t){return m("ul",{className:"Dropdown-menu dropdown-menu HiddenItemsDropdownMenu"},this.attrs.buttons)},e}(g.a),C=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.oninit=function(e){t.prototype.oninit.call(this,e),this.modifierKey=navigator.userAgent.match(/Macintosh/)?"⌘":"ctrl"},r.view=function(t){return this.attrs.state?m("div",{class:"ProseMirrorMenu"},this.items().toArray()):""},r.items=function(){var t=new c.a,e=this.attrs.state,r=this.modifierKey;return t.add("text_type",p.a.component({type:"text_type",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.text_type_tooltip"),state:e,options:[{title:"H1",type:e.getSchema().nodes.heading,attrs:{level:1},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:1})},{title:"H2",type:e.getSchema().nodes.heading,attrs:{level:2},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:2})},{title:"H3",type:e.getSchema().nodes.heading,attrs:{level:3},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:3})},{title:"H4",type:e.getSchema().nodes.heading,attrs:{level:4},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:4})},{title:"H5",type:e.getSchema().nodes.heading,attrs:{level:5},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:5})},{title:"H6",type:e.getSchema().nodes.heading,attrs:{level:6},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:6})},{title:"P",type:e.getSchema().nodes.paragraph,tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.paragraph_tooltip",{modifierKey:r})}]}),100),t.add("bold",u.a.component({type:"bold",icon:"fas fa-bold",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.bold_tooltip",{modifierKey:r}),state:e,mark:e.getSchema().marks.strong}),90),t.add("italic",u.a.component({type:"italic",icon:"fas fa-italic",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.italic_tooltip",{modifierKey:r}),state:e,mark:e.getSchema().marks.em}),80),t.add("code",u.a.component({type:"code",icon:"fas fa-code",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.code_tooltip",{modifierKey:r}),state:e,mark:e.getSchema().marks.code}),70),t.add("quote",l.a.component({type:"quote",icon:"fas fa-quote-left",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.quote_tooltip",{modifierKey:r}),state:e,command:Object(o.q)(e.getSchema().nodes.blockquote)}),60),t.add("link",f.a.component({type:"link",icon:"fas fa-link",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.link_tooltip"),state:e,mark:e.getSchema().marks.link}),50),t.add("image",h.a.component({type:"image",icon:"fas fa-image",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.image_tooltip"),state:e,node:e.getSchema().nodes.image}),40),t.add("unordered_list",d.a.component({type:"unordered_list",icon:"fas fa-list-ul",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.unordered_list_tooltip",{modifierKey:r}),state:e,listType:e.getSchema().nodes.bullet_list}),30),t.add("ordered_list",d.a.component({type:"ordered_list",icon:"fas fa-list-ol",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.ordered_list_tooltip",{modifierKey:r}),state:e,listType:e.getSchema().nodes.ordered_list}),20),t.add("additional_items",_.component({type:"additional_items",icon:"fas fa-plus",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.additional_items_tooltip"),state:e,buttons:this.hiddenItems().toArray()})),t},r.hiddenItems=function(){var t,e,r=new c.a,n=this.attrs.state,i=this.modifierKey;return r.add("strike",u.a.component({type:"strike",icon:"fas fa-strikethrough",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.strike_tooltip"),state:n,mark:n.getSchema().marks.strike})),r.add("sub",u.a.component({type:"sub",icon:"fas fa-subscript",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.sub_tooltip",{modifierKey:i}),state:n,mark:n.getSchema().marks.sub})),r.add("sup",u.a.component({type:"sup",icon:"fas fa-superscript",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.sup_tooltip",{modifierKey:i}),state:n,mark:n.getSchema().marks.sup})),r.add("spoiler_inline",u.a.component({type:"spoiler_inline",icon:"fas fa-eye-slash",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.spoiler_inline_tooltip",{modifierKey:i}),state:n,mark:n.getSchema().marks.spoiler_inline})),r.add("code_block",l.a.component({type:"code_block",icon:"fas fa-terminal",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.code_block_tooltip",{modifierKey:i}),state:n,command:Object(o.l)(n.getSchema().nodes.code_block,n.getSchema().nodes.paragraph)})),r.add("spoiler_block",l.a.component({type:"spoiler_block",icon:"fas fa-caret-square-right",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.spoiler_block_tooltip",{modifierKey:i}),state:n,command:Object(o.o)(n.getSchema().nodes.spoiler)})),r.add("horizontal_rule",l.a.component({type:"horizontal_rule",icon:"fas fa-minus",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.horizontal_rule_tooltip"),state:n,command:(t=n.getSchema().nodes.horizontal_rule,function(r,n){return n(r.tr.replaceSelectionWith(t.create(e))),!0})})),r},e}(s.a)},function(t,e,r){"use strict";r.d(e,"a",(function(){return h}));var n=r(6),o=r(18),i=r.n(o),s=r(11),a=r.n(s),c=r(17),l=r.n(c),u=r(22),p=r(2);var h=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.oninit=function(e){var r=this;t.prototype.oninit.call(this,e),this.text=l()(""),this.href=l()(""),this.title=l()(""),this.state.addItem(this.attrs.type,(function(t,e){r.command(t,e)}),this.onEditorUpdate.bind(this)),this.selectionEmpty=!0},r.fields=function(){var e=t.prototype.fields.call(this);return this.selectionEmpty&&!this.active&&e.add("text",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"text",placeholder:a()(app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.text_placeholder")),bidi:this.text,required:!0})),10),e.add("href",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"href",type:"url",placeholder:a()(app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.href_placeholder")),bidi:this.href,required:!0})),10),e.add("title",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"title",placeholder:a()(app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.title_placeholder")),bidi:this.title})),10),this.active&&e.add("remove",m(i.a,{onclick:this.remove.bind(this),className:"Button Button--danger"},app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.remove_button")),-10),e},r.insert=function(t){var e,r,n,o={href:this.href(),title:this.title()};this.selectionEmpty&&!this.active?(this.command=(e=this.text(),r=this.attrs.mark,n=o,function(t,o){o(t.tr.replaceSelectionWith(t.schema.text(e,[r.create(n)]),!1))}),this.text("")):this.command=Object(p.p)(this.attrs.mark,o),this.state.run(this.attrs.type)},r.remove=function(t){$("body").trigger("click"),this.command=Object(p.h)(this.attrs.mark),this.state.run(this.attrs.type),app.composer.editor.focus()},r.onEditorUpdate=function(){this.active=!!this.state.markActive(this.attrs.mark),this.$(".Dropdown-toggle").toggleClass("active",this.active);var t=this.state.markAttrs(this.attrs.mark);this.href(t.href),this.title(t.title),this.selectionEmpty=this.state.selectionEmpty()},e}(u.a)},function(t,e){t.exports=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4E\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/},function(t,e,r){"use strict";function n(){this.__rules__=[],this.__cache__=null}n.prototype.__find__=function(t){for(var e=0;e=0&&(r=this.attrs[e][1]),r},n.prototype.attrJoin=function(t,e){var r=this.attrIndex(t);r<0?this.attrPush([t,e]):this.attrs[r][1]=this.attrs[r][1]+" "+e},t.exports=n},function(t,e,r){"use strict";t.exports=r(56)},function(t,e,r){"use strict";t.exports.encode=r(57),t.exports.decode=r(58),t.exports.format=r(59),t.exports.parse=r(60)},function(t,e){t.exports=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/},function(t,e){t.exports=/[\0-\x1F\x7F-\x9F]/},function(t,e){t.exports=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/},function(t,e,r){"use strict";var n="<[A-Za-z][A-Za-z0-9\\-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^\"'=<>`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>",o="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",i=new RegExp("^(?:"+n+"|"+o+"|\x3c!----\x3e|\x3c!--(?:-?[^>-])(?:-?[^-])*--\x3e|<[?].*?[?]>|]*>|)"),s=new RegExp("^(?:"+n+"|"+o+")");t.exports.HTML_TAG_RE=i,t.exports.HTML_OPEN_CLOSE_TAG_RE=s},function(t,e,r){"use strict";function n(t,e){var r,n,o,i,s,a=[],c=e.length;for(r=0;r=0;r--)95!==(n=e[r]).marker&&42!==n.marker||-1!==n.end&&(o=e[n.end],a=r>0&&e[r-1].end===n.end+1&&e[r-1].token===n.token-1&&e[n.end+1].token===o.token+1&&e[r-1].marker===n.marker,s=String.fromCharCode(n.marker),(i=t.tokens[n.token]).type=a?"strong_open":"em_open",i.tag=a?"strong":"em",i.nesting=1,i.markup=a?s+s:s,i.content="",(i=t.tokens[o.token]).type=a?"strong_close":"em_close",i.tag=a?"strong":"em",i.nesting=-1,i.markup=a?s+s:s,i.content="",a&&(t.tokens[e[r-1].token].content="",t.tokens[e[n.end+1].token].content="",r--))}t.exports.tokenize=function(t,e){var r,n,o=t.pos,i=t.src.charCodeAt(o);if(e)return!1;if(95!==i&&42!==i)return!1;for(n=t.scanDelims(t.pos,42===i),r=0;r?@[\]^_`{|}~-])/g;function o(t,e){var r,o,i=t.posMax,s=t.pos;if(126!==t.src.charCodeAt(s))return!1;if(e)return!1;if(s+2>=i)return!1;for(t.pos=s+1;t.pos?@[\]^_`{|}~-])/g;function o(t,e){var r,o,i=t.posMax,s=t.pos;if(94!==t.src.charCodeAt(s))return!1;if(e)return!1;if(s+2>=i)return!1;for(t.pos=s+1;t.pos0?t.src.charCodeAt(e-1):-1,n=e+1<=o?t.src.charCodeAt(e+1):-1,(32===r||9===r||n>=48&&n<=57)&&(s=!1),32!==n&&9!==n||(i=!1),{can_open:i,can_close:s}}function o(t,e){let r,o,i,s,a;if("$"!==t.src[t.pos])return!1;if(s=n(t,t.pos),!s.can_open)return e||(t.pending+="$"),t.pos+=1,!0;for(r=t.pos+1,o=r;-1!==(o=t.src.indexOf("$",o));){for(a=o-1;"\\"===t.src[a];)a-=1;if((o-a)%2==1)break;o+=1}return-1===o?(e||(t.pending+="$"),t.pos=r,!0):o-r==0?(e||(t.pending+="$$"),t.pos=r+1,!0):(s=n(t,o),s.can_close?(e||(i=t.push("math_inline","math",0),i.markup="$",i.content=t.src.slice(r,o)),t.pos=o+1,!0):(e||(t.pending+="$"),t.pos=r,!0))}function i(t,e,r,n){let o,i,s,a,c,l=!1,u=t.bMarks[e]+t.tShift[e],p=t.eMarks[e];if(u+2>p)return!1;if("$$"!==t.src.slice(u,u+2))return!1;if(u+=2,o=t.src.slice(u,p),n)return!0;for("$$"===o.trim().slice(-2)&&(o=o.trim().slice(0,-2),l=!0),s=e;!l&&(s++,!(s>=r))&&(u=t.bMarks[s]+t.tShift[s],p=t.eMarks[s],!(u{(e=e||{}).server=e.server||"https://math.now.sh",e.style=e.style||"";const r=t=>encodeURIComponent(t).replace("(","%28").replace(")","%29");t.inline.ruler.after("escape","math_inline",o),t.block.ruler.after("blockquote","math_block",i,{alt:["paragraph","reference","blockquote","list"]}),t.renderer.rules.math_inline=(t,n)=>(t=>{try{return``}catch(e){return console.error(e),t}})(t[n].content),t.renderer.rules.math_block=(t,n)=>(t=>{try{return`

`}catch(e){return console.error(e),t}})(t[n].content)}},function(t,e){t.exports=flarum.core.compat["common/components/Modal"]},function(t,e,r){"use strict";var n=r(4),o=r(63),i=r(67),s=r(68),a=r(76),c=r(90),l=r(103),u=r(41),p=r(105),h={default:r(108),zero:r(109),commonmark:r(110)},f=/^(vbscript|javascript|file|data):/,d=/^data:image\/(gif|png|jpeg|webp);/;function m(t){var e=t.trim().toLowerCase();return!f.test(e)||!!d.test(e)}var v=["http:","https:","mailto:"];function g(t){var e=u.parse(t,!0);if(e.hostname&&(!e.protocol||v.indexOf(e.protocol)>=0))try{e.hostname=p.toASCII(e.hostname)}catch(t){}return u.encode(u.format(e))}function y(t){var e=u.parse(t,!0);if(e.hostname&&(!e.protocol||v.indexOf(e.protocol)>=0))try{e.hostname=p.toUnicode(e.hostname)}catch(t){}return u.decode(u.format(e))}function b(t,e){if(!(this instanceof b))return new b(t,e);e||n.isString(t)||(e=t||{},t="default"),this.inline=new c,this.block=new a,this.core=new s,this.renderer=new i,this.linkify=new l,this.validateLink=m,this.normalizeLink=g,this.normalizeLinkText=y,this.utils=n,this.helpers=n.assign({},o),this.options={},this.configure(t),e&&this.set(e)}b.prototype.set=function(t){return n.assign(this.options,t),this},b.prototype.configure=function(t){var e,r=this;if(n.isString(t)&&!(t=h[e=t]))throw new Error('Wrong `markdown-it` preset "'+e+'", check name');if(!t)throw new Error("Wrong `markdown-it` preset, can't be empty");return t.options&&r.set(t.options),t.components&&Object.keys(t.components).forEach((function(e){t.components[e].rules&&r[e].ruler.enableOnly(t.components[e].rules),t.components[e].rules2&&r[e].ruler2.enableOnly(t.components[e].rules2)})),this},b.prototype.enable=function(t,e){var r=[];Array.isArray(t)||(t=[t]),["core","block","inline"].forEach((function(e){r=r.concat(this[e].ruler.enable(t,!0))}),this),r=r.concat(this.inline.ruler2.enable(t,!0));var n=t.filter((function(t){return r.indexOf(t)<0}));if(n.length&&!e)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+n);return this},b.prototype.disable=function(t,e){var r=[];Array.isArray(t)||(t=[t]),["core","block","inline"].forEach((function(e){r=r.concat(this[e].ruler.disable(t,!0))}),this),r=r.concat(this.inline.ruler2.disable(t,!0));var n=t.filter((function(t){return r.indexOf(t)<0}));if(n.length&&!e)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+n);return this},b.prototype.use=function(t){var e=[this].concat(Array.prototype.slice.call(arguments,1));return t.apply(t,e),this},b.prototype.parse=function(t,e){if("string"!=typeof t)throw new Error("Input data should be a String");var r=new this.core.State(t,this,e);return this.core.process(r),r.tokens},b.prototype.render=function(t,e){return e=e||{},this.renderer.render(this.parse(t,e),this.options,e)},b.prototype.parseInline=function(t,e){var r=new this.core.State(t,this,e);return r.inlineMode=!0,this.core.process(r),r.tokens},b.prototype.renderInline=function(t,e){return e=e||{},this.renderer.render(this.parseInline(t,e),this.options,e)},t.exports=b},function(t){t.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"\'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}')},function(t,e,r){"use strict";var n={};function o(t,e,r){var i,s,a,c,l,u="";for("string"!=typeof e&&(r=e,e=o.defaultChars),void 0===r&&(r=!0),l=function(t){var e,r,o=n[t];if(o)return o;for(o=n[t]=[],e=0;e<128;e++)r=String.fromCharCode(e),/^[0-9a-z]$/i.test(r)?o.push(r):o.push("%"+("0"+e.toString(16).toUpperCase()).slice(-2));for(e=0;e=55296&&a<=57343){if(a>=55296&&a<=56319&&i+1=56320&&c<=57343){u+=encodeURIComponent(t[i]+t[i+1]),i++;continue}u+="%EF%BF%BD"}else u+=encodeURIComponent(t[i]);return u}o.defaultChars=";/?:@&=+$,-_.!~*'()#",o.componentChars="-_.!~*'()",t.exports=o},function(t,e,r){"use strict";var n={};function o(t,e){var r;return"string"!=typeof e&&(e=o.defaultChars),r=function(t){var e,r,o=n[t];if(o)return o;for(o=n[t]=[],e=0;e<128;e++)r=String.fromCharCode(e),o.push(r);for(e=0;e=55296&&c<=57343?"���":String.fromCharCode(c),e+=6):240==(248&o)&&e+91114111?l+="����":(c-=65536,l+=String.fromCharCode(55296+(c>>10),56320+(1023&c))),e+=9):l+="�";return l}))}o.defaultChars=";/?:@&=+$,#",o.componentChars="",t.exports=o},function(t,e,r){"use strict";t.exports=function(t){var e="";return e+=t.protocol||"",e+=t.slashes?"//":"",e+=t.auth?t.auth+"@":"",t.hostname&&-1!==t.hostname.indexOf(":")?e+="["+t.hostname+"]":e+=t.hostname||"",e+=t.port?":"+t.port:"",e+=t.pathname||"",e+=t.search||"",e+=t.hash||""}},function(t,e,r){"use strict";function n(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var o=/^([a-z0-9.+-]+:)/i,i=/:[0-9]*$/,s=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,a=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),c=["'"].concat(a),l=["%","/","?",";","#"].concat(c),u=["/","?","#"],p=/^[+a-z0-9A-Z_-]{0,63}$/,h=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,f={javascript:!0,"javascript:":!0},d={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};n.prototype.parse=function(t,e){var r,n,i,a,c,m=t;if(m=m.trim(),!e&&1===t.split("#").length){var v=s.exec(m);if(v)return this.pathname=v[1],v[2]&&(this.search=v[2]),this}var g=o.exec(m);if(g&&(i=(g=g[0]).toLowerCase(),this.protocol=g,m=m.substr(g.length)),(e||g||m.match(/^\/\/[^@\/]+@[^@\/]+/))&&(!(c="//"===m.substr(0,2))||g&&f[g]||(m=m.substr(2),this.slashes=!0)),!f[g]&&(c||g&&!d[g])){var y,b,k=-1;for(r=0;r127?S+="x":S+=C[A];if(!S.match(p)){var M=_.slice(0,r),D=_.slice(r+1),E=C.match(h);E&&(M.push(E[1]),D.unshift(E[2])),D.length&&(m=D.join(".")+m),this.hostname=M.join(".");break}}}}this.hostname.length>255&&(this.hostname=""),x&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var T=m.indexOf("#");-1!==T&&(this.hash=m.substr(T),m=m.slice(0,T));var N=m.indexOf("?");return-1!==N&&(this.search=m.substr(N),m=m.slice(0,N)),m&&(this.pathname=m),d[i]&&this.hostname&&!this.pathname&&(this.pathname=""),this},n.prototype.parseHost=function(t){var e=i.exec(t);e&&(":"!==(e=e[0])&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)},t.exports=function(t,e){if(t&&t instanceof n)return t;var r=new n;return r.parse(t,e),r}},function(t,e,r){"use strict";e.Any=r(42),e.Cc=r(43),e.Cf=r(62),e.P=r(37),e.Z=r(44)},function(t,e){t.exports=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/},function(t,e,r){"use strict";e.parseLinkLabel=r(64),e.parseLinkDestination=r(65),e.parseLinkTitle=r(66)},function(t,e,r){"use strict";t.exports=function(t,e,r){var n,o,i,s,a=-1,c=t.posMax,l=t.pos;for(t.pos=e+1,n=1;t.pos=r)return c;if(34!==(i=t.charCodeAt(e))&&39!==i&&40!==i)return c;for(e++,40===i&&(i=41);e"+i(t[e].content)+""},s.code_block=function(t,e,r,n,o){var s=t[e];return""+i(t[e].content)+"\n"},s.fence=function(t,e,r,n,s){var a,c,l,u,p=t[e],h=p.info?o(p.info).trim():"",f="";return h&&(f=h.split(/\s+/g)[0]),0===(a=r.highlight&&r.highlight(p.content,f)||i(p.content)).indexOf(""+a+"\n"):"
"+a+"
\n"},s.image=function(t,e,r,n,o){var i=t[e];return i.attrs[i.attrIndex("alt")][1]=o.renderInlineAsText(i.children,r,n),o.renderToken(t,e,r)},s.hardbreak=function(t,e,r){return r.xhtmlOut?"
\n":"
\n"},s.softbreak=function(t,e,r){return r.breaks?r.xhtmlOut?"
\n":"
\n":"\n"},s.text=function(t,e){return i(t[e].content)},s.html_block=function(t,e){return t[e].content},s.html_inline=function(t,e){return t[e].content},a.prototype.renderAttrs=function(t){var e,r,n;if(!t.attrs)return"";for(n="",e=0,r=t.attrs.length;e\n":">")},a.prototype.renderInline=function(t,e,r){for(var n,o="",i=this.rules,s=0,a=t.length;s/i.test(t)}t.exports=function(t){var e,r,i,s,a,c,l,u,p,h,f,d,m,v,g,y,b,k,w=t.tokens;if(t.md.options.linkify)for(r=0,i=w.length;r=0;e--)if("link_close"!==(c=s[e]).type){if("html_inline"===c.type&&(k=c.content,/^\s]/i.test(k)&&m>0&&m--,o(c.content)&&m++),!(m>0)&&"text"===c.type&&t.md.linkify.test(c.content)){for(p=c.content,b=t.md.linkify.match(p),l=[],d=c.level,f=0,u=0;uf&&((a=new t.Token("text","",0)).content=p.slice(f,h),a.level=d,l.push(a)),(a=new t.Token("link_open","a",1)).attrs=[["href",g]],a.level=d++,a.markup="linkify",a.info="auto",l.push(a),(a=new t.Token("text","",0)).content=y,a.level=d,l.push(a),(a=new t.Token("link_close","a",-1)).level=--d,a.markup="linkify",a.info="auto",l.push(a),f=b[u].lastIndex);f=0;e--)"text"!==(r=t[e]).type||n||(r.content=r.content.replace(i,a)),"link_open"===r.type&&"auto"===r.info&&n--,"link_close"===r.type&&"auto"===r.info&&n++}function l(t){var e,r,o=0;for(e=t.length-1;e>=0;e--)"text"!==(r=t[e]).type||o||n.test(r.content)&&(r.content=r.content.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1—$2").replace(/(^|\s)--(\s|$)/gm,"$1–$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1–$2")),"link_open"===r.type&&"auto"===r.info&&o--,"link_close"===r.type&&"auto"===r.info&&o++}t.exports=function(t){var e;if(t.md.options.typographer)for(e=t.tokens.length-1;e>=0;e--)"inline"===t.tokens[e].type&&(o.test(t.tokens[e].content)&&c(t.tokens[e].children),n.test(t.tokens[e].content)&&l(t.tokens[e].children))}},function(t,e,r){"use strict";var n=r(4).isWhiteSpace,o=r(4).isPunctChar,i=r(4).isMdAsciiPunct,s=/['"]/,a=/['"]/g;function c(t,e,r){return t.substr(0,e)+r+t.substr(e+1)}function l(t,e){var r,s,l,u,p,h,f,d,m,v,g,y,b,k,w,x,_,C,S,A,O;for(S=[],r=0;r=0&&!(S[_].level<=f);_--);if(S.length=_+1,"text"===s.type){p=0,h=(l=s.content).length;t:for(;p=0)m=l.charCodeAt(u.index-1);else for(_=r-1;_>=0&&("softbreak"!==t[_].type&&"hardbreak"!==t[_].type);_--)if("text"===t[_].type){m=t[_].content.charCodeAt(t[_].content.length-1);break}if(v=32,p=48&&m<=57&&(x=w=!1),w&&x&&(w=!1,x=y),w||x){if(x)for(_=S.length-1;_>=0&&(d=S[_],!(S[_].level=0;e--)"inline"===t.tokens[e].type&&s.test(t.tokens[e].content)&&l(t.tokens[e].children,t)}},function(t,e,r){"use strict";var n=r(39);function o(t,e,r){this.src=t,this.env=r,this.tokens=[],this.inlineMode=!1,this.md=e}o.prototype.Token=n,t.exports=o},function(t,e,r){"use strict";var n=r(38),o=[["table",r(77),["paragraph","reference"]],["code",r(78)],["fence",r(79),["paragraph","reference","blockquote","list"]],["blockquote",r(80),["paragraph","reference","blockquote","list"]],["hr",r(81),["paragraph","reference","blockquote","list"]],["list",r(82),["paragraph","reference","blockquote"]],["reference",r(83)],["heading",r(84),["paragraph","reference","blockquote"]],["lheading",r(85)],["html_block",r(86),["paragraph","reference","blockquote"]],["paragraph",r(88)]];function i(){this.ruler=new n;for(var t=0;t=r))&&!(t.sCount[s]=c){t.line=r;break}for(n=0;nr)return!1;if(p=e+1,t.sCount[p]=4)return!1;if((l=t.bMarks[p]+t.tShift[p])>=t.eMarks[p])return!1;if(124!==(a=t.src.charCodeAt(l++))&&45!==a&&58!==a)return!1;for(;l=4)return!1;if((f=(h=i(c.replace(/^\||\|$/g,""))).length)>m.length)return!1;if(s)return!0;for((d=t.push("table_open","table",1)).map=g=[e,0],(d=t.push("thead_open","thead",1)).map=[e,e+1],(d=t.push("tr_open","tr",1)).map=[e,e+1],u=0;u=4);p++){for(h=i(c.replace(/^\||\|$/g,"")),d=t.push("tr_open","tr",1),u=0;u=4))break;o=++n}return t.line=o,(i=t.push("code_block","code",0)).content=t.getLines(e,o,4+t.blkIndent,!0),i.map=[e,t.line],!0}},function(t,e,r){"use strict";t.exports=function(t,e,r,n){var o,i,s,a,c,l,u,p=!1,h=t.bMarks[e]+t.tShift[e],f=t.eMarks[e];if(t.sCount[e]-t.blkIndent>=4)return!1;if(h+3>f)return!1;if(126!==(o=t.src.charCodeAt(h))&&96!==o)return!1;if(c=h,(i=(h=t.skipChars(h,o))-c)<3)return!1;if(u=t.src.slice(c,h),s=t.src.slice(h,f),96===o&&s.indexOf(String.fromCharCode(o))>=0)return!1;if(n)return!0;for(a=e;!(++a>=r)&&!((h=c=t.bMarks[a]+t.tShift[a])<(f=t.eMarks[a])&&t.sCount[a]=4||(h=t.skipChars(h,o))-c=4)return!1;if(62!==t.src.charCodeAt(A++))return!1;if(o)return!0;for(c=f=t.sCount[e]+A-(t.bMarks[e]+t.tShift[e]),32===t.src.charCodeAt(A)?(A++,c++,f++,i=!1,k=!0):9===t.src.charCodeAt(A)?(k=!0,(t.bsCount[e]+f)%4==3?(A++,c++,f++,i=!1):i=!0):k=!1,d=[t.bMarks[e]],t.bMarks[e]=A;A=O,y=[t.sCount[e]],t.sCount[e]=f-c,b=[t.tShift[e]],t.tShift[e]=A-t.bMarks[e],x=t.md.block.ruler.getRules("blockquote"),g=t.parentType,t.parentType="blockquote",C=!1,h=e+1;h=(O=t.eMarks[h])));h++)if(62!==t.src.charCodeAt(A++)||C){if(u)break;for(w=!1,a=0,l=x.length;a=O,m.push(t.bsCount[h]),t.bsCount[h]=t.sCount[h]+1+(k?1:0),y.push(t.sCount[h]),t.sCount[h]=f-c,b.push(t.tShift[h]),t.tShift[h]=A-t.bMarks[h]}for(v=t.blkIndent,t.blkIndent=0,(_=t.push("blockquote_open","blockquote",1)).markup=">",_.map=p=[e,0],t.md.block.tokenize(t,e,h),(_=t.push("blockquote_close","blockquote",-1)).markup=">",t.lineMax=S,t.parentType=g,p[1]=t.line,a=0;a=4)return!1;if(42!==(i=t.src.charCodeAt(l++))&&45!==i&&95!==i)return!1;for(s=1;l=s)return-1;if((r=t.src.charCodeAt(i++))<48||r>57)return-1;for(;;){if(i>=s)return-1;if(!((r=t.src.charCodeAt(i++))>=48&&r<=57)){if(41===r||46===r)break;return-1}if(i-o>=10)return-1}return i=4)return!1;if(t.listIndent>=0&&t.sCount[e]-t.listIndent>=4&&t.sCount[e]=t.blkIndent&&(z=!0),(M=i(t,e))>=0){if(h=!0,E=t.bMarks[e]+t.tShift[e],y=Number(t.src.substr(E,M-E-1)),z&&1!==y)return!1}else{if(!((M=o(t,e))>=0))return!1;h=!1}if(z&&t.skipSpaces(M)>=t.eMarks[e])return!1;if(g=t.src.charCodeAt(M-1),n)return!0;for(v=t.tokens.length,h?(I=t.push("ordered_list_open","ol",1),1!==y&&(I.attrs=[["start",y]])):I=t.push("bullet_list_open","ul",1),I.map=m=[e,0],I.markup=String.fromCharCode(g),k=e,D=!1,N=t.md.block.ruler.getRules("list"),_=t.parentType,t.parentType="list";k=b?1:w-p)>4&&(u=1),l=p+u,(I=t.push("list_item_open","li",1)).markup=String.fromCharCode(g),I.map=f=[e,0],A=t.tight,S=t.tShift[e],C=t.sCount[e],x=t.listIndent,t.listIndent=t.blkIndent,t.blkIndent=l,t.tight=!0,t.tShift[e]=a-t.bMarks[e],t.sCount[e]=w,a>=b&&t.isEmpty(e+1)?t.line=Math.min(t.line+2,r):t.md.block.tokenize(t,e,r,!0),t.tight&&!D||(R=!1),D=t.line-e>1&&t.isEmpty(t.line-1),t.blkIndent=t.listIndent,t.listIndent=x,t.tShift[e]=S,t.sCount[e]=C,t.tight=A,(I=t.push("list_item_close","li",-1)).markup=String.fromCharCode(g),k=e=t.line,f[1]=k,a=t.bMarks[e],k>=r)break;if(t.sCount[k]=4)break;for(T=!1,c=0,d=N.length;c=4)return!1;if(91!==t.src.charCodeAt(_))return!1;for(;++_3||t.sCount[S]<0)){for(b=!1,p=0,h=k.length;p=4)return!1;if(35!==(i=t.src.charCodeAt(l))||l>=u)return!1;for(s=1,i=t.src.charCodeAt(++l);35===i&&l6||ll&&n(t.src.charCodeAt(a-1))&&(u=a),t.line=e+1,(c=t.push("heading_open","h"+String(s),1)).markup="########".slice(0,s),c.map=[e,t.line],(c=t.push("inline","",0)).content=t.src.slice(l,u).trim(),c.map=[e,t.line],c.children=[],(c=t.push("heading_close","h"+String(s),-1)).markup="########".slice(0,s)),!0)}},function(t,e,r){"use strict";t.exports=function(t,e,r){var n,o,i,s,a,c,l,u,p,h,f=e+1,d=t.md.block.ruler.getRules("paragraph");if(t.sCount[e]-t.blkIndent>=4)return!1;for(h=t.parentType,t.parentType="paragraph";f3)){if(t.sCount[f]>=t.blkIndent&&(c=t.bMarks[f]+t.tShift[f])<(l=t.eMarks[f])&&(45===(p=t.src.charCodeAt(c))||61===p)&&(c=t.skipChars(c,p),(c=t.skipSpaces(c))>=l)){u=61===p?1:2;break}if(!(t.sCount[f]<0)){for(o=!1,i=0,s=d.length;i|$))/i,/<\/(script|pre|style)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(o.source+"\\s*$"),/^$/,!1]];t.exports=function(t,e,r,n){var o,s,a,c,l=t.bMarks[e]+t.tShift[e],u=t.eMarks[e];if(t.sCount[e]-t.blkIndent>=4)return!1;if(!t.md.options.html)return!1;if(60!==t.src.charCodeAt(l))return!1;for(c=t.src.slice(l,u),o=0;o3||t.sCount[c]<0)){for(n=!1,o=0,i=l.length;o0&&this.level++,this.tokens.push(o),o},i.prototype.isEmpty=function(t){return this.bMarks[t]+this.tShift[t]>=this.eMarks[t]},i.prototype.skipEmptyLines=function(t){for(var e=this.lineMax;te;)if(!o(this.src.charCodeAt(--t)))return t+1;return t},i.prototype.skipChars=function(t,e){for(var r=this.src.length;tr;)if(e!==this.src.charCodeAt(--t))return t+1;return t},i.prototype.getLines=function(t,e,r,n){var i,s,a,c,l,u,p,h=t;if(t>=e)return"";for(u=new Array(e-t),i=0;hr?new Array(s-r+1).join(" ")+this.src.slice(c,l):this.src.slice(c,l)}return u.join("")},i.prototype.Token=n,t.exports=i},function(t,e,r){"use strict";var n=r(38),o=[["text",r(91)],["newline",r(92)],["escape",r(93)],["backticks",r(94)],["strikethrough",r(46).tokenize],["emphasis",r(47).tokenize],["link",r(95)],["image",r(96)],["autolink",r(97)],["html_inline",r(98)],["entity",r(99)]],i=[["balance_pairs",r(100)],["strikethrough",r(46).postProcess],["emphasis",r(47).postProcess],["text_collapse",r(101)]];function s(){var t;for(this.ruler=new n,t=0;t=i)break}else t.pending+=t.src[t.pos++]}t.pending&&t.pushPending()},s.prototype.parse=function(t,e,r,n){var o,i,s,a=new this.State(t,e,r,n);for(this.tokenize(a),s=(i=this.ruler2.getRules("")).length,o=0;o=0&&32===t.pending.charCodeAt(r)?r>=1&&32===t.pending.charCodeAt(r-1)?(t.pending=t.pending.replace(/ +$/,""),t.push("hardbreak","br",0)):(t.pending=t.pending.slice(0,-1),t.push("softbreak","br",0)):t.push("softbreak","br",0)),i++;i?@[]^_`{|}~-".split("").forEach((function(t){o[t.charCodeAt(0)]=1})),t.exports=function(t,e){var r,i=t.pos,s=t.posMax;if(92!==t.src.charCodeAt(i))return!1;if(++i=m)return!1;for(v=l,(u=t.md.helpers.parseLinkDestination(t.src,l,t.posMax)).ok&&(f=t.md.normalizeLink(u.str),t.md.validateLink(f)?l=u.pos:f=""),v=l;l=m||41!==t.src.charCodeAt(l))&&(g=!0),l++}if(g){if(void 0===t.env.references)return!1;if(l=0?s=t.src.slice(v,l++):l=a+1):l=a+1,s||(s=t.src.slice(c,a)),!(p=t.env.references[n(s)]))return t.pos=d,!1;f=p.href,h=p.title}return e||(t.pos=c,t.posMax=a,t.push("link_open","a",1).attrs=r=[["href",f]],h&&r.push(["title",h]),t.md.inline.tokenize(t),t.push("link_close","a",-1)),t.pos=l,t.posMax=m,!0}},function(t,e,r){"use strict";var n=r(4).normalizeReference,o=r(4).isSpace;t.exports=function(t,e){var r,i,s,a,c,l,u,p,h,f,d,m,v,g="",y=t.pos,b=t.posMax;if(33!==t.src.charCodeAt(t.pos))return!1;if(91!==t.src.charCodeAt(t.pos+1))return!1;if(l=t.pos+2,(c=t.md.helpers.parseLinkLabel(t,t.pos+1,!1))<0)return!1;if((u=c+1)=b)return!1;for(v=u,(h=t.md.helpers.parseLinkDestination(t.src,u,t.posMax)).ok&&(g=t.md.normalizeLink(h.str),t.md.validateLink(g)?u=h.pos:g=""),v=u;u=b||41!==t.src.charCodeAt(u))return t.pos=y,!1;u++}else{if(void 0===t.env.references)return!1;if(u=0?a=t.src.slice(v,u++):u=c+1):u=c+1,a||(a=t.src.slice(l,c)),!(p=t.env.references[n(a)]))return t.pos=y,!1;g=p.href,f=p.title}return e||(s=t.src.slice(l,c),t.md.inline.parse(s,t.md,t.env,m=[]),(d=t.push("image","img",0)).attrs=r=[["src",g],["alt",""]],d.children=m,d.content=s,f&&r.push(["title",f])),t.pos=u,t.posMax=b,!0}},function(t,e,r){"use strict";var n=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,o=/^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>/;t.exports=function(t,e){var r,i,s,a,c,l,u=t.pos;return 60===t.src.charCodeAt(u)&&(!((r=t.src.slice(u)).indexOf(">")<0)&&(o.test(r)?(a=(i=r.match(o))[0].slice(1,-1),c=t.md.normalizeLink(a),!!t.md.validateLink(c)&&(e||((l=t.push("link_open","a",1)).attrs=[["href",c]],l.markup="autolink",l.info="auto",(l=t.push("text","",0)).content=t.md.normalizeLinkText(a),(l=t.push("link_close","a",-1)).markup="autolink",l.info="auto"),t.pos+=i[0].length,!0)):!!n.test(r)&&(a=(s=r.match(n))[0].slice(1,-1),c=t.md.normalizeLink("mailto:"+a),!!t.md.validateLink(c)&&(e||((l=t.push("link_open","a",1)).attrs=[["href",c]],l.markup="autolink",l.info="auto",(l=t.push("text","",0)).content=t.md.normalizeLinkText(a),(l=t.push("link_close","a",-1)).markup="autolink",l.info="auto"),t.pos+=s[0].length,!0))))}},function(t,e,r){"use strict";var n=r(45).HTML_TAG_RE;t.exports=function(t,e){var r,o,i,s=t.pos;return!!t.md.options.html&&(i=t.posMax,!(60!==t.src.charCodeAt(s)||s+2>=i)&&(!(33!==(r=t.src.charCodeAt(s+1))&&63!==r&&47!==r&&!function(t){var e=32|t;return e>=97&&e<=122}(r))&&(!!(o=t.src.slice(s).match(n))&&(e||(t.push("html_inline","",0).content=t.src.slice(s,s+o[0].length)),t.pos+=o[0].length,!0))))}},function(t,e,r){"use strict";var n=r(40),o=r(4).has,i=r(4).isValidEntityCode,s=r(4).fromCodePoint,a=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,c=/^&([a-z][a-z0-9]{1,31});/i;t.exports=function(t,e){var r,l,u=t.pos,p=t.posMax;if(38!==t.src.charCodeAt(u))return!1;if(u+1s;n-=i.jump+1)if((i=e[n]).marker===o.marker&&(-1===a&&(a=n),i.open&&i.end<0&&i.level===o.level&&(c=!1,(i.close||o.open)&&(i.length+o.length)%3==0&&(i.length%3==0&&o.length%3==0||(c=!0)),!c))){l=n>0&&!e[n-1].open?e[n-1].jump+1:0,o.jump=r-n+l,o.open=!1,i.end=r,i.jump=l,i.close=!1,a=-1;break}-1!==a&&(u[o.marker][(o.length||0)%3]=a)}}t.exports=function(t){var e,r=t.tokens_meta,o=t.tokens_meta.length;for(n(0,t.delimiters),e=0;e0&&n++,"text"===o[e].type&&e+10&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],i={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(o),this.tokens_meta.push(i),o},a.prototype.scanDelims=function(t,e){var r,n,a,c,l,u,p,h,f,d=t,m=!0,v=!0,g=this.posMax,y=this.src.charCodeAt(t);for(r=t>0?this.src.charCodeAt(t-1):32;d=3&&":"===t[e-3]||e>=3&&"/"===t[e-3]?0:n.match(r.re.no_http)[0].length:0}},"mailto:":{validate:function(t,e,r){var n=t.slice(e);return r.re.mailto||(r.re.mailto=new RegExp("^"+r.re.src_email_name+"@"+r.re.src_host_strict,"i")),r.re.mailto.test(n)?n.match(r.re.mailto)[0].length:0}}},l="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф".split("|");function u(t){var e=t.re=r(104)(t.__opts__),n=t.__tlds__.slice();function a(t){return t.replace("%TLDS%",e.src_tlds)}t.onCompile(),t.__tlds_replaced__||n.push("a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]"),n.push(e.src_xn),e.src_tlds=n.join("|"),e.email_fuzzy=RegExp(a(e.tpl_email_fuzzy),"i"),e.link_fuzzy=RegExp(a(e.tpl_link_fuzzy),"i"),e.link_no_ip_fuzzy=RegExp(a(e.tpl_link_no_ip_fuzzy),"i"),e.host_fuzzy_test=RegExp(a(e.tpl_host_fuzzy_test),"i");var c=[];function l(t,e){throw new Error('(LinkifyIt) Invalid schema "'+t+'": '+e)}t.__compiled__={},Object.keys(t.__schemas__).forEach((function(e){var r=t.__schemas__[e];if(null!==r){var n={validate:null,link:null};if(t.__compiled__[e]=n,"[object Object]"===o(r))return!function(t){return"[object RegExp]"===o(t)}(r.validate)?i(r.validate)?n.validate=r.validate:l(e,r):n.validate=function(t){return function(e,r){var n=e.slice(r);return t.test(n)?n.match(t)[0].length:0}}(r.validate),void(i(r.normalize)?n.normalize=r.normalize:r.normalize?l(e,r):n.normalize=function(t,e){e.normalize(t)});!function(t){return"[object String]"===o(t)}(r)?l(e,r):c.push(e)}})),c.forEach((function(e){t.__compiled__[t.__schemas__[e]]&&(t.__compiled__[e].validate=t.__compiled__[t.__schemas__[e]].validate,t.__compiled__[e].normalize=t.__compiled__[t.__schemas__[e]].normalize)})),t.__compiled__[""]={validate:null,normalize:function(t,e){e.normalize(t)}};var u=Object.keys(t.__compiled__).filter((function(e){return e.length>0&&t.__compiled__[e]})).map(s).join("|");t.re.schema_test=RegExp("(^|(?!_)(?:[><|]|"+e.src_ZPCc+"))("+u+")","i"),t.re.schema_search=RegExp("(^|(?!_)(?:[><|]|"+e.src_ZPCc+"))("+u+")","ig"),t.re.pretest=RegExp("("+t.re.schema_test.source+")|("+t.re.host_fuzzy_test.source+")|@","i"),function(t){t.__index__=-1,t.__text_cache__=""}(t)}function p(t,e){var r=t.__index__,n=t.__last_index__,o=t.__text_cache__.slice(r,n);this.schema=t.__schema__.toLowerCase(),this.index=r+e,this.lastIndex=n+e,this.raw=o,this.text=o,this.url=o}function h(t,e){var r=new p(t,e);return t.__compiled__[r.schema].normalize(r,t),r}function f(t,e){if(!(this instanceof f))return new f(t,e);var r;e||(r=t,Object.keys(r||{}).reduce((function(t,e){return t||a.hasOwnProperty(e)}),!1)&&(e=t,t={})),this.__opts__=n({},a,e),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=n({},c,t),this.__compiled__={},this.__tlds__=l,this.__tlds_replaced__=!1,this.re={},u(this)}f.prototype.add=function(t,e){return this.__schemas__[t]=e,u(this),this},f.prototype.set=function(t){return this.__opts__=n(this.__opts__,t),this},f.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;var e,r,n,o,i,s,a,c;if(this.re.schema_test.test(t))for((a=this.re.schema_search).lastIndex=0;null!==(e=a.exec(t));)if(o=this.testSchemaAt(t,e[2],a.lastIndex)){this.__schema__=e[2],this.__index__=e.index+e[1].length,this.__last_index__=e.index+e[0].length+o;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(c=t.search(this.re.host_fuzzy_test))>=0&&(this.__index__<0||c=0&&null!==(n=t.match(this.re.email_fuzzy))&&(i=n.index+n[1].length,s=n.index+n[0].length,(this.__index__<0||ithis.__last_index__)&&(this.__schema__="mailto:",this.__index__=i,this.__last_index__=s)),this.__index__>=0},f.prototype.pretest=function(t){return this.re.pretest.test(t)},f.prototype.testSchemaAt=function(t,e,r){return this.__compiled__[e.toLowerCase()]?this.__compiled__[e.toLowerCase()].validate(t,r,this):0},f.prototype.match=function(t){var e=0,r=[];this.__index__>=0&&this.__text_cache__===t&&(r.push(h(this,e)),e=this.__last_index__);for(var n=e?t.slice(e):t;this.test(n);)r.push(h(this,e)),n=n.slice(this.__last_index__),e+=this.__last_index__;return r.length?r:null},f.prototype.tlds=function(t,e){return t=Array.isArray(t)?t:[t],e?(this.__tlds__=this.__tlds__.concat(t).sort().filter((function(t,e,r){return t!==r[e-1]})).reverse(),u(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,u(this),this)},f.prototype.normalize=function(t){t.schema||(t.url="http://"+t.url),"mailto:"!==t.schema||/^mailto:/i.test(t.url)||(t.url="mailto:"+t.url)},f.prototype.onCompile=function(){},t.exports=f},function(t,e,r){"use strict";t.exports=function(t){var e={};e.src_Any=r(42).source,e.src_Cc=r(43).source,e.src_Z=r(44).source,e.src_P=r(37).source,e.src_ZPCc=[e.src_Z,e.src_P,e.src_Cc].join("|"),e.src_ZCc=[e.src_Z,e.src_Cc].join("|");return e.src_pseudo_letter="(?:(?![><|]|"+e.src_ZPCc+")"+e.src_Any+")",e.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",e.src_auth="(?:(?:(?!"+e.src_ZCc+"|[@/\\[\\]()]).)+@)?",e.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",e.src_host_terminator="(?=$|[><|]|"+e.src_ZPCc+")(?!-|_|:\\d|\\.-|\\.(?!$|"+e.src_ZPCc+"))",e.src_path="(?:[/?#](?:(?!"+e.src_ZCc+"|[><|]|[()[\\]{}.,\"'?!\\-]).|\\[(?:(?!"+e.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+e.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+e.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+e.src_ZCc+'|["]).)+\\"|\\\'(?:(?!'+e.src_ZCc+"|[']).)+\\'|\\'(?="+e.src_pseudo_letter+"|[-]).|\\.{2,4}[a-zA-Z0-9%/]|\\.(?!"+e.src_ZCc+"|[.]).|"+(t&&t["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+"\\,(?!"+e.src_ZCc+").|\\!(?!"+e.src_ZCc+"|[!]).|\\?(?!"+e.src_ZCc+"|[?]).)+|\\/)?",e.src_email_name='[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*',e.src_xn="xn--[a-z0-9\\-]{1,59}",e.src_domain_root="(?:"+e.src_xn+"|"+e.src_pseudo_letter+"{1,63})",e.src_domain="(?:"+e.src_xn+"|(?:"+e.src_pseudo_letter+")|(?:"+e.src_pseudo_letter+"(?:-|"+e.src_pseudo_letter+"){0,61}"+e.src_pseudo_letter+"))",e.src_host="(?:(?:(?:(?:"+e.src_domain+")\\.)*"+e.src_domain+"))",e.tpl_host_fuzzy="(?:"+e.src_ip4+"|(?:(?:(?:"+e.src_domain+")\\.)+(?:%TLDS%)))",e.tpl_host_no_ip_fuzzy="(?:(?:(?:"+e.src_domain+")\\.)+(?:%TLDS%))",e.src_host_strict=e.src_host+e.src_host_terminator,e.tpl_host_fuzzy_strict=e.tpl_host_fuzzy+e.src_host_terminator,e.src_host_port_strict=e.src_host+e.src_port+e.src_host_terminator,e.tpl_host_port_fuzzy_strict=e.tpl_host_fuzzy+e.src_port+e.src_host_terminator,e.tpl_host_port_no_ip_fuzzy_strict=e.tpl_host_no_ip_fuzzy+e.src_port+e.src_host_terminator,e.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+e.src_ZPCc+"|>|$))",e.tpl_email_fuzzy='(^|[><|]|"|\\(|'+e.src_ZCc+")("+e.src_email_name+"@"+e.tpl_host_fuzzy_strict+")",e.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+e.src_ZPCc+"))((?![$+<=>^`||])"+e.tpl_host_port_fuzzy_strict+e.src_path+")",e.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+e.src_ZPCc+"))((?![$+<=>^`||])"+e.tpl_host_port_no_ip_fuzzy_strict+e.src_path+")",e}},function(t,e,r){(function(t,n){var o;/*! https://mths.be/punycode v1.4.1 by @mathias */!function(i){e&&e.nodeType,t&&t.nodeType;var s="object"==typeof n&&n;s.global!==s&&s.window!==s&&s.self;var a,c=2147483647,l=/^xn--/,u=/[^\x20-\x7E]/,p=/[\x2E\u3002\uFF0E\uFF61]/g,h={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},f=Math.floor,d=String.fromCharCode;function m(t){throw new RangeError(h[t])}function v(t,e){for(var r=t.length,n=[];r--;)n[r]=e(t[r]);return n}function g(t,e){var r=t.split("@"),n="";return r.length>1&&(n=r[0]+"@",t=r[1]),n+v((t=t.replace(p,".")).split("."),e).join(".")}function y(t){for(var e,r,n=[],o=0,i=t.length;o=55296&&e<=56319&&o65535&&(e+=d((t-=65536)>>>10&1023|55296),t=56320|1023&t),e+=d(t)})).join("")}function k(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function w(t,e,r){var n=0;for(t=r?f(t/700):t>>1,t+=f(t/e);t>455;n+=36)t=f(t/35);return f(n+36*t/(t+38))}function x(t){var e,r,n,o,i,s,a,l,u,p,h,d=[],v=t.length,g=0,y=128,k=72;for((r=t.lastIndexOf("-"))<0&&(r=0),n=0;n=128&&m("not-basic"),d.push(t.charCodeAt(n));for(o=r>0?r+1:0;o=v&&m("invalid-input"),((l=(h=t.charCodeAt(o++))-48<10?h-22:h-65<26?h-65:h-97<26?h-97:36)>=36||l>f((c-g)/s))&&m("overflow"),g+=l*s,!(l<(u=a<=k?1:a>=k+26?26:a-k));a+=36)s>f(c/(p=36-u))&&m("overflow"),s*=p;k=w(g-i,e=d.length+1,0==i),f(g/e)>c-y&&m("overflow"),y+=f(g/e),g%=e,d.splice(g++,0,y)}return b(d)}function _(t){var e,r,n,o,i,s,a,l,u,p,h,v,g,b,x,_=[];for(v=(t=y(t)).length,e=128,r=0,i=72,s=0;s=e&&hf((c-r)/(g=n+1))&&m("overflow"),r+=(a-e)*g,e=a,s=0;sc&&m("overflow"),h==e){for(l=r,u=36;!(l<(p=u<=i?1:u>=i+26?26:u-i));u+=36)x=l-p,b=36-p,_.push(d(k(p+x%b,0))),l=f(x/b);_.push(d(k(l,0))),i=w(r,g,n==o),r=0,++n}++r,++e}return _.join("")}a={version:"1.4.1",ucs2:{decode:y,encode:b},decode:x,encode:_,toASCII:function(t){return g(t,(function(t){return u.test(t)?"xn--"+_(t):t}))},toUnicode:function(t){return g(t,(function(t){return l.test(t)?x(t.slice(4).toLowerCase()):t}))}},void 0===(o=function(){return a}.call(e,r,e,t))||(t.exports=o)}()}).call(this,r(106)(t),r(107))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(t){"object"==typeof window&&(r=window)}t.exports=r},function(t,e,r){"use strict";t.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}}},function(t,e,r){"use strict";t.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["paragraph"]},inline:{rules:["text"],rules2:["balance_pairs","text_collapse"]}}}},function(t,e,r){"use strict";t.exports={options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["blockquote","code","fence","heading","hr","html_block","lheading","list","reference","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","html_inline","image","link","newline","text"],rules2:["balance_pairs","emphasis","text_collapse"]}}}},,,,,function(t,e,r){"use strict";r.r(e),r.d(e,"components",(function(){return o.d})),r.d(e,"proseMirror",(function(){return o.g})),r.d(e,"states",(function(){return o.i})),r.d(e,"InputRule",(function(){return o.a})),r.d(e,"keymap",(function(){return o.e})),r.d(e,"liftListItem",(function(){return o.f})),r.d(e,"splitListItem",(function(){return o.h})),r.d(e,"wrapInList",(function(){return o.j})),r.d(e,"Plugin",(function(){return o.b})),r.d(e,"Selection",(function(){return o.c}));var n=r(49),o=r(48);app.initializers.add("askvortsov/flarum-rich-text",(function(){Object(n.a)(),app.extensionData.for("askvortsov-rich-text").registerSetting({setting:"askvortsov-rich-text.toggle_on_editor",type:"boolean",label:app.translator.trans("askvortsov-rich-text.admin.settings.toggle_on_editor")})}))}]); + */function w(t,e){var r;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(r=function(t,e){if(!t)return;if("string"==typeof t)return x(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);"Object"===r&&t.constructor&&(r=t.constructor.name);if("Map"===r||"Set"===r)return Array.from(t);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return x(t,e)}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(r=t[Symbol.iterator]()).next.bind(r)}function x(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(r=t[Symbol.iterator]()).next.bind(r)}function A(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r=0;r--)">!<"===(n=e[r]).marker&&-1!==n.end&&(o=e[n.end],(i=t.tokens[n.token]).type="spoiler_inline_open",i.nesting=1,i.markup=">!",i.content="",(i=t.tokens[o.token]).type="spoiler_inline_close",i.nesting=-1,i.markup="!<",i.content="")}var M=function(t,e){void 0===e&&(e=!1),t.inline.ruler.before("emphasis","spoiler_inline_tags",(function(t,e){if(e)return!1;var r=t.posMax,n=t.pos;return 62===t.src.charCodeAt(n)&&n+3<=r&&33===t.src.charCodeAt(n+1)?(t.scanDelims(t.pos,!0),t.push("text","",0),t.delimiters.push({marker:">!<",length:2,jump:0,token:t.tokens.length-1,end:-1,open:!0,close:!1}),t.pos+=2,!0):33===t.src.charCodeAt(n)&&n+2<=r&&60===t.src.charCodeAt(n+1)&&(t.push("text","",0),t.delimiters.push({marker:">!<",length:2,jump:0,token:t.tokens.length-1,end:-1,open:!1,close:!0}),t.pos+=2,!0)})),t.inline.ruler2.before("emphasis","spoiler_inline_bars",(function(t){if(O(t,t.delimiters),t.tokens_meta)for(var e,r=S(t.tokens_meta);!(e=r()).done;){var n=e.value;n&&n.delimiters&&O(t,n.delimiters)}}))},D=function(){function t(t){this.schema=t}var e=t.prototype;return e.tokenizerParams=function(){return{html:!1}},e.buildTokenizer=function(){return i()("commonmark",this.tokenizerParams()).enable("strikethrough").use(m).use(k).use(p.a).use(a.a).use(l.a).use(C).use(M)},e.buildTokens=function(){return Object(n.a)({},h.d.tokens,{s:{mark:"strike"},softbreak:{node:"hard_break"},spoiler:{block:"spoiler"},spoiler_inline:{mark:"spoiler_inline"},sub:{mark:"sub"},sup:{mark:"sup"},math_block:{block:"math_block",noCloseToken:!0},math_inline:{mark:"math_inline",noCloseToken:!0}})},e.build=function(){return new h.a(this.schema,this.buildTokenizer(),this.buildTokens())},t}()},function(t,e,r){"use strict";r.d(e,"a",(function(){return C}));var n=r(6),o=r(2),i=r(29),s=r.n(i),a=r(16),c=r.n(a),l=r(10),u=r(14),p=r(30),h=r(31),f=r(36),d=r(24);var v=r(20),g=r.n(v),y=r(9),b=r.n(y),k=r(19),w=r.n(k),x=r(21),_=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t),e.initAttrs=function(t){t.buttonClassName="Button Button--icon Button--link Button--menuDropdown"};var r=e.prototype;return r.oninit=function(e){t.prototype.oninit.call(this,e),this.state=this.attrs.state},r.oncreate=function(e){var r=this;t.prototype.oncreate.call(this,e),this.$().on("click",(function(t){$(".App").is(".mobile-safari")&&(app.modal.show(x.a,{title:r.attrs.tooltip,vnodeContent:r.attrs.buttons.map((function(t){return t}))}),t.stopPropagation())}))},r.getButtonContent=function(t){return m(b.a,{text:this.attrs.tooltip},m("span",null,w()(this.attrs.icon)))},r.getMenu=function(t){return m("ul",{className:"Dropdown-menu dropdown-menu HiddenItemsDropdownMenu"},this.attrs.buttons)},e}(g.a),C=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.oninit=function(e){t.prototype.oninit.call(this,e),this.modifierKey=navigator.userAgent.match(/Macintosh/)?"⌘":"ctrl"},r.view=function(t){return this.attrs.state?m("div",{class:"ProseMirrorMenu"},this.items().toArray()):""},r.items=function(){var t=new c.a,e=this.attrs.state,r=this.modifierKey;return t.add("text_type",p.a.component({type:"text_type",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.text_type_tooltip"),state:e,options:[{title:"H1",type:e.getSchema().nodes.heading,attrs:{level:1},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:1})},{title:"H2",type:e.getSchema().nodes.heading,attrs:{level:2},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:2})},{title:"H3",type:e.getSchema().nodes.heading,attrs:{level:3},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:3})},{title:"H4",type:e.getSchema().nodes.heading,attrs:{level:4},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:4})},{title:"H5",type:e.getSchema().nodes.heading,attrs:{level:5},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:5})},{title:"H6",type:e.getSchema().nodes.heading,attrs:{level:6},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:6})},{title:"P",type:e.getSchema().nodes.paragraph,tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.paragraph_tooltip",{modifierKey:r})}]}),100),t.add("bold",u.a.component({type:"bold",icon:"fas fa-bold",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.bold_tooltip",{modifierKey:r}),state:e,mark:e.getSchema().marks.strong}),90),t.add("italic",u.a.component({type:"italic",icon:"fas fa-italic",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.italic_tooltip",{modifierKey:r}),state:e,mark:e.getSchema().marks.em}),80),t.add("code",u.a.component({type:"code",icon:"fas fa-code",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.code_tooltip",{modifierKey:r}),state:e,mark:e.getSchema().marks.code}),70),t.add("quote",l.a.component({type:"quote",icon:"fas fa-quote-left",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.quote_tooltip",{modifierKey:r}),state:e,command:Object(o.q)(e.getSchema().nodes.blockquote)}),60),t.add("link",f.a.component({type:"link",icon:"fas fa-link",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.link_tooltip"),state:e,mark:e.getSchema().marks.link}),50),t.add("image",h.a.component({type:"image",icon:"fas fa-image",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.image_tooltip"),state:e,node:e.getSchema().nodes.image}),40),t.add("unordered_list",d.a.component({type:"unordered_list",icon:"fas fa-list-ul",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.unordered_list_tooltip",{modifierKey:r}),state:e,listType:e.getSchema().nodes.bullet_list}),30),t.add("ordered_list",d.a.component({type:"ordered_list",icon:"fas fa-list-ol",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.ordered_list_tooltip",{modifierKey:r}),state:e,listType:e.getSchema().nodes.ordered_list}),20),t.add("additional_items",_.component({type:"additional_items",icon:"fas fa-plus",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.additional_items_tooltip"),state:e,buttons:this.hiddenItems().toArray()})),t},r.hiddenItems=function(){var t,e,r=new c.a,n=this.attrs.state,i=this.modifierKey;return r.add("strike",u.a.component({type:"strike",icon:"fas fa-strikethrough",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.strike_tooltip"),state:n,mark:n.getSchema().marks.strike})),r.add("sub",u.a.component({type:"sub",icon:"fas fa-subscript",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.sub_tooltip",{modifierKey:i}),state:n,mark:n.getSchema().marks.sub})),r.add("sup",u.a.component({type:"sup",icon:"fas fa-superscript",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.sup_tooltip",{modifierKey:i}),state:n,mark:n.getSchema().marks.sup})),r.add("spoiler_inline",u.a.component({type:"spoiler_inline",icon:"fas fa-eye-slash",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.spoiler_inline_tooltip",{modifierKey:i}),state:n,mark:n.getSchema().marks.spoiler_inline})),r.add("code_block",l.a.component({type:"code_block",icon:"fas fa-terminal",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.code_block_tooltip",{modifierKey:i}),state:n,command:Object(o.l)(n.getSchema().nodes.code_block,n.getSchema().nodes.paragraph)})),r.add("spoiler_block",l.a.component({type:"spoiler_block",icon:"fas fa-caret-square-right",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.spoiler_block_tooltip",{modifierKey:i}),state:n,command:Object(o.o)(n.getSchema().nodes.spoiler)})),r.add("horizontal_rule",l.a.component({type:"horizontal_rule",icon:"fas fa-minus",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.horizontal_rule_tooltip"),state:n,command:(t=n.getSchema().nodes.horizontal_rule,function(r,n){return n(r.tr.replaceSelectionWith(t.create(e))),!0})})),r},e}(s.a)},function(t,e,r){"use strict";r.d(e,"a",(function(){return h}));var n=r(6),o=r(18),i=r.n(o),s=r(11),a=r.n(s),c=r(17),l=r.n(c),u=r(22),p=r(2);var h=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.oninit=function(e){var r=this;t.prototype.oninit.call(this,e),this.text=l()(""),this.href=l()(""),this.title=l()(""),this.state.addItem(this.attrs.type,(function(t,e){r.command(t,e)}),this.onEditorUpdate.bind(this)),this.selectionEmpty=!0},r.fields=function(){var e=t.prototype.fields.call(this);return this.selectionEmpty&&!this.active&&e.add("text",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"text",placeholder:a()(app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.text_placeholder")),bidi:this.text,required:!0})),10),e.add("href",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"href",type:"url",placeholder:a()(app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.href_placeholder")),bidi:this.href,required:!0})),10),e.add("title",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"title",placeholder:a()(app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.title_placeholder")),bidi:this.title})),10),this.active&&e.add("remove",m(i.a,{onclick:this.remove.bind(this),className:"Button Button--danger"},app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.remove_button")),-10),e},r.insert=function(t){var e,r,n,o={href:this.href(),title:this.title()};this.selectionEmpty&&!this.active?(this.command=(e=this.text(),r=this.attrs.mark,n=o,function(t,o){o(t.tr.replaceSelectionWith(t.schema.text(e,[r.create(n)]),!1))}),this.text("")):this.command=Object(p.p)(this.attrs.mark,o),this.state.run(this.attrs.type)},r.remove=function(t){$("body").trigger("click"),this.command=Object(p.h)(this.attrs.mark),this.state.run(this.attrs.type),app.composer.editor.focus()},r.onEditorUpdate=function(){this.active=!!this.state.markActive(this.attrs.mark),this.$(".Dropdown-toggle").toggleClass("active",this.active);var t=this.state.markAttrs(this.attrs.mark);this.href(t.href),this.title(t.title),this.selectionEmpty=this.state.selectionEmpty()},e}(u.a)},function(t,e){t.exports=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4E\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/},function(t,e,r){"use strict";function n(){this.__rules__=[],this.__cache__=null}n.prototype.__find__=function(t){for(var e=0;e=0&&(r=this.attrs[e][1]),r},n.prototype.attrJoin=function(t,e){var r=this.attrIndex(t);r<0?this.attrPush([t,e]):this.attrs[r][1]=this.attrs[r][1]+" "+e},t.exports=n},function(t,e,r){"use strict";t.exports=r(56)},function(t,e,r){"use strict";t.exports.encode=r(57),t.exports.decode=r(58),t.exports.format=r(59),t.exports.parse=r(60)},function(t,e){t.exports=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/},function(t,e){t.exports=/[\0-\x1F\x7F-\x9F]/},function(t,e){t.exports=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/},function(t,e,r){"use strict";var n="<[A-Za-z][A-Za-z0-9\\-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^\"'=<>`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>",o="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",i=new RegExp("^(?:"+n+"|"+o+"|\x3c!----\x3e|\x3c!--(?:-?[^>-])(?:-?[^-])*--\x3e|<[?].*?[?]>|]*>|)"),s=new RegExp("^(?:"+n+"|"+o+")");t.exports.HTML_TAG_RE=i,t.exports.HTML_OPEN_CLOSE_TAG_RE=s},function(t,e,r){"use strict";function n(t,e){var r,n,o,i,s,a=[],c=e.length;for(r=0;r=0;r--)95!==(n=e[r]).marker&&42!==n.marker||-1!==n.end&&(o=e[n.end],a=r>0&&e[r-1].end===n.end+1&&e[r-1].token===n.token-1&&e[n.end+1].token===o.token+1&&e[r-1].marker===n.marker,s=String.fromCharCode(n.marker),(i=t.tokens[n.token]).type=a?"strong_open":"em_open",i.tag=a?"strong":"em",i.nesting=1,i.markup=a?s+s:s,i.content="",(i=t.tokens[o.token]).type=a?"strong_close":"em_close",i.tag=a?"strong":"em",i.nesting=-1,i.markup=a?s+s:s,i.content="",a&&(t.tokens[e[r-1].token].content="",t.tokens[e[n.end+1].token].content="",r--))}t.exports.tokenize=function(t,e){var r,n,o=t.pos,i=t.src.charCodeAt(o);if(e)return!1;if(95!==i&&42!==i)return!1;for(n=t.scanDelims(t.pos,42===i),r=0;r?@[\]^_`{|}~-])/g;function o(t,e){var r,o,i=t.posMax,s=t.pos;if(126!==t.src.charCodeAt(s))return!1;if(e)return!1;if(s+2>=i)return!1;for(t.pos=s+1;t.pos?@[\]^_`{|}~-])/g;function o(t,e){var r,o,i=t.posMax,s=t.pos;if(94!==t.src.charCodeAt(s))return!1;if(e)return!1;if(s+2>=i)return!1;for(t.pos=s+1;t.pos0?t.src.charCodeAt(e-1):-1,n=e+1<=o?t.src.charCodeAt(e+1):-1,(32===r||9===r||n>=48&&n<=57)&&(s=!1),32!==n&&9!==n||(i=!1),{can_open:i,can_close:s}}function o(t,e){let r,o,i,s,a;if("$"!==t.src[t.pos])return!1;if(s=n(t,t.pos),!s.can_open)return e||(t.pending+="$"),t.pos+=1,!0;for(r=t.pos+1,o=r;-1!==(o=t.src.indexOf("$",o));){for(a=o-1;"\\"===t.src[a];)a-=1;if((o-a)%2==1)break;o+=1}return-1===o?(e||(t.pending+="$"),t.pos=r,!0):o-r==0?(e||(t.pending+="$$"),t.pos=r+1,!0):(s=n(t,o),s.can_close?(e||(i=t.push("math_inline","math",0),i.markup="$",i.content=t.src.slice(r,o)),t.pos=o+1,!0):(e||(t.pending+="$"),t.pos=r,!0))}function i(t,e,r,n){let o,i,s,a,c,l=!1,u=t.bMarks[e]+t.tShift[e],p=t.eMarks[e];if(u+2>p)return!1;if("$$"!==t.src.slice(u,u+2))return!1;if(u+=2,o=t.src.slice(u,p),n)return!0;for("$$"===o.trim().slice(-2)&&(o=o.trim().slice(0,-2),l=!0),s=e;!l&&(s++,!(s>=r))&&(u=t.bMarks[s]+t.tShift[s],p=t.eMarks[s],!(u{(e=e||{}).server=e.server||"https://math.now.sh",e.style=e.style||"";const r=t=>encodeURIComponent(t).replace("(","%28").replace(")","%29");t.inline.ruler.after("escape","math_inline",o),t.block.ruler.after("blockquote","math_block",i,{alt:["paragraph","reference","blockquote","list"]}),t.renderer.rules.math_inline=(t,n)=>(t=>{try{return``}catch(e){return console.error(e),t}})(t[n].content),t.renderer.rules.math_block=(t,n)=>(t=>{try{return`

`}catch(e){return console.error(e),t}})(t[n].content)}},function(t,e){t.exports=flarum.core.compat["common/components/Modal"]},function(t,e,r){"use strict";var n=r(4),o=r(63),i=r(67),s=r(68),a=r(76),c=r(90),l=r(103),u=r(41),p=r(105),h={default:r(108),zero:r(109),commonmark:r(110)},f=/^(vbscript|javascript|file|data):/,d=/^data:image\/(gif|png|jpeg|webp);/;function m(t){var e=t.trim().toLowerCase();return!f.test(e)||!!d.test(e)}var v=["http:","https:","mailto:"];function g(t){var e=u.parse(t,!0);if(e.hostname&&(!e.protocol||v.indexOf(e.protocol)>=0))try{e.hostname=p.toASCII(e.hostname)}catch(t){}return u.encode(u.format(e))}function y(t){var e=u.parse(t,!0);if(e.hostname&&(!e.protocol||v.indexOf(e.protocol)>=0))try{e.hostname=p.toUnicode(e.hostname)}catch(t){}return u.decode(u.format(e))}function b(t,e){if(!(this instanceof b))return new b(t,e);e||n.isString(t)||(e=t||{},t="default"),this.inline=new c,this.block=new a,this.core=new s,this.renderer=new i,this.linkify=new l,this.validateLink=m,this.normalizeLink=g,this.normalizeLinkText=y,this.utils=n,this.helpers=n.assign({},o),this.options={},this.configure(t),e&&this.set(e)}b.prototype.set=function(t){return n.assign(this.options,t),this},b.prototype.configure=function(t){var e,r=this;if(n.isString(t)&&!(t=h[e=t]))throw new Error('Wrong `markdown-it` preset "'+e+'", check name');if(!t)throw new Error("Wrong `markdown-it` preset, can't be empty");return t.options&&r.set(t.options),t.components&&Object.keys(t.components).forEach((function(e){t.components[e].rules&&r[e].ruler.enableOnly(t.components[e].rules),t.components[e].rules2&&r[e].ruler2.enableOnly(t.components[e].rules2)})),this},b.prototype.enable=function(t,e){var r=[];Array.isArray(t)||(t=[t]),["core","block","inline"].forEach((function(e){r=r.concat(this[e].ruler.enable(t,!0))}),this),r=r.concat(this.inline.ruler2.enable(t,!0));var n=t.filter((function(t){return r.indexOf(t)<0}));if(n.length&&!e)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+n);return this},b.prototype.disable=function(t,e){var r=[];Array.isArray(t)||(t=[t]),["core","block","inline"].forEach((function(e){r=r.concat(this[e].ruler.disable(t,!0))}),this),r=r.concat(this.inline.ruler2.disable(t,!0));var n=t.filter((function(t){return r.indexOf(t)<0}));if(n.length&&!e)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+n);return this},b.prototype.use=function(t){var e=[this].concat(Array.prototype.slice.call(arguments,1));return t.apply(t,e),this},b.prototype.parse=function(t,e){if("string"!=typeof t)throw new Error("Input data should be a String");var r=new this.core.State(t,this,e);return this.core.process(r),r.tokens},b.prototype.render=function(t,e){return e=e||{},this.renderer.render(this.parse(t,e),this.options,e)},b.prototype.parseInline=function(t,e){var r=new this.core.State(t,this,e);return r.inlineMode=!0,this.core.process(r),r.tokens},b.prototype.renderInline=function(t,e){return e=e||{},this.renderer.render(this.parseInline(t,e),this.options,e)},t.exports=b},function(t){t.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"\'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}')},function(t,e,r){"use strict";var n={};function o(t,e,r){var i,s,a,c,l,u="";for("string"!=typeof e&&(r=e,e=o.defaultChars),void 0===r&&(r=!0),l=function(t){var e,r,o=n[t];if(o)return o;for(o=n[t]=[],e=0;e<128;e++)r=String.fromCharCode(e),/^[0-9a-z]$/i.test(r)?o.push(r):o.push("%"+("0"+e.toString(16).toUpperCase()).slice(-2));for(e=0;e=55296&&a<=57343){if(a>=55296&&a<=56319&&i+1=56320&&c<=57343){u+=encodeURIComponent(t[i]+t[i+1]),i++;continue}u+="%EF%BF%BD"}else u+=encodeURIComponent(t[i]);return u}o.defaultChars=";/?:@&=+$,-_.!~*'()#",o.componentChars="-_.!~*'()",t.exports=o},function(t,e,r){"use strict";var n={};function o(t,e){var r;return"string"!=typeof e&&(e=o.defaultChars),r=function(t){var e,r,o=n[t];if(o)return o;for(o=n[t]=[],e=0;e<128;e++)r=String.fromCharCode(e),o.push(r);for(e=0;e=55296&&c<=57343?"���":String.fromCharCode(c),e+=6):240==(248&o)&&e+91114111?l+="����":(c-=65536,l+=String.fromCharCode(55296+(c>>10),56320+(1023&c))),e+=9):l+="�";return l}))}o.defaultChars=";/?:@&=+$,#",o.componentChars="",t.exports=o},function(t,e,r){"use strict";t.exports=function(t){var e="";return e+=t.protocol||"",e+=t.slashes?"//":"",e+=t.auth?t.auth+"@":"",t.hostname&&-1!==t.hostname.indexOf(":")?e+="["+t.hostname+"]":e+=t.hostname||"",e+=t.port?":"+t.port:"",e+=t.pathname||"",e+=t.search||"",e+=t.hash||""}},function(t,e,r){"use strict";function n(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var o=/^([a-z0-9.+-]+:)/i,i=/:[0-9]*$/,s=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,a=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),c=["'"].concat(a),l=["%","/","?",";","#"].concat(c),u=["/","?","#"],p=/^[+a-z0-9A-Z_-]{0,63}$/,h=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,f={javascript:!0,"javascript:":!0},d={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};n.prototype.parse=function(t,e){var r,n,i,a,c,m=t;if(m=m.trim(),!e&&1===t.split("#").length){var v=s.exec(m);if(v)return this.pathname=v[1],v[2]&&(this.search=v[2]),this}var g=o.exec(m);if(g&&(i=(g=g[0]).toLowerCase(),this.protocol=g,m=m.substr(g.length)),(e||g||m.match(/^\/\/[^@\/]+@[^@\/]+/))&&(!(c="//"===m.substr(0,2))||g&&f[g]||(m=m.substr(2),this.slashes=!0)),!f[g]&&(c||g&&!d[g])){var y,b,k=-1;for(r=0;r127?S+="x":S+=C[A];if(!S.match(p)){var M=_.slice(0,r),D=_.slice(r+1),E=C.match(h);E&&(M.push(E[1]),D.unshift(E[2])),D.length&&(m=D.join(".")+m),this.hostname=M.join(".");break}}}}this.hostname.length>255&&(this.hostname=""),x&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var T=m.indexOf("#");-1!==T&&(this.hash=m.substr(T),m=m.slice(0,T));var N=m.indexOf("?");return-1!==N&&(this.search=m.substr(N),m=m.slice(0,N)),m&&(this.pathname=m),d[i]&&this.hostname&&!this.pathname&&(this.pathname=""),this},n.prototype.parseHost=function(t){var e=i.exec(t);e&&(":"!==(e=e[0])&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)},t.exports=function(t,e){if(t&&t instanceof n)return t;var r=new n;return r.parse(t,e),r}},function(t,e,r){"use strict";e.Any=r(42),e.Cc=r(43),e.Cf=r(62),e.P=r(37),e.Z=r(44)},function(t,e){t.exports=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/},function(t,e,r){"use strict";e.parseLinkLabel=r(64),e.parseLinkDestination=r(65),e.parseLinkTitle=r(66)},function(t,e,r){"use strict";t.exports=function(t,e,r){var n,o,i,s,a=-1,c=t.posMax,l=t.pos;for(t.pos=e+1,n=1;t.pos=r)return c;if(34!==(i=t.charCodeAt(e))&&39!==i&&40!==i)return c;for(e++,40===i&&(i=41);e"+i(t[e].content)+""},s.code_block=function(t,e,r,n,o){var s=t[e];return""+i(t[e].content)+"\n"},s.fence=function(t,e,r,n,s){var a,c,l,u,p=t[e],h=p.info?o(p.info).trim():"",f="";return h&&(f=h.split(/\s+/g)[0]),0===(a=r.highlight&&r.highlight(p.content,f)||i(p.content)).indexOf(""+a+"\n"):"
"+a+"
\n"},s.image=function(t,e,r,n,o){var i=t[e];return i.attrs[i.attrIndex("alt")][1]=o.renderInlineAsText(i.children,r,n),o.renderToken(t,e,r)},s.hardbreak=function(t,e,r){return r.xhtmlOut?"
\n":"
\n"},s.softbreak=function(t,e,r){return r.breaks?r.xhtmlOut?"
\n":"
\n":"\n"},s.text=function(t,e){return i(t[e].content)},s.html_block=function(t,e){return t[e].content},s.html_inline=function(t,e){return t[e].content},a.prototype.renderAttrs=function(t){var e,r,n;if(!t.attrs)return"";for(n="",e=0,r=t.attrs.length;e\n":">")},a.prototype.renderInline=function(t,e,r){for(var n,o="",i=this.rules,s=0,a=t.length;s/i.test(t)}t.exports=function(t){var e,r,i,s,a,c,l,u,p,h,f,d,m,v,g,y,b,k,w=t.tokens;if(t.md.options.linkify)for(r=0,i=w.length;r=0;e--)if("link_close"!==(c=s[e]).type){if("html_inline"===c.type&&(k=c.content,/^\s]/i.test(k)&&m>0&&m--,o(c.content)&&m++),!(m>0)&&"text"===c.type&&t.md.linkify.test(c.content)){for(p=c.content,b=t.md.linkify.match(p),l=[],d=c.level,f=0,u=0;uf&&((a=new t.Token("text","",0)).content=p.slice(f,h),a.level=d,l.push(a)),(a=new t.Token("link_open","a",1)).attrs=[["href",g]],a.level=d++,a.markup="linkify",a.info="auto",l.push(a),(a=new t.Token("text","",0)).content=y,a.level=d,l.push(a),(a=new t.Token("link_close","a",-1)).level=--d,a.markup="linkify",a.info="auto",l.push(a),f=b[u].lastIndex);f=0;e--)"text"!==(r=t[e]).type||n||(r.content=r.content.replace(i,a)),"link_open"===r.type&&"auto"===r.info&&n--,"link_close"===r.type&&"auto"===r.info&&n++}function l(t){var e,r,o=0;for(e=t.length-1;e>=0;e--)"text"!==(r=t[e]).type||o||n.test(r.content)&&(r.content=r.content.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1—$2").replace(/(^|\s)--(\s|$)/gm,"$1–$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1–$2")),"link_open"===r.type&&"auto"===r.info&&o--,"link_close"===r.type&&"auto"===r.info&&o++}t.exports=function(t){var e;if(t.md.options.typographer)for(e=t.tokens.length-1;e>=0;e--)"inline"===t.tokens[e].type&&(o.test(t.tokens[e].content)&&c(t.tokens[e].children),n.test(t.tokens[e].content)&&l(t.tokens[e].children))}},function(t,e,r){"use strict";var n=r(4).isWhiteSpace,o=r(4).isPunctChar,i=r(4).isMdAsciiPunct,s=/['"]/,a=/['"]/g;function c(t,e,r){return t.substr(0,e)+r+t.substr(e+1)}function l(t,e){var r,s,l,u,p,h,f,d,m,v,g,y,b,k,w,x,_,C,S,A,O;for(S=[],r=0;r=0&&!(S[_].level<=f);_--);if(S.length=_+1,"text"===s.type){p=0,h=(l=s.content).length;t:for(;p=0)m=l.charCodeAt(u.index-1);else for(_=r-1;_>=0&&("softbreak"!==t[_].type&&"hardbreak"!==t[_].type);_--)if("text"===t[_].type){m=t[_].content.charCodeAt(t[_].content.length-1);break}if(v=32,p=48&&m<=57&&(x=w=!1),w&&x&&(w=!1,x=y),w||x){if(x)for(_=S.length-1;_>=0&&(d=S[_],!(S[_].level=0;e--)"inline"===t.tokens[e].type&&s.test(t.tokens[e].content)&&l(t.tokens[e].children,t)}},function(t,e,r){"use strict";var n=r(39);function o(t,e,r){this.src=t,this.env=r,this.tokens=[],this.inlineMode=!1,this.md=e}o.prototype.Token=n,t.exports=o},function(t,e,r){"use strict";var n=r(38),o=[["table",r(77),["paragraph","reference"]],["code",r(78)],["fence",r(79),["paragraph","reference","blockquote","list"]],["blockquote",r(80),["paragraph","reference","blockquote","list"]],["hr",r(81),["paragraph","reference","blockquote","list"]],["list",r(82),["paragraph","reference","blockquote"]],["reference",r(83)],["heading",r(84),["paragraph","reference","blockquote"]],["lheading",r(85)],["html_block",r(86),["paragraph","reference","blockquote"]],["paragraph",r(88)]];function i(){this.ruler=new n;for(var t=0;t=r))&&!(t.sCount[s]=c){t.line=r;break}for(n=0;nr)return!1;if(p=e+1,t.sCount[p]=4)return!1;if((l=t.bMarks[p]+t.tShift[p])>=t.eMarks[p])return!1;if(124!==(a=t.src.charCodeAt(l++))&&45!==a&&58!==a)return!1;for(;l=4)return!1;if((f=(h=i(c.replace(/^\||\|$/g,""))).length)>m.length)return!1;if(s)return!0;for((d=t.push("table_open","table",1)).map=g=[e,0],(d=t.push("thead_open","thead",1)).map=[e,e+1],(d=t.push("tr_open","tr",1)).map=[e,e+1],u=0;u=4);p++){for(h=i(c.replace(/^\||\|$/g,"")),d=t.push("tr_open","tr",1),u=0;u=4))break;o=++n}return t.line=o,(i=t.push("code_block","code",0)).content=t.getLines(e,o,4+t.blkIndent,!0),i.map=[e,t.line],!0}},function(t,e,r){"use strict";t.exports=function(t,e,r,n){var o,i,s,a,c,l,u,p=!1,h=t.bMarks[e]+t.tShift[e],f=t.eMarks[e];if(t.sCount[e]-t.blkIndent>=4)return!1;if(h+3>f)return!1;if(126!==(o=t.src.charCodeAt(h))&&96!==o)return!1;if(c=h,(i=(h=t.skipChars(h,o))-c)<3)return!1;if(u=t.src.slice(c,h),s=t.src.slice(h,f),96===o&&s.indexOf(String.fromCharCode(o))>=0)return!1;if(n)return!0;for(a=e;!(++a>=r)&&!((h=c=t.bMarks[a]+t.tShift[a])<(f=t.eMarks[a])&&t.sCount[a]=4||(h=t.skipChars(h,o))-c=4)return!1;if(62!==t.src.charCodeAt(A++))return!1;if(o)return!0;for(c=f=t.sCount[e]+A-(t.bMarks[e]+t.tShift[e]),32===t.src.charCodeAt(A)?(A++,c++,f++,i=!1,k=!0):9===t.src.charCodeAt(A)?(k=!0,(t.bsCount[e]+f)%4==3?(A++,c++,f++,i=!1):i=!0):k=!1,d=[t.bMarks[e]],t.bMarks[e]=A;A=O,y=[t.sCount[e]],t.sCount[e]=f-c,b=[t.tShift[e]],t.tShift[e]=A-t.bMarks[e],x=t.md.block.ruler.getRules("blockquote"),g=t.parentType,t.parentType="blockquote",C=!1,h=e+1;h=(O=t.eMarks[h])));h++)if(62!==t.src.charCodeAt(A++)||C){if(u)break;for(w=!1,a=0,l=x.length;a=O,m.push(t.bsCount[h]),t.bsCount[h]=t.sCount[h]+1+(k?1:0),y.push(t.sCount[h]),t.sCount[h]=f-c,b.push(t.tShift[h]),t.tShift[h]=A-t.bMarks[h]}for(v=t.blkIndent,t.blkIndent=0,(_=t.push("blockquote_open","blockquote",1)).markup=">",_.map=p=[e,0],t.md.block.tokenize(t,e,h),(_=t.push("blockquote_close","blockquote",-1)).markup=">",t.lineMax=S,t.parentType=g,p[1]=t.line,a=0;a=4)return!1;if(42!==(i=t.src.charCodeAt(l++))&&45!==i&&95!==i)return!1;for(s=1;l=s)return-1;if((r=t.src.charCodeAt(i++))<48||r>57)return-1;for(;;){if(i>=s)return-1;if(!((r=t.src.charCodeAt(i++))>=48&&r<=57)){if(41===r||46===r)break;return-1}if(i-o>=10)return-1}return i=4)return!1;if(t.listIndent>=0&&t.sCount[e]-t.listIndent>=4&&t.sCount[e]=t.blkIndent&&(z=!0),(M=i(t,e))>=0){if(h=!0,E=t.bMarks[e]+t.tShift[e],y=Number(t.src.substr(E,M-E-1)),z&&1!==y)return!1}else{if(!((M=o(t,e))>=0))return!1;h=!1}if(z&&t.skipSpaces(M)>=t.eMarks[e])return!1;if(g=t.src.charCodeAt(M-1),n)return!0;for(v=t.tokens.length,h?(I=t.push("ordered_list_open","ol",1),1!==y&&(I.attrs=[["start",y]])):I=t.push("bullet_list_open","ul",1),I.map=m=[e,0],I.markup=String.fromCharCode(g),k=e,D=!1,N=t.md.block.ruler.getRules("list"),_=t.parentType,t.parentType="list";k=b?1:w-p)>4&&(u=1),l=p+u,(I=t.push("list_item_open","li",1)).markup=String.fromCharCode(g),I.map=f=[e,0],A=t.tight,S=t.tShift[e],C=t.sCount[e],x=t.listIndent,t.listIndent=t.blkIndent,t.blkIndent=l,t.tight=!0,t.tShift[e]=a-t.bMarks[e],t.sCount[e]=w,a>=b&&t.isEmpty(e+1)?t.line=Math.min(t.line+2,r):t.md.block.tokenize(t,e,r,!0),t.tight&&!D||(R=!1),D=t.line-e>1&&t.isEmpty(t.line-1),t.blkIndent=t.listIndent,t.listIndent=x,t.tShift[e]=S,t.sCount[e]=C,t.tight=A,(I=t.push("list_item_close","li",-1)).markup=String.fromCharCode(g),k=e=t.line,f[1]=k,a=t.bMarks[e],k>=r)break;if(t.sCount[k]=4)break;for(T=!1,c=0,d=N.length;c=4)return!1;if(91!==t.src.charCodeAt(_))return!1;for(;++_3||t.sCount[S]<0)){for(b=!1,p=0,h=k.length;p=4)return!1;if(35!==(i=t.src.charCodeAt(l))||l>=u)return!1;for(s=1,i=t.src.charCodeAt(++l);35===i&&l6||ll&&n(t.src.charCodeAt(a-1))&&(u=a),t.line=e+1,(c=t.push("heading_open","h"+String(s),1)).markup="########".slice(0,s),c.map=[e,t.line],(c=t.push("inline","",0)).content=t.src.slice(l,u).trim(),c.map=[e,t.line],c.children=[],(c=t.push("heading_close","h"+String(s),-1)).markup="########".slice(0,s)),!0)}},function(t,e,r){"use strict";t.exports=function(t,e,r){var n,o,i,s,a,c,l,u,p,h,f=e+1,d=t.md.block.ruler.getRules("paragraph");if(t.sCount[e]-t.blkIndent>=4)return!1;for(h=t.parentType,t.parentType="paragraph";f3)){if(t.sCount[f]>=t.blkIndent&&(c=t.bMarks[f]+t.tShift[f])<(l=t.eMarks[f])&&(45===(p=t.src.charCodeAt(c))||61===p)&&(c=t.skipChars(c,p),(c=t.skipSpaces(c))>=l)){u=61===p?1:2;break}if(!(t.sCount[f]<0)){for(o=!1,i=0,s=d.length;i|$))/i,/<\/(script|pre|style)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(o.source+"\\s*$"),/^$/,!1]];t.exports=function(t,e,r,n){var o,s,a,c,l=t.bMarks[e]+t.tShift[e],u=t.eMarks[e];if(t.sCount[e]-t.blkIndent>=4)return!1;if(!t.md.options.html)return!1;if(60!==t.src.charCodeAt(l))return!1;for(c=t.src.slice(l,u),o=0;o3||t.sCount[c]<0)){for(n=!1,o=0,i=l.length;o0&&this.level++,this.tokens.push(o),o},i.prototype.isEmpty=function(t){return this.bMarks[t]+this.tShift[t]>=this.eMarks[t]},i.prototype.skipEmptyLines=function(t){for(var e=this.lineMax;te;)if(!o(this.src.charCodeAt(--t)))return t+1;return t},i.prototype.skipChars=function(t,e){for(var r=this.src.length;tr;)if(e!==this.src.charCodeAt(--t))return t+1;return t},i.prototype.getLines=function(t,e,r,n){var i,s,a,c,l,u,p,h=t;if(t>=e)return"";for(u=new Array(e-t),i=0;hr?new Array(s-r+1).join(" ")+this.src.slice(c,l):this.src.slice(c,l)}return u.join("")},i.prototype.Token=n,t.exports=i},function(t,e,r){"use strict";var n=r(38),o=[["text",r(91)],["newline",r(92)],["escape",r(93)],["backticks",r(94)],["strikethrough",r(46).tokenize],["emphasis",r(47).tokenize],["link",r(95)],["image",r(96)],["autolink",r(97)],["html_inline",r(98)],["entity",r(99)]],i=[["balance_pairs",r(100)],["strikethrough",r(46).postProcess],["emphasis",r(47).postProcess],["text_collapse",r(101)]];function s(){var t;for(this.ruler=new n,t=0;t=i)break}else t.pending+=t.src[t.pos++]}t.pending&&t.pushPending()},s.prototype.parse=function(t,e,r,n){var o,i,s,a=new this.State(t,e,r,n);for(this.tokenize(a),s=(i=this.ruler2.getRules("")).length,o=0;o=0&&32===t.pending.charCodeAt(r)?r>=1&&32===t.pending.charCodeAt(r-1)?(t.pending=t.pending.replace(/ +$/,""),t.push("hardbreak","br",0)):(t.pending=t.pending.slice(0,-1),t.push("softbreak","br",0)):t.push("softbreak","br",0)),i++;i?@[]^_`{|}~-".split("").forEach((function(t){o[t.charCodeAt(0)]=1})),t.exports=function(t,e){var r,i=t.pos,s=t.posMax;if(92!==t.src.charCodeAt(i))return!1;if(++i=m)return!1;for(v=l,(u=t.md.helpers.parseLinkDestination(t.src,l,t.posMax)).ok&&(f=t.md.normalizeLink(u.str),t.md.validateLink(f)?l=u.pos:f=""),v=l;l=m||41!==t.src.charCodeAt(l))&&(g=!0),l++}if(g){if(void 0===t.env.references)return!1;if(l=0?s=t.src.slice(v,l++):l=a+1):l=a+1,s||(s=t.src.slice(c,a)),!(p=t.env.references[n(s)]))return t.pos=d,!1;f=p.href,h=p.title}return e||(t.pos=c,t.posMax=a,t.push("link_open","a",1).attrs=r=[["href",f]],h&&r.push(["title",h]),t.md.inline.tokenize(t),t.push("link_close","a",-1)),t.pos=l,t.posMax=m,!0}},function(t,e,r){"use strict";var n=r(4).normalizeReference,o=r(4).isSpace;t.exports=function(t,e){var r,i,s,a,c,l,u,p,h,f,d,m,v,g="",y=t.pos,b=t.posMax;if(33!==t.src.charCodeAt(t.pos))return!1;if(91!==t.src.charCodeAt(t.pos+1))return!1;if(l=t.pos+2,(c=t.md.helpers.parseLinkLabel(t,t.pos+1,!1))<0)return!1;if((u=c+1)=b)return!1;for(v=u,(h=t.md.helpers.parseLinkDestination(t.src,u,t.posMax)).ok&&(g=t.md.normalizeLink(h.str),t.md.validateLink(g)?u=h.pos:g=""),v=u;u=b||41!==t.src.charCodeAt(u))return t.pos=y,!1;u++}else{if(void 0===t.env.references)return!1;if(u=0?a=t.src.slice(v,u++):u=c+1):u=c+1,a||(a=t.src.slice(l,c)),!(p=t.env.references[n(a)]))return t.pos=y,!1;g=p.href,f=p.title}return e||(s=t.src.slice(l,c),t.md.inline.parse(s,t.md,t.env,m=[]),(d=t.push("image","img",0)).attrs=r=[["src",g],["alt",""]],d.children=m,d.content=s,f&&r.push(["title",f])),t.pos=u,t.posMax=b,!0}},function(t,e,r){"use strict";var n=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,o=/^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>/;t.exports=function(t,e){var r,i,s,a,c,l,u=t.pos;return 60===t.src.charCodeAt(u)&&(!((r=t.src.slice(u)).indexOf(">")<0)&&(o.test(r)?(a=(i=r.match(o))[0].slice(1,-1),c=t.md.normalizeLink(a),!!t.md.validateLink(c)&&(e||((l=t.push("link_open","a",1)).attrs=[["href",c]],l.markup="autolink",l.info="auto",(l=t.push("text","",0)).content=t.md.normalizeLinkText(a),(l=t.push("link_close","a",-1)).markup="autolink",l.info="auto"),t.pos+=i[0].length,!0)):!!n.test(r)&&(a=(s=r.match(n))[0].slice(1,-1),c=t.md.normalizeLink("mailto:"+a),!!t.md.validateLink(c)&&(e||((l=t.push("link_open","a",1)).attrs=[["href",c]],l.markup="autolink",l.info="auto",(l=t.push("text","",0)).content=t.md.normalizeLinkText(a),(l=t.push("link_close","a",-1)).markup="autolink",l.info="auto"),t.pos+=s[0].length,!0))))}},function(t,e,r){"use strict";var n=r(45).HTML_TAG_RE;t.exports=function(t,e){var r,o,i,s=t.pos;return!!t.md.options.html&&(i=t.posMax,!(60!==t.src.charCodeAt(s)||s+2>=i)&&(!(33!==(r=t.src.charCodeAt(s+1))&&63!==r&&47!==r&&!function(t){var e=32|t;return e>=97&&e<=122}(r))&&(!!(o=t.src.slice(s).match(n))&&(e||(t.push("html_inline","",0).content=t.src.slice(s,s+o[0].length)),t.pos+=o[0].length,!0))))}},function(t,e,r){"use strict";var n=r(40),o=r(4).has,i=r(4).isValidEntityCode,s=r(4).fromCodePoint,a=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,c=/^&([a-z][a-z0-9]{1,31});/i;t.exports=function(t,e){var r,l,u=t.pos,p=t.posMax;if(38!==t.src.charCodeAt(u))return!1;if(u+1s;n-=i.jump+1)if((i=e[n]).marker===o.marker&&(-1===a&&(a=n),i.open&&i.end<0&&i.level===o.level&&(c=!1,(i.close||o.open)&&(i.length+o.length)%3==0&&(i.length%3==0&&o.length%3==0||(c=!0)),!c))){l=n>0&&!e[n-1].open?e[n-1].jump+1:0,o.jump=r-n+l,o.open=!1,i.end=r,i.jump=l,i.close=!1,a=-1;break}-1!==a&&(u[o.marker][(o.length||0)%3]=a)}}t.exports=function(t){var e,r=t.tokens_meta,o=t.tokens_meta.length;for(n(0,t.delimiters),e=0;e0&&n++,"text"===o[e].type&&e+10&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],i={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(o),this.tokens_meta.push(i),o},a.prototype.scanDelims=function(t,e){var r,n,a,c,l,u,p,h,f,d=t,m=!0,v=!0,g=this.posMax,y=this.src.charCodeAt(t);for(r=t>0?this.src.charCodeAt(t-1):32;d=3&&":"===t[e-3]||e>=3&&"/"===t[e-3]?0:n.match(r.re.no_http)[0].length:0}},"mailto:":{validate:function(t,e,r){var n=t.slice(e);return r.re.mailto||(r.re.mailto=new RegExp("^"+r.re.src_email_name+"@"+r.re.src_host_strict,"i")),r.re.mailto.test(n)?n.match(r.re.mailto)[0].length:0}}},l="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф".split("|");function u(t){var e=t.re=r(104)(t.__opts__),n=t.__tlds__.slice();function a(t){return t.replace("%TLDS%",e.src_tlds)}t.onCompile(),t.__tlds_replaced__||n.push("a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]"),n.push(e.src_xn),e.src_tlds=n.join("|"),e.email_fuzzy=RegExp(a(e.tpl_email_fuzzy),"i"),e.link_fuzzy=RegExp(a(e.tpl_link_fuzzy),"i"),e.link_no_ip_fuzzy=RegExp(a(e.tpl_link_no_ip_fuzzy),"i"),e.host_fuzzy_test=RegExp(a(e.tpl_host_fuzzy_test),"i");var c=[];function l(t,e){throw new Error('(LinkifyIt) Invalid schema "'+t+'": '+e)}t.__compiled__={},Object.keys(t.__schemas__).forEach((function(e){var r=t.__schemas__[e];if(null!==r){var n={validate:null,link:null};if(t.__compiled__[e]=n,"[object Object]"===o(r))return!function(t){return"[object RegExp]"===o(t)}(r.validate)?i(r.validate)?n.validate=r.validate:l(e,r):n.validate=function(t){return function(e,r){var n=e.slice(r);return t.test(n)?n.match(t)[0].length:0}}(r.validate),void(i(r.normalize)?n.normalize=r.normalize:r.normalize?l(e,r):n.normalize=function(t,e){e.normalize(t)});!function(t){return"[object String]"===o(t)}(r)?l(e,r):c.push(e)}})),c.forEach((function(e){t.__compiled__[t.__schemas__[e]]&&(t.__compiled__[e].validate=t.__compiled__[t.__schemas__[e]].validate,t.__compiled__[e].normalize=t.__compiled__[t.__schemas__[e]].normalize)})),t.__compiled__[""]={validate:null,normalize:function(t,e){e.normalize(t)}};var u=Object.keys(t.__compiled__).filter((function(e){return e.length>0&&t.__compiled__[e]})).map(s).join("|");t.re.schema_test=RegExp("(^|(?!_)(?:[><|]|"+e.src_ZPCc+"))("+u+")","i"),t.re.schema_search=RegExp("(^|(?!_)(?:[><|]|"+e.src_ZPCc+"))("+u+")","ig"),t.re.pretest=RegExp("("+t.re.schema_test.source+")|("+t.re.host_fuzzy_test.source+")|@","i"),function(t){t.__index__=-1,t.__text_cache__=""}(t)}function p(t,e){var r=t.__index__,n=t.__last_index__,o=t.__text_cache__.slice(r,n);this.schema=t.__schema__.toLowerCase(),this.index=r+e,this.lastIndex=n+e,this.raw=o,this.text=o,this.url=o}function h(t,e){var r=new p(t,e);return t.__compiled__[r.schema].normalize(r,t),r}function f(t,e){if(!(this instanceof f))return new f(t,e);var r;e||(r=t,Object.keys(r||{}).reduce((function(t,e){return t||a.hasOwnProperty(e)}),!1)&&(e=t,t={})),this.__opts__=n({},a,e),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=n({},c,t),this.__compiled__={},this.__tlds__=l,this.__tlds_replaced__=!1,this.re={},u(this)}f.prototype.add=function(t,e){return this.__schemas__[t]=e,u(this),this},f.prototype.set=function(t){return this.__opts__=n(this.__opts__,t),this},f.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;var e,r,n,o,i,s,a,c;if(this.re.schema_test.test(t))for((a=this.re.schema_search).lastIndex=0;null!==(e=a.exec(t));)if(o=this.testSchemaAt(t,e[2],a.lastIndex)){this.__schema__=e[2],this.__index__=e.index+e[1].length,this.__last_index__=e.index+e[0].length+o;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(c=t.search(this.re.host_fuzzy_test))>=0&&(this.__index__<0||c=0&&null!==(n=t.match(this.re.email_fuzzy))&&(i=n.index+n[1].length,s=n.index+n[0].length,(this.__index__<0||ithis.__last_index__)&&(this.__schema__="mailto:",this.__index__=i,this.__last_index__=s)),this.__index__>=0},f.prototype.pretest=function(t){return this.re.pretest.test(t)},f.prototype.testSchemaAt=function(t,e,r){return this.__compiled__[e.toLowerCase()]?this.__compiled__[e.toLowerCase()].validate(t,r,this):0},f.prototype.match=function(t){var e=0,r=[];this.__index__>=0&&this.__text_cache__===t&&(r.push(h(this,e)),e=this.__last_index__);for(var n=e?t.slice(e):t;this.test(n);)r.push(h(this,e)),n=n.slice(this.__last_index__),e+=this.__last_index__;return r.length?r:null},f.prototype.tlds=function(t,e){return t=Array.isArray(t)?t:[t],e?(this.__tlds__=this.__tlds__.concat(t).sort().filter((function(t,e,r){return t!==r[e-1]})).reverse(),u(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,u(this),this)},f.prototype.normalize=function(t){t.schema||(t.url="http://"+t.url),"mailto:"!==t.schema||/^mailto:/i.test(t.url)||(t.url="mailto:"+t.url)},f.prototype.onCompile=function(){},t.exports=f},function(t,e,r){"use strict";t.exports=function(t){var e={};e.src_Any=r(42).source,e.src_Cc=r(43).source,e.src_Z=r(44).source,e.src_P=r(37).source,e.src_ZPCc=[e.src_Z,e.src_P,e.src_Cc].join("|"),e.src_ZCc=[e.src_Z,e.src_Cc].join("|");return e.src_pseudo_letter="(?:(?![><|]|"+e.src_ZPCc+")"+e.src_Any+")",e.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",e.src_auth="(?:(?:(?!"+e.src_ZCc+"|[@/\\[\\]()]).)+@)?",e.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",e.src_host_terminator="(?=$|[><|]|"+e.src_ZPCc+")(?!-|_|:\\d|\\.-|\\.(?!$|"+e.src_ZPCc+"))",e.src_path="(?:[/?#](?:(?!"+e.src_ZCc+"|[><|]|[()[\\]{}.,\"'?!\\-]).|\\[(?:(?!"+e.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+e.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+e.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+e.src_ZCc+'|["]).)+\\"|\\\'(?:(?!'+e.src_ZCc+"|[']).)+\\'|\\'(?="+e.src_pseudo_letter+"|[-]).|\\.{2,4}[a-zA-Z0-9%/]|\\.(?!"+e.src_ZCc+"|[.]).|"+(t&&t["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+"\\,(?!"+e.src_ZCc+").|\\!(?!"+e.src_ZCc+"|[!]).|\\?(?!"+e.src_ZCc+"|[?]).)+|\\/)?",e.src_email_name='[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*',e.src_xn="xn--[a-z0-9\\-]{1,59}",e.src_domain_root="(?:"+e.src_xn+"|"+e.src_pseudo_letter+"{1,63})",e.src_domain="(?:"+e.src_xn+"|(?:"+e.src_pseudo_letter+")|(?:"+e.src_pseudo_letter+"(?:-|"+e.src_pseudo_letter+"){0,61}"+e.src_pseudo_letter+"))",e.src_host="(?:(?:(?:(?:"+e.src_domain+")\\.)*"+e.src_domain+"))",e.tpl_host_fuzzy="(?:"+e.src_ip4+"|(?:(?:(?:"+e.src_domain+")\\.)+(?:%TLDS%)))",e.tpl_host_no_ip_fuzzy="(?:(?:(?:"+e.src_domain+")\\.)+(?:%TLDS%))",e.src_host_strict=e.src_host+e.src_host_terminator,e.tpl_host_fuzzy_strict=e.tpl_host_fuzzy+e.src_host_terminator,e.src_host_port_strict=e.src_host+e.src_port+e.src_host_terminator,e.tpl_host_port_fuzzy_strict=e.tpl_host_fuzzy+e.src_port+e.src_host_terminator,e.tpl_host_port_no_ip_fuzzy_strict=e.tpl_host_no_ip_fuzzy+e.src_port+e.src_host_terminator,e.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+e.src_ZPCc+"|>|$))",e.tpl_email_fuzzy='(^|[><|]|"|\\(|'+e.src_ZCc+")("+e.src_email_name+"@"+e.tpl_host_fuzzy_strict+")",e.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+e.src_ZPCc+"))((?![$+<=>^`||])"+e.tpl_host_port_fuzzy_strict+e.src_path+")",e.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+e.src_ZPCc+"))((?![$+<=>^`||])"+e.tpl_host_port_no_ip_fuzzy_strict+e.src_path+")",e}},function(t,e,r){(function(t,n){var o;/*! https://mths.be/punycode v1.4.1 by @mathias */!function(i){e&&e.nodeType,t&&t.nodeType;var s="object"==typeof n&&n;s.global!==s&&s.window!==s&&s.self;var a,c=2147483647,l=/^xn--/,u=/[^\x20-\x7E]/,p=/[\x2E\u3002\uFF0E\uFF61]/g,h={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},f=Math.floor,d=String.fromCharCode;function m(t){throw new RangeError(h[t])}function v(t,e){for(var r=t.length,n=[];r--;)n[r]=e(t[r]);return n}function g(t,e){var r=t.split("@"),n="";return r.length>1&&(n=r[0]+"@",t=r[1]),n+v((t=t.replace(p,".")).split("."),e).join(".")}function y(t){for(var e,r,n=[],o=0,i=t.length;o=55296&&e<=56319&&o65535&&(e+=d((t-=65536)>>>10&1023|55296),t=56320|1023&t),e+=d(t)})).join("")}function k(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function w(t,e,r){var n=0;for(t=r?f(t/700):t>>1,t+=f(t/e);t>455;n+=36)t=f(t/35);return f(n+36*t/(t+38))}function x(t){var e,r,n,o,i,s,a,l,u,p,h,d=[],v=t.length,g=0,y=128,k=72;for((r=t.lastIndexOf("-"))<0&&(r=0),n=0;n=128&&m("not-basic"),d.push(t.charCodeAt(n));for(o=r>0?r+1:0;o=v&&m("invalid-input"),((l=(h=t.charCodeAt(o++))-48<10?h-22:h-65<26?h-65:h-97<26?h-97:36)>=36||l>f((c-g)/s))&&m("overflow"),g+=l*s,!(l<(u=a<=k?1:a>=k+26?26:a-k));a+=36)s>f(c/(p=36-u))&&m("overflow"),s*=p;k=w(g-i,e=d.length+1,0==i),f(g/e)>c-y&&m("overflow"),y+=f(g/e),g%=e,d.splice(g++,0,y)}return b(d)}function _(t){var e,r,n,o,i,s,a,l,u,p,h,v,g,b,x,_=[];for(v=(t=y(t)).length,e=128,r=0,i=72,s=0;s=e&&hf((c-r)/(g=n+1))&&m("overflow"),r+=(a-e)*g,e=a,s=0;sc&&m("overflow"),h==e){for(l=r,u=36;!(l<(p=u<=i?1:u>=i+26?26:u-i));u+=36)x=l-p,b=36-p,_.push(d(k(p+x%b,0))),l=f(x/b);_.push(d(k(l,0))),i=w(r,g,n==o),r=0,++n}++r,++e}return _.join("")}a={version:"1.4.1",ucs2:{decode:y,encode:b},decode:x,encode:_,toASCII:function(t){return g(t,(function(t){return u.test(t)?"xn--"+_(t):t}))},toUnicode:function(t){return g(t,(function(t){return l.test(t)?x(t.slice(4).toLowerCase()):t}))}},void 0===(o=function(){return a}.call(e,r,e,t))||(t.exports=o)}()}).call(this,r(106)(t),r(107))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(t){"object"==typeof window&&(r=window)}t.exports=r},function(t,e,r){"use strict";t.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}}},function(t,e,r){"use strict";t.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["paragraph"]},inline:{rules:["text"],rules2:["balance_pairs","text_collapse"]}}}},function(t,e,r){"use strict";t.exports={options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["blockquote","code","fence","heading","hr","html_block","lheading","list","reference","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","html_inline","image","link","newline","text"],rules2:["balance_pairs","emphasis","text_collapse"]}}}},,,,,function(t,e,r){"use strict";r.r(e),r.d(e,"components",(function(){return o.d})),r.d(e,"proseMirror",(function(){return o.g})),r.d(e,"states",(function(){return o.i})),r.d(e,"InputRule",(function(){return o.a})),r.d(e,"keymap",(function(){return o.e})),r.d(e,"liftListItem",(function(){return o.f})),r.d(e,"splitListItem",(function(){return o.h})),r.d(e,"wrapInList",(function(){return o.j})),r.d(e,"Plugin",(function(){return o.b})),r.d(e,"Selection",(function(){return o.c}));var n=r(49),o=r(48);app.initializers.add("askvortsov/flarum-rich-text",(function(){Object(n.a)(),app.extensionData.for("askvortsov-rich-text").registerSetting({setting:"askvortsov-rich-text.toggle_on_editor",type:"boolean",label:app.translator.trans("askvortsov-rich-text.admin.settings.toggle_on_editor")})}))}]); //# sourceMappingURL=admin.js.map \ No newline at end of file diff --git a/js/dist/admin.js.map b/js/dist/admin.js.map index 1a62464..209c7cc 100644 --- a/js/dist/admin.js.map +++ b/js/dist/admin.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://@askvortsov/flarum-rich-text/webpack/bootstrap","webpack://@askvortsov/flarum-rich-text/./node_modules/orderedmap/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-model/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-state/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-commands/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/tiptap-commands/dist/commands.esm.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-transform/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/utils.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-inputrules/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@askvortsov/flarum-rich-text/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-markdown/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-schema-list/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Tooltip']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/CommandButton.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/extractText']\"","webpack://@askvortsov/flarum-rich-text/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@askvortsov/flarum-rich-text/./node_modules/tiptap-utils/dist/utils.esm.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/MarkButton.js","webpack://@askvortsov/flarum-rich-text/./node_modules/w3c-keyname/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-keymap/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/ItemList']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/Stream']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Button']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/helpers/icon']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Dropdown']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/SafariModalHack.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/FormDropdown.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/extend']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/ListButton.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/TextEditor']\"","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/MarkdownSerializerBuilder.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/SchemaBuilder.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/Component']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/NodeTypeDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/InsertImageDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/states/MenuState.js","webpack://@askvortsov/flarum-rich-text/./node_modules/rope-sequence/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-history/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-view/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-dropcursor/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-gapcursor/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/disableBase64PastePlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/toggleSpoiler.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/inputrules.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/ProseMirrorEditorDriver.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/placeholderPlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/menuPlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/key-bindings.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/disabledPlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/altText.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/blockSpoiler.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/inlineSpoilerBars.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/inlineSpoilerTags.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/MarkdownParserBuilder.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/HiddenItemsDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/ProseMirrorMenu.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/insertHr.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/InsertLinkDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/insertLink.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/P/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/ruler.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/token.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/entities.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/properties/Any/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/Cc/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/Z/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/html_re.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/strikethrough.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/emphasis.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/updateToggleMark.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/states/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/applyEditor.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/classList']\"","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it-sub/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it-sup/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it-latex2img/index.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Modal']\"","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/encode.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/decode.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/format.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/parse.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/Cf/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/parse_link_label.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/parse_link_destination.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/parse_link_title.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/renderer.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/parser_core.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/normalize.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/linkify.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/replacements.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/smartquotes.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/state_core.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/parser_block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/table.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/code.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/fence.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/blockquote.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/hr.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/list.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/reference.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/heading.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/lheading.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/html_block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/html_blocks.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/paragraph.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/state_block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/parser_inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/text.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/newline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/escape.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/backticks.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/link.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/image.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/autolink.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/html_inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/entity.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/balance_pairs.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/text_collapse.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/state_inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/linkify-it/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/linkify-it/lib/re.js","webpack://@askvortsov/flarum-rich-text/./node_modules/node-libs-browser/node_modules/punycode/punycode.js","webpack://@askvortsov/flarum-rich-text/(webpack)/buildin/module.js","webpack://@askvortsov/flarum-rich-text/(webpack)/buildin/global.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/presets/default.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/presets/zero.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/presets/commonmark.js","webpack://@askvortsov/flarum-rich-text/./src/admin/index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","OrderedMap","content","this","constructor","find","length","found","undefined","update","newKey","self","remove","slice","push","splice","addToStart","concat","addToEnd","addBefore","place","without","forEach","f","prepend","map","from","size","subtract","append","result","prop","Fragment","nodeSize","prototypeAccessors","firstChild","configurable","lastChild","childCount","nodesBetween","to","nodeStart","parent","pos","child","end","start","Math","max","min","descendants","textBetween","blockSeparator","leafText","text","separated","node","isText","isLeaf","isBlock","other","last","first","sameMarkup","withText","cut","cutByIndex","empty","replaceChild","index","current","copy","eq","RangeError","maybeChild","findDiffStart","a","b","childA","childB","j","inner","findDiffEnd","otherPos","posA","posB","iA","iB","same","minSize","findIndex","round","retIndex","curPos","toString","toStringInner","join","toJSON","fromJSON","schema","Array","isArray","nodeFromJSON","fromArray","array","joined","nodes","attrs","defineProperties","offset","compareDeep","p$1","Mark","type","ReplaceError","message","err","Error","__proto__","addToSet","set","placed","excludes","rank","removeFromSet","isInSet","obj","_","json","marks","sameSet","setFrom","none","sort","Slice","openStart","openEnd","prototypeAccessors$1","replace","$from","$to","depth","replaceOuter","ref","$along","extra","resolveNoCache","prepareSliceForReplace","replaceThreeWay","$start","$end","joinable","addRange","checkJoin","addNode","replaceTwoWay","parentOffset","main","sub","compatibleContent","$before","$after","target","startIndex","endIndex","textOffset","nodeAfter","nodeBefore","validContent","insertAt","fragment","insertInto","dist","insert","canReplace","removeBetween","removeRange","ref$1","indexTo","offsetTo","maxOpen","openIsolating","spec","isolating","n$1","ResolvedPos","path","prototypeAccessors$2","doc","resolveDepth","val","indexAfter","before","after","dOff","posAtIndex","tmp","inclusive","marksAcross","isInline","next","sharedDepth","blockRange","pred","inlineContent","NodeRange","sameParent","str","resolve","rem","resolveCached","resolveCache","cached","resolveCachePos","resolveCacheSize","prototypeAccessors$1$1","emptyAttrs","Node","prototypeAccessors$3","textContent","isTextblock","isAtom","startPos","hasMarkup","defaultAttrs","mark","includeParents","nodeAt","childAfter","childBefore","rangeHasMark","toDebugString","wrapMarks","contentMatchAt","match","contentMatch","matchFragment","replacement","one","two","validEnd","allowsMarks","canReplaceWith","matchType","canAppend","check","markFromJSON","nodeType","TextNode","JSON","stringify","base","ContentMatch","wrapCache","prototypeAccessors$4","defaultType","edgeCount","parse","string","nodeTypes","stream","TokenStream","expr","parseExpr","nfa","labeled","explore","states","out","term","known","indexOf","nullFrom","state","states$1","cmp","dfa","connect","compile","exprs","reduce","loop","edge","loop$1","cur","i$1","next$1","i$2","next$2","edges","work","dead","hasRequiredAttrs","checkForDeadEnds","frag","compatible","fillBefore","toEnd","seen","search","types","finished","tp","createAndFill","findWrapping","computed","computeWrapping","active","via","shift","reverse","scan","inline","tokens","split","pop","prototypeAccessors$1$2","parseExprSeq","eat","parseExprSubscript","test","typeName","type$1","groups","resolveName","parseExprAtom","parseExprRange","parseNum","Number","defaults","attrName","attr","hasDefault","default","computeAttrs","built","given","initAttrs","Attribute","tok","SyntaxError","NodeType","group","markSet","prototypeAccessors$5","atom","isRequired","createChecked","allowsMarkType","markType","allowedMarks","topType","topNode","options","prototypeAccessors$1$3","MarkType","excluded","instance","contentExprCache","prop$1","contentExpr","markExpr","gatherMarks","prop$2","excl","topNodeType","wrappings","ok","mark$1","text$1","DOMParser","rules","this$1","tags","styles","rule","tag","style","normalizeLists","some","dom","context","ParseContext","addAll","finish","parseSlice","matchTag","matches","namespace","namespaceURI","matchesContext","getAttrs","matchStyle","charCodeAt","schemaRules","priority","parseDOM","rules$1","name$1","fromSchema","domParser","blockTags","address","article","aside","blockquote","canvas","dd","div","dl","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","noscript","ol","output","pre","section","table","tfoot","ul","ignoreTags","head","script","title","listTags","wsOptionsFor","preserveWhitespace","NodeContext","pendingMarks","solid","activeMarks","stashMarks","fill","wrap","exec","popFromStashMark","applyPending","nextType","pending","markMayApply","parser","open","isOpen","topContext","topOptions","topMatch","findPositions","needsBlock","prototypeAccessors$6","top","currentPos","selector","msMatchesSelector","webkitMatchesSelector","mozMatchesSelector","v","returned","addDOM","addTextNode","getAttribute","readStyles","re","trim","parseStyles","addPendingMark","addElement","removePendingMark","nodeValue","domNodeBefore","previousSibling","nodeName","insertNode","findInText","findInside","matchAfter","ruleID","toLowerCase","prevItem","nextSibling","appendChild","normalizeList","ruleFromNode","ignore","skip","closeParent","sync","oldNeedsBlock","leafFallback","addElementByRule","consuming","ownerDocument","createTextNode","continueAfter","enter","startIn","getContent","contentDOM","contentElement","querySelector","findAround","childNodes","findAtPoint","findPlace","route","cx","enterInner","block","textblockFromContext","closeExtra","preserveWS","topOpen","contains","compareDocumentPosition","textNode","parts","option","useRoot","minDepth","part","$context","deflt","findSameMarkInSet","upto","level","lastIndexOf","stashMark","DOMSerializer","gatherToDOM","toDOM","document","window","serializeFragment","createDocumentFragment","keep","rendered","spanning","add","markDOM","serializeMark","serializeNode","renderSpec","onContent","serializeNodeAndMarks","structure","xmlNS","tagName","space","createElementNS","createElement","space$1","setAttributeNS","setAttribute","innerContent","domSerializer","nodesFromSchema","marksFromSchema","classesById","Selection","$anchor","$head","ranges","SelectionRange","anchor","tr","lastNode","lastParent","mapFrom","steps","mapping","replaceRange","selectionToInsertionEnd","replaceWith","deleteRange","replaceRangeWith","findFrom","$pos","dir","textOnly","TextSelection","findSelectionIn","near","bias","AllSelection","atStart","atEnd","cls","jsonID","id","selectionClass","getBookmark","between","visible","$cursor","ensureMarks","TextBookmark","dPos","NodeSelection","mapResult","deleted","NodeBookmark","isSelectable","selectable","delete","sel","selection","setSelection","AllBookmark","startLen","step","maps","_from","_to","_newFrom","newTo","Transaction","Transform","time","Date","now","curSelection","curSelectionFor","storedMarks","updated","meta","selectionSet","storedMarksSet","isGeneric","scrolledIntoView","setStoredMarks","addStoredMark","removeStoredMark","addStep","setTime","replaceSelection","replaceSelectionWith","inheritMarks","deleteSelection","insertText","setMeta","getMeta","scrollIntoView","FieldDesc","desc","init","apply","baseFields","config","_marks","_old","prev","Configuration","plugins","fields","pluginsByKey","plugin","EditorState","applyTransaction","filterTransaction","rootTr","transactions","trs","newState","applyInner","haveNew","appendTransaction","oldState","newInstance","field","applyListeners","$config","reconfigure","pluginFields","addApplyListener","removeApplyListener","Plugin","props","bindProps","Function","createKey","getState","keys","PluginKey","dispatch","textblockAt","side","findCutBefore","findCutAfter","newlineInCode","code","defaultBlockAt","exitCode","above","splitBlock","can","setNodeMarkup","deleteBarrier","$cut","conn","clearIncompatible","joinMaybeClear","canDelAfter","joinAt","selAfter","range","lift","at","wrap$1","end$1","wrapIn","wrapping","setBlockType","applicable","toggleMark","markApplies","has","ref$2","$from$1","$to$1","removeMark","spaceStart","spaceEnd","addMark","chainCommands","commands","len","arguments","view","backspace","endOfTextblock","del","pcBaseKeymap","macBaseKeymap","baseKeymap","navigator","platform","os","markInputRule","regexp","markEnd","markStart","matchStart","matchEnd","textStart","textEnd","getMarksBetween","filter","item","nodeInputRule","toggleBlockType","toggletype","isList","bullet_list","ordered_list","todo_list","toggleList","listType","itemType","parentList","toggleWrap","updateMark","factor16","pow","recoverIndex","MapResult","recover","StepMap","inverted","diff","recoverOffset","assoc","_map","simple","oldIndex","newIndex","oldSize","newSize","touches","oldStart","newStart","invert","Mapping","mirror","TransformError","appendMap","mirrors","setMirror","appendMapping","startSize","mirr","getMirror","appendMappingInverted","totalSize","inverse","corr","docs","docChanged","mustOverride","maybeStep","failed","getMap","stepsByID","Step","_doc","_mapping","merge","_other","stepType","stepClass","StepResult","fail","fromReplace","e","ReplaceStep","contentBetween","slice$1","ReplaceAroundStep","gapFrom","gapTo","gap","inserted","canCut","liftTarget","innerRange","around","outer","findWrappingOutside","inside","innerMatch","findWrappingInside","withAttrs","canSplit","typesAfter","innerType","index$1","rest","baseType","canJoin","joinPoint","dropPoint","pass","insertPos","mapFragment","mapped","gapStart","gapEnd","splitting","d$1","splitting$1","wrappers","canChangeType","startM","endM","newNode","typeAfter","AddMarkStep","oldSlice","RemoveMarkStep","fitsTrivially","removed","added","removing","adding","newSet","matched","toRemove","found$1","parentType","delSteps","allowed","Fitter","fit","replaceStep","unplaced","frontier","dropFromFragment","count","addToFragment","contentAt","closeNodeStart","contentAfterFits","invalidMarks","closeFragment","oldOpen","newOpen","coveredDepths","findFittable","placeNodes","openMore","dropNode","moveInline","mustMoveInline","placedSize","close","sliceDepth","frontierDepth","inject","openAtEnd","closeFrontierNode","openFrontierNode","taken","openEndCount","findCloseLevel","dropInner","match$1","move","targetDepths","preferredTarget","unshift","defining","preferredTargetIndex","leftNodes","preferredDepth","openDepth","targetDepth","expand","startSteps","point","insertPoint","covered","_hasOwnProperty","isValidEntityCode","fromCodePoint","surrogate1","surrogate2","String","fromCharCode","UNESCAPE_MD_RE","UNESCAPE_ALL_RE","RegExp","source","DIGITAL_ENTITY_TEST_RE","entities","HTML_ESCAPE_TEST_RE","HTML_ESCAPE_REPLACE_RE","HTML_REPLACEMENTS","replaceUnsafeChar","ch","REGEXP_ESCAPE_RE","UNICODE_PUNCT_RE","lib","mdurl","ucmicro","assign","sources","TypeError","isString","_class","unescapeMd","unescapeAll","escaped","entity","parseInt","replaceEntityPattern","escapeHtml","arrayReplaceAt","src","newElements","isSpace","isWhiteSpace","isMdAsciiPunct","isPunctChar","escapeRE","normalizeReference","toUpperCase","InputRule","handler","cutOff","inputRules","stored","handleTextInput","run","handleDOMEvents","compositionend","setTimeout","isInputRules","composing","textBefore","transform","undoInputRule","undoable","toUndo","ellipsis","wrappingInputRule","joinPredicate","textblockTypeInputRule","_setPrototypeOf","setPrototypeOf","_inheritsLoose","subClass","superClass","paragraph","horizontal_rule","heading","code_block","params","order","tight","hasAttribute","list_item","image","alt","draggable","hard_break","em","strong","link","href","MarkdownParseState","tokenHandlers","stack","token","noCloseToken","withoutTrailingNewline","noOp","elt","addText","merged","maybeMerge","openMark","closeMark","parseTokens","toks","openNode","closeNode","info","MarkdownParser","tokenizer","handlers","nodeType$1","children","softbreak","listIsTight","hidden","defaultMarkdownParser","html","attrGet","fence","hardbreak","code_inline","MarkdownSerializer","serialize","MarkdownSerializerState","renderContent","defaultMarkdownSerializer","wrapBlock","write","ensureNewLine","closeBlock","repeat","renderInline","markup","renderList","bullet","maxW","nStr","esc","quote","mixable","expelEnclosingWhitespace","_state","isPlainURL","_mark","backticksFor","escape","ticks","delim","closed","inTightList","tightLists","flushClose","atBlank","delimMin","firstDelim","old","lines","startOfLine","render","trailing","progress","leading","lead","inner$1","trail","noEsc","markString","isTight","prevTight","getEnclosingWhitespace","wrapInList","doJoin","outerRange","$insert","joinBefore","splitDepth","splitPos","doWrapInList","splitListItem","grandParent","keepItem","tr$1","liftListItem","endOfList","liftToOuterList","list","indexBefore","liftOutOfList","sinkListItem","nestedBefore","flarum","core","compat","CommandButton","oninit","vnode","addItem","command","onEditorUpdate","extractText","tooltip","className","onclick","click","onkeydown","keydown","icon","preventDefault","app","translator","trans","Component","_extends","findParentNode","predicate","findParentNodeClosestToPos","findSelectedNodeOfType","isNodeSelection","equalNodeType","getMarkAttrs","markItem","getMarkRange","endPos","markIsActive","nodeIsActive","MarkButton","$","toggleClass","markActive","8","9","10","12","13","16","17","18","20","27","32","33","34","35","36","37","38","39","40","44","45","46","59","61","91","92","106","107","108","109","110","111","144","145","160","161","162","163","164","165","173","186","187","188","189","190","191","192","219","220","221","222","229","48","49","50","51","52","53","54","55","56","57","chrome","userAgent","safari","vendor","gecko","mac","ie","brokenModifierNames","normalizeKeyName","ctrl","mod","modifiers","event","altKey","ctrlKey","metaKey","shiftKey","keymap","bindings","handleKeyDown","keydownHandler","normalize","baseName","keyCode","keyName","isChar","direct","fromCode","withShift","SafariModalHack","oncreate","on","modal","onsubmit","vnodeContent","Modal","FormDropdown","buttonClassName","is","show","toArray","stopPropagation","focus","select","getButtonContent","getMenu","items","ItemList","trigger","composer","editor","Dropdown","ListButton","nodeActive","genMarkupAwareMarkConfig","error","MarkdownSerializerBuilder","buildNodes","spoiler","math_block","buildMarks","spoiler_inline","strike","sup","math_inline","build","genHtmlInlineMarkSpec","spoilerNodeSpec","class","mathBlockNodeSpec","SchemaBuilder","Schema","NodeTypeDropdown","getNodeTypeButtons","getButton","data-toggle","activeIndex","element","innerText","InsertImageDropdown","Stream","placeholder","bidi","required","MenuState","attachEditorView","editorView","getSchema","destroy","markAttrs","selectionEmpty","transaction","RopeSequence","leafAppend","leafPrepend","appendInner","Append","sliceInner","getInner","forEachInner","forEachInvertedInner","values","Leaf","flatten","left","right","leftLen","Branch","eventCount","popEvent","preserveItems","remap","remapping","remaining","addAfter","Item","addTransform","histOptions","newItems","oldItems","lastItem","cutPoint","overflow","DEPTH_OVERFLOW","mirrorPos","mirrorOffset","addMaps","rebased","rebasedTransform","rebasedCount","rebasedItems","newUntil","iRebased","newMaps","branch","emptyItemCount","compress","events","newItem","HistoryState","done","undone","prevRanges","prevTime","rangesFor","mapRanges","histTransaction","history","redo","mustPreserveItems","historyKey","newHist","historyState","cachedPreserveItems","cachedPreserveItemsPlugins","historyPreserveItems","closeHistoryKey","newGroupDelay","hist","historyTr","appended","newGroup","adjacent","isAdjacentTo","undo","ie_edge","ie_upto10","ie_11up","ie_version","documentMode","gecko_version","chrome_version","ios","maxTouchPoints","android","webkit","documentElement","webkit_version","domIndex","parentNode","host","reusedRange","textRange","createRange","setEnd","setStart","isEquivalentPosition","off","targetNode","targetOff","scanFor","atomElements","hasBlockDesc","contentEditable","pmViewDesc","selectionCollapsed","domSel","collapsed","isCollapsed","rangeCount","getRangeAt","keyEvent","createEvent","initEvent","windowRect","clientWidth","bottom","clientHeight","getSide","clientRect","rect","getBoundingClientRect","scrollRectIntoView","startDOM","scrollThreshold","someProp","scrollMargin","atTop","body","bounding","moveX","moveY","defaultView","scrollBy","startX","scrollLeft","startY","scrollTop","dX","dY","scrollStack","restoreScrollStack","dTop","preventScrollSupported","findOffsetInNode","coords","closest","coordsClosest","dxClosest","rowBot","rowTop","childIndex","rects","getClientRects","dx","singleRect","inRect","findOffsetInText","posAtCoords","assign$1","root","caretPositionFromPoint","pos$1","offsetNode","caretRangeFromPoint","startContainer","startOffset","elementFromPoint","box","startI","floor","targetKludge","box$1","outside","docView","nearestDesc","posBefore","posAfter","posFromDOM","posFromCaret","posFromElement","posAtStart","border","BIDI","coordsAtPos","domFromPos","supportEmptyRange","takeSide","flattenV","rectBefore","rectAfter","flattenH","before$1","after$1","target$1","width","x","height","y","withFlushedState","viewState","activeElement","updateState","maybeRTL","cachedState","cachedDir","cachedResult","nearest","boxes","endOfTextblockVertical","getSelection","modify","oldRange","oldNode","focusNode","oldOff","focusOffset","oldBidiLevel","caretBidiLevel","domAfterPos","removeAllRanges","endOfTextblockHorizontal","dirty","beforePosition","posAtEnd","contentLost","domAtom","matchesWidget","matchesMark","matchesNode","matchesHack","parseRule","stopEvent","posBeforeChild","localPosFromDOM","domBefore","domAfter","desc$1","search$1","onlyNodes","getDesc","nodeDOM","descAt","parseRange","fromOffset","toOffset","childBase","emptyChildAt","j$1","force","anchorDOM","headDOM","brKludge","offset$1","anchorNode","anchorOffset","domSelExtended","extend","collapse","DOMException","ignoreMutation","mutation","markDirty","startInside","endInside","markParentsDirty","nothing","WidgetViewDesc","ViewDesc","widget","raw","classList","stop","ignoreSelection","CompositionViewDesc","textDOM","mut","oldValue","MarkViewDesc","custom","nodeViews","replaceNodes","NodeViewDesc","outerDeco","innerDeco","updateChildren","descObj","applyOuterDeco","CustomNodeViewDesc","TextViewDesc","reparseInView","sameOuterDeco","composition","localCompositionNode","updater","ViewTreeUpdater","deco","onWidget","onNode","locals","forChild","decoIndex","restNode","parentIndex","widgets","compareSide","child$1","cutAt","i$3","iterDeco","insideNode","syncToMarks","placeWidget","findNodeMatch","updateNextNode","addTextblockHacks","destroyRest","changed","protectLocalComposition","renderDescs","parentDOM","descs","written","childDOM","rm","insertBefore","trackWrites","oldCSS","cssText","getComputedStyle","listStyle","iosHacks","nearbyTextNode","textPos","childStart","findTextInFragment","removeChild","compositionNodes","updateInner","updateOuterDeco","needsWrap","oldDOM","patchOuterDeco","computeOuterDeco","selectNode","deselectNode","removeAttribute","docViewDesc","pmIsDeco","inParent","BRHackViewDesc","OuterDecoLevel","noDeco","outerDOM","prevComputed","curComputed","curDOM","patchAttributes","prevList","curList","removeProperty","lockedNode","lock","preMatch","preMatched","preMatchOffset","selectionFromDOM","origin","inWidget","isOnEdge","selectionBetween","selectionToDOM","syncNodeSelection","editable","hasFocus","hasSelection","domObserver","disconnectSelection","cursorWrapper","img","disabled","selectCursorWrapper","resetEditableFrom","resetEditableTo","brokenSelectBetweenUneditable","temporarilyEditableNear","resetEditable","removeEventListener","hideSelectionGuard","addEventListener","removeClassOnSelectionChange","setCurSelection","connectSelection","getPreMatch","destroyBetween","maxKeep","markDesc","nextDOM","setEditable","wasDraggable","lastSelectedViewDesc","clearNodeSelection","moveSelectionBlock","$side","selectHorizontally","mods","nodePos","nodeLen","isIgnorable","skipIgnoredNodesLeft","moveNode","moveOffset","isBlockNode","setSelFocus","skipIgnoredNodesRight","selectVertically","beyond","stopNativeHorizontalDelete","nextNode","switchEditable","captureKeyDown","getMods","safariDownArrowBug","readDOMChange","typeOver","addedNodes","lastSelectionTime","lastSelectionOrigin","newSel","shared","from_","to_","lastKeyCode","startDoc","editableContent","anchor$1","parseBetween","preferredPos","preferredSide","compare","lastKeyCodeTime","change","endA","endB","adjust","findDiff","lastIOSEnter","sel$1","resolveSelection","domChangeCount","nextSel","inlineChange","$newStart","$newEnd","skipClosingAndOpening","$next","looksLikeJoin","suppressSelectionUpdates","markChange","$from1","chFrom","chTo","curMarks","prevMarks","isMarkChange","sel$2","parsedSel","fromEnd","mayOpen","serializeForClipboard","serializer","detachedDoc","wrapMap","wrapper","parseFromClipboard","plainText","inCode","asText","parsed","metas","firstTag","innerHTML","readHTML","contextNode","sliceData","addContext","closeRange","closeSlice","lastWrap","inLast","addToSibling","sibling","withWrappers","closeRight","wrapped","normalizeSiblings","thead","tbody","caption","colgroup","col","td","th","_detachedDoc","implementation","createHTMLDocument","observeOptions","childList","characterData","characterDataOldValue","attributes","attributeOldValue","subtree","useCharData","SelectionState","DOMObserver","handleDOMChange","queue","flushingSoon","observer","MutationObserver","mutations","removedNodes","flushSoon","flush","currentSelection","onCharData","prevValue","onSelectionChange","suppressingSelectionUpdates","forceFlush","clearTimeout","observe","take","takeRecords","disconnect","ignoreSelectionChange","container","commonAncestorContainer","result$1","registerMutation","brs","cssChecked","whiteSpace","console","checkCSS","attributeName","editHandlers","setSelectionOrigin","ensureListeners","currentHandlers","eventHandlers","runCustomHandler","defaultPrevented","eventCoords","clientX","clientY","runHandlerOnContext","propName","updateSelection","focused","handleSingleClick","selectedNode","selectAt","selectClickedNode","selectClickedLeaf","handleDoubleClick","handleTripleClick","defaultTripleClick","forceDOMFlush","endComposition","inOrNearComposition","lastIOSEnterFallbackTimeout","keyup","keypress","charCode","selectNodeModifier","mousedown","flushed","lastClick","dy","isNear","mouseDown","targetPos","allowDefault","mightDrag","targetDesc","addAttr","setUneditable","up","abs","timeStamp","compositionEndedAt","touchdown","contextmenu","timeoutComposition","scheduleComposeEnd","delay","composingTimeout","clearComposition","forceUpdate","compositionstart","compositionupdate","markCursor","brokenClipboardAPI","doPaste","singleNode","sliceSingleNode","data","clipboardData","clearData","setData","selectNodeContents","blur","captureCopy","paste","getData","capturePaste","Dragging","dragCopyModifier","dragstart","dataTransfer","dragging","dragend","dragover","dragenter","drop","eventPos","$mouse","isNode","beforeInsert","beforeinput","inputType","compareObjs","WidgetType","noSpec","span","oldOffset","Decoration","valid","InlineType","inclusiveStart","inclusiveEnd","DecorationSet","local","decorations","buildTree","findInner","childOff","mapInner","newLocal","onRemove","oldChildren","oldEnd","newEnd","dSize","mustRebuild","fromLocal","toLocal","childOffset","childNode","gather","mapAndGatherRemainingDecorations","from$1","byPos","mapChildren","addInner","baseOffset","takeSpansForNode","moveSpans","withoutNulls","removeInner","span$1","dec","localSet","DecorationGroup","removeOverlap","localsInner","members","spans","hasNulls","localStart","working","insertAhead","viewDecorations","sorted","EditorView","_props","_root","mount","mounted","getEditable","updateCursorWrapper","buildNodeViews","computeDocDeco","bubbles","eventBelongsToView","initInput","pluginViews","updatePluginViews","contenteditable","updateStateInner","setProps","reconfigured","redraw","updateSel","nA","nB","changedNodeViews","scroll","scrollToSelection","updateDoc","sel1","sel2","refDOM","refTop","newRefTop","oldScrollPos","overflowAnchor","innerHeight","localRect","storeScrollPos","forceSelUpdate","chromeKludge","destroyPluginViews","prevState","pluginView","setActive","preventScroll","focusPreventScroll","getPrototypeOf","domAtPos","posAtDOM","destroyInput","dispatchEvent","dispatchTransaction","DropCursorView","color","cursorPos","timeout","updateOverlay","setCursor","nodeRect","parentLeft","parentTop","offsetParent","position","pageXOffset","pageYOffset","rect$1","scheduleRemoval","dragleave","relatedTarget","GapCursor","GapBookmark","closedBefore","closedAfter","override","allowGapCursor","mustMove","$cur","$cur$1","arrow","axis","dirStr","$found","handleClick","drawGapCursor","dataImageRegex","onClick","orderedListRule","bulletListRule","codeBlockRule","headingRule","maxLevel","blockSpoilerRule","ProseMirrorEditorDriver","MarkdownParserBuilder","buildEditorStateConfig","buildEditorProps","classNames","callInputListeners","inputListeners","listener","oninput","onkeyup","parseInitialValue","buildPluginItems","menuState","buildInputRules","Escape","insertHardBreak","enterCommands","emojiDropdown","mentionsDropdown","session","user","preferences","richTextCompactParagraphs","handleEnter","Backspace","Enter","richTextKeymap","disabled$","curr","transformPastedHTML","parseFromString","querySelectorAll","outerHTML","createSelectionBetween","_view","handleClickOn","handleDoubleClickOn","newDoc","newDocPlaintext","serializeContent","moveCursorTo","setSelectionRange","getSelectionRange","getLastNChars","insertAtCursor","insertBetween","trailingNewLines","endsWith","replaceBeforeCursor","getCaretCoordinates","viewportCoords","editorViewportOffset","isTerminatorChar","tokenize","silent","posMax","md","ruler","disable","blockquoteExt","startLine","endLine","adjustTab","initial","lastLineEmpty","nextLine","oldBMarks","oldBSCount","oldIndent","oldParentType","oldSCount","oldTShift","spaceAfterMarker","terminate","terminatorRules","wasOutdented","oldLineMax","lineMax","bMarks","tShift","eMarks","sCount","blkIndent","followingCharRegex","bsCount","foundExclamation","foundOpen","oldPos","getRules","line","spoilerFn","blockquoteFn","blockSpoiler","__rules__","bqIndex","postProcess","delimiters","loneMarkers","startDelim","marker","endDelim","tokenO","nesting","tokenC","frontPriorMode","scanned","scanDelims","isOdd","jump","can_open","can_close","ruler2","tokens_meta","tokenizerParams","buildTokenizer","markdownit","enable","use","altText","latexPlugin","subPlugin","supPlugin","inlineSpoilerBars","inlineSpoilerTags","buildTokens","HiddenItemsDropdown","buttons","button","ProseMirrorMenu","modifierKey","component","InsertLinkDropdown","hiddenItems","linkAttrs","Ruler","__cache__","__find__","__compile__","chains","enabled","altName","chain","fn","opt","beforeName","ruleName","afterName","ignoreInvalid","idx","enableOnly","chainName","Token","attrIndex","attrPush","attrData","attrSet","attrJoin","encode","decode","format","open_tag","close_tag","HTML_TAG_RE","HTML_OPEN_CLOSE_TAG_RE","isStrong","components","updateToggleMark","proseMirror","markdown","applyEditor","TextEditor","forum","attribute","Button","useRichTextEditor","savePreferences","then","buildEditor","original","buildEditorParams","UNESCAPE_RE","subscript","skipToken","superscript","isValidDelim","prevChar","nextChar","res","firstLine","lastLine","lastPos","getLines","server","purifiedURL","latex","encodeURIComponent","renderer","Inline","Block","utils","helpers","Renderer","ParserCore","ParserBlock","ParserInline","LinkifyIt","punycode","zero","commonmark","BAD_PROTO_RE","GOOD_DATA_RE","validateLink","url","RECODE_HOSTNAME_FOR","normalizeLink","hostname","protocol","toASCII","er","normalizeLinkText","toUnicode","MarkdownIt","presetName","linkify","configure","presets","rules2","missed","args","env","State","process","parseInline","inlineMode","encodeCache","exclude","keepEscaped","nextCode","cache","defaultChars","getEncodeCache","componentChars","decodeCache","getDecodeCache","seq","b1","b2","b3","b4","chr","slashes","auth","port","pathname","hash","Url","protocolPattern","portPattern","simplePathPattern","unwise","autoEscape","nonHostChars","hostEndingChars","hostnamePartPattern","hostnamePartStart","hostlessProtocol","slashedProtocol","slashesDenoteHost","lowerProto","hec","simplePath","proto","substr","atSign","hostEnd","parseHost","ipv6Hostname","hostparts","newpart","k","validParts","notHost","bit","qm","u","Any","Cc","Cf","P","Z","parseLinkLabel","parseLinkDestination","parseLinkTitle","disableNested","prevPos","labelEnd","default_rules","slf","renderAttrs","highlighted","tmpAttrs","tmpToken","langName","highlight","langPrefix","renderInlineAsText","renderToken","xhtmlOut","breaks","html_block","html_inline","nextToken","needLf","_rules","Core","NEWLINES_RE","NULL_RE","isLinkClose","currentToken","ln","htmlLinkLevel","fullUrl","urlText","links","blockTokens","pretest","lastIndex","RARE_RE","SCOPED_ABBR_TEST_RE","SCOPED_ABBR_RE","SCOPED_ABBR","tm","replaceFn","replace_scoped","inlineTokens","inside_autolink","replace_rare","blkIdx","typographer","QUOTE_TEST_RE","QUOTE_RE","replaceAt","process_inlines","thisLevel","lastChar","isLastPunctChar","isNextPunctChar","isLastWhiteSpace","isNextWhiteSpace","canOpen","canClose","isSingle","openQuote","closeQuote","OUTER","single","quotes","StateCore","hasEmptyLines","maxNesting","skipEmptyLines","isEmpty","outTokens","getLine","escapedSplit","escapes","backTicked","lastBackTick","substring","lineText","columns","columnCount","aligns","tableLines","tbodyLines","mem","haveEndMarker","skipChars","skipSpaces","cnt","skipBulletListMarker","skipOrderedListMarker","contentStart","indent","indentAfterMarker","isOrdered","itemLines","listLines","listTokIdx","markerCharCode","markerValue","oldListIndent","oldTight","posAfterMarker","prevEmptyEnd","isTerminatingParagraph","listIndent","markTightParagraphs","_endLine","destEndPos","destEndLineNo","label","references","skipSpacesBack","skipCharsBack","block_names","HTML_SEQUENCES","StateBlock","indent_found","ddIndent","begin","keepLastLF","lineIndent","lineStart","_rules2","pushPending","pmax","ESCAPED","labelStart","parseReference","EMAIL_RE","AUTOLINK_RE","tail","linkMatch","emailMatch","lc","isLetter","DIGITAL_RE","NAMED_RE","processDelimiters","closerIdx","openerIdx","closer","opener","minOpenerIdx","newMinOpenerIdx","isOddMatch","lastJump","openersBottom","StateInline","pendingLevel","_prev_delimiters","token_meta","canSplitWord","left_flanking","right_flanking","isFunction","defaultOptions","fuzzyLink","fuzzyEmail","fuzzyIP","defaultSchemas","validate","http","src_auth","src_host_port_strict","src_path","no_http","src_domain","src_domain_root","src_port","src_host_terminator","mailto","src_email_name","src_host_strict","tlds_default","__opts__","tlds","__tlds__","untpl","tpl","src_tlds","onCompile","__tlds_replaced__","src_xn","email_fuzzy","tpl_email_fuzzy","link_fuzzy","tpl_link_fuzzy","link_no_ip_fuzzy","tpl_link_no_ip_fuzzy","host_fuzzy_test","tpl_host_fuzzy_test","aliases","schemaError","__compiled__","__schemas__","compiled","isRegExp","createValidator","alias","slist","schema_test","src_ZPCc","schema_search","__index__","__text_cache__","resetScanCache","Match","__last_index__","__schema__","createMatch","schemas","acc","definition","ml","me","tld_pos","testSchemaAt","keepOld","el","arr","opts","src_Any","src_Cc","src_Z","src_P","src_ZCc","src_pseudo_letter","src_ip4","src_host","tpl_host_fuzzy","tpl_host_no_ip_fuzzy","tpl_host_fuzzy_strict","tpl_host_port_fuzzy_strict","tpl_host_port_no_ip_fuzzy_strict","freeGlobal","global","maxInt","regexPunycode","regexNonASCII","regexSeparators","errors","stringFromCharCode","mapDomain","ucs2decode","counter","ucs2encode","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","baseMinusTMin","input","basic","oldi","w","baseMinusT","codePoint","inputLength","handledCPCount","basicLength","q","currentValue","handledCPCountPlusOne","qMinusT","webpackPolyfill","deprecate","paths","g","initializers","extensionData","registerSetting","setting"],"mappings":"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","file":"admin.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 115);\n","// ::- Persistent data structure representing an ordered mapping from\n// strings to values, with some convenient update methods.\nfunction OrderedMap(content) {\n this.content = content;\n}\n\nOrderedMap.prototype = {\n constructor: OrderedMap,\n\n find: function(key) {\n for (var i = 0; i < this.content.length; i += 2)\n if (this.content[i] === key) return i\n return -1\n },\n\n // :: (string) → ?any\n // Retrieve the value stored under `key`, or return undefined when\n // no such key exists.\n get: function(key) {\n var found = this.find(key);\n return found == -1 ? undefined : this.content[found + 1]\n },\n\n // :: (string, any, ?string) → OrderedMap\n // Create a new map by replacing the value of `key` with a new\n // value, or adding a binding to the end of the map. If `newKey` is\n // given, the key of the binding will be replaced with that key.\n update: function(key, value, newKey) {\n var self = newKey && newKey != key ? this.remove(newKey) : this;\n var found = self.find(key), content = self.content.slice();\n if (found == -1) {\n content.push(newKey || key, value);\n } else {\n content[found + 1] = value;\n if (newKey) content[found] = newKey;\n }\n return new OrderedMap(content)\n },\n\n // :: (string) → OrderedMap\n // Return a map with the given key removed, if it existed.\n remove: function(key) {\n var found = this.find(key);\n if (found == -1) return this\n var content = this.content.slice();\n content.splice(found, 2);\n return new OrderedMap(content)\n },\n\n // :: (string, any) → OrderedMap\n // Add a new key to the start of the map.\n addToStart: function(key, value) {\n return new OrderedMap([key, value].concat(this.remove(key).content))\n },\n\n // :: (string, any) → OrderedMap\n // Add a new key to the end of the map.\n addToEnd: function(key, value) {\n var content = this.remove(key).content.slice();\n content.push(key, value);\n return new OrderedMap(content)\n },\n\n // :: (string, string, any) → OrderedMap\n // Add a key after the given key. If `place` is not found, the new\n // key is added to the end.\n addBefore: function(place, key, value) {\n var without = this.remove(key), content = without.content.slice();\n var found = without.find(place);\n content.splice(found == -1 ? content.length : found, 0, key, value);\n return new OrderedMap(content)\n },\n\n // :: ((key: string, value: any))\n // Call the given function for each key/value pair in the map, in\n // order.\n forEach: function(f) {\n for (var i = 0; i < this.content.length; i += 2)\n f(this.content[i], this.content[i + 1]);\n },\n\n // :: (union) → OrderedMap\n // Create a new map by prepending the keys in this map that don't\n // appear in `map` before the keys in `map`.\n prepend: function(map) {\n map = OrderedMap.from(map);\n if (!map.size) return this\n return new OrderedMap(map.content.concat(this.subtract(map).content))\n },\n\n // :: (union) → OrderedMap\n // Create a new map by appending the keys in this map that don't\n // appear in `map` after the keys in `map`.\n append: function(map) {\n map = OrderedMap.from(map);\n if (!map.size) return this\n return new OrderedMap(this.subtract(map).content.concat(map.content))\n },\n\n // :: (union) → OrderedMap\n // Create a map containing all the keys in this map that don't\n // appear in `map`.\n subtract: function(map) {\n var result = this;\n map = OrderedMap.from(map);\n for (var i = 0; i < map.content.length; i += 2)\n result = result.remove(map.content[i]);\n return result\n },\n\n // :: number\n // The amount of keys in this map.\n get size() {\n return this.content.length >> 1\n }\n};\n\n// :: (?union) → OrderedMap\n// Return a map with the given content. If null, create an empty\n// map. If given an ordered map, return that map itself. If given an\n// object, create a map from the object's properties.\nOrderedMap.from = function(value) {\n if (value instanceof OrderedMap) return value\n var content = [];\n if (value) for (var prop in value) content.push(prop, value[prop]);\n return new OrderedMap(content)\n};\n\nvar orderedmap = OrderedMap;\n\nexport default orderedmap;\n","import OrderedMap from 'orderedmap';\n\nfunction findDiffStart(a, b, pos) {\n for (var i = 0;; i++) {\n if (i == a.childCount || i == b.childCount)\n { return a.childCount == b.childCount ? null : pos }\n\n var childA = a.child(i), childB = b.child(i);\n if (childA == childB) { pos += childA.nodeSize; continue }\n\n if (!childA.sameMarkup(childB)) { return pos }\n\n if (childA.isText && childA.text != childB.text) {\n for (var j = 0; childA.text[j] == childB.text[j]; j++)\n { pos++; }\n return pos\n }\n if (childA.content.size || childB.content.size) {\n var inner = findDiffStart(childA.content, childB.content, pos + 1);\n if (inner != null) { return inner }\n }\n pos += childA.nodeSize;\n }\n}\n\nfunction findDiffEnd(a, b, posA, posB) {\n for (var iA = a.childCount, iB = b.childCount;;) {\n if (iA == 0 || iB == 0)\n { return iA == iB ? null : {a: posA, b: posB} }\n\n var childA = a.child(--iA), childB = b.child(--iB), size = childA.nodeSize;\n if (childA == childB) {\n posA -= size; posB -= size;\n continue\n }\n\n if (!childA.sameMarkup(childB)) { return {a: posA, b: posB} }\n\n if (childA.isText && childA.text != childB.text) {\n var same = 0, minSize = Math.min(childA.text.length, childB.text.length);\n while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) {\n same++; posA--; posB--;\n }\n return {a: posA, b: posB}\n }\n if (childA.content.size || childB.content.size) {\n var inner = findDiffEnd(childA.content, childB.content, posA - 1, posB - 1);\n if (inner) { return inner }\n }\n posA -= size; posB -= size;\n }\n}\n\n// ::- A fragment represents a node's collection of child nodes.\n//\n// Like nodes, fragments are persistent data structures, and you\n// should not mutate them or their content. Rather, you create new\n// instances whenever needed. The API tries to make this easy.\nvar Fragment = function Fragment(content, size) {\n this.content = content;\n // :: number\n // The size of the fragment, which is the total of the size of its\n // content nodes.\n this.size = size || 0;\n if (size == null) { for (var i = 0; i < content.length; i++)\n { this.size += content[i].nodeSize; } }\n};\n\nvar prototypeAccessors = { firstChild: { configurable: true },lastChild: { configurable: true },childCount: { configurable: true } };\n\n// :: (number, number, (node: Node, start: number, parent: Node, index: number) → ?bool, ?number)\n// Invoke a callback for all descendant nodes between the given two\n// positions (relative to start of this fragment). Doesn't descend\n// into a node when the callback returns `false`.\nFragment.prototype.nodesBetween = function nodesBetween (from, to, f, nodeStart, parent) {\n if ( nodeStart === void 0 ) nodeStart = 0;\n\n for (var i = 0, pos = 0; pos < to; i++) {\n var child = this.content[i], end = pos + child.nodeSize;\n if (end > from && f(child, nodeStart + pos, parent, i) !== false && child.content.size) {\n var start = pos + 1;\n child.nodesBetween(Math.max(0, from - start),\n Math.min(child.content.size, to - start),\n f, nodeStart + start);\n }\n pos = end;\n }\n};\n\n// :: ((node: Node, pos: number, parent: Node) → ?bool)\n// Call the given callback for every descendant node. The callback\n// may return `false` to prevent traversal of a given node's children.\nFragment.prototype.descendants = function descendants (f) {\n this.nodesBetween(0, this.size, f);\n};\n\n// : (number, number, ?string, ?string) → string\nFragment.prototype.textBetween = function textBetween (from, to, blockSeparator, leafText) {\n var text = \"\", separated = true;\n this.nodesBetween(from, to, function (node, pos) {\n if (node.isText) {\n text += node.text.slice(Math.max(from, pos) - pos, to - pos);\n separated = !blockSeparator;\n } else if (node.isLeaf && leafText) {\n text += leafText;\n separated = !blockSeparator;\n } else if (!separated && node.isBlock) {\n text += blockSeparator;\n separated = true;\n }\n }, 0);\n return text\n};\n\n// :: (Fragment) → Fragment\n// Create a new fragment containing the combined content of this\n// fragment and the other.\nFragment.prototype.append = function append (other) {\n if (!other.size) { return this }\n if (!this.size) { return other }\n var last = this.lastChild, first = other.firstChild, content = this.content.slice(), i = 0;\n if (last.isText && last.sameMarkup(first)) {\n content[content.length - 1] = last.withText(last.text + first.text);\n i = 1;\n }\n for (; i < other.content.length; i++) { content.push(other.content[i]); }\n return new Fragment(content, this.size + other.size)\n};\n\n// :: (number, ?number) → Fragment\n// Cut out the sub-fragment between the two given positions.\nFragment.prototype.cut = function cut (from, to) {\n if (to == null) { to = this.size; }\n if (from == 0 && to == this.size) { return this }\n var result = [], size = 0;\n if (to > from) { for (var i = 0, pos = 0; pos < to; i++) {\n var child = this.content[i], end = pos + child.nodeSize;\n if (end > from) {\n if (pos < from || end > to) {\n if (child.isText)\n { child = child.cut(Math.max(0, from - pos), Math.min(child.text.length, to - pos)); }\n else\n { child = child.cut(Math.max(0, from - pos - 1), Math.min(child.content.size, to - pos - 1)); }\n }\n result.push(child);\n size += child.nodeSize;\n }\n pos = end;\n } }\n return new Fragment(result, size)\n};\n\nFragment.prototype.cutByIndex = function cutByIndex (from, to) {\n if (from == to) { return Fragment.empty }\n if (from == 0 && to == this.content.length) { return this }\n return new Fragment(this.content.slice(from, to))\n};\n\n// :: (number, Node) → Fragment\n// Create a new fragment in which the node at the given index is\n// replaced by the given node.\nFragment.prototype.replaceChild = function replaceChild (index, node) {\n var current = this.content[index];\n if (current == node) { return this }\n var copy = this.content.slice();\n var size = this.size + node.nodeSize - current.nodeSize;\n copy[index] = node;\n return new Fragment(copy, size)\n};\n\n// : (Node) → Fragment\n// Create a new fragment by prepending the given node to this\n// fragment.\nFragment.prototype.addToStart = function addToStart (node) {\n return new Fragment([node].concat(this.content), this.size + node.nodeSize)\n};\n\n// : (Node) → Fragment\n// Create a new fragment by appending the given node to this\n// fragment.\nFragment.prototype.addToEnd = function addToEnd (node) {\n return new Fragment(this.content.concat(node), this.size + node.nodeSize)\n};\n\n// :: (Fragment) → bool\n// Compare this fragment to another one.\nFragment.prototype.eq = function eq (other) {\n if (this.content.length != other.content.length) { return false }\n for (var i = 0; i < this.content.length; i++)\n { if (!this.content[i].eq(other.content[i])) { return false } }\n return true\n};\n\n// :: ?Node\n// The first child of the fragment, or `null` if it is empty.\nprototypeAccessors.firstChild.get = function () { return this.content.length ? this.content[0] : null };\n\n// :: ?Node\n// The last child of the fragment, or `null` if it is empty.\nprototypeAccessors.lastChild.get = function () { return this.content.length ? this.content[this.content.length - 1] : null };\n\n// :: number\n// The number of child nodes in this fragment.\nprototypeAccessors.childCount.get = function () { return this.content.length };\n\n// :: (number) → Node\n// Get the child node at the given index. Raise an error when the\n// index is out of range.\nFragment.prototype.child = function child (index) {\n var found = this.content[index];\n if (!found) { throw new RangeError(\"Index \" + index + \" out of range for \" + this) }\n return found\n};\n\n// :: (number) → ?Node\n// Get the child node at the given index, if it exists.\nFragment.prototype.maybeChild = function maybeChild (index) {\n return this.content[index]\n};\n\n// :: ((node: Node, offset: number, index: number))\n// Call `f` for every child node, passing the node, its offset\n// into this parent node, and its index.\nFragment.prototype.forEach = function forEach (f) {\n for (var i = 0, p = 0; i < this.content.length; i++) {\n var child = this.content[i];\n f(child, p, i);\n p += child.nodeSize;\n }\n};\n\n// :: (Fragment) → ?number\n// Find the first position at which this fragment and another\n// fragment differ, or `null` if they are the same.\nFragment.prototype.findDiffStart = function findDiffStart$1 (other, pos) {\n if ( pos === void 0 ) pos = 0;\n\n return findDiffStart(this, other, pos)\n};\n\n// :: (Fragment) → ?{a: number, b: number}\n// Find the first position, searching from the end, at which this\n// fragment and the given fragment differ, or `null` if they are the\n// same. Since this position will not be the same in both nodes, an\n// object with two separate positions is returned.\nFragment.prototype.findDiffEnd = function findDiffEnd$1 (other, pos, otherPos) {\n if ( pos === void 0 ) pos = this.size;\n if ( otherPos === void 0 ) otherPos = other.size;\n\n return findDiffEnd(this, other, pos, otherPos)\n};\n\n// : (number, ?number) → {index: number, offset: number}\n// Find the index and inner offset corresponding to a given relative\n// position in this fragment. The result object will be reused\n// (overwritten) the next time the function is called. (Not public.)\nFragment.prototype.findIndex = function findIndex (pos, round) {\n if ( round === void 0 ) round = -1;\n\n if (pos == 0) { return retIndex(0, pos) }\n if (pos == this.size) { return retIndex(this.content.length, pos) }\n if (pos > this.size || pos < 0) { throw new RangeError((\"Position \" + pos + \" outside of fragment (\" + (this) + \")\")) }\n for (var i = 0, curPos = 0;; i++) {\n var cur = this.child(i), end = curPos + cur.nodeSize;\n if (end >= pos) {\n if (end == pos || round > 0) { return retIndex(i + 1, end) }\n return retIndex(i, curPos)\n }\n curPos = end;\n }\n};\n\n// :: () → string\n// Return a debugging string that describes this fragment.\nFragment.prototype.toString = function toString () { return \"<\" + this.toStringInner() + \">\" };\n\nFragment.prototype.toStringInner = function toStringInner () { return this.content.join(\", \") };\n\n// :: () → ?Object\n// Create a JSON-serializeable representation of this fragment.\nFragment.prototype.toJSON = function toJSON () {\n return this.content.length ? this.content.map(function (n) { return n.toJSON(); }) : null\n};\n\n// :: (Schema, ?Object) → Fragment\n// Deserialize a fragment from its JSON representation.\nFragment.fromJSON = function fromJSON (schema, value) {\n if (!value) { return Fragment.empty }\n if (!Array.isArray(value)) { throw new RangeError(\"Invalid input for Fragment.fromJSON\") }\n return new Fragment(value.map(schema.nodeFromJSON))\n};\n\n// :: ([Node]) → Fragment\n// Build a fragment from an array of nodes. Ensures that adjacent\n// text nodes with the same marks are joined together.\nFragment.fromArray = function fromArray (array) {\n if (!array.length) { return Fragment.empty }\n var joined, size = 0;\n for (var i = 0; i < array.length; i++) {\n var node = array[i];\n size += node.nodeSize;\n if (i && node.isText && array[i - 1].sameMarkup(node)) {\n if (!joined) { joined = array.slice(0, i); }\n joined[joined.length - 1] = node.withText(joined[joined.length - 1].text + node.text);\n } else if (joined) {\n joined.push(node);\n }\n }\n return new Fragment(joined || array, size)\n};\n\n// :: (?union) → Fragment\n// Create a fragment from something that can be interpreted as a set\n// of nodes. For `null`, it returns the empty fragment. For a\n// fragment, the fragment itself. For a node or array of nodes, a\n// fragment containing those nodes.\nFragment.from = function from (nodes) {\n if (!nodes) { return Fragment.empty }\n if (nodes instanceof Fragment) { return nodes }\n if (Array.isArray(nodes)) { return this.fromArray(nodes) }\n if (nodes.attrs) { return new Fragment([nodes], nodes.nodeSize) }\n throw new RangeError(\"Can not convert \" + nodes + \" to a Fragment\" +\n (nodes.nodesBetween ? \" (looks like multiple versions of prosemirror-model were loaded)\" : \"\"))\n};\n\nObject.defineProperties( Fragment.prototype, prototypeAccessors );\n\nvar found = {index: 0, offset: 0};\nfunction retIndex(index, offset) {\n found.index = index;\n found.offset = offset;\n return found\n}\n\n// :: Fragment\n// An empty fragment. Intended to be reused whenever a node doesn't\n// contain anything (rather than allocating a new empty fragment for\n// each leaf node).\nFragment.empty = new Fragment([], 0);\n\nfunction compareDeep(a, b) {\n if (a === b) { return true }\n if (!(a && typeof a == \"object\") ||\n !(b && typeof b == \"object\")) { return false }\n var array = Array.isArray(a);\n if (Array.isArray(b) != array) { return false }\n if (array) {\n if (a.length != b.length) { return false }\n for (var i = 0; i < a.length; i++) { if (!compareDeep(a[i], b[i])) { return false } }\n } else {\n for (var p in a) { if (!(p in b) || !compareDeep(a[p], b[p])) { return false } }\n for (var p$1 in b) { if (!(p$1 in a)) { return false } }\n }\n return true\n}\n\n// ::- A mark is a piece of information that can be attached to a node,\n// such as it being emphasized, in code font, or a link. It has a type\n// and optionally a set of attributes that provide further information\n// (such as the target of the link). Marks are created through a\n// `Schema`, which controls which types exist and which\n// attributes they have.\nvar Mark = function Mark(type, attrs) {\n // :: MarkType\n // The type of this mark.\n this.type = type;\n // :: Object\n // The attributes associated with this mark.\n this.attrs = attrs;\n};\n\n// :: ([Mark]) → [Mark]\n// Given a set of marks, create a new set which contains this one as\n// well, in the right position. If this mark is already in the set,\n// the set itself is returned. If any marks that are set to be\n// [exclusive](#model.MarkSpec.excludes) with this mark are present,\n// those are replaced by this one.\nMark.prototype.addToSet = function addToSet (set) {\n var copy, placed = false;\n for (var i = 0; i < set.length; i++) {\n var other = set[i];\n if (this.eq(other)) { return set }\n if (this.type.excludes(other.type)) {\n if (!copy) { copy = set.slice(0, i); }\n } else if (other.type.excludes(this.type)) {\n return set\n } else {\n if (!placed && other.type.rank > this.type.rank) {\n if (!copy) { copy = set.slice(0, i); }\n copy.push(this);\n placed = true;\n }\n if (copy) { copy.push(other); }\n }\n }\n if (!copy) { copy = set.slice(); }\n if (!placed) { copy.push(this); }\n return copy\n};\n\n// :: ([Mark]) → [Mark]\n// Remove this mark from the given set, returning a new set. If this\n// mark is not in the set, the set itself is returned.\nMark.prototype.removeFromSet = function removeFromSet (set) {\n for (var i = 0; i < set.length; i++)\n { if (this.eq(set[i]))\n { return set.slice(0, i).concat(set.slice(i + 1)) } }\n return set\n};\n\n// :: ([Mark]) → bool\n// Test whether this mark is in the given set of marks.\nMark.prototype.isInSet = function isInSet (set) {\n for (var i = 0; i < set.length; i++)\n { if (this.eq(set[i])) { return true } }\n return false\n};\n\n// :: (Mark) → bool\n// Test whether this mark has the same type and attributes as\n// another mark.\nMark.prototype.eq = function eq (other) {\n return this == other ||\n (this.type == other.type && compareDeep(this.attrs, other.attrs))\n};\n\n// :: () → Object\n// Convert this mark to a JSON-serializeable representation.\nMark.prototype.toJSON = function toJSON () {\n var obj = {type: this.type.name};\n for (var _ in this.attrs) {\n obj.attrs = this.attrs;\n break\n }\n return obj\n};\n\n// :: (Schema, Object) → Mark\nMark.fromJSON = function fromJSON (schema, json) {\n if (!json) { throw new RangeError(\"Invalid input for Mark.fromJSON\") }\n var type = schema.marks[json.type];\n if (!type) { throw new RangeError((\"There is no mark type \" + (json.type) + \" in this schema\")) }\n return type.create(json.attrs)\n};\n\n// :: ([Mark], [Mark]) → bool\n// Test whether two sets of marks are identical.\nMark.sameSet = function sameSet (a, b) {\n if (a == b) { return true }\n if (a.length != b.length) { return false }\n for (var i = 0; i < a.length; i++)\n { if (!a[i].eq(b[i])) { return false } }\n return true\n};\n\n// :: (?union) → [Mark]\n// Create a properly sorted mark set from null, a single mark, or an\n// unsorted array of marks.\nMark.setFrom = function setFrom (marks) {\n if (!marks || marks.length == 0) { return Mark.none }\n if (marks instanceof Mark) { return [marks] }\n var copy = marks.slice();\n copy.sort(function (a, b) { return a.type.rank - b.type.rank; });\n return copy\n};\n\n// :: [Mark] The empty set of marks.\nMark.none = [];\n\n// ReplaceError:: class extends Error\n// Error type raised by [`Node.replace`](#model.Node.replace) when\n// given an invalid replacement.\n\nfunction ReplaceError(message) {\n var err = Error.call(this, message);\n err.__proto__ = ReplaceError.prototype;\n return err\n}\n\nReplaceError.prototype = Object.create(Error.prototype);\nReplaceError.prototype.constructor = ReplaceError;\nReplaceError.prototype.name = \"ReplaceError\";\n\n// ::- A slice represents a piece cut out of a larger document. It\n// stores not only a fragment, but also the depth up to which nodes on\n// both side are ‘open’ (cut through).\nvar Slice = function Slice(content, openStart, openEnd) {\n // :: Fragment The slice's content.\n this.content = content;\n // :: number The open depth at the start.\n this.openStart = openStart;\n // :: number The open depth at the end.\n this.openEnd = openEnd;\n};\n\nvar prototypeAccessors$1 = { size: { configurable: true } };\n\n// :: number\n// The size this slice would add when inserted into a document.\nprototypeAccessors$1.size.get = function () {\n return this.content.size - this.openStart - this.openEnd\n};\n\nSlice.prototype.insertAt = function insertAt (pos, fragment) {\n var content = insertInto(this.content, pos + this.openStart, fragment, null);\n return content && new Slice(content, this.openStart, this.openEnd)\n};\n\nSlice.prototype.removeBetween = function removeBetween (from, to) {\n return new Slice(removeRange(this.content, from + this.openStart, to + this.openStart), this.openStart, this.openEnd)\n};\n\n// :: (Slice) → bool\n// Tests whether this slice is equal to another slice.\nSlice.prototype.eq = function eq (other) {\n return this.content.eq(other.content) && this.openStart == other.openStart && this.openEnd == other.openEnd\n};\n\nSlice.prototype.toString = function toString () {\n return this.content + \"(\" + this.openStart + \",\" + this.openEnd + \")\"\n};\n\n// :: () → ?Object\n// Convert a slice to a JSON-serializable representation.\nSlice.prototype.toJSON = function toJSON () {\n if (!this.content.size) { return null }\n var json = {content: this.content.toJSON()};\n if (this.openStart > 0) { json.openStart = this.openStart; }\n if (this.openEnd > 0) { json.openEnd = this.openEnd; }\n return json\n};\n\n// :: (Schema, ?Object) → Slice\n// Deserialize a slice from its JSON representation.\nSlice.fromJSON = function fromJSON (schema, json) {\n if (!json) { return Slice.empty }\n var openStart = json.openStart || 0, openEnd = json.openEnd || 0;\n if (typeof openStart != \"number\" || typeof openEnd != \"number\")\n { throw new RangeError(\"Invalid input for Slice.fromJSON\") }\n return new Slice(Fragment.fromJSON(schema, json.content), openStart, openEnd)\n};\n\n// :: (Fragment, ?bool) → Slice\n// Create a slice from a fragment by taking the maximum possible\n// open value on both side of the fragment.\nSlice.maxOpen = function maxOpen (fragment, openIsolating) {\n if ( openIsolating === void 0 ) openIsolating=true;\n\n var openStart = 0, openEnd = 0;\n for (var n = fragment.firstChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.firstChild) { openStart++; }\n for (var n$1 = fragment.lastChild; n$1 && !n$1.isLeaf && (openIsolating || !n$1.type.spec.isolating); n$1 = n$1.lastChild) { openEnd++; }\n return new Slice(fragment, openStart, openEnd)\n};\n\nObject.defineProperties( Slice.prototype, prototypeAccessors$1 );\n\nfunction removeRange(content, from, to) {\n var ref = content.findIndex(from);\n var index = ref.index;\n var offset = ref.offset;\n var child = content.maybeChild(index);\n var ref$1 = content.findIndex(to);\n var indexTo = ref$1.index;\n var offsetTo = ref$1.offset;\n if (offset == from || child.isText) {\n if (offsetTo != to && !content.child(indexTo).isText) { throw new RangeError(\"Removing non-flat range\") }\n return content.cut(0, from).append(content.cut(to))\n }\n if (index != indexTo) { throw new RangeError(\"Removing non-flat range\") }\n return content.replaceChild(index, child.copy(removeRange(child.content, from - offset - 1, to - offset - 1)))\n}\n\nfunction insertInto(content, dist, insert, parent) {\n var ref = content.findIndex(dist);\n var index = ref.index;\n var offset = ref.offset;\n var child = content.maybeChild(index);\n if (offset == dist || child.isText) {\n if (parent && !parent.canReplace(index, index, insert)) { return null }\n return content.cut(0, dist).append(insert).append(content.cut(dist))\n }\n var inner = insertInto(child.content, dist - offset - 1, insert);\n return inner && content.replaceChild(index, child.copy(inner))\n}\n\n// :: Slice\n// The empty slice.\nSlice.empty = new Slice(Fragment.empty, 0, 0);\n\nfunction replace($from, $to, slice) {\n if (slice.openStart > $from.depth)\n { throw new ReplaceError(\"Inserted content deeper than insertion position\") }\n if ($from.depth - slice.openStart != $to.depth - slice.openEnd)\n { throw new ReplaceError(\"Inconsistent open depths\") }\n return replaceOuter($from, $to, slice, 0)\n}\n\nfunction replaceOuter($from, $to, slice, depth) {\n var index = $from.index(depth), node = $from.node(depth);\n if (index == $to.index(depth) && depth < $from.depth - slice.openStart) {\n var inner = replaceOuter($from, $to, slice, depth + 1);\n return node.copy(node.content.replaceChild(index, inner))\n } else if (!slice.content.size) {\n return close(node, replaceTwoWay($from, $to, depth))\n } else if (!slice.openStart && !slice.openEnd && $from.depth == depth && $to.depth == depth) { // Simple, flat case\n var parent = $from.parent, content = parent.content;\n return close(parent, content.cut(0, $from.parentOffset).append(slice.content).append(content.cut($to.parentOffset)))\n } else {\n var ref = prepareSliceForReplace(slice, $from);\n var start = ref.start;\n var end = ref.end;\n return close(node, replaceThreeWay($from, start, end, $to, depth))\n }\n}\n\nfunction checkJoin(main, sub) {\n if (!sub.type.compatibleContent(main.type))\n { throw new ReplaceError(\"Cannot join \" + sub.type.name + \" onto \" + main.type.name) }\n}\n\nfunction joinable($before, $after, depth) {\n var node = $before.node(depth);\n checkJoin(node, $after.node(depth));\n return node\n}\n\nfunction addNode(child, target) {\n var last = target.length - 1;\n if (last >= 0 && child.isText && child.sameMarkup(target[last]))\n { target[last] = child.withText(target[last].text + child.text); }\n else\n { target.push(child); }\n}\n\nfunction addRange($start, $end, depth, target) {\n var node = ($end || $start).node(depth);\n var startIndex = 0, endIndex = $end ? $end.index(depth) : node.childCount;\n if ($start) {\n startIndex = $start.index(depth);\n if ($start.depth > depth) {\n startIndex++;\n } else if ($start.textOffset) {\n addNode($start.nodeAfter, target);\n startIndex++;\n }\n }\n for (var i = startIndex; i < endIndex; i++) { addNode(node.child(i), target); }\n if ($end && $end.depth == depth && $end.textOffset)\n { addNode($end.nodeBefore, target); }\n}\n\nfunction close(node, content) {\n if (!node.type.validContent(content))\n { throw new ReplaceError(\"Invalid content for node \" + node.type.name) }\n return node.copy(content)\n}\n\nfunction replaceThreeWay($from, $start, $end, $to, depth) {\n var openStart = $from.depth > depth && joinable($from, $start, depth + 1);\n var openEnd = $to.depth > depth && joinable($end, $to, depth + 1);\n\n var content = [];\n addRange(null, $from, depth, content);\n if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {\n checkJoin(openStart, openEnd);\n addNode(close(openStart, replaceThreeWay($from, $start, $end, $to, depth + 1)), content);\n } else {\n if (openStart)\n { addNode(close(openStart, replaceTwoWay($from, $start, depth + 1)), content); }\n addRange($start, $end, depth, content);\n if (openEnd)\n { addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content); }\n }\n addRange($to, null, depth, content);\n return new Fragment(content)\n}\n\nfunction replaceTwoWay($from, $to, depth) {\n var content = [];\n addRange(null, $from, depth, content);\n if ($from.depth > depth) {\n var type = joinable($from, $to, depth + 1);\n addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content);\n }\n addRange($to, null, depth, content);\n return new Fragment(content)\n}\n\nfunction prepareSliceForReplace(slice, $along) {\n var extra = $along.depth - slice.openStart, parent = $along.node(extra);\n var node = parent.copy(slice.content);\n for (var i = extra - 1; i >= 0; i--)\n { node = $along.node(i).copy(Fragment.from(node)); }\n return {start: node.resolveNoCache(slice.openStart + extra),\n end: node.resolveNoCache(node.content.size - slice.openEnd - extra)}\n}\n\n// ::- You can [_resolve_](#model.Node.resolve) a position to get more\n// information about it. Objects of this class represent such a\n// resolved position, providing various pieces of context information,\n// and some helper methods.\n//\n// Throughout this interface, methods that take an optional `depth`\n// parameter will interpret undefined as `this.depth` and negative\n// numbers as `this.depth + value`.\nvar ResolvedPos = function ResolvedPos(pos, path, parentOffset) {\n // :: number The position that was resolved.\n this.pos = pos;\n this.path = path;\n // :: number\n // The number of levels the parent node is from the root. If this\n // position points directly into the root node, it is 0. If it\n // points into a top-level paragraph, 1, and so on.\n this.depth = path.length / 3 - 1;\n // :: number The offset this position has into its parent node.\n this.parentOffset = parentOffset;\n};\n\nvar prototypeAccessors$2 = { parent: { configurable: true },doc: { configurable: true },textOffset: { configurable: true },nodeAfter: { configurable: true },nodeBefore: { configurable: true } };\n\nResolvedPos.prototype.resolveDepth = function resolveDepth (val) {\n if (val == null) { return this.depth }\n if (val < 0) { return this.depth + val }\n return val\n};\n\n// :: Node\n// The parent node that the position points into. Note that even if\n// a position points into a text node, that node is not considered\n// the parent—text nodes are ‘flat’ in this model, and have no content.\nprototypeAccessors$2.parent.get = function () { return this.node(this.depth) };\n\n// :: Node\n// The root node in which the position was resolved.\nprototypeAccessors$2.doc.get = function () { return this.node(0) };\n\n// :: (?number) → Node\n// The ancestor node at the given level. `p.node(p.depth)` is the\n// same as `p.parent`.\nResolvedPos.prototype.node = function node (depth) { return this.path[this.resolveDepth(depth) * 3] };\n\n// :: (?number) → number\n// The index into the ancestor at the given level. If this points at\n// the 3rd node in the 2nd paragraph on the top level, for example,\n// `p.index(0)` is 1 and `p.index(1)` is 2.\nResolvedPos.prototype.index = function index (depth) { return this.path[this.resolveDepth(depth) * 3 + 1] };\n\n// :: (?number) → number\n// The index pointing after this position into the ancestor at the\n// given level.\nResolvedPos.prototype.indexAfter = function indexAfter (depth) {\n depth = this.resolveDepth(depth);\n return this.index(depth) + (depth == this.depth && !this.textOffset ? 0 : 1)\n};\n\n// :: (?number) → number\n// The (absolute) position at the start of the node at the given\n// level.\nResolvedPos.prototype.start = function start (depth) {\n depth = this.resolveDepth(depth);\n return depth == 0 ? 0 : this.path[depth * 3 - 1] + 1\n};\n\n// :: (?number) → number\n// The (absolute) position at the end of the node at the given\n// level.\nResolvedPos.prototype.end = function end (depth) {\n depth = this.resolveDepth(depth);\n return this.start(depth) + this.node(depth).content.size\n};\n\n// :: (?number) → number\n// The (absolute) position directly before the wrapping node at the\n// given level, or, when `depth` is `this.depth + 1`, the original\n// position.\nResolvedPos.prototype.before = function before (depth) {\n depth = this.resolveDepth(depth);\n if (!depth) { throw new RangeError(\"There is no position before the top-level node\") }\n return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1]\n};\n\n// :: (?number) → number\n// The (absolute) position directly after the wrapping node at the\n// given level, or the original position when `depth` is `this.depth + 1`.\nResolvedPos.prototype.after = function after (depth) {\n depth = this.resolveDepth(depth);\n if (!depth) { throw new RangeError(\"There is no position after the top-level node\") }\n return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1] + this.path[depth * 3].nodeSize\n};\n\n// :: number\n// When this position points into a text node, this returns the\n// distance between the position and the start of the text node.\n// Will be zero for positions that point between nodes.\nprototypeAccessors$2.textOffset.get = function () { return this.pos - this.path[this.path.length - 1] };\n\n// :: ?Node\n// Get the node directly after the position, if any. If the position\n// points into a text node, only the part of that node after the\n// position is returned.\nprototypeAccessors$2.nodeAfter.get = function () {\n var parent = this.parent, index = this.index(this.depth);\n if (index == parent.childCount) { return null }\n var dOff = this.pos - this.path[this.path.length - 1], child = parent.child(index);\n return dOff ? parent.child(index).cut(dOff) : child\n};\n\n// :: ?Node\n// Get the node directly before the position, if any. If the\n// position points into a text node, only the part of that node\n// before the position is returned.\nprototypeAccessors$2.nodeBefore.get = function () {\n var index = this.index(this.depth);\n var dOff = this.pos - this.path[this.path.length - 1];\n if (dOff) { return this.parent.child(index).cut(0, dOff) }\n return index == 0 ? null : this.parent.child(index - 1)\n};\n\n// :: (number, ?number) → number\n// Get the position at the given index in the parent node at the\n// given depth (which defaults to `this.depth`).\nResolvedPos.prototype.posAtIndex = function posAtIndex (index, depth) {\n depth = this.resolveDepth(depth);\n var node = this.path[depth * 3], pos = depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n for (var i = 0; i < index; i++) { pos += node.child(i).nodeSize; }\n return pos\n};\n\n// :: () → [Mark]\n// Get the marks at this position, factoring in the surrounding\n// marks' [`inclusive`](#model.MarkSpec.inclusive) property. If the\n// position is at the start of a non-empty node, the marks of the\n// node after it (if any) are returned.\nResolvedPos.prototype.marks = function marks () {\n var parent = this.parent, index = this.index();\n\n // In an empty parent, return the empty array\n if (parent.content.size == 0) { return Mark.none }\n\n // When inside a text node, just return the text node's marks\n if (this.textOffset) { return parent.child(index).marks }\n\n var main = parent.maybeChild(index - 1), other = parent.maybeChild(index);\n // If the `after` flag is true of there is no node before, make\n // the node after this position the main reference.\n if (!main) { var tmp = main; main = other; other = tmp; }\n\n // Use all marks in the main node, except those that have\n // `inclusive` set to false and are not present in the other node.\n var marks = main.marks;\n for (var i = 0; i < marks.length; i++)\n { if (marks[i].type.spec.inclusive === false && (!other || !marks[i].isInSet(other.marks)))\n { marks = marks[i--].removeFromSet(marks); } }\n\n return marks\n};\n\n// :: (ResolvedPos) → ?[Mark]\n// Get the marks after the current position, if any, except those\n// that are non-inclusive and not present at position `$end`. This\n// is mostly useful for getting the set of marks to preserve after a\n// deletion. Will return `null` if this position is at the end of\n// its parent node or its parent node isn't a textblock (in which\n// case no marks should be preserved).\nResolvedPos.prototype.marksAcross = function marksAcross ($end) {\n var after = this.parent.maybeChild(this.index());\n if (!after || !after.isInline) { return null }\n\n var marks = after.marks, next = $end.parent.maybeChild($end.index());\n for (var i = 0; i < marks.length; i++)\n { if (marks[i].type.spec.inclusive === false && (!next || !marks[i].isInSet(next.marks)))\n { marks = marks[i--].removeFromSet(marks); } }\n return marks\n};\n\n// :: (number) → number\n// The depth up to which this position and the given (non-resolved)\n// position share the same parent nodes.\nResolvedPos.prototype.sharedDepth = function sharedDepth (pos) {\n for (var depth = this.depth; depth > 0; depth--)\n { if (this.start(depth) <= pos && this.end(depth) >= pos) { return depth } }\n return 0\n};\n\n// :: (?ResolvedPos, ?(Node) → bool) → ?NodeRange\n// Returns a range based on the place where this position and the\n// given position diverge around block content. If both point into\n// the same textblock, for example, a range around that textblock\n// will be returned. If they point into different blocks, the range\n// around those blocks in their shared ancestor is returned. You can\n// pass in an optional predicate that will be called with a parent\n// node to see if a range into that parent is acceptable.\nResolvedPos.prototype.blockRange = function blockRange (other, pred) {\n if ( other === void 0 ) other = this;\n\n if (other.pos < this.pos) { return other.blockRange(this) }\n for (var d = this.depth - (this.parent.inlineContent || this.pos == other.pos ? 1 : 0); d >= 0; d--)\n { if (other.pos <= this.end(d) && (!pred || pred(this.node(d))))\n { return new NodeRange(this, other, d) } }\n};\n\n// :: (ResolvedPos) → bool\n// Query whether the given position shares the same parent node.\nResolvedPos.prototype.sameParent = function sameParent (other) {\n return this.pos - this.parentOffset == other.pos - other.parentOffset\n};\n\n// :: (ResolvedPos) → ResolvedPos\n// Return the greater of this and the given position.\nResolvedPos.prototype.max = function max (other) {\n return other.pos > this.pos ? other : this\n};\n\n// :: (ResolvedPos) → ResolvedPos\n// Return the smaller of this and the given position.\nResolvedPos.prototype.min = function min (other) {\n return other.pos < this.pos ? other : this\n};\n\nResolvedPos.prototype.toString = function toString () {\n var str = \"\";\n for (var i = 1; i <= this.depth; i++)\n { str += (str ? \"/\" : \"\") + this.node(i).type.name + \"_\" + this.index(i - 1); }\n return str + \":\" + this.parentOffset\n};\n\nResolvedPos.resolve = function resolve (doc, pos) {\n if (!(pos >= 0 && pos <= doc.content.size)) { throw new RangeError(\"Position \" + pos + \" out of range\") }\n var path = [];\n var start = 0, parentOffset = pos;\n for (var node = doc;;) {\n var ref = node.content.findIndex(parentOffset);\n var index = ref.index;\n var offset = ref.offset;\n var rem = parentOffset - offset;\n path.push(node, index, start + offset);\n if (!rem) { break }\n node = node.child(index);\n if (node.isText) { break }\n parentOffset = rem - 1;\n start += offset + 1;\n }\n return new ResolvedPos(pos, path, parentOffset)\n};\n\nResolvedPos.resolveCached = function resolveCached (doc, pos) {\n for (var i = 0; i < resolveCache.length; i++) {\n var cached = resolveCache[i];\n if (cached.pos == pos && cached.doc == doc) { return cached }\n }\n var result = resolveCache[resolveCachePos] = ResolvedPos.resolve(doc, pos);\n resolveCachePos = (resolveCachePos + 1) % resolveCacheSize;\n return result\n};\n\nObject.defineProperties( ResolvedPos.prototype, prototypeAccessors$2 );\n\nvar resolveCache = [], resolveCachePos = 0, resolveCacheSize = 12;\n\n// ::- Represents a flat range of content, i.e. one that starts and\n// ends in the same node.\nvar NodeRange = function NodeRange($from, $to, depth) {\n // :: ResolvedPos A resolved position along the start of the\n // content. May have a `depth` greater than this object's `depth`\n // property, since these are the positions that were used to\n // compute the range, not re-resolved positions directly at its\n // boundaries.\n this.$from = $from;\n // :: ResolvedPos A position along the end of the content. See\n // caveat for [`$from`](#model.NodeRange.$from).\n this.$to = $to;\n // :: number The depth of the node that this range points into.\n this.depth = depth;\n};\n\nvar prototypeAccessors$1$1 = { start: { configurable: true },end: { configurable: true },parent: { configurable: true },startIndex: { configurable: true },endIndex: { configurable: true } };\n\n// :: number The position at the start of the range.\nprototypeAccessors$1$1.start.get = function () { return this.$from.before(this.depth + 1) };\n// :: number The position at the end of the range.\nprototypeAccessors$1$1.end.get = function () { return this.$to.after(this.depth + 1) };\n\n// :: Node The parent node that the range points into.\nprototypeAccessors$1$1.parent.get = function () { return this.$from.node(this.depth) };\n// :: number The start index of the range in the parent node.\nprototypeAccessors$1$1.startIndex.get = function () { return this.$from.index(this.depth) };\n// :: number The end index of the range in the parent node.\nprototypeAccessors$1$1.endIndex.get = function () { return this.$to.indexAfter(this.depth) };\n\nObject.defineProperties( NodeRange.prototype, prototypeAccessors$1$1 );\n\nvar emptyAttrs = Object.create(null);\n\n// ::- This class represents a node in the tree that makes up a\n// ProseMirror document. So a document is an instance of `Node`, with\n// children that are also instances of `Node`.\n//\n// Nodes are persistent data structures. Instead of changing them, you\n// create new ones with the content you want. Old ones keep pointing\n// at the old document shape. This is made cheaper by sharing\n// structure between the old and new data as much as possible, which a\n// tree shape like this (without back pointers) makes easy.\n//\n// **Do not** directly mutate the properties of a `Node` object. See\n// [the guide](/docs/guide/#doc) for more information.\nvar Node = function Node(type, attrs, content, marks) {\n // :: NodeType\n // The type of node that this is.\n this.type = type;\n\n // :: Object\n // An object mapping attribute names to values. The kind of\n // attributes allowed and required are\n // [determined](#model.NodeSpec.attrs) by the node type.\n this.attrs = attrs;\n\n // :: Fragment\n // A container holding the node's children.\n this.content = content || Fragment.empty;\n\n // :: [Mark]\n // The marks (things like whether it is emphasized or part of a\n // link) applied to this node.\n this.marks = marks || Mark.none;\n};\n\nvar prototypeAccessors$3 = { nodeSize: { configurable: true },childCount: { configurable: true },textContent: { configurable: true },firstChild: { configurable: true },lastChild: { configurable: true },isBlock: { configurable: true },isTextblock: { configurable: true },inlineContent: { configurable: true },isInline: { configurable: true },isText: { configurable: true },isLeaf: { configurable: true },isAtom: { configurable: true } };\n\n// text:: ?string\n// For text nodes, this contains the node's text content.\n\n// :: number\n// The size of this node, as defined by the integer-based [indexing\n// scheme](/docs/guide/#doc.indexing). For text nodes, this is the\n// amount of characters. For other leaf nodes, it is one. For\n// non-leaf nodes, it is the size of the content plus two (the start\n// and end token).\nprototypeAccessors$3.nodeSize.get = function () { return this.isLeaf ? 1 : 2 + this.content.size };\n\n// :: number\n// The number of children that the node has.\nprototypeAccessors$3.childCount.get = function () { return this.content.childCount };\n\n// :: (number) → Node\n// Get the child node at the given index. Raises an error when the\n// index is out of range.\nNode.prototype.child = function child (index) { return this.content.child(index) };\n\n// :: (number) → ?Node\n// Get the child node at the given index, if it exists.\nNode.prototype.maybeChild = function maybeChild (index) { return this.content.maybeChild(index) };\n\n// :: ((node: Node, offset: number, index: number))\n// Call `f` for every child node, passing the node, its offset\n// into this parent node, and its index.\nNode.prototype.forEach = function forEach (f) { this.content.forEach(f); };\n\n// :: (number, number, (node: Node, pos: number, parent: Node, index: number) → ?bool, ?number)\n// Invoke a callback for all descendant nodes recursively between\n// the given two positions that are relative to start of this node's\n// content. The callback is invoked with the node, its\n// parent-relative position, its parent node, and its child index.\n// When the callback returns false for a given node, that node's\n// children will not be recursed over. The last parameter can be\n// used to specify a starting position to count from.\nNode.prototype.nodesBetween = function nodesBetween (from, to, f, startPos) {\n if ( startPos === void 0 ) startPos = 0;\n\n this.content.nodesBetween(from, to, f, startPos, this);\n};\n\n// :: ((node: Node, pos: number, parent: Node) → ?bool)\n// Call the given callback for every descendant node. Doesn't\n// descend into a node when the callback returns `false`.\nNode.prototype.descendants = function descendants (f) {\n this.nodesBetween(0, this.content.size, f);\n};\n\n// :: string\n// Concatenates all the text nodes found in this fragment and its\n// children.\nprototypeAccessors$3.textContent.get = function () { return this.textBetween(0, this.content.size, \"\") };\n\n// :: (number, number, ?string, ?string) → string\n// Get all text between positions `from` and `to`. When\n// `blockSeparator` is given, it will be inserted whenever a new\n// block node is started. When `leafText` is given, it'll be\n// inserted for every non-text leaf node encountered.\nNode.prototype.textBetween = function textBetween (from, to, blockSeparator, leafText) {\n return this.content.textBetween(from, to, blockSeparator, leafText)\n};\n\n// :: ?Node\n// Returns this node's first child, or `null` if there are no\n// children.\nprototypeAccessors$3.firstChild.get = function () { return this.content.firstChild };\n\n// :: ?Node\n// Returns this node's last child, or `null` if there are no\n// children.\nprototypeAccessors$3.lastChild.get = function () { return this.content.lastChild };\n\n// :: (Node) → bool\n// Test whether two nodes represent the same piece of document.\nNode.prototype.eq = function eq (other) {\n return this == other || (this.sameMarkup(other) && this.content.eq(other.content))\n};\n\n// :: (Node) → bool\n// Compare the markup (type, attributes, and marks) of this node to\n// those of another. Returns `true` if both have the same markup.\nNode.prototype.sameMarkup = function sameMarkup (other) {\n return this.hasMarkup(other.type, other.attrs, other.marks)\n};\n\n// :: (NodeType, ?Object, ?[Mark]) → bool\n// Check whether this node's markup correspond to the given type,\n// attributes, and marks.\nNode.prototype.hasMarkup = function hasMarkup (type, attrs, marks) {\n return this.type == type &&\n compareDeep(this.attrs, attrs || type.defaultAttrs || emptyAttrs) &&\n Mark.sameSet(this.marks, marks || Mark.none)\n};\n\n// :: (?Fragment) → Node\n// Create a new node with the same markup as this node, containing\n// the given content (or empty, if no content is given).\nNode.prototype.copy = function copy (content) {\n if ( content === void 0 ) content = null;\n\n if (content == this.content) { return this }\n return new this.constructor(this.type, this.attrs, content, this.marks)\n};\n\n// :: ([Mark]) → Node\n// Create a copy of this node, with the given set of marks instead\n// of the node's own marks.\nNode.prototype.mark = function mark (marks) {\n return marks == this.marks ? this : new this.constructor(this.type, this.attrs, this.content, marks)\n};\n\n// :: (number, ?number) → Node\n// Create a copy of this node with only the content between the\n// given positions. If `to` is not given, it defaults to the end of\n// the node.\nNode.prototype.cut = function cut (from, to) {\n if (from == 0 && to == this.content.size) { return this }\n return this.copy(this.content.cut(from, to))\n};\n\n// :: (number, ?number) → Slice\n// Cut out the part of the document between the given positions, and\n// return it as a `Slice` object.\nNode.prototype.slice = function slice (from, to, includeParents) {\n if ( to === void 0 ) to = this.content.size;\n if ( includeParents === void 0 ) includeParents = false;\n\n if (from == to) { return Slice.empty }\n\n var $from = this.resolve(from), $to = this.resolve(to);\n var depth = includeParents ? 0 : $from.sharedDepth(to);\n var start = $from.start(depth), node = $from.node(depth);\n var content = node.content.cut($from.pos - start, $to.pos - start);\n return new Slice(content, $from.depth - depth, $to.depth - depth)\n};\n\n// :: (number, number, Slice) → Node\n// Replace the part of the document between the given positions with\n// the given slice. The slice must 'fit', meaning its open sides\n// must be able to connect to the surrounding content, and its\n// content nodes must be valid children for the node they are placed\n// into. If any of this is violated, an error of type\n// [`ReplaceError`](#model.ReplaceError) is thrown.\nNode.prototype.replace = function replace$1 (from, to, slice) {\n return replace(this.resolve(from), this.resolve(to), slice)\n};\n\n// :: (number) → ?Node\n// Find the node directly after the given position.\nNode.prototype.nodeAt = function nodeAt (pos) {\n for (var node = this;;) {\n var ref = node.content.findIndex(pos);\n var index = ref.index;\n var offset = ref.offset;\n node = node.maybeChild(index);\n if (!node) { return null }\n if (offset == pos || node.isText) { return node }\n pos -= offset + 1;\n }\n};\n\n// :: (number) → {node: ?Node, index: number, offset: number}\n// Find the (direct) child node after the given offset, if any,\n// and return it along with its index and offset relative to this\n// node.\nNode.prototype.childAfter = function childAfter (pos) {\n var ref = this.content.findIndex(pos);\n var index = ref.index;\n var offset = ref.offset;\n return {node: this.content.maybeChild(index), index: index, offset: offset}\n};\n\n// :: (number) → {node: ?Node, index: number, offset: number}\n// Find the (direct) child node before the given offset, if any,\n// and return it along with its index and offset relative to this\n// node.\nNode.prototype.childBefore = function childBefore (pos) {\n if (pos == 0) { return {node: null, index: 0, offset: 0} }\n var ref = this.content.findIndex(pos);\n var index = ref.index;\n var offset = ref.offset;\n if (offset < pos) { return {node: this.content.child(index), index: index, offset: offset} }\n var node = this.content.child(index - 1);\n return {node: node, index: index - 1, offset: offset - node.nodeSize}\n};\n\n// :: (number) → ResolvedPos\n// Resolve the given position in the document, returning an\n// [object](#model.ResolvedPos) with information about its context.\nNode.prototype.resolve = function resolve (pos) { return ResolvedPos.resolveCached(this, pos) };\n\nNode.prototype.resolveNoCache = function resolveNoCache (pos) { return ResolvedPos.resolve(this, pos) };\n\n// :: (number, number, union) → bool\n// Test whether a given mark or mark type occurs in this document\n// between the two given positions.\nNode.prototype.rangeHasMark = function rangeHasMark (from, to, type) {\n var found = false;\n if (to > from) { this.nodesBetween(from, to, function (node) {\n if (type.isInSet(node.marks)) { found = true; }\n return !found\n }); }\n return found\n};\n\n// :: bool\n// True when this is a block (non-inline node)\nprototypeAccessors$3.isBlock.get = function () { return this.type.isBlock };\n\n// :: bool\n// True when this is a textblock node, a block node with inline\n// content.\nprototypeAccessors$3.isTextblock.get = function () { return this.type.isTextblock };\n\n// :: bool\n// True when this node allows inline content.\nprototypeAccessors$3.inlineContent.get = function () { return this.type.inlineContent };\n\n// :: bool\n// True when this is an inline node (a text node or a node that can\n// appear among text).\nprototypeAccessors$3.isInline.get = function () { return this.type.isInline };\n\n// :: bool\n// True when this is a text node.\nprototypeAccessors$3.isText.get = function () { return this.type.isText };\n\n// :: bool\n// True when this is a leaf node.\nprototypeAccessors$3.isLeaf.get = function () { return this.type.isLeaf };\n\n// :: bool\n// True when this is an atom, i.e. when it does not have directly\n// editable content. This is usually the same as `isLeaf`, but can\n// be configured with the [`atom` property](#model.NodeSpec.atom) on\n// a node's spec (typically used when the node is displayed as an\n// uneditable [node view](#view.NodeView)).\nprototypeAccessors$3.isAtom.get = function () { return this.type.isAtom };\n\n// :: () → string\n// Return a string representation of this node for debugging\n// purposes.\nNode.prototype.toString = function toString () {\n if (this.type.spec.toDebugString) { return this.type.spec.toDebugString(this) }\n var name = this.type.name;\n if (this.content.size)\n { name += \"(\" + this.content.toStringInner() + \")\"; }\n return wrapMarks(this.marks, name)\n};\n\n// :: (number) → ContentMatch\n// Get the content match in this node at the given index.\nNode.prototype.contentMatchAt = function contentMatchAt (index) {\n var match = this.type.contentMatch.matchFragment(this.content, 0, index);\n if (!match) { throw new Error(\"Called contentMatchAt on a node with invalid content\") }\n return match\n};\n\n// :: (number, number, ?Fragment, ?number, ?number) → bool\n// Test whether replacing the range between `from` and `to` (by\n// child index) with the given replacement fragment (which defaults\n// to the empty fragment) would leave the node's content valid. You\n// can optionally pass `start` and `end` indices into the\n// replacement fragment.\nNode.prototype.canReplace = function canReplace (from, to, replacement, start, end) {\n if ( replacement === void 0 ) replacement = Fragment.empty;\n if ( start === void 0 ) start = 0;\n if ( end === void 0 ) end = replacement.childCount;\n\n var one = this.contentMatchAt(from).matchFragment(replacement, start, end);\n var two = one && one.matchFragment(this.content, to);\n if (!two || !two.validEnd) { return false }\n for (var i = start; i < end; i++) { if (!this.type.allowsMarks(replacement.child(i).marks)) { return false } }\n return true\n};\n\n// :: (number, number, NodeType, ?[Mark]) → bool\n// Test whether replacing the range `from` to `to` (by index) with a\n// node of the given type would leave the node's content valid.\nNode.prototype.canReplaceWith = function canReplaceWith (from, to, type, marks) {\n if (marks && !this.type.allowsMarks(marks)) { return false }\n var start = this.contentMatchAt(from).matchType(type);\n var end = start && start.matchFragment(this.content, to);\n return end ? end.validEnd : false\n};\n\n// :: (Node) → bool\n// Test whether the given node's content could be appended to this\n// node. If that node is empty, this will only return true if there\n// is at least one node type that can appear in both nodes (to avoid\n// merging completely incompatible nodes).\nNode.prototype.canAppend = function canAppend (other) {\n if (other.content.size) { return this.canReplace(this.childCount, this.childCount, other.content) }\n else { return this.type.compatibleContent(other.type) }\n};\n\n// :: ()\n// Check whether this node and its descendants conform to the\n// schema, and raise error when they do not.\nNode.prototype.check = function check () {\n if (!this.type.validContent(this.content))\n { throw new RangeError((\"Invalid content for node \" + (this.type.name) + \": \" + (this.content.toString().slice(0, 50)))) }\n this.content.forEach(function (node) { return node.check(); });\n};\n\n// :: () → Object\n// Return a JSON-serializeable representation of this node.\nNode.prototype.toJSON = function toJSON () {\n var obj = {type: this.type.name};\n for (var _ in this.attrs) {\n obj.attrs = this.attrs;\n break\n }\n if (this.content.size)\n { obj.content = this.content.toJSON(); }\n if (this.marks.length)\n { obj.marks = this.marks.map(function (n) { return n.toJSON(); }); }\n return obj\n};\n\n// :: (Schema, Object) → Node\n// Deserialize a node from its JSON representation.\nNode.fromJSON = function fromJSON (schema, json) {\n if (!json) { throw new RangeError(\"Invalid input for Node.fromJSON\") }\n var marks = null;\n if (json.marks) {\n if (!Array.isArray(json.marks)) { throw new RangeError(\"Invalid mark data for Node.fromJSON\") }\n marks = json.marks.map(schema.markFromJSON);\n }\n if (json.type == \"text\") {\n if (typeof json.text != \"string\") { throw new RangeError(\"Invalid text node in JSON\") }\n return schema.text(json.text, marks)\n }\n var content = Fragment.fromJSON(schema, json.content);\n return schema.nodeType(json.type).create(json.attrs, content, marks)\n};\n\nObject.defineProperties( Node.prototype, prototypeAccessors$3 );\n\nvar TextNode = /*@__PURE__*/(function (Node) {\n function TextNode(type, attrs, content, marks) {\n Node.call(this, type, attrs, null, marks);\n\n if (!content) { throw new RangeError(\"Empty text nodes are not allowed\") }\n\n this.text = content;\n }\n\n if ( Node ) TextNode.__proto__ = Node;\n TextNode.prototype = Object.create( Node && Node.prototype );\n TextNode.prototype.constructor = TextNode;\n\n var prototypeAccessors$1 = { textContent: { configurable: true },nodeSize: { configurable: true } };\n\n TextNode.prototype.toString = function toString () {\n if (this.type.spec.toDebugString) { return this.type.spec.toDebugString(this) }\n return wrapMarks(this.marks, JSON.stringify(this.text))\n };\n\n prototypeAccessors$1.textContent.get = function () { return this.text };\n\n TextNode.prototype.textBetween = function textBetween (from, to) { return this.text.slice(from, to) };\n\n prototypeAccessors$1.nodeSize.get = function () { return this.text.length };\n\n TextNode.prototype.mark = function mark (marks) {\n return marks == this.marks ? this : new TextNode(this.type, this.attrs, this.text, marks)\n };\n\n TextNode.prototype.withText = function withText (text) {\n if (text == this.text) { return this }\n return new TextNode(this.type, this.attrs, text, this.marks)\n };\n\n TextNode.prototype.cut = function cut (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.text.length;\n\n if (from == 0 && to == this.text.length) { return this }\n return this.withText(this.text.slice(from, to))\n };\n\n TextNode.prototype.eq = function eq (other) {\n return this.sameMarkup(other) && this.text == other.text\n };\n\n TextNode.prototype.toJSON = function toJSON () {\n var base = Node.prototype.toJSON.call(this);\n base.text = this.text;\n return base\n };\n\n Object.defineProperties( TextNode.prototype, prototypeAccessors$1 );\n\n return TextNode;\n}(Node));\n\nfunction wrapMarks(marks, str) {\n for (var i = marks.length - 1; i >= 0; i--)\n { str = marks[i].type.name + \"(\" + str + \")\"; }\n return str\n}\n\n// ::- Instances of this class represent a match state of a node\n// type's [content expression](#model.NodeSpec.content), and can be\n// used to find out whether further content matches here, and whether\n// a given position is a valid end of the node.\nvar ContentMatch = function ContentMatch(validEnd) {\n // :: bool\n // True when this match state represents a valid end of the node.\n this.validEnd = validEnd;\n this.next = [];\n this.wrapCache = [];\n};\n\nvar prototypeAccessors$4 = { inlineContent: { configurable: true },defaultType: { configurable: true },edgeCount: { configurable: true } };\n\nContentMatch.parse = function parse (string, nodeTypes) {\n var stream = new TokenStream(string, nodeTypes);\n if (stream.next == null) { return ContentMatch.empty }\n var expr = parseExpr(stream);\n if (stream.next) { stream.err(\"Unexpected trailing text\"); }\n var match = dfa(nfa(expr));\n checkForDeadEnds(match, stream);\n return match\n};\n\n// :: (NodeType) → ?ContentMatch\n// Match a node type, returning a match after that node if\n// successful.\nContentMatch.prototype.matchType = function matchType (type) {\n for (var i = 0; i < this.next.length; i += 2)\n { if (this.next[i] == type) { return this.next[i + 1] } }\n return null\n};\n\n// :: (Fragment, ?number, ?number) → ?ContentMatch\n// Try to match a fragment. Returns the resulting match when\n// successful.\nContentMatch.prototype.matchFragment = function matchFragment (frag, start, end) {\n if ( start === void 0 ) start = 0;\n if ( end === void 0 ) end = frag.childCount;\n\n var cur = this;\n for (var i = start; cur && i < end; i++)\n { cur = cur.matchType(frag.child(i).type); }\n return cur\n};\n\nprototypeAccessors$4.inlineContent.get = function () {\n var first = this.next[0];\n return first ? first.isInline : false\n};\n\n// :: ?NodeType\n// Get the first matching node type at this match position that can\n// be generated.\nprototypeAccessors$4.defaultType.get = function () {\n for (var i = 0; i < this.next.length; i += 2) {\n var type = this.next[i];\n if (!(type.isText || type.hasRequiredAttrs())) { return type }\n }\n};\n\nContentMatch.prototype.compatible = function compatible (other) {\n for (var i = 0; i < this.next.length; i += 2)\n { for (var j = 0; j < other.next.length; j += 2)\n { if (this.next[i] == other.next[j]) { return true } } }\n return false\n};\n\n// :: (Fragment, bool, ?number) → ?Fragment\n// Try to match the given fragment, and if that fails, see if it can\n// be made to match by inserting nodes in front of it. When\n// successful, return a fragment of inserted nodes (which may be\n// empty if nothing had to be inserted). When `toEnd` is true, only\n// return a fragment if the resulting match goes to the end of the\n// content expression.\nContentMatch.prototype.fillBefore = function fillBefore (after, toEnd, startIndex) {\n if ( toEnd === void 0 ) toEnd = false;\n if ( startIndex === void 0 ) startIndex = 0;\n\n var seen = [this];\n function search(match, types) {\n var finished = match.matchFragment(after, startIndex);\n if (finished && (!toEnd || finished.validEnd))\n { return Fragment.from(types.map(function (tp) { return tp.createAndFill(); })) }\n\n for (var i = 0; i < match.next.length; i += 2) {\n var type = match.next[i], next = match.next[i + 1];\n if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) {\n seen.push(next);\n var found = search(next, types.concat(type));\n if (found) { return found }\n }\n }\n }\n\n return search(this, [])\n};\n\n// :: (NodeType) → ?[NodeType]\n// Find a set of wrapping node types that would allow a node of the\n// given type to appear at this position. The result may be empty\n// (when it fits directly) and will be null when no such wrapping\n// exists.\nContentMatch.prototype.findWrapping = function findWrapping (target) {\n for (var i = 0; i < this.wrapCache.length; i += 2)\n { if (this.wrapCache[i] == target) { return this.wrapCache[i + 1] } }\n var computed = this.computeWrapping(target);\n this.wrapCache.push(target, computed);\n return computed\n};\n\nContentMatch.prototype.computeWrapping = function computeWrapping (target) {\n var seen = Object.create(null), active = [{match: this, type: null, via: null}];\n while (active.length) {\n var current = active.shift(), match = current.match;\n if (match.matchType(target)) {\n var result = [];\n for (var obj = current; obj.type; obj = obj.via)\n { result.push(obj.type); }\n return result.reverse()\n }\n for (var i = 0; i < match.next.length; i += 2) {\n var type = match.next[i];\n if (!type.isLeaf && !type.hasRequiredAttrs() && !(type.name in seen) && (!current.type || match.next[i + 1].validEnd)) {\n active.push({match: type.contentMatch, type: type, via: current});\n seen[type.name] = true;\n }\n }\n }\n};\n\n// :: number\n// The number of outgoing edges this node has in the finite\n// automaton that describes the content expression.\nprototypeAccessors$4.edgeCount.get = function () {\n return this.next.length >> 1\n};\n\n// :: (number) → {type: NodeType, next: ContentMatch}\n// Get the _n_​th outgoing edge from this node in the finite\n// automaton that describes the content expression.\nContentMatch.prototype.edge = function edge (n) {\n var i = n << 1;\n if (i >= this.next.length) { throw new RangeError((\"There's no \" + n + \"th edge in this content match\")) }\n return {type: this.next[i], next: this.next[i + 1]}\n};\n\nContentMatch.prototype.toString = function toString () {\n var seen = [];\n function scan(m) {\n seen.push(m);\n for (var i = 1; i < m.next.length; i += 2)\n { if (seen.indexOf(m.next[i]) == -1) { scan(m.next[i]); } }\n }\n scan(this);\n return seen.map(function (m, i) {\n var out = i + (m.validEnd ? \"*\" : \" \") + \" \";\n for (var i$1 = 0; i$1 < m.next.length; i$1 += 2)\n { out += (i$1 ? \", \" : \"\") + m.next[i$1].name + \"->\" + seen.indexOf(m.next[i$1 + 1]); }\n return out\n }).join(\"\\n\")\n};\n\nObject.defineProperties( ContentMatch.prototype, prototypeAccessors$4 );\n\nContentMatch.empty = new ContentMatch(true);\n\nvar TokenStream = function TokenStream(string, nodeTypes) {\n this.string = string;\n this.nodeTypes = nodeTypes;\n this.inline = null;\n this.pos = 0;\n this.tokens = string.split(/\\s*(?=\\b|\\W|$)/);\n if (this.tokens[this.tokens.length - 1] == \"\") { this.tokens.pop(); }\n if (this.tokens[0] == \"\") { this.tokens.shift(); }\n};\n\nvar prototypeAccessors$1$2 = { next: { configurable: true } };\n\nprototypeAccessors$1$2.next.get = function () { return this.tokens[this.pos] };\n\nTokenStream.prototype.eat = function eat (tok) { return this.next == tok && (this.pos++ || true) };\n\nTokenStream.prototype.err = function err (str) { throw new SyntaxError(str + \" (in content expression '\" + this.string + \"')\") };\n\nObject.defineProperties( TokenStream.prototype, prototypeAccessors$1$2 );\n\nfunction parseExpr(stream) {\n var exprs = [];\n do { exprs.push(parseExprSeq(stream)); }\n while (stream.eat(\"|\"))\n return exprs.length == 1 ? exprs[0] : {type: \"choice\", exprs: exprs}\n}\n\nfunction parseExprSeq(stream) {\n var exprs = [];\n do { exprs.push(parseExprSubscript(stream)); }\n while (stream.next && stream.next != \")\" && stream.next != \"|\")\n return exprs.length == 1 ? exprs[0] : {type: \"seq\", exprs: exprs}\n}\n\nfunction parseExprSubscript(stream) {\n var expr = parseExprAtom(stream);\n for (;;) {\n if (stream.eat(\"+\"))\n { expr = {type: \"plus\", expr: expr}; }\n else if (stream.eat(\"*\"))\n { expr = {type: \"star\", expr: expr}; }\n else if (stream.eat(\"?\"))\n { expr = {type: \"opt\", expr: expr}; }\n else if (stream.eat(\"{\"))\n { expr = parseExprRange(stream, expr); }\n else { break }\n }\n return expr\n}\n\nfunction parseNum(stream) {\n if (/\\D/.test(stream.next)) { stream.err(\"Expected number, got '\" + stream.next + \"'\"); }\n var result = Number(stream.next);\n stream.pos++;\n return result\n}\n\nfunction parseExprRange(stream, expr) {\n var min = parseNum(stream), max = min;\n if (stream.eat(\",\")) {\n if (stream.next != \"}\") { max = parseNum(stream); }\n else { max = -1; }\n }\n if (!stream.eat(\"}\")) { stream.err(\"Unclosed braced range\"); }\n return {type: \"range\", min: min, max: max, expr: expr}\n}\n\nfunction resolveName(stream, name) {\n var types = stream.nodeTypes, type = types[name];\n if (type) { return [type] }\n var result = [];\n for (var typeName in types) {\n var type$1 = types[typeName];\n if (type$1.groups.indexOf(name) > -1) { result.push(type$1); }\n }\n if (result.length == 0) { stream.err(\"No node type or group '\" + name + \"' found\"); }\n return result\n}\n\nfunction parseExprAtom(stream) {\n if (stream.eat(\"(\")) {\n var expr = parseExpr(stream);\n if (!stream.eat(\")\")) { stream.err(\"Missing closing paren\"); }\n return expr\n } else if (!/\\W/.test(stream.next)) {\n var exprs = resolveName(stream, stream.next).map(function (type) {\n if (stream.inline == null) { stream.inline = type.isInline; }\n else if (stream.inline != type.isInline) { stream.err(\"Mixing inline and block content\"); }\n return {type: \"name\", value: type}\n });\n stream.pos++;\n return exprs.length == 1 ? exprs[0] : {type: \"choice\", exprs: exprs}\n } else {\n stream.err(\"Unexpected token '\" + stream.next + \"'\");\n }\n}\n\n// The code below helps compile a regular-expression-like language\n// into a deterministic finite automaton. For a good introduction to\n// these concepts, see https://swtch.com/~rsc/regexp/regexp1.html\n\n// : (Object) → [[{term: ?any, to: number}]]\n// Construct an NFA from an expression as returned by the parser. The\n// NFA is represented as an array of states, which are themselves\n// arrays of edges, which are `{term, to}` objects. The first state is\n// the entry state and the last node is the success state.\n//\n// Note that unlike typical NFAs, the edge ordering in this one is\n// significant, in that it is used to contruct filler content when\n// necessary.\nfunction nfa(expr) {\n var nfa = [[]];\n connect(compile(expr, 0), node());\n return nfa\n\n function node() { return nfa.push([]) - 1 }\n function edge(from, to, term) {\n var edge = {term: term, to: to};\n nfa[from].push(edge);\n return edge\n }\n function connect(edges, to) { edges.forEach(function (edge) { return edge.to = to; }); }\n\n function compile(expr, from) {\n if (expr.type == \"choice\") {\n return expr.exprs.reduce(function (out, expr) { return out.concat(compile(expr, from)); }, [])\n } else if (expr.type == \"seq\") {\n for (var i = 0;; i++) {\n var next = compile(expr.exprs[i], from);\n if (i == expr.exprs.length - 1) { return next }\n connect(next, from = node());\n }\n } else if (expr.type == \"star\") {\n var loop = node();\n edge(from, loop);\n connect(compile(expr.expr, loop), loop);\n return [edge(loop)]\n } else if (expr.type == \"plus\") {\n var loop$1 = node();\n connect(compile(expr.expr, from), loop$1);\n connect(compile(expr.expr, loop$1), loop$1);\n return [edge(loop$1)]\n } else if (expr.type == \"opt\") {\n return [edge(from)].concat(compile(expr.expr, from))\n } else if (expr.type == \"range\") {\n var cur = from;\n for (var i$1 = 0; i$1 < expr.min; i$1++) {\n var next$1 = node();\n connect(compile(expr.expr, cur), next$1);\n cur = next$1;\n }\n if (expr.max == -1) {\n connect(compile(expr.expr, cur), cur);\n } else {\n for (var i$2 = expr.min; i$2 < expr.max; i$2++) {\n var next$2 = node();\n edge(cur, next$2);\n connect(compile(expr.expr, cur), next$2);\n cur = next$2;\n }\n }\n return [edge(cur)]\n } else if (expr.type == \"name\") {\n return [edge(from, null, expr.value)]\n }\n }\n}\n\nfunction cmp(a, b) { return b - a }\n\n// Get the set of nodes reachable by null edges from `node`. Omit\n// nodes with only a single null-out-edge, since they may lead to\n// needless duplicated nodes.\nfunction nullFrom(nfa, node) {\n var result = [];\n scan(node);\n return result.sort(cmp)\n\n function scan(node) {\n var edges = nfa[node];\n if (edges.length == 1 && !edges[0].term) { return scan(edges[0].to) }\n result.push(node);\n for (var i = 0; i < edges.length; i++) {\n var ref = edges[i];\n var term = ref.term;\n var to = ref.to;\n if (!term && result.indexOf(to) == -1) { scan(to); }\n }\n }\n}\n\n// : ([[{term: ?any, to: number}]]) → ContentMatch\n// Compiles an NFA as produced by `nfa` into a DFA, modeled as a set\n// of state objects (`ContentMatch` instances) with transitions\n// between them.\nfunction dfa(nfa) {\n var labeled = Object.create(null);\n return explore(nullFrom(nfa, 0))\n\n function explore(states) {\n var out = [];\n states.forEach(function (node) {\n nfa[node].forEach(function (ref) {\n var term = ref.term;\n var to = ref.to;\n\n if (!term) { return }\n var known = out.indexOf(term), set = known > -1 && out[known + 1];\n nullFrom(nfa, to).forEach(function (node) {\n if (!set) { out.push(term, set = []); }\n if (set.indexOf(node) == -1) { set.push(node); }\n });\n });\n });\n var state = labeled[states.join(\",\")] = new ContentMatch(states.indexOf(nfa.length - 1) > -1);\n for (var i = 0; i < out.length; i += 2) {\n var states$1 = out[i + 1].sort(cmp);\n state.next.push(out[i], labeled[states$1.join(\",\")] || explore(states$1));\n }\n return state\n }\n}\n\nfunction checkForDeadEnds(match, stream) {\n for (var i = 0, work = [match]; i < work.length; i++) {\n var state = work[i], dead = !state.validEnd, nodes = [];\n for (var j = 0; j < state.next.length; j += 2) {\n var node = state.next[j], next = state.next[j + 1];\n nodes.push(node.name);\n if (dead && !(node.isText || node.hasRequiredAttrs())) { dead = false; }\n if (work.indexOf(next) == -1) { work.push(next); }\n }\n if (dead) { stream.err(\"Only non-generatable nodes (\" + nodes.join(\", \") + \") in a required position (see https://prosemirror.net/docs/guide/#generatable)\"); }\n }\n}\n\n// For node types where all attrs have a default value (or which don't\n// have any attributes), build up a single reusable default attribute\n// object, and use it for all nodes that don't specify specific\n// attributes.\nfunction defaultAttrs(attrs) {\n var defaults = Object.create(null);\n for (var attrName in attrs) {\n var attr = attrs[attrName];\n if (!attr.hasDefault) { return null }\n defaults[attrName] = attr.default;\n }\n return defaults\n}\n\nfunction computeAttrs(attrs, value) {\n var built = Object.create(null);\n for (var name in attrs) {\n var given = value && value[name];\n if (given === undefined) {\n var attr = attrs[name];\n if (attr.hasDefault) { given = attr.default; }\n else { throw new RangeError(\"No value supplied for attribute \" + name) }\n }\n built[name] = given;\n }\n return built\n}\n\nfunction initAttrs(attrs) {\n var result = Object.create(null);\n if (attrs) { for (var name in attrs) { result[name] = new Attribute(attrs[name]); } }\n return result\n}\n\n// ::- Node types are objects allocated once per `Schema` and used to\n// [tag](#model.Node.type) `Node` instances. They contain information\n// about the node type, such as its name and what kind of node it\n// represents.\nvar NodeType = function NodeType(name, schema, spec) {\n // :: string\n // The name the node type has in this schema.\n this.name = name;\n\n // :: Schema\n // A link back to the `Schema` the node type belongs to.\n this.schema = schema;\n\n // :: NodeSpec\n // The spec that this type is based on\n this.spec = spec;\n\n this.groups = spec.group ? spec.group.split(\" \") : [];\n this.attrs = initAttrs(spec.attrs);\n\n this.defaultAttrs = defaultAttrs(this.attrs);\n\n // :: ContentMatch\n // The starting match of the node type's content expression.\n this.contentMatch = null;\n\n // : ?[MarkType]\n // The set of marks allowed in this node. `null` means all marks\n // are allowed.\n this.markSet = null;\n\n // :: bool\n // True if this node type has inline content.\n this.inlineContent = null;\n\n // :: bool\n // True if this is a block type\n this.isBlock = !(spec.inline || name == \"text\");\n\n // :: bool\n // True if this is the text node type.\n this.isText = name == \"text\";\n};\n\nvar prototypeAccessors$5 = { isInline: { configurable: true },isTextblock: { configurable: true },isLeaf: { configurable: true },isAtom: { configurable: true } };\n\n// :: bool\n// True if this is an inline type.\nprototypeAccessors$5.isInline.get = function () { return !this.isBlock };\n\n// :: bool\n// True if this is a textblock type, a block that contains inline\n// content.\nprototypeAccessors$5.isTextblock.get = function () { return this.isBlock && this.inlineContent };\n\n// :: bool\n// True for node types that allow no content.\nprototypeAccessors$5.isLeaf.get = function () { return this.contentMatch == ContentMatch.empty };\n\n// :: bool\n// True when this node is an atom, i.e. when it does not have\n// directly editable content.\nprototypeAccessors$5.isAtom.get = function () { return this.isLeaf || this.spec.atom };\n\n// :: () → bool\n// Tells you whether this node type has any required attributes.\nNodeType.prototype.hasRequiredAttrs = function hasRequiredAttrs () {\n for (var n in this.attrs) { if (this.attrs[n].isRequired) { return true } }\n return false\n};\n\nNodeType.prototype.compatibleContent = function compatibleContent (other) {\n return this == other || this.contentMatch.compatible(other.contentMatch)\n};\n\nNodeType.prototype.computeAttrs = function computeAttrs$1 (attrs) {\n if (!attrs && this.defaultAttrs) { return this.defaultAttrs }\n else { return computeAttrs(this.attrs, attrs) }\n};\n\n// :: (?Object, ?union, ?[Mark]) → Node\n// Create a `Node` of this type. The given attributes are\n// checked and defaulted (you can pass `null` to use the type's\n// defaults entirely, if no required attributes exist). `content`\n// may be a `Fragment`, a node, an array of nodes, or\n// `null`. Similarly `marks` may be `null` to default to the empty\n// set of marks.\nNodeType.prototype.create = function create (attrs, content, marks) {\n if (this.isText) { throw new Error(\"NodeType.create can't construct text nodes\") }\n return new Node(this, this.computeAttrs(attrs), Fragment.from(content), Mark.setFrom(marks))\n};\n\n// :: (?Object, ?union, ?[Mark]) → Node\n// Like [`create`](#model.NodeType.create), but check the given content\n// against the node type's content restrictions, and throw an error\n// if it doesn't match.\nNodeType.prototype.createChecked = function createChecked (attrs, content, marks) {\n content = Fragment.from(content);\n if (!this.validContent(content))\n { throw new RangeError(\"Invalid content for node \" + this.name) }\n return new Node(this, this.computeAttrs(attrs), content, Mark.setFrom(marks))\n};\n\n// :: (?Object, ?union, ?[Mark]) → ?Node\n// Like [`create`](#model.NodeType.create), but see if it is necessary to\n// add nodes to the start or end of the given fragment to make it\n// fit the node. If no fitting wrapping can be found, return null.\n// Note that, due to the fact that required nodes can always be\n// created, this will always succeed if you pass null or\n// `Fragment.empty` as content.\nNodeType.prototype.createAndFill = function createAndFill (attrs, content, marks) {\n attrs = this.computeAttrs(attrs);\n content = Fragment.from(content);\n if (content.size) {\n var before = this.contentMatch.fillBefore(content);\n if (!before) { return null }\n content = before.append(content);\n }\n var after = this.contentMatch.matchFragment(content).fillBefore(Fragment.empty, true);\n if (!after) { return null }\n return new Node(this, attrs, content.append(after), Mark.setFrom(marks))\n};\n\n// :: (Fragment) → bool\n// Returns true if the given fragment is valid content for this node\n// type with the given attributes.\nNodeType.prototype.validContent = function validContent (content) {\n var result = this.contentMatch.matchFragment(content);\n if (!result || !result.validEnd) { return false }\n for (var i = 0; i < content.childCount; i++)\n { if (!this.allowsMarks(content.child(i).marks)) { return false } }\n return true\n};\n\n// :: (MarkType) → bool\n// Check whether the given mark type is allowed in this node.\nNodeType.prototype.allowsMarkType = function allowsMarkType (markType) {\n return this.markSet == null || this.markSet.indexOf(markType) > -1\n};\n\n// :: ([Mark]) → bool\n// Test whether the given set of marks are allowed in this node.\nNodeType.prototype.allowsMarks = function allowsMarks (marks) {\n if (this.markSet == null) { return true }\n for (var i = 0; i < marks.length; i++) { if (!this.allowsMarkType(marks[i].type)) { return false } }\n return true\n};\n\n// :: ([Mark]) → [Mark]\n// Removes the marks that are not allowed in this node from the given set.\nNodeType.prototype.allowedMarks = function allowedMarks (marks) {\n if (this.markSet == null) { return marks }\n var copy;\n for (var i = 0; i < marks.length; i++) {\n if (!this.allowsMarkType(marks[i].type)) {\n if (!copy) { copy = marks.slice(0, i); }\n } else if (copy) {\n copy.push(marks[i]);\n }\n }\n return !copy ? marks : copy.length ? copy : Mark.empty\n};\n\nNodeType.compile = function compile (nodes, schema) {\n var result = Object.create(null);\n nodes.forEach(function (name, spec) { return result[name] = new NodeType(name, schema, spec); });\n\n var topType = schema.spec.topNode || \"doc\";\n if (!result[topType]) { throw new RangeError(\"Schema is missing its top node type ('\" + topType + \"')\") }\n if (!result.text) { throw new RangeError(\"Every schema needs a 'text' type\") }\n for (var _ in result.text.attrs) { throw new RangeError(\"The text node type should not have attributes\") }\n\n return result\n};\n\nObject.defineProperties( NodeType.prototype, prototypeAccessors$5 );\n\n// Attribute descriptors\n\nvar Attribute = function Attribute(options) {\n this.hasDefault = Object.prototype.hasOwnProperty.call(options, \"default\");\n this.default = options.default;\n};\n\nvar prototypeAccessors$1$3 = { isRequired: { configurable: true } };\n\nprototypeAccessors$1$3.isRequired.get = function () {\n return !this.hasDefault\n};\n\nObject.defineProperties( Attribute.prototype, prototypeAccessors$1$3 );\n\n// Marks\n\n// ::- Like nodes, marks (which are associated with nodes to signify\n// things like emphasis or being part of a link) are\n// [tagged](#model.Mark.type) with type objects, which are\n// instantiated once per `Schema`.\nvar MarkType = function MarkType(name, rank, schema, spec) {\n // :: string\n // The name of the mark type.\n this.name = name;\n\n // :: Schema\n // The schema that this mark type instance is part of.\n this.schema = schema;\n\n // :: MarkSpec\n // The spec on which the type is based.\n this.spec = spec;\n\n this.attrs = initAttrs(spec.attrs);\n\n this.rank = rank;\n this.excluded = null;\n var defaults = defaultAttrs(this.attrs);\n this.instance = defaults && new Mark(this, defaults);\n};\n\n// :: (?Object) → Mark\n// Create a mark of this type. `attrs` may be `null` or an object\n// containing only some of the mark's attributes. The others, if\n// they have defaults, will be added.\nMarkType.prototype.create = function create (attrs) {\n if (!attrs && this.instance) { return this.instance }\n return new Mark(this, computeAttrs(this.attrs, attrs))\n};\n\nMarkType.compile = function compile (marks, schema) {\n var result = Object.create(null), rank = 0;\n marks.forEach(function (name, spec) { return result[name] = new MarkType(name, rank++, schema, spec); });\n return result\n};\n\n// :: ([Mark]) → [Mark]\n// When there is a mark of this type in the given set, a new set\n// without it is returned. Otherwise, the input set is returned.\nMarkType.prototype.removeFromSet = function removeFromSet (set) {\n for (var i = 0; i < set.length; i++) { if (set[i].type == this) {\n set = set.slice(0, i).concat(set.slice(i + 1));\n i--;\n } }\n return set\n};\n\n// :: ([Mark]) → ?Mark\n// Tests whether there is a mark of this type in the given set.\nMarkType.prototype.isInSet = function isInSet (set) {\n for (var i = 0; i < set.length; i++)\n { if (set[i].type == this) { return set[i] } }\n};\n\n// :: (MarkType) → bool\n// Queries whether a given mark type is\n// [excluded](#model.MarkSpec.excludes) by this one.\nMarkType.prototype.excludes = function excludes (other) {\n return this.excluded.indexOf(other) > -1\n};\n\n// SchemaSpec:: interface\n// An object describing a schema, as passed to the [`Schema`](#model.Schema)\n// constructor.\n//\n// nodes:: union, OrderedMap>\n// The node types in this schema. Maps names to\n// [`NodeSpec`](#model.NodeSpec) objects that describe the node type\n// associated with that name. Their order is significant—it\n// determines which [parse rules](#model.NodeSpec.parseDOM) take\n// precedence by default, and which nodes come first in a given\n// [group](#model.NodeSpec.group).\n//\n// marks:: ?union, OrderedMap>\n// The mark types that exist in this schema. The order in which they\n// are provided determines the order in which [mark\n// sets](#model.Mark.addToSet) are sorted and in which [parse\n// rules](#model.MarkSpec.parseDOM) are tried.\n//\n// topNode:: ?string\n// The name of the default top-level node for the schema. Defaults\n// to `\"doc\"`.\n\n// NodeSpec:: interface\n//\n// content:: ?string\n// The content expression for this node, as described in the [schema\n// guide](/docs/guide/#schema.content_expressions). When not given,\n// the node does not allow any content.\n//\n// marks:: ?string\n// The marks that are allowed inside of this node. May be a\n// space-separated string referring to mark names or groups, `\"_\"`\n// to explicitly allow all marks, or `\"\"` to disallow marks. When\n// not given, nodes with inline content default to allowing all\n// marks, other nodes default to not allowing marks.\n//\n// group:: ?string\n// The group or space-separated groups to which this node belongs,\n// which can be referred to in the content expressions for the\n// schema.\n//\n// inline:: ?bool\n// Should be set to true for inline nodes. (Implied for text nodes.)\n//\n// atom:: ?bool\n// Can be set to true to indicate that, though this isn't a [leaf\n// node](#model.NodeType.isLeaf), it doesn't have directly editable\n// content and should be treated as a single unit in the view.\n//\n// attrs:: ?Object\n// The attributes that nodes of this type get.\n//\n// selectable:: ?bool\n// Controls whether nodes of this type can be selected as a [node\n// selection](#state.NodeSelection). Defaults to true for non-text\n// nodes.\n//\n// draggable:: ?bool\n// Determines whether nodes of this type can be dragged without\n// being selected. Defaults to false.\n//\n// code:: ?bool\n// Can be used to indicate that this node contains code, which\n// causes some commands to behave differently.\n//\n// defining:: ?bool\n// Determines whether this node is considered an important parent\n// node during replace operations (such as paste). Non-defining (the\n// default) nodes get dropped when their entire content is replaced,\n// whereas defining nodes persist and wrap the inserted content.\n// Likewise, in _inserted_ content the defining parents of the\n// content are preserved when possible. Typically,\n// non-default-paragraph textblock types, and possibly list items,\n// are marked as defining.\n//\n// isolating:: ?bool\n// When enabled (default is false), the sides of nodes of this type\n// count as boundaries that regular editing operations, like\n// backspacing or lifting, won't cross. An example of a node that\n// should probably have this enabled is a table cell.\n//\n// toDOM:: ?(node: Node) → DOMOutputSpec\n// Defines the default way a node of this type should be serialized\n// to DOM/HTML (as used by\n// [`DOMSerializer.fromSchema`](#model.DOMSerializer^fromSchema)).\n// Should return a DOM node or an [array\n// structure](#model.DOMOutputSpec) that describes one, with an\n// optional number zero (“hole”) in it to indicate where the node's\n// content should be inserted.\n//\n// For text nodes, the default is to create a text DOM node. Though\n// it is possible to create a serializer where text is rendered\n// differently, this is not supported inside the editor, so you\n// shouldn't override that in your text node spec.\n//\n// parseDOM:: ?[ParseRule]\n// Associates DOM parser information with this node, which can be\n// used by [`DOMParser.fromSchema`](#model.DOMParser^fromSchema) to\n// automatically derive a parser. The `node` field in the rules is\n// implied (the name of this node will be filled in automatically).\n// If you supply your own parser, you do not need to also specify\n// parsing rules in your schema.\n//\n// toDebugString:: ?(node: Node) -> string\n// Defines the default way a node of this type should be serialized\n// to a string representation for debugging (e.g. in error messages).\n\n// MarkSpec:: interface\n//\n// attrs:: ?Object\n// The attributes that marks of this type get.\n//\n// inclusive:: ?bool\n// Whether this mark should be active when the cursor is positioned\n// at its end (or at its start when that is also the start of the\n// parent node). Defaults to true.\n//\n// excludes:: ?string\n// Determines which other marks this mark can coexist with. Should\n// be a space-separated strings naming other marks or groups of marks.\n// When a mark is [added](#model.Mark.addToSet) to a set, all marks\n// that it excludes are removed in the process. If the set contains\n// any mark that excludes the new mark but is not, itself, excluded\n// by the new mark, the mark can not be added an the set. You can\n// use the value `\"_\"` to indicate that the mark excludes all\n// marks in the schema.\n//\n// Defaults to only being exclusive with marks of the same type. You\n// can set it to an empty string (or any string not containing the\n// mark's own name) to allow multiple marks of a given type to\n// coexist (as long as they have different attributes).\n//\n// group:: ?string\n// The group or space-separated groups to which this mark belongs.\n//\n// spanning:: ?bool\n// Determines whether marks of this type can span multiple adjacent\n// nodes when serialized to DOM/HTML. Defaults to true.\n//\n// toDOM:: ?(mark: Mark, inline: bool) → DOMOutputSpec\n// Defines the default way marks of this type should be serialized\n// to DOM/HTML. When the resulting spec contains a hole, that is\n// where the marked content is placed. Otherwise, it is appended to\n// the top node.\n//\n// parseDOM:: ?[ParseRule]\n// Associates DOM parser information with this mark (see the\n// corresponding [node spec field](#model.NodeSpec.parseDOM)). The\n// `mark` field in the rules is implied.\n\n// AttributeSpec:: interface\n//\n// Used to [define](#model.NodeSpec.attrs) attributes on nodes or\n// marks.\n//\n// default:: ?any\n// The default value for this attribute, to use when no explicit\n// value is provided. Attributes that have no default must be\n// provided whenever a node or mark of a type that has them is\n// created.\n\n// ::- A document schema. Holds [node](#model.NodeType) and [mark\n// type](#model.MarkType) objects for the nodes and marks that may\n// occur in conforming documents, and provides functionality for\n// creating and deserializing such documents.\nvar Schema = function Schema(spec) {\n // :: SchemaSpec\n // The [spec](#model.SchemaSpec) on which the schema is based,\n // with the added guarantee that its `nodes` and `marks`\n // properties are\n // [`OrderedMap`](https://github.com/marijnh/orderedmap) instances\n // (not raw objects).\n this.spec = {};\n for (var prop in spec) { this.spec[prop] = spec[prop]; }\n this.spec.nodes = OrderedMap.from(spec.nodes);\n this.spec.marks = OrderedMap.from(spec.marks);\n\n // :: Object\n // An object mapping the schema's node names to node type objects.\n this.nodes = NodeType.compile(this.spec.nodes, this);\n\n // :: Object\n // A map from mark names to mark type objects.\n this.marks = MarkType.compile(this.spec.marks, this);\n\n var contentExprCache = Object.create(null);\n for (var prop$1 in this.nodes) {\n if (prop$1 in this.marks)\n { throw new RangeError(prop$1 + \" can not be both a node and a mark\") }\n var type = this.nodes[prop$1], contentExpr = type.spec.content || \"\", markExpr = type.spec.marks;\n type.contentMatch = contentExprCache[contentExpr] ||\n (contentExprCache[contentExpr] = ContentMatch.parse(contentExpr, this.nodes));\n type.inlineContent = type.contentMatch.inlineContent;\n type.markSet = markExpr == \"_\" ? null :\n markExpr ? gatherMarks(this, markExpr.split(\" \")) :\n markExpr == \"\" || !type.inlineContent ? [] : null;\n }\n for (var prop$2 in this.marks) {\n var type$1 = this.marks[prop$2], excl = type$1.spec.excludes;\n type$1.excluded = excl == null ? [type$1] : excl == \"\" ? [] : gatherMarks(this, excl.split(\" \"));\n }\n\n this.nodeFromJSON = this.nodeFromJSON.bind(this);\n this.markFromJSON = this.markFromJSON.bind(this);\n\n // :: NodeType\n // The type of the [default top node](#model.SchemaSpec.topNode)\n // for this schema.\n this.topNodeType = this.nodes[this.spec.topNode || \"doc\"];\n\n // :: Object\n // An object for storing whatever values modules may want to\n // compute and cache per schema. (If you want to store something\n // in it, try to use property names unlikely to clash.)\n this.cached = Object.create(null);\n this.cached.wrappings = Object.create(null);\n};\n\n// :: (union, ?Object, ?union, ?[Mark]) → Node\n// Create a node in this schema. The `type` may be a string or a\n// `NodeType` instance. Attributes will be extended\n// with defaults, `content` may be a `Fragment`,\n// `null`, a `Node`, or an array of nodes.\nSchema.prototype.node = function node (type, attrs, content, marks) {\n if (typeof type == \"string\")\n { type = this.nodeType(type); }\n else if (!(type instanceof NodeType))\n { throw new RangeError(\"Invalid node type: \" + type) }\n else if (type.schema != this)\n { throw new RangeError(\"Node type from different schema used (\" + type.name + \")\") }\n\n return type.createChecked(attrs, content, marks)\n};\n\n// :: (string, ?[Mark]) → Node\n// Create a text node in the schema. Empty text nodes are not\n// allowed.\nSchema.prototype.text = function text (text$1, marks) {\n var type = this.nodes.text;\n return new TextNode(type, type.defaultAttrs, text$1, Mark.setFrom(marks))\n};\n\n// :: (union, ?Object) → Mark\n// Create a mark with the given type and attributes.\nSchema.prototype.mark = function mark (type, attrs) {\n if (typeof type == \"string\") { type = this.marks[type]; }\n return type.create(attrs)\n};\n\n// :: (Object) → Node\n// Deserialize a node from its JSON representation. This method is\n// bound.\nSchema.prototype.nodeFromJSON = function nodeFromJSON (json) {\n return Node.fromJSON(this, json)\n};\n\n// :: (Object) → Mark\n// Deserialize a mark from its JSON representation. This method is\n// bound.\nSchema.prototype.markFromJSON = function markFromJSON (json) {\n return Mark.fromJSON(this, json)\n};\n\nSchema.prototype.nodeType = function nodeType (name) {\n var found = this.nodes[name];\n if (!found) { throw new RangeError(\"Unknown node type: \" + name) }\n return found\n};\n\nfunction gatherMarks(schema, marks) {\n var found = [];\n for (var i = 0; i < marks.length; i++) {\n var name = marks[i], mark = schema.marks[name], ok = mark;\n if (mark) {\n found.push(mark);\n } else {\n for (var prop in schema.marks) {\n var mark$1 = schema.marks[prop];\n if (name == \"_\" || (mark$1.spec.group && mark$1.spec.group.split(\" \").indexOf(name) > -1))\n { found.push(ok = mark$1); }\n }\n }\n if (!ok) { throw new SyntaxError(\"Unknown mark type: '\" + marks[i] + \"'\") }\n }\n return found\n}\n\n// ParseOptions:: interface\n// These are the options recognized by the\n// [`parse`](#model.DOMParser.parse) and\n// [`parseSlice`](#model.DOMParser.parseSlice) methods.\n//\n// preserveWhitespace:: ?union\n// By default, whitespace is collapsed as per HTML's rules. Pass\n// `true` to preserve whitespace, but normalize newlines to\n// spaces, and `\"full\"` to preserve whitespace entirely.\n//\n// findPositions:: ?[{node: dom.Node, offset: number}]\n// When given, the parser will, beside parsing the content,\n// record the document positions of the given DOM positions. It\n// will do so by writing to the objects, adding a `pos` property\n// that holds the document position. DOM positions that are not\n// in the parsed content will not be written to.\n//\n// from:: ?number\n// The child node index to start parsing from.\n//\n// to:: ?number\n// The child node index to stop parsing at.\n//\n// topNode:: ?Node\n// By default, the content is parsed into the schema's default\n// [top node type](#model.Schema.topNodeType). You can pass this\n// option to use the type and attributes from a different node\n// as the top container.\n//\n// topMatch:: ?ContentMatch\n// Provide the starting content match that content parsed into the\n// top node is matched against.\n//\n// context:: ?ResolvedPos\n// A set of additional nodes to count as\n// [context](#model.ParseRule.context) when parsing, above the\n// given [top node](#model.ParseOptions.topNode).\n\n// ParseRule:: interface\n// A value that describes how to parse a given DOM node or inline\n// style as a ProseMirror node or mark.\n//\n// tag:: ?string\n// A CSS selector describing the kind of DOM elements to match. A\n// single rule should have _either_ a `tag` or a `style` property.\n//\n// namespace:: ?string\n// The namespace to match. This should be used with `tag`.\n// Nodes are only matched when the namespace matches or this property\n// is null.\n//\n// style:: ?string\n// A CSS property name to match. When given, this rule matches\n// inline styles that list that property. May also have the form\n// `\"property=value\"`, in which case the rule only matches if the\n// property's value exactly matches the given value. (For more\n// complicated filters, use [`getAttrs`](#model.ParseRule.getAttrs)\n// and return false to indicate that the match failed.) Rules\n// matching styles may only produce [marks](#model.ParseRule.mark),\n// not nodes.\n//\n// priority:: ?number\n// Can be used to change the order in which the parse rules in a\n// schema are tried. Those with higher priority come first. Rules\n// without a priority are counted as having priority 50. This\n// property is only meaningful in a schema—when directly\n// constructing a parser, the order of the rule array is used.\n//\n// consuming:: ?boolean\n// By default, when a rule matches an element or style, no further\n// rules get a chance to match it. By setting this to `false`, you\n// indicate that even when this rule matches, other rules that come\n// after it should also run.\n//\n// context:: ?string\n// When given, restricts this rule to only match when the current\n// context—the parent nodes into which the content is being\n// parsed—matches this expression. Should contain one or more node\n// names or node group names followed by single or double slashes.\n// For example `\"paragraph/\"` means the rule only matches when the\n// parent node is a paragraph, `\"blockquote/paragraph/\"` restricts\n// it to be in a paragraph that is inside a blockquote, and\n// `\"section//\"` matches any position inside a section—a double\n// slash matches any sequence of ancestor nodes. To allow multiple\n// different contexts, they can be separated by a pipe (`|`)\n// character, as in `\"blockquote/|list_item/\"`.\n//\n// node:: ?string\n// The name of the node type to create when this rule matches. Only\n// valid for rules with a `tag` property, not for style rules. Each\n// rule should have one of a `node`, `mark`, or `ignore` property\n// (except when it appears in a [node](#model.NodeSpec.parseDOM) or\n// [mark spec](#model.MarkSpec.parseDOM), in which case the `node`\n// or `mark` property will be derived from its position).\n//\n// mark:: ?string\n// The name of the mark type to wrap the matched content in.\n//\n// ignore:: ?bool\n// When true, ignore content that matches this rule.\n//\n// closeParent:: ?bool\n// When true, finding an element that matches this rule will close\n// the current node.\n//\n// skip:: ?bool\n// When true, ignore the node that matches this rule, but do parse\n// its content.\n//\n// attrs:: ?Object\n// Attributes for the node or mark created by this rule. When\n// `getAttrs` is provided, it takes precedence.\n//\n// getAttrs:: ?(union) → ?union\n// A function used to compute the attributes for the node or mark\n// created by this rule. Can also be used to describe further\n// conditions the DOM element or style must match. When it returns\n// `false`, the rule won't match. When it returns null or undefined,\n// that is interpreted as an empty/default set of attributes.\n//\n// Called with a DOM Element for `tag` rules, and with a string (the\n// style's value) for `style` rules.\n//\n// contentElement:: ?union\n// For `tag` rules that produce non-leaf nodes or marks, by default\n// the content of the DOM element is parsed as content of the mark\n// or node. If the child nodes are in a descendent node, this may be\n// a CSS selector string that the parser must use to find the actual\n// content element, or a function that returns the actual content\n// element to the parser.\n//\n// getContent:: ?(dom.Node, schema: Schema) → Fragment\n// Can be used to override the content of a matched node. When\n// present, instead of parsing the node's child nodes, the result of\n// this function is used.\n//\n// preserveWhitespace:: ?union\n// Controls whether whitespace should be preserved when parsing the\n// content inside the matched element. `false` means whitespace may\n// be collapsed, `true` means that whitespace should be preserved\n// but newlines normalized to spaces, and `\"full\"` means that\n// newlines should also be preserved.\n\n// ::- A DOM parser represents a strategy for parsing DOM content into\n// a ProseMirror document conforming to a given schema. Its behavior\n// is defined by an array of [rules](#model.ParseRule).\nvar DOMParser = function DOMParser(schema, rules) {\n var this$1 = this;\n\n // :: Schema\n // The schema into which the parser parses.\n this.schema = schema;\n // :: [ParseRule]\n // The set of [parse rules](#model.ParseRule) that the parser\n // uses, in order of precedence.\n this.rules = rules;\n this.tags = [];\n this.styles = [];\n\n rules.forEach(function (rule) {\n if (rule.tag) { this$1.tags.push(rule); }\n else if (rule.style) { this$1.styles.push(rule); }\n });\n\n // Only normalize list elements when lists in the schema can't directly contain themselves\n this.normalizeLists = !this.tags.some(function (r) {\n if (!/^(ul|ol)\\b/.test(r.tag) || !r.node) { return false }\n var node = schema.nodes[r.node];\n return node.contentMatch.matchType(node)\n });\n};\n\n// :: (dom.Node, ?ParseOptions) → Node\n// Parse a document from the content of a DOM node.\nDOMParser.prototype.parse = function parse (dom, options) {\n if ( options === void 0 ) options = {};\n\n var context = new ParseContext(this, options, false);\n context.addAll(dom, null, options.from, options.to);\n return context.finish()\n};\n\n// :: (dom.Node, ?ParseOptions) → Slice\n// Parses the content of the given DOM node, like\n// [`parse`](#model.DOMParser.parse), and takes the same set of\n// options. But unlike that method, which produces a whole node,\n// this one returns a slice that is open at the sides, meaning that\n// the schema constraints aren't applied to the start of nodes to\n// the left of the input and the end of nodes at the end.\nDOMParser.prototype.parseSlice = function parseSlice (dom, options) {\n if ( options === void 0 ) options = {};\n\n var context = new ParseContext(this, options, true);\n context.addAll(dom, null, options.from, options.to);\n return Slice.maxOpen(context.finish())\n};\n\nDOMParser.prototype.matchTag = function matchTag (dom, context, after) {\n for (var i = after ? this.tags.indexOf(after) + 1 : 0; i < this.tags.length; i++) {\n var rule = this.tags[i];\n if (matches(dom, rule.tag) &&\n (rule.namespace === undefined || dom.namespaceURI == rule.namespace) &&\n (!rule.context || context.matchesContext(rule.context))) {\n if (rule.getAttrs) {\n var result = rule.getAttrs(dom);\n if (result === false) { continue }\n rule.attrs = result;\n }\n return rule\n }\n }\n};\n\nDOMParser.prototype.matchStyle = function matchStyle (prop, value, context, after) {\n for (var i = after ? this.styles.indexOf(after) + 1 : 0; i < this.styles.length; i++) {\n var rule = this.styles[i];\n if (rule.style.indexOf(prop) != 0 ||\n rule.context && !context.matchesContext(rule.context) ||\n // Test that the style string either precisely matches the prop,\n // or has an '=' sign after the prop, followed by the given\n // value.\n rule.style.length > prop.length &&\n (rule.style.charCodeAt(prop.length) != 61 || rule.style.slice(prop.length + 1) != value))\n { continue }\n if (rule.getAttrs) {\n var result = rule.getAttrs(value);\n if (result === false) { continue }\n rule.attrs = result;\n }\n return rule\n }\n};\n\n// : (Schema) → [ParseRule]\nDOMParser.schemaRules = function schemaRules (schema) {\n var result = [];\n function insert(rule) {\n var priority = rule.priority == null ? 50 : rule.priority, i = 0;\n for (; i < result.length; i++) {\n var next = result[i], nextPriority = next.priority == null ? 50 : next.priority;\n if (nextPriority < priority) { break }\n }\n result.splice(i, 0, rule);\n }\n\n var loop = function ( name ) {\n var rules = schema.marks[name].spec.parseDOM;\n if (rules) { rules.forEach(function (rule) {\n insert(rule = copy(rule));\n rule.mark = name;\n }); }\n };\n\n for (var name in schema.marks) loop( name );\n var loop$1 = function ( name ) {\n var rules$1 = schema.nodes[name$1].spec.parseDOM;\n if (rules$1) { rules$1.forEach(function (rule) {\n insert(rule = copy(rule));\n rule.node = name$1;\n }); }\n };\n\n for (var name$1 in schema.nodes) loop$1();\n return result\n};\n\n// :: (Schema) → DOMParser\n// Construct a DOM parser using the parsing rules listed in a\n// schema's [node specs](#model.NodeSpec.parseDOM), reordered by\n// [priority](#model.ParseRule.priority).\nDOMParser.fromSchema = function fromSchema (schema) {\n return schema.cached.domParser ||\n (schema.cached.domParser = new DOMParser(schema, DOMParser.schemaRules(schema)))\n};\n\n// : Object The block-level tags in HTML5\nvar blockTags = {\n address: true, article: true, aside: true, blockquote: true, canvas: true,\n dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true,\n footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true,\n h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true,\n output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true\n};\n\n// : Object The tags that we normally ignore.\nvar ignoreTags = {\n head: true, noscript: true, object: true, script: true, style: true, title: true\n};\n\n// : Object List tags.\nvar listTags = {ol: true, ul: true};\n\n// Using a bitfield for node context options\nvar OPT_PRESERVE_WS = 1, OPT_PRESERVE_WS_FULL = 2, OPT_OPEN_LEFT = 4;\n\nfunction wsOptionsFor(preserveWhitespace) {\n return (preserveWhitespace ? OPT_PRESERVE_WS : 0) | (preserveWhitespace === \"full\" ? OPT_PRESERVE_WS_FULL : 0)\n}\n\nvar NodeContext = function NodeContext(type, attrs, marks, pendingMarks, solid, match, options) {\n this.type = type;\n this.attrs = attrs;\n this.solid = solid;\n this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch);\n this.options = options;\n this.content = [];\n // Marks applied to this node itself\n this.marks = marks;\n // Marks applied to its children\n this.activeMarks = Mark.none;\n // Marks that can't apply here, but will be used in children if possible\n this.pendingMarks = pendingMarks;\n // Nested Marks with same type\n this.stashMarks = [];\n};\n\nNodeContext.prototype.findWrapping = function findWrapping (node) {\n if (!this.match) {\n if (!this.type) { return [] }\n var fill = this.type.contentMatch.fillBefore(Fragment.from(node));\n if (fill) {\n this.match = this.type.contentMatch.matchFragment(fill);\n } else {\n var start = this.type.contentMatch, wrap;\n if (wrap = start.findWrapping(node.type)) {\n this.match = start;\n return wrap\n } else {\n return null\n }\n }\n }\n return this.match.findWrapping(node.type)\n};\n\nNodeContext.prototype.finish = function finish (openEnd) {\n if (!(this.options & OPT_PRESERVE_WS)) { // Strip trailing whitespace\n var last = this.content[this.content.length - 1], m;\n if (last && last.isText && (m = /[ \\t\\r\\n\\u000c]+$/.exec(last.text))) {\n if (last.text.length == m[0].length) { this.content.pop(); }\n else { this.content[this.content.length - 1] = last.withText(last.text.slice(0, last.text.length - m[0].length)); }\n }\n }\n var content = Fragment.from(this.content);\n if (!openEnd && this.match)\n { content = content.append(this.match.fillBefore(Fragment.empty, true)); }\n return this.type ? this.type.create(this.attrs, content, this.marks) : content\n};\n\nNodeContext.prototype.popFromStashMark = function popFromStashMark (mark) {\n for (var i = this.stashMarks.length - 1; i >= 0; i--)\n { if (mark.eq(this.stashMarks[i])) { return this.stashMarks.splice(i, 1)[0] } }\n};\n\nNodeContext.prototype.applyPending = function applyPending (nextType) {\n for (var i = 0, pending = this.pendingMarks; i < pending.length; i++) {\n var mark = pending[i];\n if ((this.type ? this.type.allowsMarkType(mark.type) : markMayApply(mark.type, nextType)) &&\n !mark.isInSet(this.activeMarks)) {\n this.activeMarks = mark.addToSet(this.activeMarks);\n this.pendingMarks = mark.removeFromSet(this.pendingMarks);\n }\n }\n};\n\nvar ParseContext = function ParseContext(parser, options, open) {\n // : DOMParser The parser we are using.\n this.parser = parser;\n // : Object The options passed to this parse.\n this.options = options;\n this.isOpen = open;\n var topNode = options.topNode, topContext;\n var topOptions = wsOptionsFor(options.preserveWhitespace) | (open ? OPT_OPEN_LEFT : 0);\n if (topNode)\n { topContext = new NodeContext(topNode.type, topNode.attrs, Mark.none, Mark.none, true,\n options.topMatch || topNode.type.contentMatch, topOptions); }\n else if (open)\n { topContext = new NodeContext(null, null, Mark.none, Mark.none, true, null, topOptions); }\n else\n { topContext = new NodeContext(parser.schema.topNodeType, null, Mark.none, Mark.none, true, null, topOptions); }\n this.nodes = [topContext];\n // : [Mark] The current set of marks\n this.open = 0;\n this.find = options.findPositions;\n this.needsBlock = false;\n};\n\nvar prototypeAccessors$6 = { top: { configurable: true },currentPos: { configurable: true } };\n\nprototypeAccessors$6.top.get = function () {\n return this.nodes[this.open]\n};\n\n// : (dom.Node)\n// Add a DOM node to the content. Text is inserted as text node,\n// otherwise, the node is passed to `addElement` or, if it has a\n// `style` attribute, `addElementWithStyles`.\nParseContext.prototype.addDOM = function addDOM (dom) {\n if (dom.nodeType == 3) {\n this.addTextNode(dom);\n } else if (dom.nodeType == 1) {\n var style = dom.getAttribute(\"style\");\n var marks = style ? this.readStyles(parseStyles(style)) : null, top = this.top;\n if (marks != null) { for (var i = 0; i < marks.length; i++) { this.addPendingMark(marks[i]); } }\n this.addElement(dom);\n if (marks != null) { for (var i$1 = 0; i$1 < marks.length; i$1++) { this.removePendingMark(marks[i$1], top); } }\n }\n};\n\nParseContext.prototype.addTextNode = function addTextNode (dom) {\n var value = dom.nodeValue;\n var top = this.top;\n if ((top.type ? top.type.inlineContent : top.content.length && top.content[0].isInline) || /[^ \\t\\r\\n\\u000c]/.test(value)) {\n if (!(top.options & OPT_PRESERVE_WS)) {\n value = value.replace(/[ \\t\\r\\n\\u000c]+/g, \" \");\n // If this starts with whitespace, and there is no node before it, or\n // a hard break, or a text node that ends with whitespace, strip the\n // leading space.\n if (/^[ \\t\\r\\n\\u000c]/.test(value) && this.open == this.nodes.length - 1) {\n var nodeBefore = top.content[top.content.length - 1];\n var domNodeBefore = dom.previousSibling;\n if (!nodeBefore ||\n (domNodeBefore && domNodeBefore.nodeName == 'BR') ||\n (nodeBefore.isText && /[ \\t\\r\\n\\u000c]$/.test(nodeBefore.text)))\n { value = value.slice(1); }\n }\n } else if (!(top.options & OPT_PRESERVE_WS_FULL)) {\n value = value.replace(/\\r?\\n|\\r/g, \" \");\n }\n if (value) { this.insertNode(this.parser.schema.text(value)); }\n this.findInText(dom);\n } else {\n this.findInside(dom);\n }\n};\n\n// : (dom.Element, ?ParseRule)\n// Try to find a handler for the given tag and use that to parse. If\n// none is found, the element's content nodes are added directly.\nParseContext.prototype.addElement = function addElement (dom, matchAfter) {\n var name = dom.nodeName.toLowerCase(), ruleID;\n if (listTags.hasOwnProperty(name) && this.parser.normalizeLists) { normalizeList(dom); }\n var rule = (this.options.ruleFromNode && this.options.ruleFromNode(dom)) ||\n (ruleID = this.parser.matchTag(dom, this, matchAfter));\n if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) {\n this.findInside(dom);\n } else if (!rule || rule.skip || rule.closeParent) {\n if (rule && rule.closeParent) { this.open = Math.max(0, this.open - 1); }\n else if (rule && rule.skip.nodeType) { dom = rule.skip; }\n var sync, top = this.top, oldNeedsBlock = this.needsBlock;\n if (blockTags.hasOwnProperty(name)) {\n sync = true;\n if (!top.type) { this.needsBlock = true; }\n } else if (!dom.firstChild) {\n this.leafFallback(dom);\n return\n }\n this.addAll(dom);\n if (sync) { this.sync(top); }\n this.needsBlock = oldNeedsBlock;\n } else {\n this.addElementByRule(dom, rule, rule.consuming === false ? ruleID : null);\n }\n};\n\n// Called for leaf DOM nodes that would otherwise be ignored\nParseContext.prototype.leafFallback = function leafFallback (dom) {\n if (dom.nodeName == \"BR\" && this.top.type && this.top.type.inlineContent)\n { this.addTextNode(dom.ownerDocument.createTextNode(\"\\n\")); }\n};\n\n// Run any style parser associated with the node's styles. Either\n// return an array of marks, or null to indicate some of the styles\n// had a rule with `ignore` set.\nParseContext.prototype.readStyles = function readStyles (styles) {\n var marks = Mark.none;\n style: for (var i = 0; i < styles.length; i += 2) {\n for (var after = null;;) {\n var rule = this.parser.matchStyle(styles[i], styles[i + 1], this, after);\n if (!rule) { continue style }\n if (rule.ignore) { return null }\n marks = this.parser.schema.marks[rule.mark].create(rule.attrs).addToSet(marks);\n if (rule.consuming === false) { after = rule; }\n else { break }\n }\n }\n return marks\n};\n\n// : (dom.Element, ParseRule) → bool\n// Look up a handler for the given node. If none are found, return\n// false. Otherwise, apply it, use its return value to drive the way\n// the node's content is wrapped, and return true.\nParseContext.prototype.addElementByRule = function addElementByRule (dom, rule, continueAfter) {\n var this$1 = this;\n\n var sync, nodeType, markType, mark;\n if (rule.node) {\n nodeType = this.parser.schema.nodes[rule.node];\n if (!nodeType.isLeaf) {\n sync = this.enter(nodeType, rule.attrs, rule.preserveWhitespace);\n } else if (!this.insertNode(nodeType.create(rule.attrs))) {\n this.leafFallback(dom);\n }\n } else {\n markType = this.parser.schema.marks[rule.mark];\n mark = markType.create(rule.attrs);\n this.addPendingMark(mark);\n }\n var startIn = this.top;\n\n if (nodeType && nodeType.isLeaf) {\n this.findInside(dom);\n } else if (continueAfter) {\n this.addElement(dom, continueAfter);\n } else if (rule.getContent) {\n this.findInside(dom);\n rule.getContent(dom, this.parser.schema).forEach(function (node) { return this$1.insertNode(node); });\n } else {\n var contentDOM = rule.contentElement;\n if (typeof contentDOM == \"string\") { contentDOM = dom.querySelector(contentDOM); }\n else if (typeof contentDOM == \"function\") { contentDOM = contentDOM(dom); }\n if (!contentDOM) { contentDOM = dom; }\n this.findAround(dom, contentDOM, true);\n this.addAll(contentDOM, sync);\n }\n if (sync) { this.sync(startIn); this.open--; }\n if (mark) { this.removePendingMark(mark, startIn); }\n};\n\n// : (dom.Node, ?NodeBuilder, ?number, ?number)\n// Add all child nodes between `startIndex` and `endIndex` (or the\n// whole node, if not given). If `sync` is passed, use it to\n// synchronize after every block element.\nParseContext.prototype.addAll = function addAll (parent, sync, startIndex, endIndex) {\n var index = startIndex || 0;\n for (var dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild,\n end = endIndex == null ? null : parent.childNodes[endIndex];\n dom != end; dom = dom.nextSibling, ++index) {\n this.findAtPoint(parent, index);\n this.addDOM(dom);\n if (sync && blockTags.hasOwnProperty(dom.nodeName.toLowerCase()))\n { this.sync(sync); }\n }\n this.findAtPoint(parent, index);\n};\n\n// Try to find a way to fit the given node type into the current\n// context. May add intermediate wrappers and/or leave non-solid\n// nodes that we're in.\nParseContext.prototype.findPlace = function findPlace (node) {\n var route, sync;\n for (var depth = this.open; depth >= 0; depth--) {\n var cx = this.nodes[depth];\n var found = cx.findWrapping(node);\n if (found && (!route || route.length > found.length)) {\n route = found;\n sync = cx;\n if (!found.length) { break }\n }\n if (cx.solid) { break }\n }\n if (!route) { return false }\n this.sync(sync);\n for (var i = 0; i < route.length; i++)\n { this.enterInner(route[i], null, false); }\n return true\n};\n\n// : (Node) → ?Node\n// Try to insert the given node, adjusting the context when needed.\nParseContext.prototype.insertNode = function insertNode (node) {\n if (node.isInline && this.needsBlock && !this.top.type) {\n var block = this.textblockFromContext();\n if (block) { this.enterInner(block); }\n }\n if (this.findPlace(node)) {\n this.closeExtra();\n var top = this.top;\n top.applyPending(node.type);\n if (top.match) { top.match = top.match.matchType(node.type); }\n var marks = top.activeMarks;\n for (var i = 0; i < node.marks.length; i++)\n { if (!top.type || top.type.allowsMarkType(node.marks[i].type))\n { marks = node.marks[i].addToSet(marks); } }\n top.content.push(node.mark(marks));\n return true\n }\n return false\n};\n\n// : (NodeType, ?Object) → bool\n// Try to start a node of the given type, adjusting the context when\n// necessary.\nParseContext.prototype.enter = function enter (type, attrs, preserveWS) {\n var ok = this.findPlace(type.create(attrs));\n if (ok) { this.enterInner(type, attrs, true, preserveWS); }\n return ok\n};\n\n// Open a node of the given type\nParseContext.prototype.enterInner = function enterInner (type, attrs, solid, preserveWS) {\n this.closeExtra();\n var top = this.top;\n top.applyPending(type);\n top.match = top.match && top.match.matchType(type, attrs);\n var options = preserveWS == null ? top.options & ~OPT_OPEN_LEFT : wsOptionsFor(preserveWS);\n if ((top.options & OPT_OPEN_LEFT) && top.content.length == 0) { options |= OPT_OPEN_LEFT; }\n this.nodes.push(new NodeContext(type, attrs, top.activeMarks, top.pendingMarks, solid, null, options));\n this.open++;\n};\n\n// Make sure all nodes above this.open are finished and added to\n// their parents\nParseContext.prototype.closeExtra = function closeExtra (openEnd) {\n var i = this.nodes.length - 1;\n if (i > this.open) {\n for (; i > this.open; i--) { this.nodes[i - 1].content.push(this.nodes[i].finish(openEnd)); }\n this.nodes.length = this.open + 1;\n }\n};\n\nParseContext.prototype.finish = function finish () {\n this.open = 0;\n this.closeExtra(this.isOpen);\n return this.nodes[0].finish(this.isOpen || this.options.topOpen)\n};\n\nParseContext.prototype.sync = function sync (to) {\n for (var i = this.open; i >= 0; i--) { if (this.nodes[i] == to) {\n this.open = i;\n return\n } }\n};\n\nprototypeAccessors$6.currentPos.get = function () {\n this.closeExtra();\n var pos = 0;\n for (var i = this.open; i >= 0; i--) {\n var content = this.nodes[i].content;\n for (var j = content.length - 1; j >= 0; j--)\n { pos += content[j].nodeSize; }\n if (i) { pos++; }\n }\n return pos\n};\n\nParseContext.prototype.findAtPoint = function findAtPoint (parent, offset) {\n if (this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].node == parent && this.find[i].offset == offset)\n { this.find[i].pos = this.currentPos; }\n } }\n};\n\nParseContext.prototype.findInside = function findInside (parent) {\n if (this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node))\n { this.find[i].pos = this.currentPos; }\n } }\n};\n\nParseContext.prototype.findAround = function findAround (parent, content, before) {\n if (parent != content && this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) {\n var pos = content.compareDocumentPosition(this.find[i].node);\n if (pos & (before ? 2 : 4))\n { this.find[i].pos = this.currentPos; }\n }\n } }\n};\n\nParseContext.prototype.findInText = function findInText (textNode) {\n if (this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].node == textNode)\n { this.find[i].pos = this.currentPos - (textNode.nodeValue.length - this.find[i].offset); }\n } }\n};\n\n// : (string) → bool\n// Determines whether the given [context\n// string](#ParseRule.context) matches this context.\nParseContext.prototype.matchesContext = function matchesContext (context) {\n var this$1 = this;\n\n if (context.indexOf(\"|\") > -1)\n { return context.split(/\\s*\\|\\s*/).some(this.matchesContext, this) }\n\n var parts = context.split(\"/\");\n var option = this.options.context;\n var useRoot = !this.isOpen && (!option || option.parent.type == this.nodes[0].type);\n var minDepth = -(option ? option.depth + 1 : 0) + (useRoot ? 0 : 1);\n var match = function (i, depth) {\n for (; i >= 0; i--) {\n var part = parts[i];\n if (part == \"\") {\n if (i == parts.length - 1 || i == 0) { continue }\n for (; depth >= minDepth; depth--)\n { if (match(i - 1, depth)) { return true } }\n return false\n } else {\n var next = depth > 0 || (depth == 0 && useRoot) ? this$1.nodes[depth].type\n : option && depth >= minDepth ? option.node(depth - minDepth).type\n : null;\n if (!next || (next.name != part && next.groups.indexOf(part) == -1))\n { return false }\n depth--;\n }\n }\n return true\n };\n return match(parts.length - 1, this.open)\n};\n\nParseContext.prototype.textblockFromContext = function textblockFromContext () {\n var $context = this.options.context;\n if ($context) { for (var d = $context.depth; d >= 0; d--) {\n var deflt = $context.node(d).contentMatchAt($context.indexAfter(d)).defaultType;\n if (deflt && deflt.isTextblock && deflt.defaultAttrs) { return deflt }\n } }\n for (var name in this.parser.schema.nodes) {\n var type = this.parser.schema.nodes[name];\n if (type.isTextblock && type.defaultAttrs) { return type }\n }\n};\n\nParseContext.prototype.addPendingMark = function addPendingMark (mark) {\n var found = findSameMarkInSet(mark, this.top.pendingMarks);\n if (found) { this.top.stashMarks.push(found); }\n this.top.pendingMarks = mark.addToSet(this.top.pendingMarks);\n};\n\nParseContext.prototype.removePendingMark = function removePendingMark (mark, upto) {\n for (var depth = this.open; depth >= 0; depth--) {\n var level = this.nodes[depth];\n var found = level.pendingMarks.lastIndexOf(mark);\n if (found > -1) {\n level.pendingMarks = mark.removeFromSet(level.pendingMarks);\n } else {\n level.activeMarks = mark.removeFromSet(level.activeMarks);\n var stashMark = level.popFromStashMark(mark);\n if (stashMark && level.type && level.type.allowsMarkType(stashMark.type))\n { level.activeMarks = stashMark.addToSet(level.activeMarks); }\n }\n if (level == upto) { break }\n }\n};\n\nObject.defineProperties( ParseContext.prototype, prototypeAccessors$6 );\n\n// Kludge to work around directly nested list nodes produced by some\n// tools and allowed by browsers to mean that the nested list is\n// actually part of the list item above it.\nfunction normalizeList(dom) {\n for (var child = dom.firstChild, prevItem = null; child; child = child.nextSibling) {\n var name = child.nodeType == 1 ? child.nodeName.toLowerCase() : null;\n if (name && listTags.hasOwnProperty(name) && prevItem) {\n prevItem.appendChild(child);\n child = prevItem;\n } else if (name == \"li\") {\n prevItem = child;\n } else if (name) {\n prevItem = null;\n }\n }\n}\n\n// Apply a CSS selector.\nfunction matches(dom, selector) {\n return (dom.matches || dom.msMatchesSelector || dom.webkitMatchesSelector || dom.mozMatchesSelector).call(dom, selector)\n}\n\n// : (string) → [string]\n// Tokenize a style attribute into property/value pairs.\nfunction parseStyles(style) {\n var re = /\\s*([\\w-]+)\\s*:\\s*([^;]+)/g, m, result = [];\n while (m = re.exec(style)) { result.push(m[1], m[2].trim()); }\n return result\n}\n\nfunction copy(obj) {\n var copy = {};\n for (var prop in obj) { copy[prop] = obj[prop]; }\n return copy\n}\n\n// Used when finding a mark at the top level of a fragment parse.\n// Checks whether it would be reasonable to apply a given mark type to\n// a given node, by looking at the way the mark occurs in the schema.\nfunction markMayApply(markType, nodeType) {\n var nodes = nodeType.schema.nodes;\n var loop = function ( name ) {\n var parent = nodes[name];\n if (!parent.allowsMarkType(markType)) { return }\n var seen = [], scan = function (match) {\n seen.push(match);\n for (var i = 0; i < match.edgeCount; i++) {\n var ref = match.edge(i);\n var type = ref.type;\n var next = ref.next;\n if (type == nodeType) { return true }\n if (seen.indexOf(next) < 0 && scan(next)) { return true }\n }\n };\n if (scan(parent.contentMatch)) { return { v: true } }\n };\n\n for (var name in nodes) {\n var returned = loop( name );\n\n if ( returned ) return returned.v;\n }\n}\n\nfunction findSameMarkInSet(mark, set) {\n for (var i = 0; i < set.length; i++) {\n if (mark.eq(set[i])) { return set[i] }\n }\n}\n\n// DOMOutputSpec:: interface\n// A description of a DOM structure. Can be either a string, which is\n// interpreted as a text node, a DOM node, which is interpreted as\n// itself, a `{dom: Node, contentDOM: ?Node}` object, or an array.\n//\n// An array describes a DOM element. The first value in the array\n// should be a string—the name of the DOM element, optionally prefixed\n// by a namespace URL and a space. If the second element is plain\n// object, it is interpreted as a set of attributes for the element.\n// Any elements after that (including the 2nd if it's not an attribute\n// object) are interpreted as children of the DOM elements, and must\n// either be valid `DOMOutputSpec` values, or the number zero.\n//\n// The number zero (pronounced “hole”) is used to indicate the place\n// where a node's child nodes should be inserted. If it occurs in an\n// output spec, it should be the only child element in its parent\n// node.\n\n// ::- A DOM serializer knows how to convert ProseMirror nodes and\n// marks of various types to DOM nodes.\nvar DOMSerializer = function DOMSerializer(nodes, marks) {\n // :: Object<(node: Node) → DOMOutputSpec>\n // The node serialization functions.\n this.nodes = nodes || {};\n // :: Object\n // The mark serialization functions.\n this.marks = marks || {};\n};\n\n// :: (Fragment, ?Object) → dom.DocumentFragment\n// Serialize the content of this fragment to a DOM fragment. When\n// not in the browser, the `document` option, containing a DOM\n// document, should be passed so that the serializer can create\n// nodes.\nDOMSerializer.prototype.serializeFragment = function serializeFragment (fragment, options, target) {\n var this$1 = this;\n if ( options === void 0 ) options = {};\n\n if (!target) { target = doc(options).createDocumentFragment(); }\n\n var top = target, active = null;\n fragment.forEach(function (node) {\n if (active || node.marks.length) {\n if (!active) { active = []; }\n var keep = 0, rendered = 0;\n while (keep < active.length && rendered < node.marks.length) {\n var next = node.marks[rendered];\n if (!this$1.marks[next.type.name]) { rendered++; continue }\n if (!next.eq(active[keep]) || next.type.spec.spanning === false) { break }\n keep += 2; rendered++;\n }\n while (keep < active.length) {\n top = active.pop();\n active.pop();\n }\n while (rendered < node.marks.length) {\n var add = node.marks[rendered++];\n var markDOM = this$1.serializeMark(add, node.isInline, options);\n if (markDOM) {\n active.push(add, top);\n top.appendChild(markDOM.dom);\n top = markDOM.contentDOM || markDOM.dom;\n }\n }\n }\n top.appendChild(this$1.serializeNode(node, options));\n });\n\n return target\n};\n\n// :: (Node, ?Object) → dom.Node\n// Serialize this node to a DOM node. This can be useful when you\n// need to serialize a part of a document, as opposed to the whole\n// document. To serialize a whole document, use\n// [`serializeFragment`](#model.DOMSerializer.serializeFragment) on\n// its [content](#model.Node.content).\nDOMSerializer.prototype.serializeNode = function serializeNode (node, options) {\n if ( options === void 0 ) options = {};\n\n var ref =\n DOMSerializer.renderSpec(doc(options), this.nodes[node.type.name](node));\n var dom = ref.dom;\n var contentDOM = ref.contentDOM;\n if (contentDOM) {\n if (node.isLeaf)\n { throw new RangeError(\"Content hole not allowed in a leaf node spec\") }\n if (options.onContent)\n { options.onContent(node, contentDOM, options); }\n else\n { this.serializeFragment(node.content, options, contentDOM); }\n }\n return dom\n};\n\nDOMSerializer.prototype.serializeNodeAndMarks = function serializeNodeAndMarks (node, options) {\n if ( options === void 0 ) options = {};\n\n var dom = this.serializeNode(node, options);\n for (var i = node.marks.length - 1; i >= 0; i--) {\n var wrap = this.serializeMark(node.marks[i], node.isInline, options);\n if (wrap) {\n(wrap.contentDOM || wrap.dom).appendChild(dom);\n dom = wrap.dom;\n }\n }\n return dom\n};\n\nDOMSerializer.prototype.serializeMark = function serializeMark (mark, inline, options) {\n if ( options === void 0 ) options = {};\n\n var toDOM = this.marks[mark.type.name];\n return toDOM && DOMSerializer.renderSpec(doc(options), toDOM(mark, inline))\n};\n\n// :: (dom.Document, DOMOutputSpec) → {dom: dom.Node, contentDOM: ?dom.Node}\n// Render an [output spec](#model.DOMOutputSpec) to a DOM node. If\n// the spec has a hole (zero) in it, `contentDOM` will point at the\n// node with the hole.\nDOMSerializer.renderSpec = function renderSpec (doc, structure, xmlNS) {\n if ( xmlNS === void 0 ) xmlNS = null;\n\n if (typeof structure == \"string\")\n { return {dom: doc.createTextNode(structure)} }\n if (structure.nodeType != null)\n { return {dom: structure} }\n if (structure.dom && structure.dom.nodeType != null)\n { return structure }\n var tagName = structure[0], space = tagName.indexOf(\" \");\n if (space > 0) {\n xmlNS = tagName.slice(0, space);\n tagName = tagName.slice(space + 1);\n }\n var contentDOM = null, dom = xmlNS ? doc.createElementNS(xmlNS, tagName) : doc.createElement(tagName);\n var attrs = structure[1], start = 1;\n if (attrs && typeof attrs == \"object\" && attrs.nodeType == null && !Array.isArray(attrs)) {\n start = 2;\n for (var name in attrs) { if (attrs[name] != null) {\n var space$1 = name.indexOf(\" \");\n if (space$1 > 0) { dom.setAttributeNS(name.slice(0, space$1), name.slice(space$1 + 1), attrs[name]); }\n else { dom.setAttribute(name, attrs[name]); }\n } }\n }\n for (var i = start; i < structure.length; i++) {\n var child = structure[i];\n if (child === 0) {\n if (i < structure.length - 1 || i > start)\n { throw new RangeError(\"Content hole must be the only child of its parent node\") }\n return {dom: dom, contentDOM: dom}\n } else {\n var ref = DOMSerializer.renderSpec(doc, child, xmlNS);\n var inner = ref.dom;\n var innerContent = ref.contentDOM;\n dom.appendChild(inner);\n if (innerContent) {\n if (contentDOM) { throw new RangeError(\"Multiple content holes\") }\n contentDOM = innerContent;\n }\n }\n }\n return {dom: dom, contentDOM: contentDOM}\n};\n\n// :: (Schema) → DOMSerializer\n// Build a serializer using the [`toDOM`](#model.NodeSpec.toDOM)\n// properties in a schema's node and mark specs.\nDOMSerializer.fromSchema = function fromSchema (schema) {\n return schema.cached.domSerializer ||\n (schema.cached.domSerializer = new DOMSerializer(this.nodesFromSchema(schema), this.marksFromSchema(schema)))\n};\n\n// : (Schema) → Object<(node: Node) → DOMOutputSpec>\n// Gather the serializers in a schema's node specs into an object.\n// This can be useful as a base to build a custom serializer from.\nDOMSerializer.nodesFromSchema = function nodesFromSchema (schema) {\n var result = gatherToDOM(schema.nodes);\n if (!result.text) { result.text = function (node) { return node.text; }; }\n return result\n};\n\n// : (Schema) → Object<(mark: Mark) → DOMOutputSpec>\n// Gather the serializers in a schema's mark specs into an object.\nDOMSerializer.marksFromSchema = function marksFromSchema (schema) {\n return gatherToDOM(schema.marks)\n};\n\nfunction gatherToDOM(obj) {\n var result = {};\n for (var name in obj) {\n var toDOM = obj[name].spec.toDOM;\n if (toDOM) { result[name] = toDOM; }\n }\n return result\n}\n\nfunction doc(options) {\n // declare global: window\n return options.document || window.document\n}\n\nexport { ContentMatch, DOMParser, DOMSerializer, Fragment, Mark, MarkType, Node, NodeRange, NodeType, ReplaceError, ResolvedPos, Schema, Slice };\n//# sourceMappingURL=index.es.js.map\n","import { Slice, Fragment, Mark, Node } from 'prosemirror-model';\nimport { ReplaceStep, ReplaceAroundStep, Transform } from 'prosemirror-transform';\n\nvar classesById = Object.create(null);\n\n// ::- Superclass for editor selections. Every selection type should\n// extend this. Should not be instantiated directly.\nvar Selection = function Selection($anchor, $head, ranges) {\n // :: [SelectionRange]\n // The ranges covered by the selection.\n this.ranges = ranges || [new SelectionRange($anchor.min($head), $anchor.max($head))];\n // :: ResolvedPos\n // The resolved anchor of the selection (the side that stays in\n // place when the selection is modified).\n this.$anchor = $anchor;\n // :: ResolvedPos\n // The resolved head of the selection (the side that moves when\n // the selection is modified).\n this.$head = $head;\n};\n\nvar prototypeAccessors = { anchor: { configurable: true },head: { configurable: true },from: { configurable: true },to: { configurable: true },$from: { configurable: true },$to: { configurable: true },empty: { configurable: true } };\n\n// :: number\n// The selection's anchor, as an unresolved position.\nprototypeAccessors.anchor.get = function () { return this.$anchor.pos };\n\n// :: number\n// The selection's head.\nprototypeAccessors.head.get = function () { return this.$head.pos };\n\n// :: number\n// The lower bound of the selection's main range.\nprototypeAccessors.from.get = function () { return this.$from.pos };\n\n// :: number\n// The upper bound of the selection's main range.\nprototypeAccessors.to.get = function () { return this.$to.pos };\n\n// :: ResolvedPos\n// The resolved lowerbound of the selection's main range.\nprototypeAccessors.$from.get = function () {\n return this.ranges[0].$from\n};\n\n// :: ResolvedPos\n// The resolved upper bound of the selection's main range.\nprototypeAccessors.$to.get = function () {\n return this.ranges[0].$to\n};\n\n// :: bool\n// Indicates whether the selection contains any content.\nprototypeAccessors.empty.get = function () {\n var ranges = this.ranges;\n for (var i = 0; i < ranges.length; i++)\n { if (ranges[i].$from.pos != ranges[i].$to.pos) { return false } }\n return true\n};\n\n// eq:: (Selection) → bool\n// Test whether the selection is the same as another selection.\n\n// map:: (doc: Node, mapping: Mappable) → Selection\n// Map this selection through a [mappable](#transform.Mappable) thing. `doc`\n// should be the new document to which we are mapping.\n\n// :: () → Slice\n// Get the content of this selection as a slice.\nSelection.prototype.content = function content () {\n return this.$from.node(0).slice(this.from, this.to, true)\n};\n\n// :: (Transaction, ?Slice)\n// Replace the selection with a slice or, if no slice is given,\n// delete the selection. Will append to the given transaction.\nSelection.prototype.replace = function replace (tr, content) {\n if ( content === void 0 ) content = Slice.empty;\n\n // Put the new selection at the position after the inserted\n // content. When that ended in an inline node, search backwards,\n // to get the position after that node. If not, search forward.\n var lastNode = content.content.lastChild, lastParent = null;\n for (var i = 0; i < content.openEnd; i++) {\n lastParent = lastNode;\n lastNode = lastNode.lastChild;\n }\n\n var mapFrom = tr.steps.length, ranges = this.ranges;\n for (var i$1 = 0; i$1 < ranges.length; i$1++) {\n var ref = ranges[i$1];\n var $from = ref.$from;\n var $to = ref.$to;\n var mapping = tr.mapping.slice(mapFrom);\n tr.replaceRange(mapping.map($from.pos), mapping.map($to.pos), i$1 ? Slice.empty : content);\n if (i$1 == 0)\n { selectionToInsertionEnd(tr, mapFrom, (lastNode ? lastNode.isInline : lastParent && lastParent.isTextblock) ? -1 : 1); }\n }\n};\n\n// :: (Transaction, Node)\n// Replace the selection with the given node, appending the changes\n// to the given transaction.\nSelection.prototype.replaceWith = function replaceWith (tr, node) {\n var mapFrom = tr.steps.length, ranges = this.ranges;\n for (var i = 0; i < ranges.length; i++) {\n var ref = ranges[i];\n var $from = ref.$from;\n var $to = ref.$to;\n var mapping = tr.mapping.slice(mapFrom);\n var from = mapping.map($from.pos), to = mapping.map($to.pos);\n if (i) {\n tr.deleteRange(from, to);\n } else {\n tr.replaceRangeWith(from, to, node);\n selectionToInsertionEnd(tr, mapFrom, node.isInline ? -1 : 1);\n }\n }\n};\n\n// toJSON:: () → Object\n// Convert the selection to a JSON representation. When implementing\n// this for a custom selection class, make sure to give the object a\n// `type` property whose value matches the ID under which you\n// [registered](#state.Selection^jsonID) your class.\n\n// :: (ResolvedPos, number, ?bool) → ?Selection\n// Find a valid cursor or leaf node selection starting at the given\n// position and searching back if `dir` is negative, and forward if\n// positive. When `textOnly` is true, only consider cursor\n// selections. Will return null when no valid selection position is\n// found.\nSelection.findFrom = function findFrom ($pos, dir, textOnly) {\n var inner = $pos.parent.inlineContent ? new TextSelection($pos)\n : findSelectionIn($pos.node(0), $pos.parent, $pos.pos, $pos.index(), dir, textOnly);\n if (inner) { return inner }\n\n for (var depth = $pos.depth - 1; depth >= 0; depth--) {\n var found = dir < 0\n ? findSelectionIn($pos.node(0), $pos.node(depth), $pos.before(depth + 1), $pos.index(depth), dir, textOnly)\n : findSelectionIn($pos.node(0), $pos.node(depth), $pos.after(depth + 1), $pos.index(depth) + 1, dir, textOnly);\n if (found) { return found }\n }\n};\n\n// :: (ResolvedPos, ?number) → Selection\n// Find a valid cursor or leaf node selection near the given\n// position. Searches forward first by default, but if `bias` is\n// negative, it will search backwards first.\nSelection.near = function near ($pos, bias) {\n if ( bias === void 0 ) bias = 1;\n\n return this.findFrom($pos, bias) || this.findFrom($pos, -bias) || new AllSelection($pos.node(0))\n};\n\n// :: (Node) → Selection\n// Find the cursor or leaf node selection closest to the start of\n// the given document. Will return an\n// [`AllSelection`](#state.AllSelection) if no valid position\n// exists.\nSelection.atStart = function atStart (doc) {\n return findSelectionIn(doc, doc, 0, 0, 1) || new AllSelection(doc)\n};\n\n// :: (Node) → Selection\n// Find the cursor or leaf node selection closest to the end of the\n// given document.\nSelection.atEnd = function atEnd (doc) {\n return findSelectionIn(doc, doc, doc.content.size, doc.childCount, -1) || new AllSelection(doc)\n};\n\n// :: (Node, Object) → Selection\n// Deserialize the JSON representation of a selection. Must be\n// implemented for custom classes (as a static class method).\nSelection.fromJSON = function fromJSON (doc, json) {\n if (!json || !json.type) { throw new RangeError(\"Invalid input for Selection.fromJSON\") }\n var cls = classesById[json.type];\n if (!cls) { throw new RangeError((\"No selection type \" + (json.type) + \" defined\")) }\n return cls.fromJSON(doc, json)\n};\n\n// :: (string, constructor)\n// To be able to deserialize selections from JSON, custom selection\n// classes must register themselves with an ID string, so that they\n// can be disambiguated. Try to pick something that's unlikely to\n// clash with classes from other modules.\nSelection.jsonID = function jsonID (id, selectionClass) {\n if (id in classesById) { throw new RangeError(\"Duplicate use of selection JSON ID \" + id) }\n classesById[id] = selectionClass;\n selectionClass.prototype.jsonID = id;\n return selectionClass\n};\n\n// :: () → SelectionBookmark\n// Get a [bookmark](#state.SelectionBookmark) for this selection,\n// which is a value that can be mapped without having access to a\n// current document, and later resolved to a real selection for a\n// given document again. (This is used mostly by the history to\n// track and restore old selections.) The default implementation of\n// this method just converts the selection to a text selection and\n// returns the bookmark for that.\nSelection.prototype.getBookmark = function getBookmark () {\n return TextSelection.between(this.$anchor, this.$head).getBookmark()\n};\n\nObject.defineProperties( Selection.prototype, prototypeAccessors );\n\n// :: bool\n// Controls whether, when a selection of this type is active in the\n// browser, the selected range should be visible to the user. Defaults\n// to `true`.\nSelection.prototype.visible = true;\n\n// SelectionBookmark:: interface\n// A lightweight, document-independent representation of a selection.\n// You can define a custom bookmark type for a custom selection class\n// to make the history handle it well.\n//\n// map:: (mapping: Mapping) → SelectionBookmark\n// Map the bookmark through a set of changes.\n//\n// resolve:: (doc: Node) → Selection\n// Resolve the bookmark to a real selection again. This may need to\n// do some error checking and may fall back to a default (usually\n// [`TextSelection.between`](#state.TextSelection^between)) if\n// mapping made the bookmark invalid.\n\n// ::- Represents a selected range in a document.\nvar SelectionRange = function SelectionRange($from, $to) {\n // :: ResolvedPos\n // The lower bound of the range.\n this.$from = $from;\n // :: ResolvedPos\n // The upper bound of the range.\n this.$to = $to;\n};\n\n// ::- A text selection represents a classical editor selection, with\n// a head (the moving side) and anchor (immobile side), both of which\n// point into textblock nodes. It can be empty (a regular cursor\n// position).\nvar TextSelection = /*@__PURE__*/(function (Selection) {\n function TextSelection($anchor, $head) {\n if ( $head === void 0 ) $head = $anchor;\n\n Selection.call(this, $anchor, $head);\n }\n\n if ( Selection ) TextSelection.__proto__ = Selection;\n TextSelection.prototype = Object.create( Selection && Selection.prototype );\n TextSelection.prototype.constructor = TextSelection;\n\n var prototypeAccessors$1 = { $cursor: { configurable: true } };\n\n // :: ?ResolvedPos\n // Returns a resolved position if this is a cursor selection (an\n // empty text selection), and null otherwise.\n prototypeAccessors$1.$cursor.get = function () { return this.$anchor.pos == this.$head.pos ? this.$head : null };\n\n TextSelection.prototype.map = function map (doc, mapping) {\n var $head = doc.resolve(mapping.map(this.head));\n if (!$head.parent.inlineContent) { return Selection.near($head) }\n var $anchor = doc.resolve(mapping.map(this.anchor));\n return new TextSelection($anchor.parent.inlineContent ? $anchor : $head, $head)\n };\n\n TextSelection.prototype.replace = function replace (tr, content) {\n if ( content === void 0 ) content = Slice.empty;\n\n Selection.prototype.replace.call(this, tr, content);\n if (content == Slice.empty) {\n var marks = this.$from.marksAcross(this.$to);\n if (marks) { tr.ensureMarks(marks); }\n }\n };\n\n TextSelection.prototype.eq = function eq (other) {\n return other instanceof TextSelection && other.anchor == this.anchor && other.head == this.head\n };\n\n TextSelection.prototype.getBookmark = function getBookmark () {\n return new TextBookmark(this.anchor, this.head)\n };\n\n TextSelection.prototype.toJSON = function toJSON () {\n return {type: \"text\", anchor: this.anchor, head: this.head}\n };\n\n TextSelection.fromJSON = function fromJSON (doc, json) {\n if (typeof json.anchor != \"number\" || typeof json.head != \"number\")\n { throw new RangeError(\"Invalid input for TextSelection.fromJSON\") }\n return new TextSelection(doc.resolve(json.anchor), doc.resolve(json.head))\n };\n\n // :: (Node, number, ?number) → TextSelection\n // Create a text selection from non-resolved positions.\n TextSelection.create = function create (doc, anchor, head) {\n if ( head === void 0 ) head = anchor;\n\n var $anchor = doc.resolve(anchor);\n return new this($anchor, head == anchor ? $anchor : doc.resolve(head))\n };\n\n // :: (ResolvedPos, ResolvedPos, ?number) → Selection\n // Return a text selection that spans the given positions or, if\n // they aren't text positions, find a text selection near them.\n // `bias` determines whether the method searches forward (default)\n // or backwards (negative number) first. Will fall back to calling\n // [`Selection.near`](#state.Selection^near) when the document\n // doesn't contain a valid text position.\n TextSelection.between = function between ($anchor, $head, bias) {\n var dPos = $anchor.pos - $head.pos;\n if (!bias || dPos) { bias = dPos >= 0 ? 1 : -1; }\n if (!$head.parent.inlineContent) {\n var found = Selection.findFrom($head, bias, true) || Selection.findFrom($head, -bias, true);\n if (found) { $head = found.$head; }\n else { return Selection.near($head, bias) }\n }\n if (!$anchor.parent.inlineContent) {\n if (dPos == 0) {\n $anchor = $head;\n } else {\n $anchor = (Selection.findFrom($anchor, -bias, true) || Selection.findFrom($anchor, bias, true)).$anchor;\n if (($anchor.pos < $head.pos) != (dPos < 0)) { $anchor = $head; }\n }\n }\n return new TextSelection($anchor, $head)\n };\n\n Object.defineProperties( TextSelection.prototype, prototypeAccessors$1 );\n\n return TextSelection;\n}(Selection));\n\nSelection.jsonID(\"text\", TextSelection);\n\nvar TextBookmark = function TextBookmark(anchor, head) {\n this.anchor = anchor;\n this.head = head;\n};\nTextBookmark.prototype.map = function map (mapping) {\n return new TextBookmark(mapping.map(this.anchor), mapping.map(this.head))\n};\nTextBookmark.prototype.resolve = function resolve (doc) {\n return TextSelection.between(doc.resolve(this.anchor), doc.resolve(this.head))\n};\n\n// ::- A node selection is a selection that points at a single node.\n// All nodes marked [selectable](#model.NodeSpec.selectable) can be\n// the target of a node selection. In such a selection, `from` and\n// `to` point directly before and after the selected node, `anchor`\n// equals `from`, and `head` equals `to`..\nvar NodeSelection = /*@__PURE__*/(function (Selection) {\n function NodeSelection($pos) {\n var node = $pos.nodeAfter;\n var $end = $pos.node(0).resolve($pos.pos + node.nodeSize);\n Selection.call(this, $pos, $end);\n // :: Node The selected node.\n this.node = node;\n }\n\n if ( Selection ) NodeSelection.__proto__ = Selection;\n NodeSelection.prototype = Object.create( Selection && Selection.prototype );\n NodeSelection.prototype.constructor = NodeSelection;\n\n NodeSelection.prototype.map = function map (doc, mapping) {\n var ref = mapping.mapResult(this.anchor);\n var deleted = ref.deleted;\n var pos = ref.pos;\n var $pos = doc.resolve(pos);\n if (deleted) { return Selection.near($pos) }\n return new NodeSelection($pos)\n };\n\n NodeSelection.prototype.content = function content () {\n return new Slice(Fragment.from(this.node), 0, 0)\n };\n\n NodeSelection.prototype.eq = function eq (other) {\n return other instanceof NodeSelection && other.anchor == this.anchor\n };\n\n NodeSelection.prototype.toJSON = function toJSON () {\n return {type: \"node\", anchor: this.anchor}\n };\n\n NodeSelection.prototype.getBookmark = function getBookmark () { return new NodeBookmark(this.anchor) };\n\n NodeSelection.fromJSON = function fromJSON (doc, json) {\n if (typeof json.anchor != \"number\")\n { throw new RangeError(\"Invalid input for NodeSelection.fromJSON\") }\n return new NodeSelection(doc.resolve(json.anchor))\n };\n\n // :: (Node, number) → NodeSelection\n // Create a node selection from non-resolved positions.\n NodeSelection.create = function create (doc, from) {\n return new this(doc.resolve(from))\n };\n\n // :: (Node) → bool\n // Determines whether the given node may be selected as a node\n // selection.\n NodeSelection.isSelectable = function isSelectable (node) {\n return !node.isText && node.type.spec.selectable !== false\n };\n\n return NodeSelection;\n}(Selection));\n\nNodeSelection.prototype.visible = false;\n\nSelection.jsonID(\"node\", NodeSelection);\n\nvar NodeBookmark = function NodeBookmark(anchor) {\n this.anchor = anchor;\n};\nNodeBookmark.prototype.map = function map (mapping) {\n var ref = mapping.mapResult(this.anchor);\n var deleted = ref.deleted;\n var pos = ref.pos;\n return deleted ? new TextBookmark(pos, pos) : new NodeBookmark(pos)\n};\nNodeBookmark.prototype.resolve = function resolve (doc) {\n var $pos = doc.resolve(this.anchor), node = $pos.nodeAfter;\n if (node && NodeSelection.isSelectable(node)) { return new NodeSelection($pos) }\n return Selection.near($pos)\n};\n\n// ::- A selection type that represents selecting the whole document\n// (which can not necessarily be expressed with a text selection, when\n// there are for example leaf block nodes at the start or end of the\n// document).\nvar AllSelection = /*@__PURE__*/(function (Selection) {\n function AllSelection(doc) {\n Selection.call(this, doc.resolve(0), doc.resolve(doc.content.size));\n }\n\n if ( Selection ) AllSelection.__proto__ = Selection;\n AllSelection.prototype = Object.create( Selection && Selection.prototype );\n AllSelection.prototype.constructor = AllSelection;\n\n AllSelection.prototype.replace = function replace (tr, content) {\n if ( content === void 0 ) content = Slice.empty;\n\n if (content == Slice.empty) {\n tr.delete(0, tr.doc.content.size);\n var sel = Selection.atStart(tr.doc);\n if (!sel.eq(tr.selection)) { tr.setSelection(sel); }\n } else {\n Selection.prototype.replace.call(this, tr, content);\n }\n };\n\n AllSelection.prototype.toJSON = function toJSON () { return {type: \"all\"} };\n\n AllSelection.fromJSON = function fromJSON (doc) { return new AllSelection(doc) };\n\n AllSelection.prototype.map = function map (doc) { return new AllSelection(doc) };\n\n AllSelection.prototype.eq = function eq (other) { return other instanceof AllSelection };\n\n AllSelection.prototype.getBookmark = function getBookmark () { return AllBookmark };\n\n return AllSelection;\n}(Selection));\n\nSelection.jsonID(\"all\", AllSelection);\n\nvar AllBookmark = {\n map: function map() { return this },\n resolve: function resolve(doc) { return new AllSelection(doc) }\n};\n\n// FIXME we'll need some awareness of text direction when scanning for selections\n\n// Try to find a selection inside the given node. `pos` points at the\n// position where the search starts. When `text` is true, only return\n// text selections.\nfunction findSelectionIn(doc, node, pos, index, dir, text) {\n if (node.inlineContent) { return TextSelection.create(doc, pos) }\n for (var i = index - (dir > 0 ? 0 : 1); dir > 0 ? i < node.childCount : i >= 0; i += dir) {\n var child = node.child(i);\n if (!child.isAtom) {\n var inner = findSelectionIn(doc, child, pos + dir, dir < 0 ? child.childCount : 0, dir, text);\n if (inner) { return inner }\n } else if (!text && NodeSelection.isSelectable(child)) {\n return NodeSelection.create(doc, pos - (dir < 0 ? child.nodeSize : 0))\n }\n pos += child.nodeSize * dir;\n }\n}\n\nfunction selectionToInsertionEnd(tr, startLen, bias) {\n var last = tr.steps.length - 1;\n if (last < startLen) { return }\n var step = tr.steps[last];\n if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) { return }\n var map = tr.mapping.maps[last], end;\n map.forEach(function (_from, _to, _newFrom, newTo) { if (end == null) { end = newTo; } });\n tr.setSelection(Selection.near(tr.doc.resolve(end), bias));\n}\n\nvar UPDATED_SEL = 1, UPDATED_MARKS = 2, UPDATED_SCROLL = 4;\n\n// ::- An editor state transaction, which can be applied to a state to\n// create an updated state. Use\n// [`EditorState.tr`](#state.EditorState.tr) to create an instance.\n//\n// Transactions track changes to the document (they are a subclass of\n// [`Transform`](#transform.Transform)), but also other state changes,\n// like selection updates and adjustments of the set of [stored\n// marks](#state.EditorState.storedMarks). In addition, you can store\n// metadata properties in a transaction, which are extra pieces of\n// information that client code or plugins can use to describe what a\n// transacion represents, so that they can update their [own\n// state](#state.StateField) accordingly.\n//\n// The [editor view](#view.EditorView) uses a few metadata properties:\n// it will attach a property `\"pointer\"` with the value `true` to\n// selection transactions directly caused by mouse or touch input, and\n// a `\"uiEvent\"` property of that may be `\"paste\"`, `\"cut\"`, or `\"drop\"`.\nvar Transaction = /*@__PURE__*/(function (Transform) {\n function Transaction(state) {\n Transform.call(this, state.doc);\n // :: number\n // The timestamp associated with this transaction, in the same\n // format as `Date.now()`.\n this.time = Date.now();\n this.curSelection = state.selection;\n // The step count for which the current selection is valid.\n this.curSelectionFor = 0;\n // :: ?[Mark]\n // The stored marks set by this transaction, if any.\n this.storedMarks = state.storedMarks;\n // Bitfield to track which aspects of the state were updated by\n // this transaction.\n this.updated = 0;\n // Object used to store metadata properties for the transaction.\n this.meta = Object.create(null);\n }\n\n if ( Transform ) Transaction.__proto__ = Transform;\n Transaction.prototype = Object.create( Transform && Transform.prototype );\n Transaction.prototype.constructor = Transaction;\n\n var prototypeAccessors = { selection: { configurable: true },selectionSet: { configurable: true },storedMarksSet: { configurable: true },isGeneric: { configurable: true },scrolledIntoView: { configurable: true } };\n\n // :: Selection\n // The transaction's current selection. This defaults to the editor\n // selection [mapped](#state.Selection.map) through the steps in the\n // transaction, but can be overwritten with\n // [`setSelection`](#state.Transaction.setSelection).\n prototypeAccessors.selection.get = function () {\n if (this.curSelectionFor < this.steps.length) {\n this.curSelection = this.curSelection.map(this.doc, this.mapping.slice(this.curSelectionFor));\n this.curSelectionFor = this.steps.length;\n }\n return this.curSelection\n };\n\n // :: (Selection) → Transaction\n // Update the transaction's current selection. Will determine the\n // selection that the editor gets when the transaction is applied.\n Transaction.prototype.setSelection = function setSelection (selection) {\n if (selection.$from.doc != this.doc)\n { throw new RangeError(\"Selection passed to setSelection must point at the current document\") }\n this.curSelection = selection;\n this.curSelectionFor = this.steps.length;\n this.updated = (this.updated | UPDATED_SEL) & ~UPDATED_MARKS;\n this.storedMarks = null;\n return this\n };\n\n // :: bool\n // Whether the selection was explicitly updated by this transaction.\n prototypeAccessors.selectionSet.get = function () {\n return (this.updated & UPDATED_SEL) > 0\n };\n\n // :: (?[Mark]) → Transaction\n // Set the current stored marks.\n Transaction.prototype.setStoredMarks = function setStoredMarks (marks) {\n this.storedMarks = marks;\n this.updated |= UPDATED_MARKS;\n return this\n };\n\n // :: ([Mark]) → Transaction\n // Make sure the current stored marks or, if that is null, the marks\n // at the selection, match the given set of marks. Does nothing if\n // this is already the case.\n Transaction.prototype.ensureMarks = function ensureMarks (marks) {\n if (!Mark.sameSet(this.storedMarks || this.selection.$from.marks(), marks))\n { this.setStoredMarks(marks); }\n return this\n };\n\n // :: (Mark) → Transaction\n // Add a mark to the set of stored marks.\n Transaction.prototype.addStoredMark = function addStoredMark (mark) {\n return this.ensureMarks(mark.addToSet(this.storedMarks || this.selection.$head.marks()))\n };\n\n // :: (union) → Transaction\n // Remove a mark or mark type from the set of stored marks.\n Transaction.prototype.removeStoredMark = function removeStoredMark (mark) {\n return this.ensureMarks(mark.removeFromSet(this.storedMarks || this.selection.$head.marks()))\n };\n\n // :: bool\n // Whether the stored marks were explicitly set for this transaction.\n prototypeAccessors.storedMarksSet.get = function () {\n return (this.updated & UPDATED_MARKS) > 0\n };\n\n Transaction.prototype.addStep = function addStep (step, doc) {\n Transform.prototype.addStep.call(this, step, doc);\n this.updated = this.updated & ~UPDATED_MARKS;\n this.storedMarks = null;\n };\n\n // :: (number) → Transaction\n // Update the timestamp for the transaction.\n Transaction.prototype.setTime = function setTime (time) {\n this.time = time;\n return this\n };\n\n // :: (Slice) → Transaction\n // Replace the current selection with the given slice.\n Transaction.prototype.replaceSelection = function replaceSelection (slice) {\n this.selection.replace(this, slice);\n return this\n };\n\n // :: (Node, ?bool) → Transaction\n // Replace the selection with the given node. When `inheritMarks` is\n // true and the content is inline, it inherits the marks from the\n // place where it is inserted.\n Transaction.prototype.replaceSelectionWith = function replaceSelectionWith (node, inheritMarks) {\n var selection = this.selection;\n if (inheritMarks !== false)\n { node = node.mark(this.storedMarks || (selection.empty ? selection.$from.marks() : (selection.$from.marksAcross(selection.$to) || Mark.none))); }\n selection.replaceWith(this, node);\n return this\n };\n\n // :: () → Transaction\n // Delete the selection.\n Transaction.prototype.deleteSelection = function deleteSelection () {\n this.selection.replace(this);\n return this\n };\n\n // :: (string, from: ?number, to: ?number) → Transaction\n // Replace the given range, or the selection if no range is given,\n // with a text node containing the given string.\n Transaction.prototype.insertText = function insertText (text, from, to) {\n if ( to === void 0 ) to = from;\n\n var schema = this.doc.type.schema;\n if (from == null) {\n if (!text) { return this.deleteSelection() }\n return this.replaceSelectionWith(schema.text(text), true)\n } else {\n if (!text) { return this.deleteRange(from, to) }\n var marks = this.storedMarks;\n if (!marks) {\n var $from = this.doc.resolve(from);\n marks = to == from ? $from.marks() : $from.marksAcross(this.doc.resolve(to));\n }\n this.replaceRangeWith(from, to, schema.text(text, marks));\n if (!this.selection.empty) { this.setSelection(Selection.near(this.selection.$to)); }\n return this\n }\n };\n\n // :: (union, any) → Transaction\n // Store a metadata property in this transaction, keyed either by\n // name or by plugin.\n Transaction.prototype.setMeta = function setMeta (key, value) {\n this.meta[typeof key == \"string\" ? key : key.key] = value;\n return this\n };\n\n // :: (union) → any\n // Retrieve a metadata property for a given name or plugin.\n Transaction.prototype.getMeta = function getMeta (key) {\n return this.meta[typeof key == \"string\" ? key : key.key]\n };\n\n // :: bool\n // Returns true if this transaction doesn't contain any metadata,\n // and can thus safely be extended.\n prototypeAccessors.isGeneric.get = function () {\n for (var _ in this.meta) { return false }\n return true\n };\n\n // :: () → Transaction\n // Indicate that the editor should scroll the selection into view\n // when updated to the state produced by this transaction.\n Transaction.prototype.scrollIntoView = function scrollIntoView () {\n this.updated |= UPDATED_SCROLL;\n return this\n };\n\n prototypeAccessors.scrolledIntoView.get = function () {\n return (this.updated & UPDATED_SCROLL) > 0\n };\n\n Object.defineProperties( Transaction.prototype, prototypeAccessors );\n\n return Transaction;\n}(Transform));\n\nfunction bind(f, self) {\n return !self || !f ? f : f.bind(self)\n}\n\nvar FieldDesc = function FieldDesc(name, desc, self) {\n this.name = name;\n this.init = bind(desc.init, self);\n this.apply = bind(desc.apply, self);\n};\n\nvar baseFields = [\n new FieldDesc(\"doc\", {\n init: function init(config) { return config.doc || config.schema.topNodeType.createAndFill() },\n apply: function apply(tr) { return tr.doc }\n }),\n\n new FieldDesc(\"selection\", {\n init: function init(config, instance) { return config.selection || Selection.atStart(instance.doc) },\n apply: function apply(tr) { return tr.selection }\n }),\n\n new FieldDesc(\"storedMarks\", {\n init: function init(config) { return config.storedMarks || null },\n apply: function apply(tr, _marks, _old, state) { return state.selection.$cursor ? tr.storedMarks : null }\n }),\n\n new FieldDesc(\"scrollToSelection\", {\n init: function init() { return 0 },\n apply: function apply(tr, prev) { return tr.scrolledIntoView ? prev + 1 : prev }\n })\n];\n\n// Object wrapping the part of a state object that stays the same\n// across transactions. Stored in the state's `config` property.\nvar Configuration = function Configuration(schema, plugins) {\n var this$1 = this;\n\n this.schema = schema;\n this.fields = baseFields.concat();\n this.plugins = [];\n this.pluginsByKey = Object.create(null);\n if (plugins) { plugins.forEach(function (plugin) {\n if (this$1.pluginsByKey[plugin.key])\n { throw new RangeError(\"Adding different instances of a keyed plugin (\" + plugin.key + \")\") }\n this$1.plugins.push(plugin);\n this$1.pluginsByKey[plugin.key] = plugin;\n if (plugin.spec.state)\n { this$1.fields.push(new FieldDesc(plugin.key, plugin.spec.state, plugin)); }\n }); }\n};\n\n// ::- The state of a ProseMirror editor is represented by an object\n// of this type. A state is a persistent data structure—it isn't\n// updated, but rather a new state value is computed from an old one\n// using the [`apply`](#state.EditorState.apply) method.\n//\n// A state holds a number of built-in fields, and plugins can\n// [define](#state.PluginSpec.state) additional fields.\nvar EditorState = function EditorState(config) {\n this.config = config;\n};\n\nvar prototypeAccessors$1 = { schema: { configurable: true },plugins: { configurable: true },tr: { configurable: true } };\n\n// doc:: Node\n// The current document.\n\n// selection:: Selection\n// The selection.\n\n// storedMarks:: ?[Mark]\n// A set of marks to apply to the next input. Will be null when\n// no explicit marks have been set.\n\n// :: Schema\n// The schema of the state's document.\nprototypeAccessors$1.schema.get = function () {\n return this.config.schema\n};\n\n// :: [Plugin]\n// The plugins that are active in this state.\nprototypeAccessors$1.plugins.get = function () {\n return this.config.plugins\n};\n\n// :: (Transaction) → EditorState\n// Apply the given transaction to produce a new state.\nEditorState.prototype.apply = function apply (tr) {\n return this.applyTransaction(tr).state\n};\n\n// : (Transaction) → bool\nEditorState.prototype.filterTransaction = function filterTransaction (tr, ignore) {\n if ( ignore === void 0 ) ignore = -1;\n\n for (var i = 0; i < this.config.plugins.length; i++) { if (i != ignore) {\n var plugin = this.config.plugins[i];\n if (plugin.spec.filterTransaction && !plugin.spec.filterTransaction.call(plugin, tr, this))\n { return false }\n } }\n return true\n};\n\n// :: (Transaction) → {state: EditorState, transactions: [Transaction]}\n// Verbose variant of [`apply`](#state.EditorState.apply) that\n// returns the precise transactions that were applied (which might\n// be influenced by the [transaction\n// hooks](#state.PluginSpec.filterTransaction) of\n// plugins) along with the new state.\nEditorState.prototype.applyTransaction = function applyTransaction (rootTr) {\n if (!this.filterTransaction(rootTr)) { return {state: this, transactions: []} }\n\n var trs = [rootTr], newState = this.applyInner(rootTr), seen = null;\n // This loop repeatedly gives plugins a chance to respond to\n // transactions as new transactions are added, making sure to only\n // pass the transactions the plugin did not see before.\n for (;;) {\n var haveNew = false;\n for (var i = 0; i < this.config.plugins.length; i++) {\n var plugin = this.config.plugins[i];\n if (plugin.spec.appendTransaction) {\n var n = seen ? seen[i].n : 0, oldState = seen ? seen[i].state : this;\n var tr = n < trs.length &&\n plugin.spec.appendTransaction.call(plugin, n ? trs.slice(n) : trs, oldState, newState);\n if (tr && newState.filterTransaction(tr, i)) {\n tr.setMeta(\"appendedTransaction\", rootTr);\n if (!seen) {\n seen = [];\n for (var j = 0; j < this.config.plugins.length; j++)\n { seen.push(j < i ? {state: newState, n: trs.length} : {state: this, n: 0}); }\n }\n trs.push(tr);\n newState = newState.applyInner(tr);\n haveNew = true;\n }\n if (seen) { seen[i] = {state: newState, n: trs.length}; }\n }\n }\n if (!haveNew) { return {state: newState, transactions: trs} }\n }\n};\n\n// : (Transaction) → EditorState\nEditorState.prototype.applyInner = function applyInner (tr) {\n if (!tr.before.eq(this.doc)) { throw new RangeError(\"Applying a mismatched transaction\") }\n var newInstance = new EditorState(this.config), fields = this.config.fields;\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n newInstance[field.name] = field.apply(tr, this[field.name], this, newInstance);\n }\n for (var i$1 = 0; i$1 < applyListeners.length; i$1++) { applyListeners[i$1](this, tr, newInstance); }\n return newInstance\n};\n\n// :: Transaction\n// Start a [transaction](#state.Transaction) from this state.\nprototypeAccessors$1.tr.get = function () { return new Transaction(this) };\n\n// :: (Object) → EditorState\n// Create a new state.\n//\n// config::- Configuration options. Must contain `schema` or `doc` (or both).\n//\n// schema:: ?Schema\n// The schema to use (only relevant if no `doc` is specified).\n//\n// doc:: ?Node\n// The starting document.\n//\n// selection:: ?Selection\n// A valid selection in the document.\n//\n// storedMarks:: ?[Mark]\n// The initial set of [stored marks](#state.EditorState.storedMarks).\n//\n// plugins:: ?[Plugin]\n// The plugins that should be active in this state.\nEditorState.create = function create (config) {\n var $config = new Configuration(config.doc ? config.doc.type.schema : config.schema, config.plugins);\n var instance = new EditorState($config);\n for (var i = 0; i < $config.fields.length; i++)\n { instance[$config.fields[i].name] = $config.fields[i].init(config, instance); }\n return instance\n};\n\n// :: (Object) → EditorState\n// Create a new state based on this one, but with an adjusted set of\n// active plugins. State fields that exist in both sets of plugins\n// are kept unchanged. Those that no longer exist are dropped, and\n// those that are new are initialized using their\n// [`init`](#state.StateField.init) method, passing in the new\n// configuration object..\n//\n// config::- configuration options\n//\n// plugins:: [Plugin]\n// New set of active plugins.\nEditorState.prototype.reconfigure = function reconfigure (config) {\n var $config = new Configuration(this.schema, config.plugins);\n var fields = $config.fields, instance = new EditorState($config);\n for (var i = 0; i < fields.length; i++) {\n var name = fields[i].name;\n instance[name] = this.hasOwnProperty(name) ? this[name] : fields[i].init(config, instance);\n }\n return instance\n};\n\n// :: (?union, string, number>) → Object\n// Serialize this state to JSON. If you want to serialize the state\n// of plugins, pass an object mapping property names to use in the\n// resulting JSON object to plugin objects. The argument may also be\n// a string or number, in which case it is ignored, to support the\n// way `JSON.stringify` calls `toString` methods.\nEditorState.prototype.toJSON = function toJSON (pluginFields) {\n var result = {doc: this.doc.toJSON(), selection: this.selection.toJSON()};\n if (this.storedMarks) { result.storedMarks = this.storedMarks.map(function (m) { return m.toJSON(); }); }\n if (pluginFields && typeof pluginFields == 'object') { for (var prop in pluginFields) {\n if (prop == \"doc\" || prop == \"selection\")\n { throw new RangeError(\"The JSON fields `doc` and `selection` are reserved\") }\n var plugin = pluginFields[prop], state = plugin.spec.state;\n if (state && state.toJSON) { result[prop] = state.toJSON.call(plugin, this[plugin.key]); }\n } }\n return result\n};\n\n// :: (Object, Object, ?Object) → EditorState\n// Deserialize a JSON representation of a state. `config` should\n// have at least a `schema` field, and should contain array of\n// plugins to initialize the state with. `pluginFields` can be used\n// to deserialize the state of plugins, by associating plugin\n// instances with the property names they use in the JSON object.\n//\n// config::- configuration options\n//\n// schema:: Schema\n// The schema to use.\n//\n// plugins:: ?[Plugin]\n// The set of active plugins.\nEditorState.fromJSON = function fromJSON (config, json, pluginFields) {\n if (!json) { throw new RangeError(\"Invalid input for EditorState.fromJSON\") }\n if (!config.schema) { throw new RangeError(\"Required config field 'schema' missing\") }\n var $config = new Configuration(config.schema, config.plugins);\n var instance = new EditorState($config);\n $config.fields.forEach(function (field) {\n if (field.name == \"doc\") {\n instance.doc = Node.fromJSON(config.schema, json.doc);\n } else if (field.name == \"selection\") {\n instance.selection = Selection.fromJSON(instance.doc, json.selection);\n } else if (field.name == \"storedMarks\") {\n if (json.storedMarks) { instance.storedMarks = json.storedMarks.map(config.schema.markFromJSON); }\n } else {\n if (pluginFields) { for (var prop in pluginFields) {\n var plugin = pluginFields[prop], state = plugin.spec.state;\n if (plugin.key == field.name && state && state.fromJSON &&\n Object.prototype.hasOwnProperty.call(json, prop)) {\n // This field belongs to a plugin mapped to a JSON field, read it from there.\n instance[field.name] = state.fromJSON.call(plugin, config, json[prop], instance);\n return\n }\n } }\n instance[field.name] = field.init(config, instance);\n }\n });\n return instance\n};\n\n// Kludge to allow the view to track mappings between different\n// instances of a state.\n//\n// FIXME this is no longer needed as of prosemirror-view 1.9.0,\n// though due to backwards-compat we should probably keep it around\n// for a while (if only as a no-op)\nEditorState.addApplyListener = function addApplyListener (f) {\n applyListeners.push(f);\n};\nEditorState.removeApplyListener = function removeApplyListener (f) {\n var found = applyListeners.indexOf(f);\n if (found > -1) { applyListeners.splice(found, 1); }\n};\n\nObject.defineProperties( EditorState.prototype, prototypeAccessors$1 );\n\nvar applyListeners = [];\n\n// PluginSpec:: interface\n//\n// This is the type passed to the [`Plugin`](#state.Plugin)\n// constructor. It provides a definition for a plugin.\n//\n// props:: ?EditorProps\n// The [view props](#view.EditorProps) added by this plugin. Props\n// that are functions will be bound to have the plugin instance as\n// their `this` binding.\n//\n// state:: ?StateField\n// Allows a plugin to define a [state field](#state.StateField), an\n// extra slot in the state object in which it can keep its own data.\n//\n// key:: ?PluginKey\n// Can be used to make this a keyed plugin. You can have only one\n// plugin with a given key in a given state, but it is possible to\n// access the plugin's configuration and state through the key,\n// without having access to the plugin instance object.\n//\n// view:: ?(EditorView) → Object\n// When the plugin needs to interact with the editor view, or\n// set something up in the DOM, use this field. The function\n// will be called when the plugin's state is associated with an\n// editor view.\n//\n// return::-\n// Should return an object with the following optional\n// properties:\n//\n// update:: ?(view: EditorView, prevState: EditorState)\n// Called whenever the view's state is updated.\n//\n// destroy:: ?()\n// Called when the view is destroyed or receives a state\n// with different plugins.\n//\n// filterTransaction:: ?(Transaction, EditorState) → bool\n// When present, this will be called before a transaction is\n// applied by the state, allowing the plugin to cancel it (by\n// returning false).\n//\n// appendTransaction:: ?(transactions: [Transaction], oldState: EditorState, newState: EditorState) → ?Transaction\n// Allows the plugin to append another transaction to be applied\n// after the given array of transactions. When another plugin\n// appends a transaction after this was called, it is called again\n// with the new state and new transactions—but only the new\n// transactions, i.e. it won't be passed transactions that it\n// already saw.\n\nfunction bindProps(obj, self, target) {\n for (var prop in obj) {\n var val = obj[prop];\n if (val instanceof Function) { val = val.bind(self); }\n else if (prop == \"handleDOMEvents\") { val = bindProps(val, self, {}); }\n target[prop] = val;\n }\n return target\n}\n\n// ::- Plugins bundle functionality that can be added to an editor.\n// They are part of the [editor state](#state.EditorState) and\n// may influence that state and the view that contains it.\nvar Plugin = function Plugin(spec) {\n // :: EditorProps\n // The [props](#view.EditorProps) exported by this plugin.\n this.props = {};\n if (spec.props) { bindProps(spec.props, this, this.props); }\n // :: Object\n // The plugin's [spec object](#state.PluginSpec).\n this.spec = spec;\n this.key = spec.key ? spec.key.key : createKey(\"plugin\");\n};\n\n// :: (EditorState) → any\n// Extract the plugin's state field from an editor state.\nPlugin.prototype.getState = function getState (state) { return state[this.key] };\n\n// StateField:: interface\n// A plugin spec may provide a state field (under its\n// [`state`](#state.PluginSpec.state) property) of this type, which\n// describes the state it wants to keep. Functions provided here are\n// always called with the plugin instance as their `this` binding.\n//\n// init:: (config: Object, instance: EditorState) → T\n// Initialize the value of the field. `config` will be the object\n// passed to [`EditorState.create`](#state.EditorState^create). Note\n// that `instance` is a half-initialized state instance, and will\n// not have values for plugin fields initialized after this one.\n//\n// apply:: (tr: Transaction, value: T, oldState: EditorState, newState: EditorState) → T\n// Apply the given transaction to this state field, producing a new\n// field value. Note that the `newState` argument is again a partially\n// constructed state does not yet contain the state from plugins\n// coming after this one.\n//\n// toJSON:: ?(value: T) → *\n// Convert this field to JSON. Optional, can be left off to disable\n// JSON serialization for the field.\n//\n// fromJSON:: ?(config: Object, value: *, state: EditorState) → T\n// Deserialize the JSON representation of this field. Note that the\n// `state` argument is again a half-initialized state.\n\nvar keys = Object.create(null);\n\nfunction createKey(name) {\n if (name in keys) { return name + \"$\" + ++keys[name] }\n keys[name] = 0;\n return name + \"$\"\n}\n\n// ::- A key is used to [tag](#state.PluginSpec.key)\n// plugins in a way that makes it possible to find them, given an\n// editor state. Assigning a key does mean only one plugin of that\n// type can be active in a state.\nvar PluginKey = function PluginKey(name) {\nif ( name === void 0 ) name = \"key\";\n this.key = createKey(name); };\n\n// :: (EditorState) → ?Plugin\n// Get the active plugin with this key, if any, from an editor\n// state.\nPluginKey.prototype.get = function get (state) { return state.config.pluginsByKey[this.key] };\n\n// :: (EditorState) → ?any\n// Get the plugin's state from an editor state.\nPluginKey.prototype.getState = function getState (state) { return state[this.key] };\n\nexport { AllSelection, EditorState, NodeSelection, Plugin, PluginKey, Selection, SelectionRange, TextSelection, Transaction };\n//# sourceMappingURL=index.es.js.map\n","import { liftTarget, canJoin, joinPoint, canSplit, ReplaceAroundStep, findWrapping } from 'prosemirror-transform';\nimport { Fragment, Slice } from 'prosemirror-model';\nimport { NodeSelection, Selection, TextSelection, AllSelection } from 'prosemirror-state';\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Delete the selection, if there is one.\nfunction deleteSelection(state, dispatch) {\n if (state.selection.empty) { return false }\n if (dispatch) { dispatch(state.tr.deleteSelection().scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// If the selection is empty and at the start of a textblock, try to\n// reduce the distance between that block and the one before it—if\n// there's a block directly before it that can be joined, join them.\n// If not, try to move the selected block closer to the next one in\n// the document structure by lifting it out of its parent or moving it\n// into a parent of the previous block. Will use the view for accurate\n// (bidi-aware) start-of-textblock detection if given.\nfunction joinBackward(state, dispatch, view) {\n var ref = state.selection;\n var $cursor = ref.$cursor;\n if (!$cursor || (view ? !view.endOfTextblock(\"backward\", state)\n : $cursor.parentOffset > 0))\n { return false }\n\n var $cut = findCutBefore($cursor);\n\n // If there is no node before this, try to lift\n if (!$cut) {\n var range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null) { return false }\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n }\n\n var before = $cut.nodeBefore;\n // Apply the joining algorithm\n if (!before.type.spec.isolating && deleteBarrier(state, $cut, dispatch))\n { return true }\n\n // If the node below has no content and the node above is\n // selectable, delete the node below and select the one above.\n if ($cursor.parent.content.size == 0 &&\n (textblockAt(before, \"end\") || NodeSelection.isSelectable(before))) {\n if (dispatch) {\n var tr = state.tr.deleteRange($cursor.before(), $cursor.after());\n tr.setSelection(textblockAt(before, \"end\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos, -1)), -1)\n : NodeSelection.create(tr.doc, $cut.pos - before.nodeSize));\n dispatch(tr.scrollIntoView());\n }\n return true\n }\n\n // If the node before is an atom, delete it\n if (before.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch) { dispatch(state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView()); }\n return true\n }\n\n return false\n}\n\nfunction textblockAt(node, side) {\n for (; node; node = (side == \"start\" ? node.firstChild : node.lastChild))\n { if (node.isTextblock) { return true } }\n return false\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// When the selection is empty and at the start of a textblock, select\n// the node before that textblock, if possible. This is intended to be\n// bound to keys like backspace, after\n// [`joinBackward`](#commands.joinBackward) or other deleting\n// commands, as a fall-back behavior when the schema doesn't allow\n// deletion at the selected point.\nfunction selectNodeBackward(state, dispatch, view) {\n var ref = state.selection;\n var $head = ref.$head;\n var empty = ref.empty;\n var $cut = $head;\n if (!empty) { return false }\n\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"backward\", state) : $head.parentOffset > 0) { return false }\n $cut = findCutBefore($head);\n }\n var node = $cut && $cut.nodeBefore;\n if (!node || !NodeSelection.isSelectable(node)) { return false }\n if (dispatch)\n { dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView()); }\n return true\n}\n\nfunction findCutBefore($pos) {\n if (!$pos.parent.type.spec.isolating) { for (var i = $pos.depth - 1; i >= 0; i--) {\n if ($pos.index(i) > 0) { return $pos.doc.resolve($pos.before(i + 1)) }\n if ($pos.node(i).type.spec.isolating) { break }\n } }\n return null\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// If the selection is empty and the cursor is at the end of a\n// textblock, try to reduce or remove the boundary between that block\n// and the one after it, either by joining them or by moving the other\n// block closer to this one in the tree structure. Will use the view\n// for accurate start-of-textblock detection if given.\nfunction joinForward(state, dispatch, view) {\n var ref = state.selection;\n var $cursor = ref.$cursor;\n if (!$cursor || (view ? !view.endOfTextblock(\"forward\", state)\n : $cursor.parentOffset < $cursor.parent.content.size))\n { return false }\n\n var $cut = findCutAfter($cursor);\n\n // If there is no node after this, there's nothing to do\n if (!$cut) { return false }\n\n var after = $cut.nodeAfter;\n // Try the joining algorithm\n if (deleteBarrier(state, $cut, dispatch)) { return true }\n\n // If the node above has no content and the node below is\n // selectable, delete the node above and select the one below.\n if ($cursor.parent.content.size == 0 &&\n (textblockAt(after, \"start\") || NodeSelection.isSelectable(after))) {\n if (dispatch) {\n var tr = state.tr.deleteRange($cursor.before(), $cursor.after());\n tr.setSelection(textblockAt(after, \"start\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos)), 1)\n : NodeSelection.create(tr.doc, tr.mapping.map($cut.pos)));\n dispatch(tr.scrollIntoView());\n }\n return true\n }\n\n // If the next node is an atom, delete it\n if (after.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch) { dispatch(state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView()); }\n return true\n }\n\n return false\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// When the selection is empty and at the end of a textblock, select\n// the node coming after that textblock, if possible. This is intended\n// to be bound to keys like delete, after\n// [`joinForward`](#commands.joinForward) and similar deleting\n// commands, to provide a fall-back behavior when the schema doesn't\n// allow deletion at the selected point.\nfunction selectNodeForward(state, dispatch, view) {\n var ref = state.selection;\n var $head = ref.$head;\n var empty = ref.empty;\n var $cut = $head;\n if (!empty) { return false }\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"forward\", state) : $head.parentOffset < $head.parent.content.size)\n { return false }\n $cut = findCutAfter($head);\n }\n var node = $cut && $cut.nodeAfter;\n if (!node || !NodeSelection.isSelectable(node)) { return false }\n if (dispatch)\n { dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos)).scrollIntoView()); }\n return true\n}\n\nfunction findCutAfter($pos) {\n if (!$pos.parent.type.spec.isolating) { for (var i = $pos.depth - 1; i >= 0; i--) {\n var parent = $pos.node(i);\n if ($pos.index(i) + 1 < parent.childCount) { return $pos.doc.resolve($pos.after(i + 1)) }\n if (parent.type.spec.isolating) { break }\n } }\n return null\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Join the selected block or, if there is a text selection, the\n// closest ancestor block of the selection that can be joined, with\n// the sibling above it.\nfunction joinUp(state, dispatch) {\n var sel = state.selection, nodeSel = sel instanceof NodeSelection, point;\n if (nodeSel) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.from)) { return false }\n point = sel.from;\n } else {\n point = joinPoint(state.doc, sel.from, -1);\n if (point == null) { return false }\n }\n if (dispatch) {\n var tr = state.tr.join(point);\n if (nodeSel) { tr.setSelection(NodeSelection.create(tr.doc, point - state.doc.resolve(point).nodeBefore.nodeSize)); }\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Join the selected block, or the closest ancestor of the selection\n// that can be joined, with the sibling after it.\nfunction joinDown(state, dispatch) {\n var sel = state.selection, point;\n if (sel instanceof NodeSelection) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.to)) { return false }\n point = sel.to;\n } else {\n point = joinPoint(state.doc, sel.to, 1);\n if (point == null) { return false }\n }\n if (dispatch)\n { dispatch(state.tr.join(point).scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Lift the selected block, or the closest ancestor block of the\n// selection that can be lifted, out of its parent node.\nfunction lift(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to), target = range && liftTarget(range);\n if (target == null) { return false }\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// If the selection is in a node whose type has a truthy\n// [`code`](#model.NodeSpec.code) property in its spec, replace the\n// selection with a newline character.\nfunction newlineInCode(state, dispatch) {\n var ref = state.selection;\n var $head = ref.$head;\n var $anchor = ref.$anchor;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) { return false }\n if (dispatch) { dispatch(state.tr.insertText(\"\\n\").scrollIntoView()); }\n return true\n}\n\nfunction defaultBlockAt(match) {\n for (var i = 0; i < match.edgeCount; i++) {\n var ref = match.edge(i);\n var type = ref.type;\n if (type.isTextblock && !type.hasRequiredAttrs()) { return type }\n }\n return null\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// When the selection is in a node with a truthy\n// [`code`](#model.NodeSpec.code) property in its spec, create a\n// default block after the code block, and move the cursor there.\nfunction exitCode(state, dispatch) {\n var ref = state.selection;\n var $head = ref.$head;\n var $anchor = ref.$anchor;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) { return false }\n var above = $head.node(-1), after = $head.indexAfter(-1), type = defaultBlockAt(above.contentMatchAt(after));\n if (!above.canReplaceWith(after, after, type)) { return false }\n if (dispatch) {\n var pos = $head.after(), tr = state.tr.replaceWith(pos, pos, type.createAndFill());\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// If a block node is selected, create an empty paragraph before (if\n// it is its parent's first child) or after it.\nfunction createParagraphNear(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n if ($from.parent.inlineContent || $to.parent.inlineContent) { return false }\n var type = defaultBlockAt($from.parent.contentMatchAt($to.indexAfter()));\n if (!type || !type.isTextblock) { return false }\n if (dispatch) {\n var side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos;\n var tr = state.tr.insert(side, type.createAndFill());\n tr.setSelection(TextSelection.create(tr.doc, side + 1));\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// If the cursor is in an empty textblock that can be lifted, lift the\n// block.\nfunction liftEmptyBlock(state, dispatch) {\n var ref = state.selection;\n var $cursor = ref.$cursor;\n if (!$cursor || $cursor.parent.content.size) { return false }\n if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) {\n var before = $cursor.before();\n if (canSplit(state.doc, before)) {\n if (dispatch) { dispatch(state.tr.split(before).scrollIntoView()); }\n return true\n }\n }\n var range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null) { return false }\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Split the parent block of the selection. If the selection is a text\n// selection, also delete its content.\nfunction splitBlock(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n if (state.selection instanceof NodeSelection && state.selection.node.isBlock) {\n if (!$from.parentOffset || !canSplit(state.doc, $from.pos)) { return false }\n if (dispatch) { dispatch(state.tr.split($from.pos).scrollIntoView()); }\n return true\n }\n\n if (!$from.parent.isBlock) { return false }\n\n if (dispatch) {\n var atEnd = $to.parentOffset == $to.parent.content.size;\n var tr = state.tr;\n if (state.selection instanceof TextSelection) { tr.deleteSelection(); }\n var deflt = $from.depth == 0 ? null : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)));\n var types = atEnd && deflt ? [{type: deflt}] : null;\n var can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types);\n if (!types && !can && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt && [{type: deflt}])) {\n types = [{type: deflt}];\n can = true;\n }\n if (can) {\n tr.split(tr.mapping.map($from.pos), 1, types);\n if (!atEnd && !$from.parentOffset && $from.parent.type != deflt &&\n $from.node(-1).canReplace($from.index(-1), $from.indexAfter(-1), Fragment.from([deflt.create(), $from.parent])))\n { tr.setNodeMarkup(tr.mapping.map($from.before()), deflt); }\n }\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Acts like [`splitBlock`](#commands.splitBlock), but without\n// resetting the set of active marks at the cursor.\nfunction splitBlockKeepMarks(state, dispatch) {\n return splitBlock(state, dispatch && (function (tr) {\n var marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n if (marks) { tr.ensureMarks(marks); }\n dispatch(tr);\n }))\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Move the selection to the node wrapping the current selection, if\n// any. (Will not select the document node.)\nfunction selectParentNode(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var to = ref.to;\n var pos;\n var same = $from.sharedDepth(to);\n if (same == 0) { return false }\n pos = $from.before(same);\n if (dispatch) { dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos))); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Select the whole document.\nfunction selectAll(state, dispatch) {\n if (dispatch) { dispatch(state.tr.setSelection(new AllSelection(state.doc))); }\n return true\n}\n\nfunction joinMaybeClear(state, $pos, dispatch) {\n var before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index();\n if (!before || !after || !before.type.compatibleContent(after.type)) { return false }\n if (!before.content.size && $pos.parent.canReplace(index - 1, index)) {\n if (dispatch) { dispatch(state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView()); }\n return true\n }\n if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || canJoin(state.doc, $pos.pos)))\n { return false }\n if (dispatch)\n { dispatch(state.tr\n .clearIncompatible($pos.pos, before.type, before.contentMatchAt(before.childCount))\n .join($pos.pos)\n .scrollIntoView()); }\n return true\n}\n\nfunction deleteBarrier(state, $cut, dispatch) {\n var before = $cut.nodeBefore, after = $cut.nodeAfter, conn, match;\n if (before.type.spec.isolating || after.type.spec.isolating) { return false }\n if (joinMaybeClear(state, $cut, dispatch)) { return true }\n\n var canDelAfter = $cut.parent.canReplace($cut.index(), $cut.index() + 1);\n if (canDelAfter &&\n (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) &&\n match.matchType(conn[0] || after.type).validEnd) {\n if (dispatch) {\n var end = $cut.pos + after.nodeSize, wrap = Fragment.empty;\n for (var i = conn.length - 1; i >= 0; i--)\n { wrap = Fragment.from(conn[i].create(null, wrap)); }\n wrap = Fragment.from(before.copy(wrap));\n var tr = state.tr.step(new ReplaceAroundStep($cut.pos - 1, end, $cut.pos, end, new Slice(wrap, 1, 0), conn.length, true));\n var joinAt = end + 2 * conn.length;\n if (canJoin(tr.doc, joinAt)) { tr.join(joinAt); }\n dispatch(tr.scrollIntoView());\n }\n return true\n }\n\n var selAfter = Selection.findFrom($cut, 1);\n var range = selAfter && selAfter.$from.blockRange(selAfter.$to), target = range && liftTarget(range);\n if (target != null && target >= $cut.depth) {\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n }\n\n if (canDelAfter && after.isTextblock && textblockAt(before, \"end\")) {\n var at = before, wrap$1 = [];\n for (;;) {\n wrap$1.push(at);\n if (at.isTextblock) { break }\n at = at.lastChild;\n }\n if (at.canReplace(at.childCount, at.childCount, after.content)) {\n if (dispatch) {\n var end$1 = Fragment.empty;\n for (var i$1 = wrap$1.length - 1; i$1 >= 0; i$1--) { end$1 = Fragment.from(wrap$1[i$1].copy(end$1)); }\n var tr$1 = state.tr.step(new ReplaceAroundStep($cut.pos - wrap$1.length, $cut.pos + after.nodeSize,\n $cut.pos + 1, $cut.pos + after.nodeSize - 1,\n new Slice(end$1, wrap$1.length, 0), 0, true));\n dispatch(tr$1.scrollIntoView());\n }\n return true\n }\n }\n\n return false\n}\n\n// Parameterized commands\n\n// :: (NodeType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Wrap the selection in a node of the given type with the given\n// attributes.\nfunction wrapIn(nodeType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to), wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping) { return false }\n if (dispatch) { dispatch(state.tr.wrap(range, wrapping).scrollIntoView()); }\n return true\n }\n}\n\n// :: (NodeType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Returns a command that tries to set the selected textblocks to the\n// given node type with the given attributes.\nfunction setBlockType(nodeType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var from = ref.from;\n var to = ref.to;\n var applicable = false;\n state.doc.nodesBetween(from, to, function (node, pos) {\n if (applicable) { return false }\n if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) { return }\n if (node.type == nodeType) {\n applicable = true;\n } else {\n var $pos = state.doc.resolve(pos), index = $pos.index();\n applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n }\n });\n if (!applicable) { return false }\n if (dispatch) { dispatch(state.tr.setBlockType(from, to, nodeType, attrs).scrollIntoView()); }\n return true\n }\n}\n\nfunction markApplies(doc, ranges, type) {\n var loop = function ( i ) {\n var ref = ranges[i];\n var $from = ref.$from;\n var $to = ref.$to;\n var can = $from.depth == 0 ? doc.type.allowsMarkType(type) : false;\n doc.nodesBetween($from.pos, $to.pos, function (node) {\n if (can) { return false }\n can = node.inlineContent && node.type.allowsMarkType(type);\n });\n if (can) { return { v: true } }\n };\n\n for (var i = 0; i < ranges.length; i++) {\n var returned = loop( i );\n\n if ( returned ) return returned.v;\n }\n return false\n}\n\n// :: (MarkType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Create a command function that toggles the given mark with the\n// given attributes. Will return `false` when the current selection\n// doesn't support that mark. This will remove the mark if any marks\n// of that type exist in the selection, or add it otherwise. If the\n// selection is empty, this applies to the [stored\n// marks](#state.EditorState.storedMarks) instead of a range of the\n// document.\nfunction toggleMark(markType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var empty = ref.empty;\n var $cursor = ref.$cursor;\n var ranges = ref.ranges;\n if ((empty && !$cursor) || !markApplies(state.doc, ranges, markType)) { return false }\n if (dispatch) {\n if ($cursor) {\n if (markType.isInSet(state.storedMarks || $cursor.marks()))\n { dispatch(state.tr.removeStoredMark(markType)); }\n else\n { dispatch(state.tr.addStoredMark(markType.create(attrs))); }\n } else {\n var has = false, tr = state.tr;\n for (var i = 0; !has && i < ranges.length; i++) {\n var ref$1 = ranges[i];\n var $from = ref$1.$from;\n var $to = ref$1.$to;\n has = state.doc.rangeHasMark($from.pos, $to.pos, markType);\n }\n for (var i$1 = 0; i$1 < ranges.length; i$1++) {\n var ref$2 = ranges[i$1];\n var $from$1 = ref$2.$from;\n var $to$1 = ref$2.$to;\n if (has) {\n tr.removeMark($from$1.pos, $to$1.pos, markType);\n } else {\n var from = $from$1.pos, to = $to$1.pos, start = $from$1.nodeAfter, end = $to$1.nodeBefore;\n var spaceStart = start && start.isText ? /^\\s*/.exec(start.text)[0].length : 0;\n var spaceEnd = end && end.isText ? /\\s*$/.exec(end.text)[0].length : 0;\n if (from + spaceStart < to) { from += spaceStart; to -= spaceEnd; }\n tr.addMark(from, to, markType.create(attrs));\n }\n }\n dispatch(tr.scrollIntoView());\n }\n }\n return true\n }\n}\n\nfunction wrapDispatchForJoin(dispatch, isJoinable) {\n return function (tr) {\n if (!tr.isGeneric) { return dispatch(tr) }\n\n var ranges = [];\n for (var i = 0; i < tr.mapping.maps.length; i++) {\n var map = tr.mapping.maps[i];\n for (var j = 0; j < ranges.length; j++)\n { ranges[j] = map.map(ranges[j]); }\n map.forEach(function (_s, _e, from, to) { return ranges.push(from, to); });\n }\n\n // Figure out which joinable points exist inside those ranges,\n // by checking all node boundaries in their parent nodes.\n var joinable = [];\n for (var i$1 = 0; i$1 < ranges.length; i$1 += 2) {\n var from = ranges[i$1], to = ranges[i$1 + 1];\n var $from = tr.doc.resolve(from), depth = $from.sharedDepth(to), parent = $from.node(depth);\n for (var index = $from.indexAfter(depth), pos = $from.after(depth + 1); pos <= to; ++index) {\n var after = parent.maybeChild(index);\n if (!after) { break }\n if (index && joinable.indexOf(pos) == -1) {\n var before = parent.child(index - 1);\n if (before.type == after.type && isJoinable(before, after))\n { joinable.push(pos); }\n }\n pos += after.nodeSize;\n }\n }\n // Join the joinable points\n joinable.sort(function (a, b) { return a - b; });\n for (var i$2 = joinable.length - 1; i$2 >= 0; i$2--) {\n if (canJoin(tr.doc, joinable[i$2])) { tr.join(joinable[i$2]); }\n }\n dispatch(tr);\n }\n}\n\n// :: ((state: EditorState, ?(tr: Transaction)) → bool, union<(before: Node, after: Node) → bool, [string]>) → (state: EditorState, ?(tr: Transaction)) → bool\n// Wrap a command so that, when it produces a transform that causes\n// two joinable nodes to end up next to each other, those are joined.\n// Nodes are considered joinable when they are of the same type and\n// when the `isJoinable` predicate returns true for them or, if an\n// array of strings was passed, if their node type name is in that\n// array.\nfunction autoJoin(command, isJoinable) {\n if (Array.isArray(isJoinable)) {\n var types = isJoinable;\n isJoinable = function (node) { return types.indexOf(node.type.name) > -1; };\n }\n return function (state, dispatch) { return command(state, dispatch && wrapDispatchForJoin(dispatch, isJoinable)); }\n}\n\n// :: (...[(EditorState, ?(tr: Transaction), ?EditorView) → bool]) → (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// Combine a number of command functions into a single function (which\n// calls them one by one until one returns true).\nfunction chainCommands() {\n var commands = [], len = arguments.length;\n while ( len-- ) commands[ len ] = arguments[ len ];\n\n return function(state, dispatch, view) {\n for (var i = 0; i < commands.length; i++)\n { if (commands[i](state, dispatch, view)) { return true } }\n return false\n }\n}\n\nvar backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward);\nvar del = chainCommands(deleteSelection, joinForward, selectNodeForward);\n\n// :: Object\n// A basic keymap containing bindings not specific to any schema.\n// Binds the following keys (when multiple commands are listed, they\n// are chained with [`chainCommands`](#commands.chainCommands)):\n//\n// * **Enter** to `newlineInCode`, `createParagraphNear`, `liftEmptyBlock`, `splitBlock`\n// * **Mod-Enter** to `exitCode`\n// * **Backspace** and **Mod-Backspace** to `deleteSelection`, `joinBackward`, `selectNodeBackward`\n// * **Delete** and **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n// * **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n// * **Mod-a** to `selectAll`\nvar pcBaseKeymap = {\n \"Enter\": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock),\n \"Mod-Enter\": exitCode,\n \"Backspace\": backspace,\n \"Mod-Backspace\": backspace,\n \"Delete\": del,\n \"Mod-Delete\": del,\n \"Mod-a\": selectAll\n};\n\n// :: Object\n// A copy of `pcBaseKeymap` that also binds **Ctrl-h** like Backspace,\n// **Ctrl-d** like Delete, **Alt-Backspace** like Ctrl-Backspace, and\n// **Ctrl-Alt-Backspace**, **Alt-Delete**, and **Alt-d** like\n// Ctrl-Delete.\nvar macBaseKeymap = {\n \"Ctrl-h\": pcBaseKeymap[\"Backspace\"],\n \"Alt-Backspace\": pcBaseKeymap[\"Mod-Backspace\"],\n \"Ctrl-d\": pcBaseKeymap[\"Delete\"],\n \"Ctrl-Alt-Backspace\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-Delete\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-d\": pcBaseKeymap[\"Mod-Delete\"]\n};\nfor (var key in pcBaseKeymap) { macBaseKeymap[key] = pcBaseKeymap[key]; }\n\n// declare global: os, navigator\nvar mac = typeof navigator != \"undefined\" ? /Mac/.test(navigator.platform)\n : typeof os != \"undefined\" ? os.platform() == \"darwin\" : false;\n\n// :: Object\n// Depending on the detected platform, this will hold\n// [`pcBasekeymap`](#commands.pcBaseKeymap) or\n// [`macBaseKeymap`](#commands.macBaseKeymap).\nvar baseKeymap = mac ? macBaseKeymap : pcBaseKeymap;\n\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, setBlockType, splitBlock, splitBlockKeepMarks, toggleMark, wrapIn };\n//# sourceMappingURL=index.es.js.map\n","\n /*!\n * tiptap-commands v1.17.0\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { setBlockType, lift, wrapIn } from 'prosemirror-commands';\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, setBlockType, splitBlock, splitBlockKeepMarks, toggleMark, wrapIn } from 'prosemirror-commands';\nimport { liftListItem, wrapInList } from 'prosemirror-schema-list';\nexport { addListNodes, liftListItem, sinkListItem, splitListItem, wrapInList } from 'prosemirror-schema-list';\nimport { InputRule } from 'prosemirror-inputrules';\nexport { textblockTypeInputRule, wrappingInputRule } from 'prosemirror-inputrules';\nimport { Plugin } from 'prosemirror-state';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { getMarkRange, nodeIsActive, findParentNode } from 'tiptap-utils';\n\nfunction insertText (text = '') {\n return (state, dispatch) => {\n const {\n $from\n } = state.selection;\n const {\n pos\n } = $from.pos;\n dispatch(state.tr.insertText(text, pos));\n return true;\n };\n}\n\nfunction getMarksBetween(start, end, state) {\n let marks = [];\n state.doc.nodesBetween(start, end, (node, pos) => {\n marks = [...marks, ...node.marks.map(mark => ({\n start: pos,\n end: pos + node.nodeSize,\n mark\n }))];\n });\n return marks;\n}\n\nfunction markInputRule (regexp, markType, getAttrs) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {\n tr\n } = state;\n const m = match.length - 1;\n let markEnd = end;\n let markStart = start;\n\n if (match[m]) {\n const matchStart = start + match[0].indexOf(match[m - 1]);\n const matchEnd = matchStart + match[m - 1].length - 1;\n const textStart = matchStart + match[m - 1].lastIndexOf(match[m]);\n const textEnd = textStart + match[m].length;\n const excludedMarks = getMarksBetween(start, end, state).filter(item => {\n const {\n excluded\n } = item.mark.type;\n return excluded.find(type => type.name === markType.name);\n }).filter(item => item.end > matchStart);\n\n if (excludedMarks.length) {\n return false;\n }\n\n if (textEnd < matchEnd) {\n tr.delete(textEnd, matchEnd);\n }\n\n if (textStart > matchStart) {\n tr.delete(matchStart, textStart);\n }\n\n markStart = matchStart;\n markEnd = markStart + match[m].length;\n }\n\n tr.addMark(markStart, markEnd, markType.create(attrs));\n tr.removeStoredMark(markType);\n return tr;\n });\n}\n\nfunction nodeInputRule (regexp, type, getAttrs) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {\n tr\n } = state;\n\n if (match[0]) {\n tr.replaceWith(start - 1, end, type.create(attrs));\n }\n\n return tr;\n });\n}\n\nfunction pasteRule (regexp, type, getAttrs) {\n const handler = fragment => {\n const nodes = [];\n fragment.forEach(child => {\n if (child.isText) {\n const {\n text\n } = child;\n let pos = 0;\n let match;\n\n do {\n match = regexp.exec(text);\n\n if (match) {\n const start = match.index;\n const end = start + match[0].length;\n const attrs = getAttrs instanceof Function ? getAttrs(match[0]) : getAttrs;\n\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n }\n\n nodes.push(child.cut(start, end).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } while (match);\n\n if (pos < text.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content)));\n }\n });\n return Fragment.fromArray(nodes);\n };\n\n return new Plugin({\n props: {\n transformPasted: slice => new Slice(handler(slice.content), slice.openStart, slice.openEnd)\n }\n });\n}\n\nfunction markPasteRule (regexp, type, getAttrs) {\n const handler = (fragment, parent) => {\n const nodes = [];\n fragment.forEach(child => {\n if (child.isText) {\n const {\n text,\n marks\n } = child;\n let pos = 0;\n let match;\n const isLink = !!marks.filter(x => x.type.name === 'link')[0]; // eslint-disable-next-line\n\n while (!isLink && (match = regexp.exec(text)) !== null) {\n if (parent && parent.type.allowsMarkType(type) && match[1]) {\n const start = match.index;\n const end = start + match[0].length;\n const textStart = start + match[0].indexOf(match[1]);\n const textEnd = textStart + match[1].length;\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs; // adding text before markdown to nodes\n\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n } // adding the markdown part to nodes\n\n\n nodes.push(child.cut(textStart, textEnd).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } // adding rest of text to nodes\n\n\n if (pos < text.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content, child)));\n }\n });\n return Fragment.fromArray(nodes);\n };\n\n return new Plugin({\n props: {\n transformPasted: slice => new Slice(handler(slice.content), slice.openStart, slice.openEnd)\n }\n });\n}\n\nfunction removeMark (type) {\n return (state, dispatch) => {\n const {\n tr,\n selection\n } = state;\n let {\n from,\n to\n } = selection;\n const {\n $from,\n empty\n } = selection;\n\n if (empty) {\n const range = getMarkRange($from, type);\n from = range.from;\n to = range.to;\n }\n\n tr.removeMark(from, to, type);\n return dispatch(tr);\n };\n}\n\nfunction replaceText (range = null, type, attrs = {}, fragment = Fragment.empty) {\n return (state, dispatch) => {\n const {\n $from,\n $to\n } = state.selection;\n const index = $from.index();\n const from = range ? range.from : $from.pos;\n const to = range ? range.to : $to.pos;\n\n if (!$from.parent.canReplaceWith(index, index, type)) {\n return false;\n }\n\n if (dispatch) {\n dispatch(state.tr.replaceWith(from, to, type.create(attrs, fragment)));\n }\n\n return true;\n };\n}\n\nfunction setInlineBlockType (type, attrs = {}) {\n return (state, dispatch) => {\n const {\n $from\n } = state.selection;\n const index = $from.index();\n\n if (!$from.parent.canReplaceWith(index, index, type)) {\n return false;\n }\n\n if (dispatch) {\n dispatch(state.tr.replaceSelectionWith(type.create(attrs)));\n }\n\n return true;\n };\n}\n\n// see https://github.com/ProseMirror/prosemirror-transform/blob/main/src/structure.js\n// Since this piece of code was \"borrowed\" from prosemirror, ESLint rules are ignored.\n\n/* eslint-disable max-len, no-plusplus, no-undef, eqeqeq */\n\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n const $pos = doc.resolve(pos);\n const base = $pos.depth - depth;\n const innerType = typesAfter && typesAfter[typesAfter.length - 1] || $pos.parent;\n if (base < 0 || $pos.parent.type.spec.isolating || !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) || !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount))) return false;\n\n for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n const node = $pos.node(d);\n const index = $pos.index(d);\n if (node.type.spec.isolating) return false;\n let rest = node.content.cutByIndex(index, node.childCount);\n const after = typesAfter && typesAfter[i] || node;\n if (after != node) rest = rest.replaceChild(0, after.type.create(after.attrs));\n /* Change starts from here */\n // if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n // return false\n\n if (!node.canReplace(index + 1, node.childCount)) return false;\n /* Change ends here */\n }\n\n const index = $pos.indexAfter(base);\n const baseType = typesAfter && typesAfter[0];\n return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n} // this is a copy of splitListItem\n// see https://github.com/ProseMirror/prosemirror-schema-list/blob/main/src/schema-list.js\n\n\nfunction splitToDefaultListItem(itemType) {\n return function (state, dispatch) {\n const {\n $from,\n $to,\n node\n } = state.selection;\n if (node && node.isBlock || $from.depth < 2 || !$from.sameParent($to)) return false;\n const grandParent = $from.node(-1);\n if (grandParent.type != itemType) return false;\n\n if ($from.parent.content.size == 0) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if ($from.depth == 2 || $from.node(-3).type != itemType || $from.index(-2) != $from.node(-2).childCount - 1) return false;\n\n if (dispatch) {\n let wrap = Fragment.empty;\n const keepItem = $from.index(-1) > 0; // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n\n for (let d = $from.depth - (keepItem ? 1 : 2); d >= $from.depth - 3; d--) wrap = Fragment.from($from.node(d).copy(wrap)); // Add a second list item with an empty default start node\n\n\n wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n const tr = state.tr.replace($from.before(keepItem ? null : -1), $from.after(-3), new Slice(wrap, keepItem ? 3 : 2, 2));\n tr.setSelection(state.selection.constructor.near(tr.doc.resolve($from.pos + (keepItem ? 3 : 2))));\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n }\n\n const nextType = $to.pos == $from.end() ? grandParent.contentMatchAt($from.indexAfter(-1)).defaultType : null;\n const tr = state.tr.delete($from.pos, $to.pos);\n /* Change starts from here */\n // let types = nextType && [null, {type: nextType}]\n\n let types = nextType && [{\n type: itemType\n }, {\n type: nextType\n }];\n if (!types) types = [{\n type: itemType\n }, null];\n /* Change ends here */\n\n if (!canSplit(tr.doc, $from.pos, 2, types)) return false;\n if (dispatch) dispatch(tr.split($from.pos, 2, types).scrollIntoView());\n return true;\n };\n}\n/* eslint-enable max-len, no-plusplus, no-undef, eqeqeq */\n\nfunction toggleBlockType (type, toggletype, attrs = {}) {\n return (state, dispatch, view) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return setBlockType(toggletype)(state, dispatch, view);\n }\n\n return setBlockType(type, attrs)(state, dispatch, view);\n };\n}\n\nfunction isList(node, schema) {\n return node.type === schema.nodes.bullet_list || node.type === schema.nodes.ordered_list || node.type === schema.nodes.todo_list;\n}\n\nfunction toggleList(listType, itemType) {\n return (state, dispatch, view) => {\n const {\n schema,\n selection\n } = state;\n const {\n $from,\n $to\n } = selection;\n const range = $from.blockRange($to);\n\n if (!range) {\n return false;\n }\n\n const parentList = findParentNode(node => isList(node, schema))(selection);\n\n if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n if (parentList.node.type === listType) {\n return liftListItem(itemType)(state, dispatch, view);\n }\n\n if (isList(parentList.node, schema) && listType.validContent(parentList.node.content)) {\n const {\n tr\n } = state;\n tr.setNodeMarkup(parentList.pos, listType);\n\n if (dispatch) {\n dispatch(tr);\n }\n\n return false;\n }\n }\n\n return wrapInList(listType)(state, dispatch, view);\n };\n}\n\nfunction toggleWrap (type, attrs = {}) {\n return (state, dispatch, view) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return lift(state, dispatch);\n }\n\n return wrapIn(type, attrs)(state, dispatch, view);\n };\n}\n\nfunction updateMark (type, attrs) {\n return (state, dispatch) => {\n const {\n tr,\n selection,\n doc\n } = state;\n const {\n ranges,\n empty\n } = selection;\n\n if (empty) {\n const {\n from,\n to\n } = getMarkRange(selection.$from, type);\n\n if (doc.rangeHasMark(from, to, type)) {\n tr.removeMark(from, to, type);\n }\n\n tr.addMark(from, to, type.create(attrs));\n } else {\n ranges.forEach(ref$1 => {\n const {\n $to,\n $from\n } = ref$1;\n\n if (doc.rangeHasMark($from.pos, $to.pos, type)) {\n tr.removeMark($from.pos, $to.pos, type);\n }\n\n tr.addMark($from.pos, $to.pos, type.create(attrs));\n });\n }\n\n return dispatch(tr);\n };\n}\n\nexport { insertText, markInputRule, markPasteRule, nodeInputRule, pasteRule, removeMark, replaceText, setInlineBlockType, splitToDefaultListItem, toggleBlockType, toggleList, toggleWrap, updateMark };\n","import { ReplaceError, Slice, Fragment, MarkType } from 'prosemirror-model';\n\n// Mappable:: interface\n// There are several things that positions can be mapped through.\n// Such objects conform to this interface.\n//\n// map:: (pos: number, assoc: ?number) → number\n// Map a position through this object. When given, `assoc` (should\n// be -1 or 1, defaults to 1) determines with which side the\n// position is associated, which determines in which direction to\n// move when a chunk of content is inserted at the mapped position.\n//\n// mapResult:: (pos: number, assoc: ?number) → MapResult\n// Map a position, and return an object containing additional\n// information about the mapping. The result's `deleted` field tells\n// you whether the position was deleted (completely enclosed in a\n// replaced range) during the mapping. When content on only one side\n// is deleted, the position itself is only considered deleted when\n// `assoc` points in the direction of the deleted content.\n\n// Recovery values encode a range index and an offset. They are\n// represented as numbers, because tons of them will be created when\n// mapping, for example, a large number of decorations. The number's\n// lower 16 bits provide the index, the remaining bits the offset.\n//\n// Note: We intentionally don't use bit shift operators to en- and\n// decode these, since those clip to 32 bits, which we might in rare\n// cases want to overflow. A 64-bit float can represent 48-bit\n// integers precisely.\n\nvar lower16 = 0xffff;\nvar factor16 = Math.pow(2, 16);\n\nfunction makeRecover(index, offset) { return index + offset * factor16 }\nfunction recoverIndex(value) { return value & lower16 }\nfunction recoverOffset(value) { return (value - (value & lower16)) / factor16 }\n\n// ::- An object representing a mapped position with extra\n// information.\nvar MapResult = function MapResult(pos, deleted, recover) {\n if ( deleted === void 0 ) deleted = false;\n if ( recover === void 0 ) recover = null;\n\n // :: number The mapped version of the position.\n this.pos = pos;\n // :: bool Tells you whether the position was deleted, that is,\n // whether the step removed its surroundings from the document.\n this.deleted = deleted;\n this.recover = recover;\n};\n\n// :: class extends Mappable\n// A map describing the deletions and insertions made by a step, which\n// can be used to find the correspondence between positions in the\n// pre-step version of a document and the same position in the\n// post-step version.\nvar StepMap = function StepMap(ranges, inverted) {\n if ( inverted === void 0 ) inverted = false;\n\n this.ranges = ranges;\n this.inverted = inverted;\n};\n\nStepMap.prototype.recover = function recover (value) {\n var diff = 0, index = recoverIndex(value);\n if (!this.inverted) { for (var i = 0; i < index; i++)\n { diff += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1]; } }\n return this.ranges[index * 3] + diff + recoverOffset(value)\n};\n\n// : (number, ?number) → MapResult\nStepMap.prototype.mapResult = function mapResult (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n return this._map(pos, assoc, false) };\n\n// : (number, ?number) → number\nStepMap.prototype.map = function map (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n return this._map(pos, assoc, true) };\n\nStepMap.prototype._map = function _map (pos, assoc, simple) {\n var diff = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (var i = 0; i < this.ranges.length; i += 3) {\n var start = this.ranges[i] - (this.inverted ? diff : 0);\n if (start > pos) { break }\n var oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end = start + oldSize;\n if (pos <= end) {\n var side = !oldSize ? assoc : pos == start ? -1 : pos == end ? 1 : assoc;\n var result = start + diff + (side < 0 ? 0 : newSize);\n if (simple) { return result }\n var recover = pos == (assoc < 0 ? start : end) ? null : makeRecover(i / 3, pos - start);\n return new MapResult(result, assoc < 0 ? pos != start : pos != end, recover)\n }\n diff += newSize - oldSize;\n }\n return simple ? pos + diff : new MapResult(pos + diff)\n};\n\nStepMap.prototype.touches = function touches (pos, recover) {\n var diff = 0, index = recoverIndex(recover);\n var oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (var i = 0; i < this.ranges.length; i += 3) {\n var start = this.ranges[i] - (this.inverted ? diff : 0);\n if (start > pos) { break }\n var oldSize = this.ranges[i + oldIndex], end = start + oldSize;\n if (pos <= end && i == index * 3) { return true }\n diff += this.ranges[i + newIndex] - oldSize;\n }\n return false\n};\n\n// :: ((oldStart: number, oldEnd: number, newStart: number, newEnd: number))\n// Calls the given function on each of the changed ranges included in\n// this map.\nStepMap.prototype.forEach = function forEach (f) {\n var oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (var i = 0, diff = 0; i < this.ranges.length; i += 3) {\n var start = this.ranges[i], oldStart = start - (this.inverted ? diff : 0), newStart = start + (this.inverted ? 0 : diff);\n var oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex];\n f(oldStart, oldStart + oldSize, newStart, newStart + newSize);\n diff += newSize - oldSize;\n }\n};\n\n// :: () → StepMap\n// Create an inverted version of this map. The result can be used to\n// map positions in the post-step document to the pre-step document.\nStepMap.prototype.invert = function invert () {\n return new StepMap(this.ranges, !this.inverted)\n};\n\nStepMap.prototype.toString = function toString () {\n return (this.inverted ? \"-\" : \"\") + JSON.stringify(this.ranges)\n};\n\n// :: (n: number) → StepMap\n// Create a map that moves all positions by offset `n` (which may be\n// negative). This can be useful when applying steps meant for a\n// sub-document to a larger document, or vice-versa.\nStepMap.offset = function offset (n) {\n return n == 0 ? StepMap.empty : new StepMap(n < 0 ? [0, -n, 0] : [0, 0, n])\n};\n\nStepMap.empty = new StepMap([]);\n\n// :: class extends Mappable\n// A mapping represents a pipeline of zero or more [step\n// maps](#transform.StepMap). It has special provisions for losslessly\n// handling mapping positions through a series of steps in which some\n// steps are inverted versions of earlier steps. (This comes up when\n// ‘[rebasing](/docs/guide/#transform.rebasing)’ steps for\n// collaboration or history management.)\nvar Mapping = function Mapping(maps, mirror, from, to) {\n // :: [StepMap]\n // The step maps in this mapping.\n this.maps = maps || [];\n // :: number\n // The starting position in the `maps` array, used when `map` or\n // `mapResult` is called.\n this.from = from || 0;\n // :: number\n // The end position in the `maps` array.\n this.to = to == null ? this.maps.length : to;\n this.mirror = mirror;\n};\n\n// :: (?number, ?number) → Mapping\n// Create a mapping that maps only through a part of this one.\nMapping.prototype.slice = function slice (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.maps.length;\n\n return new Mapping(this.maps, this.mirror, from, to)\n};\n\nMapping.prototype.copy = function copy () {\n return new Mapping(this.maps.slice(), this.mirror && this.mirror.slice(), this.from, this.to)\n};\n\n// :: (StepMap, ?number)\n// Add a step map to the end of this mapping. If `mirrors` is\n// given, it should be the index of the step map that is the mirror\n// image of this one.\nMapping.prototype.appendMap = function appendMap (map, mirrors) {\n this.to = this.maps.push(map);\n if (mirrors != null) { this.setMirror(this.maps.length - 1, mirrors); }\n};\n\n// :: (Mapping)\n// Add all the step maps in a given mapping to this one (preserving\n// mirroring information).\nMapping.prototype.appendMapping = function appendMapping (mapping) {\n for (var i = 0, startSize = this.maps.length; i < mapping.maps.length; i++) {\n var mirr = mapping.getMirror(i);\n this.appendMap(mapping.maps[i], mirr != null && mirr < i ? startSize + mirr : null);\n }\n};\n\n// :: (number) → ?number\n// Finds the offset of the step map that mirrors the map at the\n// given offset, in this mapping (as per the second argument to\n// `appendMap`).\nMapping.prototype.getMirror = function getMirror (n) {\n if (this.mirror) { for (var i = 0; i < this.mirror.length; i++)\n { if (this.mirror[i] == n) { return this.mirror[i + (i % 2 ? -1 : 1)] } } }\n};\n\nMapping.prototype.setMirror = function setMirror (n, m) {\n if (!this.mirror) { this.mirror = []; }\n this.mirror.push(n, m);\n};\n\n// :: (Mapping)\n// Append the inverse of the given mapping to this one.\nMapping.prototype.appendMappingInverted = function appendMappingInverted (mapping) {\n for (var i = mapping.maps.length - 1, totalSize = this.maps.length + mapping.maps.length; i >= 0; i--) {\n var mirr = mapping.getMirror(i);\n this.appendMap(mapping.maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : null);\n }\n};\n\n// :: () → Mapping\n// Create an inverted version of this mapping.\nMapping.prototype.invert = function invert () {\n var inverse = new Mapping;\n inverse.appendMappingInverted(this);\n return inverse\n};\n\n// : (number, ?number) → number\n// Map a position through this mapping.\nMapping.prototype.map = function map (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n\n if (this.mirror) { return this._map(pos, assoc, true) }\n for (var i = this.from; i < this.to; i++)\n { pos = this.maps[i].map(pos, assoc); }\n return pos\n};\n\n// : (number, ?number) → MapResult\n// Map a position through this mapping, returning a mapping\n// result.\nMapping.prototype.mapResult = function mapResult (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n return this._map(pos, assoc, false) };\n\nMapping.prototype._map = function _map (pos, assoc, simple) {\n var deleted = false;\n\n for (var i = this.from; i < this.to; i++) {\n var map = this.maps[i], result = map.mapResult(pos, assoc);\n if (result.recover != null) {\n var corr = this.getMirror(i);\n if (corr != null && corr > i && corr < this.to) {\n i = corr;\n pos = this.maps[corr].recover(result.recover);\n continue\n }\n }\n\n if (result.deleted) { deleted = true; }\n pos = result.pos;\n }\n\n return simple ? pos : new MapResult(pos, deleted)\n};\n\nfunction TransformError(message) {\n var err = Error.call(this, message);\n err.__proto__ = TransformError.prototype;\n return err\n}\n\nTransformError.prototype = Object.create(Error.prototype);\nTransformError.prototype.constructor = TransformError;\nTransformError.prototype.name = \"TransformError\";\n\n// ::- Abstraction to build up and track an array of\n// [steps](#transform.Step) representing a document transformation.\n//\n// Most transforming methods return the `Transform` object itself, so\n// that they can be chained.\nvar Transform = function Transform(doc) {\n // :: Node\n // The current document (the result of applying the steps in the\n // transform).\n this.doc = doc;\n // :: [Step]\n // The steps in this transform.\n this.steps = [];\n // :: [Node]\n // The documents before each of the steps.\n this.docs = [];\n // :: Mapping\n // A mapping with the maps for each of the steps in this transform.\n this.mapping = new Mapping;\n};\n\nvar prototypeAccessors = { before: { configurable: true },docChanged: { configurable: true } };\n\n// :: Node The starting document.\nprototypeAccessors.before.get = function () { return this.docs.length ? this.docs[0] : this.doc };\n\n// :: (step: Step) → this\n// Apply a new step in this transform, saving the result. Throws an\n// error when the step fails.\nTransform.prototype.step = function step (object) {\n var result = this.maybeStep(object);\n if (result.failed) { throw new TransformError(result.failed) }\n return this\n};\n\n// :: (Step) → StepResult\n// Try to apply a step in this transformation, ignoring it if it\n// fails. Returns the step result.\nTransform.prototype.maybeStep = function maybeStep (step) {\n var result = step.apply(this.doc);\n if (!result.failed) { this.addStep(step, result.doc); }\n return result\n};\n\n// :: bool\n// True when the document has been changed (when there are any\n// steps).\nprototypeAccessors.docChanged.get = function () {\n return this.steps.length > 0\n};\n\nTransform.prototype.addStep = function addStep (step, doc) {\n this.docs.push(this.doc);\n this.steps.push(step);\n this.mapping.appendMap(step.getMap());\n this.doc = doc;\n};\n\nObject.defineProperties( Transform.prototype, prototypeAccessors );\n\nfunction mustOverride() { throw new Error(\"Override me\") }\n\nvar stepsByID = Object.create(null);\n\n// ::- A step object represents an atomic change. It generally applies\n// only to the document it was created for, since the positions\n// stored in it will only make sense for that document.\n//\n// New steps are defined by creating classes that extend `Step`,\n// overriding the `apply`, `invert`, `map`, `getMap` and `fromJSON`\n// methods, and registering your class with a unique\n// JSON-serialization identifier using\n// [`Step.jsonID`](#transform.Step^jsonID).\nvar Step = function Step () {};\n\nStep.prototype.apply = function apply (_doc) { return mustOverride() };\n\n// :: () → StepMap\n// Get the step map that represents the changes made by this step,\n// and which can be used to transform between positions in the old\n// and the new document.\nStep.prototype.getMap = function getMap () { return StepMap.empty };\n\n// :: (doc: Node) → Step\n// Create an inverted version of this step. Needs the document as it\n// was before the step as argument.\nStep.prototype.invert = function invert (_doc) { return mustOverride() };\n\n// :: (mapping: Mappable) → ?Step\n// Map this step through a mappable thing, returning either a\n// version of that step with its positions adjusted, or `null` if\n// the step was entirely deleted by the mapping.\nStep.prototype.map = function map (_mapping) { return mustOverride() };\n\n// :: (other: Step) → ?Step\n// Try to merge this step with another one, to be applied directly\n// after it. Returns the merged step when possible, null if the\n// steps can't be merged.\nStep.prototype.merge = function merge (_other) { return null };\n\n// :: () → Object\n// Create a JSON-serializeable representation of this step. When\n// defining this for a custom subclass, make sure the result object\n// includes the step type's [JSON id](#transform.Step^jsonID) under\n// the `stepType` property.\nStep.prototype.toJSON = function toJSON () { return mustOverride() };\n\n// :: (Schema, Object) → Step\n// Deserialize a step from its JSON representation. Will call\n// through to the step class' own implementation of this method.\nStep.fromJSON = function fromJSON (schema, json) {\n if (!json || !json.stepType) { throw new RangeError(\"Invalid input for Step.fromJSON\") }\n var type = stepsByID[json.stepType];\n if (!type) { throw new RangeError((\"No step type \" + (json.stepType) + \" defined\")) }\n return type.fromJSON(schema, json)\n};\n\n// :: (string, constructor)\n// To be able to serialize steps to JSON, each step needs a string\n// ID to attach to its JSON representation. Use this method to\n// register an ID for your step classes. Try to pick something\n// that's unlikely to clash with steps from other modules.\nStep.jsonID = function jsonID (id, stepClass) {\n if (id in stepsByID) { throw new RangeError(\"Duplicate use of step JSON ID \" + id) }\n stepsByID[id] = stepClass;\n stepClass.prototype.jsonID = id;\n return stepClass\n};\n\n// ::- The result of [applying](#transform.Step.apply) a step. Contains either a\n// new document or a failure value.\nvar StepResult = function StepResult(doc, failed) {\n // :: ?Node The transformed document.\n this.doc = doc;\n // :: ?string Text providing information about a failed step.\n this.failed = failed;\n};\n\n// :: (Node) → StepResult\n// Create a successful step result.\nStepResult.ok = function ok (doc) { return new StepResult(doc, null) };\n\n// :: (string) → StepResult\n// Create a failed step result.\nStepResult.fail = function fail (message) { return new StepResult(null, message) };\n\n// :: (Node, number, number, Slice) → StepResult\n// Call [`Node.replace`](#model.Node.replace) with the given\n// arguments. Create a successful result if it succeeds, and a\n// failed one if it throws a `ReplaceError`.\nStepResult.fromReplace = function fromReplace (doc, from, to, slice) {\n try {\n return StepResult.ok(doc.replace(from, to, slice))\n } catch (e) {\n if (e instanceof ReplaceError) { return StepResult.fail(e.message) }\n throw e\n }\n};\n\n// ::- Replace a part of the document with a slice of new content.\nvar ReplaceStep = /*@__PURE__*/(function (Step) {\n function ReplaceStep(from, to, slice, structure) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.slice = slice;\n this.structure = !!structure;\n }\n\n if ( Step ) ReplaceStep.__proto__ = Step;\n ReplaceStep.prototype = Object.create( Step && Step.prototype );\n ReplaceStep.prototype.constructor = ReplaceStep;\n\n ReplaceStep.prototype.apply = function apply (doc) {\n if (this.structure && contentBetween(doc, this.from, this.to))\n { return StepResult.fail(\"Structure replace would overwrite content\") }\n return StepResult.fromReplace(doc, this.from, this.to, this.slice)\n };\n\n ReplaceStep.prototype.getMap = function getMap () {\n return new StepMap([this.from, this.to - this.from, this.slice.size])\n };\n\n ReplaceStep.prototype.invert = function invert (doc) {\n return new ReplaceStep(this.from, this.from + this.slice.size, doc.slice(this.from, this.to))\n };\n\n ReplaceStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted) { return null }\n return new ReplaceStep(from.pos, Math.max(from.pos, to.pos), this.slice)\n };\n\n ReplaceStep.prototype.merge = function merge (other) {\n if (!(other instanceof ReplaceStep) || other.structure != this.structure) { return null }\n\n if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) {\n var slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd);\n return new ReplaceStep(this.from, this.to + (other.to - other.from), slice, this.structure)\n } else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) {\n var slice$1 = this.slice.size + other.slice.size == 0 ? Slice.empty\n : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd);\n return new ReplaceStep(other.from, this.to, slice$1, this.structure)\n } else {\n return null\n }\n };\n\n ReplaceStep.prototype.toJSON = function toJSON () {\n var json = {stepType: \"replace\", from: this.from, to: this.to};\n if (this.slice.size) { json.slice = this.slice.toJSON(); }\n if (this.structure) { json.structure = true; }\n return json\n };\n\n ReplaceStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n { throw new RangeError(\"Invalid input for ReplaceStep.fromJSON\") }\n return new ReplaceStep(json.from, json.to, Slice.fromJSON(schema, json.slice), !!json.structure)\n };\n\n return ReplaceStep;\n}(Step));\n\nStep.jsonID(\"replace\", ReplaceStep);\n\n// ::- Replace a part of the document with a slice of content, but\n// preserve a range of the replaced content by moving it into the\n// slice.\nvar ReplaceAroundStep = /*@__PURE__*/(function (Step) {\n function ReplaceAroundStep(from, to, gapFrom, gapTo, slice, insert, structure) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.gapFrom = gapFrom;\n this.gapTo = gapTo;\n this.slice = slice;\n this.insert = insert;\n this.structure = !!structure;\n }\n\n if ( Step ) ReplaceAroundStep.__proto__ = Step;\n ReplaceAroundStep.prototype = Object.create( Step && Step.prototype );\n ReplaceAroundStep.prototype.constructor = ReplaceAroundStep;\n\n ReplaceAroundStep.prototype.apply = function apply (doc) {\n if (this.structure && (contentBetween(doc, this.from, this.gapFrom) ||\n contentBetween(doc, this.gapTo, this.to)))\n { return StepResult.fail(\"Structure gap-replace would overwrite content\") }\n\n var gap = doc.slice(this.gapFrom, this.gapTo);\n if (gap.openStart || gap.openEnd)\n { return StepResult.fail(\"Gap is not a flat range\") }\n var inserted = this.slice.insertAt(this.insert, gap.content);\n if (!inserted) { return StepResult.fail(\"Content does not fit in gap\") }\n return StepResult.fromReplace(doc, this.from, this.to, inserted)\n };\n\n ReplaceAroundStep.prototype.getMap = function getMap () {\n return new StepMap([this.from, this.gapFrom - this.from, this.insert,\n this.gapTo, this.to - this.gapTo, this.slice.size - this.insert])\n };\n\n ReplaceAroundStep.prototype.invert = function invert (doc) {\n var gap = this.gapTo - this.gapFrom;\n return new ReplaceAroundStep(this.from, this.from + this.slice.size + gap,\n this.from + this.insert, this.from + this.insert + gap,\n doc.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from),\n this.gapFrom - this.from, this.structure)\n };\n\n ReplaceAroundStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n var gapFrom = mapping.map(this.gapFrom, -1), gapTo = mapping.map(this.gapTo, 1);\n if ((from.deleted && to.deleted) || gapFrom < from.pos || gapTo > to.pos) { return null }\n return new ReplaceAroundStep(from.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure)\n };\n\n ReplaceAroundStep.prototype.toJSON = function toJSON () {\n var json = {stepType: \"replaceAround\", from: this.from, to: this.to,\n gapFrom: this.gapFrom, gapTo: this.gapTo, insert: this.insert};\n if (this.slice.size) { json.slice = this.slice.toJSON(); }\n if (this.structure) { json.structure = true; }\n return json\n };\n\n ReplaceAroundStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\" ||\n typeof json.gapFrom != \"number\" || typeof json.gapTo != \"number\" || typeof json.insert != \"number\")\n { throw new RangeError(\"Invalid input for ReplaceAroundStep.fromJSON\") }\n return new ReplaceAroundStep(json.from, json.to, json.gapFrom, json.gapTo,\n Slice.fromJSON(schema, json.slice), json.insert, !!json.structure)\n };\n\n return ReplaceAroundStep;\n}(Step));\n\nStep.jsonID(\"replaceAround\", ReplaceAroundStep);\n\nfunction contentBetween(doc, from, to) {\n var $from = doc.resolve(from), dist = to - from, depth = $from.depth;\n while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) {\n depth--;\n dist--;\n }\n if (dist > 0) {\n var next = $from.node(depth).maybeChild($from.indexAfter(depth));\n while (dist > 0) {\n if (!next || next.isLeaf) { return true }\n next = next.firstChild;\n dist--;\n }\n }\n return false\n}\n\nfunction canCut(node, start, end) {\n return (start == 0 || node.canReplace(start, node.childCount)) &&\n (end == node.childCount || node.canReplace(0, end))\n}\n\n// :: (NodeRange) → ?number\n// Try to find a target depth to which the content in the given range\n// can be lifted. Will not go across\n// [isolating](#model.NodeSpec.isolating) parent nodes.\nfunction liftTarget(range) {\n var parent = range.parent;\n var content = parent.content.cutByIndex(range.startIndex, range.endIndex);\n for (var depth = range.depth;; --depth) {\n var node = range.$from.node(depth);\n var index = range.$from.index(depth), endIndex = range.$to.indexAfter(depth);\n if (depth < range.depth && node.canReplace(index, endIndex, content))\n { return depth }\n if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex)) { break }\n }\n}\n\n// :: (NodeRange, number) → this\n// Split the content in the given range off from its parent, if there\n// is sibling content before or after it, and move it up the tree to\n// the depth specified by `target`. You'll probably want to use\n// [`liftTarget`](#transform.liftTarget) to compute `target`, to make\n// sure the lift is valid.\nTransform.prototype.lift = function(range, target) {\n var $from = range.$from;\n var $to = range.$to;\n var depth = range.depth;\n\n var gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1);\n var start = gapStart, end = gapEnd;\n\n var before = Fragment.empty, openStart = 0;\n for (var d = depth, splitting = false; d > target; d--)\n { if (splitting || $from.index(d) > 0) {\n splitting = true;\n before = Fragment.from($from.node(d).copy(before));\n openStart++;\n } else {\n start--;\n } }\n var after = Fragment.empty, openEnd = 0;\n for (var d$1 = depth, splitting$1 = false; d$1 > target; d$1--)\n { if (splitting$1 || $to.after(d$1 + 1) < $to.end(d$1)) {\n splitting$1 = true;\n after = Fragment.from($to.node(d$1).copy(after));\n openEnd++;\n } else {\n end++;\n } }\n\n return this.step(new ReplaceAroundStep(start, end, gapStart, gapEnd,\n new Slice(before.append(after), openStart, openEnd),\n before.size - openStart, true))\n};\n\n// :: (NodeRange, NodeType, ?Object, ?NodeRange) → ?[{type: NodeType, attrs: ?Object}]\n// Try to find a valid way to wrap the content in the given range in a\n// node of the given type. May introduce extra nodes around and inside\n// the wrapper node, if necessary. Returns null if no valid wrapping\n// could be found. When `innerRange` is given, that range's content is\n// used as the content to fit into the wrapping, instead of the\n// content of `range`.\nfunction findWrapping(range, nodeType, attrs, innerRange) {\n if ( innerRange === void 0 ) innerRange = range;\n\n var around = findWrappingOutside(range, nodeType);\n var inner = around && findWrappingInside(innerRange, nodeType);\n if (!inner) { return null }\n return around.map(withAttrs).concat({type: nodeType, attrs: attrs}).concat(inner.map(withAttrs))\n}\n\nfunction withAttrs(type) { return {type: type, attrs: null} }\n\nfunction findWrappingOutside(range, type) {\n var parent = range.parent;\n var startIndex = range.startIndex;\n var endIndex = range.endIndex;\n var around = parent.contentMatchAt(startIndex).findWrapping(type);\n if (!around) { return null }\n var outer = around.length ? around[0] : type;\n return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null\n}\n\nfunction findWrappingInside(range, type) {\n var parent = range.parent;\n var startIndex = range.startIndex;\n var endIndex = range.endIndex;\n var inner = parent.child(startIndex);\n var inside = type.contentMatch.findWrapping(inner.type);\n if (!inside) { return null }\n var lastType = inside.length ? inside[inside.length - 1] : type;\n var innerMatch = lastType.contentMatch;\n for (var i = startIndex; innerMatch && i < endIndex; i++)\n { innerMatch = innerMatch.matchType(parent.child(i).type); }\n if (!innerMatch || !innerMatch.validEnd) { return null }\n return inside\n}\n\n// :: (NodeRange, [{type: NodeType, attrs: ?Object}]) → this\n// Wrap the given [range](#model.NodeRange) in the given set of wrappers.\n// The wrappers are assumed to be valid in this position, and should\n// probably be computed with [`findWrapping`](#transform.findWrapping).\nTransform.prototype.wrap = function(range, wrappers) {\n var content = Fragment.empty;\n for (var i = wrappers.length - 1; i >= 0; i--)\n { content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content)); }\n\n var start = range.start, end = range.end;\n return this.step(new ReplaceAroundStep(start, end, start, end, new Slice(content, 0, 0), wrappers.length, true))\n};\n\n// :: (number, ?number, NodeType, ?Object) → this\n// Set the type of all textblocks (partly) between `from` and `to` to\n// the given node type with the given attributes.\nTransform.prototype.setBlockType = function(from, to, type, attrs) {\n var this$1 = this;\n if ( to === void 0 ) to = from;\n\n if (!type.isTextblock) { throw new RangeError(\"Type given to setBlockType should be a textblock\") }\n var mapFrom = this.steps.length;\n this.doc.nodesBetween(from, to, function (node, pos) {\n if (node.isTextblock && !node.hasMarkup(type, attrs) && canChangeType(this$1.doc, this$1.mapping.slice(mapFrom).map(pos), type)) {\n // Ensure all markup that isn't allowed in the new node type is cleared\n this$1.clearIncompatible(this$1.mapping.slice(mapFrom).map(pos, 1), type);\n var mapping = this$1.mapping.slice(mapFrom);\n var startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1);\n this$1.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1,\n new Slice(Fragment.from(type.create(attrs, null, node.marks)), 0, 0), 1, true));\n return false\n }\n });\n return this\n};\n\nfunction canChangeType(doc, pos, type) {\n var $pos = doc.resolve(pos), index = $pos.index();\n return $pos.parent.canReplaceWith(index, index + 1, type)\n}\n\n// :: (number, ?NodeType, ?Object, ?[Mark]) → this\n// Change the type, attributes, and/or marks of the node at `pos`.\n// When `type` isn't given, the existing node type is preserved,\nTransform.prototype.setNodeMarkup = function(pos, type, attrs, marks) {\n var node = this.doc.nodeAt(pos);\n if (!node) { throw new RangeError(\"No node at given position\") }\n if (!type) { type = node.type; }\n var newNode = type.create(attrs, null, marks || node.marks);\n if (node.isLeaf)\n { return this.replaceWith(pos, pos + node.nodeSize, newNode) }\n\n if (!type.validContent(node.content))\n { throw new RangeError(\"Invalid content for node type \" + type.name) }\n\n return this.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1,\n new Slice(Fragment.from(newNode), 0, 0), 1, true))\n};\n\n// :: (Node, number, number, ?[?{type: NodeType, attrs: ?Object}]) → bool\n// Check whether splitting at the given position is allowed.\nfunction canSplit(doc, pos, depth, typesAfter) {\n if ( depth === void 0 ) depth = 1;\n\n var $pos = doc.resolve(pos), base = $pos.depth - depth;\n var innerType = (typesAfter && typesAfter[typesAfter.length - 1]) || $pos.parent;\n if (base < 0 || $pos.parent.type.spec.isolating ||\n !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) ||\n !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount)))\n { return false }\n for (var d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n var node = $pos.node(d), index$1 = $pos.index(d);\n if (node.type.spec.isolating) { return false }\n var rest = node.content.cutByIndex(index$1, node.childCount);\n var after = (typesAfter && typesAfter[i]) || node;\n if (after != node) { rest = rest.replaceChild(0, after.type.create(after.attrs)); }\n if (!node.canReplace(index$1 + 1, node.childCount) || !after.type.validContent(rest))\n { return false }\n }\n var index = $pos.indexAfter(base);\n var baseType = typesAfter && typesAfter[0];\n return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type)\n}\n\n// :: (number, ?number, ?[?{type: NodeType, attrs: ?Object}]) → this\n// Split the node at the given position, and optionally, if `depth` is\n// greater than one, any number of nodes above that. By default, the\n// parts split off will inherit the node type of the original node.\n// This can be changed by passing an array of types and attributes to\n// use after the split.\nTransform.prototype.split = function(pos, depth, typesAfter) {\n if ( depth === void 0 ) depth = 1;\n\n var $pos = this.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty;\n for (var d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) {\n before = Fragment.from($pos.node(d).copy(before));\n var typeAfter = typesAfter && typesAfter[i];\n after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after));\n }\n return this.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true))\n};\n\n// :: (Node, number) → bool\n// Test whether the blocks before and after a given position can be\n// joined.\nfunction canJoin(doc, pos) {\n var $pos = doc.resolve(pos), index = $pos.index();\n return joinable($pos.nodeBefore, $pos.nodeAfter) &&\n $pos.parent.canReplace(index, index + 1)\n}\n\nfunction joinable(a, b) {\n return a && b && !a.isLeaf && a.canAppend(b)\n}\n\n// :: (Node, number, ?number) → ?number\n// Find an ancestor of the given position that can be joined to the\n// block before (or after if `dir` is positive). Returns the joinable\n// point, if any.\nfunction joinPoint(doc, pos, dir) {\n if ( dir === void 0 ) dir = -1;\n\n var $pos = doc.resolve(pos);\n for (var d = $pos.depth;; d--) {\n var before = (void 0), after = (void 0), index = $pos.index(d);\n if (d == $pos.depth) {\n before = $pos.nodeBefore;\n after = $pos.nodeAfter;\n } else if (dir > 0) {\n before = $pos.node(d + 1);\n index++;\n after = $pos.node(d).maybeChild(index);\n } else {\n before = $pos.node(d).maybeChild(index - 1);\n after = $pos.node(d + 1);\n }\n if (before && !before.isTextblock && joinable(before, after) &&\n $pos.node(d).canReplace(index, index + 1)) { return pos }\n if (d == 0) { break }\n pos = dir < 0 ? $pos.before(d) : $pos.after(d);\n }\n}\n\n// :: (number, ?number) → this\n// Join the blocks around the given position. If depth is 2, their\n// last and first siblings are also joined, and so on.\nTransform.prototype.join = function(pos, depth) {\n if ( depth === void 0 ) depth = 1;\n\n var step = new ReplaceStep(pos - depth, pos + depth, Slice.empty, true);\n return this.step(step)\n};\n\n// :: (Node, number, NodeType) → ?number\n// Try to find a point where a node of the given type can be inserted\n// near `pos`, by searching up the node hierarchy when `pos` itself\n// isn't a valid place but is at the start or end of a node. Return\n// null if no position was found.\nfunction insertPoint(doc, pos, nodeType) {\n var $pos = doc.resolve(pos);\n if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType)) { return pos }\n\n if ($pos.parentOffset == 0)\n { for (var d = $pos.depth - 1; d >= 0; d--) {\n var index = $pos.index(d);\n if ($pos.node(d).canReplaceWith(index, index, nodeType)) { return $pos.before(d + 1) }\n if (index > 0) { return null }\n } }\n if ($pos.parentOffset == $pos.parent.content.size)\n { for (var d$1 = $pos.depth - 1; d$1 >= 0; d$1--) {\n var index$1 = $pos.indexAfter(d$1);\n if ($pos.node(d$1).canReplaceWith(index$1, index$1, nodeType)) { return $pos.after(d$1 + 1) }\n if (index$1 < $pos.node(d$1).childCount) { return null }\n } }\n}\n\n// :: (Node, number, Slice) → ?number\n// Finds a position at or around the given position where the given\n// slice can be inserted. Will look at parent nodes' nearest boundary\n// and try there, even if the original position wasn't directly at the\n// start or end of that node. Returns null when no position was found.\nfunction dropPoint(doc, pos, slice) {\n var $pos = doc.resolve(pos);\n if (!slice.content.size) { return pos }\n var content = slice.content;\n for (var i = 0; i < slice.openStart; i++) { content = content.firstChild.content; }\n for (var pass = 1; pass <= (slice.openStart == 0 && slice.size ? 2 : 1); pass++) {\n for (var d = $pos.depth; d >= 0; d--) {\n var bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1;\n var insertPos = $pos.index(d) + (bias > 0 ? 1 : 0);\n if (pass == 1\n ? $pos.node(d).canReplace(insertPos, insertPos, content)\n : $pos.node(d).contentMatchAt(insertPos).findWrapping(content.firstChild.type))\n { return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1) }\n }\n }\n return null\n}\n\nfunction mapFragment(fragment, f, parent) {\n var mapped = [];\n for (var i = 0; i < fragment.childCount; i++) {\n var child = fragment.child(i);\n if (child.content.size) { child = child.copy(mapFragment(child.content, f, child)); }\n if (child.isInline) { child = f(child, parent, i); }\n mapped.push(child);\n }\n return Fragment.fromArray(mapped)\n}\n\n// ::- Add a mark to all inline content between two positions.\nvar AddMarkStep = /*@__PURE__*/(function (Step) {\n function AddMarkStep(from, to, mark) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.mark = mark;\n }\n\n if ( Step ) AddMarkStep.__proto__ = Step;\n AddMarkStep.prototype = Object.create( Step && Step.prototype );\n AddMarkStep.prototype.constructor = AddMarkStep;\n\n AddMarkStep.prototype.apply = function apply (doc) {\n var this$1 = this;\n\n var oldSlice = doc.slice(this.from, this.to), $from = doc.resolve(this.from);\n var parent = $from.node($from.sharedDepth(this.to));\n var slice = new Slice(mapFragment(oldSlice.content, function (node, parent) {\n if (!node.isAtom || !parent.type.allowsMarkType(this$1.mark.type)) { return node }\n return node.mark(this$1.mark.addToSet(node.marks))\n }, parent), oldSlice.openStart, oldSlice.openEnd);\n return StepResult.fromReplace(doc, this.from, this.to, slice)\n };\n\n AddMarkStep.prototype.invert = function invert () {\n return new RemoveMarkStep(this.from, this.to, this.mark)\n };\n\n AddMarkStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted || from.pos >= to.pos) { return null }\n return new AddMarkStep(from.pos, to.pos, this.mark)\n };\n\n AddMarkStep.prototype.merge = function merge (other) {\n if (other instanceof AddMarkStep &&\n other.mark.eq(this.mark) &&\n this.from <= other.to && this.to >= other.from)\n { return new AddMarkStep(Math.min(this.from, other.from),\n Math.max(this.to, other.to), this.mark) }\n };\n\n AddMarkStep.prototype.toJSON = function toJSON () {\n return {stepType: \"addMark\", mark: this.mark.toJSON(),\n from: this.from, to: this.to}\n };\n\n AddMarkStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n { throw new RangeError(\"Invalid input for AddMarkStep.fromJSON\") }\n return new AddMarkStep(json.from, json.to, schema.markFromJSON(json.mark))\n };\n\n return AddMarkStep;\n}(Step));\n\nStep.jsonID(\"addMark\", AddMarkStep);\n\n// ::- Remove a mark from all inline content between two positions.\nvar RemoveMarkStep = /*@__PURE__*/(function (Step) {\n function RemoveMarkStep(from, to, mark) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.mark = mark;\n }\n\n if ( Step ) RemoveMarkStep.__proto__ = Step;\n RemoveMarkStep.prototype = Object.create( Step && Step.prototype );\n RemoveMarkStep.prototype.constructor = RemoveMarkStep;\n\n RemoveMarkStep.prototype.apply = function apply (doc) {\n var this$1 = this;\n\n var oldSlice = doc.slice(this.from, this.to);\n var slice = new Slice(mapFragment(oldSlice.content, function (node) {\n return node.mark(this$1.mark.removeFromSet(node.marks))\n }), oldSlice.openStart, oldSlice.openEnd);\n return StepResult.fromReplace(doc, this.from, this.to, slice)\n };\n\n RemoveMarkStep.prototype.invert = function invert () {\n return new AddMarkStep(this.from, this.to, this.mark)\n };\n\n RemoveMarkStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted || from.pos >= to.pos) { return null }\n return new RemoveMarkStep(from.pos, to.pos, this.mark)\n };\n\n RemoveMarkStep.prototype.merge = function merge (other) {\n if (other instanceof RemoveMarkStep &&\n other.mark.eq(this.mark) &&\n this.from <= other.to && this.to >= other.from)\n { return new RemoveMarkStep(Math.min(this.from, other.from),\n Math.max(this.to, other.to), this.mark) }\n };\n\n RemoveMarkStep.prototype.toJSON = function toJSON () {\n return {stepType: \"removeMark\", mark: this.mark.toJSON(),\n from: this.from, to: this.to}\n };\n\n RemoveMarkStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n { throw new RangeError(\"Invalid input for RemoveMarkStep.fromJSON\") }\n return new RemoveMarkStep(json.from, json.to, schema.markFromJSON(json.mark))\n };\n\n return RemoveMarkStep;\n}(Step));\n\nStep.jsonID(\"removeMark\", RemoveMarkStep);\n\n// :: (number, number, Mark) → this\n// Add the given mark to the inline content between `from` and `to`.\nTransform.prototype.addMark = function(from, to, mark) {\n var this$1 = this;\n\n var removed = [], added = [], removing = null, adding = null;\n this.doc.nodesBetween(from, to, function (node, pos, parent) {\n if (!node.isInline) { return }\n var marks = node.marks;\n if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) {\n var start = Math.max(pos, from), end = Math.min(pos + node.nodeSize, to);\n var newSet = mark.addToSet(marks);\n\n for (var i = 0; i < marks.length; i++) {\n if (!marks[i].isInSet(newSet)) {\n if (removing && removing.to == start && removing.mark.eq(marks[i]))\n { removing.to = end; }\n else\n { removed.push(removing = new RemoveMarkStep(start, end, marks[i])); }\n }\n }\n\n if (adding && adding.to == start)\n { adding.to = end; }\n else\n { added.push(adding = new AddMarkStep(start, end, mark)); }\n }\n });\n\n removed.forEach(function (s) { return this$1.step(s); });\n added.forEach(function (s) { return this$1.step(s); });\n return this\n};\n\n// :: (number, number, ?union) → this\n// Remove marks from inline nodes between `from` and `to`. When `mark`\n// is a single mark, remove precisely that mark. When it is a mark type,\n// remove all marks of that type. When it is null, remove all marks of\n// any type.\nTransform.prototype.removeMark = function(from, to, mark) {\n var this$1 = this;\n if ( mark === void 0 ) mark = null;\n\n var matched = [], step = 0;\n this.doc.nodesBetween(from, to, function (node, pos) {\n if (!node.isInline) { return }\n step++;\n var toRemove = null;\n if (mark instanceof MarkType) {\n var set = node.marks, found;\n while (found = mark.isInSet(set)) {\n(toRemove || (toRemove = [])).push(found);\n set = found.removeFromSet(set);\n }\n } else if (mark) {\n if (mark.isInSet(node.marks)) { toRemove = [mark]; }\n } else {\n toRemove = node.marks;\n }\n if (toRemove && toRemove.length) {\n var end = Math.min(pos + node.nodeSize, to);\n for (var i = 0; i < toRemove.length; i++) {\n var style = toRemove[i], found$1 = (void 0);\n for (var j = 0; j < matched.length; j++) {\n var m = matched[j];\n if (m.step == step - 1 && style.eq(matched[j].style)) { found$1 = m; }\n }\n if (found$1) {\n found$1.to = end;\n found$1.step = step;\n } else {\n matched.push({style: style, from: Math.max(pos, from), to: end, step: step});\n }\n }\n }\n });\n matched.forEach(function (m) { return this$1.step(new RemoveMarkStep(m.from, m.to, m.style)); });\n return this\n};\n\n// :: (number, NodeType, ?ContentMatch) → this\n// Removes all marks and nodes from the content of the node at `pos`\n// that don't match the given new parent node type. Accepts an\n// optional starting [content match](#model.ContentMatch) as third\n// argument.\nTransform.prototype.clearIncompatible = function(pos, parentType, match) {\n if ( match === void 0 ) match = parentType.contentMatch;\n\n var node = this.doc.nodeAt(pos);\n var delSteps = [], cur = pos + 1;\n for (var i = 0; i < node.childCount; i++) {\n var child = node.child(i), end = cur + child.nodeSize;\n var allowed = match.matchType(child.type, child.attrs);\n if (!allowed) {\n delSteps.push(new ReplaceStep(cur, end, Slice.empty));\n } else {\n match = allowed;\n for (var j = 0; j < child.marks.length; j++) { if (!parentType.allowsMarkType(child.marks[j].type))\n { this.step(new RemoveMarkStep(cur, end, child.marks[j])); } }\n }\n cur = end;\n }\n if (!match.validEnd) {\n var fill = match.fillBefore(Fragment.empty, true);\n this.replace(cur, cur, new Slice(fill, 0, 0));\n }\n for (var i$1 = delSteps.length - 1; i$1 >= 0; i$1--) { this.step(delSteps[i$1]); }\n return this\n};\n\n// :: (Node, number, ?number, ?Slice) → ?Step\n// ‘Fit’ a slice into a given position in the document, producing a\n// [step](#transform.Step) that inserts it. Will return null if\n// there's no meaningful way to insert the slice here, or inserting it\n// would be a no-op (an empty slice over an empty range).\nfunction replaceStep(doc, from, to, slice) {\n if ( to === void 0 ) to = from;\n if ( slice === void 0 ) slice = Slice.empty;\n\n if (from == to && !slice.size) { return null }\n\n var $from = doc.resolve(from), $to = doc.resolve(to);\n // Optimization -- avoid work if it's obvious that it's not needed.\n if (fitsTrivially($from, $to, slice)) { return new ReplaceStep(from, to, slice) }\n return new Fitter($from, $to, slice).fit()\n}\n\n// :: (number, ?number, ?Slice) → this\n// Replace the part of the document between `from` and `to` with the\n// given `slice`.\nTransform.prototype.replace = function(from, to, slice) {\n if ( to === void 0 ) to = from;\n if ( slice === void 0 ) slice = Slice.empty;\n\n var step = replaceStep(this.doc, from, to, slice);\n if (step) { this.step(step); }\n return this\n};\n\n// :: (number, number, union) → this\n// Replace the given range with the given content, which may be a\n// fragment, node, or array of nodes.\nTransform.prototype.replaceWith = function(from, to, content) {\n return this.replace(from, to, new Slice(Fragment.from(content), 0, 0))\n};\n\n// :: (number, number) → this\n// Delete the content between the given positions.\nTransform.prototype.delete = function(from, to) {\n return this.replace(from, to, Slice.empty)\n};\n\n// :: (number, union) → this\n// Insert the given content at the given position.\nTransform.prototype.insert = function(pos, content) {\n return this.replaceWith(pos, pos, content)\n};\n\nfunction fitsTrivially($from, $to, slice) {\n return !slice.openStart && !slice.openEnd && $from.start() == $to.start() &&\n $from.parent.canReplace($from.index(), $to.index(), slice.content)\n}\n\n// Algorithm for 'placing' the elements of a slice into a gap:\n//\n// We consider the content of each node that is open to the left to be\n// independently placeable. I.e. in , when the\n// paragraph on the left is open, \"foo\" can be placed (somewhere on\n// the left side of the replacement gap) independently from p(\"bar\").\n//\n// This class tracks the state of the placement progress in the\n// following properties:\n//\n// - `frontier` holds a stack of `{type, match}` objects that\n// represent the open side of the replacement. It starts at\n// `$from`, then moves forward as content is placed, and is finally\n// reconciled with `$to`.\n//\n// - `unplaced` is a slice that represents the content that hasn't\n// been placed yet.\n//\n// - `placed` is a fragment of placed content. Its open-start value\n// is implicit in `$from`, and its open-end value in `frontier`.\nvar Fitter = function Fitter($from, $to, slice) {\n this.$to = $to;\n this.$from = $from;\n this.unplaced = slice;\n\n this.frontier = [];\n for (var i = 0; i <= $from.depth; i++) {\n var node = $from.node(i);\n this.frontier.push({\n type: node.type,\n match: node.contentMatchAt($from.indexAfter(i))\n });\n }\n\n this.placed = Fragment.empty;\n for (var i$1 = $from.depth; i$1 > 0; i$1--)\n { this.placed = Fragment.from($from.node(i$1).copy(this.placed)); }\n};\n\nvar prototypeAccessors$1 = { depth: { configurable: true } };\n\nprototypeAccessors$1.depth.get = function () { return this.frontier.length - 1 };\n\nFitter.prototype.fit = function fit () {\n // As long as there's unplaced content, try to place some of it.\n // If that fails, either increase the open score of the unplaced\n // slice, or drop nodes from it, and then try again.\n while (this.unplaced.size) {\n var fit = this.findFittable();\n if (fit) { this.placeNodes(fit); }\n else { this.openMore() || this.dropNode(); }\n }\n // When there's inline content directly after the frontier _and_\n // directly after `this.$to`, we must generate a `ReplaceAround`\n // step that pulls that content into the node after the frontier.\n // That means the fitting must be done to the end of the textblock\n // node after `this.$to`, not `this.$to` itself.\n var moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth;\n var $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline));\n if (!$to) { return null }\n\n // If closing to `$to` succeeded, create a step\n var content = this.placed, openStart = $from.depth, openEnd = $to.depth;\n while (openStart && openEnd && content.childCount == 1) { // Normalize by dropping open parent nodes\n content = content.firstChild.content;\n openStart--; openEnd--;\n }\n var slice = new Slice(content, openStart, openEnd);\n if (moveInline > -1)\n { return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice, placedSize) }\n if (slice.size || $from.pos != this.$to.pos) // Don't generate no-op steps\n { return new ReplaceStep($from.pos, $to.pos, slice) }\n};\n\n// Find a position on the start spine of `this.unplaced` that has\n// content that can be moved somewhere on the frontier. Returns two\n// depths, one for the slice and one for the frontier.\nFitter.prototype.findFittable = function findFittable () {\n // Only try wrapping nodes (pass 2) after finding a place without\n // wrapping failed.\n for (var pass = 1; pass <= 2; pass++) {\n for (var sliceDepth = this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) {\n var fragment = (void 0), parent = (void 0);\n if (sliceDepth) {\n parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild;\n fragment = parent.content;\n } else {\n fragment = this.unplaced.content;\n }\n var first = fragment.firstChild;\n for (var frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) {\n var ref = this.frontier[frontierDepth];\n var type = ref.type;\n var match = ref.match;\n var wrap = (void 0), inject = (void 0);\n // In pass 1, if the next node matches, or there is no next\n // node but the parents look compatible, we've found a\n // place.\n if (pass == 1 && (first ? match.matchType(first.type) || (inject = match.fillBefore(Fragment.from(first), false))\n : type.compatibleContent(parent.type)))\n { return {sliceDepth: sliceDepth, frontierDepth: frontierDepth, parent: parent, inject: inject} }\n // In pass 2, look for a set of wrapping nodes that make\n // `first` fit here.\n else if (pass == 2 && first && (wrap = match.findWrapping(first.type)))\n { return {sliceDepth: sliceDepth, frontierDepth: frontierDepth, parent: parent, wrap: wrap} }\n // Don't continue looking further up if the parent node\n // would fit here.\n if (parent && match.matchType(parent.type)) { break }\n }\n }\n }\n};\n\nFitter.prototype.openMore = function openMore () {\n var ref = this.unplaced;\n var content = ref.content;\n var openStart = ref.openStart;\n var openEnd = ref.openEnd;\n var inner = contentAt(content, openStart);\n if (!inner.childCount || inner.firstChild.isLeaf) { return false }\n this.unplaced = new Slice(content, openStart + 1,\n Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0));\n return true\n};\n\nFitter.prototype.dropNode = function dropNode () {\n var ref = this.unplaced;\n var content = ref.content;\n var openStart = ref.openStart;\n var openEnd = ref.openEnd;\n var inner = contentAt(content, openStart);\n if (inner.childCount <= 1 && openStart > 0) {\n var openAtEnd = content.size - openStart <= openStart + inner.size;\n this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1,\n openAtEnd ? openStart - 1 : openEnd);\n } else {\n this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd);\n }\n};\n\n// : ({sliceDepth: number, frontierDepth: number, parent: ?Node, wrap: ?[NodeType], inject: ?Fragment})\n// Move content from the unplaced slice at `sliceDepth` to the\n// frontier node at `frontierDepth`. Close that frontier node when\n// applicable.\nFitter.prototype.placeNodes = function placeNodes (ref) {\n var sliceDepth = ref.sliceDepth;\n var frontierDepth = ref.frontierDepth;\n var parent = ref.parent;\n var inject = ref.inject;\n var wrap = ref.wrap;\n\n while (this.depth > frontierDepth) { this.closeFrontierNode(); }\n if (wrap) { for (var i = 0; i < wrap.length; i++) { this.openFrontierNode(wrap[i]); } }\n\n var slice = this.unplaced, fragment = parent ? parent.content : slice.content;\n var openStart = slice.openStart - sliceDepth;\n var taken = 0, add = [];\n var ref$1 = this.frontier[frontierDepth];\n var match = ref$1.match;\n var type = ref$1.type;\n if (inject) {\n for (var i$1 = 0; i$1 < inject.childCount; i$1++) { add.push(inject.child(i$1)); }\n match = match.matchFragment(inject);\n }\n // Computes the amount of (end) open nodes at the end of the\n // fragment. When 0, the parent is open, but no more. When\n // negative, nothing is open.\n var openEndCount = (fragment.size + sliceDepth) - (slice.content.size - slice.openEnd);\n // Scan over the fragment, fitting as many child nodes as\n // possible.\n while (taken < fragment.childCount) {\n var next = fragment.child(taken), matches = match.matchType(next.type);\n if (!matches) { break }\n taken++;\n if (taken > 1 || openStart == 0 || next.content.size) { // Drop empty open nodes\n match = matches;\n add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0,\n taken == fragment.childCount ? openEndCount : -1));\n }\n }\n var toEnd = taken == fragment.childCount;\n if (!toEnd) { openEndCount = -1; }\n\n this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add));\n this.frontier[frontierDepth].match = match;\n\n // If the parent types match, and the entire node was moved, and\n // it's not open, close this frontier node right away.\n if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1)\n { this.closeFrontierNode(); }\n\n // Add new frontier nodes for any open nodes at the end.\n for (var i$2 = 0, cur = fragment; i$2 < openEndCount; i$2++) {\n var node = cur.lastChild;\n this.frontier.push({type: node.type, match: node.contentMatchAt(node.childCount)});\n cur = node.content;\n }\n\n // Update `this.unplaced`. Drop the entire node from which we\n // placed it we got to its end, otherwise just drop the placed\n // nodes.\n this.unplaced = !toEnd ? new Slice(dropFromFragment(slice.content, sliceDepth, taken), slice.openStart, slice.openEnd)\n : sliceDepth == 0 ? Slice.empty\n : new Slice(dropFromFragment(slice.content, sliceDepth - 1, 1),\n sliceDepth - 1, openEndCount < 0 ? slice.openEnd : sliceDepth - 1);\n};\n\nFitter.prototype.mustMoveInline = function mustMoveInline () {\n if (!this.$to.parent.isTextblock || this.$to.end() == this.$to.pos) { return -1 }\n var top = this.frontier[this.depth], level;\n if (!top.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top.type, top.match, false) ||\n (this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth)) { return -1 }\n\n var ref = this.$to;\n var depth = ref.depth;\n var after = this.$to.after(depth);\n while (depth > 1 && after == this.$to.end(--depth)) { ++after; }\n return after\n};\n\nFitter.prototype.findCloseLevel = function findCloseLevel ($to) {\n scan: for (var i = Math.min(this.depth, $to.depth); i >= 0; i--) {\n var ref = this.frontier[i];\n var match = ref.match;\n var type = ref.type;\n var dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1));\n var fit = contentAfterFits($to, i, type, match, dropInner);\n if (!fit) { continue }\n for (var d = i - 1; d >= 0; d--) {\n var ref$1 = this.frontier[d];\n var match$1 = ref$1.match;\n var type$1 = ref$1.type;\n var matches = contentAfterFits($to, d, type$1, match$1, true);\n if (!matches || matches.childCount) { continue scan }\n }\n return {depth: i, fit: fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to}\n }\n};\n\nFitter.prototype.close = function close ($to) {\n var close = this.findCloseLevel($to);\n if (!close) { return null }\n\n while (this.depth > close.depth) { this.closeFrontierNode(); }\n if (close.fit.childCount) { this.placed = addToFragment(this.placed, close.depth, close.fit); }\n $to = close.move;\n for (var d = close.depth + 1; d <= $to.depth; d++) {\n var node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d));\n this.openFrontierNode(node.type, node.attrs, add);\n }\n return $to\n};\n\nFitter.prototype.openFrontierNode = function openFrontierNode (type, attrs, content) {\n var top = this.frontier[this.depth];\n top.match = top.match.matchType(type);\n this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content)));\n this.frontier.push({type: type, match: type.contentMatch});\n};\n\nFitter.prototype.closeFrontierNode = function closeFrontierNode () {\n var open = this.frontier.pop();\n var add = open.match.fillBefore(Fragment.empty, true);\n if (add.childCount) { this.placed = addToFragment(this.placed, this.frontier.length, add); }\n};\n\nObject.defineProperties( Fitter.prototype, prototypeAccessors$1 );\n\nfunction dropFromFragment(fragment, depth, count) {\n if (depth == 0) { return fragment.cutByIndex(count) }\n return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count)))\n}\n\nfunction addToFragment(fragment, depth, content) {\n if (depth == 0) { return fragment.append(content) }\n return fragment.replaceChild(fragment.childCount - 1,\n fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content)))\n}\n\nfunction contentAt(fragment, depth) {\n for (var i = 0; i < depth; i++) { fragment = fragment.firstChild.content; }\n return fragment\n}\n\nfunction closeNodeStart(node, openStart, openEnd) {\n if (openStart <= 0) { return node }\n var frag = node.content;\n if (openStart > 1)\n { frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0)); }\n if (openStart > 0) {\n frag = node.type.contentMatch.fillBefore(frag).append(frag);\n if (openEnd <= 0) { frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true)); }\n }\n return node.copy(frag)\n}\n\nfunction contentAfterFits($to, depth, type, match, open) {\n var node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth);\n if (index == node.childCount && !type.compatibleContent(node.type)) { return null }\n var fit = match.fillBefore(node.content, true, index);\n return fit && !invalidMarks(type, node.content, index) ? fit : null\n}\n\nfunction invalidMarks(type, fragment, start) {\n for (var i = start; i < fragment.childCount; i++)\n { if (!type.allowsMarks(fragment.child(i).marks)) { return true } }\n return false\n}\n\n// :: (number, number, Slice) → this\n// Replace a range of the document with a given slice, using `from`,\n// `to`, and the slice's [`openStart`](#model.Slice.openStart) property\n// as hints, rather than fixed start and end points. This method may\n// grow the replaced area or close open nodes in the slice in order to\n// get a fit that is more in line with WYSIWYG expectations, by\n// dropping fully covered parent nodes of the replaced region when\n// they are marked [non-defining](#model.NodeSpec.defining), or\n// including an open parent node from the slice that _is_ marked as\n// [defining](#model.NodeSpec.defining).\n//\n// This is the method, for example, to handle paste. The similar\n// [`replace`](#transform.Transform.replace) method is a more\n// primitive tool which will _not_ move the start and end of its given\n// range, and is useful in situations where you need more precise\n// control over what happens.\nTransform.prototype.replaceRange = function(from, to, slice) {\n if (!slice.size) { return this.deleteRange(from, to) }\n\n var $from = this.doc.resolve(from), $to = this.doc.resolve(to);\n if (fitsTrivially($from, $to, slice))\n { return this.step(new ReplaceStep(from, to, slice)) }\n\n var targetDepths = coveredDepths($from, this.doc.resolve(to));\n // Can't replace the whole document, so remove 0 if it's present\n if (targetDepths[targetDepths.length - 1] == 0) { targetDepths.pop(); }\n // Negative numbers represent not expansion over the whole node at\n // that depth, but replacing from $from.before(-D) to $to.pos.\n var preferredTarget = -($from.depth + 1);\n targetDepths.unshift(preferredTarget);\n // This loop picks a preferred target depth, if one of the covering\n // depths is not outside of a defining node, and adds negative\n // depths for any depth that has $from at its start and does not\n // cross a defining node.\n for (var d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) {\n var spec = $from.node(d).type.spec;\n if (spec.defining || spec.isolating) { break }\n if (targetDepths.indexOf(d) > -1) { preferredTarget = d; }\n else if ($from.before(d) == pos) { targetDepths.splice(1, 0, -d); }\n }\n // Try to fit each possible depth of the slice into each possible\n // target depth, starting with the preferred depths.\n var preferredTargetIndex = targetDepths.indexOf(preferredTarget);\n\n var leftNodes = [], preferredDepth = slice.openStart;\n for (var content = slice.content, i = 0;; i++) {\n var node = content.firstChild;\n leftNodes.push(node);\n if (i == slice.openStart) { break }\n content = node.content;\n }\n // Back up if the node directly above openStart, or the node above\n // that separated only by a non-defining textblock node, is defining.\n if (preferredDepth > 0 && leftNodes[preferredDepth - 1].type.spec.defining &&\n $from.node(preferredTargetIndex).type != leftNodes[preferredDepth - 1].type)\n { preferredDepth -= 1; }\n else if (preferredDepth >= 2 && leftNodes[preferredDepth - 1].isTextblock && leftNodes[preferredDepth - 2].type.spec.defining &&\n $from.node(preferredTargetIndex).type != leftNodes[preferredDepth - 2].type)\n { preferredDepth -= 2; }\n\n for (var j = slice.openStart; j >= 0; j--) {\n var openDepth = (j + preferredDepth + 1) % (slice.openStart + 1);\n var insert = leftNodes[openDepth];\n if (!insert) { continue }\n for (var i$1 = 0; i$1 < targetDepths.length; i$1++) {\n // Loop over possible expansion levels, starting with the\n // preferred one\n var targetDepth = targetDepths[(i$1 + preferredTargetIndex) % targetDepths.length], expand = true;\n if (targetDepth < 0) { expand = false; targetDepth = -targetDepth; }\n var parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1);\n if (parent.canReplaceWith(index, index, insert.type, insert.marks))\n { return this.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to,\n new Slice(closeFragment(slice.content, 0, slice.openStart, openDepth),\n openDepth, slice.openEnd)) }\n }\n }\n\n var startSteps = this.steps.length;\n for (var i$2 = targetDepths.length - 1; i$2 >= 0; i$2--) {\n this.replace(from, to, slice);\n if (this.steps.length > startSteps) { break }\n var depth = targetDepths[i$2];\n if (i$2 < 0) { continue }\n from = $from.before(depth); to = $to.after(depth);\n }\n return this\n};\n\nfunction closeFragment(fragment, depth, oldOpen, newOpen, parent) {\n if (depth < oldOpen) {\n var first = fragment.firstChild;\n fragment = fragment.replaceChild(0, first.copy(closeFragment(first.content, depth + 1, oldOpen, newOpen, first)));\n }\n if (depth > newOpen) {\n var match = parent.contentMatchAt(0);\n var start = match.fillBefore(fragment).append(fragment);\n fragment = start.append(match.matchFragment(start).fillBefore(Fragment.empty, true));\n }\n return fragment\n}\n\n// :: (number, number, Node) → this\n// Replace the given range with a node, but use `from` and `to` as\n// hints, rather than precise positions. When from and to are the same\n// and are at the start or end of a parent node in which the given\n// node doesn't fit, this method may _move_ them out towards a parent\n// that does allow the given node to be placed. When the given range\n// completely covers a parent node, this method may completely replace\n// that parent node.\nTransform.prototype.replaceRangeWith = function(from, to, node) {\n if (!node.isInline && from == to && this.doc.resolve(from).parent.content.size) {\n var point = insertPoint(this.doc, from, node.type);\n if (point != null) { from = to = point; }\n }\n return this.replaceRange(from, to, new Slice(Fragment.from(node), 0, 0))\n};\n\n// :: (number, number) → this\n// Delete the given range, expanding it to cover fully covered\n// parent nodes until a valid replace is found.\nTransform.prototype.deleteRange = function(from, to) {\n var $from = this.doc.resolve(from), $to = this.doc.resolve(to);\n var covered = coveredDepths($from, $to);\n for (var i = 0; i < covered.length; i++) {\n var depth = covered[i], last = i == covered.length - 1;\n if ((last && depth == 0) || $from.node(depth).type.contentMatch.validEnd)\n { return this.delete($from.start(depth), $to.end(depth)) }\n if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1))))\n { return this.delete($from.before(depth), $to.after(depth)) }\n }\n for (var d = 1; d <= $from.depth && d <= $to.depth; d++) {\n if (from - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d)\n { return this.delete($from.before(d), to) }\n }\n return this.delete(from, to)\n};\n\n// : (ResolvedPos, ResolvedPos) → [number]\n// Returns an array of all depths for which $from - $to spans the\n// whole content of the nodes at that depth.\nfunction coveredDepths($from, $to) {\n var result = [], minDepth = Math.min($from.depth, $to.depth);\n for (var d = minDepth; d >= 0; d--) {\n var start = $from.start(d);\n if (start < $from.pos - ($from.depth - d) ||\n $to.end(d) > $to.pos + ($to.depth - d) ||\n $from.node(d).type.spec.isolating ||\n $to.node(d).type.spec.isolating) { break }\n if (start == $to.start(d)) { result.push(d); }\n }\n return result\n}\n\nexport { AddMarkStep, MapResult, Mapping, RemoveMarkStep, ReplaceAroundStep, ReplaceStep, Step, StepMap, StepResult, Transform, TransformError, canJoin, canSplit, dropPoint, findWrapping, insertPoint, joinPoint, liftTarget, replaceStep };\n//# sourceMappingURL=index.es.js.map\n","// Utilities\n//\n'use strict';\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction isString(obj) { return _class(obj) === '[object String]'; }\n\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction has(object, key) {\n return _hasOwnProperty.call(object, key);\n}\n\n// Merge objects\n//\nfunction assign(obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n\n sources.forEach(function (source) {\n if (!source) { return; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be object');\n }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key];\n });\n });\n\n return obj;\n}\n\n// Remove element from array and put another array at those position.\n// Useful for some operations with tokens\nfunction arrayReplaceAt(src, pos, newElements) {\n return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1));\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction isValidEntityCode(c) {\n /*eslint no-bitwise:0*/\n // broken sequence\n if (c >= 0xD800 && c <= 0xDFFF) { return false; }\n // never used\n if (c >= 0xFDD0 && c <= 0xFDEF) { return false; }\n if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false; }\n // control codes\n if (c >= 0x00 && c <= 0x08) { return false; }\n if (c === 0x0B) { return false; }\n if (c >= 0x0E && c <= 0x1F) { return false; }\n if (c >= 0x7F && c <= 0x9F) { return false; }\n // out of range\n if (c > 0x10FFFF) { return false; }\n return true;\n}\n\nfunction fromCodePoint(c) {\n /*eslint no-bitwise:0*/\n if (c > 0xffff) {\n c -= 0x10000;\n var surrogate1 = 0xd800 + (c >> 10),\n surrogate2 = 0xdc00 + (c & 0x3ff);\n\n return String.fromCharCode(surrogate1, surrogate2);\n }\n return String.fromCharCode(c);\n}\n\n\nvar UNESCAPE_MD_RE = /\\\\([!\"#$%&'()*+,\\-.\\/:;<=>?@[\\\\\\]^_`{|}~])/g;\nvar ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi;\nvar UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi');\n\nvar DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;\n\nvar entities = require('./entities');\n\nfunction replaceEntityPattern(match, name) {\n var code = 0;\n\n if (has(entities, name)) {\n return entities[name];\n }\n\n if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n code = name[1].toLowerCase() === 'x' ?\n parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10);\n\n if (isValidEntityCode(code)) {\n return fromCodePoint(code);\n }\n }\n\n return match;\n}\n\n/*function replaceEntities(str) {\n if (str.indexOf('&') < 0) { return str; }\n\n return str.replace(ENTITY_RE, replaceEntityPattern);\n}*/\n\nfunction unescapeMd(str) {\n if (str.indexOf('\\\\') < 0) { return str; }\n return str.replace(UNESCAPE_MD_RE, '$1');\n}\n\nfunction unescapeAll(str) {\n if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str; }\n\n return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n if (escaped) { return escaped; }\n return replaceEntityPattern(match, entity);\n });\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar HTML_ESCAPE_TEST_RE = /[&<>\"]/;\nvar HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g;\nvar HTML_REPLACEMENTS = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"'\n};\n\nfunction replaceUnsafeChar(ch) {\n return HTML_REPLACEMENTS[ch];\n}\n\nfunction escapeHtml(str) {\n if (HTML_ESCAPE_TEST_RE.test(str)) {\n return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar);\n }\n return str;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g;\n\nfunction escapeRE(str) {\n return str.replace(REGEXP_ESCAPE_RE, '\\\\$&');\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction isSpace(code) {\n switch (code) {\n case 0x09:\n case 0x20:\n return true;\n }\n return false;\n}\n\n// Zs (unicode class) || [\\t\\f\\v\\r\\n]\nfunction isWhiteSpace(code) {\n if (code >= 0x2000 && code <= 0x200A) { return true; }\n switch (code) {\n case 0x09: // \\t\n case 0x0A: // \\n\n case 0x0B: // \\v\n case 0x0C: // \\f\n case 0x0D: // \\r\n case 0x20:\n case 0xA0:\n case 0x1680:\n case 0x202F:\n case 0x205F:\n case 0x3000:\n return true;\n }\n return false;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/*eslint-disable max-len*/\nvar UNICODE_PUNCT_RE = require('uc.micro/categories/P/regex');\n\n// Currently without astral characters support.\nfunction isPunctChar(ch) {\n return UNICODE_PUNCT_RE.test(ch);\n}\n\n\n// Markdown ASCII punctuation characters.\n//\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\n//\n// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.\n//\nfunction isMdAsciiPunct(ch) {\n switch (ch) {\n case 0x21/* ! */:\n case 0x22/* \" */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x27/* ' */:\n case 0x28/* ( */:\n case 0x29/* ) */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2C/* , */:\n case 0x2D/* - */:\n case 0x2E/* . */:\n case 0x2F/* / */:\n case 0x3A/* : */:\n case 0x3B/* ; */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x3F/* ? */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7C/* | */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true;\n default:\n return false;\n }\n}\n\n// Hepler to unify [reference labels].\n//\nfunction normalizeReference(str) {\n // Trim and collapse whitespace\n //\n str = str.trim().replace(/\\s+/g, ' ');\n\n // In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug\n // fixed in v12 (couldn't find any details).\n //\n // So treat this one as a special case\n // (remove this when node v10 is no longer supported).\n //\n if ('ẞ'.toLowerCase() === 'Ṿ') {\n str = str.replace(/ẞ/g, 'ß');\n }\n\n // .toLowerCase().toUpperCase() should get rid of all differences\n // between letter variants.\n //\n // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently\n // uppercased versions).\n //\n // Here's an example showing how it happens. Lets take greek letter omega:\n // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)\n //\n // Unicode entries:\n // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n // 03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8;\n //\n // Case-insensitive comparison should treat all of them as equivalent.\n //\n // But .toLowerCase() doesn't change ϑ (it's already lowercase),\n // and .toUpperCase() doesn't change ϴ (already uppercase).\n //\n // Applying first lower then upper case normalizes any character:\n // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n //\n // Note: this is equivalent to unicode case folding; unicode normalization\n // is a different step that is not required here.\n //\n // Final result should be uppercased, because it's later stored in an object\n // (this avoid a conflict with Object.prototype members,\n // most notably, `__proto__`)\n //\n return str.toLowerCase().toUpperCase();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Re-export libraries commonly used in both markdown-it and its plugins,\n// so plugins won't have to depend on them explicitly, which reduces their\n// bundled size (e.g. a browser build).\n//\nexports.lib = {};\nexports.lib.mdurl = require('mdurl');\nexports.lib.ucmicro = require('uc.micro');\n\nexports.assign = assign;\nexports.isString = isString;\nexports.has = has;\nexports.unescapeMd = unescapeMd;\nexports.unescapeAll = unescapeAll;\nexports.isValidEntityCode = isValidEntityCode;\nexports.fromCodePoint = fromCodePoint;\n// exports.replaceEntities = replaceEntities;\nexports.escapeHtml = escapeHtml;\nexports.arrayReplaceAt = arrayReplaceAt;\nexports.isSpace = isSpace;\nexports.isWhiteSpace = isWhiteSpace;\nexports.isMdAsciiPunct = isMdAsciiPunct;\nexports.isPunctChar = isPunctChar;\nexports.escapeRE = escapeRE;\nexports.normalizeReference = normalizeReference;\n","import { Plugin } from 'prosemirror-state';\nimport { findWrapping, canJoin } from 'prosemirror-transform';\n\n// ::- Input rules are regular expressions describing a piece of text\n// that, when typed, causes something to happen. This might be\n// changing two dashes into an emdash, wrapping a paragraph starting\n// with `\"> \"` into a blockquote, or something entirely different.\nvar InputRule = function InputRule(match, handler) {\n this.match = match;\n this.handler = typeof handler == \"string\" ? stringHandler(handler) : handler;\n};\n\nfunction stringHandler(string) {\n return function(state, match, start, end) {\n var insert = string;\n if (match[1]) {\n var offset = match[0].lastIndexOf(match[1]);\n insert += match[0].slice(offset + match[1].length);\n start += offset;\n var cutOff = start - end;\n if (cutOff > 0) {\n insert = match[0].slice(offset - cutOff, offset) + insert;\n start = end;\n }\n }\n return state.tr.insertText(insert, start, end)\n }\n}\n\nvar MAX_MATCH = 500;\n\n// :: (config: {rules: [InputRule]}) → Plugin\n// Create an input rules plugin. When enabled, it will cause text\n// input that matches any of the given rules to trigger the rule's\n// action.\nfunction inputRules(ref) {\n var rules = ref.rules;\n\n var plugin = new Plugin({\n state: {\n init: function init() { return null },\n apply: function apply(tr, prev) {\n var stored = tr.getMeta(this);\n if (stored) { return stored }\n return tr.selectionSet || tr.docChanged ? null : prev\n }\n },\n\n props: {\n handleTextInput: function handleTextInput(view, from, to, text) {\n return run(view, from, to, text, rules, plugin)\n },\n handleDOMEvents: {\n compositionend: function (view) {\n setTimeout(function () {\n var ref = view.state.selection;\n var $cursor = ref.$cursor;\n if ($cursor) { run(view, $cursor.pos, $cursor.pos, \"\", rules, plugin); }\n });\n }\n }\n },\n\n isInputRules: true\n });\n return plugin\n}\n\nfunction run(view, from, to, text, rules, plugin) {\n if (view.composing) { return false }\n var state = view.state, $from = state.doc.resolve(from);\n if ($from.parent.type.spec.code) { return false }\n var textBefore = $from.parent.textBetween(Math.max(0, $from.parentOffset - MAX_MATCH), $from.parentOffset,\n null, \"\\ufffc\") + text;\n for (var i = 0; i < rules.length; i++) {\n var match = rules[i].match.exec(textBefore);\n var tr = match && rules[i].handler(state, match, from - (match[0].length - text.length), to);\n if (!tr) { continue }\n view.dispatch(tr.setMeta(plugin, {transform: tr, from: from, to: to, text: text}));\n return true\n }\n return false\n}\n\n// :: (EditorState, ?(Transaction)) → bool\n// This is a command that will undo an input rule, if applying such a\n// rule was the last thing that the user did.\nfunction undoInputRule(state, dispatch) {\n var plugins = state.plugins;\n for (var i = 0; i < plugins.length; i++) {\n var plugin = plugins[i], undoable = (void 0);\n if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) {\n if (dispatch) {\n var tr = state.tr, toUndo = undoable.transform;\n for (var j = toUndo.steps.length - 1; j >= 0; j--)\n { tr.step(toUndo.steps[j].invert(toUndo.docs[j])); }\n if (undoable.text) {\n var marks = tr.doc.resolve(undoable.from).marks();\n tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks));\n } else {\n tr.delete(undoable.from, undoable.to);\n }\n dispatch(tr);\n }\n return true\n }\n }\n return false\n}\n\n// :: InputRule Converts double dashes to an emdash.\nvar emDash = new InputRule(/--$/, \"—\");\n// :: InputRule Converts three dots to an ellipsis character.\nvar ellipsis = new InputRule(/\\.\\.\\.$/, \"…\");\n// :: InputRule “Smart” opening double quotes.\nvar openDoubleQuote = new InputRule(/(?:^|[\\s\\{\\[\\(\\<'\"\\u2018\\u201C])(\")$/, \"“\");\n// :: InputRule “Smart” closing double quotes.\nvar closeDoubleQuote = new InputRule(/\"$/, \"”\");\n// :: InputRule “Smart” opening single quotes.\nvar openSingleQuote = new InputRule(/(?:^|[\\s\\{\\[\\(\\<'\"\\u2018\\u201C])(')$/, \"‘\");\n// :: InputRule “Smart” closing single quotes.\nvar closeSingleQuote = new InputRule(/'$/, \"’\");\n\n// :: [InputRule] Smart-quote related input rules.\nvar smartQuotes = [openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote];\n\n// :: (RegExp, NodeType, ?union, ?([string], Node) → bool) → InputRule\n// Build an input rule for automatically wrapping a textblock when a\n// given string is typed. The `regexp` argument is\n// directly passed through to the `InputRule` constructor. You'll\n// probably want the regexp to start with `^`, so that the pattern can\n// only occur at the start of a textblock.\n//\n// `nodeType` is the type of node to wrap in. If it needs attributes,\n// you can either pass them directly, or pass a function that will\n// compute them from the regular expression match.\n//\n// By default, if there's a node with the same type above the newly\n// wrapped node, the rule will try to [join](#transform.Transform.join) those\n// two nodes. You can pass a join predicate, which takes a regular\n// expression match and the node before the wrapped node, and can\n// return a boolean to indicate whether a join should happen.\nfunction wrappingInputRule(regexp, nodeType, getAttrs, joinPredicate) {\n return new InputRule(regexp, function (state, match, start, end) {\n var attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n var tr = state.tr.delete(start, end);\n var $start = tr.doc.resolve(start), range = $start.blockRange(), wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping) { return null }\n tr.wrap(range, wrapping);\n var before = tr.doc.resolve(start - 1).nodeBefore;\n if (before && before.type == nodeType && canJoin(tr.doc, start - 1) &&\n (!joinPredicate || joinPredicate(match, before)))\n { tr.join(start - 1); }\n return tr\n })\n}\n\n// :: (RegExp, NodeType, ?union) → InputRule\n// Build an input rule that changes the type of a textblock when the\n// matched text is typed into it. You'll usually want to start your\n// regexp with `^` to that it is only matched at the start of a\n// textblock. The optional `getAttrs` parameter can be used to compute\n// the new node's attributes, and works the same as in the\n// `wrappingInputRule` function.\nfunction textblockTypeInputRule(regexp, nodeType, getAttrs) {\n return new InputRule(regexp, function (state, match, start, end) {\n var $start = state.doc.resolve(start);\n var attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), nodeType)) { return null }\n return state.tr\n .delete(start, end)\n .setBlockType(start, start, nodeType, attrs)\n })\n}\n\nexport { InputRule, closeDoubleQuote, closeSingleQuote, ellipsis, emDash, inputRules, openDoubleQuote, openSingleQuote, smartQuotes, textblockTypeInputRule, undoInputRule, wrappingInputRule };\n//# sourceMappingURL=index.es.js.map\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"@babel/runtime/helpers/esm/setPrototypeOf\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","import { Schema, Mark } from 'prosemirror-model';\nimport markdownit from 'markdown-it';\n\n// ::Schema Document schema for the data model used by CommonMark.\nvar schema = new Schema({\n nodes: {\n doc: {\n content: \"block+\"\n },\n\n paragraph: {\n content: \"inline*\",\n group: \"block\",\n parseDOM: [{tag: \"p\"}],\n toDOM: function toDOM() { return [\"p\", 0] }\n },\n\n blockquote: {\n content: \"block+\",\n group: \"block\",\n parseDOM: [{tag: \"blockquote\"}],\n toDOM: function toDOM() { return [\"blockquote\", 0] }\n },\n\n horizontal_rule: {\n group: \"block\",\n parseDOM: [{tag: \"hr\"}],\n toDOM: function toDOM() { return [\"div\", [\"hr\"]] }\n },\n\n heading: {\n attrs: {level: {default: 1}},\n content: \"(text | image)*\",\n group: \"block\",\n defining: true,\n parseDOM: [{tag: \"h1\", attrs: {level: 1}},\n {tag: \"h2\", attrs: {level: 2}},\n {tag: \"h3\", attrs: {level: 3}},\n {tag: \"h4\", attrs: {level: 4}},\n {tag: \"h5\", attrs: {level: 5}},\n {tag: \"h6\", attrs: {level: 6}}],\n toDOM: function toDOM(node) { return [\"h\" + node.attrs.level, 0] }\n },\n\n code_block: {\n content: \"text*\",\n group: \"block\",\n code: true,\n defining: true,\n marks: \"\",\n attrs: {params: {default: \"\"}},\n parseDOM: [{tag: \"pre\", preserveWhitespace: \"full\", getAttrs: function (node) { return (\n {params: node.getAttribute(\"data-params\") || \"\"}\n ); }}],\n toDOM: function toDOM(node) { return [\"pre\", node.attrs.params ? {\"data-params\": node.attrs.params} : {}, [\"code\", 0]] }\n },\n\n ordered_list: {\n content: \"list_item+\",\n group: \"block\",\n attrs: {order: {default: 1}, tight: {default: false}},\n parseDOM: [{tag: \"ol\", getAttrs: function getAttrs(dom) {\n return {order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\") : 1,\n tight: dom.hasAttribute(\"data-tight\")}\n }}],\n toDOM: function toDOM(node) {\n return [\"ol\", {start: node.attrs.order == 1 ? null : node.attrs.order,\n \"data-tight\": node.attrs.tight ? \"true\" : null}, 0]\n }\n },\n\n bullet_list: {\n content: \"list_item+\",\n group: \"block\",\n attrs: {tight: {default: false}},\n parseDOM: [{tag: \"ul\", getAttrs: function (dom) { return ({tight: dom.hasAttribute(\"data-tight\")}); }}],\n toDOM: function toDOM(node) { return [\"ul\", {\"data-tight\": node.attrs.tight ? \"true\" : null}, 0] }\n },\n\n list_item: {\n content: \"paragraph block*\",\n defining: true,\n parseDOM: [{tag: \"li\"}],\n toDOM: function toDOM() { return [\"li\", 0] }\n },\n\n text: {\n group: \"inline\"\n },\n\n image: {\n inline: true,\n attrs: {\n src: {},\n alt: {default: null},\n title: {default: null}\n },\n group: \"inline\",\n draggable: true,\n parseDOM: [{tag: \"img[src]\", getAttrs: function getAttrs(dom) {\n return {\n src: dom.getAttribute(\"src\"),\n title: dom.getAttribute(\"title\"),\n alt: dom.getAttribute(\"alt\")\n }\n }}],\n toDOM: function toDOM(node) { return [\"img\", node.attrs] }\n },\n\n hard_break: {\n inline: true,\n group: \"inline\",\n selectable: false,\n parseDOM: [{tag: \"br\"}],\n toDOM: function toDOM() { return [\"br\"] }\n }\n },\n\n marks: {\n em: {\n parseDOM: [{tag: \"i\"}, {tag: \"em\"},\n {style: \"font-style\", getAttrs: function (value) { return value == \"italic\" && null; }}],\n toDOM: function toDOM() { return [\"em\"] }\n },\n\n strong: {\n parseDOM: [{tag: \"b\"}, {tag: \"strong\"},\n {style: \"font-weight\", getAttrs: function (value) { return /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null; }}],\n toDOM: function toDOM() { return [\"strong\"] }\n },\n\n link: {\n attrs: {\n href: {},\n title: {default: null}\n },\n inclusive: false,\n parseDOM: [{tag: \"a[href]\", getAttrs: function getAttrs(dom) {\n return {href: dom.getAttribute(\"href\"), title: dom.getAttribute(\"title\")}\n }}],\n toDOM: function toDOM(node) { return [\"a\", node.attrs] }\n },\n\n code: {\n parseDOM: [{tag: \"code\"}],\n toDOM: function toDOM() { return [\"code\"] }\n }\n }\n});\n\nfunction maybeMerge(a, b) {\n if (a.isText && b.isText && Mark.sameSet(a.marks, b.marks))\n { return a.withText(a.text + b.text) }\n}\n\n// Object used to track the context of a running parse.\nvar MarkdownParseState = function MarkdownParseState(schema, tokenHandlers) {\n this.schema = schema;\n this.stack = [{type: schema.topNodeType, content: []}];\n this.marks = Mark.none;\n this.tokenHandlers = tokenHandlers;\n};\n\nMarkdownParseState.prototype.top = function top () {\n return this.stack[this.stack.length - 1]\n};\n\nMarkdownParseState.prototype.push = function push (elt) {\n if (this.stack.length) { this.top().content.push(elt); }\n};\n\n// : (string)\n// Adds the given text to the current position in the document,\n// using the current marks as styling.\nMarkdownParseState.prototype.addText = function addText (text) {\n if (!text) { return }\n var nodes = this.top().content, last = nodes[nodes.length - 1];\n var node = this.schema.text(text, this.marks), merged;\n if (last && (merged = maybeMerge(last, node))) { nodes[nodes.length - 1] = merged; }\n else { nodes.push(node); }\n};\n\n// : (Mark)\n// Adds the given mark to the set of active marks.\nMarkdownParseState.prototype.openMark = function openMark (mark) {\n this.marks = mark.addToSet(this.marks);\n};\n\n// : (Mark)\n// Removes the given mark from the set of active marks.\nMarkdownParseState.prototype.closeMark = function closeMark (mark) {\n this.marks = mark.removeFromSet(this.marks);\n};\n\nMarkdownParseState.prototype.parseTokens = function parseTokens (toks) {\n for (var i = 0; i < toks.length; i++) {\n var tok = toks[i];\n var handler = this.tokenHandlers[tok.type];\n if (!handler)\n { throw new Error(\"Token type `\" + tok.type + \"` not supported by Markdown parser\") }\n handler(this, tok, toks, i);\n }\n};\n\n// : (NodeType, ?Object, ?[Node]) → ?Node\n// Add a node at the current position.\nMarkdownParseState.prototype.addNode = function addNode (type, attrs, content) {\n var node = type.createAndFill(attrs, content, this.marks);\n if (!node) { return null }\n this.push(node);\n return node\n};\n\n// : (NodeType, ?Object)\n// Wrap subsequent content in a node of the given type.\nMarkdownParseState.prototype.openNode = function openNode (type, attrs) {\n this.stack.push({type: type, attrs: attrs, content: []});\n};\n\n// : () → ?Node\n// Close and return the node that is currently on top of the stack.\nMarkdownParseState.prototype.closeNode = function closeNode () {\n if (this.marks.length) { this.marks = Mark.none; }\n var info = this.stack.pop();\n return this.addNode(info.type, info.attrs, info.content)\n};\n\nfunction attrs(spec, token, tokens, i) {\n if (spec.getAttrs) { return spec.getAttrs(token, tokens, i) }\n // For backwards compatibility when `attrs` is a Function\n else if (spec.attrs instanceof Function) { return spec.attrs(token) }\n else { return spec.attrs }\n}\n\n// Code content is represented as a single token with a `content`\n// property in Markdown-it.\nfunction noCloseToken(spec, type) {\n return spec.noCloseToken || type == \"code_inline\" || type == \"code_block\" || type == \"fence\"\n}\n\nfunction withoutTrailingNewline(str) {\n return str[str.length - 1] == \"\\n\" ? str.slice(0, str.length - 1) : str\n}\n\nfunction noOp() {}\n\nfunction tokenHandlers(schema, tokens) {\n var handlers = Object.create(null);\n var loop = function ( type ) {\n var spec = tokens[type];\n if (spec.block) {\n var nodeType = schema.nodeType(spec.block);\n if (noCloseToken(spec, type)) {\n handlers[type] = function (state, tok, tokens, i) {\n state.openNode(nodeType, attrs(spec, tok, tokens, i));\n state.addText(withoutTrailingNewline(tok.content));\n state.closeNode();\n };\n } else {\n handlers[type + \"_open\"] = function (state, tok, tokens, i) { return state.openNode(nodeType, attrs(spec, tok, tokens, i)); };\n handlers[type + \"_close\"] = function (state) { return state.closeNode(); };\n }\n } else if (spec.node) {\n var nodeType$1 = schema.nodeType(spec.node);\n handlers[type] = function (state, tok, tokens, i) { return state.addNode(nodeType$1, attrs(spec, tok, tokens, i)); };\n } else if (spec.mark) {\n var markType = schema.marks[spec.mark];\n if (noCloseToken(spec, type)) {\n handlers[type] = function (state, tok, tokens, i) {\n state.openMark(markType.create(attrs(spec, tok, tokens, i)));\n state.addText(withoutTrailingNewline(tok.content));\n state.closeMark(markType);\n };\n } else {\n handlers[type + \"_open\"] = function (state, tok, tokens, i) { return state.openMark(markType.create(attrs(spec, tok, tokens, i))); };\n handlers[type + \"_close\"] = function (state) { return state.closeMark(markType); };\n }\n } else if (spec.ignore) {\n if (noCloseToken(spec, type)) {\n handlers[type] = noOp;\n } else {\n handlers[type + '_open'] = noOp;\n handlers[type + '_close'] = noOp;\n }\n } else {\n throw new RangeError(\"Unrecognized parsing spec \" + JSON.stringify(spec))\n }\n };\n\n for (var type in tokens) loop( type );\n\n handlers.text = function (state, tok) { return state.addText(tok.content); };\n handlers.inline = function (state, tok) { return state.parseTokens(tok.children); };\n handlers.softbreak = handlers.softbreak || (function (state) { return state.addText(\"\\n\"); });\n\n return handlers\n}\n\n// ::- A configuration of a Markdown parser. Such a parser uses\n// [markdown-it](https://github.com/markdown-it/markdown-it) to\n// tokenize a file, and then runs the custom rules it is given over\n// the tokens to create a ProseMirror document tree.\nvar MarkdownParser = function MarkdownParser(schema, tokenizer, tokens) {\n // :: Object The value of the `tokens` object used to construct\n // this parser. Can be useful to copy and modify to base other\n // parsers on.\n this.tokens = tokens;\n this.schema = schema;\n this.tokenizer = tokenizer;\n this.tokenHandlers = tokenHandlers(schema, tokens);\n};\n\n// :: (string) → Node\n// Parse a string as [CommonMark](http://commonmark.org/) markup,\n// and create a ProseMirror document as prescribed by this parser's\n// rules.\nMarkdownParser.prototype.parse = function parse (text) {\n var state = new MarkdownParseState(this.schema, this.tokenHandlers), doc;\n state.parseTokens(this.tokenizer.parse(text, {}));\n do { doc = state.closeNode(); } while (state.stack.length)\n return doc\n};\n\nfunction listIsTight(tokens, i) {\n while (++i < tokens.length)\n { if (tokens[i].type != \"list_item_open\") { return tokens[i].hidden } }\n return false\n}\n\n// :: MarkdownParser\n// A parser parsing unextended [CommonMark](http://commonmark.org/),\n// without inline HTML, and producing a document in the basic schema.\nvar defaultMarkdownParser = new MarkdownParser(schema, markdownit(\"commonmark\", {html: false}), {\n blockquote: {block: \"blockquote\"},\n paragraph: {block: \"paragraph\"},\n list_item: {block: \"list_item\"},\n bullet_list: {block: \"bullet_list\", getAttrs: function (_, tokens, i) { return ({tight: listIsTight(tokens, i)}); }},\n ordered_list: {block: \"ordered_list\", getAttrs: function (tok, tokens, i) { return ({\n order: +tok.attrGet(\"start\") || 1,\n tight: listIsTight(tokens, i)\n }); }},\n heading: {block: \"heading\", getAttrs: function (tok) { return ({level: +tok.tag.slice(1)}); }},\n code_block: {block: \"code_block\", noCloseToken: true},\n fence: {block: \"code_block\", getAttrs: function (tok) { return ({params: tok.info || \"\"}); }, noCloseToken: true},\n hr: {node: \"horizontal_rule\"},\n image: {node: \"image\", getAttrs: function (tok) { return ({\n src: tok.attrGet(\"src\"),\n title: tok.attrGet(\"title\") || null,\n alt: tok.children[0] && tok.children[0].content || null\n }); }},\n hardbreak: {node: \"hard_break\"},\n\n em: {mark: \"em\"},\n strong: {mark: \"strong\"},\n link: {mark: \"link\", getAttrs: function (tok) { return ({\n href: tok.attrGet(\"href\"),\n title: tok.attrGet(\"title\") || null\n }); }},\n code_inline: {mark: \"code\", noCloseToken: true}\n});\n\n// ::- A specification for serializing a ProseMirror document as\n// Markdown/CommonMark text.\nvar MarkdownSerializer = function MarkdownSerializer(nodes, marks) {\n // :: Object<(MarkdownSerializerState, Node)> The node serializer\n // functions for this serializer.\n this.nodes = nodes;\n // :: Object The mark serializer info.\n this.marks = marks;\n};\n\n// :: (Node, ?Object) → string\n// Serialize the content of the given node to\n// [CommonMark](http://commonmark.org/).\nMarkdownSerializer.prototype.serialize = function serialize (content, options) {\n var state = new MarkdownSerializerState(this.nodes, this.marks, options);\n state.renderContent(content);\n return state.out\n};\n\n// :: MarkdownSerializer\n// A serializer for the [basic schema](#schema).\nvar defaultMarkdownSerializer = new MarkdownSerializer({\n blockquote: function blockquote(state, node) {\n state.wrapBlock(\"> \", null, node, function () { return state.renderContent(node); });\n },\n code_block: function code_block(state, node) {\n state.write(\"```\" + (node.attrs.params || \"\") + \"\\n\");\n state.text(node.textContent, false);\n state.ensureNewLine();\n state.write(\"```\");\n state.closeBlock(node);\n },\n heading: function heading(state, node) {\n state.write(state.repeat(\"#\", node.attrs.level) + \" \");\n state.renderInline(node);\n state.closeBlock(node);\n },\n horizontal_rule: function horizontal_rule(state, node) {\n state.write(node.attrs.markup || \"---\");\n state.closeBlock(node);\n },\n bullet_list: function bullet_list(state, node) {\n state.renderList(node, \" \", function () { return (node.attrs.bullet || \"*\") + \" \"; });\n },\n ordered_list: function ordered_list(state, node) {\n var start = node.attrs.order || 1;\n var maxW = String(start + node.childCount - 1).length;\n var space = state.repeat(\" \", maxW + 2);\n state.renderList(node, space, function (i) {\n var nStr = String(start + i);\n return state.repeat(\" \", maxW - nStr.length) + nStr + \". \"\n });\n },\n list_item: function list_item(state, node) {\n state.renderContent(node);\n },\n paragraph: function paragraph(state, node) {\n state.renderInline(node);\n state.closeBlock(node);\n },\n\n image: function image(state, node) {\n state.write(\"![\" + state.esc(node.attrs.alt || \"\") + \"](\" + state.esc(node.attrs.src) +\n (node.attrs.title ? \" \" + state.quote(node.attrs.title) : \"\") + \")\");\n },\n hard_break: function hard_break(state, node, parent, index) {\n for (var i = index + 1; i < parent.childCount; i++)\n { if (parent.child(i).type != node.type) {\n state.write(\"\\\\\\n\");\n return\n } }\n },\n text: function text(state, node) {\n state.text(node.text);\n }\n}, {\n em: {open: \"*\", close: \"*\", mixable: true, expelEnclosingWhitespace: true},\n strong: {open: \"**\", close: \"**\", mixable: true, expelEnclosingWhitespace: true},\n link: {\n open: function open(_state, mark, parent, index) {\n return isPlainURL(mark, parent, index, 1) ? \"<\" : \"[\"\n },\n close: function close(state, mark, parent, index) {\n return isPlainURL(mark, parent, index, -1) ? \">\"\n : \"](\" + state.esc(mark.attrs.href) + (mark.attrs.title ? \" \" + state.quote(mark.attrs.title) : \"\") + \")\"\n }\n },\n code: {open: function open(_state, _mark, parent, index) { return backticksFor(parent.child(index), -1) },\n close: function close(_state, _mark, parent, index) { return backticksFor(parent.child(index - 1), 1) },\n escape: false}\n});\n\nfunction backticksFor(node, side) {\n var ticks = /`+/g, m, len = 0;\n if (node.isText) { while (m = ticks.exec(node.text)) { len = Math.max(len, m[0].length); } }\n var result = len > 0 && side > 0 ? \" `\" : \"`\";\n for (var i = 0; i < len; i++) { result += \"`\"; }\n if (len > 0 && side < 0) { result += \" \"; }\n return result\n}\n\nfunction isPlainURL(link, parent, index, side) {\n if (link.attrs.title || !/^\\w+:/.test(link.attrs.href)) { return false }\n var content = parent.child(index + (side < 0 ? -1 : 0));\n if (!content.isText || content.text != link.attrs.href || content.marks[content.marks.length - 1] != link) { return false }\n if (index == (side < 0 ? 1 : parent.childCount - 1)) { return true }\n var next = parent.child(index + (side < 0 ? -2 : 1));\n return !link.isInSet(next.marks)\n}\n\n// ::- This is an object used to track state and expose\n// methods related to markdown serialization. Instances are passed to\n// node and mark serialization methods (see `toMarkdown`).\nvar MarkdownSerializerState = function MarkdownSerializerState(nodes, marks, options) {\n this.nodes = nodes;\n this.marks = marks;\n this.delim = this.out = \"\";\n this.closed = false;\n this.inTightList = false;\n // :: Object\n // The options passed to the serializer.\n // tightLists:: ?bool\n // Whether to render lists in a tight style. This can be overridden\n // on a node level by specifying a tight attribute on the node.\n // Defaults to false.\n this.options = options || {};\n if (typeof this.options.tightLists == \"undefined\")\n { this.options.tightLists = false; }\n};\n\nMarkdownSerializerState.prototype.flushClose = function flushClose (size) {\n if (this.closed) {\n if (!this.atBlank()) { this.out += \"\\n\"; }\n if (size == null) { size = 2; }\n if (size > 1) {\n var delimMin = this.delim;\n var trim = /\\s+$/.exec(delimMin);\n if (trim) { delimMin = delimMin.slice(0, delimMin.length - trim[0].length); }\n for (var i = 1; i < size; i++)\n { this.out += delimMin + \"\\n\"; }\n }\n this.closed = false;\n }\n};\n\n// :: (string, ?string, Node, ())\n// Render a block, prefixing each line with `delim`, and the first\n// line in `firstDelim`. `node` should be the node that is closed at\n// the end of the block, and `f` is a function that renders the\n// content of the block.\nMarkdownSerializerState.prototype.wrapBlock = function wrapBlock (delim, firstDelim, node, f) {\n var old = this.delim;\n this.write(firstDelim || delim);\n this.delim += delim;\n f();\n this.delim = old;\n this.closeBlock(node);\n};\n\nMarkdownSerializerState.prototype.atBlank = function atBlank () {\n return /(^|\\n)$/.test(this.out)\n};\n\n// :: ()\n// Ensure the current content ends with a newline.\nMarkdownSerializerState.prototype.ensureNewLine = function ensureNewLine () {\n if (!this.atBlank()) { this.out += \"\\n\"; }\n};\n\n// :: (?string)\n// Prepare the state for writing output (closing closed paragraphs,\n// adding delimiters, and so on), and then optionally add content\n// (unescaped) to the output.\nMarkdownSerializerState.prototype.write = function write (content) {\n this.flushClose();\n if (this.delim && this.atBlank())\n { this.out += this.delim; }\n if (content) { this.out += content; }\n};\n\n// :: (Node)\n// Close the block for the given node.\nMarkdownSerializerState.prototype.closeBlock = function closeBlock (node) {\n this.closed = node;\n};\n\n// :: (string, ?bool)\n// Add the given text to the document. When escape is not `false`,\n// it will be escaped.\nMarkdownSerializerState.prototype.text = function text (text$1, escape) {\n var lines = text$1.split(\"\\n\");\n for (var i = 0; i < lines.length; i++) {\n var startOfLine = this.atBlank() || this.closed;\n this.write();\n this.out += escape !== false ? this.esc(lines[i], startOfLine) : lines[i];\n if (i != lines.length - 1) { this.out += \"\\n\"; }\n }\n};\n\n// :: (Node)\n// Render the given node as a block.\nMarkdownSerializerState.prototype.render = function render (node, parent, index) {\n if (typeof parent == \"number\") { throw new Error(\"!\") }\n if (!this.nodes[node.type.name]) { throw new Error(\"Token type `\" + node.type.name + \"` not supported by Markdown renderer\") }\n this.nodes[node.type.name](this, node, parent, index);\n};\n\n// :: (Node)\n// Render the contents of `parent` as block nodes.\nMarkdownSerializerState.prototype.renderContent = function renderContent (parent) {\n var this$1 = this;\n\n parent.forEach(function (node, _, i) { return this$1.render(node, parent, i); });\n};\n\n// :: (Node)\n// Render the contents of `parent` as inline content.\nMarkdownSerializerState.prototype.renderInline = function renderInline (parent) {\n var this$1 = this;\n\n var active = [], trailing = \"\";\n var progress = function (node, _, index) {\n var marks = node ? node.marks : [];\n\n // Remove marks from `hard_break` that are the last node inside\n // that mark to prevent parser edge cases with new lines just\n // before closing marks.\n // (FIXME it'd be nice if we had a schema-agnostic way to\n // identify nodes that serialize as hard breaks)\n if (node && node.type.name === \"hard_break\")\n { marks = marks.filter(function (m) {\n if (index + 1 == parent.childCount) { return false }\n var next = parent.child(index + 1);\n return m.isInSet(next.marks) && (!next.isText || /\\S/.test(next.text))\n }); }\n\n var leading = trailing;\n trailing = \"\";\n // If whitespace has to be expelled from the node, adjust\n // leading and trailing accordingly.\n if (node && node.isText && marks.some(function (mark) {\n var info = this$1.marks[mark.type.name];\n return info && info.expelEnclosingWhitespace\n })) {\n var ref = /^(\\s*)(.*?)(\\s*)$/m.exec(node.text);\n var _$1 = ref[0];\n var lead = ref[1];\n var inner$1 = ref[2];\n var trail = ref[3];\n leading += lead;\n trailing = trail;\n if (lead || trail) {\n node = inner$1 ? node.withText(inner$1) : null;\n if (!node) { marks = active; }\n }\n }\n\n var inner = marks.length && marks[marks.length - 1], noEsc = inner && this$1.marks[inner.type.name].escape === false;\n var len = marks.length - (noEsc ? 1 : 0);\n\n // Try to reorder 'mixable' marks, such as em and strong, which\n // in Markdown may be opened and closed in different order, so\n // that order of the marks for the token matches the order in\n // active.\n outer: for (var i = 0; i < len; i++) {\n var mark = marks[i];\n if (!this$1.marks[mark.type.name].mixable) { break }\n for (var j = 0; j < active.length; j++) {\n var other = active[j];\n if (!this$1.marks[other.type.name].mixable) { break }\n if (mark.eq(other)) {\n if (i > j)\n { marks = marks.slice(0, j).concat(mark).concat(marks.slice(j, i)).concat(marks.slice(i + 1, len)); }\n else if (j > i)\n { marks = marks.slice(0, i).concat(marks.slice(i + 1, j)).concat(mark).concat(marks.slice(j, len)); }\n continue outer\n }\n }\n }\n\n // Find the prefix of the mark set that didn't change\n var keep = 0;\n while (keep < Math.min(active.length, len) && marks[keep].eq(active[keep])) { ++keep; }\n\n // Close the marks that need to be closed\n while (keep < active.length)\n { this$1.text(this$1.markString(active.pop(), false, parent, index), false); }\n\n // Output any previously expelled trailing whitespace outside the marks\n if (leading) { this$1.text(leading); }\n\n // Open the marks that need to be opened\n if (node) {\n while (active.length < len) {\n var add = marks[active.length];\n active.push(add);\n this$1.text(this$1.markString(add, true, parent, index), false);\n }\n\n // Render the node. Special case code marks, since their content\n // may not be escaped.\n if (noEsc && node.isText)\n { this$1.text(this$1.markString(inner, true, parent, index) + node.text +\n this$1.markString(inner, false, parent, index + 1), false); }\n else\n { this$1.render(node, parent, index); }\n }\n };\n parent.forEach(progress);\n progress(null, null, parent.childCount);\n};\n\n// :: (Node, string, (number) → string)\n// Render a node's content as a list. `delim` should be the extra\n// indentation added to all lines except the first in an item,\n// `firstDelim` is a function going from an item index to a\n// delimiter for the first line of the item.\nMarkdownSerializerState.prototype.renderList = function renderList (node, delim, firstDelim) {\n var this$1 = this;\n\n if (this.closed && this.closed.type == node.type)\n { this.flushClose(3); }\n else if (this.inTightList)\n { this.flushClose(1); }\n\n var isTight = typeof node.attrs.tight != \"undefined\" ? node.attrs.tight : this.options.tightLists;\n var prevTight = this.inTightList;\n this.inTightList = isTight;\n node.forEach(function (child, _, i) {\n if (i && isTight) { this$1.flushClose(1); }\n this$1.wrapBlock(delim, firstDelim(i), node, function () { return this$1.render(child, node, i); });\n });\n this.inTightList = prevTight;\n};\n\n// :: (string, ?bool) → string\n// Escape the given string so that it can safely appear in Markdown\n// content. If `startOfLine` is true, also escape characters that\n// have special meaning only at the start of the line.\nMarkdownSerializerState.prototype.esc = function esc (str, startOfLine) {\n str = str.replace(/[`*\\\\~\\[\\]]/g, \"\\\\$&\");\n if (startOfLine) { str = str.replace(/^[:#\\-*+]/, \"\\\\$&\").replace(/^(\\s*\\d+)\\./, \"$1\\\\.\"); }\n return str\n};\n\nMarkdownSerializerState.prototype.quote = function quote (str) {\n var wrap = str.indexOf('\"') == -1 ? '\"\"' : str.indexOf(\"'\") == -1 ? \"''\" : \"()\";\n return wrap[0] + str + wrap[1]\n};\n\n// :: (string, number) → string\n// Repeat the given string `n` times.\nMarkdownSerializerState.prototype.repeat = function repeat (str, n) {\n var out = \"\";\n for (var i = 0; i < n; i++) { out += str; }\n return out\n};\n\n// : (Mark, bool, string?) → string\n// Get the markdown string for a given opening or closing mark.\nMarkdownSerializerState.prototype.markString = function markString (mark, open, parent, index) {\n var info = this.marks[mark.type.name];\n var value = open ? info.open : info.close;\n return typeof value == \"string\" ? value : value(this, mark, parent, index)\n};\n\n// :: (string) → { leading: ?string, trailing: ?string }\n// Get leading and trailing whitespace from a string. Values of\n// leading or trailing property of the return object will be undefined\n// if there is no match.\nMarkdownSerializerState.prototype.getEnclosingWhitespace = function getEnclosingWhitespace (text) {\n return {\n leading: (text.match(/^(\\s+)/) || [])[0],\n trailing: (text.match(/(\\s+)$/) || [])[0]\n }\n};\n\nexport { MarkdownParser, MarkdownSerializer, MarkdownSerializerState, defaultMarkdownParser, defaultMarkdownSerializer, schema };\n//# sourceMappingURL=index.es.js.map\n","import { findWrapping, ReplaceAroundStep, canSplit, liftTarget } from 'prosemirror-transform';\nimport { NodeRange, Fragment, Slice } from 'prosemirror-model';\n\nvar olDOM = [\"ol\", 0], ulDOM = [\"ul\", 0], liDOM = [\"li\", 0];\n\n// :: NodeSpec\n// An ordered list [node spec](#model.NodeSpec). Has a single\n// attribute, `order`, which determines the number at which the list\n// starts counting, and defaults to 1. Represented as an `
    `\n// element.\nvar orderedList = {\n attrs: {order: {default: 1}},\n parseDOM: [{tag: \"ol\", getAttrs: function getAttrs(dom) {\n return {order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\") : 1}\n }}],\n toDOM: function toDOM(node) {\n return node.attrs.order == 1 ? olDOM : [\"ol\", {start: node.attrs.order}, 0]\n }\n};\n\n// :: NodeSpec\n// A bullet list node spec, represented in the DOM as `
      `.\nvar bulletList = {\n parseDOM: [{tag: \"ul\"}],\n toDOM: function toDOM() { return ulDOM }\n};\n\n// :: NodeSpec\n// A list item (`
    • `) spec.\nvar listItem = {\n parseDOM: [{tag: \"li\"}],\n toDOM: function toDOM() { return liDOM },\n defining: true\n};\n\nfunction add(obj, props) {\n var copy = {};\n for (var prop in obj) { copy[prop] = obj[prop]; }\n for (var prop$1 in props) { copy[prop$1] = props[prop$1]; }\n return copy\n}\n\n// :: (OrderedMap, string, ?string) → OrderedMap\n// Convenience function for adding list-related node types to a map\n// specifying the nodes for a schema. Adds\n// [`orderedList`](#schema-list.orderedList) as `\"ordered_list\"`,\n// [`bulletList`](#schema-list.bulletList) as `\"bullet_list\"`, and\n// [`listItem`](#schema-list.listItem) as `\"list_item\"`.\n//\n// `itemContent` determines the content expression for the list items.\n// If you want the commands defined in this module to apply to your\n// list structure, it should have a shape like `\"paragraph block*\"` or\n// `\"paragraph (ordered_list | bullet_list)*\"`. `listGroup` can be\n// given to assign a group name to the list node types, for example\n// `\"block\"`.\nfunction addListNodes(nodes, itemContent, listGroup) {\n return nodes.append({\n ordered_list: add(orderedList, {content: \"list_item+\", group: listGroup}),\n bullet_list: add(bulletList, {content: \"list_item+\", group: listGroup}),\n list_item: add(listItem, {content: itemContent})\n })\n}\n\n// :: (NodeType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Returns a command function that wraps the selection in a list with\n// the given type an attributes. If `dispatch` is null, only return a\n// value to indicate whether this is possible, but don't actually\n// perform the change.\nfunction wrapInList(listType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to), doJoin = false, outerRange = range;\n if (!range) { return false }\n // This is at the top of an existing list item\n if (range.depth >= 2 && $from.node(range.depth - 1).type.compatibleContent(listType) && range.startIndex == 0) {\n // Don't do anything if this is the top of the list\n if ($from.index(range.depth - 1) == 0) { return false }\n var $insert = state.doc.resolve(range.start - 2);\n outerRange = new NodeRange($insert, $insert, range.depth);\n if (range.endIndex < range.parent.childCount)\n { range = new NodeRange($from, state.doc.resolve($to.end(range.depth)), range.depth); }\n doJoin = true;\n }\n var wrap = findWrapping(outerRange, listType, attrs, range);\n if (!wrap) { return false }\n if (dispatch) { dispatch(doWrapInList(state.tr, range, wrap, doJoin, listType).scrollIntoView()); }\n return true\n }\n}\n\nfunction doWrapInList(tr, range, wrappers, joinBefore, listType) {\n var content = Fragment.empty;\n for (var i = wrappers.length - 1; i >= 0; i--)\n { content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content)); }\n\n tr.step(new ReplaceAroundStep(range.start - (joinBefore ? 2 : 0), range.end, range.start, range.end,\n new Slice(content, 0, 0), wrappers.length, true));\n\n var found = 0;\n for (var i$1 = 0; i$1 < wrappers.length; i$1++) { if (wrappers[i$1].type == listType) { found = i$1 + 1; } }\n var splitDepth = wrappers.length - found;\n\n var splitPos = range.start + wrappers.length - (joinBefore ? 2 : 0), parent = range.parent;\n for (var i$2 = range.startIndex, e = range.endIndex, first = true; i$2 < e; i$2++, first = false) {\n if (!first && canSplit(tr.doc, splitPos, splitDepth)) {\n tr.split(splitPos, splitDepth);\n splitPos += 2 * splitDepth;\n }\n splitPos += parent.child(i$2).nodeSize;\n }\n return tr\n}\n\n// :: (NodeType) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Build a command that splits a non-empty textblock at the top level\n// of a list item by also splitting that list item.\nfunction splitListItem(itemType) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var node = ref.node;\n if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to)) { return false }\n var grandParent = $from.node(-1);\n if (grandParent.type != itemType) { return false }\n if ($from.parent.content.size == 0 && $from.node(-1).childCount == $from.indexAfter(-1)) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if ($from.depth == 2 || $from.node(-3).type != itemType ||\n $from.index(-2) != $from.node(-2).childCount - 1) { return false }\n if (dispatch) {\n var wrap = Fragment.empty, keepItem = $from.index(-1) > 0;\n // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n for (var d = $from.depth - (keepItem ? 1 : 2); d >= $from.depth - 3; d--)\n { wrap = Fragment.from($from.node(d).copy(wrap)); }\n // Add a second list item with an empty default start node\n wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n var tr$1 = state.tr.replace($from.before(keepItem ? null : -1), $from.after(-3), new Slice(wrap, keepItem ? 3 : 2, 2));\n tr$1.setSelection(state.selection.constructor.near(tr$1.doc.resolve($from.pos + (keepItem ? 3 : 2))));\n dispatch(tr$1.scrollIntoView());\n }\n return true\n }\n var nextType = $to.pos == $from.end() ? grandParent.contentMatchAt(0).defaultType : null;\n var tr = state.tr.delete($from.pos, $to.pos);\n var types = nextType && [null, {type: nextType}];\n if (!canSplit(tr.doc, $from.pos, 2, types)) { return false }\n if (dispatch) { dispatch(tr.split($from.pos, 2, types).scrollIntoView()); }\n return true\n }\n}\n\n// :: (NodeType) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Create a command to lift the list item around the selection up into\n// a wrapping list.\nfunction liftListItem(itemType) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to, function (node) { return node.childCount && node.firstChild.type == itemType; });\n if (!range) { return false }\n if (!dispatch) { return true }\n if ($from.node(range.depth - 1).type == itemType) // Inside a parent list\n { return liftToOuterList(state, dispatch, itemType, range) }\n else // Outer list node\n { return liftOutOfList(state, dispatch, range) }\n }\n}\n\nfunction liftToOuterList(state, dispatch, itemType, range) {\n var tr = state.tr, end = range.end, endOfList = range.$to.end(range.depth);\n if (end < endOfList) {\n // There are siblings after the lifted items, which must become\n // children of the last item\n tr.step(new ReplaceAroundStep(end - 1, endOfList, end, endOfList,\n new Slice(Fragment.from(itemType.create(null, range.parent.copy())), 1, 0), 1, true));\n range = new NodeRange(tr.doc.resolve(range.$from.pos), tr.doc.resolve(endOfList), range.depth);\n }\n dispatch(tr.lift(range, liftTarget(range)).scrollIntoView());\n return true\n}\n\nfunction liftOutOfList(state, dispatch, range) {\n var tr = state.tr, list = range.parent;\n // Merge the list items into a single big item\n for (var pos = range.end, i = range.endIndex - 1, e = range.startIndex; i > e; i--) {\n pos -= list.child(i).nodeSize;\n tr.delete(pos - 1, pos + 1);\n }\n var $start = tr.doc.resolve(range.start), item = $start.nodeAfter;\n var atStart = range.startIndex == 0, atEnd = range.endIndex == list.childCount;\n var parent = $start.node(-1), indexBefore = $start.index(-1);\n if (!parent.canReplace(indexBefore + (atStart ? 0 : 1), indexBefore + 1,\n item.content.append(atEnd ? Fragment.empty : Fragment.from(list))))\n { return false }\n var start = $start.pos, end = start + item.nodeSize;\n // Strip off the surrounding list. At the sides where we're not at\n // the end of the list, the existing list is closed. At sides where\n // this is the end, it is overwritten to its end.\n tr.step(new ReplaceAroundStep(start - (atStart ? 1 : 0), end + (atEnd ? 1 : 0), start + 1, end - 1,\n new Slice((atStart ? Fragment.empty : Fragment.from(list.copy(Fragment.empty)))\n .append(atEnd ? Fragment.empty : Fragment.from(list.copy(Fragment.empty))),\n atStart ? 0 : 1, atEnd ? 0 : 1), atStart ? 0 : 1));\n dispatch(tr.scrollIntoView());\n return true\n}\n\n// :: (NodeType) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Create a command to sink the list item around the selection down\n// into an inner list.\nfunction sinkListItem(itemType) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to, function (node) { return node.childCount && node.firstChild.type == itemType; });\n if (!range) { return false }\n var startIndex = range.startIndex;\n if (startIndex == 0) { return false }\n var parent = range.parent, nodeBefore = parent.child(startIndex - 1);\n if (nodeBefore.type != itemType) { return false }\n\n if (dispatch) {\n var nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type == parent.type;\n var inner = Fragment.from(nestedBefore ? itemType.create() : null);\n var slice = new Slice(Fragment.from(itemType.create(null, Fragment.from(parent.type.create(null, inner)))),\n nestedBefore ? 3 : 1, 0);\n var before = range.start, after = range.end;\n dispatch(state.tr.step(new ReplaceAroundStep(before - (nestedBefore ? 3 : 1), after,\n before, after, slice, 1, true))\n .scrollIntoView());\n }\n return true\n }\n}\n\nexport { addListNodes, bulletList, liftListItem, listItem, orderedList, sinkListItem, splitListItem, wrapInList };\n//# sourceMappingURL=index.es.js.map\n","module.exports = flarum.core.compat['common/components/Tooltip'];","import Component from 'flarum/common/Component';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport icon from 'flarum/common/helpers/icon';\nimport extractText from 'flarum/common/utils/extractText';\n\nexport default class CommandButton extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n this.state.addItem(this.attrs.type, this.attrs.command, this.onEditorUpdate.bind(this));\n }\n\n view() {\n return (\n \n \n \n );\n }\n\n keydown(e) {\n if (e.key === ' ' || e.key === 'Enter') {\n this.click(e);\n }\n }\n\n click(e) {\n e.preventDefault();\n return this.state.run(this.attrs.type);\n }\n\n title() {\n let tooltip = app.translator.trans(`askvortsov-rich-text.lib.composer.${this.attrs.type}_tooltip`);\n\n return tooltip;\n }\n\n onEditorUpdate() {}\n}\n","module.exports = flarum.core.compat['common/utils/extractText'];","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","\n /*!\n * tiptap-utils v1.13.0\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { NodeSelection } from 'prosemirror-state';\n\nfunction createCell(cellType, cellContent) {\n if (cellContent) {\n return cellType.createChecked(null, cellContent);\n }\n\n return cellType.createAndFill();\n}\n\nfunction getTableNodeTypes(schema) {\n if (schema.cached.tableNodeTypes) {\n return schema.cached.tableNodeTypes;\n }\n\n const roles = {};\n Object.keys(schema.nodes).forEach(type => {\n const nodeType = schema.nodes[type];\n\n if (nodeType.spec.tableRole) {\n roles[nodeType.spec.tableRole] = nodeType;\n }\n }); // eslint-disable-next-line\n\n schema.cached.tableNodeTypes = roles;\n return roles;\n}\n\nfunction createTable(schema, rowsCount, colsCount, withHeaderRow, cellContent) {\n const types = getTableNodeTypes(schema);\n const headerCells = [];\n const cells = [];\n\n for (let index = 0; index < colsCount; index += 1) {\n const cell = createCell(types.cell, cellContent);\n\n if (cell) {\n cells.push(cell);\n }\n\n if (withHeaderRow) {\n const headerCell = createCell(types.header_cell, cellContent);\n\n if (headerCell) {\n headerCells.push(headerCell);\n }\n }\n }\n\n const rows = [];\n\n for (let index = 0; index < rowsCount; index += 1) {\n rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells));\n }\n\n return types.table.createChecked(null, rows);\n}\n\nfunction equalNodeType(nodeType, node) {\n return Array.isArray(nodeType) && nodeType.indexOf(node.type) > -1 || node.type === nodeType;\n}\n\nfunction flatten(node) {\n // eslint-disable-next-line\n const descend = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!node) {\n throw new Error('Invalid \"node\" parameter');\n }\n\n const result = []; // eslint-disable-next-line\n\n node.descendants((child, pos) => {\n result.push({\n node: child,\n pos\n });\n\n if (!descend) {\n return false;\n }\n });\n return result;\n}\n\nfunction findChildren(node, predicate, descend) {\n if (!node) {\n throw new Error('Invalid \"node\" parameter');\n } else if (!predicate) {\n throw new Error('Invalid \"predicate\" parameter');\n }\n\n return flatten(node, descend).filter(child => predicate(child.node));\n}\n\nfunction findBlockNodes(node, descend) {\n return findChildren(node, child => child.isBlock, descend);\n}\n\n// eslint-disable-next-line\nfunction findParentNodeClosestToPos($pos, predicate) {\n for (let i = $pos.depth; i > 0; i -= 1) {\n const node = $pos.node(i);\n\n if (predicate(node)) {\n return {\n pos: i > 0 ? $pos.before(i) : 0,\n start: $pos.start(i),\n depth: i,\n node\n };\n }\n }\n}\n\nfunction findParentNode(predicate) {\n return selection => findParentNodeClosestToPos(selection.$from, predicate);\n}\n\nfunction isNodeSelection(selection) {\n return selection instanceof NodeSelection;\n}\n\nfunction findSelectedNodeOfType(nodeType) {\n // eslint-disable-next-line\n return function (selection) {\n if (isNodeSelection(selection)) {\n const {\n node\n } = selection;\n const {\n $from\n } = selection;\n\n if (equalNodeType(nodeType, node)) {\n return {\n node,\n pos: $from.pos,\n depth: $from.depth\n };\n }\n }\n };\n}\n\nfunction getMarkAttrs(state, type) {\n const {\n from,\n to\n } = state.selection;\n let marks = [];\n state.doc.nodesBetween(from, to, node => {\n marks = [...marks, ...node.marks];\n });\n const mark = marks.find(markItem => markItem.type.name === type.name);\n\n if (mark) {\n return mark.attrs;\n }\n\n return {};\n}\n\nfunction getMarkRange($pos = null, type = null) {\n if (!$pos || !type) {\n return false;\n }\n\n const start = $pos.parent.childAfter($pos.parentOffset);\n\n if (!start.node) {\n return false;\n }\n\n const link = start.node.marks.find(mark => mark.type === type);\n\n if (!link) {\n return false;\n }\n\n let startIndex = $pos.index();\n let startPos = $pos.start() + start.offset;\n let endIndex = startIndex + 1;\n let endPos = startPos + start.node.nodeSize;\n\n while (startIndex > 0 && link.isInSet($pos.parent.child(startIndex - 1).marks)) {\n startIndex -= 1;\n startPos -= $pos.parent.child(startIndex).nodeSize;\n }\n\n while (endIndex < $pos.parent.childCount && link.isInSet($pos.parent.child(endIndex).marks)) {\n endPos += $pos.parent.child(endIndex).nodeSize;\n endIndex += 1;\n }\n\n return {\n from: startPos,\n to: endPos\n };\n}\n\nfunction getNodeAttrs(state, type) {\n const {\n from,\n to\n } = state.selection;\n let nodes = [];\n state.doc.nodesBetween(from, to, node => {\n nodes = [...nodes, node];\n });\n const node = nodes.reverse().find(nodeItem => nodeItem.type.name === type.name);\n\n if (node) {\n return node.attrs;\n }\n\n return {};\n}\n\nfunction markIsActive(state, type) {\n const {\n from,\n $from,\n to,\n empty\n } = state.selection;\n\n if (empty) {\n return !!type.isInSet(state.storedMarks || $from.marks());\n }\n\n return !!state.doc.rangeHasMark(from, to, type);\n}\n\nfunction nodeEqualsType({\n types,\n node\n}) {\n return Array.isArray(types) && types.includes(node.type) || node.type === types;\n}\n\nfunction nodeIsActive(state, type, attrs = {}) {\n const predicate = node => node.type === type;\n\n const node = findSelectedNodeOfType(type)(state.selection) || findParentNode(predicate)(state.selection);\n\n if (!Object.keys(attrs).length || !node) {\n return !!node;\n }\n\n return node.node.hasMarkup(type, { ...node.node.attrs,\n ...attrs\n });\n}\n\nexport { createCell, createTable, equalNodeType, findBlockNodes, findChildren, findParentNode, findParentNodeClosestToPos, findSelectedNodeOfType, flatten, getMarkAttrs, getMarkRange, getNodeAttrs, getTableNodeTypes, isNodeSelection, markIsActive, nodeEqualsType, nodeIsActive };\n","import { toggleMark } from 'tiptap-commands';\nimport CommandButton from './CommandButton';\n\nexport default class MarkButton extends CommandButton {\n static initAttrs(attrs) {\n attrs.command = toggleMark(attrs.mark);\n }\n\n onEditorUpdate() {\n this.$().toggleClass('active', !!this.state.markActive(this.attrs.mark));\n }\n}\n","export var base = {\n 8: \"Backspace\",\n 9: \"Tab\",\n 10: \"Enter\",\n 12: \"NumLock\",\n 13: \"Enter\",\n 16: \"Shift\",\n 17: \"Control\",\n 18: \"Alt\",\n 20: \"CapsLock\",\n 27: \"Escape\",\n 32: \" \",\n 33: \"PageUp\",\n 34: \"PageDown\",\n 35: \"End\",\n 36: \"Home\",\n 37: \"ArrowLeft\",\n 38: \"ArrowUp\",\n 39: \"ArrowRight\",\n 40: \"ArrowDown\",\n 44: \"PrintScreen\",\n 45: \"Insert\",\n 46: \"Delete\",\n 59: \";\",\n 61: \"=\",\n 91: \"Meta\",\n 92: \"Meta\",\n 106: \"*\",\n 107: \"+\",\n 108: \",\",\n 109: \"-\",\n 110: \".\",\n 111: \"/\",\n 144: \"NumLock\",\n 145: \"ScrollLock\",\n 160: \"Shift\",\n 161: \"Shift\",\n 162: \"Control\",\n 163: \"Control\",\n 164: \"Alt\",\n 165: \"Alt\",\n 173: \"-\",\n 186: \";\",\n 187: \"=\",\n 188: \",\",\n 189: \"-\",\n 190: \".\",\n 191: \"/\",\n 192: \"`\",\n 219: \"[\",\n 220: \"\\\\\",\n 221: \"]\",\n 222: \"'\",\n 229: \"q\"\n}\n\nexport var shift = {\n 48: \")\",\n 49: \"!\",\n 50: \"@\",\n 51: \"#\",\n 52: \"$\",\n 53: \"%\",\n 54: \"^\",\n 55: \"&\",\n 56: \"*\",\n 57: \"(\",\n 59: \":\",\n 61: \"+\",\n 173: \"_\",\n 186: \":\",\n 187: \"+\",\n 188: \"<\",\n 189: \"_\",\n 190: \">\",\n 191: \"?\",\n 192: \"~\",\n 219: \"{\",\n 220: \"|\",\n 221: \"}\",\n 222: \"\\\"\",\n 229: \"Q\"\n}\n\nvar chrome = typeof navigator != \"undefined\" && /Chrome\\/(\\d+)/.exec(navigator.userAgent)\nvar safari = typeof navigator != \"undefined\" && /Apple Computer/.test(navigator.vendor)\nvar gecko = typeof navigator != \"undefined\" && /Gecko\\/\\d+/.test(navigator.userAgent)\nvar mac = typeof navigator != \"undefined\" && /Mac/.test(navigator.platform)\nvar ie = typeof navigator != \"undefined\" && /MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent)\nvar brokenModifierNames = chrome && (mac || +chrome[1] < 57) || gecko && mac\n\n// Fill in the digit keys\nfor (var i = 0; i < 10; i++) base[48 + i] = base[96 + i] = String(i)\n\n// The function keys\nfor (var i = 1; i <= 24; i++) base[i + 111] = \"F\" + i\n\n// And the alphabetic keys\nfor (var i = 65; i <= 90; i++) {\n base[i] = String.fromCharCode(i + 32)\n shift[i] = String.fromCharCode(i)\n}\n\n// For each code that doesn't have a shift-equivalent, copy the base name\nfor (var code in base) if (!shift.hasOwnProperty(code)) shift[code] = base[code]\n\nexport function keyName(event) {\n // Don't trust event.key in Chrome when there are modifiers until\n // they fix https://bugs.chromium.org/p/chromium/issues/detail?id=633838\n var ignoreKey = brokenModifierNames && (event.ctrlKey || event.altKey || event.metaKey) ||\n (safari || ie) && event.shiftKey && event.key && event.key.length == 1\n var name = (!ignoreKey && event.key) ||\n (event.shiftKey ? shift : base)[event.keyCode] ||\n event.key || \"Unidentified\"\n // Edge sometimes produces wrong names (Issue #3)\n if (name == \"Esc\") name = \"Escape\"\n if (name == \"Del\") name = \"Delete\"\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/\n if (name == \"Left\") name = \"ArrowLeft\"\n if (name == \"Up\") name = \"ArrowUp\"\n if (name == \"Right\") name = \"ArrowRight\"\n if (name == \"Down\") name = \"ArrowDown\"\n return name\n}\n","import { keyName, base } from 'w3c-keyname';\nimport { Plugin } from 'prosemirror-state';\n\n// declare global: navigator\n\nvar mac = typeof navigator != \"undefined\" ? /Mac/.test(navigator.platform) : false;\n\nfunction normalizeKeyName(name) {\n var parts = name.split(/-(?!$)/), result = parts[parts.length - 1];\n if (result == \"Space\") { result = \" \"; }\n var alt, ctrl, shift, meta;\n for (var i = 0; i < parts.length - 1; i++) {\n var mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod)) { meta = true; }\n else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n else if (/^mod$/i.test(mod)) { if (mac) { meta = true; } else { ctrl = true; } }\n else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n }\n if (alt) { result = \"Alt-\" + result; }\n if (ctrl) { result = \"Ctrl-\" + result; }\n if (meta) { result = \"Meta-\" + result; }\n if (shift) { result = \"Shift-\" + result; }\n return result\n}\n\nfunction normalize(map) {\n var copy = Object.create(null);\n for (var prop in map) { copy[normalizeKeyName(prop)] = map[prop]; }\n return copy\n}\n\nfunction modifiers(name, event, shift) {\n if (event.altKey) { name = \"Alt-\" + name; }\n if (event.ctrlKey) { name = \"Ctrl-\" + name; }\n if (event.metaKey) { name = \"Meta-\" + name; }\n if (shift !== false && event.shiftKey) { name = \"Shift-\" + name; }\n return name\n}\n\n// :: (Object) → Plugin\n// Create a keymap plugin for the given set of bindings.\n//\n// Bindings should map key names to [command](#commands)-style\n// functions, which will be called with `(EditorState, dispatch,\n// EditorView)` arguments, and should return true when they've handled\n// the key. Note that the view argument isn't part of the command\n// protocol, but can be used as an escape hatch if a binding needs to\n// directly interact with the UI.\n//\n// Key names may be strings like `\"Shift-Ctrl-Enter\"`—a key\n// identifier prefixed with zero or more modifiers. Key identifiers\n// are based on the strings that can appear in\n// [`KeyEvent.key`](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).\n// Use lowercase letters to refer to letter keys (or uppercase letters\n// if you want shift to be held). You may use `\"Space\"` as an alias\n// for the `\" \"` name.\n//\n// Modifiers can be given in any order. `Shift-` (or `s-`), `Alt-` (or\n// `a-`), `Ctrl-` (or `c-` or `Control-`) and `Cmd-` (or `m-` or\n// `Meta-`) are recognized. For characters that are created by holding\n// shift, the `Shift-` prefix is implied, and should not be added\n// explicitly.\n//\n// You can use `Mod-` as a shorthand for `Cmd-` on Mac and `Ctrl-` on\n// other platforms.\n//\n// You can add multiple keymap plugins to an editor. The order in\n// which they appear determines their precedence (the ones early in\n// the array get to dispatch first).\nfunction keymap(bindings) {\n return new Plugin({props: {handleKeyDown: keydownHandler(bindings)}})\n}\n\n// :: (Object) → (view: EditorView, event: dom.Event) → bool\n// Given a set of bindings (using the same format as\n// [`keymap`](#keymap.keymap), return a [keydown\n// handler](#view.EditorProps.handleKeyDown) that handles them.\nfunction keydownHandler(bindings) {\n var map = normalize(bindings);\n return function(view, event) {\n var name = keyName(event), isChar = name.length == 1 && name != \" \", baseName;\n var direct = map[modifiers(name, event, !isChar)];\n if (direct && direct(view.state, view.dispatch, view)) { return true }\n if (isChar && (event.shiftKey || event.altKey || event.metaKey || name.charCodeAt(0) > 127) &&\n (baseName = base[event.keyCode]) && baseName != name) {\n // Try falling back to the keyCode when there's a modifier\n // active or the character produced isn't ASCII, and our table\n // produces a different name from the the keyCode. See #668,\n // #1060\n var fromCode = map[modifiers(baseName, event, true)];\n if (fromCode && fromCode(view.state, view.dispatch, view)) { return true }\n } else if (isChar && event.shiftKey) {\n // Otherwise, if shift is active, also try the binding with the\n // Shift- prefix enabled. See #997\n var withShift = map[modifiers(name, event, true)];\n if (withShift && withShift(view.state, view.dispatch, view)) { return true }\n }\n return false\n }\n}\n\nexport { keydownHandler, keymap };\n//# sourceMappingURL=index.es.js.map\n","module.exports = flarum.core.compat['common/utils/ItemList'];","module.exports = flarum.core.compat['common/utils/Stream'];","module.exports = flarum.core.compat['common/components/Button'];","module.exports = flarum.core.compat['common/helpers/icon'];","module.exports = flarum.core.compat['common/components/Dropdown'];","import Modal from 'flarum/common/components/Modal';\n\nexport default class SafariModalHack extends Modal {\n className() {\n return 'LoadingModal Modal--small';\n }\n\n title() {\n return this.attrs.title;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$('.CommandButton').on('click', () => {\n app.modal.close();\n });\n }\n\n content() {\n const onsubmit = this.attrs.onsubmit ? this.attrs.onsubmit.bind(this) : () => {};\n return (\n
      \n
      \n {this.attrs.vnodeContent}\n
      \n
      \n );\n }\n}\n","import Button from 'flarum/common/components/Button';\nimport Dropdown from 'flarum/common/components/Dropdown';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport icon from 'flarum/common/helpers/icon';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport SafariModalHack from './SafariModalHack';\n\nexport default class FormDropdown extends Dropdown {\n static initAttrs(attrs) {\n attrs.buttonClassName = 'Button Button--icon Button--link Button--menuDropdown';\n }\n\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$().on('click', (e) => {\n if ($('.App').is('.mobile-safari')) {\n // Mobile Safari doesn't support fixed items\n // So, we wrap them in a modal.\n app.modal.show(SafariModalHack, {\n title: this.attrs.tooltip,\n vnodeContent: this.fields().toArray(),\n onsubmit: this.onsubmit.bind(this),\n });\n e.stopPropagation();\n }\n });\n\n this.$().on('shown.bs.dropdown', () => {\n this.$('.Dropdown-menu').find('input, select, textarea').first().focus().select();\n });\n }\n\n getButtonContent(children) {\n return (\n \n {icon(this.attrs.icon)}\n \n );\n }\n\n getMenu(items) {\n return (\n
        \n
        \n {this.fields().toArray()}\n
        \n
      \n );\n }\n\n fields() {\n const items = new ItemList();\n\n items.add(\n 'insert',\n \n );\n\n return items;\n }\n\n onsubmit(e) {\n // Here for the safari workaround\n app.modal.close();\n e.preventDefault();\n $('body').trigger('click');\n this.insert(e);\n app.composer.editor.focus();\n }\n\n insert(e) {}\n}\n","module.exports = flarum.core.compat['common/extend'];","import CommandButton from './CommandButton';\nimport { toggleList } from 'tiptap-commands';\n\nexport default class ListButton extends CommandButton {\n oninit(vnode) {\n vnode.attrs.command = (state, dispatch) => {\n return toggleList(vnode.attrs.listType, this.active ? state.schema.nodes.list_item : undefined)(state, dispatch);\n };\n\n super.oninit(vnode);\n }\n\n onEditorUpdate() {\n this.active = !!this.state.nodeActive(this.attrs.listType);\n this.$().toggleClass('active', this.active);\n }\n}\n","module.exports = flarum.core.compat['common/components/TextEditor'];","import { defaultMarkdownSerializer, MarkdownSerializer, MarkdownSerializerState } from 'prosemirror-markdown';\n\n/**\n * COPIED FROM https://github.com/StackExchange/Stacks-Editor/blob/main/src/rich-text/markdown-serializer.ts\n *\n * Generates a config from a base config that is aware of special \"markup\" added by the markdown tokenizer;\n * typically this will be differences in how markdown can be written (e.g. * vs _ for emphasis),\n * but could also be html tags from our extended html support plugin (e.g. * vs for emphasis)\n * @param config The base config to extend\n */\nfunction genMarkupAwareMarkConfig(config) {\n // we don't support function open/close since these could have fairly complicated logic in them\n if (config.open instanceof Function || config.close instanceof Function) {\n // log an error to the console and return the unmodified base config\n error('markdown-serializer genMarkupAwareMarkSpec', 'Unable to extend mark config with open/close as functions', config);\n return config;\n }\n\n return {\n ...config,\n open(_, mark) {\n const markup = mark.attrs.markup;\n return markup || config.open;\n },\n close(_, mark) {\n let markup = mark.attrs.markup;\n // insert the `/` on html closing tags\n markup = /^<[a-z]+>$/i.test(markup) ? markup.replace(/^! ', null, node, () => state.renderContent(node));\n },\n\n math_block(state, node) {\n state.write('$$\\n');\n state.text(node.textContent, false);\n state.ensureNewLine();\n state.write('$$');\n state.closeBlock(node);\n },\n\n // We still want to put a new line for empty paragraphs\n paragraph(state, node) {\n if (node.content.size === 0) {\n state.write('\\n');\n } else {\n defaultMarkdownSerializer.nodes.paragraph(state, node);\n }\n },\n\n // Override this to put in just a whiteline, since Litedown doesn't like line-ending slashes.\n hard_break(state, node, parent, index) {\n for (let i = index + 1; i < parent.childCount; i++)\n if (parent.child(i).type != node.type) {\n state.write('\\n');\n return;\n }\n },\n };\n }\n\n buildMarks() {\n return {\n ...defaultMarkdownSerializer.marks,\n\n spoiler_inline: genMarkupAwareMarkConfig({\n open: '>!',\n close: '!<',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n strike: genMarkupAwareMarkConfig({\n open: '~~',\n close: '~~',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n sub: genMarkupAwareMarkConfig({\n open: '~',\n close: '~',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n sup: genMarkupAwareMarkConfig({\n open: '^',\n close: '^',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n math_inline: {\n ...genMarkupAwareMarkConfig({\n open: '$',\n close: '$',\n mixable: false,\n expelEnclosingWhitespace: true,\n }),\n escape: false,\n },\n };\n }\n\n build() {\n return new MarkdownSerializer(this.buildNodes(), this.buildMarks());\n }\n}\n","'use strict';\n\n\nmodule.exports = require('./lib/');\n","import { schema } from 'prosemirror-markdown';\nimport { Schema } from 'prosemirror-model';\n\n/**\n * COPIED FROM https://github.com/StackExchange/Stacks-Editor/blob/main/src/shared/schema.ts\n *\n * Creates a generic html MarkSpec for an inline html tag\n * @param tag The name of the tag to use in the Prosemirror dom\n */\nfunction genHtmlInlineMarkSpec(...tags) {\n return {\n toDOM() {\n return [tags[0], 0];\n },\n parseDOM: tags.map((tag) => ({ tag: tag })),\n };\n}\n\nconst spoilerNodeSpec = {\n content: 'block+',\n group: 'block',\n attrs: { open: { default: true } },\n parseDOM: [\n {\n tag: 'details',\n },\n ],\n toDOM(node) {\n const attrs = { class: 'spoiler' };\n\n if (node.attrs.open) attrs.open = true;\n\n return ['details', attrs, 0];\n },\n};\n\nconst mathBlockNodeSpec = {\n content: 'text*',\n code: true,\n group: 'block',\n parseDOM: [\n {\n tag: 'pre',\n },\n ],\n toDOM(node) {\n return ['pre', { class: 'math' }, ['code', 0]];\n },\n};\n\nexport default class SchemaBuilder {\n buildNodes() {\n return (\n schema.spec.nodes\n // Make lists tight by default\n .update(\n 'ordered_list',\n Object.assign({}, schema.spec.nodes.get('ordered_list'), { attrs: { order: { default: 1 }, tight: { default: true } } })\n )\n .update('bullet_list', Object.assign({}, schema.spec.nodes.get('bullet_list'), { attrs: { tight: { default: true } } }))\n .addBefore('blockquote', 'spoiler', spoilerNodeSpec)\n .addBefore('blockquote', 'math_block', mathBlockNodeSpec)\n );\n }\n\n buildMarks() {\n return schema.spec.marks\n .addBefore('strong', 'strike', genHtmlInlineMarkSpec('del', 's', 'strike'))\n .addBefore('strong', 'sub', genHtmlInlineMarkSpec('sub'))\n .addBefore('strong', 'sup', genHtmlInlineMarkSpec('sup'))\n .addBefore('strong', 'spoiler_inline', {\n attrs: { open: { default: true } },\n parseDOM: [\n {\n tag: 'spoiler',\n },\n ],\n toDOM(node) {\n return ['spoiler', 0];\n },\n })\n .addBefore('strong', 'math_inline', {\n parseDOM: [\n {\n tag: 'math',\n },\n ],\n toDOM(node) {\n return ['math', 0];\n },\n excludes: '_',\n });\n }\n\n build() {\n return new Schema({\n nodes: this.buildNodes(),\n marks: this.buildMarks(),\n });\n }\n}\n","module.exports = flarum.core.compat['common/Component'];","import Dropdown from 'flarum/common/components/Dropdown';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport extractText from 'flarum/common/utils/extractText';\nimport { setBlockType } from 'tiptap-commands';\nimport SafariModalHack from './SafariModalHack';\n\nexport default class NodeTypeDropdown extends Dropdown {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n this.state.addItem(\n this.attrs.type,\n (state, dispatch) => {\n return this.command(state, dispatch);\n },\n this.onEditorUpdate.bind(this)\n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$().on('click', (e) => {\n if ($('.App').is('.mobile-safari')) {\n // Mobile Safari doesn't support fixed items\n // So, we wrap them in a modal.\n app.modal.show(SafariModalHack, {\n title: this.attrs.tooltip,\n vnodeContent: this.getNodeTypeButtons(),\n });\n e.stopPropagation();\n }\n });\n\n this.onEditorUpdate();\n }\n\n getButton(children) {\n return (\n \n );\n }\n\n getNodeTypeButtons() {\n return this.attrs.options\n .filter((_, i) => i !== this.activeIndex)\n .map((option) => (\n \n \n {option.title}\n \n \n ));\n }\n\n getMenu(items) {\n return
        {this.getNodeTypeButtons()}
      ;\n }\n\n keydown(type, attrs, e) {\n if (e.key === ' ' || e.key === 'Enter') {\n this.click(type, attrs, e);\n }\n }\n\n click(type, attrs, e) {\n // Here for the safari workaround\n app.modal.close();\n e.preventDefault();\n this.command = setBlockType(type, attrs);\n return this.state.run(this.attrs.type);\n }\n\n onEditorUpdate() {\n if (!this.element) return;\n\n this.attrs.options.forEach((option, i) => {\n if (this.state.nodeActive(option.type, option.attrs)) {\n this.element.children[0].children[0].innerText = option.title;\n this.activeIndex = i;\n }\n });\n }\n}\n","import extractText from 'flarum/common/utils/extractText';\nimport Stream from 'flarum/common/utils/Stream';\nimport FormDropdown from './FormDropdown';\n\nexport default class InsertImageDropdown extends FormDropdown {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.src = Stream('');\n this.title = Stream('');\n }\n\n fields() {\n const items = super.fields();\n\n items.add(\n 'src',\n
      \n \n
      ,\n 10\n );\n\n items.add(\n 'title',\n
      \n \n
      ,\n 10\n );\n\n return items;\n }\n\n insert(e) {\n this.state.insertNode(this.attrs.node, {\n src: this.src(),\n title: this.title(),\n });\n\n this.src('');\n this.title('');\n }\n}\n","import { getMarkAttrs, markIsActive, nodeIsActive } from 'tiptap-utils';\n\nexport default class MenuState {\n constructor() {\n this.items = {};\n }\n\n attachEditorView(editorView) {\n this.editorView = editorView;\n }\n\n addItem(key, command, onEditorUpdate) {\n this.items[key] = { command, onEditorUpdate };\n }\n\n getSchema() {\n return this.editorView.state.schema;\n }\n\n update() {\n app.editor = this.editorView;\n Object.keys(this.items).forEach((key) => {\n this.items[key].onEditorUpdate();\n });\n }\n\n destroy() {\n // No need for this: Mithril will destroy the editor DOM when the composer closes.\n }\n\n markActive(markType) {\n return markIsActive(this.editorView.state, markType);\n }\n\n markAttrs(markType) {\n return getMarkAttrs(this.editorView.state, markType);\n }\n\n nodeActive(nodeType, attrs) {\n return nodeIsActive(this.editorView.state, nodeType, attrs);\n }\n\n selectionEmpty() {\n return this.editorView.state.selection.empty;\n }\n\n insertNode(nodeType, attrs) {\n const node = nodeType.createAndFill(attrs);\n\n let transaction;\n if (this.editorView.state.selection.empty) {\n transaction = this.editorView.state.tr.insert(this.editorView.state.selection.from, node);\n } else {\n transaction = this.editorView.state.tr.replaceSelection(node);\n }\n this.editorView.dispatch(transaction);\n this.editorView.focus();\n }\n\n run(key) {\n if (this.items[key]) {\n this.editorView.focus();\n this.items[key].command(this.editorView.state, this.editorView.dispatch, this.editorView);\n }\n }\n}\n","var GOOD_LEAF_SIZE = 200;\n\n// :: class A rope sequence is a persistent sequence data structure\n// that supports appending, prepending, and slicing without doing a\n// full copy. It is represented as a mostly-balanced tree.\nvar RopeSequence = function RopeSequence () {};\n\nRopeSequence.prototype.append = function append (other) {\n if (!other.length) { return this }\n other = RopeSequence.from(other);\n\n return (!this.length && other) ||\n (other.length < GOOD_LEAF_SIZE && this.leafAppend(other)) ||\n (this.length < GOOD_LEAF_SIZE && other.leafPrepend(this)) ||\n this.appendInner(other)\n};\n\n// :: (union<[T], RopeSequence>) → RopeSequence\n// Prepend an array or other rope to this one, returning a new rope.\nRopeSequence.prototype.prepend = function prepend (other) {\n if (!other.length) { return this }\n return RopeSequence.from(other).append(this)\n};\n\nRopeSequence.prototype.appendInner = function appendInner (other) {\n return new Append(this, other)\n};\n\n// :: (?number, ?number) → RopeSequence\n// Create a rope repesenting a sub-sequence of this rope.\nRopeSequence.prototype.slice = function slice (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n if (from >= to) { return RopeSequence.empty }\n return this.sliceInner(Math.max(0, from), Math.min(this.length, to))\n};\n\n// :: (number) → T\n// Retrieve the element at the given position from this rope.\nRopeSequence.prototype.get = function get (i) {\n if (i < 0 || i >= this.length) { return undefined }\n return this.getInner(i)\n};\n\n// :: ((element: T, index: number) → ?bool, ?number, ?number)\n// Call the given function for each element between the given\n// indices. This tends to be more efficient than looping over the\n// indices and calling `get`, because it doesn't have to descend the\n// tree for every element.\nRopeSequence.prototype.forEach = function forEach (f, from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n if (from <= to)\n { this.forEachInner(f, from, to, 0); }\n else\n { this.forEachInvertedInner(f, from, to, 0); }\n};\n\n// :: ((element: T, index: number) → U, ?number, ?number) → [U]\n// Map the given functions over the elements of the rope, producing\n// a flat array.\nRopeSequence.prototype.map = function map (f, from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n var result = [];\n this.forEach(function (elt, i) { return result.push(f(elt, i)); }, from, to);\n return result\n};\n\n// :: (?union<[T], RopeSequence>) → RopeSequence\n// Create a rope representing the given array, or return the rope\n// itself if a rope was given.\nRopeSequence.from = function from (values) {\n if (values instanceof RopeSequence) { return values }\n return values && values.length ? new Leaf(values) : RopeSequence.empty\n};\n\nvar Leaf = /*@__PURE__*/(function (RopeSequence) {\n function Leaf(values) {\n RopeSequence.call(this);\n this.values = values;\n }\n\n if ( RopeSequence ) Leaf.__proto__ = RopeSequence;\n Leaf.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n Leaf.prototype.constructor = Leaf;\n\n var prototypeAccessors = { length: { configurable: true },depth: { configurable: true } };\n\n Leaf.prototype.flatten = function flatten () {\n return this.values\n };\n\n Leaf.prototype.sliceInner = function sliceInner (from, to) {\n if (from == 0 && to == this.length) { return this }\n return new Leaf(this.values.slice(from, to))\n };\n\n Leaf.prototype.getInner = function getInner (i) {\n return this.values[i]\n };\n\n Leaf.prototype.forEachInner = function forEachInner (f, from, to, start) {\n for (var i = from; i < to; i++)\n { if (f(this.values[i], start + i) === false) { return false } }\n };\n\n Leaf.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n for (var i = from - 1; i >= to; i--)\n { if (f(this.values[i], start + i) === false) { return false } }\n };\n\n Leaf.prototype.leafAppend = function leafAppend (other) {\n if (this.length + other.length <= GOOD_LEAF_SIZE)\n { return new Leaf(this.values.concat(other.flatten())) }\n };\n\n Leaf.prototype.leafPrepend = function leafPrepend (other) {\n if (this.length + other.length <= GOOD_LEAF_SIZE)\n { return new Leaf(other.flatten().concat(this.values)) }\n };\n\n prototypeAccessors.length.get = function () { return this.values.length };\n\n prototypeAccessors.depth.get = function () { return 0 };\n\n Object.defineProperties( Leaf.prototype, prototypeAccessors );\n\n return Leaf;\n}(RopeSequence));\n\n// :: RopeSequence\n// The empty rope sequence.\nRopeSequence.empty = new Leaf([]);\n\nvar Append = /*@__PURE__*/(function (RopeSequence) {\n function Append(left, right) {\n RopeSequence.call(this);\n this.left = left;\n this.right = right;\n this.length = left.length + right.length;\n this.depth = Math.max(left.depth, right.depth) + 1;\n }\n\n if ( RopeSequence ) Append.__proto__ = RopeSequence;\n Append.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n Append.prototype.constructor = Append;\n\n Append.prototype.flatten = function flatten () {\n return this.left.flatten().concat(this.right.flatten())\n };\n\n Append.prototype.getInner = function getInner (i) {\n return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length)\n };\n\n Append.prototype.forEachInner = function forEachInner (f, from, to, start) {\n var leftLen = this.left.length;\n if (from < leftLen &&\n this.left.forEachInner(f, from, Math.min(to, leftLen), start) === false)\n { return false }\n if (to > leftLen &&\n this.right.forEachInner(f, Math.max(from - leftLen, 0), Math.min(this.length, to) - leftLen, start + leftLen) === false)\n { return false }\n };\n\n Append.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n var leftLen = this.left.length;\n if (from > leftLen &&\n this.right.forEachInvertedInner(f, from - leftLen, Math.max(to, leftLen) - leftLen, start + leftLen) === false)\n { return false }\n if (to < leftLen &&\n this.left.forEachInvertedInner(f, Math.min(from, leftLen), to, start) === false)\n { return false }\n };\n\n Append.prototype.sliceInner = function sliceInner (from, to) {\n if (from == 0 && to == this.length) { return this }\n var leftLen = this.left.length;\n if (to <= leftLen) { return this.left.slice(from, to) }\n if (from >= leftLen) { return this.right.slice(from - leftLen, to - leftLen) }\n return this.left.slice(from, leftLen).append(this.right.slice(0, to - leftLen))\n };\n\n Append.prototype.leafAppend = function leafAppend (other) {\n var inner = this.right.leafAppend(other);\n if (inner) { return new Append(this.left, inner) }\n };\n\n Append.prototype.leafPrepend = function leafPrepend (other) {\n var inner = this.left.leafPrepend(other);\n if (inner) { return new Append(inner, this.right) }\n };\n\n Append.prototype.appendInner = function appendInner (other) {\n if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1)\n { return new Append(this.left, new Append(this.right, other)) }\n return new Append(this, other)\n };\n\n return Append;\n}(RopeSequence));\n\nvar ropeSequence = RopeSequence;\n\nexport default ropeSequence;\n","import RopeSequence from 'rope-sequence';\nimport { Mapping } from 'prosemirror-transform';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\n// ProseMirror's history isn't simply a way to roll back to a previous\n// state, because ProseMirror supports applying changes without adding\n// them to the history (for example during collaboration).\n//\n// To this end, each 'Branch' (one for the undo history and one for\n// the redo history) keeps an array of 'Items', which can optionally\n// hold a step (an actual undoable change), and always hold a position\n// map (which is needed to move changes below them to apply to the\n// current document).\n//\n// An item that has both a step and a selection bookmark is the start\n// of an 'event' — a group of changes that will be undone or redone at\n// once. (It stores only the bookmark, since that way we don't have to\n// provide a document until the selection is actually applied, which\n// is useful when compressing.)\n\n// Used to schedule history compression\nvar max_empty_items = 500;\n\nvar Branch = function Branch(items, eventCount) {\n this.items = items;\n this.eventCount = eventCount;\n};\n\n// : (EditorState, bool) → ?{transform: Transform, selection: ?SelectionBookmark, remaining: Branch}\n// Pop the latest event off the branch's history and apply it\n// to a document transform.\nBranch.prototype.popEvent = function popEvent (state, preserveItems) {\n var this$1 = this;\n\n if (this.eventCount == 0) { return null }\n\n var end = this.items.length;\n for (;; end--) {\n var next = this.items.get(end - 1);\n if (next.selection) { --end; break }\n }\n\n var remap, mapFrom;\n if (preserveItems) {\n remap = this.remapping(end, this.items.length);\n mapFrom = remap.maps.length;\n }\n var transform = state.tr;\n var selection, remaining;\n var addAfter = [], addBefore = [];\n\n this.items.forEach(function (item, i) {\n if (!item.step) {\n if (!remap) {\n remap = this$1.remapping(end, i + 1);\n mapFrom = remap.maps.length;\n }\n mapFrom--;\n addBefore.push(item);\n return\n }\n\n if (remap) {\n addBefore.push(new Item(item.map));\n var step = item.step.map(remap.slice(mapFrom)), map;\n\n if (step && transform.maybeStep(step).doc) {\n map = transform.mapping.maps[transform.mapping.maps.length - 1];\n addAfter.push(new Item(map, null, null, addAfter.length + addBefore.length));\n }\n mapFrom--;\n if (map) { remap.appendMap(map, mapFrom); }\n } else {\n transform.maybeStep(item.step);\n }\n\n if (item.selection) {\n selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection;\n remaining = new Branch(this$1.items.slice(0, end).append(addBefore.reverse().concat(addAfter)), this$1.eventCount - 1);\n return false\n }\n }, this.items.length, 0);\n\n return {remaining: remaining, transform: transform, selection: selection}\n};\n\n// : (Transform, ?SelectionBookmark, Object) → Branch\n// Create a new branch with the given transform added.\nBranch.prototype.addTransform = function addTransform (transform, selection, histOptions, preserveItems) {\n var newItems = [], eventCount = this.eventCount;\n var oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null;\n\n for (var i = 0; i < transform.steps.length; i++) {\n var step = transform.steps[i].invert(transform.docs[i]);\n var item = new Item(transform.mapping.maps[i], step, selection), merged = (void 0);\n if (merged = lastItem && lastItem.merge(item)) {\n item = merged;\n if (i) { newItems.pop(); }\n else { oldItems = oldItems.slice(0, oldItems.length - 1); }\n }\n newItems.push(item);\n if (selection) {\n eventCount++;\n selection = null;\n }\n if (!preserveItems) { lastItem = item; }\n }\n var overflow = eventCount - histOptions.depth;\n if (overflow > DEPTH_OVERFLOW) {\n oldItems = cutOffEvents(oldItems, overflow);\n eventCount -= overflow;\n }\n return new Branch(oldItems.append(newItems), eventCount)\n};\n\nBranch.prototype.remapping = function remapping (from, to) {\n var maps = new Mapping;\n this.items.forEach(function (item, i) {\n var mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from\n ? maps.maps.length - item.mirrorOffset : null;\n maps.appendMap(item.map, mirrorPos);\n }, from, to);\n return maps\n};\n\nBranch.prototype.addMaps = function addMaps (array) {\n if (this.eventCount == 0) { return this }\n return new Branch(this.items.append(array.map(function (map) { return new Item(map); })), this.eventCount)\n};\n\n// : (Transform, number)\n// When the collab module receives remote changes, the history has\n// to know about those, so that it can adjust the steps that were\n// rebased on top of the remote changes, and include the position\n// maps for the remote changes in its array of items.\nBranch.prototype.rebased = function rebased (rebasedTransform, rebasedCount) {\n if (!this.eventCount) { return this }\n\n var rebasedItems = [], start = Math.max(0, this.items.length - rebasedCount);\n\n var mapping = rebasedTransform.mapping;\n var newUntil = rebasedTransform.steps.length;\n var eventCount = this.eventCount;\n this.items.forEach(function (item) { if (item.selection) { eventCount--; } }, start);\n\n var iRebased = rebasedCount;\n this.items.forEach(function (item) {\n var pos = mapping.getMirror(--iRebased);\n if (pos == null) { return }\n newUntil = Math.min(newUntil, pos);\n var map = mapping.maps[pos];\n if (item.step) {\n var step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]);\n var selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos));\n if (selection) { eventCount++; }\n rebasedItems.push(new Item(map, step, selection));\n } else {\n rebasedItems.push(new Item(map));\n }\n }, start);\n\n var newMaps = [];\n for (var i = rebasedCount; i < newUntil; i++)\n { newMaps.push(new Item(mapping.maps[i])); }\n var items = this.items.slice(0, start).append(newMaps).append(rebasedItems);\n var branch = new Branch(items, eventCount);\n\n if (branch.emptyItemCount() > max_empty_items)\n { branch = branch.compress(this.items.length - rebasedItems.length); }\n return branch\n};\n\nBranch.prototype.emptyItemCount = function emptyItemCount () {\n var count = 0;\n this.items.forEach(function (item) { if (!item.step) { count++; } });\n return count\n};\n\n// Compressing a branch means rewriting it to push the air (map-only\n// items) out. During collaboration, these naturally accumulate\n// because each remote change adds one. The `upto` argument is used\n// to ensure that only the items below a given level are compressed,\n// because `rebased` relies on a clean, untouched set of items in\n// order to associate old items with rebased steps.\nBranch.prototype.compress = function compress (upto) {\n if ( upto === void 0 ) upto = this.items.length;\n\n var remap = this.remapping(0, upto), mapFrom = remap.maps.length;\n var items = [], events = 0;\n this.items.forEach(function (item, i) {\n if (i >= upto) {\n items.push(item);\n if (item.selection) { events++; }\n } else if (item.step) {\n var step = item.step.map(remap.slice(mapFrom)), map = step && step.getMap();\n mapFrom--;\n if (map) { remap.appendMap(map, mapFrom); }\n if (step) {\n var selection = item.selection && item.selection.map(remap.slice(mapFrom));\n if (selection) { events++; }\n var newItem = new Item(map.invert(), step, selection), merged, last = items.length - 1;\n if (merged = items.length && items[last].merge(newItem))\n { items[last] = merged; }\n else\n { items.push(newItem); }\n }\n } else if (item.map) {\n mapFrom--;\n }\n }, this.items.length, 0);\n return new Branch(RopeSequence.from(items.reverse()), events)\n};\n\nBranch.empty = new Branch(RopeSequence.empty, 0);\n\nfunction cutOffEvents(items, n) {\n var cutPoint;\n items.forEach(function (item, i) {\n if (item.selection && (n-- == 0)) {\n cutPoint = i;\n return false\n }\n });\n return items.slice(cutPoint)\n}\n\nvar Item = function Item(map, step, selection, mirrorOffset) {\n // The (forward) step map for this item.\n this.map = map;\n // The inverted step\n this.step = step;\n // If this is non-null, this item is the start of a group, and\n // this selection is the starting selection for the group (the one\n // that was active before the first step was applied)\n this.selection = selection;\n // If this item is the inverse of a previous mapping on the stack,\n // this points at the inverse's offset\n this.mirrorOffset = mirrorOffset;\n};\n\nItem.prototype.merge = function merge (other) {\n if (this.step && other.step && !other.selection) {\n var step = other.step.merge(this.step);\n if (step) { return new Item(step.getMap().invert(), step, this.selection) }\n }\n};\n\n// The value of the state field that tracks undo/redo history for that\n// state. Will be stored in the plugin state when the history plugin\n// is active.\nvar HistoryState = function HistoryState(done, undone, prevRanges, prevTime) {\n this.done = done;\n this.undone = undone;\n this.prevRanges = prevRanges;\n this.prevTime = prevTime;\n};\n\nvar DEPTH_OVERFLOW = 20;\n\n// : (HistoryState, EditorState, Transaction, Object)\n// Record a transformation in undo history.\nfunction applyTransaction(history, state, tr, options) {\n var historyTr = tr.getMeta(historyKey), rebased;\n if (historyTr) { return historyTr.historyState }\n\n if (tr.getMeta(closeHistoryKey)) { history = new HistoryState(history.done, history.undone, null, 0); }\n\n var appended = tr.getMeta(\"appendedTransaction\");\n\n if (tr.steps.length == 0) {\n return history\n } else if (appended && appended.getMeta(historyKey)) {\n if (appended.getMeta(historyKey).redo)\n { return new HistoryState(history.done.addTransform(tr, null, options, mustPreserveItems(state)),\n history.undone, rangesFor(tr.mapping.maps[tr.steps.length - 1]), history.prevTime) }\n else\n { return new HistoryState(history.done, history.undone.addTransform(tr, null, options, mustPreserveItems(state)),\n null, history.prevTime) }\n } else if (tr.getMeta(\"addToHistory\") !== false && !(appended && appended.getMeta(\"addToHistory\") === false)) {\n // Group transforms that occur in quick succession into one event.\n var newGroup = history.prevTime == 0 || !appended && (history.prevTime < (tr.time || 0) - options.newGroupDelay ||\n !isAdjacentTo(tr, history.prevRanges));\n var prevRanges = appended ? mapRanges(history.prevRanges, tr.mapping) : rangesFor(tr.mapping.maps[tr.steps.length - 1]);\n return new HistoryState(history.done.addTransform(tr, newGroup ? state.selection.getBookmark() : null,\n options, mustPreserveItems(state)),\n Branch.empty, prevRanges, tr.time)\n } else if (rebased = tr.getMeta(\"rebased\")) {\n // Used by the collab module to tell the history that some of its\n // content has been rebased.\n return new HistoryState(history.done.rebased(tr, rebased),\n history.undone.rebased(tr, rebased),\n mapRanges(history.prevRanges, tr.mapping), history.prevTime)\n } else {\n return new HistoryState(history.done.addMaps(tr.mapping.maps),\n history.undone.addMaps(tr.mapping.maps),\n mapRanges(history.prevRanges, tr.mapping), history.prevTime)\n }\n}\n\nfunction isAdjacentTo(transform, prevRanges) {\n if (!prevRanges) { return false }\n if (!transform.docChanged) { return true }\n var adjacent = false;\n transform.mapping.maps[0].forEach(function (start, end) {\n for (var i = 0; i < prevRanges.length; i += 2)\n { if (start <= prevRanges[i + 1] && end >= prevRanges[i])\n { adjacent = true; } }\n });\n return adjacent\n}\n\nfunction rangesFor(map) {\n var result = [];\n map.forEach(function (_from, _to, from, to) { return result.push(from, to); });\n return result\n}\n\nfunction mapRanges(ranges, mapping) {\n if (!ranges) { return null }\n var result = [];\n for (var i = 0; i < ranges.length; i += 2) {\n var from = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1);\n if (from <= to) { result.push(from, to); }\n }\n return result\n}\n\n// : (HistoryState, EditorState, (tr: Transaction), bool)\n// Apply the latest event from one branch to the document and shift the event\n// onto the other branch.\nfunction histTransaction(history, state, dispatch, redo) {\n var preserveItems = mustPreserveItems(state), histOptions = historyKey.get(state).spec.config;\n var pop = (redo ? history.undone : history.done).popEvent(state, preserveItems);\n if (!pop) { return }\n\n var selection = pop.selection.resolve(pop.transform.doc);\n var added = (redo ? history.done : history.undone).addTransform(pop.transform, state.selection.getBookmark(),\n histOptions, preserveItems);\n\n var newHist = new HistoryState(redo ? added : pop.remaining, redo ? pop.remaining : added, null, 0);\n dispatch(pop.transform.setSelection(selection).setMeta(historyKey, {redo: redo, historyState: newHist}).scrollIntoView());\n}\n\nvar cachedPreserveItems = false, cachedPreserveItemsPlugins = null;\n// Check whether any plugin in the given state has a\n// `historyPreserveItems` property in its spec, in which case we must\n// preserve steps exactly as they came in, so that they can be\n// rebased.\nfunction mustPreserveItems(state) {\n var plugins = state.plugins;\n if (cachedPreserveItemsPlugins != plugins) {\n cachedPreserveItems = false;\n cachedPreserveItemsPlugins = plugins;\n for (var i = 0; i < plugins.length; i++) { if (plugins[i].spec.historyPreserveItems) {\n cachedPreserveItems = true;\n break\n } }\n }\n return cachedPreserveItems\n}\n\n// :: (Transaction) → Transaction\n// Set a flag on the given transaction that will prevent further steps\n// from being appended to an existing history event (so that they\n// require a separate undo command to undo).\nfunction closeHistory(tr) {\n return tr.setMeta(closeHistoryKey, true)\n}\n\nvar historyKey = new PluginKey(\"history\");\nvar closeHistoryKey = new PluginKey(\"closeHistory\");\n\n// :: (?Object) → Plugin\n// Returns a plugin that enables the undo history for an editor. The\n// plugin will track undo and redo stacks, which can be used with the\n// [`undo`](#history.undo) and [`redo`](#history.redo) commands.\n//\n// You can set an `\"addToHistory\"` [metadata\n// property](#state.Transaction.setMeta) of `false` on a transaction\n// to prevent it from being rolled back by undo.\n//\n// config::-\n// Supports the following configuration options:\n//\n// depth:: ?number\n// The amount of history events that are collected before the\n// oldest events are discarded. Defaults to 100.\n//\n// newGroupDelay:: ?number\n// The delay between changes after which a new group should be\n// started. Defaults to 500 (milliseconds). Note that when changes\n// aren't adjacent, a new group is always started.\nfunction history(config) {\n config = {depth: config && config.depth || 100,\n newGroupDelay: config && config.newGroupDelay || 500};\n return new Plugin({\n key: historyKey,\n\n state: {\n init: function init() {\n return new HistoryState(Branch.empty, Branch.empty, null, 0)\n },\n apply: function apply(tr, hist, state) {\n return applyTransaction(hist, state, tr, config)\n }\n },\n\n config: config\n })\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// A command function that undoes the last change, if any.\nfunction undo(state, dispatch) {\n var hist = historyKey.getState(state);\n if (!hist || hist.done.eventCount == 0) { return false }\n if (dispatch) { histTransaction(hist, state, dispatch, false); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// A command function that redoes the last undone change, if any.\nfunction redo(state, dispatch) {\n var hist = historyKey.getState(state);\n if (!hist || hist.undone.eventCount == 0) { return false }\n if (dispatch) { histTransaction(hist, state, dispatch, true); }\n return true\n}\n\n// :: (EditorState) → number\n// The amount of undoable events available in a given state.\nfunction undoDepth(state) {\n var hist = historyKey.getState(state);\n return hist ? hist.done.eventCount : 0\n}\n\n// :: (EditorState) → number\n// The amount of redoable events available in a given editor state.\nfunction redoDepth(state) {\n var hist = historyKey.getState(state);\n return hist ? hist.undone.eventCount : 0\n}\n\nexport { HistoryState, closeHistory, history, redo, redoDepth, undo, undoDepth };\n//# sourceMappingURL=index.es.js.map\n","import { TextSelection, NodeSelection, Selection } from 'prosemirror-state';\nimport { DOMSerializer, Fragment, Mark, DOMParser, Slice } from 'prosemirror-model';\nimport { dropPoint } from 'prosemirror-transform';\n\nvar result = {};\n\nif (typeof navigator != \"undefined\" && typeof document != \"undefined\") {\n var ie_edge = /Edge\\/(\\d+)/.exec(navigator.userAgent);\n var ie_upto10 = /MSIE \\d/.test(navigator.userAgent);\n var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);\n\n result.mac = /Mac/.test(navigator.platform);\n var ie = result.ie = !!(ie_upto10 || ie_11up || ie_edge);\n result.ie_version = ie_upto10 ? document.documentMode || 6 : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : null;\n result.gecko = !ie && /gecko\\/(\\d+)/i.test(navigator.userAgent);\n result.gecko_version = result.gecko && +(/Firefox\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1];\n var chrome = !ie && /Chrome\\/(\\d+)/.exec(navigator.userAgent);\n result.chrome = !!chrome;\n result.chrome_version = chrome && +chrome[1];\n // Is true for both iOS and iPadOS for convenience\n result.safari = !ie && /Apple Computer/.test(navigator.vendor);\n result.ios = result.safari && (/Mobile\\/\\w+/.test(navigator.userAgent) || navigator.maxTouchPoints > 2);\n result.android = /Android \\d/.test(navigator.userAgent);\n result.webkit = \"webkitFontSmoothing\" in document.documentElement.style;\n result.webkit_version = result.webkit && +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1];\n}\n\nvar domIndex = function(node) {\n for (var index = 0;; index++) {\n node = node.previousSibling;\n if (!node) { return index }\n }\n};\n\nvar parentNode = function(node) {\n var parent = node.parentNode;\n return parent && parent.nodeType == 11 ? parent.host : parent\n};\n\nvar reusedRange = null;\n\n// Note that this will always return the same range, because DOM range\n// objects are every expensive, and keep slowing down subsequent DOM\n// updates, for some reason.\nvar textRange = function(node, from, to) {\n var range = reusedRange || (reusedRange = document.createRange());\n range.setEnd(node, to == null ? node.nodeValue.length : to);\n range.setStart(node, from || 0);\n return range\n};\n\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nvar isEquivalentPosition = function(node, off, targetNode, targetOff) {\n return targetNode && (scanFor(node, off, targetNode, targetOff, -1) ||\n scanFor(node, off, targetNode, targetOff, 1))\n};\n\nvar atomElements = /^(img|br|input|textarea|hr)$/i;\n\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n for (;;) {\n if (node == targetNode && off == targetOff) { return true }\n if (off == (dir < 0 ? 0 : nodeSize(node))) {\n var parent = node.parentNode;\n if (parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) || node.contentEditable == \"false\")\n { return false }\n off = domIndex(node) + (dir < 0 ? 0 : 1);\n node = parent;\n } else if (node.nodeType == 1) {\n node = node.childNodes[off + (dir < 0 ? -1 : 0)];\n if (node.contentEditable == \"false\") { return false }\n off = dir < 0 ? nodeSize(node) : 0;\n } else {\n return false\n }\n }\n}\n\nfunction nodeSize(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length\n}\n\nfunction isOnEdge(node, offset, parent) {\n for (var atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd;) {\n if (node == parent) { return true }\n var index = domIndex(node);\n node = node.parentNode;\n if (!node) { return false }\n atStart = atStart && index == 0;\n atEnd = atEnd && index == nodeSize(node);\n }\n}\n\nfunction hasBlockDesc(dom) {\n var desc;\n for (var cur = dom; cur; cur = cur.parentNode) { if (desc = cur.pmViewDesc) { break } }\n return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom)\n}\n\n// Work around Chrome issue https://bugs.chromium.org/p/chromium/issues/detail?id=447523\n// (isCollapsed inappropriately returns true in shadow dom)\nvar selectionCollapsed = function(domSel) {\n var collapsed = domSel.isCollapsed;\n if (collapsed && result.chrome && domSel.rangeCount && !domSel.getRangeAt(0).collapsed)\n { collapsed = false; }\n return collapsed\n};\n\nfunction keyEvent(keyCode, key) {\n var event = document.createEvent(\"Event\");\n event.initEvent(\"keydown\", true, true);\n event.keyCode = keyCode;\n event.key = event.code = key;\n return event\n}\n\nfunction windowRect(doc) {\n return {left: 0, right: doc.documentElement.clientWidth,\n top: 0, bottom: doc.documentElement.clientHeight}\n}\n\nfunction getSide(value, side) {\n return typeof value == \"number\" ? value : value[side]\n}\n\nfunction clientRect(node) {\n var rect = node.getBoundingClientRect();\n // Make sure scrollbar width isn't included in the rectangle\n return {left: rect.left, right: rect.left + node.clientWidth,\n top: rect.top, bottom: rect.top + node.clientHeight}\n}\n\nfunction scrollRectIntoView(view, rect, startDOM) {\n var scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n var doc = view.dom.ownerDocument;\n for (var parent = startDOM || view.dom;; parent = parentNode(parent)) {\n if (!parent) { break }\n if (parent.nodeType != 1) { continue }\n var atTop = parent == doc.body || parent.nodeType != 1;\n var bounding = atTop ? windowRect(doc) : clientRect(parent);\n var moveX = 0, moveY = 0;\n if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n { moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\")); }\n else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n { moveY = rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\"); }\n if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n { moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\")); }\n else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n { moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\"); }\n if (moveX || moveY) {\n if (atTop) {\n doc.defaultView.scrollBy(moveX, moveY);\n } else {\n var startX = parent.scrollLeft, startY = parent.scrollTop;\n if (moveY) { parent.scrollTop += moveY; }\n if (moveX) { parent.scrollLeft += moveX; }\n var dX = parent.scrollLeft - startX, dY = parent.scrollTop - startY;\n rect = {left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY};\n }\n }\n if (atTop) { break }\n }\n}\n\n// Store the scroll position of the editor's parent nodes, along with\n// the top position of an element near the top of the editor, which\n// will be used to make sure the visible viewport remains stable even\n// when the size of the content above changes.\nfunction storeScrollPos(view) {\n var rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n var refDOM, refTop;\n for (var x = (rect.left + rect.right) / 2, y = startY + 1;\n y < Math.min(innerHeight, rect.bottom); y += 5) {\n var dom = view.root.elementFromPoint(x, y);\n if (dom == view.dom || !view.dom.contains(dom)) { continue }\n var localRect = dom.getBoundingClientRect();\n if (localRect.top >= startY - 20) {\n refDOM = dom;\n refTop = localRect.top;\n break\n }\n }\n return {refDOM: refDOM, refTop: refTop, stack: scrollStack(view.dom)}\n}\n\nfunction scrollStack(dom) {\n var stack = [], doc = dom.ownerDocument;\n for (; dom; dom = parentNode(dom)) {\n stack.push({dom: dom, top: dom.scrollTop, left: dom.scrollLeft});\n if (dom == doc) { break }\n }\n return stack\n}\n\n// Reset the scroll position of the editor's parent nodes to that what\n// it was before, when storeScrollPos was called.\nfunction resetScrollPos(ref) {\n var refDOM = ref.refDOM;\n var refTop = ref.refTop;\n var stack = ref.stack;\n\n var newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\n\nfunction restoreScrollStack(stack, dTop) {\n for (var i = 0; i < stack.length; i++) {\n var ref = stack[i];\n var dom = ref.dom;\n var top = ref.top;\n var left = ref.left;\n if (dom.scrollTop != top + dTop) { dom.scrollTop = top + dTop; }\n if (dom.scrollLeft != left) { dom.scrollLeft = left; }\n }\n}\n\nvar preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n if (dom.setActive) { return dom.setActive() } // in IE\n if (preventScrollSupported) { return dom.focus(preventScrollSupported) }\n\n var stored = scrollStack(dom);\n dom.focus(preventScrollSupported == null ? {\n get preventScroll() {\n preventScrollSupported = {preventScroll: true};\n return true\n }\n } : undefined);\n if (!preventScrollSupported) {\n preventScrollSupported = false;\n restoreScrollStack(stored, 0);\n }\n}\n\nfunction findOffsetInNode(node, coords) {\n var closest, dxClosest = 2e8, coordsClosest, offset = 0;\n var rowBot = coords.top, rowTop = coords.top;\n for (var child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n var rects = (void 0);\n if (child.nodeType == 1) { rects = child.getClientRects(); }\n else if (child.nodeType == 3) { rects = textRange(child).getClientRects(); }\n else { continue }\n\n for (var i = 0; i < rects.length; i++) {\n var rect = rects[i];\n if (rect.top <= rowBot && rect.bottom >= rowTop) {\n rowBot = Math.max(rect.bottom, rowBot);\n rowTop = Math.min(rect.top, rowTop);\n var dx = rect.left > coords.left ? rect.left - coords.left\n : rect.right < coords.left ? coords.left - rect.right : 0;\n if (dx < dxClosest) {\n closest = child;\n dxClosest = dx;\n coordsClosest = dx && closest.nodeType == 3 ? {left: rect.right < coords.left ? rect.right : rect.left, top: coords.top} : coords;\n if (child.nodeType == 1 && dx)\n { offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0); }\n continue\n }\n }\n if (!closest && (coords.left >= rect.right && coords.top >= rect.top ||\n coords.left >= rect.left && coords.top >= rect.bottom))\n { offset = childIndex + 1; }\n }\n }\n if (closest && closest.nodeType == 3) { return findOffsetInText(closest, coordsClosest) }\n if (!closest || (dxClosest && closest.nodeType == 1)) { return {node: node, offset: offset} }\n return findOffsetInNode(closest, coordsClosest)\n}\n\nfunction findOffsetInText(node, coords) {\n var len = node.nodeValue.length;\n var range = document.createRange();\n for (var i = 0; i < len; i++) {\n range.setEnd(node, i + 1);\n range.setStart(node, i);\n var rect = singleRect(range, 1);\n if (rect.top == rect.bottom) { continue }\n if (inRect(coords, rect))\n { return {node: node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0)} }\n }\n return {node: node, offset: 0}\n}\n\nfunction inRect(coords, rect) {\n return coords.left >= rect.left - 1 && coords.left <= rect.right + 1&&\n coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1\n}\n\nfunction targetKludge(dom, coords) {\n var parent = dom.parentNode;\n if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n { return parent }\n return dom\n}\n\nfunction posFromElement(view, elt, coords) {\n var ref = findOffsetInNode(elt, coords);\n var node = ref.node;\n var offset = ref.offset;\n var bias = -1;\n if (node.nodeType == 1 && !node.firstChild) {\n var rect = node.getBoundingClientRect();\n bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n }\n return view.docView.posFromDOM(node, offset, bias)\n}\n\nfunction posFromCaret(view, node, offset, coords) {\n // Browser (in caretPosition/RangeFromPoint) will agressively\n // normalize towards nearby inline nodes. Since we are interested in\n // positions between block nodes too, we first walk up the hierarchy\n // of nodes to see if there are block nodes that the coordinates\n // fall outside of. If so, we take the position before/after that\n // block. If not, we call `posFromDOM` on the raw node/offset.\n var outside = -1;\n for (var cur = node;;) {\n if (cur == view.dom) { break }\n var desc = view.docView.nearestDesc(cur, true);\n if (!desc) { return null }\n if (desc.node.isBlock && desc.parent) {\n var rect = desc.dom.getBoundingClientRect();\n if (rect.left > coords.left || rect.top > coords.top) { outside = desc.posBefore; }\n else if (rect.right < coords.left || rect.bottom < coords.top) { outside = desc.posAfter; }\n else { break }\n }\n cur = desc.dom.parentNode;\n }\n return outside > -1 ? outside : view.docView.posFromDOM(node, offset)\n}\n\nfunction elementFromPoint(element, coords, box) {\n var len = element.childNodes.length;\n if (len && box.top < box.bottom) {\n for (var startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {\n var child = element.childNodes[i];\n if (child.nodeType == 1) {\n var rects = child.getClientRects();\n for (var j = 0; j < rects.length; j++) {\n var rect = rects[j];\n if (inRect(coords, rect)) { return elementFromPoint(child, coords, rect) }\n }\n }\n if ((i = (i + 1) % len) == startI) { break }\n }\n }\n return element\n}\n\n// Given an x,y position on the editor, get the position in the document.\nfunction posAtCoords(view, coords) {\n var assign, assign$1;\n\n var root = view.root, node, offset;\n if (root.caretPositionFromPoint) {\n try { // Firefox throws for this call in hard-to-predict circumstances (#994)\n var pos$1 = root.caretPositionFromPoint(coords.left, coords.top);\n if (pos$1) { ((assign = pos$1, node = assign.offsetNode, offset = assign.offset)); }\n } catch (_) {}\n }\n if (!node && root.caretRangeFromPoint) {\n var range = root.caretRangeFromPoint(coords.left, coords.top);\n if (range) { ((assign$1 = range, node = assign$1.startContainer, offset = assign$1.startOffset)); }\n }\n\n var elt = root.elementFromPoint(coords.left, coords.top + 1), pos;\n if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n var box = view.dom.getBoundingClientRect();\n if (!inRect(coords, box)) { return null }\n elt = elementFromPoint(view.dom, coords, box);\n if (!elt) { return null }\n }\n // Safari's caretRangeFromPoint returns nonsense when on a draggable element\n if (result.safari && elt.draggable) { node = offset = null; }\n elt = targetKludge(elt, coords);\n if (node) {\n if (result.gecko && node.nodeType == 1) {\n // Firefox will sometimes return offsets into nodes, which\n // have no actual children, from caretPositionFromPoint (#953)\n offset = Math.min(offset, node.childNodes.length);\n // It'll also move the returned position before image nodes,\n // even if those are behind it.\n if (offset < node.childNodes.length) {\n var next = node.childNodes[offset], box$1;\n if (next.nodeName == \"IMG\" && (box$1 = next.getBoundingClientRect()).right <= coords.left &&\n box$1.bottom > coords.top)\n { offset++; }\n }\n }\n // Suspiciously specific kludge to work around caret*FromPoint\n // never returning a position at the end of the document\n if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&\n coords.top > node.lastChild.getBoundingClientRect().bottom)\n { pos = view.state.doc.content.size; }\n // Ignore positions directly after a BR, since caret*FromPoint\n // 'round up' positions that would be more accurately placed\n // before the BR node.\n else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n { pos = posFromCaret(view, node, offset, coords); }\n }\n if (pos == null) { pos = posFromElement(view, elt, coords); }\n\n var desc = view.docView.nearestDesc(elt, true);\n return {pos: pos, inside: desc ? desc.posAtStart - desc.border : -1}\n}\n\nfunction singleRect(object, bias) {\n var rects = object.getClientRects();\n return !rects.length ? object.getBoundingClientRect() : rects[bias < 0 ? 0 : rects.length - 1]\n}\n\nvar BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n\n// : (EditorView, number, number) → {left: number, top: number, right: number, bottom: number}\n// Given a position in the document model, get a bounding box of the\n// character at that position, relative to the window.\nfunction coordsAtPos(view, pos, side) {\n var ref = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n var node = ref.node;\n var offset = ref.offset;\n\n var supportEmptyRange = result.webkit || result.gecko;\n if (node.nodeType == 3) {\n // These browsers support querying empty text ranges. Prefer that in\n // bidi context or when at the end of a node.\n if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n var rect = singleRect(textRange(node, offset, offset), side);\n // Firefox returns bad results (the position before the space)\n // when querying a position directly after line-broken\n // whitespace. Detect this situation and and kludge around it\n if (result.gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n var rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n if (rectBefore.top == rect.top) {\n var rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n if (rectAfter.top != rect.top)\n { return flattenV(rectAfter, rectAfter.left < rectBefore.left) }\n }\n }\n return rect\n } else {\n var from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n if (side < 0 && !offset) { to++; takeSide = -1; }\n else if (side >= 0 && offset == node.nodeValue.length) { from--; takeSide = 1; }\n else if (side < 0) { from--; }\n else { to ++; }\n return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0)\n }\n }\n\n // Return a horizontal line in block context\n if (!view.state.doc.resolve(pos).parent.inlineContent) {\n if (offset && (side < 0 || offset == nodeSize(node))) {\n var before = node.childNodes[offset - 1];\n if (before.nodeType == 1) { return flattenH(before.getBoundingClientRect(), false) }\n }\n if (offset < nodeSize(node)) {\n var after = node.childNodes[offset];\n if (after.nodeType == 1) { return flattenH(after.getBoundingClientRect(), true) }\n }\n return flattenH(node.getBoundingClientRect(), side >= 0)\n }\n\n // Inline, not in text node (this is not Bidi-safe)\n if (offset && (side < 0 || offset == nodeSize(node))) {\n var before$1 = node.childNodes[offset - 1];\n var target = before$1.nodeType == 3 ? textRange(before$1, nodeSize(before$1) - (supportEmptyRange ? 0 : 1))\n // BR nodes tend to only return the rectangle before them.\n // Only use them if they are the last element in their parent\n : before$1.nodeType == 1 && (before$1.nodeName != \"BR\" || !before$1.nextSibling) ? before$1 : null;\n if (target) { return flattenV(singleRect(target, 1), false) }\n }\n if (offset < nodeSize(node)) {\n var after$1 = node.childNodes[offset];\n var target$1 = after$1.nodeType == 3 ? textRange(after$1, 0, (supportEmptyRange ? 0 : 1))\n : after$1.nodeType == 1 ? after$1 : null;\n if (target$1) { return flattenV(singleRect(target$1, -1), true) }\n }\n // All else failed, just try to get a rectangle for the target node\n return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0)\n}\n\nfunction flattenV(rect, left) {\n if (rect.width == 0) { return rect }\n var x = left ? rect.left : rect.right;\n return {top: rect.top, bottom: rect.bottom, left: x, right: x}\n}\n\nfunction flattenH(rect, top) {\n if (rect.height == 0) { return rect }\n var y = top ? rect.top : rect.bottom;\n return {top: y, bottom: y, left: rect.left, right: rect.right}\n}\n\nfunction withFlushedState(view, state, f) {\n var viewState = view.state, active = view.root.activeElement;\n if (viewState != state) { view.updateState(state); }\n if (active != view.dom) { view.focus(); }\n try {\n return f()\n } finally {\n if (viewState != state) { view.updateState(viewState); }\n if (active != view.dom && active) { active.focus(); }\n }\n}\n\n// : (EditorView, number, number)\n// Whether vertical position motion in a given direction\n// from a position would leave a text block.\nfunction endOfTextblockVertical(view, state, dir) {\n var sel = state.selection;\n var $pos = dir == \"up\" ? sel.$from : sel.$to;\n return withFlushedState(view, state, function () {\n var ref = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n var dom = ref.node;\n for (;;) {\n var nearest = view.docView.nearestDesc(dom, true);\n if (!nearest) { break }\n if (nearest.node.isBlock) { dom = nearest.dom; break }\n dom = nearest.dom.parentNode;\n }\n var coords = coordsAtPos(view, $pos.pos, 1);\n for (var child = dom.firstChild; child; child = child.nextSibling) {\n var boxes = (void 0);\n if (child.nodeType == 1) { boxes = child.getClientRects(); }\n else if (child.nodeType == 3) { boxes = textRange(child, 0, child.nodeValue.length).getClientRects(); }\n else { continue }\n for (var i = 0; i < boxes.length; i++) {\n var box = boxes[i];\n if (box.bottom > box.top && (dir == \"up\" ? box.bottom < coords.top + 1 : box.top > coords.bottom - 1))\n { return false }\n }\n }\n return true\n })\n}\n\nvar maybeRTL = /[\\u0590-\\u08ac]/;\n\nfunction endOfTextblockHorizontal(view, state, dir) {\n var ref = state.selection;\n var $head = ref.$head;\n if (!$head.parent.isTextblock) { return false }\n var offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n var sel = getSelection();\n // If the textblock is all LTR, or the browser doesn't support\n // Selection.modify (Edge), fall back to a primitive approach\n if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n { return dir == \"left\" || dir == \"backward\" ? atStart : atEnd }\n\n return withFlushedState(view, state, function () {\n // This is a huge hack, but appears to be the best we can\n // currently do: use `Selection.modify` to move the selection by\n // one character, and see if that moves the cursor out of the\n // textblock (or doesn't move it at all, when at the start/end of\n // the document).\n var oldRange = sel.getRangeAt(0), oldNode = sel.focusNode, oldOff = sel.focusOffset;\n var oldBidiLevel = sel.caretBidiLevel; // Only for Firefox\n sel.modify(\"move\", dir, \"character\");\n var parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n var result = !parentDOM.contains(sel.focusNode.nodeType == 1 ? sel.focusNode : sel.focusNode.parentNode) ||\n (oldNode == sel.focusNode && oldOff == sel.focusOffset);\n // Restore the previous selection\n sel.removeAllRanges();\n sel.addRange(oldRange);\n if (oldBidiLevel != null) { sel.caretBidiLevel = oldBidiLevel; }\n return result\n })\n}\n\nvar cachedState = null, cachedDir = null, cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n if (cachedState == state && cachedDir == dir) { return cachedResult }\n cachedState = state; cachedDir = dir;\n return cachedResult = dir == \"up\" || dir == \"down\"\n ? endOfTextblockVertical(view, state, dir)\n : endOfTextblockHorizontal(view, state, dir)\n}\n\n// NodeView:: interface\n//\n// By default, document nodes are rendered using the result of the\n// [`toDOM`](#model.NodeSpec.toDOM) method of their spec, and managed\n// entirely by the editor. For some use cases, such as embedded\n// node-specific editing interfaces, you want more control over\n// the behavior of a node's in-editor representation, and need to\n// [define](#view.EditorProps.nodeViews) a custom node view.\n//\n// Mark views only support `dom` and `contentDOM`, and don't support\n// any of the node view methods.\n//\n// Objects returned as node views must conform to this interface.\n//\n// dom:: ?dom.Node\n// The outer DOM node that represents the document node. When not\n// given, the default strategy is used to create a DOM node.\n//\n// contentDOM:: ?dom.Node\n// The DOM node that should hold the node's content. Only meaningful\n// if the node view also defines a `dom` property and if its node\n// type is not a leaf node type. When this is present, ProseMirror\n// will take care of rendering the node's children into it. When it\n// is not present, the node view itself is responsible for rendering\n// (or deciding not to render) its child nodes.\n//\n// update:: ?(node: Node, decorations: [Decoration]) → bool\n// When given, this will be called when the view is updating itself.\n// It will be given a node (possibly of a different type), and an\n// array of active decorations (which are automatically drawn, and\n// the node view may ignore if it isn't interested in them), and\n// should return true if it was able to update to that node, and\n// false otherwise. If the node view has a `contentDOM` property (or\n// no `dom` property), updating its child nodes will be handled by\n// ProseMirror.\n//\n// selectNode:: ?()\n// Can be used to override the way the node's selected status (as a\n// node selection) is displayed.\n//\n// deselectNode:: ?()\n// When defining a `selectNode` method, you should also provide a\n// `deselectNode` method to remove the effect again.\n//\n// setSelection:: ?(anchor: number, head: number, root: dom.Document)\n// This will be called to handle setting the selection inside the\n// node. The `anchor` and `head` positions are relative to the start\n// of the node. By default, a DOM selection will be created between\n// the DOM positions corresponding to those positions, but if you\n// override it you can do something else.\n//\n// stopEvent:: ?(event: dom.Event) → bool\n// Can be used to prevent the editor view from trying to handle some\n// or all DOM events that bubble up from the node view. Events for\n// which this returns true are not handled by the editor.\n//\n// ignoreMutation:: ?(dom.MutationRecord) → bool\n// Called when a DOM\n// [mutation](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver)\n// or a selection change happens within the view. When the change is\n// a selection change, the record will have a `type` property of\n// `\"selection\"` (which doesn't occur for native mutation records).\n// Return false if the editor should re-read the selection or\n// re-parse the range around the mutation, true if it can safely be\n// ignored.\n//\n// destroy:: ?()\n// Called when the node view is removed from the editor or the whole\n// editor is destroyed. (Not available for marks.)\n\n// View descriptions are data structures that describe the DOM that is\n// used to represent the editor's content. They are used for:\n//\n// - Incremental redrawing when the document changes\n//\n// - Figuring out what part of the document a given DOM position\n// corresponds to\n//\n// - Wiring in custom implementations of the editing interface for a\n// given node\n//\n// They form a doubly-linked mutable tree, starting at `view.docView`.\n\nvar NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\n\n// Superclass for the various kinds of descriptions. Defines their\n// basic structure and shared methods.\nvar ViewDesc = function ViewDesc(parent, children, dom, contentDOM) {\n this.parent = parent;\n this.children = children;\n this.dom = dom;\n // An expando property on the DOM node provides a link back to its\n // description.\n dom.pmViewDesc = this;\n // This is the node that holds the child views. It may be null for\n // descs that don't have children.\n this.contentDOM = contentDOM;\n this.dirty = NOT_DIRTY;\n};\n\nvar prototypeAccessors = { beforePosition: { configurable: true },size: { configurable: true },border: { configurable: true },posBefore: { configurable: true },posAtStart: { configurable: true },posAfter: { configurable: true },posAtEnd: { configurable: true },contentLost: { configurable: true },domAtom: { configurable: true } };\n\n// Used to check whether a given description corresponds to a\n// widget/mark/node.\nViewDesc.prototype.matchesWidget = function matchesWidget () { return false };\nViewDesc.prototype.matchesMark = function matchesMark () { return false };\nViewDesc.prototype.matchesNode = function matchesNode () { return false };\nViewDesc.prototype.matchesHack = function matchesHack () { return false };\n\nprototypeAccessors.beforePosition.get = function () { return false };\n\n// : () → ?ParseRule\n// When parsing in-editor content (in domchange.js), we allow\n// descriptions to determine the parse rules that should be used to\n// parse them.\nViewDesc.prototype.parseRule = function parseRule () { return null };\n\n// : (dom.Event) → bool\n// Used by the editor's event handler to ignore events that come\n// from certain descs.\nViewDesc.prototype.stopEvent = function stopEvent () { return false };\n\n// The size of the content represented by this desc.\nprototypeAccessors.size.get = function () {\n var size = 0;\n for (var i = 0; i < this.children.length; i++) { size += this.children[i].size; }\n return size\n};\n\n// For block nodes, this represents the space taken up by their\n// start/end tokens.\nprototypeAccessors.border.get = function () { return 0 };\n\nViewDesc.prototype.destroy = function destroy () {\n this.parent = null;\n if (this.dom.pmViewDesc == this) { this.dom.pmViewDesc = null; }\n for (var i = 0; i < this.children.length; i++)\n { this.children[i].destroy(); }\n};\n\nViewDesc.prototype.posBeforeChild = function posBeforeChild (child) {\n for (var i = 0, pos = this.posAtStart; i < this.children.length; i++) {\n var cur = this.children[i];\n if (cur == child) { return pos }\n pos += cur.size;\n }\n};\n\nprototypeAccessors.posBefore.get = function () {\n return this.parent.posBeforeChild(this)\n};\n\nprototypeAccessors.posAtStart.get = function () {\n return this.parent ? this.parent.posBeforeChild(this) + this.border : 0\n};\n\nprototypeAccessors.posAfter.get = function () {\n return this.posBefore + this.size\n};\n\nprototypeAccessors.posAtEnd.get = function () {\n return this.posAtStart + this.size - 2 * this.border\n};\n\n// : (dom.Node, number, ?number) → number\nViewDesc.prototype.localPosFromDOM = function localPosFromDOM (dom, offset, bias) {\n // If the DOM position is in the content, use the child desc after\n // it to figure out a position.\n if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n if (bias < 0) {\n var domBefore, desc;\n if (dom == this.contentDOM) {\n domBefore = dom.childNodes[offset - 1];\n } else {\n while (dom.parentNode != this.contentDOM) { dom = dom.parentNode; }\n domBefore = dom.previousSibling;\n }\n while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this)) { domBefore = domBefore.previousSibling; }\n return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart\n } else {\n var domAfter, desc$1;\n if (dom == this.contentDOM) {\n domAfter = dom.childNodes[offset];\n } else {\n while (dom.parentNode != this.contentDOM) { dom = dom.parentNode; }\n domAfter = dom.nextSibling;\n }\n while (domAfter && !((desc$1 = domAfter.pmViewDesc) && desc$1.parent == this)) { domAfter = domAfter.nextSibling; }\n return domAfter ? this.posBeforeChild(desc$1) : this.posAtEnd\n }\n }\n // Otherwise, use various heuristics, falling back on the bias\n // parameter, to determine whether to return the position at the\n // start or at the end of this view desc.\n var atEnd;\n if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n } else if (this.dom.firstChild) {\n if (offset == 0) { for (var search = dom;; search = search.parentNode) {\n if (search == this.dom) { atEnd = false; break }\n if (search.parentNode.firstChild != search) { break }\n } }\n if (atEnd == null && offset == dom.childNodes.length) { for (var search$1 = dom;; search$1 = search$1.parentNode) {\n if (search$1 == this.dom) { atEnd = true; break }\n if (search$1.parentNode.lastChild != search$1) { break }\n } }\n }\n return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart\n};\n\n// Scan up the dom finding the first desc that is a descendant of\n// this one.\nViewDesc.prototype.nearestDesc = function nearestDesc (dom, onlyNodes) {\n for (var first = true, cur = dom; cur; cur = cur.parentNode) {\n var desc = this.getDesc(cur);\n if (desc && (!onlyNodes || desc.node)) {\n // If dom is outside of this desc's nodeDOM, don't count it.\n if (first && desc.nodeDOM &&\n !(desc.nodeDOM.nodeType == 1 ? desc.nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : desc.nodeDOM == dom))\n { first = false; }\n else\n { return desc }\n }\n }\n};\n\nViewDesc.prototype.getDesc = function getDesc (dom) {\n var desc = dom.pmViewDesc;\n for (var cur = desc; cur; cur = cur.parent) { if (cur == this) { return desc } }\n};\n\nViewDesc.prototype.posFromDOM = function posFromDOM (dom, offset, bias) {\n for (var scan = dom; scan; scan = scan.parentNode) {\n var desc = this.getDesc(scan);\n if (desc) { return desc.localPosFromDOM(dom, offset, bias) }\n }\n return -1\n};\n\n// : (number) → ?NodeViewDesc\n// Find the desc for the node after the given pos, if any. (When a\n// parent node overrode rendering, there might not be one.)\nViewDesc.prototype.descAt = function descAt (pos) {\n for (var i = 0, offset = 0; i < this.children.length; i++) {\n var child = this.children[i], end = offset + child.size;\n if (offset == pos && end != offset) {\n while (!child.border && child.children.length) { child = child.children[0]; }\n return child\n }\n if (pos < end) { return child.descAt(pos - offset - child.border) }\n offset = end;\n }\n};\n\n// : (number, number) → {node: dom.Node, offset: number}\nViewDesc.prototype.domFromPos = function domFromPos (pos, side) {\n if (!this.contentDOM) { return {node: this.dom, offset: 0} }\n for (var offset = 0, i = 0, first = true;; i++, first = false) {\n // Skip removed or always-before children\n while (i < this.children.length && (this.children[i].beforePosition ||\n this.children[i].dom.parentNode != this.contentDOM))\n { offset += this.children[i++].size; }\n var child = i == this.children.length ? null : this.children[i];\n if (offset == pos && (side == 0 || !child || !child.size || child.border || (side < 0 && first)) ||\n child && child.domAtom && pos < offset + child.size) { return {\n node: this.contentDOM,\n offset: child ? domIndex(child.dom) : this.contentDOM.childNodes.length\n } }\n if (!child) { throw new Error(\"Invalid position \" + pos) }\n var end = offset + child.size;\n if (!child.domAtom && (side < 0 && !child.border ? end >= pos : end > pos))\n { return child.domFromPos(pos - offset - child.border, side) }\n offset = end;\n }\n};\n\n// Used to find a DOM range in a single parent for a given changed\n// range.\nViewDesc.prototype.parseRange = function parseRange (from, to, base) {\n if ( base === void 0 ) base = 0;\n\n if (this.children.length == 0)\n { return {node: this.contentDOM, from: from, to: to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length} }\n\n var fromOffset = -1, toOffset = -1;\n for (var offset = base, i = 0;; i++) {\n var child = this.children[i], end = offset + child.size;\n if (fromOffset == -1 && from <= end) {\n var childBase = offset + child.border;\n // FIXME maybe descend mark views to parse a narrower range?\n if (from >= childBase && to <= end - child.border && child.node &&\n child.contentDOM && this.contentDOM.contains(child.contentDOM))\n { return child.parseRange(from, to, childBase) }\n\n from = offset;\n for (var j = i; j > 0; j--) {\n var prev = this.children[j - 1];\n if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n fromOffset = domIndex(prev.dom) + 1;\n break\n }\n from -= prev.size;\n }\n if (fromOffset == -1) { fromOffset = 0; }\n }\n if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n to = end;\n for (var j$1 = i + 1; j$1 < this.children.length; j$1++) {\n var next = this.children[j$1];\n if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n toOffset = domIndex(next.dom);\n break\n }\n to += next.size;\n }\n if (toOffset == -1) { toOffset = this.contentDOM.childNodes.length; }\n break\n }\n offset = end;\n }\n return {node: this.contentDOM, from: from, to: to, fromOffset: fromOffset, toOffset: toOffset}\n};\n\nViewDesc.prototype.emptyChildAt = function emptyChildAt (side) {\n if (this.border || !this.contentDOM || !this.children.length) { return false }\n var child = this.children[side < 0 ? 0 : this.children.length - 1];\n return child.size == 0 || child.emptyChildAt(side)\n};\n\n// : (number) → dom.Node\nViewDesc.prototype.domAfterPos = function domAfterPos (pos) {\n var ref = this.domFromPos(pos, 0);\n var node = ref.node;\n var offset = ref.offset;\n if (node.nodeType != 1 || offset == node.childNodes.length)\n { throw new RangeError(\"No node after pos \" + pos) }\n return node.childNodes[offset]\n};\n\n// : (number, number, dom.Document)\n// View descs are responsible for setting any selection that falls\n// entirely inside of them, so that custom implementations can do\n// custom things with the selection. Note that this falls apart when\n// a selection starts in such a node and ends in another, in which\n// case we just use whatever domFromPos produces as a best effort.\nViewDesc.prototype.setSelection = function setSelection (anchor, head, root, force) {\n // If the selection falls entirely in a child, give it to that child\n var from = Math.min(anchor, head), to = Math.max(anchor, head);\n for (var i = 0, offset = 0; i < this.children.length; i++) {\n var child = this.children[i], end = offset + child.size;\n if (from > offset && to < end)\n { return child.setSelection(anchor - offset - child.border, head - offset - child.border, root, force) }\n offset = end;\n }\n\n var anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n var headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n var domSel = root.getSelection();\n\n var brKludge = false;\n // On Firefox, using Selection.collapse to put the cursor after a\n // BR node for some reason doesn't always work (#1073). On Safari,\n // the cursor sometimes inexplicable visually lags behind its\n // reported position in such situations (#1092).\n if ((result.gecko || result.safari) && anchor == head) {\n var node = anchorDOM.node;\n var offset$1 = anchorDOM.offset;\n if (node.nodeType == 3) {\n brKludge = offset$1 && node.nodeValue[offset$1 - 1] == \"\\n\";\n // Issue #1128\n if (brKludge && offset$1 == node.nodeValue.length &&\n node.nextSibling && node.nextSibling.nodeName == \"BR\")\n { anchorDOM = headDOM = {node: node.parentNode, offset: domIndex(node) + 1}; }\n } else {\n var prev = node.childNodes[offset$1 - 1];\n brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n }\n }\n\n if (!(force || brKludge && result.safari) &&\n isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) &&\n isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset))\n { return }\n\n // Selection.extend can be used to create an 'inverted' selection\n // (one where the focus is before the anchor), but not all\n // browsers support it yet.\n var domSelExtended = false;\n if ((domSel.extend || anchor == head) && !brKludge) {\n domSel.collapse(anchorDOM.node, anchorDOM.offset);\n try {\n if (anchor != head) { domSel.extend(headDOM.node, headDOM.offset); }\n domSelExtended = true;\n } catch (err) {\n // In some cases with Chrome the selection is empty after calling\n // collapse, even when it should be valid. This appears to be a bug, but\n // it is difficult to isolate. If this happens fallback to the old path\n // without using extend.\n if (!(err instanceof DOMException)) { throw err }\n // declare global: DOMException\n }\n }\n if (!domSelExtended) {\n if (anchor > head) { var tmp = anchorDOM; anchorDOM = headDOM; headDOM = tmp; }\n var range = document.createRange();\n range.setEnd(headDOM.node, headDOM.offset);\n range.setStart(anchorDOM.node, anchorDOM.offset);\n domSel.removeAllRanges();\n domSel.addRange(range);\n }\n};\n\n// : (dom.MutationRecord) → bool\nViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return !this.contentDOM && mutation.type != \"selection\"\n};\n\nprototypeAccessors.contentLost.get = function () {\n return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM)\n};\n\n// Remove a subtree of the element tree that has been touched\n// by a DOM change, so that the next update will redraw it.\nViewDesc.prototype.markDirty = function markDirty (from, to) {\n for (var offset = 0, i = 0; i < this.children.length; i++) {\n var child = this.children[i], end = offset + child.size;\n if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n var startInside = offset + child.border, endInside = end - child.border;\n if (from >= startInside && to <= endInside) {\n this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n if (from == startInside && to == endInside &&\n (child.contentLost || child.dom.parentNode != this.contentDOM)) { child.dirty = NODE_DIRTY; }\n else { child.markDirty(from - startInside, to - startInside); }\n return\n } else {\n child.dirty = NODE_DIRTY;\n }\n }\n offset = end;\n }\n this.dirty = CONTENT_DIRTY;\n};\n\nViewDesc.prototype.markParentsDirty = function markParentsDirty () {\n var level = 1;\n for (var node = this.parent; node; node = node.parent, level++) {\n var dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n if (node.dirty < dirty) { node.dirty = dirty; }\n }\n};\n\nprototypeAccessors.domAtom.get = function () { return false };\n\nObject.defineProperties( ViewDesc.prototype, prototypeAccessors );\n\n// Reused array to avoid allocating fresh arrays for things that will\n// stay empty anyway.\nvar nothing = [];\n\n// A widget desc represents a widget decoration, which is a DOM node\n// drawn between the document nodes.\nvar WidgetViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function WidgetViewDesc(parent, widget, view, pos) {\n var self, dom = widget.type.toDOM;\n if (typeof dom == \"function\") { dom = dom(view, function () {\n if (!self) { return pos }\n if (self.parent) { return self.parent.posBeforeChild(self) }\n }); }\n if (!widget.type.spec.raw) {\n if (dom.nodeType != 1) {\n var wrap = document.createElement(\"span\");\n wrap.appendChild(dom);\n dom = wrap;\n }\n dom.contentEditable = false;\n dom.classList.add(\"ProseMirror-widget\");\n }\n ViewDesc.call(this, parent, nothing, dom, null);\n this.widget = widget;\n self = this;\n }\n\n if ( ViewDesc ) WidgetViewDesc.__proto__ = ViewDesc;\n WidgetViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n WidgetViewDesc.prototype.constructor = WidgetViewDesc;\n\n var prototypeAccessors$1 = { beforePosition: { configurable: true },domAtom: { configurable: true } };\n\n prototypeAccessors$1.beforePosition.get = function () {\n return this.widget.type.side < 0\n };\n\n WidgetViewDesc.prototype.matchesWidget = function matchesWidget (widget) {\n return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type)\n };\n\n WidgetViewDesc.prototype.parseRule = function parseRule () { return {ignore: true} };\n\n WidgetViewDesc.prototype.stopEvent = function stopEvent (event) {\n var stop = this.widget.spec.stopEvent;\n return stop ? stop(event) : false\n };\n\n WidgetViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return mutation.type != \"selection\" || this.widget.spec.ignoreSelection\n };\n\n prototypeAccessors$1.domAtom.get = function () { return true };\n\n Object.defineProperties( WidgetViewDesc.prototype, prototypeAccessors$1 );\n\n return WidgetViewDesc;\n}(ViewDesc));\n\nvar CompositionViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function CompositionViewDesc(parent, dom, textDOM, text) {\n ViewDesc.call(this, parent, nothing, dom, null);\n this.textDOM = textDOM;\n this.text = text;\n }\n\n if ( ViewDesc ) CompositionViewDesc.__proto__ = ViewDesc;\n CompositionViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n CompositionViewDesc.prototype.constructor = CompositionViewDesc;\n\n var prototypeAccessors$2 = { size: { configurable: true } };\n\n prototypeAccessors$2.size.get = function () { return this.text.length };\n\n CompositionViewDesc.prototype.localPosFromDOM = function localPosFromDOM (dom, offset) {\n if (dom != this.textDOM) { return this.posAtStart + (offset ? this.size : 0) }\n return this.posAtStart + offset\n };\n\n CompositionViewDesc.prototype.domFromPos = function domFromPos (pos) {\n return {node: this.textDOM, offset: pos}\n };\n\n CompositionViewDesc.prototype.ignoreMutation = function ignoreMutation (mut) {\n return mut.type === 'characterData' && mut.target.nodeValue == mut.oldValue\n };\n\n Object.defineProperties( CompositionViewDesc.prototype, prototypeAccessors$2 );\n\n return CompositionViewDesc;\n}(ViewDesc));\n\n// A mark desc represents a mark. May have multiple children,\n// depending on how the mark is split. Note that marks are drawn using\n// a fixed nesting order, for simplicity and predictability, so in\n// some cases they will be split more often than would appear\n// necessary.\nvar MarkViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function MarkViewDesc(parent, mark, dom, contentDOM) {\n ViewDesc.call(this, parent, [], dom, contentDOM);\n this.mark = mark;\n }\n\n if ( ViewDesc ) MarkViewDesc.__proto__ = ViewDesc;\n MarkViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n MarkViewDesc.prototype.constructor = MarkViewDesc;\n\n MarkViewDesc.create = function create (parent, mark, inline, view) {\n var custom = view.nodeViews[mark.type.name];\n var spec = custom && custom(mark, view, inline);\n if (!spec || !spec.dom)\n { spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline)); }\n return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom)\n };\n\n MarkViewDesc.prototype.parseRule = function parseRule () { return {mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM} };\n\n MarkViewDesc.prototype.matchesMark = function matchesMark (mark) { return this.dirty != NODE_DIRTY && this.mark.eq(mark) };\n\n MarkViewDesc.prototype.markDirty = function markDirty (from, to) {\n ViewDesc.prototype.markDirty.call(this, from, to);\n // Move dirty info to nearest node view\n if (this.dirty != NOT_DIRTY) {\n var parent = this.parent;\n while (!parent.node) { parent = parent.parent; }\n if (parent.dirty < this.dirty) { parent.dirty = this.dirty; }\n this.dirty = NOT_DIRTY;\n }\n };\n\n MarkViewDesc.prototype.slice = function slice (from, to, view) {\n var copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n var nodes = this.children, size = this.size;\n if (to < size) { nodes = replaceNodes(nodes, to, size, view); }\n if (from > 0) { nodes = replaceNodes(nodes, 0, from, view); }\n for (var i = 0; i < nodes.length; i++) { nodes[i].parent = copy; }\n copy.children = nodes;\n return copy\n };\n\n return MarkViewDesc;\n}(ViewDesc));\n\n// Node view descs are the main, most common type of view desc, and\n// correspond to an actual node in the document. Unlike mark descs,\n// they populate their child array themselves.\nvar NodeViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) {\n ViewDesc.call(this, parent, node.isLeaf ? nothing : [], dom, contentDOM);\n this.nodeDOM = nodeDOM;\n this.node = node;\n this.outerDeco = outerDeco;\n this.innerDeco = innerDeco;\n if (contentDOM) { this.updateChildren(view, pos); }\n }\n\n if ( ViewDesc ) NodeViewDesc.__proto__ = ViewDesc;\n NodeViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n NodeViewDesc.prototype.constructor = NodeViewDesc;\n\n var prototypeAccessors$3 = { size: { configurable: true },border: { configurable: true },domAtom: { configurable: true } };\n\n // By default, a node is rendered using the `toDOM` method from the\n // node type spec. But client code can use the `nodeViews` spec to\n // supply a custom node view, which can influence various aspects of\n // the way the node works.\n //\n // (Using subclassing for this was intentionally decided against,\n // since it'd require exposing a whole slew of finnicky\n // implementation details to the user code that they probably will\n // never need.)\n NodeViewDesc.create = function create (parent, node, outerDeco, innerDeco, view, pos) {\n var assign;\n\n var custom = view.nodeViews[node.type.name], descObj;\n var spec = custom && custom(node, view, function () {\n // (This is a function that allows the custom view to find its\n // own position)\n if (!descObj) { return pos }\n if (descObj.parent) { return descObj.parent.posBeforeChild(descObj) }\n }, outerDeco);\n\n var dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n if (node.isText) {\n if (!dom) { dom = document.createTextNode(node.text); }\n else if (dom.nodeType != 3) { throw new RangeError(\"Text must be rendered as a DOM text node\") }\n } else if (!dom) {\n((assign = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node)), dom = assign.dom, contentDOM = assign.contentDOM));\n }\n if (!contentDOM && !node.isText && dom.nodeName != \"BR\") { // Chrome gets confused by
      \n if (!dom.hasAttribute(\"contenteditable\")) { dom.contentEditable = false; }\n if (node.type.spec.draggable) { dom.draggable = true; }\n }\n\n var nodeDOM = dom;\n dom = applyOuterDeco(dom, outerDeco, node);\n\n if (spec)\n { return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM,\n spec, view, pos + 1) }\n else if (node.isText)\n { return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) }\n else\n { return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos + 1) }\n };\n\n NodeViewDesc.prototype.parseRule = function parseRule () {\n var this$1 = this;\n\n // Experimental kludge to allow opt-in re-parsing of nodes\n if (this.node.type.spec.reparseInView) { return null }\n // FIXME the assumption that this can always return the current\n // attrs means that if the user somehow manages to change the\n // attrs in the dom, that won't be picked up. Not entirely sure\n // whether this is a problem\n var rule = {node: this.node.type.name, attrs: this.node.attrs};\n if (this.node.type.spec.code) { rule.preserveWhitespace = \"full\"; }\n if (this.contentDOM && !this.contentLost) { rule.contentElement = this.contentDOM; }\n else { rule.getContent = function () { return this$1.contentDOM ? Fragment.empty : this$1.node.content; }; }\n return rule\n };\n\n NodeViewDesc.prototype.matchesNode = function matchesNode (node, outerDeco, innerDeco) {\n return this.dirty == NOT_DIRTY && node.eq(this.node) &&\n sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco)\n };\n\n prototypeAccessors$3.size.get = function () { return this.node.nodeSize };\n\n prototypeAccessors$3.border.get = function () { return this.node.isLeaf ? 0 : 1 };\n\n // Syncs `this.children` to match `this.node.content` and the local\n // decorations, possibly introducing nesting for marks. Then, in a\n // separate step, syncs the DOM inside `this.contentDOM` to\n // `this.children`.\n NodeViewDesc.prototype.updateChildren = function updateChildren (view, pos) {\n var this$1 = this;\n\n var inline = this.node.inlineContent, off = pos;\n var composition = inline && view.composing && this.localCompositionNode(view, pos);\n var updater = new ViewTreeUpdater(this, composition && composition.node);\n iterDeco(this.node, this.innerDeco, function (widget, i, insideNode) {\n if (widget.spec.marks)\n { updater.syncToMarks(widget.spec.marks, inline, view); }\n else if (widget.type.side >= 0 && !insideNode)\n { updater.syncToMarks(i == this$1.node.childCount ? Mark.none : this$1.node.child(i).marks, inline, view); }\n // If the next node is a desc matching this widget, reuse it,\n // otherwise insert the widget as a new view desc.\n updater.placeWidget(widget, view, off);\n }, function (child, outerDeco, innerDeco, i) {\n // Make sure the wrapping mark descs match the node's marks.\n updater.syncToMarks(child.marks, inline, view);\n // Either find an existing desc that exactly matches this node,\n // and drop the descs before it.\n updater.findNodeMatch(child, outerDeco, innerDeco, i) ||\n // Or try updating the next desc to reflect this node.\n updater.updateNextNode(child, outerDeco, innerDeco, view, i) ||\n // Or just add it as a new desc.\n updater.addNode(child, outerDeco, innerDeco, view, off);\n off += child.nodeSize;\n });\n // Drop all remaining descs after the current position.\n updater.syncToMarks(nothing, inline, view);\n if (this.node.isTextblock) { updater.addTextblockHacks(); }\n updater.destroyRest();\n\n // Sync the DOM if anything changed\n if (updater.changed || this.dirty == CONTENT_DIRTY) {\n // May have to protect focused DOM from being changed if a composition is active\n if (composition) { this.protectLocalComposition(view, composition); }\n renderDescs(this.contentDOM, this.children, view);\n if (result.ios) { iosHacks(this.dom); }\n }\n };\n\n NodeViewDesc.prototype.localCompositionNode = function localCompositionNode (view, pos) {\n // Only do something if both the selection and a focused text node\n // are inside of this node, and the node isn't already part of a\n // view that's a child of this view\n var ref = view.state.selection;\n var from = ref.from;\n var to = ref.to;\n if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size) { return }\n var sel = view.root.getSelection();\n var textNode = nearbyTextNode(sel.focusNode, sel.focusOffset);\n if (!textNode || !this.dom.contains(textNode.parentNode)) { return }\n\n // Find the text in the focused node in the node, stop if it's not\n // there (may have been modified through other means, in which\n // case it should overwritten)\n var text = textNode.nodeValue;\n var textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n\n return textPos < 0 ? null : {node: textNode, pos: textPos, text: text}\n };\n\n NodeViewDesc.prototype.protectLocalComposition = function protectLocalComposition (view, ref) {\n var node = ref.node;\n var pos = ref.pos;\n var text = ref.text;\n\n // The node is already part of a local view desc, leave it there\n if (this.getDesc(node)) { return }\n\n // Create a composition view for the orphaned nodes\n var topNode = node;\n for (;; topNode = topNode.parentNode) {\n if (topNode.parentNode == this.contentDOM) { break }\n while (topNode.previousSibling) { topNode.parentNode.removeChild(topNode.previousSibling); }\n while (topNode.nextSibling) { topNode.parentNode.removeChild(topNode.nextSibling); }\n if (topNode.pmViewDesc) { topNode.pmViewDesc = null; }\n }\n var desc = new CompositionViewDesc(this, topNode, node, text);\n view.compositionNodes.push(desc);\n\n // Patch up this.children to contain the composition view\n this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n };\n\n // : (Node, [Decoration], DecorationSet, EditorView) → bool\n // If this desc be updated to match the given node decoration,\n // do so and return true.\n NodeViewDesc.prototype.update = function update (node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY ||\n !node.sameMarkup(this.node)) { return false }\n this.updateInner(node, outerDeco, innerDeco, view);\n return true\n };\n\n NodeViewDesc.prototype.updateInner = function updateInner (node, outerDeco, innerDeco, view) {\n this.updateOuterDeco(outerDeco);\n this.node = node;\n this.innerDeco = innerDeco;\n if (this.contentDOM) { this.updateChildren(view, this.posAtStart); }\n this.dirty = NOT_DIRTY;\n };\n\n NodeViewDesc.prototype.updateOuterDeco = function updateOuterDeco (outerDeco) {\n if (sameOuterDeco(outerDeco, this.outerDeco)) { return }\n var needsWrap = this.nodeDOM.nodeType != 1;\n var oldDOM = this.dom;\n this.dom = patchOuterDeco(this.dom, this.nodeDOM,\n computeOuterDeco(this.outerDeco, this.node, needsWrap),\n computeOuterDeco(outerDeco, this.node, needsWrap));\n if (this.dom != oldDOM) {\n oldDOM.pmViewDesc = null;\n this.dom.pmViewDesc = this;\n }\n this.outerDeco = outerDeco;\n };\n\n // Mark this node as being the selected node.\n NodeViewDesc.prototype.selectNode = function selectNode () {\n this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable) { this.dom.draggable = true; }\n };\n\n // Remove selected node marking from this node.\n NodeViewDesc.prototype.deselectNode = function deselectNode () {\n this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable) { this.dom.removeAttribute(\"draggable\"); }\n };\n\n prototypeAccessors$3.domAtom.get = function () { return this.node.isAtom };\n\n Object.defineProperties( NodeViewDesc.prototype, prototypeAccessors$3 );\n\n return NodeViewDesc;\n}(ViewDesc));\n\n// Create a view desc for the top-level document node, to be exported\n// and used by the view class.\nfunction docViewDesc(doc, outerDeco, innerDeco, dom, view) {\n applyOuterDeco(dom, outerDeco, doc);\n return new NodeViewDesc(null, doc, outerDeco, innerDeco, dom, dom, dom, view, 0)\n}\n\nvar TextViewDesc = /*@__PURE__*/(function (NodeViewDesc) {\n function TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) {\n NodeViewDesc.call(this, parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view);\n }\n\n if ( NodeViewDesc ) TextViewDesc.__proto__ = NodeViewDesc;\n TextViewDesc.prototype = Object.create( NodeViewDesc && NodeViewDesc.prototype );\n TextViewDesc.prototype.constructor = TextViewDesc;\n\n var prototypeAccessors$4 = { domAtom: { configurable: true } };\n\n TextViewDesc.prototype.parseRule = function parseRule () {\n var skip = this.nodeDOM.parentNode;\n while (skip && skip != this.dom && !skip.pmIsDeco) { skip = skip.parentNode; }\n return {skip: skip || true}\n };\n\n TextViewDesc.prototype.update = function update (node, outerDeco, _, view) {\n if (this.dirty == NODE_DIRTY || (this.dirty != NOT_DIRTY && !this.inParent()) ||\n !node.sameMarkup(this.node)) { return false }\n this.updateOuterDeco(outerDeco);\n if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n this.nodeDOM.nodeValue = node.text;\n if (view.trackWrites == this.nodeDOM) { view.trackWrites = null; }\n }\n this.node = node;\n this.dirty = NOT_DIRTY;\n return true\n };\n\n TextViewDesc.prototype.inParent = function inParent () {\n var parentDOM = this.parent.contentDOM;\n for (var n = this.nodeDOM; n; n = n.parentNode) { if (n == parentDOM) { return true } }\n return false\n };\n\n TextViewDesc.prototype.domFromPos = function domFromPos (pos) {\n return {node: this.nodeDOM, offset: pos}\n };\n\n TextViewDesc.prototype.localPosFromDOM = function localPosFromDOM (dom, offset, bias) {\n if (dom == this.nodeDOM) { return this.posAtStart + Math.min(offset, this.node.text.length) }\n return NodeViewDesc.prototype.localPosFromDOM.call(this, dom, offset, bias)\n };\n\n TextViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return mutation.type != \"characterData\" && mutation.type != \"selection\"\n };\n\n TextViewDesc.prototype.slice = function slice (from, to, view) {\n var node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view)\n };\n\n prototypeAccessors$4.domAtom.get = function () { return false };\n\n Object.defineProperties( TextViewDesc.prototype, prototypeAccessors$4 );\n\n return TextViewDesc;\n}(NodeViewDesc));\n\n// A dummy desc used to tag trailing BR or span nodes created to work\n// around contentEditable terribleness.\nvar BRHackViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function BRHackViewDesc () {\n ViewDesc.apply(this, arguments);\n }\n\n if ( ViewDesc ) BRHackViewDesc.__proto__ = ViewDesc;\n BRHackViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n BRHackViewDesc.prototype.constructor = BRHackViewDesc;\n\n var prototypeAccessors$5 = { domAtom: { configurable: true } };\n\n BRHackViewDesc.prototype.parseRule = function parseRule () { return {ignore: true} };\n BRHackViewDesc.prototype.matchesHack = function matchesHack () { return this.dirty == NOT_DIRTY };\n prototypeAccessors$5.domAtom.get = function () { return true };\n\n Object.defineProperties( BRHackViewDesc.prototype, prototypeAccessors$5 );\n\n return BRHackViewDesc;\n}(ViewDesc));\n\n// A separate subclass is used for customized node views, so that the\n// extra checks only have to be made for nodes that are actually\n// customized.\nvar CustomNodeViewDesc = /*@__PURE__*/(function (NodeViewDesc) {\n function CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) {\n NodeViewDesc.call(this, parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos);\n this.spec = spec;\n }\n\n if ( NodeViewDesc ) CustomNodeViewDesc.__proto__ = NodeViewDesc;\n CustomNodeViewDesc.prototype = Object.create( NodeViewDesc && NodeViewDesc.prototype );\n CustomNodeViewDesc.prototype.constructor = CustomNodeViewDesc;\n\n // A custom `update` method gets to decide whether the update goes\n // through. If it does, and there's a `contentDOM` node, our logic\n // updates the children.\n CustomNodeViewDesc.prototype.update = function update (node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY) { return false }\n if (this.spec.update) {\n var result = this.spec.update(node, outerDeco);\n if (result) { this.updateInner(node, outerDeco, innerDeco, view); }\n return result\n } else if (!this.contentDOM && !node.isLeaf) {\n return false\n } else {\n return NodeViewDesc.prototype.update.call(this, node, outerDeco, innerDeco, view)\n }\n };\n\n CustomNodeViewDesc.prototype.selectNode = function selectNode () {\n this.spec.selectNode ? this.spec.selectNode() : NodeViewDesc.prototype.selectNode.call(this);\n };\n\n CustomNodeViewDesc.prototype.deselectNode = function deselectNode () {\n this.spec.deselectNode ? this.spec.deselectNode() : NodeViewDesc.prototype.deselectNode.call(this);\n };\n\n CustomNodeViewDesc.prototype.setSelection = function setSelection (anchor, head, root, force) {\n this.spec.setSelection ? this.spec.setSelection(anchor, head, root)\n : NodeViewDesc.prototype.setSelection.call(this, anchor, head, root, force);\n };\n\n CustomNodeViewDesc.prototype.destroy = function destroy () {\n if (this.spec.destroy) { this.spec.destroy(); }\n NodeViewDesc.prototype.destroy.call(this);\n };\n\n CustomNodeViewDesc.prototype.stopEvent = function stopEvent (event) {\n return this.spec.stopEvent ? this.spec.stopEvent(event) : false\n };\n\n CustomNodeViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : NodeViewDesc.prototype.ignoreMutation.call(this, mutation)\n };\n\n return CustomNodeViewDesc;\n}(NodeViewDesc));\n\n// : (dom.Node, [ViewDesc])\n// Sync the content of the given DOM node with the nodes associated\n// with the given array of view descs, recursing into mark descs\n// because this should sync the subtree for a whole node at a time.\nfunction renderDescs(parentDOM, descs, view) {\n var dom = parentDOM.firstChild, written = false;\n for (var i = 0; i < descs.length; i++) {\n var desc = descs[i], childDOM = desc.dom;\n if (childDOM.parentNode == parentDOM) {\n while (childDOM != dom) { dom = rm(dom); written = true; }\n dom = dom.nextSibling;\n } else {\n written = true;\n parentDOM.insertBefore(childDOM, dom);\n }\n if (desc instanceof MarkViewDesc) {\n var pos = dom ? dom.previousSibling : parentDOM.lastChild;\n renderDescs(desc.contentDOM, desc.children, view);\n dom = pos ? pos.nextSibling : parentDOM.firstChild;\n }\n }\n while (dom) { dom = rm(dom); written = true; }\n if (written && view.trackWrites == parentDOM) { view.trackWrites = null; }\n}\n\nfunction OuterDecoLevel(nodeName) {\n if (nodeName) { this.nodeName = nodeName; }\n}\nOuterDecoLevel.prototype = Object.create(null);\n\nvar noDeco = [new OuterDecoLevel];\n\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n if (outerDeco.length == 0) { return noDeco }\n\n var top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top];\n\n for (var i = 0; i < outerDeco.length; i++) {\n var attrs = outerDeco[i].type.attrs;\n if (!attrs) { continue }\n if (attrs.nodeName)\n { result.push(top = new OuterDecoLevel(attrs.nodeName)); }\n\n for (var name in attrs) {\n var val = attrs[name];\n if (val == null) { continue }\n if (needsWrap && result.length == 1)\n { result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\")); }\n if (name == \"class\") { top.class = (top.class ? top.class + \" \" : \"\") + val; }\n else if (name == \"style\") { top.style = (top.style ? top.style + \";\" : \"\") + val; }\n else if (name != \"nodeName\") { top[name] = val; }\n }\n }\n\n return result\n}\n\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n // Shortcut for trivial case\n if (prevComputed == noDeco && curComputed == noDeco) { return nodeDOM }\n\n var curDOM = nodeDOM;\n for (var i = 0; i < curComputed.length; i++) {\n var deco = curComputed[i], prev = prevComputed[i];\n if (i) {\n var parent = (void 0);\n if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM &&\n (parent = curDOM.parentNode) && parent.tagName.toLowerCase() == deco.nodeName) {\n curDOM = parent;\n } else {\n parent = document.createElement(deco.nodeName);\n parent.pmIsDeco = true;\n parent.appendChild(curDOM);\n prev = noDeco[0];\n curDOM = parent;\n }\n }\n patchAttributes(curDOM, prev || noDeco[0], deco);\n }\n return curDOM\n}\n\nfunction patchAttributes(dom, prev, cur) {\n for (var name in prev)\n { if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n { dom.removeAttribute(name); } }\n for (var name$1 in cur)\n { if (name$1 != \"class\" && name$1 != \"style\" && name$1 != \"nodeName\" && cur[name$1] != prev[name$1])\n { dom.setAttribute(name$1, cur[name$1]); } }\n if (prev.class != cur.class) {\n var prevList = prev.class ? prev.class.split(\" \") : nothing;\n var curList = cur.class ? cur.class.split(\" \") : nothing;\n for (var i = 0; i < prevList.length; i++) { if (curList.indexOf(prevList[i]) == -1)\n { dom.classList.remove(prevList[i]); } }\n for (var i$1 = 0; i$1 < curList.length; i$1++) { if (prevList.indexOf(curList[i$1]) == -1)\n { dom.classList.add(curList[i$1]); } }\n }\n if (prev.style != cur.style) {\n if (prev.style) {\n var prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n while (m = prop.exec(prev.style))\n { dom.style.removeProperty(m[1]); }\n }\n if (cur.style)\n { dom.style.cssText += cur.style; }\n }\n}\n\nfunction applyOuterDeco(dom, deco, node) {\n return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1))\n}\n\n// : ([Decoration], [Decoration]) → bool\nfunction sameOuterDeco(a, b) {\n if (a.length != b.length) { return false }\n for (var i = 0; i < a.length; i++) { if (!a[i].type.eq(b[i].type)) { return false } }\n return true\n}\n\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n var next = dom.nextSibling;\n dom.parentNode.removeChild(dom);\n return next\n}\n\n// Helper class for incrementally updating a tree of mark descs and\n// the widget and node descs inside of them.\nvar ViewTreeUpdater = function ViewTreeUpdater(top, lockedNode) {\n this.top = top;\n this.lock = lockedNode;\n // Index into `this.top`'s child array, represents the current\n // update position.\n this.index = 0;\n // When entering a mark, the current top and index are pushed\n // onto this.\n this.stack = [];\n // Tracks whether anything was changed\n this.changed = false;\n\n var pre = preMatch(top.node.content, top.children);\n this.preMatched = pre.nodes;\n this.preMatchOffset = pre.offset;\n};\n\nViewTreeUpdater.prototype.getPreMatch = function getPreMatch (index) {\n return index >= this.preMatchOffset ? this.preMatched[index - this.preMatchOffset] : null\n};\n\n// Destroy and remove the children between the given indices in\n// `this.top`.\nViewTreeUpdater.prototype.destroyBetween = function destroyBetween (start, end) {\n if (start == end) { return }\n for (var i = start; i < end; i++) { this.top.children[i].destroy(); }\n this.top.children.splice(start, end - start);\n this.changed = true;\n};\n\n// Destroy all remaining children in `this.top`.\nViewTreeUpdater.prototype.destroyRest = function destroyRest () {\n this.destroyBetween(this.index, this.top.children.length);\n};\n\n// : ([Mark], EditorView)\n// Sync the current stack of mark descs with the given array of\n// marks, reusing existing mark descs when possible.\nViewTreeUpdater.prototype.syncToMarks = function syncToMarks (marks, inline, view) {\n var keep = 0, depth = this.stack.length >> 1;\n var maxKeep = Math.min(depth, marks.length);\n while (keep < maxKeep &&\n (keep == depth - 1 ? this.top : this.stack[(keep + 1) << 1]).matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n { keep++; }\n\n while (keep < depth) {\n this.destroyRest();\n this.top.dirty = NOT_DIRTY;\n this.index = this.stack.pop();\n this.top = this.stack.pop();\n depth--;\n }\n while (depth < marks.length) {\n this.stack.push(this.top, this.index + 1);\n var found = -1;\n for (var i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) {\n if (this.top.children[i].matchesMark(marks[depth])) { found = i; break }\n }\n if (found > -1) {\n if (found > this.index) {\n this.changed = true;\n this.destroyBetween(this.index, found);\n }\n this.top = this.top.children[this.index];\n } else {\n var markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n this.top.children.splice(this.index, 0, markDesc);\n this.top = markDesc;\n this.changed = true;\n }\n this.index = 0;\n depth++;\n }\n};\n\n// : (Node, [Decoration], DecorationSet) → bool\n// Try to find a node desc matching the given data. Skip over it and\n// return true when successful.\nViewTreeUpdater.prototype.findNodeMatch = function findNodeMatch (node, outerDeco, innerDeco, index) {\n var found = -1, preMatch = index < 0 ? undefined : this.getPreMatch(index), children = this.top.children;\n if (preMatch && preMatch.matchesNode(node, outerDeco, innerDeco)) {\n found = children.indexOf(preMatch);\n } else {\n for (var i = this.index, e = Math.min(children.length, i + 5); i < e; i++) {\n var child = children[i];\n if (child.matchesNode(node, outerDeco, innerDeco) && this.preMatched.indexOf(child) < 0) {\n found = i;\n break\n }\n }\n }\n if (found < 0) { return false }\n this.destroyBetween(this.index, found);\n this.index++;\n return true\n};\n\n// : (Node, [Decoration], DecorationSet, EditorView, Fragment, number) → bool\n// Try to update the next node, if any, to the given data. Checks\n// pre-matches to avoid overwriting nodes that could still be used.\nViewTreeUpdater.prototype.updateNextNode = function updateNextNode (node, outerDeco, innerDeco, view, index) {\n for (var i = this.index; i < this.top.children.length; i++) {\n var next = this.top.children[i];\n if (next instanceof NodeViewDesc) {\n var preMatch = this.preMatched.indexOf(next);\n if (preMatch > -1 && preMatch + this.preMatchOffset != index) { return false }\n var nextDOM = next.dom;\n\n // Can't update if nextDOM is or contains this.lock, except if\n // it's a text node whose content already matches the new text\n // and whose decorations match the new ones.\n var locked = this.lock && (nextDOM == this.lock || nextDOM.nodeType == 1 && nextDOM.contains(this.lock.parentNode)) &&\n !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text &&\n next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n this.destroyBetween(this.index, i);\n if (next.dom != nextDOM) { this.changed = true; }\n this.index++;\n return true\n }\n break\n }\n }\n return false\n};\n\n// : (Node, [Decoration], DecorationSet, EditorView)\n// Insert the node as a newly created node desc.\nViewTreeUpdater.prototype.addNode = function addNode (node, outerDeco, innerDeco, view, pos) {\n this.top.children.splice(this.index++, 0, NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos));\n this.changed = true;\n};\n\nViewTreeUpdater.prototype.placeWidget = function placeWidget (widget, view, pos) {\n var next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n if (next && next.matchesWidget(widget) && (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n this.index++;\n } else {\n var desc = new WidgetViewDesc(this.top, widget, view, pos);\n this.top.children.splice(this.index++, 0, desc);\n this.changed = true;\n }\n};\n\n// Make sure a textblock looks and behaves correctly in\n// contentEditable.\nViewTreeUpdater.prototype.addTextblockHacks = function addTextblockHacks () {\n var lastChild = this.top.children[this.index - 1];\n while (lastChild instanceof MarkViewDesc) { lastChild = lastChild.children[lastChild.children.length - 1]; }\n\n if (!lastChild || // Empty textblock\n !(lastChild instanceof TextViewDesc) ||\n /\\n$/.test(lastChild.node.text)) {\n if (this.index < this.top.children.length && this.top.children[this.index].matchesHack()) {\n this.index++;\n } else {\n var dom = document.createElement(\"br\");\n this.top.children.splice(this.index++, 0, new BRHackViewDesc(this.top, nothing, dom, null));\n this.changed = true;\n }\n }\n};\n\n// : (Fragment, [ViewDesc]) → [ViewDesc]\n// Iterate from the end of the fragment and array of descs to find\n// directly matching ones, in order to avoid overeagerly reusing\n// those for other nodes. Returns an array whose positions correspond\n// to node positions in the fragment, and whose elements are either\n// descs matched to the child at that index, or empty.\nfunction preMatch(frag, descs) {\n var result = [], end = frag.childCount;\n for (var i = descs.length - 1; end > 0 && i >= 0; i--) {\n var desc = descs[i], node = desc.node;\n if (!node) { continue }\n if (node != frag.child(end - 1)) { break }\n result.push(desc);\n --end;\n }\n return {nodes: result.reverse(), offset: end}\n}\n\nfunction compareSide(a, b) { return a.type.side - b.type.side }\n\n// : (ViewDesc, DecorationSet, (Decoration, number), (Node, [Decoration], DecorationSet, number))\n// This function abstracts iterating over the nodes and decorations in\n// a fragment. Calls `onNode` for each node, with its local and child\n// decorations. Splits text nodes when there is a decoration starting\n// or ending inside of them. Calls `onWidget` for each widget.\nfunction iterDeco(parent, deco, onWidget, onNode) {\n var locals = deco.locals(parent), offset = 0;\n // Simple, cheap variant for when there are no local decorations\n if (locals.length == 0) {\n for (var i = 0; i < parent.childCount; i++) {\n var child = parent.child(i);\n onNode(child, locals, deco.forChild(offset, child), i);\n offset += child.nodeSize;\n }\n return\n }\n\n var decoIndex = 0, active = [], restNode = null;\n for (var parentIndex = 0;;) {\n if (decoIndex < locals.length && locals[decoIndex].to == offset) {\n var widget = locals[decoIndex++], widgets = (void 0);\n while (decoIndex < locals.length && locals[decoIndex].to == offset)\n { (widgets || (widgets = [widget])).push(locals[decoIndex++]); }\n if (widgets) {\n widgets.sort(compareSide);\n for (var i$1 = 0; i$1 < widgets.length; i$1++) { onWidget(widgets[i$1], parentIndex, !!restNode); }\n } else {\n onWidget(widget, parentIndex, !!restNode);\n }\n }\n\n var child$1 = (void 0), index = (void 0);\n if (restNode) {\n index = -1;\n child$1 = restNode;\n restNode = null;\n } else if (parentIndex < parent.childCount) {\n index = parentIndex;\n child$1 = parent.child(parentIndex++);\n } else {\n break\n }\n\n for (var i$2 = 0; i$2 < active.length; i$2++) { if (active[i$2].to <= offset) { active.splice(i$2--, 1); } }\n while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n { active.push(locals[decoIndex++]); }\n\n var end = offset + child$1.nodeSize;\n if (child$1.isText) {\n var cutAt = end;\n if (decoIndex < locals.length && locals[decoIndex].from < cutAt) { cutAt = locals[decoIndex].from; }\n for (var i$3 = 0; i$3 < active.length; i$3++) { if (active[i$3].to < cutAt) { cutAt = active[i$3].to; } }\n if (cutAt < end) {\n restNode = child$1.cut(cutAt - offset);\n child$1 = child$1.cut(0, cutAt - offset);\n end = cutAt;\n index = -1;\n }\n }\n\n var outerDeco = !active.length ? nothing\n : child$1.isInline && !child$1.isLeaf ? active.filter(function (d) { return !d.inline; })\n : active.slice();\n onNode(child$1, outerDeco, deco.forChild(offset, child$1), index);\n offset = end;\n }\n}\n\n// List markers in Mobile Safari will mysteriously disappear\n// sometimes. This works around that.\nfunction iosHacks(dom) {\n if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n var oldCSS = dom.style.cssText;\n dom.style.cssText = oldCSS + \"; list-style: square !important\";\n window.getComputedStyle(dom).listStyle;\n dom.style.cssText = oldCSS;\n }\n}\n\nfunction nearbyTextNode(node, offset) {\n for (;;) {\n if (node.nodeType == 3) { return node }\n if (node.nodeType == 1 && offset > 0) {\n if (node.childNodes.length > offset && node.childNodes[offset].nodeType == 3)\n { return node.childNodes[offset] }\n node = node.childNodes[offset - 1];\n offset = nodeSize(node);\n } else if (node.nodeType == 1 && offset < node.childNodes.length) {\n node = node.childNodes[offset];\n offset = 0;\n } else {\n return null\n }\n }\n}\n\n// Find a piece of text in an inline fragment, overlapping from-to\nfunction findTextInFragment(frag, text, from, to) {\n for (var i = 0, pos = 0; i < frag.childCount && pos <= to;) {\n var child = frag.child(i++), childStart = pos;\n pos += child.nodeSize;\n if (!child.isText) { continue }\n var str = child.text;\n while (i < frag.childCount) {\n var next = frag.child(i++);\n pos += next.nodeSize;\n if (!next.isText) { break }\n str += next.text;\n }\n if (pos >= from) {\n var found = str.lastIndexOf(text, to - childStart);\n if (found >= 0 && found + text.length + childStart >= from)\n { return childStart + found }\n }\n }\n return -1\n}\n\n// Replace range from-to in an array of view descs with replacement\n// (may be null to just delete). This goes very much against the grain\n// of the rest of this code, which tends to create nodes with the\n// right shape in one go, rather than messing with them after\n// creation, but is necessary in the composition hack.\nfunction replaceNodes(nodes, from, to, view, replacement) {\n var result = [];\n for (var i = 0, off = 0; i < nodes.length; i++) {\n var child = nodes[i], start = off, end = off += child.size;\n if (start >= to || end <= from) {\n result.push(child);\n } else {\n if (start < from) { result.push(child.slice(0, from - start, view)); }\n if (replacement) {\n result.push(replacement);\n replacement = null;\n }\n if (end > to) { result.push(child.slice(to - start, child.size, view)); }\n }\n }\n return result\n}\n\nfunction selectionFromDOM(view, origin) {\n var domSel = view.root.getSelection(), doc = view.state.doc;\n if (!domSel.focusNode) { return null }\n var nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n var head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset);\n if (head < 0) { return null }\n var $head = doc.resolve(head), $anchor, selection;\n if (selectionCollapsed(domSel)) {\n $anchor = $head;\n while (nearestDesc && !nearestDesc.node) { nearestDesc = nearestDesc.parent; }\n if (nearestDesc && nearestDesc.node.isAtom && NodeSelection.isSelectable(nearestDesc.node) && nearestDesc.parent\n && !(nearestDesc.node.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n var pos = nearestDesc.posBefore;\n selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));\n }\n } else {\n var anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset);\n if (anchor < 0) { return null }\n $anchor = doc.resolve(anchor);\n }\n\n if (!selection) {\n var bias = origin == \"pointer\" || (view.state.selection.head < $head.pos && !inWidget) ? 1 : -1;\n selection = selectionBetween(view, $anchor, $head, bias);\n }\n return selection\n}\n\nfunction selectionToDOM(view, force) {\n var sel = view.state.selection;\n syncNodeSelection(view, sel);\n\n if (view.editable ? !view.hasFocus() :\n !(hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom))) { return }\n\n view.domObserver.disconnectSelection();\n\n if (view.cursorWrapper) {\n selectCursorWrapper(view);\n } else {\n var anchor = sel.anchor;\n var head = sel.head;\n var resetEditableFrom, resetEditableTo;\n if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n if (!sel.$from.parent.inlineContent)\n { resetEditableFrom = temporarilyEditableNear(view, sel.from); }\n if (!sel.empty && !sel.$from.parent.inlineContent)\n { resetEditableTo = temporarilyEditableNear(view, sel.to); }\n }\n view.docView.setSelection(anchor, head, view.root, force);\n if (brokenSelectBetweenUneditable) {\n if (resetEditableFrom) { resetEditable(resetEditableFrom); }\n if (resetEditableTo) { resetEditable(resetEditableTo); }\n }\n if (sel.visible) {\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n } else {\n view.dom.classList.add(\"ProseMirror-hideselection\");\n if (\"onselectionchange\" in document) { removeClassOnSelectionChange(view); }\n }\n }\n\n view.domObserver.setCurSelection();\n view.domObserver.connectSelection();\n}\n\n// Kludge to work around Webkit not allowing a selection to start/end\n// between non-editable block nodes. We briefly make something\n// editable, set the selection, then set it uneditable again.\n\nvar brokenSelectBetweenUneditable = result.safari || result.chrome && result.chrome_version < 63;\n\nfunction temporarilyEditableNear(view, pos) {\n var ref = view.docView.domFromPos(pos, 0);\n var node = ref.node;\n var offset = ref.offset;\n var after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n var before = offset ? node.childNodes[offset - 1] : null;\n if (result.safari && after && after.contentEditable == \"false\") { return setEditable(after) }\n if ((!after || after.contentEditable == \"false\") && (!before || before.contentEditable == \"false\")) {\n if (after) { return setEditable(after) }\n else if (before) { return setEditable(before) }\n }\n}\n\nfunction setEditable(element) {\n element.contentEditable = \"true\";\n if (result.safari && element.draggable) { element.draggable = false; element.wasDraggable = true; }\n return element\n}\n\nfunction resetEditable(element) {\n element.contentEditable = \"false\";\n if (element.wasDraggable) { element.draggable = true; element.wasDraggable = null; }\n}\n\nfunction removeClassOnSelectionChange(view) {\n var doc = view.dom.ownerDocument;\n doc.removeEventListener(\"selectionchange\", view.hideSelectionGuard);\n var domSel = view.root.getSelection();\n var node = domSel.anchorNode, offset = domSel.anchorOffset;\n doc.addEventListener(\"selectionchange\", view.hideSelectionGuard = function () {\n if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n doc.removeEventListener(\"selectionchange\", view.hideSelectionGuard);\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n }\n });\n}\n\nfunction selectCursorWrapper(view) {\n var domSel = view.root.getSelection(), range = document.createRange();\n var node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n if (img) { range.setEnd(node.parentNode, domIndex(node) + 1); }\n else { range.setEnd(node, 0); }\n range.collapse(false);\n domSel.removeAllRanges();\n domSel.addRange(range);\n // Kludge to kill 'control selection' in IE11 when selecting an\n // invisible cursor wrapper, since that would result in those weird\n // resize handles and a selection that considers the absolutely\n // positioned wrapper, rather than the root editable node, the\n // focused element.\n if (!img && !view.state.selection.visible && result.ie && result.ie_version <= 11) {\n node.disabled = true;\n node.disabled = false;\n }\n}\n\nfunction syncNodeSelection(view, sel) {\n if (sel instanceof NodeSelection) {\n var desc = view.docView.descAt(sel.from);\n if (desc != view.lastSelectedViewDesc) {\n clearNodeSelection(view);\n if (desc) { desc.selectNode(); }\n view.lastSelectedViewDesc = desc;\n }\n } else {\n clearNodeSelection(view);\n }\n}\n\n// Clear all DOM statefulness of the last node selection.\nfunction clearNodeSelection(view) {\n if (view.lastSelectedViewDesc) {\n if (view.lastSelectedViewDesc.parent)\n { view.lastSelectedViewDesc.deselectNode(); }\n view.lastSelectedViewDesc = null;\n }\n}\n\nfunction selectionBetween(view, $anchor, $head, bias) {\n return view.someProp(\"createSelectionBetween\", function (f) { return f(view, $anchor, $head); })\n || TextSelection.between($anchor, $head, bias)\n}\n\nfunction hasFocusAndSelection(view) {\n if (view.editable && view.root.activeElement != view.dom) { return false }\n return hasSelection(view)\n}\n\nfunction hasSelection(view) {\n var sel = view.root.getSelection();\n if (!sel.anchorNode) { return false }\n try {\n // Firefox will raise 'permission denied' errors when accessing\n // properties of `sel.anchorNode` when it's in a generated CSS\n // element.\n return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&\n (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode))\n } catch(_) {\n return false\n }\n}\n\nfunction anchorInRightPlace(view) {\n var anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n var domSel = view.root.getSelection();\n return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset)\n}\n\nfunction moveSelectionBlock(state, dir) {\n var ref = state.selection;\n var $anchor = ref.$anchor;\n var $head = ref.$head;\n var $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n var $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n return $start && Selection.findFrom($start, dir)\n}\n\nfunction apply(view, sel) {\n view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n return true\n}\n\nfunction selectHorizontally(view, dir, mods) {\n var sel = view.state.selection;\n if (sel instanceof TextSelection) {\n if (!sel.empty || mods.indexOf(\"s\") > -1) {\n return false\n } else if (view.endOfTextblock(dir > 0 ? \"right\" : \"left\")) {\n var next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection)) { return apply(view, next) }\n return false\n } else if (!(result.mac && mods.indexOf(\"m\") > -1)) {\n var $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n if (!node || node.isText) { return false }\n var nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM)) { return false }\n if (NodeSelection.isSelectable(node)) {\n return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head))\n } else if (result.webkit) {\n // Chrome and Safari will introduce extra pointless cursor\n // positions around inline uneditable nodes, so we have to\n // take over and move the cursor past them (#937)\n return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)))\n } else {\n return false\n }\n }\n } else if (sel instanceof NodeSelection && sel.node.isInline) {\n return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from))\n } else {\n var next$1 = moveSelectionBlock(view.state, dir);\n if (next$1) { return apply(view, next$1) }\n return false\n }\n}\n\nfunction nodeLen(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length\n}\n\nfunction isIgnorable(dom) {\n var desc = dom.pmViewDesc;\n return desc && desc.size == 0 && (dom.nextSibling || dom.nodeName != \"BR\")\n}\n\n// Make sure the cursor isn't directly after one or more ignored\n// nodes, which will confuse the browser's cursor motion logic.\nfunction skipIgnoredNodesLeft(view) {\n var sel = view.root.getSelection();\n var node = sel.focusNode, offset = sel.focusOffset;\n if (!node) { return }\n var moveNode, moveOffset, force = false;\n // Gecko will do odd things when the selection is directly in front\n // of a non-editable node, so in that case, move it into the next\n // node if possible. Issue prosemirror/prosemirror#832.\n if (result.gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset])) { force = true; }\n for (;;) {\n if (offset > 0) {\n if (node.nodeType != 1) {\n break\n } else {\n var before = node.childNodes[offset - 1];\n if (isIgnorable(before)) {\n moveNode = node;\n moveOffset = --offset;\n } else if (before.nodeType == 3) {\n node = before;\n offset = node.nodeValue.length;\n } else { break }\n }\n } else if (isBlockNode(node)) {\n break\n } else {\n var prev = node.previousSibling;\n while (prev && isIgnorable(prev)) {\n moveNode = node.parentNode;\n moveOffset = domIndex(prev);\n prev = prev.previousSibling;\n }\n if (!prev) {\n node = node.parentNode;\n if (node == view.dom) { break }\n offset = 0;\n } else {\n node = prev;\n offset = nodeLen(node);\n }\n }\n }\n if (force) { setSelFocus(view, sel, node, offset); }\n else if (moveNode) { setSelFocus(view, sel, moveNode, moveOffset); }\n}\n\n// Make sure the cursor isn't directly before one or more ignored\n// nodes.\nfunction skipIgnoredNodesRight(view) {\n var sel = view.root.getSelection();\n var node = sel.focusNode, offset = sel.focusOffset;\n if (!node) { return }\n var len = nodeLen(node);\n var moveNode, moveOffset;\n for (;;) {\n if (offset < len) {\n if (node.nodeType != 1) { break }\n var after = node.childNodes[offset];\n if (isIgnorable(after)) {\n moveNode = node;\n moveOffset = ++offset;\n }\n else { break }\n } else if (isBlockNode(node)) {\n break\n } else {\n var next = node.nextSibling;\n while (next && isIgnorable(next)) {\n moveNode = next.parentNode;\n moveOffset = domIndex(next) + 1;\n next = next.nextSibling;\n }\n if (!next) {\n node = node.parentNode;\n if (node == view.dom) { break }\n offset = len = 0;\n } else {\n node = next;\n offset = 0;\n len = nodeLen(node);\n }\n }\n }\n if (moveNode) { setSelFocus(view, sel, moveNode, moveOffset); }\n}\n\nfunction isBlockNode(dom) {\n var desc = dom.pmViewDesc;\n return desc && desc.node && desc.node.isBlock\n}\n\nfunction setSelFocus(view, sel, node, offset) {\n if (selectionCollapsed(sel)) {\n var range = document.createRange();\n range.setEnd(node, offset);\n range.setStart(node, offset);\n sel.removeAllRanges();\n sel.addRange(range);\n } else if (sel.extend) {\n sel.extend(node, offset);\n }\n view.domObserver.setCurSelection();\n var state = view.state;\n // If no state update ends up happening, reset the selection.\n setTimeout(function () {\n if (view.state == state) { selectionToDOM(view); }\n }, 50);\n}\n\n// : (EditorState, number)\n// Check whether vertical selection motion would involve node\n// selections. If so, apply it (if not, the result is left to the\n// browser)\nfunction selectVertically(view, dir, mods) {\n var sel = view.state.selection;\n if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1) { return false }\n if (result.mac && mods.indexOf(\"m\") > -1) { return false }\n var $from = sel.$from;\n var $to = sel.$to;\n\n if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n var next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection))\n { return apply(view, next) }\n }\n if (!$from.parent.inlineContent) {\n var beyond = Selection.findFrom(dir < 0 ? $from : $to, dir);\n return beyond ? apply(view, beyond) : true\n }\n return false\n}\n\nfunction stopNativeHorizontalDelete(view, dir) {\n if (!(view.state.selection instanceof TextSelection)) { return true }\n var ref = view.state.selection;\n var $head = ref.$head;\n var $anchor = ref.$anchor;\n var empty = ref.empty;\n if (!$head.sameParent($anchor)) { return true }\n if (!empty) { return false }\n if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\")) { return true }\n var nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n if (nextNode && !nextNode.isText) {\n var tr = view.state.tr;\n if (dir < 0) { tr.delete($head.pos - nextNode.nodeSize, $head.pos); }\n else { tr.delete($head.pos, $head.pos + nextNode.nodeSize); }\n view.dispatch(tr);\n return true\n }\n return false\n}\n\nfunction switchEditable(view, node, state) {\n view.domObserver.stop();\n node.contentEditable = state;\n view.domObserver.start();\n}\n\n// Issue #867 / #1090 / https://bugs.chromium.org/p/chromium/issues/detail?id=903821\n// In which Safari (and at some point in the past, Chrome) does really\n// wrong things when the down arrow is pressed when the cursor is\n// directly at the start of a textblock and has an uneditable node\n// after it\nfunction safariDownArrowBug(view) {\n if (!result.safari || view.state.selection.$head.parentOffset > 0) { return }\n var ref = view.root.getSelection();\n var focusNode = ref.focusNode;\n var focusOffset = ref.focusOffset;\n if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&\n focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n var child = focusNode.firstChild;\n switchEditable(view, child, true);\n setTimeout(function () { return switchEditable(view, child, false); }, 20);\n }\n}\n\n// A backdrop key mapping used to make sure we always suppress keys\n// that have a dangerous default effect, even if the commands they are\n// bound to return false, and to make sure that cursor-motion keys\n// find a cursor (as opposed to a node selection) when pressed. For\n// cursor-motion keys, the code in the handlers also takes care of\n// block selections.\n\nfunction getMods(event) {\n var result = \"\";\n if (event.ctrlKey) { result += \"c\"; }\n if (event.metaKey) { result += \"m\"; }\n if (event.altKey) { result += \"a\"; }\n if (event.shiftKey) { result += \"s\"; }\n return result\n}\n\nfunction captureKeyDown(view, event) {\n var code = event.keyCode, mods = getMods(event);\n if (code == 8 || (result.mac && code == 72 && mods == \"c\")) { // Backspace, Ctrl-h on Mac\n return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodesLeft(view)\n } else if (code == 46 || (result.mac && code == 68 && mods == \"c\")) { // Delete, Ctrl-d on Mac\n return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodesRight(view)\n } else if (code == 13 || code == 27) { // Enter, Esc\n return true\n } else if (code == 37) { // Left arrow\n return selectHorizontally(view, -1, mods) || skipIgnoredNodesLeft(view)\n } else if (code == 39) { // Right arrow\n return selectHorizontally(view, 1, mods) || skipIgnoredNodesRight(view)\n } else if (code == 38) { // Up arrow\n return selectVertically(view, -1, mods) || skipIgnoredNodesLeft(view)\n } else if (code == 40) { // Down arrow\n return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodesRight(view)\n } else if (mods == (result.mac ? \"m\" : \"c\") &&\n (code == 66 || code == 73 || code == 89 || code == 90)) { // Mod-[biyz]\n return true\n }\n return false\n}\n\n// Note that all referencing and parsing is done with the\n// start-of-operation selection and document, since that's the one\n// that the DOM represents. If any changes came in in the meantime,\n// the modification is mapped over those before it is applied, in\n// readDOMChange.\n\nfunction parseBetween(view, from_, to_) {\n var ref = view.docView.parseRange(from_, to_);\n var parent = ref.node;\n var fromOffset = ref.fromOffset;\n var toOffset = ref.toOffset;\n var from = ref.from;\n var to = ref.to;\n\n var domSel = view.root.getSelection(), find = null, anchor = domSel.anchorNode;\n if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {\n find = [{node: anchor, offset: domSel.anchorOffset}];\n if (!selectionCollapsed(domSel))\n { find.push({node: domSel.focusNode, offset: domSel.focusOffset}); }\n }\n // Work around issue in Chrome where backspacing sometimes replaces\n // the deleted content with a random BR node (issues #799, #831)\n if (result.chrome && view.lastKeyCode === 8) {\n for (var off = toOffset; off > fromOffset; off--) {\n var node = parent.childNodes[off - 1], desc = node.pmViewDesc;\n if (node.nodeType == \"BR\" && !desc) { toOffset = off; break }\n if (!desc || desc.size) { break }\n }\n }\n var startDoc = view.state.doc;\n var parser = view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n var $from = startDoc.resolve(from);\n\n var sel = null, doc = parser.parse(parent, {\n topNode: $from.parent,\n topMatch: $from.parent.contentMatchAt($from.index()),\n topOpen: true,\n from: fromOffset,\n to: toOffset,\n preserveWhitespace: $from.parent.type.spec.code ? \"full\" : true,\n editableContent: true,\n findPositions: find,\n ruleFromNode: ruleFromNode,\n context: $from\n });\n if (find && find[0].pos != null) {\n var anchor$1 = find[0].pos, head = find[1] && find[1].pos;\n if (head == null) { head = anchor$1; }\n sel = {anchor: anchor$1 + from, head: head + from};\n }\n return {doc: doc, sel: sel, from: from, to: to}\n}\n\nfunction ruleFromNode(dom) {\n var desc = dom.pmViewDesc;\n if (desc) {\n return desc.parseRule()\n } else if (dom.nodeName == \"BR\" && dom.parentNode) {\n // Safari replaces the list item or table cell with a BR\n // directly in the list node (?!) if you delete the last\n // character in a list item or table cell (#708, #862)\n if (result.safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) {\n var skip = document.createElement(\"div\");\n skip.appendChild(document.createElement(\"li\"));\n return {skip: skip}\n } else if (dom.parentNode.lastChild == dom || result.safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) {\n return {ignore: true}\n }\n } else if (dom.nodeName == \"IMG\" && dom.getAttribute(\"mark-placeholder\")) {\n return {ignore: true}\n }\n}\n\nfunction readDOMChange(view, from, to, typeOver, addedNodes) {\n if (from < 0) {\n var origin = view.lastSelectionTime > Date.now() - 50 ? view.lastSelectionOrigin : null;\n var newSel = selectionFromDOM(view, origin);\n if (newSel && !view.state.selection.eq(newSel)) {\n var tr$1 = view.state.tr.setSelection(newSel);\n if (origin == \"pointer\") { tr$1.setMeta(\"pointer\", true); }\n else if (origin == \"key\") { tr$1.scrollIntoView(); }\n view.dispatch(tr$1);\n }\n return\n }\n\n var $before = view.state.doc.resolve(from);\n var shared = $before.sharedDepth(to);\n from = $before.before(shared + 1);\n to = view.state.doc.resolve(to).after(shared + 1);\n\n var sel = view.state.selection;\n var parse = parseBetween(view, from, to);\n // Chrome sometimes leaves the cursor before the inserted text when\n // composing after a cursor wrapper. This moves it forward.\n if (result.chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from) {\n var text = view.cursorWrapper.deco.type.toDOM.nextSibling;\n var size = text && text.nodeValue ? text.nodeValue.length : 1;\n parse.sel = {anchor: parse.sel.anchor + size, head: parse.sel.anchor + size};\n }\n\n var doc = view.state.doc, compare = doc.slice(parse.from, parse.to);\n var preferredPos, preferredSide;\n // Prefer anchoring to end when Backspace is pressed\n if (view.lastKeyCode === 8 && Date.now() - 100 < view.lastKeyCodeTime) {\n preferredPos = view.state.selection.to;\n preferredSide = \"end\";\n } else {\n preferredPos = view.state.selection.from;\n preferredSide = \"start\";\n }\n view.lastKeyCode = null;\n\n var change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);\n if (!change) {\n if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) &&\n !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) {\n change = {start: sel.from, endA: sel.to, endB: sel.to};\n } else if (result.ios && view.lastIOSEnter > Date.now() - 225 &&\n addedNodes.some(function (n) { return n.nodeName == \"DIV\" || n.nodeName == \"P\"; }) &&\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); })) {\n view.lastIOSEnter = 0;\n return\n } else {\n if (parse.sel) {\n var sel$1 = resolveSelection(view, view.state.doc, parse.sel);\n if (sel$1 && !sel$1.eq(view.state.selection)) { view.dispatch(view.state.tr.setSelection(sel$1)); }\n }\n return\n }\n }\n view.domChangeCount++;\n // Handle the case where overwriting a selection by typing matches\n // the start or end of the selected content, creating a change\n // that's smaller than what was actually overwritten.\n if (view.state.selection.from < view.state.selection.to &&\n change.start == change.endB &&\n view.state.selection instanceof TextSelection) {\n if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2) {\n change.start = view.state.selection.from;\n } else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2) {\n change.endB += (view.state.selection.to - change.endA);\n change.endA = view.state.selection.to;\n }\n }\n\n // IE11 will insert a non-breaking space _ahead_ of the space after\n // the cursor space when adding a space before another space. When\n // that happened, adjust the change to cover the space instead.\n if (result.ie && result.ie_version <= 11 && change.endB == change.start + 1 &&\n change.endA == change.start && change.start > parse.from &&\n parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == \" \\u00a0\") {\n change.start--;\n change.endA--;\n change.endB--;\n }\n\n var $from = parse.doc.resolveNoCache(change.start - parse.from);\n var $to = parse.doc.resolveNoCache(change.endB - parse.from);\n var inlineChange = $from.sameParent($to) && $from.parent.inlineContent;\n var nextSel;\n // If this looks like the effect of pressing Enter (or was recorded\n // as being an iOS enter press), just dispatch an Enter key instead.\n if (((result.ios && view.lastIOSEnter > Date.now() - 225 &&\n (!inlineChange || addedNodes.some(function (n) { return n.nodeName == \"DIV\" || n.nodeName == \"P\"; }))) ||\n (!inlineChange && $from.pos < parse.doc.content.size &&\n (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&\n nextSel.head == $to.pos)) &&\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); })) {\n view.lastIOSEnter = 0;\n return\n }\n // Same for backspace\n if (view.state.selection.anchor > change.start &&\n looksLikeJoin(doc, change.start, change.endA, $from, $to) &&\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(8, \"Backspace\")); })) {\n if (result.android && result.chrome) { view.domObserver.suppressSelectionUpdates(); } // #820\n return\n }\n\n // This tries to detect Android virtual keyboard\n // enter-and-pick-suggestion action. That sometimes (see issue\n // #1059) first fires a DOM mutation, before moving the selection to\n // the newly created block. And then, because ProseMirror cleans up\n // the DOM selection, it gives up moving the selection entirely,\n // leaving the cursor in the wrong place. When that happens, we drop\n // the new paragraph from the initial change, and fire a simulated\n // enter key afterwards.\n if (result.android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth &&\n parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) {\n change.endB -= 2;\n $to = parse.doc.resolveNoCache(change.endB - parse.from);\n setTimeout(function () {\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n }, 20);\n }\n\n var chFrom = change.start, chTo = change.endA;\n\n var tr, storedMarks, markChange, $from1;\n if (inlineChange) {\n if ($from.pos == $to.pos) { // Deletion\n // IE11 sometimes weirdly moves the DOM selection around after\n // backspacing out the first element in a textblock\n if (result.ie && result.ie_version <= 11 && $from.parentOffset == 0) {\n view.domObserver.suppressSelectionUpdates();\n setTimeout(function () { return selectionToDOM(view); }, 20);\n }\n tr = view.state.tr.delete(chFrom, chTo);\n storedMarks = doc.resolve(change.start).marksAcross(doc.resolve(change.endA));\n } else if ( // Adding or removing a mark\n change.endA == change.endB && ($from1 = doc.resolve(change.start)) &&\n (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset),\n $from1.parent.content.cut($from1.parentOffset, change.endA - $from1.start())))\n ) {\n tr = view.state.tr;\n if (markChange.type == \"add\") { tr.addMark(chFrom, chTo, markChange.mark); }\n else { tr.removeMark(chFrom, chTo, markChange.mark); }\n } else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {\n // Both positions in the same text node -- simply insert text\n var text$1 = $from.parent.textBetween($from.parentOffset, $to.parentOffset);\n if (view.someProp(\"handleTextInput\", function (f) { return f(view, chFrom, chTo, text$1); })) { return }\n tr = view.state.tr.insertText(text$1, chFrom, chTo);\n }\n }\n\n if (!tr)\n { tr = view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from)); }\n if (parse.sel) {\n var sel$2 = resolveSelection(view, tr.doc, parse.sel);\n // Chrome Android will sometimes, during composition, report the\n // selection in the wrong place. If it looks like that is\n // happening, don't update the selection.\n // Edge just doesn't move the cursor forward when you start typing\n // in an empty block or between br nodes.\n if (sel$2 && !(result.chrome && result.android && view.composing && sel$2.empty &&\n (sel$2.head == chFrom || sel$2.head == tr.mapping.map(chTo) - 1) ||\n result.ie && sel$2.empty && sel$2.head == chFrom))\n { tr.setSelection(sel$2); }\n }\n if (storedMarks) { tr.ensureMarks(storedMarks); }\n view.dispatch(tr.scrollIntoView());\n}\n\nfunction resolveSelection(view, doc, parsedSel) {\n if (Math.max(parsedSel.anchor, parsedSel.head) > doc.content.size) { return null }\n return selectionBetween(view, doc.resolve(parsedSel.anchor), doc.resolve(parsedSel.head))\n}\n\n// : (Fragment, Fragment) → ?{mark: Mark, type: string}\n// Given two same-length, non-empty fragments of inline content,\n// determine whether the first could be created from the second by\n// removing or adding a single mark type.\nfunction isMarkChange(cur, prev) {\n var curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks;\n var added = curMarks, removed = prevMarks, type, mark, update;\n for (var i = 0; i < prevMarks.length; i++) { added = prevMarks[i].removeFromSet(added); }\n for (var i$1 = 0; i$1 < curMarks.length; i$1++) { removed = curMarks[i$1].removeFromSet(removed); }\n if (added.length == 1 && removed.length == 0) {\n mark = added[0];\n type = \"add\";\n update = function (node) { return node.mark(mark.addToSet(node.marks)); };\n } else if (added.length == 0 && removed.length == 1) {\n mark = removed[0];\n type = \"remove\";\n update = function (node) { return node.mark(mark.removeFromSet(node.marks)); };\n } else {\n return null\n }\n var updated = [];\n for (var i$2 = 0; i$2 < prev.childCount; i$2++) { updated.push(update(prev.child(i$2))); }\n if (Fragment.from(updated).eq(cur)) { return {mark: mark, type: type} }\n}\n\nfunction looksLikeJoin(old, start, end, $newStart, $newEnd) {\n if (!$newStart.parent.isTextblock ||\n // The content must have shrunk\n end - start <= $newEnd.pos - $newStart.pos ||\n // newEnd must point directly at or after the end of the block that newStart points into\n skipClosingAndOpening($newStart, true, false) < $newEnd.pos)\n { return false }\n\n var $start = old.resolve(start);\n // Start must be at the end of a block\n if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock)\n { return false }\n var $next = old.resolve(skipClosingAndOpening($start, true, true));\n // The next textblock must start before end and end near it\n if (!$next.parent.isTextblock || $next.pos > end ||\n skipClosingAndOpening($next, true, false) < end)\n { return false }\n\n // The fragments after the join point must match\n return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content)\n}\n\nfunction skipClosingAndOpening($pos, fromEnd, mayOpen) {\n var depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;\n while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {\n depth--;\n end++;\n fromEnd = false;\n }\n if (mayOpen) {\n var next = $pos.node(depth).maybeChild($pos.indexAfter(depth));\n while (next && !next.isLeaf) {\n next = next.firstChild;\n end++;\n }\n }\n return end\n}\n\nfunction findDiff(a, b, pos, preferredPos, preferredSide) {\n var start = a.findDiffStart(b, pos);\n if (start == null) { return null }\n var ref = a.findDiffEnd(b, pos + a.size, pos + b.size);\n var endA = ref.a;\n var endB = ref.b;\n if (preferredSide == \"end\") {\n var adjust = Math.max(0, start - Math.min(endA, endB));\n preferredPos -= endA + adjust - start;\n }\n if (endA < start && a.size < b.size) {\n var move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;\n start -= move;\n endB = start + (endB - endA);\n endA = start;\n } else if (endB < start) {\n var move$1 = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;\n start -= move$1;\n endA = start + (endA - endB);\n endB = start;\n }\n return {start: start, endA: endA, endB: endB}\n}\n\nfunction serializeForClipboard(view, slice) {\n var context = [];\n var content = slice.content;\n var openStart = slice.openStart;\n var openEnd = slice.openEnd;\n while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n openStart--;\n openEnd--;\n var node = content.firstChild;\n context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n content = node.content;\n }\n\n var serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n var doc = detachedDoc(), wrap = doc.createElement(\"div\");\n wrap.appendChild(serializer.serializeFragment(content, {document: doc}));\n\n var firstChild = wrap.firstChild, needsWrap;\n while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n for (var i = needsWrap.length - 1; i >= 0; i--) {\n var wrapper = doc.createElement(needsWrap[i]);\n while (wrap.firstChild) { wrapper.appendChild(wrap.firstChild); }\n wrap.appendChild(wrapper);\n }\n firstChild = wrap.firstChild;\n }\n\n if (firstChild && firstChild.nodeType == 1)\n { firstChild.setAttribute(\"data-pm-slice\", (openStart + \" \" + openEnd + \" \" + (JSON.stringify(context)))); }\n\n var text = view.someProp(\"clipboardTextSerializer\", function (f) { return f(slice); }) ||\n slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n\n return {dom: wrap, text: text}\n}\n\n// : (EditorView, string, string, ?bool, ResolvedPos) → ?Slice\n// Read a slice of content from the clipboard (or drop data).\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n var dom, inCode = $context.parent.type.spec.code, slice;\n if (!html && !text) { return null }\n var asText = text && (plainText || inCode || !html);\n if (asText) {\n view.someProp(\"transformPastedText\", function (f) { text = f(text, inCode || plainText); });\n if (inCode) { return new Slice(Fragment.from(view.state.schema.text(text)), 0, 0) }\n var parsed = view.someProp(\"clipboardTextParser\", function (f) { return f(text, $context, plainText); });\n if (parsed) {\n slice = parsed;\n } else {\n dom = document.createElement(\"div\");\n text.trim().split(/(?:\\r\\n?|\\n)+/).forEach(function (block) {\n dom.appendChild(document.createElement(\"p\")).textContent = block;\n });\n }\n } else {\n view.someProp(\"transformPastedHTML\", function (f) { html = f(html); });\n dom = readHTML(html);\n }\n\n var contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n var sliceData = contextNode && /^(\\d+) (\\d+) (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\"));\n if (!slice) {\n var parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n slice = parser.parseSlice(dom, {preserveWhitespace: !!(asText || sliceData), context: $context});\n }\n if (sliceData)\n { slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[3]); }\n else // HTML wasn't created by ProseMirror. Make sure top-level siblings are coherent\n { slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), false); }\n\n view.someProp(\"transformPasted\", function (f) { slice = f(slice); });\n return slice\n}\n\n// Takes a slice parsed with parseSlice, which means there hasn't been\n// any content-expression checking done on the top nodes, tries to\n// find a parent node in the current context that might fit the nodes,\n// and if successful, rebuilds the slice so that it fits into that parent.\n//\n// This addresses the problem that Transform.replace expects a\n// coherent slice, and will fail to place a set of siblings that don't\n// fit anywhere in the schema.\nfunction normalizeSiblings(fragment, $context) {\n if (fragment.childCount < 2) { return fragment }\n var loop = function ( d ) {\n var parent = $context.node(d);\n var match = parent.contentMatchAt($context.index(d));\n var lastWrap = (void 0), result = [];\n fragment.forEach(function (node) {\n if (!result) { return }\n var wrap = match.findWrapping(node.type), inLast;\n if (!wrap) { return result = null }\n if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n result[result.length - 1] = inLast;\n } else {\n if (result.length) { result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length); }\n var wrapped = withWrappers(node, wrap);\n result.push(wrapped);\n match = match.matchType(wrapped.type, wrapped.attrs);\n lastWrap = wrap;\n }\n });\n if (result) { return { v: Fragment.from(result) } }\n };\n\n for (var d = $context.depth; d >= 0; d--) {\n var returned = loop( d );\n\n if ( returned ) return returned.v;\n }\n return fragment\n}\n\nfunction withWrappers(node, wrap, from) {\n if ( from === void 0 ) from = 0;\n\n for (var i = wrap.length - 1; i >= from; i--)\n { node = wrap[i].create(null, Fragment.from(node)); }\n return node\n}\n\n// Used to group adjacent nodes wrapped in similar parents by\n// normalizeSiblings into the same parent node\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n var inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n if (inner) { return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner)) }\n var match = sibling.contentMatchAt(sibling.childCount);\n if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n { return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1)))) }\n }\n}\n\nfunction closeRight(node, depth) {\n if (depth == 0) { return node }\n var fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n var fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n return node.copy(fragment.append(fill))\n}\n\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n var node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n if (depth < to - 1) { inner = closeRange(inner, side, from, to, depth + 1, openEnd); }\n if (depth >= from)\n { inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, fragment.childCount > 1 || openEnd <= depth).append(inner)\n : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true)); }\n return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner))\n}\n\nfunction closeSlice(slice, openStart, openEnd) {\n if (openStart < slice.openStart)\n { slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd); }\n if (openEnd < slice.openEnd)\n { slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd); }\n return slice\n}\n\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"..\"` the table cells are ignored.\nvar wrapMap = {\n thead: [\"table\"],\n tbody: [\"table\"],\n tfoot: [\"table\"],\n caption: [\"table\"],\n colgroup: [\"table\"],\n col: [\"table\", \"colgroup\"],\n tr: [\"table\", \"tbody\"],\n td: [\"table\", \"tbody\", \"tr\"],\n th: [\"table\", \"tbody\", \"tr\"]\n};\n\nvar _detachedDoc = null;\nfunction detachedDoc() {\n return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"))\n}\n\nfunction readHTML(html) {\n var metas = /(\\s*]*>)*/.exec(html);\n if (metas) { html = html.slice(metas[0].length); }\n var elt = detachedDoc().createElement(\"div\");\n var firstTag = /(?:]*>)*<([a-z][^>\\s]+)/i.exec(html), wrap, depth = 0;\n if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()]) {\n html = wrap.map(function (n) { return \"<\" + n + \">\"; }).join(\"\") + html + wrap.map(function (n) { return \"\"; }).reverse().join(\"\");\n depth = wrap.length;\n }\n elt.innerHTML = html;\n for (var i = 0; i < depth; i++) { elt = elt.firstChild; }\n return elt\n}\n\nfunction addContext(slice, context) {\n if (!slice.size) { return slice }\n var schema = slice.content.firstChild.type.schema, array;\n try { array = JSON.parse(context); }\n catch(e) { return slice }\n var content = slice.content;\n var openStart = slice.openStart;\n var openEnd = slice.openEnd;\n for (var i = array.length - 2; i >= 0; i -= 2) {\n var type = schema.nodes[array[i]];\n if (!type || type.hasRequiredAttrs()) { break }\n content = Fragment.from(type.create(array[i + 1], content));\n openStart++; openEnd++;\n }\n return new Slice(content, openStart, openEnd)\n}\n\nvar observeOptions = {\n childList: true,\n characterData: true,\n characterDataOldValue: true,\n attributes: true,\n attributeOldValue: true,\n subtree: true\n};\n// IE11 has very broken mutation observers, so we also listen to DOMCharacterDataModified\nvar useCharData = result.ie && result.ie_version <= 11;\n\nvar SelectionState = function SelectionState() {\n this.anchorNode = this.anchorOffset = this.focusNode = this.focusOffset = null;\n};\n\nSelectionState.prototype.set = function set (sel) {\n this.anchorNode = sel.anchorNode; this.anchorOffset = sel.anchorOffset;\n this.focusNode = sel.focusNode; this.focusOffset = sel.focusOffset;\n};\n\nSelectionState.prototype.eq = function eq (sel) {\n return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset &&\n sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset\n};\n\nvar DOMObserver = function DOMObserver(view, handleDOMChange) {\n var this$1 = this;\n\n this.view = view;\n this.handleDOMChange = handleDOMChange;\n this.queue = [];\n this.flushingSoon = -1;\n this.observer = window.MutationObserver &&\n new window.MutationObserver(function (mutations) {\n for (var i = 0; i < mutations.length; i++) { this$1.queue.push(mutations[i]); }\n // IE11 will sometimes (on backspacing out a single character\n // text node after a BR node) call the observer callback\n // before actually updating the DOM, which will cause\n // ProseMirror to miss the change (see #930)\n if (result.ie && result.ie_version <= 11 && mutations.some(\n function (m) { return m.type == \"childList\" && m.removedNodes.length ||\n m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length; }))\n { this$1.flushSoon(); }\n else\n { this$1.flush(); }\n });\n this.currentSelection = new SelectionState;\n if (useCharData) {\n this.onCharData = function (e) {\n this$1.queue.push({target: e.target, type: \"characterData\", oldValue: e.prevValue});\n this$1.flushSoon();\n };\n }\n this.onSelectionChange = this.onSelectionChange.bind(this);\n this.suppressingSelectionUpdates = false;\n};\n\nDOMObserver.prototype.flushSoon = function flushSoon () {\n var this$1 = this;\n\n if (this.flushingSoon < 0)\n { this.flushingSoon = window.setTimeout(function () { this$1.flushingSoon = -1; this$1.flush(); }, 20); }\n};\n\nDOMObserver.prototype.forceFlush = function forceFlush () {\n if (this.flushingSoon > -1) {\n window.clearTimeout(this.flushingSoon);\n this.flushingSoon = -1;\n this.flush();\n }\n};\n\nDOMObserver.prototype.start = function start () {\n if (this.observer)\n { this.observer.observe(this.view.dom, observeOptions); }\n if (useCharData)\n { this.view.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData); }\n this.connectSelection();\n};\n\nDOMObserver.prototype.stop = function stop () {\n var this$1 = this;\n\n if (this.observer) {\n var take = this.observer.takeRecords();\n if (take.length) {\n for (var i = 0; i < take.length; i++) { this.queue.push(take[i]); }\n window.setTimeout(function () { return this$1.flush(); }, 20);\n }\n this.observer.disconnect();\n }\n if (useCharData) { this.view.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData); }\n this.disconnectSelection();\n};\n\nDOMObserver.prototype.connectSelection = function connectSelection () {\n this.view.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n};\n\nDOMObserver.prototype.disconnectSelection = function disconnectSelection () {\n this.view.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n};\n\nDOMObserver.prototype.suppressSelectionUpdates = function suppressSelectionUpdates () {\n var this$1 = this;\n\n this.suppressingSelectionUpdates = true;\n setTimeout(function () { return this$1.suppressingSelectionUpdates = false; }, 50);\n};\n\nDOMObserver.prototype.onSelectionChange = function onSelectionChange () {\n if (!hasFocusAndSelection(this.view)) { return }\n if (this.suppressingSelectionUpdates) { return selectionToDOM(this.view) }\n // Deletions on IE11 fire their events in the wrong order, giving\n // us a selection change event before the DOM changes are\n // reported.\n if (result.ie && result.ie_version <= 11 && !this.view.state.selection.empty) {\n var sel = this.view.root.getSelection();\n // Selection.isCollapsed isn't reliable on IE\n if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n { return this.flushSoon() }\n }\n this.flush();\n};\n\nDOMObserver.prototype.setCurSelection = function setCurSelection () {\n this.currentSelection.set(this.view.root.getSelection());\n};\n\nDOMObserver.prototype.ignoreSelectionChange = function ignoreSelectionChange (sel) {\n if (sel.rangeCount == 0) { return true }\n var container = sel.getRangeAt(0).commonAncestorContainer;\n var desc = this.view.docView.nearestDesc(container);\n if (desc && desc.ignoreMutation({type: \"selection\", target: container.nodeType == 3 ? container.parentNode : container})) {\n this.setCurSelection();\n return true\n }\n};\n\nDOMObserver.prototype.flush = function flush () {\n if (!this.view.docView || this.flushingSoon > -1) { return }\n var mutations = this.observer ? this.observer.takeRecords() : [];\n if (this.queue.length) {\n mutations = this.queue.concat(mutations);\n this.queue.length = 0;\n }\n\n var sel = this.view.root.getSelection();\n var newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasSelection(this.view) && !this.ignoreSelectionChange(sel);\n\n var from = -1, to = -1, typeOver = false, added = [];\n if (this.view.editable) {\n for (var i = 0; i < mutations.length; i++) {\n var result$1 = this.registerMutation(mutations[i], added);\n if (result$1) {\n from = from < 0 ? result$1.from : Math.min(result$1.from, from);\n to = to < 0 ? result$1.to : Math.max(result$1.to, to);\n if (result$1.typeOver) { typeOver = true; }\n }\n }\n }\n\n if (result.gecko && added.length > 1) {\n var brs = added.filter(function (n) { return n.nodeName == \"BR\"; });\n if (brs.length == 2) {\n var a = brs[0];\n var b = brs[1];\n if (a.parentNode && a.parentNode.parentNode == b.parentNode) { b.remove(); }\n else { a.remove(); }\n }\n }\n\n if (from > -1 || newSel) {\n if (from > -1) {\n this.view.docView.markDirty(from, to);\n checkCSS(this.view);\n }\n this.handleDOMChange(from, to, typeOver, added);\n if (this.view.docView.dirty) { this.view.updateState(this.view.state); }\n else if (!this.currentSelection.eq(sel)) { selectionToDOM(this.view); }\n this.currentSelection.set(sel);\n }\n};\n\nDOMObserver.prototype.registerMutation = function registerMutation (mut, added) {\n // Ignore mutations inside nodes that were already noted as inserted\n if (added.indexOf(mut.target) > -1) { return null }\n var desc = this.view.docView.nearestDesc(mut.target);\n if (mut.type == \"attributes\" &&\n (desc == this.view.docView || mut.attributeName == \"contenteditable\" ||\n // Firefox sometimes fires spurious events for null/empty styles\n (mut.attributeName == \"style\" && !mut.oldValue && !mut.target.getAttribute(\"style\"))))\n { return null }\n if (!desc || desc.ignoreMutation(mut)) { return null }\n\n if (mut.type == \"childList\") {\n var prev = mut.previousSibling, next = mut.nextSibling;\n if (result.ie && result.ie_version <= 11 && mut.addedNodes.length) {\n // IE11 gives us incorrect next/prev siblings for some\n // insertions, so if there are added nodes, recompute those\n for (var i = 0; i < mut.addedNodes.length; i++) {\n var ref = mut.addedNodes[i];\n var previousSibling = ref.previousSibling;\n var nextSibling = ref.nextSibling;\n if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0) { prev = previousSibling; }\n if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0) { next = nextSibling; }\n }\n }\n var fromOffset = prev && prev.parentNode == mut.target\n ? domIndex(prev) + 1 : 0;\n var from = desc.localPosFromDOM(mut.target, fromOffset, -1);\n var toOffset = next && next.parentNode == mut.target\n ? domIndex(next) : mut.target.childNodes.length;\n for (var i$1 = 0; i$1 < mut.addedNodes.length; i$1++) { added.push(mut.addedNodes[i$1]); }\n var to = desc.localPosFromDOM(mut.target, toOffset, 1);\n return {from: from, to: to}\n } else if (mut.type == \"attributes\") {\n return {from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border}\n } else { // \"characterData\"\n return {\n from: desc.posAtStart,\n to: desc.posAtEnd,\n // An event was generated for a text change that didn't change\n // any text. Mark the dom change to fall back to assuming the\n // selection was typed over with an identical value if it can't\n // find another change.\n typeOver: mut.target.nodeValue == mut.oldValue\n }\n }\n};\n\nvar cssChecked = false;\n\nfunction checkCSS(view) {\n if (cssChecked) { return }\n cssChecked = true;\n if (getComputedStyle(view.dom).whiteSpace == \"normal\")\n { console[\"warn\"](\"ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.\"); }\n}\n\n// A collection of DOM events that occur within the editor, and callback functions\n// to invoke when the event fires.\nvar handlers = {}, editHandlers = {};\n\nfunction initInput(view) {\n view.shiftKey = false;\n view.mouseDown = null;\n view.lastKeyCode = null;\n view.lastKeyCodeTime = 0;\n view.lastClick = {time: 0, x: 0, y: 0, type: \"\"};\n view.lastSelectionOrigin = null;\n view.lastSelectionTime = 0;\n\n view.lastIOSEnter = 0;\n view.lastIOSEnterFallbackTimeout = null;\n\n view.composing = false;\n view.composingTimeout = null;\n view.compositionNodes = [];\n view.compositionEndedAt = -2e8;\n\n view.domObserver = new DOMObserver(view, function (from, to, typeOver, added) { return readDOMChange(view, from, to, typeOver, added); });\n view.domObserver.start();\n // Used by hacks like the beforeinput handler to check whether anything happened in the DOM\n view.domChangeCount = 0;\n\n view.eventHandlers = Object.create(null);\n var loop = function ( event ) {\n var handler = handlers[event];\n view.dom.addEventListener(event, view.eventHandlers[event] = function (event) {\n if (eventBelongsToView(view, event) && !runCustomHandler(view, event) &&\n (view.editable || !(event.type in editHandlers)))\n { handler(view, event); }\n });\n };\n\n for (var event in handlers) loop( event );\n // On Safari, for reasons beyond my understanding, adding an input\n // event handler makes an issue where the composition vanishes when\n // you press enter go away.\n if (result.safari) { view.dom.addEventListener(\"input\", function () { return null; }); }\n\n ensureListeners(view);\n}\n\nfunction setSelectionOrigin(view, origin) {\n view.lastSelectionOrigin = origin;\n view.lastSelectionTime = Date.now();\n}\n\nfunction destroyInput(view) {\n view.domObserver.stop();\n for (var type in view.eventHandlers)\n { view.dom.removeEventListener(type, view.eventHandlers[type]); }\n clearTimeout(view.composingTimeout);\n clearTimeout(view.lastIOSEnterFallbackTimeout);\n}\n\nfunction ensureListeners(view) {\n view.someProp(\"handleDOMEvents\", function (currentHandlers) {\n for (var type in currentHandlers) { if (!view.eventHandlers[type])\n { view.dom.addEventListener(type, view.eventHandlers[type] = function (event) { return runCustomHandler(view, event); }); } }\n });\n}\n\nfunction runCustomHandler(view, event) {\n return view.someProp(\"handleDOMEvents\", function (handlers) {\n var handler = handlers[event.type];\n return handler ? handler(view, event) || event.defaultPrevented : false\n })\n}\n\nfunction eventBelongsToView(view, event) {\n if (!event.bubbles) { return true }\n if (event.defaultPrevented) { return false }\n for (var node = event.target; node != view.dom; node = node.parentNode)\n { if (!node || node.nodeType == 11 ||\n (node.pmViewDesc && node.pmViewDesc.stopEvent(event)))\n { return false } }\n return true\n}\n\nfunction dispatchEvent(view, event) {\n if (!runCustomHandler(view, event) && handlers[event.type] &&\n (view.editable || !(event.type in editHandlers)))\n { handlers[event.type](view, event); }\n}\n\neditHandlers.keydown = function (view, event) {\n view.shiftKey = event.keyCode == 16 || event.shiftKey;\n if (inOrNearComposition(view, event)) { return }\n view.domObserver.forceFlush();\n view.lastKeyCode = event.keyCode;\n view.lastKeyCodeTime = Date.now();\n // On iOS, if we preventDefault enter key presses, the virtual\n // keyboard gets confused. So the hack here is to set a flag that\n // makes the DOM change code recognize that what just happens should\n // be replaced by whatever the Enter key handlers do.\n if (result.ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n var now = Date.now();\n view.lastIOSEnter = now;\n view.lastIOSEnterFallbackTimeout = setTimeout(function () {\n if (view.lastIOSEnter == now) {\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n view.lastIOSEnter = 0;\n }\n }, 200);\n } else if (view.someProp(\"handleKeyDown\", function (f) { return f(view, event); }) || captureKeyDown(view, event)) {\n event.preventDefault();\n } else {\n setSelectionOrigin(view, \"key\");\n }\n};\n\neditHandlers.keyup = function (view, e) {\n if (e.keyCode == 16) { view.shiftKey = false; }\n};\n\neditHandlers.keypress = function (view, event) {\n if (inOrNearComposition(view, event) || !event.charCode ||\n event.ctrlKey && !event.altKey || result.mac && event.metaKey) { return }\n\n if (view.someProp(\"handleKeyPress\", function (f) { return f(view, event); })) {\n event.preventDefault();\n return\n }\n\n var sel = view.state.selection;\n if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) {\n var text = String.fromCharCode(event.charCode);\n if (!view.someProp(\"handleTextInput\", function (f) { return f(view, sel.$from.pos, sel.$to.pos, text); }))\n { view.dispatch(view.state.tr.insertText(text).scrollIntoView()); }\n event.preventDefault();\n }\n};\n\nfunction eventCoords(event) { return {left: event.clientX, top: event.clientY} }\n\nfunction isNear(event, click) {\n var dx = click.x - event.clientX, dy = click.y - event.clientY;\n return dx * dx + dy * dy < 100\n}\n\nfunction runHandlerOnContext(view, propName, pos, inside, event) {\n if (inside == -1) { return false }\n var $pos = view.state.doc.resolve(inside);\n var loop = function ( i ) {\n if (view.someProp(propName, function (f) { return i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true)\n : f(view, pos, $pos.node(i), $pos.before(i), event, false); }))\n { return { v: true } }\n };\n\n for (var i = $pos.depth + 1; i > 0; i--) {\n var returned = loop( i );\n\n if ( returned ) return returned.v;\n }\n return false\n}\n\nfunction updateSelection(view, selection, origin) {\n if (!view.focused) { view.focus(); }\n var tr = view.state.tr.setSelection(selection);\n if (origin == \"pointer\") { tr.setMeta(\"pointer\", true); }\n view.dispatch(tr);\n}\n\nfunction selectClickedLeaf(view, inside) {\n if (inside == -1) { return false }\n var $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter;\n if (node && node.isAtom && NodeSelection.isSelectable(node)) {\n updateSelection(view, new NodeSelection($pos), \"pointer\");\n return true\n }\n return false\n}\n\nfunction selectClickedNode(view, inside) {\n if (inside == -1) { return false }\n var sel = view.state.selection, selectedNode, selectAt;\n if (sel instanceof NodeSelection) { selectedNode = sel.node; }\n\n var $pos = view.state.doc.resolve(inside);\n for (var i = $pos.depth + 1; i > 0; i--) {\n var node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n if (NodeSelection.isSelectable(node)) {\n if (selectedNode && sel.$from.depth > 0 &&\n i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos)\n { selectAt = $pos.before(sel.$from.depth); }\n else\n { selectAt = $pos.before(i); }\n break\n }\n }\n\n if (selectAt != null) {\n updateSelection(view, NodeSelection.create(view.state.doc, selectAt), \"pointer\");\n return true\n } else {\n return false\n }\n}\n\nfunction handleSingleClick(view, pos, inside, event, selectNode) {\n return runHandlerOnContext(view, \"handleClickOn\", pos, inside, event) ||\n view.someProp(\"handleClick\", function (f) { return f(view, pos, event); }) ||\n (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside))\n}\n\nfunction handleDoubleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleDoubleClickOn\", pos, inside, event) ||\n view.someProp(\"handleDoubleClick\", function (f) { return f(view, pos, event); })\n}\n\nfunction handleTripleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleTripleClickOn\", pos, inside, event) ||\n view.someProp(\"handleTripleClick\", function (f) { return f(view, pos, event); }) ||\n defaultTripleClick(view, inside)\n}\n\nfunction defaultTripleClick(view, inside) {\n var doc = view.state.doc;\n if (inside == -1) {\n if (doc.inlineContent) {\n updateSelection(view, TextSelection.create(doc, 0, doc.content.size), \"pointer\");\n return true\n }\n return false\n }\n\n var $pos = doc.resolve(inside);\n for (var i = $pos.depth + 1; i > 0; i--) {\n var node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n var nodePos = $pos.before(i);\n if (node.inlineContent)\n { updateSelection(view, TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size), \"pointer\"); }\n else if (NodeSelection.isSelectable(node))\n { updateSelection(view, NodeSelection.create(doc, nodePos), \"pointer\"); }\n else\n { continue }\n return true\n }\n}\n\nfunction forceDOMFlush(view) {\n return endComposition(view)\n}\n\nvar selectNodeModifier = result.mac ? \"metaKey\" : \"ctrlKey\";\n\nhandlers.mousedown = function (view, event) {\n view.shiftKey = event.shiftKey;\n var flushed = forceDOMFlush(view);\n var now = Date.now(), type = \"singleClick\";\n if (now - view.lastClick.time < 500 && isNear(event, view.lastClick) && !event[selectNodeModifier]) {\n if (view.lastClick.type == \"singleClick\") { type = \"doubleClick\"; }\n else if (view.lastClick.type == \"doubleClick\") { type = \"tripleClick\"; }\n }\n view.lastClick = {time: now, x: event.clientX, y: event.clientY, type: type};\n\n var pos = view.posAtCoords(eventCoords(event));\n if (!pos) { return }\n\n if (type == \"singleClick\")\n { view.mouseDown = new MouseDown(view, pos, event, flushed); }\n else if ((type == \"doubleClick\" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event))\n { event.preventDefault(); }\n else\n { setSelectionOrigin(view, \"pointer\"); }\n};\n\nvar MouseDown = function MouseDown(view, pos, event, flushed) {\n var this$1 = this;\n\n this.view = view;\n this.startDoc = view.state.doc;\n this.pos = pos;\n this.event = event;\n this.flushed = flushed;\n this.selectNode = event[selectNodeModifier];\n this.allowDefault = event.shiftKey;\n\n var targetNode, targetPos;\n if (pos.inside > -1) {\n targetNode = view.state.doc.nodeAt(pos.inside);\n targetPos = pos.inside;\n } else {\n var $pos = view.state.doc.resolve(pos.pos);\n targetNode = $pos.parent;\n targetPos = $pos.depth ? $pos.before() : 0;\n }\n\n this.mightDrag = null;\n\n var target = flushed ? null : event.target;\n var targetDesc = target ? view.docView.nearestDesc(target, true) : null;\n this.target = targetDesc ? targetDesc.dom : null;\n\n if (targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false ||\n view.state.selection instanceof NodeSelection && targetPos == view.state.selection.from)\n { this.mightDrag = {node: targetNode,\n pos: targetPos,\n addAttr: this.target && !this.target.draggable,\n setUneditable: this.target && result.gecko && !this.target.hasAttribute(\"contentEditable\")}; }\n\n if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr) { this.target.draggable = true; }\n if (this.mightDrag.setUneditable)\n { setTimeout(function () { return this$1.target.setAttribute(\"contentEditable\", \"false\"); }, 20); }\n this.view.domObserver.start();\n }\n\n view.root.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n view.root.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n setSelectionOrigin(view, \"pointer\");\n};\n\nMouseDown.prototype.done = function done () {\n this.view.root.removeEventListener(\"mouseup\", this.up);\n this.view.root.removeEventListener(\"mousemove\", this.move);\n if (this.mightDrag && this.target) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr) { this.target.removeAttribute(\"draggable\"); }\n if (this.mightDrag.setUneditable) { this.target.removeAttribute(\"contentEditable\"); }\n this.view.domObserver.start();\n }\n this.view.mouseDown = null;\n};\n\nMouseDown.prototype.up = function up (event) {\n this.done();\n\n if (!this.view.dom.contains(event.target.nodeType == 3 ? event.target.parentNode : event.target))\n { return }\n\n var pos = this.pos;\n if (this.view.state.doc != this.startDoc) { pos = this.view.posAtCoords(eventCoords(event)); }\n\n if (this.allowDefault || !pos) {\n setSelectionOrigin(this.view, \"pointer\");\n } else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {\n event.preventDefault();\n } else if (this.flushed ||\n // Safari ignores clicks on draggable elements\n (result.safari && this.mightDrag && !this.mightDrag.node.isAtom) ||\n // Chrome will sometimes treat a node selection as a\n // cursor, but still report that the node is selected\n // when asked through getSelection. You'll then get a\n // situation where clicking at the point where that\n // (hidden) cursor is doesn't change the selection, and\n // thus doesn't get a reaction from ProseMirror. This\n // works around that.\n (result.chrome && !(this.view.state.selection instanceof TextSelection) &&\n (pos.pos == this.view.state.selection.from || pos.pos == this.view.state.selection.to))) {\n updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), \"pointer\");\n event.preventDefault();\n } else {\n setSelectionOrigin(this.view, \"pointer\");\n }\n};\n\nMouseDown.prototype.move = function move (event) {\n if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||\n Math.abs(this.event.y - event.clientY) > 4))\n { this.allowDefault = true; }\n setSelectionOrigin(this.view, \"pointer\");\n};\n\nhandlers.touchdown = function (view) {\n forceDOMFlush(view);\n setSelectionOrigin(view, \"pointer\");\n};\n\nhandlers.contextmenu = function (view) { return forceDOMFlush(view); };\n\nfunction inOrNearComposition(view, event) {\n if (view.composing) { return true }\n // See https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/.\n // On Japanese input method editors (IMEs), the Enter key is used to confirm character\n // selection. On Safari, when Enter is pressed, compositionend and keydown events are\n // emitted. The keydown event triggers newline insertion, which we don't want.\n // This method returns true if the keydown event should be ignored.\n // We only ignore it once, as pressing Enter a second time *should* insert a newline.\n // Furthermore, the keydown event timestamp must be close to the compositionEndedAt timestamp.\n // This guards against the case where compositionend is triggered without the keyboard\n // (e.g. character confirmation may be done with the mouse), and keydown is triggered\n // afterwards- we wouldn't want to ignore the keydown event in this case.\n if (result.safari && Math.abs(event.timeStamp - view.compositionEndedAt) < 500) {\n view.compositionEndedAt = -2e8;\n return true\n }\n return false\n}\n\n// Drop active composition after 5 seconds of inactivity on Android\nvar timeoutComposition = result.android ? 5000 : -1;\n\neditHandlers.compositionstart = editHandlers.compositionupdate = function (view) {\n if (!view.composing) {\n view.domObserver.flush();\n var state = view.state;\n var $pos = state.selection.$from;\n if (state.selection.empty &&\n (state.storedMarks ||\n (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(function (m) { return m.type.spec.inclusive === false; })))) {\n // Need to wrap the cursor in mark nodes different from the ones in the DOM context\n view.markCursor = view.state.storedMarks || $pos.marks();\n endComposition(view, true);\n view.markCursor = null;\n } else {\n endComposition(view);\n // In firefox, if the cursor is after but outside a marked node,\n // the inserted text won't inherit the marks. So this moves it\n // inside if necessary.\n if (result.gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {\n var sel = view.root.getSelection();\n for (var node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0;) {\n var before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];\n if (!before) { break }\n if (before.nodeType == 3) {\n sel.collapse(before, before.nodeValue.length);\n break\n } else {\n node = before;\n offset = -1;\n }\n }\n }\n }\n view.composing = true;\n }\n scheduleComposeEnd(view, timeoutComposition);\n};\n\neditHandlers.compositionend = function (view, event) {\n if (view.composing) {\n view.composing = false;\n view.compositionEndedAt = event.timeStamp;\n scheduleComposeEnd(view, 20);\n }\n};\n\nfunction scheduleComposeEnd(view, delay) {\n clearTimeout(view.composingTimeout);\n if (delay > -1) { view.composingTimeout = setTimeout(function () { return endComposition(view); }, delay); }\n}\n\nfunction clearComposition(view) {\n view.composing = false;\n while (view.compositionNodes.length > 0) { view.compositionNodes.pop().markParentsDirty(); }\n}\n\nfunction endComposition(view, forceUpdate) {\n view.domObserver.forceFlush();\n clearComposition(view);\n if (forceUpdate || view.docView.dirty) {\n var sel = selectionFromDOM(view);\n if (sel && !sel.eq(view.state.selection)) { view.dispatch(view.state.tr.setSelection(sel)); }\n else { view.updateState(view.state); }\n return true\n }\n return false\n}\n\nfunction captureCopy(view, dom) {\n // The extra wrapper is somehow necessary on IE/Edge to prevent the\n // content from being mangled when it is put onto the clipboard\n if (!view.dom.parentNode) { return }\n var wrap = view.dom.parentNode.appendChild(document.createElement(\"div\"));\n wrap.appendChild(dom);\n wrap.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n var sel = getSelection(), range = document.createRange();\n range.selectNodeContents(dom);\n // Done because IE will fire a selectionchange moving the selection\n // to its start when removeAllRanges is called and the editor still\n // has focus (which will mess up the editor's selection state).\n view.dom.blur();\n sel.removeAllRanges();\n sel.addRange(range);\n setTimeout(function () {\n if (wrap.parentNode) { wrap.parentNode.removeChild(wrap); }\n view.focus();\n }, 50);\n}\n\n// This is very crude, but unfortunately both these browsers _pretend_\n// that they have a clipboard API—all the objects and methods are\n// there, they just don't work, and they are hard to test.\nvar brokenClipboardAPI = (result.ie && result.ie_version < 15) ||\n (result.ios && result.webkit_version < 604);\n\nhandlers.copy = editHandlers.cut = function (view, e) {\n var sel = view.state.selection, cut = e.type == \"cut\";\n if (sel.empty) { return }\n\n // IE and Edge's clipboard interface is completely broken\n var data = brokenClipboardAPI ? null : e.clipboardData;\n var slice = sel.content();\n var ref = serializeForClipboard(view, slice);\n var dom = ref.dom;\n var text = ref.text;\n if (data) {\n e.preventDefault();\n data.clearData();\n data.setData(\"text/html\", dom.innerHTML);\n data.setData(\"text/plain\", text);\n } else {\n captureCopy(view, dom);\n }\n if (cut) { view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\")); }\n};\n\nfunction sliceSingleNode(slice) {\n return slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1 ? slice.content.firstChild : null\n}\n\nfunction capturePaste(view, e) {\n if (!view.dom.parentNode) { return }\n var plainText = view.shiftKey || view.state.selection.$from.parent.type.spec.code;\n var target = view.dom.parentNode.appendChild(document.createElement(plainText ? \"textarea\" : \"div\"));\n if (!plainText) { target.contentEditable = \"true\"; }\n target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n target.focus();\n setTimeout(function () {\n view.focus();\n if (target.parentNode) { target.parentNode.removeChild(target); }\n if (plainText) { doPaste(view, target.value, null, e); }\n else { doPaste(view, target.textContent, target.innerHTML, e); }\n }, 50);\n}\n\nfunction doPaste(view, text, html, e) {\n var slice = parseFromClipboard(view, text, html, view.shiftKey, view.state.selection.$from);\n if (view.someProp(\"handlePaste\", function (f) { return f(view, e, slice || Slice.empty); })) { return true }\n if (!slice) { return false }\n\n var singleNode = sliceSingleNode(slice);\n var tr = singleNode ? view.state.tr.replaceSelectionWith(singleNode, view.shiftKey) : view.state.tr.replaceSelection(slice);\n view.dispatch(tr.scrollIntoView().setMeta(\"paste\", true).setMeta(\"uiEvent\", \"paste\"));\n return true\n}\n\neditHandlers.paste = function (view, e) {\n var data = brokenClipboardAPI ? null : e.clipboardData;\n if (data && doPaste(view, data.getData(\"text/plain\"), data.getData(\"text/html\"), e)) { e.preventDefault(); }\n else { capturePaste(view, e); }\n};\n\nvar Dragging = function Dragging(slice, move) {\n this.slice = slice;\n this.move = move;\n};\n\nvar dragCopyModifier = result.mac ? \"altKey\" : \"ctrlKey\";\n\nhandlers.dragstart = function (view, e) {\n var mouseDown = view.mouseDown;\n if (mouseDown) { mouseDown.done(); }\n if (!e.dataTransfer) { return }\n\n var sel = view.state.selection;\n var pos = sel.empty ? null : view.posAtCoords(eventCoords(e));\n if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1: sel.to)) ; else if (mouseDown && mouseDown.mightDrag) {\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos)));\n } else if (e.target && e.target.nodeType == 1) {\n var desc = view.docView.nearestDesc(e.target, true);\n if (!desc || !desc.node.type.spec.draggable || desc == view.docView) { return }\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, desc.posBefore)));\n }\n var slice = view.state.selection.content();\n var ref = serializeForClipboard(view, slice);\n var dom = ref.dom;\n var text = ref.text;\n e.dataTransfer.clearData();\n e.dataTransfer.setData(brokenClipboardAPI ? \"Text\" : \"text/html\", dom.innerHTML);\n if (!brokenClipboardAPI) { e.dataTransfer.setData(\"text/plain\", text); }\n view.dragging = new Dragging(slice, !e[dragCopyModifier]);\n};\n\nhandlers.dragend = function (view) {\n var dragging = view.dragging;\n window.setTimeout(function () {\n if (view.dragging == dragging) { view.dragging = null; }\n }, 50);\n};\n\neditHandlers.dragover = editHandlers.dragenter = function (_, e) { return e.preventDefault(); };\n\neditHandlers.drop = function (view, e) {\n var dragging = view.dragging;\n view.dragging = null;\n\n if (!e.dataTransfer) { return }\n\n var eventPos = view.posAtCoords(eventCoords(e));\n if (!eventPos) { return }\n var $mouse = view.state.doc.resolve(eventPos.pos);\n if (!$mouse) { return }\n var slice = dragging && dragging.slice ||\n parseFromClipboard(view, e.dataTransfer.getData(brokenClipboardAPI ? \"Text\" : \"text/plain\"),\n brokenClipboardAPI ? null : e.dataTransfer.getData(\"text/html\"), false, $mouse);\n var move = dragging && !e[dragCopyModifier];\n if (view.someProp(\"handleDrop\", function (f) { return f(view, e, slice || Slice.empty, move); })) {\n e.preventDefault();\n return\n }\n if (!slice) { return }\n\n e.preventDefault();\n var insertPos = slice ? dropPoint(view.state.doc, $mouse.pos, slice) : $mouse.pos;\n if (insertPos == null) { insertPos = $mouse.pos; }\n\n var tr = view.state.tr;\n if (move) { tr.deleteSelection(); }\n\n var pos = tr.mapping.map(insertPos);\n var isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1;\n var beforeInsert = tr.doc;\n if (isNode)\n { tr.replaceRangeWith(pos, pos, slice.content.firstChild); }\n else\n { tr.replaceRange(pos, pos, slice); }\n if (tr.doc.eq(beforeInsert)) { return }\n\n var $pos = tr.doc.resolve(pos);\n if (isNode && NodeSelection.isSelectable(slice.content.firstChild) &&\n $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild)) {\n tr.setSelection(new NodeSelection($pos));\n } else {\n var end = tr.mapping.map(insertPos);\n tr.mapping.maps[tr.mapping.maps.length - 1].forEach(function (_from, _to, _newFrom, newTo) { return end = newTo; });\n tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)));\n }\n view.focus();\n view.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n};\n\nhandlers.focus = function (view) {\n if (!view.focused) {\n view.domObserver.stop();\n view.dom.classList.add(\"ProseMirror-focused\");\n view.domObserver.start();\n view.focused = true;\n setTimeout(function () {\n if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.root.getSelection()))\n { selectionToDOM(view); }\n }, 20);\n }\n};\n\nhandlers.blur = function (view) {\n if (view.focused) {\n view.domObserver.stop();\n view.dom.classList.remove(\"ProseMirror-focused\");\n view.domObserver.start();\n view.domObserver.currentSelection.set({});\n view.focused = false;\n }\n};\n\nhandlers.beforeinput = function (view, event) {\n // We should probably do more with beforeinput events, but support\n // is so spotty that I'm still waiting to see where they are going.\n\n // Very specific hack to deal with backspace sometimes failing on\n // Chrome Android when after an uneditable node.\n if (result.chrome && result.android && event.inputType == \"deleteContentBackward\") {\n var domChangeCount = view.domChangeCount;\n setTimeout(function () {\n if (view.domChangeCount != domChangeCount) { return } // Event already had some effect\n // This bug tends to close the virtual keyboard, so we refocus\n view.dom.blur();\n view.focus();\n if (view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(8, \"Backspace\")); })) { return }\n var ref = view.state.selection;\n var $cursor = ref.$cursor;\n // Crude approximation of backspace behavior when no command handled it\n if ($cursor && $cursor.pos > 0) { view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView()); }\n }, 50);\n }\n};\n\n// Make sure all handlers get registered\nfor (var prop in editHandlers) { handlers[prop] = editHandlers[prop]; }\n\nfunction compareObjs(a, b) {\n if (a == b) { return true }\n for (var p in a) { if (a[p] !== b[p]) { return false } }\n for (var p$1 in b) { if (!(p$1 in a)) { return false } }\n return true\n}\n\nvar WidgetType = function WidgetType(toDOM, spec) {\n this.spec = spec || noSpec;\n this.side = this.spec.side || 0;\n this.toDOM = toDOM;\n};\n\nWidgetType.prototype.map = function map (mapping, span, offset, oldOffset) {\n var ref = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1);\n var pos = ref.pos;\n var deleted = ref.deleted;\n return deleted ? null : new Decoration(pos - offset, pos - offset, this)\n};\n\nWidgetType.prototype.valid = function valid () { return true };\n\nWidgetType.prototype.eq = function eq (other) {\n return this == other ||\n (other instanceof WidgetType &&\n (this.spec.key && this.spec.key == other.spec.key ||\n this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)))\n};\n\nvar InlineType = function InlineType(attrs, spec) {\n this.spec = spec || noSpec;\n this.attrs = attrs;\n};\n\nInlineType.prototype.map = function map (mapping, span, offset, oldOffset) {\n var from = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset;\n var to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset;\n return from >= to ? null : new Decoration(from, to, this)\n};\n\nInlineType.prototype.valid = function valid (_, span) { return span.from < span.to };\n\nInlineType.prototype.eq = function eq (other) {\n return this == other ||\n (other instanceof InlineType && compareObjs(this.attrs, other.attrs) &&\n compareObjs(this.spec, other.spec))\n};\n\nInlineType.is = function is (span) { return span.type instanceof InlineType };\n\nvar NodeType = function NodeType(attrs, spec) {\n this.spec = spec || noSpec;\n this.attrs = attrs;\n};\n\nNodeType.prototype.map = function map (mapping, span, offset, oldOffset) {\n var from = mapping.mapResult(span.from + oldOffset, 1);\n if (from.deleted) { return null }\n var to = mapping.mapResult(span.to + oldOffset, -1);\n if (to.deleted || to.pos <= from.pos) { return null }\n return new Decoration(from.pos - offset, to.pos - offset, this)\n};\n\nNodeType.prototype.valid = function valid (node, span) {\n var ref = node.content.findIndex(span.from);\n var index = ref.index;\n var offset = ref.offset;\n return offset == span.from && offset + node.child(index).nodeSize == span.to\n};\n\nNodeType.prototype.eq = function eq (other) {\n return this == other ||\n (other instanceof NodeType && compareObjs(this.attrs, other.attrs) &&\n compareObjs(this.spec, other.spec))\n};\n\n// ::- Decoration objects can be provided to the view through the\n// [`decorations` prop](#view.EditorProps.decorations). They come in\n// several variants—see the static members of this class for details.\nvar Decoration = function Decoration(from, to, type) {\n // :: number\n // The start position of the decoration.\n this.from = from;\n // :: number\n // The end position. Will be the same as `from` for [widget\n // decorations](#view.Decoration^widget).\n this.to = to;\n this.type = type;\n};\n\nvar prototypeAccessors$1 = { spec: { configurable: true },inline: { configurable: true } };\n\nDecoration.prototype.copy = function copy (from, to) {\n return new Decoration(from, to, this.type)\n};\n\nDecoration.prototype.eq = function eq (other, offset) {\n if ( offset === void 0 ) offset = 0;\n\n return this.type.eq(other.type) && this.from + offset == other.from && this.to + offset == other.to\n};\n\nDecoration.prototype.map = function map (mapping, offset, oldOffset) {\n return this.type.map(mapping, this, offset, oldOffset)\n};\n\n// :: (number, union<(view: EditorView, getPos: () → number) → dom.Node, dom.Node>, ?Object) → Decoration\n// Creates a widget decoration, which is a DOM node that's shown in\n// the document at the given position. It is recommended that you\n// delay rendering the widget by passing a function that will be\n// called when the widget is actually drawn in a view, but you can\n// also directly pass a DOM node. `getPos` can be used to find the\n// widget's current document position.\n//\n// spec::- These options are supported:\n//\n// side:: ?number\n// Controls which side of the document position this widget is\n// associated with. When negative, it is drawn before a cursor\n// at its position, and content inserted at that position ends\n// up after the widget. When zero (the default) or positive, the\n// widget is drawn after the cursor and content inserted there\n// ends up before the widget.\n//\n// When there are multiple widgets at a given position, their\n// `side` values determine the order in which they appear. Those\n// with lower values appear first. The ordering of widgets with\n// the same `side` value is unspecified.\n//\n// When `marks` is null, `side` also determines the marks that\n// the widget is wrapped in—those of the node before when\n// negative, those of the node after when positive.\n//\n// marks:: ?[Mark]\n// The precise set of marks to draw around the widget.\n//\n// stopEvent:: ?(event: dom.Event) → bool\n// Can be used to control which DOM events, when they bubble out\n// of this widget, the editor view should ignore.\n//\n// ignoreSelection:: ?bool\n// When set (defaults to false), selection changes inside the\n// widget are ignored, and don't cause ProseMirror to try and\n// re-sync the selection with its selection state.\n//\n// key:: ?string\n// When comparing decorations of this type (in order to decide\n// whether it needs to be redrawn), ProseMirror will by default\n// compare the widget DOM node by identity. If you pass a key,\n// that key will be compared instead, which can be useful when\n// you generate decorations on the fly and don't want to store\n// and reuse DOM nodes. Make sure that any widgets with the same\n// key are interchangeable—if widgets differ in, for example,\n// the behavior of some event handler, they should get\n// different keys.\nDecoration.widget = function widget (pos, toDOM, spec) {\n return new Decoration(pos, pos, new WidgetType(toDOM, spec))\n};\n\n// :: (number, number, DecorationAttrs, ?Object) → Decoration\n// Creates an inline decoration, which adds the given attributes to\n// each inline node between `from` and `to`.\n//\n// spec::- These options are recognized:\n//\n// inclusiveStart:: ?bool\n// Determines how the left side of the decoration is\n// [mapped](#transform.Position_Mapping) when content is\n// inserted directly at that position. By default, the decoration\n// won't include the new content, but you can set this to `true`\n// to make it inclusive.\n//\n// inclusiveEnd:: ?bool\n// Determines how the right side of the decoration is mapped.\n// See\n// [`inclusiveStart`](#view.Decoration^inline^spec.inclusiveStart).\nDecoration.inline = function inline (from, to, attrs, spec) {\n return new Decoration(from, to, new InlineType(attrs, spec))\n};\n\n// :: (number, number, DecorationAttrs, ?Object) → Decoration\n// Creates a node decoration. `from` and `to` should point precisely\n// before and after a node in the document. That node, and only that\n// node, will receive the given attributes.\n//\n// spec::-\n//\n// Optional information to store with the decoration. It\n// is also used when comparing decorators for equality.\nDecoration.node = function node (from, to, attrs, spec) {\n return new Decoration(from, to, new NodeType(attrs, spec))\n};\n\n// :: Object\n// The spec provided when creating this decoration. Can be useful\n// if you've stored extra information in that object.\nprototypeAccessors$1.spec.get = function () { return this.type.spec };\n\nprototypeAccessors$1.inline.get = function () { return this.type instanceof InlineType };\n\nObject.defineProperties( Decoration.prototype, prototypeAccessors$1 );\n\n// DecorationAttrs:: interface\n// A set of attributes to add to a decorated node. Most properties\n// simply directly correspond to DOM attributes of the same name,\n// which will be set to the property's value. These are exceptions:\n//\n// class:: ?string\n// A CSS class name or a space-separated set of class names to be\n// _added_ to the classes that the node already had.\n//\n// style:: ?string\n// A string of CSS to be _added_ to the node's existing `style` property.\n//\n// nodeName:: ?string\n// When non-null, the target node is wrapped in a DOM element of\n// this type (and the other attributes are applied to this element).\n\nvar none = [], noSpec = {};\n\n// ::- A collection of [decorations](#view.Decoration), organized in\n// such a way that the drawing algorithm can efficiently use and\n// compare them. This is a persistent data structure—it is not\n// modified, updates create a new value.\nvar DecorationSet = function DecorationSet(local, children) {\n this.local = local && local.length ? local : none;\n this.children = children && children.length ? children : none;\n};\n\n// :: (Node, [Decoration]) → DecorationSet\n// Create a set of decorations, using the structure of the given\n// document.\nDecorationSet.create = function create (doc, decorations) {\n return decorations.length ? buildTree(decorations, doc, 0, noSpec) : empty\n};\n\n// :: (?number, ?number, ?(spec: Object) → bool) → [Decoration]\n// Find all decorations in this set which touch the given range\n// (including decorations that start or end directly at the\n// boundaries) and match the given predicate on their spec. When\n// `start` and `end` are omitted, all decorations in the set are\n// considered. When `predicate` isn't given, all decorations are\n// assumed to match.\nDecorationSet.prototype.find = function find (start, end, predicate) {\n var result = [];\n this.findInner(start == null ? 0 : start, end == null ? 1e9 : end, result, 0, predicate);\n return result\n};\n\nDecorationSet.prototype.findInner = function findInner (start, end, result, offset, predicate) {\n for (var i = 0; i < this.local.length; i++) {\n var span = this.local[i];\n if (span.from <= end && span.to >= start && (!predicate || predicate(span.spec)))\n { result.push(span.copy(span.from + offset, span.to + offset)); }\n }\n for (var i$1 = 0; i$1 < this.children.length; i$1 += 3) {\n if (this.children[i$1] < end && this.children[i$1 + 1] > start) {\n var childOff = this.children[i$1] + 1;\n this.children[i$1 + 2].findInner(start - childOff, end - childOff, result, offset + childOff, predicate);\n }\n }\n};\n\n// :: (Mapping, Node, ?Object) → DecorationSet\n// Map the set of decorations in response to a change in the\n// document.\n//\n// options::- An optional set of options.\n//\n// onRemove:: ?(decorationSpec: Object)\n// When given, this function will be called for each decoration\n// that gets dropped as a result of the mapping, passing the\n// spec of that decoration.\nDecorationSet.prototype.map = function map (mapping, doc, options) {\n if (this == empty || mapping.maps.length == 0) { return this }\n return this.mapInner(mapping, doc, 0, 0, options || noSpec)\n};\n\nDecorationSet.prototype.mapInner = function mapInner (mapping, node, offset, oldOffset, options) {\n var newLocal;\n for (var i = 0; i < this.local.length; i++) {\n var mapped = this.local[i].map(mapping, offset, oldOffset);\n if (mapped && mapped.type.valid(node, mapped)) { (newLocal || (newLocal = [])).push(mapped); }\n else if (options.onRemove) { options.onRemove(this.local[i].spec); }\n }\n\n if (this.children.length)\n { return mapChildren(this.children, newLocal, mapping, node, offset, oldOffset, options) }\n else\n { return newLocal ? new DecorationSet(newLocal.sort(byPos)) : empty }\n};\n\n// :: (Node, [Decoration]) → DecorationSet\n// Add the given array of decorations to the ones in the set,\n// producing a new set. Needs access to the current document to\n// create the appropriate tree structure.\nDecorationSet.prototype.add = function add (doc, decorations) {\n if (!decorations.length) { return this }\n if (this == empty) { return DecorationSet.create(doc, decorations) }\n return this.addInner(doc, decorations, 0)\n};\n\nDecorationSet.prototype.addInner = function addInner (doc, decorations, offset) {\n var this$1 = this;\n\n var children, childIndex = 0;\n doc.forEach(function (childNode, childOffset) {\n var baseOffset = childOffset + offset, found;\n if (!(found = takeSpansForNode(decorations, childNode, baseOffset))) { return }\n\n if (!children) { children = this$1.children.slice(); }\n while (childIndex < children.length && children[childIndex] < childOffset) { childIndex += 3; }\n if (children[childIndex] == childOffset)\n { children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found, baseOffset + 1); }\n else\n { children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found, childNode, baseOffset + 1, noSpec)); }\n childIndex += 3;\n });\n\n var local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset);\n for (var i = 0; i < local.length; i++) { if (!local[i].type.valid(doc, local[i])) { local.splice(i--, 1); } }\n\n return new DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local,\n children || this.children)\n};\n\n// :: ([Decoration]) → DecorationSet\n// Create a new set that contains the decorations in this set, minus\n// the ones in the given array.\nDecorationSet.prototype.remove = function remove (decorations) {\n if (decorations.length == 0 || this == empty) { return this }\n return this.removeInner(decorations, 0)\n};\n\nDecorationSet.prototype.removeInner = function removeInner (decorations, offset) {\n var children = this.children, local = this.local;\n for (var i = 0; i < children.length; i += 3) {\n var found = (void 0), from = children[i] + offset, to = children[i + 1] + offset;\n for (var j = 0, span = (void 0); j < decorations.length; j++) { if (span = decorations[j]) {\n if (span.from > from && span.to < to) {\n decorations[j] = null\n ;(found || (found = [])).push(span);\n }\n } }\n if (!found) { continue }\n if (children == this.children) { children = this.children.slice(); }\n var removed = children[i + 2].removeInner(found, from + 1);\n if (removed != empty) {\n children[i + 2] = removed;\n } else {\n children.splice(i, 3);\n i -= 3;\n }\n }\n if (local.length) { for (var i$1 = 0, span$1 = (void 0); i$1 < decorations.length; i$1++) { if (span$1 = decorations[i$1]) {\n for (var j$1 = 0; j$1 < local.length; j$1++) { if (local[j$1].eq(span$1, offset)) {\n if (local == this.local) { local = this.local.slice(); }\n local.splice(j$1--, 1);\n } }\n } } }\n if (children == this.children && local == this.local) { return this }\n return local.length || children.length ? new DecorationSet(local, children) : empty\n};\n\nDecorationSet.prototype.forChild = function forChild (offset, node) {\n if (this == empty) { return this }\n if (node.isLeaf) { return DecorationSet.empty }\n\n var child, local;\n for (var i = 0; i < this.children.length; i += 3) { if (this.children[i] >= offset) {\n if (this.children[i] == offset) { child = this.children[i + 2]; }\n break\n } }\n var start = offset + 1, end = start + node.content.size;\n for (var i$1 = 0; i$1 < this.local.length; i$1++) {\n var dec = this.local[i$1];\n if (dec.from < end && dec.to > start && (dec.type instanceof InlineType)) {\n var from = Math.max(start, dec.from) - start, to = Math.min(end, dec.to) - start;\n if (from < to) { (local || (local = [])).push(dec.copy(from, to)); }\n }\n }\n if (local) {\n var localSet = new DecorationSet(local.sort(byPos));\n return child ? new DecorationGroup([localSet, child]) : localSet\n }\n return child || empty\n};\n\nDecorationSet.prototype.eq = function eq (other) {\n if (this == other) { return true }\n if (!(other instanceof DecorationSet) ||\n this.local.length != other.local.length ||\n this.children.length != other.children.length) { return false }\n for (var i = 0; i < this.local.length; i++)\n { if (!this.local[i].eq(other.local[i])) { return false } }\n for (var i$1 = 0; i$1 < this.children.length; i$1 += 3)\n { if (this.children[i$1] != other.children[i$1] ||\n this.children[i$1 + 1] != other.children[i$1 + 1] ||\n !this.children[i$1 + 2].eq(other.children[i$1 + 2])) { return false } }\n return true\n};\n\nDecorationSet.prototype.locals = function locals (node) {\n return removeOverlap(this.localsInner(node))\n};\n\nDecorationSet.prototype.localsInner = function localsInner (node) {\n if (this == empty) { return none }\n if (node.inlineContent || !this.local.some(InlineType.is)) { return this.local }\n var result = [];\n for (var i = 0; i < this.local.length; i++) {\n if (!(this.local[i].type instanceof InlineType))\n { result.push(this.local[i]); }\n }\n return result\n};\n\nvar empty = new DecorationSet();\n\n// :: DecorationSet\n// The empty set of decorations.\nDecorationSet.empty = empty;\n\nDecorationSet.removeOverlap = removeOverlap;\n\n// :- An abstraction that allows the code dealing with decorations to\n// treat multiple DecorationSet objects as if it were a single object\n// with (a subset of) the same interface.\nvar DecorationGroup = function DecorationGroup(members) {\n this.members = members;\n};\n\nDecorationGroup.prototype.forChild = function forChild (offset, child) {\n if (child.isLeaf) { return DecorationSet.empty }\n var found = [];\n for (var i = 0; i < this.members.length; i++) {\n var result = this.members[i].forChild(offset, child);\n if (result == empty) { continue }\n if (result instanceof DecorationGroup) { found = found.concat(result.members); }\n else { found.push(result); }\n }\n return DecorationGroup.from(found)\n};\n\nDecorationGroup.prototype.eq = function eq (other) {\n if (!(other instanceof DecorationGroup) ||\n other.members.length != this.members.length) { return false }\n for (var i = 0; i < this.members.length; i++)\n { if (!this.members[i].eq(other.members[i])) { return false } }\n return true\n};\n\nDecorationGroup.prototype.locals = function locals (node) {\n var result, sorted = true;\n for (var i = 0; i < this.members.length; i++) {\n var locals = this.members[i].localsInner(node);\n if (!locals.length) { continue }\n if (!result) {\n result = locals;\n } else {\n if (sorted) {\n result = result.slice();\n sorted = false;\n }\n for (var j = 0; j < locals.length; j++) { result.push(locals[j]); }\n }\n }\n return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none\n};\n\n// : ([DecorationSet]) → union\n// Create a group for the given array of decoration sets, or return\n// a single set when possible.\nDecorationGroup.from = function from (members) {\n switch (members.length) {\n case 0: return empty\n case 1: return members[0]\n default: return new DecorationGroup(members)\n }\n};\n\nfunction mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {\n var children = oldChildren.slice();\n\n // Mark the children that are directly touched by changes, and\n // move those that are after the changes.\n var shift = function (oldStart, oldEnd, newStart, newEnd) {\n for (var i = 0; i < children.length; i += 3) {\n var end = children[i + 1], dSize = (void 0);\n if (end == -1 || oldStart > end + oldOffset) { continue }\n if (oldEnd >= children[i] + oldOffset) {\n children[i + 1] = -1;\n } else if (newStart >= offset && (dSize = (newEnd - newStart) - (oldEnd - oldStart))) {\n children[i] += dSize;\n children[i + 1] += dSize;\n }\n }\n };\n for (var i = 0; i < mapping.maps.length; i++) { mapping.maps[i].forEach(shift); }\n\n // Find the child nodes that still correspond to a single node,\n // recursively call mapInner on them and update their positions.\n var mustRebuild = false;\n for (var i$1 = 0; i$1 < children.length; i$1 += 3) { if (children[i$1 + 1] == -1) { // Touched nodes\n var from = mapping.map(oldChildren[i$1] + oldOffset), fromLocal = from - offset;\n if (fromLocal < 0 || fromLocal >= node.content.size) {\n mustRebuild = true;\n continue\n }\n // Must read oldChildren because children was tagged with -1\n var to = mapping.map(oldChildren[i$1 + 1] + oldOffset, -1), toLocal = to - offset;\n var ref = node.content.findIndex(fromLocal);\n var index = ref.index;\n var childOffset = ref.offset;\n var childNode = node.maybeChild(index);\n if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) {\n var mapped = children[i$1 + 2].mapInner(mapping, childNode, from + 1, oldChildren[i$1] + oldOffset + 1, options);\n if (mapped != empty) {\n children[i$1] = fromLocal;\n children[i$1 + 1] = toLocal;\n children[i$1 + 2] = mapped;\n } else {\n children[i$1 + 1] = -2;\n mustRebuild = true;\n }\n } else {\n mustRebuild = true;\n }\n } }\n\n // Remaining children must be collected and rebuilt into the appropriate structure\n if (mustRebuild) {\n var decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal || [], mapping,\n offset, oldOffset, options);\n var built = buildTree(decorations, node, 0, options);\n newLocal = built.local;\n for (var i$2 = 0; i$2 < children.length; i$2 += 3) { if (children[i$2 + 1] < 0) {\n children.splice(i$2, 3);\n i$2 -= 3;\n } }\n for (var i$3 = 0, j = 0; i$3 < built.children.length; i$3 += 3) {\n var from$1 = built.children[i$3];\n while (j < children.length && children[j] < from$1) { j += 3; }\n children.splice(j, 0, built.children[i$3], built.children[i$3 + 1], built.children[i$3 + 2]);\n }\n }\n\n return new DecorationSet(newLocal && newLocal.sort(byPos), children)\n}\n\nfunction moveSpans(spans, offset) {\n if (!offset || !spans.length) { return spans }\n var result = [];\n for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n result.push(new Decoration(span.from + offset, span.to + offset, span.type));\n }\n return result\n}\n\nfunction mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset, oldOffset, options) {\n // Gather all decorations from the remaining marked children\n function gather(set, oldOffset) {\n for (var i = 0; i < set.local.length; i++) {\n var mapped = set.local[i].map(mapping, offset, oldOffset);\n if (mapped) { decorations.push(mapped); }\n else if (options.onRemove) { options.onRemove(set.local[i].spec); }\n }\n for (var i$1 = 0; i$1 < set.children.length; i$1 += 3)\n { gather(set.children[i$1 + 2], set.children[i$1] + oldOffset + 1); }\n }\n for (var i = 0; i < children.length; i += 3) { if (children[i + 1] == -1)\n { gather(children[i + 2], oldChildren[i] + oldOffset + 1); } }\n\n return decorations\n}\n\nfunction takeSpansForNode(spans, node, offset) {\n if (node.isLeaf) { return null }\n var end = offset + node.nodeSize, found = null;\n for (var i = 0, span = (void 0); i < spans.length; i++) {\n if ((span = spans[i]) && span.from > offset && span.to < end) {\n(found || (found = [])).push(span);\n spans[i] = null;\n }\n }\n return found\n}\n\nfunction withoutNulls(array) {\n var result = [];\n for (var i = 0; i < array.length; i++)\n { if (array[i] != null) { result.push(array[i]); } }\n return result\n}\n\n// : ([Decoration], Node, number) → DecorationSet\n// Build up a tree that corresponds to a set of decorations. `offset`\n// is a base offset that should be subtractet from the `from` and `to`\n// positions in the spans (so that we don't have to allocate new spans\n// for recursive calls).\nfunction buildTree(spans, node, offset, options) {\n var children = [], hasNulls = false;\n node.forEach(function (childNode, localStart) {\n var found = takeSpansForNode(spans, childNode, localStart + offset);\n if (found) {\n hasNulls = true;\n var subtree = buildTree(found, childNode, offset + localStart + 1, options);\n if (subtree != empty)\n { children.push(localStart, localStart + childNode.nodeSize, subtree); }\n }\n });\n var locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset).sort(byPos);\n for (var i = 0; i < locals.length; i++) { if (!locals[i].type.valid(node, locals[i])) {\n if (options.onRemove) { options.onRemove(locals[i].spec); }\n locals.splice(i--, 1);\n } }\n return locals.length || children.length ? new DecorationSet(locals, children) : empty\n}\n\n// : (Decoration, Decoration) → number\n// Used to sort decorations so that ones with a low start position\n// come first, and within a set with the same start position, those\n// with an smaller end position come first.\nfunction byPos(a, b) {\n return a.from - b.from || a.to - b.to\n}\n\n// : ([Decoration]) → [Decoration]\n// Scan a sorted array of decorations for partially overlapping spans,\n// and split those so that only fully overlapping spans are left (to\n// make subsequent rendering easier). Will return the input array if\n// no partially overlapping spans are found (the common case).\nfunction removeOverlap(spans) {\n var working = spans;\n for (var i = 0; i < working.length - 1; i++) {\n var span = working[i];\n if (span.from != span.to) { for (var j = i + 1; j < working.length; j++) {\n var next = working[j];\n if (next.from == span.from) {\n if (next.to != span.to) {\n if (working == spans) { working = spans.slice(); }\n // Followed by a partially overlapping larger span. Split that\n // span.\n working[j] = next.copy(next.from, span.to);\n insertAhead(working, j + 1, next.copy(span.to, next.to));\n }\n continue\n } else {\n if (next.from < span.to) {\n if (working == spans) { working = spans.slice(); }\n // The end of this one overlaps with a subsequent span. Split\n // this one.\n working[i] = span.copy(span.from, next.from);\n insertAhead(working, j, span.copy(next.from, span.to));\n }\n break\n }\n } }\n }\n return working\n}\n\nfunction insertAhead(array, i, deco) {\n while (i < array.length && byPos(deco, array[i]) > 0) { i++; }\n array.splice(i, 0, deco);\n}\n\n// : (EditorView) → union\n// Get the decorations associated with the current props of a view.\nfunction viewDecorations(view) {\n var found = [];\n view.someProp(\"decorations\", function (f) {\n var result = f(view.state);\n if (result && result != empty) { found.push(result); }\n });\n if (view.cursorWrapper)\n { found.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco])); }\n return DecorationGroup.from(found)\n}\n\n// ::- An editor view manages the DOM structure that represents an\n// editable document. Its state and behavior are determined by its\n// [props](#view.DirectEditorProps).\nvar EditorView = function EditorView(place, props) {\n this._props = props;\n // :: EditorState\n // The view's current [state](#state.EditorState).\n this.state = props.state;\n\n this.dispatch = this.dispatch.bind(this);\n\n this._root = null;\n this.focused = false;\n // Kludge used to work around a Chrome bug\n this.trackWrites = null;\n\n // :: dom.Element\n // An editable DOM node containing the document. (You probably\n // should not directly interfere with its content.)\n this.dom = (place && place.mount) || document.createElement(\"div\");\n if (place) {\n if (place.appendChild) { place.appendChild(this.dom); }\n else if (place.apply) { place(this.dom); }\n else if (place.mount) { this.mounted = true; }\n }\n\n // :: bool\n // Indicates whether the editor is currently [editable](#view.EditorProps.editable).\n this.editable = getEditable(this);\n this.markCursor = null;\n this.cursorWrapper = null;\n updateCursorWrapper(this);\n this.nodeViews = buildNodeViews(this);\n this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this);\n\n this.lastSelectedViewDesc = null;\n // :: ?{slice: Slice, move: bool}\n // When editor content is being dragged, this object contains\n // information about the dragged slice and whether it is being\n // copied or moved. At any other time, it is null.\n this.dragging = null;\n\n initInput(this);\n\n this.pluginViews = [];\n this.updatePluginViews();\n};\n\nvar prototypeAccessors$2 = { props: { configurable: true },root: { configurable: true } };\n\n// composing:: boolean\n// Holds `true` when a\n// [composition](https://developer.mozilla.org/en-US/docs/Mozilla/IME_handling_guide)\n// is active.\n\n// :: DirectEditorProps\n// The view's current [props](#view.EditorProps).\nprototypeAccessors$2.props.get = function () {\n if (this._props.state != this.state) {\n var prev = this._props;\n this._props = {};\n for (var name in prev) { this._props[name] = prev[name]; }\n this._props.state = this.state;\n }\n return this._props\n};\n\n// :: (DirectEditorProps)\n// Update the view's props. Will immediately cause an update to\n// the DOM.\nEditorView.prototype.update = function update (props) {\n if (props.handleDOMEvents != this._props.handleDOMEvents) { ensureListeners(this); }\n this._props = props;\n this.updateStateInner(props.state, true);\n};\n\n// :: (DirectEditorProps)\n// Update the view by updating existing props object with the object\n// given as argument. Equivalent to `view.update(Object.assign({},\n// view.props, props))`.\nEditorView.prototype.setProps = function setProps (props) {\n var updated = {};\n for (var name in this._props) { updated[name] = this._props[name]; }\n updated.state = this.state;\n for (var name$1 in props) { updated[name$1] = props[name$1]; }\n this.update(updated);\n};\n\n// :: (EditorState)\n// Update the editor's `state` prop, without touching any of the\n// other props.\nEditorView.prototype.updateState = function updateState (state) {\n this.updateStateInner(state, this.state.plugins != state.plugins);\n};\n\nEditorView.prototype.updateStateInner = function updateStateInner (state, reconfigured) {\n var this$1 = this;\n\n var prev = this.state, redraw = false, updateSel = false;\n // When stored marks are added, stop composition, so that they can\n // be displayed.\n if (state.storedMarks && this.composing) {\n clearComposition(this);\n updateSel = true;\n }\n this.state = state;\n if (reconfigured) {\n var nodeViews = buildNodeViews(this);\n if (changedNodeViews(nodeViews, this.nodeViews)) {\n this.nodeViews = nodeViews;\n redraw = true;\n }\n ensureListeners(this);\n }\n\n this.editable = getEditable(this);\n updateCursorWrapper(this);\n var innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this);\n\n var scroll = reconfigured ? \"reset\"\n : state.scrollToSelection > prev.scrollToSelection ? \"to selection\" : \"preserve\";\n var updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco);\n if (updateDoc || !state.selection.eq(prev.selection)) { updateSel = true; }\n var oldScrollPos = scroll == \"preserve\" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this);\n\n if (updateSel) {\n this.domObserver.stop();\n // Work around an issue in Chrome, IE, and Edge where changing\n // the DOM around an active selection puts it into a broken\n // state where the thing the user sees differs from the\n // selection reported by the Selection object (#710, #973,\n // #1011, #1013, #1035).\n var forceSelUpdate = updateDoc && (result.ie || result.chrome) && !this.composing &&\n !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection);\n if (updateDoc) {\n // If the node that the selection points into is written to,\n // Chrome sometimes starts misreporting the selection, so this\n // tracks that and forces a selection reset when our update\n // did write to the node.\n var chromeKludge = result.chrome ? (this.trackWrites = this.root.getSelection().focusNode) : null;\n if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) {\n this.docView.updateOuterDeco([]);\n this.docView.destroy();\n this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this);\n }\n if (chromeKludge && !this.trackWrites) { forceSelUpdate = true; }\n }\n // Work around for an issue where an update arriving right between\n // a DOM selection change and the \"selectionchange\" event for it\n // can cause a spurious DOM selection update, disrupting mouse\n // drag selection.\n if (forceSelUpdate ||\n !(this.mouseDown && this.domObserver.currentSelection.eq(this.root.getSelection()) && anchorInRightPlace(this))) {\n selectionToDOM(this, forceSelUpdate);\n } else {\n syncNodeSelection(this, state.selection);\n this.domObserver.setCurSelection();\n }\n this.domObserver.start();\n }\n\n this.updatePluginViews(prev);\n\n if (scroll == \"reset\") {\n this.dom.scrollTop = 0;\n } else if (scroll == \"to selection\") {\n var startDOM = this.root.getSelection().focusNode;\n if (this.someProp(\"handleScrollToSelection\", function (f) { return f(this$1); }))\n ; // Handled\n else if (state.selection instanceof NodeSelection)\n { scrollRectIntoView(this, this.docView.domAfterPos(state.selection.from).getBoundingClientRect(), startDOM); }\n else\n { scrollRectIntoView(this, this.coordsAtPos(state.selection.head, 1), startDOM); }\n } else if (oldScrollPos) {\n resetScrollPos(oldScrollPos);\n }\n};\n\nEditorView.prototype.destroyPluginViews = function destroyPluginViews () {\n var view;\n while (view = this.pluginViews.pop()) { if (view.destroy) { view.destroy(); } }\n};\n\nEditorView.prototype.updatePluginViews = function updatePluginViews (prevState) {\n if (!prevState || prevState.plugins != this.state.plugins) {\n this.destroyPluginViews();\n for (var i = 0; i < this.state.plugins.length; i++) {\n var plugin = this.state.plugins[i];\n if (plugin.spec.view) { this.pluginViews.push(plugin.spec.view(this)); }\n }\n } else {\n for (var i$1 = 0; i$1 < this.pluginViews.length; i$1++) {\n var pluginView = this.pluginViews[i$1];\n if (pluginView.update) { pluginView.update(this, prevState); }\n }\n }\n};\n\n// :: (string, ?(prop: *) → *) → *\n// Goes over the values of a prop, first those provided directly,\n// then those from plugins (in order), and calls `f` every time a\n// non-undefined value is found. When `f` returns a truthy value,\n// that is immediately returned. When `f` isn't provided, it is\n// treated as the identity function (the prop value is returned\n// directly).\nEditorView.prototype.someProp = function someProp (propName, f) {\n var prop = this._props && this._props[propName], value;\n if (prop != null && (value = f ? f(prop) : prop)) { return value }\n var plugins = this.state.plugins;\n if (plugins) { for (var i = 0; i < plugins.length; i++) {\n var prop$1 = plugins[i].props[propName];\n if (prop$1 != null && (value = f ? f(prop$1) : prop$1)) { return value }\n } }\n};\n\n// :: () → bool\n// Query whether the view has focus.\nEditorView.prototype.hasFocus = function hasFocus () {\n return this.root.activeElement == this.dom\n};\n\n// :: ()\n// Focus the editor.\nEditorView.prototype.focus = function focus () {\n this.domObserver.stop();\n if (this.editable) { focusPreventScroll(this.dom); }\n selectionToDOM(this);\n this.domObserver.start();\n};\n\n// :: union\n// Get the document root in which the editor exists. This will\n// usually be the top-level `document`, but might be a [shadow\n// DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM)\n// root if the editor is inside one.\nprototypeAccessors$2.root.get = function () {\n var cached = this._root;\n if (cached == null) { for (var search = this.dom.parentNode; search; search = search.parentNode) {\n if (search.nodeType == 9 || (search.nodeType == 11 && search.host)) {\n if (!search.getSelection) { Object.getPrototypeOf(search).getSelection = function () { return document.getSelection(); }; }\n return this._root = search\n }\n } }\n return cached || document\n};\n\n// :: ({left: number, top: number}) → ?{pos: number, inside: number}\n// Given a pair of viewport coordinates, return the document\n// position that corresponds to them. May return null if the given\n// coordinates aren't inside of the editor. When an object is\n// returned, its `pos` property is the position nearest to the\n// coordinates, and its `inside` property holds the position of the\n// inner node that the position falls inside of, or -1 if it is at\n// the top level, not in any node.\nEditorView.prototype.posAtCoords = function posAtCoords$1 (coords) {\n return posAtCoords(this, coords)\n};\n\n// :: (number, number) → {left: number, right: number, top: number, bottom: number}\n// Returns the viewport rectangle at a given document position.\n// `left` and `right` will be the same number, as this returns a\n// flat cursor-ish rectangle. If the position is between two things\n// that aren't directly adjacent, `side` determines which element is\n// used. When < 0, the element before the position is used,\n// otherwise the element after.\nEditorView.prototype.coordsAtPos = function coordsAtPos$1 (pos, side) {\n if ( side === void 0 ) side = 1;\n\n return coordsAtPos(this, pos, side)\n};\n\n// :: (number, number) → {node: dom.Node, offset: number}\n// Find the DOM position that corresponds to the given document\n// position. When `side` is negative, find the position as close as\n// possible to the content before the position. When positive,\n// prefer positions close to the content after the position. When\n// zero, prefer as shallow a position as possible.\n//\n// Note that you should **not** mutate the editor's internal DOM,\n// only inspect it (and even that is usually not necessary).\nEditorView.prototype.domAtPos = function domAtPos (pos, side) {\n if ( side === void 0 ) side = 0;\n\n return this.docView.domFromPos(pos, side)\n};\n\n// :: (number) → ?dom.Node\n// Find the DOM node that represents the document node after the\n// given position. May return `null` when the position doesn't point\n// in front of a node or if the node is inside an opaque node view.\n//\n// This is intended to be able to call things like\n// `getBoundingClientRect` on that DOM node. Do **not** mutate the\n// editor DOM directly, or add styling this way, since that will be\n// immediately overriden by the editor as it redraws the node.\nEditorView.prototype.nodeDOM = function nodeDOM (pos) {\n var desc = this.docView.descAt(pos);\n return desc ? desc.nodeDOM : null\n};\n\n// :: (dom.Node, number, ?number) → number\n// Find the document position that corresponds to a given DOM\n// position. (Whenever possible, it is preferable to inspect the\n// document structure directly, rather than poking around in the\n// DOM, but sometimes—for example when interpreting an event\n// target—you don't have a choice.)\n//\n// The `bias` parameter can be used to influence which side of a DOM\n// node to use when the position is inside a leaf node.\nEditorView.prototype.posAtDOM = function posAtDOM (node, offset, bias) {\n if ( bias === void 0 ) bias = -1;\n\n var pos = this.docView.posFromDOM(node, offset, bias);\n if (pos == null) { throw new RangeError(\"DOM position not inside the editor\") }\n return pos\n};\n\n// :: (union<\"up\", \"down\", \"left\", \"right\", \"forward\", \"backward\">, ?EditorState) → bool\n// Find out whether the selection is at the end of a textblock when\n// moving in a given direction. When, for example, given `\"left\"`,\n// it will return true if moving left from the current cursor\n// position would leave that position's parent textblock. Will apply\n// to the view's current state by default, but it is possible to\n// pass a different state.\nEditorView.prototype.endOfTextblock = function endOfTextblock$1 (dir, state) {\n return endOfTextblock(this, state || this.state, dir)\n};\n\n// :: ()\n// Removes the editor from the DOM and destroys all [node\n// views](#view.NodeView).\nEditorView.prototype.destroy = function destroy () {\n if (!this.docView) { return }\n destroyInput(this);\n this.destroyPluginViews();\n if (this.mounted) {\n this.docView.update(this.state.doc, [], viewDecorations(this), this);\n this.dom.textContent = \"\";\n } else if (this.dom.parentNode) {\n this.dom.parentNode.removeChild(this.dom);\n }\n this.docView.destroy();\n this.docView = null;\n};\n\n// Used for testing.\nEditorView.prototype.dispatchEvent = function dispatchEvent$1 (event) {\n return dispatchEvent(this, event)\n};\n\n// :: (Transaction)\n// Dispatch a transaction. Will call\n// [`dispatchTransaction`](#view.DirectEditorProps.dispatchTransaction)\n// when given, and otherwise defaults to applying the transaction to\n// the current state and calling\n// [`updateState`](#view.EditorView.updateState) with the result.\n// This method is bound to the view instance, so that it can be\n// easily passed around.\nEditorView.prototype.dispatch = function dispatch (tr) {\n var dispatchTransaction = this._props.dispatchTransaction;\n if (dispatchTransaction) { dispatchTransaction.call(this, tr); }\n else { this.updateState(this.state.apply(tr)); }\n};\n\nObject.defineProperties( EditorView.prototype, prototypeAccessors$2 );\n\nfunction computeDocDeco(view) {\n var attrs = Object.create(null);\n attrs.class = \"ProseMirror\";\n attrs.contenteditable = String(view.editable);\n\n view.someProp(\"attributes\", function (value) {\n if (typeof value == \"function\") { value = value(view.state); }\n if (value) { for (var attr in value) {\n if (attr == \"class\")\n { attrs.class += \" \" + value[attr]; }\n else if (!attrs[attr] && attr != \"contenteditable\" && attr != \"nodeName\")\n { attrs[attr] = String(value[attr]); }\n } }\n });\n\n return [Decoration.node(0, view.state.doc.content.size, attrs)]\n}\n\nfunction updateCursorWrapper(view) {\n if (view.markCursor) {\n var dom = document.createElement(\"img\");\n dom.setAttribute(\"mark-placeholder\", \"true\");\n view.cursorWrapper = {dom: dom, deco: Decoration.widget(view.state.selection.head, dom, {raw: true, marks: view.markCursor})};\n } else {\n view.cursorWrapper = null;\n }\n}\n\nfunction getEditable(view) {\n return !view.someProp(\"editable\", function (value) { return value(view.state) === false; })\n}\n\nfunction selectionContextChanged(sel1, sel2) {\n var depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head));\n return sel1.$anchor.start(depth) != sel2.$anchor.start(depth)\n}\n\nfunction buildNodeViews(view) {\n var result = {};\n view.someProp(\"nodeViews\", function (obj) {\n for (var prop in obj) { if (!Object.prototype.hasOwnProperty.call(result, prop))\n { result[prop] = obj[prop]; } }\n });\n return result\n}\n\nfunction changedNodeViews(a, b) {\n var nA = 0, nB = 0;\n for (var prop in a) {\n if (a[prop] != b[prop]) { return true }\n nA++;\n }\n for (var _ in b) { nB++; }\n return nA != nB\n}\n\n// EditorProps:: interface\n//\n// Props are configuration values that can be passed to an editor view\n// or included in a plugin. This interface lists the supported props.\n//\n// The various event-handling functions may all return `true` to\n// indicate that they handled the given event. The view will then take\n// care to call `preventDefault` on the event, except with\n// `handleDOMEvents`, where the handler itself is responsible for that.\n//\n// How a prop is resolved depends on the prop. Handler functions are\n// called one at a time, starting with the base props and then\n// searching through the plugins (in order of appearance) until one of\n// them returns true. For some props, the first plugin that yields a\n// value gets precedence.\n//\n// handleDOMEvents:: ?Object<(view: EditorView, event: dom.Event) → bool>\n// Can be an object mapping DOM event type names to functions that\n// handle them. Such functions will be called before any handling\n// ProseMirror does of events fired on the editable DOM element.\n// Contrary to the other event handling props, when returning true\n// from such a function, you are responsible for calling\n// `preventDefault` yourself (or not, if you want to allow the\n// default behavior).\n//\n// handleKeyDown:: ?(view: EditorView, event: dom.KeyboardEvent) → bool\n// Called when the editor receives a `keydown` event.\n//\n// handleKeyPress:: ?(view: EditorView, event: dom.KeyboardEvent) → bool\n// Handler for `keypress` events.\n//\n// handleTextInput:: ?(view: EditorView, from: number, to: number, text: string) → bool\n// Whenever the user directly input text, this handler is called\n// before the input is applied. If it returns `true`, the default\n// behavior of actually inserting the text is suppressed.\n//\n// handleClickOn:: ?(view: EditorView, pos: number, node: Node, nodePos: number, event: dom.MouseEvent, direct: bool) → bool\n// Called for each node around a click, from the inside out. The\n// `direct` flag will be true for the inner node.\n//\n// handleClick:: ?(view: EditorView, pos: number, event: dom.MouseEvent) → bool\n// Called when the editor is clicked, after `handleClickOn` handlers\n// have been called.\n//\n// handleDoubleClickOn:: ?(view: EditorView, pos: number, node: Node, nodePos: number, event: dom.MouseEvent, direct: bool) → bool\n// Called for each node around a double click.\n//\n// handleDoubleClick:: ?(view: EditorView, pos: number, event: dom.MouseEvent) → bool\n// Called when the editor is double-clicked, after `handleDoubleClickOn`.\n//\n// handleTripleClickOn:: ?(view: EditorView, pos: number, node: Node, nodePos: number, event: dom.MouseEvent, direct: bool) → bool\n// Called for each node around a triple click.\n//\n// handleTripleClick:: ?(view: EditorView, pos: number, event: dom.MouseEvent) → bool\n// Called when the editor is triple-clicked, after `handleTripleClickOn`.\n//\n// handlePaste:: ?(view: EditorView, event: dom.ClipboardEvent, slice: Slice) → bool\n// Can be used to override the behavior of pasting. `slice` is the\n// pasted content parsed by the editor, but you can directly access\n// the event to get at the raw content.\n//\n// handleDrop:: ?(view: EditorView, event: dom.Event, slice: Slice, moved: bool) → bool\n// Called when something is dropped on the editor. `moved` will be\n// true if this drop moves from the current selection (which should\n// thus be deleted).\n//\n// handleScrollToSelection:: ?(view: EditorView) → bool\n// Called when the view, after updating its state, tries to scroll\n// the selection into view. A handler function may return false to\n// indicate that it did not handle the scrolling and further\n// handlers or the default behavior should be tried.\n//\n// createSelectionBetween:: ?(view: EditorView, anchor: ResolvedPos, head: ResolvedPos) → ?Selection\n// Can be used to override the way a selection is created when\n// reading a DOM selection between the given anchor and head.\n//\n// domParser:: ?DOMParser\n// The [parser](#model.DOMParser) to use when reading editor changes\n// from the DOM. Defaults to calling\n// [`DOMParser.fromSchema`](#model.DOMParser^fromSchema) on the\n// editor's schema.\n//\n// transformPastedHTML:: ?(html: string) → string\n// Can be used to transform pasted HTML text, _before_ it is parsed,\n// for example to clean it up.\n//\n// clipboardParser:: ?DOMParser\n// The [parser](#model.DOMParser) to use when reading content from\n// the clipboard. When not given, the value of the\n// [`domParser`](#view.EditorProps.domParser) prop is used.\n//\n// transformPastedText:: ?(text: string, plain: bool) → string\n// Transform pasted plain text. The `plain` flag will be true when\n// the text is pasted as plain text.\n//\n// clipboardTextParser:: ?(text: string, $context: ResolvedPos, plain: bool) → Slice\n// A function to parse text from the clipboard into a document\n// slice. Called after\n// [`transformPastedText`](#view.EditorProps.transformPastedText).\n// The default behavior is to split the text into lines, wrap them\n// in `

      ` tags, and call\n// [`clipboardParser`](#view.EditorProps.clipboardParser) on it.\n// The `plain` flag will be true when the text is pasted as plain text.\n//\n// transformPasted:: ?(Slice) → Slice\n// Can be used to transform pasted content before it is applied to\n// the document.\n//\n// nodeViews:: ?Object<(node: Node, view: EditorView, getPos: () → number, decorations: [Decoration]) → NodeView>\n// Allows you to pass custom rendering and behavior logic for nodes\n// and marks. Should map node and mark names to constructor\n// functions that produce a [`NodeView`](#view.NodeView) object\n// implementing the node's display behavior. For nodes, the third\n// argument `getPos` is a function that can be called to get the\n// node's current position, which can be useful when creating\n// transactions to update it. For marks, the third argument is a\n// boolean that indicates whether the mark's content is inline.\n//\n// `decorations` is an array of node or inline decorations that are\n// active around the node. They are automatically drawn in the\n// normal way, and you will usually just want to ignore this, but\n// they can also be used as a way to provide context information to\n// the node view without adding it to the document itself.\n//\n// clipboardSerializer:: ?DOMSerializer\n// The DOM serializer to use when putting content onto the\n// clipboard. If not given, the result of\n// [`DOMSerializer.fromSchema`](#model.DOMSerializer^fromSchema)\n// will be used.\n//\n// clipboardTextSerializer:: ?(Slice) → string\n// A function that will be called to get the text for the current\n// selection when copying text to the clipboard. By default, the\n// editor will use [`textBetween`](#model.Node.textBetween) on the\n// selected range.\n//\n// decorations:: ?(state: EditorState) → ?DecorationSet\n// A set of [document decorations](#view.Decoration) to show in the\n// view.\n//\n// editable:: ?(state: EditorState) → bool\n// When this returns false, the content of the view is not directly\n// editable.\n//\n// attributes:: ?union, (EditorState) → ?Object>\n// Control the DOM attributes of the editable element. May be either\n// an object or a function going from an editor state to an object.\n// By default, the element will get a class `\"ProseMirror\"`, and\n// will have its `contentEditable` attribute determined by the\n// [`editable` prop](#view.EditorProps.editable). Additional classes\n// provided here will be added to the class. For other attributes,\n// the value provided first (as in\n// [`someProp`](#view.EditorView.someProp)) will be used.\n//\n// scrollThreshold:: ?union\n// Determines the distance (in pixels) between the cursor and the\n// end of the visible viewport at which point, when scrolling the\n// cursor into view, scrolling takes place. Defaults to 0.\n//\n// scrollMargin:: ?union\n// Determines the extra space (in pixels) that is left above or\n// below the cursor when it is scrolled into view. Defaults to 5.\n\n// DirectEditorProps:: interface extends EditorProps\n//\n// The props object given directly to the editor view supports two\n// fields that can't be used in plugins:\n//\n// state:: EditorState\n// The current state of the editor.\n//\n// dispatchTransaction:: ?(tr: Transaction)\n// The callback over which to send transactions (state updates)\n// produced by the view. If you specify this, you probably want to\n// make sure this ends up calling the view's\n// [`updateState`](#view.EditorView.updateState) method with a new\n// state that has the transaction\n// [applied](#state.EditorState.apply). The callback will be bound to have\n// the view instance as its `this` binding.\n\nexport { Decoration, DecorationSet, EditorView, endComposition as __endComposition, parseFromClipboard as __parseFromClipboard, serializeForClipboard as __serializeForClipboard };\n//# sourceMappingURL=index.es.js.map\n","import { Plugin } from 'prosemirror-state';\nimport { dropPoint } from 'prosemirror-transform';\n\n// :: (options: ?Object) → Plugin\n// Create a plugin that, when added to a ProseMirror instance,\n// causes a decoration to show up at the drop position when something\n// is dragged over the editor.\n//\n// options::- These options are supported:\n//\n// color:: ?string\n// The color of the cursor. Defaults to `black`.\n//\n// width:: ?number\n// The precise width of the cursor in pixels. Defaults to 1.\n//\n// class:: ?string\n// A CSS class name to add to the cursor element.\nfunction dropCursor(options) {\n if ( options === void 0 ) options = {};\n\n return new Plugin({\n view: function view(editorView) { return new DropCursorView(editorView, options) }\n })\n}\n\nvar DropCursorView = function DropCursorView(editorView, options) {\n var this$1 = this;\n\n this.editorView = editorView;\n this.width = options.width || 1;\n this.color = options.color || \"black\";\n this.class = options.class;\n this.cursorPos = null;\n this.element = null;\n this.timeout = null;\n\n this.handlers = [\"dragover\", \"dragend\", \"drop\", \"dragleave\"].map(function (name) {\n var handler = function (e) { return this$1[name](e); };\n editorView.dom.addEventListener(name, handler);\n return {name: name, handler: handler}\n });\n};\n\nDropCursorView.prototype.destroy = function destroy () {\n var this$1 = this;\n\n this.handlers.forEach(function (ref) {\n var name = ref.name;\n var handler = ref.handler;\n\n return this$1.editorView.dom.removeEventListener(name, handler);\n });\n};\n\nDropCursorView.prototype.update = function update (editorView, prevState) {\n if (this.cursorPos != null && prevState.doc != editorView.state.doc) { this.updateOverlay(); }\n};\n\nDropCursorView.prototype.setCursor = function setCursor (pos) {\n if (pos == this.cursorPos) { return }\n this.cursorPos = pos;\n if (pos == null) {\n this.element.parentNode.removeChild(this.element);\n this.element = null;\n } else {\n this.updateOverlay();\n }\n};\n\nDropCursorView.prototype.updateOverlay = function updateOverlay () {\n var $pos = this.editorView.state.doc.resolve(this.cursorPos), rect;\n if (!$pos.parent.inlineContent) {\n var before = $pos.nodeBefore, after = $pos.nodeAfter;\n if (before || after) {\n var nodeRect = this.editorView.nodeDOM(this.cursorPos - (before ?before.nodeSize : 0)).getBoundingClientRect();\n var top = before ? nodeRect.bottom : nodeRect.top;\n if (before && after)\n { top = (top + this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top) / 2; }\n rect = {left: nodeRect.left, right: nodeRect.right, top: top - this.width / 2, bottom: top + this.width / 2};\n }\n }\n if (!rect) {\n var coords = this.editorView.coordsAtPos(this.cursorPos);\n rect = {left: coords.left - this.width / 2, right: coords.left + this.width / 2, top: coords.top, bottom: coords.bottom};\n }\n\n var parent = this.editorView.dom.offsetParent;\n if (!this.element) {\n this.element = parent.appendChild(document.createElement(\"div\"));\n if (this.class) { this.element.className = this.class; }\n this.element.style.cssText = \"position: absolute; z-index: 50; pointer-events: none; background-color: \" + this.color;\n }\n var parentLeft, parentTop;\n if (!parent || parent == document.body && getComputedStyle(parent).position == \"static\") {\n parentLeft = -pageXOffset;\n parentTop = -pageYOffset;\n } else {\n var rect$1 = parent.getBoundingClientRect();\n parentLeft = rect$1.left - parent.scrollLeft;\n parentTop = rect$1.top - parent.scrollTop;\n }\n this.element.style.left = (rect.left - parentLeft) + \"px\";\n this.element.style.top = (rect.top - parentTop) + \"px\";\n this.element.style.width = (rect.right - rect.left) + \"px\";\n this.element.style.height = (rect.bottom - rect.top) + \"px\";\n};\n\nDropCursorView.prototype.scheduleRemoval = function scheduleRemoval (timeout) {\n var this$1 = this;\n\n clearTimeout(this.timeout);\n this.timeout = setTimeout(function () { return this$1.setCursor(null); }, timeout);\n};\n\nDropCursorView.prototype.dragover = function dragover (event) {\n if (!this.editorView.editable) { return }\n var pos = this.editorView.posAtCoords({left: event.clientX, top: event.clientY});\n if (pos) {\n var target = pos.pos;\n if (this.editorView.dragging && this.editorView.dragging.slice) {\n target = dropPoint(this.editorView.state.doc, target, this.editorView.dragging.slice);\n if (target == null) { target = pos.pos; }\n }\n this.setCursor(target);\n this.scheduleRemoval(5000);\n }\n};\n\nDropCursorView.prototype.dragend = function dragend () {\n this.scheduleRemoval(20);\n};\n\nDropCursorView.prototype.drop = function drop () {\n this.scheduleRemoval(20);\n};\n\nDropCursorView.prototype.dragleave = function dragleave (event) {\n if (event.target == this.editorView.dom || !this.editorView.dom.contains(event.relatedTarget))\n { this.setCursor(null); }\n};\n\nexport { dropCursor };\n//# sourceMappingURL=index.es.js.map\n","import { keydownHandler } from 'prosemirror-keymap';\nimport { NodeSelection, Selection, Plugin, TextSelection } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Slice } from 'prosemirror-model';\n\n// ::- Gap cursor selections are represented using this class. Its\n// `$anchor` and `$head` properties both point at the cursor position.\nvar GapCursor = /*@__PURE__*/(function (Selection) {\n function GapCursor($pos) {\n Selection.call(this, $pos, $pos);\n }\n\n if ( Selection ) GapCursor.__proto__ = Selection;\n GapCursor.prototype = Object.create( Selection && Selection.prototype );\n GapCursor.prototype.constructor = GapCursor;\n\n GapCursor.prototype.map = function map (doc, mapping) {\n var $pos = doc.resolve(mapping.map(this.head));\n return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos)\n };\n\n GapCursor.prototype.content = function content () { return Slice.empty };\n\n GapCursor.prototype.eq = function eq (other) {\n return other instanceof GapCursor && other.head == this.head\n };\n\n GapCursor.prototype.toJSON = function toJSON () {\n return {type: \"gapcursor\", pos: this.head}\n };\n\n GapCursor.fromJSON = function fromJSON (doc, json) {\n if (typeof json.pos != \"number\") { throw new RangeError(\"Invalid input for GapCursor.fromJSON\") }\n return new GapCursor(doc.resolve(json.pos))\n };\n\n GapCursor.prototype.getBookmark = function getBookmark () { return new GapBookmark(this.anchor) };\n\n GapCursor.valid = function valid ($pos) {\n var parent = $pos.parent;\n if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos)) { return false }\n var override = parent.type.spec.allowGapCursor;\n if (override != null) { return override }\n var deflt = parent.contentMatchAt($pos.index()).defaultType;\n return deflt && deflt.isTextblock\n };\n\n GapCursor.findFrom = function findFrom ($pos, dir, mustMove) {\n search: for (;;) {\n if (!mustMove && GapCursor.valid($pos)) { return $pos }\n var pos = $pos.pos, next = null;\n // Scan up from this position\n for (var d = $pos.depth;; d--) {\n var parent = $pos.node(d);\n if (dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0) {\n next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1);\n break\n } else if (d == 0) {\n return null\n }\n pos += dir;\n var $cur = $pos.doc.resolve(pos);\n if (GapCursor.valid($cur)) { return $cur }\n }\n\n // And then down into the next node\n for (;;) {\n var inside = dir > 0 ? next.firstChild : next.lastChild;\n if (!inside) {\n if (next.isAtom && !next.isText && !NodeSelection.isSelectable(next)) {\n $pos = $pos.doc.resolve(pos + next.nodeSize * dir);\n mustMove = false;\n continue search\n }\n break\n }\n next = inside;\n pos += dir;\n var $cur$1 = $pos.doc.resolve(pos);\n if (GapCursor.valid($cur$1)) { return $cur$1 }\n }\n\n return null\n }\n };\n\n return GapCursor;\n}(Selection));\n\nGapCursor.prototype.visible = false;\n\nSelection.jsonID(\"gapcursor\", GapCursor);\n\nvar GapBookmark = function GapBookmark(pos) {\n this.pos = pos;\n};\nGapBookmark.prototype.map = function map (mapping) {\n return new GapBookmark(mapping.map(this.pos))\n};\nGapBookmark.prototype.resolve = function resolve (doc) {\n var $pos = doc.resolve(this.pos);\n return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos)\n};\n\nfunction closedBefore($pos) {\n for (var d = $pos.depth; d >= 0; d--) {\n var index = $pos.index(d);\n // At the start of this parent, look at next one\n if (index == 0) { continue }\n // See if the node before (or its first ancestor) is closed\n for (var before = $pos.node(d).child(index - 1);; before = before.lastChild) {\n if ((before.childCount == 0 && !before.inlineContent) || before.isAtom || before.type.spec.isolating) { return true }\n if (before.inlineContent) { return false }\n }\n }\n // Hit start of document\n return true\n}\n\nfunction closedAfter($pos) {\n for (var d = $pos.depth; d >= 0; d--) {\n var index = $pos.indexAfter(d), parent = $pos.node(d);\n if (index == parent.childCount) { continue }\n for (var after = parent.child(index);; after = after.firstChild) {\n if ((after.childCount == 0 && !after.inlineContent) || after.isAtom || after.type.spec.isolating) { return true }\n if (after.inlineContent) { return false }\n }\n }\n return true\n}\n\n// :: () → Plugin\n// Create a gap cursor plugin. When enabled, this will capture clicks\n// near and arrow-key-motion past places that don't have a normally\n// selectable position nearby, and create a gap cursor selection for\n// them. The cursor is drawn as an element with class\n// `ProseMirror-gapcursor`. You can either include\n// `style/gapcursor.css` from the package's directory or add your own\n// styles to make it visible.\nvar gapCursor = function() {\n return new Plugin({\n props: {\n decorations: drawGapCursor,\n\n createSelectionBetween: function createSelectionBetween(_view, $anchor, $head) {\n if ($anchor.pos == $head.pos && GapCursor.valid($head)) { return new GapCursor($head) }\n },\n\n handleClick: handleClick,\n handleKeyDown: handleKeyDown\n }\n })\n};\n\nvar handleKeyDown = keydownHandler({\n \"ArrowLeft\": arrow(\"horiz\", -1),\n \"ArrowRight\": arrow(\"horiz\", 1),\n \"ArrowUp\": arrow(\"vert\", -1),\n \"ArrowDown\": arrow(\"vert\", 1)\n});\n\nfunction arrow(axis, dir) {\n var dirStr = axis == \"vert\" ? (dir > 0 ? \"down\" : \"up\") : (dir > 0 ? \"right\" : \"left\");\n return function(state, dispatch, view) {\n var sel = state.selection;\n var $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty;\n if (sel instanceof TextSelection) {\n if (!view.endOfTextblock(dirStr) || $start.depth == 0) { return false }\n mustMove = false;\n $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before());\n }\n var $found = GapCursor.findFrom($start, dir, mustMove);\n if (!$found) { return false }\n if (dispatch) { dispatch(state.tr.setSelection(new GapCursor($found))); }\n return true\n }\n}\n\nfunction handleClick(view, pos, event) {\n if (!view.editable) { return false }\n var $pos = view.state.doc.resolve(pos);\n if (!GapCursor.valid($pos)) { return false }\n var ref = view.posAtCoords({left: event.clientX, top: event.clientY});\n var inside = ref.inside;\n if (inside > -1 && NodeSelection.isSelectable(view.state.doc.nodeAt(inside))) { return false }\n view.dispatch(view.state.tr.setSelection(new GapCursor($pos)));\n return true\n}\n\nfunction drawGapCursor(state) {\n if (!(state.selection instanceof GapCursor)) { return null }\n var node = document.createElement(\"div\");\n node.className = \"ProseMirror-gapcursor\";\n return DecorationSet.create(state.doc, [Decoration.widget(state.selection.head, node, {key: \"gapcursor\"})])\n}\n\nexport { GapCursor, gapCursor };\n//# sourceMappingURL=index.es.js.map\n","import { Plugin } from 'prosemirror-state';\n\n// From https://gist.github.com/khanzadimahdi/bab8a3416bdb764b9eda5b38b35735b8\nconst dataImageRegex = /^data:((?:\\w+\\/(?:(?!;).)+)?)((?:;[\\w\\W]*?[^;])*),(.+)$/;\n\nlet parser = new DOMParser();\n\nexport default function disableBase64PastePlugin() {\n return new Plugin({\n props: {\n transformPastedHTML(html) {\n const doc = parser.parseFromString(html, 'text/html');\n doc.querySelectorAll('img').forEach((node) => {\n if (dataImageRegex.test(node.src)) {\n node.remove();\n }\n });\n\n return doc.documentElement.outerHTML;\n },\n },\n });\n}\n","import { Plugin } from 'prosemirror-state';\n\nfunction onClick(schema) {\n return (view, pos, node, nodePos, event, direct) => {\n if (direct && node.type === schema.nodes.spoiler && event.target.tagName !== 'P') {\n // TODO: Figure out why this dispatch event isn't working.\n // Mutating the node directly isn't good practice.\n // view.dispatch(\n // view.state.tr.setNodeMarkup(pos, null, { open: false })\n // );\n node.attrs.open = !node.attrs.open;\n view.focus();\n event.stopPropagation();\n event.preventDefault();\n return false;\n }\n };\n}\n\nexport default function toggleSpoiler(schema) {\n return new Plugin({\n props: {\n handleClickOn: onClick(schema),\n handleDoubleClickOn: onClick(schema),\n },\n });\n}\n","import { inputRules, wrappingInputRule, textblockTypeInputRule, emDash, ellipsis } from 'prosemirror-inputrules';\nimport { markInputRule, nodeInputRule } from 'tiptap-commands';\n\n// Copied from https://github.com/ProseMirror/prosemirror-example-setup/blob/master/src/inputrules.js\n\nfunction blockQuoteRule(nodeType) {\n return wrappingInputRule(/^\\s*>\\s$/, nodeType);\n}\n\nfunction orderedListRule(nodeType) {\n return wrappingInputRule(\n /^(\\d+)(\\.|\\))\\s$/,\n nodeType,\n (match) => ({ order: +match[1] }),\n (match, node) => node.childCount + node.attrs.order == +match[1]\n );\n}\n\nfunction bulletListRule(nodeType) {\n return wrappingInputRule(/^\\s*([-+*])\\s$/, nodeType);\n}\n\nfunction codeBlockRule(nodeType) {\n return textblockTypeInputRule(/^```$/, nodeType);\n}\n\nfunction headingRule(nodeType, maxLevel) {\n return textblockTypeInputRule(new RegExp('^(#{1,' + maxLevel + '})\\\\s$'), nodeType, (match) => ({ level: match[1].length }));\n}\n\nfunction blockSpoilerRule(nodeType) {\n return wrappingInputRule(/^\\s*>!\\s$/, nodeType);\n}\n\nexport default function buildInputRules(schema) {\n const rules = [\n ellipsis,\n blockQuoteRule(schema.nodes.blockquote),\n orderedListRule(schema.nodes.ordered_list),\n bulletListRule(schema.nodes.bullet_list),\n codeBlockRule(schema.nodes.code_block),\n headingRule(schema.nodes.heading, 6),\n blockSpoilerRule(schema.nodes.spoiler),\n nodeInputRule(/(?:___\\s|\\*\\*\\*\\s|---)$/, schema.nodes.horizontal_rule),\n textblockTypeInputRule(/^\\s*\\$\\$\\s$/, schema.nodes.math_block),\n markInputRule(/(?:\\*\\*|__)([^\\*_]+)(?:\\*\\*|__)$/, schema.marks.strong),\n markInputRule(/(?:^|[^_])(_([^_]+)_)$/, schema.marks.em),\n markInputRule(/(?:^|[^*])(\\*([^*]+)\\*)$/, schema.marks.em),\n markInputRule(/(?:`)([^`]+)(?:`)$/, schema.marks.code),\n markInputRule(/(?:~~)([^~]+)(?:~~)$/, schema.marks.strike),\n markInputRule(/(?:[^~]~)([^~]+)(?:~)$/, schema.marks.sub),\n markInputRule(/(?:\\^)([^^]+)(?:\\^)$/, schema.marks.sup),\n markInputRule(/(?:\\|\\|)([^\\|]+)(?:\\|\\|)$/, schema.marks.spoiler_inline),\n markInputRule(/(?:>!)(.+)(?:!<)$/, schema.marks.spoiler_inline),\n markInputRule(/(?:\\$)([^$]+)(?:\\$)$/, schema.marks.math_inline),\n ];\n\n return rules;\n}\n","import { baseKeymap } from 'tiptap-commands';\nimport { history } from 'prosemirror-history';\nimport { keymap } from 'prosemirror-keymap';\nimport { EditorState, Selection, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { dropCursor } from 'prosemirror-dropcursor';\nimport { gapCursor } from 'prosemirror-gapcursor';\n\nimport ItemList from 'flarum/common/utils/ItemList';\nimport disabledPlugin from './plugins/disabledPlugin';\nimport disableBase64PastePlugin from './plugins/disableBase64PastePlugin';\nimport placeholderPlugin from './plugins/placeholderPlugin';\nimport menuPlugin from './plugins/menuPlugin';\nimport toggleSpoiler from './plugins/toggleSpoiler';\nimport richTextKeymap from './key-bindings';\nimport buildInputRules from './inputrules';\nimport MarkdownSerializerBuilder from './markdown/MarkdownSerializerBuilder';\nimport MarkdownParserBuilder from './markdown/MarkdownParserBuilder';\nimport SchemaBuilder from './markdown/SchemaBuilder';\nimport { inputRules } from 'prosemirror-inputrules';\n\nexport default class ProseMirrorEditorDriver {\n constructor(target, attrs) {\n this.build(target, attrs);\n }\n\n build(target, attrs) {\n this.attrs = attrs;\n this.schema = new SchemaBuilder().build();\n\n this.parser = new MarkdownParserBuilder(this.schema).build();\n this.serializer = new MarkdownSerializerBuilder(this.schema).build();\n\n this.state = EditorState.create(this.buildEditorStateConfig());\n this.view = new EditorView(target, this.buildEditorProps());\n\n const cssClasses = attrs.classNames || [];\n cssClasses.forEach((className) => this.view.dom.classList.add(className));\n\n const callInputListeners = (e) => {\n this.attrs.inputListeners.forEach((listener) => {\n listener.call(target);\n });\n\n e.redraw = false;\n };\n\n target.oninput = callInputListeners;\n target.onclick = callInputListeners;\n target.onkeyup = callInputListeners;\n }\n\n buildEditorStateConfig() {\n return {\n doc: this.parseInitialValue(this.attrs.value),\n disabled: this.attrs.disabled,\n schema: this.schema,\n plugins: this.buildPluginItems().toArray(),\n };\n }\n\n buildPluginItems() {\n const items = new ItemList();\n\n items.add('markdownInputrules', inputRules({ rules: this.buildInputRules(this.schema) }));\n\n items.add('submit', keymap({ 'Mod-Enter': this.attrs.onsubmit }));\n\n items.add('escape', keymap({ Escape: this.attrs.escape }));\n\n items.add('richTextKeymap', keymap(richTextKeymap(this.schema)));\n\n items.add('baseKeymap', keymap(baseKeymap));\n\n items.add('placeholder', placeholderPlugin(this.attrs.placeholder));\n\n items.add('history', history());\n\n items.add('disabled', disabledPlugin());\n\n items.add('disableBase64Paste', disableBase64PastePlugin());\n\n items.add('dropCursor', dropCursor());\n\n items.add('gapCursor', gapCursor());\n\n items.add('menu', menuPlugin(this.attrs.menuState));\n\n items.add('toggleSpoiler', toggleSpoiler(this.schema));\n\n return items;\n }\n\n buildEditorProps() {\n const self = this;\n\n return {\n state: this.state,\n dispatchTransaction(transaction) {\n let newState = this.state.apply(transaction);\n this.updateState(newState);\n\n const newDoc = this.state.doc;\n const newDocPlaintext = self.serializeContent(newDoc, self.schema);\n self.attrs.oninput(newDocPlaintext);\n },\n };\n }\n\n buildInputRules(schema) {\n return buildInputRules(schema);\n }\n\n parseInitialValue(text) {\n return this.parser.parse(text);\n }\n\n serializeContent(doc) {\n return this.serializer.serialize(doc, { tightLists: true });\n }\n\n // External Control Stuff\n\n /**\n * Focus the textarea and place the cursor at the given index.\n *\n * @param {number} position\n */\n moveCursorTo(position) {\n this.setSelectionRange(position, position);\n }\n\n /**\n * Get the selected range of the textarea.\n *\n * @return {Array}\n */\n getSelectionRange() {\n return [this.view.state.selection.from, this.view.state.selection.to];\n }\n\n /**\n * Get (at most) the last N characters from the current \"text block\".\n */\n getLastNChars(n) {\n const lastNode = this.view.state.selection.$from.nodeBefore;\n\n if (!lastNode || !lastNode.text) return '';\n\n return lastNode.text.slice(Math.max(0, lastNode.text.length - n));\n }\n\n /**\n * Insert content into the textarea at the position of the cursor.\n *\n * @param {String} text\n */\n insertAtCursor(text, escape) {\n this.insertAt(this.getSelectionRange()[0], text, escape);\n $(this.view.dom).trigger('click');\n }\n\n /**\n * Insert content into the textarea at the given position.\n *\n * @param {number} pos\n * @param {String} text\n */\n insertAt(pos, text, escape) {\n this.insertBetween(pos, pos, text, escape);\n }\n\n /**\n * Insert content into the textarea between the given positions.\n *\n * If the start and end positions are different, any text between them will be\n * overwritten.\n *\n * @param start\n * @param end\n * @param text\n * @param rawMarkdown\n */\n insertBetween(start, end, text, escape = true) {\n let trailingNewLines;\n\n if (escape) {\n this.view.dispatch(this.view.state.tr.insertText(text, start, end));\n } else {\n start -= 1;\n this.view.dispatch(this.view.state.tr.replaceRangeWith(start, end, this.parseInitialValue(text)));\n\n trailingNewLines = text.match(/\\s+$/)[0].split('\\n').length - 1;\n }\n\n // Move the textarea cursor to the end of the content we just inserted.\n this.moveCursorTo(Math.min(start + text.length, Selection.atEnd(this.view.state.doc).to));\n m.redraw();\n\n // TODO: accomplish this in one step.\n if (text.endsWith(' ') && !escape) {\n this.insertAtCursor(' ');\n }\n\n Array(trailingNewLines)\n .fill(0)\n .forEach(() => {\n baseKeymap['Enter'](this.view.state, this.view.dispatch);\n });\n }\n\n /**\n * Replace existing content from the start to the current cursor position.\n *\n * @param start\n * @param text\n */\n replaceBeforeCursor(start, text, escape) {\n this.insertBetween(start, this.getSelectionRange()[0], text, escape);\n }\n\n /**\n * Set the selected range of the textarea.\n *\n * @param {number} start\n * @param {number} end\n * @private\n */\n setSelectionRange(start, end) {\n const $start = this.view.state.tr.doc.resolve(start);\n const $end = this.view.state.tr.doc.resolve(end);\n\n this.view.dispatch(this.view.state.tr.setSelection(new TextSelection($start, $end)));\n this.focus();\n }\n\n getCaretCoordinates(position) {\n const viewportCoords = this.view.coordsAtPos(position);\n const editorViewportOffset = this.view.dom.getBoundingClientRect();\n return {\n left: viewportCoords.left - editorViewportOffset.left,\n top: viewportCoords.top - editorViewportOffset.top,\n };\n }\n\n focus() {\n this.view.focus();\n }\n destroy() {\n this.view.destroy();\n }\n\n disabled(disabled) {\n this.view.dispatch(this.view.state.tr.setMeta('disabled', disabled));\n }\n}\n","import { Plugin } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\n\nexport default function placeholderPlugin(text) {\n return new Plugin({\n props: {\n decorations: (state) => {\n const decorations = [];\n\n if (state.doc.childCount === 1) {\n const node = state.doc.child(0);\n if (node.type.isBlock && node.childCount === 0 && node.type == state.schema.nodes.paragraph) {\n decorations.push(\n Decoration.node(0, node.nodeSize, {\n class: 'placeholder',\n 'data-before': text,\n })\n );\n }\n }\n\n return DecorationSet.create(state.doc, decorations);\n },\n },\n });\n}\n","import { Plugin } from 'prosemirror-state';\n\nexport default function menuPlugin(menuState) {\n return new Plugin({\n view(editorView) {\n menuState.attachEditorView(editorView);\n return menuState;\n },\n });\n}\n","import { redo, undo } from 'prosemirror-history';\nimport { undoInputRule } from 'prosemirror-inputrules';\nimport { TextSelection } from 'prosemirror-state';\nimport {\n chainCommands,\n exitCode,\n liftListItem,\n newlineInCode,\n setBlockType,\n sinkListItem,\n splitListItem,\n toggleList,\n toggleMark,\n wrapIn,\n} from 'tiptap-commands';\n\nexport default function richTextKeymap(schema) {\n const considerDropdown = (state, dispatch) => {\n const emojiDropdown = $('.EmojiDropdown:visible');\n const mentionsDropdown = $('.MentionsDropdown:visible');\n\n if (emojiDropdown[0] || mentionsDropdown[0]) return true;\n };\n\n const smartExitCode = (state, dispatch, view) => {\n let { $head, $anchor } = state.selection;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) return false;\n\n const nodeBefore = state.selection.$from.nodeBefore;\n const nodeAfter = state.selection.$from.nodeAfter;\n if ((!nodeBefore || nodeBefore.text.slice(-1) === '\\n') && !nodeAfter) {\n view.dispatch(view.state.tr.delete(state.selection.from - 1, state.selection.from));\n view.dispatch(view.state.tr.setSelection(TextSelection.near(view.state.doc.resolve(view.state.selection.from))));\n return exitCode(view.state, view.dispatch);\n } else {\n return newlineInCode(state, dispatch);\n }\n };\n\n const insertHardBreak = (state, dispatch) => {\n dispatch(state.tr.replaceSelectionWith(schema.nodes.hard_break.create()).scrollIntoView());\n return true;\n };\n\n const smartInsertHardBreak = (state, dispatch, view) => {\n let { $head, $anchor } = state.selection;\n if ($head.parent.type.name !== 'paragraph' || !$head.sameParent($anchor)) return false;\n\n const nodeBefore = state.selection.$from.nodeBefore;\n const nodeAfter = state.selection.$from.nodeAfter;\n\n if (nodeBefore && nodeBefore.text && nodeBefore.text.slice(-1) !== '\\n') {\n return insertHardBreak(view.state, view.dispatch);\n } else if (nodeBefore && !nodeBefore.text && !nodeAfter) {\n view.dispatch(view.state.tr.delete(state.selection.from - 1, state.selection.from));\n view.dispatch(view.state.tr.setSelection(TextSelection.near(view.state.doc.resolve(view.state.selection.from))));\n }\n };\n\n const enterCommands = [considerDropdown, splitListItem(schema.nodes.list_item), smartExitCode];\n\n if (app.session.user.preferences().richTextCompactParagraphs) {\n enterCommands.push(smartInsertHardBreak);\n }\n\n const handleEnter = chainCommands(...enterCommands);\n\n return {\n // History\n 'Mod-z': undo,\n 'Mod-y': redo,\n 'Mod-Shift-z': redo,\n Backspace: undoInputRule,\n // Formatting: Marks\n 'Mod-b': toggleMark(schema.marks.strong),\n 'Mod-i': toggleMark(schema.marks.em),\n 'Mod-`': toggleMark(schema.marks.code),\n 'Alt-Shift-5': toggleMark(schema.marks.strike),\n 'Mod-,': toggleMark(schema.marks.sub),\n 'Mod-.': toggleMark(schema.marks.sup),\n 'Mod-;': toggleMark(schema.marks.spoiler_inline),\n // Formatting: Wrap\n 'Shift-Mod-8': toggleList(schema.nodes.bullet_list),\n 'Shift-Mod-9': toggleList(schema.nodes.ordered_list),\n 'Mod-q': wrapIn(schema.nodes.blockquote),\n // Formatting: Type\n 'Shift-Ctrl-0': setBlockType(schema.nodes.paragraph),\n 'Shift-Ctrl-1': setBlockType(schema.nodes.heading, { level: 1 }),\n 'Shift-Ctrl-2': setBlockType(schema.nodes.heading, { level: 2 }),\n 'Shift-Ctrl-3': setBlockType(schema.nodes.heading, { level: 3 }),\n 'Shift-Ctrl-4': setBlockType(schema.nodes.heading, { level: 4 }),\n 'Shift-Ctrl-5': setBlockType(schema.nodes.heading, { level: 5 }),\n 'Shift-Ctrl-6': setBlockType(schema.nodes.heading, { level: 6 }),\n 'Shift-Ctrl-\\\\': setBlockType(schema.nodes.code_block),\n // Whitespace\n 'Mod-]': sinkListItem(schema.nodes.list_item),\n 'Mod-m': sinkListItem(schema.nodes.list_item),\n 'Mod-[': liftListItem(schema.nodes.list_item),\n 'Mod-Shift-m': liftListItem(schema.nodes.list_item),\n Enter: handleEnter,\n 'Shift-Enter': chainCommands(newlineInCode, insertHardBreak),\n };\n}\n","import { Plugin, PluginKey } from 'prosemirror-state';\n\nexport default function disabledPlugin(text) {\n return new Plugin({\n key: new PluginKey('disabled'),\n\n props: {\n editable: (state) => {\n return !state.disabled$;\n },\n },\n\n state: {\n init(config) {\n return config.disabled;\n },\n\n apply(tr, curr) {\n const disabled = tr.getMeta('disabled');\n\n if (disabled !== undefined) {\n return disabled;\n }\n\n return curr;\n },\n },\n });\n}\n","// COPIED FROM https://github.com/markdown-it/markdown-it/blob/master/lib/rules_inline/text.js\n// NEEDED TO ALLOW `|` as terminator character.\n\n// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\n'use strict';\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar(ch) {\n switch (ch) {\n case 0x0a /* \\n */:\n case 0x21 /* ! */:\n case 0x23 /* # */:\n case 0x24 /* $ */:\n case 0x25 /* % */:\n case 0x26 /* & */:\n case 0x2a /* * */:\n case 0x2b /* + */:\n case 0x2d /* - */:\n case 0x3a /* : */:\n case 0x3c /* < */:\n case 0x3d /* = */:\n case 0x3e /* > */:\n case 0x40 /* @ */:\n case 0x5b /* [ */:\n case 0x5c /* \\ */:\n case 0x5d /* ] */:\n case 0x5e /* ^ */:\n case 0x5f /* _ */:\n case 0x60 /* ` */:\n case 0x7b /* { */:\n case 0x7c /* | */:\n case 0x7d /* } */:\n case 0x7e /* ~ */:\n return true;\n default:\n return false;\n }\n}\n\nconst tokenize = (state, silent) => {\n var pos = state.pos;\n\n while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n pos++;\n }\n\n if (pos === state.pos) {\n return false;\n }\n\n if (!silent) {\n state.pending += state.src.slice(state.pos, pos);\n }\n\n state.pos = pos;\n\n return true;\n};\n\nexport default function (md) {\n md.inline.ruler.before('text', 'altText', tokenize);\n md.inline.ruler.disable('text');\n}\n","// COPIED FROM https://github.com/StackExchange/Stacks-Editor/blob/main/src/shared/markdown-it/spoiler.ts\n\nimport { isSpace } from 'markdown-it/lib/common/utils';\n\n// TODO unfortunately, we cannot reliably extend blockquote since it is hardcoded to search for `>` characters\n// In addition, we cannot just call \"blockquote\" inside spoiler, because it does a lookahead for `>` characters and leaves our `!`s behind, potentially causing parsing issues\n// The official advice is to just \"copy paste then edit\" \"extended\" rules...\n// see https://github.com/markdown-it/markdown-it/blob/master/docs/development.md#general-considerations-for-plugins\n// see also https://github.com/markdown-it/markdown-it/issues/46#issuecomment-73125248\nfunction blockquoteExt(options, state, startLine, endLine, silent) {\n // NOTE: we're keeping the source as close to upstream as possible, so ignore errors like this\n // eslint-disable-next-line no-var\n var adjustTab,\n ch,\n i,\n initial,\n l,\n lastLineEmpty,\n lines,\n nextLine,\n offset,\n oldBMarks,\n oldBSCount,\n oldIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n spaceAfterMarker,\n terminate,\n terminatorRules,\n token,\n wasOutdented,\n oldLineMax = state.lineMax,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) {\n return false;\n }\n\n // check the block quote marker\n if (state.src.charCodeAt(pos) !== 0x3e /* > */ || !options.followingCharRegex.test(state.src[pos + 1])) {\n return false;\n }\n\n pos += options.markup.length;\n\n // we know that it's going to be a valid blockquote,\n // so no point trying to find the end of it in silent mode\n if (silent) {\n return true;\n }\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[startLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n // ! INSERTED\n // We need to add this hack in so that inline spoilers\n // at the start of lines don't get classified\n // as block spoilers.\n const spoiler = options.markup === '>!';\n let foundExclamation = false;\n let foundOpen = false;\n let oldPos = pos;\n if (spoiler) {\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (foundExclamation && ch === 0x3c /* < */) {\n return false;\n } else if (ch === 0x3e /* > */) {\n foundOpen = true;\n } else if (foundOpen && ch === 0x21 /* ! */) {\n break; // Inline spoiler embedded in block spoiler, this is fine.\n } else if (ch === 0x21 /* ! */) {\n foundExclamation = true;\n } else if (ch === 0x0a /* \\n */) {\n break; // Not an inline comment\n } else {\n foundExclamation = false;\n foundOpen = false;\n }\n\n pos++;\n }\n }\n pos = oldPos;\n // ! END INSERTED\n\n oldBMarks = [state.bMarks[startLine]];\n state.bMarks[startLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - ((offset + state.bsCount[startLine] + (adjustTab ? 1 : 0)) % 4);\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n oldBSCount = [state.bsCount[startLine]];\n state.bsCount[startLine] = state.sCount[startLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n lastLineEmpty = pos >= max;\n\n oldSCount = [state.sCount[startLine]];\n state.sCount[startLine] = offset - initial;\n\n oldTShift = [state.tShift[startLine]];\n state.tShift[startLine] = pos - state.bMarks[startLine];\n\n terminatorRules = state.md.block.ruler.getRules('spoiler');\n\n oldParentType = state.parentType;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore TODO adding a new parent type here...\n state.parentType = 'spoiler';\n wasOutdented = false;\n\n // Search the end of the block\n //\n // Block ends with either:\n // 1. an empty line outside:\n // ```\n // > test\n //\n // ```\n // 2. an empty line inside:\n // ```\n // >\n // test\n // ```\n // 3. another tag:\n // ```\n // > test\n // - - -\n // ```\n for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {\n // check if it's outdented, i.e. it's inside list item and indented\n // less than said list item:\n //\n // ```\n // 1. anything\n // > current blockquote\n // 2. checking this line\n // ```\n if (state.sCount[nextLine] < state.blkIndent) wasOutdented = true;\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos >= max) {\n // Case 1: line is not inside the blockquote, and this line is empty.\n break;\n }\n\n pos += options.markup.length;\n\n if (\n state.src.charCodeAt(pos - options.markup.length) === 0x3e /* > */ &&\n options.followingCharRegex.test(state.src[pos - options.markup.length + 1]) &&\n !wasOutdented\n ) {\n // This line is inside the blockquote.\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[nextLine] + pos - (state.bMarks[nextLine] + state.tShift[nextLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[nextLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n state.bMarks[nextLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - ((offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4);\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n lastLineEmpty = pos >= max;\n\n oldBSCount.push(state.bsCount[nextLine]);\n state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] = offset - initial;\n\n oldTShift.push(state.tShift[nextLine]);\n state.tShift[nextLine] = pos - state.bMarks[nextLine];\n continue;\n }\n\n // Case 2: line is not inside the blockquote, and the last line was empty.\n if (lastLineEmpty) {\n break;\n }\n\n // Case 3: another tag found.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n\n if (terminate) {\n // Quirk to enforce \"hard termination mode\" for paragraphs;\n // normally if you call `tokenize(state, startLine, nextLine)`,\n // paragraphs will look below nextLine for paragraph continuation,\n // but if blockquote is terminated by another tag, they shouldn't\n state.lineMax = nextLine;\n\n if (state.blkIndent !== 0) {\n // state.blkIndent was non-zero, we now set it to zero,\n // so we need to re-calculate all offsets to appear as\n // if indent wasn't changed\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] -= state.blkIndent;\n }\n\n break;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n\n // A negative indentation means that this is a paragraph continuation\n //\n state.sCount[nextLine] = -1;\n }\n\n oldIndent = state.blkIndent;\n state.blkIndent = 0;\n\n token = state.push(options.name + '_open', options.name, 1);\n token.markup = options.markup;\n token.map = lines = [startLine, 0];\n\n state.md.block.tokenize(state, startLine, nextLine);\n\n token = state.push(options.name + '_close', options.name, -1);\n token.markup = options.markup;\n\n state.lineMax = oldLineMax;\n state.parentType = oldParentType;\n lines[1] = state.line;\n\n // Restore original tShift; this might not be necessary since the parser\n // has already been here, but just to make sure we can do that.\n for (i = 0; i < oldTShift.length; i++) {\n state.bMarks[i + startLine] = oldBMarks[i];\n state.tShift[i + startLine] = oldTShift[i];\n state.sCount[i + startLine] = oldSCount[i];\n state.bsCount[i + startLine] = oldBSCount[i];\n }\n state.blkIndent = oldIndent;\n\n return true;\n}\n\nfunction spoilerFn(state, startLine, endLine, silent) {\n return blockquoteExt(\n {\n followingCharRegex: /!/,\n markup: '>!',\n name: 'spoiler',\n },\n state,\n startLine,\n endLine,\n silent\n );\n}\n\nfunction blockquoteFn(state, startLine, endLine, silent) {\n return blockquoteExt(\n {\n followingCharRegex: /[^!]/,\n markup: '>',\n name: 'blockquote',\n },\n state,\n startLine,\n endLine,\n silent\n );\n}\n\n/**\n * Parses out spoiler `>!` blocks\n * @param md\n */\nexport default function blockSpoiler(md) {\n // TODO necessary?\n // find all blockquote chain rules and update to be part of the spoiler chain as well\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore TODO no public way to iterate over all rules; maybe there's a better way?\n md.block.ruler.__rules__.forEach((r) => {\n const bqIndex = r.alt.indexOf('blockquote');\n if (bqIndex > -1) {\n // add in \"spoiler\" right before the \"blockquote\" entry\n r.alt.splice(bqIndex, 0, 'spoiler');\n }\n });\n md.block.ruler.before('blockquote', 'spoiler', spoilerFn, {\n // TODO stole this from blockquote, dunno what it does...\n alt: ['paragraph', 'reference', 'spoiler', 'blockquote', 'list'],\n });\n\n md.block.ruler.at('blockquote', blockquoteFn, {\n alt: ['paragraph', 'reference', 'spoiler', 'blockquote', 'list'],\n });\n}\n","/**!\n * markdown-it-mark\n *\n * Copyright (c) 2014-2015 Vitaly Puzrin, Alex Kocharin.\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n'use strict';\nconst exMark = 0x7c; /* | */\n\nconst tokenize = (frontPriorMode) => (state, silent) => {\n if (silent) return false;\n\n const start = state.pos;\n const marker = state.src.charCodeAt(start);\n\n if (marker !== exMark) return false;\n\n const scanned = state.scanDelims(state.pos, true);\n let len = scanned.length;\n const ch = String.fromCharCode(marker);\n\n if (len < 2) return false;\n\n let isOdd = false;\n if (len % 2) {\n isOdd = true;\n if (!frontPriorMode) {\n const token = state.push('text', '', 0);\n token.content = ch;\n }\n len--;\n }\n\n for (let i = 0; i < len; i += 2) {\n const token = state.push('text', '', 0);\n token.content = ch + ch;\n\n state.delimiters.push({\n marker,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n jump: i / 2, // 1 delimiter = 2 characters\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close,\n });\n }\n\n state.pos += scanned.length;\n if (isOdd && frontPriorMode) {\n state.pos--;\n }\n\n return true;\n};\n\nconst postProcess = (state, delimiters) => {\n const loneMarkers = [];\n\n for (const startDelim of delimiters) {\n if (startDelim.marker !== exMark) continue;\n if (startDelim.end === -1) continue;\n\n const endDelim = delimiters[startDelim.end];\n\n const tokenO = state.tokens[startDelim.token];\n tokenO.type = 'spoiler_inline_open';\n tokenO.tag = 'span';\n tokenO.attrs = [['class', 'spoiler_inline']];\n tokenO.nesting = 1;\n tokenO.markup = '||';\n tokenO.content = '';\n\n const tokenC = state.tokens[endDelim.token];\n tokenC.type = 'spoiler_inline_close';\n tokenC.tag = 'span';\n tokenC.nesting = -1;\n tokenC.markup = '||';\n tokenC.content = '';\n\n if (state.tokens[endDelim.token - 1].type === 'text' && state.tokens[endDelim.token - 1].content === '|') {\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's splitted\n // like this: `|||||` -> `|` + `||` + `||`, leaving one marker at the\n // start of the sequence.\n //\n // So, we have to move all those markers after subsequent spoiler_inline_close tags.\n //\n while (loneMarkers.length) {\n const i = loneMarkers.pop();\n let j = i + 1;\n\n while (j < state.tokens.length && state.tokens[j].type === 'spoiler_inline_close') {\n j++;\n }\n\n j--;\n\n if (i !== j) {\n const token = state.tokens[j];\n state.tokens[j] = state.tokens[i];\n state.tokens[i] = token;\n }\n }\n};\n\nexport default function (md, frontPriorMode = false) {\n md.inline.ruler.before('emphasis', 'spoiler_inline_bars', tokenize(frontPriorMode));\n md.inline.ruler2.before('emphasis', 'spoiler_inline_bars', (state) => {\n postProcess(state, state.delimiters);\n\n if (!state.tokens_meta) return;\n for (const meta of state.tokens_meta) {\n if (meta && meta.delimiters) {\n postProcess(state, meta.delimiters);\n }\n }\n });\n}\n","// BASED ON https://github.com/markdown-it/markdown-it-sub/blob/master/index.js\n\nconst tokenize = (frontPriorMode) => (state, silent) => {\n if (silent) return false;\n\n var scanned,\n max = state.posMax,\n start = state.pos;\n\n if (state.src.charCodeAt(start) === 0x3e /* > */ && start + 3 <= max && state.src.charCodeAt(start + 1) === 0x21 /* ! */) {\n scanned = state.scanDelims(state.pos, true);\n state.push('text', '', 0);\n state.delimiters.push({\n marker: '>!<',\n length: 2,\n jump: 0,\n token: state.tokens.length - 1,\n end: -1,\n open: true,\n close: false,\n });\n state.pos += 2;\n return true;\n }\n\n if (state.src.charCodeAt(start) === 0x21 /* ! */ && start + 2 <= max && state.src.charCodeAt(start + 1) === 0x3c /* < */) {\n state.push('text', '', 0);\n state.delimiters.push({\n marker: '>!<',\n length: 2,\n jump: 0,\n token: state.tokens.length - 1,\n end: -1,\n open: false,\n close: true,\n });\n state.pos += 2;\n return true;\n }\n\n return false;\n};\n\nfunction postProcess(state, delimiters) {\n var i,\n startDelim,\n endDelim,\n token,\n max = delimiters.length;\n\n for (i = max - 1; i >= 0; i--) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== '>!<') {\n continue;\n }\n\n // Process only opening markers\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n token = state.tokens[startDelim.token];\n token.type = 'spoiler_inline_open';\n // token.tag = isStrong ? 'strong' : 'em';\n token.nesting = 1;\n token.markup = '>!';\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = 'spoiler_inline_close';\n // token.tag = isStrong ? 'strong' : 'em';\n token.nesting = -1;\n token.markup = '!<';\n token.content = '';\n }\n}\n\nexport default function (md, frontPriorMode = false) {\n md.inline.ruler.before('emphasis', 'spoiler_inline_tags', tokenize(frontPriorMode));\n md.inline.ruler2.before('emphasis', 'spoiler_inline_bars', (state) => {\n postProcess(state, state.delimiters);\n\n if (!state.tokens_meta) return;\n for (const meta of state.tokens_meta) {\n if (meta && meta.delimiters) {\n postProcess(state, meta.delimiters);\n }\n }\n });\n}\n","import markdownit from 'markdown-it';\nimport subPlugin from 'markdown-it-sub';\nimport supPlugin from 'markdown-it-sup';\nimport latexPlugin from 'markdown-it-latex2img';\nimport { defaultMarkdownParser, MarkdownParser } from 'prosemirror-markdown';\nimport altText from './markdown-it/altText';\nimport blockSpoiler from './markdown-it/blockSpoiler';\nimport inlineSpoilerBars from './markdown-it/inlineSpoilerBars';\nimport inlineSpoilerTags from './markdown-it/inlineSpoilerTags';\n\nexport default class MarkdownParserBuilder {\n constructor(schema) {\n this.schema = schema;\n }\n\n tokenizerParams() {\n return { html: false };\n }\n\n buildTokenizer() {\n return markdownit('commonmark', this.tokenizerParams())\n .enable('strikethrough')\n .use(altText)\n .use(blockSpoiler)\n .use(latexPlugin)\n .use(subPlugin)\n .use(supPlugin)\n .use(inlineSpoilerBars)\n .use(inlineSpoilerTags);\n }\n\n buildTokens() {\n return {\n ...defaultMarkdownParser.tokens,\n\n // add support for the strike mark\n s: {\n mark: 'strike',\n },\n\n // Litedown treaks softbreaks as hard breaks\n softbreak: { node: 'hard_break' },\n\n spoiler: {\n block: 'spoiler',\n },\n\n spoiler_inline: {\n mark: 'spoiler_inline',\n },\n\n sub: {\n mark: 'sub',\n },\n\n sup: {\n mark: 'sup',\n },\n\n math_block: {\n block: 'math_block',\n noCloseToken: true,\n },\n\n math_inline: {\n mark: 'math_inline',\n noCloseToken: true,\n },\n };\n }\n\n build() {\n return new MarkdownParser(this.schema, this.buildTokenizer(), this.buildTokens());\n }\n}\n","import Dropdown from 'flarum/common/components/Dropdown';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport icon from 'flarum/common/helpers/icon';\nimport SafariModalHack from './SafariModalHack';\n\nexport default class HiddenItemsDropdown extends Dropdown {\n static initAttrs(attrs) {\n attrs.buttonClassName = 'Button Button--icon Button--link Button--menuDropdown';\n }\n\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$().on('click', (e) => {\n if ($('.App').is('.mobile-safari')) {\n // Mobile Safari doesn't support fixed items\n // So, we wrap them in a modal.\n app.modal.show(SafariModalHack, {\n title: this.attrs.tooltip,\n vnodeContent: this.attrs.buttons.map((button) => {\n return button;\n }),\n });\n e.stopPropagation();\n }\n });\n }\n\n getButtonContent(children) {\n return (\n \n {icon(this.attrs.icon)}\n \n );\n }\n\n getMenu(items) {\n return

        {this.attrs.buttons}
      ;\n }\n}\n","import { toggleBlockType, toggleWrap, wrapIn } from 'tiptap-commands';\n\nimport Component from 'flarum/common/Component';\nimport ItemList from 'flarum/common/utils/ItemList';\n\nimport CommandButton from './CommandButton';\nimport MarkButton from './MarkButton';\nimport NodeTypeDropdown from './NodeTypeDropdown';\nimport InsertImageDropdown from './InsertImageDropdown';\nimport InsertLinkDropdown from './InsertLinkDropdown';\nimport ListButton from './ListButton';\nimport insertHr from '../proseMirror/commands/insertHr';\nimport HiddenItemsDropdown from './HiddenItemsDropdown';\n\nexport default class ProseMirrorMenu extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.modifierKey = navigator.userAgent.match(/Macintosh/) ? '⌘' : 'ctrl';\n }\n view(vnode) {\n if (!this.attrs.state) return '';\n\n return
      {this.items().toArray()}
      ;\n }\n\n items() {\n const items = new ItemList();\n const state = this.attrs.state;\n const modifierKey = this.modifierKey;\n\n items.add(\n 'text_type',\n NodeTypeDropdown.component({\n type: 'text_type',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.text_type_tooltip'),\n state: state,\n options: [\n {\n title: 'H1',\n type: state.getSchema().nodes.heading,\n attrs: { level: 1 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 1 }),\n },\n {\n title: 'H2',\n type: state.getSchema().nodes.heading,\n attrs: { level: 2 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 2 }),\n },\n {\n title: 'H3',\n type: state.getSchema().nodes.heading,\n attrs: { level: 3 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 3 }),\n },\n {\n title: 'H4',\n type: state.getSchema().nodes.heading,\n attrs: { level: 4 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 4 }),\n },\n {\n title: 'H5',\n type: state.getSchema().nodes.heading,\n attrs: { level: 5 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 5 }),\n },\n {\n title: 'H6',\n type: state.getSchema().nodes.heading,\n attrs: { level: 6 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 6 }),\n },\n {\n title: 'P',\n type: state.getSchema().nodes.paragraph,\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.paragraph_tooltip', { modifierKey }),\n },\n ],\n }),\n 100\n );\n\n items.add(\n 'bold',\n MarkButton.component({\n type: 'bold',\n icon: 'fas fa-bold',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.bold_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.strong,\n }),\n 90\n );\n\n items.add(\n 'italic',\n MarkButton.component({\n type: 'italic',\n icon: 'fas fa-italic',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.italic_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.em,\n }),\n 80\n );\n\n items.add(\n 'code',\n MarkButton.component({\n type: 'code',\n icon: 'fas fa-code',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.code_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.code,\n }),\n 70\n );\n\n items.add(\n 'quote',\n CommandButton.component({\n type: 'quote',\n icon: 'fas fa-quote-left',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.quote_tooltip', { modifierKey }),\n state: state,\n command: wrapIn(state.getSchema().nodes.blockquote),\n }),\n 60\n );\n\n items.add(\n 'link',\n InsertLinkDropdown.component({\n type: 'link',\n icon: 'fas fa-link',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.link_tooltip'),\n state: state,\n mark: state.getSchema().marks.link,\n }),\n 50\n );\n\n items.add(\n 'image',\n InsertImageDropdown.component({\n type: 'image',\n icon: 'fas fa-image',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.image_tooltip'),\n state: state,\n node: state.getSchema().nodes.image,\n }),\n 40\n );\n\n items.add(\n 'unordered_list',\n ListButton.component({\n type: 'unordered_list',\n icon: 'fas fa-list-ul',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.unordered_list_tooltip', { modifierKey }),\n state: state,\n listType: state.getSchema().nodes.bullet_list,\n }),\n 30\n );\n\n items.add(\n 'ordered_list',\n ListButton.component({\n type: 'ordered_list',\n icon: 'fas fa-list-ol',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.ordered_list_tooltip', { modifierKey }),\n state: state,\n listType: state.getSchema().nodes.ordered_list,\n }),\n 20\n );\n\n items.add(\n 'additional_items',\n HiddenItemsDropdown.component({\n type: 'additional_items',\n icon: 'fas fa-plus',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.additional_items_tooltip'),\n state: state,\n buttons: this.hiddenItems().toArray(),\n })\n );\n\n return items;\n }\n\n hiddenItems() {\n const items = new ItemList();\n const state = this.attrs.state;\n const modifierKey = this.modifierKey;\n\n items.add(\n 'strike',\n MarkButton.component({\n type: 'strike',\n icon: 'fas fa-strikethrough',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.strike_tooltip'),\n state: state,\n mark: state.getSchema().marks.strike,\n })\n );\n\n items.add(\n 'sub',\n MarkButton.component({\n type: 'sub',\n icon: 'fas fa-subscript',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.sub_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.sub,\n })\n );\n\n items.add(\n 'sup',\n MarkButton.component({\n type: 'sup',\n icon: 'fas fa-superscript',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.sup_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.sup,\n })\n );\n\n items.add(\n 'spoiler_inline',\n MarkButton.component({\n type: 'spoiler_inline',\n icon: 'fas fa-eye-slash',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.spoiler_inline_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.spoiler_inline,\n })\n );\n\n items.add(\n 'code_block',\n CommandButton.component({\n type: 'code_block',\n icon: 'fas fa-terminal',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.code_block_tooltip', { modifierKey }),\n state: state,\n command: toggleBlockType(state.getSchema().nodes.code_block, state.getSchema().nodes.paragraph),\n })\n );\n\n items.add(\n 'spoiler_block',\n CommandButton.component({\n type: 'spoiler_block',\n icon: 'fas fa-caret-square-right',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.spoiler_block_tooltip', { modifierKey }),\n state: state,\n command: toggleWrap(state.getSchema().nodes.spoiler),\n })\n );\n\n items.add(\n 'horizontal_rule',\n CommandButton.component({\n type: 'horizontal_rule',\n icon: 'fas fa-minus',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.horizontal_rule_tooltip'),\n state: state,\n command: insertHr(state.getSchema().nodes.horizontal_rule),\n })\n );\n\n return items;\n }\n}\n","export default function insertHr(nodeType, attrs) {\n return function (state, dispatch) {\n dispatch(state.tr.replaceSelectionWith(nodeType.create(attrs)));\n return true;\n };\n}\n","import Button from 'flarum/common/components/Button';\nimport extractText from 'flarum/common/utils/extractText';\nimport Stream from 'flarum/common/utils/Stream';\nimport FormDropdown from './FormDropdown';\n\nimport { removeMark, updateMark } from 'tiptap-commands';\nimport insertLink from '../proseMirror/commands/insertLink';\n\nexport default class InsertLinkDropdown extends FormDropdown {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.text = Stream('');\n\n this.href = Stream('');\n this.title = Stream('');\n\n this.state.addItem(\n this.attrs.type,\n (state, dispatch) => {\n this.command(state, dispatch);\n },\n this.onEditorUpdate.bind(this)\n );\n\n this.selectionEmpty = true;\n }\n\n fields() {\n const items = super.fields();\n\n if (this.selectionEmpty && !this.active) {\n items.add(\n 'text',\n
      \n \n
      ,\n 10\n );\n }\n\n items.add(\n 'href',\n
      \n \n
      ,\n 10\n );\n\n items.add(\n 'title',\n
      \n \n
      ,\n 10\n );\n\n if (this.active) {\n items.add(\n 'remove',\n ,\n -10\n );\n }\n\n return items;\n }\n\n insert(e) {\n const linkAttrs = { href: this.href(), title: this.title() };\n\n if (this.selectionEmpty && !this.active) {\n this.command = insertLink(this.text(), this.attrs.mark, linkAttrs);\n\n this.text('');\n } else {\n this.command = updateMark(this.attrs.mark, linkAttrs);\n }\n\n this.state.run(this.attrs.type);\n }\n\n remove(e) {\n $('body').trigger('click');\n this.command = removeMark(this.attrs.mark);\n this.state.run(this.attrs.type);\n app.composer.editor.focus();\n }\n\n onEditorUpdate() {\n this.active = !!this.state.markActive(this.attrs.mark);\n this.$('.Dropdown-toggle').toggleClass('active', this.active);\n\n const attrs = this.state.markAttrs(this.attrs.mark);\n\n this.href(attrs.href);\n this.title(attrs.title);\n\n this.selectionEmpty = this.state.selectionEmpty();\n }\n}\n","export default function insertLink(text, markType, attrs) {\n return function (state, dispatch) {\n dispatch(state.tr.replaceSelectionWith(state.schema.text(text, [markType.create(attrs)]), false));\n };\n}\n","module.exports=/[!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E4E\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD803[\\uDF55-\\uDF59]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD806[\\uDC3B\\uDE3F-\\uDE46\\uDE9A-\\uDE9C\\uDE9E-\\uDEA2]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDE97-\\uDE9A]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]/","/**\n * class Ruler\n *\n * Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and\n * [[MarkdownIt#inline]] to manage sequences of functions (rules):\n *\n * - keep rules in defined order\n * - assign the name to each rule\n * - enable/disable rules\n * - add/replace rules\n * - allow assign rules to additional named chains (in the same)\n * - cacheing lists of active rules\n *\n * You will not need use this class directly until write plugins. For simple\n * rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and\n * [[MarkdownIt.use]].\n **/\n'use strict';\n\n\n/**\n * new Ruler()\n **/\nfunction Ruler() {\n // List of added rules. Each element is:\n //\n // {\n // name: XXX,\n // enabled: Boolean,\n // fn: Function(),\n // alt: [ name2, name3 ]\n // }\n //\n this.__rules__ = [];\n\n // Cached rule chains.\n //\n // First level - chain name, '' for default.\n // Second level - diginal anchor for fast filtering by charcodes.\n //\n this.__cache__ = null;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Helper methods, should not be used directly\n\n\n// Find rule index by name\n//\nRuler.prototype.__find__ = function (name) {\n for (var i = 0; i < this.__rules__.length; i++) {\n if (this.__rules__[i].name === name) {\n return i;\n }\n }\n return -1;\n};\n\n\n// Build rules lookup cache\n//\nRuler.prototype.__compile__ = function () {\n var self = this;\n var chains = [ '' ];\n\n // collect unique names\n self.__rules__.forEach(function (rule) {\n if (!rule.enabled) { return; }\n\n rule.alt.forEach(function (altName) {\n if (chains.indexOf(altName) < 0) {\n chains.push(altName);\n }\n });\n });\n\n self.__cache__ = {};\n\n chains.forEach(function (chain) {\n self.__cache__[chain] = [];\n self.__rules__.forEach(function (rule) {\n if (!rule.enabled) { return; }\n\n if (chain && rule.alt.indexOf(chain) < 0) { return; }\n\n self.__cache__[chain].push(rule.fn);\n });\n });\n};\n\n\n/**\n * Ruler.at(name, fn [, options])\n * - name (String): rule name to replace.\n * - fn (Function): new rule function.\n * - options (Object): new rule options (not mandatory).\n *\n * Replace rule by name with new function & options. Throws error if name not\n * found.\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * Replace existing typographer replacement rule with new one:\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.at('replacements', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.at = function (name, fn, options) {\n var index = this.__find__(name);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + name); }\n\n this.__rules__[index].fn = fn;\n this.__rules__[index].alt = opt.alt || [];\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.before(beforeName, ruleName, fn [, options])\n * - beforeName (String): new rule will be added before this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain before one with given name. See also\n * [[Ruler.after]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.block.ruler.before('paragraph', 'my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.before = function (beforeName, ruleName, fn, options) {\n var index = this.__find__(beforeName);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + beforeName); }\n\n this.__rules__.splice(index, 0, {\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.after(afterName, ruleName, fn [, options])\n * - afterName (String): new rule will be added after this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain after one with given name. See also\n * [[Ruler.before]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.inline.ruler.after('text', 'my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.after = function (afterName, ruleName, fn, options) {\n var index = this.__find__(afterName);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + afterName); }\n\n this.__rules__.splice(index + 1, 0, {\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n/**\n * Ruler.push(ruleName, fn [, options])\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Push new rule to the end of chain. See also\n * [[Ruler.before]], [[Ruler.after]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.push('my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.push = function (ruleName, fn, options) {\n var opt = options || {};\n\n this.__rules__.push({\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.enable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to enable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.disable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.enable = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n var result = [];\n\n // Search by name and enable\n list.forEach(function (name) {\n var idx = this.__find__(name);\n\n if (idx < 0) {\n if (ignoreInvalid) { return; }\n throw new Error('Rules manager: invalid rule name ' + name);\n }\n this.__rules__[idx].enabled = true;\n result.push(name);\n }, this);\n\n this.__cache__ = null;\n return result;\n};\n\n\n/**\n * Ruler.enableOnly(list [, ignoreInvalid])\n * - list (String|Array): list of rule names to enable (whitelist).\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names, and disable everything else. If any rule name\n * not found - throw Error. Errors can be disabled by second param.\n *\n * See also [[Ruler.disable]], [[Ruler.enable]].\n **/\nRuler.prototype.enableOnly = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n this.__rules__.forEach(function (rule) { rule.enabled = false; });\n\n this.enable(list, ignoreInvalid);\n};\n\n\n/**\n * Ruler.disable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Disable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.enable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.disable = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n var result = [];\n\n // Search by name and disable\n list.forEach(function (name) {\n var idx = this.__find__(name);\n\n if (idx < 0) {\n if (ignoreInvalid) { return; }\n throw new Error('Rules manager: invalid rule name ' + name);\n }\n this.__rules__[idx].enabled = false;\n result.push(name);\n }, this);\n\n this.__cache__ = null;\n return result;\n};\n\n\n/**\n * Ruler.getRules(chainName) -> Array\n *\n * Return array of active functions (rules) for given chain name. It analyzes\n * rules configuration, compiles caches if not exists and returns result.\n *\n * Default chain name is `''` (empty string). It can't be skipped. That's\n * done intentionally, to keep signature monomorphic for high speed.\n **/\nRuler.prototype.getRules = function (chainName) {\n if (this.__cache__ === null) {\n this.__compile__();\n }\n\n // Chain can be empty, if rules disabled. But we still have to return Array.\n return this.__cache__[chainName] || [];\n};\n\nmodule.exports = Ruler;\n","// Token class\n\n'use strict';\n\n\n/**\n * class Token\n **/\n\n/**\n * new Token(type, tag, nesting)\n *\n * Create new token and fill passed properties.\n **/\nfunction Token(type, tag, nesting) {\n /**\n * Token#type -> String\n *\n * Type of the token (string, e.g. \"paragraph_open\")\n **/\n this.type = type;\n\n /**\n * Token#tag -> String\n *\n * html tag name, e.g. \"p\"\n **/\n this.tag = tag;\n\n /**\n * Token#attrs -> Array\n *\n * Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]`\n **/\n this.attrs = null;\n\n /**\n * Token#map -> Array\n *\n * Source map info. Format: `[ line_begin, line_end ]`\n **/\n this.map = null;\n\n /**\n * Token#nesting -> Number\n *\n * Level change (number in {-1, 0, 1} set), where:\n *\n * - `1` means the tag is opening\n * - `0` means the tag is self-closing\n * - `-1` means the tag is closing\n **/\n this.nesting = nesting;\n\n /**\n * Token#level -> Number\n *\n * nesting level, the same as `state.level`\n **/\n this.level = 0;\n\n /**\n * Token#children -> Array\n *\n * An array of child nodes (inline and img tokens)\n **/\n this.children = null;\n\n /**\n * Token#content -> String\n *\n * In a case of self-closing tag (code, html, fence, etc.),\n * it has contents of this tag.\n **/\n this.content = '';\n\n /**\n * Token#markup -> String\n *\n * '*' or '_' for emphasis, fence string for fence, etc.\n **/\n this.markup = '';\n\n /**\n * Token#info -> String\n *\n * fence infostring\n **/\n this.info = '';\n\n /**\n * Token#meta -> Object\n *\n * A place for plugins to store an arbitrary data\n **/\n this.meta = null;\n\n /**\n * Token#block -> Boolean\n *\n * True for block-level tokens, false for inline tokens.\n * Used in renderer to calculate line breaks\n **/\n this.block = false;\n\n /**\n * Token#hidden -> Boolean\n *\n * If it's true, ignore this element when rendering. Used for tight lists\n * to hide paragraphs.\n **/\n this.hidden = false;\n}\n\n\n/**\n * Token.attrIndex(name) -> Number\n *\n * Search attribute index by name.\n **/\nToken.prototype.attrIndex = function attrIndex(name) {\n var attrs, i, len;\n\n if (!this.attrs) { return -1; }\n\n attrs = this.attrs;\n\n for (i = 0, len = attrs.length; i < len; i++) {\n if (attrs[i][0] === name) { return i; }\n }\n return -1;\n};\n\n\n/**\n * Token.attrPush(attrData)\n *\n * Add `[ name, value ]` attribute to list. Init attrs if necessary\n **/\nToken.prototype.attrPush = function attrPush(attrData) {\n if (this.attrs) {\n this.attrs.push(attrData);\n } else {\n this.attrs = [ attrData ];\n }\n};\n\n\n/**\n * Token.attrSet(name, value)\n *\n * Set `name` attribute to `value`. Override old value if exists.\n **/\nToken.prototype.attrSet = function attrSet(name, value) {\n var idx = this.attrIndex(name),\n attrData = [ name, value ];\n\n if (idx < 0) {\n this.attrPush(attrData);\n } else {\n this.attrs[idx] = attrData;\n }\n};\n\n\n/**\n * Token.attrGet(name)\n *\n * Get the value of attribute `name`, or null if it does not exist.\n **/\nToken.prototype.attrGet = function attrGet(name) {\n var idx = this.attrIndex(name), value = null;\n if (idx >= 0) {\n value = this.attrs[idx][1];\n }\n return value;\n};\n\n\n/**\n * Token.attrJoin(name, value)\n *\n * Join value to existing attribute via space. Or create new attribute if not\n * exists. Useful to operate with token classes.\n **/\nToken.prototype.attrJoin = function attrJoin(name, value) {\n var idx = this.attrIndex(name);\n\n if (idx < 0) {\n this.attrPush([ name, value ]);\n } else {\n this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value;\n }\n};\n\n\nmodule.exports = Token;\n","// HTML5 entities map: { name -> utf16string }\n//\n'use strict';\n\n/*eslint quotes:0*/\nmodule.exports = require('entities/lib/maps/entities.json');\n","'use strict';\n\n\nmodule.exports.encode = require('./encode');\nmodule.exports.decode = require('./decode');\nmodule.exports.format = require('./format');\nmodule.exports.parse = require('./parse');\n","module.exports=/[\\0-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/","module.exports=/[\\0-\\x1F\\x7F-\\x9F]/","module.exports=/[ \\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/","// Regexps to match html elements\n\n'use strict';\n\nvar attr_name = '[a-zA-Z_:][a-zA-Z0-9:._-]*';\n\nvar unquoted = '[^\"\\'=<>`\\\\x00-\\\\x20]+';\nvar single_quoted = \"'[^']*'\";\nvar double_quoted = '\"[^\"]*\"';\n\nvar attr_value = '(?:' + unquoted + '|' + single_quoted + '|' + double_quoted + ')';\n\nvar attribute = '(?:\\\\s+' + attr_name + '(?:\\\\s*=\\\\s*' + attr_value + ')?)';\n\nvar open_tag = '<[A-Za-z][A-Za-z0-9\\\\-]*' + attribute + '*\\\\s*\\\\/?>';\n\nvar close_tag = '<\\\\/[A-Za-z][A-Za-z0-9\\\\-]*\\\\s*>';\nvar comment = '|';\nvar processing = '<[?].*?[?]>';\nvar declaration = ']*>';\nvar cdata = '';\n\nvar HTML_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + '|' + comment +\n '|' + processing + '|' + declaration + '|' + cdata + ')');\nvar HTML_OPEN_CLOSE_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + ')');\n\nmodule.exports.HTML_TAG_RE = HTML_TAG_RE;\nmodule.exports.HTML_OPEN_CLOSE_TAG_RE = HTML_OPEN_CLOSE_TAG_RE;\n","// ~~strike through~~\n//\n'use strict';\n\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nmodule.exports.tokenize = function strikethrough(state, silent) {\n var i, scanned, token, len, ch,\n start = state.pos,\n marker = state.src.charCodeAt(start);\n\n if (silent) { return false; }\n\n if (marker !== 0x7E/* ~ */) { return false; }\n\n scanned = state.scanDelims(state.pos, true);\n len = scanned.length;\n ch = String.fromCharCode(marker);\n\n if (len < 2) { return false; }\n\n if (len % 2) {\n token = state.push('text', '', 0);\n token.content = ch;\n len--;\n }\n\n for (i = 0; i < len; i += 2) {\n token = state.push('text', '', 0);\n token.content = ch + ch;\n\n state.delimiters.push({\n marker: marker,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n jump: i,\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close\n });\n }\n\n state.pos += scanned.length;\n\n return true;\n};\n\n\nfunction postProcess(state, delimiters) {\n var i, j,\n startDelim,\n endDelim,\n token,\n loneMarkers = [],\n max = delimiters.length;\n\n for (i = 0; i < max; i++) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== 0x7E/* ~ */) {\n continue;\n }\n\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n token = state.tokens[startDelim.token];\n token.type = 's_open';\n token.tag = 's';\n token.nesting = 1;\n token.markup = '~~';\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = 's_close';\n token.tag = 's';\n token.nesting = -1;\n token.markup = '~~';\n token.content = '';\n\n if (state.tokens[endDelim.token - 1].type === 'text' &&\n state.tokens[endDelim.token - 1].content === '~') {\n\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's splitted\n // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n // start of the sequence.\n //\n // So, we have to move all those markers after subsequent s_close tags.\n //\n while (loneMarkers.length) {\n i = loneMarkers.pop();\n j = i + 1;\n\n while (j < state.tokens.length && state.tokens[j].type === 's_close') {\n j++;\n }\n\n j--;\n\n if (i !== j) {\n token = state.tokens[j];\n state.tokens[j] = state.tokens[i];\n state.tokens[i] = token;\n }\n }\n}\n\n\n// Walk through delimiter list and replace text tokens with tags\n//\nmodule.exports.postProcess = function strikethrough(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n postProcess(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n postProcess(state, tokens_meta[curr].delimiters);\n }\n }\n};\n","// Process *this* and _that_\n//\n'use strict';\n\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nmodule.exports.tokenize = function emphasis(state, silent) {\n var i, scanned, token,\n start = state.pos,\n marker = state.src.charCodeAt(start);\n\n if (silent) { return false; }\n\n if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { return false; }\n\n scanned = state.scanDelims(state.pos, marker === 0x2A);\n\n for (i = 0; i < scanned.length; i++) {\n token = state.push('text', '', 0);\n token.content = String.fromCharCode(marker);\n\n state.delimiters.push({\n // Char code of the starting marker (number).\n //\n marker: marker,\n\n // Total length of these series of delimiters.\n //\n length: scanned.length,\n\n // An amount of characters before this one that's equivalent to\n // current one. In plain English: if this delimiter does not open\n // an emphasis, neither do previous `jump` characters.\n //\n // Used to skip sequences like \"*****\" in one step, for 1st asterisk\n // value will be 0, for 2nd it's 1 and so on.\n //\n jump: i,\n\n // A position of the token this delimiter corresponds to.\n //\n token: state.tokens.length - 1,\n\n // If this delimiter is matched as a valid opener, `end` will be\n // equal to its position, otherwise it's `-1`.\n //\n end: -1,\n\n // Boolean flags that determine if this delimiter could open or close\n // an emphasis.\n //\n open: scanned.can_open,\n close: scanned.can_close\n });\n }\n\n state.pos += scanned.length;\n\n return true;\n};\n\n\nfunction postProcess(state, delimiters) {\n var i,\n startDelim,\n endDelim,\n token,\n ch,\n isStrong,\n max = delimiters.length;\n\n for (i = max - 1; i >= 0; i--) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) {\n continue;\n }\n\n // Process only opening markers\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n // If the previous delimiter has the same marker and is adjacent to this one,\n // merge those into one strong delimiter.\n //\n // `whatever` -> `whatever`\n //\n isStrong = i > 0 &&\n delimiters[i - 1].end === startDelim.end + 1 &&\n delimiters[i - 1].token === startDelim.token - 1 &&\n delimiters[startDelim.end + 1].token === endDelim.token + 1 &&\n delimiters[i - 1].marker === startDelim.marker;\n\n ch = String.fromCharCode(startDelim.marker);\n\n token = state.tokens[startDelim.token];\n token.type = isStrong ? 'strong_open' : 'em_open';\n token.tag = isStrong ? 'strong' : 'em';\n token.nesting = 1;\n token.markup = isStrong ? ch + ch : ch;\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = isStrong ? 'strong_close' : 'em_close';\n token.tag = isStrong ? 'strong' : 'em';\n token.nesting = -1;\n token.markup = isStrong ? ch + ch : ch;\n token.content = '';\n\n if (isStrong) {\n state.tokens[delimiters[i - 1].token].content = '';\n state.tokens[delimiters[startDelim.end + 1].token].content = '';\n i--;\n }\n }\n}\n\n\n// Walk through delimiter list and replace text tokens with tags\n//\nmodule.exports.postProcess = function emphasis(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n postProcess(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n postProcess(state, tokens_meta[curr].delimiters);\n }\n }\n};\n","import CommandButton from './CommandButton';\nimport FormDropdown from './FormDropdown';\nimport InsertImageDropdown from './InsertImageDropdown';\nimport InsertLinkDropdown from './InsertLinkDropdown';\nimport ListButton from './ListButton';\nimport MarkButton from './MarkButton';\nimport NodeTypeDropdown from './NodeTypeDropdown';\nimport ProseMirrorMenu from './ProseMirrorMenu';\n\nexport const components = {\n CommandButton: CommandButton,\n FormDropdown: FormDropdown,\n InsertImageDropdown: InsertImageDropdown,\n InsertLinkDropdown: InsertLinkDropdown,\n ListButton: ListButton,\n MarkButton: MarkButton,\n NodeTypeDropdown: NodeTypeDropdown,\n ProseMirrorMenu: ProseMirrorMenu,\n};\n","import updateToggleMark from './updateToggleMark';\n\nexport const commands = {\n updateToggleMark: updateToggleMark,\n};\n","import { toggleMark, updateMark } from 'tiptap-commands';\n\nexport default function updateToggleMark(type, attrs) {\n return function (state, dispatch) {\n if (state.selection.empty) {\n return toggleMark(type, attrs)(state, dispatch);\n }\n return updateMark(type, attrs)(state, dispatch);\n };\n}\n","import { commands } from './commands';\nimport { markdown } from './markdown';\nimport ProseMirrorEditorDriver from './ProseMirrorEditorDriver';\n\nexport const proseMirror = {\n commands: commands,\n markdown: markdown,\n ProseMirrorEditorDriver: ProseMirrorEditorDriver,\n};\n","import MarkdownParserBuilder from './MarkdownParserBuilder';\nimport MarkdownSerializerBuilder from './MarkdownSerializerBuilder';\nimport SchemaBuilder from './SchemaBuilder';\n\nexport const markdown = {\n MarkdownParserBuilder: MarkdownParserBuilder,\n MarkdownSerializerBuilder: MarkdownSerializerBuilder,\n SchemaBuilder: SchemaBuilder,\n};\n","import MenuState from './MenuState';\n\nexport const states = {\n MenuState: MenuState,\n};\n","import { extend, override } from 'flarum/common/extend';\n\nimport Button from 'flarum/common/components/Button';\nimport TextEditor from 'flarum/common/components/TextEditor';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport classList from 'flarum/common/utils/classList';\n\nimport ProseMirrorEditorDriver from './proseMirror/ProseMirrorEditorDriver';\nimport ProseMirrorMenu from './components/ProseMirrorMenu';\nimport MenuState from './states/MenuState';\n\nexport default function applyEditor() {\n extend(TextEditor.prototype, 'controlItems', function (items) {\n if (!app.forum.attribute('toggleRichTextEditorButton')) return;\n\n const buttonOnClick = () => {\n app.session.user.savePreferences({ useRichTextEditor: !app.session.user.preferences().useRichTextEditor }).then(() => {\n app.composer.editor.destroy();\n this.attrs.composer.editor = this.buildEditor(this.$('.TextEditor-editorContainer')[0]);\n m.redraw.sync();\n app.composer.editor.focus();\n });\n };\n\n items.add(\n 'rich-text',\n \n \n ,\n -10\n );\n });\n\n extend(TextEditor.prototype, 'toolbarItems', function (items) {\n if (!app.session.user.preferences().useRichTextEditor) return;\n\n items.remove('markdown');\n\n items.add('prosemirror-menu', , 100);\n });\n\n extend(TextEditor.prototype, 'buildEditorParams', function (items) {\n if (!app.session.user.preferences().useRichTextEditor) return;\n\n items.menuState = this.menuState = new MenuState();\n items.classNames.push('Post-body');\n items.escape = () => app.composer.close();\n });\n\n override(TextEditor.prototype, 'buildEditor', function (original, dom) {\n if (app.session.user.preferences().useRichTextEditor) {\n return new ProseMirrorEditorDriver(dom, this.buildEditorParams());\n }\n\n return original(dom);\n });\n}\n","module.exports = flarum.core.compat['common/utils/classList'];","// Process ~subscript~\n\n'use strict';\n\n// same as UNESCAPE_MD_RE plus a space\nvar UNESCAPE_RE = /\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;\n\n\nfunction subscript(state, silent) {\n var found,\n content,\n token,\n max = state.posMax,\n start = state.pos;\n\n if (state.src.charCodeAt(start) !== 0x7E/* ~ */) { return false; }\n if (silent) { return false; } // don't run any pairs in validation mode\n if (start + 2 >= max) { return false; }\n\n state.pos = start + 1;\n\n while (state.pos < max) {\n if (state.src.charCodeAt(state.pos) === 0x7E/* ~ */) {\n found = true;\n break;\n }\n\n state.md.inline.skipToken(state);\n }\n\n if (!found || start + 1 === state.pos) {\n state.pos = start;\n return false;\n }\n\n content = state.src.slice(start + 1, state.pos);\n\n // don't allow unescaped spaces/newlines inside\n if (content.match(/(^|[^\\\\])(\\\\\\\\)*\\s/)) {\n state.pos = start;\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + 1;\n\n // Earlier we checked !silent, but this implementation does not need it\n token = state.push('sub_open', 'sub', 1);\n token.markup = '~';\n\n token = state.push('text', '', 0);\n token.content = content.replace(UNESCAPE_RE, '$1');\n\n token = state.push('sub_close', 'sub', -1);\n token.markup = '~';\n\n state.pos = state.posMax + 1;\n state.posMax = max;\n return true;\n}\n\n\nmodule.exports = function sub_plugin(md) {\n md.inline.ruler.after('emphasis', 'sub', subscript);\n};\n","// Process ^superscript^\n\n'use strict';\n\n// same as UNESCAPE_MD_RE plus a space\nvar UNESCAPE_RE = /\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;\n\nfunction superscript(state, silent) {\n var found,\n content,\n token,\n max = state.posMax,\n start = state.pos;\n\n if (state.src.charCodeAt(start) !== 0x5E/* ^ */) { return false; }\n if (silent) { return false; } // don't run any pairs in validation mode\n if (start + 2 >= max) { return false; }\n\n state.pos = start + 1;\n\n while (state.pos < max) {\n if (state.src.charCodeAt(state.pos) === 0x5E/* ^ */) {\n found = true;\n break;\n }\n\n state.md.inline.skipToken(state);\n }\n\n if (!found || start + 1 === state.pos) {\n state.pos = start;\n return false;\n }\n\n content = state.src.slice(start + 1, state.pos);\n\n // don't allow unescaped spaces/newlines inside\n if (content.match(/(^|[^\\\\])(\\\\\\\\)*\\s/)) {\n state.pos = start;\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + 1;\n\n // Earlier we checked !silent, but this implementation does not need it\n token = state.push('sup_open', 'sup', 1);\n token.markup = '^';\n\n token = state.push('text', '', 0);\n token.content = content.replace(UNESCAPE_RE, '$1');\n\n token = state.push('sup_close', 'sup', -1);\n token.markup = '^';\n\n state.pos = state.posMax + 1;\n state.posMax = max;\n return true;\n}\n\n\nmodule.exports = function sup_plugin(md) {\n md.inline.ruler.after('emphasis', 'sup', superscript);\n};\n","// Process latex\n//\n\"use strict\";\n\nfunction isValidDelim(state, pos) {\n let prevChar,\n nextChar,\n max = state.posMax,\n can_open = true,\n can_close = true;\n\n prevChar = pos > 0 ? state.src.charCodeAt(pos - 1) : -1;\n nextChar = pos + 1 <= max ? state.src.charCodeAt(pos + 1) : -1;\n\n // Check non-whitespace conditions for opening and closing, and\n // check that closing delimeter isn't followed by a number\n if (\n prevChar === 0x20 /* \" \" */ ||\n prevChar === 0x09 /* \\t */ ||\n (nextChar >= 0x30 /* \"0\" */ && nextChar <= 0x39) /* \"9\" */\n ) {\n can_close = false;\n }\n if (nextChar === 0x20 /* \" \" */ || nextChar === 0x09 /* \\t */) {\n can_open = false;\n }\n\n return {\n can_open: can_open,\n can_close: can_close,\n };\n}\n\nfunction math_inline(state, silent) {\n let start, match, token, res, pos;\n\n if (state.src[state.pos] !== \"$\") {\n return false;\n }\n\n res = isValidDelim(state, state.pos);\n if (!res.can_open) {\n if (!silent) {\n state.pending += \"$\";\n }\n state.pos += 1;\n return true;\n }\n\n // First check for and bypass all properly escaped delimieters\n // This loop will assume that the first leading backtick can not\n // be the first character in state.src, which is known since\n // we have found an opening delimieter already.\n start = state.pos + 1;\n match = start;\n while ((match = state.src.indexOf(\"$\", match)) !== -1) {\n // Found potential $, look for escapes, pos will point to\n // first non escape when complete\n pos = match - 1;\n while (state.src[pos] === \"\\\\\") {\n pos -= 1;\n }\n\n // Even number of escapes, potential closing delimiter found\n if ((match - pos) % 2 == 1) {\n break;\n }\n match += 1;\n }\n\n // No closing delimter found. Consume $ and continue.\n if (match === -1) {\n if (!silent) {\n state.pending += \"$\";\n }\n state.pos = start;\n return true;\n }\n\n // Check if we have empty content, ie: $$. Do not parse.\n if (match - start === 0) {\n if (!silent) {\n state.pending += \"$$\";\n }\n state.pos = start + 1;\n return true;\n }\n\n // Check for valid closing delimiter\n res = isValidDelim(state, match);\n if (!res.can_close) {\n if (!silent) {\n state.pending += \"$\";\n }\n state.pos = start;\n return true;\n }\n\n if (!silent) {\n token = state.push(\"math_inline\", \"math\", 0);\n token.markup = \"$\";\n token.content = state.src.slice(start, match);\n }\n\n state.pos = match + 1;\n return true;\n}\n\nfunction math_block(state, start, end, silent) {\n let firstLine,\n lastLine,\n next,\n lastPos,\n found = false,\n token,\n pos = state.bMarks[start] + state.tShift[start],\n max = state.eMarks[start];\n\n if (pos + 2 > max) {\n return false;\n }\n if (state.src.slice(pos, pos + 2) !== \"$$\") {\n return false;\n }\n\n pos += 2;\n firstLine = state.src.slice(pos, max);\n\n if (silent) {\n return true;\n }\n if (firstLine.trim().slice(-2) === \"$$\") {\n // Single line expression\n firstLine = firstLine.trim().slice(0, -2);\n found = true;\n }\n\n for (next = start; !found;) {\n next++;\n\n if (next >= end) {\n break;\n }\n\n pos = state.bMarks[next] + state.tShift[next];\n max = state.eMarks[next];\n\n if (pos < max && state.tShift[next] < state.blkIndent) {\n // non-empty line with negative indent should stop the list:\n break;\n }\n\n if (state.src.slice(pos, max).trim().slice(-2) === \"$$\") {\n lastPos = state.src.slice(0, max).lastIndexOf(\"$$\");\n lastLine = state.src.slice(pos, lastPos);\n found = true;\n }\n }\n\n state.line = next + 1;\n\n token = state.push(\"math_block\", \"math\", 0);\n token.block = true;\n token.content =\n (firstLine && firstLine.trim() ? firstLine + \"\\n\" : \"\") +\n state.getLines(start + 1, next, state.tShift[start], true) +\n (lastLine && lastLine.trim() ? lastLine : \"\");\n token.map = [start, state.line];\n token.markup = \"$$\";\n return true;\n}\n\nmodule.exports = (md, options) => {\n options = options || {};\n options.server = options.server || \"https://math.now.sh\";\n options.style = options.style || \"\";\n const purifiedURL = (latex) => {\n return encodeURIComponent(latex).replace(\"(\", \"%28\").replace(\")\", \"%29\");\n };\n\n let Inline = (latex) => {\n try {\n return ``;\n } catch (error) {\n console.error(error);\n return latex;\n }\n };\n\n let Block = (latex) => {\n try {\n return `

      `;\n } catch (error) {\n console.error(error);\n return latex;\n }\n };\n\n md.inline.ruler.after(\"escape\", \"math_inline\", math_inline);\n md.block.ruler.after(\"blockquote\", \"math_block\", math_block, {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n md.renderer.rules.math_inline = (tokens, idx) => {\n return Inline(tokens[idx].content);\n };\n md.renderer.rules.math_block = (tokens, idx) => {\n return Block(tokens[idx].content);\n };\n};\n","module.exports = flarum.core.compat['common/components/Modal'];","// Main parser class\n\n'use strict';\n\n\nvar utils = require('./common/utils');\nvar helpers = require('./helpers');\nvar Renderer = require('./renderer');\nvar ParserCore = require('./parser_core');\nvar ParserBlock = require('./parser_block');\nvar ParserInline = require('./parser_inline');\nvar LinkifyIt = require('linkify-it');\nvar mdurl = require('mdurl');\nvar punycode = require('punycode');\n\n\nvar config = {\n 'default': require('./presets/default'),\n zero: require('./presets/zero'),\n commonmark: require('./presets/commonmark')\n};\n\n////////////////////////////////////////////////////////////////////////////////\n//\n// This validator can prohibit more than really needed to prevent XSS. It's a\n// tradeoff to keep code simple and to be secure by default.\n//\n// If you need different setup - override validator method as you wish. Or\n// replace it with dummy function and use external sanitizer.\n//\n\nvar BAD_PROTO_RE = /^(vbscript|javascript|file|data):/;\nvar GOOD_DATA_RE = /^data:image\\/(gif|png|jpeg|webp);/;\n\nfunction validateLink(url) {\n // url should be normalized at this point, and existing entities are decoded\n var str = url.trim().toLowerCase();\n\n return BAD_PROTO_RE.test(str) ? (GOOD_DATA_RE.test(str) ? true : false) : true;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nvar RECODE_HOSTNAME_FOR = [ 'http:', 'https:', 'mailto:' ];\n\nfunction normalizeLink(url) {\n var parsed = mdurl.parse(url, true);\n\n if (parsed.hostname) {\n // Encode hostnames in urls like:\n // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n //\n // We don't encode unknown schemas, because it's likely that we encode\n // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n //\n if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n try {\n parsed.hostname = punycode.toASCII(parsed.hostname);\n } catch (er) { /**/ }\n }\n }\n\n return mdurl.encode(mdurl.format(parsed));\n}\n\nfunction normalizeLinkText(url) {\n var parsed = mdurl.parse(url, true);\n\n if (parsed.hostname) {\n // Encode hostnames in urls like:\n // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n //\n // We don't encode unknown schemas, because it's likely that we encode\n // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n //\n if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n try {\n parsed.hostname = punycode.toUnicode(parsed.hostname);\n } catch (er) { /**/ }\n }\n }\n\n return mdurl.decode(mdurl.format(parsed));\n}\n\n\n/**\n * class MarkdownIt\n *\n * Main parser/renderer class.\n *\n * ##### Usage\n *\n * ```javascript\n * // node.js, \"classic\" way:\n * var MarkdownIt = require('markdown-it'),\n * md = new MarkdownIt();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // node.js, the same, but with sugar:\n * var md = require('markdown-it')();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // browser without AMD, added to \"window\" on script load\n * // Note, there are no dash.\n * var md = window.markdownit();\n * var result = md.render('# markdown-it rulezz!');\n * ```\n *\n * Single line rendering, without paragraph wrap:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * var result = md.renderInline('__markdown-it__ rulezz!');\n * ```\n **/\n\n/**\n * new MarkdownIt([presetName, options])\n * - presetName (String): optional, `commonmark` / `zero`\n * - options (Object)\n *\n * Creates parser instanse with given config. Can be called without `new`.\n *\n * ##### presetName\n *\n * MarkdownIt provides named presets as a convenience to quickly\n * enable/disable active syntax rules and options for common use cases.\n *\n * - [\"commonmark\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.js) -\n * configures parser to strict [CommonMark](http://commonmark.org/) mode.\n * - [default](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/default.js) -\n * similar to GFM, used when no preset name given. Enables all available rules,\n * but still without html, typographer & autolinker.\n * - [\"zero\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.js) -\n * all rules disabled. Useful to quickly setup your config via `.enable()`.\n * For example, when you need only `bold` and `italic` markup and nothing else.\n *\n * ##### options:\n *\n * - __html__ - `false`. Set `true` to enable HTML tags in source. Be careful!\n * That's not safe! You may need external sanitizer to protect output from XSS.\n * It's better to extend features via plugins, instead of enabling HTML.\n * - __xhtmlOut__ - `false`. Set `true` to add '/' when closing single tags\n * (`
      `). This is needed only for full CommonMark compatibility. In real\n * world you will need HTML output.\n * - __breaks__ - `false`. Set `true` to convert `\\n` in paragraphs into `
      `.\n * - __langPrefix__ - `language-`. CSS language class prefix for fenced blocks.\n * Can be useful for external highlighters.\n * - __linkify__ - `false`. Set `true` to autoconvert URL-like text to links.\n * - __typographer__ - `false`. Set `true` to enable [some language-neutral\n * replacement](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.js) +\n * quotes beautification (smartquotes).\n * - __quotes__ - `“”‘’`, String or Array. Double + single quotes replacement\n * pairs, when typographer enabled and smartquotes on. For example, you can\n * use `'«»„“'` for Russian, `'„“‚‘'` for German, and\n * `['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›']` for French (including nbsp).\n * - __highlight__ - `null`. Highlighter function for fenced code blocks.\n * Highlighter `function (str, lang)` should return escaped HTML. It can also\n * return empty string if the source was not changed and should be escaped\n * externaly. If result starts with `):\n *\n * ```javascript\n * var hljs = require('highlight.js') // https://highlightjs.org/\n *\n * // Actual default values\n * var md = require('markdown-it')({\n * highlight: function (str, lang) {\n * if (lang && hljs.getLanguage(lang)) {\n * try {\n * return '
      ' +\n *                hljs.highlight(lang, str, true).value +\n *                '
      ';\n * } catch (__) {}\n * }\n *\n * return '
      ' + md.utils.escapeHtml(str) + '
      ';\n * }\n * });\n * ```\n *\n **/\nfunction MarkdownIt(presetName, options) {\n if (!(this instanceof MarkdownIt)) {\n return new MarkdownIt(presetName, options);\n }\n\n if (!options) {\n if (!utils.isString(presetName)) {\n options = presetName || {};\n presetName = 'default';\n }\n }\n\n /**\n * MarkdownIt#inline -> ParserInline\n *\n * Instance of [[ParserInline]]. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.inline = new ParserInline();\n\n /**\n * MarkdownIt#block -> ParserBlock\n *\n * Instance of [[ParserBlock]]. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.block = new ParserBlock();\n\n /**\n * MarkdownIt#core -> Core\n *\n * Instance of [[Core]] chain executor. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.core = new ParserCore();\n\n /**\n * MarkdownIt#renderer -> Renderer\n *\n * Instance of [[Renderer]]. Use it to modify output look. Or to add rendering\n * rules for new token types, generated by plugins.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * function myToken(tokens, idx, options, env, self) {\n * //...\n * return result;\n * };\n *\n * md.renderer.rules['my_token'] = myToken\n * ```\n *\n * See [[Renderer]] docs and [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js).\n **/\n this.renderer = new Renderer();\n\n /**\n * MarkdownIt#linkify -> LinkifyIt\n *\n * [linkify-it](https://github.com/markdown-it/linkify-it) instance.\n * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/linkify.js)\n * rule.\n **/\n this.linkify = new LinkifyIt();\n\n /**\n * MarkdownIt#validateLink(url) -> Boolean\n *\n * Link validation function. CommonMark allows too much in links. By default\n * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas\n * except some embedded image types.\n *\n * You can change this behaviour:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * // enable everything\n * md.validateLink = function () { return true; }\n * ```\n **/\n this.validateLink = validateLink;\n\n /**\n * MarkdownIt#normalizeLink(url) -> String\n *\n * Function used to encode link url to a machine-readable format,\n * which includes url-encoding, punycode, etc.\n **/\n this.normalizeLink = normalizeLink;\n\n /**\n * MarkdownIt#normalizeLinkText(url) -> String\n *\n * Function used to decode link url to a human-readable format`\n **/\n this.normalizeLinkText = normalizeLinkText;\n\n\n // Expose utils & helpers for easy acces from plugins\n\n /**\n * MarkdownIt#utils -> utils\n *\n * Assorted utility functions, useful to write plugins. See details\n * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.js).\n **/\n this.utils = utils;\n\n /**\n * MarkdownIt#helpers -> helpers\n *\n * Link components parser functions, useful to write plugins. See details\n * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers).\n **/\n this.helpers = utils.assign({}, helpers);\n\n\n this.options = {};\n this.configure(presetName);\n\n if (options) { this.set(options); }\n}\n\n\n/** chainable\n * MarkdownIt.set(options)\n *\n * Set parser options (in the same format as in constructor). Probably, you\n * will never need it, but you can change options after constructor call.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n * .set({ html: true, breaks: true })\n * .set({ typographer, true });\n * ```\n *\n * __Note:__ To achieve the best possible performance, don't modify a\n * `markdown-it` instance options on the fly. If you need multiple configurations\n * it's best to create multiple instances and initialize each with separate\n * config.\n **/\nMarkdownIt.prototype.set = function (options) {\n utils.assign(this.options, options);\n return this;\n};\n\n\n/** chainable, internal\n * MarkdownIt.configure(presets)\n *\n * Batch load of all options and compenent settings. This is internal method,\n * and you probably will not need it. But if you with - see available presets\n * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets)\n *\n * We strongly recommend to use presets instead of direct config loads. That\n * will give better compatibility with next versions.\n **/\nMarkdownIt.prototype.configure = function (presets) {\n var self = this, presetName;\n\n if (utils.isString(presets)) {\n presetName = presets;\n presets = config[presetName];\n if (!presets) { throw new Error('Wrong `markdown-it` preset \"' + presetName + '\", check name'); }\n }\n\n if (!presets) { throw new Error('Wrong `markdown-it` preset, can\\'t be empty'); }\n\n if (presets.options) { self.set(presets.options); }\n\n if (presets.components) {\n Object.keys(presets.components).forEach(function (name) {\n if (presets.components[name].rules) {\n self[name].ruler.enableOnly(presets.components[name].rules);\n }\n if (presets.components[name].rules2) {\n self[name].ruler2.enableOnly(presets.components[name].rules2);\n }\n });\n }\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.enable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to enable\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable list or rules. It will automatically find appropriate components,\n * containing rules with given names. If rule not found, and `ignoreInvalid`\n * not set - throws exception.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n * .enable(['sub', 'sup'])\n * .disable('smartquotes');\n * ```\n **/\nMarkdownIt.prototype.enable = function (list, ignoreInvalid) {\n var result = [];\n\n if (!Array.isArray(list)) { list = [ list ]; }\n\n [ 'core', 'block', 'inline' ].forEach(function (chain) {\n result = result.concat(this[chain].ruler.enable(list, true));\n }, this);\n\n result = result.concat(this.inline.ruler2.enable(list, true));\n\n var missed = list.filter(function (name) { return result.indexOf(name) < 0; });\n\n if (missed.length && !ignoreInvalid) {\n throw new Error('MarkdownIt. Failed to enable unknown rule(s): ' + missed);\n }\n\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.disable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * The same as [[MarkdownIt.enable]], but turn specified rules off.\n **/\nMarkdownIt.prototype.disable = function (list, ignoreInvalid) {\n var result = [];\n\n if (!Array.isArray(list)) { list = [ list ]; }\n\n [ 'core', 'block', 'inline' ].forEach(function (chain) {\n result = result.concat(this[chain].ruler.disable(list, true));\n }, this);\n\n result = result.concat(this.inline.ruler2.disable(list, true));\n\n var missed = list.filter(function (name) { return result.indexOf(name) < 0; });\n\n if (missed.length && !ignoreInvalid) {\n throw new Error('MarkdownIt. Failed to disable unknown rule(s): ' + missed);\n }\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.use(plugin, params)\n *\n * Load specified plugin with given params into current parser instance.\n * It's just a sugar to call `plugin(md, params)` with curring.\n *\n * ##### Example\n *\n * ```javascript\n * var iterator = require('markdown-it-for-inline');\n * var md = require('markdown-it')()\n * .use(iterator, 'foo_replace', 'text', function (tokens, idx) {\n * tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar');\n * });\n * ```\n **/\nMarkdownIt.prototype.use = function (plugin /*, params, ... */) {\n var args = [ this ].concat(Array.prototype.slice.call(arguments, 1));\n plugin.apply(plugin, args);\n return this;\n};\n\n\n/** internal\n * MarkdownIt.parse(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Parse input string and returns list of block tokens (special token type\n * \"inline\" will contain list of inline tokens). You should not call this\n * method directly, until you write custom renderer (for example, to produce\n * AST).\n *\n * `env` is used to pass data between \"distributed\" rules and return additional\n * metadata like reference info, needed for the renderer. It also can be used to\n * inject data in specific cases. Usually, you will be ok to pass `{}`,\n * and then pass updated object to renderer.\n **/\nMarkdownIt.prototype.parse = function (src, env) {\n if (typeof src !== 'string') {\n throw new Error('Input data should be a String');\n }\n\n var state = new this.core.State(src, this, env);\n\n this.core.process(state);\n\n return state.tokens;\n};\n\n\n/**\n * MarkdownIt.render(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Render markdown string into html. It does all magic for you :).\n *\n * `env` can be used to inject additional metadata (`{}` by default).\n * But you will not need it with high probability. See also comment\n * in [[MarkdownIt.parse]].\n **/\nMarkdownIt.prototype.render = function (src, env) {\n env = env || {};\n\n return this.renderer.render(this.parse(src, env), this.options, env);\n};\n\n\n/** internal\n * MarkdownIt.parseInline(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * The same as [[MarkdownIt.parse]] but skip all block rules. It returns the\n * block tokens list with the single `inline` element, containing parsed inline\n * tokens in `children` property. Also updates `env` object.\n **/\nMarkdownIt.prototype.parseInline = function (src, env) {\n var state = new this.core.State(src, this, env);\n\n state.inlineMode = true;\n this.core.process(state);\n\n return state.tokens;\n};\n\n\n/**\n * MarkdownIt.renderInline(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Similar to [[MarkdownIt.render]] but for single paragraph content. Result\n * will NOT be wrapped into `

      ` tags.\n **/\nMarkdownIt.prototype.renderInline = function (src, env) {\n env = env || {};\n\n return this.renderer.render(this.parseInline(src, env), this.options, env);\n};\n\n\nmodule.exports = MarkdownIt;\n","\n'use strict';\n\n\nvar encodeCache = {};\n\n\n// Create a lookup array where anything but characters in `chars` string\n// and alphanumeric chars is percent-encoded.\n//\nfunction getEncodeCache(exclude) {\n var i, ch, cache = encodeCache[exclude];\n if (cache) { return cache; }\n\n cache = encodeCache[exclude] = [];\n\n for (i = 0; i < 128; i++) {\n ch = String.fromCharCode(i);\n\n if (/^[0-9a-z]$/i.test(ch)) {\n // always allow unencoded alphanumeric characters\n cache.push(ch);\n } else {\n cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2));\n }\n }\n\n for (i = 0; i < exclude.length; i++) {\n cache[exclude.charCodeAt(i)] = exclude[i];\n }\n\n return cache;\n}\n\n\n// Encode unsafe characters with percent-encoding, skipping already\n// encoded sequences.\n//\n// - string - string to encode\n// - exclude - list of characters to ignore (in addition to a-zA-Z0-9)\n// - keepEscaped - don't encode '%' in a correct escape sequence (default: true)\n//\nfunction encode(string, exclude, keepEscaped) {\n var i, l, code, nextCode, cache,\n result = '';\n\n if (typeof exclude !== 'string') {\n // encode(string, keepEscaped)\n keepEscaped = exclude;\n exclude = encode.defaultChars;\n }\n\n if (typeof keepEscaped === 'undefined') {\n keepEscaped = true;\n }\n\n cache = getEncodeCache(exclude);\n\n for (i = 0, l = string.length; i < l; i++) {\n code = string.charCodeAt(i);\n\n if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {\n if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {\n result += string.slice(i, i + 3);\n i += 2;\n continue;\n }\n }\n\n if (code < 128) {\n result += cache[code];\n continue;\n }\n\n if (code >= 0xD800 && code <= 0xDFFF) {\n if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {\n nextCode = string.charCodeAt(i + 1);\n if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {\n result += encodeURIComponent(string[i] + string[i + 1]);\n i++;\n continue;\n }\n }\n result += '%EF%BF%BD';\n continue;\n }\n\n result += encodeURIComponent(string[i]);\n }\n\n return result;\n}\n\nencode.defaultChars = \";/?:@&=+$,-_.!~*'()#\";\nencode.componentChars = \"-_.!~*'()\";\n\n\nmodule.exports = encode;\n","\n'use strict';\n\n\n/* eslint-disable no-bitwise */\n\nvar decodeCache = {};\n\nfunction getDecodeCache(exclude) {\n var i, ch, cache = decodeCache[exclude];\n if (cache) { return cache; }\n\n cache = decodeCache[exclude] = [];\n\n for (i = 0; i < 128; i++) {\n ch = String.fromCharCode(i);\n cache.push(ch);\n }\n\n for (i = 0; i < exclude.length; i++) {\n ch = exclude.charCodeAt(i);\n cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2);\n }\n\n return cache;\n}\n\n\n// Decode percent-encoded string.\n//\nfunction decode(string, exclude) {\n var cache;\n\n if (typeof exclude !== 'string') {\n exclude = decode.defaultChars;\n }\n\n cache = getDecodeCache(exclude);\n\n return string.replace(/(%[a-f0-9]{2})+/gi, function(seq) {\n var i, l, b1, b2, b3, b4, chr,\n result = '';\n\n for (i = 0, l = seq.length; i < l; i += 3) {\n b1 = parseInt(seq.slice(i + 1, i + 3), 16);\n\n if (b1 < 0x80) {\n result += cache[b1];\n continue;\n }\n\n if ((b1 & 0xE0) === 0xC0 && (i + 3 < l)) {\n // 110xxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n\n if ((b2 & 0xC0) === 0x80) {\n chr = ((b1 << 6) & 0x7C0) | (b2 & 0x3F);\n\n if (chr < 0x80) {\n result += '\\ufffd\\ufffd';\n } else {\n result += String.fromCharCode(chr);\n }\n\n i += 3;\n continue;\n }\n }\n\n if ((b1 & 0xF0) === 0xE0 && (i + 6 < l)) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n\n if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n chr = ((b1 << 12) & 0xF000) | ((b2 << 6) & 0xFC0) | (b3 & 0x3F);\n\n if (chr < 0x800 || (chr >= 0xD800 && chr <= 0xDFFF)) {\n result += '\\ufffd\\ufffd\\ufffd';\n } else {\n result += String.fromCharCode(chr);\n }\n\n i += 6;\n continue;\n }\n }\n\n if ((b1 & 0xF8) === 0xF0 && (i + 9 < l)) {\n // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n b4 = parseInt(seq.slice(i + 10, i + 12), 16);\n\n if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) {\n chr = ((b1 << 18) & 0x1C0000) | ((b2 << 12) & 0x3F000) | ((b3 << 6) & 0xFC0) | (b4 & 0x3F);\n\n if (chr < 0x10000 || chr > 0x10FFFF) {\n result += '\\ufffd\\ufffd\\ufffd\\ufffd';\n } else {\n chr -= 0x10000;\n result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF));\n }\n\n i += 9;\n continue;\n }\n }\n\n result += '\\ufffd';\n }\n\n return result;\n });\n}\n\n\ndecode.defaultChars = ';/?:@&=+$,#';\ndecode.componentChars = '';\n\n\nmodule.exports = decode;\n","\n'use strict';\n\n\nmodule.exports = function format(url) {\n var result = '';\n\n result += url.protocol || '';\n result += url.slashes ? '//' : '';\n result += url.auth ? url.auth + '@' : '';\n\n if (url.hostname && url.hostname.indexOf(':') !== -1) {\n // ipv6 address\n result += '[' + url.hostname + ']';\n } else {\n result += url.hostname || '';\n }\n\n result += url.port ? ':' + url.port : '';\n result += url.pathname || '';\n result += url.search || '';\n result += url.hash || '';\n\n return result;\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n//\n// Changes from joyent/node:\n//\n// 1. No leading slash in paths,\n// e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/`\n//\n// 2. Backslashes are not replaced with slashes,\n// so `http:\\\\example.org\\` is treated like a relative path\n//\n// 3. Trailing colon is treated like a part of the path,\n// i.e. in `http://example.org:foo` pathname is `:foo`\n//\n// 4. Nothing is URL-encoded in the resulting object,\n// (in joyent/node some chars in auth and paths are encoded)\n//\n// 5. `url.parse()` does not have `parseQueryString` argument\n//\n// 6. Removed extraneous result properties: `host`, `path`, `query`, etc.,\n// which can be constructed using other parts of the url.\n//\n\n\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.pathname = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = [ '<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t' ],\n\n // RFC 2396: characters not allowed for various reasons.\n unwise = [ '{', '}', '|', '\\\\', '^', '`' ].concat(delims),\n\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = [ '\\'' ].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = [ '%', '/', '?', ';', '#' ].concat(autoEscape),\n hostEndingChars = [ '/', '?', '#' ],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n /* eslint-disable no-script-url */\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n };\n /* eslint-enable no-script-url */\n\nfunction urlParse(url, slashesDenoteHost) {\n if (url && url instanceof Url) { return url; }\n\n var u = new Url();\n u.parse(url, slashesDenoteHost);\n return u;\n}\n\nUrl.prototype.parse = function(url, slashesDenoteHost) {\n var i, l, lowerProto, hec, slashes,\n rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n }\n return this;\n }\n }\n\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n lowerProto = proto.toLowerCase();\n this.protocol = proto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n\n if (!hostlessProtocol[proto] &&\n (slashes || (proto && !slashedProtocol[proto]))) {\n\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (i = 0; i < hostEndingChars.length; i++) {\n hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n hostEnd = hec;\n }\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = auth;\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (i = 0; i < nonHostChars.length; i++) {\n hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n hostEnd = hec;\n }\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1) {\n hostEnd = rest.length;\n }\n\n if (rest[hostEnd - 1] === ':') { hostEnd--; }\n var host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost(host);\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' &&\n this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) { continue; }\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n }\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n }\n }\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n rest = rest.slice(0, qm);\n }\n if (rest) { this.pathname = rest; }\n if (slashedProtocol[lowerProto] &&\n this.hostname && !this.pathname) {\n this.pathname = '';\n }\n\n return this;\n};\n\nUrl.prototype.parseHost = function(host) {\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) { this.hostname = host; }\n};\n\nmodule.exports = urlParse;\n","'use strict';\n\nexports.Any = require('./properties/Any/regex');\nexports.Cc = require('./categories/Cc/regex');\nexports.Cf = require('./categories/Cf/regex');\nexports.P = require('./categories/P/regex');\nexports.Z = require('./categories/Z/regex');\n","module.exports=/[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/","// Just a shortcut for bulk export\n'use strict';\n\n\nexports.parseLinkLabel = require('./parse_link_label');\nexports.parseLinkDestination = require('./parse_link_destination');\nexports.parseLinkTitle = require('./parse_link_title');\n","// Parse link label\n//\n// this function assumes that first character (\"[\") already matches;\n// returns the end of the label\n//\n'use strict';\n\nmodule.exports = function parseLinkLabel(state, start, disableNested) {\n var level, found, marker, prevPos,\n labelEnd = -1,\n max = state.posMax,\n oldPos = state.pos;\n\n state.pos = start + 1;\n level = 1;\n\n while (state.pos < max) {\n marker = state.src.charCodeAt(state.pos);\n if (marker === 0x5D /* ] */) {\n level--;\n if (level === 0) {\n found = true;\n break;\n }\n }\n\n prevPos = state.pos;\n state.md.inline.skipToken(state);\n if (marker === 0x5B /* [ */) {\n if (prevPos === state.pos - 1) {\n // increase level if we find text `[`, which is not a part of any token\n level++;\n } else if (disableNested) {\n state.pos = oldPos;\n return -1;\n }\n }\n }\n\n if (found) {\n labelEnd = state.pos;\n }\n\n // restore old state\n state.pos = oldPos;\n\n return labelEnd;\n};\n","// Parse link destination\n//\n'use strict';\n\n\nvar unescapeAll = require('../common/utils').unescapeAll;\n\n\nmodule.exports = function parseLinkDestination(str, pos, max) {\n var code, level,\n lines = 0,\n start = pos,\n result = {\n ok: false,\n pos: 0,\n lines: 0,\n str: ''\n };\n\n if (str.charCodeAt(pos) === 0x3C /* < */) {\n pos++;\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === 0x0A /* \\n */) { return result; }\n if (code === 0x3E /* > */) {\n result.pos = pos + 1;\n result.str = unescapeAll(str.slice(start + 1, pos));\n result.ok = true;\n return result;\n }\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n pos++;\n }\n\n // no closing '>'\n return result;\n }\n\n // this should be ... } else { ... branch\n\n level = 0;\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x20) { break; }\n\n // ascii control characters\n if (code < 0x20 || code === 0x7F) { break; }\n\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n if (code === 0x28 /* ( */) {\n level++;\n }\n\n if (code === 0x29 /* ) */) {\n if (level === 0) { break; }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos) { return result; }\n if (level !== 0) { return result; }\n\n result.str = unescapeAll(str.slice(start, pos));\n result.lines = lines;\n result.pos = pos;\n result.ok = true;\n return result;\n};\n","// Parse link title\n//\n'use strict';\n\n\nvar unescapeAll = require('../common/utils').unescapeAll;\n\n\nmodule.exports = function parseLinkTitle(str, pos, max) {\n var code,\n marker,\n lines = 0,\n start = pos,\n result = {\n ok: false,\n pos: 0,\n lines: 0,\n str: ''\n };\n\n if (pos >= max) { return result; }\n\n marker = str.charCodeAt(pos);\n\n if (marker !== 0x22 /* \" */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return result; }\n\n pos++;\n\n // if opening marker is \"(\", switch it to closing marker \")\"\n if (marker === 0x28) { marker = 0x29; }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === marker) {\n result.pos = pos + 1;\n result.lines = lines;\n result.str = unescapeAll(str.slice(start + 1, pos));\n result.ok = true;\n return result;\n } else if (code === 0x0A) {\n lines++;\n } else if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos++;\n if (str.charCodeAt(pos) === 0x0A) {\n lines++;\n }\n }\n\n pos++;\n }\n\n return result;\n};\n","/**\n * class Renderer\n *\n * Generates HTML from parsed token stream. Each instance has independent\n * copy of rules. Those can be rewritten with ease. Also, you can add new\n * rules if you create plugin and adds new token types.\n **/\n'use strict';\n\n\nvar assign = require('./common/utils').assign;\nvar unescapeAll = require('./common/utils').unescapeAll;\nvar escapeHtml = require('./common/utils').escapeHtml;\n\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar default_rules = {};\n\n\ndefault_rules.code_inline = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n return '' +\n escapeHtml(tokens[idx].content) +\n '';\n};\n\n\ndefault_rules.code_block = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n return '' +\n escapeHtml(tokens[idx].content) +\n '\\n';\n};\n\n\ndefault_rules.fence = function (tokens, idx, options, env, slf) {\n var token = tokens[idx],\n info = token.info ? unescapeAll(token.info).trim() : '',\n langName = '',\n highlighted, i, tmpAttrs, tmpToken;\n\n if (info) {\n langName = info.split(/\\s+/g)[0];\n }\n\n if (options.highlight) {\n highlighted = options.highlight(token.content, langName) || escapeHtml(token.content);\n } else {\n highlighted = escapeHtml(token.content);\n }\n\n if (highlighted.indexOf(''\n + highlighted\n + '\\n';\n }\n\n\n return '

      '\n        + highlighted\n        + '
      \\n';\n};\n\n\ndefault_rules.image = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n // \"alt\" attr MUST be set, even if empty. Because it's mandatory and\n // should be placed on proper position for tests.\n //\n // Replace content with actual value\n\n token.attrs[token.attrIndex('alt')][1] =\n slf.renderInlineAsText(token.children, options, env);\n\n return slf.renderToken(tokens, idx, options);\n};\n\n\ndefault_rules.hardbreak = function (tokens, idx, options /*, env */) {\n return options.xhtmlOut ? '
      \\n' : '
      \\n';\n};\ndefault_rules.softbreak = function (tokens, idx, options /*, env */) {\n return options.breaks ? (options.xhtmlOut ? '
      \\n' : '
      \\n') : '\\n';\n};\n\n\ndefault_rules.text = function (tokens, idx /*, options, env */) {\n return escapeHtml(tokens[idx].content);\n};\n\n\ndefault_rules.html_block = function (tokens, idx /*, options, env */) {\n return tokens[idx].content;\n};\ndefault_rules.html_inline = function (tokens, idx /*, options, env */) {\n return tokens[idx].content;\n};\n\n\n/**\n * new Renderer()\n *\n * Creates new [[Renderer]] instance and fill [[Renderer#rules]] with defaults.\n **/\nfunction Renderer() {\n\n /**\n * Renderer#rules -> Object\n *\n * Contains render rules for tokens. Can be updated and extended.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.renderer.rules.strong_open = function () { return ''; };\n * md.renderer.rules.strong_close = function () { return ''; };\n *\n * var result = md.renderInline(...);\n * ```\n *\n * Each rule is called as independent static function with fixed signature:\n *\n * ```javascript\n * function my_token_render(tokens, idx, options, env, renderer) {\n * // ...\n * return renderedHTML;\n * }\n * ```\n *\n * See [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js)\n * for more details and examples.\n **/\n this.rules = assign({}, default_rules);\n}\n\n\n/**\n * Renderer.renderAttrs(token) -> String\n *\n * Render token attributes to string.\n **/\nRenderer.prototype.renderAttrs = function renderAttrs(token) {\n var i, l, result;\n\n if (!token.attrs) { return ''; }\n\n result = '';\n\n for (i = 0, l = token.attrs.length; i < l; i++) {\n result += ' ' + escapeHtml(token.attrs[i][0]) + '=\"' + escapeHtml(token.attrs[i][1]) + '\"';\n }\n\n return result;\n};\n\n\n/**\n * Renderer.renderToken(tokens, idx, options) -> String\n * - tokens (Array): list of tokens\n * - idx (Numbed): token index to render\n * - options (Object): params of parser instance\n *\n * Default token renderer. Can be overriden by custom function\n * in [[Renderer#rules]].\n **/\nRenderer.prototype.renderToken = function renderToken(tokens, idx, options) {\n var nextToken,\n result = '',\n needLf = false,\n token = tokens[idx];\n\n // Tight list paragraphs\n if (token.hidden) {\n return '';\n }\n\n // Insert a newline between hidden paragraph and subsequent opening\n // block-level tag.\n //\n // For example, here we should insert a newline before blockquote:\n // - a\n // >\n //\n if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) {\n result += '\\n';\n }\n\n // Add token name, e.g. `
    • `.\n //\n needLf = false;\n }\n }\n }\n }\n\n result += needLf ? '>\\n' : '>';\n\n return result;\n};\n\n\n/**\n * Renderer.renderInline(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to renter\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * The same as [[Renderer.render]], but for single token of `inline` type.\n **/\nRenderer.prototype.renderInline = function (tokens, options, env) {\n var type,\n result = '',\n rules = this.rules;\n\n for (var i = 0, len = tokens.length; i < len; i++) {\n type = tokens[i].type;\n\n if (typeof rules[type] !== 'undefined') {\n result += rules[type](tokens, i, options, env, this);\n } else {\n result += this.renderToken(tokens, i, options);\n }\n }\n\n return result;\n};\n\n\n/** internal\n * Renderer.renderInlineAsText(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to renter\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Special kludge for image `alt` attributes to conform CommonMark spec.\n * Don't try to use it! Spec requires to show `alt` content with stripped markup,\n * instead of simple escaping.\n **/\nRenderer.prototype.renderInlineAsText = function (tokens, options, env) {\n var result = '';\n\n for (var i = 0, len = tokens.length; i < len; i++) {\n if (tokens[i].type === 'text') {\n result += tokens[i].content;\n } else if (tokens[i].type === 'image') {\n result += this.renderInlineAsText(tokens[i].children, options, env);\n }\n }\n\n return result;\n};\n\n\n/**\n * Renderer.render(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to renter\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Takes token stream and generates HTML. Probably, you will never need to call\n * this method directly.\n **/\nRenderer.prototype.render = function (tokens, options, env) {\n var i, len, type,\n result = '',\n rules = this.rules;\n\n for (i = 0, len = tokens.length; i < len; i++) {\n type = tokens[i].type;\n\n if (type === 'inline') {\n result += this.renderInline(tokens[i].children, options, env);\n } else if (typeof rules[type] !== 'undefined') {\n result += rules[tokens[i].type](tokens, i, options, env, this);\n } else {\n result += this.renderToken(tokens, i, options, env);\n }\n }\n\n return result;\n};\n\nmodule.exports = Renderer;\n","/** internal\n * class Core\n *\n * Top-level rules executor. Glues block/inline parsers and does intermediate\n * transformations.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\nvar _rules = [\n [ 'normalize', require('./rules_core/normalize') ],\n [ 'block', require('./rules_core/block') ],\n [ 'inline', require('./rules_core/inline') ],\n [ 'linkify', require('./rules_core/linkify') ],\n [ 'replacements', require('./rules_core/replacements') ],\n [ 'smartquotes', require('./rules_core/smartquotes') ]\n];\n\n\n/**\n * new Core()\n **/\nfunction Core() {\n /**\n * Core#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of core rules.\n **/\n this.ruler = new Ruler();\n\n for (var i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1]);\n }\n}\n\n\n/**\n * Core.process(state)\n *\n * Executes core chain rules.\n **/\nCore.prototype.process = function (state) {\n var i, l, rules;\n\n rules = this.ruler.getRules('');\n\n for (i = 0, l = rules.length; i < l; i++) {\n rules[i](state);\n }\n};\n\nCore.prototype.State = require('./rules_core/state_core');\n\n\nmodule.exports = Core;\n","// Normalize input string\n\n'use strict';\n\n\n// https://spec.commonmark.org/0.29/#line-ending\nvar NEWLINES_RE = /\\r\\n?|\\n/g;\nvar NULL_RE = /\\0/g;\n\n\nmodule.exports = function normalize(state) {\n var str;\n\n // Normalize newlines\n str = state.src.replace(NEWLINES_RE, '\\n');\n\n // Replace NULL characters\n str = str.replace(NULL_RE, '\\uFFFD');\n\n state.src = str;\n};\n","'use strict';\n\n\nmodule.exports = function block(state) {\n var token;\n\n if (state.inlineMode) {\n token = new state.Token('inline', '', 0);\n token.content = state.src;\n token.map = [ 0, 1 ];\n token.children = [];\n state.tokens.push(token);\n } else {\n state.md.block.parse(state.src, state.md, state.env, state.tokens);\n }\n};\n","'use strict';\n\nmodule.exports = function inline(state) {\n var tokens = state.tokens, tok, i, l;\n\n // Parse inlines\n for (i = 0, l = tokens.length; i < l; i++) {\n tok = tokens[i];\n if (tok.type === 'inline') {\n state.md.inline.parse(tok.content, state.md, state.env, tok.children);\n }\n }\n};\n","// Replace link-like texts with link nodes.\n//\n// Currently restricted by `md.validateLink()` to http/https/ftp\n//\n'use strict';\n\n\nvar arrayReplaceAt = require('../common/utils').arrayReplaceAt;\n\n\nfunction isLinkOpen(str) {\n return /^\\s]/i.test(str);\n}\nfunction isLinkClose(str) {\n return /^<\\/a\\s*>/i.test(str);\n}\n\n\nmodule.exports = function linkify(state) {\n var i, j, l, tokens, token, currentToken, nodes, ln, text, pos, lastPos,\n level, htmlLinkLevel, url, fullUrl, urlText,\n blockTokens = state.tokens,\n links;\n\n if (!state.md.options.linkify) { return; }\n\n for (j = 0, l = blockTokens.length; j < l; j++) {\n if (blockTokens[j].type !== 'inline' ||\n !state.md.linkify.pretest(blockTokens[j].content)) {\n continue;\n }\n\n tokens = blockTokens[j].children;\n\n htmlLinkLevel = 0;\n\n // We scan from the end, to keep position when new tags added.\n // Use reversed logic in links start/end match\n for (i = tokens.length - 1; i >= 0; i--) {\n currentToken = tokens[i];\n\n // Skip content of markdown links\n if (currentToken.type === 'link_close') {\n i--;\n while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') {\n i--;\n }\n continue;\n }\n\n // Skip content of html tag links\n if (currentToken.type === 'html_inline') {\n if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) {\n htmlLinkLevel--;\n }\n if (isLinkClose(currentToken.content)) {\n htmlLinkLevel++;\n }\n }\n if (htmlLinkLevel > 0) { continue; }\n\n if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) {\n\n text = currentToken.content;\n links = state.md.linkify.match(text);\n\n // Now split string to nodes\n nodes = [];\n level = currentToken.level;\n lastPos = 0;\n\n for (ln = 0; ln < links.length; ln++) {\n\n url = links[ln].url;\n fullUrl = state.md.normalizeLink(url);\n if (!state.md.validateLink(fullUrl)) { continue; }\n\n urlText = links[ln].text;\n\n // Linkifier might send raw hostnames like \"example.com\", where url\n // starts with domain name. So we prepend http:// in those cases,\n // and remove it afterwards.\n //\n if (!links[ln].schema) {\n urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\\/\\//, '');\n } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) {\n urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, '');\n } else {\n urlText = state.md.normalizeLinkText(urlText);\n }\n\n pos = links[ln].index;\n\n if (pos > lastPos) {\n token = new state.Token('text', '', 0);\n token.content = text.slice(lastPos, pos);\n token.level = level;\n nodes.push(token);\n }\n\n token = new state.Token('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.level = level++;\n token.markup = 'linkify';\n token.info = 'auto';\n nodes.push(token);\n\n token = new state.Token('text', '', 0);\n token.content = urlText;\n token.level = level;\n nodes.push(token);\n\n token = new state.Token('link_close', 'a', -1);\n token.level = --level;\n token.markup = 'linkify';\n token.info = 'auto';\n nodes.push(token);\n\n lastPos = links[ln].lastIndex;\n }\n if (lastPos < text.length) {\n token = new state.Token('text', '', 0);\n token.content = text.slice(lastPos);\n token.level = level;\n nodes.push(token);\n }\n\n // replace current node\n blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes);\n }\n }\n }\n};\n","// Simple typographic replacements\n//\n// (c) (C) → ©\n// (tm) (TM) → ™\n// (r) (R) → ®\n// +- → ±\n// (p) (P) -> §\n// ... → … (also ?.... → ?.., !.... → !..)\n// ???????? → ???, !!!!! → !!!, `,,` → `,`\n// -- → –, --- → —\n//\n'use strict';\n\n// TODO:\n// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾\n// - miltiplication 2 x 4 -> 2 × 4\n\nvar RARE_RE = /\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/;\n\n// Workaround for phantomjs - need regex without /g flag,\n// or root check will fail every second time\nvar SCOPED_ABBR_TEST_RE = /\\((c|tm|r|p)\\)/i;\n\nvar SCOPED_ABBR_RE = /\\((c|tm|r|p)\\)/ig;\nvar SCOPED_ABBR = {\n c: '©',\n r: '®',\n p: '§',\n tm: '™'\n};\n\nfunction replaceFn(match, name) {\n return SCOPED_ABBR[name.toLowerCase()];\n}\n\nfunction replace_scoped(inlineTokens) {\n var i, token, inside_autolink = 0;\n\n for (i = inlineTokens.length - 1; i >= 0; i--) {\n token = inlineTokens[i];\n\n if (token.type === 'text' && !inside_autolink) {\n token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn);\n }\n\n if (token.type === 'link_open' && token.info === 'auto') {\n inside_autolink--;\n }\n\n if (token.type === 'link_close' && token.info === 'auto') {\n inside_autolink++;\n }\n }\n}\n\nfunction replace_rare(inlineTokens) {\n var i, token, inside_autolink = 0;\n\n for (i = inlineTokens.length - 1; i >= 0; i--) {\n token = inlineTokens[i];\n\n if (token.type === 'text' && !inside_autolink) {\n if (RARE_RE.test(token.content)) {\n token.content = token.content\n .replace(/\\+-/g, '±')\n // .., ..., ....... -> …\n // but ?..... & !..... -> ?.. & !..\n .replace(/\\.{2,}/g, '…').replace(/([?!])…/g, '$1..')\n .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',')\n // em-dash\n .replace(/(^|[^-])---([^-]|$)/mg, '$1\\u2014$2')\n // en-dash\n .replace(/(^|\\s)--(\\s|$)/mg, '$1\\u2013$2')\n .replace(/(^|[^-\\s])--([^-\\s]|$)/mg, '$1\\u2013$2');\n }\n }\n\n if (token.type === 'link_open' && token.info === 'auto') {\n inside_autolink--;\n }\n\n if (token.type === 'link_close' && token.info === 'auto') {\n inside_autolink++;\n }\n }\n}\n\n\nmodule.exports = function replace(state) {\n var blkIdx;\n\n if (!state.md.options.typographer) { return; }\n\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n\n if (state.tokens[blkIdx].type !== 'inline') { continue; }\n\n if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) {\n replace_scoped(state.tokens[blkIdx].children);\n }\n\n if (RARE_RE.test(state.tokens[blkIdx].content)) {\n replace_rare(state.tokens[blkIdx].children);\n }\n\n }\n};\n","// Convert straight quotation marks to typographic ones\n//\n'use strict';\n\n\nvar isWhiteSpace = require('../common/utils').isWhiteSpace;\nvar isPunctChar = require('../common/utils').isPunctChar;\nvar isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;\n\nvar QUOTE_TEST_RE = /['\"]/;\nvar QUOTE_RE = /['\"]/g;\nvar APOSTROPHE = '\\u2019'; /* ’ */\n\n\nfunction replaceAt(str, index, ch) {\n return str.substr(0, index) + ch + str.substr(index + 1);\n}\n\nfunction process_inlines(tokens, state) {\n var i, token, text, t, pos, max, thisLevel, item, lastChar, nextChar,\n isLastPunctChar, isNextPunctChar, isLastWhiteSpace, isNextWhiteSpace,\n canOpen, canClose, j, isSingle, stack, openQuote, closeQuote;\n\n stack = [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n\n thisLevel = tokens[i].level;\n\n for (j = stack.length - 1; j >= 0; j--) {\n if (stack[j].level <= thisLevel) { break; }\n }\n stack.length = j + 1;\n\n if (token.type !== 'text') { continue; }\n\n text = token.content;\n pos = 0;\n max = text.length;\n\n /*eslint no-labels:0,block-scoped-var:0*/\n OUTER:\n while (pos < max) {\n QUOTE_RE.lastIndex = pos;\n t = QUOTE_RE.exec(text);\n if (!t) { break; }\n\n canOpen = canClose = true;\n pos = t.index + 1;\n isSingle = (t[0] === \"'\");\n\n // Find previous character,\n // default to space if it's the beginning of the line\n //\n lastChar = 0x20;\n\n if (t.index - 1 >= 0) {\n lastChar = text.charCodeAt(t.index - 1);\n } else {\n for (j = i - 1; j >= 0; j--) {\n if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // lastChar defaults to 0x20\n if (tokens[j].type !== 'text') continue;\n\n lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1);\n break;\n }\n }\n\n // Find next character,\n // default to space if it's the end of the line\n //\n nextChar = 0x20;\n\n if (pos < max) {\n nextChar = text.charCodeAt(pos);\n } else {\n for (j = i + 1; j < tokens.length; j++) {\n if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // nextChar defaults to 0x20\n if (tokens[j].type !== 'text') continue;\n\n nextChar = tokens[j].content.charCodeAt(0);\n break;\n }\n }\n\n isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));\n isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));\n\n isLastWhiteSpace = isWhiteSpace(lastChar);\n isNextWhiteSpace = isWhiteSpace(nextChar);\n\n if (isNextWhiteSpace) {\n canOpen = false;\n } else if (isNextPunctChar) {\n if (!(isLastWhiteSpace || isLastPunctChar)) {\n canOpen = false;\n }\n }\n\n if (isLastWhiteSpace) {\n canClose = false;\n } else if (isLastPunctChar) {\n if (!(isNextWhiteSpace || isNextPunctChar)) {\n canClose = false;\n }\n }\n\n if (nextChar === 0x22 /* \" */ && t[0] === '\"') {\n if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) {\n // special case: 1\"\" - count first quote as an inch\n canClose = canOpen = false;\n }\n }\n\n if (canOpen && canClose) {\n // treat this as the middle of the word\n canOpen = false;\n canClose = isNextPunctChar;\n }\n\n if (!canOpen && !canClose) {\n // middle of word\n if (isSingle) {\n token.content = replaceAt(token.content, t.index, APOSTROPHE);\n }\n continue;\n }\n\n if (canClose) {\n // this could be a closing quote, rewind the stack to get a match\n for (j = stack.length - 1; j >= 0; j--) {\n item = stack[j];\n if (stack[j].level < thisLevel) { break; }\n if (item.single === isSingle && stack[j].level === thisLevel) {\n item = stack[j];\n\n if (isSingle) {\n openQuote = state.md.options.quotes[2];\n closeQuote = state.md.options.quotes[3];\n } else {\n openQuote = state.md.options.quotes[0];\n closeQuote = state.md.options.quotes[1];\n }\n\n // replace token.content *before* tokens[item.token].content,\n // because, if they are pointing at the same token, replaceAt\n // could mess up indices when quote length != 1\n token.content = replaceAt(token.content, t.index, closeQuote);\n tokens[item.token].content = replaceAt(\n tokens[item.token].content, item.pos, openQuote);\n\n pos += closeQuote.length - 1;\n if (item.token === i) { pos += openQuote.length - 1; }\n\n text = token.content;\n max = text.length;\n\n stack.length = j;\n continue OUTER;\n }\n }\n }\n\n if (canOpen) {\n stack.push({\n token: i,\n pos: t.index,\n single: isSingle,\n level: thisLevel\n });\n } else if (canClose && isSingle) {\n token.content = replaceAt(token.content, t.index, APOSTROPHE);\n }\n }\n }\n}\n\n\nmodule.exports = function smartquotes(state) {\n /*eslint max-depth:0*/\n var blkIdx;\n\n if (!state.md.options.typographer) { return; }\n\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n\n if (state.tokens[blkIdx].type !== 'inline' ||\n !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) {\n continue;\n }\n\n process_inlines(state.tokens[blkIdx].children, state);\n }\n};\n","// Core state object\n//\n'use strict';\n\nvar Token = require('../token');\n\n\nfunction StateCore(src, md, env) {\n this.src = src;\n this.env = env;\n this.tokens = [];\n this.inlineMode = false;\n this.md = md; // link to parser instance\n}\n\n// re-export Token class to use in core rules\nStateCore.prototype.Token = Token;\n\n\nmodule.exports = StateCore;\n","/** internal\n * class ParserBlock\n *\n * Block-level tokenizer.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\nvar _rules = [\n // First 2 params - rule name & source. Secondary array - list of rules,\n // which can be terminated by this one.\n [ 'table', require('./rules_block/table'), [ 'paragraph', 'reference' ] ],\n [ 'code', require('./rules_block/code') ],\n [ 'fence', require('./rules_block/fence'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'blockquote', require('./rules_block/blockquote'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'hr', require('./rules_block/hr'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'list', require('./rules_block/list'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'reference', require('./rules_block/reference') ],\n [ 'heading', require('./rules_block/heading'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'lheading', require('./rules_block/lheading') ],\n [ 'html_block', require('./rules_block/html_block'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'paragraph', require('./rules_block/paragraph') ]\n];\n\n\n/**\n * new ParserBlock()\n **/\nfunction ParserBlock() {\n /**\n * ParserBlock#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of block rules.\n **/\n this.ruler = new Ruler();\n\n for (var i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1], { alt: (_rules[i][2] || []).slice() });\n }\n}\n\n\n// Generate tokens for input range\n//\nParserBlock.prototype.tokenize = function (state, startLine, endLine) {\n var ok, i,\n rules = this.ruler.getRules(''),\n len = rules.length,\n line = startLine,\n hasEmptyLines = false,\n maxNesting = state.md.options.maxNesting;\n\n while (line < endLine) {\n state.line = line = state.skipEmptyLines(line);\n if (line >= endLine) { break; }\n\n // Termination condition for nested calls.\n // Nested calls currently used for blockquotes & lists\n if (state.sCount[line] < state.blkIndent) { break; }\n\n // If nesting level exceeded - skip tail to the end. That's not ordinary\n // situation and we should not care about content.\n if (state.level >= maxNesting) {\n state.line = endLine;\n break;\n }\n\n // Try all possible rules.\n // On success, rule should:\n //\n // - update `state.line`\n // - update `state.tokens`\n // - return true\n\n for (i = 0; i < len; i++) {\n ok = rules[i](state, line, endLine, false);\n if (ok) { break; }\n }\n\n // set state.tight if we had an empty line before current tag\n // i.e. latest empty line should not count\n state.tight = !hasEmptyLines;\n\n // paragraph might \"eat\" one newline after it in nested lists\n if (state.isEmpty(state.line - 1)) {\n hasEmptyLines = true;\n }\n\n line = state.line;\n\n if (line < endLine && state.isEmpty(line)) {\n hasEmptyLines = true;\n line++;\n state.line = line;\n }\n }\n};\n\n\n/**\n * ParserBlock.parse(str, md, env, outTokens)\n *\n * Process input string and push block tokens into `outTokens`\n **/\nParserBlock.prototype.parse = function (src, md, env, outTokens) {\n var state;\n\n if (!src) { return; }\n\n state = new this.State(src, md, env, outTokens);\n\n this.tokenize(state, state.line, state.lineMax);\n};\n\n\nParserBlock.prototype.State = require('./rules_block/state_block');\n\n\nmodule.exports = ParserBlock;\n","// GFM table, non-standard\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nfunction getLine(state, line) {\n var pos = state.bMarks[line] + state.blkIndent,\n max = state.eMarks[line];\n\n return state.src.substr(pos, max - pos);\n}\n\nfunction escapedSplit(str) {\n var result = [],\n pos = 0,\n max = str.length,\n ch,\n escapes = 0,\n lastPos = 0,\n backTicked = false,\n lastBackTick = 0;\n\n ch = str.charCodeAt(pos);\n\n while (pos < max) {\n if (ch === 0x60/* ` */) {\n if (backTicked) {\n // make \\` close code sequence, but not open it;\n // the reason is: `\\` is correct code block\n backTicked = false;\n lastBackTick = pos;\n } else if (escapes % 2 === 0) {\n backTicked = true;\n lastBackTick = pos;\n }\n } else if (ch === 0x7c/* | */ && (escapes % 2 === 0) && !backTicked) {\n result.push(str.substring(lastPos, pos));\n lastPos = pos + 1;\n }\n\n if (ch === 0x5c/* \\ */) {\n escapes++;\n } else {\n escapes = 0;\n }\n\n pos++;\n\n // If there was an un-closed backtick, go back to just after\n // the last backtick, but as if it was a normal character\n if (pos === max && backTicked) {\n backTicked = false;\n pos = lastBackTick + 1;\n }\n\n ch = str.charCodeAt(pos);\n }\n\n result.push(str.substring(lastPos));\n\n return result;\n}\n\n\nmodule.exports = function table(state, startLine, endLine, silent) {\n var ch, lineText, pos, i, nextLine, columns, columnCount, token,\n aligns, t, tableLines, tbodyLines;\n\n // should have at least two lines\n if (startLine + 2 > endLine) { return false; }\n\n nextLine = startLine + 1;\n\n if (state.sCount[nextLine] < state.blkIndent) { return false; }\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[nextLine] - state.blkIndent >= 4) { return false; }\n\n // first character of the second line should be '|', '-', ':',\n // and no other characters are allowed but spaces;\n // basically, this is the equivalent of /^[-:|][-:|\\s]*$/ regexp\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n if (pos >= state.eMarks[nextLine]) { return false; }\n\n ch = state.src.charCodeAt(pos++);\n if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */) { return false; }\n\n while (pos < state.eMarks[nextLine]) {\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */ && !isSpace(ch)) { return false; }\n\n pos++;\n }\n\n lineText = getLine(state, startLine + 1);\n\n columns = lineText.split('|');\n aligns = [];\n for (i = 0; i < columns.length; i++) {\n t = columns[i].trim();\n if (!t) {\n // allow empty columns before and after table, but not in between columns;\n // e.g. allow ` |---| `, disallow ` ---||--- `\n if (i === 0 || i === columns.length - 1) {\n continue;\n } else {\n return false;\n }\n }\n\n if (!/^:?-+:?$/.test(t)) { return false; }\n if (t.charCodeAt(t.length - 1) === 0x3A/* : */) {\n aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right');\n } else if (t.charCodeAt(0) === 0x3A/* : */) {\n aligns.push('left');\n } else {\n aligns.push('');\n }\n }\n\n lineText = getLine(state, startLine).trim();\n if (lineText.indexOf('|') === -1) { return false; }\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n columns = escapedSplit(lineText.replace(/^\\||\\|$/g, ''));\n\n // header row will define an amount of columns in the entire table,\n // and align row shouldn't be smaller than that (the rest of the rows can)\n columnCount = columns.length;\n if (columnCount > aligns.length) { return false; }\n\n if (silent) { return true; }\n\n token = state.push('table_open', 'table', 1);\n token.map = tableLines = [ startLine, 0 ];\n\n token = state.push('thead_open', 'thead', 1);\n token.map = [ startLine, startLine + 1 ];\n\n token = state.push('tr_open', 'tr', 1);\n token.map = [ startLine, startLine + 1 ];\n\n for (i = 0; i < columns.length; i++) {\n token = state.push('th_open', 'th', 1);\n token.map = [ startLine, startLine + 1 ];\n if (aligns[i]) {\n token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ];\n }\n\n token = state.push('inline', '', 0);\n token.content = columns[i].trim();\n token.map = [ startLine, startLine + 1 ];\n token.children = [];\n\n token = state.push('th_close', 'th', -1);\n }\n\n token = state.push('tr_close', 'tr', -1);\n token = state.push('thead_close', 'thead', -1);\n\n token = state.push('tbody_open', 'tbody', 1);\n token.map = tbodyLines = [ startLine + 2, 0 ];\n\n for (nextLine = startLine + 2; nextLine < endLine; nextLine++) {\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n lineText = getLine(state, nextLine).trim();\n if (lineText.indexOf('|') === -1) { break; }\n if (state.sCount[nextLine] - state.blkIndent >= 4) { break; }\n columns = escapedSplit(lineText.replace(/^\\||\\|$/g, ''));\n\n token = state.push('tr_open', 'tr', 1);\n for (i = 0; i < columnCount; i++) {\n token = state.push('td_open', 'td', 1);\n if (aligns[i]) {\n token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ];\n }\n\n token = state.push('inline', '', 0);\n token.content = columns[i] ? columns[i].trim() : '';\n token.children = [];\n\n token = state.push('td_close', 'td', -1);\n }\n token = state.push('tr_close', 'tr', -1);\n }\n token = state.push('tbody_close', 'tbody', -1);\n token = state.push('table_close', 'table', -1);\n\n tableLines[1] = tbodyLines[1] = nextLine;\n state.line = nextLine;\n return true;\n};\n","// Code block (4 spaces padded)\n\n'use strict';\n\n\nmodule.exports = function code(state, startLine, endLine/*, silent*/) {\n var nextLine, last, token;\n\n if (state.sCount[startLine] - state.blkIndent < 4) { return false; }\n\n last = nextLine = startLine + 1;\n\n while (nextLine < endLine) {\n if (state.isEmpty(nextLine)) {\n nextLine++;\n continue;\n }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n nextLine++;\n last = nextLine;\n continue;\n }\n break;\n }\n\n state.line = last;\n\n token = state.push('code_block', 'code', 0);\n token.content = state.getLines(startLine, last, 4 + state.blkIndent, true);\n token.map = [ startLine, state.line ];\n\n return true;\n};\n","// fences (``` lang, ~~~ lang)\n\n'use strict';\n\n\nmodule.exports = function fence(state, startLine, endLine, silent) {\n var marker, len, params, nextLine, mem, token, markup,\n haveEndMarker = false,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (pos + 3 > max) { return false; }\n\n marker = state.src.charCodeAt(pos);\n\n if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) {\n return false;\n }\n\n // scan marker length\n mem = pos;\n pos = state.skipChars(pos, marker);\n\n len = pos - mem;\n\n if (len < 3) { return false; }\n\n markup = state.src.slice(mem, pos);\n params = state.src.slice(pos, max);\n\n if (marker === 0x60 /* ` */) {\n if (params.indexOf(String.fromCharCode(marker)) >= 0) {\n return false;\n }\n }\n\n // Since start is found, we can report success here in validation mode\n if (silent) { return true; }\n\n // search end of block\n nextLine = startLine;\n\n for (;;) {\n nextLine++;\n if (nextLine >= endLine) {\n // unclosed block should be autoclosed by end of document.\n // also block seems to be autoclosed by end of parent\n break;\n }\n\n pos = mem = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos < max && state.sCount[nextLine] < state.blkIndent) {\n // non-empty line with negative indent should stop the list:\n // - ```\n // test\n break;\n }\n\n if (state.src.charCodeAt(pos) !== marker) { continue; }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n // closing fence should be indented less than 4 spaces\n continue;\n }\n\n pos = state.skipChars(pos, marker);\n\n // closing code fence must be at least as long as the opening one\n if (pos - mem < len) { continue; }\n\n // make sure tail has spaces only\n pos = state.skipSpaces(pos);\n\n if (pos < max) { continue; }\n\n haveEndMarker = true;\n // found!\n break;\n }\n\n // If a fence has heading spaces, they should be removed from its inner block\n len = state.sCount[startLine];\n\n state.line = nextLine + (haveEndMarker ? 1 : 0);\n\n token = state.push('fence', 'code', 0);\n token.info = params;\n token.content = state.getLines(startLine + 1, nextLine, len, true);\n token.markup = markup;\n token.map = [ startLine, state.line ];\n\n return true;\n};\n","// Block quotes\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function blockquote(state, startLine, endLine, silent) {\n var adjustTab,\n ch,\n i,\n initial,\n l,\n lastLineEmpty,\n lines,\n nextLine,\n offset,\n oldBMarks,\n oldBSCount,\n oldIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n spaceAfterMarker,\n terminate,\n terminatorRules,\n token,\n wasOutdented,\n oldLineMax = state.lineMax,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n // check the block quote marker\n if (state.src.charCodeAt(pos++) !== 0x3E/* > */) { return false; }\n\n // we know that it's going to be a valid blockquote,\n // so no point trying to find the end of it in silent mode\n if (silent) { return true; }\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[startLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks = [ state.bMarks[startLine] ];\n state.bMarks[startLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[startLine] + (adjustTab ? 1 : 0)) % 4;\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n oldBSCount = [ state.bsCount[startLine] ];\n state.bsCount[startLine] = state.sCount[startLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n lastLineEmpty = pos >= max;\n\n oldSCount = [ state.sCount[startLine] ];\n state.sCount[startLine] = offset - initial;\n\n oldTShift = [ state.tShift[startLine] ];\n state.tShift[startLine] = pos - state.bMarks[startLine];\n\n terminatorRules = state.md.block.ruler.getRules('blockquote');\n\n oldParentType = state.parentType;\n state.parentType = 'blockquote';\n wasOutdented = false;\n\n // Search the end of the block\n //\n // Block ends with either:\n // 1. an empty line outside:\n // ```\n // > test\n //\n // ```\n // 2. an empty line inside:\n // ```\n // >\n // test\n // ```\n // 3. another tag:\n // ```\n // > test\n // - - -\n // ```\n for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {\n // check if it's outdented, i.e. it's inside list item and indented\n // less than said list item:\n //\n // ```\n // 1. anything\n // > current blockquote\n // 2. checking this line\n // ```\n if (state.sCount[nextLine] < state.blkIndent) wasOutdented = true;\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos >= max) {\n // Case 1: line is not inside the blockquote, and this line is empty.\n break;\n }\n\n if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !wasOutdented) {\n // This line is inside the blockquote.\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[nextLine] + pos - (state.bMarks[nextLine] + state.tShift[nextLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[nextLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n state.bMarks[nextLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4;\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n lastLineEmpty = pos >= max;\n\n oldBSCount.push(state.bsCount[nextLine]);\n state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] = offset - initial;\n\n oldTShift.push(state.tShift[nextLine]);\n state.tShift[nextLine] = pos - state.bMarks[nextLine];\n continue;\n }\n\n // Case 2: line is not inside the blockquote, and the last line was empty.\n if (lastLineEmpty) { break; }\n\n // Case 3: another tag found.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n\n if (terminate) {\n // Quirk to enforce \"hard termination mode\" for paragraphs;\n // normally if you call `tokenize(state, startLine, nextLine)`,\n // paragraphs will look below nextLine for paragraph continuation,\n // but if blockquote is terminated by another tag, they shouldn't\n state.lineMax = nextLine;\n\n if (state.blkIndent !== 0) {\n // state.blkIndent was non-zero, we now set it to zero,\n // so we need to re-calculate all offsets to appear as\n // if indent wasn't changed\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] -= state.blkIndent;\n }\n\n break;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n\n // A negative indentation means that this is a paragraph continuation\n //\n state.sCount[nextLine] = -1;\n }\n\n oldIndent = state.blkIndent;\n state.blkIndent = 0;\n\n token = state.push('blockquote_open', 'blockquote', 1);\n token.markup = '>';\n token.map = lines = [ startLine, 0 ];\n\n state.md.block.tokenize(state, startLine, nextLine);\n\n token = state.push('blockquote_close', 'blockquote', -1);\n token.markup = '>';\n\n state.lineMax = oldLineMax;\n state.parentType = oldParentType;\n lines[1] = state.line;\n\n // Restore original tShift; this might not be necessary since the parser\n // has already been here, but just to make sure we can do that.\n for (i = 0; i < oldTShift.length; i++) {\n state.bMarks[i + startLine] = oldBMarks[i];\n state.tShift[i + startLine] = oldTShift[i];\n state.sCount[i + startLine] = oldSCount[i];\n state.bsCount[i + startLine] = oldBSCount[i];\n }\n state.blkIndent = oldIndent;\n\n return true;\n};\n","// Horizontal rule\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function hr(state, startLine, endLine, silent) {\n var marker, cnt, ch, token,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n marker = state.src.charCodeAt(pos++);\n\n // Check hr marker\n if (marker !== 0x2A/* * */ &&\n marker !== 0x2D/* - */ &&\n marker !== 0x5F/* _ */) {\n return false;\n }\n\n // markers can be mixed with spaces, but there should be at least 3 of them\n\n cnt = 1;\n while (pos < max) {\n ch = state.src.charCodeAt(pos++);\n if (ch !== marker && !isSpace(ch)) { return false; }\n if (ch === marker) { cnt++; }\n }\n\n if (cnt < 3) { return false; }\n\n if (silent) { return true; }\n\n state.line = startLine + 1;\n\n token = state.push('hr', 'hr', 0);\n token.map = [ startLine, state.line ];\n token.markup = Array(cnt + 1).join(String.fromCharCode(marker));\n\n return true;\n};\n","// Lists\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\n// Search `[-+*][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipBulletListMarker(state, startLine) {\n var marker, pos, max, ch;\n\n pos = state.bMarks[startLine] + state.tShift[startLine];\n max = state.eMarks[startLine];\n\n marker = state.src.charCodeAt(pos++);\n // Check bullet\n if (marker !== 0x2A/* * */ &&\n marker !== 0x2D/* - */ &&\n marker !== 0x2B/* + */) {\n return -1;\n }\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (!isSpace(ch)) {\n // \" -test \" - is not a list item\n return -1;\n }\n }\n\n return pos;\n}\n\n// Search `\\d+[.)][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipOrderedListMarker(state, startLine) {\n var ch,\n start = state.bMarks[startLine] + state.tShift[startLine],\n pos = start,\n max = state.eMarks[startLine];\n\n // List marker should have at least 2 chars (digit + dot)\n if (pos + 1 >= max) { return -1; }\n\n ch = state.src.charCodeAt(pos++);\n\n if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1; }\n\n for (;;) {\n // EOL -> fail\n if (pos >= max) { return -1; }\n\n ch = state.src.charCodeAt(pos++);\n\n if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) {\n\n // List marker should have no more than 9 digits\n // (prevents integer overflow in browsers)\n if (pos - start >= 10) { return -1; }\n\n continue;\n }\n\n // found valid marker\n if (ch === 0x29/* ) */ || ch === 0x2e/* . */) {\n break;\n }\n\n return -1;\n }\n\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (!isSpace(ch)) {\n // \" 1.test \" - is not a list item\n return -1;\n }\n }\n return pos;\n}\n\nfunction markTightParagraphs(state, idx) {\n var i, l,\n level = state.level + 2;\n\n for (i = idx + 2, l = state.tokens.length - 2; i < l; i++) {\n if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {\n state.tokens[i + 2].hidden = true;\n state.tokens[i].hidden = true;\n i += 2;\n }\n }\n}\n\n\nmodule.exports = function list(state, startLine, endLine, silent) {\n var ch,\n contentStart,\n i,\n indent,\n indentAfterMarker,\n initial,\n isOrdered,\n itemLines,\n l,\n listLines,\n listTokIdx,\n markerCharCode,\n markerValue,\n max,\n nextLine,\n offset,\n oldListIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n oldTight,\n pos,\n posAfterMarker,\n prevEmptyEnd,\n start,\n terminate,\n terminatorRules,\n token,\n isTerminatingParagraph = false,\n tight = true;\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n // Special case:\n // - item 1\n // - item 2\n // - item 3\n // - item 4\n // - this one is a paragraph continuation\n if (state.listIndent >= 0 &&\n state.sCount[startLine] - state.listIndent >= 4 &&\n state.sCount[startLine] < state.blkIndent) {\n return false;\n }\n\n // limit conditions when list can interrupt\n // a paragraph (validation mode only)\n if (silent && state.parentType === 'paragraph') {\n // Next list item should still terminate previous list item;\n //\n // This code can fail if plugins use blkIndent as well as lists,\n // but I hope the spec gets fixed long before that happens.\n //\n if (state.tShift[startLine] >= state.blkIndent) {\n isTerminatingParagraph = true;\n }\n }\n\n // Detect list type and position after marker\n if ((posAfterMarker = skipOrderedListMarker(state, startLine)) >= 0) {\n isOrdered = true;\n start = state.bMarks[startLine] + state.tShift[startLine];\n markerValue = Number(state.src.substr(start, posAfterMarker - start - 1));\n\n // If we're starting a new ordered list right after\n // a paragraph, it should start with 1.\n if (isTerminatingParagraph && markerValue !== 1) return false;\n\n } else if ((posAfterMarker = skipBulletListMarker(state, startLine)) >= 0) {\n isOrdered = false;\n\n } else {\n return false;\n }\n\n // If we're starting a new unordered list right after\n // a paragraph, first line should not be empty.\n if (isTerminatingParagraph) {\n if (state.skipSpaces(posAfterMarker) >= state.eMarks[startLine]) return false;\n }\n\n // We should terminate list on style change. Remember first one to compare.\n markerCharCode = state.src.charCodeAt(posAfterMarker - 1);\n\n // For validation mode we can terminate immediately\n if (silent) { return true; }\n\n // Start list\n listTokIdx = state.tokens.length;\n\n if (isOrdered) {\n token = state.push('ordered_list_open', 'ol', 1);\n if (markerValue !== 1) {\n token.attrs = [ [ 'start', markerValue ] ];\n }\n\n } else {\n token = state.push('bullet_list_open', 'ul', 1);\n }\n\n token.map = listLines = [ startLine, 0 ];\n token.markup = String.fromCharCode(markerCharCode);\n\n //\n // Iterate list items\n //\n\n nextLine = startLine;\n prevEmptyEnd = false;\n terminatorRules = state.md.block.ruler.getRules('list');\n\n oldParentType = state.parentType;\n state.parentType = 'list';\n\n while (nextLine < endLine) {\n pos = posAfterMarker;\n max = state.eMarks[nextLine];\n\n initial = offset = state.sCount[nextLine] + posAfterMarker - (state.bMarks[startLine] + state.tShift[startLine]);\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[nextLine]) % 4;\n } else if (ch === 0x20) {\n offset++;\n } else {\n break;\n }\n\n pos++;\n }\n\n contentStart = pos;\n\n if (contentStart >= max) {\n // trimming space in \"- \\n 3\" case, indent is 1 here\n indentAfterMarker = 1;\n } else {\n indentAfterMarker = offset - initial;\n }\n\n // If we have more than 4 spaces, the indent is 1\n // (the rest is just indented code block)\n if (indentAfterMarker > 4) { indentAfterMarker = 1; }\n\n // \" - test\"\n // ^^^^^ - calculating total length of this thing\n indent = initial + indentAfterMarker;\n\n // Run subparser & write tokens\n token = state.push('list_item_open', 'li', 1);\n token.markup = String.fromCharCode(markerCharCode);\n token.map = itemLines = [ startLine, 0 ];\n\n // change current state, then restore it after parser subcall\n oldTight = state.tight;\n oldTShift = state.tShift[startLine];\n oldSCount = state.sCount[startLine];\n\n // - example list\n // ^ listIndent position will be here\n // ^ blkIndent position will be here\n //\n oldListIndent = state.listIndent;\n state.listIndent = state.blkIndent;\n state.blkIndent = indent;\n\n state.tight = true;\n state.tShift[startLine] = contentStart - state.bMarks[startLine];\n state.sCount[startLine] = offset;\n\n if (contentStart >= max && state.isEmpty(startLine + 1)) {\n // workaround for this case\n // (list item is empty, list terminates before \"foo\"):\n // ~~~~~~~~\n // -\n //\n // foo\n // ~~~~~~~~\n state.line = Math.min(state.line + 2, endLine);\n } else {\n state.md.block.tokenize(state, startLine, endLine, true);\n }\n\n // If any of list item is tight, mark list as tight\n if (!state.tight || prevEmptyEnd) {\n tight = false;\n }\n // Item become loose if finish with empty line,\n // but we should filter last element, because it means list finish\n prevEmptyEnd = (state.line - startLine) > 1 && state.isEmpty(state.line - 1);\n\n state.blkIndent = state.listIndent;\n state.listIndent = oldListIndent;\n state.tShift[startLine] = oldTShift;\n state.sCount[startLine] = oldSCount;\n state.tight = oldTight;\n\n token = state.push('list_item_close', 'li', -1);\n token.markup = String.fromCharCode(markerCharCode);\n\n nextLine = startLine = state.line;\n itemLines[1] = nextLine;\n contentStart = state.bMarks[startLine];\n\n if (nextLine >= endLine) { break; }\n\n //\n // Try to check if list is terminated or continued.\n //\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { break; }\n\n // fail if terminating block found\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n\n // fail if list has another type\n if (isOrdered) {\n posAfterMarker = skipOrderedListMarker(state, nextLine);\n if (posAfterMarker < 0) { break; }\n } else {\n posAfterMarker = skipBulletListMarker(state, nextLine);\n if (posAfterMarker < 0) { break; }\n }\n\n if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break; }\n }\n\n // Finalize list\n if (isOrdered) {\n token = state.push('ordered_list_close', 'ol', -1);\n } else {\n token = state.push('bullet_list_close', 'ul', -1);\n }\n token.markup = String.fromCharCode(markerCharCode);\n\n listLines[1] = nextLine;\n state.line = nextLine;\n\n state.parentType = oldParentType;\n\n // mark paragraphs tight if needed\n if (tight) {\n markTightParagraphs(state, listTokIdx);\n }\n\n return true;\n};\n","'use strict';\n\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function reference(state, startLine, _endLine, silent) {\n var ch,\n destEndPos,\n destEndLineNo,\n endLine,\n href,\n i,\n l,\n label,\n labelEnd,\n oldParentType,\n res,\n start,\n str,\n terminate,\n terminatorRules,\n title,\n lines = 0,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine],\n nextLine = startLine + 1;\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (state.src.charCodeAt(pos) !== 0x5B/* [ */) { return false; }\n\n // Simple check to quickly interrupt scan on [link](url) at the start of line.\n // Can be useful on practice: https://github.com/markdown-it/markdown-it/issues/54\n while (++pos < max) {\n if (state.src.charCodeAt(pos) === 0x5D /* ] */ &&\n state.src.charCodeAt(pos - 1) !== 0x5C/* \\ */) {\n if (pos + 1 === max) { return false; }\n if (state.src.charCodeAt(pos + 1) !== 0x3A/* : */) { return false; }\n break;\n }\n }\n\n endLine = state.lineMax;\n\n // jump line-by-line until empty one or EOF\n terminatorRules = state.md.block.ruler.getRules('reference');\n\n oldParentType = state.parentType;\n state.parentType = 'reference';\n\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n str = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n max = str.length;\n\n for (pos = 1; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x5B /* [ */) {\n return false;\n } else if (ch === 0x5D /* ] */) {\n labelEnd = pos;\n break;\n } else if (ch === 0x0A /* \\n */) {\n lines++;\n } else if (ch === 0x5C /* \\ */) {\n pos++;\n if (pos < max && str.charCodeAt(pos) === 0x0A) {\n lines++;\n }\n }\n }\n\n if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return false; }\n\n // [label]: destination 'title'\n // ^^^ skip optional whitespace here\n for (pos = labelEnd + 2; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x0A) {\n lines++;\n } else if (isSpace(ch)) {\n /*eslint no-empty:0*/\n } else {\n break;\n }\n }\n\n // [label]: destination 'title'\n // ^^^^^^^^^^^ parse this\n res = state.md.helpers.parseLinkDestination(str, pos, max);\n if (!res.ok) { return false; }\n\n href = state.md.normalizeLink(res.str);\n if (!state.md.validateLink(href)) { return false; }\n\n pos = res.pos;\n lines += res.lines;\n\n // save cursor state, we could require to rollback later\n destEndPos = pos;\n destEndLineNo = lines;\n\n // [label]: destination 'title'\n // ^^^ skipping those spaces\n start = pos;\n for (; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x0A) {\n lines++;\n } else if (isSpace(ch)) {\n /*eslint no-empty:0*/\n } else {\n break;\n }\n }\n\n // [label]: destination 'title'\n // ^^^^^^^ parse this\n res = state.md.helpers.parseLinkTitle(str, pos, max);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n lines += res.lines;\n } else {\n title = '';\n pos = destEndPos;\n lines = destEndLineNo;\n }\n\n // skip trailing spaces until the rest of the line\n while (pos < max) {\n ch = str.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n\n if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n if (title) {\n // garbage at the end of the line after title,\n // but it could still be a valid reference if we roll back\n title = '';\n pos = destEndPos;\n lines = destEndLineNo;\n while (pos < max) {\n ch = str.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n }\n }\n\n if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n // garbage at the end of the line\n return false;\n }\n\n label = normalizeReference(str.slice(1, labelEnd));\n if (!label) {\n // CommonMark 0.20 disallows empty labels\n return false;\n }\n\n // Reference can not terminate anything. This check is for safety only.\n /*istanbul ignore if*/\n if (silent) { return true; }\n\n if (typeof state.env.references === 'undefined') {\n state.env.references = {};\n }\n if (typeof state.env.references[label] === 'undefined') {\n state.env.references[label] = { title: title, href: href };\n }\n\n state.parentType = oldParentType;\n\n state.line = startLine + lines + 1;\n return true;\n};\n","// heading (#, ##, ...)\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function heading(state, startLine, endLine, silent) {\n var ch, level, tmp, token,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x23/* # */ || pos >= max) { return false; }\n\n // count heading level\n level = 1;\n ch = state.src.charCodeAt(++pos);\n while (ch === 0x23/* # */ && pos < max && level <= 6) {\n level++;\n ch = state.src.charCodeAt(++pos);\n }\n\n if (level > 6 || (pos < max && !isSpace(ch))) { return false; }\n\n if (silent) { return true; }\n\n // Let's cut tails like ' ### ' from the end of string\n\n max = state.skipSpacesBack(max, pos);\n tmp = state.skipCharsBack(max, 0x23, pos); // #\n if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) {\n max = tmp;\n }\n\n state.line = startLine + 1;\n\n token = state.push('heading_open', 'h' + String(level), 1);\n token.markup = '########'.slice(0, level);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = state.src.slice(pos, max).trim();\n token.map = [ startLine, state.line ];\n token.children = [];\n\n token = state.push('heading_close', 'h' + String(level), -1);\n token.markup = '########'.slice(0, level);\n\n return true;\n};\n","// lheading (---, ===)\n\n'use strict';\n\n\nmodule.exports = function lheading(state, startLine, endLine/*, silent*/) {\n var content, terminate, i, l, token, pos, max, level, marker,\n nextLine = startLine + 1, oldParentType,\n terminatorRules = state.md.block.ruler.getRules('paragraph');\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n oldParentType = state.parentType;\n state.parentType = 'paragraph'; // use paragraph to match terminatorRules\n\n // jump line-by-line until empty one or EOF\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n //\n // Check for underline in setext header\n //\n if (state.sCount[nextLine] >= state.blkIndent) {\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos < max) {\n marker = state.src.charCodeAt(pos);\n\n if (marker === 0x2D/* - */ || marker === 0x3D/* = */) {\n pos = state.skipChars(pos, marker);\n pos = state.skipSpaces(pos);\n\n if (pos >= max) {\n level = (marker === 0x3D/* = */ ? 1 : 2);\n break;\n }\n }\n }\n }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n if (!level) {\n // Didn't find valid underline\n return false;\n }\n\n content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n\n state.line = nextLine + 1;\n\n token = state.push('heading_open', 'h' + String(level), 1);\n token.markup = String.fromCharCode(marker);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = content;\n token.map = [ startLine, state.line - 1 ];\n token.children = [];\n\n token = state.push('heading_close', 'h' + String(level), -1);\n token.markup = String.fromCharCode(marker);\n\n state.parentType = oldParentType;\n\n return true;\n};\n","// HTML block\n\n'use strict';\n\n\nvar block_names = require('../common/html_blocks');\nvar HTML_OPEN_CLOSE_TAG_RE = require('../common/html_re').HTML_OPEN_CLOSE_TAG_RE;\n\n// An array of opening and corresponding closing sequences for html tags,\n// last argument defines whether it can terminate a paragraph or not\n//\nvar HTML_SEQUENCES = [\n [ /^<(script|pre|style)(?=(\\s|>|$))/i, /<\\/(script|pre|style)>/i, true ],\n [ /^/, true ],\n [ /^<\\?/, /\\?>/, true ],\n [ /^/, true ],\n [ /^/, true ],\n [ new RegExp('^|$))', 'i'), /^$/, true ],\n [ new RegExp(HTML_OPEN_CLOSE_TAG_RE.source + '\\\\s*$'), /^$/, false ]\n];\n\n\nmodule.exports = function html_block(state, startLine, endLine, silent) {\n var i, nextLine, token, lineText,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (!state.md.options.html) { return false; }\n\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\n\n lineText = state.src.slice(pos, max);\n\n for (i = 0; i < HTML_SEQUENCES.length; i++) {\n if (HTML_SEQUENCES[i][0].test(lineText)) { break; }\n }\n\n if (i === HTML_SEQUENCES.length) { return false; }\n\n if (silent) {\n // true if this sequence can be a terminator, false otherwise\n return HTML_SEQUENCES[i][2];\n }\n\n nextLine = startLine + 1;\n\n // If we are here - we detected HTML block.\n // Let's roll down till block end.\n if (!HTML_SEQUENCES[i][1].test(lineText)) {\n for (; nextLine < endLine; nextLine++) {\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n lineText = state.src.slice(pos, max);\n\n if (HTML_SEQUENCES[i][1].test(lineText)) {\n if (lineText.length !== 0) { nextLine++; }\n break;\n }\n }\n }\n\n state.line = nextLine;\n\n token = state.push('html_block', '', 0);\n token.map = [ startLine, nextLine ];\n token.content = state.getLines(startLine, nextLine, state.blkIndent, true);\n\n return true;\n};\n","// List of valid html blocks names, accorting to commonmark spec\n// http://jgm.github.io/CommonMark/spec.html#html-blocks\n\n'use strict';\n\n\nmodule.exports = [\n 'address',\n 'article',\n 'aside',\n 'base',\n 'basefont',\n 'blockquote',\n 'body',\n 'caption',\n 'center',\n 'col',\n 'colgroup',\n 'dd',\n 'details',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'frame',\n 'frameset',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hr',\n 'html',\n 'iframe',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'menu',\n 'menuitem',\n 'meta',\n 'nav',\n 'noframes',\n 'ol',\n 'optgroup',\n 'option',\n 'p',\n 'param',\n 'section',\n 'source',\n 'summary',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'title',\n 'tr',\n 'track',\n 'ul'\n];\n","// Paragraph\n\n'use strict';\n\n\nmodule.exports = function paragraph(state, startLine/*, endLine*/) {\n var content, terminate, i, l, token, oldParentType,\n nextLine = startLine + 1,\n terminatorRules = state.md.block.ruler.getRules('paragraph'),\n endLine = state.lineMax;\n\n oldParentType = state.parentType;\n state.parentType = 'paragraph';\n\n // jump line-by-line until empty one or EOF\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n\n state.line = nextLine;\n\n token = state.push('paragraph_open', 'p', 1);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = content;\n token.map = [ startLine, state.line ];\n token.children = [];\n\n token = state.push('paragraph_close', 'p', -1);\n\n state.parentType = oldParentType;\n\n return true;\n};\n","// Parser state class\n\n'use strict';\n\nvar Token = require('../token');\nvar isSpace = require('../common/utils').isSpace;\n\n\nfunction StateBlock(src, md, env, tokens) {\n var ch, s, start, pos, len, indent, offset, indent_found;\n\n this.src = src;\n\n // link to parser instance\n this.md = md;\n\n this.env = env;\n\n //\n // Internal state vartiables\n //\n\n this.tokens = tokens;\n\n this.bMarks = []; // line begin offsets for fast jumps\n this.eMarks = []; // line end offsets for fast jumps\n this.tShift = []; // offsets of the first non-space characters (tabs not expanded)\n this.sCount = []; // indents for each line (tabs expanded)\n\n // An amount of virtual spaces (tabs expanded) between beginning\n // of each line (bMarks) and real beginning of that line.\n //\n // It exists only as a hack because blockquotes override bMarks\n // losing information in the process.\n //\n // It's used only when expanding tabs, you can think about it as\n // an initial tab length, e.g. bsCount=21 applied to string `\\t123`\n // means first tab should be expanded to 4-21%4 === 3 spaces.\n //\n this.bsCount = [];\n\n // block parser variables\n this.blkIndent = 0; // required block content indent (for example, if we are\n // inside a list, it would be positioned after list marker)\n this.line = 0; // line index in src\n this.lineMax = 0; // lines count\n this.tight = false; // loose/tight mode for lists\n this.ddIndent = -1; // indent of the current dd block (-1 if there isn't any)\n this.listIndent = -1; // indent of the current list block (-1 if there isn't any)\n\n // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'\n // used in lists to determine if they interrupt a paragraph\n this.parentType = 'root';\n\n this.level = 0;\n\n // renderer\n this.result = '';\n\n // Create caches\n // Generate markers.\n s = this.src;\n indent_found = false;\n\n for (start = pos = indent = offset = 0, len = s.length; pos < len; pos++) {\n ch = s.charCodeAt(pos);\n\n if (!indent_found) {\n if (isSpace(ch)) {\n indent++;\n\n if (ch === 0x09) {\n offset += 4 - offset % 4;\n } else {\n offset++;\n }\n continue;\n } else {\n indent_found = true;\n }\n }\n\n if (ch === 0x0A || pos === len - 1) {\n if (ch !== 0x0A) { pos++; }\n this.bMarks.push(start);\n this.eMarks.push(pos);\n this.tShift.push(indent);\n this.sCount.push(offset);\n this.bsCount.push(0);\n\n indent_found = false;\n indent = 0;\n offset = 0;\n start = pos + 1;\n }\n }\n\n // Push fake entry to simplify cache bounds checks\n this.bMarks.push(s.length);\n this.eMarks.push(s.length);\n this.tShift.push(0);\n this.sCount.push(0);\n this.bsCount.push(0);\n\n this.lineMax = this.bMarks.length - 1; // don't count last fake line\n}\n\n// Push new token to \"stream\".\n//\nStateBlock.prototype.push = function (type, tag, nesting) {\n var token = new Token(type, tag, nesting);\n token.block = true;\n\n if (nesting < 0) this.level--; // closing tag\n token.level = this.level;\n if (nesting > 0) this.level++; // opening tag\n\n this.tokens.push(token);\n return token;\n};\n\nStateBlock.prototype.isEmpty = function isEmpty(line) {\n return this.bMarks[line] + this.tShift[line] >= this.eMarks[line];\n};\n\nStateBlock.prototype.skipEmptyLines = function skipEmptyLines(from) {\n for (var max = this.lineMax; from < max; from++) {\n if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) {\n break;\n }\n }\n return from;\n};\n\n// Skip spaces from given position.\nStateBlock.prototype.skipSpaces = function skipSpaces(pos) {\n var ch;\n\n for (var max = this.src.length; pos < max; pos++) {\n ch = this.src.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n }\n return pos;\n};\n\n// Skip spaces from given position in reverse.\nStateBlock.prototype.skipSpacesBack = function skipSpacesBack(pos, min) {\n if (pos <= min) { return pos; }\n\n while (pos > min) {\n if (!isSpace(this.src.charCodeAt(--pos))) { return pos + 1; }\n }\n return pos;\n};\n\n// Skip char codes from given position\nStateBlock.prototype.skipChars = function skipChars(pos, code) {\n for (var max = this.src.length; pos < max; pos++) {\n if (this.src.charCodeAt(pos) !== code) { break; }\n }\n return pos;\n};\n\n// Skip char codes reverse from given position - 1\nStateBlock.prototype.skipCharsBack = function skipCharsBack(pos, code, min) {\n if (pos <= min) { return pos; }\n\n while (pos > min) {\n if (code !== this.src.charCodeAt(--pos)) { return pos + 1; }\n }\n return pos;\n};\n\n// cut lines range from source.\nStateBlock.prototype.getLines = function getLines(begin, end, indent, keepLastLF) {\n var i, lineIndent, ch, first, last, queue, lineStart,\n line = begin;\n\n if (begin >= end) {\n return '';\n }\n\n queue = new Array(end - begin);\n\n for (i = 0; line < end; line++, i++) {\n lineIndent = 0;\n lineStart = first = this.bMarks[line];\n\n if (line + 1 < end || keepLastLF) {\n // No need for bounds check because we have fake entry on tail.\n last = this.eMarks[line] + 1;\n } else {\n last = this.eMarks[line];\n }\n\n while (first < last && lineIndent < indent) {\n ch = this.src.charCodeAt(first);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4;\n } else {\n lineIndent++;\n }\n } else if (first - lineStart < this.tShift[line]) {\n // patched tShift masked characters to look like spaces (blockquotes, list markers)\n lineIndent++;\n } else {\n break;\n }\n\n first++;\n }\n\n if (lineIndent > indent) {\n // partially expanding tabs in code blocks, e.g '\\t\\tfoobar'\n // with indent=2 becomes ' \\tfoobar'\n queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last);\n } else {\n queue[i] = this.src.slice(first, last);\n }\n }\n\n return queue.join('');\n};\n\n// re-export Token class to use in block rules\nStateBlock.prototype.Token = Token;\n\n\nmodule.exports = StateBlock;\n","/** internal\n * class ParserInline\n *\n * Tokenizes paragraph content.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Parser rules\n\nvar _rules = [\n [ 'text', require('./rules_inline/text') ],\n [ 'newline', require('./rules_inline/newline') ],\n [ 'escape', require('./rules_inline/escape') ],\n [ 'backticks', require('./rules_inline/backticks') ],\n [ 'strikethrough', require('./rules_inline/strikethrough').tokenize ],\n [ 'emphasis', require('./rules_inline/emphasis').tokenize ],\n [ 'link', require('./rules_inline/link') ],\n [ 'image', require('./rules_inline/image') ],\n [ 'autolink', require('./rules_inline/autolink') ],\n [ 'html_inline', require('./rules_inline/html_inline') ],\n [ 'entity', require('./rules_inline/entity') ]\n];\n\nvar _rules2 = [\n [ 'balance_pairs', require('./rules_inline/balance_pairs') ],\n [ 'strikethrough', require('./rules_inline/strikethrough').postProcess ],\n [ 'emphasis', require('./rules_inline/emphasis').postProcess ],\n [ 'text_collapse', require('./rules_inline/text_collapse') ]\n];\n\n\n/**\n * new ParserInline()\n **/\nfunction ParserInline() {\n var i;\n\n /**\n * ParserInline#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of inline rules.\n **/\n this.ruler = new Ruler();\n\n for (i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1]);\n }\n\n /**\n * ParserInline#ruler2 -> Ruler\n *\n * [[Ruler]] instance. Second ruler used for post-processing\n * (e.g. in emphasis-like rules).\n **/\n this.ruler2 = new Ruler();\n\n for (i = 0; i < _rules2.length; i++) {\n this.ruler2.push(_rules2[i][0], _rules2[i][1]);\n }\n}\n\n\n// Skip single token by running all rules in validation mode;\n// returns `true` if any rule reported success\n//\nParserInline.prototype.skipToken = function (state) {\n var ok, i, pos = state.pos,\n rules = this.ruler.getRules(''),\n len = rules.length,\n maxNesting = state.md.options.maxNesting,\n cache = state.cache;\n\n\n if (typeof cache[pos] !== 'undefined') {\n state.pos = cache[pos];\n return;\n }\n\n if (state.level < maxNesting) {\n for (i = 0; i < len; i++) {\n // Increment state.level and decrement it later to limit recursion.\n // It's harmless to do here, because no tokens are created. But ideally,\n // we'd need a separate private state variable for this purpose.\n //\n state.level++;\n ok = rules[i](state, true);\n state.level--;\n\n if (ok) { break; }\n }\n } else {\n // Too much nesting, just skip until the end of the paragraph.\n //\n // NOTE: this will cause links to behave incorrectly in the following case,\n // when an amount of `[` is exactly equal to `maxNesting + 1`:\n //\n // [[[[[[[[[[[[[[[[[[[[[foo]()\n //\n // TODO: remove this workaround when CM standard will allow nested links\n // (we can replace it by preventing links from being parsed in\n // validation mode)\n //\n state.pos = state.posMax;\n }\n\n if (!ok) { state.pos++; }\n cache[pos] = state.pos;\n};\n\n\n// Generate tokens for input range\n//\nParserInline.prototype.tokenize = function (state) {\n var ok, i,\n rules = this.ruler.getRules(''),\n len = rules.length,\n end = state.posMax,\n maxNesting = state.md.options.maxNesting;\n\n while (state.pos < end) {\n // Try all possible rules.\n // On success, rule should:\n //\n // - update `state.pos`\n // - update `state.tokens`\n // - return true\n\n if (state.level < maxNesting) {\n for (i = 0; i < len; i++) {\n ok = rules[i](state, false);\n if (ok) { break; }\n }\n }\n\n if (ok) {\n if (state.pos >= end) { break; }\n continue;\n }\n\n state.pending += state.src[state.pos++];\n }\n\n if (state.pending) {\n state.pushPending();\n }\n};\n\n\n/**\n * ParserInline.parse(str, md, env, outTokens)\n *\n * Process input string and push inline tokens into `outTokens`\n **/\nParserInline.prototype.parse = function (str, md, env, outTokens) {\n var i, rules, len;\n var state = new this.State(str, md, env, outTokens);\n\n this.tokenize(state);\n\n rules = this.ruler2.getRules('');\n len = rules.length;\n\n for (i = 0; i < len; i++) {\n rules[i](state);\n }\n};\n\n\nParserInline.prototype.State = require('./rules_inline/state_inline');\n\n\nmodule.exports = ParserInline;\n","// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\n'use strict';\n\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar(ch) {\n switch (ch) {\n case 0x0A/* \\n */:\n case 0x21/* ! */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2D/* - */:\n case 0x3A/* : */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true;\n default:\n return false;\n }\n}\n\nmodule.exports = function text(state, silent) {\n var pos = state.pos;\n\n while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n pos++;\n }\n\n if (pos === state.pos) { return false; }\n\n if (!silent) { state.pending += state.src.slice(state.pos, pos); }\n\n state.pos = pos;\n\n return true;\n};\n\n// Alternative implementation, for memory.\n//\n// It costs 10% of performance, but allows extend terminators list, if place it\n// to `ParcerInline` property. Probably, will switch to it sometime, such\n// flexibility required.\n\n/*\nvar TERMINATOR_RE = /[\\n!#$%&*+\\-:<=>@[\\\\\\]^_`{}~]/;\n\nmodule.exports = function text(state, silent) {\n var pos = state.pos,\n idx = state.src.slice(pos).search(TERMINATOR_RE);\n\n // first char is terminator -> empty text\n if (idx === 0) { return false; }\n\n // no terminator -> text till end of string\n if (idx < 0) {\n if (!silent) { state.pending += state.src.slice(pos); }\n state.pos = state.src.length;\n return true;\n }\n\n if (!silent) { state.pending += state.src.slice(pos, pos + idx); }\n\n state.pos += idx;\n\n return true;\n};*/\n","// Proceess '\\n'\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function newline(state, silent) {\n var pmax, max, pos = state.pos;\n\n if (state.src.charCodeAt(pos) !== 0x0A/* \\n */) { return false; }\n\n pmax = state.pending.length - 1;\n max = state.posMax;\n\n // ' \\n' -> hardbreak\n // Lookup in pending chars is bad practice! Don't copy to other rules!\n // Pending string is stored in concat mode, indexed lookups will cause\n // convertion to flat mode.\n if (!silent) {\n if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {\n if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {\n state.pending = state.pending.replace(/ +$/, '');\n state.push('hardbreak', 'br', 0);\n } else {\n state.pending = state.pending.slice(0, -1);\n state.push('softbreak', 'br', 0);\n }\n\n } else {\n state.push('softbreak', 'br', 0);\n }\n }\n\n pos++;\n\n // skip heading spaces for next line\n while (pos < max && isSpace(state.src.charCodeAt(pos))) { pos++; }\n\n state.pos = pos;\n return true;\n};\n","// Process escaped chars and hardbreaks\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\nvar ESCAPED = [];\n\nfor (var i = 0; i < 256; i++) { ESCAPED.push(0); }\n\n'\\\\!\"#$%&\\'()*+,./:;<=>?@[]^_`{|}~-'\n .split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1; });\n\n\nmodule.exports = function escape(state, silent) {\n var ch, pos = state.pos, max = state.posMax;\n\n if (state.src.charCodeAt(pos) !== 0x5C/* \\ */) { return false; }\n\n pos++;\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (ch < 256 && ESCAPED[ch] !== 0) {\n if (!silent) { state.pending += state.src[pos]; }\n state.pos += 2;\n return true;\n }\n\n if (ch === 0x0A) {\n if (!silent) {\n state.push('hardbreak', 'br', 0);\n }\n\n pos++;\n // skip leading whitespaces from next line\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n\n state.pos = pos;\n return true;\n }\n }\n\n if (!silent) { state.pending += '\\\\'; }\n state.pos++;\n return true;\n};\n","// Parse backticks\n\n'use strict';\n\nmodule.exports = function backtick(state, silent) {\n var start, max, marker, matchStart, matchEnd, token,\n pos = state.pos,\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x60/* ` */) { return false; }\n\n start = pos;\n pos++;\n max = state.posMax;\n\n while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++; }\n\n marker = state.src.slice(start, pos);\n\n matchStart = matchEnd = pos;\n\n while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) {\n matchEnd = matchStart + 1;\n\n while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++; }\n\n if (matchEnd - matchStart === marker.length) {\n if (!silent) {\n token = state.push('code_inline', 'code', 0);\n token.markup = marker;\n token.content = state.src.slice(pos, matchStart)\n .replace(/\\n/g, ' ')\n .replace(/^ (.+) $/, '$1');\n }\n state.pos = matchEnd;\n return true;\n }\n }\n\n if (!silent) { state.pending += marker; }\n state.pos += marker.length;\n return true;\n};\n","// Process [link]( \"stuff\")\n\n'use strict';\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function link(state, silent) {\n var attrs,\n code,\n label,\n labelEnd,\n labelStart,\n pos,\n res,\n ref,\n title,\n token,\n href = '',\n oldPos = state.pos,\n max = state.posMax,\n start = state.pos,\n parseReference = true;\n\n if (state.src.charCodeAt(state.pos) !== 0x5B/* [ */) { return false; }\n\n labelStart = state.pos + 1;\n labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true);\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) { return false; }\n\n pos = labelEnd + 1;\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n //\n // Inline link\n //\n\n // might have found a valid shortcut link, disable reference parsing\n parseReference = false;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n pos++;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n if (pos >= max) { return false; }\n\n // [link]( \"title\" )\n // ^^^^^^ parsing link destination\n start = pos;\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n if (res.ok) {\n href = state.md.normalizeLink(res.str);\n if (state.md.validateLink(href)) {\n pos = res.pos;\n } else {\n href = '';\n }\n }\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n start = pos;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n\n // [link]( \"title\" )\n // ^^^^^^^ parsing link title\n res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n } else {\n title = '';\n }\n\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n // parsing a valid shortcut link failed, fallback to reference\n parseReference = true;\n }\n pos++;\n }\n\n if (parseReference) {\n //\n // Link reference\n //\n if (typeof state.env.references === 'undefined') { return false; }\n\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n start = pos + 1;\n pos = state.md.helpers.parseLinkLabel(state, pos);\n if (pos >= 0) {\n label = state.src.slice(start, pos++);\n } else {\n pos = labelEnd + 1;\n }\n } else {\n pos = labelEnd + 1;\n }\n\n // covers label === '' and label === undefined\n // (collapsed reference link and shortcut reference link respectively)\n if (!label) { label = state.src.slice(labelStart, labelEnd); }\n\n ref = state.env.references[normalizeReference(label)];\n if (!ref) {\n state.pos = oldPos;\n return false;\n }\n href = ref.href;\n title = ref.title;\n }\n\n //\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n state.pos = labelStart;\n state.posMax = labelEnd;\n\n token = state.push('link_open', 'a', 1);\n token.attrs = attrs = [ [ 'href', href ] ];\n if (title) {\n attrs.push([ 'title', title ]);\n }\n\n state.md.inline.tokenize(state);\n\n token = state.push('link_close', 'a', -1);\n }\n\n state.pos = pos;\n state.posMax = max;\n return true;\n};\n","// Process ![image]( \"title\")\n\n'use strict';\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function image(state, silent) {\n var attrs,\n code,\n content,\n label,\n labelEnd,\n labelStart,\n pos,\n ref,\n res,\n title,\n token,\n tokens,\n start,\n href = '',\n oldPos = state.pos,\n max = state.posMax;\n\n if (state.src.charCodeAt(state.pos) !== 0x21/* ! */) { return false; }\n if (state.src.charCodeAt(state.pos + 1) !== 0x5B/* [ */) { return false; }\n\n labelStart = state.pos + 2;\n labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false);\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) { return false; }\n\n pos = labelEnd + 1;\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n //\n // Inline link\n //\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n pos++;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n if (pos >= max) { return false; }\n\n // [link]( \"title\" )\n // ^^^^^^ parsing link destination\n start = pos;\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n if (res.ok) {\n href = state.md.normalizeLink(res.str);\n if (state.md.validateLink(href)) {\n pos = res.pos;\n } else {\n href = '';\n }\n }\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n start = pos;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n\n // [link]( \"title\" )\n // ^^^^^^^ parsing link title\n res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n } else {\n title = '';\n }\n\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n state.pos = oldPos;\n return false;\n }\n pos++;\n } else {\n //\n // Link reference\n //\n if (typeof state.env.references === 'undefined') { return false; }\n\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n start = pos + 1;\n pos = state.md.helpers.parseLinkLabel(state, pos);\n if (pos >= 0) {\n label = state.src.slice(start, pos++);\n } else {\n pos = labelEnd + 1;\n }\n } else {\n pos = labelEnd + 1;\n }\n\n // covers label === '' and label === undefined\n // (collapsed reference link and shortcut reference link respectively)\n if (!label) { label = state.src.slice(labelStart, labelEnd); }\n\n ref = state.env.references[normalizeReference(label)];\n if (!ref) {\n state.pos = oldPos;\n return false;\n }\n href = ref.href;\n title = ref.title;\n }\n\n //\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n content = state.src.slice(labelStart, labelEnd);\n\n state.md.inline.parse(\n content,\n state.md,\n state.env,\n tokens = []\n );\n\n token = state.push('image', 'img', 0);\n token.attrs = attrs = [ [ 'src', href ], [ 'alt', '' ] ];\n token.children = tokens;\n token.content = content;\n\n if (title) {\n attrs.push([ 'title', title ]);\n }\n }\n\n state.pos = pos;\n state.posMax = max;\n return true;\n};\n","// Process autolinks ''\n\n'use strict';\n\n\n/*eslint max-len:0*/\nvar EMAIL_RE = /^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;\nvar AUTOLINK_RE = /^<([a-zA-Z][a-zA-Z0-9+.\\-]{1,31}):([^<>\\x00-\\x20]*)>/;\n\n\nmodule.exports = function autolink(state, silent) {\n var tail, linkMatch, emailMatch, url, fullUrl, token,\n pos = state.pos;\n\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\n\n tail = state.src.slice(pos);\n\n if (tail.indexOf('>') < 0) { return false; }\n\n if (AUTOLINK_RE.test(tail)) {\n linkMatch = tail.match(AUTOLINK_RE);\n\n url = linkMatch[0].slice(1, -1);\n fullUrl = state.md.normalizeLink(url);\n if (!state.md.validateLink(fullUrl)) { return false; }\n\n if (!silent) {\n token = state.push('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.markup = 'autolink';\n token.info = 'auto';\n\n token = state.push('text', '', 0);\n token.content = state.md.normalizeLinkText(url);\n\n token = state.push('link_close', 'a', -1);\n token.markup = 'autolink';\n token.info = 'auto';\n }\n\n state.pos += linkMatch[0].length;\n return true;\n }\n\n if (EMAIL_RE.test(tail)) {\n emailMatch = tail.match(EMAIL_RE);\n\n url = emailMatch[0].slice(1, -1);\n fullUrl = state.md.normalizeLink('mailto:' + url);\n if (!state.md.validateLink(fullUrl)) { return false; }\n\n if (!silent) {\n token = state.push('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.markup = 'autolink';\n token.info = 'auto';\n\n token = state.push('text', '', 0);\n token.content = state.md.normalizeLinkText(url);\n\n token = state.push('link_close', 'a', -1);\n token.markup = 'autolink';\n token.info = 'auto';\n }\n\n state.pos += emailMatch[0].length;\n return true;\n }\n\n return false;\n};\n","// Process html tags\n\n'use strict';\n\n\nvar HTML_TAG_RE = require('../common/html_re').HTML_TAG_RE;\n\n\nfunction isLetter(ch) {\n /*eslint no-bitwise:0*/\n var lc = ch | 0x20; // to lower case\n return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */);\n}\n\n\nmodule.exports = function html_inline(state, silent) {\n var ch, match, max, token,\n pos = state.pos;\n\n if (!state.md.options.html) { return false; }\n\n // Check start\n max = state.posMax;\n if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||\n pos + 2 >= max) {\n return false;\n }\n\n // Quick fail on second char\n ch = state.src.charCodeAt(pos + 1);\n if (ch !== 0x21/* ! */ &&\n ch !== 0x3F/* ? */ &&\n ch !== 0x2F/* / */ &&\n !isLetter(ch)) {\n return false;\n }\n\n match = state.src.slice(pos).match(HTML_TAG_RE);\n if (!match) { return false; }\n\n if (!silent) {\n token = state.push('html_inline', '', 0);\n token.content = state.src.slice(pos, pos + match[0].length);\n }\n state.pos += match[0].length;\n return true;\n};\n","// Process html entity - {, ¯, ", ...\n\n'use strict';\n\nvar entities = require('../common/entities');\nvar has = require('../common/utils').has;\nvar isValidEntityCode = require('../common/utils').isValidEntityCode;\nvar fromCodePoint = require('../common/utils').fromCodePoint;\n\n\nvar DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i;\nvar NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i;\n\n\nmodule.exports = function entity(state, silent) {\n var ch, code, match, pos = state.pos, max = state.posMax;\n\n if (state.src.charCodeAt(pos) !== 0x26/* & */) { return false; }\n\n if (pos + 1 < max) {\n ch = state.src.charCodeAt(pos + 1);\n\n if (ch === 0x23 /* # */) {\n match = state.src.slice(pos).match(DIGITAL_RE);\n if (match) {\n if (!silent) {\n code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10);\n state.pending += isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD);\n }\n state.pos += match[0].length;\n return true;\n }\n } else {\n match = state.src.slice(pos).match(NAMED_RE);\n if (match) {\n if (has(entities, match[1])) {\n if (!silent) { state.pending += entities[match[1]]; }\n state.pos += match[0].length;\n return true;\n }\n }\n }\n }\n\n if (!silent) { state.pending += '&'; }\n state.pos++;\n return true;\n};\n","// For each opening emphasis-like marker find a matching closing one\n//\n'use strict';\n\n\nfunction processDelimiters(state, delimiters) {\n var closerIdx, openerIdx, closer, opener, minOpenerIdx, newMinOpenerIdx,\n isOddMatch, lastJump,\n openersBottom = {},\n max = delimiters.length;\n\n for (closerIdx = 0; closerIdx < max; closerIdx++) {\n closer = delimiters[closerIdx];\n\n // Length is only used for emphasis-specific \"rule of 3\",\n // if it's not defined (in strikethrough or 3rd party plugins),\n // we can default it to 0 to disable those checks.\n //\n closer.length = closer.length || 0;\n\n if (!closer.close) continue;\n\n // Previously calculated lower bounds (previous fails)\n // for each marker and each delimiter length modulo 3.\n if (!openersBottom.hasOwnProperty(closer.marker)) {\n openersBottom[closer.marker] = [ -1, -1, -1 ];\n }\n\n minOpenerIdx = openersBottom[closer.marker][closer.length % 3];\n newMinOpenerIdx = -1;\n\n openerIdx = closerIdx - closer.jump - 1;\n\n for (; openerIdx > minOpenerIdx; openerIdx -= opener.jump + 1) {\n opener = delimiters[openerIdx];\n\n if (opener.marker !== closer.marker) continue;\n\n if (newMinOpenerIdx === -1) newMinOpenerIdx = openerIdx;\n\n if (opener.open &&\n opener.end < 0 &&\n opener.level === closer.level) {\n\n isOddMatch = false;\n\n // from spec:\n //\n // If one of the delimiters can both open and close emphasis, then the\n // sum of the lengths of the delimiter runs containing the opening and\n // closing delimiters must not be a multiple of 3 unless both lengths\n // are multiples of 3.\n //\n if (opener.close || closer.open) {\n if ((opener.length + closer.length) % 3 === 0) {\n if (opener.length % 3 !== 0 || closer.length % 3 !== 0) {\n isOddMatch = true;\n }\n }\n }\n\n if (!isOddMatch) {\n // If previous delimiter cannot be an opener, we can safely skip\n // the entire sequence in future checks. This is required to make\n // sure algorithm has linear complexity (see *_*_*_*_*_... case).\n //\n lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open ?\n delimiters[openerIdx - 1].jump + 1 :\n 0;\n\n closer.jump = closerIdx - openerIdx + lastJump;\n closer.open = false;\n opener.end = closerIdx;\n opener.jump = lastJump;\n opener.close = false;\n newMinOpenerIdx = -1;\n break;\n }\n }\n }\n\n if (newMinOpenerIdx !== -1) {\n // If match for this delimiter run failed, we want to set lower bound for\n // future lookups. This is required to make sure algorithm has linear\n // complexity.\n //\n // See details here:\n // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442\n //\n openersBottom[closer.marker][(closer.length || 0) % 3] = newMinOpenerIdx;\n }\n }\n}\n\n\nmodule.exports = function link_pairs(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n processDelimiters(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n processDelimiters(state, tokens_meta[curr].delimiters);\n }\n }\n};\n","// Clean up tokens after emphasis and strikethrough postprocessing:\n// merge adjacent text nodes into one and re-calculate all token levels\n//\n// This is necessary because initially emphasis delimiter markers (*, _, ~)\n// are treated as their own separate text tokens. Then emphasis rule either\n// leaves them as text (needed to merge with adjacent text) or turns them\n// into opening/closing tags (which messes up levels inside).\n//\n'use strict';\n\n\nmodule.exports = function text_collapse(state) {\n var curr, last,\n level = 0,\n tokens = state.tokens,\n max = state.tokens.length;\n\n for (curr = last = 0; curr < max; curr++) {\n // re-calculate levels after emphasis/strikethrough turns some text nodes\n // into opening/closing tags\n if (tokens[curr].nesting < 0) level--; // closing tag\n tokens[curr].level = level;\n if (tokens[curr].nesting > 0) level++; // opening tag\n\n if (tokens[curr].type === 'text' &&\n curr + 1 < max &&\n tokens[curr + 1].type === 'text') {\n\n // collapse two adjacent text nodes\n tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content;\n } else {\n if (curr !== last) { tokens[last] = tokens[curr]; }\n\n last++;\n }\n }\n\n if (curr !== last) {\n tokens.length = last;\n }\n};\n","// Inline parser state\n\n'use strict';\n\n\nvar Token = require('../token');\nvar isWhiteSpace = require('../common/utils').isWhiteSpace;\nvar isPunctChar = require('../common/utils').isPunctChar;\nvar isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;\n\n\nfunction StateInline(src, md, env, outTokens) {\n this.src = src;\n this.env = env;\n this.md = md;\n this.tokens = outTokens;\n this.tokens_meta = Array(outTokens.length);\n\n this.pos = 0;\n this.posMax = this.src.length;\n this.level = 0;\n this.pending = '';\n this.pendingLevel = 0;\n\n // Stores { start: end } pairs. Useful for backtrack\n // optimization of pairs parse (emphasis, strikes).\n this.cache = {};\n\n // List of emphasis-like delimiters for current tag\n this.delimiters = [];\n\n // Stack of delimiter lists for upper level tags\n this._prev_delimiters = [];\n}\n\n\n// Flush pending text\n//\nStateInline.prototype.pushPending = function () {\n var token = new Token('text', '', 0);\n token.content = this.pending;\n token.level = this.pendingLevel;\n this.tokens.push(token);\n this.pending = '';\n return token;\n};\n\n\n// Push new token to \"stream\".\n// If pending text exists - flush it as text token\n//\nStateInline.prototype.push = function (type, tag, nesting) {\n if (this.pending) {\n this.pushPending();\n }\n\n var token = new Token(type, tag, nesting);\n var token_meta = null;\n\n if (nesting < 0) {\n // closing tag\n this.level--;\n this.delimiters = this._prev_delimiters.pop();\n }\n\n token.level = this.level;\n\n if (nesting > 0) {\n // opening tag\n this.level++;\n this._prev_delimiters.push(this.delimiters);\n this.delimiters = [];\n token_meta = { delimiters: this.delimiters };\n }\n\n this.pendingLevel = this.level;\n this.tokens.push(token);\n this.tokens_meta.push(token_meta);\n return token;\n};\n\n\n// Scan a sequence of emphasis-like markers, and determine whether\n// it can start an emphasis sequence or end an emphasis sequence.\n//\n// - start - position to scan from (it should point at a valid marker);\n// - canSplitWord - determine if these markers can be found inside a word\n//\nStateInline.prototype.scanDelims = function (start, canSplitWord) {\n var pos = start, lastChar, nextChar, count, can_open, can_close,\n isLastWhiteSpace, isLastPunctChar,\n isNextWhiteSpace, isNextPunctChar,\n left_flanking = true,\n right_flanking = true,\n max = this.posMax,\n marker = this.src.charCodeAt(start);\n\n // treat beginning of the line as a whitespace\n lastChar = start > 0 ? this.src.charCodeAt(start - 1) : 0x20;\n\n while (pos < max && this.src.charCodeAt(pos) === marker) { pos++; }\n\n count = pos - start;\n\n // treat end of the line as a whitespace\n nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20;\n\n isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));\n isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));\n\n isLastWhiteSpace = isWhiteSpace(lastChar);\n isNextWhiteSpace = isWhiteSpace(nextChar);\n\n if (isNextWhiteSpace) {\n left_flanking = false;\n } else if (isNextPunctChar) {\n if (!(isLastWhiteSpace || isLastPunctChar)) {\n left_flanking = false;\n }\n }\n\n if (isLastWhiteSpace) {\n right_flanking = false;\n } else if (isLastPunctChar) {\n if (!(isNextWhiteSpace || isNextPunctChar)) {\n right_flanking = false;\n }\n }\n\n if (!canSplitWord) {\n can_open = left_flanking && (!right_flanking || isLastPunctChar);\n can_close = right_flanking && (!left_flanking || isNextPunctChar);\n } else {\n can_open = left_flanking;\n can_close = right_flanking;\n }\n\n return {\n can_open: can_open,\n can_close: can_close,\n length: count\n };\n};\n\n\n// re-export Token class to use in block rules\nStateInline.prototype.Token = Token;\n\n\nmodule.exports = StateInline;\n","'use strict';\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Helpers\n\n// Merge objects\n//\nfunction assign(obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n\n sources.forEach(function (source) {\n if (!source) { return; }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key];\n });\n });\n\n return obj;\n}\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\nfunction isString(obj) { return _class(obj) === '[object String]'; }\nfunction isObject(obj) { return _class(obj) === '[object Object]'; }\nfunction isRegExp(obj) { return _class(obj) === '[object RegExp]'; }\nfunction isFunction(obj) { return _class(obj) === '[object Function]'; }\n\n\nfunction escapeRE(str) { return str.replace(/[.?*+^$[\\]\\\\(){}|-]/g, '\\\\$&'); }\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nvar defaultOptions = {\n fuzzyLink: true,\n fuzzyEmail: true,\n fuzzyIP: false\n};\n\n\nfunction isOptionsObj(obj) {\n return Object.keys(obj || {}).reduce(function (acc, k) {\n return acc || defaultOptions.hasOwnProperty(k);\n }, false);\n}\n\n\nvar defaultSchemas = {\n 'http:': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.http) {\n // compile lazily, because \"host\"-containing variables can change on tlds update.\n self.re.http = new RegExp(\n '^\\\\/\\\\/' + self.re.src_auth + self.re.src_host_port_strict + self.re.src_path, 'i'\n );\n }\n if (self.re.http.test(tail)) {\n return tail.match(self.re.http)[0].length;\n }\n return 0;\n }\n },\n 'https:': 'http:',\n 'ftp:': 'http:',\n '//': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.no_http) {\n // compile lazily, because \"host\"-containing variables can change on tlds update.\n self.re.no_http = new RegExp(\n '^' +\n self.re.src_auth +\n // Don't allow single-level domains, because of false positives like '//test'\n // with code comments\n '(?:localhost|(?:(?:' + self.re.src_domain + ')\\\\.)+' + self.re.src_domain_root + ')' +\n self.re.src_port +\n self.re.src_host_terminator +\n self.re.src_path,\n\n 'i'\n );\n }\n\n if (self.re.no_http.test(tail)) {\n // should not be `://` & `///`, that protects from errors in protocol name\n if (pos >= 3 && text[pos - 3] === ':') { return 0; }\n if (pos >= 3 && text[pos - 3] === '/') { return 0; }\n return tail.match(self.re.no_http)[0].length;\n }\n return 0;\n }\n },\n 'mailto:': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.mailto) {\n self.re.mailto = new RegExp(\n '^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i'\n );\n }\n if (self.re.mailto.test(tail)) {\n return tail.match(self.re.mailto)[0].length;\n }\n return 0;\n }\n }\n};\n\n/*eslint-disable max-len*/\n\n// RE pattern for 2-character tlds (autogenerated by ./support/tlds_2char_gen.js)\nvar tlds_2ch_src_re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]';\n\n// DON'T try to make PRs with changes. Extend TLDs with LinkifyIt.tlds() instead\nvar tlds_default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|');\n\n/*eslint-enable max-len*/\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction resetScanCache(self) {\n self.__index__ = -1;\n self.__text_cache__ = '';\n}\n\nfunction createValidator(re) {\n return function (text, pos) {\n var tail = text.slice(pos);\n\n if (re.test(tail)) {\n return tail.match(re)[0].length;\n }\n return 0;\n };\n}\n\nfunction createNormalizer() {\n return function (match, self) {\n self.normalize(match);\n };\n}\n\n// Schemas compiler. Build regexps.\n//\nfunction compile(self) {\n\n // Load & clone RE patterns.\n var re = self.re = require('./lib/re')(self.__opts__);\n\n // Define dynamic patterns\n var tlds = self.__tlds__.slice();\n\n self.onCompile();\n\n if (!self.__tlds_replaced__) {\n tlds.push(tlds_2ch_src_re);\n }\n tlds.push(re.src_xn);\n\n re.src_tlds = tlds.join('|');\n\n function untpl(tpl) { return tpl.replace('%TLDS%', re.src_tlds); }\n\n re.email_fuzzy = RegExp(untpl(re.tpl_email_fuzzy), 'i');\n re.link_fuzzy = RegExp(untpl(re.tpl_link_fuzzy), 'i');\n re.link_no_ip_fuzzy = RegExp(untpl(re.tpl_link_no_ip_fuzzy), 'i');\n re.host_fuzzy_test = RegExp(untpl(re.tpl_host_fuzzy_test), 'i');\n\n //\n // Compile each schema\n //\n\n var aliases = [];\n\n self.__compiled__ = {}; // Reset compiled data\n\n function schemaError(name, val) {\n throw new Error('(LinkifyIt) Invalid schema \"' + name + '\": ' + val);\n }\n\n Object.keys(self.__schemas__).forEach(function (name) {\n var val = self.__schemas__[name];\n\n // skip disabled methods\n if (val === null) { return; }\n\n var compiled = { validate: null, link: null };\n\n self.__compiled__[name] = compiled;\n\n if (isObject(val)) {\n if (isRegExp(val.validate)) {\n compiled.validate = createValidator(val.validate);\n } else if (isFunction(val.validate)) {\n compiled.validate = val.validate;\n } else {\n schemaError(name, val);\n }\n\n if (isFunction(val.normalize)) {\n compiled.normalize = val.normalize;\n } else if (!val.normalize) {\n compiled.normalize = createNormalizer();\n } else {\n schemaError(name, val);\n }\n\n return;\n }\n\n if (isString(val)) {\n aliases.push(name);\n return;\n }\n\n schemaError(name, val);\n });\n\n //\n // Compile postponed aliases\n //\n\n aliases.forEach(function (alias) {\n if (!self.__compiled__[self.__schemas__[alias]]) {\n // Silently fail on missed schemas to avoid errons on disable.\n // schemaError(alias, self.__schemas__[alias]);\n return;\n }\n\n self.__compiled__[alias].validate =\n self.__compiled__[self.__schemas__[alias]].validate;\n self.__compiled__[alias].normalize =\n self.__compiled__[self.__schemas__[alias]].normalize;\n });\n\n //\n // Fake record for guessed links\n //\n self.__compiled__[''] = { validate: null, normalize: createNormalizer() };\n\n //\n // Build schema condition\n //\n var slist = Object.keys(self.__compiled__)\n .filter(function (name) {\n // Filter disabled & fake schemas\n return name.length > 0 && self.__compiled__[name];\n })\n .map(escapeRE)\n .join('|');\n // (?!_) cause 1.5x slowdown\n self.re.schema_test = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'i');\n self.re.schema_search = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'ig');\n\n self.re.pretest = RegExp(\n '(' + self.re.schema_test.source + ')|(' + self.re.host_fuzzy_test.source + ')|@',\n 'i'\n );\n\n //\n // Cleanup\n //\n\n resetScanCache(self);\n}\n\n/**\n * class Match\n *\n * Match result. Single element of array, returned by [[LinkifyIt#match]]\n **/\nfunction Match(self, shift) {\n var start = self.__index__,\n end = self.__last_index__,\n text = self.__text_cache__.slice(start, end);\n\n /**\n * Match#schema -> String\n *\n * Prefix (protocol) for matched string.\n **/\n this.schema = self.__schema__.toLowerCase();\n /**\n * Match#index -> Number\n *\n * First position of matched string.\n **/\n this.index = start + shift;\n /**\n * Match#lastIndex -> Number\n *\n * Next position after matched string.\n **/\n this.lastIndex = end + shift;\n /**\n * Match#raw -> String\n *\n * Matched string.\n **/\n this.raw = text;\n /**\n * Match#text -> String\n *\n * Notmalized text of matched string.\n **/\n this.text = text;\n /**\n * Match#url -> String\n *\n * Normalized url of matched string.\n **/\n this.url = text;\n}\n\nfunction createMatch(self, shift) {\n var match = new Match(self, shift);\n\n self.__compiled__[match.schema].normalize(match, self);\n\n return match;\n}\n\n\n/**\n * class LinkifyIt\n **/\n\n/**\n * new LinkifyIt(schemas, options)\n * - schemas (Object): Optional. Additional schemas to validate (prefix/validator)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Creates new linkifier instance with optional additional schemas.\n * Can be called without `new` keyword for convenience.\n *\n * By default understands:\n *\n * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links\n * - \"fuzzy\" links and emails (example.com, foo@bar.com).\n *\n * `schemas` is an object, where each key/value describes protocol/rule:\n *\n * - __key__ - link prefix (usually, protocol name with `:` at the end, `skype:`\n * for example). `linkify-it` makes shure that prefix is not preceeded with\n * alphanumeric char and symbols. Only whitespaces and punctuation allowed.\n * - __value__ - rule to check tail after link prefix\n * - _String_ - just alias to existing rule\n * - _Object_\n * - _validate_ - validator function (should return matched length on success),\n * or `RegExp`.\n * - _normalize_ - optional function to normalize text & url of matched result\n * (for example, for @twitter mentions).\n *\n * `options`:\n *\n * - __fuzzyLink__ - recognige URL-s without `http(s):` prefix. Default `true`.\n * - __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts\n * like version numbers. Default `false`.\n * - __fuzzyEmail__ - recognize emails without `mailto:` prefix.\n *\n **/\nfunction LinkifyIt(schemas, options) {\n if (!(this instanceof LinkifyIt)) {\n return new LinkifyIt(schemas, options);\n }\n\n if (!options) {\n if (isOptionsObj(schemas)) {\n options = schemas;\n schemas = {};\n }\n }\n\n this.__opts__ = assign({}, defaultOptions, options);\n\n // Cache last tested result. Used to skip repeating steps on next `match` call.\n this.__index__ = -1;\n this.__last_index__ = -1; // Next scan position\n this.__schema__ = '';\n this.__text_cache__ = '';\n\n this.__schemas__ = assign({}, defaultSchemas, schemas);\n this.__compiled__ = {};\n\n this.__tlds__ = tlds_default;\n this.__tlds_replaced__ = false;\n\n this.re = {};\n\n compile(this);\n}\n\n\n/** chainable\n * LinkifyIt#add(schema, definition)\n * - schema (String): rule name (fixed pattern prefix)\n * - definition (String|RegExp|Object): schema definition\n *\n * Add new rule definition. See constructor description for details.\n **/\nLinkifyIt.prototype.add = function add(schema, definition) {\n this.__schemas__[schema] = definition;\n compile(this);\n return this;\n};\n\n\n/** chainable\n * LinkifyIt#set(options)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Set recognition options for links without schema.\n **/\nLinkifyIt.prototype.set = function set(options) {\n this.__opts__ = assign(this.__opts__, options);\n return this;\n};\n\n\n/**\n * LinkifyIt#test(text) -> Boolean\n *\n * Searches linkifiable pattern and returns `true` on success or `false` on fail.\n **/\nLinkifyIt.prototype.test = function test(text) {\n // Reset scan cache\n this.__text_cache__ = text;\n this.__index__ = -1;\n\n if (!text.length) { return false; }\n\n var m, ml, me, len, shift, next, re, tld_pos, at_pos;\n\n // try to scan for link with schema - that's the most simple rule\n if (this.re.schema_test.test(text)) {\n re = this.re.schema_search;\n re.lastIndex = 0;\n while ((m = re.exec(text)) !== null) {\n len = this.testSchemaAt(text, m[2], re.lastIndex);\n if (len) {\n this.__schema__ = m[2];\n this.__index__ = m.index + m[1].length;\n this.__last_index__ = m.index + m[0].length + len;\n break;\n }\n }\n }\n\n if (this.__opts__.fuzzyLink && this.__compiled__['http:']) {\n // guess schemaless links\n tld_pos = text.search(this.re.host_fuzzy_test);\n if (tld_pos >= 0) {\n // if tld is located after found link - no need to check fuzzy pattern\n if (this.__index__ < 0 || tld_pos < this.__index__) {\n if ((ml = text.match(this.__opts__.fuzzyIP ? this.re.link_fuzzy : this.re.link_no_ip_fuzzy)) !== null) {\n\n shift = ml.index + ml[1].length;\n\n if (this.__index__ < 0 || shift < this.__index__) {\n this.__schema__ = '';\n this.__index__ = shift;\n this.__last_index__ = ml.index + ml[0].length;\n }\n }\n }\n }\n }\n\n if (this.__opts__.fuzzyEmail && this.__compiled__['mailto:']) {\n // guess schemaless emails\n at_pos = text.indexOf('@');\n if (at_pos >= 0) {\n // We can't skip this check, because this cases are possible:\n // 192.168.1.1@gmail.com, my.in@example.com\n if ((me = text.match(this.re.email_fuzzy)) !== null) {\n\n shift = me.index + me[1].length;\n next = me.index + me[0].length;\n\n if (this.__index__ < 0 || shift < this.__index__ ||\n (shift === this.__index__ && next > this.__last_index__)) {\n this.__schema__ = 'mailto:';\n this.__index__ = shift;\n this.__last_index__ = next;\n }\n }\n }\n }\n\n return this.__index__ >= 0;\n};\n\n\n/**\n * LinkifyIt#pretest(text) -> Boolean\n *\n * Very quick check, that can give false positives. Returns true if link MAY BE\n * can exists. Can be used for speed optimization, when you need to check that\n * link NOT exists.\n **/\nLinkifyIt.prototype.pretest = function pretest(text) {\n return this.re.pretest.test(text);\n};\n\n\n/**\n * LinkifyIt#testSchemaAt(text, name, position) -> Number\n * - text (String): text to scan\n * - name (String): rule (schema) name\n * - position (Number): text offset to check from\n *\n * Similar to [[LinkifyIt#test]] but checks only specific protocol tail exactly\n * at given position. Returns length of found pattern (0 on fail).\n **/\nLinkifyIt.prototype.testSchemaAt = function testSchemaAt(text, schema, pos) {\n // If not supported schema check requested - terminate\n if (!this.__compiled__[schema.toLowerCase()]) {\n return 0;\n }\n return this.__compiled__[schema.toLowerCase()].validate(text, pos, this);\n};\n\n\n/**\n * LinkifyIt#match(text) -> Array|null\n *\n * Returns array of found link descriptions or `null` on fail. We strongly\n * recommend to use [[LinkifyIt#test]] first, for best speed.\n *\n * ##### Result match description\n *\n * - __schema__ - link schema, can be empty for fuzzy links, or `//` for\n * protocol-neutral links.\n * - __index__ - offset of matched text\n * - __lastIndex__ - index of next char after mathch end\n * - __raw__ - matched text\n * - __text__ - normalized text\n * - __url__ - link, generated from matched text\n **/\nLinkifyIt.prototype.match = function match(text) {\n var shift = 0, result = [];\n\n // Try to take previous element from cache, if .test() called before\n if (this.__index__ >= 0 && this.__text_cache__ === text) {\n result.push(createMatch(this, shift));\n shift = this.__last_index__;\n }\n\n // Cut head if cache was used\n var tail = shift ? text.slice(shift) : text;\n\n // Scan string until end reached\n while (this.test(tail)) {\n result.push(createMatch(this, shift));\n\n tail = tail.slice(this.__last_index__);\n shift += this.__last_index__;\n }\n\n if (result.length) {\n return result;\n }\n\n return null;\n};\n\n\n/** chainable\n * LinkifyIt#tlds(list [, keepOld]) -> this\n * - list (Array): list of tlds\n * - keepOld (Boolean): merge with current list if `true` (`false` by default)\n *\n * Load (or merge) new tlds list. Those are user for fuzzy links (without prefix)\n * to avoid false positives. By default this algorythm used:\n *\n * - hostname with any 2-letter root zones are ok.\n * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф\n * are ok.\n * - encoded (`xn--...`) root zones are ok.\n *\n * If list is replaced, then exact match for 2-chars root zones will be checked.\n **/\nLinkifyIt.prototype.tlds = function tlds(list, keepOld) {\n list = Array.isArray(list) ? list : [ list ];\n\n if (!keepOld) {\n this.__tlds__ = list.slice();\n this.__tlds_replaced__ = true;\n compile(this);\n return this;\n }\n\n this.__tlds__ = this.__tlds__.concat(list)\n .sort()\n .filter(function (el, idx, arr) {\n return el !== arr[idx - 1];\n })\n .reverse();\n\n compile(this);\n return this;\n};\n\n/**\n * LinkifyIt#normalize(match)\n *\n * Default normalizer (if schema does not define it's own).\n **/\nLinkifyIt.prototype.normalize = function normalize(match) {\n\n // Do minimal possible changes by default. Need to collect feedback prior\n // to move forward https://github.com/markdown-it/linkify-it/issues/1\n\n if (!match.schema) { match.url = 'http://' + match.url; }\n\n if (match.schema === 'mailto:' && !/^mailto:/i.test(match.url)) {\n match.url = 'mailto:' + match.url;\n }\n};\n\n\n/**\n * LinkifyIt#onCompile()\n *\n * Override to modify basic RegExp-s.\n **/\nLinkifyIt.prototype.onCompile = function onCompile() {\n};\n\n\nmodule.exports = LinkifyIt;\n","'use strict';\n\n\nmodule.exports = function (opts) {\n var re = {};\n\n // Use direct extract instead of `regenerate` to reduse browserified size\n re.src_Any = require('uc.micro/properties/Any/regex').source;\n re.src_Cc = require('uc.micro/categories/Cc/regex').source;\n re.src_Z = require('uc.micro/categories/Z/regex').source;\n re.src_P = require('uc.micro/categories/P/regex').source;\n\n // \\p{\\Z\\P\\Cc\\CF} (white spaces + control + format + punctuation)\n re.src_ZPCc = [ re.src_Z, re.src_P, re.src_Cc ].join('|');\n\n // \\p{\\Z\\Cc} (white spaces + control)\n re.src_ZCc = [ re.src_Z, re.src_Cc ].join('|');\n\n // Experimental. List of chars, completely prohibited in links\n // because can separate it from other part of text\n var text_separators = '[><\\uff5c]';\n\n // All possible word characters (everything without punctuation, spaces & controls)\n // Defined via punctuation & spaces to save space\n // Should be something like \\p{\\L\\N\\S\\M} (\\w but without `_`)\n re.src_pseudo_letter = '(?:(?!' + text_separators + '|' + re.src_ZPCc + ')' + re.src_Any + ')';\n // The same as abothe but without [0-9]\n // var src_pseudo_letter_non_d = '(?:(?![0-9]|' + src_ZPCc + ')' + src_Any + ')';\n\n ////////////////////////////////////////////////////////////////////////////////\n\n re.src_ip4 =\n\n '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)';\n\n // Prohibit any of \"@/[]()\" in user/pass to avoid wrong domain fetch.\n re.src_auth = '(?:(?:(?!' + re.src_ZCc + '|[@/\\\\[\\\\]()]).)+@)?';\n\n re.src_port =\n\n '(?::(?:6(?:[0-4]\\\\d{3}|5(?:[0-4]\\\\d{2}|5(?:[0-2]\\\\d|3[0-5])))|[1-5]?\\\\d{1,4}))?';\n\n re.src_host_terminator =\n\n '(?=$|' + text_separators + '|' + re.src_ZPCc + ')(?!-|_|:\\\\d|\\\\.-|\\\\.(?!$|' + re.src_ZPCc + '))';\n\n re.src_path =\n\n '(?:' +\n '[/?#]' +\n '(?:' +\n '(?!' + re.src_ZCc + '|' + text_separators + '|[()[\\\\]{}.,\"\\'?!\\\\-]).|' +\n '\\\\[(?:(?!' + re.src_ZCc + '|\\\\]).)*\\\\]|' +\n '\\\\((?:(?!' + re.src_ZCc + '|[)]).)*\\\\)|' +\n '\\\\{(?:(?!' + re.src_ZCc + '|[}]).)*\\\\}|' +\n '\\\\\"(?:(?!' + re.src_ZCc + '|[\"]).)+\\\\\"|' +\n \"\\\\'(?:(?!\" + re.src_ZCc + \"|[']).)+\\\\'|\" +\n \"\\\\'(?=\" + re.src_pseudo_letter + '|[-]).|' + // allow `I'm_king` if no pair found\n '\\\\.{2,4}[a-zA-Z0-9%/]|' + // github has ... in commit range links,\n // google has .... in links (issue #66)\n // Restrict to\n // - english\n // - percent-encoded\n // - parts of file path\n // until more examples found.\n '\\\\.(?!' + re.src_ZCc + '|[.]).|' +\n (opts && opts['---'] ?\n '\\\\-(?!--(?:[^-]|$))(?:-*)|' // `---` => long dash, terminate\n :\n '\\\\-+|'\n ) +\n '\\\\,(?!' + re.src_ZCc + ').|' + // allow `,,,` in paths\n '\\\\!(?!' + re.src_ZCc + '|[!]).|' +\n '\\\\?(?!' + re.src_ZCc + '|[?]).' +\n ')+' +\n '|\\\\/' +\n ')?';\n\n // Allow anything in markdown spec, forbid quote (\") at the first position\n // because emails enclosed in quotes are far more common\n re.src_email_name =\n\n '[\\\\-;:&=\\\\+\\\\$,\\\\.a-zA-Z0-9_][\\\\-;:&=\\\\+\\\\$,\\\\\"\\\\.a-zA-Z0-9_]*';\n\n re.src_xn =\n\n 'xn--[a-z0-9\\\\-]{1,59}';\n\n // More to read about domain names\n // http://serverfault.com/questions/638260/\n\n re.src_domain_root =\n\n // Allow letters & digits (http://test1)\n '(?:' +\n re.src_xn +\n '|' +\n re.src_pseudo_letter + '{1,63}' +\n ')';\n\n re.src_domain =\n\n '(?:' +\n re.src_xn +\n '|' +\n '(?:' + re.src_pseudo_letter + ')' +\n '|' +\n '(?:' + re.src_pseudo_letter + '(?:-|' + re.src_pseudo_letter + '){0,61}' + re.src_pseudo_letter + ')' +\n ')';\n\n re.src_host =\n\n '(?:' +\n // Don't need IP check, because digits are already allowed in normal domain names\n // src_ip4 +\n // '|' +\n '(?:(?:(?:' + re.src_domain + ')\\\\.)*' + re.src_domain/*_root*/ + ')' +\n ')';\n\n re.tpl_host_fuzzy =\n\n '(?:' +\n re.src_ip4 +\n '|' +\n '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))' +\n ')';\n\n re.tpl_host_no_ip_fuzzy =\n\n '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))';\n\n re.src_host_strict =\n\n re.src_host + re.src_host_terminator;\n\n re.tpl_host_fuzzy_strict =\n\n re.tpl_host_fuzzy + re.src_host_terminator;\n\n re.src_host_port_strict =\n\n re.src_host + re.src_port + re.src_host_terminator;\n\n re.tpl_host_port_fuzzy_strict =\n\n re.tpl_host_fuzzy + re.src_port + re.src_host_terminator;\n\n re.tpl_host_port_no_ip_fuzzy_strict =\n\n re.tpl_host_no_ip_fuzzy + re.src_port + re.src_host_terminator;\n\n\n ////////////////////////////////////////////////////////////////////////////////\n // Main rules\n\n // Rude test fuzzy links by host, for quick deny\n re.tpl_host_fuzzy_test =\n\n 'localhost|www\\\\.|\\\\.\\\\d{1,3}\\\\.|(?:\\\\.(?:%TLDS%)(?:' + re.src_ZPCc + '|>|$))';\n\n re.tpl_email_fuzzy =\n\n '(^|' + text_separators + '|\"|\\\\(|' + re.src_ZCc + ')' +\n '(' + re.src_email_name + '@' + re.tpl_host_fuzzy_strict + ')';\n\n re.tpl_link_fuzzy =\n // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n // but can start with > (markdown blockquote)\n '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_fuzzy_strict + re.src_path + ')';\n\n re.tpl_link_no_ip_fuzzy =\n // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n // but can start with > (markdown blockquote)\n '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_no_ip_fuzzy_strict + re.src_path + ')';\n\n return re;\n};\n","/*! https://mths.be/punycode v1.4.1 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see \n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t counter = 0,\n\t\t length = string.length,\n\t\t value,\n\t\t extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t// 0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t inputLength = input.length,\n\t\t out,\n\t\t i = 0,\n\t\t n = initialN,\n\t\t bias = initialBias,\n\t\t basic,\n\t\t j,\n\t\t index,\n\t\t oldi,\n\t\t w,\n\t\t k,\n\t\t digit,\n\t\t t,\n\t\t /** Cached calculation results */\n\t\t baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t delta,\n\t\t handledCPCount,\n\t\t basicLength,\n\t\t bias,\n\t\t j,\n\t\t m,\n\t\t q,\n\t\t k,\n\t\t t,\n\t\t currentValue,\n\t\t output = [],\n\t\t /** `inputLength` will hold the number of code points in `input`. */\n\t\t inputLength,\n\t\t /** Cached calculation results */\n\t\t handledCPCountPlusOne,\n\t\t baseMinusT,\n\t\t qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.4.1',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see \n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine('punycode', function() {\n\t\t\treturn punycode;\n\t\t});\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) {\n\t\t\t// in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else {\n\t\t\t// in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","// markdown-it default options\n\n'use strict';\n\n\nmodule.exports = {\n options: {\n html: false, // Enable HTML tags in source\n xhtmlOut: false, // Use '/' to close single tags (
      )\n breaks: false, // Convert '\\n' in paragraphs into
      \n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with )\n breaks: false, // Convert '\\n' in paragraphs into
      \n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with )\n breaks: false, // Convert '\\n' in paragraphs into
      \n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with {\n applyEditor();\n app.extensionData.for('askvortsov-rich-text').registerSetting({\n setting: 'askvortsov-rich-text.toggle_on_editor',\n type: 'boolean',\n label: app.translator.trans('askvortsov-rich-text.admin.settings.toggle_on_editor'),\n });\n});\n\nexport * from '../common/index';\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://@askvortsov/flarum-rich-text/webpack/bootstrap","webpack://@askvortsov/flarum-rich-text/./node_modules/orderedmap/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-model/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-state/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-commands/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/tiptap-commands/dist/commands.esm.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-transform/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/utils.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-inputrules/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@askvortsov/flarum-rich-text/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-markdown/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-schema-list/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Tooltip']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/CommandButton.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/extractText']\"","webpack://@askvortsov/flarum-rich-text/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@askvortsov/flarum-rich-text/./node_modules/tiptap-utils/dist/utils.esm.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/MarkButton.js","webpack://@askvortsov/flarum-rich-text/./node_modules/w3c-keyname/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-keymap/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/ItemList']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/Stream']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Button']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/helpers/icon']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Dropdown']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/SafariModalHack.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/FormDropdown.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/extend']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/ListButton.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/TextEditor']\"","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/MarkdownSerializerBuilder.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/SchemaBuilder.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/Component']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/NodeTypeDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/InsertImageDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/states/MenuState.js","webpack://@askvortsov/flarum-rich-text/./node_modules/rope-sequence/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-history/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-view/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-dropcursor/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-gapcursor/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/disableBase64PastePlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/toggleSpoiler.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/inputrules.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/ProseMirrorEditorDriver.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/placeholderPlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/menuPlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/key-bindings.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/disabledPlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/altText.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/blockSpoiler.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/inlineSpoilerBars.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/inlineSpoilerTags.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/MarkdownParserBuilder.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/HiddenItemsDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/ProseMirrorMenu.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/insertHr.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/InsertLinkDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/insertLink.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/P/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/ruler.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/token.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/entities.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/properties/Any/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/Cc/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/Z/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/html_re.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/strikethrough.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/emphasis.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/updateToggleMark.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/states/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/applyEditor.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/classList']\"","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it-sub/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it-sup/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it-latex2img/index.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Modal']\"","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/encode.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/decode.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/format.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/parse.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/Cf/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/parse_link_label.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/parse_link_destination.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/parse_link_title.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/renderer.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/parser_core.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/normalize.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/linkify.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/replacements.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/smartquotes.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/state_core.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/parser_block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/table.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/code.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/fence.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/blockquote.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/hr.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/list.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/reference.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/heading.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/lheading.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/html_block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/html_blocks.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/paragraph.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/state_block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/parser_inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/text.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/newline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/escape.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/backticks.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/link.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/image.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/autolink.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/html_inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/entity.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/balance_pairs.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/text_collapse.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/state_inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/linkify-it/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/linkify-it/lib/re.js","webpack://@askvortsov/flarum-rich-text/./node_modules/node-libs-browser/node_modules/punycode/punycode.js","webpack://@askvortsov/flarum-rich-text/(webpack)/buildin/module.js","webpack://@askvortsov/flarum-rich-text/(webpack)/buildin/global.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/presets/default.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/presets/zero.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/presets/commonmark.js","webpack://@askvortsov/flarum-rich-text/./src/admin/index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","OrderedMap","content","this","constructor","find","length","found","undefined","update","newKey","self","remove","slice","push","splice","addToStart","concat","addToEnd","addBefore","place","without","forEach","f","prepend","map","from","size","subtract","append","result","prop","Fragment","nodeSize","prototypeAccessors","firstChild","configurable","lastChild","childCount","nodesBetween","to","nodeStart","parent","pos","child","end","start","Math","max","min","descendants","textBetween","blockSeparator","leafText","text","separated","node","isText","isLeaf","isBlock","other","last","first","sameMarkup","withText","cut","cutByIndex","empty","replaceChild","index","current","copy","eq","RangeError","maybeChild","findDiffStart","a","b","childA","childB","j","inner","findDiffEnd","otherPos","posA","posB","iA","iB","same","minSize","findIndex","round","retIndex","curPos","toString","toStringInner","join","toJSON","fromJSON","schema","Array","isArray","nodeFromJSON","fromArray","array","joined","nodes","attrs","defineProperties","offset","compareDeep","p$1","Mark","type","ReplaceError","message","err","Error","__proto__","addToSet","set","placed","excludes","rank","removeFromSet","isInSet","obj","_","json","marks","sameSet","setFrom","none","sort","Slice","openStart","openEnd","prototypeAccessors$1","replace","$from","$to","depth","replaceOuter","ref","$along","extra","resolveNoCache","prepareSliceForReplace","replaceThreeWay","$start","$end","joinable","addRange","checkJoin","addNode","replaceTwoWay","parentOffset","main","sub","compatibleContent","$before","$after","target","startIndex","endIndex","textOffset","nodeAfter","nodeBefore","validContent","insertAt","fragment","insertInto","dist","insert","canReplace","removeBetween","removeRange","ref$1","indexTo","offsetTo","maxOpen","openIsolating","spec","isolating","n$1","ResolvedPos","path","prototypeAccessors$2","doc","resolveDepth","val","indexAfter","before","after","dOff","posAtIndex","tmp","inclusive","marksAcross","isInline","next","sharedDepth","blockRange","pred","inlineContent","NodeRange","sameParent","str","resolve","rem","resolveCached","resolveCache","cached","resolveCachePos","resolveCacheSize","prototypeAccessors$1$1","emptyAttrs","Node","prototypeAccessors$3","textContent","isTextblock","isAtom","startPos","hasMarkup","defaultAttrs","mark","includeParents","nodeAt","childAfter","childBefore","rangeHasMark","toDebugString","wrapMarks","contentMatchAt","match","contentMatch","matchFragment","replacement","one","two","validEnd","allowsMarks","canReplaceWith","matchType","canAppend","check","markFromJSON","nodeType","TextNode","JSON","stringify","base","ContentMatch","wrapCache","prototypeAccessors$4","defaultType","edgeCount","parse","string","nodeTypes","stream","TokenStream","expr","parseExpr","nfa","labeled","explore","states","out","term","known","indexOf","nullFrom","state","states$1","cmp","dfa","connect","compile","exprs","reduce","loop","edge","loop$1","cur","i$1","next$1","i$2","next$2","edges","work","dead","hasRequiredAttrs","checkForDeadEnds","frag","compatible","fillBefore","toEnd","seen","search","types","finished","tp","createAndFill","findWrapping","computed","computeWrapping","active","via","shift","reverse","scan","inline","tokens","split","pop","prototypeAccessors$1$2","parseExprSeq","eat","parseExprSubscript","test","typeName","type$1","groups","resolveName","parseExprAtom","parseExprRange","parseNum","Number","defaults","attrName","attr","hasDefault","default","computeAttrs","built","given","initAttrs","Attribute","tok","SyntaxError","NodeType","group","markSet","prototypeAccessors$5","atom","isRequired","createChecked","allowsMarkType","markType","allowedMarks","topType","topNode","options","prototypeAccessors$1$3","MarkType","excluded","instance","contentExprCache","prop$1","contentExpr","markExpr","gatherMarks","prop$2","excl","topNodeType","wrappings","ok","mark$1","text$1","DOMParser","rules","this$1","tags","styles","rule","tag","style","normalizeLists","some","dom","context","ParseContext","addAll","finish","parseSlice","matchTag","matches","namespace","namespaceURI","matchesContext","getAttrs","matchStyle","charCodeAt","schemaRules","priority","parseDOM","rules$1","name$1","fromSchema","domParser","blockTags","address","article","aside","blockquote","canvas","dd","div","dl","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","noscript","ol","output","pre","section","table","tfoot","ul","ignoreTags","head","script","title","listTags","wsOptionsFor","preserveWhitespace","NodeContext","pendingMarks","solid","activeMarks","stashMarks","fill","wrap","exec","popFromStashMark","applyPending","nextType","pending","markMayApply","parser","open","isOpen","topContext","topOptions","topMatch","findPositions","needsBlock","prototypeAccessors$6","top","currentPos","selector","msMatchesSelector","webkitMatchesSelector","mozMatchesSelector","v","returned","addDOM","addTextNode","getAttribute","readStyles","re","trim","parseStyles","addPendingMark","addElement","removePendingMark","nodeValue","domNodeBefore","previousSibling","nodeName","insertNode","findInText","findInside","matchAfter","ruleID","toLowerCase","prevItem","nextSibling","appendChild","normalizeList","ruleFromNode","ignore","skip","closeParent","sync","oldNeedsBlock","leafFallback","addElementByRule","consuming","ownerDocument","createTextNode","continueAfter","enter","startIn","getContent","contentDOM","contentElement","querySelector","findAround","childNodes","findAtPoint","findPlace","route","cx","enterInner","block","textblockFromContext","closeExtra","preserveWS","topOpen","contains","compareDocumentPosition","textNode","parts","option","useRoot","minDepth","part","$context","deflt","findSameMarkInSet","upto","level","lastIndexOf","stashMark","DOMSerializer","gatherToDOM","toDOM","document","window","serializeFragment","createDocumentFragment","keep","rendered","spanning","add","markDOM","serializeMark","serializeNode","renderSpec","onContent","serializeNodeAndMarks","structure","xmlNS","tagName","space","createElementNS","createElement","space$1","setAttributeNS","setAttribute","innerContent","domSerializer","nodesFromSchema","marksFromSchema","classesById","Selection","$anchor","$head","ranges","SelectionRange","anchor","tr","lastNode","lastParent","mapFrom","steps","mapping","replaceRange","selectionToInsertionEnd","replaceWith","deleteRange","replaceRangeWith","findFrom","$pos","dir","textOnly","TextSelection","findSelectionIn","near","bias","AllSelection","atStart","atEnd","cls","jsonID","id","selectionClass","getBookmark","between","visible","$cursor","ensureMarks","TextBookmark","dPos","NodeSelection","mapResult","deleted","NodeBookmark","isSelectable","selectable","delete","sel","selection","setSelection","AllBookmark","startLen","step","maps","_from","_to","_newFrom","newTo","Transaction","Transform","time","Date","now","curSelection","curSelectionFor","storedMarks","updated","meta","selectionSet","storedMarksSet","isGeneric","scrolledIntoView","setStoredMarks","addStoredMark","removeStoredMark","addStep","setTime","replaceSelection","replaceSelectionWith","inheritMarks","deleteSelection","insertText","setMeta","getMeta","scrollIntoView","FieldDesc","desc","init","apply","baseFields","config","_marks","_old","prev","Configuration","plugins","fields","pluginsByKey","plugin","EditorState","applyTransaction","filterTransaction","rootTr","transactions","trs","newState","applyInner","haveNew","appendTransaction","oldState","newInstance","field","applyListeners","$config","reconfigure","pluginFields","addApplyListener","removeApplyListener","Plugin","props","bindProps","Function","createKey","getState","keys","PluginKey","dispatch","textblockAt","side","findCutBefore","findCutAfter","newlineInCode","code","defaultBlockAt","exitCode","above","splitBlock","can","setNodeMarkup","deleteBarrier","$cut","conn","clearIncompatible","joinMaybeClear","canDelAfter","joinAt","selAfter","range","lift","at","wrap$1","end$1","wrapIn","wrapping","setBlockType","applicable","toggleMark","markApplies","has","ref$2","$from$1","$to$1","removeMark","spaceStart","spaceEnd","addMark","chainCommands","commands","len","arguments","view","backspace","endOfTextblock","del","pcBaseKeymap","macBaseKeymap","baseKeymap","navigator","platform","os","markInputRule","regexp","markEnd","markStart","matchStart","matchEnd","textStart","textEnd","getMarksBetween","filter","item","nodeInputRule","toggleBlockType","toggletype","isList","bullet_list","ordered_list","todo_list","toggleList","listType","itemType","parentList","toggleWrap","updateMark","factor16","pow","recoverIndex","MapResult","recover","StepMap","inverted","diff","recoverOffset","assoc","_map","simple","oldIndex","newIndex","oldSize","newSize","touches","oldStart","newStart","invert","Mapping","mirror","TransformError","appendMap","mirrors","setMirror","appendMapping","startSize","mirr","getMirror","appendMappingInverted","totalSize","inverse","corr","docs","docChanged","mustOverride","maybeStep","failed","getMap","stepsByID","Step","_doc","_mapping","merge","_other","stepType","stepClass","StepResult","fail","fromReplace","e","ReplaceStep","contentBetween","slice$1","ReplaceAroundStep","gapFrom","gapTo","gap","inserted","canCut","liftTarget","innerRange","around","outer","findWrappingOutside","inside","innerMatch","findWrappingInside","withAttrs","canSplit","typesAfter","innerType","index$1","rest","baseType","canJoin","joinPoint","dropPoint","pass","insertPos","mapFragment","mapped","gapStart","gapEnd","splitting","d$1","splitting$1","wrappers","canChangeType","startM","endM","newNode","typeAfter","AddMarkStep","oldSlice","RemoveMarkStep","fitsTrivially","removed","added","removing","adding","newSet","matched","toRemove","found$1","parentType","delSteps","allowed","Fitter","fit","replaceStep","unplaced","frontier","dropFromFragment","count","addToFragment","contentAt","closeNodeStart","contentAfterFits","invalidMarks","closeFragment","oldOpen","newOpen","coveredDepths","findFittable","placeNodes","openMore","dropNode","moveInline","mustMoveInline","placedSize","close","sliceDepth","frontierDepth","inject","openAtEnd","closeFrontierNode","openFrontierNode","taken","openEndCount","findCloseLevel","dropInner","match$1","move","targetDepths","preferredTarget","unshift","defining","preferredTargetIndex","leftNodes","preferredDepth","openDepth","targetDepth","expand","startSteps","point","insertPoint","covered","_hasOwnProperty","isValidEntityCode","fromCodePoint","surrogate1","surrogate2","String","fromCharCode","UNESCAPE_MD_RE","UNESCAPE_ALL_RE","RegExp","source","DIGITAL_ENTITY_TEST_RE","entities","HTML_ESCAPE_TEST_RE","HTML_ESCAPE_REPLACE_RE","HTML_REPLACEMENTS","replaceUnsafeChar","ch","REGEXP_ESCAPE_RE","UNICODE_PUNCT_RE","lib","mdurl","ucmicro","assign","sources","TypeError","isString","_class","unescapeMd","unescapeAll","escaped","entity","parseInt","replaceEntityPattern","escapeHtml","arrayReplaceAt","src","newElements","isSpace","isWhiteSpace","isMdAsciiPunct","isPunctChar","escapeRE","normalizeReference","toUpperCase","InputRule","handler","cutOff","inputRules","stored","handleTextInput","run","handleDOMEvents","compositionend","setTimeout","isInputRules","composing","textBefore","transform","undoInputRule","undoable","toUndo","ellipsis","wrappingInputRule","joinPredicate","textblockTypeInputRule","_setPrototypeOf","setPrototypeOf","_inheritsLoose","subClass","superClass","paragraph","horizontal_rule","heading","code_block","params","order","tight","hasAttribute","list_item","image","alt","draggable","hard_break","em","strong","link","href","MarkdownParseState","tokenHandlers","stack","token","noCloseToken","withoutTrailingNewline","noOp","elt","addText","merged","maybeMerge","openMark","closeMark","parseTokens","toks","openNode","closeNode","info","MarkdownParser","tokenizer","handlers","nodeType$1","children","softbreak","listIsTight","hidden","defaultMarkdownParser","html","attrGet","fence","hardbreak","code_inline","MarkdownSerializer","serialize","MarkdownSerializerState","renderContent","defaultMarkdownSerializer","wrapBlock","write","ensureNewLine","closeBlock","repeat","renderInline","markup","renderList","bullet","maxW","nStr","esc","quote","mixable","expelEnclosingWhitespace","_state","isPlainURL","_mark","backticksFor","escape","ticks","delim","closed","inTightList","tightLists","flushClose","atBlank","delimMin","firstDelim","old","lines","startOfLine","render","trailing","progress","leading","lead","inner$1","trail","noEsc","markString","isTight","prevTight","getEnclosingWhitespace","wrapInList","doJoin","outerRange","$insert","joinBefore","splitDepth","splitPos","doWrapInList","splitListItem","grandParent","keepItem","tr$1","liftListItem","endOfList","liftToOuterList","list","indexBefore","liftOutOfList","sinkListItem","nestedBefore","flarum","core","compat","CommandButton","oninit","vnode","addItem","command","onEditorUpdate","extractText","tooltip","className","onclick","click","onkeydown","keydown","icon","preventDefault","app","translator","trans","Component","_extends","findParentNode","predicate","findParentNodeClosestToPos","findSelectedNodeOfType","isNodeSelection","equalNodeType","getMarkAttrs","markItem","getMarkRange","endPos","markIsActive","nodeIsActive","MarkButton","$","toggleClass","markActive","8","9","10","12","13","16","17","18","20","27","32","33","34","35","36","37","38","39","40","44","45","46","59","61","91","92","106","107","108","109","110","111","144","145","160","161","162","163","164","165","173","186","187","188","189","190","191","192","219","220","221","222","229","48","49","50","51","52","53","54","55","56","57","chrome","userAgent","safari","vendor","gecko","mac","ie","brokenModifierNames","normalizeKeyName","ctrl","mod","modifiers","event","altKey","ctrlKey","metaKey","shiftKey","keymap","bindings","handleKeyDown","keydownHandler","normalize","baseName","keyCode","keyName","isChar","direct","fromCode","withShift","SafariModalHack","oncreate","on","modal","onsubmit","vnodeContent","Modal","FormDropdown","buttonClassName","is","show","toArray","stopPropagation","focus","select","getButtonContent","getMenu","items","ItemList","trigger","composer","editor","Dropdown","ListButton","nodeActive","genMarkupAwareMarkConfig","error","MarkdownSerializerBuilder","buildNodes","spoiler","math_block","buildMarks","spoiler_inline","strike","sup","math_inline","build","genHtmlInlineMarkSpec","spoilerNodeSpec","class","mathBlockNodeSpec","SchemaBuilder","Schema","NodeTypeDropdown","getNodeTypeButtons","getButton","data-toggle","activeIndex","element","innerText","InsertImageDropdown","Stream","placeholder","bidi","required","MenuState","attachEditorView","editorView","getSchema","destroy","markAttrs","selectionEmpty","transaction","RopeSequence","leafAppend","leafPrepend","appendInner","Append","sliceInner","getInner","forEachInner","forEachInvertedInner","values","Leaf","flatten","left","right","leftLen","Branch","eventCount","popEvent","preserveItems","remap","remapping","remaining","addAfter","Item","addTransform","histOptions","newItems","oldItems","lastItem","cutPoint","overflow","DEPTH_OVERFLOW","mirrorPos","mirrorOffset","addMaps","rebased","rebasedTransform","rebasedCount","rebasedItems","newUntil","iRebased","newMaps","branch","emptyItemCount","compress","events","newItem","HistoryState","done","undone","prevRanges","prevTime","rangesFor","mapRanges","histTransaction","history","redo","mustPreserveItems","historyKey","newHist","historyState","cachedPreserveItems","cachedPreserveItemsPlugins","historyPreserveItems","closeHistoryKey","newGroupDelay","hist","historyTr","appended","newGroup","adjacent","isAdjacentTo","undo","ie_edge","ie_upto10","ie_11up","ie_version","documentMode","gecko_version","chrome_version","ios","maxTouchPoints","android","webkit","documentElement","webkit_version","domIndex","parentNode","host","reusedRange","textRange","createRange","setEnd","setStart","isEquivalentPosition","off","targetNode","targetOff","scanFor","atomElements","hasBlockDesc","contentEditable","pmViewDesc","selectionCollapsed","domSel","collapsed","isCollapsed","rangeCount","getRangeAt","keyEvent","createEvent","initEvent","windowRect","clientWidth","bottom","clientHeight","getSide","clientRect","rect","getBoundingClientRect","scrollRectIntoView","startDOM","scrollThreshold","someProp","scrollMargin","atTop","body","bounding","moveX","moveY","defaultView","scrollBy","startX","scrollLeft","startY","scrollTop","dX","dY","scrollStack","restoreScrollStack","dTop","preventScrollSupported","findOffsetInNode","coords","closest","coordsClosest","dxClosest","rowBot","rowTop","childIndex","rects","getClientRects","dx","singleRect","inRect","findOffsetInText","posAtCoords","assign$1","root","caretPositionFromPoint","pos$1","offsetNode","caretRangeFromPoint","startContainer","startOffset","elementFromPoint","box","startI","floor","targetKludge","box$1","outside","docView","nearestDesc","posBefore","posAfter","posFromDOM","posFromCaret","posFromElement","posAtStart","border","BIDI","coordsAtPos","domFromPos","supportEmptyRange","takeSide","flattenV","rectBefore","rectAfter","flattenH","before$1","after$1","target$1","width","x","height","y","withFlushedState","viewState","activeElement","updateState","maybeRTL","cachedState","cachedDir","cachedResult","nearest","boxes","endOfTextblockVertical","getSelection","modify","oldRange","oldNode","focusNode","oldOff","focusOffset","oldBidiLevel","caretBidiLevel","domAfterPos","removeAllRanges","endOfTextblockHorizontal","dirty","beforePosition","posAtEnd","contentLost","domAtom","matchesWidget","matchesMark","matchesNode","matchesHack","parseRule","stopEvent","posBeforeChild","localPosFromDOM","domBefore","domAfter","desc$1","search$1","onlyNodes","getDesc","nodeDOM","descAt","parseRange","fromOffset","toOffset","childBase","emptyChildAt","j$1","force","anchorDOM","headDOM","brKludge","offset$1","anchorNode","anchorOffset","domSelExtended","extend","collapse","DOMException","ignoreMutation","mutation","markDirty","startInside","endInside","markParentsDirty","nothing","WidgetViewDesc","ViewDesc","widget","raw","classList","stop","ignoreSelection","CompositionViewDesc","textDOM","mut","oldValue","MarkViewDesc","custom","nodeViews","replaceNodes","NodeViewDesc","outerDeco","innerDeco","updateChildren","descObj","applyOuterDeco","CustomNodeViewDesc","TextViewDesc","reparseInView","sameOuterDeco","composition","localCompositionNode","updater","ViewTreeUpdater","deco","onWidget","onNode","locals","forChild","decoIndex","restNode","parentIndex","widgets","compareSide","child$1","cutAt","i$3","iterDeco","insideNode","syncToMarks","placeWidget","findNodeMatch","updateNextNode","addTextblockHacks","destroyRest","changed","protectLocalComposition","renderDescs","parentDOM","descs","written","childDOM","rm","insertBefore","trackWrites","oldCSS","cssText","getComputedStyle","listStyle","iosHacks","nearbyTextNode","textPos","childStart","findTextInFragment","removeChild","compositionNodes","updateInner","updateOuterDeco","needsWrap","oldDOM","patchOuterDeco","computeOuterDeco","selectNode","deselectNode","removeAttribute","docViewDesc","pmIsDeco","inParent","BRHackViewDesc","OuterDecoLevel","noDeco","outerDOM","prevComputed","curComputed","curDOM","patchAttributes","prevList","curList","removeProperty","lockedNode","lock","preMatch","preMatched","preMatchOffset","selectionFromDOM","origin","inWidget","isOnEdge","selectionBetween","selectionToDOM","syncNodeSelection","editable","hasFocus","hasSelection","domObserver","disconnectSelection","cursorWrapper","img","disabled","selectCursorWrapper","resetEditableFrom","resetEditableTo","brokenSelectBetweenUneditable","temporarilyEditableNear","resetEditable","removeEventListener","hideSelectionGuard","addEventListener","removeClassOnSelectionChange","setCurSelection","connectSelection","getPreMatch","destroyBetween","maxKeep","markDesc","nextDOM","setEditable","wasDraggable","lastSelectedViewDesc","clearNodeSelection","moveSelectionBlock","$side","selectHorizontally","mods","nodePos","nodeLen","isIgnorable","skipIgnoredNodesLeft","moveNode","moveOffset","isBlockNode","setSelFocus","skipIgnoredNodesRight","selectVertically","beyond","stopNativeHorizontalDelete","nextNode","switchEditable","captureKeyDown","getMods","safariDownArrowBug","readDOMChange","typeOver","addedNodes","lastSelectionTime","lastSelectionOrigin","newSel","shared","from_","to_","lastKeyCode","startDoc","editableContent","anchor$1","parseBetween","preferredPos","preferredSide","compare","lastKeyCodeTime","change","endA","endB","adjust","findDiff","lastIOSEnter","sel$1","resolveSelection","domChangeCount","nextSel","inlineChange","$newStart","$newEnd","skipClosingAndOpening","$next","looksLikeJoin","suppressSelectionUpdates","markChange","$from1","chFrom","chTo","curMarks","prevMarks","isMarkChange","sel$2","parsedSel","fromEnd","mayOpen","serializeForClipboard","serializer","detachedDoc","wrapMap","wrapper","parseFromClipboard","plainText","inCode","asText","parsed","metas","firstTag","innerHTML","readHTML","contextNode","sliceData","addContext","closeRange","closeSlice","lastWrap","inLast","addToSibling","sibling","withWrappers","closeRight","wrapped","normalizeSiblings","thead","tbody","caption","colgroup","col","td","th","_detachedDoc","implementation","createHTMLDocument","observeOptions","childList","characterData","characterDataOldValue","attributes","attributeOldValue","subtree","useCharData","SelectionState","DOMObserver","handleDOMChange","queue","flushingSoon","observer","MutationObserver","mutations","removedNodes","flushSoon","flush","currentSelection","onCharData","prevValue","onSelectionChange","suppressingSelectionUpdates","forceFlush","clearTimeout","observe","take","takeRecords","disconnect","ignoreSelectionChange","container","commonAncestorContainer","result$1","registerMutation","brs","cssChecked","whiteSpace","console","checkCSS","attributeName","editHandlers","setSelectionOrigin","ensureListeners","currentHandlers","eventHandlers","runCustomHandler","defaultPrevented","eventCoords","clientX","clientY","runHandlerOnContext","propName","updateSelection","focused","handleSingleClick","selectedNode","selectAt","selectClickedNode","selectClickedLeaf","handleDoubleClick","handleTripleClick","defaultTripleClick","forceDOMFlush","endComposition","inOrNearComposition","lastIOSEnterFallbackTimeout","keyup","keypress","charCode","selectNodeModifier","mousedown","flushed","lastClick","dy","isNear","mouseDown","targetPos","allowDefault","mightDrag","targetDesc","addAttr","setUneditable","up","abs","timeStamp","compositionEndedAt","touchdown","contextmenu","timeoutComposition","scheduleComposeEnd","delay","composingTimeout","clearComposition","forceUpdate","compositionstart","compositionupdate","markCursor","brokenClipboardAPI","doPaste","singleNode","sliceSingleNode","data","clipboardData","clearData","setData","selectNodeContents","blur","captureCopy","paste","getData","capturePaste","Dragging","dragCopyModifier","dragstart","dataTransfer","dragging","dragend","dragover","dragenter","drop","eventPos","$mouse","isNode","beforeInsert","beforeinput","inputType","compareObjs","WidgetType","noSpec","span","oldOffset","Decoration","valid","InlineType","inclusiveStart","inclusiveEnd","DecorationSet","local","decorations","buildTree","findInner","childOff","mapInner","newLocal","onRemove","oldChildren","oldEnd","newEnd","dSize","mustRebuild","fromLocal","toLocal","childOffset","childNode","gather","mapAndGatherRemainingDecorations","from$1","byPos","mapChildren","addInner","baseOffset","takeSpansForNode","moveSpans","withoutNulls","removeInner","span$1","dec","localSet","DecorationGroup","removeOverlap","localsInner","members","spans","hasNulls","localStart","working","insertAhead","viewDecorations","sorted","EditorView","_props","_root","mount","mounted","getEditable","updateCursorWrapper","buildNodeViews","computeDocDeco","bubbles","eventBelongsToView","initInput","pluginViews","updatePluginViews","contenteditable","updateStateInner","setProps","reconfigured","redraw","updateSel","nA","nB","changedNodeViews","scroll","scrollToSelection","updateDoc","sel1","sel2","refDOM","refTop","newRefTop","oldScrollPos","overflowAnchor","innerHeight","localRect","storeScrollPos","forceSelUpdate","chromeKludge","destroyPluginViews","prevState","pluginView","setActive","preventScroll","focusPreventScroll","getPrototypeOf","domAtPos","posAtDOM","destroyInput","dispatchEvent","dispatchTransaction","DropCursorView","color","cursorPos","timeout","updateOverlay","setCursor","nodeRect","parentLeft","parentTop","offsetParent","position","pageXOffset","pageYOffset","rect$1","scheduleRemoval","dragleave","relatedTarget","GapCursor","GapBookmark","closedBefore","closedAfter","override","allowGapCursor","mustMove","$cur","$cur$1","arrow","axis","dirStr","$found","handleClick","drawGapCursor","dataImageRegex","onClick","orderedListRule","bulletListRule","codeBlockRule","headingRule","maxLevel","blockSpoilerRule","ProseMirrorEditorDriver","MarkdownParserBuilder","buildEditorStateConfig","buildEditorProps","classNames","callInputListeners","inputListeners","listener","oninput","onkeyup","parseInitialValue","buildPluginItems","menuState","buildInputRules","Escape","insertHardBreak","enterCommands","emojiDropdown","mentionsDropdown","session","user","preferences","richTextCompactParagraphs","handleEnter","Backspace","Enter","richTextKeymap","disabled$","curr","transformPastedHTML","parseFromString","querySelectorAll","outerHTML","createSelectionBetween","_view","handleClickOn","handleDoubleClickOn","newDoc","newDocPlaintext","serializeContent","moveCursorTo","setSelectionRange","getSelectionRange","getLastNChars","insertAtCursor","insertBetween","trailingNewLines","endsWith","replaceBeforeCursor","getCaretCoordinates","viewportCoords","editorViewportOffset","isTerminatorChar","tokenize","silent","posMax","md","ruler","disable","blockquoteExt","startLine","endLine","adjustTab","initial","lastLineEmpty","nextLine","oldBMarks","oldBSCount","oldIndent","oldParentType","oldSCount","oldTShift","spaceAfterMarker","terminate","terminatorRules","wasOutdented","oldLineMax","lineMax","bMarks","tShift","eMarks","sCount","blkIndent","followingCharRegex","bsCount","foundExclamation","foundOpen","oldPos","getRules","line","spoilerFn","blockquoteFn","blockSpoiler","__rules__","bqIndex","postProcess","delimiters","loneMarkers","startDelim","marker","endDelim","tokenO","nesting","tokenC","frontPriorMode","scanned","scanDelims","isOdd","jump","can_open","can_close","ruler2","tokens_meta","tokenizerParams","buildTokenizer","markdownit","enable","use","altText","latexPlugin","subPlugin","supPlugin","inlineSpoilerBars","inlineSpoilerTags","buildTokens","HiddenItemsDropdown","buttons","button","ProseMirrorMenu","modifierKey","component","InsertLinkDropdown","hiddenItems","linkAttrs","Ruler","__cache__","__find__","__compile__","chains","enabled","altName","chain","fn","opt","beforeName","ruleName","afterName","ignoreInvalid","idx","enableOnly","chainName","Token","attrIndex","attrPush","attrData","attrSet","attrJoin","encode","decode","format","open_tag","close_tag","HTML_TAG_RE","HTML_OPEN_CLOSE_TAG_RE","isStrong","components","updateToggleMark","proseMirror","markdown","applyEditor","TextEditor","forum","attribute","Button","useRichTextEditor","savePreferences","then","buildEditor","original","buildEditorParams","UNESCAPE_RE","subscript","skipToken","superscript","isValidDelim","prevChar","nextChar","res","firstLine","lastLine","lastPos","getLines","server","purifiedURL","latex","encodeURIComponent","renderer","Inline","Block","utils","helpers","Renderer","ParserCore","ParserBlock","ParserInline","LinkifyIt","punycode","zero","commonmark","BAD_PROTO_RE","GOOD_DATA_RE","validateLink","url","RECODE_HOSTNAME_FOR","normalizeLink","hostname","protocol","toASCII","er","normalizeLinkText","toUnicode","MarkdownIt","presetName","linkify","configure","presets","rules2","missed","args","env","State","process","parseInline","inlineMode","encodeCache","exclude","keepEscaped","nextCode","cache","defaultChars","getEncodeCache","componentChars","decodeCache","getDecodeCache","seq","b1","b2","b3","b4","chr","slashes","auth","port","pathname","hash","Url","protocolPattern","portPattern","simplePathPattern","unwise","autoEscape","nonHostChars","hostEndingChars","hostnamePartPattern","hostnamePartStart","hostlessProtocol","slashedProtocol","slashesDenoteHost","lowerProto","hec","simplePath","proto","substr","atSign","hostEnd","parseHost","ipv6Hostname","hostparts","newpart","k","validParts","notHost","bit","qm","u","Any","Cc","Cf","P","Z","parseLinkLabel","parseLinkDestination","parseLinkTitle","disableNested","prevPos","labelEnd","default_rules","slf","renderAttrs","highlighted","tmpAttrs","tmpToken","langName","highlight","langPrefix","renderInlineAsText","renderToken","xhtmlOut","breaks","html_block","html_inline","nextToken","needLf","_rules","Core","NEWLINES_RE","NULL_RE","isLinkClose","currentToken","ln","htmlLinkLevel","fullUrl","urlText","links","blockTokens","pretest","lastIndex","RARE_RE","SCOPED_ABBR_TEST_RE","SCOPED_ABBR_RE","SCOPED_ABBR","tm","replaceFn","replace_scoped","inlineTokens","inside_autolink","replace_rare","blkIdx","typographer","QUOTE_TEST_RE","QUOTE_RE","replaceAt","process_inlines","thisLevel","lastChar","isLastPunctChar","isNextPunctChar","isLastWhiteSpace","isNextWhiteSpace","canOpen","canClose","isSingle","openQuote","closeQuote","OUTER","single","quotes","StateCore","hasEmptyLines","maxNesting","skipEmptyLines","isEmpty","outTokens","getLine","escapedSplit","escapes","backTicked","lastBackTick","substring","lineText","columns","columnCount","aligns","tableLines","tbodyLines","mem","haveEndMarker","skipChars","skipSpaces","cnt","skipBulletListMarker","skipOrderedListMarker","contentStart","indent","indentAfterMarker","isOrdered","itemLines","listLines","listTokIdx","markerCharCode","markerValue","oldListIndent","oldTight","posAfterMarker","prevEmptyEnd","isTerminatingParagraph","listIndent","markTightParagraphs","_endLine","destEndPos","destEndLineNo","label","references","skipSpacesBack","skipCharsBack","block_names","HTML_SEQUENCES","StateBlock","indent_found","ddIndent","begin","keepLastLF","lineIndent","lineStart","_rules2","pushPending","pmax","ESCAPED","labelStart","parseReference","EMAIL_RE","AUTOLINK_RE","tail","linkMatch","emailMatch","lc","isLetter","DIGITAL_RE","NAMED_RE","processDelimiters","closerIdx","openerIdx","closer","opener","minOpenerIdx","newMinOpenerIdx","isOddMatch","lastJump","openersBottom","StateInline","pendingLevel","_prev_delimiters","token_meta","canSplitWord","left_flanking","right_flanking","isFunction","defaultOptions","fuzzyLink","fuzzyEmail","fuzzyIP","defaultSchemas","validate","http","src_auth","src_host_port_strict","src_path","no_http","src_domain","src_domain_root","src_port","src_host_terminator","mailto","src_email_name","src_host_strict","tlds_default","__opts__","tlds","__tlds__","untpl","tpl","src_tlds","onCompile","__tlds_replaced__","src_xn","email_fuzzy","tpl_email_fuzzy","link_fuzzy","tpl_link_fuzzy","link_no_ip_fuzzy","tpl_link_no_ip_fuzzy","host_fuzzy_test","tpl_host_fuzzy_test","aliases","schemaError","__compiled__","__schemas__","compiled","isRegExp","createValidator","alias","slist","schema_test","src_ZPCc","schema_search","__index__","__text_cache__","resetScanCache","Match","__last_index__","__schema__","createMatch","schemas","acc","definition","ml","me","tld_pos","testSchemaAt","keepOld","el","arr","opts","src_Any","src_Cc","src_Z","src_P","src_ZCc","src_pseudo_letter","src_ip4","src_host","tpl_host_fuzzy","tpl_host_no_ip_fuzzy","tpl_host_fuzzy_strict","tpl_host_port_fuzzy_strict","tpl_host_port_no_ip_fuzzy_strict","freeGlobal","global","maxInt","regexPunycode","regexNonASCII","regexSeparators","errors","stringFromCharCode","mapDomain","ucs2decode","counter","ucs2encode","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","baseMinusTMin","input","basic","oldi","w","baseMinusT","codePoint","inputLength","handledCPCount","basicLength","q","currentValue","handledCPCountPlusOne","qMinusT","webpackPolyfill","deprecate","paths","g","initializers","extensionData","registerSetting","setting"],"mappings":"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","file":"admin.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 115);\n","// ::- Persistent data structure representing an ordered mapping from\n// strings to values, with some convenient update methods.\nfunction OrderedMap(content) {\n this.content = content;\n}\n\nOrderedMap.prototype = {\n constructor: OrderedMap,\n\n find: function(key) {\n for (var i = 0; i < this.content.length; i += 2)\n if (this.content[i] === key) return i\n return -1\n },\n\n // :: (string) → ?any\n // Retrieve the value stored under `key`, or return undefined when\n // no such key exists.\n get: function(key) {\n var found = this.find(key);\n return found == -1 ? undefined : this.content[found + 1]\n },\n\n // :: (string, any, ?string) → OrderedMap\n // Create a new map by replacing the value of `key` with a new\n // value, or adding a binding to the end of the map. If `newKey` is\n // given, the key of the binding will be replaced with that key.\n update: function(key, value, newKey) {\n var self = newKey && newKey != key ? this.remove(newKey) : this;\n var found = self.find(key), content = self.content.slice();\n if (found == -1) {\n content.push(newKey || key, value);\n } else {\n content[found + 1] = value;\n if (newKey) content[found] = newKey;\n }\n return new OrderedMap(content)\n },\n\n // :: (string) → OrderedMap\n // Return a map with the given key removed, if it existed.\n remove: function(key) {\n var found = this.find(key);\n if (found == -1) return this\n var content = this.content.slice();\n content.splice(found, 2);\n return new OrderedMap(content)\n },\n\n // :: (string, any) → OrderedMap\n // Add a new key to the start of the map.\n addToStart: function(key, value) {\n return new OrderedMap([key, value].concat(this.remove(key).content))\n },\n\n // :: (string, any) → OrderedMap\n // Add a new key to the end of the map.\n addToEnd: function(key, value) {\n var content = this.remove(key).content.slice();\n content.push(key, value);\n return new OrderedMap(content)\n },\n\n // :: (string, string, any) → OrderedMap\n // Add a key after the given key. If `place` is not found, the new\n // key is added to the end.\n addBefore: function(place, key, value) {\n var without = this.remove(key), content = without.content.slice();\n var found = without.find(place);\n content.splice(found == -1 ? content.length : found, 0, key, value);\n return new OrderedMap(content)\n },\n\n // :: ((key: string, value: any))\n // Call the given function for each key/value pair in the map, in\n // order.\n forEach: function(f) {\n for (var i = 0; i < this.content.length; i += 2)\n f(this.content[i], this.content[i + 1]);\n },\n\n // :: (union) → OrderedMap\n // Create a new map by prepending the keys in this map that don't\n // appear in `map` before the keys in `map`.\n prepend: function(map) {\n map = OrderedMap.from(map);\n if (!map.size) return this\n return new OrderedMap(map.content.concat(this.subtract(map).content))\n },\n\n // :: (union) → OrderedMap\n // Create a new map by appending the keys in this map that don't\n // appear in `map` after the keys in `map`.\n append: function(map) {\n map = OrderedMap.from(map);\n if (!map.size) return this\n return new OrderedMap(this.subtract(map).content.concat(map.content))\n },\n\n // :: (union) → OrderedMap\n // Create a map containing all the keys in this map that don't\n // appear in `map`.\n subtract: function(map) {\n var result = this;\n map = OrderedMap.from(map);\n for (var i = 0; i < map.content.length; i += 2)\n result = result.remove(map.content[i]);\n return result\n },\n\n // :: number\n // The amount of keys in this map.\n get size() {\n return this.content.length >> 1\n }\n};\n\n// :: (?union) → OrderedMap\n// Return a map with the given content. If null, create an empty\n// map. If given an ordered map, return that map itself. If given an\n// object, create a map from the object's properties.\nOrderedMap.from = function(value) {\n if (value instanceof OrderedMap) return value\n var content = [];\n if (value) for (var prop in value) content.push(prop, value[prop]);\n return new OrderedMap(content)\n};\n\nvar orderedmap = OrderedMap;\n\nexport default orderedmap;\n","import OrderedMap from 'orderedmap';\n\nfunction findDiffStart(a, b, pos) {\n for (var i = 0;; i++) {\n if (i == a.childCount || i == b.childCount)\n { return a.childCount == b.childCount ? null : pos }\n\n var childA = a.child(i), childB = b.child(i);\n if (childA == childB) { pos += childA.nodeSize; continue }\n\n if (!childA.sameMarkup(childB)) { return pos }\n\n if (childA.isText && childA.text != childB.text) {\n for (var j = 0; childA.text[j] == childB.text[j]; j++)\n { pos++; }\n return pos\n }\n if (childA.content.size || childB.content.size) {\n var inner = findDiffStart(childA.content, childB.content, pos + 1);\n if (inner != null) { return inner }\n }\n pos += childA.nodeSize;\n }\n}\n\nfunction findDiffEnd(a, b, posA, posB) {\n for (var iA = a.childCount, iB = b.childCount;;) {\n if (iA == 0 || iB == 0)\n { return iA == iB ? null : {a: posA, b: posB} }\n\n var childA = a.child(--iA), childB = b.child(--iB), size = childA.nodeSize;\n if (childA == childB) {\n posA -= size; posB -= size;\n continue\n }\n\n if (!childA.sameMarkup(childB)) { return {a: posA, b: posB} }\n\n if (childA.isText && childA.text != childB.text) {\n var same = 0, minSize = Math.min(childA.text.length, childB.text.length);\n while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) {\n same++; posA--; posB--;\n }\n return {a: posA, b: posB}\n }\n if (childA.content.size || childB.content.size) {\n var inner = findDiffEnd(childA.content, childB.content, posA - 1, posB - 1);\n if (inner) { return inner }\n }\n posA -= size; posB -= size;\n }\n}\n\n// ::- A fragment represents a node's collection of child nodes.\n//\n// Like nodes, fragments are persistent data structures, and you\n// should not mutate them or their content. Rather, you create new\n// instances whenever needed. The API tries to make this easy.\nvar Fragment = function Fragment(content, size) {\n this.content = content;\n // :: number\n // The size of the fragment, which is the total of the size of its\n // content nodes.\n this.size = size || 0;\n if (size == null) { for (var i = 0; i < content.length; i++)\n { this.size += content[i].nodeSize; } }\n};\n\nvar prototypeAccessors = { firstChild: { configurable: true },lastChild: { configurable: true },childCount: { configurable: true } };\n\n// :: (number, number, (node: Node, start: number, parent: Node, index: number) → ?bool, ?number)\n// Invoke a callback for all descendant nodes between the given two\n// positions (relative to start of this fragment). Doesn't descend\n// into a node when the callback returns `false`.\nFragment.prototype.nodesBetween = function nodesBetween (from, to, f, nodeStart, parent) {\n if ( nodeStart === void 0 ) nodeStart = 0;\n\n for (var i = 0, pos = 0; pos < to; i++) {\n var child = this.content[i], end = pos + child.nodeSize;\n if (end > from && f(child, nodeStart + pos, parent, i) !== false && child.content.size) {\n var start = pos + 1;\n child.nodesBetween(Math.max(0, from - start),\n Math.min(child.content.size, to - start),\n f, nodeStart + start);\n }\n pos = end;\n }\n};\n\n// :: ((node: Node, pos: number, parent: Node) → ?bool)\n// Call the given callback for every descendant node. The callback\n// may return `false` to prevent traversal of a given node's children.\nFragment.prototype.descendants = function descendants (f) {\n this.nodesBetween(0, this.size, f);\n};\n\n// : (number, number, ?string, ?string) → string\nFragment.prototype.textBetween = function textBetween (from, to, blockSeparator, leafText) {\n var text = \"\", separated = true;\n this.nodesBetween(from, to, function (node, pos) {\n if (node.isText) {\n text += node.text.slice(Math.max(from, pos) - pos, to - pos);\n separated = !blockSeparator;\n } else if (node.isLeaf && leafText) {\n text += leafText;\n separated = !blockSeparator;\n } else if (!separated && node.isBlock) {\n text += blockSeparator;\n separated = true;\n }\n }, 0);\n return text\n};\n\n// :: (Fragment) → Fragment\n// Create a new fragment containing the combined content of this\n// fragment and the other.\nFragment.prototype.append = function append (other) {\n if (!other.size) { return this }\n if (!this.size) { return other }\n var last = this.lastChild, first = other.firstChild, content = this.content.slice(), i = 0;\n if (last.isText && last.sameMarkup(first)) {\n content[content.length - 1] = last.withText(last.text + first.text);\n i = 1;\n }\n for (; i < other.content.length; i++) { content.push(other.content[i]); }\n return new Fragment(content, this.size + other.size)\n};\n\n// :: (number, ?number) → Fragment\n// Cut out the sub-fragment between the two given positions.\nFragment.prototype.cut = function cut (from, to) {\n if (to == null) { to = this.size; }\n if (from == 0 && to == this.size) { return this }\n var result = [], size = 0;\n if (to > from) { for (var i = 0, pos = 0; pos < to; i++) {\n var child = this.content[i], end = pos + child.nodeSize;\n if (end > from) {\n if (pos < from || end > to) {\n if (child.isText)\n { child = child.cut(Math.max(0, from - pos), Math.min(child.text.length, to - pos)); }\n else\n { child = child.cut(Math.max(0, from - pos - 1), Math.min(child.content.size, to - pos - 1)); }\n }\n result.push(child);\n size += child.nodeSize;\n }\n pos = end;\n } }\n return new Fragment(result, size)\n};\n\nFragment.prototype.cutByIndex = function cutByIndex (from, to) {\n if (from == to) { return Fragment.empty }\n if (from == 0 && to == this.content.length) { return this }\n return new Fragment(this.content.slice(from, to))\n};\n\n// :: (number, Node) → Fragment\n// Create a new fragment in which the node at the given index is\n// replaced by the given node.\nFragment.prototype.replaceChild = function replaceChild (index, node) {\n var current = this.content[index];\n if (current == node) { return this }\n var copy = this.content.slice();\n var size = this.size + node.nodeSize - current.nodeSize;\n copy[index] = node;\n return new Fragment(copy, size)\n};\n\n// : (Node) → Fragment\n// Create a new fragment by prepending the given node to this\n// fragment.\nFragment.prototype.addToStart = function addToStart (node) {\n return new Fragment([node].concat(this.content), this.size + node.nodeSize)\n};\n\n// : (Node) → Fragment\n// Create a new fragment by appending the given node to this\n// fragment.\nFragment.prototype.addToEnd = function addToEnd (node) {\n return new Fragment(this.content.concat(node), this.size + node.nodeSize)\n};\n\n// :: (Fragment) → bool\n// Compare this fragment to another one.\nFragment.prototype.eq = function eq (other) {\n if (this.content.length != other.content.length) { return false }\n for (var i = 0; i < this.content.length; i++)\n { if (!this.content[i].eq(other.content[i])) { return false } }\n return true\n};\n\n// :: ?Node\n// The first child of the fragment, or `null` if it is empty.\nprototypeAccessors.firstChild.get = function () { return this.content.length ? this.content[0] : null };\n\n// :: ?Node\n// The last child of the fragment, or `null` if it is empty.\nprototypeAccessors.lastChild.get = function () { return this.content.length ? this.content[this.content.length - 1] : null };\n\n// :: number\n// The number of child nodes in this fragment.\nprototypeAccessors.childCount.get = function () { return this.content.length };\n\n// :: (number) → Node\n// Get the child node at the given index. Raise an error when the\n// index is out of range.\nFragment.prototype.child = function child (index) {\n var found = this.content[index];\n if (!found) { throw new RangeError(\"Index \" + index + \" out of range for \" + this) }\n return found\n};\n\n// :: (number) → ?Node\n// Get the child node at the given index, if it exists.\nFragment.prototype.maybeChild = function maybeChild (index) {\n return this.content[index]\n};\n\n// :: ((node: Node, offset: number, index: number))\n// Call `f` for every child node, passing the node, its offset\n// into this parent node, and its index.\nFragment.prototype.forEach = function forEach (f) {\n for (var i = 0, p = 0; i < this.content.length; i++) {\n var child = this.content[i];\n f(child, p, i);\n p += child.nodeSize;\n }\n};\n\n// :: (Fragment) → ?number\n// Find the first position at which this fragment and another\n// fragment differ, or `null` if they are the same.\nFragment.prototype.findDiffStart = function findDiffStart$1 (other, pos) {\n if ( pos === void 0 ) pos = 0;\n\n return findDiffStart(this, other, pos)\n};\n\n// :: (Fragment) → ?{a: number, b: number}\n// Find the first position, searching from the end, at which this\n// fragment and the given fragment differ, or `null` if they are the\n// same. Since this position will not be the same in both nodes, an\n// object with two separate positions is returned.\nFragment.prototype.findDiffEnd = function findDiffEnd$1 (other, pos, otherPos) {\n if ( pos === void 0 ) pos = this.size;\n if ( otherPos === void 0 ) otherPos = other.size;\n\n return findDiffEnd(this, other, pos, otherPos)\n};\n\n// : (number, ?number) → {index: number, offset: number}\n// Find the index and inner offset corresponding to a given relative\n// position in this fragment. The result object will be reused\n// (overwritten) the next time the function is called. (Not public.)\nFragment.prototype.findIndex = function findIndex (pos, round) {\n if ( round === void 0 ) round = -1;\n\n if (pos == 0) { return retIndex(0, pos) }\n if (pos == this.size) { return retIndex(this.content.length, pos) }\n if (pos > this.size || pos < 0) { throw new RangeError((\"Position \" + pos + \" outside of fragment (\" + (this) + \")\")) }\n for (var i = 0, curPos = 0;; i++) {\n var cur = this.child(i), end = curPos + cur.nodeSize;\n if (end >= pos) {\n if (end == pos || round > 0) { return retIndex(i + 1, end) }\n return retIndex(i, curPos)\n }\n curPos = end;\n }\n};\n\n// :: () → string\n// Return a debugging string that describes this fragment.\nFragment.prototype.toString = function toString () { return \"<\" + this.toStringInner() + \">\" };\n\nFragment.prototype.toStringInner = function toStringInner () { return this.content.join(\", \") };\n\n// :: () → ?Object\n// Create a JSON-serializeable representation of this fragment.\nFragment.prototype.toJSON = function toJSON () {\n return this.content.length ? this.content.map(function (n) { return n.toJSON(); }) : null\n};\n\n// :: (Schema, ?Object) → Fragment\n// Deserialize a fragment from its JSON representation.\nFragment.fromJSON = function fromJSON (schema, value) {\n if (!value) { return Fragment.empty }\n if (!Array.isArray(value)) { throw new RangeError(\"Invalid input for Fragment.fromJSON\") }\n return new Fragment(value.map(schema.nodeFromJSON))\n};\n\n// :: ([Node]) → Fragment\n// Build a fragment from an array of nodes. Ensures that adjacent\n// text nodes with the same marks are joined together.\nFragment.fromArray = function fromArray (array) {\n if (!array.length) { return Fragment.empty }\n var joined, size = 0;\n for (var i = 0; i < array.length; i++) {\n var node = array[i];\n size += node.nodeSize;\n if (i && node.isText && array[i - 1].sameMarkup(node)) {\n if (!joined) { joined = array.slice(0, i); }\n joined[joined.length - 1] = node.withText(joined[joined.length - 1].text + node.text);\n } else if (joined) {\n joined.push(node);\n }\n }\n return new Fragment(joined || array, size)\n};\n\n// :: (?union) → Fragment\n// Create a fragment from something that can be interpreted as a set\n// of nodes. For `null`, it returns the empty fragment. For a\n// fragment, the fragment itself. For a node or array of nodes, a\n// fragment containing those nodes.\nFragment.from = function from (nodes) {\n if (!nodes) { return Fragment.empty }\n if (nodes instanceof Fragment) { return nodes }\n if (Array.isArray(nodes)) { return this.fromArray(nodes) }\n if (nodes.attrs) { return new Fragment([nodes], nodes.nodeSize) }\n throw new RangeError(\"Can not convert \" + nodes + \" to a Fragment\" +\n (nodes.nodesBetween ? \" (looks like multiple versions of prosemirror-model were loaded)\" : \"\"))\n};\n\nObject.defineProperties( Fragment.prototype, prototypeAccessors );\n\nvar found = {index: 0, offset: 0};\nfunction retIndex(index, offset) {\n found.index = index;\n found.offset = offset;\n return found\n}\n\n// :: Fragment\n// An empty fragment. Intended to be reused whenever a node doesn't\n// contain anything (rather than allocating a new empty fragment for\n// each leaf node).\nFragment.empty = new Fragment([], 0);\n\nfunction compareDeep(a, b) {\n if (a === b) { return true }\n if (!(a && typeof a == \"object\") ||\n !(b && typeof b == \"object\")) { return false }\n var array = Array.isArray(a);\n if (Array.isArray(b) != array) { return false }\n if (array) {\n if (a.length != b.length) { return false }\n for (var i = 0; i < a.length; i++) { if (!compareDeep(a[i], b[i])) { return false } }\n } else {\n for (var p in a) { if (!(p in b) || !compareDeep(a[p], b[p])) { return false } }\n for (var p$1 in b) { if (!(p$1 in a)) { return false } }\n }\n return true\n}\n\n// ::- A mark is a piece of information that can be attached to a node,\n// such as it being emphasized, in code font, or a link. It has a type\n// and optionally a set of attributes that provide further information\n// (such as the target of the link). Marks are created through a\n// `Schema`, which controls which types exist and which\n// attributes they have.\nvar Mark = function Mark(type, attrs) {\n // :: MarkType\n // The type of this mark.\n this.type = type;\n // :: Object\n // The attributes associated with this mark.\n this.attrs = attrs;\n};\n\n// :: ([Mark]) → [Mark]\n// Given a set of marks, create a new set which contains this one as\n// well, in the right position. If this mark is already in the set,\n// the set itself is returned. If any marks that are set to be\n// [exclusive](#model.MarkSpec.excludes) with this mark are present,\n// those are replaced by this one.\nMark.prototype.addToSet = function addToSet (set) {\n var copy, placed = false;\n for (var i = 0; i < set.length; i++) {\n var other = set[i];\n if (this.eq(other)) { return set }\n if (this.type.excludes(other.type)) {\n if (!copy) { copy = set.slice(0, i); }\n } else if (other.type.excludes(this.type)) {\n return set\n } else {\n if (!placed && other.type.rank > this.type.rank) {\n if (!copy) { copy = set.slice(0, i); }\n copy.push(this);\n placed = true;\n }\n if (copy) { copy.push(other); }\n }\n }\n if (!copy) { copy = set.slice(); }\n if (!placed) { copy.push(this); }\n return copy\n};\n\n// :: ([Mark]) → [Mark]\n// Remove this mark from the given set, returning a new set. If this\n// mark is not in the set, the set itself is returned.\nMark.prototype.removeFromSet = function removeFromSet (set) {\n for (var i = 0; i < set.length; i++)\n { if (this.eq(set[i]))\n { return set.slice(0, i).concat(set.slice(i + 1)) } }\n return set\n};\n\n// :: ([Mark]) → bool\n// Test whether this mark is in the given set of marks.\nMark.prototype.isInSet = function isInSet (set) {\n for (var i = 0; i < set.length; i++)\n { if (this.eq(set[i])) { return true } }\n return false\n};\n\n// :: (Mark) → bool\n// Test whether this mark has the same type and attributes as\n// another mark.\nMark.prototype.eq = function eq (other) {\n return this == other ||\n (this.type == other.type && compareDeep(this.attrs, other.attrs))\n};\n\n// :: () → Object\n// Convert this mark to a JSON-serializeable representation.\nMark.prototype.toJSON = function toJSON () {\n var obj = {type: this.type.name};\n for (var _ in this.attrs) {\n obj.attrs = this.attrs;\n break\n }\n return obj\n};\n\n// :: (Schema, Object) → Mark\nMark.fromJSON = function fromJSON (schema, json) {\n if (!json) { throw new RangeError(\"Invalid input for Mark.fromJSON\") }\n var type = schema.marks[json.type];\n if (!type) { throw new RangeError((\"There is no mark type \" + (json.type) + \" in this schema\")) }\n return type.create(json.attrs)\n};\n\n// :: ([Mark], [Mark]) → bool\n// Test whether two sets of marks are identical.\nMark.sameSet = function sameSet (a, b) {\n if (a == b) { return true }\n if (a.length != b.length) { return false }\n for (var i = 0; i < a.length; i++)\n { if (!a[i].eq(b[i])) { return false } }\n return true\n};\n\n// :: (?union) → [Mark]\n// Create a properly sorted mark set from null, a single mark, or an\n// unsorted array of marks.\nMark.setFrom = function setFrom (marks) {\n if (!marks || marks.length == 0) { return Mark.none }\n if (marks instanceof Mark) { return [marks] }\n var copy = marks.slice();\n copy.sort(function (a, b) { return a.type.rank - b.type.rank; });\n return copy\n};\n\n// :: [Mark] The empty set of marks.\nMark.none = [];\n\n// ReplaceError:: class extends Error\n// Error type raised by [`Node.replace`](#model.Node.replace) when\n// given an invalid replacement.\n\nfunction ReplaceError(message) {\n var err = Error.call(this, message);\n err.__proto__ = ReplaceError.prototype;\n return err\n}\n\nReplaceError.prototype = Object.create(Error.prototype);\nReplaceError.prototype.constructor = ReplaceError;\nReplaceError.prototype.name = \"ReplaceError\";\n\n// ::- A slice represents a piece cut out of a larger document. It\n// stores not only a fragment, but also the depth up to which nodes on\n// both side are ‘open’ (cut through).\nvar Slice = function Slice(content, openStart, openEnd) {\n // :: Fragment The slice's content.\n this.content = content;\n // :: number The open depth at the start.\n this.openStart = openStart;\n // :: number The open depth at the end.\n this.openEnd = openEnd;\n};\n\nvar prototypeAccessors$1 = { size: { configurable: true } };\n\n// :: number\n// The size this slice would add when inserted into a document.\nprototypeAccessors$1.size.get = function () {\n return this.content.size - this.openStart - this.openEnd\n};\n\nSlice.prototype.insertAt = function insertAt (pos, fragment) {\n var content = insertInto(this.content, pos + this.openStart, fragment, null);\n return content && new Slice(content, this.openStart, this.openEnd)\n};\n\nSlice.prototype.removeBetween = function removeBetween (from, to) {\n return new Slice(removeRange(this.content, from + this.openStart, to + this.openStart), this.openStart, this.openEnd)\n};\n\n// :: (Slice) → bool\n// Tests whether this slice is equal to another slice.\nSlice.prototype.eq = function eq (other) {\n return this.content.eq(other.content) && this.openStart == other.openStart && this.openEnd == other.openEnd\n};\n\nSlice.prototype.toString = function toString () {\n return this.content + \"(\" + this.openStart + \",\" + this.openEnd + \")\"\n};\n\n// :: () → ?Object\n// Convert a slice to a JSON-serializable representation.\nSlice.prototype.toJSON = function toJSON () {\n if (!this.content.size) { return null }\n var json = {content: this.content.toJSON()};\n if (this.openStart > 0) { json.openStart = this.openStart; }\n if (this.openEnd > 0) { json.openEnd = this.openEnd; }\n return json\n};\n\n// :: (Schema, ?Object) → Slice\n// Deserialize a slice from its JSON representation.\nSlice.fromJSON = function fromJSON (schema, json) {\n if (!json) { return Slice.empty }\n var openStart = json.openStart || 0, openEnd = json.openEnd || 0;\n if (typeof openStart != \"number\" || typeof openEnd != \"number\")\n { throw new RangeError(\"Invalid input for Slice.fromJSON\") }\n return new Slice(Fragment.fromJSON(schema, json.content), openStart, openEnd)\n};\n\n// :: (Fragment, ?bool) → Slice\n// Create a slice from a fragment by taking the maximum possible\n// open value on both side of the fragment.\nSlice.maxOpen = function maxOpen (fragment, openIsolating) {\n if ( openIsolating === void 0 ) openIsolating=true;\n\n var openStart = 0, openEnd = 0;\n for (var n = fragment.firstChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.firstChild) { openStart++; }\n for (var n$1 = fragment.lastChild; n$1 && !n$1.isLeaf && (openIsolating || !n$1.type.spec.isolating); n$1 = n$1.lastChild) { openEnd++; }\n return new Slice(fragment, openStart, openEnd)\n};\n\nObject.defineProperties( Slice.prototype, prototypeAccessors$1 );\n\nfunction removeRange(content, from, to) {\n var ref = content.findIndex(from);\n var index = ref.index;\n var offset = ref.offset;\n var child = content.maybeChild(index);\n var ref$1 = content.findIndex(to);\n var indexTo = ref$1.index;\n var offsetTo = ref$1.offset;\n if (offset == from || child.isText) {\n if (offsetTo != to && !content.child(indexTo).isText) { throw new RangeError(\"Removing non-flat range\") }\n return content.cut(0, from).append(content.cut(to))\n }\n if (index != indexTo) { throw new RangeError(\"Removing non-flat range\") }\n return content.replaceChild(index, child.copy(removeRange(child.content, from - offset - 1, to - offset - 1)))\n}\n\nfunction insertInto(content, dist, insert, parent) {\n var ref = content.findIndex(dist);\n var index = ref.index;\n var offset = ref.offset;\n var child = content.maybeChild(index);\n if (offset == dist || child.isText) {\n if (parent && !parent.canReplace(index, index, insert)) { return null }\n return content.cut(0, dist).append(insert).append(content.cut(dist))\n }\n var inner = insertInto(child.content, dist - offset - 1, insert);\n return inner && content.replaceChild(index, child.copy(inner))\n}\n\n// :: Slice\n// The empty slice.\nSlice.empty = new Slice(Fragment.empty, 0, 0);\n\nfunction replace($from, $to, slice) {\n if (slice.openStart > $from.depth)\n { throw new ReplaceError(\"Inserted content deeper than insertion position\") }\n if ($from.depth - slice.openStart != $to.depth - slice.openEnd)\n { throw new ReplaceError(\"Inconsistent open depths\") }\n return replaceOuter($from, $to, slice, 0)\n}\n\nfunction replaceOuter($from, $to, slice, depth) {\n var index = $from.index(depth), node = $from.node(depth);\n if (index == $to.index(depth) && depth < $from.depth - slice.openStart) {\n var inner = replaceOuter($from, $to, slice, depth + 1);\n return node.copy(node.content.replaceChild(index, inner))\n } else if (!slice.content.size) {\n return close(node, replaceTwoWay($from, $to, depth))\n } else if (!slice.openStart && !slice.openEnd && $from.depth == depth && $to.depth == depth) { // Simple, flat case\n var parent = $from.parent, content = parent.content;\n return close(parent, content.cut(0, $from.parentOffset).append(slice.content).append(content.cut($to.parentOffset)))\n } else {\n var ref = prepareSliceForReplace(slice, $from);\n var start = ref.start;\n var end = ref.end;\n return close(node, replaceThreeWay($from, start, end, $to, depth))\n }\n}\n\nfunction checkJoin(main, sub) {\n if (!sub.type.compatibleContent(main.type))\n { throw new ReplaceError(\"Cannot join \" + sub.type.name + \" onto \" + main.type.name) }\n}\n\nfunction joinable($before, $after, depth) {\n var node = $before.node(depth);\n checkJoin(node, $after.node(depth));\n return node\n}\n\nfunction addNode(child, target) {\n var last = target.length - 1;\n if (last >= 0 && child.isText && child.sameMarkup(target[last]))\n { target[last] = child.withText(target[last].text + child.text); }\n else\n { target.push(child); }\n}\n\nfunction addRange($start, $end, depth, target) {\n var node = ($end || $start).node(depth);\n var startIndex = 0, endIndex = $end ? $end.index(depth) : node.childCount;\n if ($start) {\n startIndex = $start.index(depth);\n if ($start.depth > depth) {\n startIndex++;\n } else if ($start.textOffset) {\n addNode($start.nodeAfter, target);\n startIndex++;\n }\n }\n for (var i = startIndex; i < endIndex; i++) { addNode(node.child(i), target); }\n if ($end && $end.depth == depth && $end.textOffset)\n { addNode($end.nodeBefore, target); }\n}\n\nfunction close(node, content) {\n if (!node.type.validContent(content))\n { throw new ReplaceError(\"Invalid content for node \" + node.type.name) }\n return node.copy(content)\n}\n\nfunction replaceThreeWay($from, $start, $end, $to, depth) {\n var openStart = $from.depth > depth && joinable($from, $start, depth + 1);\n var openEnd = $to.depth > depth && joinable($end, $to, depth + 1);\n\n var content = [];\n addRange(null, $from, depth, content);\n if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {\n checkJoin(openStart, openEnd);\n addNode(close(openStart, replaceThreeWay($from, $start, $end, $to, depth + 1)), content);\n } else {\n if (openStart)\n { addNode(close(openStart, replaceTwoWay($from, $start, depth + 1)), content); }\n addRange($start, $end, depth, content);\n if (openEnd)\n { addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content); }\n }\n addRange($to, null, depth, content);\n return new Fragment(content)\n}\n\nfunction replaceTwoWay($from, $to, depth) {\n var content = [];\n addRange(null, $from, depth, content);\n if ($from.depth > depth) {\n var type = joinable($from, $to, depth + 1);\n addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content);\n }\n addRange($to, null, depth, content);\n return new Fragment(content)\n}\n\nfunction prepareSliceForReplace(slice, $along) {\n var extra = $along.depth - slice.openStart, parent = $along.node(extra);\n var node = parent.copy(slice.content);\n for (var i = extra - 1; i >= 0; i--)\n { node = $along.node(i).copy(Fragment.from(node)); }\n return {start: node.resolveNoCache(slice.openStart + extra),\n end: node.resolveNoCache(node.content.size - slice.openEnd - extra)}\n}\n\n// ::- You can [_resolve_](#model.Node.resolve) a position to get more\n// information about it. Objects of this class represent such a\n// resolved position, providing various pieces of context information,\n// and some helper methods.\n//\n// Throughout this interface, methods that take an optional `depth`\n// parameter will interpret undefined as `this.depth` and negative\n// numbers as `this.depth + value`.\nvar ResolvedPos = function ResolvedPos(pos, path, parentOffset) {\n // :: number The position that was resolved.\n this.pos = pos;\n this.path = path;\n // :: number\n // The number of levels the parent node is from the root. If this\n // position points directly into the root node, it is 0. If it\n // points into a top-level paragraph, 1, and so on.\n this.depth = path.length / 3 - 1;\n // :: number The offset this position has into its parent node.\n this.parentOffset = parentOffset;\n};\n\nvar prototypeAccessors$2 = { parent: { configurable: true },doc: { configurable: true },textOffset: { configurable: true },nodeAfter: { configurable: true },nodeBefore: { configurable: true } };\n\nResolvedPos.prototype.resolveDepth = function resolveDepth (val) {\n if (val == null) { return this.depth }\n if (val < 0) { return this.depth + val }\n return val\n};\n\n// :: Node\n// The parent node that the position points into. Note that even if\n// a position points into a text node, that node is not considered\n// the parent—text nodes are ‘flat’ in this model, and have no content.\nprototypeAccessors$2.parent.get = function () { return this.node(this.depth) };\n\n// :: Node\n// The root node in which the position was resolved.\nprototypeAccessors$2.doc.get = function () { return this.node(0) };\n\n// :: (?number) → Node\n// The ancestor node at the given level. `p.node(p.depth)` is the\n// same as `p.parent`.\nResolvedPos.prototype.node = function node (depth) { return this.path[this.resolveDepth(depth) * 3] };\n\n// :: (?number) → number\n// The index into the ancestor at the given level. If this points at\n// the 3rd node in the 2nd paragraph on the top level, for example,\n// `p.index(0)` is 1 and `p.index(1)` is 2.\nResolvedPos.prototype.index = function index (depth) { return this.path[this.resolveDepth(depth) * 3 + 1] };\n\n// :: (?number) → number\n// The index pointing after this position into the ancestor at the\n// given level.\nResolvedPos.prototype.indexAfter = function indexAfter (depth) {\n depth = this.resolveDepth(depth);\n return this.index(depth) + (depth == this.depth && !this.textOffset ? 0 : 1)\n};\n\n// :: (?number) → number\n// The (absolute) position at the start of the node at the given\n// level.\nResolvedPos.prototype.start = function start (depth) {\n depth = this.resolveDepth(depth);\n return depth == 0 ? 0 : this.path[depth * 3 - 1] + 1\n};\n\n// :: (?number) → number\n// The (absolute) position at the end of the node at the given\n// level.\nResolvedPos.prototype.end = function end (depth) {\n depth = this.resolveDepth(depth);\n return this.start(depth) + this.node(depth).content.size\n};\n\n// :: (?number) → number\n// The (absolute) position directly before the wrapping node at the\n// given level, or, when `depth` is `this.depth + 1`, the original\n// position.\nResolvedPos.prototype.before = function before (depth) {\n depth = this.resolveDepth(depth);\n if (!depth) { throw new RangeError(\"There is no position before the top-level node\") }\n return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1]\n};\n\n// :: (?number) → number\n// The (absolute) position directly after the wrapping node at the\n// given level, or the original position when `depth` is `this.depth + 1`.\nResolvedPos.prototype.after = function after (depth) {\n depth = this.resolveDepth(depth);\n if (!depth) { throw new RangeError(\"There is no position after the top-level node\") }\n return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1] + this.path[depth * 3].nodeSize\n};\n\n// :: number\n// When this position points into a text node, this returns the\n// distance between the position and the start of the text node.\n// Will be zero for positions that point between nodes.\nprototypeAccessors$2.textOffset.get = function () { return this.pos - this.path[this.path.length - 1] };\n\n// :: ?Node\n// Get the node directly after the position, if any. If the position\n// points into a text node, only the part of that node after the\n// position is returned.\nprototypeAccessors$2.nodeAfter.get = function () {\n var parent = this.parent, index = this.index(this.depth);\n if (index == parent.childCount) { return null }\n var dOff = this.pos - this.path[this.path.length - 1], child = parent.child(index);\n return dOff ? parent.child(index).cut(dOff) : child\n};\n\n// :: ?Node\n// Get the node directly before the position, if any. If the\n// position points into a text node, only the part of that node\n// before the position is returned.\nprototypeAccessors$2.nodeBefore.get = function () {\n var index = this.index(this.depth);\n var dOff = this.pos - this.path[this.path.length - 1];\n if (dOff) { return this.parent.child(index).cut(0, dOff) }\n return index == 0 ? null : this.parent.child(index - 1)\n};\n\n// :: (number, ?number) → number\n// Get the position at the given index in the parent node at the\n// given depth (which defaults to `this.depth`).\nResolvedPos.prototype.posAtIndex = function posAtIndex (index, depth) {\n depth = this.resolveDepth(depth);\n var node = this.path[depth * 3], pos = depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n for (var i = 0; i < index; i++) { pos += node.child(i).nodeSize; }\n return pos\n};\n\n// :: () → [Mark]\n// Get the marks at this position, factoring in the surrounding\n// marks' [`inclusive`](#model.MarkSpec.inclusive) property. If the\n// position is at the start of a non-empty node, the marks of the\n// node after it (if any) are returned.\nResolvedPos.prototype.marks = function marks () {\n var parent = this.parent, index = this.index();\n\n // In an empty parent, return the empty array\n if (parent.content.size == 0) { return Mark.none }\n\n // When inside a text node, just return the text node's marks\n if (this.textOffset) { return parent.child(index).marks }\n\n var main = parent.maybeChild(index - 1), other = parent.maybeChild(index);\n // If the `after` flag is true of there is no node before, make\n // the node after this position the main reference.\n if (!main) { var tmp = main; main = other; other = tmp; }\n\n // Use all marks in the main node, except those that have\n // `inclusive` set to false and are not present in the other node.\n var marks = main.marks;\n for (var i = 0; i < marks.length; i++)\n { if (marks[i].type.spec.inclusive === false && (!other || !marks[i].isInSet(other.marks)))\n { marks = marks[i--].removeFromSet(marks); } }\n\n return marks\n};\n\n// :: (ResolvedPos) → ?[Mark]\n// Get the marks after the current position, if any, except those\n// that are non-inclusive and not present at position `$end`. This\n// is mostly useful for getting the set of marks to preserve after a\n// deletion. Will return `null` if this position is at the end of\n// its parent node or its parent node isn't a textblock (in which\n// case no marks should be preserved).\nResolvedPos.prototype.marksAcross = function marksAcross ($end) {\n var after = this.parent.maybeChild(this.index());\n if (!after || !after.isInline) { return null }\n\n var marks = after.marks, next = $end.parent.maybeChild($end.index());\n for (var i = 0; i < marks.length; i++)\n { if (marks[i].type.spec.inclusive === false && (!next || !marks[i].isInSet(next.marks)))\n { marks = marks[i--].removeFromSet(marks); } }\n return marks\n};\n\n// :: (number) → number\n// The depth up to which this position and the given (non-resolved)\n// position share the same parent nodes.\nResolvedPos.prototype.sharedDepth = function sharedDepth (pos) {\n for (var depth = this.depth; depth > 0; depth--)\n { if (this.start(depth) <= pos && this.end(depth) >= pos) { return depth } }\n return 0\n};\n\n// :: (?ResolvedPos, ?(Node) → bool) → ?NodeRange\n// Returns a range based on the place where this position and the\n// given position diverge around block content. If both point into\n// the same textblock, for example, a range around that textblock\n// will be returned. If they point into different blocks, the range\n// around those blocks in their shared ancestor is returned. You can\n// pass in an optional predicate that will be called with a parent\n// node to see if a range into that parent is acceptable.\nResolvedPos.prototype.blockRange = function blockRange (other, pred) {\n if ( other === void 0 ) other = this;\n\n if (other.pos < this.pos) { return other.blockRange(this) }\n for (var d = this.depth - (this.parent.inlineContent || this.pos == other.pos ? 1 : 0); d >= 0; d--)\n { if (other.pos <= this.end(d) && (!pred || pred(this.node(d))))\n { return new NodeRange(this, other, d) } }\n};\n\n// :: (ResolvedPos) → bool\n// Query whether the given position shares the same parent node.\nResolvedPos.prototype.sameParent = function sameParent (other) {\n return this.pos - this.parentOffset == other.pos - other.parentOffset\n};\n\n// :: (ResolvedPos) → ResolvedPos\n// Return the greater of this and the given position.\nResolvedPos.prototype.max = function max (other) {\n return other.pos > this.pos ? other : this\n};\n\n// :: (ResolvedPos) → ResolvedPos\n// Return the smaller of this and the given position.\nResolvedPos.prototype.min = function min (other) {\n return other.pos < this.pos ? other : this\n};\n\nResolvedPos.prototype.toString = function toString () {\n var str = \"\";\n for (var i = 1; i <= this.depth; i++)\n { str += (str ? \"/\" : \"\") + this.node(i).type.name + \"_\" + this.index(i - 1); }\n return str + \":\" + this.parentOffset\n};\n\nResolvedPos.resolve = function resolve (doc, pos) {\n if (!(pos >= 0 && pos <= doc.content.size)) { throw new RangeError(\"Position \" + pos + \" out of range\") }\n var path = [];\n var start = 0, parentOffset = pos;\n for (var node = doc;;) {\n var ref = node.content.findIndex(parentOffset);\n var index = ref.index;\n var offset = ref.offset;\n var rem = parentOffset - offset;\n path.push(node, index, start + offset);\n if (!rem) { break }\n node = node.child(index);\n if (node.isText) { break }\n parentOffset = rem - 1;\n start += offset + 1;\n }\n return new ResolvedPos(pos, path, parentOffset)\n};\n\nResolvedPos.resolveCached = function resolveCached (doc, pos) {\n for (var i = 0; i < resolveCache.length; i++) {\n var cached = resolveCache[i];\n if (cached.pos == pos && cached.doc == doc) { return cached }\n }\n var result = resolveCache[resolveCachePos] = ResolvedPos.resolve(doc, pos);\n resolveCachePos = (resolveCachePos + 1) % resolveCacheSize;\n return result\n};\n\nObject.defineProperties( ResolvedPos.prototype, prototypeAccessors$2 );\n\nvar resolveCache = [], resolveCachePos = 0, resolveCacheSize = 12;\n\n// ::- Represents a flat range of content, i.e. one that starts and\n// ends in the same node.\nvar NodeRange = function NodeRange($from, $to, depth) {\n // :: ResolvedPos A resolved position along the start of the\n // content. May have a `depth` greater than this object's `depth`\n // property, since these are the positions that were used to\n // compute the range, not re-resolved positions directly at its\n // boundaries.\n this.$from = $from;\n // :: ResolvedPos A position along the end of the content. See\n // caveat for [`$from`](#model.NodeRange.$from).\n this.$to = $to;\n // :: number The depth of the node that this range points into.\n this.depth = depth;\n};\n\nvar prototypeAccessors$1$1 = { start: { configurable: true },end: { configurable: true },parent: { configurable: true },startIndex: { configurable: true },endIndex: { configurable: true } };\n\n// :: number The position at the start of the range.\nprototypeAccessors$1$1.start.get = function () { return this.$from.before(this.depth + 1) };\n// :: number The position at the end of the range.\nprototypeAccessors$1$1.end.get = function () { return this.$to.after(this.depth + 1) };\n\n// :: Node The parent node that the range points into.\nprototypeAccessors$1$1.parent.get = function () { return this.$from.node(this.depth) };\n// :: number The start index of the range in the parent node.\nprototypeAccessors$1$1.startIndex.get = function () { return this.$from.index(this.depth) };\n// :: number The end index of the range in the parent node.\nprototypeAccessors$1$1.endIndex.get = function () { return this.$to.indexAfter(this.depth) };\n\nObject.defineProperties( NodeRange.prototype, prototypeAccessors$1$1 );\n\nvar emptyAttrs = Object.create(null);\n\n// ::- This class represents a node in the tree that makes up a\n// ProseMirror document. So a document is an instance of `Node`, with\n// children that are also instances of `Node`.\n//\n// Nodes are persistent data structures. Instead of changing them, you\n// create new ones with the content you want. Old ones keep pointing\n// at the old document shape. This is made cheaper by sharing\n// structure between the old and new data as much as possible, which a\n// tree shape like this (without back pointers) makes easy.\n//\n// **Do not** directly mutate the properties of a `Node` object. See\n// [the guide](/docs/guide/#doc) for more information.\nvar Node = function Node(type, attrs, content, marks) {\n // :: NodeType\n // The type of node that this is.\n this.type = type;\n\n // :: Object\n // An object mapping attribute names to values. The kind of\n // attributes allowed and required are\n // [determined](#model.NodeSpec.attrs) by the node type.\n this.attrs = attrs;\n\n // :: Fragment\n // A container holding the node's children.\n this.content = content || Fragment.empty;\n\n // :: [Mark]\n // The marks (things like whether it is emphasized or part of a\n // link) applied to this node.\n this.marks = marks || Mark.none;\n};\n\nvar prototypeAccessors$3 = { nodeSize: { configurable: true },childCount: { configurable: true },textContent: { configurable: true },firstChild: { configurable: true },lastChild: { configurable: true },isBlock: { configurable: true },isTextblock: { configurable: true },inlineContent: { configurable: true },isInline: { configurable: true },isText: { configurable: true },isLeaf: { configurable: true },isAtom: { configurable: true } };\n\n// text:: ?string\n// For text nodes, this contains the node's text content.\n\n// :: number\n// The size of this node, as defined by the integer-based [indexing\n// scheme](/docs/guide/#doc.indexing). For text nodes, this is the\n// amount of characters. For other leaf nodes, it is one. For\n// non-leaf nodes, it is the size of the content plus two (the start\n// and end token).\nprototypeAccessors$3.nodeSize.get = function () { return this.isLeaf ? 1 : 2 + this.content.size };\n\n// :: number\n// The number of children that the node has.\nprototypeAccessors$3.childCount.get = function () { return this.content.childCount };\n\n// :: (number) → Node\n// Get the child node at the given index. Raises an error when the\n// index is out of range.\nNode.prototype.child = function child (index) { return this.content.child(index) };\n\n// :: (number) → ?Node\n// Get the child node at the given index, if it exists.\nNode.prototype.maybeChild = function maybeChild (index) { return this.content.maybeChild(index) };\n\n// :: ((node: Node, offset: number, index: number))\n// Call `f` for every child node, passing the node, its offset\n// into this parent node, and its index.\nNode.prototype.forEach = function forEach (f) { this.content.forEach(f); };\n\n// :: (number, number, (node: Node, pos: number, parent: Node, index: number) → ?bool, ?number)\n// Invoke a callback for all descendant nodes recursively between\n// the given two positions that are relative to start of this node's\n// content. The callback is invoked with the node, its\n// parent-relative position, its parent node, and its child index.\n// When the callback returns false for a given node, that node's\n// children will not be recursed over. The last parameter can be\n// used to specify a starting position to count from.\nNode.prototype.nodesBetween = function nodesBetween (from, to, f, startPos) {\n if ( startPos === void 0 ) startPos = 0;\n\n this.content.nodesBetween(from, to, f, startPos, this);\n};\n\n// :: ((node: Node, pos: number, parent: Node) → ?bool)\n// Call the given callback for every descendant node. Doesn't\n// descend into a node when the callback returns `false`.\nNode.prototype.descendants = function descendants (f) {\n this.nodesBetween(0, this.content.size, f);\n};\n\n// :: string\n// Concatenates all the text nodes found in this fragment and its\n// children.\nprototypeAccessors$3.textContent.get = function () { return this.textBetween(0, this.content.size, \"\") };\n\n// :: (number, number, ?string, ?string) → string\n// Get all text between positions `from` and `to`. When\n// `blockSeparator` is given, it will be inserted whenever a new\n// block node is started. When `leafText` is given, it'll be\n// inserted for every non-text leaf node encountered.\nNode.prototype.textBetween = function textBetween (from, to, blockSeparator, leafText) {\n return this.content.textBetween(from, to, blockSeparator, leafText)\n};\n\n// :: ?Node\n// Returns this node's first child, or `null` if there are no\n// children.\nprototypeAccessors$3.firstChild.get = function () { return this.content.firstChild };\n\n// :: ?Node\n// Returns this node's last child, or `null` if there are no\n// children.\nprototypeAccessors$3.lastChild.get = function () { return this.content.lastChild };\n\n// :: (Node) → bool\n// Test whether two nodes represent the same piece of document.\nNode.prototype.eq = function eq (other) {\n return this == other || (this.sameMarkup(other) && this.content.eq(other.content))\n};\n\n// :: (Node) → bool\n// Compare the markup (type, attributes, and marks) of this node to\n// those of another. Returns `true` if both have the same markup.\nNode.prototype.sameMarkup = function sameMarkup (other) {\n return this.hasMarkup(other.type, other.attrs, other.marks)\n};\n\n// :: (NodeType, ?Object, ?[Mark]) → bool\n// Check whether this node's markup correspond to the given type,\n// attributes, and marks.\nNode.prototype.hasMarkup = function hasMarkup (type, attrs, marks) {\n return this.type == type &&\n compareDeep(this.attrs, attrs || type.defaultAttrs || emptyAttrs) &&\n Mark.sameSet(this.marks, marks || Mark.none)\n};\n\n// :: (?Fragment) → Node\n// Create a new node with the same markup as this node, containing\n// the given content (or empty, if no content is given).\nNode.prototype.copy = function copy (content) {\n if ( content === void 0 ) content = null;\n\n if (content == this.content) { return this }\n return new this.constructor(this.type, this.attrs, content, this.marks)\n};\n\n// :: ([Mark]) → Node\n// Create a copy of this node, with the given set of marks instead\n// of the node's own marks.\nNode.prototype.mark = function mark (marks) {\n return marks == this.marks ? this : new this.constructor(this.type, this.attrs, this.content, marks)\n};\n\n// :: (number, ?number) → Node\n// Create a copy of this node with only the content between the\n// given positions. If `to` is not given, it defaults to the end of\n// the node.\nNode.prototype.cut = function cut (from, to) {\n if (from == 0 && to == this.content.size) { return this }\n return this.copy(this.content.cut(from, to))\n};\n\n// :: (number, ?number) → Slice\n// Cut out the part of the document between the given positions, and\n// return it as a `Slice` object.\nNode.prototype.slice = function slice (from, to, includeParents) {\n if ( to === void 0 ) to = this.content.size;\n if ( includeParents === void 0 ) includeParents = false;\n\n if (from == to) { return Slice.empty }\n\n var $from = this.resolve(from), $to = this.resolve(to);\n var depth = includeParents ? 0 : $from.sharedDepth(to);\n var start = $from.start(depth), node = $from.node(depth);\n var content = node.content.cut($from.pos - start, $to.pos - start);\n return new Slice(content, $from.depth - depth, $to.depth - depth)\n};\n\n// :: (number, number, Slice) → Node\n// Replace the part of the document between the given positions with\n// the given slice. The slice must 'fit', meaning its open sides\n// must be able to connect to the surrounding content, and its\n// content nodes must be valid children for the node they are placed\n// into. If any of this is violated, an error of type\n// [`ReplaceError`](#model.ReplaceError) is thrown.\nNode.prototype.replace = function replace$1 (from, to, slice) {\n return replace(this.resolve(from), this.resolve(to), slice)\n};\n\n// :: (number) → ?Node\n// Find the node directly after the given position.\nNode.prototype.nodeAt = function nodeAt (pos) {\n for (var node = this;;) {\n var ref = node.content.findIndex(pos);\n var index = ref.index;\n var offset = ref.offset;\n node = node.maybeChild(index);\n if (!node) { return null }\n if (offset == pos || node.isText) { return node }\n pos -= offset + 1;\n }\n};\n\n// :: (number) → {node: ?Node, index: number, offset: number}\n// Find the (direct) child node after the given offset, if any,\n// and return it along with its index and offset relative to this\n// node.\nNode.prototype.childAfter = function childAfter (pos) {\n var ref = this.content.findIndex(pos);\n var index = ref.index;\n var offset = ref.offset;\n return {node: this.content.maybeChild(index), index: index, offset: offset}\n};\n\n// :: (number) → {node: ?Node, index: number, offset: number}\n// Find the (direct) child node before the given offset, if any,\n// and return it along with its index and offset relative to this\n// node.\nNode.prototype.childBefore = function childBefore (pos) {\n if (pos == 0) { return {node: null, index: 0, offset: 0} }\n var ref = this.content.findIndex(pos);\n var index = ref.index;\n var offset = ref.offset;\n if (offset < pos) { return {node: this.content.child(index), index: index, offset: offset} }\n var node = this.content.child(index - 1);\n return {node: node, index: index - 1, offset: offset - node.nodeSize}\n};\n\n// :: (number) → ResolvedPos\n// Resolve the given position in the document, returning an\n// [object](#model.ResolvedPos) with information about its context.\nNode.prototype.resolve = function resolve (pos) { return ResolvedPos.resolveCached(this, pos) };\n\nNode.prototype.resolveNoCache = function resolveNoCache (pos) { return ResolvedPos.resolve(this, pos) };\n\n// :: (number, number, union) → bool\n// Test whether a given mark or mark type occurs in this document\n// between the two given positions.\nNode.prototype.rangeHasMark = function rangeHasMark (from, to, type) {\n var found = false;\n if (to > from) { this.nodesBetween(from, to, function (node) {\n if (type.isInSet(node.marks)) { found = true; }\n return !found\n }); }\n return found\n};\n\n// :: bool\n// True when this is a block (non-inline node)\nprototypeAccessors$3.isBlock.get = function () { return this.type.isBlock };\n\n// :: bool\n// True when this is a textblock node, a block node with inline\n// content.\nprototypeAccessors$3.isTextblock.get = function () { return this.type.isTextblock };\n\n// :: bool\n// True when this node allows inline content.\nprototypeAccessors$3.inlineContent.get = function () { return this.type.inlineContent };\n\n// :: bool\n// True when this is an inline node (a text node or a node that can\n// appear among text).\nprototypeAccessors$3.isInline.get = function () { return this.type.isInline };\n\n// :: bool\n// True when this is a text node.\nprototypeAccessors$3.isText.get = function () { return this.type.isText };\n\n// :: bool\n// True when this is a leaf node.\nprototypeAccessors$3.isLeaf.get = function () { return this.type.isLeaf };\n\n// :: bool\n// True when this is an atom, i.e. when it does not have directly\n// editable content. This is usually the same as `isLeaf`, but can\n// be configured with the [`atom` property](#model.NodeSpec.atom) on\n// a node's spec (typically used when the node is displayed as an\n// uneditable [node view](#view.NodeView)).\nprototypeAccessors$3.isAtom.get = function () { return this.type.isAtom };\n\n// :: () → string\n// Return a string representation of this node for debugging\n// purposes.\nNode.prototype.toString = function toString () {\n if (this.type.spec.toDebugString) { return this.type.spec.toDebugString(this) }\n var name = this.type.name;\n if (this.content.size)\n { name += \"(\" + this.content.toStringInner() + \")\"; }\n return wrapMarks(this.marks, name)\n};\n\n// :: (number) → ContentMatch\n// Get the content match in this node at the given index.\nNode.prototype.contentMatchAt = function contentMatchAt (index) {\n var match = this.type.contentMatch.matchFragment(this.content, 0, index);\n if (!match) { throw new Error(\"Called contentMatchAt on a node with invalid content\") }\n return match\n};\n\n// :: (number, number, ?Fragment, ?number, ?number) → bool\n// Test whether replacing the range between `from` and `to` (by\n// child index) with the given replacement fragment (which defaults\n// to the empty fragment) would leave the node's content valid. You\n// can optionally pass `start` and `end` indices into the\n// replacement fragment.\nNode.prototype.canReplace = function canReplace (from, to, replacement, start, end) {\n if ( replacement === void 0 ) replacement = Fragment.empty;\n if ( start === void 0 ) start = 0;\n if ( end === void 0 ) end = replacement.childCount;\n\n var one = this.contentMatchAt(from).matchFragment(replacement, start, end);\n var two = one && one.matchFragment(this.content, to);\n if (!two || !two.validEnd) { return false }\n for (var i = start; i < end; i++) { if (!this.type.allowsMarks(replacement.child(i).marks)) { return false } }\n return true\n};\n\n// :: (number, number, NodeType, ?[Mark]) → bool\n// Test whether replacing the range `from` to `to` (by index) with a\n// node of the given type would leave the node's content valid.\nNode.prototype.canReplaceWith = function canReplaceWith (from, to, type, marks) {\n if (marks && !this.type.allowsMarks(marks)) { return false }\n var start = this.contentMatchAt(from).matchType(type);\n var end = start && start.matchFragment(this.content, to);\n return end ? end.validEnd : false\n};\n\n// :: (Node) → bool\n// Test whether the given node's content could be appended to this\n// node. If that node is empty, this will only return true if there\n// is at least one node type that can appear in both nodes (to avoid\n// merging completely incompatible nodes).\nNode.prototype.canAppend = function canAppend (other) {\n if (other.content.size) { return this.canReplace(this.childCount, this.childCount, other.content) }\n else { return this.type.compatibleContent(other.type) }\n};\n\n// :: ()\n// Check whether this node and its descendants conform to the\n// schema, and raise error when they do not.\nNode.prototype.check = function check () {\n if (!this.type.validContent(this.content))\n { throw new RangeError((\"Invalid content for node \" + (this.type.name) + \": \" + (this.content.toString().slice(0, 50)))) }\n this.content.forEach(function (node) { return node.check(); });\n};\n\n// :: () → Object\n// Return a JSON-serializeable representation of this node.\nNode.prototype.toJSON = function toJSON () {\n var obj = {type: this.type.name};\n for (var _ in this.attrs) {\n obj.attrs = this.attrs;\n break\n }\n if (this.content.size)\n { obj.content = this.content.toJSON(); }\n if (this.marks.length)\n { obj.marks = this.marks.map(function (n) { return n.toJSON(); }); }\n return obj\n};\n\n// :: (Schema, Object) → Node\n// Deserialize a node from its JSON representation.\nNode.fromJSON = function fromJSON (schema, json) {\n if (!json) { throw new RangeError(\"Invalid input for Node.fromJSON\") }\n var marks = null;\n if (json.marks) {\n if (!Array.isArray(json.marks)) { throw new RangeError(\"Invalid mark data for Node.fromJSON\") }\n marks = json.marks.map(schema.markFromJSON);\n }\n if (json.type == \"text\") {\n if (typeof json.text != \"string\") { throw new RangeError(\"Invalid text node in JSON\") }\n return schema.text(json.text, marks)\n }\n var content = Fragment.fromJSON(schema, json.content);\n return schema.nodeType(json.type).create(json.attrs, content, marks)\n};\n\nObject.defineProperties( Node.prototype, prototypeAccessors$3 );\n\nvar TextNode = /*@__PURE__*/(function (Node) {\n function TextNode(type, attrs, content, marks) {\n Node.call(this, type, attrs, null, marks);\n\n if (!content) { throw new RangeError(\"Empty text nodes are not allowed\") }\n\n this.text = content;\n }\n\n if ( Node ) TextNode.__proto__ = Node;\n TextNode.prototype = Object.create( Node && Node.prototype );\n TextNode.prototype.constructor = TextNode;\n\n var prototypeAccessors$1 = { textContent: { configurable: true },nodeSize: { configurable: true } };\n\n TextNode.prototype.toString = function toString () {\n if (this.type.spec.toDebugString) { return this.type.spec.toDebugString(this) }\n return wrapMarks(this.marks, JSON.stringify(this.text))\n };\n\n prototypeAccessors$1.textContent.get = function () { return this.text };\n\n TextNode.prototype.textBetween = function textBetween (from, to) { return this.text.slice(from, to) };\n\n prototypeAccessors$1.nodeSize.get = function () { return this.text.length };\n\n TextNode.prototype.mark = function mark (marks) {\n return marks == this.marks ? this : new TextNode(this.type, this.attrs, this.text, marks)\n };\n\n TextNode.prototype.withText = function withText (text) {\n if (text == this.text) { return this }\n return new TextNode(this.type, this.attrs, text, this.marks)\n };\n\n TextNode.prototype.cut = function cut (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.text.length;\n\n if (from == 0 && to == this.text.length) { return this }\n return this.withText(this.text.slice(from, to))\n };\n\n TextNode.prototype.eq = function eq (other) {\n return this.sameMarkup(other) && this.text == other.text\n };\n\n TextNode.prototype.toJSON = function toJSON () {\n var base = Node.prototype.toJSON.call(this);\n base.text = this.text;\n return base\n };\n\n Object.defineProperties( TextNode.prototype, prototypeAccessors$1 );\n\n return TextNode;\n}(Node));\n\nfunction wrapMarks(marks, str) {\n for (var i = marks.length - 1; i >= 0; i--)\n { str = marks[i].type.name + \"(\" + str + \")\"; }\n return str\n}\n\n// ::- Instances of this class represent a match state of a node\n// type's [content expression](#model.NodeSpec.content), and can be\n// used to find out whether further content matches here, and whether\n// a given position is a valid end of the node.\nvar ContentMatch = function ContentMatch(validEnd) {\n // :: bool\n // True when this match state represents a valid end of the node.\n this.validEnd = validEnd;\n this.next = [];\n this.wrapCache = [];\n};\n\nvar prototypeAccessors$4 = { inlineContent: { configurable: true },defaultType: { configurable: true },edgeCount: { configurable: true } };\n\nContentMatch.parse = function parse (string, nodeTypes) {\n var stream = new TokenStream(string, nodeTypes);\n if (stream.next == null) { return ContentMatch.empty }\n var expr = parseExpr(stream);\n if (stream.next) { stream.err(\"Unexpected trailing text\"); }\n var match = dfa(nfa(expr));\n checkForDeadEnds(match, stream);\n return match\n};\n\n// :: (NodeType) → ?ContentMatch\n// Match a node type, returning a match after that node if\n// successful.\nContentMatch.prototype.matchType = function matchType (type) {\n for (var i = 0; i < this.next.length; i += 2)\n { if (this.next[i] == type) { return this.next[i + 1] } }\n return null\n};\n\n// :: (Fragment, ?number, ?number) → ?ContentMatch\n// Try to match a fragment. Returns the resulting match when\n// successful.\nContentMatch.prototype.matchFragment = function matchFragment (frag, start, end) {\n if ( start === void 0 ) start = 0;\n if ( end === void 0 ) end = frag.childCount;\n\n var cur = this;\n for (var i = start; cur && i < end; i++)\n { cur = cur.matchType(frag.child(i).type); }\n return cur\n};\n\nprototypeAccessors$4.inlineContent.get = function () {\n var first = this.next[0];\n return first ? first.isInline : false\n};\n\n// :: ?NodeType\n// Get the first matching node type at this match position that can\n// be generated.\nprototypeAccessors$4.defaultType.get = function () {\n for (var i = 0; i < this.next.length; i += 2) {\n var type = this.next[i];\n if (!(type.isText || type.hasRequiredAttrs())) { return type }\n }\n};\n\nContentMatch.prototype.compatible = function compatible (other) {\n for (var i = 0; i < this.next.length; i += 2)\n { for (var j = 0; j < other.next.length; j += 2)\n { if (this.next[i] == other.next[j]) { return true } } }\n return false\n};\n\n// :: (Fragment, bool, ?number) → ?Fragment\n// Try to match the given fragment, and if that fails, see if it can\n// be made to match by inserting nodes in front of it. When\n// successful, return a fragment of inserted nodes (which may be\n// empty if nothing had to be inserted). When `toEnd` is true, only\n// return a fragment if the resulting match goes to the end of the\n// content expression.\nContentMatch.prototype.fillBefore = function fillBefore (after, toEnd, startIndex) {\n if ( toEnd === void 0 ) toEnd = false;\n if ( startIndex === void 0 ) startIndex = 0;\n\n var seen = [this];\n function search(match, types) {\n var finished = match.matchFragment(after, startIndex);\n if (finished && (!toEnd || finished.validEnd))\n { return Fragment.from(types.map(function (tp) { return tp.createAndFill(); })) }\n\n for (var i = 0; i < match.next.length; i += 2) {\n var type = match.next[i], next = match.next[i + 1];\n if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) {\n seen.push(next);\n var found = search(next, types.concat(type));\n if (found) { return found }\n }\n }\n }\n\n return search(this, [])\n};\n\n// :: (NodeType) → ?[NodeType]\n// Find a set of wrapping node types that would allow a node of the\n// given type to appear at this position. The result may be empty\n// (when it fits directly) and will be null when no such wrapping\n// exists.\nContentMatch.prototype.findWrapping = function findWrapping (target) {\n for (var i = 0; i < this.wrapCache.length; i += 2)\n { if (this.wrapCache[i] == target) { return this.wrapCache[i + 1] } }\n var computed = this.computeWrapping(target);\n this.wrapCache.push(target, computed);\n return computed\n};\n\nContentMatch.prototype.computeWrapping = function computeWrapping (target) {\n var seen = Object.create(null), active = [{match: this, type: null, via: null}];\n while (active.length) {\n var current = active.shift(), match = current.match;\n if (match.matchType(target)) {\n var result = [];\n for (var obj = current; obj.type; obj = obj.via)\n { result.push(obj.type); }\n return result.reverse()\n }\n for (var i = 0; i < match.next.length; i += 2) {\n var type = match.next[i];\n if (!type.isLeaf && !type.hasRequiredAttrs() && !(type.name in seen) && (!current.type || match.next[i + 1].validEnd)) {\n active.push({match: type.contentMatch, type: type, via: current});\n seen[type.name] = true;\n }\n }\n }\n};\n\n// :: number\n// The number of outgoing edges this node has in the finite\n// automaton that describes the content expression.\nprototypeAccessors$4.edgeCount.get = function () {\n return this.next.length >> 1\n};\n\n// :: (number) → {type: NodeType, next: ContentMatch}\n// Get the _n_​th outgoing edge from this node in the finite\n// automaton that describes the content expression.\nContentMatch.prototype.edge = function edge (n) {\n var i = n << 1;\n if (i >= this.next.length) { throw new RangeError((\"There's no \" + n + \"th edge in this content match\")) }\n return {type: this.next[i], next: this.next[i + 1]}\n};\n\nContentMatch.prototype.toString = function toString () {\n var seen = [];\n function scan(m) {\n seen.push(m);\n for (var i = 1; i < m.next.length; i += 2)\n { if (seen.indexOf(m.next[i]) == -1) { scan(m.next[i]); } }\n }\n scan(this);\n return seen.map(function (m, i) {\n var out = i + (m.validEnd ? \"*\" : \" \") + \" \";\n for (var i$1 = 0; i$1 < m.next.length; i$1 += 2)\n { out += (i$1 ? \", \" : \"\") + m.next[i$1].name + \"->\" + seen.indexOf(m.next[i$1 + 1]); }\n return out\n }).join(\"\\n\")\n};\n\nObject.defineProperties( ContentMatch.prototype, prototypeAccessors$4 );\n\nContentMatch.empty = new ContentMatch(true);\n\nvar TokenStream = function TokenStream(string, nodeTypes) {\n this.string = string;\n this.nodeTypes = nodeTypes;\n this.inline = null;\n this.pos = 0;\n this.tokens = string.split(/\\s*(?=\\b|\\W|$)/);\n if (this.tokens[this.tokens.length - 1] == \"\") { this.tokens.pop(); }\n if (this.tokens[0] == \"\") { this.tokens.shift(); }\n};\n\nvar prototypeAccessors$1$2 = { next: { configurable: true } };\n\nprototypeAccessors$1$2.next.get = function () { return this.tokens[this.pos] };\n\nTokenStream.prototype.eat = function eat (tok) { return this.next == tok && (this.pos++ || true) };\n\nTokenStream.prototype.err = function err (str) { throw new SyntaxError(str + \" (in content expression '\" + this.string + \"')\") };\n\nObject.defineProperties( TokenStream.prototype, prototypeAccessors$1$2 );\n\nfunction parseExpr(stream) {\n var exprs = [];\n do { exprs.push(parseExprSeq(stream)); }\n while (stream.eat(\"|\"))\n return exprs.length == 1 ? exprs[0] : {type: \"choice\", exprs: exprs}\n}\n\nfunction parseExprSeq(stream) {\n var exprs = [];\n do { exprs.push(parseExprSubscript(stream)); }\n while (stream.next && stream.next != \")\" && stream.next != \"|\")\n return exprs.length == 1 ? exprs[0] : {type: \"seq\", exprs: exprs}\n}\n\nfunction parseExprSubscript(stream) {\n var expr = parseExprAtom(stream);\n for (;;) {\n if (stream.eat(\"+\"))\n { expr = {type: \"plus\", expr: expr}; }\n else if (stream.eat(\"*\"))\n { expr = {type: \"star\", expr: expr}; }\n else if (stream.eat(\"?\"))\n { expr = {type: \"opt\", expr: expr}; }\n else if (stream.eat(\"{\"))\n { expr = parseExprRange(stream, expr); }\n else { break }\n }\n return expr\n}\n\nfunction parseNum(stream) {\n if (/\\D/.test(stream.next)) { stream.err(\"Expected number, got '\" + stream.next + \"'\"); }\n var result = Number(stream.next);\n stream.pos++;\n return result\n}\n\nfunction parseExprRange(stream, expr) {\n var min = parseNum(stream), max = min;\n if (stream.eat(\",\")) {\n if (stream.next != \"}\") { max = parseNum(stream); }\n else { max = -1; }\n }\n if (!stream.eat(\"}\")) { stream.err(\"Unclosed braced range\"); }\n return {type: \"range\", min: min, max: max, expr: expr}\n}\n\nfunction resolveName(stream, name) {\n var types = stream.nodeTypes, type = types[name];\n if (type) { return [type] }\n var result = [];\n for (var typeName in types) {\n var type$1 = types[typeName];\n if (type$1.groups.indexOf(name) > -1) { result.push(type$1); }\n }\n if (result.length == 0) { stream.err(\"No node type or group '\" + name + \"' found\"); }\n return result\n}\n\nfunction parseExprAtom(stream) {\n if (stream.eat(\"(\")) {\n var expr = parseExpr(stream);\n if (!stream.eat(\")\")) { stream.err(\"Missing closing paren\"); }\n return expr\n } else if (!/\\W/.test(stream.next)) {\n var exprs = resolveName(stream, stream.next).map(function (type) {\n if (stream.inline == null) { stream.inline = type.isInline; }\n else if (stream.inline != type.isInline) { stream.err(\"Mixing inline and block content\"); }\n return {type: \"name\", value: type}\n });\n stream.pos++;\n return exprs.length == 1 ? exprs[0] : {type: \"choice\", exprs: exprs}\n } else {\n stream.err(\"Unexpected token '\" + stream.next + \"'\");\n }\n}\n\n// The code below helps compile a regular-expression-like language\n// into a deterministic finite automaton. For a good introduction to\n// these concepts, see https://swtch.com/~rsc/regexp/regexp1.html\n\n// : (Object) → [[{term: ?any, to: number}]]\n// Construct an NFA from an expression as returned by the parser. The\n// NFA is represented as an array of states, which are themselves\n// arrays of edges, which are `{term, to}` objects. The first state is\n// the entry state and the last node is the success state.\n//\n// Note that unlike typical NFAs, the edge ordering in this one is\n// significant, in that it is used to contruct filler content when\n// necessary.\nfunction nfa(expr) {\n var nfa = [[]];\n connect(compile(expr, 0), node());\n return nfa\n\n function node() { return nfa.push([]) - 1 }\n function edge(from, to, term) {\n var edge = {term: term, to: to};\n nfa[from].push(edge);\n return edge\n }\n function connect(edges, to) { edges.forEach(function (edge) { return edge.to = to; }); }\n\n function compile(expr, from) {\n if (expr.type == \"choice\") {\n return expr.exprs.reduce(function (out, expr) { return out.concat(compile(expr, from)); }, [])\n } else if (expr.type == \"seq\") {\n for (var i = 0;; i++) {\n var next = compile(expr.exprs[i], from);\n if (i == expr.exprs.length - 1) { return next }\n connect(next, from = node());\n }\n } else if (expr.type == \"star\") {\n var loop = node();\n edge(from, loop);\n connect(compile(expr.expr, loop), loop);\n return [edge(loop)]\n } else if (expr.type == \"plus\") {\n var loop$1 = node();\n connect(compile(expr.expr, from), loop$1);\n connect(compile(expr.expr, loop$1), loop$1);\n return [edge(loop$1)]\n } else if (expr.type == \"opt\") {\n return [edge(from)].concat(compile(expr.expr, from))\n } else if (expr.type == \"range\") {\n var cur = from;\n for (var i$1 = 0; i$1 < expr.min; i$1++) {\n var next$1 = node();\n connect(compile(expr.expr, cur), next$1);\n cur = next$1;\n }\n if (expr.max == -1) {\n connect(compile(expr.expr, cur), cur);\n } else {\n for (var i$2 = expr.min; i$2 < expr.max; i$2++) {\n var next$2 = node();\n edge(cur, next$2);\n connect(compile(expr.expr, cur), next$2);\n cur = next$2;\n }\n }\n return [edge(cur)]\n } else if (expr.type == \"name\") {\n return [edge(from, null, expr.value)]\n }\n }\n}\n\nfunction cmp(a, b) { return b - a }\n\n// Get the set of nodes reachable by null edges from `node`. Omit\n// nodes with only a single null-out-edge, since they may lead to\n// needless duplicated nodes.\nfunction nullFrom(nfa, node) {\n var result = [];\n scan(node);\n return result.sort(cmp)\n\n function scan(node) {\n var edges = nfa[node];\n if (edges.length == 1 && !edges[0].term) { return scan(edges[0].to) }\n result.push(node);\n for (var i = 0; i < edges.length; i++) {\n var ref = edges[i];\n var term = ref.term;\n var to = ref.to;\n if (!term && result.indexOf(to) == -1) { scan(to); }\n }\n }\n}\n\n// : ([[{term: ?any, to: number}]]) → ContentMatch\n// Compiles an NFA as produced by `nfa` into a DFA, modeled as a set\n// of state objects (`ContentMatch` instances) with transitions\n// between them.\nfunction dfa(nfa) {\n var labeled = Object.create(null);\n return explore(nullFrom(nfa, 0))\n\n function explore(states) {\n var out = [];\n states.forEach(function (node) {\n nfa[node].forEach(function (ref) {\n var term = ref.term;\n var to = ref.to;\n\n if (!term) { return }\n var known = out.indexOf(term), set = known > -1 && out[known + 1];\n nullFrom(nfa, to).forEach(function (node) {\n if (!set) { out.push(term, set = []); }\n if (set.indexOf(node) == -1) { set.push(node); }\n });\n });\n });\n var state = labeled[states.join(\",\")] = new ContentMatch(states.indexOf(nfa.length - 1) > -1);\n for (var i = 0; i < out.length; i += 2) {\n var states$1 = out[i + 1].sort(cmp);\n state.next.push(out[i], labeled[states$1.join(\",\")] || explore(states$1));\n }\n return state\n }\n}\n\nfunction checkForDeadEnds(match, stream) {\n for (var i = 0, work = [match]; i < work.length; i++) {\n var state = work[i], dead = !state.validEnd, nodes = [];\n for (var j = 0; j < state.next.length; j += 2) {\n var node = state.next[j], next = state.next[j + 1];\n nodes.push(node.name);\n if (dead && !(node.isText || node.hasRequiredAttrs())) { dead = false; }\n if (work.indexOf(next) == -1) { work.push(next); }\n }\n if (dead) { stream.err(\"Only non-generatable nodes (\" + nodes.join(\", \") + \") in a required position (see https://prosemirror.net/docs/guide/#generatable)\"); }\n }\n}\n\n// For node types where all attrs have a default value (or which don't\n// have any attributes), build up a single reusable default attribute\n// object, and use it for all nodes that don't specify specific\n// attributes.\nfunction defaultAttrs(attrs) {\n var defaults = Object.create(null);\n for (var attrName in attrs) {\n var attr = attrs[attrName];\n if (!attr.hasDefault) { return null }\n defaults[attrName] = attr.default;\n }\n return defaults\n}\n\nfunction computeAttrs(attrs, value) {\n var built = Object.create(null);\n for (var name in attrs) {\n var given = value && value[name];\n if (given === undefined) {\n var attr = attrs[name];\n if (attr.hasDefault) { given = attr.default; }\n else { throw new RangeError(\"No value supplied for attribute \" + name) }\n }\n built[name] = given;\n }\n return built\n}\n\nfunction initAttrs(attrs) {\n var result = Object.create(null);\n if (attrs) { for (var name in attrs) { result[name] = new Attribute(attrs[name]); } }\n return result\n}\n\n// ::- Node types are objects allocated once per `Schema` and used to\n// [tag](#model.Node.type) `Node` instances. They contain information\n// about the node type, such as its name and what kind of node it\n// represents.\nvar NodeType = function NodeType(name, schema, spec) {\n // :: string\n // The name the node type has in this schema.\n this.name = name;\n\n // :: Schema\n // A link back to the `Schema` the node type belongs to.\n this.schema = schema;\n\n // :: NodeSpec\n // The spec that this type is based on\n this.spec = spec;\n\n this.groups = spec.group ? spec.group.split(\" \") : [];\n this.attrs = initAttrs(spec.attrs);\n\n this.defaultAttrs = defaultAttrs(this.attrs);\n\n // :: ContentMatch\n // The starting match of the node type's content expression.\n this.contentMatch = null;\n\n // : ?[MarkType]\n // The set of marks allowed in this node. `null` means all marks\n // are allowed.\n this.markSet = null;\n\n // :: bool\n // True if this node type has inline content.\n this.inlineContent = null;\n\n // :: bool\n // True if this is a block type\n this.isBlock = !(spec.inline || name == \"text\");\n\n // :: bool\n // True if this is the text node type.\n this.isText = name == \"text\";\n};\n\nvar prototypeAccessors$5 = { isInline: { configurable: true },isTextblock: { configurable: true },isLeaf: { configurable: true },isAtom: { configurable: true } };\n\n// :: bool\n// True if this is an inline type.\nprototypeAccessors$5.isInline.get = function () { return !this.isBlock };\n\n// :: bool\n// True if this is a textblock type, a block that contains inline\n// content.\nprototypeAccessors$5.isTextblock.get = function () { return this.isBlock && this.inlineContent };\n\n// :: bool\n// True for node types that allow no content.\nprototypeAccessors$5.isLeaf.get = function () { return this.contentMatch == ContentMatch.empty };\n\n// :: bool\n// True when this node is an atom, i.e. when it does not have\n// directly editable content.\nprototypeAccessors$5.isAtom.get = function () { return this.isLeaf || this.spec.atom };\n\n// :: () → bool\n// Tells you whether this node type has any required attributes.\nNodeType.prototype.hasRequiredAttrs = function hasRequiredAttrs () {\n for (var n in this.attrs) { if (this.attrs[n].isRequired) { return true } }\n return false\n};\n\nNodeType.prototype.compatibleContent = function compatibleContent (other) {\n return this == other || this.contentMatch.compatible(other.contentMatch)\n};\n\nNodeType.prototype.computeAttrs = function computeAttrs$1 (attrs) {\n if (!attrs && this.defaultAttrs) { return this.defaultAttrs }\n else { return computeAttrs(this.attrs, attrs) }\n};\n\n// :: (?Object, ?union, ?[Mark]) → Node\n// Create a `Node` of this type. The given attributes are\n// checked and defaulted (you can pass `null` to use the type's\n// defaults entirely, if no required attributes exist). `content`\n// may be a `Fragment`, a node, an array of nodes, or\n// `null`. Similarly `marks` may be `null` to default to the empty\n// set of marks.\nNodeType.prototype.create = function create (attrs, content, marks) {\n if (this.isText) { throw new Error(\"NodeType.create can't construct text nodes\") }\n return new Node(this, this.computeAttrs(attrs), Fragment.from(content), Mark.setFrom(marks))\n};\n\n// :: (?Object, ?union, ?[Mark]) → Node\n// Like [`create`](#model.NodeType.create), but check the given content\n// against the node type's content restrictions, and throw an error\n// if it doesn't match.\nNodeType.prototype.createChecked = function createChecked (attrs, content, marks) {\n content = Fragment.from(content);\n if (!this.validContent(content))\n { throw new RangeError(\"Invalid content for node \" + this.name) }\n return new Node(this, this.computeAttrs(attrs), content, Mark.setFrom(marks))\n};\n\n// :: (?Object, ?union, ?[Mark]) → ?Node\n// Like [`create`](#model.NodeType.create), but see if it is necessary to\n// add nodes to the start or end of the given fragment to make it\n// fit the node. If no fitting wrapping can be found, return null.\n// Note that, due to the fact that required nodes can always be\n// created, this will always succeed if you pass null or\n// `Fragment.empty` as content.\nNodeType.prototype.createAndFill = function createAndFill (attrs, content, marks) {\n attrs = this.computeAttrs(attrs);\n content = Fragment.from(content);\n if (content.size) {\n var before = this.contentMatch.fillBefore(content);\n if (!before) { return null }\n content = before.append(content);\n }\n var after = this.contentMatch.matchFragment(content).fillBefore(Fragment.empty, true);\n if (!after) { return null }\n return new Node(this, attrs, content.append(after), Mark.setFrom(marks))\n};\n\n// :: (Fragment) → bool\n// Returns true if the given fragment is valid content for this node\n// type with the given attributes.\nNodeType.prototype.validContent = function validContent (content) {\n var result = this.contentMatch.matchFragment(content);\n if (!result || !result.validEnd) { return false }\n for (var i = 0; i < content.childCount; i++)\n { if (!this.allowsMarks(content.child(i).marks)) { return false } }\n return true\n};\n\n// :: (MarkType) → bool\n// Check whether the given mark type is allowed in this node.\nNodeType.prototype.allowsMarkType = function allowsMarkType (markType) {\n return this.markSet == null || this.markSet.indexOf(markType) > -1\n};\n\n// :: ([Mark]) → bool\n// Test whether the given set of marks are allowed in this node.\nNodeType.prototype.allowsMarks = function allowsMarks (marks) {\n if (this.markSet == null) { return true }\n for (var i = 0; i < marks.length; i++) { if (!this.allowsMarkType(marks[i].type)) { return false } }\n return true\n};\n\n// :: ([Mark]) → [Mark]\n// Removes the marks that are not allowed in this node from the given set.\nNodeType.prototype.allowedMarks = function allowedMarks (marks) {\n if (this.markSet == null) { return marks }\n var copy;\n for (var i = 0; i < marks.length; i++) {\n if (!this.allowsMarkType(marks[i].type)) {\n if (!copy) { copy = marks.slice(0, i); }\n } else if (copy) {\n copy.push(marks[i]);\n }\n }\n return !copy ? marks : copy.length ? copy : Mark.empty\n};\n\nNodeType.compile = function compile (nodes, schema) {\n var result = Object.create(null);\n nodes.forEach(function (name, spec) { return result[name] = new NodeType(name, schema, spec); });\n\n var topType = schema.spec.topNode || \"doc\";\n if (!result[topType]) { throw new RangeError(\"Schema is missing its top node type ('\" + topType + \"')\") }\n if (!result.text) { throw new RangeError(\"Every schema needs a 'text' type\") }\n for (var _ in result.text.attrs) { throw new RangeError(\"The text node type should not have attributes\") }\n\n return result\n};\n\nObject.defineProperties( NodeType.prototype, prototypeAccessors$5 );\n\n// Attribute descriptors\n\nvar Attribute = function Attribute(options) {\n this.hasDefault = Object.prototype.hasOwnProperty.call(options, \"default\");\n this.default = options.default;\n};\n\nvar prototypeAccessors$1$3 = { isRequired: { configurable: true } };\n\nprototypeAccessors$1$3.isRequired.get = function () {\n return !this.hasDefault\n};\n\nObject.defineProperties( Attribute.prototype, prototypeAccessors$1$3 );\n\n// Marks\n\n// ::- Like nodes, marks (which are associated with nodes to signify\n// things like emphasis or being part of a link) are\n// [tagged](#model.Mark.type) with type objects, which are\n// instantiated once per `Schema`.\nvar MarkType = function MarkType(name, rank, schema, spec) {\n // :: string\n // The name of the mark type.\n this.name = name;\n\n // :: Schema\n // The schema that this mark type instance is part of.\n this.schema = schema;\n\n // :: MarkSpec\n // The spec on which the type is based.\n this.spec = spec;\n\n this.attrs = initAttrs(spec.attrs);\n\n this.rank = rank;\n this.excluded = null;\n var defaults = defaultAttrs(this.attrs);\n this.instance = defaults && new Mark(this, defaults);\n};\n\n// :: (?Object) → Mark\n// Create a mark of this type. `attrs` may be `null` or an object\n// containing only some of the mark's attributes. The others, if\n// they have defaults, will be added.\nMarkType.prototype.create = function create (attrs) {\n if (!attrs && this.instance) { return this.instance }\n return new Mark(this, computeAttrs(this.attrs, attrs))\n};\n\nMarkType.compile = function compile (marks, schema) {\n var result = Object.create(null), rank = 0;\n marks.forEach(function (name, spec) { return result[name] = new MarkType(name, rank++, schema, spec); });\n return result\n};\n\n// :: ([Mark]) → [Mark]\n// When there is a mark of this type in the given set, a new set\n// without it is returned. Otherwise, the input set is returned.\nMarkType.prototype.removeFromSet = function removeFromSet (set) {\n for (var i = 0; i < set.length; i++) { if (set[i].type == this) {\n set = set.slice(0, i).concat(set.slice(i + 1));\n i--;\n } }\n return set\n};\n\n// :: ([Mark]) → ?Mark\n// Tests whether there is a mark of this type in the given set.\nMarkType.prototype.isInSet = function isInSet (set) {\n for (var i = 0; i < set.length; i++)\n { if (set[i].type == this) { return set[i] } }\n};\n\n// :: (MarkType) → bool\n// Queries whether a given mark type is\n// [excluded](#model.MarkSpec.excludes) by this one.\nMarkType.prototype.excludes = function excludes (other) {\n return this.excluded.indexOf(other) > -1\n};\n\n// SchemaSpec:: interface\n// An object describing a schema, as passed to the [`Schema`](#model.Schema)\n// constructor.\n//\n// nodes:: union, OrderedMap>\n// The node types in this schema. Maps names to\n// [`NodeSpec`](#model.NodeSpec) objects that describe the node type\n// associated with that name. Their order is significant—it\n// determines which [parse rules](#model.NodeSpec.parseDOM) take\n// precedence by default, and which nodes come first in a given\n// [group](#model.NodeSpec.group).\n//\n// marks:: ?union, OrderedMap>\n// The mark types that exist in this schema. The order in which they\n// are provided determines the order in which [mark\n// sets](#model.Mark.addToSet) are sorted and in which [parse\n// rules](#model.MarkSpec.parseDOM) are tried.\n//\n// topNode:: ?string\n// The name of the default top-level node for the schema. Defaults\n// to `\"doc\"`.\n\n// NodeSpec:: interface\n//\n// content:: ?string\n// The content expression for this node, as described in the [schema\n// guide](/docs/guide/#schema.content_expressions). When not given,\n// the node does not allow any content.\n//\n// marks:: ?string\n// The marks that are allowed inside of this node. May be a\n// space-separated string referring to mark names or groups, `\"_\"`\n// to explicitly allow all marks, or `\"\"` to disallow marks. When\n// not given, nodes with inline content default to allowing all\n// marks, other nodes default to not allowing marks.\n//\n// group:: ?string\n// The group or space-separated groups to which this node belongs,\n// which can be referred to in the content expressions for the\n// schema.\n//\n// inline:: ?bool\n// Should be set to true for inline nodes. (Implied for text nodes.)\n//\n// atom:: ?bool\n// Can be set to true to indicate that, though this isn't a [leaf\n// node](#model.NodeType.isLeaf), it doesn't have directly editable\n// content and should be treated as a single unit in the view.\n//\n// attrs:: ?Object\n// The attributes that nodes of this type get.\n//\n// selectable:: ?bool\n// Controls whether nodes of this type can be selected as a [node\n// selection](#state.NodeSelection). Defaults to true for non-text\n// nodes.\n//\n// draggable:: ?bool\n// Determines whether nodes of this type can be dragged without\n// being selected. Defaults to false.\n//\n// code:: ?bool\n// Can be used to indicate that this node contains code, which\n// causes some commands to behave differently.\n//\n// defining:: ?bool\n// Determines whether this node is considered an important parent\n// node during replace operations (such as paste). Non-defining (the\n// default) nodes get dropped when their entire content is replaced,\n// whereas defining nodes persist and wrap the inserted content.\n// Likewise, in _inserted_ content the defining parents of the\n// content are preserved when possible. Typically,\n// non-default-paragraph textblock types, and possibly list items,\n// are marked as defining.\n//\n// isolating:: ?bool\n// When enabled (default is false), the sides of nodes of this type\n// count as boundaries that regular editing operations, like\n// backspacing or lifting, won't cross. An example of a node that\n// should probably have this enabled is a table cell.\n//\n// toDOM:: ?(node: Node) → DOMOutputSpec\n// Defines the default way a node of this type should be serialized\n// to DOM/HTML (as used by\n// [`DOMSerializer.fromSchema`](#model.DOMSerializer^fromSchema)).\n// Should return a DOM node or an [array\n// structure](#model.DOMOutputSpec) that describes one, with an\n// optional number zero (“hole”) in it to indicate where the node's\n// content should be inserted.\n//\n// For text nodes, the default is to create a text DOM node. Though\n// it is possible to create a serializer where text is rendered\n// differently, this is not supported inside the editor, so you\n// shouldn't override that in your text node spec.\n//\n// parseDOM:: ?[ParseRule]\n// Associates DOM parser information with this node, which can be\n// used by [`DOMParser.fromSchema`](#model.DOMParser^fromSchema) to\n// automatically derive a parser. The `node` field in the rules is\n// implied (the name of this node will be filled in automatically).\n// If you supply your own parser, you do not need to also specify\n// parsing rules in your schema.\n//\n// toDebugString:: ?(node: Node) -> string\n// Defines the default way a node of this type should be serialized\n// to a string representation for debugging (e.g. in error messages).\n\n// MarkSpec:: interface\n//\n// attrs:: ?Object\n// The attributes that marks of this type get.\n//\n// inclusive:: ?bool\n// Whether this mark should be active when the cursor is positioned\n// at its end (or at its start when that is also the start of the\n// parent node). Defaults to true.\n//\n// excludes:: ?string\n// Determines which other marks this mark can coexist with. Should\n// be a space-separated strings naming other marks or groups of marks.\n// When a mark is [added](#model.Mark.addToSet) to a set, all marks\n// that it excludes are removed in the process. If the set contains\n// any mark that excludes the new mark but is not, itself, excluded\n// by the new mark, the mark can not be added an the set. You can\n// use the value `\"_\"` to indicate that the mark excludes all\n// marks in the schema.\n//\n// Defaults to only being exclusive with marks of the same type. You\n// can set it to an empty string (or any string not containing the\n// mark's own name) to allow multiple marks of a given type to\n// coexist (as long as they have different attributes).\n//\n// group:: ?string\n// The group or space-separated groups to which this mark belongs.\n//\n// spanning:: ?bool\n// Determines whether marks of this type can span multiple adjacent\n// nodes when serialized to DOM/HTML. Defaults to true.\n//\n// toDOM:: ?(mark: Mark, inline: bool) → DOMOutputSpec\n// Defines the default way marks of this type should be serialized\n// to DOM/HTML. When the resulting spec contains a hole, that is\n// where the marked content is placed. Otherwise, it is appended to\n// the top node.\n//\n// parseDOM:: ?[ParseRule]\n// Associates DOM parser information with this mark (see the\n// corresponding [node spec field](#model.NodeSpec.parseDOM)). The\n// `mark` field in the rules is implied.\n\n// AttributeSpec:: interface\n//\n// Used to [define](#model.NodeSpec.attrs) attributes on nodes or\n// marks.\n//\n// default:: ?any\n// The default value for this attribute, to use when no explicit\n// value is provided. Attributes that have no default must be\n// provided whenever a node or mark of a type that has them is\n// created.\n\n// ::- A document schema. Holds [node](#model.NodeType) and [mark\n// type](#model.MarkType) objects for the nodes and marks that may\n// occur in conforming documents, and provides functionality for\n// creating and deserializing such documents.\nvar Schema = function Schema(spec) {\n // :: SchemaSpec\n // The [spec](#model.SchemaSpec) on which the schema is based,\n // with the added guarantee that its `nodes` and `marks`\n // properties are\n // [`OrderedMap`](https://github.com/marijnh/orderedmap) instances\n // (not raw objects).\n this.spec = {};\n for (var prop in spec) { this.spec[prop] = spec[prop]; }\n this.spec.nodes = OrderedMap.from(spec.nodes);\n this.spec.marks = OrderedMap.from(spec.marks);\n\n // :: Object\n // An object mapping the schema's node names to node type objects.\n this.nodes = NodeType.compile(this.spec.nodes, this);\n\n // :: Object\n // A map from mark names to mark type objects.\n this.marks = MarkType.compile(this.spec.marks, this);\n\n var contentExprCache = Object.create(null);\n for (var prop$1 in this.nodes) {\n if (prop$1 in this.marks)\n { throw new RangeError(prop$1 + \" can not be both a node and a mark\") }\n var type = this.nodes[prop$1], contentExpr = type.spec.content || \"\", markExpr = type.spec.marks;\n type.contentMatch = contentExprCache[contentExpr] ||\n (contentExprCache[contentExpr] = ContentMatch.parse(contentExpr, this.nodes));\n type.inlineContent = type.contentMatch.inlineContent;\n type.markSet = markExpr == \"_\" ? null :\n markExpr ? gatherMarks(this, markExpr.split(\" \")) :\n markExpr == \"\" || !type.inlineContent ? [] : null;\n }\n for (var prop$2 in this.marks) {\n var type$1 = this.marks[prop$2], excl = type$1.spec.excludes;\n type$1.excluded = excl == null ? [type$1] : excl == \"\" ? [] : gatherMarks(this, excl.split(\" \"));\n }\n\n this.nodeFromJSON = this.nodeFromJSON.bind(this);\n this.markFromJSON = this.markFromJSON.bind(this);\n\n // :: NodeType\n // The type of the [default top node](#model.SchemaSpec.topNode)\n // for this schema.\n this.topNodeType = this.nodes[this.spec.topNode || \"doc\"];\n\n // :: Object\n // An object for storing whatever values modules may want to\n // compute and cache per schema. (If you want to store something\n // in it, try to use property names unlikely to clash.)\n this.cached = Object.create(null);\n this.cached.wrappings = Object.create(null);\n};\n\n// :: (union, ?Object, ?union, ?[Mark]) → Node\n// Create a node in this schema. The `type` may be a string or a\n// `NodeType` instance. Attributes will be extended\n// with defaults, `content` may be a `Fragment`,\n// `null`, a `Node`, or an array of nodes.\nSchema.prototype.node = function node (type, attrs, content, marks) {\n if (typeof type == \"string\")\n { type = this.nodeType(type); }\n else if (!(type instanceof NodeType))\n { throw new RangeError(\"Invalid node type: \" + type) }\n else if (type.schema != this)\n { throw new RangeError(\"Node type from different schema used (\" + type.name + \")\") }\n\n return type.createChecked(attrs, content, marks)\n};\n\n// :: (string, ?[Mark]) → Node\n// Create a text node in the schema. Empty text nodes are not\n// allowed.\nSchema.prototype.text = function text (text$1, marks) {\n var type = this.nodes.text;\n return new TextNode(type, type.defaultAttrs, text$1, Mark.setFrom(marks))\n};\n\n// :: (union, ?Object) → Mark\n// Create a mark with the given type and attributes.\nSchema.prototype.mark = function mark (type, attrs) {\n if (typeof type == \"string\") { type = this.marks[type]; }\n return type.create(attrs)\n};\n\n// :: (Object) → Node\n// Deserialize a node from its JSON representation. This method is\n// bound.\nSchema.prototype.nodeFromJSON = function nodeFromJSON (json) {\n return Node.fromJSON(this, json)\n};\n\n// :: (Object) → Mark\n// Deserialize a mark from its JSON representation. This method is\n// bound.\nSchema.prototype.markFromJSON = function markFromJSON (json) {\n return Mark.fromJSON(this, json)\n};\n\nSchema.prototype.nodeType = function nodeType (name) {\n var found = this.nodes[name];\n if (!found) { throw new RangeError(\"Unknown node type: \" + name) }\n return found\n};\n\nfunction gatherMarks(schema, marks) {\n var found = [];\n for (var i = 0; i < marks.length; i++) {\n var name = marks[i], mark = schema.marks[name], ok = mark;\n if (mark) {\n found.push(mark);\n } else {\n for (var prop in schema.marks) {\n var mark$1 = schema.marks[prop];\n if (name == \"_\" || (mark$1.spec.group && mark$1.spec.group.split(\" \").indexOf(name) > -1))\n { found.push(ok = mark$1); }\n }\n }\n if (!ok) { throw new SyntaxError(\"Unknown mark type: '\" + marks[i] + \"'\") }\n }\n return found\n}\n\n// ParseOptions:: interface\n// These are the options recognized by the\n// [`parse`](#model.DOMParser.parse) and\n// [`parseSlice`](#model.DOMParser.parseSlice) methods.\n//\n// preserveWhitespace:: ?union\n// By default, whitespace is collapsed as per HTML's rules. Pass\n// `true` to preserve whitespace, but normalize newlines to\n// spaces, and `\"full\"` to preserve whitespace entirely.\n//\n// findPositions:: ?[{node: dom.Node, offset: number}]\n// When given, the parser will, beside parsing the content,\n// record the document positions of the given DOM positions. It\n// will do so by writing to the objects, adding a `pos` property\n// that holds the document position. DOM positions that are not\n// in the parsed content will not be written to.\n//\n// from:: ?number\n// The child node index to start parsing from.\n//\n// to:: ?number\n// The child node index to stop parsing at.\n//\n// topNode:: ?Node\n// By default, the content is parsed into the schema's default\n// [top node type](#model.Schema.topNodeType). You can pass this\n// option to use the type and attributes from a different node\n// as the top container.\n//\n// topMatch:: ?ContentMatch\n// Provide the starting content match that content parsed into the\n// top node is matched against.\n//\n// context:: ?ResolvedPos\n// A set of additional nodes to count as\n// [context](#model.ParseRule.context) when parsing, above the\n// given [top node](#model.ParseOptions.topNode).\n\n// ParseRule:: interface\n// A value that describes how to parse a given DOM node or inline\n// style as a ProseMirror node or mark.\n//\n// tag:: ?string\n// A CSS selector describing the kind of DOM elements to match. A\n// single rule should have _either_ a `tag` or a `style` property.\n//\n// namespace:: ?string\n// The namespace to match. This should be used with `tag`.\n// Nodes are only matched when the namespace matches or this property\n// is null.\n//\n// style:: ?string\n// A CSS property name to match. When given, this rule matches\n// inline styles that list that property. May also have the form\n// `\"property=value\"`, in which case the rule only matches if the\n// property's value exactly matches the given value. (For more\n// complicated filters, use [`getAttrs`](#model.ParseRule.getAttrs)\n// and return false to indicate that the match failed.) Rules\n// matching styles may only produce [marks](#model.ParseRule.mark),\n// not nodes.\n//\n// priority:: ?number\n// Can be used to change the order in which the parse rules in a\n// schema are tried. Those with higher priority come first. Rules\n// without a priority are counted as having priority 50. This\n// property is only meaningful in a schema—when directly\n// constructing a parser, the order of the rule array is used.\n//\n// consuming:: ?boolean\n// By default, when a rule matches an element or style, no further\n// rules get a chance to match it. By setting this to `false`, you\n// indicate that even when this rule matches, other rules that come\n// after it should also run.\n//\n// context:: ?string\n// When given, restricts this rule to only match when the current\n// context—the parent nodes into which the content is being\n// parsed—matches this expression. Should contain one or more node\n// names or node group names followed by single or double slashes.\n// For example `\"paragraph/\"` means the rule only matches when the\n// parent node is a paragraph, `\"blockquote/paragraph/\"` restricts\n// it to be in a paragraph that is inside a blockquote, and\n// `\"section//\"` matches any position inside a section—a double\n// slash matches any sequence of ancestor nodes. To allow multiple\n// different contexts, they can be separated by a pipe (`|`)\n// character, as in `\"blockquote/|list_item/\"`.\n//\n// node:: ?string\n// The name of the node type to create when this rule matches. Only\n// valid for rules with a `tag` property, not for style rules. Each\n// rule should have one of a `node`, `mark`, or `ignore` property\n// (except when it appears in a [node](#model.NodeSpec.parseDOM) or\n// [mark spec](#model.MarkSpec.parseDOM), in which case the `node`\n// or `mark` property will be derived from its position).\n//\n// mark:: ?string\n// The name of the mark type to wrap the matched content in.\n//\n// ignore:: ?bool\n// When true, ignore content that matches this rule.\n//\n// closeParent:: ?bool\n// When true, finding an element that matches this rule will close\n// the current node.\n//\n// skip:: ?bool\n// When true, ignore the node that matches this rule, but do parse\n// its content.\n//\n// attrs:: ?Object\n// Attributes for the node or mark created by this rule. When\n// `getAttrs` is provided, it takes precedence.\n//\n// getAttrs:: ?(union) → ?union\n// A function used to compute the attributes for the node or mark\n// created by this rule. Can also be used to describe further\n// conditions the DOM element or style must match. When it returns\n// `false`, the rule won't match. When it returns null or undefined,\n// that is interpreted as an empty/default set of attributes.\n//\n// Called with a DOM Element for `tag` rules, and with a string (the\n// style's value) for `style` rules.\n//\n// contentElement:: ?union\n// For `tag` rules that produce non-leaf nodes or marks, by default\n// the content of the DOM element is parsed as content of the mark\n// or node. If the child nodes are in a descendent node, this may be\n// a CSS selector string that the parser must use to find the actual\n// content element, or a function that returns the actual content\n// element to the parser.\n//\n// getContent:: ?(dom.Node, schema: Schema) → Fragment\n// Can be used to override the content of a matched node. When\n// present, instead of parsing the node's child nodes, the result of\n// this function is used.\n//\n// preserveWhitespace:: ?union\n// Controls whether whitespace should be preserved when parsing the\n// content inside the matched element. `false` means whitespace may\n// be collapsed, `true` means that whitespace should be preserved\n// but newlines normalized to spaces, and `\"full\"` means that\n// newlines should also be preserved.\n\n// ::- A DOM parser represents a strategy for parsing DOM content into\n// a ProseMirror document conforming to a given schema. Its behavior\n// is defined by an array of [rules](#model.ParseRule).\nvar DOMParser = function DOMParser(schema, rules) {\n var this$1 = this;\n\n // :: Schema\n // The schema into which the parser parses.\n this.schema = schema;\n // :: [ParseRule]\n // The set of [parse rules](#model.ParseRule) that the parser\n // uses, in order of precedence.\n this.rules = rules;\n this.tags = [];\n this.styles = [];\n\n rules.forEach(function (rule) {\n if (rule.tag) { this$1.tags.push(rule); }\n else if (rule.style) { this$1.styles.push(rule); }\n });\n\n // Only normalize list elements when lists in the schema can't directly contain themselves\n this.normalizeLists = !this.tags.some(function (r) {\n if (!/^(ul|ol)\\b/.test(r.tag) || !r.node) { return false }\n var node = schema.nodes[r.node];\n return node.contentMatch.matchType(node)\n });\n};\n\n// :: (dom.Node, ?ParseOptions) → Node\n// Parse a document from the content of a DOM node.\nDOMParser.prototype.parse = function parse (dom, options) {\n if ( options === void 0 ) options = {};\n\n var context = new ParseContext(this, options, false);\n context.addAll(dom, null, options.from, options.to);\n return context.finish()\n};\n\n// :: (dom.Node, ?ParseOptions) → Slice\n// Parses the content of the given DOM node, like\n// [`parse`](#model.DOMParser.parse), and takes the same set of\n// options. But unlike that method, which produces a whole node,\n// this one returns a slice that is open at the sides, meaning that\n// the schema constraints aren't applied to the start of nodes to\n// the left of the input and the end of nodes at the end.\nDOMParser.prototype.parseSlice = function parseSlice (dom, options) {\n if ( options === void 0 ) options = {};\n\n var context = new ParseContext(this, options, true);\n context.addAll(dom, null, options.from, options.to);\n return Slice.maxOpen(context.finish())\n};\n\nDOMParser.prototype.matchTag = function matchTag (dom, context, after) {\n for (var i = after ? this.tags.indexOf(after) + 1 : 0; i < this.tags.length; i++) {\n var rule = this.tags[i];\n if (matches(dom, rule.tag) &&\n (rule.namespace === undefined || dom.namespaceURI == rule.namespace) &&\n (!rule.context || context.matchesContext(rule.context))) {\n if (rule.getAttrs) {\n var result = rule.getAttrs(dom);\n if (result === false) { continue }\n rule.attrs = result;\n }\n return rule\n }\n }\n};\n\nDOMParser.prototype.matchStyle = function matchStyle (prop, value, context, after) {\n for (var i = after ? this.styles.indexOf(after) + 1 : 0; i < this.styles.length; i++) {\n var rule = this.styles[i];\n if (rule.style.indexOf(prop) != 0 ||\n rule.context && !context.matchesContext(rule.context) ||\n // Test that the style string either precisely matches the prop,\n // or has an '=' sign after the prop, followed by the given\n // value.\n rule.style.length > prop.length &&\n (rule.style.charCodeAt(prop.length) != 61 || rule.style.slice(prop.length + 1) != value))\n { continue }\n if (rule.getAttrs) {\n var result = rule.getAttrs(value);\n if (result === false) { continue }\n rule.attrs = result;\n }\n return rule\n }\n};\n\n// : (Schema) → [ParseRule]\nDOMParser.schemaRules = function schemaRules (schema) {\n var result = [];\n function insert(rule) {\n var priority = rule.priority == null ? 50 : rule.priority, i = 0;\n for (; i < result.length; i++) {\n var next = result[i], nextPriority = next.priority == null ? 50 : next.priority;\n if (nextPriority < priority) { break }\n }\n result.splice(i, 0, rule);\n }\n\n var loop = function ( name ) {\n var rules = schema.marks[name].spec.parseDOM;\n if (rules) { rules.forEach(function (rule) {\n insert(rule = copy(rule));\n rule.mark = name;\n }); }\n };\n\n for (var name in schema.marks) loop( name );\n var loop$1 = function ( name ) {\n var rules$1 = schema.nodes[name$1].spec.parseDOM;\n if (rules$1) { rules$1.forEach(function (rule) {\n insert(rule = copy(rule));\n rule.node = name$1;\n }); }\n };\n\n for (var name$1 in schema.nodes) loop$1();\n return result\n};\n\n// :: (Schema) → DOMParser\n// Construct a DOM parser using the parsing rules listed in a\n// schema's [node specs](#model.NodeSpec.parseDOM), reordered by\n// [priority](#model.ParseRule.priority).\nDOMParser.fromSchema = function fromSchema (schema) {\n return schema.cached.domParser ||\n (schema.cached.domParser = new DOMParser(schema, DOMParser.schemaRules(schema)))\n};\n\n// : Object The block-level tags in HTML5\nvar blockTags = {\n address: true, article: true, aside: true, blockquote: true, canvas: true,\n dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true,\n footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true,\n h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true,\n output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true\n};\n\n// : Object The tags that we normally ignore.\nvar ignoreTags = {\n head: true, noscript: true, object: true, script: true, style: true, title: true\n};\n\n// : Object List tags.\nvar listTags = {ol: true, ul: true};\n\n// Using a bitfield for node context options\nvar OPT_PRESERVE_WS = 1, OPT_PRESERVE_WS_FULL = 2, OPT_OPEN_LEFT = 4;\n\nfunction wsOptionsFor(preserveWhitespace) {\n return (preserveWhitespace ? OPT_PRESERVE_WS : 0) | (preserveWhitespace === \"full\" ? OPT_PRESERVE_WS_FULL : 0)\n}\n\nvar NodeContext = function NodeContext(type, attrs, marks, pendingMarks, solid, match, options) {\n this.type = type;\n this.attrs = attrs;\n this.solid = solid;\n this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch);\n this.options = options;\n this.content = [];\n // Marks applied to this node itself\n this.marks = marks;\n // Marks applied to its children\n this.activeMarks = Mark.none;\n // Marks that can't apply here, but will be used in children if possible\n this.pendingMarks = pendingMarks;\n // Nested Marks with same type\n this.stashMarks = [];\n};\n\nNodeContext.prototype.findWrapping = function findWrapping (node) {\n if (!this.match) {\n if (!this.type) { return [] }\n var fill = this.type.contentMatch.fillBefore(Fragment.from(node));\n if (fill) {\n this.match = this.type.contentMatch.matchFragment(fill);\n } else {\n var start = this.type.contentMatch, wrap;\n if (wrap = start.findWrapping(node.type)) {\n this.match = start;\n return wrap\n } else {\n return null\n }\n }\n }\n return this.match.findWrapping(node.type)\n};\n\nNodeContext.prototype.finish = function finish (openEnd) {\n if (!(this.options & OPT_PRESERVE_WS)) { // Strip trailing whitespace\n var last = this.content[this.content.length - 1], m;\n if (last && last.isText && (m = /[ \\t\\r\\n\\u000c]+$/.exec(last.text))) {\n if (last.text.length == m[0].length) { this.content.pop(); }\n else { this.content[this.content.length - 1] = last.withText(last.text.slice(0, last.text.length - m[0].length)); }\n }\n }\n var content = Fragment.from(this.content);\n if (!openEnd && this.match)\n { content = content.append(this.match.fillBefore(Fragment.empty, true)); }\n return this.type ? this.type.create(this.attrs, content, this.marks) : content\n};\n\nNodeContext.prototype.popFromStashMark = function popFromStashMark (mark) {\n for (var i = this.stashMarks.length - 1; i >= 0; i--)\n { if (mark.eq(this.stashMarks[i])) { return this.stashMarks.splice(i, 1)[0] } }\n};\n\nNodeContext.prototype.applyPending = function applyPending (nextType) {\n for (var i = 0, pending = this.pendingMarks; i < pending.length; i++) {\n var mark = pending[i];\n if ((this.type ? this.type.allowsMarkType(mark.type) : markMayApply(mark.type, nextType)) &&\n !mark.isInSet(this.activeMarks)) {\n this.activeMarks = mark.addToSet(this.activeMarks);\n this.pendingMarks = mark.removeFromSet(this.pendingMarks);\n }\n }\n};\n\nvar ParseContext = function ParseContext(parser, options, open) {\n // : DOMParser The parser we are using.\n this.parser = parser;\n // : Object The options passed to this parse.\n this.options = options;\n this.isOpen = open;\n var topNode = options.topNode, topContext;\n var topOptions = wsOptionsFor(options.preserveWhitespace) | (open ? OPT_OPEN_LEFT : 0);\n if (topNode)\n { topContext = new NodeContext(topNode.type, topNode.attrs, Mark.none, Mark.none, true,\n options.topMatch || topNode.type.contentMatch, topOptions); }\n else if (open)\n { topContext = new NodeContext(null, null, Mark.none, Mark.none, true, null, topOptions); }\n else\n { topContext = new NodeContext(parser.schema.topNodeType, null, Mark.none, Mark.none, true, null, topOptions); }\n this.nodes = [topContext];\n // : [Mark] The current set of marks\n this.open = 0;\n this.find = options.findPositions;\n this.needsBlock = false;\n};\n\nvar prototypeAccessors$6 = { top: { configurable: true },currentPos: { configurable: true } };\n\nprototypeAccessors$6.top.get = function () {\n return this.nodes[this.open]\n};\n\n// : (dom.Node)\n// Add a DOM node to the content. Text is inserted as text node,\n// otherwise, the node is passed to `addElement` or, if it has a\n// `style` attribute, `addElementWithStyles`.\nParseContext.prototype.addDOM = function addDOM (dom) {\n if (dom.nodeType == 3) {\n this.addTextNode(dom);\n } else if (dom.nodeType == 1) {\n var style = dom.getAttribute(\"style\");\n var marks = style ? this.readStyles(parseStyles(style)) : null, top = this.top;\n if (marks != null) { for (var i = 0; i < marks.length; i++) { this.addPendingMark(marks[i]); } }\n this.addElement(dom);\n if (marks != null) { for (var i$1 = 0; i$1 < marks.length; i$1++) { this.removePendingMark(marks[i$1], top); } }\n }\n};\n\nParseContext.prototype.addTextNode = function addTextNode (dom) {\n var value = dom.nodeValue;\n var top = this.top;\n if ((top.type ? top.type.inlineContent : top.content.length && top.content[0].isInline) || /[^ \\t\\r\\n\\u000c]/.test(value)) {\n if (!(top.options & OPT_PRESERVE_WS)) {\n value = value.replace(/[ \\t\\r\\n\\u000c]+/g, \" \");\n // If this starts with whitespace, and there is no node before it, or\n // a hard break, or a text node that ends with whitespace, strip the\n // leading space.\n if (/^[ \\t\\r\\n\\u000c]/.test(value) && this.open == this.nodes.length - 1) {\n var nodeBefore = top.content[top.content.length - 1];\n var domNodeBefore = dom.previousSibling;\n if (!nodeBefore ||\n (domNodeBefore && domNodeBefore.nodeName == 'BR') ||\n (nodeBefore.isText && /[ \\t\\r\\n\\u000c]$/.test(nodeBefore.text)))\n { value = value.slice(1); }\n }\n } else if (!(top.options & OPT_PRESERVE_WS_FULL)) {\n value = value.replace(/\\r?\\n|\\r/g, \" \");\n }\n if (value) { this.insertNode(this.parser.schema.text(value)); }\n this.findInText(dom);\n } else {\n this.findInside(dom);\n }\n};\n\n// : (dom.Element, ?ParseRule)\n// Try to find a handler for the given tag and use that to parse. If\n// none is found, the element's content nodes are added directly.\nParseContext.prototype.addElement = function addElement (dom, matchAfter) {\n var name = dom.nodeName.toLowerCase(), ruleID;\n if (listTags.hasOwnProperty(name) && this.parser.normalizeLists) { normalizeList(dom); }\n var rule = (this.options.ruleFromNode && this.options.ruleFromNode(dom)) ||\n (ruleID = this.parser.matchTag(dom, this, matchAfter));\n if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) {\n this.findInside(dom);\n } else if (!rule || rule.skip || rule.closeParent) {\n if (rule && rule.closeParent) { this.open = Math.max(0, this.open - 1); }\n else if (rule && rule.skip.nodeType) { dom = rule.skip; }\n var sync, top = this.top, oldNeedsBlock = this.needsBlock;\n if (blockTags.hasOwnProperty(name)) {\n sync = true;\n if (!top.type) { this.needsBlock = true; }\n } else if (!dom.firstChild) {\n this.leafFallback(dom);\n return\n }\n this.addAll(dom);\n if (sync) { this.sync(top); }\n this.needsBlock = oldNeedsBlock;\n } else {\n this.addElementByRule(dom, rule, rule.consuming === false ? ruleID : null);\n }\n};\n\n// Called for leaf DOM nodes that would otherwise be ignored\nParseContext.prototype.leafFallback = function leafFallback (dom) {\n if (dom.nodeName == \"BR\" && this.top.type && this.top.type.inlineContent)\n { this.addTextNode(dom.ownerDocument.createTextNode(\"\\n\")); }\n};\n\n// Run any style parser associated with the node's styles. Either\n// return an array of marks, or null to indicate some of the styles\n// had a rule with `ignore` set.\nParseContext.prototype.readStyles = function readStyles (styles) {\n var marks = Mark.none;\n style: for (var i = 0; i < styles.length; i += 2) {\n for (var after = null;;) {\n var rule = this.parser.matchStyle(styles[i], styles[i + 1], this, after);\n if (!rule) { continue style }\n if (rule.ignore) { return null }\n marks = this.parser.schema.marks[rule.mark].create(rule.attrs).addToSet(marks);\n if (rule.consuming === false) { after = rule; }\n else { break }\n }\n }\n return marks\n};\n\n// : (dom.Element, ParseRule) → bool\n// Look up a handler for the given node. If none are found, return\n// false. Otherwise, apply it, use its return value to drive the way\n// the node's content is wrapped, and return true.\nParseContext.prototype.addElementByRule = function addElementByRule (dom, rule, continueAfter) {\n var this$1 = this;\n\n var sync, nodeType, markType, mark;\n if (rule.node) {\n nodeType = this.parser.schema.nodes[rule.node];\n if (!nodeType.isLeaf) {\n sync = this.enter(nodeType, rule.attrs, rule.preserveWhitespace);\n } else if (!this.insertNode(nodeType.create(rule.attrs))) {\n this.leafFallback(dom);\n }\n } else {\n markType = this.parser.schema.marks[rule.mark];\n mark = markType.create(rule.attrs);\n this.addPendingMark(mark);\n }\n var startIn = this.top;\n\n if (nodeType && nodeType.isLeaf) {\n this.findInside(dom);\n } else if (continueAfter) {\n this.addElement(dom, continueAfter);\n } else if (rule.getContent) {\n this.findInside(dom);\n rule.getContent(dom, this.parser.schema).forEach(function (node) { return this$1.insertNode(node); });\n } else {\n var contentDOM = rule.contentElement;\n if (typeof contentDOM == \"string\") { contentDOM = dom.querySelector(contentDOM); }\n else if (typeof contentDOM == \"function\") { contentDOM = contentDOM(dom); }\n if (!contentDOM) { contentDOM = dom; }\n this.findAround(dom, contentDOM, true);\n this.addAll(contentDOM, sync);\n }\n if (sync) { this.sync(startIn); this.open--; }\n if (mark) { this.removePendingMark(mark, startIn); }\n};\n\n// : (dom.Node, ?NodeBuilder, ?number, ?number)\n// Add all child nodes between `startIndex` and `endIndex` (or the\n// whole node, if not given). If `sync` is passed, use it to\n// synchronize after every block element.\nParseContext.prototype.addAll = function addAll (parent, sync, startIndex, endIndex) {\n var index = startIndex || 0;\n for (var dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild,\n end = endIndex == null ? null : parent.childNodes[endIndex];\n dom != end; dom = dom.nextSibling, ++index) {\n this.findAtPoint(parent, index);\n this.addDOM(dom);\n if (sync && blockTags.hasOwnProperty(dom.nodeName.toLowerCase()))\n { this.sync(sync); }\n }\n this.findAtPoint(parent, index);\n};\n\n// Try to find a way to fit the given node type into the current\n// context. May add intermediate wrappers and/or leave non-solid\n// nodes that we're in.\nParseContext.prototype.findPlace = function findPlace (node) {\n var route, sync;\n for (var depth = this.open; depth >= 0; depth--) {\n var cx = this.nodes[depth];\n var found = cx.findWrapping(node);\n if (found && (!route || route.length > found.length)) {\n route = found;\n sync = cx;\n if (!found.length) { break }\n }\n if (cx.solid) { break }\n }\n if (!route) { return false }\n this.sync(sync);\n for (var i = 0; i < route.length; i++)\n { this.enterInner(route[i], null, false); }\n return true\n};\n\n// : (Node) → ?Node\n// Try to insert the given node, adjusting the context when needed.\nParseContext.prototype.insertNode = function insertNode (node) {\n if (node.isInline && this.needsBlock && !this.top.type) {\n var block = this.textblockFromContext();\n if (block) { this.enterInner(block); }\n }\n if (this.findPlace(node)) {\n this.closeExtra();\n var top = this.top;\n top.applyPending(node.type);\n if (top.match) { top.match = top.match.matchType(node.type); }\n var marks = top.activeMarks;\n for (var i = 0; i < node.marks.length; i++)\n { if (!top.type || top.type.allowsMarkType(node.marks[i].type))\n { marks = node.marks[i].addToSet(marks); } }\n top.content.push(node.mark(marks));\n return true\n }\n return false\n};\n\n// : (NodeType, ?Object) → bool\n// Try to start a node of the given type, adjusting the context when\n// necessary.\nParseContext.prototype.enter = function enter (type, attrs, preserveWS) {\n var ok = this.findPlace(type.create(attrs));\n if (ok) { this.enterInner(type, attrs, true, preserveWS); }\n return ok\n};\n\n// Open a node of the given type\nParseContext.prototype.enterInner = function enterInner (type, attrs, solid, preserveWS) {\n this.closeExtra();\n var top = this.top;\n top.applyPending(type);\n top.match = top.match && top.match.matchType(type, attrs);\n var options = preserveWS == null ? top.options & ~OPT_OPEN_LEFT : wsOptionsFor(preserveWS);\n if ((top.options & OPT_OPEN_LEFT) && top.content.length == 0) { options |= OPT_OPEN_LEFT; }\n this.nodes.push(new NodeContext(type, attrs, top.activeMarks, top.pendingMarks, solid, null, options));\n this.open++;\n};\n\n// Make sure all nodes above this.open are finished and added to\n// their parents\nParseContext.prototype.closeExtra = function closeExtra (openEnd) {\n var i = this.nodes.length - 1;\n if (i > this.open) {\n for (; i > this.open; i--) { this.nodes[i - 1].content.push(this.nodes[i].finish(openEnd)); }\n this.nodes.length = this.open + 1;\n }\n};\n\nParseContext.prototype.finish = function finish () {\n this.open = 0;\n this.closeExtra(this.isOpen);\n return this.nodes[0].finish(this.isOpen || this.options.topOpen)\n};\n\nParseContext.prototype.sync = function sync (to) {\n for (var i = this.open; i >= 0; i--) { if (this.nodes[i] == to) {\n this.open = i;\n return\n } }\n};\n\nprototypeAccessors$6.currentPos.get = function () {\n this.closeExtra();\n var pos = 0;\n for (var i = this.open; i >= 0; i--) {\n var content = this.nodes[i].content;\n for (var j = content.length - 1; j >= 0; j--)\n { pos += content[j].nodeSize; }\n if (i) { pos++; }\n }\n return pos\n};\n\nParseContext.prototype.findAtPoint = function findAtPoint (parent, offset) {\n if (this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].node == parent && this.find[i].offset == offset)\n { this.find[i].pos = this.currentPos; }\n } }\n};\n\nParseContext.prototype.findInside = function findInside (parent) {\n if (this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node))\n { this.find[i].pos = this.currentPos; }\n } }\n};\n\nParseContext.prototype.findAround = function findAround (parent, content, before) {\n if (parent != content && this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) {\n var pos = content.compareDocumentPosition(this.find[i].node);\n if (pos & (before ? 2 : 4))\n { this.find[i].pos = this.currentPos; }\n }\n } }\n};\n\nParseContext.prototype.findInText = function findInText (textNode) {\n if (this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].node == textNode)\n { this.find[i].pos = this.currentPos - (textNode.nodeValue.length - this.find[i].offset); }\n } }\n};\n\n// : (string) → bool\n// Determines whether the given [context\n// string](#ParseRule.context) matches this context.\nParseContext.prototype.matchesContext = function matchesContext (context) {\n var this$1 = this;\n\n if (context.indexOf(\"|\") > -1)\n { return context.split(/\\s*\\|\\s*/).some(this.matchesContext, this) }\n\n var parts = context.split(\"/\");\n var option = this.options.context;\n var useRoot = !this.isOpen && (!option || option.parent.type == this.nodes[0].type);\n var minDepth = -(option ? option.depth + 1 : 0) + (useRoot ? 0 : 1);\n var match = function (i, depth) {\n for (; i >= 0; i--) {\n var part = parts[i];\n if (part == \"\") {\n if (i == parts.length - 1 || i == 0) { continue }\n for (; depth >= minDepth; depth--)\n { if (match(i - 1, depth)) { return true } }\n return false\n } else {\n var next = depth > 0 || (depth == 0 && useRoot) ? this$1.nodes[depth].type\n : option && depth >= minDepth ? option.node(depth - minDepth).type\n : null;\n if (!next || (next.name != part && next.groups.indexOf(part) == -1))\n { return false }\n depth--;\n }\n }\n return true\n };\n return match(parts.length - 1, this.open)\n};\n\nParseContext.prototype.textblockFromContext = function textblockFromContext () {\n var $context = this.options.context;\n if ($context) { for (var d = $context.depth; d >= 0; d--) {\n var deflt = $context.node(d).contentMatchAt($context.indexAfter(d)).defaultType;\n if (deflt && deflt.isTextblock && deflt.defaultAttrs) { return deflt }\n } }\n for (var name in this.parser.schema.nodes) {\n var type = this.parser.schema.nodes[name];\n if (type.isTextblock && type.defaultAttrs) { return type }\n }\n};\n\nParseContext.prototype.addPendingMark = function addPendingMark (mark) {\n var found = findSameMarkInSet(mark, this.top.pendingMarks);\n if (found) { this.top.stashMarks.push(found); }\n this.top.pendingMarks = mark.addToSet(this.top.pendingMarks);\n};\n\nParseContext.prototype.removePendingMark = function removePendingMark (mark, upto) {\n for (var depth = this.open; depth >= 0; depth--) {\n var level = this.nodes[depth];\n var found = level.pendingMarks.lastIndexOf(mark);\n if (found > -1) {\n level.pendingMarks = mark.removeFromSet(level.pendingMarks);\n } else {\n level.activeMarks = mark.removeFromSet(level.activeMarks);\n var stashMark = level.popFromStashMark(mark);\n if (stashMark && level.type && level.type.allowsMarkType(stashMark.type))\n { level.activeMarks = stashMark.addToSet(level.activeMarks); }\n }\n if (level == upto) { break }\n }\n};\n\nObject.defineProperties( ParseContext.prototype, prototypeAccessors$6 );\n\n// Kludge to work around directly nested list nodes produced by some\n// tools and allowed by browsers to mean that the nested list is\n// actually part of the list item above it.\nfunction normalizeList(dom) {\n for (var child = dom.firstChild, prevItem = null; child; child = child.nextSibling) {\n var name = child.nodeType == 1 ? child.nodeName.toLowerCase() : null;\n if (name && listTags.hasOwnProperty(name) && prevItem) {\n prevItem.appendChild(child);\n child = prevItem;\n } else if (name == \"li\") {\n prevItem = child;\n } else if (name) {\n prevItem = null;\n }\n }\n}\n\n// Apply a CSS selector.\nfunction matches(dom, selector) {\n return (dom.matches || dom.msMatchesSelector || dom.webkitMatchesSelector || dom.mozMatchesSelector).call(dom, selector)\n}\n\n// : (string) → [string]\n// Tokenize a style attribute into property/value pairs.\nfunction parseStyles(style) {\n var re = /\\s*([\\w-]+)\\s*:\\s*([^;]+)/g, m, result = [];\n while (m = re.exec(style)) { result.push(m[1], m[2].trim()); }\n return result\n}\n\nfunction copy(obj) {\n var copy = {};\n for (var prop in obj) { copy[prop] = obj[prop]; }\n return copy\n}\n\n// Used when finding a mark at the top level of a fragment parse.\n// Checks whether it would be reasonable to apply a given mark type to\n// a given node, by looking at the way the mark occurs in the schema.\nfunction markMayApply(markType, nodeType) {\n var nodes = nodeType.schema.nodes;\n var loop = function ( name ) {\n var parent = nodes[name];\n if (!parent.allowsMarkType(markType)) { return }\n var seen = [], scan = function (match) {\n seen.push(match);\n for (var i = 0; i < match.edgeCount; i++) {\n var ref = match.edge(i);\n var type = ref.type;\n var next = ref.next;\n if (type == nodeType) { return true }\n if (seen.indexOf(next) < 0 && scan(next)) { return true }\n }\n };\n if (scan(parent.contentMatch)) { return { v: true } }\n };\n\n for (var name in nodes) {\n var returned = loop( name );\n\n if ( returned ) return returned.v;\n }\n}\n\nfunction findSameMarkInSet(mark, set) {\n for (var i = 0; i < set.length; i++) {\n if (mark.eq(set[i])) { return set[i] }\n }\n}\n\n// DOMOutputSpec:: interface\n// A description of a DOM structure. Can be either a string, which is\n// interpreted as a text node, a DOM node, which is interpreted as\n// itself, a `{dom: Node, contentDOM: ?Node}` object, or an array.\n//\n// An array describes a DOM element. The first value in the array\n// should be a string—the name of the DOM element, optionally prefixed\n// by a namespace URL and a space. If the second element is plain\n// object, it is interpreted as a set of attributes for the element.\n// Any elements after that (including the 2nd if it's not an attribute\n// object) are interpreted as children of the DOM elements, and must\n// either be valid `DOMOutputSpec` values, or the number zero.\n//\n// The number zero (pronounced “hole”) is used to indicate the place\n// where a node's child nodes should be inserted. If it occurs in an\n// output spec, it should be the only child element in its parent\n// node.\n\n// ::- A DOM serializer knows how to convert ProseMirror nodes and\n// marks of various types to DOM nodes.\nvar DOMSerializer = function DOMSerializer(nodes, marks) {\n // :: Object<(node: Node) → DOMOutputSpec>\n // The node serialization functions.\n this.nodes = nodes || {};\n // :: Object\n // The mark serialization functions.\n this.marks = marks || {};\n};\n\n// :: (Fragment, ?Object) → dom.DocumentFragment\n// Serialize the content of this fragment to a DOM fragment. When\n// not in the browser, the `document` option, containing a DOM\n// document, should be passed so that the serializer can create\n// nodes.\nDOMSerializer.prototype.serializeFragment = function serializeFragment (fragment, options, target) {\n var this$1 = this;\n if ( options === void 0 ) options = {};\n\n if (!target) { target = doc(options).createDocumentFragment(); }\n\n var top = target, active = null;\n fragment.forEach(function (node) {\n if (active || node.marks.length) {\n if (!active) { active = []; }\n var keep = 0, rendered = 0;\n while (keep < active.length && rendered < node.marks.length) {\n var next = node.marks[rendered];\n if (!this$1.marks[next.type.name]) { rendered++; continue }\n if (!next.eq(active[keep]) || next.type.spec.spanning === false) { break }\n keep += 2; rendered++;\n }\n while (keep < active.length) {\n top = active.pop();\n active.pop();\n }\n while (rendered < node.marks.length) {\n var add = node.marks[rendered++];\n var markDOM = this$1.serializeMark(add, node.isInline, options);\n if (markDOM) {\n active.push(add, top);\n top.appendChild(markDOM.dom);\n top = markDOM.contentDOM || markDOM.dom;\n }\n }\n }\n top.appendChild(this$1.serializeNode(node, options));\n });\n\n return target\n};\n\n// :: (Node, ?Object) → dom.Node\n// Serialize this node to a DOM node. This can be useful when you\n// need to serialize a part of a document, as opposed to the whole\n// document. To serialize a whole document, use\n// [`serializeFragment`](#model.DOMSerializer.serializeFragment) on\n// its [content](#model.Node.content).\nDOMSerializer.prototype.serializeNode = function serializeNode (node, options) {\n if ( options === void 0 ) options = {};\n\n var ref =\n DOMSerializer.renderSpec(doc(options), this.nodes[node.type.name](node));\n var dom = ref.dom;\n var contentDOM = ref.contentDOM;\n if (contentDOM) {\n if (node.isLeaf)\n { throw new RangeError(\"Content hole not allowed in a leaf node spec\") }\n if (options.onContent)\n { options.onContent(node, contentDOM, options); }\n else\n { this.serializeFragment(node.content, options, contentDOM); }\n }\n return dom\n};\n\nDOMSerializer.prototype.serializeNodeAndMarks = function serializeNodeAndMarks (node, options) {\n if ( options === void 0 ) options = {};\n\n var dom = this.serializeNode(node, options);\n for (var i = node.marks.length - 1; i >= 0; i--) {\n var wrap = this.serializeMark(node.marks[i], node.isInline, options);\n if (wrap) {\n(wrap.contentDOM || wrap.dom).appendChild(dom);\n dom = wrap.dom;\n }\n }\n return dom\n};\n\nDOMSerializer.prototype.serializeMark = function serializeMark (mark, inline, options) {\n if ( options === void 0 ) options = {};\n\n var toDOM = this.marks[mark.type.name];\n return toDOM && DOMSerializer.renderSpec(doc(options), toDOM(mark, inline))\n};\n\n// :: (dom.Document, DOMOutputSpec) → {dom: dom.Node, contentDOM: ?dom.Node}\n// Render an [output spec](#model.DOMOutputSpec) to a DOM node. If\n// the spec has a hole (zero) in it, `contentDOM` will point at the\n// node with the hole.\nDOMSerializer.renderSpec = function renderSpec (doc, structure, xmlNS) {\n if ( xmlNS === void 0 ) xmlNS = null;\n\n if (typeof structure == \"string\")\n { return {dom: doc.createTextNode(structure)} }\n if (structure.nodeType != null)\n { return {dom: structure} }\n if (structure.dom && structure.dom.nodeType != null)\n { return structure }\n var tagName = structure[0], space = tagName.indexOf(\" \");\n if (space > 0) {\n xmlNS = tagName.slice(0, space);\n tagName = tagName.slice(space + 1);\n }\n var contentDOM = null, dom = xmlNS ? doc.createElementNS(xmlNS, tagName) : doc.createElement(tagName);\n var attrs = structure[1], start = 1;\n if (attrs && typeof attrs == \"object\" && attrs.nodeType == null && !Array.isArray(attrs)) {\n start = 2;\n for (var name in attrs) { if (attrs[name] != null) {\n var space$1 = name.indexOf(\" \");\n if (space$1 > 0) { dom.setAttributeNS(name.slice(0, space$1), name.slice(space$1 + 1), attrs[name]); }\n else { dom.setAttribute(name, attrs[name]); }\n } }\n }\n for (var i = start; i < structure.length; i++) {\n var child = structure[i];\n if (child === 0) {\n if (i < structure.length - 1 || i > start)\n { throw new RangeError(\"Content hole must be the only child of its parent node\") }\n return {dom: dom, contentDOM: dom}\n } else {\n var ref = DOMSerializer.renderSpec(doc, child, xmlNS);\n var inner = ref.dom;\n var innerContent = ref.contentDOM;\n dom.appendChild(inner);\n if (innerContent) {\n if (contentDOM) { throw new RangeError(\"Multiple content holes\") }\n contentDOM = innerContent;\n }\n }\n }\n return {dom: dom, contentDOM: contentDOM}\n};\n\n// :: (Schema) → DOMSerializer\n// Build a serializer using the [`toDOM`](#model.NodeSpec.toDOM)\n// properties in a schema's node and mark specs.\nDOMSerializer.fromSchema = function fromSchema (schema) {\n return schema.cached.domSerializer ||\n (schema.cached.domSerializer = new DOMSerializer(this.nodesFromSchema(schema), this.marksFromSchema(schema)))\n};\n\n// : (Schema) → Object<(node: Node) → DOMOutputSpec>\n// Gather the serializers in a schema's node specs into an object.\n// This can be useful as a base to build a custom serializer from.\nDOMSerializer.nodesFromSchema = function nodesFromSchema (schema) {\n var result = gatherToDOM(schema.nodes);\n if (!result.text) { result.text = function (node) { return node.text; }; }\n return result\n};\n\n// : (Schema) → Object<(mark: Mark) → DOMOutputSpec>\n// Gather the serializers in a schema's mark specs into an object.\nDOMSerializer.marksFromSchema = function marksFromSchema (schema) {\n return gatherToDOM(schema.marks)\n};\n\nfunction gatherToDOM(obj) {\n var result = {};\n for (var name in obj) {\n var toDOM = obj[name].spec.toDOM;\n if (toDOM) { result[name] = toDOM; }\n }\n return result\n}\n\nfunction doc(options) {\n // declare global: window\n return options.document || window.document\n}\n\nexport { ContentMatch, DOMParser, DOMSerializer, Fragment, Mark, MarkType, Node, NodeRange, NodeType, ReplaceError, ResolvedPos, Schema, Slice };\n//# sourceMappingURL=index.es.js.map\n","import { Slice, Fragment, Mark, Node } from 'prosemirror-model';\nimport { ReplaceStep, ReplaceAroundStep, Transform } from 'prosemirror-transform';\n\nvar classesById = Object.create(null);\n\n// ::- Superclass for editor selections. Every selection type should\n// extend this. Should not be instantiated directly.\nvar Selection = function Selection($anchor, $head, ranges) {\n // :: [SelectionRange]\n // The ranges covered by the selection.\n this.ranges = ranges || [new SelectionRange($anchor.min($head), $anchor.max($head))];\n // :: ResolvedPos\n // The resolved anchor of the selection (the side that stays in\n // place when the selection is modified).\n this.$anchor = $anchor;\n // :: ResolvedPos\n // The resolved head of the selection (the side that moves when\n // the selection is modified).\n this.$head = $head;\n};\n\nvar prototypeAccessors = { anchor: { configurable: true },head: { configurable: true },from: { configurable: true },to: { configurable: true },$from: { configurable: true },$to: { configurable: true },empty: { configurable: true } };\n\n// :: number\n// The selection's anchor, as an unresolved position.\nprototypeAccessors.anchor.get = function () { return this.$anchor.pos };\n\n// :: number\n// The selection's head.\nprototypeAccessors.head.get = function () { return this.$head.pos };\n\n// :: number\n// The lower bound of the selection's main range.\nprototypeAccessors.from.get = function () { return this.$from.pos };\n\n// :: number\n// The upper bound of the selection's main range.\nprototypeAccessors.to.get = function () { return this.$to.pos };\n\n// :: ResolvedPos\n// The resolved lowerbound of the selection's main range.\nprototypeAccessors.$from.get = function () {\n return this.ranges[0].$from\n};\n\n// :: ResolvedPos\n// The resolved upper bound of the selection's main range.\nprototypeAccessors.$to.get = function () {\n return this.ranges[0].$to\n};\n\n// :: bool\n// Indicates whether the selection contains any content.\nprototypeAccessors.empty.get = function () {\n var ranges = this.ranges;\n for (var i = 0; i < ranges.length; i++)\n { if (ranges[i].$from.pos != ranges[i].$to.pos) { return false } }\n return true\n};\n\n// eq:: (Selection) → bool\n// Test whether the selection is the same as another selection.\n\n// map:: (doc: Node, mapping: Mappable) → Selection\n// Map this selection through a [mappable](#transform.Mappable) thing. `doc`\n// should be the new document to which we are mapping.\n\n// :: () → Slice\n// Get the content of this selection as a slice.\nSelection.prototype.content = function content () {\n return this.$from.node(0).slice(this.from, this.to, true)\n};\n\n// :: (Transaction, ?Slice)\n// Replace the selection with a slice or, if no slice is given,\n// delete the selection. Will append to the given transaction.\nSelection.prototype.replace = function replace (tr, content) {\n if ( content === void 0 ) content = Slice.empty;\n\n // Put the new selection at the position after the inserted\n // content. When that ended in an inline node, search backwards,\n // to get the position after that node. If not, search forward.\n var lastNode = content.content.lastChild, lastParent = null;\n for (var i = 0; i < content.openEnd; i++) {\n lastParent = lastNode;\n lastNode = lastNode.lastChild;\n }\n\n var mapFrom = tr.steps.length, ranges = this.ranges;\n for (var i$1 = 0; i$1 < ranges.length; i$1++) {\n var ref = ranges[i$1];\n var $from = ref.$from;\n var $to = ref.$to;\n var mapping = tr.mapping.slice(mapFrom);\n tr.replaceRange(mapping.map($from.pos), mapping.map($to.pos), i$1 ? Slice.empty : content);\n if (i$1 == 0)\n { selectionToInsertionEnd(tr, mapFrom, (lastNode ? lastNode.isInline : lastParent && lastParent.isTextblock) ? -1 : 1); }\n }\n};\n\n// :: (Transaction, Node)\n// Replace the selection with the given node, appending the changes\n// to the given transaction.\nSelection.prototype.replaceWith = function replaceWith (tr, node) {\n var mapFrom = tr.steps.length, ranges = this.ranges;\n for (var i = 0; i < ranges.length; i++) {\n var ref = ranges[i];\n var $from = ref.$from;\n var $to = ref.$to;\n var mapping = tr.mapping.slice(mapFrom);\n var from = mapping.map($from.pos), to = mapping.map($to.pos);\n if (i) {\n tr.deleteRange(from, to);\n } else {\n tr.replaceRangeWith(from, to, node);\n selectionToInsertionEnd(tr, mapFrom, node.isInline ? -1 : 1);\n }\n }\n};\n\n// toJSON:: () → Object\n// Convert the selection to a JSON representation. When implementing\n// this for a custom selection class, make sure to give the object a\n// `type` property whose value matches the ID under which you\n// [registered](#state.Selection^jsonID) your class.\n\n// :: (ResolvedPos, number, ?bool) → ?Selection\n// Find a valid cursor or leaf node selection starting at the given\n// position and searching back if `dir` is negative, and forward if\n// positive. When `textOnly` is true, only consider cursor\n// selections. Will return null when no valid selection position is\n// found.\nSelection.findFrom = function findFrom ($pos, dir, textOnly) {\n var inner = $pos.parent.inlineContent ? new TextSelection($pos)\n : findSelectionIn($pos.node(0), $pos.parent, $pos.pos, $pos.index(), dir, textOnly);\n if (inner) { return inner }\n\n for (var depth = $pos.depth - 1; depth >= 0; depth--) {\n var found = dir < 0\n ? findSelectionIn($pos.node(0), $pos.node(depth), $pos.before(depth + 1), $pos.index(depth), dir, textOnly)\n : findSelectionIn($pos.node(0), $pos.node(depth), $pos.after(depth + 1), $pos.index(depth) + 1, dir, textOnly);\n if (found) { return found }\n }\n};\n\n// :: (ResolvedPos, ?number) → Selection\n// Find a valid cursor or leaf node selection near the given\n// position. Searches forward first by default, but if `bias` is\n// negative, it will search backwards first.\nSelection.near = function near ($pos, bias) {\n if ( bias === void 0 ) bias = 1;\n\n return this.findFrom($pos, bias) || this.findFrom($pos, -bias) || new AllSelection($pos.node(0))\n};\n\n// :: (Node) → Selection\n// Find the cursor or leaf node selection closest to the start of\n// the given document. Will return an\n// [`AllSelection`](#state.AllSelection) if no valid position\n// exists.\nSelection.atStart = function atStart (doc) {\n return findSelectionIn(doc, doc, 0, 0, 1) || new AllSelection(doc)\n};\n\n// :: (Node) → Selection\n// Find the cursor or leaf node selection closest to the end of the\n// given document.\nSelection.atEnd = function atEnd (doc) {\n return findSelectionIn(doc, doc, doc.content.size, doc.childCount, -1) || new AllSelection(doc)\n};\n\n// :: (Node, Object) → Selection\n// Deserialize the JSON representation of a selection. Must be\n// implemented for custom classes (as a static class method).\nSelection.fromJSON = function fromJSON (doc, json) {\n if (!json || !json.type) { throw new RangeError(\"Invalid input for Selection.fromJSON\") }\n var cls = classesById[json.type];\n if (!cls) { throw new RangeError((\"No selection type \" + (json.type) + \" defined\")) }\n return cls.fromJSON(doc, json)\n};\n\n// :: (string, constructor)\n// To be able to deserialize selections from JSON, custom selection\n// classes must register themselves with an ID string, so that they\n// can be disambiguated. Try to pick something that's unlikely to\n// clash with classes from other modules.\nSelection.jsonID = function jsonID (id, selectionClass) {\n if (id in classesById) { throw new RangeError(\"Duplicate use of selection JSON ID \" + id) }\n classesById[id] = selectionClass;\n selectionClass.prototype.jsonID = id;\n return selectionClass\n};\n\n// :: () → SelectionBookmark\n// Get a [bookmark](#state.SelectionBookmark) for this selection,\n// which is a value that can be mapped without having access to a\n// current document, and later resolved to a real selection for a\n// given document again. (This is used mostly by the history to\n// track and restore old selections.) The default implementation of\n// this method just converts the selection to a text selection and\n// returns the bookmark for that.\nSelection.prototype.getBookmark = function getBookmark () {\n return TextSelection.between(this.$anchor, this.$head).getBookmark()\n};\n\nObject.defineProperties( Selection.prototype, prototypeAccessors );\n\n// :: bool\n// Controls whether, when a selection of this type is active in the\n// browser, the selected range should be visible to the user. Defaults\n// to `true`.\nSelection.prototype.visible = true;\n\n// SelectionBookmark:: interface\n// A lightweight, document-independent representation of a selection.\n// You can define a custom bookmark type for a custom selection class\n// to make the history handle it well.\n//\n// map:: (mapping: Mapping) → SelectionBookmark\n// Map the bookmark through a set of changes.\n//\n// resolve:: (doc: Node) → Selection\n// Resolve the bookmark to a real selection again. This may need to\n// do some error checking and may fall back to a default (usually\n// [`TextSelection.between`](#state.TextSelection^between)) if\n// mapping made the bookmark invalid.\n\n// ::- Represents a selected range in a document.\nvar SelectionRange = function SelectionRange($from, $to) {\n // :: ResolvedPos\n // The lower bound of the range.\n this.$from = $from;\n // :: ResolvedPos\n // The upper bound of the range.\n this.$to = $to;\n};\n\n// ::- A text selection represents a classical editor selection, with\n// a head (the moving side) and anchor (immobile side), both of which\n// point into textblock nodes. It can be empty (a regular cursor\n// position).\nvar TextSelection = /*@__PURE__*/(function (Selection) {\n function TextSelection($anchor, $head) {\n if ( $head === void 0 ) $head = $anchor;\n\n Selection.call(this, $anchor, $head);\n }\n\n if ( Selection ) TextSelection.__proto__ = Selection;\n TextSelection.prototype = Object.create( Selection && Selection.prototype );\n TextSelection.prototype.constructor = TextSelection;\n\n var prototypeAccessors$1 = { $cursor: { configurable: true } };\n\n // :: ?ResolvedPos\n // Returns a resolved position if this is a cursor selection (an\n // empty text selection), and null otherwise.\n prototypeAccessors$1.$cursor.get = function () { return this.$anchor.pos == this.$head.pos ? this.$head : null };\n\n TextSelection.prototype.map = function map (doc, mapping) {\n var $head = doc.resolve(mapping.map(this.head));\n if (!$head.parent.inlineContent) { return Selection.near($head) }\n var $anchor = doc.resolve(mapping.map(this.anchor));\n return new TextSelection($anchor.parent.inlineContent ? $anchor : $head, $head)\n };\n\n TextSelection.prototype.replace = function replace (tr, content) {\n if ( content === void 0 ) content = Slice.empty;\n\n Selection.prototype.replace.call(this, tr, content);\n if (content == Slice.empty) {\n var marks = this.$from.marksAcross(this.$to);\n if (marks) { tr.ensureMarks(marks); }\n }\n };\n\n TextSelection.prototype.eq = function eq (other) {\n return other instanceof TextSelection && other.anchor == this.anchor && other.head == this.head\n };\n\n TextSelection.prototype.getBookmark = function getBookmark () {\n return new TextBookmark(this.anchor, this.head)\n };\n\n TextSelection.prototype.toJSON = function toJSON () {\n return {type: \"text\", anchor: this.anchor, head: this.head}\n };\n\n TextSelection.fromJSON = function fromJSON (doc, json) {\n if (typeof json.anchor != \"number\" || typeof json.head != \"number\")\n { throw new RangeError(\"Invalid input for TextSelection.fromJSON\") }\n return new TextSelection(doc.resolve(json.anchor), doc.resolve(json.head))\n };\n\n // :: (Node, number, ?number) → TextSelection\n // Create a text selection from non-resolved positions.\n TextSelection.create = function create (doc, anchor, head) {\n if ( head === void 0 ) head = anchor;\n\n var $anchor = doc.resolve(anchor);\n return new this($anchor, head == anchor ? $anchor : doc.resolve(head))\n };\n\n // :: (ResolvedPos, ResolvedPos, ?number) → Selection\n // Return a text selection that spans the given positions or, if\n // they aren't text positions, find a text selection near them.\n // `bias` determines whether the method searches forward (default)\n // or backwards (negative number) first. Will fall back to calling\n // [`Selection.near`](#state.Selection^near) when the document\n // doesn't contain a valid text position.\n TextSelection.between = function between ($anchor, $head, bias) {\n var dPos = $anchor.pos - $head.pos;\n if (!bias || dPos) { bias = dPos >= 0 ? 1 : -1; }\n if (!$head.parent.inlineContent) {\n var found = Selection.findFrom($head, bias, true) || Selection.findFrom($head, -bias, true);\n if (found) { $head = found.$head; }\n else { return Selection.near($head, bias) }\n }\n if (!$anchor.parent.inlineContent) {\n if (dPos == 0) {\n $anchor = $head;\n } else {\n $anchor = (Selection.findFrom($anchor, -bias, true) || Selection.findFrom($anchor, bias, true)).$anchor;\n if (($anchor.pos < $head.pos) != (dPos < 0)) { $anchor = $head; }\n }\n }\n return new TextSelection($anchor, $head)\n };\n\n Object.defineProperties( TextSelection.prototype, prototypeAccessors$1 );\n\n return TextSelection;\n}(Selection));\n\nSelection.jsonID(\"text\", TextSelection);\n\nvar TextBookmark = function TextBookmark(anchor, head) {\n this.anchor = anchor;\n this.head = head;\n};\nTextBookmark.prototype.map = function map (mapping) {\n return new TextBookmark(mapping.map(this.anchor), mapping.map(this.head))\n};\nTextBookmark.prototype.resolve = function resolve (doc) {\n return TextSelection.between(doc.resolve(this.anchor), doc.resolve(this.head))\n};\n\n// ::- A node selection is a selection that points at a single node.\n// All nodes marked [selectable](#model.NodeSpec.selectable) can be\n// the target of a node selection. In such a selection, `from` and\n// `to` point directly before and after the selected node, `anchor`\n// equals `from`, and `head` equals `to`..\nvar NodeSelection = /*@__PURE__*/(function (Selection) {\n function NodeSelection($pos) {\n var node = $pos.nodeAfter;\n var $end = $pos.node(0).resolve($pos.pos + node.nodeSize);\n Selection.call(this, $pos, $end);\n // :: Node The selected node.\n this.node = node;\n }\n\n if ( Selection ) NodeSelection.__proto__ = Selection;\n NodeSelection.prototype = Object.create( Selection && Selection.prototype );\n NodeSelection.prototype.constructor = NodeSelection;\n\n NodeSelection.prototype.map = function map (doc, mapping) {\n var ref = mapping.mapResult(this.anchor);\n var deleted = ref.deleted;\n var pos = ref.pos;\n var $pos = doc.resolve(pos);\n if (deleted) { return Selection.near($pos) }\n return new NodeSelection($pos)\n };\n\n NodeSelection.prototype.content = function content () {\n return new Slice(Fragment.from(this.node), 0, 0)\n };\n\n NodeSelection.prototype.eq = function eq (other) {\n return other instanceof NodeSelection && other.anchor == this.anchor\n };\n\n NodeSelection.prototype.toJSON = function toJSON () {\n return {type: \"node\", anchor: this.anchor}\n };\n\n NodeSelection.prototype.getBookmark = function getBookmark () { return new NodeBookmark(this.anchor) };\n\n NodeSelection.fromJSON = function fromJSON (doc, json) {\n if (typeof json.anchor != \"number\")\n { throw new RangeError(\"Invalid input for NodeSelection.fromJSON\") }\n return new NodeSelection(doc.resolve(json.anchor))\n };\n\n // :: (Node, number) → NodeSelection\n // Create a node selection from non-resolved positions.\n NodeSelection.create = function create (doc, from) {\n return new this(doc.resolve(from))\n };\n\n // :: (Node) → bool\n // Determines whether the given node may be selected as a node\n // selection.\n NodeSelection.isSelectable = function isSelectable (node) {\n return !node.isText && node.type.spec.selectable !== false\n };\n\n return NodeSelection;\n}(Selection));\n\nNodeSelection.prototype.visible = false;\n\nSelection.jsonID(\"node\", NodeSelection);\n\nvar NodeBookmark = function NodeBookmark(anchor) {\n this.anchor = anchor;\n};\nNodeBookmark.prototype.map = function map (mapping) {\n var ref = mapping.mapResult(this.anchor);\n var deleted = ref.deleted;\n var pos = ref.pos;\n return deleted ? new TextBookmark(pos, pos) : new NodeBookmark(pos)\n};\nNodeBookmark.prototype.resolve = function resolve (doc) {\n var $pos = doc.resolve(this.anchor), node = $pos.nodeAfter;\n if (node && NodeSelection.isSelectable(node)) { return new NodeSelection($pos) }\n return Selection.near($pos)\n};\n\n// ::- A selection type that represents selecting the whole document\n// (which can not necessarily be expressed with a text selection, when\n// there are for example leaf block nodes at the start or end of the\n// document).\nvar AllSelection = /*@__PURE__*/(function (Selection) {\n function AllSelection(doc) {\n Selection.call(this, doc.resolve(0), doc.resolve(doc.content.size));\n }\n\n if ( Selection ) AllSelection.__proto__ = Selection;\n AllSelection.prototype = Object.create( Selection && Selection.prototype );\n AllSelection.prototype.constructor = AllSelection;\n\n AllSelection.prototype.replace = function replace (tr, content) {\n if ( content === void 0 ) content = Slice.empty;\n\n if (content == Slice.empty) {\n tr.delete(0, tr.doc.content.size);\n var sel = Selection.atStart(tr.doc);\n if (!sel.eq(tr.selection)) { tr.setSelection(sel); }\n } else {\n Selection.prototype.replace.call(this, tr, content);\n }\n };\n\n AllSelection.prototype.toJSON = function toJSON () { return {type: \"all\"} };\n\n AllSelection.fromJSON = function fromJSON (doc) { return new AllSelection(doc) };\n\n AllSelection.prototype.map = function map (doc) { return new AllSelection(doc) };\n\n AllSelection.prototype.eq = function eq (other) { return other instanceof AllSelection };\n\n AllSelection.prototype.getBookmark = function getBookmark () { return AllBookmark };\n\n return AllSelection;\n}(Selection));\n\nSelection.jsonID(\"all\", AllSelection);\n\nvar AllBookmark = {\n map: function map() { return this },\n resolve: function resolve(doc) { return new AllSelection(doc) }\n};\n\n// FIXME we'll need some awareness of text direction when scanning for selections\n\n// Try to find a selection inside the given node. `pos` points at the\n// position where the search starts. When `text` is true, only return\n// text selections.\nfunction findSelectionIn(doc, node, pos, index, dir, text) {\n if (node.inlineContent) { return TextSelection.create(doc, pos) }\n for (var i = index - (dir > 0 ? 0 : 1); dir > 0 ? i < node.childCount : i >= 0; i += dir) {\n var child = node.child(i);\n if (!child.isAtom) {\n var inner = findSelectionIn(doc, child, pos + dir, dir < 0 ? child.childCount : 0, dir, text);\n if (inner) { return inner }\n } else if (!text && NodeSelection.isSelectable(child)) {\n return NodeSelection.create(doc, pos - (dir < 0 ? child.nodeSize : 0))\n }\n pos += child.nodeSize * dir;\n }\n}\n\nfunction selectionToInsertionEnd(tr, startLen, bias) {\n var last = tr.steps.length - 1;\n if (last < startLen) { return }\n var step = tr.steps[last];\n if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) { return }\n var map = tr.mapping.maps[last], end;\n map.forEach(function (_from, _to, _newFrom, newTo) { if (end == null) { end = newTo; } });\n tr.setSelection(Selection.near(tr.doc.resolve(end), bias));\n}\n\nvar UPDATED_SEL = 1, UPDATED_MARKS = 2, UPDATED_SCROLL = 4;\n\n// ::- An editor state transaction, which can be applied to a state to\n// create an updated state. Use\n// [`EditorState.tr`](#state.EditorState.tr) to create an instance.\n//\n// Transactions track changes to the document (they are a subclass of\n// [`Transform`](#transform.Transform)), but also other state changes,\n// like selection updates and adjustments of the set of [stored\n// marks](#state.EditorState.storedMarks). In addition, you can store\n// metadata properties in a transaction, which are extra pieces of\n// information that client code or plugins can use to describe what a\n// transacion represents, so that they can update their [own\n// state](#state.StateField) accordingly.\n//\n// The [editor view](#view.EditorView) uses a few metadata properties:\n// it will attach a property `\"pointer\"` with the value `true` to\n// selection transactions directly caused by mouse or touch input, and\n// a `\"uiEvent\"` property of that may be `\"paste\"`, `\"cut\"`, or `\"drop\"`.\nvar Transaction = /*@__PURE__*/(function (Transform) {\n function Transaction(state) {\n Transform.call(this, state.doc);\n // :: number\n // The timestamp associated with this transaction, in the same\n // format as `Date.now()`.\n this.time = Date.now();\n this.curSelection = state.selection;\n // The step count for which the current selection is valid.\n this.curSelectionFor = 0;\n // :: ?[Mark]\n // The stored marks set by this transaction, if any.\n this.storedMarks = state.storedMarks;\n // Bitfield to track which aspects of the state were updated by\n // this transaction.\n this.updated = 0;\n // Object used to store metadata properties for the transaction.\n this.meta = Object.create(null);\n }\n\n if ( Transform ) Transaction.__proto__ = Transform;\n Transaction.prototype = Object.create( Transform && Transform.prototype );\n Transaction.prototype.constructor = Transaction;\n\n var prototypeAccessors = { selection: { configurable: true },selectionSet: { configurable: true },storedMarksSet: { configurable: true },isGeneric: { configurable: true },scrolledIntoView: { configurable: true } };\n\n // :: Selection\n // The transaction's current selection. This defaults to the editor\n // selection [mapped](#state.Selection.map) through the steps in the\n // transaction, but can be overwritten with\n // [`setSelection`](#state.Transaction.setSelection).\n prototypeAccessors.selection.get = function () {\n if (this.curSelectionFor < this.steps.length) {\n this.curSelection = this.curSelection.map(this.doc, this.mapping.slice(this.curSelectionFor));\n this.curSelectionFor = this.steps.length;\n }\n return this.curSelection\n };\n\n // :: (Selection) → Transaction\n // Update the transaction's current selection. Will determine the\n // selection that the editor gets when the transaction is applied.\n Transaction.prototype.setSelection = function setSelection (selection) {\n if (selection.$from.doc != this.doc)\n { throw new RangeError(\"Selection passed to setSelection must point at the current document\") }\n this.curSelection = selection;\n this.curSelectionFor = this.steps.length;\n this.updated = (this.updated | UPDATED_SEL) & ~UPDATED_MARKS;\n this.storedMarks = null;\n return this\n };\n\n // :: bool\n // Whether the selection was explicitly updated by this transaction.\n prototypeAccessors.selectionSet.get = function () {\n return (this.updated & UPDATED_SEL) > 0\n };\n\n // :: (?[Mark]) → Transaction\n // Set the current stored marks.\n Transaction.prototype.setStoredMarks = function setStoredMarks (marks) {\n this.storedMarks = marks;\n this.updated |= UPDATED_MARKS;\n return this\n };\n\n // :: ([Mark]) → Transaction\n // Make sure the current stored marks or, if that is null, the marks\n // at the selection, match the given set of marks. Does nothing if\n // this is already the case.\n Transaction.prototype.ensureMarks = function ensureMarks (marks) {\n if (!Mark.sameSet(this.storedMarks || this.selection.$from.marks(), marks))\n { this.setStoredMarks(marks); }\n return this\n };\n\n // :: (Mark) → Transaction\n // Add a mark to the set of stored marks.\n Transaction.prototype.addStoredMark = function addStoredMark (mark) {\n return this.ensureMarks(mark.addToSet(this.storedMarks || this.selection.$head.marks()))\n };\n\n // :: (union) → Transaction\n // Remove a mark or mark type from the set of stored marks.\n Transaction.prototype.removeStoredMark = function removeStoredMark (mark) {\n return this.ensureMarks(mark.removeFromSet(this.storedMarks || this.selection.$head.marks()))\n };\n\n // :: bool\n // Whether the stored marks were explicitly set for this transaction.\n prototypeAccessors.storedMarksSet.get = function () {\n return (this.updated & UPDATED_MARKS) > 0\n };\n\n Transaction.prototype.addStep = function addStep (step, doc) {\n Transform.prototype.addStep.call(this, step, doc);\n this.updated = this.updated & ~UPDATED_MARKS;\n this.storedMarks = null;\n };\n\n // :: (number) → Transaction\n // Update the timestamp for the transaction.\n Transaction.prototype.setTime = function setTime (time) {\n this.time = time;\n return this\n };\n\n // :: (Slice) → Transaction\n // Replace the current selection with the given slice.\n Transaction.prototype.replaceSelection = function replaceSelection (slice) {\n this.selection.replace(this, slice);\n return this\n };\n\n // :: (Node, ?bool) → Transaction\n // Replace the selection with the given node. When `inheritMarks` is\n // true and the content is inline, it inherits the marks from the\n // place where it is inserted.\n Transaction.prototype.replaceSelectionWith = function replaceSelectionWith (node, inheritMarks) {\n var selection = this.selection;\n if (inheritMarks !== false)\n { node = node.mark(this.storedMarks || (selection.empty ? selection.$from.marks() : (selection.$from.marksAcross(selection.$to) || Mark.none))); }\n selection.replaceWith(this, node);\n return this\n };\n\n // :: () → Transaction\n // Delete the selection.\n Transaction.prototype.deleteSelection = function deleteSelection () {\n this.selection.replace(this);\n return this\n };\n\n // :: (string, from: ?number, to: ?number) → Transaction\n // Replace the given range, or the selection if no range is given,\n // with a text node containing the given string.\n Transaction.prototype.insertText = function insertText (text, from, to) {\n if ( to === void 0 ) to = from;\n\n var schema = this.doc.type.schema;\n if (from == null) {\n if (!text) { return this.deleteSelection() }\n return this.replaceSelectionWith(schema.text(text), true)\n } else {\n if (!text) { return this.deleteRange(from, to) }\n var marks = this.storedMarks;\n if (!marks) {\n var $from = this.doc.resolve(from);\n marks = to == from ? $from.marks() : $from.marksAcross(this.doc.resolve(to));\n }\n this.replaceRangeWith(from, to, schema.text(text, marks));\n if (!this.selection.empty) { this.setSelection(Selection.near(this.selection.$to)); }\n return this\n }\n };\n\n // :: (union, any) → Transaction\n // Store a metadata property in this transaction, keyed either by\n // name or by plugin.\n Transaction.prototype.setMeta = function setMeta (key, value) {\n this.meta[typeof key == \"string\" ? key : key.key] = value;\n return this\n };\n\n // :: (union) → any\n // Retrieve a metadata property for a given name or plugin.\n Transaction.prototype.getMeta = function getMeta (key) {\n return this.meta[typeof key == \"string\" ? key : key.key]\n };\n\n // :: bool\n // Returns true if this transaction doesn't contain any metadata,\n // and can thus safely be extended.\n prototypeAccessors.isGeneric.get = function () {\n for (var _ in this.meta) { return false }\n return true\n };\n\n // :: () → Transaction\n // Indicate that the editor should scroll the selection into view\n // when updated to the state produced by this transaction.\n Transaction.prototype.scrollIntoView = function scrollIntoView () {\n this.updated |= UPDATED_SCROLL;\n return this\n };\n\n prototypeAccessors.scrolledIntoView.get = function () {\n return (this.updated & UPDATED_SCROLL) > 0\n };\n\n Object.defineProperties( Transaction.prototype, prototypeAccessors );\n\n return Transaction;\n}(Transform));\n\nfunction bind(f, self) {\n return !self || !f ? f : f.bind(self)\n}\n\nvar FieldDesc = function FieldDesc(name, desc, self) {\n this.name = name;\n this.init = bind(desc.init, self);\n this.apply = bind(desc.apply, self);\n};\n\nvar baseFields = [\n new FieldDesc(\"doc\", {\n init: function init(config) { return config.doc || config.schema.topNodeType.createAndFill() },\n apply: function apply(tr) { return tr.doc }\n }),\n\n new FieldDesc(\"selection\", {\n init: function init(config, instance) { return config.selection || Selection.atStart(instance.doc) },\n apply: function apply(tr) { return tr.selection }\n }),\n\n new FieldDesc(\"storedMarks\", {\n init: function init(config) { return config.storedMarks || null },\n apply: function apply(tr, _marks, _old, state) { return state.selection.$cursor ? tr.storedMarks : null }\n }),\n\n new FieldDesc(\"scrollToSelection\", {\n init: function init() { return 0 },\n apply: function apply(tr, prev) { return tr.scrolledIntoView ? prev + 1 : prev }\n })\n];\n\n// Object wrapping the part of a state object that stays the same\n// across transactions. Stored in the state's `config` property.\nvar Configuration = function Configuration(schema, plugins) {\n var this$1 = this;\n\n this.schema = schema;\n this.fields = baseFields.concat();\n this.plugins = [];\n this.pluginsByKey = Object.create(null);\n if (plugins) { plugins.forEach(function (plugin) {\n if (this$1.pluginsByKey[plugin.key])\n { throw new RangeError(\"Adding different instances of a keyed plugin (\" + plugin.key + \")\") }\n this$1.plugins.push(plugin);\n this$1.pluginsByKey[plugin.key] = plugin;\n if (plugin.spec.state)\n { this$1.fields.push(new FieldDesc(plugin.key, plugin.spec.state, plugin)); }\n }); }\n};\n\n// ::- The state of a ProseMirror editor is represented by an object\n// of this type. A state is a persistent data structure—it isn't\n// updated, but rather a new state value is computed from an old one\n// using the [`apply`](#state.EditorState.apply) method.\n//\n// A state holds a number of built-in fields, and plugins can\n// [define](#state.PluginSpec.state) additional fields.\nvar EditorState = function EditorState(config) {\n this.config = config;\n};\n\nvar prototypeAccessors$1 = { schema: { configurable: true },plugins: { configurable: true },tr: { configurable: true } };\n\n// doc:: Node\n// The current document.\n\n// selection:: Selection\n// The selection.\n\n// storedMarks:: ?[Mark]\n// A set of marks to apply to the next input. Will be null when\n// no explicit marks have been set.\n\n// :: Schema\n// The schema of the state's document.\nprototypeAccessors$1.schema.get = function () {\n return this.config.schema\n};\n\n// :: [Plugin]\n// The plugins that are active in this state.\nprototypeAccessors$1.plugins.get = function () {\n return this.config.plugins\n};\n\n// :: (Transaction) → EditorState\n// Apply the given transaction to produce a new state.\nEditorState.prototype.apply = function apply (tr) {\n return this.applyTransaction(tr).state\n};\n\n// : (Transaction) → bool\nEditorState.prototype.filterTransaction = function filterTransaction (tr, ignore) {\n if ( ignore === void 0 ) ignore = -1;\n\n for (var i = 0; i < this.config.plugins.length; i++) { if (i != ignore) {\n var plugin = this.config.plugins[i];\n if (plugin.spec.filterTransaction && !plugin.spec.filterTransaction.call(plugin, tr, this))\n { return false }\n } }\n return true\n};\n\n// :: (Transaction) → {state: EditorState, transactions: [Transaction]}\n// Verbose variant of [`apply`](#state.EditorState.apply) that\n// returns the precise transactions that were applied (which might\n// be influenced by the [transaction\n// hooks](#state.PluginSpec.filterTransaction) of\n// plugins) along with the new state.\nEditorState.prototype.applyTransaction = function applyTransaction (rootTr) {\n if (!this.filterTransaction(rootTr)) { return {state: this, transactions: []} }\n\n var trs = [rootTr], newState = this.applyInner(rootTr), seen = null;\n // This loop repeatedly gives plugins a chance to respond to\n // transactions as new transactions are added, making sure to only\n // pass the transactions the plugin did not see before.\n for (;;) {\n var haveNew = false;\n for (var i = 0; i < this.config.plugins.length; i++) {\n var plugin = this.config.plugins[i];\n if (plugin.spec.appendTransaction) {\n var n = seen ? seen[i].n : 0, oldState = seen ? seen[i].state : this;\n var tr = n < trs.length &&\n plugin.spec.appendTransaction.call(plugin, n ? trs.slice(n) : trs, oldState, newState);\n if (tr && newState.filterTransaction(tr, i)) {\n tr.setMeta(\"appendedTransaction\", rootTr);\n if (!seen) {\n seen = [];\n for (var j = 0; j < this.config.plugins.length; j++)\n { seen.push(j < i ? {state: newState, n: trs.length} : {state: this, n: 0}); }\n }\n trs.push(tr);\n newState = newState.applyInner(tr);\n haveNew = true;\n }\n if (seen) { seen[i] = {state: newState, n: trs.length}; }\n }\n }\n if (!haveNew) { return {state: newState, transactions: trs} }\n }\n};\n\n// : (Transaction) → EditorState\nEditorState.prototype.applyInner = function applyInner (tr) {\n if (!tr.before.eq(this.doc)) { throw new RangeError(\"Applying a mismatched transaction\") }\n var newInstance = new EditorState(this.config), fields = this.config.fields;\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n newInstance[field.name] = field.apply(tr, this[field.name], this, newInstance);\n }\n for (var i$1 = 0; i$1 < applyListeners.length; i$1++) { applyListeners[i$1](this, tr, newInstance); }\n return newInstance\n};\n\n// :: Transaction\n// Start a [transaction](#state.Transaction) from this state.\nprototypeAccessors$1.tr.get = function () { return new Transaction(this) };\n\n// :: (Object) → EditorState\n// Create a new state.\n//\n// config::- Configuration options. Must contain `schema` or `doc` (or both).\n//\n// schema:: ?Schema\n// The schema to use (only relevant if no `doc` is specified).\n//\n// doc:: ?Node\n// The starting document.\n//\n// selection:: ?Selection\n// A valid selection in the document.\n//\n// storedMarks:: ?[Mark]\n// The initial set of [stored marks](#state.EditorState.storedMarks).\n//\n// plugins:: ?[Plugin]\n// The plugins that should be active in this state.\nEditorState.create = function create (config) {\n var $config = new Configuration(config.doc ? config.doc.type.schema : config.schema, config.plugins);\n var instance = new EditorState($config);\n for (var i = 0; i < $config.fields.length; i++)\n { instance[$config.fields[i].name] = $config.fields[i].init(config, instance); }\n return instance\n};\n\n// :: (Object) → EditorState\n// Create a new state based on this one, but with an adjusted set of\n// active plugins. State fields that exist in both sets of plugins\n// are kept unchanged. Those that no longer exist are dropped, and\n// those that are new are initialized using their\n// [`init`](#state.StateField.init) method, passing in the new\n// configuration object..\n//\n// config::- configuration options\n//\n// plugins:: [Plugin]\n// New set of active plugins.\nEditorState.prototype.reconfigure = function reconfigure (config) {\n var $config = new Configuration(this.schema, config.plugins);\n var fields = $config.fields, instance = new EditorState($config);\n for (var i = 0; i < fields.length; i++) {\n var name = fields[i].name;\n instance[name] = this.hasOwnProperty(name) ? this[name] : fields[i].init(config, instance);\n }\n return instance\n};\n\n// :: (?union, string, number>) → Object\n// Serialize this state to JSON. If you want to serialize the state\n// of plugins, pass an object mapping property names to use in the\n// resulting JSON object to plugin objects. The argument may also be\n// a string or number, in which case it is ignored, to support the\n// way `JSON.stringify` calls `toString` methods.\nEditorState.prototype.toJSON = function toJSON (pluginFields) {\n var result = {doc: this.doc.toJSON(), selection: this.selection.toJSON()};\n if (this.storedMarks) { result.storedMarks = this.storedMarks.map(function (m) { return m.toJSON(); }); }\n if (pluginFields && typeof pluginFields == 'object') { for (var prop in pluginFields) {\n if (prop == \"doc\" || prop == \"selection\")\n { throw new RangeError(\"The JSON fields `doc` and `selection` are reserved\") }\n var plugin = pluginFields[prop], state = plugin.spec.state;\n if (state && state.toJSON) { result[prop] = state.toJSON.call(plugin, this[plugin.key]); }\n } }\n return result\n};\n\n// :: (Object, Object, ?Object) → EditorState\n// Deserialize a JSON representation of a state. `config` should\n// have at least a `schema` field, and should contain array of\n// plugins to initialize the state with. `pluginFields` can be used\n// to deserialize the state of plugins, by associating plugin\n// instances with the property names they use in the JSON object.\n//\n// config::- configuration options\n//\n// schema:: Schema\n// The schema to use.\n//\n// plugins:: ?[Plugin]\n// The set of active plugins.\nEditorState.fromJSON = function fromJSON (config, json, pluginFields) {\n if (!json) { throw new RangeError(\"Invalid input for EditorState.fromJSON\") }\n if (!config.schema) { throw new RangeError(\"Required config field 'schema' missing\") }\n var $config = new Configuration(config.schema, config.plugins);\n var instance = new EditorState($config);\n $config.fields.forEach(function (field) {\n if (field.name == \"doc\") {\n instance.doc = Node.fromJSON(config.schema, json.doc);\n } else if (field.name == \"selection\") {\n instance.selection = Selection.fromJSON(instance.doc, json.selection);\n } else if (field.name == \"storedMarks\") {\n if (json.storedMarks) { instance.storedMarks = json.storedMarks.map(config.schema.markFromJSON); }\n } else {\n if (pluginFields) { for (var prop in pluginFields) {\n var plugin = pluginFields[prop], state = plugin.spec.state;\n if (plugin.key == field.name && state && state.fromJSON &&\n Object.prototype.hasOwnProperty.call(json, prop)) {\n // This field belongs to a plugin mapped to a JSON field, read it from there.\n instance[field.name] = state.fromJSON.call(plugin, config, json[prop], instance);\n return\n }\n } }\n instance[field.name] = field.init(config, instance);\n }\n });\n return instance\n};\n\n// Kludge to allow the view to track mappings between different\n// instances of a state.\n//\n// FIXME this is no longer needed as of prosemirror-view 1.9.0,\n// though due to backwards-compat we should probably keep it around\n// for a while (if only as a no-op)\nEditorState.addApplyListener = function addApplyListener (f) {\n applyListeners.push(f);\n};\nEditorState.removeApplyListener = function removeApplyListener (f) {\n var found = applyListeners.indexOf(f);\n if (found > -1) { applyListeners.splice(found, 1); }\n};\n\nObject.defineProperties( EditorState.prototype, prototypeAccessors$1 );\n\nvar applyListeners = [];\n\n// PluginSpec:: interface\n//\n// This is the type passed to the [`Plugin`](#state.Plugin)\n// constructor. It provides a definition for a plugin.\n//\n// props:: ?EditorProps\n// The [view props](#view.EditorProps) added by this plugin. Props\n// that are functions will be bound to have the plugin instance as\n// their `this` binding.\n//\n// state:: ?StateField\n// Allows a plugin to define a [state field](#state.StateField), an\n// extra slot in the state object in which it can keep its own data.\n//\n// key:: ?PluginKey\n// Can be used to make this a keyed plugin. You can have only one\n// plugin with a given key in a given state, but it is possible to\n// access the plugin's configuration and state through the key,\n// without having access to the plugin instance object.\n//\n// view:: ?(EditorView) → Object\n// When the plugin needs to interact with the editor view, or\n// set something up in the DOM, use this field. The function\n// will be called when the plugin's state is associated with an\n// editor view.\n//\n// return::-\n// Should return an object with the following optional\n// properties:\n//\n// update:: ?(view: EditorView, prevState: EditorState)\n// Called whenever the view's state is updated.\n//\n// destroy:: ?()\n// Called when the view is destroyed or receives a state\n// with different plugins.\n//\n// filterTransaction:: ?(Transaction, EditorState) → bool\n// When present, this will be called before a transaction is\n// applied by the state, allowing the plugin to cancel it (by\n// returning false).\n//\n// appendTransaction:: ?(transactions: [Transaction], oldState: EditorState, newState: EditorState) → ?Transaction\n// Allows the plugin to append another transaction to be applied\n// after the given array of transactions. When another plugin\n// appends a transaction after this was called, it is called again\n// with the new state and new transactions—but only the new\n// transactions, i.e. it won't be passed transactions that it\n// already saw.\n\nfunction bindProps(obj, self, target) {\n for (var prop in obj) {\n var val = obj[prop];\n if (val instanceof Function) { val = val.bind(self); }\n else if (prop == \"handleDOMEvents\") { val = bindProps(val, self, {}); }\n target[prop] = val;\n }\n return target\n}\n\n// ::- Plugins bundle functionality that can be added to an editor.\n// They are part of the [editor state](#state.EditorState) and\n// may influence that state and the view that contains it.\nvar Plugin = function Plugin(spec) {\n // :: EditorProps\n // The [props](#view.EditorProps) exported by this plugin.\n this.props = {};\n if (spec.props) { bindProps(spec.props, this, this.props); }\n // :: Object\n // The plugin's [spec object](#state.PluginSpec).\n this.spec = spec;\n this.key = spec.key ? spec.key.key : createKey(\"plugin\");\n};\n\n// :: (EditorState) → any\n// Extract the plugin's state field from an editor state.\nPlugin.prototype.getState = function getState (state) { return state[this.key] };\n\n// StateField:: interface\n// A plugin spec may provide a state field (under its\n// [`state`](#state.PluginSpec.state) property) of this type, which\n// describes the state it wants to keep. Functions provided here are\n// always called with the plugin instance as their `this` binding.\n//\n// init:: (config: Object, instance: EditorState) → T\n// Initialize the value of the field. `config` will be the object\n// passed to [`EditorState.create`](#state.EditorState^create). Note\n// that `instance` is a half-initialized state instance, and will\n// not have values for plugin fields initialized after this one.\n//\n// apply:: (tr: Transaction, value: T, oldState: EditorState, newState: EditorState) → T\n// Apply the given transaction to this state field, producing a new\n// field value. Note that the `newState` argument is again a partially\n// constructed state does not yet contain the state from plugins\n// coming after this one.\n//\n// toJSON:: ?(value: T) → *\n// Convert this field to JSON. Optional, can be left off to disable\n// JSON serialization for the field.\n//\n// fromJSON:: ?(config: Object, value: *, state: EditorState) → T\n// Deserialize the JSON representation of this field. Note that the\n// `state` argument is again a half-initialized state.\n\nvar keys = Object.create(null);\n\nfunction createKey(name) {\n if (name in keys) { return name + \"$\" + ++keys[name] }\n keys[name] = 0;\n return name + \"$\"\n}\n\n// ::- A key is used to [tag](#state.PluginSpec.key)\n// plugins in a way that makes it possible to find them, given an\n// editor state. Assigning a key does mean only one plugin of that\n// type can be active in a state.\nvar PluginKey = function PluginKey(name) {\nif ( name === void 0 ) name = \"key\";\n this.key = createKey(name); };\n\n// :: (EditorState) → ?Plugin\n// Get the active plugin with this key, if any, from an editor\n// state.\nPluginKey.prototype.get = function get (state) { return state.config.pluginsByKey[this.key] };\n\n// :: (EditorState) → ?any\n// Get the plugin's state from an editor state.\nPluginKey.prototype.getState = function getState (state) { return state[this.key] };\n\nexport { AllSelection, EditorState, NodeSelection, Plugin, PluginKey, Selection, SelectionRange, TextSelection, Transaction };\n//# sourceMappingURL=index.es.js.map\n","import { liftTarget, canJoin, joinPoint, canSplit, ReplaceAroundStep, findWrapping } from 'prosemirror-transform';\nimport { Fragment, Slice } from 'prosemirror-model';\nimport { NodeSelection, Selection, TextSelection, AllSelection } from 'prosemirror-state';\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Delete the selection, if there is one.\nfunction deleteSelection(state, dispatch) {\n if (state.selection.empty) { return false }\n if (dispatch) { dispatch(state.tr.deleteSelection().scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// If the selection is empty and at the start of a textblock, try to\n// reduce the distance between that block and the one before it—if\n// there's a block directly before it that can be joined, join them.\n// If not, try to move the selected block closer to the next one in\n// the document structure by lifting it out of its parent or moving it\n// into a parent of the previous block. Will use the view for accurate\n// (bidi-aware) start-of-textblock detection if given.\nfunction joinBackward(state, dispatch, view) {\n var ref = state.selection;\n var $cursor = ref.$cursor;\n if (!$cursor || (view ? !view.endOfTextblock(\"backward\", state)\n : $cursor.parentOffset > 0))\n { return false }\n\n var $cut = findCutBefore($cursor);\n\n // If there is no node before this, try to lift\n if (!$cut) {\n var range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null) { return false }\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n }\n\n var before = $cut.nodeBefore;\n // Apply the joining algorithm\n if (!before.type.spec.isolating && deleteBarrier(state, $cut, dispatch))\n { return true }\n\n // If the node below has no content and the node above is\n // selectable, delete the node below and select the one above.\n if ($cursor.parent.content.size == 0 &&\n (textblockAt(before, \"end\") || NodeSelection.isSelectable(before))) {\n if (dispatch) {\n var tr = state.tr.deleteRange($cursor.before(), $cursor.after());\n tr.setSelection(textblockAt(before, \"end\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos, -1)), -1)\n : NodeSelection.create(tr.doc, $cut.pos - before.nodeSize));\n dispatch(tr.scrollIntoView());\n }\n return true\n }\n\n // If the node before is an atom, delete it\n if (before.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch) { dispatch(state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView()); }\n return true\n }\n\n return false\n}\n\nfunction textblockAt(node, side) {\n for (; node; node = (side == \"start\" ? node.firstChild : node.lastChild))\n { if (node.isTextblock) { return true } }\n return false\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// When the selection is empty and at the start of a textblock, select\n// the node before that textblock, if possible. This is intended to be\n// bound to keys like backspace, after\n// [`joinBackward`](#commands.joinBackward) or other deleting\n// commands, as a fall-back behavior when the schema doesn't allow\n// deletion at the selected point.\nfunction selectNodeBackward(state, dispatch, view) {\n var ref = state.selection;\n var $head = ref.$head;\n var empty = ref.empty;\n var $cut = $head;\n if (!empty) { return false }\n\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"backward\", state) : $head.parentOffset > 0) { return false }\n $cut = findCutBefore($head);\n }\n var node = $cut && $cut.nodeBefore;\n if (!node || !NodeSelection.isSelectable(node)) { return false }\n if (dispatch)\n { dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView()); }\n return true\n}\n\nfunction findCutBefore($pos) {\n if (!$pos.parent.type.spec.isolating) { for (var i = $pos.depth - 1; i >= 0; i--) {\n if ($pos.index(i) > 0) { return $pos.doc.resolve($pos.before(i + 1)) }\n if ($pos.node(i).type.spec.isolating) { break }\n } }\n return null\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// If the selection is empty and the cursor is at the end of a\n// textblock, try to reduce or remove the boundary between that block\n// and the one after it, either by joining them or by moving the other\n// block closer to this one in the tree structure. Will use the view\n// for accurate start-of-textblock detection if given.\nfunction joinForward(state, dispatch, view) {\n var ref = state.selection;\n var $cursor = ref.$cursor;\n if (!$cursor || (view ? !view.endOfTextblock(\"forward\", state)\n : $cursor.parentOffset < $cursor.parent.content.size))\n { return false }\n\n var $cut = findCutAfter($cursor);\n\n // If there is no node after this, there's nothing to do\n if (!$cut) { return false }\n\n var after = $cut.nodeAfter;\n // Try the joining algorithm\n if (deleteBarrier(state, $cut, dispatch)) { return true }\n\n // If the node above has no content and the node below is\n // selectable, delete the node above and select the one below.\n if ($cursor.parent.content.size == 0 &&\n (textblockAt(after, \"start\") || NodeSelection.isSelectable(after))) {\n if (dispatch) {\n var tr = state.tr.deleteRange($cursor.before(), $cursor.after());\n tr.setSelection(textblockAt(after, \"start\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos)), 1)\n : NodeSelection.create(tr.doc, tr.mapping.map($cut.pos)));\n dispatch(tr.scrollIntoView());\n }\n return true\n }\n\n // If the next node is an atom, delete it\n if (after.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch) { dispatch(state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView()); }\n return true\n }\n\n return false\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// When the selection is empty and at the end of a textblock, select\n// the node coming after that textblock, if possible. This is intended\n// to be bound to keys like delete, after\n// [`joinForward`](#commands.joinForward) and similar deleting\n// commands, to provide a fall-back behavior when the schema doesn't\n// allow deletion at the selected point.\nfunction selectNodeForward(state, dispatch, view) {\n var ref = state.selection;\n var $head = ref.$head;\n var empty = ref.empty;\n var $cut = $head;\n if (!empty) { return false }\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"forward\", state) : $head.parentOffset < $head.parent.content.size)\n { return false }\n $cut = findCutAfter($head);\n }\n var node = $cut && $cut.nodeAfter;\n if (!node || !NodeSelection.isSelectable(node)) { return false }\n if (dispatch)\n { dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos)).scrollIntoView()); }\n return true\n}\n\nfunction findCutAfter($pos) {\n if (!$pos.parent.type.spec.isolating) { for (var i = $pos.depth - 1; i >= 0; i--) {\n var parent = $pos.node(i);\n if ($pos.index(i) + 1 < parent.childCount) { return $pos.doc.resolve($pos.after(i + 1)) }\n if (parent.type.spec.isolating) { break }\n } }\n return null\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Join the selected block or, if there is a text selection, the\n// closest ancestor block of the selection that can be joined, with\n// the sibling above it.\nfunction joinUp(state, dispatch) {\n var sel = state.selection, nodeSel = sel instanceof NodeSelection, point;\n if (nodeSel) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.from)) { return false }\n point = sel.from;\n } else {\n point = joinPoint(state.doc, sel.from, -1);\n if (point == null) { return false }\n }\n if (dispatch) {\n var tr = state.tr.join(point);\n if (nodeSel) { tr.setSelection(NodeSelection.create(tr.doc, point - state.doc.resolve(point).nodeBefore.nodeSize)); }\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Join the selected block, or the closest ancestor of the selection\n// that can be joined, with the sibling after it.\nfunction joinDown(state, dispatch) {\n var sel = state.selection, point;\n if (sel instanceof NodeSelection) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.to)) { return false }\n point = sel.to;\n } else {\n point = joinPoint(state.doc, sel.to, 1);\n if (point == null) { return false }\n }\n if (dispatch)\n { dispatch(state.tr.join(point).scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Lift the selected block, or the closest ancestor block of the\n// selection that can be lifted, out of its parent node.\nfunction lift(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to), target = range && liftTarget(range);\n if (target == null) { return false }\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// If the selection is in a node whose type has a truthy\n// [`code`](#model.NodeSpec.code) property in its spec, replace the\n// selection with a newline character.\nfunction newlineInCode(state, dispatch) {\n var ref = state.selection;\n var $head = ref.$head;\n var $anchor = ref.$anchor;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) { return false }\n if (dispatch) { dispatch(state.tr.insertText(\"\\n\").scrollIntoView()); }\n return true\n}\n\nfunction defaultBlockAt(match) {\n for (var i = 0; i < match.edgeCount; i++) {\n var ref = match.edge(i);\n var type = ref.type;\n if (type.isTextblock && !type.hasRequiredAttrs()) { return type }\n }\n return null\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// When the selection is in a node with a truthy\n// [`code`](#model.NodeSpec.code) property in its spec, create a\n// default block after the code block, and move the cursor there.\nfunction exitCode(state, dispatch) {\n var ref = state.selection;\n var $head = ref.$head;\n var $anchor = ref.$anchor;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) { return false }\n var above = $head.node(-1), after = $head.indexAfter(-1), type = defaultBlockAt(above.contentMatchAt(after));\n if (!above.canReplaceWith(after, after, type)) { return false }\n if (dispatch) {\n var pos = $head.after(), tr = state.tr.replaceWith(pos, pos, type.createAndFill());\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// If a block node is selected, create an empty paragraph before (if\n// it is its parent's first child) or after it.\nfunction createParagraphNear(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n if ($from.parent.inlineContent || $to.parent.inlineContent) { return false }\n var type = defaultBlockAt($from.parent.contentMatchAt($to.indexAfter()));\n if (!type || !type.isTextblock) { return false }\n if (dispatch) {\n var side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos;\n var tr = state.tr.insert(side, type.createAndFill());\n tr.setSelection(TextSelection.create(tr.doc, side + 1));\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// If the cursor is in an empty textblock that can be lifted, lift the\n// block.\nfunction liftEmptyBlock(state, dispatch) {\n var ref = state.selection;\n var $cursor = ref.$cursor;\n if (!$cursor || $cursor.parent.content.size) { return false }\n if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) {\n var before = $cursor.before();\n if (canSplit(state.doc, before)) {\n if (dispatch) { dispatch(state.tr.split(before).scrollIntoView()); }\n return true\n }\n }\n var range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null) { return false }\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Split the parent block of the selection. If the selection is a text\n// selection, also delete its content.\nfunction splitBlock(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n if (state.selection instanceof NodeSelection && state.selection.node.isBlock) {\n if (!$from.parentOffset || !canSplit(state.doc, $from.pos)) { return false }\n if (dispatch) { dispatch(state.tr.split($from.pos).scrollIntoView()); }\n return true\n }\n\n if (!$from.parent.isBlock) { return false }\n\n if (dispatch) {\n var atEnd = $to.parentOffset == $to.parent.content.size;\n var tr = state.tr;\n if (state.selection instanceof TextSelection) { tr.deleteSelection(); }\n var deflt = $from.depth == 0 ? null : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)));\n var types = atEnd && deflt ? [{type: deflt}] : null;\n var can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types);\n if (!types && !can && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt && [{type: deflt}])) {\n types = [{type: deflt}];\n can = true;\n }\n if (can) {\n tr.split(tr.mapping.map($from.pos), 1, types);\n if (!atEnd && !$from.parentOffset && $from.parent.type != deflt &&\n $from.node(-1).canReplace($from.index(-1), $from.indexAfter(-1), Fragment.from([deflt.create(), $from.parent])))\n { tr.setNodeMarkup(tr.mapping.map($from.before()), deflt); }\n }\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Acts like [`splitBlock`](#commands.splitBlock), but without\n// resetting the set of active marks at the cursor.\nfunction splitBlockKeepMarks(state, dispatch) {\n return splitBlock(state, dispatch && (function (tr) {\n var marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n if (marks) { tr.ensureMarks(marks); }\n dispatch(tr);\n }))\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Move the selection to the node wrapping the current selection, if\n// any. (Will not select the document node.)\nfunction selectParentNode(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var to = ref.to;\n var pos;\n var same = $from.sharedDepth(to);\n if (same == 0) { return false }\n pos = $from.before(same);\n if (dispatch) { dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos))); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Select the whole document.\nfunction selectAll(state, dispatch) {\n if (dispatch) { dispatch(state.tr.setSelection(new AllSelection(state.doc))); }\n return true\n}\n\nfunction joinMaybeClear(state, $pos, dispatch) {\n var before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index();\n if (!before || !after || !before.type.compatibleContent(after.type)) { return false }\n if (!before.content.size && $pos.parent.canReplace(index - 1, index)) {\n if (dispatch) { dispatch(state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView()); }\n return true\n }\n if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || canJoin(state.doc, $pos.pos)))\n { return false }\n if (dispatch)\n { dispatch(state.tr\n .clearIncompatible($pos.pos, before.type, before.contentMatchAt(before.childCount))\n .join($pos.pos)\n .scrollIntoView()); }\n return true\n}\n\nfunction deleteBarrier(state, $cut, dispatch) {\n var before = $cut.nodeBefore, after = $cut.nodeAfter, conn, match;\n if (before.type.spec.isolating || after.type.spec.isolating) { return false }\n if (joinMaybeClear(state, $cut, dispatch)) { return true }\n\n var canDelAfter = $cut.parent.canReplace($cut.index(), $cut.index() + 1);\n if (canDelAfter &&\n (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) &&\n match.matchType(conn[0] || after.type).validEnd) {\n if (dispatch) {\n var end = $cut.pos + after.nodeSize, wrap = Fragment.empty;\n for (var i = conn.length - 1; i >= 0; i--)\n { wrap = Fragment.from(conn[i].create(null, wrap)); }\n wrap = Fragment.from(before.copy(wrap));\n var tr = state.tr.step(new ReplaceAroundStep($cut.pos - 1, end, $cut.pos, end, new Slice(wrap, 1, 0), conn.length, true));\n var joinAt = end + 2 * conn.length;\n if (canJoin(tr.doc, joinAt)) { tr.join(joinAt); }\n dispatch(tr.scrollIntoView());\n }\n return true\n }\n\n var selAfter = Selection.findFrom($cut, 1);\n var range = selAfter && selAfter.$from.blockRange(selAfter.$to), target = range && liftTarget(range);\n if (target != null && target >= $cut.depth) {\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n }\n\n if (canDelAfter && after.isTextblock && textblockAt(before, \"end\")) {\n var at = before, wrap$1 = [];\n for (;;) {\n wrap$1.push(at);\n if (at.isTextblock) { break }\n at = at.lastChild;\n }\n if (at.canReplace(at.childCount, at.childCount, after.content)) {\n if (dispatch) {\n var end$1 = Fragment.empty;\n for (var i$1 = wrap$1.length - 1; i$1 >= 0; i$1--) { end$1 = Fragment.from(wrap$1[i$1].copy(end$1)); }\n var tr$1 = state.tr.step(new ReplaceAroundStep($cut.pos - wrap$1.length, $cut.pos + after.nodeSize,\n $cut.pos + 1, $cut.pos + after.nodeSize - 1,\n new Slice(end$1, wrap$1.length, 0), 0, true));\n dispatch(tr$1.scrollIntoView());\n }\n return true\n }\n }\n\n return false\n}\n\n// Parameterized commands\n\n// :: (NodeType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Wrap the selection in a node of the given type with the given\n// attributes.\nfunction wrapIn(nodeType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to), wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping) { return false }\n if (dispatch) { dispatch(state.tr.wrap(range, wrapping).scrollIntoView()); }\n return true\n }\n}\n\n// :: (NodeType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Returns a command that tries to set the selected textblocks to the\n// given node type with the given attributes.\nfunction setBlockType(nodeType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var from = ref.from;\n var to = ref.to;\n var applicable = false;\n state.doc.nodesBetween(from, to, function (node, pos) {\n if (applicable) { return false }\n if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) { return }\n if (node.type == nodeType) {\n applicable = true;\n } else {\n var $pos = state.doc.resolve(pos), index = $pos.index();\n applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n }\n });\n if (!applicable) { return false }\n if (dispatch) { dispatch(state.tr.setBlockType(from, to, nodeType, attrs).scrollIntoView()); }\n return true\n }\n}\n\nfunction markApplies(doc, ranges, type) {\n var loop = function ( i ) {\n var ref = ranges[i];\n var $from = ref.$from;\n var $to = ref.$to;\n var can = $from.depth == 0 ? doc.type.allowsMarkType(type) : false;\n doc.nodesBetween($from.pos, $to.pos, function (node) {\n if (can) { return false }\n can = node.inlineContent && node.type.allowsMarkType(type);\n });\n if (can) { return { v: true } }\n };\n\n for (var i = 0; i < ranges.length; i++) {\n var returned = loop( i );\n\n if ( returned ) return returned.v;\n }\n return false\n}\n\n// :: (MarkType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Create a command function that toggles the given mark with the\n// given attributes. Will return `false` when the current selection\n// doesn't support that mark. This will remove the mark if any marks\n// of that type exist in the selection, or add it otherwise. If the\n// selection is empty, this applies to the [stored\n// marks](#state.EditorState.storedMarks) instead of a range of the\n// document.\nfunction toggleMark(markType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var empty = ref.empty;\n var $cursor = ref.$cursor;\n var ranges = ref.ranges;\n if ((empty && !$cursor) || !markApplies(state.doc, ranges, markType)) { return false }\n if (dispatch) {\n if ($cursor) {\n if (markType.isInSet(state.storedMarks || $cursor.marks()))\n { dispatch(state.tr.removeStoredMark(markType)); }\n else\n { dispatch(state.tr.addStoredMark(markType.create(attrs))); }\n } else {\n var has = false, tr = state.tr;\n for (var i = 0; !has && i < ranges.length; i++) {\n var ref$1 = ranges[i];\n var $from = ref$1.$from;\n var $to = ref$1.$to;\n has = state.doc.rangeHasMark($from.pos, $to.pos, markType);\n }\n for (var i$1 = 0; i$1 < ranges.length; i$1++) {\n var ref$2 = ranges[i$1];\n var $from$1 = ref$2.$from;\n var $to$1 = ref$2.$to;\n if (has) {\n tr.removeMark($from$1.pos, $to$1.pos, markType);\n } else {\n var from = $from$1.pos, to = $to$1.pos, start = $from$1.nodeAfter, end = $to$1.nodeBefore;\n var spaceStart = start && start.isText ? /^\\s*/.exec(start.text)[0].length : 0;\n var spaceEnd = end && end.isText ? /\\s*$/.exec(end.text)[0].length : 0;\n if (from + spaceStart < to) { from += spaceStart; to -= spaceEnd; }\n tr.addMark(from, to, markType.create(attrs));\n }\n }\n dispatch(tr.scrollIntoView());\n }\n }\n return true\n }\n}\n\nfunction wrapDispatchForJoin(dispatch, isJoinable) {\n return function (tr) {\n if (!tr.isGeneric) { return dispatch(tr) }\n\n var ranges = [];\n for (var i = 0; i < tr.mapping.maps.length; i++) {\n var map = tr.mapping.maps[i];\n for (var j = 0; j < ranges.length; j++)\n { ranges[j] = map.map(ranges[j]); }\n map.forEach(function (_s, _e, from, to) { return ranges.push(from, to); });\n }\n\n // Figure out which joinable points exist inside those ranges,\n // by checking all node boundaries in their parent nodes.\n var joinable = [];\n for (var i$1 = 0; i$1 < ranges.length; i$1 += 2) {\n var from = ranges[i$1], to = ranges[i$1 + 1];\n var $from = tr.doc.resolve(from), depth = $from.sharedDepth(to), parent = $from.node(depth);\n for (var index = $from.indexAfter(depth), pos = $from.after(depth + 1); pos <= to; ++index) {\n var after = parent.maybeChild(index);\n if (!after) { break }\n if (index && joinable.indexOf(pos) == -1) {\n var before = parent.child(index - 1);\n if (before.type == after.type && isJoinable(before, after))\n { joinable.push(pos); }\n }\n pos += after.nodeSize;\n }\n }\n // Join the joinable points\n joinable.sort(function (a, b) { return a - b; });\n for (var i$2 = joinable.length - 1; i$2 >= 0; i$2--) {\n if (canJoin(tr.doc, joinable[i$2])) { tr.join(joinable[i$2]); }\n }\n dispatch(tr);\n }\n}\n\n// :: ((state: EditorState, ?(tr: Transaction)) → bool, union<(before: Node, after: Node) → bool, [string]>) → (state: EditorState, ?(tr: Transaction)) → bool\n// Wrap a command so that, when it produces a transform that causes\n// two joinable nodes to end up next to each other, those are joined.\n// Nodes are considered joinable when they are of the same type and\n// when the `isJoinable` predicate returns true for them or, if an\n// array of strings was passed, if their node type name is in that\n// array.\nfunction autoJoin(command, isJoinable) {\n if (Array.isArray(isJoinable)) {\n var types = isJoinable;\n isJoinable = function (node) { return types.indexOf(node.type.name) > -1; };\n }\n return function (state, dispatch) { return command(state, dispatch && wrapDispatchForJoin(dispatch, isJoinable)); }\n}\n\n// :: (...[(EditorState, ?(tr: Transaction), ?EditorView) → bool]) → (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// Combine a number of command functions into a single function (which\n// calls them one by one until one returns true).\nfunction chainCommands() {\n var commands = [], len = arguments.length;\n while ( len-- ) commands[ len ] = arguments[ len ];\n\n return function(state, dispatch, view) {\n for (var i = 0; i < commands.length; i++)\n { if (commands[i](state, dispatch, view)) { return true } }\n return false\n }\n}\n\nvar backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward);\nvar del = chainCommands(deleteSelection, joinForward, selectNodeForward);\n\n// :: Object\n// A basic keymap containing bindings not specific to any schema.\n// Binds the following keys (when multiple commands are listed, they\n// are chained with [`chainCommands`](#commands.chainCommands)):\n//\n// * **Enter** to `newlineInCode`, `createParagraphNear`, `liftEmptyBlock`, `splitBlock`\n// * **Mod-Enter** to `exitCode`\n// * **Backspace** and **Mod-Backspace** to `deleteSelection`, `joinBackward`, `selectNodeBackward`\n// * **Delete** and **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n// * **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n// * **Mod-a** to `selectAll`\nvar pcBaseKeymap = {\n \"Enter\": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock),\n \"Mod-Enter\": exitCode,\n \"Backspace\": backspace,\n \"Mod-Backspace\": backspace,\n \"Delete\": del,\n \"Mod-Delete\": del,\n \"Mod-a\": selectAll\n};\n\n// :: Object\n// A copy of `pcBaseKeymap` that also binds **Ctrl-h** like Backspace,\n// **Ctrl-d** like Delete, **Alt-Backspace** like Ctrl-Backspace, and\n// **Ctrl-Alt-Backspace**, **Alt-Delete**, and **Alt-d** like\n// Ctrl-Delete.\nvar macBaseKeymap = {\n \"Ctrl-h\": pcBaseKeymap[\"Backspace\"],\n \"Alt-Backspace\": pcBaseKeymap[\"Mod-Backspace\"],\n \"Ctrl-d\": pcBaseKeymap[\"Delete\"],\n \"Ctrl-Alt-Backspace\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-Delete\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-d\": pcBaseKeymap[\"Mod-Delete\"]\n};\nfor (var key in pcBaseKeymap) { macBaseKeymap[key] = pcBaseKeymap[key]; }\n\n// declare global: os, navigator\nvar mac = typeof navigator != \"undefined\" ? /Mac/.test(navigator.platform)\n : typeof os != \"undefined\" ? os.platform() == \"darwin\" : false;\n\n// :: Object\n// Depending on the detected platform, this will hold\n// [`pcBasekeymap`](#commands.pcBaseKeymap) or\n// [`macBaseKeymap`](#commands.macBaseKeymap).\nvar baseKeymap = mac ? macBaseKeymap : pcBaseKeymap;\n\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, setBlockType, splitBlock, splitBlockKeepMarks, toggleMark, wrapIn };\n//# sourceMappingURL=index.es.js.map\n","\n /*!\n * tiptap-commands v1.17.0\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { setBlockType, lift, wrapIn } from 'prosemirror-commands';\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, setBlockType, splitBlock, splitBlockKeepMarks, toggleMark, wrapIn } from 'prosemirror-commands';\nimport { liftListItem, wrapInList } from 'prosemirror-schema-list';\nexport { addListNodes, liftListItem, sinkListItem, splitListItem, wrapInList } from 'prosemirror-schema-list';\nimport { InputRule } from 'prosemirror-inputrules';\nexport { textblockTypeInputRule, wrappingInputRule } from 'prosemirror-inputrules';\nimport { Plugin } from 'prosemirror-state';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { getMarkRange, nodeIsActive, findParentNode } from 'tiptap-utils';\n\nfunction insertText (text = '') {\n return (state, dispatch) => {\n const {\n $from\n } = state.selection;\n const {\n pos\n } = $from.pos;\n dispatch(state.tr.insertText(text, pos));\n return true;\n };\n}\n\nfunction getMarksBetween(start, end, state) {\n let marks = [];\n state.doc.nodesBetween(start, end, (node, pos) => {\n marks = [...marks, ...node.marks.map(mark => ({\n start: pos,\n end: pos + node.nodeSize,\n mark\n }))];\n });\n return marks;\n}\n\nfunction markInputRule (regexp, markType, getAttrs) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {\n tr\n } = state;\n const m = match.length - 1;\n let markEnd = end;\n let markStart = start;\n\n if (match[m]) {\n const matchStart = start + match[0].indexOf(match[m - 1]);\n const matchEnd = matchStart + match[m - 1].length - 1;\n const textStart = matchStart + match[m - 1].lastIndexOf(match[m]);\n const textEnd = textStart + match[m].length;\n const excludedMarks = getMarksBetween(start, end, state).filter(item => {\n const {\n excluded\n } = item.mark.type;\n return excluded.find(type => type.name === markType.name);\n }).filter(item => item.end > matchStart);\n\n if (excludedMarks.length) {\n return false;\n }\n\n if (textEnd < matchEnd) {\n tr.delete(textEnd, matchEnd);\n }\n\n if (textStart > matchStart) {\n tr.delete(matchStart, textStart);\n }\n\n markStart = matchStart;\n markEnd = markStart + match[m].length;\n }\n\n tr.addMark(markStart, markEnd, markType.create(attrs));\n tr.removeStoredMark(markType);\n return tr;\n });\n}\n\nfunction nodeInputRule (regexp, type, getAttrs) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {\n tr\n } = state;\n\n if (match[0]) {\n tr.replaceWith(start - 1, end, type.create(attrs));\n }\n\n return tr;\n });\n}\n\nfunction pasteRule (regexp, type, getAttrs) {\n const handler = fragment => {\n const nodes = [];\n fragment.forEach(child => {\n if (child.isText) {\n const {\n text\n } = child;\n let pos = 0;\n let match;\n\n do {\n match = regexp.exec(text);\n\n if (match) {\n const start = match.index;\n const end = start + match[0].length;\n const attrs = getAttrs instanceof Function ? getAttrs(match[0]) : getAttrs;\n\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n }\n\n nodes.push(child.cut(start, end).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } while (match);\n\n if (pos < text.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content)));\n }\n });\n return Fragment.fromArray(nodes);\n };\n\n return new Plugin({\n props: {\n transformPasted: slice => new Slice(handler(slice.content), slice.openStart, slice.openEnd)\n }\n });\n}\n\nfunction markPasteRule (regexp, type, getAttrs) {\n const handler = (fragment, parent) => {\n const nodes = [];\n fragment.forEach(child => {\n if (child.isText) {\n const {\n text,\n marks\n } = child;\n let pos = 0;\n let match;\n const isLink = !!marks.filter(x => x.type.name === 'link')[0]; // eslint-disable-next-line\n\n while (!isLink && (match = regexp.exec(text)) !== null) {\n if (parent && parent.type.allowsMarkType(type) && match[1]) {\n const start = match.index;\n const end = start + match[0].length;\n const textStart = start + match[0].indexOf(match[1]);\n const textEnd = textStart + match[1].length;\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs; // adding text before markdown to nodes\n\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n } // adding the markdown part to nodes\n\n\n nodes.push(child.cut(textStart, textEnd).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } // adding rest of text to nodes\n\n\n if (pos < text.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content, child)));\n }\n });\n return Fragment.fromArray(nodes);\n };\n\n return new Plugin({\n props: {\n transformPasted: slice => new Slice(handler(slice.content), slice.openStart, slice.openEnd)\n }\n });\n}\n\nfunction removeMark (type) {\n return (state, dispatch) => {\n const {\n tr,\n selection\n } = state;\n let {\n from,\n to\n } = selection;\n const {\n $from,\n empty\n } = selection;\n\n if (empty) {\n const range = getMarkRange($from, type);\n from = range.from;\n to = range.to;\n }\n\n tr.removeMark(from, to, type);\n return dispatch(tr);\n };\n}\n\nfunction replaceText (range = null, type, attrs = {}, fragment = Fragment.empty) {\n return (state, dispatch) => {\n const {\n $from,\n $to\n } = state.selection;\n const index = $from.index();\n const from = range ? range.from : $from.pos;\n const to = range ? range.to : $to.pos;\n\n if (!$from.parent.canReplaceWith(index, index, type)) {\n return false;\n }\n\n if (dispatch) {\n dispatch(state.tr.replaceWith(from, to, type.create(attrs, fragment)));\n }\n\n return true;\n };\n}\n\nfunction setInlineBlockType (type, attrs = {}) {\n return (state, dispatch) => {\n const {\n $from\n } = state.selection;\n const index = $from.index();\n\n if (!$from.parent.canReplaceWith(index, index, type)) {\n return false;\n }\n\n if (dispatch) {\n dispatch(state.tr.replaceSelectionWith(type.create(attrs)));\n }\n\n return true;\n };\n}\n\n// see https://github.com/ProseMirror/prosemirror-transform/blob/main/src/structure.js\n// Since this piece of code was \"borrowed\" from prosemirror, ESLint rules are ignored.\n\n/* eslint-disable max-len, no-plusplus, no-undef, eqeqeq */\n\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n const $pos = doc.resolve(pos);\n const base = $pos.depth - depth;\n const innerType = typesAfter && typesAfter[typesAfter.length - 1] || $pos.parent;\n if (base < 0 || $pos.parent.type.spec.isolating || !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) || !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount))) return false;\n\n for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n const node = $pos.node(d);\n const index = $pos.index(d);\n if (node.type.spec.isolating) return false;\n let rest = node.content.cutByIndex(index, node.childCount);\n const after = typesAfter && typesAfter[i] || node;\n if (after != node) rest = rest.replaceChild(0, after.type.create(after.attrs));\n /* Change starts from here */\n // if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n // return false\n\n if (!node.canReplace(index + 1, node.childCount)) return false;\n /* Change ends here */\n }\n\n const index = $pos.indexAfter(base);\n const baseType = typesAfter && typesAfter[0];\n return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n} // this is a copy of splitListItem\n// see https://github.com/ProseMirror/prosemirror-schema-list/blob/main/src/schema-list.js\n\n\nfunction splitToDefaultListItem(itemType) {\n return function (state, dispatch) {\n const {\n $from,\n $to,\n node\n } = state.selection;\n if (node && node.isBlock || $from.depth < 2 || !$from.sameParent($to)) return false;\n const grandParent = $from.node(-1);\n if (grandParent.type != itemType) return false;\n\n if ($from.parent.content.size == 0) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if ($from.depth == 2 || $from.node(-3).type != itemType || $from.index(-2) != $from.node(-2).childCount - 1) return false;\n\n if (dispatch) {\n let wrap = Fragment.empty;\n const keepItem = $from.index(-1) > 0; // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n\n for (let d = $from.depth - (keepItem ? 1 : 2); d >= $from.depth - 3; d--) wrap = Fragment.from($from.node(d).copy(wrap)); // Add a second list item with an empty default start node\n\n\n wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n const tr = state.tr.replace($from.before(keepItem ? null : -1), $from.after(-3), new Slice(wrap, keepItem ? 3 : 2, 2));\n tr.setSelection(state.selection.constructor.near(tr.doc.resolve($from.pos + (keepItem ? 3 : 2))));\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n }\n\n const nextType = $to.pos == $from.end() ? grandParent.contentMatchAt($from.indexAfter(-1)).defaultType : null;\n const tr = state.tr.delete($from.pos, $to.pos);\n /* Change starts from here */\n // let types = nextType && [null, {type: nextType}]\n\n let types = nextType && [{\n type: itemType\n }, {\n type: nextType\n }];\n if (!types) types = [{\n type: itemType\n }, null];\n /* Change ends here */\n\n if (!canSplit(tr.doc, $from.pos, 2, types)) return false;\n if (dispatch) dispatch(tr.split($from.pos, 2, types).scrollIntoView());\n return true;\n };\n}\n/* eslint-enable max-len, no-plusplus, no-undef, eqeqeq */\n\nfunction toggleBlockType (type, toggletype, attrs = {}) {\n return (state, dispatch, view) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return setBlockType(toggletype)(state, dispatch, view);\n }\n\n return setBlockType(type, attrs)(state, dispatch, view);\n };\n}\n\nfunction isList(node, schema) {\n return node.type === schema.nodes.bullet_list || node.type === schema.nodes.ordered_list || node.type === schema.nodes.todo_list;\n}\n\nfunction toggleList(listType, itemType) {\n return (state, dispatch, view) => {\n const {\n schema,\n selection\n } = state;\n const {\n $from,\n $to\n } = selection;\n const range = $from.blockRange($to);\n\n if (!range) {\n return false;\n }\n\n const parentList = findParentNode(node => isList(node, schema))(selection);\n\n if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n if (parentList.node.type === listType) {\n return liftListItem(itemType)(state, dispatch, view);\n }\n\n if (isList(parentList.node, schema) && listType.validContent(parentList.node.content)) {\n const {\n tr\n } = state;\n tr.setNodeMarkup(parentList.pos, listType);\n\n if (dispatch) {\n dispatch(tr);\n }\n\n return false;\n }\n }\n\n return wrapInList(listType)(state, dispatch, view);\n };\n}\n\nfunction toggleWrap (type, attrs = {}) {\n return (state, dispatch, view) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return lift(state, dispatch);\n }\n\n return wrapIn(type, attrs)(state, dispatch, view);\n };\n}\n\nfunction updateMark (type, attrs) {\n return (state, dispatch) => {\n const {\n tr,\n selection,\n doc\n } = state;\n const {\n ranges,\n empty\n } = selection;\n\n if (empty) {\n const {\n from,\n to\n } = getMarkRange(selection.$from, type);\n\n if (doc.rangeHasMark(from, to, type)) {\n tr.removeMark(from, to, type);\n }\n\n tr.addMark(from, to, type.create(attrs));\n } else {\n ranges.forEach(ref$1 => {\n const {\n $to,\n $from\n } = ref$1;\n\n if (doc.rangeHasMark($from.pos, $to.pos, type)) {\n tr.removeMark($from.pos, $to.pos, type);\n }\n\n tr.addMark($from.pos, $to.pos, type.create(attrs));\n });\n }\n\n return dispatch(tr);\n };\n}\n\nexport { insertText, markInputRule, markPasteRule, nodeInputRule, pasteRule, removeMark, replaceText, setInlineBlockType, splitToDefaultListItem, toggleBlockType, toggleList, toggleWrap, updateMark };\n","import { ReplaceError, Slice, Fragment, MarkType } from 'prosemirror-model';\n\n// Mappable:: interface\n// There are several things that positions can be mapped through.\n// Such objects conform to this interface.\n//\n// map:: (pos: number, assoc: ?number) → number\n// Map a position through this object. When given, `assoc` (should\n// be -1 or 1, defaults to 1) determines with which side the\n// position is associated, which determines in which direction to\n// move when a chunk of content is inserted at the mapped position.\n//\n// mapResult:: (pos: number, assoc: ?number) → MapResult\n// Map a position, and return an object containing additional\n// information about the mapping. The result's `deleted` field tells\n// you whether the position was deleted (completely enclosed in a\n// replaced range) during the mapping. When content on only one side\n// is deleted, the position itself is only considered deleted when\n// `assoc` points in the direction of the deleted content.\n\n// Recovery values encode a range index and an offset. They are\n// represented as numbers, because tons of them will be created when\n// mapping, for example, a large number of decorations. The number's\n// lower 16 bits provide the index, the remaining bits the offset.\n//\n// Note: We intentionally don't use bit shift operators to en- and\n// decode these, since those clip to 32 bits, which we might in rare\n// cases want to overflow. A 64-bit float can represent 48-bit\n// integers precisely.\n\nvar lower16 = 0xffff;\nvar factor16 = Math.pow(2, 16);\n\nfunction makeRecover(index, offset) { return index + offset * factor16 }\nfunction recoverIndex(value) { return value & lower16 }\nfunction recoverOffset(value) { return (value - (value & lower16)) / factor16 }\n\n// ::- An object representing a mapped position with extra\n// information.\nvar MapResult = function MapResult(pos, deleted, recover) {\n if ( deleted === void 0 ) deleted = false;\n if ( recover === void 0 ) recover = null;\n\n // :: number The mapped version of the position.\n this.pos = pos;\n // :: bool Tells you whether the position was deleted, that is,\n // whether the step removed its surroundings from the document.\n this.deleted = deleted;\n this.recover = recover;\n};\n\n// :: class extends Mappable\n// A map describing the deletions and insertions made by a step, which\n// can be used to find the correspondence between positions in the\n// pre-step version of a document and the same position in the\n// post-step version.\nvar StepMap = function StepMap(ranges, inverted) {\n if ( inverted === void 0 ) inverted = false;\n\n this.ranges = ranges;\n this.inverted = inverted;\n};\n\nStepMap.prototype.recover = function recover (value) {\n var diff = 0, index = recoverIndex(value);\n if (!this.inverted) { for (var i = 0; i < index; i++)\n { diff += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1]; } }\n return this.ranges[index * 3] + diff + recoverOffset(value)\n};\n\n// : (number, ?number) → MapResult\nStepMap.prototype.mapResult = function mapResult (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n return this._map(pos, assoc, false) };\n\n// : (number, ?number) → number\nStepMap.prototype.map = function map (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n return this._map(pos, assoc, true) };\n\nStepMap.prototype._map = function _map (pos, assoc, simple) {\n var diff = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (var i = 0; i < this.ranges.length; i += 3) {\n var start = this.ranges[i] - (this.inverted ? diff : 0);\n if (start > pos) { break }\n var oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end = start + oldSize;\n if (pos <= end) {\n var side = !oldSize ? assoc : pos == start ? -1 : pos == end ? 1 : assoc;\n var result = start + diff + (side < 0 ? 0 : newSize);\n if (simple) { return result }\n var recover = pos == (assoc < 0 ? start : end) ? null : makeRecover(i / 3, pos - start);\n return new MapResult(result, assoc < 0 ? pos != start : pos != end, recover)\n }\n diff += newSize - oldSize;\n }\n return simple ? pos + diff : new MapResult(pos + diff)\n};\n\nStepMap.prototype.touches = function touches (pos, recover) {\n var diff = 0, index = recoverIndex(recover);\n var oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (var i = 0; i < this.ranges.length; i += 3) {\n var start = this.ranges[i] - (this.inverted ? diff : 0);\n if (start > pos) { break }\n var oldSize = this.ranges[i + oldIndex], end = start + oldSize;\n if (pos <= end && i == index * 3) { return true }\n diff += this.ranges[i + newIndex] - oldSize;\n }\n return false\n};\n\n// :: ((oldStart: number, oldEnd: number, newStart: number, newEnd: number))\n// Calls the given function on each of the changed ranges included in\n// this map.\nStepMap.prototype.forEach = function forEach (f) {\n var oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (var i = 0, diff = 0; i < this.ranges.length; i += 3) {\n var start = this.ranges[i], oldStart = start - (this.inverted ? diff : 0), newStart = start + (this.inverted ? 0 : diff);\n var oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex];\n f(oldStart, oldStart + oldSize, newStart, newStart + newSize);\n diff += newSize - oldSize;\n }\n};\n\n// :: () → StepMap\n// Create an inverted version of this map. The result can be used to\n// map positions in the post-step document to the pre-step document.\nStepMap.prototype.invert = function invert () {\n return new StepMap(this.ranges, !this.inverted)\n};\n\nStepMap.prototype.toString = function toString () {\n return (this.inverted ? \"-\" : \"\") + JSON.stringify(this.ranges)\n};\n\n// :: (n: number) → StepMap\n// Create a map that moves all positions by offset `n` (which may be\n// negative). This can be useful when applying steps meant for a\n// sub-document to a larger document, or vice-versa.\nStepMap.offset = function offset (n) {\n return n == 0 ? StepMap.empty : new StepMap(n < 0 ? [0, -n, 0] : [0, 0, n])\n};\n\nStepMap.empty = new StepMap([]);\n\n// :: class extends Mappable\n// A mapping represents a pipeline of zero or more [step\n// maps](#transform.StepMap). It has special provisions for losslessly\n// handling mapping positions through a series of steps in which some\n// steps are inverted versions of earlier steps. (This comes up when\n// ‘[rebasing](/docs/guide/#transform.rebasing)’ steps for\n// collaboration or history management.)\nvar Mapping = function Mapping(maps, mirror, from, to) {\n // :: [StepMap]\n // The step maps in this mapping.\n this.maps = maps || [];\n // :: number\n // The starting position in the `maps` array, used when `map` or\n // `mapResult` is called.\n this.from = from || 0;\n // :: number\n // The end position in the `maps` array.\n this.to = to == null ? this.maps.length : to;\n this.mirror = mirror;\n};\n\n// :: (?number, ?number) → Mapping\n// Create a mapping that maps only through a part of this one.\nMapping.prototype.slice = function slice (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.maps.length;\n\n return new Mapping(this.maps, this.mirror, from, to)\n};\n\nMapping.prototype.copy = function copy () {\n return new Mapping(this.maps.slice(), this.mirror && this.mirror.slice(), this.from, this.to)\n};\n\n// :: (StepMap, ?number)\n// Add a step map to the end of this mapping. If `mirrors` is\n// given, it should be the index of the step map that is the mirror\n// image of this one.\nMapping.prototype.appendMap = function appendMap (map, mirrors) {\n this.to = this.maps.push(map);\n if (mirrors != null) { this.setMirror(this.maps.length - 1, mirrors); }\n};\n\n// :: (Mapping)\n// Add all the step maps in a given mapping to this one (preserving\n// mirroring information).\nMapping.prototype.appendMapping = function appendMapping (mapping) {\n for (var i = 0, startSize = this.maps.length; i < mapping.maps.length; i++) {\n var mirr = mapping.getMirror(i);\n this.appendMap(mapping.maps[i], mirr != null && mirr < i ? startSize + mirr : null);\n }\n};\n\n// :: (number) → ?number\n// Finds the offset of the step map that mirrors the map at the\n// given offset, in this mapping (as per the second argument to\n// `appendMap`).\nMapping.prototype.getMirror = function getMirror (n) {\n if (this.mirror) { for (var i = 0; i < this.mirror.length; i++)\n { if (this.mirror[i] == n) { return this.mirror[i + (i % 2 ? -1 : 1)] } } }\n};\n\nMapping.prototype.setMirror = function setMirror (n, m) {\n if (!this.mirror) { this.mirror = []; }\n this.mirror.push(n, m);\n};\n\n// :: (Mapping)\n// Append the inverse of the given mapping to this one.\nMapping.prototype.appendMappingInverted = function appendMappingInverted (mapping) {\n for (var i = mapping.maps.length - 1, totalSize = this.maps.length + mapping.maps.length; i >= 0; i--) {\n var mirr = mapping.getMirror(i);\n this.appendMap(mapping.maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : null);\n }\n};\n\n// :: () → Mapping\n// Create an inverted version of this mapping.\nMapping.prototype.invert = function invert () {\n var inverse = new Mapping;\n inverse.appendMappingInverted(this);\n return inverse\n};\n\n// : (number, ?number) → number\n// Map a position through this mapping.\nMapping.prototype.map = function map (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n\n if (this.mirror) { return this._map(pos, assoc, true) }\n for (var i = this.from; i < this.to; i++)\n { pos = this.maps[i].map(pos, assoc); }\n return pos\n};\n\n// : (number, ?number) → MapResult\n// Map a position through this mapping, returning a mapping\n// result.\nMapping.prototype.mapResult = function mapResult (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n return this._map(pos, assoc, false) };\n\nMapping.prototype._map = function _map (pos, assoc, simple) {\n var deleted = false;\n\n for (var i = this.from; i < this.to; i++) {\n var map = this.maps[i], result = map.mapResult(pos, assoc);\n if (result.recover != null) {\n var corr = this.getMirror(i);\n if (corr != null && corr > i && corr < this.to) {\n i = corr;\n pos = this.maps[corr].recover(result.recover);\n continue\n }\n }\n\n if (result.deleted) { deleted = true; }\n pos = result.pos;\n }\n\n return simple ? pos : new MapResult(pos, deleted)\n};\n\nfunction TransformError(message) {\n var err = Error.call(this, message);\n err.__proto__ = TransformError.prototype;\n return err\n}\n\nTransformError.prototype = Object.create(Error.prototype);\nTransformError.prototype.constructor = TransformError;\nTransformError.prototype.name = \"TransformError\";\n\n// ::- Abstraction to build up and track an array of\n// [steps](#transform.Step) representing a document transformation.\n//\n// Most transforming methods return the `Transform` object itself, so\n// that they can be chained.\nvar Transform = function Transform(doc) {\n // :: Node\n // The current document (the result of applying the steps in the\n // transform).\n this.doc = doc;\n // :: [Step]\n // The steps in this transform.\n this.steps = [];\n // :: [Node]\n // The documents before each of the steps.\n this.docs = [];\n // :: Mapping\n // A mapping with the maps for each of the steps in this transform.\n this.mapping = new Mapping;\n};\n\nvar prototypeAccessors = { before: { configurable: true },docChanged: { configurable: true } };\n\n// :: Node The starting document.\nprototypeAccessors.before.get = function () { return this.docs.length ? this.docs[0] : this.doc };\n\n// :: (step: Step) → this\n// Apply a new step in this transform, saving the result. Throws an\n// error when the step fails.\nTransform.prototype.step = function step (object) {\n var result = this.maybeStep(object);\n if (result.failed) { throw new TransformError(result.failed) }\n return this\n};\n\n// :: (Step) → StepResult\n// Try to apply a step in this transformation, ignoring it if it\n// fails. Returns the step result.\nTransform.prototype.maybeStep = function maybeStep (step) {\n var result = step.apply(this.doc);\n if (!result.failed) { this.addStep(step, result.doc); }\n return result\n};\n\n// :: bool\n// True when the document has been changed (when there are any\n// steps).\nprototypeAccessors.docChanged.get = function () {\n return this.steps.length > 0\n};\n\nTransform.prototype.addStep = function addStep (step, doc) {\n this.docs.push(this.doc);\n this.steps.push(step);\n this.mapping.appendMap(step.getMap());\n this.doc = doc;\n};\n\nObject.defineProperties( Transform.prototype, prototypeAccessors );\n\nfunction mustOverride() { throw new Error(\"Override me\") }\n\nvar stepsByID = Object.create(null);\n\n// ::- A step object represents an atomic change. It generally applies\n// only to the document it was created for, since the positions\n// stored in it will only make sense for that document.\n//\n// New steps are defined by creating classes that extend `Step`,\n// overriding the `apply`, `invert`, `map`, `getMap` and `fromJSON`\n// methods, and registering your class with a unique\n// JSON-serialization identifier using\n// [`Step.jsonID`](#transform.Step^jsonID).\nvar Step = function Step () {};\n\nStep.prototype.apply = function apply (_doc) { return mustOverride() };\n\n// :: () → StepMap\n// Get the step map that represents the changes made by this step,\n// and which can be used to transform between positions in the old\n// and the new document.\nStep.prototype.getMap = function getMap () { return StepMap.empty };\n\n// :: (doc: Node) → Step\n// Create an inverted version of this step. Needs the document as it\n// was before the step as argument.\nStep.prototype.invert = function invert (_doc) { return mustOverride() };\n\n// :: (mapping: Mappable) → ?Step\n// Map this step through a mappable thing, returning either a\n// version of that step with its positions adjusted, or `null` if\n// the step was entirely deleted by the mapping.\nStep.prototype.map = function map (_mapping) { return mustOverride() };\n\n// :: (other: Step) → ?Step\n// Try to merge this step with another one, to be applied directly\n// after it. Returns the merged step when possible, null if the\n// steps can't be merged.\nStep.prototype.merge = function merge (_other) { return null };\n\n// :: () → Object\n// Create a JSON-serializeable representation of this step. When\n// defining this for a custom subclass, make sure the result object\n// includes the step type's [JSON id](#transform.Step^jsonID) under\n// the `stepType` property.\nStep.prototype.toJSON = function toJSON () { return mustOverride() };\n\n// :: (Schema, Object) → Step\n// Deserialize a step from its JSON representation. Will call\n// through to the step class' own implementation of this method.\nStep.fromJSON = function fromJSON (schema, json) {\n if (!json || !json.stepType) { throw new RangeError(\"Invalid input for Step.fromJSON\") }\n var type = stepsByID[json.stepType];\n if (!type) { throw new RangeError((\"No step type \" + (json.stepType) + \" defined\")) }\n return type.fromJSON(schema, json)\n};\n\n// :: (string, constructor)\n// To be able to serialize steps to JSON, each step needs a string\n// ID to attach to its JSON representation. Use this method to\n// register an ID for your step classes. Try to pick something\n// that's unlikely to clash with steps from other modules.\nStep.jsonID = function jsonID (id, stepClass) {\n if (id in stepsByID) { throw new RangeError(\"Duplicate use of step JSON ID \" + id) }\n stepsByID[id] = stepClass;\n stepClass.prototype.jsonID = id;\n return stepClass\n};\n\n// ::- The result of [applying](#transform.Step.apply) a step. Contains either a\n// new document or a failure value.\nvar StepResult = function StepResult(doc, failed) {\n // :: ?Node The transformed document.\n this.doc = doc;\n // :: ?string Text providing information about a failed step.\n this.failed = failed;\n};\n\n// :: (Node) → StepResult\n// Create a successful step result.\nStepResult.ok = function ok (doc) { return new StepResult(doc, null) };\n\n// :: (string) → StepResult\n// Create a failed step result.\nStepResult.fail = function fail (message) { return new StepResult(null, message) };\n\n// :: (Node, number, number, Slice) → StepResult\n// Call [`Node.replace`](#model.Node.replace) with the given\n// arguments. Create a successful result if it succeeds, and a\n// failed one if it throws a `ReplaceError`.\nStepResult.fromReplace = function fromReplace (doc, from, to, slice) {\n try {\n return StepResult.ok(doc.replace(from, to, slice))\n } catch (e) {\n if (e instanceof ReplaceError) { return StepResult.fail(e.message) }\n throw e\n }\n};\n\n// ::- Replace a part of the document with a slice of new content.\nvar ReplaceStep = /*@__PURE__*/(function (Step) {\n function ReplaceStep(from, to, slice, structure) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.slice = slice;\n this.structure = !!structure;\n }\n\n if ( Step ) ReplaceStep.__proto__ = Step;\n ReplaceStep.prototype = Object.create( Step && Step.prototype );\n ReplaceStep.prototype.constructor = ReplaceStep;\n\n ReplaceStep.prototype.apply = function apply (doc) {\n if (this.structure && contentBetween(doc, this.from, this.to))\n { return StepResult.fail(\"Structure replace would overwrite content\") }\n return StepResult.fromReplace(doc, this.from, this.to, this.slice)\n };\n\n ReplaceStep.prototype.getMap = function getMap () {\n return new StepMap([this.from, this.to - this.from, this.slice.size])\n };\n\n ReplaceStep.prototype.invert = function invert (doc) {\n return new ReplaceStep(this.from, this.from + this.slice.size, doc.slice(this.from, this.to))\n };\n\n ReplaceStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted) { return null }\n return new ReplaceStep(from.pos, Math.max(from.pos, to.pos), this.slice)\n };\n\n ReplaceStep.prototype.merge = function merge (other) {\n if (!(other instanceof ReplaceStep) || other.structure != this.structure) { return null }\n\n if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) {\n var slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd);\n return new ReplaceStep(this.from, this.to + (other.to - other.from), slice, this.structure)\n } else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) {\n var slice$1 = this.slice.size + other.slice.size == 0 ? Slice.empty\n : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd);\n return new ReplaceStep(other.from, this.to, slice$1, this.structure)\n } else {\n return null\n }\n };\n\n ReplaceStep.prototype.toJSON = function toJSON () {\n var json = {stepType: \"replace\", from: this.from, to: this.to};\n if (this.slice.size) { json.slice = this.slice.toJSON(); }\n if (this.structure) { json.structure = true; }\n return json\n };\n\n ReplaceStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n { throw new RangeError(\"Invalid input for ReplaceStep.fromJSON\") }\n return new ReplaceStep(json.from, json.to, Slice.fromJSON(schema, json.slice), !!json.structure)\n };\n\n return ReplaceStep;\n}(Step));\n\nStep.jsonID(\"replace\", ReplaceStep);\n\n// ::- Replace a part of the document with a slice of content, but\n// preserve a range of the replaced content by moving it into the\n// slice.\nvar ReplaceAroundStep = /*@__PURE__*/(function (Step) {\n function ReplaceAroundStep(from, to, gapFrom, gapTo, slice, insert, structure) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.gapFrom = gapFrom;\n this.gapTo = gapTo;\n this.slice = slice;\n this.insert = insert;\n this.structure = !!structure;\n }\n\n if ( Step ) ReplaceAroundStep.__proto__ = Step;\n ReplaceAroundStep.prototype = Object.create( Step && Step.prototype );\n ReplaceAroundStep.prototype.constructor = ReplaceAroundStep;\n\n ReplaceAroundStep.prototype.apply = function apply (doc) {\n if (this.structure && (contentBetween(doc, this.from, this.gapFrom) ||\n contentBetween(doc, this.gapTo, this.to)))\n { return StepResult.fail(\"Structure gap-replace would overwrite content\") }\n\n var gap = doc.slice(this.gapFrom, this.gapTo);\n if (gap.openStart || gap.openEnd)\n { return StepResult.fail(\"Gap is not a flat range\") }\n var inserted = this.slice.insertAt(this.insert, gap.content);\n if (!inserted) { return StepResult.fail(\"Content does not fit in gap\") }\n return StepResult.fromReplace(doc, this.from, this.to, inserted)\n };\n\n ReplaceAroundStep.prototype.getMap = function getMap () {\n return new StepMap([this.from, this.gapFrom - this.from, this.insert,\n this.gapTo, this.to - this.gapTo, this.slice.size - this.insert])\n };\n\n ReplaceAroundStep.prototype.invert = function invert (doc) {\n var gap = this.gapTo - this.gapFrom;\n return new ReplaceAroundStep(this.from, this.from + this.slice.size + gap,\n this.from + this.insert, this.from + this.insert + gap,\n doc.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from),\n this.gapFrom - this.from, this.structure)\n };\n\n ReplaceAroundStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n var gapFrom = mapping.map(this.gapFrom, -1), gapTo = mapping.map(this.gapTo, 1);\n if ((from.deleted && to.deleted) || gapFrom < from.pos || gapTo > to.pos) { return null }\n return new ReplaceAroundStep(from.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure)\n };\n\n ReplaceAroundStep.prototype.toJSON = function toJSON () {\n var json = {stepType: \"replaceAround\", from: this.from, to: this.to,\n gapFrom: this.gapFrom, gapTo: this.gapTo, insert: this.insert};\n if (this.slice.size) { json.slice = this.slice.toJSON(); }\n if (this.structure) { json.structure = true; }\n return json\n };\n\n ReplaceAroundStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\" ||\n typeof json.gapFrom != \"number\" || typeof json.gapTo != \"number\" || typeof json.insert != \"number\")\n { throw new RangeError(\"Invalid input for ReplaceAroundStep.fromJSON\") }\n return new ReplaceAroundStep(json.from, json.to, json.gapFrom, json.gapTo,\n Slice.fromJSON(schema, json.slice), json.insert, !!json.structure)\n };\n\n return ReplaceAroundStep;\n}(Step));\n\nStep.jsonID(\"replaceAround\", ReplaceAroundStep);\n\nfunction contentBetween(doc, from, to) {\n var $from = doc.resolve(from), dist = to - from, depth = $from.depth;\n while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) {\n depth--;\n dist--;\n }\n if (dist > 0) {\n var next = $from.node(depth).maybeChild($from.indexAfter(depth));\n while (dist > 0) {\n if (!next || next.isLeaf) { return true }\n next = next.firstChild;\n dist--;\n }\n }\n return false\n}\n\nfunction canCut(node, start, end) {\n return (start == 0 || node.canReplace(start, node.childCount)) &&\n (end == node.childCount || node.canReplace(0, end))\n}\n\n// :: (NodeRange) → ?number\n// Try to find a target depth to which the content in the given range\n// can be lifted. Will not go across\n// [isolating](#model.NodeSpec.isolating) parent nodes.\nfunction liftTarget(range) {\n var parent = range.parent;\n var content = parent.content.cutByIndex(range.startIndex, range.endIndex);\n for (var depth = range.depth;; --depth) {\n var node = range.$from.node(depth);\n var index = range.$from.index(depth), endIndex = range.$to.indexAfter(depth);\n if (depth < range.depth && node.canReplace(index, endIndex, content))\n { return depth }\n if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex)) { break }\n }\n}\n\n// :: (NodeRange, number) → this\n// Split the content in the given range off from its parent, if there\n// is sibling content before or after it, and move it up the tree to\n// the depth specified by `target`. You'll probably want to use\n// [`liftTarget`](#transform.liftTarget) to compute `target`, to make\n// sure the lift is valid.\nTransform.prototype.lift = function(range, target) {\n var $from = range.$from;\n var $to = range.$to;\n var depth = range.depth;\n\n var gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1);\n var start = gapStart, end = gapEnd;\n\n var before = Fragment.empty, openStart = 0;\n for (var d = depth, splitting = false; d > target; d--)\n { if (splitting || $from.index(d) > 0) {\n splitting = true;\n before = Fragment.from($from.node(d).copy(before));\n openStart++;\n } else {\n start--;\n } }\n var after = Fragment.empty, openEnd = 0;\n for (var d$1 = depth, splitting$1 = false; d$1 > target; d$1--)\n { if (splitting$1 || $to.after(d$1 + 1) < $to.end(d$1)) {\n splitting$1 = true;\n after = Fragment.from($to.node(d$1).copy(after));\n openEnd++;\n } else {\n end++;\n } }\n\n return this.step(new ReplaceAroundStep(start, end, gapStart, gapEnd,\n new Slice(before.append(after), openStart, openEnd),\n before.size - openStart, true))\n};\n\n// :: (NodeRange, NodeType, ?Object, ?NodeRange) → ?[{type: NodeType, attrs: ?Object}]\n// Try to find a valid way to wrap the content in the given range in a\n// node of the given type. May introduce extra nodes around and inside\n// the wrapper node, if necessary. Returns null if no valid wrapping\n// could be found. When `innerRange` is given, that range's content is\n// used as the content to fit into the wrapping, instead of the\n// content of `range`.\nfunction findWrapping(range, nodeType, attrs, innerRange) {\n if ( innerRange === void 0 ) innerRange = range;\n\n var around = findWrappingOutside(range, nodeType);\n var inner = around && findWrappingInside(innerRange, nodeType);\n if (!inner) { return null }\n return around.map(withAttrs).concat({type: nodeType, attrs: attrs}).concat(inner.map(withAttrs))\n}\n\nfunction withAttrs(type) { return {type: type, attrs: null} }\n\nfunction findWrappingOutside(range, type) {\n var parent = range.parent;\n var startIndex = range.startIndex;\n var endIndex = range.endIndex;\n var around = parent.contentMatchAt(startIndex).findWrapping(type);\n if (!around) { return null }\n var outer = around.length ? around[0] : type;\n return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null\n}\n\nfunction findWrappingInside(range, type) {\n var parent = range.parent;\n var startIndex = range.startIndex;\n var endIndex = range.endIndex;\n var inner = parent.child(startIndex);\n var inside = type.contentMatch.findWrapping(inner.type);\n if (!inside) { return null }\n var lastType = inside.length ? inside[inside.length - 1] : type;\n var innerMatch = lastType.contentMatch;\n for (var i = startIndex; innerMatch && i < endIndex; i++)\n { innerMatch = innerMatch.matchType(parent.child(i).type); }\n if (!innerMatch || !innerMatch.validEnd) { return null }\n return inside\n}\n\n// :: (NodeRange, [{type: NodeType, attrs: ?Object}]) → this\n// Wrap the given [range](#model.NodeRange) in the given set of wrappers.\n// The wrappers are assumed to be valid in this position, and should\n// probably be computed with [`findWrapping`](#transform.findWrapping).\nTransform.prototype.wrap = function(range, wrappers) {\n var content = Fragment.empty;\n for (var i = wrappers.length - 1; i >= 0; i--)\n { content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content)); }\n\n var start = range.start, end = range.end;\n return this.step(new ReplaceAroundStep(start, end, start, end, new Slice(content, 0, 0), wrappers.length, true))\n};\n\n// :: (number, ?number, NodeType, ?Object) → this\n// Set the type of all textblocks (partly) between `from` and `to` to\n// the given node type with the given attributes.\nTransform.prototype.setBlockType = function(from, to, type, attrs) {\n var this$1 = this;\n if ( to === void 0 ) to = from;\n\n if (!type.isTextblock) { throw new RangeError(\"Type given to setBlockType should be a textblock\") }\n var mapFrom = this.steps.length;\n this.doc.nodesBetween(from, to, function (node, pos) {\n if (node.isTextblock && !node.hasMarkup(type, attrs) && canChangeType(this$1.doc, this$1.mapping.slice(mapFrom).map(pos), type)) {\n // Ensure all markup that isn't allowed in the new node type is cleared\n this$1.clearIncompatible(this$1.mapping.slice(mapFrom).map(pos, 1), type);\n var mapping = this$1.mapping.slice(mapFrom);\n var startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1);\n this$1.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1,\n new Slice(Fragment.from(type.create(attrs, null, node.marks)), 0, 0), 1, true));\n return false\n }\n });\n return this\n};\n\nfunction canChangeType(doc, pos, type) {\n var $pos = doc.resolve(pos), index = $pos.index();\n return $pos.parent.canReplaceWith(index, index + 1, type)\n}\n\n// :: (number, ?NodeType, ?Object, ?[Mark]) → this\n// Change the type, attributes, and/or marks of the node at `pos`.\n// When `type` isn't given, the existing node type is preserved,\nTransform.prototype.setNodeMarkup = function(pos, type, attrs, marks) {\n var node = this.doc.nodeAt(pos);\n if (!node) { throw new RangeError(\"No node at given position\") }\n if (!type) { type = node.type; }\n var newNode = type.create(attrs, null, marks || node.marks);\n if (node.isLeaf)\n { return this.replaceWith(pos, pos + node.nodeSize, newNode) }\n\n if (!type.validContent(node.content))\n { throw new RangeError(\"Invalid content for node type \" + type.name) }\n\n return this.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1,\n new Slice(Fragment.from(newNode), 0, 0), 1, true))\n};\n\n// :: (Node, number, number, ?[?{type: NodeType, attrs: ?Object}]) → bool\n// Check whether splitting at the given position is allowed.\nfunction canSplit(doc, pos, depth, typesAfter) {\n if ( depth === void 0 ) depth = 1;\n\n var $pos = doc.resolve(pos), base = $pos.depth - depth;\n var innerType = (typesAfter && typesAfter[typesAfter.length - 1]) || $pos.parent;\n if (base < 0 || $pos.parent.type.spec.isolating ||\n !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) ||\n !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount)))\n { return false }\n for (var d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n var node = $pos.node(d), index$1 = $pos.index(d);\n if (node.type.spec.isolating) { return false }\n var rest = node.content.cutByIndex(index$1, node.childCount);\n var after = (typesAfter && typesAfter[i]) || node;\n if (after != node) { rest = rest.replaceChild(0, after.type.create(after.attrs)); }\n if (!node.canReplace(index$1 + 1, node.childCount) || !after.type.validContent(rest))\n { return false }\n }\n var index = $pos.indexAfter(base);\n var baseType = typesAfter && typesAfter[0];\n return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type)\n}\n\n// :: (number, ?number, ?[?{type: NodeType, attrs: ?Object}]) → this\n// Split the node at the given position, and optionally, if `depth` is\n// greater than one, any number of nodes above that. By default, the\n// parts split off will inherit the node type of the original node.\n// This can be changed by passing an array of types and attributes to\n// use after the split.\nTransform.prototype.split = function(pos, depth, typesAfter) {\n if ( depth === void 0 ) depth = 1;\n\n var $pos = this.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty;\n for (var d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) {\n before = Fragment.from($pos.node(d).copy(before));\n var typeAfter = typesAfter && typesAfter[i];\n after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after));\n }\n return this.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true))\n};\n\n// :: (Node, number) → bool\n// Test whether the blocks before and after a given position can be\n// joined.\nfunction canJoin(doc, pos) {\n var $pos = doc.resolve(pos), index = $pos.index();\n return joinable($pos.nodeBefore, $pos.nodeAfter) &&\n $pos.parent.canReplace(index, index + 1)\n}\n\nfunction joinable(a, b) {\n return a && b && !a.isLeaf && a.canAppend(b)\n}\n\n// :: (Node, number, ?number) → ?number\n// Find an ancestor of the given position that can be joined to the\n// block before (or after if `dir` is positive). Returns the joinable\n// point, if any.\nfunction joinPoint(doc, pos, dir) {\n if ( dir === void 0 ) dir = -1;\n\n var $pos = doc.resolve(pos);\n for (var d = $pos.depth;; d--) {\n var before = (void 0), after = (void 0), index = $pos.index(d);\n if (d == $pos.depth) {\n before = $pos.nodeBefore;\n after = $pos.nodeAfter;\n } else if (dir > 0) {\n before = $pos.node(d + 1);\n index++;\n after = $pos.node(d).maybeChild(index);\n } else {\n before = $pos.node(d).maybeChild(index - 1);\n after = $pos.node(d + 1);\n }\n if (before && !before.isTextblock && joinable(before, after) &&\n $pos.node(d).canReplace(index, index + 1)) { return pos }\n if (d == 0) { break }\n pos = dir < 0 ? $pos.before(d) : $pos.after(d);\n }\n}\n\n// :: (number, ?number) → this\n// Join the blocks around the given position. If depth is 2, their\n// last and first siblings are also joined, and so on.\nTransform.prototype.join = function(pos, depth) {\n if ( depth === void 0 ) depth = 1;\n\n var step = new ReplaceStep(pos - depth, pos + depth, Slice.empty, true);\n return this.step(step)\n};\n\n// :: (Node, number, NodeType) → ?number\n// Try to find a point where a node of the given type can be inserted\n// near `pos`, by searching up the node hierarchy when `pos` itself\n// isn't a valid place but is at the start or end of a node. Return\n// null if no position was found.\nfunction insertPoint(doc, pos, nodeType) {\n var $pos = doc.resolve(pos);\n if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType)) { return pos }\n\n if ($pos.parentOffset == 0)\n { for (var d = $pos.depth - 1; d >= 0; d--) {\n var index = $pos.index(d);\n if ($pos.node(d).canReplaceWith(index, index, nodeType)) { return $pos.before(d + 1) }\n if (index > 0) { return null }\n } }\n if ($pos.parentOffset == $pos.parent.content.size)\n { for (var d$1 = $pos.depth - 1; d$1 >= 0; d$1--) {\n var index$1 = $pos.indexAfter(d$1);\n if ($pos.node(d$1).canReplaceWith(index$1, index$1, nodeType)) { return $pos.after(d$1 + 1) }\n if (index$1 < $pos.node(d$1).childCount) { return null }\n } }\n}\n\n// :: (Node, number, Slice) → ?number\n// Finds a position at or around the given position where the given\n// slice can be inserted. Will look at parent nodes' nearest boundary\n// and try there, even if the original position wasn't directly at the\n// start or end of that node. Returns null when no position was found.\nfunction dropPoint(doc, pos, slice) {\n var $pos = doc.resolve(pos);\n if (!slice.content.size) { return pos }\n var content = slice.content;\n for (var i = 0; i < slice.openStart; i++) { content = content.firstChild.content; }\n for (var pass = 1; pass <= (slice.openStart == 0 && slice.size ? 2 : 1); pass++) {\n for (var d = $pos.depth; d >= 0; d--) {\n var bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1;\n var insertPos = $pos.index(d) + (bias > 0 ? 1 : 0);\n if (pass == 1\n ? $pos.node(d).canReplace(insertPos, insertPos, content)\n : $pos.node(d).contentMatchAt(insertPos).findWrapping(content.firstChild.type))\n { return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1) }\n }\n }\n return null\n}\n\nfunction mapFragment(fragment, f, parent) {\n var mapped = [];\n for (var i = 0; i < fragment.childCount; i++) {\n var child = fragment.child(i);\n if (child.content.size) { child = child.copy(mapFragment(child.content, f, child)); }\n if (child.isInline) { child = f(child, parent, i); }\n mapped.push(child);\n }\n return Fragment.fromArray(mapped)\n}\n\n// ::- Add a mark to all inline content between two positions.\nvar AddMarkStep = /*@__PURE__*/(function (Step) {\n function AddMarkStep(from, to, mark) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.mark = mark;\n }\n\n if ( Step ) AddMarkStep.__proto__ = Step;\n AddMarkStep.prototype = Object.create( Step && Step.prototype );\n AddMarkStep.prototype.constructor = AddMarkStep;\n\n AddMarkStep.prototype.apply = function apply (doc) {\n var this$1 = this;\n\n var oldSlice = doc.slice(this.from, this.to), $from = doc.resolve(this.from);\n var parent = $from.node($from.sharedDepth(this.to));\n var slice = new Slice(mapFragment(oldSlice.content, function (node, parent) {\n if (!node.isAtom || !parent.type.allowsMarkType(this$1.mark.type)) { return node }\n return node.mark(this$1.mark.addToSet(node.marks))\n }, parent), oldSlice.openStart, oldSlice.openEnd);\n return StepResult.fromReplace(doc, this.from, this.to, slice)\n };\n\n AddMarkStep.prototype.invert = function invert () {\n return new RemoveMarkStep(this.from, this.to, this.mark)\n };\n\n AddMarkStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted || from.pos >= to.pos) { return null }\n return new AddMarkStep(from.pos, to.pos, this.mark)\n };\n\n AddMarkStep.prototype.merge = function merge (other) {\n if (other instanceof AddMarkStep &&\n other.mark.eq(this.mark) &&\n this.from <= other.to && this.to >= other.from)\n { return new AddMarkStep(Math.min(this.from, other.from),\n Math.max(this.to, other.to), this.mark) }\n };\n\n AddMarkStep.prototype.toJSON = function toJSON () {\n return {stepType: \"addMark\", mark: this.mark.toJSON(),\n from: this.from, to: this.to}\n };\n\n AddMarkStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n { throw new RangeError(\"Invalid input for AddMarkStep.fromJSON\") }\n return new AddMarkStep(json.from, json.to, schema.markFromJSON(json.mark))\n };\n\n return AddMarkStep;\n}(Step));\n\nStep.jsonID(\"addMark\", AddMarkStep);\n\n// ::- Remove a mark from all inline content between two positions.\nvar RemoveMarkStep = /*@__PURE__*/(function (Step) {\n function RemoveMarkStep(from, to, mark) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.mark = mark;\n }\n\n if ( Step ) RemoveMarkStep.__proto__ = Step;\n RemoveMarkStep.prototype = Object.create( Step && Step.prototype );\n RemoveMarkStep.prototype.constructor = RemoveMarkStep;\n\n RemoveMarkStep.prototype.apply = function apply (doc) {\n var this$1 = this;\n\n var oldSlice = doc.slice(this.from, this.to);\n var slice = new Slice(mapFragment(oldSlice.content, function (node) {\n return node.mark(this$1.mark.removeFromSet(node.marks))\n }), oldSlice.openStart, oldSlice.openEnd);\n return StepResult.fromReplace(doc, this.from, this.to, slice)\n };\n\n RemoveMarkStep.prototype.invert = function invert () {\n return new AddMarkStep(this.from, this.to, this.mark)\n };\n\n RemoveMarkStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted || from.pos >= to.pos) { return null }\n return new RemoveMarkStep(from.pos, to.pos, this.mark)\n };\n\n RemoveMarkStep.prototype.merge = function merge (other) {\n if (other instanceof RemoveMarkStep &&\n other.mark.eq(this.mark) &&\n this.from <= other.to && this.to >= other.from)\n { return new RemoveMarkStep(Math.min(this.from, other.from),\n Math.max(this.to, other.to), this.mark) }\n };\n\n RemoveMarkStep.prototype.toJSON = function toJSON () {\n return {stepType: \"removeMark\", mark: this.mark.toJSON(),\n from: this.from, to: this.to}\n };\n\n RemoveMarkStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n { throw new RangeError(\"Invalid input for RemoveMarkStep.fromJSON\") }\n return new RemoveMarkStep(json.from, json.to, schema.markFromJSON(json.mark))\n };\n\n return RemoveMarkStep;\n}(Step));\n\nStep.jsonID(\"removeMark\", RemoveMarkStep);\n\n// :: (number, number, Mark) → this\n// Add the given mark to the inline content between `from` and `to`.\nTransform.prototype.addMark = function(from, to, mark) {\n var this$1 = this;\n\n var removed = [], added = [], removing = null, adding = null;\n this.doc.nodesBetween(from, to, function (node, pos, parent) {\n if (!node.isInline) { return }\n var marks = node.marks;\n if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) {\n var start = Math.max(pos, from), end = Math.min(pos + node.nodeSize, to);\n var newSet = mark.addToSet(marks);\n\n for (var i = 0; i < marks.length; i++) {\n if (!marks[i].isInSet(newSet)) {\n if (removing && removing.to == start && removing.mark.eq(marks[i]))\n { removing.to = end; }\n else\n { removed.push(removing = new RemoveMarkStep(start, end, marks[i])); }\n }\n }\n\n if (adding && adding.to == start)\n { adding.to = end; }\n else\n { added.push(adding = new AddMarkStep(start, end, mark)); }\n }\n });\n\n removed.forEach(function (s) { return this$1.step(s); });\n added.forEach(function (s) { return this$1.step(s); });\n return this\n};\n\n// :: (number, number, ?union) → this\n// Remove marks from inline nodes between `from` and `to`. When `mark`\n// is a single mark, remove precisely that mark. When it is a mark type,\n// remove all marks of that type. When it is null, remove all marks of\n// any type.\nTransform.prototype.removeMark = function(from, to, mark) {\n var this$1 = this;\n if ( mark === void 0 ) mark = null;\n\n var matched = [], step = 0;\n this.doc.nodesBetween(from, to, function (node, pos) {\n if (!node.isInline) { return }\n step++;\n var toRemove = null;\n if (mark instanceof MarkType) {\n var set = node.marks, found;\n while (found = mark.isInSet(set)) {\n(toRemove || (toRemove = [])).push(found);\n set = found.removeFromSet(set);\n }\n } else if (mark) {\n if (mark.isInSet(node.marks)) { toRemove = [mark]; }\n } else {\n toRemove = node.marks;\n }\n if (toRemove && toRemove.length) {\n var end = Math.min(pos + node.nodeSize, to);\n for (var i = 0; i < toRemove.length; i++) {\n var style = toRemove[i], found$1 = (void 0);\n for (var j = 0; j < matched.length; j++) {\n var m = matched[j];\n if (m.step == step - 1 && style.eq(matched[j].style)) { found$1 = m; }\n }\n if (found$1) {\n found$1.to = end;\n found$1.step = step;\n } else {\n matched.push({style: style, from: Math.max(pos, from), to: end, step: step});\n }\n }\n }\n });\n matched.forEach(function (m) { return this$1.step(new RemoveMarkStep(m.from, m.to, m.style)); });\n return this\n};\n\n// :: (number, NodeType, ?ContentMatch) → this\n// Removes all marks and nodes from the content of the node at `pos`\n// that don't match the given new parent node type. Accepts an\n// optional starting [content match](#model.ContentMatch) as third\n// argument.\nTransform.prototype.clearIncompatible = function(pos, parentType, match) {\n if ( match === void 0 ) match = parentType.contentMatch;\n\n var node = this.doc.nodeAt(pos);\n var delSteps = [], cur = pos + 1;\n for (var i = 0; i < node.childCount; i++) {\n var child = node.child(i), end = cur + child.nodeSize;\n var allowed = match.matchType(child.type, child.attrs);\n if (!allowed) {\n delSteps.push(new ReplaceStep(cur, end, Slice.empty));\n } else {\n match = allowed;\n for (var j = 0; j < child.marks.length; j++) { if (!parentType.allowsMarkType(child.marks[j].type))\n { this.step(new RemoveMarkStep(cur, end, child.marks[j])); } }\n }\n cur = end;\n }\n if (!match.validEnd) {\n var fill = match.fillBefore(Fragment.empty, true);\n this.replace(cur, cur, new Slice(fill, 0, 0));\n }\n for (var i$1 = delSteps.length - 1; i$1 >= 0; i$1--) { this.step(delSteps[i$1]); }\n return this\n};\n\n// :: (Node, number, ?number, ?Slice) → ?Step\n// ‘Fit’ a slice into a given position in the document, producing a\n// [step](#transform.Step) that inserts it. Will return null if\n// there's no meaningful way to insert the slice here, or inserting it\n// would be a no-op (an empty slice over an empty range).\nfunction replaceStep(doc, from, to, slice) {\n if ( to === void 0 ) to = from;\n if ( slice === void 0 ) slice = Slice.empty;\n\n if (from == to && !slice.size) { return null }\n\n var $from = doc.resolve(from), $to = doc.resolve(to);\n // Optimization -- avoid work if it's obvious that it's not needed.\n if (fitsTrivially($from, $to, slice)) { return new ReplaceStep(from, to, slice) }\n return new Fitter($from, $to, slice).fit()\n}\n\n// :: (number, ?number, ?Slice) → this\n// Replace the part of the document between `from` and `to` with the\n// given `slice`.\nTransform.prototype.replace = function(from, to, slice) {\n if ( to === void 0 ) to = from;\n if ( slice === void 0 ) slice = Slice.empty;\n\n var step = replaceStep(this.doc, from, to, slice);\n if (step) { this.step(step); }\n return this\n};\n\n// :: (number, number, union) → this\n// Replace the given range with the given content, which may be a\n// fragment, node, or array of nodes.\nTransform.prototype.replaceWith = function(from, to, content) {\n return this.replace(from, to, new Slice(Fragment.from(content), 0, 0))\n};\n\n// :: (number, number) → this\n// Delete the content between the given positions.\nTransform.prototype.delete = function(from, to) {\n return this.replace(from, to, Slice.empty)\n};\n\n// :: (number, union) → this\n// Insert the given content at the given position.\nTransform.prototype.insert = function(pos, content) {\n return this.replaceWith(pos, pos, content)\n};\n\nfunction fitsTrivially($from, $to, slice) {\n return !slice.openStart && !slice.openEnd && $from.start() == $to.start() &&\n $from.parent.canReplace($from.index(), $to.index(), slice.content)\n}\n\n// Algorithm for 'placing' the elements of a slice into a gap:\n//\n// We consider the content of each node that is open to the left to be\n// independently placeable. I.e. in , when the\n// paragraph on the left is open, \"foo\" can be placed (somewhere on\n// the left side of the replacement gap) independently from p(\"bar\").\n//\n// This class tracks the state of the placement progress in the\n// following properties:\n//\n// - `frontier` holds a stack of `{type, match}` objects that\n// represent the open side of the replacement. It starts at\n// `$from`, then moves forward as content is placed, and is finally\n// reconciled with `$to`.\n//\n// - `unplaced` is a slice that represents the content that hasn't\n// been placed yet.\n//\n// - `placed` is a fragment of placed content. Its open-start value\n// is implicit in `$from`, and its open-end value in `frontier`.\nvar Fitter = function Fitter($from, $to, slice) {\n this.$to = $to;\n this.$from = $from;\n this.unplaced = slice;\n\n this.frontier = [];\n for (var i = 0; i <= $from.depth; i++) {\n var node = $from.node(i);\n this.frontier.push({\n type: node.type,\n match: node.contentMatchAt($from.indexAfter(i))\n });\n }\n\n this.placed = Fragment.empty;\n for (var i$1 = $from.depth; i$1 > 0; i$1--)\n { this.placed = Fragment.from($from.node(i$1).copy(this.placed)); }\n};\n\nvar prototypeAccessors$1 = { depth: { configurable: true } };\n\nprototypeAccessors$1.depth.get = function () { return this.frontier.length - 1 };\n\nFitter.prototype.fit = function fit () {\n // As long as there's unplaced content, try to place some of it.\n // If that fails, either increase the open score of the unplaced\n // slice, or drop nodes from it, and then try again.\n while (this.unplaced.size) {\n var fit = this.findFittable();\n if (fit) { this.placeNodes(fit); }\n else { this.openMore() || this.dropNode(); }\n }\n // When there's inline content directly after the frontier _and_\n // directly after `this.$to`, we must generate a `ReplaceAround`\n // step that pulls that content into the node after the frontier.\n // That means the fitting must be done to the end of the textblock\n // node after `this.$to`, not `this.$to` itself.\n var moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth;\n var $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline));\n if (!$to) { return null }\n\n // If closing to `$to` succeeded, create a step\n var content = this.placed, openStart = $from.depth, openEnd = $to.depth;\n while (openStart && openEnd && content.childCount == 1) { // Normalize by dropping open parent nodes\n content = content.firstChild.content;\n openStart--; openEnd--;\n }\n var slice = new Slice(content, openStart, openEnd);\n if (moveInline > -1)\n { return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice, placedSize) }\n if (slice.size || $from.pos != this.$to.pos) // Don't generate no-op steps\n { return new ReplaceStep($from.pos, $to.pos, slice) }\n};\n\n// Find a position on the start spine of `this.unplaced` that has\n// content that can be moved somewhere on the frontier. Returns two\n// depths, one for the slice and one for the frontier.\nFitter.prototype.findFittable = function findFittable () {\n // Only try wrapping nodes (pass 2) after finding a place without\n // wrapping failed.\n for (var pass = 1; pass <= 2; pass++) {\n for (var sliceDepth = this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) {\n var fragment = (void 0), parent = (void 0);\n if (sliceDepth) {\n parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild;\n fragment = parent.content;\n } else {\n fragment = this.unplaced.content;\n }\n var first = fragment.firstChild;\n for (var frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) {\n var ref = this.frontier[frontierDepth];\n var type = ref.type;\n var match = ref.match;\n var wrap = (void 0), inject = (void 0);\n // In pass 1, if the next node matches, or there is no next\n // node but the parents look compatible, we've found a\n // place.\n if (pass == 1 && (first ? match.matchType(first.type) || (inject = match.fillBefore(Fragment.from(first), false))\n : type.compatibleContent(parent.type)))\n { return {sliceDepth: sliceDepth, frontierDepth: frontierDepth, parent: parent, inject: inject} }\n // In pass 2, look for a set of wrapping nodes that make\n // `first` fit here.\n else if (pass == 2 && first && (wrap = match.findWrapping(first.type)))\n { return {sliceDepth: sliceDepth, frontierDepth: frontierDepth, parent: parent, wrap: wrap} }\n // Don't continue looking further up if the parent node\n // would fit here.\n if (parent && match.matchType(parent.type)) { break }\n }\n }\n }\n};\n\nFitter.prototype.openMore = function openMore () {\n var ref = this.unplaced;\n var content = ref.content;\n var openStart = ref.openStart;\n var openEnd = ref.openEnd;\n var inner = contentAt(content, openStart);\n if (!inner.childCount || inner.firstChild.isLeaf) { return false }\n this.unplaced = new Slice(content, openStart + 1,\n Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0));\n return true\n};\n\nFitter.prototype.dropNode = function dropNode () {\n var ref = this.unplaced;\n var content = ref.content;\n var openStart = ref.openStart;\n var openEnd = ref.openEnd;\n var inner = contentAt(content, openStart);\n if (inner.childCount <= 1 && openStart > 0) {\n var openAtEnd = content.size - openStart <= openStart + inner.size;\n this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1,\n openAtEnd ? openStart - 1 : openEnd);\n } else {\n this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd);\n }\n};\n\n// : ({sliceDepth: number, frontierDepth: number, parent: ?Node, wrap: ?[NodeType], inject: ?Fragment})\n// Move content from the unplaced slice at `sliceDepth` to the\n// frontier node at `frontierDepth`. Close that frontier node when\n// applicable.\nFitter.prototype.placeNodes = function placeNodes (ref) {\n var sliceDepth = ref.sliceDepth;\n var frontierDepth = ref.frontierDepth;\n var parent = ref.parent;\n var inject = ref.inject;\n var wrap = ref.wrap;\n\n while (this.depth > frontierDepth) { this.closeFrontierNode(); }\n if (wrap) { for (var i = 0; i < wrap.length; i++) { this.openFrontierNode(wrap[i]); } }\n\n var slice = this.unplaced, fragment = parent ? parent.content : slice.content;\n var openStart = slice.openStart - sliceDepth;\n var taken = 0, add = [];\n var ref$1 = this.frontier[frontierDepth];\n var match = ref$1.match;\n var type = ref$1.type;\n if (inject) {\n for (var i$1 = 0; i$1 < inject.childCount; i$1++) { add.push(inject.child(i$1)); }\n match = match.matchFragment(inject);\n }\n // Computes the amount of (end) open nodes at the end of the\n // fragment. When 0, the parent is open, but no more. When\n // negative, nothing is open.\n var openEndCount = (fragment.size + sliceDepth) - (slice.content.size - slice.openEnd);\n // Scan over the fragment, fitting as many child nodes as\n // possible.\n while (taken < fragment.childCount) {\n var next = fragment.child(taken), matches = match.matchType(next.type);\n if (!matches) { break }\n taken++;\n if (taken > 1 || openStart == 0 || next.content.size) { // Drop empty open nodes\n match = matches;\n add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0,\n taken == fragment.childCount ? openEndCount : -1));\n }\n }\n var toEnd = taken == fragment.childCount;\n if (!toEnd) { openEndCount = -1; }\n\n this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add));\n this.frontier[frontierDepth].match = match;\n\n // If the parent types match, and the entire node was moved, and\n // it's not open, close this frontier node right away.\n if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1)\n { this.closeFrontierNode(); }\n\n // Add new frontier nodes for any open nodes at the end.\n for (var i$2 = 0, cur = fragment; i$2 < openEndCount; i$2++) {\n var node = cur.lastChild;\n this.frontier.push({type: node.type, match: node.contentMatchAt(node.childCount)});\n cur = node.content;\n }\n\n // Update `this.unplaced`. Drop the entire node from which we\n // placed it we got to its end, otherwise just drop the placed\n // nodes.\n this.unplaced = !toEnd ? new Slice(dropFromFragment(slice.content, sliceDepth, taken), slice.openStart, slice.openEnd)\n : sliceDepth == 0 ? Slice.empty\n : new Slice(dropFromFragment(slice.content, sliceDepth - 1, 1),\n sliceDepth - 1, openEndCount < 0 ? slice.openEnd : sliceDepth - 1);\n};\n\nFitter.prototype.mustMoveInline = function mustMoveInline () {\n if (!this.$to.parent.isTextblock || this.$to.end() == this.$to.pos) { return -1 }\n var top = this.frontier[this.depth], level;\n if (!top.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top.type, top.match, false) ||\n (this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth)) { return -1 }\n\n var ref = this.$to;\n var depth = ref.depth;\n var after = this.$to.after(depth);\n while (depth > 1 && after == this.$to.end(--depth)) { ++after; }\n return after\n};\n\nFitter.prototype.findCloseLevel = function findCloseLevel ($to) {\n scan: for (var i = Math.min(this.depth, $to.depth); i >= 0; i--) {\n var ref = this.frontier[i];\n var match = ref.match;\n var type = ref.type;\n var dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1));\n var fit = contentAfterFits($to, i, type, match, dropInner);\n if (!fit) { continue }\n for (var d = i - 1; d >= 0; d--) {\n var ref$1 = this.frontier[d];\n var match$1 = ref$1.match;\n var type$1 = ref$1.type;\n var matches = contentAfterFits($to, d, type$1, match$1, true);\n if (!matches || matches.childCount) { continue scan }\n }\n return {depth: i, fit: fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to}\n }\n};\n\nFitter.prototype.close = function close ($to) {\n var close = this.findCloseLevel($to);\n if (!close) { return null }\n\n while (this.depth > close.depth) { this.closeFrontierNode(); }\n if (close.fit.childCount) { this.placed = addToFragment(this.placed, close.depth, close.fit); }\n $to = close.move;\n for (var d = close.depth + 1; d <= $to.depth; d++) {\n var node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d));\n this.openFrontierNode(node.type, node.attrs, add);\n }\n return $to\n};\n\nFitter.prototype.openFrontierNode = function openFrontierNode (type, attrs, content) {\n var top = this.frontier[this.depth];\n top.match = top.match.matchType(type);\n this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content)));\n this.frontier.push({type: type, match: type.contentMatch});\n};\n\nFitter.prototype.closeFrontierNode = function closeFrontierNode () {\n var open = this.frontier.pop();\n var add = open.match.fillBefore(Fragment.empty, true);\n if (add.childCount) { this.placed = addToFragment(this.placed, this.frontier.length, add); }\n};\n\nObject.defineProperties( Fitter.prototype, prototypeAccessors$1 );\n\nfunction dropFromFragment(fragment, depth, count) {\n if (depth == 0) { return fragment.cutByIndex(count) }\n return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count)))\n}\n\nfunction addToFragment(fragment, depth, content) {\n if (depth == 0) { return fragment.append(content) }\n return fragment.replaceChild(fragment.childCount - 1,\n fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content)))\n}\n\nfunction contentAt(fragment, depth) {\n for (var i = 0; i < depth; i++) { fragment = fragment.firstChild.content; }\n return fragment\n}\n\nfunction closeNodeStart(node, openStart, openEnd) {\n if (openStart <= 0) { return node }\n var frag = node.content;\n if (openStart > 1)\n { frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0)); }\n if (openStart > 0) {\n frag = node.type.contentMatch.fillBefore(frag).append(frag);\n if (openEnd <= 0) { frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true)); }\n }\n return node.copy(frag)\n}\n\nfunction contentAfterFits($to, depth, type, match, open) {\n var node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth);\n if (index == node.childCount && !type.compatibleContent(node.type)) { return null }\n var fit = match.fillBefore(node.content, true, index);\n return fit && !invalidMarks(type, node.content, index) ? fit : null\n}\n\nfunction invalidMarks(type, fragment, start) {\n for (var i = start; i < fragment.childCount; i++)\n { if (!type.allowsMarks(fragment.child(i).marks)) { return true } }\n return false\n}\n\n// :: (number, number, Slice) → this\n// Replace a range of the document with a given slice, using `from`,\n// `to`, and the slice's [`openStart`](#model.Slice.openStart) property\n// as hints, rather than fixed start and end points. This method may\n// grow the replaced area or close open nodes in the slice in order to\n// get a fit that is more in line with WYSIWYG expectations, by\n// dropping fully covered parent nodes of the replaced region when\n// they are marked [non-defining](#model.NodeSpec.defining), or\n// including an open parent node from the slice that _is_ marked as\n// [defining](#model.NodeSpec.defining).\n//\n// This is the method, for example, to handle paste. The similar\n// [`replace`](#transform.Transform.replace) method is a more\n// primitive tool which will _not_ move the start and end of its given\n// range, and is useful in situations where you need more precise\n// control over what happens.\nTransform.prototype.replaceRange = function(from, to, slice) {\n if (!slice.size) { return this.deleteRange(from, to) }\n\n var $from = this.doc.resolve(from), $to = this.doc.resolve(to);\n if (fitsTrivially($from, $to, slice))\n { return this.step(new ReplaceStep(from, to, slice)) }\n\n var targetDepths = coveredDepths($from, this.doc.resolve(to));\n // Can't replace the whole document, so remove 0 if it's present\n if (targetDepths[targetDepths.length - 1] == 0) { targetDepths.pop(); }\n // Negative numbers represent not expansion over the whole node at\n // that depth, but replacing from $from.before(-D) to $to.pos.\n var preferredTarget = -($from.depth + 1);\n targetDepths.unshift(preferredTarget);\n // This loop picks a preferred target depth, if one of the covering\n // depths is not outside of a defining node, and adds negative\n // depths for any depth that has $from at its start and does not\n // cross a defining node.\n for (var d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) {\n var spec = $from.node(d).type.spec;\n if (spec.defining || spec.isolating) { break }\n if (targetDepths.indexOf(d) > -1) { preferredTarget = d; }\n else if ($from.before(d) == pos) { targetDepths.splice(1, 0, -d); }\n }\n // Try to fit each possible depth of the slice into each possible\n // target depth, starting with the preferred depths.\n var preferredTargetIndex = targetDepths.indexOf(preferredTarget);\n\n var leftNodes = [], preferredDepth = slice.openStart;\n for (var content = slice.content, i = 0;; i++) {\n var node = content.firstChild;\n leftNodes.push(node);\n if (i == slice.openStart) { break }\n content = node.content;\n }\n // Back up if the node directly above openStart, or the node above\n // that separated only by a non-defining textblock node, is defining.\n if (preferredDepth > 0 && leftNodes[preferredDepth - 1].type.spec.defining &&\n $from.node(preferredTargetIndex).type != leftNodes[preferredDepth - 1].type)\n { preferredDepth -= 1; }\n else if (preferredDepth >= 2 && leftNodes[preferredDepth - 1].isTextblock && leftNodes[preferredDepth - 2].type.spec.defining &&\n $from.node(preferredTargetIndex).type != leftNodes[preferredDepth - 2].type)\n { preferredDepth -= 2; }\n\n for (var j = slice.openStart; j >= 0; j--) {\n var openDepth = (j + preferredDepth + 1) % (slice.openStart + 1);\n var insert = leftNodes[openDepth];\n if (!insert) { continue }\n for (var i$1 = 0; i$1 < targetDepths.length; i$1++) {\n // Loop over possible expansion levels, starting with the\n // preferred one\n var targetDepth = targetDepths[(i$1 + preferredTargetIndex) % targetDepths.length], expand = true;\n if (targetDepth < 0) { expand = false; targetDepth = -targetDepth; }\n var parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1);\n if (parent.canReplaceWith(index, index, insert.type, insert.marks))\n { return this.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to,\n new Slice(closeFragment(slice.content, 0, slice.openStart, openDepth),\n openDepth, slice.openEnd)) }\n }\n }\n\n var startSteps = this.steps.length;\n for (var i$2 = targetDepths.length - 1; i$2 >= 0; i$2--) {\n this.replace(from, to, slice);\n if (this.steps.length > startSteps) { break }\n var depth = targetDepths[i$2];\n if (i$2 < 0) { continue }\n from = $from.before(depth); to = $to.after(depth);\n }\n return this\n};\n\nfunction closeFragment(fragment, depth, oldOpen, newOpen, parent) {\n if (depth < oldOpen) {\n var first = fragment.firstChild;\n fragment = fragment.replaceChild(0, first.copy(closeFragment(first.content, depth + 1, oldOpen, newOpen, first)));\n }\n if (depth > newOpen) {\n var match = parent.contentMatchAt(0);\n var start = match.fillBefore(fragment).append(fragment);\n fragment = start.append(match.matchFragment(start).fillBefore(Fragment.empty, true));\n }\n return fragment\n}\n\n// :: (number, number, Node) → this\n// Replace the given range with a node, but use `from` and `to` as\n// hints, rather than precise positions. When from and to are the same\n// and are at the start or end of a parent node in which the given\n// node doesn't fit, this method may _move_ them out towards a parent\n// that does allow the given node to be placed. When the given range\n// completely covers a parent node, this method may completely replace\n// that parent node.\nTransform.prototype.replaceRangeWith = function(from, to, node) {\n if (!node.isInline && from == to && this.doc.resolve(from).parent.content.size) {\n var point = insertPoint(this.doc, from, node.type);\n if (point != null) { from = to = point; }\n }\n return this.replaceRange(from, to, new Slice(Fragment.from(node), 0, 0))\n};\n\n// :: (number, number) → this\n// Delete the given range, expanding it to cover fully covered\n// parent nodes until a valid replace is found.\nTransform.prototype.deleteRange = function(from, to) {\n var $from = this.doc.resolve(from), $to = this.doc.resolve(to);\n var covered = coveredDepths($from, $to);\n for (var i = 0; i < covered.length; i++) {\n var depth = covered[i], last = i == covered.length - 1;\n if ((last && depth == 0) || $from.node(depth).type.contentMatch.validEnd)\n { return this.delete($from.start(depth), $to.end(depth)) }\n if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1))))\n { return this.delete($from.before(depth), $to.after(depth)) }\n }\n for (var d = 1; d <= $from.depth && d <= $to.depth; d++) {\n if (from - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d)\n { return this.delete($from.before(d), to) }\n }\n return this.delete(from, to)\n};\n\n// : (ResolvedPos, ResolvedPos) → [number]\n// Returns an array of all depths for which $from - $to spans the\n// whole content of the nodes at that depth.\nfunction coveredDepths($from, $to) {\n var result = [], minDepth = Math.min($from.depth, $to.depth);\n for (var d = minDepth; d >= 0; d--) {\n var start = $from.start(d);\n if (start < $from.pos - ($from.depth - d) ||\n $to.end(d) > $to.pos + ($to.depth - d) ||\n $from.node(d).type.spec.isolating ||\n $to.node(d).type.spec.isolating) { break }\n if (start == $to.start(d)) { result.push(d); }\n }\n return result\n}\n\nexport { AddMarkStep, MapResult, Mapping, RemoveMarkStep, ReplaceAroundStep, ReplaceStep, Step, StepMap, StepResult, Transform, TransformError, canJoin, canSplit, dropPoint, findWrapping, insertPoint, joinPoint, liftTarget, replaceStep };\n//# sourceMappingURL=index.es.js.map\n","// Utilities\n//\n'use strict';\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction isString(obj) { return _class(obj) === '[object String]'; }\n\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction has(object, key) {\n return _hasOwnProperty.call(object, key);\n}\n\n// Merge objects\n//\nfunction assign(obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n\n sources.forEach(function (source) {\n if (!source) { return; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be object');\n }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key];\n });\n });\n\n return obj;\n}\n\n// Remove element from array and put another array at those position.\n// Useful for some operations with tokens\nfunction arrayReplaceAt(src, pos, newElements) {\n return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1));\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction isValidEntityCode(c) {\n /*eslint no-bitwise:0*/\n // broken sequence\n if (c >= 0xD800 && c <= 0xDFFF) { return false; }\n // never used\n if (c >= 0xFDD0 && c <= 0xFDEF) { return false; }\n if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false; }\n // control codes\n if (c >= 0x00 && c <= 0x08) { return false; }\n if (c === 0x0B) { return false; }\n if (c >= 0x0E && c <= 0x1F) { return false; }\n if (c >= 0x7F && c <= 0x9F) { return false; }\n // out of range\n if (c > 0x10FFFF) { return false; }\n return true;\n}\n\nfunction fromCodePoint(c) {\n /*eslint no-bitwise:0*/\n if (c > 0xffff) {\n c -= 0x10000;\n var surrogate1 = 0xd800 + (c >> 10),\n surrogate2 = 0xdc00 + (c & 0x3ff);\n\n return String.fromCharCode(surrogate1, surrogate2);\n }\n return String.fromCharCode(c);\n}\n\n\nvar UNESCAPE_MD_RE = /\\\\([!\"#$%&'()*+,\\-.\\/:;<=>?@[\\\\\\]^_`{|}~])/g;\nvar ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi;\nvar UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi');\n\nvar DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;\n\nvar entities = require('./entities');\n\nfunction replaceEntityPattern(match, name) {\n var code = 0;\n\n if (has(entities, name)) {\n return entities[name];\n }\n\n if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n code = name[1].toLowerCase() === 'x' ?\n parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10);\n\n if (isValidEntityCode(code)) {\n return fromCodePoint(code);\n }\n }\n\n return match;\n}\n\n/*function replaceEntities(str) {\n if (str.indexOf('&') < 0) { return str; }\n\n return str.replace(ENTITY_RE, replaceEntityPattern);\n}*/\n\nfunction unescapeMd(str) {\n if (str.indexOf('\\\\') < 0) { return str; }\n return str.replace(UNESCAPE_MD_RE, '$1');\n}\n\nfunction unescapeAll(str) {\n if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str; }\n\n return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n if (escaped) { return escaped; }\n return replaceEntityPattern(match, entity);\n });\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar HTML_ESCAPE_TEST_RE = /[&<>\"]/;\nvar HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g;\nvar HTML_REPLACEMENTS = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"'\n};\n\nfunction replaceUnsafeChar(ch) {\n return HTML_REPLACEMENTS[ch];\n}\n\nfunction escapeHtml(str) {\n if (HTML_ESCAPE_TEST_RE.test(str)) {\n return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar);\n }\n return str;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g;\n\nfunction escapeRE(str) {\n return str.replace(REGEXP_ESCAPE_RE, '\\\\$&');\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction isSpace(code) {\n switch (code) {\n case 0x09:\n case 0x20:\n return true;\n }\n return false;\n}\n\n// Zs (unicode class) || [\\t\\f\\v\\r\\n]\nfunction isWhiteSpace(code) {\n if (code >= 0x2000 && code <= 0x200A) { return true; }\n switch (code) {\n case 0x09: // \\t\n case 0x0A: // \\n\n case 0x0B: // \\v\n case 0x0C: // \\f\n case 0x0D: // \\r\n case 0x20:\n case 0xA0:\n case 0x1680:\n case 0x202F:\n case 0x205F:\n case 0x3000:\n return true;\n }\n return false;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/*eslint-disable max-len*/\nvar UNICODE_PUNCT_RE = require('uc.micro/categories/P/regex');\n\n// Currently without astral characters support.\nfunction isPunctChar(ch) {\n return UNICODE_PUNCT_RE.test(ch);\n}\n\n\n// Markdown ASCII punctuation characters.\n//\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\n//\n// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.\n//\nfunction isMdAsciiPunct(ch) {\n switch (ch) {\n case 0x21/* ! */:\n case 0x22/* \" */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x27/* ' */:\n case 0x28/* ( */:\n case 0x29/* ) */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2C/* , */:\n case 0x2D/* - */:\n case 0x2E/* . */:\n case 0x2F/* / */:\n case 0x3A/* : */:\n case 0x3B/* ; */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x3F/* ? */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7C/* | */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true;\n default:\n return false;\n }\n}\n\n// Hepler to unify [reference labels].\n//\nfunction normalizeReference(str) {\n // Trim and collapse whitespace\n //\n str = str.trim().replace(/\\s+/g, ' ');\n\n // In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug\n // fixed in v12 (couldn't find any details).\n //\n // So treat this one as a special case\n // (remove this when node v10 is no longer supported).\n //\n if ('ẞ'.toLowerCase() === 'Ṿ') {\n str = str.replace(/ẞ/g, 'ß');\n }\n\n // .toLowerCase().toUpperCase() should get rid of all differences\n // between letter variants.\n //\n // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently\n // uppercased versions).\n //\n // Here's an example showing how it happens. Lets take greek letter omega:\n // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)\n //\n // Unicode entries:\n // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n // 03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8;\n //\n // Case-insensitive comparison should treat all of them as equivalent.\n //\n // But .toLowerCase() doesn't change ϑ (it's already lowercase),\n // and .toUpperCase() doesn't change ϴ (already uppercase).\n //\n // Applying first lower then upper case normalizes any character:\n // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n //\n // Note: this is equivalent to unicode case folding; unicode normalization\n // is a different step that is not required here.\n //\n // Final result should be uppercased, because it's later stored in an object\n // (this avoid a conflict with Object.prototype members,\n // most notably, `__proto__`)\n //\n return str.toLowerCase().toUpperCase();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Re-export libraries commonly used in both markdown-it and its plugins,\n// so plugins won't have to depend on them explicitly, which reduces their\n// bundled size (e.g. a browser build).\n//\nexports.lib = {};\nexports.lib.mdurl = require('mdurl');\nexports.lib.ucmicro = require('uc.micro');\n\nexports.assign = assign;\nexports.isString = isString;\nexports.has = has;\nexports.unescapeMd = unescapeMd;\nexports.unescapeAll = unescapeAll;\nexports.isValidEntityCode = isValidEntityCode;\nexports.fromCodePoint = fromCodePoint;\n// exports.replaceEntities = replaceEntities;\nexports.escapeHtml = escapeHtml;\nexports.arrayReplaceAt = arrayReplaceAt;\nexports.isSpace = isSpace;\nexports.isWhiteSpace = isWhiteSpace;\nexports.isMdAsciiPunct = isMdAsciiPunct;\nexports.isPunctChar = isPunctChar;\nexports.escapeRE = escapeRE;\nexports.normalizeReference = normalizeReference;\n","import { Plugin } from 'prosemirror-state';\nimport { findWrapping, canJoin } from 'prosemirror-transform';\n\n// ::- Input rules are regular expressions describing a piece of text\n// that, when typed, causes something to happen. This might be\n// changing two dashes into an emdash, wrapping a paragraph starting\n// with `\"> \"` into a blockquote, or something entirely different.\nvar InputRule = function InputRule(match, handler) {\n this.match = match;\n this.handler = typeof handler == \"string\" ? stringHandler(handler) : handler;\n};\n\nfunction stringHandler(string) {\n return function(state, match, start, end) {\n var insert = string;\n if (match[1]) {\n var offset = match[0].lastIndexOf(match[1]);\n insert += match[0].slice(offset + match[1].length);\n start += offset;\n var cutOff = start - end;\n if (cutOff > 0) {\n insert = match[0].slice(offset - cutOff, offset) + insert;\n start = end;\n }\n }\n return state.tr.insertText(insert, start, end)\n }\n}\n\nvar MAX_MATCH = 500;\n\n// :: (config: {rules: [InputRule]}) → Plugin\n// Create an input rules plugin. When enabled, it will cause text\n// input that matches any of the given rules to trigger the rule's\n// action.\nfunction inputRules(ref) {\n var rules = ref.rules;\n\n var plugin = new Plugin({\n state: {\n init: function init() { return null },\n apply: function apply(tr, prev) {\n var stored = tr.getMeta(this);\n if (stored) { return stored }\n return tr.selectionSet || tr.docChanged ? null : prev\n }\n },\n\n props: {\n handleTextInput: function handleTextInput(view, from, to, text) {\n return run(view, from, to, text, rules, plugin)\n },\n handleDOMEvents: {\n compositionend: function (view) {\n setTimeout(function () {\n var ref = view.state.selection;\n var $cursor = ref.$cursor;\n if ($cursor) { run(view, $cursor.pos, $cursor.pos, \"\", rules, plugin); }\n });\n }\n }\n },\n\n isInputRules: true\n });\n return plugin\n}\n\nfunction run(view, from, to, text, rules, plugin) {\n if (view.composing) { return false }\n var state = view.state, $from = state.doc.resolve(from);\n if ($from.parent.type.spec.code) { return false }\n var textBefore = $from.parent.textBetween(Math.max(0, $from.parentOffset - MAX_MATCH), $from.parentOffset,\n null, \"\\ufffc\") + text;\n for (var i = 0; i < rules.length; i++) {\n var match = rules[i].match.exec(textBefore);\n var tr = match && rules[i].handler(state, match, from - (match[0].length - text.length), to);\n if (!tr) { continue }\n view.dispatch(tr.setMeta(plugin, {transform: tr, from: from, to: to, text: text}));\n return true\n }\n return false\n}\n\n// :: (EditorState, ?(Transaction)) → bool\n// This is a command that will undo an input rule, if applying such a\n// rule was the last thing that the user did.\nfunction undoInputRule(state, dispatch) {\n var plugins = state.plugins;\n for (var i = 0; i < plugins.length; i++) {\n var plugin = plugins[i], undoable = (void 0);\n if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) {\n if (dispatch) {\n var tr = state.tr, toUndo = undoable.transform;\n for (var j = toUndo.steps.length - 1; j >= 0; j--)\n { tr.step(toUndo.steps[j].invert(toUndo.docs[j])); }\n if (undoable.text) {\n var marks = tr.doc.resolve(undoable.from).marks();\n tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks));\n } else {\n tr.delete(undoable.from, undoable.to);\n }\n dispatch(tr);\n }\n return true\n }\n }\n return false\n}\n\n// :: InputRule Converts double dashes to an emdash.\nvar emDash = new InputRule(/--$/, \"—\");\n// :: InputRule Converts three dots to an ellipsis character.\nvar ellipsis = new InputRule(/\\.\\.\\.$/, \"…\");\n// :: InputRule “Smart” opening double quotes.\nvar openDoubleQuote = new InputRule(/(?:^|[\\s\\{\\[\\(\\<'\"\\u2018\\u201C])(\")$/, \"“\");\n// :: InputRule “Smart” closing double quotes.\nvar closeDoubleQuote = new InputRule(/\"$/, \"”\");\n// :: InputRule “Smart” opening single quotes.\nvar openSingleQuote = new InputRule(/(?:^|[\\s\\{\\[\\(\\<'\"\\u2018\\u201C])(')$/, \"‘\");\n// :: InputRule “Smart” closing single quotes.\nvar closeSingleQuote = new InputRule(/'$/, \"’\");\n\n// :: [InputRule] Smart-quote related input rules.\nvar smartQuotes = [openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote];\n\n// :: (RegExp, NodeType, ?union, ?([string], Node) → bool) → InputRule\n// Build an input rule for automatically wrapping a textblock when a\n// given string is typed. The `regexp` argument is\n// directly passed through to the `InputRule` constructor. You'll\n// probably want the regexp to start with `^`, so that the pattern can\n// only occur at the start of a textblock.\n//\n// `nodeType` is the type of node to wrap in. If it needs attributes,\n// you can either pass them directly, or pass a function that will\n// compute them from the regular expression match.\n//\n// By default, if there's a node with the same type above the newly\n// wrapped node, the rule will try to [join](#transform.Transform.join) those\n// two nodes. You can pass a join predicate, which takes a regular\n// expression match and the node before the wrapped node, and can\n// return a boolean to indicate whether a join should happen.\nfunction wrappingInputRule(regexp, nodeType, getAttrs, joinPredicate) {\n return new InputRule(regexp, function (state, match, start, end) {\n var attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n var tr = state.tr.delete(start, end);\n var $start = tr.doc.resolve(start), range = $start.blockRange(), wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping) { return null }\n tr.wrap(range, wrapping);\n var before = tr.doc.resolve(start - 1).nodeBefore;\n if (before && before.type == nodeType && canJoin(tr.doc, start - 1) &&\n (!joinPredicate || joinPredicate(match, before)))\n { tr.join(start - 1); }\n return tr\n })\n}\n\n// :: (RegExp, NodeType, ?union) → InputRule\n// Build an input rule that changes the type of a textblock when the\n// matched text is typed into it. You'll usually want to start your\n// regexp with `^` to that it is only matched at the start of a\n// textblock. The optional `getAttrs` parameter can be used to compute\n// the new node's attributes, and works the same as in the\n// `wrappingInputRule` function.\nfunction textblockTypeInputRule(regexp, nodeType, getAttrs) {\n return new InputRule(regexp, function (state, match, start, end) {\n var $start = state.doc.resolve(start);\n var attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), nodeType)) { return null }\n return state.tr\n .delete(start, end)\n .setBlockType(start, start, nodeType, attrs)\n })\n}\n\nexport { InputRule, closeDoubleQuote, closeSingleQuote, ellipsis, emDash, inputRules, openDoubleQuote, openSingleQuote, smartQuotes, textblockTypeInputRule, undoInputRule, wrappingInputRule };\n//# sourceMappingURL=index.es.js.map\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"@babel/runtime/helpers/esm/setPrototypeOf\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","import { Schema, Mark } from 'prosemirror-model';\nimport markdownit from 'markdown-it';\n\n// ::Schema Document schema for the data model used by CommonMark.\nvar schema = new Schema({\n nodes: {\n doc: {\n content: \"block+\"\n },\n\n paragraph: {\n content: \"inline*\",\n group: \"block\",\n parseDOM: [{tag: \"p\"}],\n toDOM: function toDOM() { return [\"p\", 0] }\n },\n\n blockquote: {\n content: \"block+\",\n group: \"block\",\n parseDOM: [{tag: \"blockquote\"}],\n toDOM: function toDOM() { return [\"blockquote\", 0] }\n },\n\n horizontal_rule: {\n group: \"block\",\n parseDOM: [{tag: \"hr\"}],\n toDOM: function toDOM() { return [\"div\", [\"hr\"]] }\n },\n\n heading: {\n attrs: {level: {default: 1}},\n content: \"(text | image)*\",\n group: \"block\",\n defining: true,\n parseDOM: [{tag: \"h1\", attrs: {level: 1}},\n {tag: \"h2\", attrs: {level: 2}},\n {tag: \"h3\", attrs: {level: 3}},\n {tag: \"h4\", attrs: {level: 4}},\n {tag: \"h5\", attrs: {level: 5}},\n {tag: \"h6\", attrs: {level: 6}}],\n toDOM: function toDOM(node) { return [\"h\" + node.attrs.level, 0] }\n },\n\n code_block: {\n content: \"text*\",\n group: \"block\",\n code: true,\n defining: true,\n marks: \"\",\n attrs: {params: {default: \"\"}},\n parseDOM: [{tag: \"pre\", preserveWhitespace: \"full\", getAttrs: function (node) { return (\n {params: node.getAttribute(\"data-params\") || \"\"}\n ); }}],\n toDOM: function toDOM(node) { return [\"pre\", node.attrs.params ? {\"data-params\": node.attrs.params} : {}, [\"code\", 0]] }\n },\n\n ordered_list: {\n content: \"list_item+\",\n group: \"block\",\n attrs: {order: {default: 1}, tight: {default: false}},\n parseDOM: [{tag: \"ol\", getAttrs: function getAttrs(dom) {\n return {order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\") : 1,\n tight: dom.hasAttribute(\"data-tight\")}\n }}],\n toDOM: function toDOM(node) {\n return [\"ol\", {start: node.attrs.order == 1 ? null : node.attrs.order,\n \"data-tight\": node.attrs.tight ? \"true\" : null}, 0]\n }\n },\n\n bullet_list: {\n content: \"list_item+\",\n group: \"block\",\n attrs: {tight: {default: false}},\n parseDOM: [{tag: \"ul\", getAttrs: function (dom) { return ({tight: dom.hasAttribute(\"data-tight\")}); }}],\n toDOM: function toDOM(node) { return [\"ul\", {\"data-tight\": node.attrs.tight ? \"true\" : null}, 0] }\n },\n\n list_item: {\n content: \"paragraph block*\",\n defining: true,\n parseDOM: [{tag: \"li\"}],\n toDOM: function toDOM() { return [\"li\", 0] }\n },\n\n text: {\n group: \"inline\"\n },\n\n image: {\n inline: true,\n attrs: {\n src: {},\n alt: {default: null},\n title: {default: null}\n },\n group: \"inline\",\n draggable: true,\n parseDOM: [{tag: \"img[src]\", getAttrs: function getAttrs(dom) {\n return {\n src: dom.getAttribute(\"src\"),\n title: dom.getAttribute(\"title\"),\n alt: dom.getAttribute(\"alt\")\n }\n }}],\n toDOM: function toDOM(node) { return [\"img\", node.attrs] }\n },\n\n hard_break: {\n inline: true,\n group: \"inline\",\n selectable: false,\n parseDOM: [{tag: \"br\"}],\n toDOM: function toDOM() { return [\"br\"] }\n }\n },\n\n marks: {\n em: {\n parseDOM: [{tag: \"i\"}, {tag: \"em\"},\n {style: \"font-style\", getAttrs: function (value) { return value == \"italic\" && null; }}],\n toDOM: function toDOM() { return [\"em\"] }\n },\n\n strong: {\n parseDOM: [{tag: \"b\"}, {tag: \"strong\"},\n {style: \"font-weight\", getAttrs: function (value) { return /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null; }}],\n toDOM: function toDOM() { return [\"strong\"] }\n },\n\n link: {\n attrs: {\n href: {},\n title: {default: null}\n },\n inclusive: false,\n parseDOM: [{tag: \"a[href]\", getAttrs: function getAttrs(dom) {\n return {href: dom.getAttribute(\"href\"), title: dom.getAttribute(\"title\")}\n }}],\n toDOM: function toDOM(node) { return [\"a\", node.attrs] }\n },\n\n code: {\n parseDOM: [{tag: \"code\"}],\n toDOM: function toDOM() { return [\"code\"] }\n }\n }\n});\n\nfunction maybeMerge(a, b) {\n if (a.isText && b.isText && Mark.sameSet(a.marks, b.marks))\n { return a.withText(a.text + b.text) }\n}\n\n// Object used to track the context of a running parse.\nvar MarkdownParseState = function MarkdownParseState(schema, tokenHandlers) {\n this.schema = schema;\n this.stack = [{type: schema.topNodeType, content: []}];\n this.marks = Mark.none;\n this.tokenHandlers = tokenHandlers;\n};\n\nMarkdownParseState.prototype.top = function top () {\n return this.stack[this.stack.length - 1]\n};\n\nMarkdownParseState.prototype.push = function push (elt) {\n if (this.stack.length) { this.top().content.push(elt); }\n};\n\n// : (string)\n// Adds the given text to the current position in the document,\n// using the current marks as styling.\nMarkdownParseState.prototype.addText = function addText (text) {\n if (!text) { return }\n var nodes = this.top().content, last = nodes[nodes.length - 1];\n var node = this.schema.text(text, this.marks), merged;\n if (last && (merged = maybeMerge(last, node))) { nodes[nodes.length - 1] = merged; }\n else { nodes.push(node); }\n};\n\n// : (Mark)\n// Adds the given mark to the set of active marks.\nMarkdownParseState.prototype.openMark = function openMark (mark) {\n this.marks = mark.addToSet(this.marks);\n};\n\n// : (Mark)\n// Removes the given mark from the set of active marks.\nMarkdownParseState.prototype.closeMark = function closeMark (mark) {\n this.marks = mark.removeFromSet(this.marks);\n};\n\nMarkdownParseState.prototype.parseTokens = function parseTokens (toks) {\n for (var i = 0; i < toks.length; i++) {\n var tok = toks[i];\n var handler = this.tokenHandlers[tok.type];\n if (!handler)\n { throw new Error(\"Token type `\" + tok.type + \"` not supported by Markdown parser\") }\n handler(this, tok, toks, i);\n }\n};\n\n// : (NodeType, ?Object, ?[Node]) → ?Node\n// Add a node at the current position.\nMarkdownParseState.prototype.addNode = function addNode (type, attrs, content) {\n var node = type.createAndFill(attrs, content, this.marks);\n if (!node) { return null }\n this.push(node);\n return node\n};\n\n// : (NodeType, ?Object)\n// Wrap subsequent content in a node of the given type.\nMarkdownParseState.prototype.openNode = function openNode (type, attrs) {\n this.stack.push({type: type, attrs: attrs, content: []});\n};\n\n// : () → ?Node\n// Close and return the node that is currently on top of the stack.\nMarkdownParseState.prototype.closeNode = function closeNode () {\n if (this.marks.length) { this.marks = Mark.none; }\n var info = this.stack.pop();\n return this.addNode(info.type, info.attrs, info.content)\n};\n\nfunction attrs(spec, token, tokens, i) {\n if (spec.getAttrs) { return spec.getAttrs(token, tokens, i) }\n // For backwards compatibility when `attrs` is a Function\n else if (spec.attrs instanceof Function) { return spec.attrs(token) }\n else { return spec.attrs }\n}\n\n// Code content is represented as a single token with a `content`\n// property in Markdown-it.\nfunction noCloseToken(spec, type) {\n return spec.noCloseToken || type == \"code_inline\" || type == \"code_block\" || type == \"fence\"\n}\n\nfunction withoutTrailingNewline(str) {\n return str[str.length - 1] == \"\\n\" ? str.slice(0, str.length - 1) : str\n}\n\nfunction noOp() {}\n\nfunction tokenHandlers(schema, tokens) {\n var handlers = Object.create(null);\n var loop = function ( type ) {\n var spec = tokens[type];\n if (spec.block) {\n var nodeType = schema.nodeType(spec.block);\n if (noCloseToken(spec, type)) {\n handlers[type] = function (state, tok, tokens, i) {\n state.openNode(nodeType, attrs(spec, tok, tokens, i));\n state.addText(withoutTrailingNewline(tok.content));\n state.closeNode();\n };\n } else {\n handlers[type + \"_open\"] = function (state, tok, tokens, i) { return state.openNode(nodeType, attrs(spec, tok, tokens, i)); };\n handlers[type + \"_close\"] = function (state) { return state.closeNode(); };\n }\n } else if (spec.node) {\n var nodeType$1 = schema.nodeType(spec.node);\n handlers[type] = function (state, tok, tokens, i) { return state.addNode(nodeType$1, attrs(spec, tok, tokens, i)); };\n } else if (spec.mark) {\n var markType = schema.marks[spec.mark];\n if (noCloseToken(spec, type)) {\n handlers[type] = function (state, tok, tokens, i) {\n state.openMark(markType.create(attrs(spec, tok, tokens, i)));\n state.addText(withoutTrailingNewline(tok.content));\n state.closeMark(markType);\n };\n } else {\n handlers[type + \"_open\"] = function (state, tok, tokens, i) { return state.openMark(markType.create(attrs(spec, tok, tokens, i))); };\n handlers[type + \"_close\"] = function (state) { return state.closeMark(markType); };\n }\n } else if (spec.ignore) {\n if (noCloseToken(spec, type)) {\n handlers[type] = noOp;\n } else {\n handlers[type + '_open'] = noOp;\n handlers[type + '_close'] = noOp;\n }\n } else {\n throw new RangeError(\"Unrecognized parsing spec \" + JSON.stringify(spec))\n }\n };\n\n for (var type in tokens) loop( type );\n\n handlers.text = function (state, tok) { return state.addText(tok.content); };\n handlers.inline = function (state, tok) { return state.parseTokens(tok.children); };\n handlers.softbreak = handlers.softbreak || (function (state) { return state.addText(\"\\n\"); });\n\n return handlers\n}\n\n// ::- A configuration of a Markdown parser. Such a parser uses\n// [markdown-it](https://github.com/markdown-it/markdown-it) to\n// tokenize a file, and then runs the custom rules it is given over\n// the tokens to create a ProseMirror document tree.\nvar MarkdownParser = function MarkdownParser(schema, tokenizer, tokens) {\n // :: Object The value of the `tokens` object used to construct\n // this parser. Can be useful to copy and modify to base other\n // parsers on.\n this.tokens = tokens;\n this.schema = schema;\n this.tokenizer = tokenizer;\n this.tokenHandlers = tokenHandlers(schema, tokens);\n};\n\n// :: (string) → Node\n// Parse a string as [CommonMark](http://commonmark.org/) markup,\n// and create a ProseMirror document as prescribed by this parser's\n// rules.\nMarkdownParser.prototype.parse = function parse (text) {\n var state = new MarkdownParseState(this.schema, this.tokenHandlers), doc;\n state.parseTokens(this.tokenizer.parse(text, {}));\n do { doc = state.closeNode(); } while (state.stack.length)\n return doc\n};\n\nfunction listIsTight(tokens, i) {\n while (++i < tokens.length)\n { if (tokens[i].type != \"list_item_open\") { return tokens[i].hidden } }\n return false\n}\n\n// :: MarkdownParser\n// A parser parsing unextended [CommonMark](http://commonmark.org/),\n// without inline HTML, and producing a document in the basic schema.\nvar defaultMarkdownParser = new MarkdownParser(schema, markdownit(\"commonmark\", {html: false}), {\n blockquote: {block: \"blockquote\"},\n paragraph: {block: \"paragraph\"},\n list_item: {block: \"list_item\"},\n bullet_list: {block: \"bullet_list\", getAttrs: function (_, tokens, i) { return ({tight: listIsTight(tokens, i)}); }},\n ordered_list: {block: \"ordered_list\", getAttrs: function (tok, tokens, i) { return ({\n order: +tok.attrGet(\"start\") || 1,\n tight: listIsTight(tokens, i)\n }); }},\n heading: {block: \"heading\", getAttrs: function (tok) { return ({level: +tok.tag.slice(1)}); }},\n code_block: {block: \"code_block\", noCloseToken: true},\n fence: {block: \"code_block\", getAttrs: function (tok) { return ({params: tok.info || \"\"}); }, noCloseToken: true},\n hr: {node: \"horizontal_rule\"},\n image: {node: \"image\", getAttrs: function (tok) { return ({\n src: tok.attrGet(\"src\"),\n title: tok.attrGet(\"title\") || null,\n alt: tok.children[0] && tok.children[0].content || null\n }); }},\n hardbreak: {node: \"hard_break\"},\n\n em: {mark: \"em\"},\n strong: {mark: \"strong\"},\n link: {mark: \"link\", getAttrs: function (tok) { return ({\n href: tok.attrGet(\"href\"),\n title: tok.attrGet(\"title\") || null\n }); }},\n code_inline: {mark: \"code\", noCloseToken: true}\n});\n\n// ::- A specification for serializing a ProseMirror document as\n// Markdown/CommonMark text.\nvar MarkdownSerializer = function MarkdownSerializer(nodes, marks) {\n // :: Object<(MarkdownSerializerState, Node)> The node serializer\n // functions for this serializer.\n this.nodes = nodes;\n // :: Object The mark serializer info.\n this.marks = marks;\n};\n\n// :: (Node, ?Object) → string\n// Serialize the content of the given node to\n// [CommonMark](http://commonmark.org/).\nMarkdownSerializer.prototype.serialize = function serialize (content, options) {\n var state = new MarkdownSerializerState(this.nodes, this.marks, options);\n state.renderContent(content);\n return state.out\n};\n\n// :: MarkdownSerializer\n// A serializer for the [basic schema](#schema).\nvar defaultMarkdownSerializer = new MarkdownSerializer({\n blockquote: function blockquote(state, node) {\n state.wrapBlock(\"> \", null, node, function () { return state.renderContent(node); });\n },\n code_block: function code_block(state, node) {\n state.write(\"```\" + (node.attrs.params || \"\") + \"\\n\");\n state.text(node.textContent, false);\n state.ensureNewLine();\n state.write(\"```\");\n state.closeBlock(node);\n },\n heading: function heading(state, node) {\n state.write(state.repeat(\"#\", node.attrs.level) + \" \");\n state.renderInline(node);\n state.closeBlock(node);\n },\n horizontal_rule: function horizontal_rule(state, node) {\n state.write(node.attrs.markup || \"---\");\n state.closeBlock(node);\n },\n bullet_list: function bullet_list(state, node) {\n state.renderList(node, \" \", function () { return (node.attrs.bullet || \"*\") + \" \"; });\n },\n ordered_list: function ordered_list(state, node) {\n var start = node.attrs.order || 1;\n var maxW = String(start + node.childCount - 1).length;\n var space = state.repeat(\" \", maxW + 2);\n state.renderList(node, space, function (i) {\n var nStr = String(start + i);\n return state.repeat(\" \", maxW - nStr.length) + nStr + \". \"\n });\n },\n list_item: function list_item(state, node) {\n state.renderContent(node);\n },\n paragraph: function paragraph(state, node) {\n state.renderInline(node);\n state.closeBlock(node);\n },\n\n image: function image(state, node) {\n state.write(\"![\" + state.esc(node.attrs.alt || \"\") + \"](\" + state.esc(node.attrs.src) +\n (node.attrs.title ? \" \" + state.quote(node.attrs.title) : \"\") + \")\");\n },\n hard_break: function hard_break(state, node, parent, index) {\n for (var i = index + 1; i < parent.childCount; i++)\n { if (parent.child(i).type != node.type) {\n state.write(\"\\\\\\n\");\n return\n } }\n },\n text: function text(state, node) {\n state.text(node.text);\n }\n}, {\n em: {open: \"*\", close: \"*\", mixable: true, expelEnclosingWhitespace: true},\n strong: {open: \"**\", close: \"**\", mixable: true, expelEnclosingWhitespace: true},\n link: {\n open: function open(_state, mark, parent, index) {\n return isPlainURL(mark, parent, index, 1) ? \"<\" : \"[\"\n },\n close: function close(state, mark, parent, index) {\n return isPlainURL(mark, parent, index, -1) ? \">\"\n : \"](\" + state.esc(mark.attrs.href) + (mark.attrs.title ? \" \" + state.quote(mark.attrs.title) : \"\") + \")\"\n }\n },\n code: {open: function open(_state, _mark, parent, index) { return backticksFor(parent.child(index), -1) },\n close: function close(_state, _mark, parent, index) { return backticksFor(parent.child(index - 1), 1) },\n escape: false}\n});\n\nfunction backticksFor(node, side) {\n var ticks = /`+/g, m, len = 0;\n if (node.isText) { while (m = ticks.exec(node.text)) { len = Math.max(len, m[0].length); } }\n var result = len > 0 && side > 0 ? \" `\" : \"`\";\n for (var i = 0; i < len; i++) { result += \"`\"; }\n if (len > 0 && side < 0) { result += \" \"; }\n return result\n}\n\nfunction isPlainURL(link, parent, index, side) {\n if (link.attrs.title || !/^\\w+:/.test(link.attrs.href)) { return false }\n var content = parent.child(index + (side < 0 ? -1 : 0));\n if (!content.isText || content.text != link.attrs.href || content.marks[content.marks.length - 1] != link) { return false }\n if (index == (side < 0 ? 1 : parent.childCount - 1)) { return true }\n var next = parent.child(index + (side < 0 ? -2 : 1));\n return !link.isInSet(next.marks)\n}\n\n// ::- This is an object used to track state and expose\n// methods related to markdown serialization. Instances are passed to\n// node and mark serialization methods (see `toMarkdown`).\nvar MarkdownSerializerState = function MarkdownSerializerState(nodes, marks, options) {\n this.nodes = nodes;\n this.marks = marks;\n this.delim = this.out = \"\";\n this.closed = false;\n this.inTightList = false;\n // :: Object\n // The options passed to the serializer.\n // tightLists:: ?bool\n // Whether to render lists in a tight style. This can be overridden\n // on a node level by specifying a tight attribute on the node.\n // Defaults to false.\n this.options = options || {};\n if (typeof this.options.tightLists == \"undefined\")\n { this.options.tightLists = false; }\n};\n\nMarkdownSerializerState.prototype.flushClose = function flushClose (size) {\n if (this.closed) {\n if (!this.atBlank()) { this.out += \"\\n\"; }\n if (size == null) { size = 2; }\n if (size > 1) {\n var delimMin = this.delim;\n var trim = /\\s+$/.exec(delimMin);\n if (trim) { delimMin = delimMin.slice(0, delimMin.length - trim[0].length); }\n for (var i = 1; i < size; i++)\n { this.out += delimMin + \"\\n\"; }\n }\n this.closed = false;\n }\n};\n\n// :: (string, ?string, Node, ())\n// Render a block, prefixing each line with `delim`, and the first\n// line in `firstDelim`. `node` should be the node that is closed at\n// the end of the block, and `f` is a function that renders the\n// content of the block.\nMarkdownSerializerState.prototype.wrapBlock = function wrapBlock (delim, firstDelim, node, f) {\n var old = this.delim;\n this.write(firstDelim || delim);\n this.delim += delim;\n f();\n this.delim = old;\n this.closeBlock(node);\n};\n\nMarkdownSerializerState.prototype.atBlank = function atBlank () {\n return /(^|\\n)$/.test(this.out)\n};\n\n// :: ()\n// Ensure the current content ends with a newline.\nMarkdownSerializerState.prototype.ensureNewLine = function ensureNewLine () {\n if (!this.atBlank()) { this.out += \"\\n\"; }\n};\n\n// :: (?string)\n// Prepare the state for writing output (closing closed paragraphs,\n// adding delimiters, and so on), and then optionally add content\n// (unescaped) to the output.\nMarkdownSerializerState.prototype.write = function write (content) {\n this.flushClose();\n if (this.delim && this.atBlank())\n { this.out += this.delim; }\n if (content) { this.out += content; }\n};\n\n// :: (Node)\n// Close the block for the given node.\nMarkdownSerializerState.prototype.closeBlock = function closeBlock (node) {\n this.closed = node;\n};\n\n// :: (string, ?bool)\n// Add the given text to the document. When escape is not `false`,\n// it will be escaped.\nMarkdownSerializerState.prototype.text = function text (text$1, escape) {\n var lines = text$1.split(\"\\n\");\n for (var i = 0; i < lines.length; i++) {\n var startOfLine = this.atBlank() || this.closed;\n this.write();\n this.out += escape !== false ? this.esc(lines[i], startOfLine) : lines[i];\n if (i != lines.length - 1) { this.out += \"\\n\"; }\n }\n};\n\n// :: (Node)\n// Render the given node as a block.\nMarkdownSerializerState.prototype.render = function render (node, parent, index) {\n if (typeof parent == \"number\") { throw new Error(\"!\") }\n if (!this.nodes[node.type.name]) { throw new Error(\"Token type `\" + node.type.name + \"` not supported by Markdown renderer\") }\n this.nodes[node.type.name](this, node, parent, index);\n};\n\n// :: (Node)\n// Render the contents of `parent` as block nodes.\nMarkdownSerializerState.prototype.renderContent = function renderContent (parent) {\n var this$1 = this;\n\n parent.forEach(function (node, _, i) { return this$1.render(node, parent, i); });\n};\n\n// :: (Node)\n// Render the contents of `parent` as inline content.\nMarkdownSerializerState.prototype.renderInline = function renderInline (parent) {\n var this$1 = this;\n\n var active = [], trailing = \"\";\n var progress = function (node, _, index) {\n var marks = node ? node.marks : [];\n\n // Remove marks from `hard_break` that are the last node inside\n // that mark to prevent parser edge cases with new lines just\n // before closing marks.\n // (FIXME it'd be nice if we had a schema-agnostic way to\n // identify nodes that serialize as hard breaks)\n if (node && node.type.name === \"hard_break\")\n { marks = marks.filter(function (m) {\n if (index + 1 == parent.childCount) { return false }\n var next = parent.child(index + 1);\n return m.isInSet(next.marks) && (!next.isText || /\\S/.test(next.text))\n }); }\n\n var leading = trailing;\n trailing = \"\";\n // If whitespace has to be expelled from the node, adjust\n // leading and trailing accordingly.\n if (node && node.isText && marks.some(function (mark) {\n var info = this$1.marks[mark.type.name];\n return info && info.expelEnclosingWhitespace\n })) {\n var ref = /^(\\s*)(.*?)(\\s*)$/m.exec(node.text);\n var _$1 = ref[0];\n var lead = ref[1];\n var inner$1 = ref[2];\n var trail = ref[3];\n leading += lead;\n trailing = trail;\n if (lead || trail) {\n node = inner$1 ? node.withText(inner$1) : null;\n if (!node) { marks = active; }\n }\n }\n\n var inner = marks.length && marks[marks.length - 1], noEsc = inner && this$1.marks[inner.type.name].escape === false;\n var len = marks.length - (noEsc ? 1 : 0);\n\n // Try to reorder 'mixable' marks, such as em and strong, which\n // in Markdown may be opened and closed in different order, so\n // that order of the marks for the token matches the order in\n // active.\n outer: for (var i = 0; i < len; i++) {\n var mark = marks[i];\n if (!this$1.marks[mark.type.name].mixable) { break }\n for (var j = 0; j < active.length; j++) {\n var other = active[j];\n if (!this$1.marks[other.type.name].mixable) { break }\n if (mark.eq(other)) {\n if (i > j)\n { marks = marks.slice(0, j).concat(mark).concat(marks.slice(j, i)).concat(marks.slice(i + 1, len)); }\n else if (j > i)\n { marks = marks.slice(0, i).concat(marks.slice(i + 1, j)).concat(mark).concat(marks.slice(j, len)); }\n continue outer\n }\n }\n }\n\n // Find the prefix of the mark set that didn't change\n var keep = 0;\n while (keep < Math.min(active.length, len) && marks[keep].eq(active[keep])) { ++keep; }\n\n // Close the marks that need to be closed\n while (keep < active.length)\n { this$1.text(this$1.markString(active.pop(), false, parent, index), false); }\n\n // Output any previously expelled trailing whitespace outside the marks\n if (leading) { this$1.text(leading); }\n\n // Open the marks that need to be opened\n if (node) {\n while (active.length < len) {\n var add = marks[active.length];\n active.push(add);\n this$1.text(this$1.markString(add, true, parent, index), false);\n }\n\n // Render the node. Special case code marks, since their content\n // may not be escaped.\n if (noEsc && node.isText)\n { this$1.text(this$1.markString(inner, true, parent, index) + node.text +\n this$1.markString(inner, false, parent, index + 1), false); }\n else\n { this$1.render(node, parent, index); }\n }\n };\n parent.forEach(progress);\n progress(null, null, parent.childCount);\n};\n\n// :: (Node, string, (number) → string)\n// Render a node's content as a list. `delim` should be the extra\n// indentation added to all lines except the first in an item,\n// `firstDelim` is a function going from an item index to a\n// delimiter for the first line of the item.\nMarkdownSerializerState.prototype.renderList = function renderList (node, delim, firstDelim) {\n var this$1 = this;\n\n if (this.closed && this.closed.type == node.type)\n { this.flushClose(3); }\n else if (this.inTightList)\n { this.flushClose(1); }\n\n var isTight = typeof node.attrs.tight != \"undefined\" ? node.attrs.tight : this.options.tightLists;\n var prevTight = this.inTightList;\n this.inTightList = isTight;\n node.forEach(function (child, _, i) {\n if (i && isTight) { this$1.flushClose(1); }\n this$1.wrapBlock(delim, firstDelim(i), node, function () { return this$1.render(child, node, i); });\n });\n this.inTightList = prevTight;\n};\n\n// :: (string, ?bool) → string\n// Escape the given string so that it can safely appear in Markdown\n// content. If `startOfLine` is true, also escape characters that\n// have special meaning only at the start of the line.\nMarkdownSerializerState.prototype.esc = function esc (str, startOfLine) {\n str = str.replace(/[`*\\\\~\\[\\]]/g, \"\\\\$&\");\n if (startOfLine) { str = str.replace(/^[:#\\-*+]/, \"\\\\$&\").replace(/^(\\s*\\d+)\\./, \"$1\\\\.\"); }\n return str\n};\n\nMarkdownSerializerState.prototype.quote = function quote (str) {\n var wrap = str.indexOf('\"') == -1 ? '\"\"' : str.indexOf(\"'\") == -1 ? \"''\" : \"()\";\n return wrap[0] + str + wrap[1]\n};\n\n// :: (string, number) → string\n// Repeat the given string `n` times.\nMarkdownSerializerState.prototype.repeat = function repeat (str, n) {\n var out = \"\";\n for (var i = 0; i < n; i++) { out += str; }\n return out\n};\n\n// : (Mark, bool, string?) → string\n// Get the markdown string for a given opening or closing mark.\nMarkdownSerializerState.prototype.markString = function markString (mark, open, parent, index) {\n var info = this.marks[mark.type.name];\n var value = open ? info.open : info.close;\n return typeof value == \"string\" ? value : value(this, mark, parent, index)\n};\n\n// :: (string) → { leading: ?string, trailing: ?string }\n// Get leading and trailing whitespace from a string. Values of\n// leading or trailing property of the return object will be undefined\n// if there is no match.\nMarkdownSerializerState.prototype.getEnclosingWhitespace = function getEnclosingWhitespace (text) {\n return {\n leading: (text.match(/^(\\s+)/) || [])[0],\n trailing: (text.match(/(\\s+)$/) || [])[0]\n }\n};\n\nexport { MarkdownParser, MarkdownSerializer, MarkdownSerializerState, defaultMarkdownParser, defaultMarkdownSerializer, schema };\n//# sourceMappingURL=index.es.js.map\n","import { findWrapping, ReplaceAroundStep, canSplit, liftTarget } from 'prosemirror-transform';\nimport { NodeRange, Fragment, Slice } from 'prosemirror-model';\n\nvar olDOM = [\"ol\", 0], ulDOM = [\"ul\", 0], liDOM = [\"li\", 0];\n\n// :: NodeSpec\n// An ordered list [node spec](#model.NodeSpec). Has a single\n// attribute, `order`, which determines the number at which the list\n// starts counting, and defaults to 1. Represented as an `
        `\n// element.\nvar orderedList = {\n attrs: {order: {default: 1}},\n parseDOM: [{tag: \"ol\", getAttrs: function getAttrs(dom) {\n return {order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\") : 1}\n }}],\n toDOM: function toDOM(node) {\n return node.attrs.order == 1 ? olDOM : [\"ol\", {start: node.attrs.order}, 0]\n }\n};\n\n// :: NodeSpec\n// A bullet list node spec, represented in the DOM as `
          `.\nvar bulletList = {\n parseDOM: [{tag: \"ul\"}],\n toDOM: function toDOM() { return ulDOM }\n};\n\n// :: NodeSpec\n// A list item (`
        • `) spec.\nvar listItem = {\n parseDOM: [{tag: \"li\"}],\n toDOM: function toDOM() { return liDOM },\n defining: true\n};\n\nfunction add(obj, props) {\n var copy = {};\n for (var prop in obj) { copy[prop] = obj[prop]; }\n for (var prop$1 in props) { copy[prop$1] = props[prop$1]; }\n return copy\n}\n\n// :: (OrderedMap, string, ?string) → OrderedMap\n// Convenience function for adding list-related node types to a map\n// specifying the nodes for a schema. Adds\n// [`orderedList`](#schema-list.orderedList) as `\"ordered_list\"`,\n// [`bulletList`](#schema-list.bulletList) as `\"bullet_list\"`, and\n// [`listItem`](#schema-list.listItem) as `\"list_item\"`.\n//\n// `itemContent` determines the content expression for the list items.\n// If you want the commands defined in this module to apply to your\n// list structure, it should have a shape like `\"paragraph block*\"` or\n// `\"paragraph (ordered_list | bullet_list)*\"`. `listGroup` can be\n// given to assign a group name to the list node types, for example\n// `\"block\"`.\nfunction addListNodes(nodes, itemContent, listGroup) {\n return nodes.append({\n ordered_list: add(orderedList, {content: \"list_item+\", group: listGroup}),\n bullet_list: add(bulletList, {content: \"list_item+\", group: listGroup}),\n list_item: add(listItem, {content: itemContent})\n })\n}\n\n// :: (NodeType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Returns a command function that wraps the selection in a list with\n// the given type an attributes. If `dispatch` is null, only return a\n// value to indicate whether this is possible, but don't actually\n// perform the change.\nfunction wrapInList(listType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to), doJoin = false, outerRange = range;\n if (!range) { return false }\n // This is at the top of an existing list item\n if (range.depth >= 2 && $from.node(range.depth - 1).type.compatibleContent(listType) && range.startIndex == 0) {\n // Don't do anything if this is the top of the list\n if ($from.index(range.depth - 1) == 0) { return false }\n var $insert = state.doc.resolve(range.start - 2);\n outerRange = new NodeRange($insert, $insert, range.depth);\n if (range.endIndex < range.parent.childCount)\n { range = new NodeRange($from, state.doc.resolve($to.end(range.depth)), range.depth); }\n doJoin = true;\n }\n var wrap = findWrapping(outerRange, listType, attrs, range);\n if (!wrap) { return false }\n if (dispatch) { dispatch(doWrapInList(state.tr, range, wrap, doJoin, listType).scrollIntoView()); }\n return true\n }\n}\n\nfunction doWrapInList(tr, range, wrappers, joinBefore, listType) {\n var content = Fragment.empty;\n for (var i = wrappers.length - 1; i >= 0; i--)\n { content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content)); }\n\n tr.step(new ReplaceAroundStep(range.start - (joinBefore ? 2 : 0), range.end, range.start, range.end,\n new Slice(content, 0, 0), wrappers.length, true));\n\n var found = 0;\n for (var i$1 = 0; i$1 < wrappers.length; i$1++) { if (wrappers[i$1].type == listType) { found = i$1 + 1; } }\n var splitDepth = wrappers.length - found;\n\n var splitPos = range.start + wrappers.length - (joinBefore ? 2 : 0), parent = range.parent;\n for (var i$2 = range.startIndex, e = range.endIndex, first = true; i$2 < e; i$2++, first = false) {\n if (!first && canSplit(tr.doc, splitPos, splitDepth)) {\n tr.split(splitPos, splitDepth);\n splitPos += 2 * splitDepth;\n }\n splitPos += parent.child(i$2).nodeSize;\n }\n return tr\n}\n\n// :: (NodeType) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Build a command that splits a non-empty textblock at the top level\n// of a list item by also splitting that list item.\nfunction splitListItem(itemType) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var node = ref.node;\n if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to)) { return false }\n var grandParent = $from.node(-1);\n if (grandParent.type != itemType) { return false }\n if ($from.parent.content.size == 0 && $from.node(-1).childCount == $from.indexAfter(-1)) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if ($from.depth == 2 || $from.node(-3).type != itemType ||\n $from.index(-2) != $from.node(-2).childCount - 1) { return false }\n if (dispatch) {\n var wrap = Fragment.empty, keepItem = $from.index(-1) > 0;\n // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n for (var d = $from.depth - (keepItem ? 1 : 2); d >= $from.depth - 3; d--)\n { wrap = Fragment.from($from.node(d).copy(wrap)); }\n // Add a second list item with an empty default start node\n wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n var tr$1 = state.tr.replace($from.before(keepItem ? null : -1), $from.after(-3), new Slice(wrap, keepItem ? 3 : 2, 2));\n tr$1.setSelection(state.selection.constructor.near(tr$1.doc.resolve($from.pos + (keepItem ? 3 : 2))));\n dispatch(tr$1.scrollIntoView());\n }\n return true\n }\n var nextType = $to.pos == $from.end() ? grandParent.contentMatchAt(0).defaultType : null;\n var tr = state.tr.delete($from.pos, $to.pos);\n var types = nextType && [null, {type: nextType}];\n if (!canSplit(tr.doc, $from.pos, 2, types)) { return false }\n if (dispatch) { dispatch(tr.split($from.pos, 2, types).scrollIntoView()); }\n return true\n }\n}\n\n// :: (NodeType) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Create a command to lift the list item around the selection up into\n// a wrapping list.\nfunction liftListItem(itemType) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to, function (node) { return node.childCount && node.firstChild.type == itemType; });\n if (!range) { return false }\n if (!dispatch) { return true }\n if ($from.node(range.depth - 1).type == itemType) // Inside a parent list\n { return liftToOuterList(state, dispatch, itemType, range) }\n else // Outer list node\n { return liftOutOfList(state, dispatch, range) }\n }\n}\n\nfunction liftToOuterList(state, dispatch, itemType, range) {\n var tr = state.tr, end = range.end, endOfList = range.$to.end(range.depth);\n if (end < endOfList) {\n // There are siblings after the lifted items, which must become\n // children of the last item\n tr.step(new ReplaceAroundStep(end - 1, endOfList, end, endOfList,\n new Slice(Fragment.from(itemType.create(null, range.parent.copy())), 1, 0), 1, true));\n range = new NodeRange(tr.doc.resolve(range.$from.pos), tr.doc.resolve(endOfList), range.depth);\n }\n dispatch(tr.lift(range, liftTarget(range)).scrollIntoView());\n return true\n}\n\nfunction liftOutOfList(state, dispatch, range) {\n var tr = state.tr, list = range.parent;\n // Merge the list items into a single big item\n for (var pos = range.end, i = range.endIndex - 1, e = range.startIndex; i > e; i--) {\n pos -= list.child(i).nodeSize;\n tr.delete(pos - 1, pos + 1);\n }\n var $start = tr.doc.resolve(range.start), item = $start.nodeAfter;\n var atStart = range.startIndex == 0, atEnd = range.endIndex == list.childCount;\n var parent = $start.node(-1), indexBefore = $start.index(-1);\n if (!parent.canReplace(indexBefore + (atStart ? 0 : 1), indexBefore + 1,\n item.content.append(atEnd ? Fragment.empty : Fragment.from(list))))\n { return false }\n var start = $start.pos, end = start + item.nodeSize;\n // Strip off the surrounding list. At the sides where we're not at\n // the end of the list, the existing list is closed. At sides where\n // this is the end, it is overwritten to its end.\n tr.step(new ReplaceAroundStep(start - (atStart ? 1 : 0), end + (atEnd ? 1 : 0), start + 1, end - 1,\n new Slice((atStart ? Fragment.empty : Fragment.from(list.copy(Fragment.empty)))\n .append(atEnd ? Fragment.empty : Fragment.from(list.copy(Fragment.empty))),\n atStart ? 0 : 1, atEnd ? 0 : 1), atStart ? 0 : 1));\n dispatch(tr.scrollIntoView());\n return true\n}\n\n// :: (NodeType) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Create a command to sink the list item around the selection down\n// into an inner list.\nfunction sinkListItem(itemType) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to, function (node) { return node.childCount && node.firstChild.type == itemType; });\n if (!range) { return false }\n var startIndex = range.startIndex;\n if (startIndex == 0) { return false }\n var parent = range.parent, nodeBefore = parent.child(startIndex - 1);\n if (nodeBefore.type != itemType) { return false }\n\n if (dispatch) {\n var nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type == parent.type;\n var inner = Fragment.from(nestedBefore ? itemType.create() : null);\n var slice = new Slice(Fragment.from(itemType.create(null, Fragment.from(parent.type.create(null, inner)))),\n nestedBefore ? 3 : 1, 0);\n var before = range.start, after = range.end;\n dispatch(state.tr.step(new ReplaceAroundStep(before - (nestedBefore ? 3 : 1), after,\n before, after, slice, 1, true))\n .scrollIntoView());\n }\n return true\n }\n}\n\nexport { addListNodes, bulletList, liftListItem, listItem, orderedList, sinkListItem, splitListItem, wrapInList };\n//# sourceMappingURL=index.es.js.map\n","module.exports = flarum.core.compat['common/components/Tooltip'];","import Component from 'flarum/common/Component';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport icon from 'flarum/common/helpers/icon';\nimport extractText from 'flarum/common/utils/extractText';\n\nexport default class CommandButton extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n this.state.addItem(this.attrs.type, this.attrs.command, this.onEditorUpdate.bind(this));\n }\n\n view() {\n return (\n \n \n \n );\n }\n\n keydown(e) {\n if (e.key === ' ' || e.key === 'Enter') {\n this.click(e);\n }\n }\n\n click(e) {\n e.preventDefault();\n return this.state.run(this.attrs.type);\n }\n\n title() {\n let tooltip = app.translator.trans(`askvortsov-rich-text.lib.composer.${this.attrs.type}_tooltip`);\n\n return tooltip;\n }\n\n onEditorUpdate() {}\n}\n","module.exports = flarum.core.compat['common/utils/extractText'];","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","\n /*!\n * tiptap-utils v1.13.0\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { NodeSelection } from 'prosemirror-state';\n\nfunction createCell(cellType, cellContent) {\n if (cellContent) {\n return cellType.createChecked(null, cellContent);\n }\n\n return cellType.createAndFill();\n}\n\nfunction getTableNodeTypes(schema) {\n if (schema.cached.tableNodeTypes) {\n return schema.cached.tableNodeTypes;\n }\n\n const roles = {};\n Object.keys(schema.nodes).forEach(type => {\n const nodeType = schema.nodes[type];\n\n if (nodeType.spec.tableRole) {\n roles[nodeType.spec.tableRole] = nodeType;\n }\n }); // eslint-disable-next-line\n\n schema.cached.tableNodeTypes = roles;\n return roles;\n}\n\nfunction createTable(schema, rowsCount, colsCount, withHeaderRow, cellContent) {\n const types = getTableNodeTypes(schema);\n const headerCells = [];\n const cells = [];\n\n for (let index = 0; index < colsCount; index += 1) {\n const cell = createCell(types.cell, cellContent);\n\n if (cell) {\n cells.push(cell);\n }\n\n if (withHeaderRow) {\n const headerCell = createCell(types.header_cell, cellContent);\n\n if (headerCell) {\n headerCells.push(headerCell);\n }\n }\n }\n\n const rows = [];\n\n for (let index = 0; index < rowsCount; index += 1) {\n rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells));\n }\n\n return types.table.createChecked(null, rows);\n}\n\nfunction equalNodeType(nodeType, node) {\n return Array.isArray(nodeType) && nodeType.indexOf(node.type) > -1 || node.type === nodeType;\n}\n\nfunction flatten(node) {\n // eslint-disable-next-line\n const descend = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!node) {\n throw new Error('Invalid \"node\" parameter');\n }\n\n const result = []; // eslint-disable-next-line\n\n node.descendants((child, pos) => {\n result.push({\n node: child,\n pos\n });\n\n if (!descend) {\n return false;\n }\n });\n return result;\n}\n\nfunction findChildren(node, predicate, descend) {\n if (!node) {\n throw new Error('Invalid \"node\" parameter');\n } else if (!predicate) {\n throw new Error('Invalid \"predicate\" parameter');\n }\n\n return flatten(node, descend).filter(child => predicate(child.node));\n}\n\nfunction findBlockNodes(node, descend) {\n return findChildren(node, child => child.isBlock, descend);\n}\n\n// eslint-disable-next-line\nfunction findParentNodeClosestToPos($pos, predicate) {\n for (let i = $pos.depth; i > 0; i -= 1) {\n const node = $pos.node(i);\n\n if (predicate(node)) {\n return {\n pos: i > 0 ? $pos.before(i) : 0,\n start: $pos.start(i),\n depth: i,\n node\n };\n }\n }\n}\n\nfunction findParentNode(predicate) {\n return selection => findParentNodeClosestToPos(selection.$from, predicate);\n}\n\nfunction isNodeSelection(selection) {\n return selection instanceof NodeSelection;\n}\n\nfunction findSelectedNodeOfType(nodeType) {\n // eslint-disable-next-line\n return function (selection) {\n if (isNodeSelection(selection)) {\n const {\n node\n } = selection;\n const {\n $from\n } = selection;\n\n if (equalNodeType(nodeType, node)) {\n return {\n node,\n pos: $from.pos,\n depth: $from.depth\n };\n }\n }\n };\n}\n\nfunction getMarkAttrs(state, type) {\n const {\n from,\n to\n } = state.selection;\n let marks = [];\n state.doc.nodesBetween(from, to, node => {\n marks = [...marks, ...node.marks];\n });\n const mark = marks.find(markItem => markItem.type.name === type.name);\n\n if (mark) {\n return mark.attrs;\n }\n\n return {};\n}\n\nfunction getMarkRange($pos = null, type = null) {\n if (!$pos || !type) {\n return false;\n }\n\n const start = $pos.parent.childAfter($pos.parentOffset);\n\n if (!start.node) {\n return false;\n }\n\n const link = start.node.marks.find(mark => mark.type === type);\n\n if (!link) {\n return false;\n }\n\n let startIndex = $pos.index();\n let startPos = $pos.start() + start.offset;\n let endIndex = startIndex + 1;\n let endPos = startPos + start.node.nodeSize;\n\n while (startIndex > 0 && link.isInSet($pos.parent.child(startIndex - 1).marks)) {\n startIndex -= 1;\n startPos -= $pos.parent.child(startIndex).nodeSize;\n }\n\n while (endIndex < $pos.parent.childCount && link.isInSet($pos.parent.child(endIndex).marks)) {\n endPos += $pos.parent.child(endIndex).nodeSize;\n endIndex += 1;\n }\n\n return {\n from: startPos,\n to: endPos\n };\n}\n\nfunction getNodeAttrs(state, type) {\n const {\n from,\n to\n } = state.selection;\n let nodes = [];\n state.doc.nodesBetween(from, to, node => {\n nodes = [...nodes, node];\n });\n const node = nodes.reverse().find(nodeItem => nodeItem.type.name === type.name);\n\n if (node) {\n return node.attrs;\n }\n\n return {};\n}\n\nfunction markIsActive(state, type) {\n const {\n from,\n $from,\n to,\n empty\n } = state.selection;\n\n if (empty) {\n return !!type.isInSet(state.storedMarks || $from.marks());\n }\n\n return !!state.doc.rangeHasMark(from, to, type);\n}\n\nfunction nodeEqualsType({\n types,\n node\n}) {\n return Array.isArray(types) && types.includes(node.type) || node.type === types;\n}\n\nfunction nodeIsActive(state, type, attrs = {}) {\n const predicate = node => node.type === type;\n\n const node = findSelectedNodeOfType(type)(state.selection) || findParentNode(predicate)(state.selection);\n\n if (!Object.keys(attrs).length || !node) {\n return !!node;\n }\n\n return node.node.hasMarkup(type, { ...node.node.attrs,\n ...attrs\n });\n}\n\nexport { createCell, createTable, equalNodeType, findBlockNodes, findChildren, findParentNode, findParentNodeClosestToPos, findSelectedNodeOfType, flatten, getMarkAttrs, getMarkRange, getNodeAttrs, getTableNodeTypes, isNodeSelection, markIsActive, nodeEqualsType, nodeIsActive };\n","import { toggleMark } from 'tiptap-commands';\nimport CommandButton from './CommandButton';\n\nexport default class MarkButton extends CommandButton {\n static initAttrs(attrs) {\n attrs.command = toggleMark(attrs.mark);\n }\n\n onEditorUpdate() {\n this.$().toggleClass('active', !!this.state.markActive(this.attrs.mark));\n }\n}\n","export var base = {\n 8: \"Backspace\",\n 9: \"Tab\",\n 10: \"Enter\",\n 12: \"NumLock\",\n 13: \"Enter\",\n 16: \"Shift\",\n 17: \"Control\",\n 18: \"Alt\",\n 20: \"CapsLock\",\n 27: \"Escape\",\n 32: \" \",\n 33: \"PageUp\",\n 34: \"PageDown\",\n 35: \"End\",\n 36: \"Home\",\n 37: \"ArrowLeft\",\n 38: \"ArrowUp\",\n 39: \"ArrowRight\",\n 40: \"ArrowDown\",\n 44: \"PrintScreen\",\n 45: \"Insert\",\n 46: \"Delete\",\n 59: \";\",\n 61: \"=\",\n 91: \"Meta\",\n 92: \"Meta\",\n 106: \"*\",\n 107: \"+\",\n 108: \",\",\n 109: \"-\",\n 110: \".\",\n 111: \"/\",\n 144: \"NumLock\",\n 145: \"ScrollLock\",\n 160: \"Shift\",\n 161: \"Shift\",\n 162: \"Control\",\n 163: \"Control\",\n 164: \"Alt\",\n 165: \"Alt\",\n 173: \"-\",\n 186: \";\",\n 187: \"=\",\n 188: \",\",\n 189: \"-\",\n 190: \".\",\n 191: \"/\",\n 192: \"`\",\n 219: \"[\",\n 220: \"\\\\\",\n 221: \"]\",\n 222: \"'\",\n 229: \"q\"\n}\n\nexport var shift = {\n 48: \")\",\n 49: \"!\",\n 50: \"@\",\n 51: \"#\",\n 52: \"$\",\n 53: \"%\",\n 54: \"^\",\n 55: \"&\",\n 56: \"*\",\n 57: \"(\",\n 59: \":\",\n 61: \"+\",\n 173: \"_\",\n 186: \":\",\n 187: \"+\",\n 188: \"<\",\n 189: \"_\",\n 190: \">\",\n 191: \"?\",\n 192: \"~\",\n 219: \"{\",\n 220: \"|\",\n 221: \"}\",\n 222: \"\\\"\",\n 229: \"Q\"\n}\n\nvar chrome = typeof navigator != \"undefined\" && /Chrome\\/(\\d+)/.exec(navigator.userAgent)\nvar safari = typeof navigator != \"undefined\" && /Apple Computer/.test(navigator.vendor)\nvar gecko = typeof navigator != \"undefined\" && /Gecko\\/\\d+/.test(navigator.userAgent)\nvar mac = typeof navigator != \"undefined\" && /Mac/.test(navigator.platform)\nvar ie = typeof navigator != \"undefined\" && /MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent)\nvar brokenModifierNames = chrome && (mac || +chrome[1] < 57) || gecko && mac\n\n// Fill in the digit keys\nfor (var i = 0; i < 10; i++) base[48 + i] = base[96 + i] = String(i)\n\n// The function keys\nfor (var i = 1; i <= 24; i++) base[i + 111] = \"F\" + i\n\n// And the alphabetic keys\nfor (var i = 65; i <= 90; i++) {\n base[i] = String.fromCharCode(i + 32)\n shift[i] = String.fromCharCode(i)\n}\n\n// For each code that doesn't have a shift-equivalent, copy the base name\nfor (var code in base) if (!shift.hasOwnProperty(code)) shift[code] = base[code]\n\nexport function keyName(event) {\n // Don't trust event.key in Chrome when there are modifiers until\n // they fix https://bugs.chromium.org/p/chromium/issues/detail?id=633838\n var ignoreKey = brokenModifierNames && (event.ctrlKey || event.altKey || event.metaKey) ||\n (safari || ie) && event.shiftKey && event.key && event.key.length == 1\n var name = (!ignoreKey && event.key) ||\n (event.shiftKey ? shift : base)[event.keyCode] ||\n event.key || \"Unidentified\"\n // Edge sometimes produces wrong names (Issue #3)\n if (name == \"Esc\") name = \"Escape\"\n if (name == \"Del\") name = \"Delete\"\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/\n if (name == \"Left\") name = \"ArrowLeft\"\n if (name == \"Up\") name = \"ArrowUp\"\n if (name == \"Right\") name = \"ArrowRight\"\n if (name == \"Down\") name = \"ArrowDown\"\n return name\n}\n","import { keyName, base } from 'w3c-keyname';\nimport { Plugin } from 'prosemirror-state';\n\n// declare global: navigator\n\nvar mac = typeof navigator != \"undefined\" ? /Mac/.test(navigator.platform) : false;\n\nfunction normalizeKeyName(name) {\n var parts = name.split(/-(?!$)/), result = parts[parts.length - 1];\n if (result == \"Space\") { result = \" \"; }\n var alt, ctrl, shift, meta;\n for (var i = 0; i < parts.length - 1; i++) {\n var mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod)) { meta = true; }\n else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n else if (/^mod$/i.test(mod)) { if (mac) { meta = true; } else { ctrl = true; } }\n else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n }\n if (alt) { result = \"Alt-\" + result; }\n if (ctrl) { result = \"Ctrl-\" + result; }\n if (meta) { result = \"Meta-\" + result; }\n if (shift) { result = \"Shift-\" + result; }\n return result\n}\n\nfunction normalize(map) {\n var copy = Object.create(null);\n for (var prop in map) { copy[normalizeKeyName(prop)] = map[prop]; }\n return copy\n}\n\nfunction modifiers(name, event, shift) {\n if (event.altKey) { name = \"Alt-\" + name; }\n if (event.ctrlKey) { name = \"Ctrl-\" + name; }\n if (event.metaKey) { name = \"Meta-\" + name; }\n if (shift !== false && event.shiftKey) { name = \"Shift-\" + name; }\n return name\n}\n\n// :: (Object) → Plugin\n// Create a keymap plugin for the given set of bindings.\n//\n// Bindings should map key names to [command](#commands)-style\n// functions, which will be called with `(EditorState, dispatch,\n// EditorView)` arguments, and should return true when they've handled\n// the key. Note that the view argument isn't part of the command\n// protocol, but can be used as an escape hatch if a binding needs to\n// directly interact with the UI.\n//\n// Key names may be strings like `\"Shift-Ctrl-Enter\"`—a key\n// identifier prefixed with zero or more modifiers. Key identifiers\n// are based on the strings that can appear in\n// [`KeyEvent.key`](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).\n// Use lowercase letters to refer to letter keys (or uppercase letters\n// if you want shift to be held). You may use `\"Space\"` as an alias\n// for the `\" \"` name.\n//\n// Modifiers can be given in any order. `Shift-` (or `s-`), `Alt-` (or\n// `a-`), `Ctrl-` (or `c-` or `Control-`) and `Cmd-` (or `m-` or\n// `Meta-`) are recognized. For characters that are created by holding\n// shift, the `Shift-` prefix is implied, and should not be added\n// explicitly.\n//\n// You can use `Mod-` as a shorthand for `Cmd-` on Mac and `Ctrl-` on\n// other platforms.\n//\n// You can add multiple keymap plugins to an editor. The order in\n// which they appear determines their precedence (the ones early in\n// the array get to dispatch first).\nfunction keymap(bindings) {\n return new Plugin({props: {handleKeyDown: keydownHandler(bindings)}})\n}\n\n// :: (Object) → (view: EditorView, event: dom.Event) → bool\n// Given a set of bindings (using the same format as\n// [`keymap`](#keymap.keymap), return a [keydown\n// handler](#view.EditorProps.handleKeyDown) that handles them.\nfunction keydownHandler(bindings) {\n var map = normalize(bindings);\n return function(view, event) {\n var name = keyName(event), isChar = name.length == 1 && name != \" \", baseName;\n var direct = map[modifiers(name, event, !isChar)];\n if (direct && direct(view.state, view.dispatch, view)) { return true }\n if (isChar && (event.shiftKey || event.altKey || event.metaKey || name.charCodeAt(0) > 127) &&\n (baseName = base[event.keyCode]) && baseName != name) {\n // Try falling back to the keyCode when there's a modifier\n // active or the character produced isn't ASCII, and our table\n // produces a different name from the the keyCode. See #668,\n // #1060\n var fromCode = map[modifiers(baseName, event, true)];\n if (fromCode && fromCode(view.state, view.dispatch, view)) { return true }\n } else if (isChar && event.shiftKey) {\n // Otherwise, if shift is active, also try the binding with the\n // Shift- prefix enabled. See #997\n var withShift = map[modifiers(name, event, true)];\n if (withShift && withShift(view.state, view.dispatch, view)) { return true }\n }\n return false\n }\n}\n\nexport { keydownHandler, keymap };\n//# sourceMappingURL=index.es.js.map\n","module.exports = flarum.core.compat['common/utils/ItemList'];","module.exports = flarum.core.compat['common/utils/Stream'];","module.exports = flarum.core.compat['common/components/Button'];","module.exports = flarum.core.compat['common/helpers/icon'];","module.exports = flarum.core.compat['common/components/Dropdown'];","import Modal from 'flarum/common/components/Modal';\n\nexport default class SafariModalHack extends Modal {\n className() {\n return 'LoadingModal Modal--small';\n }\n\n title() {\n return this.attrs.title;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$('.CommandButton').on('click', () => {\n app.modal.close();\n });\n }\n\n content() {\n const onsubmit = this.attrs.onsubmit ? this.attrs.onsubmit.bind(this) : () => {};\n return (\n
          \n
          \n {this.attrs.vnodeContent}\n
          \n
          \n );\n }\n}\n","import Button from 'flarum/common/components/Button';\nimport Dropdown from 'flarum/common/components/Dropdown';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport icon from 'flarum/common/helpers/icon';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport SafariModalHack from './SafariModalHack';\n\nexport default class FormDropdown extends Dropdown {\n static initAttrs(attrs) {\n attrs.buttonClassName = 'Button Button--icon Button--link Button--menuDropdown';\n }\n\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$().on('click', (e) => {\n if ($('.App').is('.mobile-safari')) {\n // Mobile Safari doesn't support fixed items\n // So, we wrap them in a modal.\n app.modal.show(SafariModalHack, {\n title: this.attrs.tooltip,\n vnodeContent: this.fields().toArray(),\n onsubmit: this.onsubmit.bind(this),\n });\n e.stopPropagation();\n }\n });\n\n this.$().on('shown.bs.dropdown', () => {\n this.$('.Dropdown-menu').find('input, select, textarea').first().focus().select();\n });\n }\n\n getButtonContent(children) {\n return (\n \n {icon(this.attrs.icon)}\n \n );\n }\n\n getMenu(items) {\n return (\n
            \n
            \n {this.fields().toArray()}\n
            \n
          \n );\n }\n\n fields() {\n const items = new ItemList();\n\n items.add(\n 'insert',\n \n );\n\n return items;\n }\n\n onsubmit(e) {\n // Here for the safari workaround\n app.modal.close();\n e.preventDefault();\n $('body').trigger('click');\n this.insert(e);\n app.composer.editor.focus();\n }\n\n insert(e) {}\n}\n","module.exports = flarum.core.compat['common/extend'];","import CommandButton from './CommandButton';\nimport { toggleList } from 'tiptap-commands';\n\nexport default class ListButton extends CommandButton {\n oninit(vnode) {\n vnode.attrs.command = (state, dispatch) => {\n return toggleList(vnode.attrs.listType, this.active ? state.schema.nodes.list_item : undefined)(state, dispatch);\n };\n\n super.oninit(vnode);\n }\n\n onEditorUpdate() {\n this.active = !!this.state.nodeActive(this.attrs.listType);\n this.$().toggleClass('active', this.active);\n }\n}\n","module.exports = flarum.core.compat['common/components/TextEditor'];","import { defaultMarkdownSerializer, MarkdownSerializer, MarkdownSerializerState } from 'prosemirror-markdown';\n\n/**\n * COPIED FROM https://github.com/StackExchange/Stacks-Editor/blob/main/src/rich-text/markdown-serializer.ts\n *\n * Generates a config from a base config that is aware of special \"markup\" added by the markdown tokenizer;\n * typically this will be differences in how markdown can be written (e.g. * vs _ for emphasis),\n * but could also be html tags from our extended html support plugin (e.g. * vs for emphasis)\n * @param config The base config to extend\n */\nfunction genMarkupAwareMarkConfig(config) {\n // we don't support function open/close since these could have fairly complicated logic in them\n if (config.open instanceof Function || config.close instanceof Function) {\n // log an error to the console and return the unmodified base config\n error('markdown-serializer genMarkupAwareMarkSpec', 'Unable to extend mark config with open/close as functions', config);\n return config;\n }\n\n return {\n ...config,\n open(_, mark) {\n const markup = mark.attrs.markup;\n return markup || config.open;\n },\n close(_, mark) {\n let markup = mark.attrs.markup;\n // insert the `/` on html closing tags\n markup = /^<[a-z]+>$/i.test(markup) ? markup.replace(/^! ', null, node, () => state.renderContent(node));\n },\n\n math_block(state, node) {\n state.write('$$\\n');\n state.text(node.textContent, false);\n state.ensureNewLine();\n state.write('$$');\n state.closeBlock(node);\n },\n\n // We still want to put a new line for empty paragraphs\n paragraph(state, node) {\n if (node.content.size === 0) {\n state.write('\\n');\n } else {\n defaultMarkdownSerializer.nodes.paragraph(state, node);\n }\n },\n\n // Override this to put in just a whiteline, since Litedown doesn't like line-ending slashes.\n hard_break(state, node, parent, index) {\n for (let i = index + 1; i < parent.childCount; i++)\n if (parent.child(i).type != node.type) {\n state.write('\\n');\n return;\n }\n },\n };\n }\n\n buildMarks() {\n return {\n ...defaultMarkdownSerializer.marks,\n\n spoiler_inline: genMarkupAwareMarkConfig({\n open: '>!',\n close: '!<',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n strike: genMarkupAwareMarkConfig({\n open: '~~',\n close: '~~',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n sub: genMarkupAwareMarkConfig({\n open: '~',\n close: '~',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n sup: genMarkupAwareMarkConfig({\n open: '^',\n close: '^',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n math_inline: {\n ...genMarkupAwareMarkConfig({\n open: '$',\n close: '$',\n mixable: false,\n expelEnclosingWhitespace: true,\n }),\n escape: false,\n },\n };\n }\n\n build() {\n return new MarkdownSerializer(this.buildNodes(), this.buildMarks());\n }\n}\n","'use strict';\n\n\nmodule.exports = require('./lib/');\n","import { schema } from 'prosemirror-markdown';\nimport { Schema } from 'prosemirror-model';\n\n/**\n * COPIED FROM https://github.com/StackExchange/Stacks-Editor/blob/main/src/shared/schema.ts\n *\n * Creates a generic html MarkSpec for an inline html tag\n * @param tag The name of the tag to use in the Prosemirror dom\n */\nfunction genHtmlInlineMarkSpec(...tags) {\n return {\n toDOM() {\n return [tags[0], 0];\n },\n parseDOM: tags.map((tag) => ({ tag: tag })),\n };\n}\n\nconst spoilerNodeSpec = {\n content: 'block+',\n group: 'block',\n attrs: { open: { default: true } },\n parseDOM: [\n {\n tag: 'details',\n },\n ],\n toDOM(node) {\n const attrs = { class: 'spoiler' };\n\n if (node.attrs.open) attrs.open = true;\n\n return ['details', attrs, 0];\n },\n};\n\nconst mathBlockNodeSpec = {\n content: 'text*',\n code: true,\n group: 'block',\n parseDOM: [\n {\n tag: 'pre',\n },\n ],\n toDOM(node) {\n return ['pre', { class: 'math' }, ['code', 0]];\n },\n};\n\nexport default class SchemaBuilder {\n buildNodes() {\n return (\n schema.spec.nodes\n // Make lists tight by default\n .update(\n 'ordered_list',\n Object.assign({}, schema.spec.nodes.get('ordered_list'), { attrs: { order: { default: 1 }, tight: { default: true } } })\n )\n .update('bullet_list', Object.assign({}, schema.spec.nodes.get('bullet_list'), { attrs: { tight: { default: true } } }))\n .addBefore('blockquote', 'spoiler', spoilerNodeSpec)\n .addBefore('blockquote', 'math_block', mathBlockNodeSpec)\n );\n }\n\n buildMarks() {\n return schema.spec.marks\n .addBefore('strong', 'strike', genHtmlInlineMarkSpec('del', 's', 'strike'))\n .addBefore('strong', 'sub', genHtmlInlineMarkSpec('sub'))\n .addBefore('strong', 'sup', genHtmlInlineMarkSpec('sup'))\n .addBefore('strong', 'spoiler_inline', {\n attrs: { open: { default: true } },\n parseDOM: [\n {\n tag: 'spoiler',\n },\n ],\n toDOM(node) {\n return ['spoiler', 0];\n },\n })\n .addBefore('strong', 'math_inline', {\n parseDOM: [\n {\n tag: 'math',\n },\n ],\n toDOM(node) {\n return ['math', 0];\n },\n excludes: '_',\n });\n }\n\n build() {\n return new Schema({\n nodes: this.buildNodes(),\n marks: this.buildMarks(),\n });\n }\n}\n","module.exports = flarum.core.compat['common/Component'];","import Dropdown from 'flarum/common/components/Dropdown';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport extractText from 'flarum/common/utils/extractText';\nimport { setBlockType } from 'tiptap-commands';\nimport SafariModalHack from './SafariModalHack';\n\nexport default class NodeTypeDropdown extends Dropdown {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n this.state.addItem(\n this.attrs.type,\n (state, dispatch) => {\n return this.command(state, dispatch);\n },\n this.onEditorUpdate.bind(this)\n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$().on('click', (e) => {\n if ($('.App').is('.mobile-safari')) {\n // Mobile Safari doesn't support fixed items\n // So, we wrap them in a modal.\n app.modal.show(SafariModalHack, {\n title: this.attrs.tooltip,\n vnodeContent: this.getNodeTypeButtons(),\n });\n e.stopPropagation();\n }\n });\n\n this.onEditorUpdate();\n }\n\n getButton(children) {\n return (\n \n );\n }\n\n getNodeTypeButtons() {\n return this.attrs.options\n .filter((_, i) => i !== this.activeIndex)\n .map((option) => (\n \n \n {option.title}\n \n \n ));\n }\n\n getMenu(items) {\n return
            {this.getNodeTypeButtons()}
          ;\n }\n\n keydown(type, attrs, e) {\n if (e.key === ' ' || e.key === 'Enter') {\n this.click(type, attrs, e);\n }\n }\n\n click(type, attrs, e) {\n // Here for the safari workaround\n app.modal.close();\n e.preventDefault();\n this.command = setBlockType(type, attrs);\n return this.state.run(this.attrs.type);\n }\n\n onEditorUpdate() {\n if (!this.element) return;\n\n this.attrs.options.forEach((option, i) => {\n if (this.state.nodeActive(option.type, option.attrs)) {\n this.element.children[0].children[0].innerText = option.title;\n this.activeIndex = i;\n }\n });\n }\n}\n","import extractText from 'flarum/common/utils/extractText';\nimport Stream from 'flarum/common/utils/Stream';\nimport FormDropdown from './FormDropdown';\n\nexport default class InsertImageDropdown extends FormDropdown {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.src = Stream('');\n this.title = Stream('');\n }\n\n fields() {\n const items = super.fields();\n\n items.add(\n 'src',\n
          \n \n
          ,\n 10\n );\n\n items.add(\n 'title',\n
          \n \n
          ,\n 10\n );\n\n return items;\n }\n\n insert(e) {\n this.state.insertNode(this.attrs.node, {\n src: this.src(),\n title: this.title(),\n });\n\n this.src('');\n this.title('');\n }\n}\n","import { getMarkAttrs, markIsActive, nodeIsActive } from 'tiptap-utils';\n\nexport default class MenuState {\n constructor() {\n this.items = {};\n }\n\n attachEditorView(editorView) {\n this.editorView = editorView;\n }\n\n addItem(key, command, onEditorUpdate) {\n this.items[key] = { command, onEditorUpdate };\n }\n\n getSchema() {\n return this.editorView.state.schema;\n }\n\n update() {\n app.editor = this.editorView;\n Object.keys(this.items).forEach((key) => {\n this.items[key].onEditorUpdate();\n });\n }\n\n destroy() {\n // No need for this: Mithril will destroy the editor DOM when the composer closes.\n }\n\n markActive(markType) {\n return markIsActive(this.editorView.state, markType);\n }\n\n markAttrs(markType) {\n return getMarkAttrs(this.editorView.state, markType);\n }\n\n nodeActive(nodeType, attrs) {\n return nodeIsActive(this.editorView.state, nodeType, attrs);\n }\n\n selectionEmpty() {\n return this.editorView.state.selection.empty;\n }\n\n insertNode(nodeType, attrs) {\n const node = nodeType.createAndFill(attrs);\n\n let transaction;\n if (this.editorView.state.selection.empty) {\n transaction = this.editorView.state.tr.insert(this.editorView.state.selection.from, node);\n } else {\n transaction = this.editorView.state.tr.replaceSelection(node);\n }\n this.editorView.dispatch(transaction);\n this.editorView.focus();\n }\n\n run(key) {\n if (this.items[key]) {\n this.editorView.focus();\n this.items[key].command(this.editorView.state, this.editorView.dispatch, this.editorView);\n }\n }\n}\n","var GOOD_LEAF_SIZE = 200;\n\n// :: class A rope sequence is a persistent sequence data structure\n// that supports appending, prepending, and slicing without doing a\n// full copy. It is represented as a mostly-balanced tree.\nvar RopeSequence = function RopeSequence () {};\n\nRopeSequence.prototype.append = function append (other) {\n if (!other.length) { return this }\n other = RopeSequence.from(other);\n\n return (!this.length && other) ||\n (other.length < GOOD_LEAF_SIZE && this.leafAppend(other)) ||\n (this.length < GOOD_LEAF_SIZE && other.leafPrepend(this)) ||\n this.appendInner(other)\n};\n\n// :: (union<[T], RopeSequence>) → RopeSequence\n// Prepend an array or other rope to this one, returning a new rope.\nRopeSequence.prototype.prepend = function prepend (other) {\n if (!other.length) { return this }\n return RopeSequence.from(other).append(this)\n};\n\nRopeSequence.prototype.appendInner = function appendInner (other) {\n return new Append(this, other)\n};\n\n// :: (?number, ?number) → RopeSequence\n// Create a rope repesenting a sub-sequence of this rope.\nRopeSequence.prototype.slice = function slice (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n if (from >= to) { return RopeSequence.empty }\n return this.sliceInner(Math.max(0, from), Math.min(this.length, to))\n};\n\n// :: (number) → T\n// Retrieve the element at the given position from this rope.\nRopeSequence.prototype.get = function get (i) {\n if (i < 0 || i >= this.length) { return undefined }\n return this.getInner(i)\n};\n\n// :: ((element: T, index: number) → ?bool, ?number, ?number)\n// Call the given function for each element between the given\n// indices. This tends to be more efficient than looping over the\n// indices and calling `get`, because it doesn't have to descend the\n// tree for every element.\nRopeSequence.prototype.forEach = function forEach (f, from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n if (from <= to)\n { this.forEachInner(f, from, to, 0); }\n else\n { this.forEachInvertedInner(f, from, to, 0); }\n};\n\n// :: ((element: T, index: number) → U, ?number, ?number) → [U]\n// Map the given functions over the elements of the rope, producing\n// a flat array.\nRopeSequence.prototype.map = function map (f, from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n var result = [];\n this.forEach(function (elt, i) { return result.push(f(elt, i)); }, from, to);\n return result\n};\n\n// :: (?union<[T], RopeSequence>) → RopeSequence\n// Create a rope representing the given array, or return the rope\n// itself if a rope was given.\nRopeSequence.from = function from (values) {\n if (values instanceof RopeSequence) { return values }\n return values && values.length ? new Leaf(values) : RopeSequence.empty\n};\n\nvar Leaf = /*@__PURE__*/(function (RopeSequence) {\n function Leaf(values) {\n RopeSequence.call(this);\n this.values = values;\n }\n\n if ( RopeSequence ) Leaf.__proto__ = RopeSequence;\n Leaf.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n Leaf.prototype.constructor = Leaf;\n\n var prototypeAccessors = { length: { configurable: true },depth: { configurable: true } };\n\n Leaf.prototype.flatten = function flatten () {\n return this.values\n };\n\n Leaf.prototype.sliceInner = function sliceInner (from, to) {\n if (from == 0 && to == this.length) { return this }\n return new Leaf(this.values.slice(from, to))\n };\n\n Leaf.prototype.getInner = function getInner (i) {\n return this.values[i]\n };\n\n Leaf.prototype.forEachInner = function forEachInner (f, from, to, start) {\n for (var i = from; i < to; i++)\n { if (f(this.values[i], start + i) === false) { return false } }\n };\n\n Leaf.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n for (var i = from - 1; i >= to; i--)\n { if (f(this.values[i], start + i) === false) { return false } }\n };\n\n Leaf.prototype.leafAppend = function leafAppend (other) {\n if (this.length + other.length <= GOOD_LEAF_SIZE)\n { return new Leaf(this.values.concat(other.flatten())) }\n };\n\n Leaf.prototype.leafPrepend = function leafPrepend (other) {\n if (this.length + other.length <= GOOD_LEAF_SIZE)\n { return new Leaf(other.flatten().concat(this.values)) }\n };\n\n prototypeAccessors.length.get = function () { return this.values.length };\n\n prototypeAccessors.depth.get = function () { return 0 };\n\n Object.defineProperties( Leaf.prototype, prototypeAccessors );\n\n return Leaf;\n}(RopeSequence));\n\n// :: RopeSequence\n// The empty rope sequence.\nRopeSequence.empty = new Leaf([]);\n\nvar Append = /*@__PURE__*/(function (RopeSequence) {\n function Append(left, right) {\n RopeSequence.call(this);\n this.left = left;\n this.right = right;\n this.length = left.length + right.length;\n this.depth = Math.max(left.depth, right.depth) + 1;\n }\n\n if ( RopeSequence ) Append.__proto__ = RopeSequence;\n Append.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n Append.prototype.constructor = Append;\n\n Append.prototype.flatten = function flatten () {\n return this.left.flatten().concat(this.right.flatten())\n };\n\n Append.prototype.getInner = function getInner (i) {\n return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length)\n };\n\n Append.prototype.forEachInner = function forEachInner (f, from, to, start) {\n var leftLen = this.left.length;\n if (from < leftLen &&\n this.left.forEachInner(f, from, Math.min(to, leftLen), start) === false)\n { return false }\n if (to > leftLen &&\n this.right.forEachInner(f, Math.max(from - leftLen, 0), Math.min(this.length, to) - leftLen, start + leftLen) === false)\n { return false }\n };\n\n Append.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n var leftLen = this.left.length;\n if (from > leftLen &&\n this.right.forEachInvertedInner(f, from - leftLen, Math.max(to, leftLen) - leftLen, start + leftLen) === false)\n { return false }\n if (to < leftLen &&\n this.left.forEachInvertedInner(f, Math.min(from, leftLen), to, start) === false)\n { return false }\n };\n\n Append.prototype.sliceInner = function sliceInner (from, to) {\n if (from == 0 && to == this.length) { return this }\n var leftLen = this.left.length;\n if (to <= leftLen) { return this.left.slice(from, to) }\n if (from >= leftLen) { return this.right.slice(from - leftLen, to - leftLen) }\n return this.left.slice(from, leftLen).append(this.right.slice(0, to - leftLen))\n };\n\n Append.prototype.leafAppend = function leafAppend (other) {\n var inner = this.right.leafAppend(other);\n if (inner) { return new Append(this.left, inner) }\n };\n\n Append.prototype.leafPrepend = function leafPrepend (other) {\n var inner = this.left.leafPrepend(other);\n if (inner) { return new Append(inner, this.right) }\n };\n\n Append.prototype.appendInner = function appendInner (other) {\n if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1)\n { return new Append(this.left, new Append(this.right, other)) }\n return new Append(this, other)\n };\n\n return Append;\n}(RopeSequence));\n\nvar ropeSequence = RopeSequence;\n\nexport default ropeSequence;\n","import RopeSequence from 'rope-sequence';\nimport { Mapping } from 'prosemirror-transform';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\n// ProseMirror's history isn't simply a way to roll back to a previous\n// state, because ProseMirror supports applying changes without adding\n// them to the history (for example during collaboration).\n//\n// To this end, each 'Branch' (one for the undo history and one for\n// the redo history) keeps an array of 'Items', which can optionally\n// hold a step (an actual undoable change), and always hold a position\n// map (which is needed to move changes below them to apply to the\n// current document).\n//\n// An item that has both a step and a selection bookmark is the start\n// of an 'event' — a group of changes that will be undone or redone at\n// once. (It stores only the bookmark, since that way we don't have to\n// provide a document until the selection is actually applied, which\n// is useful when compressing.)\n\n// Used to schedule history compression\nvar max_empty_items = 500;\n\nvar Branch = function Branch(items, eventCount) {\n this.items = items;\n this.eventCount = eventCount;\n};\n\n// : (EditorState, bool) → ?{transform: Transform, selection: ?SelectionBookmark, remaining: Branch}\n// Pop the latest event off the branch's history and apply it\n// to a document transform.\nBranch.prototype.popEvent = function popEvent (state, preserveItems) {\n var this$1 = this;\n\n if (this.eventCount == 0) { return null }\n\n var end = this.items.length;\n for (;; end--) {\n var next = this.items.get(end - 1);\n if (next.selection) { --end; break }\n }\n\n var remap, mapFrom;\n if (preserveItems) {\n remap = this.remapping(end, this.items.length);\n mapFrom = remap.maps.length;\n }\n var transform = state.tr;\n var selection, remaining;\n var addAfter = [], addBefore = [];\n\n this.items.forEach(function (item, i) {\n if (!item.step) {\n if (!remap) {\n remap = this$1.remapping(end, i + 1);\n mapFrom = remap.maps.length;\n }\n mapFrom--;\n addBefore.push(item);\n return\n }\n\n if (remap) {\n addBefore.push(new Item(item.map));\n var step = item.step.map(remap.slice(mapFrom)), map;\n\n if (step && transform.maybeStep(step).doc) {\n map = transform.mapping.maps[transform.mapping.maps.length - 1];\n addAfter.push(new Item(map, null, null, addAfter.length + addBefore.length));\n }\n mapFrom--;\n if (map) { remap.appendMap(map, mapFrom); }\n } else {\n transform.maybeStep(item.step);\n }\n\n if (item.selection) {\n selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection;\n remaining = new Branch(this$1.items.slice(0, end).append(addBefore.reverse().concat(addAfter)), this$1.eventCount - 1);\n return false\n }\n }, this.items.length, 0);\n\n return {remaining: remaining, transform: transform, selection: selection}\n};\n\n// : (Transform, ?SelectionBookmark, Object) → Branch\n// Create a new branch with the given transform added.\nBranch.prototype.addTransform = function addTransform (transform, selection, histOptions, preserveItems) {\n var newItems = [], eventCount = this.eventCount;\n var oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null;\n\n for (var i = 0; i < transform.steps.length; i++) {\n var step = transform.steps[i].invert(transform.docs[i]);\n var item = new Item(transform.mapping.maps[i], step, selection), merged = (void 0);\n if (merged = lastItem && lastItem.merge(item)) {\n item = merged;\n if (i) { newItems.pop(); }\n else { oldItems = oldItems.slice(0, oldItems.length - 1); }\n }\n newItems.push(item);\n if (selection) {\n eventCount++;\n selection = null;\n }\n if (!preserveItems) { lastItem = item; }\n }\n var overflow = eventCount - histOptions.depth;\n if (overflow > DEPTH_OVERFLOW) {\n oldItems = cutOffEvents(oldItems, overflow);\n eventCount -= overflow;\n }\n return new Branch(oldItems.append(newItems), eventCount)\n};\n\nBranch.prototype.remapping = function remapping (from, to) {\n var maps = new Mapping;\n this.items.forEach(function (item, i) {\n var mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from\n ? maps.maps.length - item.mirrorOffset : null;\n maps.appendMap(item.map, mirrorPos);\n }, from, to);\n return maps\n};\n\nBranch.prototype.addMaps = function addMaps (array) {\n if (this.eventCount == 0) { return this }\n return new Branch(this.items.append(array.map(function (map) { return new Item(map); })), this.eventCount)\n};\n\n// : (Transform, number)\n// When the collab module receives remote changes, the history has\n// to know about those, so that it can adjust the steps that were\n// rebased on top of the remote changes, and include the position\n// maps for the remote changes in its array of items.\nBranch.prototype.rebased = function rebased (rebasedTransform, rebasedCount) {\n if (!this.eventCount) { return this }\n\n var rebasedItems = [], start = Math.max(0, this.items.length - rebasedCount);\n\n var mapping = rebasedTransform.mapping;\n var newUntil = rebasedTransform.steps.length;\n var eventCount = this.eventCount;\n this.items.forEach(function (item) { if (item.selection) { eventCount--; } }, start);\n\n var iRebased = rebasedCount;\n this.items.forEach(function (item) {\n var pos = mapping.getMirror(--iRebased);\n if (pos == null) { return }\n newUntil = Math.min(newUntil, pos);\n var map = mapping.maps[pos];\n if (item.step) {\n var step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]);\n var selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos));\n if (selection) { eventCount++; }\n rebasedItems.push(new Item(map, step, selection));\n } else {\n rebasedItems.push(new Item(map));\n }\n }, start);\n\n var newMaps = [];\n for (var i = rebasedCount; i < newUntil; i++)\n { newMaps.push(new Item(mapping.maps[i])); }\n var items = this.items.slice(0, start).append(newMaps).append(rebasedItems);\n var branch = new Branch(items, eventCount);\n\n if (branch.emptyItemCount() > max_empty_items)\n { branch = branch.compress(this.items.length - rebasedItems.length); }\n return branch\n};\n\nBranch.prototype.emptyItemCount = function emptyItemCount () {\n var count = 0;\n this.items.forEach(function (item) { if (!item.step) { count++; } });\n return count\n};\n\n// Compressing a branch means rewriting it to push the air (map-only\n// items) out. During collaboration, these naturally accumulate\n// because each remote change adds one. The `upto` argument is used\n// to ensure that only the items below a given level are compressed,\n// because `rebased` relies on a clean, untouched set of items in\n// order to associate old items with rebased steps.\nBranch.prototype.compress = function compress (upto) {\n if ( upto === void 0 ) upto = this.items.length;\n\n var remap = this.remapping(0, upto), mapFrom = remap.maps.length;\n var items = [], events = 0;\n this.items.forEach(function (item, i) {\n if (i >= upto) {\n items.push(item);\n if (item.selection) { events++; }\n } else if (item.step) {\n var step = item.step.map(remap.slice(mapFrom)), map = step && step.getMap();\n mapFrom--;\n if (map) { remap.appendMap(map, mapFrom); }\n if (step) {\n var selection = item.selection && item.selection.map(remap.slice(mapFrom));\n if (selection) { events++; }\n var newItem = new Item(map.invert(), step, selection), merged, last = items.length - 1;\n if (merged = items.length && items[last].merge(newItem))\n { items[last] = merged; }\n else\n { items.push(newItem); }\n }\n } else if (item.map) {\n mapFrom--;\n }\n }, this.items.length, 0);\n return new Branch(RopeSequence.from(items.reverse()), events)\n};\n\nBranch.empty = new Branch(RopeSequence.empty, 0);\n\nfunction cutOffEvents(items, n) {\n var cutPoint;\n items.forEach(function (item, i) {\n if (item.selection && (n-- == 0)) {\n cutPoint = i;\n return false\n }\n });\n return items.slice(cutPoint)\n}\n\nvar Item = function Item(map, step, selection, mirrorOffset) {\n // The (forward) step map for this item.\n this.map = map;\n // The inverted step\n this.step = step;\n // If this is non-null, this item is the start of a group, and\n // this selection is the starting selection for the group (the one\n // that was active before the first step was applied)\n this.selection = selection;\n // If this item is the inverse of a previous mapping on the stack,\n // this points at the inverse's offset\n this.mirrorOffset = mirrorOffset;\n};\n\nItem.prototype.merge = function merge (other) {\n if (this.step && other.step && !other.selection) {\n var step = other.step.merge(this.step);\n if (step) { return new Item(step.getMap().invert(), step, this.selection) }\n }\n};\n\n// The value of the state field that tracks undo/redo history for that\n// state. Will be stored in the plugin state when the history plugin\n// is active.\nvar HistoryState = function HistoryState(done, undone, prevRanges, prevTime) {\n this.done = done;\n this.undone = undone;\n this.prevRanges = prevRanges;\n this.prevTime = prevTime;\n};\n\nvar DEPTH_OVERFLOW = 20;\n\n// : (HistoryState, EditorState, Transaction, Object)\n// Record a transformation in undo history.\nfunction applyTransaction(history, state, tr, options) {\n var historyTr = tr.getMeta(historyKey), rebased;\n if (historyTr) { return historyTr.historyState }\n\n if (tr.getMeta(closeHistoryKey)) { history = new HistoryState(history.done, history.undone, null, 0); }\n\n var appended = tr.getMeta(\"appendedTransaction\");\n\n if (tr.steps.length == 0) {\n return history\n } else if (appended && appended.getMeta(historyKey)) {\n if (appended.getMeta(historyKey).redo)\n { return new HistoryState(history.done.addTransform(tr, null, options, mustPreserveItems(state)),\n history.undone, rangesFor(tr.mapping.maps[tr.steps.length - 1]), history.prevTime) }\n else\n { return new HistoryState(history.done, history.undone.addTransform(tr, null, options, mustPreserveItems(state)),\n null, history.prevTime) }\n } else if (tr.getMeta(\"addToHistory\") !== false && !(appended && appended.getMeta(\"addToHistory\") === false)) {\n // Group transforms that occur in quick succession into one event.\n var newGroup = history.prevTime == 0 || !appended && (history.prevTime < (tr.time || 0) - options.newGroupDelay ||\n !isAdjacentTo(tr, history.prevRanges));\n var prevRanges = appended ? mapRanges(history.prevRanges, tr.mapping) : rangesFor(tr.mapping.maps[tr.steps.length - 1]);\n return new HistoryState(history.done.addTransform(tr, newGroup ? state.selection.getBookmark() : null,\n options, mustPreserveItems(state)),\n Branch.empty, prevRanges, tr.time)\n } else if (rebased = tr.getMeta(\"rebased\")) {\n // Used by the collab module to tell the history that some of its\n // content has been rebased.\n return new HistoryState(history.done.rebased(tr, rebased),\n history.undone.rebased(tr, rebased),\n mapRanges(history.prevRanges, tr.mapping), history.prevTime)\n } else {\n return new HistoryState(history.done.addMaps(tr.mapping.maps),\n history.undone.addMaps(tr.mapping.maps),\n mapRanges(history.prevRanges, tr.mapping), history.prevTime)\n }\n}\n\nfunction isAdjacentTo(transform, prevRanges) {\n if (!prevRanges) { return false }\n if (!transform.docChanged) { return true }\n var adjacent = false;\n transform.mapping.maps[0].forEach(function (start, end) {\n for (var i = 0; i < prevRanges.length; i += 2)\n { if (start <= prevRanges[i + 1] && end >= prevRanges[i])\n { adjacent = true; } }\n });\n return adjacent\n}\n\nfunction rangesFor(map) {\n var result = [];\n map.forEach(function (_from, _to, from, to) { return result.push(from, to); });\n return result\n}\n\nfunction mapRanges(ranges, mapping) {\n if (!ranges) { return null }\n var result = [];\n for (var i = 0; i < ranges.length; i += 2) {\n var from = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1);\n if (from <= to) { result.push(from, to); }\n }\n return result\n}\n\n// : (HistoryState, EditorState, (tr: Transaction), bool)\n// Apply the latest event from one branch to the document and shift the event\n// onto the other branch.\nfunction histTransaction(history, state, dispatch, redo) {\n var preserveItems = mustPreserveItems(state), histOptions = historyKey.get(state).spec.config;\n var pop = (redo ? history.undone : history.done).popEvent(state, preserveItems);\n if (!pop) { return }\n\n var selection = pop.selection.resolve(pop.transform.doc);\n var added = (redo ? history.done : history.undone).addTransform(pop.transform, state.selection.getBookmark(),\n histOptions, preserveItems);\n\n var newHist = new HistoryState(redo ? added : pop.remaining, redo ? pop.remaining : added, null, 0);\n dispatch(pop.transform.setSelection(selection).setMeta(historyKey, {redo: redo, historyState: newHist}).scrollIntoView());\n}\n\nvar cachedPreserveItems = false, cachedPreserveItemsPlugins = null;\n// Check whether any plugin in the given state has a\n// `historyPreserveItems` property in its spec, in which case we must\n// preserve steps exactly as they came in, so that they can be\n// rebased.\nfunction mustPreserveItems(state) {\n var plugins = state.plugins;\n if (cachedPreserveItemsPlugins != plugins) {\n cachedPreserveItems = false;\n cachedPreserveItemsPlugins = plugins;\n for (var i = 0; i < plugins.length; i++) { if (plugins[i].spec.historyPreserveItems) {\n cachedPreserveItems = true;\n break\n } }\n }\n return cachedPreserveItems\n}\n\n// :: (Transaction) → Transaction\n// Set a flag on the given transaction that will prevent further steps\n// from being appended to an existing history event (so that they\n// require a separate undo command to undo).\nfunction closeHistory(tr) {\n return tr.setMeta(closeHistoryKey, true)\n}\n\nvar historyKey = new PluginKey(\"history\");\nvar closeHistoryKey = new PluginKey(\"closeHistory\");\n\n// :: (?Object) → Plugin\n// Returns a plugin that enables the undo history for an editor. The\n// plugin will track undo and redo stacks, which can be used with the\n// [`undo`](#history.undo) and [`redo`](#history.redo) commands.\n//\n// You can set an `\"addToHistory\"` [metadata\n// property](#state.Transaction.setMeta) of `false` on a transaction\n// to prevent it from being rolled back by undo.\n//\n// config::-\n// Supports the following configuration options:\n//\n// depth:: ?number\n// The amount of history events that are collected before the\n// oldest events are discarded. Defaults to 100.\n//\n// newGroupDelay:: ?number\n// The delay between changes after which a new group should be\n// started. Defaults to 500 (milliseconds). Note that when changes\n// aren't adjacent, a new group is always started.\nfunction history(config) {\n config = {depth: config && config.depth || 100,\n newGroupDelay: config && config.newGroupDelay || 500};\n return new Plugin({\n key: historyKey,\n\n state: {\n init: function init() {\n return new HistoryState(Branch.empty, Branch.empty, null, 0)\n },\n apply: function apply(tr, hist, state) {\n return applyTransaction(hist, state, tr, config)\n }\n },\n\n config: config\n })\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// A command function that undoes the last change, if any.\nfunction undo(state, dispatch) {\n var hist = historyKey.getState(state);\n if (!hist || hist.done.eventCount == 0) { return false }\n if (dispatch) { histTransaction(hist, state, dispatch, false); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// A command function that redoes the last undone change, if any.\nfunction redo(state, dispatch) {\n var hist = historyKey.getState(state);\n if (!hist || hist.undone.eventCount == 0) { return false }\n if (dispatch) { histTransaction(hist, state, dispatch, true); }\n return true\n}\n\n// :: (EditorState) → number\n// The amount of undoable events available in a given state.\nfunction undoDepth(state) {\n var hist = historyKey.getState(state);\n return hist ? hist.done.eventCount : 0\n}\n\n// :: (EditorState) → number\n// The amount of redoable events available in a given editor state.\nfunction redoDepth(state) {\n var hist = historyKey.getState(state);\n return hist ? hist.undone.eventCount : 0\n}\n\nexport { HistoryState, closeHistory, history, redo, redoDepth, undo, undoDepth };\n//# sourceMappingURL=index.es.js.map\n","import { TextSelection, NodeSelection, Selection } from 'prosemirror-state';\nimport { DOMSerializer, Fragment, Mark, DOMParser, Slice } from 'prosemirror-model';\nimport { dropPoint } from 'prosemirror-transform';\n\nvar result = {};\n\nif (typeof navigator != \"undefined\" && typeof document != \"undefined\") {\n var ie_edge = /Edge\\/(\\d+)/.exec(navigator.userAgent);\n var ie_upto10 = /MSIE \\d/.test(navigator.userAgent);\n var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);\n\n result.mac = /Mac/.test(navigator.platform);\n var ie = result.ie = !!(ie_upto10 || ie_11up || ie_edge);\n result.ie_version = ie_upto10 ? document.documentMode || 6 : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : null;\n result.gecko = !ie && /gecko\\/(\\d+)/i.test(navigator.userAgent);\n result.gecko_version = result.gecko && +(/Firefox\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1];\n var chrome = !ie && /Chrome\\/(\\d+)/.exec(navigator.userAgent);\n result.chrome = !!chrome;\n result.chrome_version = chrome && +chrome[1];\n // Is true for both iOS and iPadOS for convenience\n result.safari = !ie && /Apple Computer/.test(navigator.vendor);\n result.ios = result.safari && (/Mobile\\/\\w+/.test(navigator.userAgent) || navigator.maxTouchPoints > 2);\n result.android = /Android \\d/.test(navigator.userAgent);\n result.webkit = \"webkitFontSmoothing\" in document.documentElement.style;\n result.webkit_version = result.webkit && +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1];\n}\n\nvar domIndex = function(node) {\n for (var index = 0;; index++) {\n node = node.previousSibling;\n if (!node) { return index }\n }\n};\n\nvar parentNode = function(node) {\n var parent = node.parentNode;\n return parent && parent.nodeType == 11 ? parent.host : parent\n};\n\nvar reusedRange = null;\n\n// Note that this will always return the same range, because DOM range\n// objects are every expensive, and keep slowing down subsequent DOM\n// updates, for some reason.\nvar textRange = function(node, from, to) {\n var range = reusedRange || (reusedRange = document.createRange());\n range.setEnd(node, to == null ? node.nodeValue.length : to);\n range.setStart(node, from || 0);\n return range\n};\n\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nvar isEquivalentPosition = function(node, off, targetNode, targetOff) {\n return targetNode && (scanFor(node, off, targetNode, targetOff, -1) ||\n scanFor(node, off, targetNode, targetOff, 1))\n};\n\nvar atomElements = /^(img|br|input|textarea|hr)$/i;\n\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n for (;;) {\n if (node == targetNode && off == targetOff) { return true }\n if (off == (dir < 0 ? 0 : nodeSize(node))) {\n var parent = node.parentNode;\n if (parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) || node.contentEditable == \"false\")\n { return false }\n off = domIndex(node) + (dir < 0 ? 0 : 1);\n node = parent;\n } else if (node.nodeType == 1) {\n node = node.childNodes[off + (dir < 0 ? -1 : 0)];\n if (node.contentEditable == \"false\") { return false }\n off = dir < 0 ? nodeSize(node) : 0;\n } else {\n return false\n }\n }\n}\n\nfunction nodeSize(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length\n}\n\nfunction isOnEdge(node, offset, parent) {\n for (var atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd;) {\n if (node == parent) { return true }\n var index = domIndex(node);\n node = node.parentNode;\n if (!node) { return false }\n atStart = atStart && index == 0;\n atEnd = atEnd && index == nodeSize(node);\n }\n}\n\nfunction hasBlockDesc(dom) {\n var desc;\n for (var cur = dom; cur; cur = cur.parentNode) { if (desc = cur.pmViewDesc) { break } }\n return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom)\n}\n\n// Work around Chrome issue https://bugs.chromium.org/p/chromium/issues/detail?id=447523\n// (isCollapsed inappropriately returns true in shadow dom)\nvar selectionCollapsed = function(domSel) {\n var collapsed = domSel.isCollapsed;\n if (collapsed && result.chrome && domSel.rangeCount && !domSel.getRangeAt(0).collapsed)\n { collapsed = false; }\n return collapsed\n};\n\nfunction keyEvent(keyCode, key) {\n var event = document.createEvent(\"Event\");\n event.initEvent(\"keydown\", true, true);\n event.keyCode = keyCode;\n event.key = event.code = key;\n return event\n}\n\nfunction windowRect(doc) {\n return {left: 0, right: doc.documentElement.clientWidth,\n top: 0, bottom: doc.documentElement.clientHeight}\n}\n\nfunction getSide(value, side) {\n return typeof value == \"number\" ? value : value[side]\n}\n\nfunction clientRect(node) {\n var rect = node.getBoundingClientRect();\n // Make sure scrollbar width isn't included in the rectangle\n return {left: rect.left, right: rect.left + node.clientWidth,\n top: rect.top, bottom: rect.top + node.clientHeight}\n}\n\nfunction scrollRectIntoView(view, rect, startDOM) {\n var scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n var doc = view.dom.ownerDocument;\n for (var parent = startDOM || view.dom;; parent = parentNode(parent)) {\n if (!parent) { break }\n if (parent.nodeType != 1) { continue }\n var atTop = parent == doc.body || parent.nodeType != 1;\n var bounding = atTop ? windowRect(doc) : clientRect(parent);\n var moveX = 0, moveY = 0;\n if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n { moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\")); }\n else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n { moveY = rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\"); }\n if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n { moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\")); }\n else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n { moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\"); }\n if (moveX || moveY) {\n if (atTop) {\n doc.defaultView.scrollBy(moveX, moveY);\n } else {\n var startX = parent.scrollLeft, startY = parent.scrollTop;\n if (moveY) { parent.scrollTop += moveY; }\n if (moveX) { parent.scrollLeft += moveX; }\n var dX = parent.scrollLeft - startX, dY = parent.scrollTop - startY;\n rect = {left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY};\n }\n }\n if (atTop) { break }\n }\n}\n\n// Store the scroll position of the editor's parent nodes, along with\n// the top position of an element near the top of the editor, which\n// will be used to make sure the visible viewport remains stable even\n// when the size of the content above changes.\nfunction storeScrollPos(view) {\n var rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n var refDOM, refTop;\n for (var x = (rect.left + rect.right) / 2, y = startY + 1;\n y < Math.min(innerHeight, rect.bottom); y += 5) {\n var dom = view.root.elementFromPoint(x, y);\n if (dom == view.dom || !view.dom.contains(dom)) { continue }\n var localRect = dom.getBoundingClientRect();\n if (localRect.top >= startY - 20) {\n refDOM = dom;\n refTop = localRect.top;\n break\n }\n }\n return {refDOM: refDOM, refTop: refTop, stack: scrollStack(view.dom)}\n}\n\nfunction scrollStack(dom) {\n var stack = [], doc = dom.ownerDocument;\n for (; dom; dom = parentNode(dom)) {\n stack.push({dom: dom, top: dom.scrollTop, left: dom.scrollLeft});\n if (dom == doc) { break }\n }\n return stack\n}\n\n// Reset the scroll position of the editor's parent nodes to that what\n// it was before, when storeScrollPos was called.\nfunction resetScrollPos(ref) {\n var refDOM = ref.refDOM;\n var refTop = ref.refTop;\n var stack = ref.stack;\n\n var newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\n\nfunction restoreScrollStack(stack, dTop) {\n for (var i = 0; i < stack.length; i++) {\n var ref = stack[i];\n var dom = ref.dom;\n var top = ref.top;\n var left = ref.left;\n if (dom.scrollTop != top + dTop) { dom.scrollTop = top + dTop; }\n if (dom.scrollLeft != left) { dom.scrollLeft = left; }\n }\n}\n\nvar preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n if (dom.setActive) { return dom.setActive() } // in IE\n if (preventScrollSupported) { return dom.focus(preventScrollSupported) }\n\n var stored = scrollStack(dom);\n dom.focus(preventScrollSupported == null ? {\n get preventScroll() {\n preventScrollSupported = {preventScroll: true};\n return true\n }\n } : undefined);\n if (!preventScrollSupported) {\n preventScrollSupported = false;\n restoreScrollStack(stored, 0);\n }\n}\n\nfunction findOffsetInNode(node, coords) {\n var closest, dxClosest = 2e8, coordsClosest, offset = 0;\n var rowBot = coords.top, rowTop = coords.top;\n for (var child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n var rects = (void 0);\n if (child.nodeType == 1) { rects = child.getClientRects(); }\n else if (child.nodeType == 3) { rects = textRange(child).getClientRects(); }\n else { continue }\n\n for (var i = 0; i < rects.length; i++) {\n var rect = rects[i];\n if (rect.top <= rowBot && rect.bottom >= rowTop) {\n rowBot = Math.max(rect.bottom, rowBot);\n rowTop = Math.min(rect.top, rowTop);\n var dx = rect.left > coords.left ? rect.left - coords.left\n : rect.right < coords.left ? coords.left - rect.right : 0;\n if (dx < dxClosest) {\n closest = child;\n dxClosest = dx;\n coordsClosest = dx && closest.nodeType == 3 ? {left: rect.right < coords.left ? rect.right : rect.left, top: coords.top} : coords;\n if (child.nodeType == 1 && dx)\n { offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0); }\n continue\n }\n }\n if (!closest && (coords.left >= rect.right && coords.top >= rect.top ||\n coords.left >= rect.left && coords.top >= rect.bottom))\n { offset = childIndex + 1; }\n }\n }\n if (closest && closest.nodeType == 3) { return findOffsetInText(closest, coordsClosest) }\n if (!closest || (dxClosest && closest.nodeType == 1)) { return {node: node, offset: offset} }\n return findOffsetInNode(closest, coordsClosest)\n}\n\nfunction findOffsetInText(node, coords) {\n var len = node.nodeValue.length;\n var range = document.createRange();\n for (var i = 0; i < len; i++) {\n range.setEnd(node, i + 1);\n range.setStart(node, i);\n var rect = singleRect(range, 1);\n if (rect.top == rect.bottom) { continue }\n if (inRect(coords, rect))\n { return {node: node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0)} }\n }\n return {node: node, offset: 0}\n}\n\nfunction inRect(coords, rect) {\n return coords.left >= rect.left - 1 && coords.left <= rect.right + 1&&\n coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1\n}\n\nfunction targetKludge(dom, coords) {\n var parent = dom.parentNode;\n if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n { return parent }\n return dom\n}\n\nfunction posFromElement(view, elt, coords) {\n var ref = findOffsetInNode(elt, coords);\n var node = ref.node;\n var offset = ref.offset;\n var bias = -1;\n if (node.nodeType == 1 && !node.firstChild) {\n var rect = node.getBoundingClientRect();\n bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n }\n return view.docView.posFromDOM(node, offset, bias)\n}\n\nfunction posFromCaret(view, node, offset, coords) {\n // Browser (in caretPosition/RangeFromPoint) will agressively\n // normalize towards nearby inline nodes. Since we are interested in\n // positions between block nodes too, we first walk up the hierarchy\n // of nodes to see if there are block nodes that the coordinates\n // fall outside of. If so, we take the position before/after that\n // block. If not, we call `posFromDOM` on the raw node/offset.\n var outside = -1;\n for (var cur = node;;) {\n if (cur == view.dom) { break }\n var desc = view.docView.nearestDesc(cur, true);\n if (!desc) { return null }\n if (desc.node.isBlock && desc.parent) {\n var rect = desc.dom.getBoundingClientRect();\n if (rect.left > coords.left || rect.top > coords.top) { outside = desc.posBefore; }\n else if (rect.right < coords.left || rect.bottom < coords.top) { outside = desc.posAfter; }\n else { break }\n }\n cur = desc.dom.parentNode;\n }\n return outside > -1 ? outside : view.docView.posFromDOM(node, offset)\n}\n\nfunction elementFromPoint(element, coords, box) {\n var len = element.childNodes.length;\n if (len && box.top < box.bottom) {\n for (var startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {\n var child = element.childNodes[i];\n if (child.nodeType == 1) {\n var rects = child.getClientRects();\n for (var j = 0; j < rects.length; j++) {\n var rect = rects[j];\n if (inRect(coords, rect)) { return elementFromPoint(child, coords, rect) }\n }\n }\n if ((i = (i + 1) % len) == startI) { break }\n }\n }\n return element\n}\n\n// Given an x,y position on the editor, get the position in the document.\nfunction posAtCoords(view, coords) {\n var assign, assign$1;\n\n var root = view.root, node, offset;\n if (root.caretPositionFromPoint) {\n try { // Firefox throws for this call in hard-to-predict circumstances (#994)\n var pos$1 = root.caretPositionFromPoint(coords.left, coords.top);\n if (pos$1) { ((assign = pos$1, node = assign.offsetNode, offset = assign.offset)); }\n } catch (_) {}\n }\n if (!node && root.caretRangeFromPoint) {\n var range = root.caretRangeFromPoint(coords.left, coords.top);\n if (range) { ((assign$1 = range, node = assign$1.startContainer, offset = assign$1.startOffset)); }\n }\n\n var elt = root.elementFromPoint(coords.left, coords.top + 1), pos;\n if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n var box = view.dom.getBoundingClientRect();\n if (!inRect(coords, box)) { return null }\n elt = elementFromPoint(view.dom, coords, box);\n if (!elt) { return null }\n }\n // Safari's caretRangeFromPoint returns nonsense when on a draggable element\n if (result.safari && elt.draggable) { node = offset = null; }\n elt = targetKludge(elt, coords);\n if (node) {\n if (result.gecko && node.nodeType == 1) {\n // Firefox will sometimes return offsets into nodes, which\n // have no actual children, from caretPositionFromPoint (#953)\n offset = Math.min(offset, node.childNodes.length);\n // It'll also move the returned position before image nodes,\n // even if those are behind it.\n if (offset < node.childNodes.length) {\n var next = node.childNodes[offset], box$1;\n if (next.nodeName == \"IMG\" && (box$1 = next.getBoundingClientRect()).right <= coords.left &&\n box$1.bottom > coords.top)\n { offset++; }\n }\n }\n // Suspiciously specific kludge to work around caret*FromPoint\n // never returning a position at the end of the document\n if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&\n coords.top > node.lastChild.getBoundingClientRect().bottom)\n { pos = view.state.doc.content.size; }\n // Ignore positions directly after a BR, since caret*FromPoint\n // 'round up' positions that would be more accurately placed\n // before the BR node.\n else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n { pos = posFromCaret(view, node, offset, coords); }\n }\n if (pos == null) { pos = posFromElement(view, elt, coords); }\n\n var desc = view.docView.nearestDesc(elt, true);\n return {pos: pos, inside: desc ? desc.posAtStart - desc.border : -1}\n}\n\nfunction singleRect(object, bias) {\n var rects = object.getClientRects();\n return !rects.length ? object.getBoundingClientRect() : rects[bias < 0 ? 0 : rects.length - 1]\n}\n\nvar BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n\n// : (EditorView, number, number) → {left: number, top: number, right: number, bottom: number}\n// Given a position in the document model, get a bounding box of the\n// character at that position, relative to the window.\nfunction coordsAtPos(view, pos, side) {\n var ref = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n var node = ref.node;\n var offset = ref.offset;\n\n var supportEmptyRange = result.webkit || result.gecko;\n if (node.nodeType == 3) {\n // These browsers support querying empty text ranges. Prefer that in\n // bidi context or when at the end of a node.\n if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n var rect = singleRect(textRange(node, offset, offset), side);\n // Firefox returns bad results (the position before the space)\n // when querying a position directly after line-broken\n // whitespace. Detect this situation and and kludge around it\n if (result.gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n var rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n if (rectBefore.top == rect.top) {\n var rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n if (rectAfter.top != rect.top)\n { return flattenV(rectAfter, rectAfter.left < rectBefore.left) }\n }\n }\n return rect\n } else {\n var from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n if (side < 0 && !offset) { to++; takeSide = -1; }\n else if (side >= 0 && offset == node.nodeValue.length) { from--; takeSide = 1; }\n else if (side < 0) { from--; }\n else { to ++; }\n return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0)\n }\n }\n\n // Return a horizontal line in block context\n if (!view.state.doc.resolve(pos).parent.inlineContent) {\n if (offset && (side < 0 || offset == nodeSize(node))) {\n var before = node.childNodes[offset - 1];\n if (before.nodeType == 1) { return flattenH(before.getBoundingClientRect(), false) }\n }\n if (offset < nodeSize(node)) {\n var after = node.childNodes[offset];\n if (after.nodeType == 1) { return flattenH(after.getBoundingClientRect(), true) }\n }\n return flattenH(node.getBoundingClientRect(), side >= 0)\n }\n\n // Inline, not in text node (this is not Bidi-safe)\n if (offset && (side < 0 || offset == nodeSize(node))) {\n var before$1 = node.childNodes[offset - 1];\n var target = before$1.nodeType == 3 ? textRange(before$1, nodeSize(before$1) - (supportEmptyRange ? 0 : 1))\n // BR nodes tend to only return the rectangle before them.\n // Only use them if they are the last element in their parent\n : before$1.nodeType == 1 && (before$1.nodeName != \"BR\" || !before$1.nextSibling) ? before$1 : null;\n if (target) { return flattenV(singleRect(target, 1), false) }\n }\n if (offset < nodeSize(node)) {\n var after$1 = node.childNodes[offset];\n var target$1 = after$1.nodeType == 3 ? textRange(after$1, 0, (supportEmptyRange ? 0 : 1))\n : after$1.nodeType == 1 ? after$1 : null;\n if (target$1) { return flattenV(singleRect(target$1, -1), true) }\n }\n // All else failed, just try to get a rectangle for the target node\n return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0)\n}\n\nfunction flattenV(rect, left) {\n if (rect.width == 0) { return rect }\n var x = left ? rect.left : rect.right;\n return {top: rect.top, bottom: rect.bottom, left: x, right: x}\n}\n\nfunction flattenH(rect, top) {\n if (rect.height == 0) { return rect }\n var y = top ? rect.top : rect.bottom;\n return {top: y, bottom: y, left: rect.left, right: rect.right}\n}\n\nfunction withFlushedState(view, state, f) {\n var viewState = view.state, active = view.root.activeElement;\n if (viewState != state) { view.updateState(state); }\n if (active != view.dom) { view.focus(); }\n try {\n return f()\n } finally {\n if (viewState != state) { view.updateState(viewState); }\n if (active != view.dom && active) { active.focus(); }\n }\n}\n\n// : (EditorView, number, number)\n// Whether vertical position motion in a given direction\n// from a position would leave a text block.\nfunction endOfTextblockVertical(view, state, dir) {\n var sel = state.selection;\n var $pos = dir == \"up\" ? sel.$from : sel.$to;\n return withFlushedState(view, state, function () {\n var ref = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n var dom = ref.node;\n for (;;) {\n var nearest = view.docView.nearestDesc(dom, true);\n if (!nearest) { break }\n if (nearest.node.isBlock) { dom = nearest.dom; break }\n dom = nearest.dom.parentNode;\n }\n var coords = coordsAtPos(view, $pos.pos, 1);\n for (var child = dom.firstChild; child; child = child.nextSibling) {\n var boxes = (void 0);\n if (child.nodeType == 1) { boxes = child.getClientRects(); }\n else if (child.nodeType == 3) { boxes = textRange(child, 0, child.nodeValue.length).getClientRects(); }\n else { continue }\n for (var i = 0; i < boxes.length; i++) {\n var box = boxes[i];\n if (box.bottom > box.top && (dir == \"up\" ? box.bottom < coords.top + 1 : box.top > coords.bottom - 1))\n { return false }\n }\n }\n return true\n })\n}\n\nvar maybeRTL = /[\\u0590-\\u08ac]/;\n\nfunction endOfTextblockHorizontal(view, state, dir) {\n var ref = state.selection;\n var $head = ref.$head;\n if (!$head.parent.isTextblock) { return false }\n var offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n var sel = getSelection();\n // If the textblock is all LTR, or the browser doesn't support\n // Selection.modify (Edge), fall back to a primitive approach\n if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n { return dir == \"left\" || dir == \"backward\" ? atStart : atEnd }\n\n return withFlushedState(view, state, function () {\n // This is a huge hack, but appears to be the best we can\n // currently do: use `Selection.modify` to move the selection by\n // one character, and see if that moves the cursor out of the\n // textblock (or doesn't move it at all, when at the start/end of\n // the document).\n var oldRange = sel.getRangeAt(0), oldNode = sel.focusNode, oldOff = sel.focusOffset;\n var oldBidiLevel = sel.caretBidiLevel; // Only for Firefox\n sel.modify(\"move\", dir, \"character\");\n var parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n var result = !parentDOM.contains(sel.focusNode.nodeType == 1 ? sel.focusNode : sel.focusNode.parentNode) ||\n (oldNode == sel.focusNode && oldOff == sel.focusOffset);\n // Restore the previous selection\n sel.removeAllRanges();\n sel.addRange(oldRange);\n if (oldBidiLevel != null) { sel.caretBidiLevel = oldBidiLevel; }\n return result\n })\n}\n\nvar cachedState = null, cachedDir = null, cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n if (cachedState == state && cachedDir == dir) { return cachedResult }\n cachedState = state; cachedDir = dir;\n return cachedResult = dir == \"up\" || dir == \"down\"\n ? endOfTextblockVertical(view, state, dir)\n : endOfTextblockHorizontal(view, state, dir)\n}\n\n// NodeView:: interface\n//\n// By default, document nodes are rendered using the result of the\n// [`toDOM`](#model.NodeSpec.toDOM) method of their spec, and managed\n// entirely by the editor. For some use cases, such as embedded\n// node-specific editing interfaces, you want more control over\n// the behavior of a node's in-editor representation, and need to\n// [define](#view.EditorProps.nodeViews) a custom node view.\n//\n// Mark views only support `dom` and `contentDOM`, and don't support\n// any of the node view methods.\n//\n// Objects returned as node views must conform to this interface.\n//\n// dom:: ?dom.Node\n// The outer DOM node that represents the document node. When not\n// given, the default strategy is used to create a DOM node.\n//\n// contentDOM:: ?dom.Node\n// The DOM node that should hold the node's content. Only meaningful\n// if the node view also defines a `dom` property and if its node\n// type is not a leaf node type. When this is present, ProseMirror\n// will take care of rendering the node's children into it. When it\n// is not present, the node view itself is responsible for rendering\n// (or deciding not to render) its child nodes.\n//\n// update:: ?(node: Node, decorations: [Decoration]) → bool\n// When given, this will be called when the view is updating itself.\n// It will be given a node (possibly of a different type), and an\n// array of active decorations (which are automatically drawn, and\n// the node view may ignore if it isn't interested in them), and\n// should return true if it was able to update to that node, and\n// false otherwise. If the node view has a `contentDOM` property (or\n// no `dom` property), updating its child nodes will be handled by\n// ProseMirror.\n//\n// selectNode:: ?()\n// Can be used to override the way the node's selected status (as a\n// node selection) is displayed.\n//\n// deselectNode:: ?()\n// When defining a `selectNode` method, you should also provide a\n// `deselectNode` method to remove the effect again.\n//\n// setSelection:: ?(anchor: number, head: number, root: dom.Document)\n// This will be called to handle setting the selection inside the\n// node. The `anchor` and `head` positions are relative to the start\n// of the node. By default, a DOM selection will be created between\n// the DOM positions corresponding to those positions, but if you\n// override it you can do something else.\n//\n// stopEvent:: ?(event: dom.Event) → bool\n// Can be used to prevent the editor view from trying to handle some\n// or all DOM events that bubble up from the node view. Events for\n// which this returns true are not handled by the editor.\n//\n// ignoreMutation:: ?(dom.MutationRecord) → bool\n// Called when a DOM\n// [mutation](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver)\n// or a selection change happens within the view. When the change is\n// a selection change, the record will have a `type` property of\n// `\"selection\"` (which doesn't occur for native mutation records).\n// Return false if the editor should re-read the selection or\n// re-parse the range around the mutation, true if it can safely be\n// ignored.\n//\n// destroy:: ?()\n// Called when the node view is removed from the editor or the whole\n// editor is destroyed. (Not available for marks.)\n\n// View descriptions are data structures that describe the DOM that is\n// used to represent the editor's content. They are used for:\n//\n// - Incremental redrawing when the document changes\n//\n// - Figuring out what part of the document a given DOM position\n// corresponds to\n//\n// - Wiring in custom implementations of the editing interface for a\n// given node\n//\n// They form a doubly-linked mutable tree, starting at `view.docView`.\n\nvar NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\n\n// Superclass for the various kinds of descriptions. Defines their\n// basic structure and shared methods.\nvar ViewDesc = function ViewDesc(parent, children, dom, contentDOM) {\n this.parent = parent;\n this.children = children;\n this.dom = dom;\n // An expando property on the DOM node provides a link back to its\n // description.\n dom.pmViewDesc = this;\n // This is the node that holds the child views. It may be null for\n // descs that don't have children.\n this.contentDOM = contentDOM;\n this.dirty = NOT_DIRTY;\n};\n\nvar prototypeAccessors = { beforePosition: { configurable: true },size: { configurable: true },border: { configurable: true },posBefore: { configurable: true },posAtStart: { configurable: true },posAfter: { configurable: true },posAtEnd: { configurable: true },contentLost: { configurable: true },domAtom: { configurable: true } };\n\n// Used to check whether a given description corresponds to a\n// widget/mark/node.\nViewDesc.prototype.matchesWidget = function matchesWidget () { return false };\nViewDesc.prototype.matchesMark = function matchesMark () { return false };\nViewDesc.prototype.matchesNode = function matchesNode () { return false };\nViewDesc.prototype.matchesHack = function matchesHack () { return false };\n\nprototypeAccessors.beforePosition.get = function () { return false };\n\n// : () → ?ParseRule\n// When parsing in-editor content (in domchange.js), we allow\n// descriptions to determine the parse rules that should be used to\n// parse them.\nViewDesc.prototype.parseRule = function parseRule () { return null };\n\n// : (dom.Event) → bool\n// Used by the editor's event handler to ignore events that come\n// from certain descs.\nViewDesc.prototype.stopEvent = function stopEvent () { return false };\n\n// The size of the content represented by this desc.\nprototypeAccessors.size.get = function () {\n var size = 0;\n for (var i = 0; i < this.children.length; i++) { size += this.children[i].size; }\n return size\n};\n\n// For block nodes, this represents the space taken up by their\n// start/end tokens.\nprototypeAccessors.border.get = function () { return 0 };\n\nViewDesc.prototype.destroy = function destroy () {\n this.parent = null;\n if (this.dom.pmViewDesc == this) { this.dom.pmViewDesc = null; }\n for (var i = 0; i < this.children.length; i++)\n { this.children[i].destroy(); }\n};\n\nViewDesc.prototype.posBeforeChild = function posBeforeChild (child) {\n for (var i = 0, pos = this.posAtStart; i < this.children.length; i++) {\n var cur = this.children[i];\n if (cur == child) { return pos }\n pos += cur.size;\n }\n};\n\nprototypeAccessors.posBefore.get = function () {\n return this.parent.posBeforeChild(this)\n};\n\nprototypeAccessors.posAtStart.get = function () {\n return this.parent ? this.parent.posBeforeChild(this) + this.border : 0\n};\n\nprototypeAccessors.posAfter.get = function () {\n return this.posBefore + this.size\n};\n\nprototypeAccessors.posAtEnd.get = function () {\n return this.posAtStart + this.size - 2 * this.border\n};\n\n// : (dom.Node, number, ?number) → number\nViewDesc.prototype.localPosFromDOM = function localPosFromDOM (dom, offset, bias) {\n // If the DOM position is in the content, use the child desc after\n // it to figure out a position.\n if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n if (bias < 0) {\n var domBefore, desc;\n if (dom == this.contentDOM) {\n domBefore = dom.childNodes[offset - 1];\n } else {\n while (dom.parentNode != this.contentDOM) { dom = dom.parentNode; }\n domBefore = dom.previousSibling;\n }\n while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this)) { domBefore = domBefore.previousSibling; }\n return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart\n } else {\n var domAfter, desc$1;\n if (dom == this.contentDOM) {\n domAfter = dom.childNodes[offset];\n } else {\n while (dom.parentNode != this.contentDOM) { dom = dom.parentNode; }\n domAfter = dom.nextSibling;\n }\n while (domAfter && !((desc$1 = domAfter.pmViewDesc) && desc$1.parent == this)) { domAfter = domAfter.nextSibling; }\n return domAfter ? this.posBeforeChild(desc$1) : this.posAtEnd\n }\n }\n // Otherwise, use various heuristics, falling back on the bias\n // parameter, to determine whether to return the position at the\n // start or at the end of this view desc.\n var atEnd;\n if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n } else if (this.dom.firstChild) {\n if (offset == 0) { for (var search = dom;; search = search.parentNode) {\n if (search == this.dom) { atEnd = false; break }\n if (search.parentNode.firstChild != search) { break }\n } }\n if (atEnd == null && offset == dom.childNodes.length) { for (var search$1 = dom;; search$1 = search$1.parentNode) {\n if (search$1 == this.dom) { atEnd = true; break }\n if (search$1.parentNode.lastChild != search$1) { break }\n } }\n }\n return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart\n};\n\n// Scan up the dom finding the first desc that is a descendant of\n// this one.\nViewDesc.prototype.nearestDesc = function nearestDesc (dom, onlyNodes) {\n for (var first = true, cur = dom; cur; cur = cur.parentNode) {\n var desc = this.getDesc(cur);\n if (desc && (!onlyNodes || desc.node)) {\n // If dom is outside of this desc's nodeDOM, don't count it.\n if (first && desc.nodeDOM &&\n !(desc.nodeDOM.nodeType == 1 ? desc.nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : desc.nodeDOM == dom))\n { first = false; }\n else\n { return desc }\n }\n }\n};\n\nViewDesc.prototype.getDesc = function getDesc (dom) {\n var desc = dom.pmViewDesc;\n for (var cur = desc; cur; cur = cur.parent) { if (cur == this) { return desc } }\n};\n\nViewDesc.prototype.posFromDOM = function posFromDOM (dom, offset, bias) {\n for (var scan = dom; scan; scan = scan.parentNode) {\n var desc = this.getDesc(scan);\n if (desc) { return desc.localPosFromDOM(dom, offset, bias) }\n }\n return -1\n};\n\n// : (number) → ?NodeViewDesc\n// Find the desc for the node after the given pos, if any. (When a\n// parent node overrode rendering, there might not be one.)\nViewDesc.prototype.descAt = function descAt (pos) {\n for (var i = 0, offset = 0; i < this.children.length; i++) {\n var child = this.children[i], end = offset + child.size;\n if (offset == pos && end != offset) {\n while (!child.border && child.children.length) { child = child.children[0]; }\n return child\n }\n if (pos < end) { return child.descAt(pos - offset - child.border) }\n offset = end;\n }\n};\n\n// : (number, number) → {node: dom.Node, offset: number}\nViewDesc.prototype.domFromPos = function domFromPos (pos, side) {\n if (!this.contentDOM) { return {node: this.dom, offset: 0} }\n for (var offset = 0, i = 0, first = true;; i++, first = false) {\n // Skip removed or always-before children\n while (i < this.children.length && (this.children[i].beforePosition ||\n this.children[i].dom.parentNode != this.contentDOM))\n { offset += this.children[i++].size; }\n var child = i == this.children.length ? null : this.children[i];\n if (offset == pos && (side == 0 || !child || !child.size || child.border || (side < 0 && first)) ||\n child && child.domAtom && pos < offset + child.size) { return {\n node: this.contentDOM,\n offset: child ? domIndex(child.dom) : this.contentDOM.childNodes.length\n } }\n if (!child) { throw new Error(\"Invalid position \" + pos) }\n var end = offset + child.size;\n if (!child.domAtom && (side < 0 && !child.border ? end >= pos : end > pos))\n { return child.domFromPos(pos - offset - child.border, side) }\n offset = end;\n }\n};\n\n// Used to find a DOM range in a single parent for a given changed\n// range.\nViewDesc.prototype.parseRange = function parseRange (from, to, base) {\n if ( base === void 0 ) base = 0;\n\n if (this.children.length == 0)\n { return {node: this.contentDOM, from: from, to: to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length} }\n\n var fromOffset = -1, toOffset = -1;\n for (var offset = base, i = 0;; i++) {\n var child = this.children[i], end = offset + child.size;\n if (fromOffset == -1 && from <= end) {\n var childBase = offset + child.border;\n // FIXME maybe descend mark views to parse a narrower range?\n if (from >= childBase && to <= end - child.border && child.node &&\n child.contentDOM && this.contentDOM.contains(child.contentDOM))\n { return child.parseRange(from, to, childBase) }\n\n from = offset;\n for (var j = i; j > 0; j--) {\n var prev = this.children[j - 1];\n if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n fromOffset = domIndex(prev.dom) + 1;\n break\n }\n from -= prev.size;\n }\n if (fromOffset == -1) { fromOffset = 0; }\n }\n if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n to = end;\n for (var j$1 = i + 1; j$1 < this.children.length; j$1++) {\n var next = this.children[j$1];\n if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n toOffset = domIndex(next.dom);\n break\n }\n to += next.size;\n }\n if (toOffset == -1) { toOffset = this.contentDOM.childNodes.length; }\n break\n }\n offset = end;\n }\n return {node: this.contentDOM, from: from, to: to, fromOffset: fromOffset, toOffset: toOffset}\n};\n\nViewDesc.prototype.emptyChildAt = function emptyChildAt (side) {\n if (this.border || !this.contentDOM || !this.children.length) { return false }\n var child = this.children[side < 0 ? 0 : this.children.length - 1];\n return child.size == 0 || child.emptyChildAt(side)\n};\n\n// : (number) → dom.Node\nViewDesc.prototype.domAfterPos = function domAfterPos (pos) {\n var ref = this.domFromPos(pos, 0);\n var node = ref.node;\n var offset = ref.offset;\n if (node.nodeType != 1 || offset == node.childNodes.length)\n { throw new RangeError(\"No node after pos \" + pos) }\n return node.childNodes[offset]\n};\n\n// : (number, number, dom.Document)\n// View descs are responsible for setting any selection that falls\n// entirely inside of them, so that custom implementations can do\n// custom things with the selection. Note that this falls apart when\n// a selection starts in such a node and ends in another, in which\n// case we just use whatever domFromPos produces as a best effort.\nViewDesc.prototype.setSelection = function setSelection (anchor, head, root, force) {\n // If the selection falls entirely in a child, give it to that child\n var from = Math.min(anchor, head), to = Math.max(anchor, head);\n for (var i = 0, offset = 0; i < this.children.length; i++) {\n var child = this.children[i], end = offset + child.size;\n if (from > offset && to < end)\n { return child.setSelection(anchor - offset - child.border, head - offset - child.border, root, force) }\n offset = end;\n }\n\n var anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n var headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n var domSel = root.getSelection();\n\n var brKludge = false;\n // On Firefox, using Selection.collapse to put the cursor after a\n // BR node for some reason doesn't always work (#1073). On Safari,\n // the cursor sometimes inexplicable visually lags behind its\n // reported position in such situations (#1092).\n if ((result.gecko || result.safari) && anchor == head) {\n var node = anchorDOM.node;\n var offset$1 = anchorDOM.offset;\n if (node.nodeType == 3) {\n brKludge = offset$1 && node.nodeValue[offset$1 - 1] == \"\\n\";\n // Issue #1128\n if (brKludge && offset$1 == node.nodeValue.length &&\n node.nextSibling && node.nextSibling.nodeName == \"BR\")\n { anchorDOM = headDOM = {node: node.parentNode, offset: domIndex(node) + 1}; }\n } else {\n var prev = node.childNodes[offset$1 - 1];\n brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n }\n }\n\n if (!(force || brKludge && result.safari) &&\n isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) &&\n isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset))\n { return }\n\n // Selection.extend can be used to create an 'inverted' selection\n // (one where the focus is before the anchor), but not all\n // browsers support it yet.\n var domSelExtended = false;\n if ((domSel.extend || anchor == head) && !brKludge) {\n domSel.collapse(anchorDOM.node, anchorDOM.offset);\n try {\n if (anchor != head) { domSel.extend(headDOM.node, headDOM.offset); }\n domSelExtended = true;\n } catch (err) {\n // In some cases with Chrome the selection is empty after calling\n // collapse, even when it should be valid. This appears to be a bug, but\n // it is difficult to isolate. If this happens fallback to the old path\n // without using extend.\n if (!(err instanceof DOMException)) { throw err }\n // declare global: DOMException\n }\n }\n if (!domSelExtended) {\n if (anchor > head) { var tmp = anchorDOM; anchorDOM = headDOM; headDOM = tmp; }\n var range = document.createRange();\n range.setEnd(headDOM.node, headDOM.offset);\n range.setStart(anchorDOM.node, anchorDOM.offset);\n domSel.removeAllRanges();\n domSel.addRange(range);\n }\n};\n\n// : (dom.MutationRecord) → bool\nViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return !this.contentDOM && mutation.type != \"selection\"\n};\n\nprototypeAccessors.contentLost.get = function () {\n return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM)\n};\n\n// Remove a subtree of the element tree that has been touched\n// by a DOM change, so that the next update will redraw it.\nViewDesc.prototype.markDirty = function markDirty (from, to) {\n for (var offset = 0, i = 0; i < this.children.length; i++) {\n var child = this.children[i], end = offset + child.size;\n if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n var startInside = offset + child.border, endInside = end - child.border;\n if (from >= startInside && to <= endInside) {\n this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n if (from == startInside && to == endInside &&\n (child.contentLost || child.dom.parentNode != this.contentDOM)) { child.dirty = NODE_DIRTY; }\n else { child.markDirty(from - startInside, to - startInside); }\n return\n } else {\n child.dirty = NODE_DIRTY;\n }\n }\n offset = end;\n }\n this.dirty = CONTENT_DIRTY;\n};\n\nViewDesc.prototype.markParentsDirty = function markParentsDirty () {\n var level = 1;\n for (var node = this.parent; node; node = node.parent, level++) {\n var dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n if (node.dirty < dirty) { node.dirty = dirty; }\n }\n};\n\nprototypeAccessors.domAtom.get = function () { return false };\n\nObject.defineProperties( ViewDesc.prototype, prototypeAccessors );\n\n// Reused array to avoid allocating fresh arrays for things that will\n// stay empty anyway.\nvar nothing = [];\n\n// A widget desc represents a widget decoration, which is a DOM node\n// drawn between the document nodes.\nvar WidgetViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function WidgetViewDesc(parent, widget, view, pos) {\n var self, dom = widget.type.toDOM;\n if (typeof dom == \"function\") { dom = dom(view, function () {\n if (!self) { return pos }\n if (self.parent) { return self.parent.posBeforeChild(self) }\n }); }\n if (!widget.type.spec.raw) {\n if (dom.nodeType != 1) {\n var wrap = document.createElement(\"span\");\n wrap.appendChild(dom);\n dom = wrap;\n }\n dom.contentEditable = false;\n dom.classList.add(\"ProseMirror-widget\");\n }\n ViewDesc.call(this, parent, nothing, dom, null);\n this.widget = widget;\n self = this;\n }\n\n if ( ViewDesc ) WidgetViewDesc.__proto__ = ViewDesc;\n WidgetViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n WidgetViewDesc.prototype.constructor = WidgetViewDesc;\n\n var prototypeAccessors$1 = { beforePosition: { configurable: true },domAtom: { configurable: true } };\n\n prototypeAccessors$1.beforePosition.get = function () {\n return this.widget.type.side < 0\n };\n\n WidgetViewDesc.prototype.matchesWidget = function matchesWidget (widget) {\n return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type)\n };\n\n WidgetViewDesc.prototype.parseRule = function parseRule () { return {ignore: true} };\n\n WidgetViewDesc.prototype.stopEvent = function stopEvent (event) {\n var stop = this.widget.spec.stopEvent;\n return stop ? stop(event) : false\n };\n\n WidgetViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return mutation.type != \"selection\" || this.widget.spec.ignoreSelection\n };\n\n prototypeAccessors$1.domAtom.get = function () { return true };\n\n Object.defineProperties( WidgetViewDesc.prototype, prototypeAccessors$1 );\n\n return WidgetViewDesc;\n}(ViewDesc));\n\nvar CompositionViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function CompositionViewDesc(parent, dom, textDOM, text) {\n ViewDesc.call(this, parent, nothing, dom, null);\n this.textDOM = textDOM;\n this.text = text;\n }\n\n if ( ViewDesc ) CompositionViewDesc.__proto__ = ViewDesc;\n CompositionViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n CompositionViewDesc.prototype.constructor = CompositionViewDesc;\n\n var prototypeAccessors$2 = { size: { configurable: true } };\n\n prototypeAccessors$2.size.get = function () { return this.text.length };\n\n CompositionViewDesc.prototype.localPosFromDOM = function localPosFromDOM (dom, offset) {\n if (dom != this.textDOM) { return this.posAtStart + (offset ? this.size : 0) }\n return this.posAtStart + offset\n };\n\n CompositionViewDesc.prototype.domFromPos = function domFromPos (pos) {\n return {node: this.textDOM, offset: pos}\n };\n\n CompositionViewDesc.prototype.ignoreMutation = function ignoreMutation (mut) {\n return mut.type === 'characterData' && mut.target.nodeValue == mut.oldValue\n };\n\n Object.defineProperties( CompositionViewDesc.prototype, prototypeAccessors$2 );\n\n return CompositionViewDesc;\n}(ViewDesc));\n\n// A mark desc represents a mark. May have multiple children,\n// depending on how the mark is split. Note that marks are drawn using\n// a fixed nesting order, for simplicity and predictability, so in\n// some cases they will be split more often than would appear\n// necessary.\nvar MarkViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function MarkViewDesc(parent, mark, dom, contentDOM) {\n ViewDesc.call(this, parent, [], dom, contentDOM);\n this.mark = mark;\n }\n\n if ( ViewDesc ) MarkViewDesc.__proto__ = ViewDesc;\n MarkViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n MarkViewDesc.prototype.constructor = MarkViewDesc;\n\n MarkViewDesc.create = function create (parent, mark, inline, view) {\n var custom = view.nodeViews[mark.type.name];\n var spec = custom && custom(mark, view, inline);\n if (!spec || !spec.dom)\n { spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline)); }\n return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom)\n };\n\n MarkViewDesc.prototype.parseRule = function parseRule () { return {mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM} };\n\n MarkViewDesc.prototype.matchesMark = function matchesMark (mark) { return this.dirty != NODE_DIRTY && this.mark.eq(mark) };\n\n MarkViewDesc.prototype.markDirty = function markDirty (from, to) {\n ViewDesc.prototype.markDirty.call(this, from, to);\n // Move dirty info to nearest node view\n if (this.dirty != NOT_DIRTY) {\n var parent = this.parent;\n while (!parent.node) { parent = parent.parent; }\n if (parent.dirty < this.dirty) { parent.dirty = this.dirty; }\n this.dirty = NOT_DIRTY;\n }\n };\n\n MarkViewDesc.prototype.slice = function slice (from, to, view) {\n var copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n var nodes = this.children, size = this.size;\n if (to < size) { nodes = replaceNodes(nodes, to, size, view); }\n if (from > 0) { nodes = replaceNodes(nodes, 0, from, view); }\n for (var i = 0; i < nodes.length; i++) { nodes[i].parent = copy; }\n copy.children = nodes;\n return copy\n };\n\n return MarkViewDesc;\n}(ViewDesc));\n\n// Node view descs are the main, most common type of view desc, and\n// correspond to an actual node in the document. Unlike mark descs,\n// they populate their child array themselves.\nvar NodeViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) {\n ViewDesc.call(this, parent, node.isLeaf ? nothing : [], dom, contentDOM);\n this.nodeDOM = nodeDOM;\n this.node = node;\n this.outerDeco = outerDeco;\n this.innerDeco = innerDeco;\n if (contentDOM) { this.updateChildren(view, pos); }\n }\n\n if ( ViewDesc ) NodeViewDesc.__proto__ = ViewDesc;\n NodeViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n NodeViewDesc.prototype.constructor = NodeViewDesc;\n\n var prototypeAccessors$3 = { size: { configurable: true },border: { configurable: true },domAtom: { configurable: true } };\n\n // By default, a node is rendered using the `toDOM` method from the\n // node type spec. But client code can use the `nodeViews` spec to\n // supply a custom node view, which can influence various aspects of\n // the way the node works.\n //\n // (Using subclassing for this was intentionally decided against,\n // since it'd require exposing a whole slew of finnicky\n // implementation details to the user code that they probably will\n // never need.)\n NodeViewDesc.create = function create (parent, node, outerDeco, innerDeco, view, pos) {\n var assign;\n\n var custom = view.nodeViews[node.type.name], descObj;\n var spec = custom && custom(node, view, function () {\n // (This is a function that allows the custom view to find its\n // own position)\n if (!descObj) { return pos }\n if (descObj.parent) { return descObj.parent.posBeforeChild(descObj) }\n }, outerDeco);\n\n var dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n if (node.isText) {\n if (!dom) { dom = document.createTextNode(node.text); }\n else if (dom.nodeType != 3) { throw new RangeError(\"Text must be rendered as a DOM text node\") }\n } else if (!dom) {\n((assign = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node)), dom = assign.dom, contentDOM = assign.contentDOM));\n }\n if (!contentDOM && !node.isText && dom.nodeName != \"BR\") { // Chrome gets confused by
          \n if (!dom.hasAttribute(\"contenteditable\")) { dom.contentEditable = false; }\n if (node.type.spec.draggable) { dom.draggable = true; }\n }\n\n var nodeDOM = dom;\n dom = applyOuterDeco(dom, outerDeco, node);\n\n if (spec)\n { return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM,\n spec, view, pos + 1) }\n else if (node.isText)\n { return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) }\n else\n { return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos + 1) }\n };\n\n NodeViewDesc.prototype.parseRule = function parseRule () {\n var this$1 = this;\n\n // Experimental kludge to allow opt-in re-parsing of nodes\n if (this.node.type.spec.reparseInView) { return null }\n // FIXME the assumption that this can always return the current\n // attrs means that if the user somehow manages to change the\n // attrs in the dom, that won't be picked up. Not entirely sure\n // whether this is a problem\n var rule = {node: this.node.type.name, attrs: this.node.attrs};\n if (this.node.type.spec.code) { rule.preserveWhitespace = \"full\"; }\n if (this.contentDOM && !this.contentLost) { rule.contentElement = this.contentDOM; }\n else { rule.getContent = function () { return this$1.contentDOM ? Fragment.empty : this$1.node.content; }; }\n return rule\n };\n\n NodeViewDesc.prototype.matchesNode = function matchesNode (node, outerDeco, innerDeco) {\n return this.dirty == NOT_DIRTY && node.eq(this.node) &&\n sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco)\n };\n\n prototypeAccessors$3.size.get = function () { return this.node.nodeSize };\n\n prototypeAccessors$3.border.get = function () { return this.node.isLeaf ? 0 : 1 };\n\n // Syncs `this.children` to match `this.node.content` and the local\n // decorations, possibly introducing nesting for marks. Then, in a\n // separate step, syncs the DOM inside `this.contentDOM` to\n // `this.children`.\n NodeViewDesc.prototype.updateChildren = function updateChildren (view, pos) {\n var this$1 = this;\n\n var inline = this.node.inlineContent, off = pos;\n var composition = inline && view.composing && this.localCompositionNode(view, pos);\n var updater = new ViewTreeUpdater(this, composition && composition.node);\n iterDeco(this.node, this.innerDeco, function (widget, i, insideNode) {\n if (widget.spec.marks)\n { updater.syncToMarks(widget.spec.marks, inline, view); }\n else if (widget.type.side >= 0 && !insideNode)\n { updater.syncToMarks(i == this$1.node.childCount ? Mark.none : this$1.node.child(i).marks, inline, view); }\n // If the next node is a desc matching this widget, reuse it,\n // otherwise insert the widget as a new view desc.\n updater.placeWidget(widget, view, off);\n }, function (child, outerDeco, innerDeco, i) {\n // Make sure the wrapping mark descs match the node's marks.\n updater.syncToMarks(child.marks, inline, view);\n // Either find an existing desc that exactly matches this node,\n // and drop the descs before it.\n updater.findNodeMatch(child, outerDeco, innerDeco, i) ||\n // Or try updating the next desc to reflect this node.\n updater.updateNextNode(child, outerDeco, innerDeco, view, i) ||\n // Or just add it as a new desc.\n updater.addNode(child, outerDeco, innerDeco, view, off);\n off += child.nodeSize;\n });\n // Drop all remaining descs after the current position.\n updater.syncToMarks(nothing, inline, view);\n if (this.node.isTextblock) { updater.addTextblockHacks(); }\n updater.destroyRest();\n\n // Sync the DOM if anything changed\n if (updater.changed || this.dirty == CONTENT_DIRTY) {\n // May have to protect focused DOM from being changed if a composition is active\n if (composition) { this.protectLocalComposition(view, composition); }\n renderDescs(this.contentDOM, this.children, view);\n if (result.ios) { iosHacks(this.dom); }\n }\n };\n\n NodeViewDesc.prototype.localCompositionNode = function localCompositionNode (view, pos) {\n // Only do something if both the selection and a focused text node\n // are inside of this node, and the node isn't already part of a\n // view that's a child of this view\n var ref = view.state.selection;\n var from = ref.from;\n var to = ref.to;\n if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size) { return }\n var sel = view.root.getSelection();\n var textNode = nearbyTextNode(sel.focusNode, sel.focusOffset);\n if (!textNode || !this.dom.contains(textNode.parentNode)) { return }\n\n // Find the text in the focused node in the node, stop if it's not\n // there (may have been modified through other means, in which\n // case it should overwritten)\n var text = textNode.nodeValue;\n var textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n\n return textPos < 0 ? null : {node: textNode, pos: textPos, text: text}\n };\n\n NodeViewDesc.prototype.protectLocalComposition = function protectLocalComposition (view, ref) {\n var node = ref.node;\n var pos = ref.pos;\n var text = ref.text;\n\n // The node is already part of a local view desc, leave it there\n if (this.getDesc(node)) { return }\n\n // Create a composition view for the orphaned nodes\n var topNode = node;\n for (;; topNode = topNode.parentNode) {\n if (topNode.parentNode == this.contentDOM) { break }\n while (topNode.previousSibling) { topNode.parentNode.removeChild(topNode.previousSibling); }\n while (topNode.nextSibling) { topNode.parentNode.removeChild(topNode.nextSibling); }\n if (topNode.pmViewDesc) { topNode.pmViewDesc = null; }\n }\n var desc = new CompositionViewDesc(this, topNode, node, text);\n view.compositionNodes.push(desc);\n\n // Patch up this.children to contain the composition view\n this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n };\n\n // : (Node, [Decoration], DecorationSet, EditorView) → bool\n // If this desc be updated to match the given node decoration,\n // do so and return true.\n NodeViewDesc.prototype.update = function update (node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY ||\n !node.sameMarkup(this.node)) { return false }\n this.updateInner(node, outerDeco, innerDeco, view);\n return true\n };\n\n NodeViewDesc.prototype.updateInner = function updateInner (node, outerDeco, innerDeco, view) {\n this.updateOuterDeco(outerDeco);\n this.node = node;\n this.innerDeco = innerDeco;\n if (this.contentDOM) { this.updateChildren(view, this.posAtStart); }\n this.dirty = NOT_DIRTY;\n };\n\n NodeViewDesc.prototype.updateOuterDeco = function updateOuterDeco (outerDeco) {\n if (sameOuterDeco(outerDeco, this.outerDeco)) { return }\n var needsWrap = this.nodeDOM.nodeType != 1;\n var oldDOM = this.dom;\n this.dom = patchOuterDeco(this.dom, this.nodeDOM,\n computeOuterDeco(this.outerDeco, this.node, needsWrap),\n computeOuterDeco(outerDeco, this.node, needsWrap));\n if (this.dom != oldDOM) {\n oldDOM.pmViewDesc = null;\n this.dom.pmViewDesc = this;\n }\n this.outerDeco = outerDeco;\n };\n\n // Mark this node as being the selected node.\n NodeViewDesc.prototype.selectNode = function selectNode () {\n this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable) { this.dom.draggable = true; }\n };\n\n // Remove selected node marking from this node.\n NodeViewDesc.prototype.deselectNode = function deselectNode () {\n this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable) { this.dom.removeAttribute(\"draggable\"); }\n };\n\n prototypeAccessors$3.domAtom.get = function () { return this.node.isAtom };\n\n Object.defineProperties( NodeViewDesc.prototype, prototypeAccessors$3 );\n\n return NodeViewDesc;\n}(ViewDesc));\n\n// Create a view desc for the top-level document node, to be exported\n// and used by the view class.\nfunction docViewDesc(doc, outerDeco, innerDeco, dom, view) {\n applyOuterDeco(dom, outerDeco, doc);\n return new NodeViewDesc(null, doc, outerDeco, innerDeco, dom, dom, dom, view, 0)\n}\n\nvar TextViewDesc = /*@__PURE__*/(function (NodeViewDesc) {\n function TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) {\n NodeViewDesc.call(this, parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view);\n }\n\n if ( NodeViewDesc ) TextViewDesc.__proto__ = NodeViewDesc;\n TextViewDesc.prototype = Object.create( NodeViewDesc && NodeViewDesc.prototype );\n TextViewDesc.prototype.constructor = TextViewDesc;\n\n var prototypeAccessors$4 = { domAtom: { configurable: true } };\n\n TextViewDesc.prototype.parseRule = function parseRule () {\n var skip = this.nodeDOM.parentNode;\n while (skip && skip != this.dom && !skip.pmIsDeco) { skip = skip.parentNode; }\n return {skip: skip || true}\n };\n\n TextViewDesc.prototype.update = function update (node, outerDeco, _, view) {\n if (this.dirty == NODE_DIRTY || (this.dirty != NOT_DIRTY && !this.inParent()) ||\n !node.sameMarkup(this.node)) { return false }\n this.updateOuterDeco(outerDeco);\n if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n this.nodeDOM.nodeValue = node.text;\n if (view.trackWrites == this.nodeDOM) { view.trackWrites = null; }\n }\n this.node = node;\n this.dirty = NOT_DIRTY;\n return true\n };\n\n TextViewDesc.prototype.inParent = function inParent () {\n var parentDOM = this.parent.contentDOM;\n for (var n = this.nodeDOM; n; n = n.parentNode) { if (n == parentDOM) { return true } }\n return false\n };\n\n TextViewDesc.prototype.domFromPos = function domFromPos (pos) {\n return {node: this.nodeDOM, offset: pos}\n };\n\n TextViewDesc.prototype.localPosFromDOM = function localPosFromDOM (dom, offset, bias) {\n if (dom == this.nodeDOM) { return this.posAtStart + Math.min(offset, this.node.text.length) }\n return NodeViewDesc.prototype.localPosFromDOM.call(this, dom, offset, bias)\n };\n\n TextViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return mutation.type != \"characterData\" && mutation.type != \"selection\"\n };\n\n TextViewDesc.prototype.slice = function slice (from, to, view) {\n var node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view)\n };\n\n prototypeAccessors$4.domAtom.get = function () { return false };\n\n Object.defineProperties( TextViewDesc.prototype, prototypeAccessors$4 );\n\n return TextViewDesc;\n}(NodeViewDesc));\n\n// A dummy desc used to tag trailing BR or span nodes created to work\n// around contentEditable terribleness.\nvar BRHackViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function BRHackViewDesc () {\n ViewDesc.apply(this, arguments);\n }\n\n if ( ViewDesc ) BRHackViewDesc.__proto__ = ViewDesc;\n BRHackViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n BRHackViewDesc.prototype.constructor = BRHackViewDesc;\n\n var prototypeAccessors$5 = { domAtom: { configurable: true } };\n\n BRHackViewDesc.prototype.parseRule = function parseRule () { return {ignore: true} };\n BRHackViewDesc.prototype.matchesHack = function matchesHack () { return this.dirty == NOT_DIRTY };\n prototypeAccessors$5.domAtom.get = function () { return true };\n\n Object.defineProperties( BRHackViewDesc.prototype, prototypeAccessors$5 );\n\n return BRHackViewDesc;\n}(ViewDesc));\n\n// A separate subclass is used for customized node views, so that the\n// extra checks only have to be made for nodes that are actually\n// customized.\nvar CustomNodeViewDesc = /*@__PURE__*/(function (NodeViewDesc) {\n function CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) {\n NodeViewDesc.call(this, parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos);\n this.spec = spec;\n }\n\n if ( NodeViewDesc ) CustomNodeViewDesc.__proto__ = NodeViewDesc;\n CustomNodeViewDesc.prototype = Object.create( NodeViewDesc && NodeViewDesc.prototype );\n CustomNodeViewDesc.prototype.constructor = CustomNodeViewDesc;\n\n // A custom `update` method gets to decide whether the update goes\n // through. If it does, and there's a `contentDOM` node, our logic\n // updates the children.\n CustomNodeViewDesc.prototype.update = function update (node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY) { return false }\n if (this.spec.update) {\n var result = this.spec.update(node, outerDeco);\n if (result) { this.updateInner(node, outerDeco, innerDeco, view); }\n return result\n } else if (!this.contentDOM && !node.isLeaf) {\n return false\n } else {\n return NodeViewDesc.prototype.update.call(this, node, outerDeco, innerDeco, view)\n }\n };\n\n CustomNodeViewDesc.prototype.selectNode = function selectNode () {\n this.spec.selectNode ? this.spec.selectNode() : NodeViewDesc.prototype.selectNode.call(this);\n };\n\n CustomNodeViewDesc.prototype.deselectNode = function deselectNode () {\n this.spec.deselectNode ? this.spec.deselectNode() : NodeViewDesc.prototype.deselectNode.call(this);\n };\n\n CustomNodeViewDesc.prototype.setSelection = function setSelection (anchor, head, root, force) {\n this.spec.setSelection ? this.spec.setSelection(anchor, head, root)\n : NodeViewDesc.prototype.setSelection.call(this, anchor, head, root, force);\n };\n\n CustomNodeViewDesc.prototype.destroy = function destroy () {\n if (this.spec.destroy) { this.spec.destroy(); }\n NodeViewDesc.prototype.destroy.call(this);\n };\n\n CustomNodeViewDesc.prototype.stopEvent = function stopEvent (event) {\n return this.spec.stopEvent ? this.spec.stopEvent(event) : false\n };\n\n CustomNodeViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : NodeViewDesc.prototype.ignoreMutation.call(this, mutation)\n };\n\n return CustomNodeViewDesc;\n}(NodeViewDesc));\n\n// : (dom.Node, [ViewDesc])\n// Sync the content of the given DOM node with the nodes associated\n// with the given array of view descs, recursing into mark descs\n// because this should sync the subtree for a whole node at a time.\nfunction renderDescs(parentDOM, descs, view) {\n var dom = parentDOM.firstChild, written = false;\n for (var i = 0; i < descs.length; i++) {\n var desc = descs[i], childDOM = desc.dom;\n if (childDOM.parentNode == parentDOM) {\n while (childDOM != dom) { dom = rm(dom); written = true; }\n dom = dom.nextSibling;\n } else {\n written = true;\n parentDOM.insertBefore(childDOM, dom);\n }\n if (desc instanceof MarkViewDesc) {\n var pos = dom ? dom.previousSibling : parentDOM.lastChild;\n renderDescs(desc.contentDOM, desc.children, view);\n dom = pos ? pos.nextSibling : parentDOM.firstChild;\n }\n }\n while (dom) { dom = rm(dom); written = true; }\n if (written && view.trackWrites == parentDOM) { view.trackWrites = null; }\n}\n\nfunction OuterDecoLevel(nodeName) {\n if (nodeName) { this.nodeName = nodeName; }\n}\nOuterDecoLevel.prototype = Object.create(null);\n\nvar noDeco = [new OuterDecoLevel];\n\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n if (outerDeco.length == 0) { return noDeco }\n\n var top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top];\n\n for (var i = 0; i < outerDeco.length; i++) {\n var attrs = outerDeco[i].type.attrs;\n if (!attrs) { continue }\n if (attrs.nodeName)\n { result.push(top = new OuterDecoLevel(attrs.nodeName)); }\n\n for (var name in attrs) {\n var val = attrs[name];\n if (val == null) { continue }\n if (needsWrap && result.length == 1)\n { result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\")); }\n if (name == \"class\") { top.class = (top.class ? top.class + \" \" : \"\") + val; }\n else if (name == \"style\") { top.style = (top.style ? top.style + \";\" : \"\") + val; }\n else if (name != \"nodeName\") { top[name] = val; }\n }\n }\n\n return result\n}\n\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n // Shortcut for trivial case\n if (prevComputed == noDeco && curComputed == noDeco) { return nodeDOM }\n\n var curDOM = nodeDOM;\n for (var i = 0; i < curComputed.length; i++) {\n var deco = curComputed[i], prev = prevComputed[i];\n if (i) {\n var parent = (void 0);\n if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM &&\n (parent = curDOM.parentNode) && parent.tagName.toLowerCase() == deco.nodeName) {\n curDOM = parent;\n } else {\n parent = document.createElement(deco.nodeName);\n parent.pmIsDeco = true;\n parent.appendChild(curDOM);\n prev = noDeco[0];\n curDOM = parent;\n }\n }\n patchAttributes(curDOM, prev || noDeco[0], deco);\n }\n return curDOM\n}\n\nfunction patchAttributes(dom, prev, cur) {\n for (var name in prev)\n { if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n { dom.removeAttribute(name); } }\n for (var name$1 in cur)\n { if (name$1 != \"class\" && name$1 != \"style\" && name$1 != \"nodeName\" && cur[name$1] != prev[name$1])\n { dom.setAttribute(name$1, cur[name$1]); } }\n if (prev.class != cur.class) {\n var prevList = prev.class ? prev.class.split(\" \") : nothing;\n var curList = cur.class ? cur.class.split(\" \") : nothing;\n for (var i = 0; i < prevList.length; i++) { if (curList.indexOf(prevList[i]) == -1)\n { dom.classList.remove(prevList[i]); } }\n for (var i$1 = 0; i$1 < curList.length; i$1++) { if (prevList.indexOf(curList[i$1]) == -1)\n { dom.classList.add(curList[i$1]); } }\n }\n if (prev.style != cur.style) {\n if (prev.style) {\n var prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n while (m = prop.exec(prev.style))\n { dom.style.removeProperty(m[1]); }\n }\n if (cur.style)\n { dom.style.cssText += cur.style; }\n }\n}\n\nfunction applyOuterDeco(dom, deco, node) {\n return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1))\n}\n\n// : ([Decoration], [Decoration]) → bool\nfunction sameOuterDeco(a, b) {\n if (a.length != b.length) { return false }\n for (var i = 0; i < a.length; i++) { if (!a[i].type.eq(b[i].type)) { return false } }\n return true\n}\n\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n var next = dom.nextSibling;\n dom.parentNode.removeChild(dom);\n return next\n}\n\n// Helper class for incrementally updating a tree of mark descs and\n// the widget and node descs inside of them.\nvar ViewTreeUpdater = function ViewTreeUpdater(top, lockedNode) {\n this.top = top;\n this.lock = lockedNode;\n // Index into `this.top`'s child array, represents the current\n // update position.\n this.index = 0;\n // When entering a mark, the current top and index are pushed\n // onto this.\n this.stack = [];\n // Tracks whether anything was changed\n this.changed = false;\n\n var pre = preMatch(top.node.content, top.children);\n this.preMatched = pre.nodes;\n this.preMatchOffset = pre.offset;\n};\n\nViewTreeUpdater.prototype.getPreMatch = function getPreMatch (index) {\n return index >= this.preMatchOffset ? this.preMatched[index - this.preMatchOffset] : null\n};\n\n// Destroy and remove the children between the given indices in\n// `this.top`.\nViewTreeUpdater.prototype.destroyBetween = function destroyBetween (start, end) {\n if (start == end) { return }\n for (var i = start; i < end; i++) { this.top.children[i].destroy(); }\n this.top.children.splice(start, end - start);\n this.changed = true;\n};\n\n// Destroy all remaining children in `this.top`.\nViewTreeUpdater.prototype.destroyRest = function destroyRest () {\n this.destroyBetween(this.index, this.top.children.length);\n};\n\n// : ([Mark], EditorView)\n// Sync the current stack of mark descs with the given array of\n// marks, reusing existing mark descs when possible.\nViewTreeUpdater.prototype.syncToMarks = function syncToMarks (marks, inline, view) {\n var keep = 0, depth = this.stack.length >> 1;\n var maxKeep = Math.min(depth, marks.length);\n while (keep < maxKeep &&\n (keep == depth - 1 ? this.top : this.stack[(keep + 1) << 1]).matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n { keep++; }\n\n while (keep < depth) {\n this.destroyRest();\n this.top.dirty = NOT_DIRTY;\n this.index = this.stack.pop();\n this.top = this.stack.pop();\n depth--;\n }\n while (depth < marks.length) {\n this.stack.push(this.top, this.index + 1);\n var found = -1;\n for (var i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) {\n if (this.top.children[i].matchesMark(marks[depth])) { found = i; break }\n }\n if (found > -1) {\n if (found > this.index) {\n this.changed = true;\n this.destroyBetween(this.index, found);\n }\n this.top = this.top.children[this.index];\n } else {\n var markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n this.top.children.splice(this.index, 0, markDesc);\n this.top = markDesc;\n this.changed = true;\n }\n this.index = 0;\n depth++;\n }\n};\n\n// : (Node, [Decoration], DecorationSet) → bool\n// Try to find a node desc matching the given data. Skip over it and\n// return true when successful.\nViewTreeUpdater.prototype.findNodeMatch = function findNodeMatch (node, outerDeco, innerDeco, index) {\n var found = -1, preMatch = index < 0 ? undefined : this.getPreMatch(index), children = this.top.children;\n if (preMatch && preMatch.matchesNode(node, outerDeco, innerDeco)) {\n found = children.indexOf(preMatch);\n } else {\n for (var i = this.index, e = Math.min(children.length, i + 5); i < e; i++) {\n var child = children[i];\n if (child.matchesNode(node, outerDeco, innerDeco) && this.preMatched.indexOf(child) < 0) {\n found = i;\n break\n }\n }\n }\n if (found < 0) { return false }\n this.destroyBetween(this.index, found);\n this.index++;\n return true\n};\n\n// : (Node, [Decoration], DecorationSet, EditorView, Fragment, number) → bool\n// Try to update the next node, if any, to the given data. Checks\n// pre-matches to avoid overwriting nodes that could still be used.\nViewTreeUpdater.prototype.updateNextNode = function updateNextNode (node, outerDeco, innerDeco, view, index) {\n for (var i = this.index; i < this.top.children.length; i++) {\n var next = this.top.children[i];\n if (next instanceof NodeViewDesc) {\n var preMatch = this.preMatched.indexOf(next);\n if (preMatch > -1 && preMatch + this.preMatchOffset != index) { return false }\n var nextDOM = next.dom;\n\n // Can't update if nextDOM is or contains this.lock, except if\n // it's a text node whose content already matches the new text\n // and whose decorations match the new ones.\n var locked = this.lock && (nextDOM == this.lock || nextDOM.nodeType == 1 && nextDOM.contains(this.lock.parentNode)) &&\n !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text &&\n next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n this.destroyBetween(this.index, i);\n if (next.dom != nextDOM) { this.changed = true; }\n this.index++;\n return true\n }\n break\n }\n }\n return false\n};\n\n// : (Node, [Decoration], DecorationSet, EditorView)\n// Insert the node as a newly created node desc.\nViewTreeUpdater.prototype.addNode = function addNode (node, outerDeco, innerDeco, view, pos) {\n this.top.children.splice(this.index++, 0, NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos));\n this.changed = true;\n};\n\nViewTreeUpdater.prototype.placeWidget = function placeWidget (widget, view, pos) {\n var next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n if (next && next.matchesWidget(widget) && (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n this.index++;\n } else {\n var desc = new WidgetViewDesc(this.top, widget, view, pos);\n this.top.children.splice(this.index++, 0, desc);\n this.changed = true;\n }\n};\n\n// Make sure a textblock looks and behaves correctly in\n// contentEditable.\nViewTreeUpdater.prototype.addTextblockHacks = function addTextblockHacks () {\n var lastChild = this.top.children[this.index - 1];\n while (lastChild instanceof MarkViewDesc) { lastChild = lastChild.children[lastChild.children.length - 1]; }\n\n if (!lastChild || // Empty textblock\n !(lastChild instanceof TextViewDesc) ||\n /\\n$/.test(lastChild.node.text)) {\n if (this.index < this.top.children.length && this.top.children[this.index].matchesHack()) {\n this.index++;\n } else {\n var dom = document.createElement(\"br\");\n this.top.children.splice(this.index++, 0, new BRHackViewDesc(this.top, nothing, dom, null));\n this.changed = true;\n }\n }\n};\n\n// : (Fragment, [ViewDesc]) → [ViewDesc]\n// Iterate from the end of the fragment and array of descs to find\n// directly matching ones, in order to avoid overeagerly reusing\n// those for other nodes. Returns an array whose positions correspond\n// to node positions in the fragment, and whose elements are either\n// descs matched to the child at that index, or empty.\nfunction preMatch(frag, descs) {\n var result = [], end = frag.childCount;\n for (var i = descs.length - 1; end > 0 && i >= 0; i--) {\n var desc = descs[i], node = desc.node;\n if (!node) { continue }\n if (node != frag.child(end - 1)) { break }\n result.push(desc);\n --end;\n }\n return {nodes: result.reverse(), offset: end}\n}\n\nfunction compareSide(a, b) { return a.type.side - b.type.side }\n\n// : (ViewDesc, DecorationSet, (Decoration, number), (Node, [Decoration], DecorationSet, number))\n// This function abstracts iterating over the nodes and decorations in\n// a fragment. Calls `onNode` for each node, with its local and child\n// decorations. Splits text nodes when there is a decoration starting\n// or ending inside of them. Calls `onWidget` for each widget.\nfunction iterDeco(parent, deco, onWidget, onNode) {\n var locals = deco.locals(parent), offset = 0;\n // Simple, cheap variant for when there are no local decorations\n if (locals.length == 0) {\n for (var i = 0; i < parent.childCount; i++) {\n var child = parent.child(i);\n onNode(child, locals, deco.forChild(offset, child), i);\n offset += child.nodeSize;\n }\n return\n }\n\n var decoIndex = 0, active = [], restNode = null;\n for (var parentIndex = 0;;) {\n if (decoIndex < locals.length && locals[decoIndex].to == offset) {\n var widget = locals[decoIndex++], widgets = (void 0);\n while (decoIndex < locals.length && locals[decoIndex].to == offset)\n { (widgets || (widgets = [widget])).push(locals[decoIndex++]); }\n if (widgets) {\n widgets.sort(compareSide);\n for (var i$1 = 0; i$1 < widgets.length; i$1++) { onWidget(widgets[i$1], parentIndex, !!restNode); }\n } else {\n onWidget(widget, parentIndex, !!restNode);\n }\n }\n\n var child$1 = (void 0), index = (void 0);\n if (restNode) {\n index = -1;\n child$1 = restNode;\n restNode = null;\n } else if (parentIndex < parent.childCount) {\n index = parentIndex;\n child$1 = parent.child(parentIndex++);\n } else {\n break\n }\n\n for (var i$2 = 0; i$2 < active.length; i$2++) { if (active[i$2].to <= offset) { active.splice(i$2--, 1); } }\n while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n { active.push(locals[decoIndex++]); }\n\n var end = offset + child$1.nodeSize;\n if (child$1.isText) {\n var cutAt = end;\n if (decoIndex < locals.length && locals[decoIndex].from < cutAt) { cutAt = locals[decoIndex].from; }\n for (var i$3 = 0; i$3 < active.length; i$3++) { if (active[i$3].to < cutAt) { cutAt = active[i$3].to; } }\n if (cutAt < end) {\n restNode = child$1.cut(cutAt - offset);\n child$1 = child$1.cut(0, cutAt - offset);\n end = cutAt;\n index = -1;\n }\n }\n\n var outerDeco = !active.length ? nothing\n : child$1.isInline && !child$1.isLeaf ? active.filter(function (d) { return !d.inline; })\n : active.slice();\n onNode(child$1, outerDeco, deco.forChild(offset, child$1), index);\n offset = end;\n }\n}\n\n// List markers in Mobile Safari will mysteriously disappear\n// sometimes. This works around that.\nfunction iosHacks(dom) {\n if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n var oldCSS = dom.style.cssText;\n dom.style.cssText = oldCSS + \"; list-style: square !important\";\n window.getComputedStyle(dom).listStyle;\n dom.style.cssText = oldCSS;\n }\n}\n\nfunction nearbyTextNode(node, offset) {\n for (;;) {\n if (node.nodeType == 3) { return node }\n if (node.nodeType == 1 && offset > 0) {\n if (node.childNodes.length > offset && node.childNodes[offset].nodeType == 3)\n { return node.childNodes[offset] }\n node = node.childNodes[offset - 1];\n offset = nodeSize(node);\n } else if (node.nodeType == 1 && offset < node.childNodes.length) {\n node = node.childNodes[offset];\n offset = 0;\n } else {\n return null\n }\n }\n}\n\n// Find a piece of text in an inline fragment, overlapping from-to\nfunction findTextInFragment(frag, text, from, to) {\n for (var i = 0, pos = 0; i < frag.childCount && pos <= to;) {\n var child = frag.child(i++), childStart = pos;\n pos += child.nodeSize;\n if (!child.isText) { continue }\n var str = child.text;\n while (i < frag.childCount) {\n var next = frag.child(i++);\n pos += next.nodeSize;\n if (!next.isText) { break }\n str += next.text;\n }\n if (pos >= from) {\n var found = str.lastIndexOf(text, to - childStart);\n if (found >= 0 && found + text.length + childStart >= from)\n { return childStart + found }\n }\n }\n return -1\n}\n\n// Replace range from-to in an array of view descs with replacement\n// (may be null to just delete). This goes very much against the grain\n// of the rest of this code, which tends to create nodes with the\n// right shape in one go, rather than messing with them after\n// creation, but is necessary in the composition hack.\nfunction replaceNodes(nodes, from, to, view, replacement) {\n var result = [];\n for (var i = 0, off = 0; i < nodes.length; i++) {\n var child = nodes[i], start = off, end = off += child.size;\n if (start >= to || end <= from) {\n result.push(child);\n } else {\n if (start < from) { result.push(child.slice(0, from - start, view)); }\n if (replacement) {\n result.push(replacement);\n replacement = null;\n }\n if (end > to) { result.push(child.slice(to - start, child.size, view)); }\n }\n }\n return result\n}\n\nfunction selectionFromDOM(view, origin) {\n var domSel = view.root.getSelection(), doc = view.state.doc;\n if (!domSel.focusNode) { return null }\n var nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n var head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset);\n if (head < 0) { return null }\n var $head = doc.resolve(head), $anchor, selection;\n if (selectionCollapsed(domSel)) {\n $anchor = $head;\n while (nearestDesc && !nearestDesc.node) { nearestDesc = nearestDesc.parent; }\n if (nearestDesc && nearestDesc.node.isAtom && NodeSelection.isSelectable(nearestDesc.node) && nearestDesc.parent\n && !(nearestDesc.node.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n var pos = nearestDesc.posBefore;\n selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));\n }\n } else {\n var anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset);\n if (anchor < 0) { return null }\n $anchor = doc.resolve(anchor);\n }\n\n if (!selection) {\n var bias = origin == \"pointer\" || (view.state.selection.head < $head.pos && !inWidget) ? 1 : -1;\n selection = selectionBetween(view, $anchor, $head, bias);\n }\n return selection\n}\n\nfunction selectionToDOM(view, force) {\n var sel = view.state.selection;\n syncNodeSelection(view, sel);\n\n if (view.editable ? !view.hasFocus() :\n !(hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom))) { return }\n\n view.domObserver.disconnectSelection();\n\n if (view.cursorWrapper) {\n selectCursorWrapper(view);\n } else {\n var anchor = sel.anchor;\n var head = sel.head;\n var resetEditableFrom, resetEditableTo;\n if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n if (!sel.$from.parent.inlineContent)\n { resetEditableFrom = temporarilyEditableNear(view, sel.from); }\n if (!sel.empty && !sel.$from.parent.inlineContent)\n { resetEditableTo = temporarilyEditableNear(view, sel.to); }\n }\n view.docView.setSelection(anchor, head, view.root, force);\n if (brokenSelectBetweenUneditable) {\n if (resetEditableFrom) { resetEditable(resetEditableFrom); }\n if (resetEditableTo) { resetEditable(resetEditableTo); }\n }\n if (sel.visible) {\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n } else {\n view.dom.classList.add(\"ProseMirror-hideselection\");\n if (\"onselectionchange\" in document) { removeClassOnSelectionChange(view); }\n }\n }\n\n view.domObserver.setCurSelection();\n view.domObserver.connectSelection();\n}\n\n// Kludge to work around Webkit not allowing a selection to start/end\n// between non-editable block nodes. We briefly make something\n// editable, set the selection, then set it uneditable again.\n\nvar brokenSelectBetweenUneditable = result.safari || result.chrome && result.chrome_version < 63;\n\nfunction temporarilyEditableNear(view, pos) {\n var ref = view.docView.domFromPos(pos, 0);\n var node = ref.node;\n var offset = ref.offset;\n var after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n var before = offset ? node.childNodes[offset - 1] : null;\n if (result.safari && after && after.contentEditable == \"false\") { return setEditable(after) }\n if ((!after || after.contentEditable == \"false\") && (!before || before.contentEditable == \"false\")) {\n if (after) { return setEditable(after) }\n else if (before) { return setEditable(before) }\n }\n}\n\nfunction setEditable(element) {\n element.contentEditable = \"true\";\n if (result.safari && element.draggable) { element.draggable = false; element.wasDraggable = true; }\n return element\n}\n\nfunction resetEditable(element) {\n element.contentEditable = \"false\";\n if (element.wasDraggable) { element.draggable = true; element.wasDraggable = null; }\n}\n\nfunction removeClassOnSelectionChange(view) {\n var doc = view.dom.ownerDocument;\n doc.removeEventListener(\"selectionchange\", view.hideSelectionGuard);\n var domSel = view.root.getSelection();\n var node = domSel.anchorNode, offset = domSel.anchorOffset;\n doc.addEventListener(\"selectionchange\", view.hideSelectionGuard = function () {\n if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n doc.removeEventListener(\"selectionchange\", view.hideSelectionGuard);\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n }\n });\n}\n\nfunction selectCursorWrapper(view) {\n var domSel = view.root.getSelection(), range = document.createRange();\n var node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n if (img) { range.setEnd(node.parentNode, domIndex(node) + 1); }\n else { range.setEnd(node, 0); }\n range.collapse(false);\n domSel.removeAllRanges();\n domSel.addRange(range);\n // Kludge to kill 'control selection' in IE11 when selecting an\n // invisible cursor wrapper, since that would result in those weird\n // resize handles and a selection that considers the absolutely\n // positioned wrapper, rather than the root editable node, the\n // focused element.\n if (!img && !view.state.selection.visible && result.ie && result.ie_version <= 11) {\n node.disabled = true;\n node.disabled = false;\n }\n}\n\nfunction syncNodeSelection(view, sel) {\n if (sel instanceof NodeSelection) {\n var desc = view.docView.descAt(sel.from);\n if (desc != view.lastSelectedViewDesc) {\n clearNodeSelection(view);\n if (desc) { desc.selectNode(); }\n view.lastSelectedViewDesc = desc;\n }\n } else {\n clearNodeSelection(view);\n }\n}\n\n// Clear all DOM statefulness of the last node selection.\nfunction clearNodeSelection(view) {\n if (view.lastSelectedViewDesc) {\n if (view.lastSelectedViewDesc.parent)\n { view.lastSelectedViewDesc.deselectNode(); }\n view.lastSelectedViewDesc = null;\n }\n}\n\nfunction selectionBetween(view, $anchor, $head, bias) {\n return view.someProp(\"createSelectionBetween\", function (f) { return f(view, $anchor, $head); })\n || TextSelection.between($anchor, $head, bias)\n}\n\nfunction hasFocusAndSelection(view) {\n if (view.editable && view.root.activeElement != view.dom) { return false }\n return hasSelection(view)\n}\n\nfunction hasSelection(view) {\n var sel = view.root.getSelection();\n if (!sel.anchorNode) { return false }\n try {\n // Firefox will raise 'permission denied' errors when accessing\n // properties of `sel.anchorNode` when it's in a generated CSS\n // element.\n return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&\n (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode))\n } catch(_) {\n return false\n }\n}\n\nfunction anchorInRightPlace(view) {\n var anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n var domSel = view.root.getSelection();\n return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset)\n}\n\nfunction moveSelectionBlock(state, dir) {\n var ref = state.selection;\n var $anchor = ref.$anchor;\n var $head = ref.$head;\n var $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n var $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n return $start && Selection.findFrom($start, dir)\n}\n\nfunction apply(view, sel) {\n view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n return true\n}\n\nfunction selectHorizontally(view, dir, mods) {\n var sel = view.state.selection;\n if (sel instanceof TextSelection) {\n if (!sel.empty || mods.indexOf(\"s\") > -1) {\n return false\n } else if (view.endOfTextblock(dir > 0 ? \"right\" : \"left\")) {\n var next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection)) { return apply(view, next) }\n return false\n } else if (!(result.mac && mods.indexOf(\"m\") > -1)) {\n var $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n if (!node || node.isText) { return false }\n var nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM)) { return false }\n if (NodeSelection.isSelectable(node)) {\n return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head))\n } else if (result.webkit) {\n // Chrome and Safari will introduce extra pointless cursor\n // positions around inline uneditable nodes, so we have to\n // take over and move the cursor past them (#937)\n return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)))\n } else {\n return false\n }\n }\n } else if (sel instanceof NodeSelection && sel.node.isInline) {\n return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from))\n } else {\n var next$1 = moveSelectionBlock(view.state, dir);\n if (next$1) { return apply(view, next$1) }\n return false\n }\n}\n\nfunction nodeLen(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length\n}\n\nfunction isIgnorable(dom) {\n var desc = dom.pmViewDesc;\n return desc && desc.size == 0 && (dom.nextSibling || dom.nodeName != \"BR\")\n}\n\n// Make sure the cursor isn't directly after one or more ignored\n// nodes, which will confuse the browser's cursor motion logic.\nfunction skipIgnoredNodesLeft(view) {\n var sel = view.root.getSelection();\n var node = sel.focusNode, offset = sel.focusOffset;\n if (!node) { return }\n var moveNode, moveOffset, force = false;\n // Gecko will do odd things when the selection is directly in front\n // of a non-editable node, so in that case, move it into the next\n // node if possible. Issue prosemirror/prosemirror#832.\n if (result.gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset])) { force = true; }\n for (;;) {\n if (offset > 0) {\n if (node.nodeType != 1) {\n break\n } else {\n var before = node.childNodes[offset - 1];\n if (isIgnorable(before)) {\n moveNode = node;\n moveOffset = --offset;\n } else if (before.nodeType == 3) {\n node = before;\n offset = node.nodeValue.length;\n } else { break }\n }\n } else if (isBlockNode(node)) {\n break\n } else {\n var prev = node.previousSibling;\n while (prev && isIgnorable(prev)) {\n moveNode = node.parentNode;\n moveOffset = domIndex(prev);\n prev = prev.previousSibling;\n }\n if (!prev) {\n node = node.parentNode;\n if (node == view.dom) { break }\n offset = 0;\n } else {\n node = prev;\n offset = nodeLen(node);\n }\n }\n }\n if (force) { setSelFocus(view, sel, node, offset); }\n else if (moveNode) { setSelFocus(view, sel, moveNode, moveOffset); }\n}\n\n// Make sure the cursor isn't directly before one or more ignored\n// nodes.\nfunction skipIgnoredNodesRight(view) {\n var sel = view.root.getSelection();\n var node = sel.focusNode, offset = sel.focusOffset;\n if (!node) { return }\n var len = nodeLen(node);\n var moveNode, moveOffset;\n for (;;) {\n if (offset < len) {\n if (node.nodeType != 1) { break }\n var after = node.childNodes[offset];\n if (isIgnorable(after)) {\n moveNode = node;\n moveOffset = ++offset;\n }\n else { break }\n } else if (isBlockNode(node)) {\n break\n } else {\n var next = node.nextSibling;\n while (next && isIgnorable(next)) {\n moveNode = next.parentNode;\n moveOffset = domIndex(next) + 1;\n next = next.nextSibling;\n }\n if (!next) {\n node = node.parentNode;\n if (node == view.dom) { break }\n offset = len = 0;\n } else {\n node = next;\n offset = 0;\n len = nodeLen(node);\n }\n }\n }\n if (moveNode) { setSelFocus(view, sel, moveNode, moveOffset); }\n}\n\nfunction isBlockNode(dom) {\n var desc = dom.pmViewDesc;\n return desc && desc.node && desc.node.isBlock\n}\n\nfunction setSelFocus(view, sel, node, offset) {\n if (selectionCollapsed(sel)) {\n var range = document.createRange();\n range.setEnd(node, offset);\n range.setStart(node, offset);\n sel.removeAllRanges();\n sel.addRange(range);\n } else if (sel.extend) {\n sel.extend(node, offset);\n }\n view.domObserver.setCurSelection();\n var state = view.state;\n // If no state update ends up happening, reset the selection.\n setTimeout(function () {\n if (view.state == state) { selectionToDOM(view); }\n }, 50);\n}\n\n// : (EditorState, number)\n// Check whether vertical selection motion would involve node\n// selections. If so, apply it (if not, the result is left to the\n// browser)\nfunction selectVertically(view, dir, mods) {\n var sel = view.state.selection;\n if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1) { return false }\n if (result.mac && mods.indexOf(\"m\") > -1) { return false }\n var $from = sel.$from;\n var $to = sel.$to;\n\n if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n var next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection))\n { return apply(view, next) }\n }\n if (!$from.parent.inlineContent) {\n var beyond = Selection.findFrom(dir < 0 ? $from : $to, dir);\n return beyond ? apply(view, beyond) : true\n }\n return false\n}\n\nfunction stopNativeHorizontalDelete(view, dir) {\n if (!(view.state.selection instanceof TextSelection)) { return true }\n var ref = view.state.selection;\n var $head = ref.$head;\n var $anchor = ref.$anchor;\n var empty = ref.empty;\n if (!$head.sameParent($anchor)) { return true }\n if (!empty) { return false }\n if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\")) { return true }\n var nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n if (nextNode && !nextNode.isText) {\n var tr = view.state.tr;\n if (dir < 0) { tr.delete($head.pos - nextNode.nodeSize, $head.pos); }\n else { tr.delete($head.pos, $head.pos + nextNode.nodeSize); }\n view.dispatch(tr);\n return true\n }\n return false\n}\n\nfunction switchEditable(view, node, state) {\n view.domObserver.stop();\n node.contentEditable = state;\n view.domObserver.start();\n}\n\n// Issue #867 / #1090 / https://bugs.chromium.org/p/chromium/issues/detail?id=903821\n// In which Safari (and at some point in the past, Chrome) does really\n// wrong things when the down arrow is pressed when the cursor is\n// directly at the start of a textblock and has an uneditable node\n// after it\nfunction safariDownArrowBug(view) {\n if (!result.safari || view.state.selection.$head.parentOffset > 0) { return }\n var ref = view.root.getSelection();\n var focusNode = ref.focusNode;\n var focusOffset = ref.focusOffset;\n if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&\n focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n var child = focusNode.firstChild;\n switchEditable(view, child, true);\n setTimeout(function () { return switchEditable(view, child, false); }, 20);\n }\n}\n\n// A backdrop key mapping used to make sure we always suppress keys\n// that have a dangerous default effect, even if the commands they are\n// bound to return false, and to make sure that cursor-motion keys\n// find a cursor (as opposed to a node selection) when pressed. For\n// cursor-motion keys, the code in the handlers also takes care of\n// block selections.\n\nfunction getMods(event) {\n var result = \"\";\n if (event.ctrlKey) { result += \"c\"; }\n if (event.metaKey) { result += \"m\"; }\n if (event.altKey) { result += \"a\"; }\n if (event.shiftKey) { result += \"s\"; }\n return result\n}\n\nfunction captureKeyDown(view, event) {\n var code = event.keyCode, mods = getMods(event);\n if (code == 8 || (result.mac && code == 72 && mods == \"c\")) { // Backspace, Ctrl-h on Mac\n return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodesLeft(view)\n } else if (code == 46 || (result.mac && code == 68 && mods == \"c\")) { // Delete, Ctrl-d on Mac\n return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodesRight(view)\n } else if (code == 13 || code == 27) { // Enter, Esc\n return true\n } else if (code == 37) { // Left arrow\n return selectHorizontally(view, -1, mods) || skipIgnoredNodesLeft(view)\n } else if (code == 39) { // Right arrow\n return selectHorizontally(view, 1, mods) || skipIgnoredNodesRight(view)\n } else if (code == 38) { // Up arrow\n return selectVertically(view, -1, mods) || skipIgnoredNodesLeft(view)\n } else if (code == 40) { // Down arrow\n return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodesRight(view)\n } else if (mods == (result.mac ? \"m\" : \"c\") &&\n (code == 66 || code == 73 || code == 89 || code == 90)) { // Mod-[biyz]\n return true\n }\n return false\n}\n\n// Note that all referencing and parsing is done with the\n// start-of-operation selection and document, since that's the one\n// that the DOM represents. If any changes came in in the meantime,\n// the modification is mapped over those before it is applied, in\n// readDOMChange.\n\nfunction parseBetween(view, from_, to_) {\n var ref = view.docView.parseRange(from_, to_);\n var parent = ref.node;\n var fromOffset = ref.fromOffset;\n var toOffset = ref.toOffset;\n var from = ref.from;\n var to = ref.to;\n\n var domSel = view.root.getSelection(), find = null, anchor = domSel.anchorNode;\n if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {\n find = [{node: anchor, offset: domSel.anchorOffset}];\n if (!selectionCollapsed(domSel))\n { find.push({node: domSel.focusNode, offset: domSel.focusOffset}); }\n }\n // Work around issue in Chrome where backspacing sometimes replaces\n // the deleted content with a random BR node (issues #799, #831)\n if (result.chrome && view.lastKeyCode === 8) {\n for (var off = toOffset; off > fromOffset; off--) {\n var node = parent.childNodes[off - 1], desc = node.pmViewDesc;\n if (node.nodeType == \"BR\" && !desc) { toOffset = off; break }\n if (!desc || desc.size) { break }\n }\n }\n var startDoc = view.state.doc;\n var parser = view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n var $from = startDoc.resolve(from);\n\n var sel = null, doc = parser.parse(parent, {\n topNode: $from.parent,\n topMatch: $from.parent.contentMatchAt($from.index()),\n topOpen: true,\n from: fromOffset,\n to: toOffset,\n preserveWhitespace: $from.parent.type.spec.code ? \"full\" : true,\n editableContent: true,\n findPositions: find,\n ruleFromNode: ruleFromNode,\n context: $from\n });\n if (find && find[0].pos != null) {\n var anchor$1 = find[0].pos, head = find[1] && find[1].pos;\n if (head == null) { head = anchor$1; }\n sel = {anchor: anchor$1 + from, head: head + from};\n }\n return {doc: doc, sel: sel, from: from, to: to}\n}\n\nfunction ruleFromNode(dom) {\n var desc = dom.pmViewDesc;\n if (desc) {\n return desc.parseRule()\n } else if (dom.nodeName == \"BR\" && dom.parentNode) {\n // Safari replaces the list item or table cell with a BR\n // directly in the list node (?!) if you delete the last\n // character in a list item or table cell (#708, #862)\n if (result.safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) {\n var skip = document.createElement(\"div\");\n skip.appendChild(document.createElement(\"li\"));\n return {skip: skip}\n } else if (dom.parentNode.lastChild == dom || result.safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) {\n return {ignore: true}\n }\n } else if (dom.nodeName == \"IMG\" && dom.getAttribute(\"mark-placeholder\")) {\n return {ignore: true}\n }\n}\n\nfunction readDOMChange(view, from, to, typeOver, addedNodes) {\n if (from < 0) {\n var origin = view.lastSelectionTime > Date.now() - 50 ? view.lastSelectionOrigin : null;\n var newSel = selectionFromDOM(view, origin);\n if (newSel && !view.state.selection.eq(newSel)) {\n var tr$1 = view.state.tr.setSelection(newSel);\n if (origin == \"pointer\") { tr$1.setMeta(\"pointer\", true); }\n else if (origin == \"key\") { tr$1.scrollIntoView(); }\n view.dispatch(tr$1);\n }\n return\n }\n\n var $before = view.state.doc.resolve(from);\n var shared = $before.sharedDepth(to);\n from = $before.before(shared + 1);\n to = view.state.doc.resolve(to).after(shared + 1);\n\n var sel = view.state.selection;\n var parse = parseBetween(view, from, to);\n // Chrome sometimes leaves the cursor before the inserted text when\n // composing after a cursor wrapper. This moves it forward.\n if (result.chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from) {\n var text = view.cursorWrapper.deco.type.toDOM.nextSibling;\n var size = text && text.nodeValue ? text.nodeValue.length : 1;\n parse.sel = {anchor: parse.sel.anchor + size, head: parse.sel.anchor + size};\n }\n\n var doc = view.state.doc, compare = doc.slice(parse.from, parse.to);\n var preferredPos, preferredSide;\n // Prefer anchoring to end when Backspace is pressed\n if (view.lastKeyCode === 8 && Date.now() - 100 < view.lastKeyCodeTime) {\n preferredPos = view.state.selection.to;\n preferredSide = \"end\";\n } else {\n preferredPos = view.state.selection.from;\n preferredSide = \"start\";\n }\n view.lastKeyCode = null;\n\n var change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);\n if (!change) {\n if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) &&\n !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) {\n change = {start: sel.from, endA: sel.to, endB: sel.to};\n } else if (result.ios && view.lastIOSEnter > Date.now() - 225 &&\n addedNodes.some(function (n) { return n.nodeName == \"DIV\" || n.nodeName == \"P\"; }) &&\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); })) {\n view.lastIOSEnter = 0;\n return\n } else {\n if (parse.sel) {\n var sel$1 = resolveSelection(view, view.state.doc, parse.sel);\n if (sel$1 && !sel$1.eq(view.state.selection)) { view.dispatch(view.state.tr.setSelection(sel$1)); }\n }\n return\n }\n }\n view.domChangeCount++;\n // Handle the case where overwriting a selection by typing matches\n // the start or end of the selected content, creating a change\n // that's smaller than what was actually overwritten.\n if (view.state.selection.from < view.state.selection.to &&\n change.start == change.endB &&\n view.state.selection instanceof TextSelection) {\n if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2) {\n change.start = view.state.selection.from;\n } else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2) {\n change.endB += (view.state.selection.to - change.endA);\n change.endA = view.state.selection.to;\n }\n }\n\n // IE11 will insert a non-breaking space _ahead_ of the space after\n // the cursor space when adding a space before another space. When\n // that happened, adjust the change to cover the space instead.\n if (result.ie && result.ie_version <= 11 && change.endB == change.start + 1 &&\n change.endA == change.start && change.start > parse.from &&\n parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == \" \\u00a0\") {\n change.start--;\n change.endA--;\n change.endB--;\n }\n\n var $from = parse.doc.resolveNoCache(change.start - parse.from);\n var $to = parse.doc.resolveNoCache(change.endB - parse.from);\n var inlineChange = $from.sameParent($to) && $from.parent.inlineContent;\n var nextSel;\n // If this looks like the effect of pressing Enter (or was recorded\n // as being an iOS enter press), just dispatch an Enter key instead.\n if (((result.ios && view.lastIOSEnter > Date.now() - 225 &&\n (!inlineChange || addedNodes.some(function (n) { return n.nodeName == \"DIV\" || n.nodeName == \"P\"; }))) ||\n (!inlineChange && $from.pos < parse.doc.content.size &&\n (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&\n nextSel.head == $to.pos)) &&\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); })) {\n view.lastIOSEnter = 0;\n return\n }\n // Same for backspace\n if (view.state.selection.anchor > change.start &&\n looksLikeJoin(doc, change.start, change.endA, $from, $to) &&\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(8, \"Backspace\")); })) {\n if (result.android && result.chrome) { view.domObserver.suppressSelectionUpdates(); } // #820\n return\n }\n\n // This tries to detect Android virtual keyboard\n // enter-and-pick-suggestion action. That sometimes (see issue\n // #1059) first fires a DOM mutation, before moving the selection to\n // the newly created block. And then, because ProseMirror cleans up\n // the DOM selection, it gives up moving the selection entirely,\n // leaving the cursor in the wrong place. When that happens, we drop\n // the new paragraph from the initial change, and fire a simulated\n // enter key afterwards.\n if (result.android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth &&\n parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) {\n change.endB -= 2;\n $to = parse.doc.resolveNoCache(change.endB - parse.from);\n setTimeout(function () {\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n }, 20);\n }\n\n var chFrom = change.start, chTo = change.endA;\n\n var tr, storedMarks, markChange, $from1;\n if (inlineChange) {\n if ($from.pos == $to.pos) { // Deletion\n // IE11 sometimes weirdly moves the DOM selection around after\n // backspacing out the first element in a textblock\n if (result.ie && result.ie_version <= 11 && $from.parentOffset == 0) {\n view.domObserver.suppressSelectionUpdates();\n setTimeout(function () { return selectionToDOM(view); }, 20);\n }\n tr = view.state.tr.delete(chFrom, chTo);\n storedMarks = doc.resolve(change.start).marksAcross(doc.resolve(change.endA));\n } else if ( // Adding or removing a mark\n change.endA == change.endB && ($from1 = doc.resolve(change.start)) &&\n (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset),\n $from1.parent.content.cut($from1.parentOffset, change.endA - $from1.start())))\n ) {\n tr = view.state.tr;\n if (markChange.type == \"add\") { tr.addMark(chFrom, chTo, markChange.mark); }\n else { tr.removeMark(chFrom, chTo, markChange.mark); }\n } else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {\n // Both positions in the same text node -- simply insert text\n var text$1 = $from.parent.textBetween($from.parentOffset, $to.parentOffset);\n if (view.someProp(\"handleTextInput\", function (f) { return f(view, chFrom, chTo, text$1); })) { return }\n tr = view.state.tr.insertText(text$1, chFrom, chTo);\n }\n }\n\n if (!tr)\n { tr = view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from)); }\n if (parse.sel) {\n var sel$2 = resolveSelection(view, tr.doc, parse.sel);\n // Chrome Android will sometimes, during composition, report the\n // selection in the wrong place. If it looks like that is\n // happening, don't update the selection.\n // Edge just doesn't move the cursor forward when you start typing\n // in an empty block or between br nodes.\n if (sel$2 && !(result.chrome && result.android && view.composing && sel$2.empty &&\n (sel$2.head == chFrom || sel$2.head == tr.mapping.map(chTo) - 1) ||\n result.ie && sel$2.empty && sel$2.head == chFrom))\n { tr.setSelection(sel$2); }\n }\n if (storedMarks) { tr.ensureMarks(storedMarks); }\n view.dispatch(tr.scrollIntoView());\n}\n\nfunction resolveSelection(view, doc, parsedSel) {\n if (Math.max(parsedSel.anchor, parsedSel.head) > doc.content.size) { return null }\n return selectionBetween(view, doc.resolve(parsedSel.anchor), doc.resolve(parsedSel.head))\n}\n\n// : (Fragment, Fragment) → ?{mark: Mark, type: string}\n// Given two same-length, non-empty fragments of inline content,\n// determine whether the first could be created from the second by\n// removing or adding a single mark type.\nfunction isMarkChange(cur, prev) {\n var curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks;\n var added = curMarks, removed = prevMarks, type, mark, update;\n for (var i = 0; i < prevMarks.length; i++) { added = prevMarks[i].removeFromSet(added); }\n for (var i$1 = 0; i$1 < curMarks.length; i$1++) { removed = curMarks[i$1].removeFromSet(removed); }\n if (added.length == 1 && removed.length == 0) {\n mark = added[0];\n type = \"add\";\n update = function (node) { return node.mark(mark.addToSet(node.marks)); };\n } else if (added.length == 0 && removed.length == 1) {\n mark = removed[0];\n type = \"remove\";\n update = function (node) { return node.mark(mark.removeFromSet(node.marks)); };\n } else {\n return null\n }\n var updated = [];\n for (var i$2 = 0; i$2 < prev.childCount; i$2++) { updated.push(update(prev.child(i$2))); }\n if (Fragment.from(updated).eq(cur)) { return {mark: mark, type: type} }\n}\n\nfunction looksLikeJoin(old, start, end, $newStart, $newEnd) {\n if (!$newStart.parent.isTextblock ||\n // The content must have shrunk\n end - start <= $newEnd.pos - $newStart.pos ||\n // newEnd must point directly at or after the end of the block that newStart points into\n skipClosingAndOpening($newStart, true, false) < $newEnd.pos)\n { return false }\n\n var $start = old.resolve(start);\n // Start must be at the end of a block\n if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock)\n { return false }\n var $next = old.resolve(skipClosingAndOpening($start, true, true));\n // The next textblock must start before end and end near it\n if (!$next.parent.isTextblock || $next.pos > end ||\n skipClosingAndOpening($next, true, false) < end)\n { return false }\n\n // The fragments after the join point must match\n return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content)\n}\n\nfunction skipClosingAndOpening($pos, fromEnd, mayOpen) {\n var depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;\n while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {\n depth--;\n end++;\n fromEnd = false;\n }\n if (mayOpen) {\n var next = $pos.node(depth).maybeChild($pos.indexAfter(depth));\n while (next && !next.isLeaf) {\n next = next.firstChild;\n end++;\n }\n }\n return end\n}\n\nfunction findDiff(a, b, pos, preferredPos, preferredSide) {\n var start = a.findDiffStart(b, pos);\n if (start == null) { return null }\n var ref = a.findDiffEnd(b, pos + a.size, pos + b.size);\n var endA = ref.a;\n var endB = ref.b;\n if (preferredSide == \"end\") {\n var adjust = Math.max(0, start - Math.min(endA, endB));\n preferredPos -= endA + adjust - start;\n }\n if (endA < start && a.size < b.size) {\n var move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;\n start -= move;\n endB = start + (endB - endA);\n endA = start;\n } else if (endB < start) {\n var move$1 = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;\n start -= move$1;\n endA = start + (endA - endB);\n endB = start;\n }\n return {start: start, endA: endA, endB: endB}\n}\n\nfunction serializeForClipboard(view, slice) {\n var context = [];\n var content = slice.content;\n var openStart = slice.openStart;\n var openEnd = slice.openEnd;\n while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n openStart--;\n openEnd--;\n var node = content.firstChild;\n context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n content = node.content;\n }\n\n var serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n var doc = detachedDoc(), wrap = doc.createElement(\"div\");\n wrap.appendChild(serializer.serializeFragment(content, {document: doc}));\n\n var firstChild = wrap.firstChild, needsWrap;\n while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n for (var i = needsWrap.length - 1; i >= 0; i--) {\n var wrapper = doc.createElement(needsWrap[i]);\n while (wrap.firstChild) { wrapper.appendChild(wrap.firstChild); }\n wrap.appendChild(wrapper);\n }\n firstChild = wrap.firstChild;\n }\n\n if (firstChild && firstChild.nodeType == 1)\n { firstChild.setAttribute(\"data-pm-slice\", (openStart + \" \" + openEnd + \" \" + (JSON.stringify(context)))); }\n\n var text = view.someProp(\"clipboardTextSerializer\", function (f) { return f(slice); }) ||\n slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n\n return {dom: wrap, text: text}\n}\n\n// : (EditorView, string, string, ?bool, ResolvedPos) → ?Slice\n// Read a slice of content from the clipboard (or drop data).\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n var dom, inCode = $context.parent.type.spec.code, slice;\n if (!html && !text) { return null }\n var asText = text && (plainText || inCode || !html);\n if (asText) {\n view.someProp(\"transformPastedText\", function (f) { text = f(text, inCode || plainText); });\n if (inCode) { return new Slice(Fragment.from(view.state.schema.text(text)), 0, 0) }\n var parsed = view.someProp(\"clipboardTextParser\", function (f) { return f(text, $context, plainText); });\n if (parsed) {\n slice = parsed;\n } else {\n dom = document.createElement(\"div\");\n text.trim().split(/(?:\\r\\n?|\\n)+/).forEach(function (block) {\n dom.appendChild(document.createElement(\"p\")).textContent = block;\n });\n }\n } else {\n view.someProp(\"transformPastedHTML\", function (f) { html = f(html); });\n dom = readHTML(html);\n }\n\n var contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n var sliceData = contextNode && /^(\\d+) (\\d+) (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\"));\n if (!slice) {\n var parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n slice = parser.parseSlice(dom, {preserveWhitespace: !!(asText || sliceData), context: $context});\n }\n if (sliceData)\n { slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[3]); }\n else // HTML wasn't created by ProseMirror. Make sure top-level siblings are coherent\n { slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), false); }\n\n view.someProp(\"transformPasted\", function (f) { slice = f(slice); });\n return slice\n}\n\n// Takes a slice parsed with parseSlice, which means there hasn't been\n// any content-expression checking done on the top nodes, tries to\n// find a parent node in the current context that might fit the nodes,\n// and if successful, rebuilds the slice so that it fits into that parent.\n//\n// This addresses the problem that Transform.replace expects a\n// coherent slice, and will fail to place a set of siblings that don't\n// fit anywhere in the schema.\nfunction normalizeSiblings(fragment, $context) {\n if (fragment.childCount < 2) { return fragment }\n var loop = function ( d ) {\n var parent = $context.node(d);\n var match = parent.contentMatchAt($context.index(d));\n var lastWrap = (void 0), result = [];\n fragment.forEach(function (node) {\n if (!result) { return }\n var wrap = match.findWrapping(node.type), inLast;\n if (!wrap) { return result = null }\n if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n result[result.length - 1] = inLast;\n } else {\n if (result.length) { result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length); }\n var wrapped = withWrappers(node, wrap);\n result.push(wrapped);\n match = match.matchType(wrapped.type, wrapped.attrs);\n lastWrap = wrap;\n }\n });\n if (result) { return { v: Fragment.from(result) } }\n };\n\n for (var d = $context.depth; d >= 0; d--) {\n var returned = loop( d );\n\n if ( returned ) return returned.v;\n }\n return fragment\n}\n\nfunction withWrappers(node, wrap, from) {\n if ( from === void 0 ) from = 0;\n\n for (var i = wrap.length - 1; i >= from; i--)\n { node = wrap[i].create(null, Fragment.from(node)); }\n return node\n}\n\n// Used to group adjacent nodes wrapped in similar parents by\n// normalizeSiblings into the same parent node\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n var inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n if (inner) { return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner)) }\n var match = sibling.contentMatchAt(sibling.childCount);\n if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n { return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1)))) }\n }\n}\n\nfunction closeRight(node, depth) {\n if (depth == 0) { return node }\n var fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n var fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n return node.copy(fragment.append(fill))\n}\n\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n var node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n if (depth < to - 1) { inner = closeRange(inner, side, from, to, depth + 1, openEnd); }\n if (depth >= from)\n { inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, fragment.childCount > 1 || openEnd <= depth).append(inner)\n : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true)); }\n return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner))\n}\n\nfunction closeSlice(slice, openStart, openEnd) {\n if (openStart < slice.openStart)\n { slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd); }\n if (openEnd < slice.openEnd)\n { slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd); }\n return slice\n}\n\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"..\"` the table cells are ignored.\nvar wrapMap = {\n thead: [\"table\"],\n tbody: [\"table\"],\n tfoot: [\"table\"],\n caption: [\"table\"],\n colgroup: [\"table\"],\n col: [\"table\", \"colgroup\"],\n tr: [\"table\", \"tbody\"],\n td: [\"table\", \"tbody\", \"tr\"],\n th: [\"table\", \"tbody\", \"tr\"]\n};\n\nvar _detachedDoc = null;\nfunction detachedDoc() {\n return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"))\n}\n\nfunction readHTML(html) {\n var metas = /(\\s*]*>)*/.exec(html);\n if (metas) { html = html.slice(metas[0].length); }\n var elt = detachedDoc().createElement(\"div\");\n var firstTag = /(?:]*>)*<([a-z][^>\\s]+)/i.exec(html), wrap, depth = 0;\n if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()]) {\n html = wrap.map(function (n) { return \"<\" + n + \">\"; }).join(\"\") + html + wrap.map(function (n) { return \"\"; }).reverse().join(\"\");\n depth = wrap.length;\n }\n elt.innerHTML = html;\n for (var i = 0; i < depth; i++) { elt = elt.firstChild; }\n return elt\n}\n\nfunction addContext(slice, context) {\n if (!slice.size) { return slice }\n var schema = slice.content.firstChild.type.schema, array;\n try { array = JSON.parse(context); }\n catch(e) { return slice }\n var content = slice.content;\n var openStart = slice.openStart;\n var openEnd = slice.openEnd;\n for (var i = array.length - 2; i >= 0; i -= 2) {\n var type = schema.nodes[array[i]];\n if (!type || type.hasRequiredAttrs()) { break }\n content = Fragment.from(type.create(array[i + 1], content));\n openStart++; openEnd++;\n }\n return new Slice(content, openStart, openEnd)\n}\n\nvar observeOptions = {\n childList: true,\n characterData: true,\n characterDataOldValue: true,\n attributes: true,\n attributeOldValue: true,\n subtree: true\n};\n// IE11 has very broken mutation observers, so we also listen to DOMCharacterDataModified\nvar useCharData = result.ie && result.ie_version <= 11;\n\nvar SelectionState = function SelectionState() {\n this.anchorNode = this.anchorOffset = this.focusNode = this.focusOffset = null;\n};\n\nSelectionState.prototype.set = function set (sel) {\n this.anchorNode = sel.anchorNode; this.anchorOffset = sel.anchorOffset;\n this.focusNode = sel.focusNode; this.focusOffset = sel.focusOffset;\n};\n\nSelectionState.prototype.eq = function eq (sel) {\n return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset &&\n sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset\n};\n\nvar DOMObserver = function DOMObserver(view, handleDOMChange) {\n var this$1 = this;\n\n this.view = view;\n this.handleDOMChange = handleDOMChange;\n this.queue = [];\n this.flushingSoon = -1;\n this.observer = window.MutationObserver &&\n new window.MutationObserver(function (mutations) {\n for (var i = 0; i < mutations.length; i++) { this$1.queue.push(mutations[i]); }\n // IE11 will sometimes (on backspacing out a single character\n // text node after a BR node) call the observer callback\n // before actually updating the DOM, which will cause\n // ProseMirror to miss the change (see #930)\n if (result.ie && result.ie_version <= 11 && mutations.some(\n function (m) { return m.type == \"childList\" && m.removedNodes.length ||\n m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length; }))\n { this$1.flushSoon(); }\n else\n { this$1.flush(); }\n });\n this.currentSelection = new SelectionState;\n if (useCharData) {\n this.onCharData = function (e) {\n this$1.queue.push({target: e.target, type: \"characterData\", oldValue: e.prevValue});\n this$1.flushSoon();\n };\n }\n this.onSelectionChange = this.onSelectionChange.bind(this);\n this.suppressingSelectionUpdates = false;\n};\n\nDOMObserver.prototype.flushSoon = function flushSoon () {\n var this$1 = this;\n\n if (this.flushingSoon < 0)\n { this.flushingSoon = window.setTimeout(function () { this$1.flushingSoon = -1; this$1.flush(); }, 20); }\n};\n\nDOMObserver.prototype.forceFlush = function forceFlush () {\n if (this.flushingSoon > -1) {\n window.clearTimeout(this.flushingSoon);\n this.flushingSoon = -1;\n this.flush();\n }\n};\n\nDOMObserver.prototype.start = function start () {\n if (this.observer)\n { this.observer.observe(this.view.dom, observeOptions); }\n if (useCharData)\n { this.view.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData); }\n this.connectSelection();\n};\n\nDOMObserver.prototype.stop = function stop () {\n var this$1 = this;\n\n if (this.observer) {\n var take = this.observer.takeRecords();\n if (take.length) {\n for (var i = 0; i < take.length; i++) { this.queue.push(take[i]); }\n window.setTimeout(function () { return this$1.flush(); }, 20);\n }\n this.observer.disconnect();\n }\n if (useCharData) { this.view.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData); }\n this.disconnectSelection();\n};\n\nDOMObserver.prototype.connectSelection = function connectSelection () {\n this.view.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n};\n\nDOMObserver.prototype.disconnectSelection = function disconnectSelection () {\n this.view.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n};\n\nDOMObserver.prototype.suppressSelectionUpdates = function suppressSelectionUpdates () {\n var this$1 = this;\n\n this.suppressingSelectionUpdates = true;\n setTimeout(function () { return this$1.suppressingSelectionUpdates = false; }, 50);\n};\n\nDOMObserver.prototype.onSelectionChange = function onSelectionChange () {\n if (!hasFocusAndSelection(this.view)) { return }\n if (this.suppressingSelectionUpdates) { return selectionToDOM(this.view) }\n // Deletions on IE11 fire their events in the wrong order, giving\n // us a selection change event before the DOM changes are\n // reported.\n if (result.ie && result.ie_version <= 11 && !this.view.state.selection.empty) {\n var sel = this.view.root.getSelection();\n // Selection.isCollapsed isn't reliable on IE\n if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n { return this.flushSoon() }\n }\n this.flush();\n};\n\nDOMObserver.prototype.setCurSelection = function setCurSelection () {\n this.currentSelection.set(this.view.root.getSelection());\n};\n\nDOMObserver.prototype.ignoreSelectionChange = function ignoreSelectionChange (sel) {\n if (sel.rangeCount == 0) { return true }\n var container = sel.getRangeAt(0).commonAncestorContainer;\n var desc = this.view.docView.nearestDesc(container);\n if (desc && desc.ignoreMutation({type: \"selection\", target: container.nodeType == 3 ? container.parentNode : container})) {\n this.setCurSelection();\n return true\n }\n};\n\nDOMObserver.prototype.flush = function flush () {\n if (!this.view.docView || this.flushingSoon > -1) { return }\n var mutations = this.observer ? this.observer.takeRecords() : [];\n if (this.queue.length) {\n mutations = this.queue.concat(mutations);\n this.queue.length = 0;\n }\n\n var sel = this.view.root.getSelection();\n var newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasSelection(this.view) && !this.ignoreSelectionChange(sel);\n\n var from = -1, to = -1, typeOver = false, added = [];\n if (this.view.editable) {\n for (var i = 0; i < mutations.length; i++) {\n var result$1 = this.registerMutation(mutations[i], added);\n if (result$1) {\n from = from < 0 ? result$1.from : Math.min(result$1.from, from);\n to = to < 0 ? result$1.to : Math.max(result$1.to, to);\n if (result$1.typeOver) { typeOver = true; }\n }\n }\n }\n\n if (result.gecko && added.length > 1) {\n var brs = added.filter(function (n) { return n.nodeName == \"BR\"; });\n if (brs.length == 2) {\n var a = brs[0];\n var b = brs[1];\n if (a.parentNode && a.parentNode.parentNode == b.parentNode) { b.remove(); }\n else { a.remove(); }\n }\n }\n\n if (from > -1 || newSel) {\n if (from > -1) {\n this.view.docView.markDirty(from, to);\n checkCSS(this.view);\n }\n this.handleDOMChange(from, to, typeOver, added);\n if (this.view.docView.dirty) { this.view.updateState(this.view.state); }\n else if (!this.currentSelection.eq(sel)) { selectionToDOM(this.view); }\n this.currentSelection.set(sel);\n }\n};\n\nDOMObserver.prototype.registerMutation = function registerMutation (mut, added) {\n // Ignore mutations inside nodes that were already noted as inserted\n if (added.indexOf(mut.target) > -1) { return null }\n var desc = this.view.docView.nearestDesc(mut.target);\n if (mut.type == \"attributes\" &&\n (desc == this.view.docView || mut.attributeName == \"contenteditable\" ||\n // Firefox sometimes fires spurious events for null/empty styles\n (mut.attributeName == \"style\" && !mut.oldValue && !mut.target.getAttribute(\"style\"))))\n { return null }\n if (!desc || desc.ignoreMutation(mut)) { return null }\n\n if (mut.type == \"childList\") {\n var prev = mut.previousSibling, next = mut.nextSibling;\n if (result.ie && result.ie_version <= 11 && mut.addedNodes.length) {\n // IE11 gives us incorrect next/prev siblings for some\n // insertions, so if there are added nodes, recompute those\n for (var i = 0; i < mut.addedNodes.length; i++) {\n var ref = mut.addedNodes[i];\n var previousSibling = ref.previousSibling;\n var nextSibling = ref.nextSibling;\n if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0) { prev = previousSibling; }\n if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0) { next = nextSibling; }\n }\n }\n var fromOffset = prev && prev.parentNode == mut.target\n ? domIndex(prev) + 1 : 0;\n var from = desc.localPosFromDOM(mut.target, fromOffset, -1);\n var toOffset = next && next.parentNode == mut.target\n ? domIndex(next) : mut.target.childNodes.length;\n for (var i$1 = 0; i$1 < mut.addedNodes.length; i$1++) { added.push(mut.addedNodes[i$1]); }\n var to = desc.localPosFromDOM(mut.target, toOffset, 1);\n return {from: from, to: to}\n } else if (mut.type == \"attributes\") {\n return {from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border}\n } else { // \"characterData\"\n return {\n from: desc.posAtStart,\n to: desc.posAtEnd,\n // An event was generated for a text change that didn't change\n // any text. Mark the dom change to fall back to assuming the\n // selection was typed over with an identical value if it can't\n // find another change.\n typeOver: mut.target.nodeValue == mut.oldValue\n }\n }\n};\n\nvar cssChecked = false;\n\nfunction checkCSS(view) {\n if (cssChecked) { return }\n cssChecked = true;\n if (getComputedStyle(view.dom).whiteSpace == \"normal\")\n { console[\"warn\"](\"ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.\"); }\n}\n\n// A collection of DOM events that occur within the editor, and callback functions\n// to invoke when the event fires.\nvar handlers = {}, editHandlers = {};\n\nfunction initInput(view) {\n view.shiftKey = false;\n view.mouseDown = null;\n view.lastKeyCode = null;\n view.lastKeyCodeTime = 0;\n view.lastClick = {time: 0, x: 0, y: 0, type: \"\"};\n view.lastSelectionOrigin = null;\n view.lastSelectionTime = 0;\n\n view.lastIOSEnter = 0;\n view.lastIOSEnterFallbackTimeout = null;\n\n view.composing = false;\n view.composingTimeout = null;\n view.compositionNodes = [];\n view.compositionEndedAt = -2e8;\n\n view.domObserver = new DOMObserver(view, function (from, to, typeOver, added) { return readDOMChange(view, from, to, typeOver, added); });\n view.domObserver.start();\n // Used by hacks like the beforeinput handler to check whether anything happened in the DOM\n view.domChangeCount = 0;\n\n view.eventHandlers = Object.create(null);\n var loop = function ( event ) {\n var handler = handlers[event];\n view.dom.addEventListener(event, view.eventHandlers[event] = function (event) {\n if (eventBelongsToView(view, event) && !runCustomHandler(view, event) &&\n (view.editable || !(event.type in editHandlers)))\n { handler(view, event); }\n });\n };\n\n for (var event in handlers) loop( event );\n // On Safari, for reasons beyond my understanding, adding an input\n // event handler makes an issue where the composition vanishes when\n // you press enter go away.\n if (result.safari) { view.dom.addEventListener(\"input\", function () { return null; }); }\n\n ensureListeners(view);\n}\n\nfunction setSelectionOrigin(view, origin) {\n view.lastSelectionOrigin = origin;\n view.lastSelectionTime = Date.now();\n}\n\nfunction destroyInput(view) {\n view.domObserver.stop();\n for (var type in view.eventHandlers)\n { view.dom.removeEventListener(type, view.eventHandlers[type]); }\n clearTimeout(view.composingTimeout);\n clearTimeout(view.lastIOSEnterFallbackTimeout);\n}\n\nfunction ensureListeners(view) {\n view.someProp(\"handleDOMEvents\", function (currentHandlers) {\n for (var type in currentHandlers) { if (!view.eventHandlers[type])\n { view.dom.addEventListener(type, view.eventHandlers[type] = function (event) { return runCustomHandler(view, event); }); } }\n });\n}\n\nfunction runCustomHandler(view, event) {\n return view.someProp(\"handleDOMEvents\", function (handlers) {\n var handler = handlers[event.type];\n return handler ? handler(view, event) || event.defaultPrevented : false\n })\n}\n\nfunction eventBelongsToView(view, event) {\n if (!event.bubbles) { return true }\n if (event.defaultPrevented) { return false }\n for (var node = event.target; node != view.dom; node = node.parentNode)\n { if (!node || node.nodeType == 11 ||\n (node.pmViewDesc && node.pmViewDesc.stopEvent(event)))\n { return false } }\n return true\n}\n\nfunction dispatchEvent(view, event) {\n if (!runCustomHandler(view, event) && handlers[event.type] &&\n (view.editable || !(event.type in editHandlers)))\n { handlers[event.type](view, event); }\n}\n\neditHandlers.keydown = function (view, event) {\n view.shiftKey = event.keyCode == 16 || event.shiftKey;\n if (inOrNearComposition(view, event)) { return }\n view.domObserver.forceFlush();\n view.lastKeyCode = event.keyCode;\n view.lastKeyCodeTime = Date.now();\n // On iOS, if we preventDefault enter key presses, the virtual\n // keyboard gets confused. So the hack here is to set a flag that\n // makes the DOM change code recognize that what just happens should\n // be replaced by whatever the Enter key handlers do.\n if (result.ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n var now = Date.now();\n view.lastIOSEnter = now;\n view.lastIOSEnterFallbackTimeout = setTimeout(function () {\n if (view.lastIOSEnter == now) {\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n view.lastIOSEnter = 0;\n }\n }, 200);\n } else if (view.someProp(\"handleKeyDown\", function (f) { return f(view, event); }) || captureKeyDown(view, event)) {\n event.preventDefault();\n } else {\n setSelectionOrigin(view, \"key\");\n }\n};\n\neditHandlers.keyup = function (view, e) {\n if (e.keyCode == 16) { view.shiftKey = false; }\n};\n\neditHandlers.keypress = function (view, event) {\n if (inOrNearComposition(view, event) || !event.charCode ||\n event.ctrlKey && !event.altKey || result.mac && event.metaKey) { return }\n\n if (view.someProp(\"handleKeyPress\", function (f) { return f(view, event); })) {\n event.preventDefault();\n return\n }\n\n var sel = view.state.selection;\n if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) {\n var text = String.fromCharCode(event.charCode);\n if (!view.someProp(\"handleTextInput\", function (f) { return f(view, sel.$from.pos, sel.$to.pos, text); }))\n { view.dispatch(view.state.tr.insertText(text).scrollIntoView()); }\n event.preventDefault();\n }\n};\n\nfunction eventCoords(event) { return {left: event.clientX, top: event.clientY} }\n\nfunction isNear(event, click) {\n var dx = click.x - event.clientX, dy = click.y - event.clientY;\n return dx * dx + dy * dy < 100\n}\n\nfunction runHandlerOnContext(view, propName, pos, inside, event) {\n if (inside == -1) { return false }\n var $pos = view.state.doc.resolve(inside);\n var loop = function ( i ) {\n if (view.someProp(propName, function (f) { return i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true)\n : f(view, pos, $pos.node(i), $pos.before(i), event, false); }))\n { return { v: true } }\n };\n\n for (var i = $pos.depth + 1; i > 0; i--) {\n var returned = loop( i );\n\n if ( returned ) return returned.v;\n }\n return false\n}\n\nfunction updateSelection(view, selection, origin) {\n if (!view.focused) { view.focus(); }\n var tr = view.state.tr.setSelection(selection);\n if (origin == \"pointer\") { tr.setMeta(\"pointer\", true); }\n view.dispatch(tr);\n}\n\nfunction selectClickedLeaf(view, inside) {\n if (inside == -1) { return false }\n var $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter;\n if (node && node.isAtom && NodeSelection.isSelectable(node)) {\n updateSelection(view, new NodeSelection($pos), \"pointer\");\n return true\n }\n return false\n}\n\nfunction selectClickedNode(view, inside) {\n if (inside == -1) { return false }\n var sel = view.state.selection, selectedNode, selectAt;\n if (sel instanceof NodeSelection) { selectedNode = sel.node; }\n\n var $pos = view.state.doc.resolve(inside);\n for (var i = $pos.depth + 1; i > 0; i--) {\n var node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n if (NodeSelection.isSelectable(node)) {\n if (selectedNode && sel.$from.depth > 0 &&\n i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos)\n { selectAt = $pos.before(sel.$from.depth); }\n else\n { selectAt = $pos.before(i); }\n break\n }\n }\n\n if (selectAt != null) {\n updateSelection(view, NodeSelection.create(view.state.doc, selectAt), \"pointer\");\n return true\n } else {\n return false\n }\n}\n\nfunction handleSingleClick(view, pos, inside, event, selectNode) {\n return runHandlerOnContext(view, \"handleClickOn\", pos, inside, event) ||\n view.someProp(\"handleClick\", function (f) { return f(view, pos, event); }) ||\n (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside))\n}\n\nfunction handleDoubleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleDoubleClickOn\", pos, inside, event) ||\n view.someProp(\"handleDoubleClick\", function (f) { return f(view, pos, event); })\n}\n\nfunction handleTripleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleTripleClickOn\", pos, inside, event) ||\n view.someProp(\"handleTripleClick\", function (f) { return f(view, pos, event); }) ||\n defaultTripleClick(view, inside)\n}\n\nfunction defaultTripleClick(view, inside) {\n var doc = view.state.doc;\n if (inside == -1) {\n if (doc.inlineContent) {\n updateSelection(view, TextSelection.create(doc, 0, doc.content.size), \"pointer\");\n return true\n }\n return false\n }\n\n var $pos = doc.resolve(inside);\n for (var i = $pos.depth + 1; i > 0; i--) {\n var node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n var nodePos = $pos.before(i);\n if (node.inlineContent)\n { updateSelection(view, TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size), \"pointer\"); }\n else if (NodeSelection.isSelectable(node))\n { updateSelection(view, NodeSelection.create(doc, nodePos), \"pointer\"); }\n else\n { continue }\n return true\n }\n}\n\nfunction forceDOMFlush(view) {\n return endComposition(view)\n}\n\nvar selectNodeModifier = result.mac ? \"metaKey\" : \"ctrlKey\";\n\nhandlers.mousedown = function (view, event) {\n view.shiftKey = event.shiftKey;\n var flushed = forceDOMFlush(view);\n var now = Date.now(), type = \"singleClick\";\n if (now - view.lastClick.time < 500 && isNear(event, view.lastClick) && !event[selectNodeModifier]) {\n if (view.lastClick.type == \"singleClick\") { type = \"doubleClick\"; }\n else if (view.lastClick.type == \"doubleClick\") { type = \"tripleClick\"; }\n }\n view.lastClick = {time: now, x: event.clientX, y: event.clientY, type: type};\n\n var pos = view.posAtCoords(eventCoords(event));\n if (!pos) { return }\n\n if (type == \"singleClick\")\n { view.mouseDown = new MouseDown(view, pos, event, flushed); }\n else if ((type == \"doubleClick\" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event))\n { event.preventDefault(); }\n else\n { setSelectionOrigin(view, \"pointer\"); }\n};\n\nvar MouseDown = function MouseDown(view, pos, event, flushed) {\n var this$1 = this;\n\n this.view = view;\n this.startDoc = view.state.doc;\n this.pos = pos;\n this.event = event;\n this.flushed = flushed;\n this.selectNode = event[selectNodeModifier];\n this.allowDefault = event.shiftKey;\n\n var targetNode, targetPos;\n if (pos.inside > -1) {\n targetNode = view.state.doc.nodeAt(pos.inside);\n targetPos = pos.inside;\n } else {\n var $pos = view.state.doc.resolve(pos.pos);\n targetNode = $pos.parent;\n targetPos = $pos.depth ? $pos.before() : 0;\n }\n\n this.mightDrag = null;\n\n var target = flushed ? null : event.target;\n var targetDesc = target ? view.docView.nearestDesc(target, true) : null;\n this.target = targetDesc ? targetDesc.dom : null;\n\n if (targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false ||\n view.state.selection instanceof NodeSelection && targetPos == view.state.selection.from)\n { this.mightDrag = {node: targetNode,\n pos: targetPos,\n addAttr: this.target && !this.target.draggable,\n setUneditable: this.target && result.gecko && !this.target.hasAttribute(\"contentEditable\")}; }\n\n if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr) { this.target.draggable = true; }\n if (this.mightDrag.setUneditable)\n { setTimeout(function () { return this$1.target.setAttribute(\"contentEditable\", \"false\"); }, 20); }\n this.view.domObserver.start();\n }\n\n view.root.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n view.root.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n setSelectionOrigin(view, \"pointer\");\n};\n\nMouseDown.prototype.done = function done () {\n this.view.root.removeEventListener(\"mouseup\", this.up);\n this.view.root.removeEventListener(\"mousemove\", this.move);\n if (this.mightDrag && this.target) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr) { this.target.removeAttribute(\"draggable\"); }\n if (this.mightDrag.setUneditable) { this.target.removeAttribute(\"contentEditable\"); }\n this.view.domObserver.start();\n }\n this.view.mouseDown = null;\n};\n\nMouseDown.prototype.up = function up (event) {\n this.done();\n\n if (!this.view.dom.contains(event.target.nodeType == 3 ? event.target.parentNode : event.target))\n { return }\n\n var pos = this.pos;\n if (this.view.state.doc != this.startDoc) { pos = this.view.posAtCoords(eventCoords(event)); }\n\n if (this.allowDefault || !pos) {\n setSelectionOrigin(this.view, \"pointer\");\n } else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {\n event.preventDefault();\n } else if (this.flushed ||\n // Safari ignores clicks on draggable elements\n (result.safari && this.mightDrag && !this.mightDrag.node.isAtom) ||\n // Chrome will sometimes treat a node selection as a\n // cursor, but still report that the node is selected\n // when asked through getSelection. You'll then get a\n // situation where clicking at the point where that\n // (hidden) cursor is doesn't change the selection, and\n // thus doesn't get a reaction from ProseMirror. This\n // works around that.\n (result.chrome && !(this.view.state.selection instanceof TextSelection) &&\n (pos.pos == this.view.state.selection.from || pos.pos == this.view.state.selection.to))) {\n updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), \"pointer\");\n event.preventDefault();\n } else {\n setSelectionOrigin(this.view, \"pointer\");\n }\n};\n\nMouseDown.prototype.move = function move (event) {\n if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||\n Math.abs(this.event.y - event.clientY) > 4))\n { this.allowDefault = true; }\n setSelectionOrigin(this.view, \"pointer\");\n};\n\nhandlers.touchdown = function (view) {\n forceDOMFlush(view);\n setSelectionOrigin(view, \"pointer\");\n};\n\nhandlers.contextmenu = function (view) { return forceDOMFlush(view); };\n\nfunction inOrNearComposition(view, event) {\n if (view.composing) { return true }\n // See https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/.\n // On Japanese input method editors (IMEs), the Enter key is used to confirm character\n // selection. On Safari, when Enter is pressed, compositionend and keydown events are\n // emitted. The keydown event triggers newline insertion, which we don't want.\n // This method returns true if the keydown event should be ignored.\n // We only ignore it once, as pressing Enter a second time *should* insert a newline.\n // Furthermore, the keydown event timestamp must be close to the compositionEndedAt timestamp.\n // This guards against the case where compositionend is triggered without the keyboard\n // (e.g. character confirmation may be done with the mouse), and keydown is triggered\n // afterwards- we wouldn't want to ignore the keydown event in this case.\n if (result.safari && Math.abs(event.timeStamp - view.compositionEndedAt) < 500) {\n view.compositionEndedAt = -2e8;\n return true\n }\n return false\n}\n\n// Drop active composition after 5 seconds of inactivity on Android\nvar timeoutComposition = result.android ? 5000 : -1;\n\neditHandlers.compositionstart = editHandlers.compositionupdate = function (view) {\n if (!view.composing) {\n view.domObserver.flush();\n var state = view.state;\n var $pos = state.selection.$from;\n if (state.selection.empty &&\n (state.storedMarks ||\n (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(function (m) { return m.type.spec.inclusive === false; })))) {\n // Need to wrap the cursor in mark nodes different from the ones in the DOM context\n view.markCursor = view.state.storedMarks || $pos.marks();\n endComposition(view, true);\n view.markCursor = null;\n } else {\n endComposition(view);\n // In firefox, if the cursor is after but outside a marked node,\n // the inserted text won't inherit the marks. So this moves it\n // inside if necessary.\n if (result.gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {\n var sel = view.root.getSelection();\n for (var node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0;) {\n var before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];\n if (!before) { break }\n if (before.nodeType == 3) {\n sel.collapse(before, before.nodeValue.length);\n break\n } else {\n node = before;\n offset = -1;\n }\n }\n }\n }\n view.composing = true;\n }\n scheduleComposeEnd(view, timeoutComposition);\n};\n\neditHandlers.compositionend = function (view, event) {\n if (view.composing) {\n view.composing = false;\n view.compositionEndedAt = event.timeStamp;\n scheduleComposeEnd(view, 20);\n }\n};\n\nfunction scheduleComposeEnd(view, delay) {\n clearTimeout(view.composingTimeout);\n if (delay > -1) { view.composingTimeout = setTimeout(function () { return endComposition(view); }, delay); }\n}\n\nfunction clearComposition(view) {\n view.composing = false;\n while (view.compositionNodes.length > 0) { view.compositionNodes.pop().markParentsDirty(); }\n}\n\nfunction endComposition(view, forceUpdate) {\n view.domObserver.forceFlush();\n clearComposition(view);\n if (forceUpdate || view.docView.dirty) {\n var sel = selectionFromDOM(view);\n if (sel && !sel.eq(view.state.selection)) { view.dispatch(view.state.tr.setSelection(sel)); }\n else { view.updateState(view.state); }\n return true\n }\n return false\n}\n\nfunction captureCopy(view, dom) {\n // The extra wrapper is somehow necessary on IE/Edge to prevent the\n // content from being mangled when it is put onto the clipboard\n if (!view.dom.parentNode) { return }\n var wrap = view.dom.parentNode.appendChild(document.createElement(\"div\"));\n wrap.appendChild(dom);\n wrap.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n var sel = getSelection(), range = document.createRange();\n range.selectNodeContents(dom);\n // Done because IE will fire a selectionchange moving the selection\n // to its start when removeAllRanges is called and the editor still\n // has focus (which will mess up the editor's selection state).\n view.dom.blur();\n sel.removeAllRanges();\n sel.addRange(range);\n setTimeout(function () {\n if (wrap.parentNode) { wrap.parentNode.removeChild(wrap); }\n view.focus();\n }, 50);\n}\n\n// This is very crude, but unfortunately both these browsers _pretend_\n// that they have a clipboard API—all the objects and methods are\n// there, they just don't work, and they are hard to test.\nvar brokenClipboardAPI = (result.ie && result.ie_version < 15) ||\n (result.ios && result.webkit_version < 604);\n\nhandlers.copy = editHandlers.cut = function (view, e) {\n var sel = view.state.selection, cut = e.type == \"cut\";\n if (sel.empty) { return }\n\n // IE and Edge's clipboard interface is completely broken\n var data = brokenClipboardAPI ? null : e.clipboardData;\n var slice = sel.content();\n var ref = serializeForClipboard(view, slice);\n var dom = ref.dom;\n var text = ref.text;\n if (data) {\n e.preventDefault();\n data.clearData();\n data.setData(\"text/html\", dom.innerHTML);\n data.setData(\"text/plain\", text);\n } else {\n captureCopy(view, dom);\n }\n if (cut) { view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\")); }\n};\n\nfunction sliceSingleNode(slice) {\n return slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1 ? slice.content.firstChild : null\n}\n\nfunction capturePaste(view, e) {\n if (!view.dom.parentNode) { return }\n var plainText = view.shiftKey || view.state.selection.$from.parent.type.spec.code;\n var target = view.dom.parentNode.appendChild(document.createElement(plainText ? \"textarea\" : \"div\"));\n if (!plainText) { target.contentEditable = \"true\"; }\n target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n target.focus();\n setTimeout(function () {\n view.focus();\n if (target.parentNode) { target.parentNode.removeChild(target); }\n if (plainText) { doPaste(view, target.value, null, e); }\n else { doPaste(view, target.textContent, target.innerHTML, e); }\n }, 50);\n}\n\nfunction doPaste(view, text, html, e) {\n var slice = parseFromClipboard(view, text, html, view.shiftKey, view.state.selection.$from);\n if (view.someProp(\"handlePaste\", function (f) { return f(view, e, slice || Slice.empty); })) { return true }\n if (!slice) { return false }\n\n var singleNode = sliceSingleNode(slice);\n var tr = singleNode ? view.state.tr.replaceSelectionWith(singleNode, view.shiftKey) : view.state.tr.replaceSelection(slice);\n view.dispatch(tr.scrollIntoView().setMeta(\"paste\", true).setMeta(\"uiEvent\", \"paste\"));\n return true\n}\n\neditHandlers.paste = function (view, e) {\n var data = brokenClipboardAPI ? null : e.clipboardData;\n if (data && doPaste(view, data.getData(\"text/plain\"), data.getData(\"text/html\"), e)) { e.preventDefault(); }\n else { capturePaste(view, e); }\n};\n\nvar Dragging = function Dragging(slice, move) {\n this.slice = slice;\n this.move = move;\n};\n\nvar dragCopyModifier = result.mac ? \"altKey\" : \"ctrlKey\";\n\nhandlers.dragstart = function (view, e) {\n var mouseDown = view.mouseDown;\n if (mouseDown) { mouseDown.done(); }\n if (!e.dataTransfer) { return }\n\n var sel = view.state.selection;\n var pos = sel.empty ? null : view.posAtCoords(eventCoords(e));\n if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1: sel.to)) ; else if (mouseDown && mouseDown.mightDrag) {\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos)));\n } else if (e.target && e.target.nodeType == 1) {\n var desc = view.docView.nearestDesc(e.target, true);\n if (!desc || !desc.node.type.spec.draggable || desc == view.docView) { return }\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, desc.posBefore)));\n }\n var slice = view.state.selection.content();\n var ref = serializeForClipboard(view, slice);\n var dom = ref.dom;\n var text = ref.text;\n e.dataTransfer.clearData();\n e.dataTransfer.setData(brokenClipboardAPI ? \"Text\" : \"text/html\", dom.innerHTML);\n if (!brokenClipboardAPI) { e.dataTransfer.setData(\"text/plain\", text); }\n view.dragging = new Dragging(slice, !e[dragCopyModifier]);\n};\n\nhandlers.dragend = function (view) {\n var dragging = view.dragging;\n window.setTimeout(function () {\n if (view.dragging == dragging) { view.dragging = null; }\n }, 50);\n};\n\neditHandlers.dragover = editHandlers.dragenter = function (_, e) { return e.preventDefault(); };\n\neditHandlers.drop = function (view, e) {\n var dragging = view.dragging;\n view.dragging = null;\n\n if (!e.dataTransfer) { return }\n\n var eventPos = view.posAtCoords(eventCoords(e));\n if (!eventPos) { return }\n var $mouse = view.state.doc.resolve(eventPos.pos);\n if (!$mouse) { return }\n var slice = dragging && dragging.slice ||\n parseFromClipboard(view, e.dataTransfer.getData(brokenClipboardAPI ? \"Text\" : \"text/plain\"),\n brokenClipboardAPI ? null : e.dataTransfer.getData(\"text/html\"), false, $mouse);\n var move = dragging && !e[dragCopyModifier];\n if (view.someProp(\"handleDrop\", function (f) { return f(view, e, slice || Slice.empty, move); })) {\n e.preventDefault();\n return\n }\n if (!slice) { return }\n\n e.preventDefault();\n var insertPos = slice ? dropPoint(view.state.doc, $mouse.pos, slice) : $mouse.pos;\n if (insertPos == null) { insertPos = $mouse.pos; }\n\n var tr = view.state.tr;\n if (move) { tr.deleteSelection(); }\n\n var pos = tr.mapping.map(insertPos);\n var isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1;\n var beforeInsert = tr.doc;\n if (isNode)\n { tr.replaceRangeWith(pos, pos, slice.content.firstChild); }\n else\n { tr.replaceRange(pos, pos, slice); }\n if (tr.doc.eq(beforeInsert)) { return }\n\n var $pos = tr.doc.resolve(pos);\n if (isNode && NodeSelection.isSelectable(slice.content.firstChild) &&\n $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild)) {\n tr.setSelection(new NodeSelection($pos));\n } else {\n var end = tr.mapping.map(insertPos);\n tr.mapping.maps[tr.mapping.maps.length - 1].forEach(function (_from, _to, _newFrom, newTo) { return end = newTo; });\n tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)));\n }\n view.focus();\n view.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n};\n\nhandlers.focus = function (view) {\n if (!view.focused) {\n view.domObserver.stop();\n view.dom.classList.add(\"ProseMirror-focused\");\n view.domObserver.start();\n view.focused = true;\n setTimeout(function () {\n if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.root.getSelection()))\n { selectionToDOM(view); }\n }, 20);\n }\n};\n\nhandlers.blur = function (view) {\n if (view.focused) {\n view.domObserver.stop();\n view.dom.classList.remove(\"ProseMirror-focused\");\n view.domObserver.start();\n view.domObserver.currentSelection.set({});\n view.focused = false;\n }\n};\n\nhandlers.beforeinput = function (view, event) {\n // We should probably do more with beforeinput events, but support\n // is so spotty that I'm still waiting to see where they are going.\n\n // Very specific hack to deal with backspace sometimes failing on\n // Chrome Android when after an uneditable node.\n if (result.chrome && result.android && event.inputType == \"deleteContentBackward\") {\n var domChangeCount = view.domChangeCount;\n setTimeout(function () {\n if (view.domChangeCount != domChangeCount) { return } // Event already had some effect\n // This bug tends to close the virtual keyboard, so we refocus\n view.dom.blur();\n view.focus();\n if (view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(8, \"Backspace\")); })) { return }\n var ref = view.state.selection;\n var $cursor = ref.$cursor;\n // Crude approximation of backspace behavior when no command handled it\n if ($cursor && $cursor.pos > 0) { view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView()); }\n }, 50);\n }\n};\n\n// Make sure all handlers get registered\nfor (var prop in editHandlers) { handlers[prop] = editHandlers[prop]; }\n\nfunction compareObjs(a, b) {\n if (a == b) { return true }\n for (var p in a) { if (a[p] !== b[p]) { return false } }\n for (var p$1 in b) { if (!(p$1 in a)) { return false } }\n return true\n}\n\nvar WidgetType = function WidgetType(toDOM, spec) {\n this.spec = spec || noSpec;\n this.side = this.spec.side || 0;\n this.toDOM = toDOM;\n};\n\nWidgetType.prototype.map = function map (mapping, span, offset, oldOffset) {\n var ref = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1);\n var pos = ref.pos;\n var deleted = ref.deleted;\n return deleted ? null : new Decoration(pos - offset, pos - offset, this)\n};\n\nWidgetType.prototype.valid = function valid () { return true };\n\nWidgetType.prototype.eq = function eq (other) {\n return this == other ||\n (other instanceof WidgetType &&\n (this.spec.key && this.spec.key == other.spec.key ||\n this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)))\n};\n\nvar InlineType = function InlineType(attrs, spec) {\n this.spec = spec || noSpec;\n this.attrs = attrs;\n};\n\nInlineType.prototype.map = function map (mapping, span, offset, oldOffset) {\n var from = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset;\n var to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset;\n return from >= to ? null : new Decoration(from, to, this)\n};\n\nInlineType.prototype.valid = function valid (_, span) { return span.from < span.to };\n\nInlineType.prototype.eq = function eq (other) {\n return this == other ||\n (other instanceof InlineType && compareObjs(this.attrs, other.attrs) &&\n compareObjs(this.spec, other.spec))\n};\n\nInlineType.is = function is (span) { return span.type instanceof InlineType };\n\nvar NodeType = function NodeType(attrs, spec) {\n this.spec = spec || noSpec;\n this.attrs = attrs;\n};\n\nNodeType.prototype.map = function map (mapping, span, offset, oldOffset) {\n var from = mapping.mapResult(span.from + oldOffset, 1);\n if (from.deleted) { return null }\n var to = mapping.mapResult(span.to + oldOffset, -1);\n if (to.deleted || to.pos <= from.pos) { return null }\n return new Decoration(from.pos - offset, to.pos - offset, this)\n};\n\nNodeType.prototype.valid = function valid (node, span) {\n var ref = node.content.findIndex(span.from);\n var index = ref.index;\n var offset = ref.offset;\n return offset == span.from && offset + node.child(index).nodeSize == span.to\n};\n\nNodeType.prototype.eq = function eq (other) {\n return this == other ||\n (other instanceof NodeType && compareObjs(this.attrs, other.attrs) &&\n compareObjs(this.spec, other.spec))\n};\n\n// ::- Decoration objects can be provided to the view through the\n// [`decorations` prop](#view.EditorProps.decorations). They come in\n// several variants—see the static members of this class for details.\nvar Decoration = function Decoration(from, to, type) {\n // :: number\n // The start position of the decoration.\n this.from = from;\n // :: number\n // The end position. Will be the same as `from` for [widget\n // decorations](#view.Decoration^widget).\n this.to = to;\n this.type = type;\n};\n\nvar prototypeAccessors$1 = { spec: { configurable: true },inline: { configurable: true } };\n\nDecoration.prototype.copy = function copy (from, to) {\n return new Decoration(from, to, this.type)\n};\n\nDecoration.prototype.eq = function eq (other, offset) {\n if ( offset === void 0 ) offset = 0;\n\n return this.type.eq(other.type) && this.from + offset == other.from && this.to + offset == other.to\n};\n\nDecoration.prototype.map = function map (mapping, offset, oldOffset) {\n return this.type.map(mapping, this, offset, oldOffset)\n};\n\n// :: (number, union<(view: EditorView, getPos: () → number) → dom.Node, dom.Node>, ?Object) → Decoration\n// Creates a widget decoration, which is a DOM node that's shown in\n// the document at the given position. It is recommended that you\n// delay rendering the widget by passing a function that will be\n// called when the widget is actually drawn in a view, but you can\n// also directly pass a DOM node. `getPos` can be used to find the\n// widget's current document position.\n//\n// spec::- These options are supported:\n//\n// side:: ?number\n// Controls which side of the document position this widget is\n// associated with. When negative, it is drawn before a cursor\n// at its position, and content inserted at that position ends\n// up after the widget. When zero (the default) or positive, the\n// widget is drawn after the cursor and content inserted there\n// ends up before the widget.\n//\n// When there are multiple widgets at a given position, their\n// `side` values determine the order in which they appear. Those\n// with lower values appear first. The ordering of widgets with\n// the same `side` value is unspecified.\n//\n// When `marks` is null, `side` also determines the marks that\n// the widget is wrapped in—those of the node before when\n// negative, those of the node after when positive.\n//\n// marks:: ?[Mark]\n// The precise set of marks to draw around the widget.\n//\n// stopEvent:: ?(event: dom.Event) → bool\n// Can be used to control which DOM events, when they bubble out\n// of this widget, the editor view should ignore.\n//\n// ignoreSelection:: ?bool\n// When set (defaults to false), selection changes inside the\n// widget are ignored, and don't cause ProseMirror to try and\n// re-sync the selection with its selection state.\n//\n// key:: ?string\n// When comparing decorations of this type (in order to decide\n// whether it needs to be redrawn), ProseMirror will by default\n// compare the widget DOM node by identity. If you pass a key,\n// that key will be compared instead, which can be useful when\n// you generate decorations on the fly and don't want to store\n// and reuse DOM nodes. Make sure that any widgets with the same\n// key are interchangeable—if widgets differ in, for example,\n// the behavior of some event handler, they should get\n// different keys.\nDecoration.widget = function widget (pos, toDOM, spec) {\n return new Decoration(pos, pos, new WidgetType(toDOM, spec))\n};\n\n// :: (number, number, DecorationAttrs, ?Object) → Decoration\n// Creates an inline decoration, which adds the given attributes to\n// each inline node between `from` and `to`.\n//\n// spec::- These options are recognized:\n//\n// inclusiveStart:: ?bool\n// Determines how the left side of the decoration is\n// [mapped](#transform.Position_Mapping) when content is\n// inserted directly at that position. By default, the decoration\n// won't include the new content, but you can set this to `true`\n// to make it inclusive.\n//\n// inclusiveEnd:: ?bool\n// Determines how the right side of the decoration is mapped.\n// See\n// [`inclusiveStart`](#view.Decoration^inline^spec.inclusiveStart).\nDecoration.inline = function inline (from, to, attrs, spec) {\n return new Decoration(from, to, new InlineType(attrs, spec))\n};\n\n// :: (number, number, DecorationAttrs, ?Object) → Decoration\n// Creates a node decoration. `from` and `to` should point precisely\n// before and after a node in the document. That node, and only that\n// node, will receive the given attributes.\n//\n// spec::-\n//\n// Optional information to store with the decoration. It\n// is also used when comparing decorators for equality.\nDecoration.node = function node (from, to, attrs, spec) {\n return new Decoration(from, to, new NodeType(attrs, spec))\n};\n\n// :: Object\n// The spec provided when creating this decoration. Can be useful\n// if you've stored extra information in that object.\nprototypeAccessors$1.spec.get = function () { return this.type.spec };\n\nprototypeAccessors$1.inline.get = function () { return this.type instanceof InlineType };\n\nObject.defineProperties( Decoration.prototype, prototypeAccessors$1 );\n\n// DecorationAttrs:: interface\n// A set of attributes to add to a decorated node. Most properties\n// simply directly correspond to DOM attributes of the same name,\n// which will be set to the property's value. These are exceptions:\n//\n// class:: ?string\n// A CSS class name or a space-separated set of class names to be\n// _added_ to the classes that the node already had.\n//\n// style:: ?string\n// A string of CSS to be _added_ to the node's existing `style` property.\n//\n// nodeName:: ?string\n// When non-null, the target node is wrapped in a DOM element of\n// this type (and the other attributes are applied to this element).\n\nvar none = [], noSpec = {};\n\n// ::- A collection of [decorations](#view.Decoration), organized in\n// such a way that the drawing algorithm can efficiently use and\n// compare them. This is a persistent data structure—it is not\n// modified, updates create a new value.\nvar DecorationSet = function DecorationSet(local, children) {\n this.local = local && local.length ? local : none;\n this.children = children && children.length ? children : none;\n};\n\n// :: (Node, [Decoration]) → DecorationSet\n// Create a set of decorations, using the structure of the given\n// document.\nDecorationSet.create = function create (doc, decorations) {\n return decorations.length ? buildTree(decorations, doc, 0, noSpec) : empty\n};\n\n// :: (?number, ?number, ?(spec: Object) → bool) → [Decoration]\n// Find all decorations in this set which touch the given range\n// (including decorations that start or end directly at the\n// boundaries) and match the given predicate on their spec. When\n// `start` and `end` are omitted, all decorations in the set are\n// considered. When `predicate` isn't given, all decorations are\n// assumed to match.\nDecorationSet.prototype.find = function find (start, end, predicate) {\n var result = [];\n this.findInner(start == null ? 0 : start, end == null ? 1e9 : end, result, 0, predicate);\n return result\n};\n\nDecorationSet.prototype.findInner = function findInner (start, end, result, offset, predicate) {\n for (var i = 0; i < this.local.length; i++) {\n var span = this.local[i];\n if (span.from <= end && span.to >= start && (!predicate || predicate(span.spec)))\n { result.push(span.copy(span.from + offset, span.to + offset)); }\n }\n for (var i$1 = 0; i$1 < this.children.length; i$1 += 3) {\n if (this.children[i$1] < end && this.children[i$1 + 1] > start) {\n var childOff = this.children[i$1] + 1;\n this.children[i$1 + 2].findInner(start - childOff, end - childOff, result, offset + childOff, predicate);\n }\n }\n};\n\n// :: (Mapping, Node, ?Object) → DecorationSet\n// Map the set of decorations in response to a change in the\n// document.\n//\n// options::- An optional set of options.\n//\n// onRemove:: ?(decorationSpec: Object)\n// When given, this function will be called for each decoration\n// that gets dropped as a result of the mapping, passing the\n// spec of that decoration.\nDecorationSet.prototype.map = function map (mapping, doc, options) {\n if (this == empty || mapping.maps.length == 0) { return this }\n return this.mapInner(mapping, doc, 0, 0, options || noSpec)\n};\n\nDecorationSet.prototype.mapInner = function mapInner (mapping, node, offset, oldOffset, options) {\n var newLocal;\n for (var i = 0; i < this.local.length; i++) {\n var mapped = this.local[i].map(mapping, offset, oldOffset);\n if (mapped && mapped.type.valid(node, mapped)) { (newLocal || (newLocal = [])).push(mapped); }\n else if (options.onRemove) { options.onRemove(this.local[i].spec); }\n }\n\n if (this.children.length)\n { return mapChildren(this.children, newLocal, mapping, node, offset, oldOffset, options) }\n else\n { return newLocal ? new DecorationSet(newLocal.sort(byPos)) : empty }\n};\n\n// :: (Node, [Decoration]) → DecorationSet\n// Add the given array of decorations to the ones in the set,\n// producing a new set. Needs access to the current document to\n// create the appropriate tree structure.\nDecorationSet.prototype.add = function add (doc, decorations) {\n if (!decorations.length) { return this }\n if (this == empty) { return DecorationSet.create(doc, decorations) }\n return this.addInner(doc, decorations, 0)\n};\n\nDecorationSet.prototype.addInner = function addInner (doc, decorations, offset) {\n var this$1 = this;\n\n var children, childIndex = 0;\n doc.forEach(function (childNode, childOffset) {\n var baseOffset = childOffset + offset, found;\n if (!(found = takeSpansForNode(decorations, childNode, baseOffset))) { return }\n\n if (!children) { children = this$1.children.slice(); }\n while (childIndex < children.length && children[childIndex] < childOffset) { childIndex += 3; }\n if (children[childIndex] == childOffset)\n { children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found, baseOffset + 1); }\n else\n { children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found, childNode, baseOffset + 1, noSpec)); }\n childIndex += 3;\n });\n\n var local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset);\n for (var i = 0; i < local.length; i++) { if (!local[i].type.valid(doc, local[i])) { local.splice(i--, 1); } }\n\n return new DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local,\n children || this.children)\n};\n\n// :: ([Decoration]) → DecorationSet\n// Create a new set that contains the decorations in this set, minus\n// the ones in the given array.\nDecorationSet.prototype.remove = function remove (decorations) {\n if (decorations.length == 0 || this == empty) { return this }\n return this.removeInner(decorations, 0)\n};\n\nDecorationSet.prototype.removeInner = function removeInner (decorations, offset) {\n var children = this.children, local = this.local;\n for (var i = 0; i < children.length; i += 3) {\n var found = (void 0), from = children[i] + offset, to = children[i + 1] + offset;\n for (var j = 0, span = (void 0); j < decorations.length; j++) { if (span = decorations[j]) {\n if (span.from > from && span.to < to) {\n decorations[j] = null\n ;(found || (found = [])).push(span);\n }\n } }\n if (!found) { continue }\n if (children == this.children) { children = this.children.slice(); }\n var removed = children[i + 2].removeInner(found, from + 1);\n if (removed != empty) {\n children[i + 2] = removed;\n } else {\n children.splice(i, 3);\n i -= 3;\n }\n }\n if (local.length) { for (var i$1 = 0, span$1 = (void 0); i$1 < decorations.length; i$1++) { if (span$1 = decorations[i$1]) {\n for (var j$1 = 0; j$1 < local.length; j$1++) { if (local[j$1].eq(span$1, offset)) {\n if (local == this.local) { local = this.local.slice(); }\n local.splice(j$1--, 1);\n } }\n } } }\n if (children == this.children && local == this.local) { return this }\n return local.length || children.length ? new DecorationSet(local, children) : empty\n};\n\nDecorationSet.prototype.forChild = function forChild (offset, node) {\n if (this == empty) { return this }\n if (node.isLeaf) { return DecorationSet.empty }\n\n var child, local;\n for (var i = 0; i < this.children.length; i += 3) { if (this.children[i] >= offset) {\n if (this.children[i] == offset) { child = this.children[i + 2]; }\n break\n } }\n var start = offset + 1, end = start + node.content.size;\n for (var i$1 = 0; i$1 < this.local.length; i$1++) {\n var dec = this.local[i$1];\n if (dec.from < end && dec.to > start && (dec.type instanceof InlineType)) {\n var from = Math.max(start, dec.from) - start, to = Math.min(end, dec.to) - start;\n if (from < to) { (local || (local = [])).push(dec.copy(from, to)); }\n }\n }\n if (local) {\n var localSet = new DecorationSet(local.sort(byPos));\n return child ? new DecorationGroup([localSet, child]) : localSet\n }\n return child || empty\n};\n\nDecorationSet.prototype.eq = function eq (other) {\n if (this == other) { return true }\n if (!(other instanceof DecorationSet) ||\n this.local.length != other.local.length ||\n this.children.length != other.children.length) { return false }\n for (var i = 0; i < this.local.length; i++)\n { if (!this.local[i].eq(other.local[i])) { return false } }\n for (var i$1 = 0; i$1 < this.children.length; i$1 += 3)\n { if (this.children[i$1] != other.children[i$1] ||\n this.children[i$1 + 1] != other.children[i$1 + 1] ||\n !this.children[i$1 + 2].eq(other.children[i$1 + 2])) { return false } }\n return true\n};\n\nDecorationSet.prototype.locals = function locals (node) {\n return removeOverlap(this.localsInner(node))\n};\n\nDecorationSet.prototype.localsInner = function localsInner (node) {\n if (this == empty) { return none }\n if (node.inlineContent || !this.local.some(InlineType.is)) { return this.local }\n var result = [];\n for (var i = 0; i < this.local.length; i++) {\n if (!(this.local[i].type instanceof InlineType))\n { result.push(this.local[i]); }\n }\n return result\n};\n\nvar empty = new DecorationSet();\n\n// :: DecorationSet\n// The empty set of decorations.\nDecorationSet.empty = empty;\n\nDecorationSet.removeOverlap = removeOverlap;\n\n// :- An abstraction that allows the code dealing with decorations to\n// treat multiple DecorationSet objects as if it were a single object\n// with (a subset of) the same interface.\nvar DecorationGroup = function DecorationGroup(members) {\n this.members = members;\n};\n\nDecorationGroup.prototype.forChild = function forChild (offset, child) {\n if (child.isLeaf) { return DecorationSet.empty }\n var found = [];\n for (var i = 0; i < this.members.length; i++) {\n var result = this.members[i].forChild(offset, child);\n if (result == empty) { continue }\n if (result instanceof DecorationGroup) { found = found.concat(result.members); }\n else { found.push(result); }\n }\n return DecorationGroup.from(found)\n};\n\nDecorationGroup.prototype.eq = function eq (other) {\n if (!(other instanceof DecorationGroup) ||\n other.members.length != this.members.length) { return false }\n for (var i = 0; i < this.members.length; i++)\n { if (!this.members[i].eq(other.members[i])) { return false } }\n return true\n};\n\nDecorationGroup.prototype.locals = function locals (node) {\n var result, sorted = true;\n for (var i = 0; i < this.members.length; i++) {\n var locals = this.members[i].localsInner(node);\n if (!locals.length) { continue }\n if (!result) {\n result = locals;\n } else {\n if (sorted) {\n result = result.slice();\n sorted = false;\n }\n for (var j = 0; j < locals.length; j++) { result.push(locals[j]); }\n }\n }\n return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none\n};\n\n// : ([DecorationSet]) → union\n// Create a group for the given array of decoration sets, or return\n// a single set when possible.\nDecorationGroup.from = function from (members) {\n switch (members.length) {\n case 0: return empty\n case 1: return members[0]\n default: return new DecorationGroup(members)\n }\n};\n\nfunction mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {\n var children = oldChildren.slice();\n\n // Mark the children that are directly touched by changes, and\n // move those that are after the changes.\n var shift = function (oldStart, oldEnd, newStart, newEnd) {\n for (var i = 0; i < children.length; i += 3) {\n var end = children[i + 1], dSize = (void 0);\n if (end == -1 || oldStart > end + oldOffset) { continue }\n if (oldEnd >= children[i] + oldOffset) {\n children[i + 1] = -1;\n } else if (newStart >= offset && (dSize = (newEnd - newStart) - (oldEnd - oldStart))) {\n children[i] += dSize;\n children[i + 1] += dSize;\n }\n }\n };\n for (var i = 0; i < mapping.maps.length; i++) { mapping.maps[i].forEach(shift); }\n\n // Find the child nodes that still correspond to a single node,\n // recursively call mapInner on them and update their positions.\n var mustRebuild = false;\n for (var i$1 = 0; i$1 < children.length; i$1 += 3) { if (children[i$1 + 1] == -1) { // Touched nodes\n var from = mapping.map(oldChildren[i$1] + oldOffset), fromLocal = from - offset;\n if (fromLocal < 0 || fromLocal >= node.content.size) {\n mustRebuild = true;\n continue\n }\n // Must read oldChildren because children was tagged with -1\n var to = mapping.map(oldChildren[i$1 + 1] + oldOffset, -1), toLocal = to - offset;\n var ref = node.content.findIndex(fromLocal);\n var index = ref.index;\n var childOffset = ref.offset;\n var childNode = node.maybeChild(index);\n if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) {\n var mapped = children[i$1 + 2].mapInner(mapping, childNode, from + 1, oldChildren[i$1] + oldOffset + 1, options);\n if (mapped != empty) {\n children[i$1] = fromLocal;\n children[i$1 + 1] = toLocal;\n children[i$1 + 2] = mapped;\n } else {\n children[i$1 + 1] = -2;\n mustRebuild = true;\n }\n } else {\n mustRebuild = true;\n }\n } }\n\n // Remaining children must be collected and rebuilt into the appropriate structure\n if (mustRebuild) {\n var decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal || [], mapping,\n offset, oldOffset, options);\n var built = buildTree(decorations, node, 0, options);\n newLocal = built.local;\n for (var i$2 = 0; i$2 < children.length; i$2 += 3) { if (children[i$2 + 1] < 0) {\n children.splice(i$2, 3);\n i$2 -= 3;\n } }\n for (var i$3 = 0, j = 0; i$3 < built.children.length; i$3 += 3) {\n var from$1 = built.children[i$3];\n while (j < children.length && children[j] < from$1) { j += 3; }\n children.splice(j, 0, built.children[i$3], built.children[i$3 + 1], built.children[i$3 + 2]);\n }\n }\n\n return new DecorationSet(newLocal && newLocal.sort(byPos), children)\n}\n\nfunction moveSpans(spans, offset) {\n if (!offset || !spans.length) { return spans }\n var result = [];\n for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n result.push(new Decoration(span.from + offset, span.to + offset, span.type));\n }\n return result\n}\n\nfunction mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset, oldOffset, options) {\n // Gather all decorations from the remaining marked children\n function gather(set, oldOffset) {\n for (var i = 0; i < set.local.length; i++) {\n var mapped = set.local[i].map(mapping, offset, oldOffset);\n if (mapped) { decorations.push(mapped); }\n else if (options.onRemove) { options.onRemove(set.local[i].spec); }\n }\n for (var i$1 = 0; i$1 < set.children.length; i$1 += 3)\n { gather(set.children[i$1 + 2], set.children[i$1] + oldOffset + 1); }\n }\n for (var i = 0; i < children.length; i += 3) { if (children[i + 1] == -1)\n { gather(children[i + 2], oldChildren[i] + oldOffset + 1); } }\n\n return decorations\n}\n\nfunction takeSpansForNode(spans, node, offset) {\n if (node.isLeaf) { return null }\n var end = offset + node.nodeSize, found = null;\n for (var i = 0, span = (void 0); i < spans.length; i++) {\n if ((span = spans[i]) && span.from > offset && span.to < end) {\n(found || (found = [])).push(span);\n spans[i] = null;\n }\n }\n return found\n}\n\nfunction withoutNulls(array) {\n var result = [];\n for (var i = 0; i < array.length; i++)\n { if (array[i] != null) { result.push(array[i]); } }\n return result\n}\n\n// : ([Decoration], Node, number) → DecorationSet\n// Build up a tree that corresponds to a set of decorations. `offset`\n// is a base offset that should be subtractet from the `from` and `to`\n// positions in the spans (so that we don't have to allocate new spans\n// for recursive calls).\nfunction buildTree(spans, node, offset, options) {\n var children = [], hasNulls = false;\n node.forEach(function (childNode, localStart) {\n var found = takeSpansForNode(spans, childNode, localStart + offset);\n if (found) {\n hasNulls = true;\n var subtree = buildTree(found, childNode, offset + localStart + 1, options);\n if (subtree != empty)\n { children.push(localStart, localStart + childNode.nodeSize, subtree); }\n }\n });\n var locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset).sort(byPos);\n for (var i = 0; i < locals.length; i++) { if (!locals[i].type.valid(node, locals[i])) {\n if (options.onRemove) { options.onRemove(locals[i].spec); }\n locals.splice(i--, 1);\n } }\n return locals.length || children.length ? new DecorationSet(locals, children) : empty\n}\n\n// : (Decoration, Decoration) → number\n// Used to sort decorations so that ones with a low start position\n// come first, and within a set with the same start position, those\n// with an smaller end position come first.\nfunction byPos(a, b) {\n return a.from - b.from || a.to - b.to\n}\n\n// : ([Decoration]) → [Decoration]\n// Scan a sorted array of decorations for partially overlapping spans,\n// and split those so that only fully overlapping spans are left (to\n// make subsequent rendering easier). Will return the input array if\n// no partially overlapping spans are found (the common case).\nfunction removeOverlap(spans) {\n var working = spans;\n for (var i = 0; i < working.length - 1; i++) {\n var span = working[i];\n if (span.from != span.to) { for (var j = i + 1; j < working.length; j++) {\n var next = working[j];\n if (next.from == span.from) {\n if (next.to != span.to) {\n if (working == spans) { working = spans.slice(); }\n // Followed by a partially overlapping larger span. Split that\n // span.\n working[j] = next.copy(next.from, span.to);\n insertAhead(working, j + 1, next.copy(span.to, next.to));\n }\n continue\n } else {\n if (next.from < span.to) {\n if (working == spans) { working = spans.slice(); }\n // The end of this one overlaps with a subsequent span. Split\n // this one.\n working[i] = span.copy(span.from, next.from);\n insertAhead(working, j, span.copy(next.from, span.to));\n }\n break\n }\n } }\n }\n return working\n}\n\nfunction insertAhead(array, i, deco) {\n while (i < array.length && byPos(deco, array[i]) > 0) { i++; }\n array.splice(i, 0, deco);\n}\n\n// : (EditorView) → union\n// Get the decorations associated with the current props of a view.\nfunction viewDecorations(view) {\n var found = [];\n view.someProp(\"decorations\", function (f) {\n var result = f(view.state);\n if (result && result != empty) { found.push(result); }\n });\n if (view.cursorWrapper)\n { found.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco])); }\n return DecorationGroup.from(found)\n}\n\n// ::- An editor view manages the DOM structure that represents an\n// editable document. Its state and behavior are determined by its\n// [props](#view.DirectEditorProps).\nvar EditorView = function EditorView(place, props) {\n this._props = props;\n // :: EditorState\n // The view's current [state](#state.EditorState).\n this.state = props.state;\n\n this.dispatch = this.dispatch.bind(this);\n\n this._root = null;\n this.focused = false;\n // Kludge used to work around a Chrome bug\n this.trackWrites = null;\n\n // :: dom.Element\n // An editable DOM node containing the document. (You probably\n // should not directly interfere with its content.)\n this.dom = (place && place.mount) || document.createElement(\"div\");\n if (place) {\n if (place.appendChild) { place.appendChild(this.dom); }\n else if (place.apply) { place(this.dom); }\n else if (place.mount) { this.mounted = true; }\n }\n\n // :: bool\n // Indicates whether the editor is currently [editable](#view.EditorProps.editable).\n this.editable = getEditable(this);\n this.markCursor = null;\n this.cursorWrapper = null;\n updateCursorWrapper(this);\n this.nodeViews = buildNodeViews(this);\n this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this);\n\n this.lastSelectedViewDesc = null;\n // :: ?{slice: Slice, move: bool}\n // When editor content is being dragged, this object contains\n // information about the dragged slice and whether it is being\n // copied or moved. At any other time, it is null.\n this.dragging = null;\n\n initInput(this);\n\n this.pluginViews = [];\n this.updatePluginViews();\n};\n\nvar prototypeAccessors$2 = { props: { configurable: true },root: { configurable: true } };\n\n// composing:: boolean\n// Holds `true` when a\n// [composition](https://developer.mozilla.org/en-US/docs/Mozilla/IME_handling_guide)\n// is active.\n\n// :: DirectEditorProps\n// The view's current [props](#view.EditorProps).\nprototypeAccessors$2.props.get = function () {\n if (this._props.state != this.state) {\n var prev = this._props;\n this._props = {};\n for (var name in prev) { this._props[name] = prev[name]; }\n this._props.state = this.state;\n }\n return this._props\n};\n\n// :: (DirectEditorProps)\n// Update the view's props. Will immediately cause an update to\n// the DOM.\nEditorView.prototype.update = function update (props) {\n if (props.handleDOMEvents != this._props.handleDOMEvents) { ensureListeners(this); }\n this._props = props;\n this.updateStateInner(props.state, true);\n};\n\n// :: (DirectEditorProps)\n// Update the view by updating existing props object with the object\n// given as argument. Equivalent to `view.update(Object.assign({},\n// view.props, props))`.\nEditorView.prototype.setProps = function setProps (props) {\n var updated = {};\n for (var name in this._props) { updated[name] = this._props[name]; }\n updated.state = this.state;\n for (var name$1 in props) { updated[name$1] = props[name$1]; }\n this.update(updated);\n};\n\n// :: (EditorState)\n// Update the editor's `state` prop, without touching any of the\n// other props.\nEditorView.prototype.updateState = function updateState (state) {\n this.updateStateInner(state, this.state.plugins != state.plugins);\n};\n\nEditorView.prototype.updateStateInner = function updateStateInner (state, reconfigured) {\n var this$1 = this;\n\n var prev = this.state, redraw = false, updateSel = false;\n // When stored marks are added, stop composition, so that they can\n // be displayed.\n if (state.storedMarks && this.composing) {\n clearComposition(this);\n updateSel = true;\n }\n this.state = state;\n if (reconfigured) {\n var nodeViews = buildNodeViews(this);\n if (changedNodeViews(nodeViews, this.nodeViews)) {\n this.nodeViews = nodeViews;\n redraw = true;\n }\n ensureListeners(this);\n }\n\n this.editable = getEditable(this);\n updateCursorWrapper(this);\n var innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this);\n\n var scroll = reconfigured ? \"reset\"\n : state.scrollToSelection > prev.scrollToSelection ? \"to selection\" : \"preserve\";\n var updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco);\n if (updateDoc || !state.selection.eq(prev.selection)) { updateSel = true; }\n var oldScrollPos = scroll == \"preserve\" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this);\n\n if (updateSel) {\n this.domObserver.stop();\n // Work around an issue in Chrome, IE, and Edge where changing\n // the DOM around an active selection puts it into a broken\n // state where the thing the user sees differs from the\n // selection reported by the Selection object (#710, #973,\n // #1011, #1013, #1035).\n var forceSelUpdate = updateDoc && (result.ie || result.chrome) && !this.composing &&\n !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection);\n if (updateDoc) {\n // If the node that the selection points into is written to,\n // Chrome sometimes starts misreporting the selection, so this\n // tracks that and forces a selection reset when our update\n // did write to the node.\n var chromeKludge = result.chrome ? (this.trackWrites = this.root.getSelection().focusNode) : null;\n if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) {\n this.docView.updateOuterDeco([]);\n this.docView.destroy();\n this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this);\n }\n if (chromeKludge && !this.trackWrites) { forceSelUpdate = true; }\n }\n // Work around for an issue where an update arriving right between\n // a DOM selection change and the \"selectionchange\" event for it\n // can cause a spurious DOM selection update, disrupting mouse\n // drag selection.\n if (forceSelUpdate ||\n !(this.mouseDown && this.domObserver.currentSelection.eq(this.root.getSelection()) && anchorInRightPlace(this))) {\n selectionToDOM(this, forceSelUpdate);\n } else {\n syncNodeSelection(this, state.selection);\n this.domObserver.setCurSelection();\n }\n this.domObserver.start();\n }\n\n this.updatePluginViews(prev);\n\n if (scroll == \"reset\") {\n this.dom.scrollTop = 0;\n } else if (scroll == \"to selection\") {\n var startDOM = this.root.getSelection().focusNode;\n if (this.someProp(\"handleScrollToSelection\", function (f) { return f(this$1); }))\n ; // Handled\n else if (state.selection instanceof NodeSelection)\n { scrollRectIntoView(this, this.docView.domAfterPos(state.selection.from).getBoundingClientRect(), startDOM); }\n else\n { scrollRectIntoView(this, this.coordsAtPos(state.selection.head, 1), startDOM); }\n } else if (oldScrollPos) {\n resetScrollPos(oldScrollPos);\n }\n};\n\nEditorView.prototype.destroyPluginViews = function destroyPluginViews () {\n var view;\n while (view = this.pluginViews.pop()) { if (view.destroy) { view.destroy(); } }\n};\n\nEditorView.prototype.updatePluginViews = function updatePluginViews (prevState) {\n if (!prevState || prevState.plugins != this.state.plugins) {\n this.destroyPluginViews();\n for (var i = 0; i < this.state.plugins.length; i++) {\n var plugin = this.state.plugins[i];\n if (plugin.spec.view) { this.pluginViews.push(plugin.spec.view(this)); }\n }\n } else {\n for (var i$1 = 0; i$1 < this.pluginViews.length; i$1++) {\n var pluginView = this.pluginViews[i$1];\n if (pluginView.update) { pluginView.update(this, prevState); }\n }\n }\n};\n\n// :: (string, ?(prop: *) → *) → *\n// Goes over the values of a prop, first those provided directly,\n// then those from plugins (in order), and calls `f` every time a\n// non-undefined value is found. When `f` returns a truthy value,\n// that is immediately returned. When `f` isn't provided, it is\n// treated as the identity function (the prop value is returned\n// directly).\nEditorView.prototype.someProp = function someProp (propName, f) {\n var prop = this._props && this._props[propName], value;\n if (prop != null && (value = f ? f(prop) : prop)) { return value }\n var plugins = this.state.plugins;\n if (plugins) { for (var i = 0; i < plugins.length; i++) {\n var prop$1 = plugins[i].props[propName];\n if (prop$1 != null && (value = f ? f(prop$1) : prop$1)) { return value }\n } }\n};\n\n// :: () → bool\n// Query whether the view has focus.\nEditorView.prototype.hasFocus = function hasFocus () {\n return this.root.activeElement == this.dom\n};\n\n// :: ()\n// Focus the editor.\nEditorView.prototype.focus = function focus () {\n this.domObserver.stop();\n if (this.editable) { focusPreventScroll(this.dom); }\n selectionToDOM(this);\n this.domObserver.start();\n};\n\n// :: union\n// Get the document root in which the editor exists. This will\n// usually be the top-level `document`, but might be a [shadow\n// DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM)\n// root if the editor is inside one.\nprototypeAccessors$2.root.get = function () {\n var cached = this._root;\n if (cached == null) { for (var search = this.dom.parentNode; search; search = search.parentNode) {\n if (search.nodeType == 9 || (search.nodeType == 11 && search.host)) {\n if (!search.getSelection) { Object.getPrototypeOf(search).getSelection = function () { return document.getSelection(); }; }\n return this._root = search\n }\n } }\n return cached || document\n};\n\n// :: ({left: number, top: number}) → ?{pos: number, inside: number}\n// Given a pair of viewport coordinates, return the document\n// position that corresponds to them. May return null if the given\n// coordinates aren't inside of the editor. When an object is\n// returned, its `pos` property is the position nearest to the\n// coordinates, and its `inside` property holds the position of the\n// inner node that the position falls inside of, or -1 if it is at\n// the top level, not in any node.\nEditorView.prototype.posAtCoords = function posAtCoords$1 (coords) {\n return posAtCoords(this, coords)\n};\n\n// :: (number, number) → {left: number, right: number, top: number, bottom: number}\n// Returns the viewport rectangle at a given document position.\n// `left` and `right` will be the same number, as this returns a\n// flat cursor-ish rectangle. If the position is between two things\n// that aren't directly adjacent, `side` determines which element is\n// used. When < 0, the element before the position is used,\n// otherwise the element after.\nEditorView.prototype.coordsAtPos = function coordsAtPos$1 (pos, side) {\n if ( side === void 0 ) side = 1;\n\n return coordsAtPos(this, pos, side)\n};\n\n// :: (number, number) → {node: dom.Node, offset: number}\n// Find the DOM position that corresponds to the given document\n// position. When `side` is negative, find the position as close as\n// possible to the content before the position. When positive,\n// prefer positions close to the content after the position. When\n// zero, prefer as shallow a position as possible.\n//\n// Note that you should **not** mutate the editor's internal DOM,\n// only inspect it (and even that is usually not necessary).\nEditorView.prototype.domAtPos = function domAtPos (pos, side) {\n if ( side === void 0 ) side = 0;\n\n return this.docView.domFromPos(pos, side)\n};\n\n// :: (number) → ?dom.Node\n// Find the DOM node that represents the document node after the\n// given position. May return `null` when the position doesn't point\n// in front of a node or if the node is inside an opaque node view.\n//\n// This is intended to be able to call things like\n// `getBoundingClientRect` on that DOM node. Do **not** mutate the\n// editor DOM directly, or add styling this way, since that will be\n// immediately overriden by the editor as it redraws the node.\nEditorView.prototype.nodeDOM = function nodeDOM (pos) {\n var desc = this.docView.descAt(pos);\n return desc ? desc.nodeDOM : null\n};\n\n// :: (dom.Node, number, ?number) → number\n// Find the document position that corresponds to a given DOM\n// position. (Whenever possible, it is preferable to inspect the\n// document structure directly, rather than poking around in the\n// DOM, but sometimes—for example when interpreting an event\n// target—you don't have a choice.)\n//\n// The `bias` parameter can be used to influence which side of a DOM\n// node to use when the position is inside a leaf node.\nEditorView.prototype.posAtDOM = function posAtDOM (node, offset, bias) {\n if ( bias === void 0 ) bias = -1;\n\n var pos = this.docView.posFromDOM(node, offset, bias);\n if (pos == null) { throw new RangeError(\"DOM position not inside the editor\") }\n return pos\n};\n\n// :: (union<\"up\", \"down\", \"left\", \"right\", \"forward\", \"backward\">, ?EditorState) → bool\n// Find out whether the selection is at the end of a textblock when\n// moving in a given direction. When, for example, given `\"left\"`,\n// it will return true if moving left from the current cursor\n// position would leave that position's parent textblock. Will apply\n// to the view's current state by default, but it is possible to\n// pass a different state.\nEditorView.prototype.endOfTextblock = function endOfTextblock$1 (dir, state) {\n return endOfTextblock(this, state || this.state, dir)\n};\n\n// :: ()\n// Removes the editor from the DOM and destroys all [node\n// views](#view.NodeView).\nEditorView.prototype.destroy = function destroy () {\n if (!this.docView) { return }\n destroyInput(this);\n this.destroyPluginViews();\n if (this.mounted) {\n this.docView.update(this.state.doc, [], viewDecorations(this), this);\n this.dom.textContent = \"\";\n } else if (this.dom.parentNode) {\n this.dom.parentNode.removeChild(this.dom);\n }\n this.docView.destroy();\n this.docView = null;\n};\n\n// Used for testing.\nEditorView.prototype.dispatchEvent = function dispatchEvent$1 (event) {\n return dispatchEvent(this, event)\n};\n\n// :: (Transaction)\n// Dispatch a transaction. Will call\n// [`dispatchTransaction`](#view.DirectEditorProps.dispatchTransaction)\n// when given, and otherwise defaults to applying the transaction to\n// the current state and calling\n// [`updateState`](#view.EditorView.updateState) with the result.\n// This method is bound to the view instance, so that it can be\n// easily passed around.\nEditorView.prototype.dispatch = function dispatch (tr) {\n var dispatchTransaction = this._props.dispatchTransaction;\n if (dispatchTransaction) { dispatchTransaction.call(this, tr); }\n else { this.updateState(this.state.apply(tr)); }\n};\n\nObject.defineProperties( EditorView.prototype, prototypeAccessors$2 );\n\nfunction computeDocDeco(view) {\n var attrs = Object.create(null);\n attrs.class = \"ProseMirror\";\n attrs.contenteditable = String(view.editable);\n\n view.someProp(\"attributes\", function (value) {\n if (typeof value == \"function\") { value = value(view.state); }\n if (value) { for (var attr in value) {\n if (attr == \"class\")\n { attrs.class += \" \" + value[attr]; }\n else if (!attrs[attr] && attr != \"contenteditable\" && attr != \"nodeName\")\n { attrs[attr] = String(value[attr]); }\n } }\n });\n\n return [Decoration.node(0, view.state.doc.content.size, attrs)]\n}\n\nfunction updateCursorWrapper(view) {\n if (view.markCursor) {\n var dom = document.createElement(\"img\");\n dom.setAttribute(\"mark-placeholder\", \"true\");\n view.cursorWrapper = {dom: dom, deco: Decoration.widget(view.state.selection.head, dom, {raw: true, marks: view.markCursor})};\n } else {\n view.cursorWrapper = null;\n }\n}\n\nfunction getEditable(view) {\n return !view.someProp(\"editable\", function (value) { return value(view.state) === false; })\n}\n\nfunction selectionContextChanged(sel1, sel2) {\n var depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head));\n return sel1.$anchor.start(depth) != sel2.$anchor.start(depth)\n}\n\nfunction buildNodeViews(view) {\n var result = {};\n view.someProp(\"nodeViews\", function (obj) {\n for (var prop in obj) { if (!Object.prototype.hasOwnProperty.call(result, prop))\n { result[prop] = obj[prop]; } }\n });\n return result\n}\n\nfunction changedNodeViews(a, b) {\n var nA = 0, nB = 0;\n for (var prop in a) {\n if (a[prop] != b[prop]) { return true }\n nA++;\n }\n for (var _ in b) { nB++; }\n return nA != nB\n}\n\n// EditorProps:: interface\n//\n// Props are configuration values that can be passed to an editor view\n// or included in a plugin. This interface lists the supported props.\n//\n// The various event-handling functions may all return `true` to\n// indicate that they handled the given event. The view will then take\n// care to call `preventDefault` on the event, except with\n// `handleDOMEvents`, where the handler itself is responsible for that.\n//\n// How a prop is resolved depends on the prop. Handler functions are\n// called one at a time, starting with the base props and then\n// searching through the plugins (in order of appearance) until one of\n// them returns true. For some props, the first plugin that yields a\n// value gets precedence.\n//\n// handleDOMEvents:: ?Object<(view: EditorView, event: dom.Event) → bool>\n// Can be an object mapping DOM event type names to functions that\n// handle them. Such functions will be called before any handling\n// ProseMirror does of events fired on the editable DOM element.\n// Contrary to the other event handling props, when returning true\n// from such a function, you are responsible for calling\n// `preventDefault` yourself (or not, if you want to allow the\n// default behavior).\n//\n// handleKeyDown:: ?(view: EditorView, event: dom.KeyboardEvent) → bool\n// Called when the editor receives a `keydown` event.\n//\n// handleKeyPress:: ?(view: EditorView, event: dom.KeyboardEvent) → bool\n// Handler for `keypress` events.\n//\n// handleTextInput:: ?(view: EditorView, from: number, to: number, text: string) → bool\n// Whenever the user directly input text, this handler is called\n// before the input is applied. If it returns `true`, the default\n// behavior of actually inserting the text is suppressed.\n//\n// handleClickOn:: ?(view: EditorView, pos: number, node: Node, nodePos: number, event: dom.MouseEvent, direct: bool) → bool\n// Called for each node around a click, from the inside out. The\n// `direct` flag will be true for the inner node.\n//\n// handleClick:: ?(view: EditorView, pos: number, event: dom.MouseEvent) → bool\n// Called when the editor is clicked, after `handleClickOn` handlers\n// have been called.\n//\n// handleDoubleClickOn:: ?(view: EditorView, pos: number, node: Node, nodePos: number, event: dom.MouseEvent, direct: bool) → bool\n// Called for each node around a double click.\n//\n// handleDoubleClick:: ?(view: EditorView, pos: number, event: dom.MouseEvent) → bool\n// Called when the editor is double-clicked, after `handleDoubleClickOn`.\n//\n// handleTripleClickOn:: ?(view: EditorView, pos: number, node: Node, nodePos: number, event: dom.MouseEvent, direct: bool) → bool\n// Called for each node around a triple click.\n//\n// handleTripleClick:: ?(view: EditorView, pos: number, event: dom.MouseEvent) → bool\n// Called when the editor is triple-clicked, after `handleTripleClickOn`.\n//\n// handlePaste:: ?(view: EditorView, event: dom.ClipboardEvent, slice: Slice) → bool\n// Can be used to override the behavior of pasting. `slice` is the\n// pasted content parsed by the editor, but you can directly access\n// the event to get at the raw content.\n//\n// handleDrop:: ?(view: EditorView, event: dom.Event, slice: Slice, moved: bool) → bool\n// Called when something is dropped on the editor. `moved` will be\n// true if this drop moves from the current selection (which should\n// thus be deleted).\n//\n// handleScrollToSelection:: ?(view: EditorView) → bool\n// Called when the view, after updating its state, tries to scroll\n// the selection into view. A handler function may return false to\n// indicate that it did not handle the scrolling and further\n// handlers or the default behavior should be tried.\n//\n// createSelectionBetween:: ?(view: EditorView, anchor: ResolvedPos, head: ResolvedPos) → ?Selection\n// Can be used to override the way a selection is created when\n// reading a DOM selection between the given anchor and head.\n//\n// domParser:: ?DOMParser\n// The [parser](#model.DOMParser) to use when reading editor changes\n// from the DOM. Defaults to calling\n// [`DOMParser.fromSchema`](#model.DOMParser^fromSchema) on the\n// editor's schema.\n//\n// transformPastedHTML:: ?(html: string) → string\n// Can be used to transform pasted HTML text, _before_ it is parsed,\n// for example to clean it up.\n//\n// clipboardParser:: ?DOMParser\n// The [parser](#model.DOMParser) to use when reading content from\n// the clipboard. When not given, the value of the\n// [`domParser`](#view.EditorProps.domParser) prop is used.\n//\n// transformPastedText:: ?(text: string, plain: bool) → string\n// Transform pasted plain text. The `plain` flag will be true when\n// the text is pasted as plain text.\n//\n// clipboardTextParser:: ?(text: string, $context: ResolvedPos, plain: bool) → Slice\n// A function to parse text from the clipboard into a document\n// slice. Called after\n// [`transformPastedText`](#view.EditorProps.transformPastedText).\n// The default behavior is to split the text into lines, wrap them\n// in `

          ` tags, and call\n// [`clipboardParser`](#view.EditorProps.clipboardParser) on it.\n// The `plain` flag will be true when the text is pasted as plain text.\n//\n// transformPasted:: ?(Slice) → Slice\n// Can be used to transform pasted content before it is applied to\n// the document.\n//\n// nodeViews:: ?Object<(node: Node, view: EditorView, getPos: () → number, decorations: [Decoration]) → NodeView>\n// Allows you to pass custom rendering and behavior logic for nodes\n// and marks. Should map node and mark names to constructor\n// functions that produce a [`NodeView`](#view.NodeView) object\n// implementing the node's display behavior. For nodes, the third\n// argument `getPos` is a function that can be called to get the\n// node's current position, which can be useful when creating\n// transactions to update it. For marks, the third argument is a\n// boolean that indicates whether the mark's content is inline.\n//\n// `decorations` is an array of node or inline decorations that are\n// active around the node. They are automatically drawn in the\n// normal way, and you will usually just want to ignore this, but\n// they can also be used as a way to provide context information to\n// the node view without adding it to the document itself.\n//\n// clipboardSerializer:: ?DOMSerializer\n// The DOM serializer to use when putting content onto the\n// clipboard. If not given, the result of\n// [`DOMSerializer.fromSchema`](#model.DOMSerializer^fromSchema)\n// will be used.\n//\n// clipboardTextSerializer:: ?(Slice) → string\n// A function that will be called to get the text for the current\n// selection when copying text to the clipboard. By default, the\n// editor will use [`textBetween`](#model.Node.textBetween) on the\n// selected range.\n//\n// decorations:: ?(state: EditorState) → ?DecorationSet\n// A set of [document decorations](#view.Decoration) to show in the\n// view.\n//\n// editable:: ?(state: EditorState) → bool\n// When this returns false, the content of the view is not directly\n// editable.\n//\n// attributes:: ?union, (EditorState) → ?Object>\n// Control the DOM attributes of the editable element. May be either\n// an object or a function going from an editor state to an object.\n// By default, the element will get a class `\"ProseMirror\"`, and\n// will have its `contentEditable` attribute determined by the\n// [`editable` prop](#view.EditorProps.editable). Additional classes\n// provided here will be added to the class. For other attributes,\n// the value provided first (as in\n// [`someProp`](#view.EditorView.someProp)) will be used.\n//\n// scrollThreshold:: ?union\n// Determines the distance (in pixels) between the cursor and the\n// end of the visible viewport at which point, when scrolling the\n// cursor into view, scrolling takes place. Defaults to 0.\n//\n// scrollMargin:: ?union\n// Determines the extra space (in pixels) that is left above or\n// below the cursor when it is scrolled into view. Defaults to 5.\n\n// DirectEditorProps:: interface extends EditorProps\n//\n// The props object given directly to the editor view supports two\n// fields that can't be used in plugins:\n//\n// state:: EditorState\n// The current state of the editor.\n//\n// dispatchTransaction:: ?(tr: Transaction)\n// The callback over which to send transactions (state updates)\n// produced by the view. If you specify this, you probably want to\n// make sure this ends up calling the view's\n// [`updateState`](#view.EditorView.updateState) method with a new\n// state that has the transaction\n// [applied](#state.EditorState.apply). The callback will be bound to have\n// the view instance as its `this` binding.\n\nexport { Decoration, DecorationSet, EditorView, endComposition as __endComposition, parseFromClipboard as __parseFromClipboard, serializeForClipboard as __serializeForClipboard };\n//# sourceMappingURL=index.es.js.map\n","import { Plugin } from 'prosemirror-state';\nimport { dropPoint } from 'prosemirror-transform';\n\n// :: (options: ?Object) → Plugin\n// Create a plugin that, when added to a ProseMirror instance,\n// causes a decoration to show up at the drop position when something\n// is dragged over the editor.\n//\n// options::- These options are supported:\n//\n// color:: ?string\n// The color of the cursor. Defaults to `black`.\n//\n// width:: ?number\n// The precise width of the cursor in pixels. Defaults to 1.\n//\n// class:: ?string\n// A CSS class name to add to the cursor element.\nfunction dropCursor(options) {\n if ( options === void 0 ) options = {};\n\n return new Plugin({\n view: function view(editorView) { return new DropCursorView(editorView, options) }\n })\n}\n\nvar DropCursorView = function DropCursorView(editorView, options) {\n var this$1 = this;\n\n this.editorView = editorView;\n this.width = options.width || 1;\n this.color = options.color || \"black\";\n this.class = options.class;\n this.cursorPos = null;\n this.element = null;\n this.timeout = null;\n\n this.handlers = [\"dragover\", \"dragend\", \"drop\", \"dragleave\"].map(function (name) {\n var handler = function (e) { return this$1[name](e); };\n editorView.dom.addEventListener(name, handler);\n return {name: name, handler: handler}\n });\n};\n\nDropCursorView.prototype.destroy = function destroy () {\n var this$1 = this;\n\n this.handlers.forEach(function (ref) {\n var name = ref.name;\n var handler = ref.handler;\n\n return this$1.editorView.dom.removeEventListener(name, handler);\n });\n};\n\nDropCursorView.prototype.update = function update (editorView, prevState) {\n if (this.cursorPos != null && prevState.doc != editorView.state.doc) { this.updateOverlay(); }\n};\n\nDropCursorView.prototype.setCursor = function setCursor (pos) {\n if (pos == this.cursorPos) { return }\n this.cursorPos = pos;\n if (pos == null) {\n this.element.parentNode.removeChild(this.element);\n this.element = null;\n } else {\n this.updateOverlay();\n }\n};\n\nDropCursorView.prototype.updateOverlay = function updateOverlay () {\n var $pos = this.editorView.state.doc.resolve(this.cursorPos), rect;\n if (!$pos.parent.inlineContent) {\n var before = $pos.nodeBefore, after = $pos.nodeAfter;\n if (before || after) {\n var nodeRect = this.editorView.nodeDOM(this.cursorPos - (before ?before.nodeSize : 0)).getBoundingClientRect();\n var top = before ? nodeRect.bottom : nodeRect.top;\n if (before && after)\n { top = (top + this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top) / 2; }\n rect = {left: nodeRect.left, right: nodeRect.right, top: top - this.width / 2, bottom: top + this.width / 2};\n }\n }\n if (!rect) {\n var coords = this.editorView.coordsAtPos(this.cursorPos);\n rect = {left: coords.left - this.width / 2, right: coords.left + this.width / 2, top: coords.top, bottom: coords.bottom};\n }\n\n var parent = this.editorView.dom.offsetParent;\n if (!this.element) {\n this.element = parent.appendChild(document.createElement(\"div\"));\n if (this.class) { this.element.className = this.class; }\n this.element.style.cssText = \"position: absolute; z-index: 50; pointer-events: none; background-color: \" + this.color;\n }\n var parentLeft, parentTop;\n if (!parent || parent == document.body && getComputedStyle(parent).position == \"static\") {\n parentLeft = -pageXOffset;\n parentTop = -pageYOffset;\n } else {\n var rect$1 = parent.getBoundingClientRect();\n parentLeft = rect$1.left - parent.scrollLeft;\n parentTop = rect$1.top - parent.scrollTop;\n }\n this.element.style.left = (rect.left - parentLeft) + \"px\";\n this.element.style.top = (rect.top - parentTop) + \"px\";\n this.element.style.width = (rect.right - rect.left) + \"px\";\n this.element.style.height = (rect.bottom - rect.top) + \"px\";\n};\n\nDropCursorView.prototype.scheduleRemoval = function scheduleRemoval (timeout) {\n var this$1 = this;\n\n clearTimeout(this.timeout);\n this.timeout = setTimeout(function () { return this$1.setCursor(null); }, timeout);\n};\n\nDropCursorView.prototype.dragover = function dragover (event) {\n if (!this.editorView.editable) { return }\n var pos = this.editorView.posAtCoords({left: event.clientX, top: event.clientY});\n if (pos) {\n var target = pos.pos;\n if (this.editorView.dragging && this.editorView.dragging.slice) {\n target = dropPoint(this.editorView.state.doc, target, this.editorView.dragging.slice);\n if (target == null) { target = pos.pos; }\n }\n this.setCursor(target);\n this.scheduleRemoval(5000);\n }\n};\n\nDropCursorView.prototype.dragend = function dragend () {\n this.scheduleRemoval(20);\n};\n\nDropCursorView.prototype.drop = function drop () {\n this.scheduleRemoval(20);\n};\n\nDropCursorView.prototype.dragleave = function dragleave (event) {\n if (event.target == this.editorView.dom || !this.editorView.dom.contains(event.relatedTarget))\n { this.setCursor(null); }\n};\n\nexport { dropCursor };\n//# sourceMappingURL=index.es.js.map\n","import { keydownHandler } from 'prosemirror-keymap';\nimport { NodeSelection, Selection, Plugin, TextSelection } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Slice } from 'prosemirror-model';\n\n// ::- Gap cursor selections are represented using this class. Its\n// `$anchor` and `$head` properties both point at the cursor position.\nvar GapCursor = /*@__PURE__*/(function (Selection) {\n function GapCursor($pos) {\n Selection.call(this, $pos, $pos);\n }\n\n if ( Selection ) GapCursor.__proto__ = Selection;\n GapCursor.prototype = Object.create( Selection && Selection.prototype );\n GapCursor.prototype.constructor = GapCursor;\n\n GapCursor.prototype.map = function map (doc, mapping) {\n var $pos = doc.resolve(mapping.map(this.head));\n return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos)\n };\n\n GapCursor.prototype.content = function content () { return Slice.empty };\n\n GapCursor.prototype.eq = function eq (other) {\n return other instanceof GapCursor && other.head == this.head\n };\n\n GapCursor.prototype.toJSON = function toJSON () {\n return {type: \"gapcursor\", pos: this.head}\n };\n\n GapCursor.fromJSON = function fromJSON (doc, json) {\n if (typeof json.pos != \"number\") { throw new RangeError(\"Invalid input for GapCursor.fromJSON\") }\n return new GapCursor(doc.resolve(json.pos))\n };\n\n GapCursor.prototype.getBookmark = function getBookmark () { return new GapBookmark(this.anchor) };\n\n GapCursor.valid = function valid ($pos) {\n var parent = $pos.parent;\n if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos)) { return false }\n var override = parent.type.spec.allowGapCursor;\n if (override != null) { return override }\n var deflt = parent.contentMatchAt($pos.index()).defaultType;\n return deflt && deflt.isTextblock\n };\n\n GapCursor.findFrom = function findFrom ($pos, dir, mustMove) {\n search: for (;;) {\n if (!mustMove && GapCursor.valid($pos)) { return $pos }\n var pos = $pos.pos, next = null;\n // Scan up from this position\n for (var d = $pos.depth;; d--) {\n var parent = $pos.node(d);\n if (dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0) {\n next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1);\n break\n } else if (d == 0) {\n return null\n }\n pos += dir;\n var $cur = $pos.doc.resolve(pos);\n if (GapCursor.valid($cur)) { return $cur }\n }\n\n // And then down into the next node\n for (;;) {\n var inside = dir > 0 ? next.firstChild : next.lastChild;\n if (!inside) {\n if (next.isAtom && !next.isText && !NodeSelection.isSelectable(next)) {\n $pos = $pos.doc.resolve(pos + next.nodeSize * dir);\n mustMove = false;\n continue search\n }\n break\n }\n next = inside;\n pos += dir;\n var $cur$1 = $pos.doc.resolve(pos);\n if (GapCursor.valid($cur$1)) { return $cur$1 }\n }\n\n return null\n }\n };\n\n return GapCursor;\n}(Selection));\n\nGapCursor.prototype.visible = false;\n\nSelection.jsonID(\"gapcursor\", GapCursor);\n\nvar GapBookmark = function GapBookmark(pos) {\n this.pos = pos;\n};\nGapBookmark.prototype.map = function map (mapping) {\n return new GapBookmark(mapping.map(this.pos))\n};\nGapBookmark.prototype.resolve = function resolve (doc) {\n var $pos = doc.resolve(this.pos);\n return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos)\n};\n\nfunction closedBefore($pos) {\n for (var d = $pos.depth; d >= 0; d--) {\n var index = $pos.index(d);\n // At the start of this parent, look at next one\n if (index == 0) { continue }\n // See if the node before (or its first ancestor) is closed\n for (var before = $pos.node(d).child(index - 1);; before = before.lastChild) {\n if ((before.childCount == 0 && !before.inlineContent) || before.isAtom || before.type.spec.isolating) { return true }\n if (before.inlineContent) { return false }\n }\n }\n // Hit start of document\n return true\n}\n\nfunction closedAfter($pos) {\n for (var d = $pos.depth; d >= 0; d--) {\n var index = $pos.indexAfter(d), parent = $pos.node(d);\n if (index == parent.childCount) { continue }\n for (var after = parent.child(index);; after = after.firstChild) {\n if ((after.childCount == 0 && !after.inlineContent) || after.isAtom || after.type.spec.isolating) { return true }\n if (after.inlineContent) { return false }\n }\n }\n return true\n}\n\n// :: () → Plugin\n// Create a gap cursor plugin. When enabled, this will capture clicks\n// near and arrow-key-motion past places that don't have a normally\n// selectable position nearby, and create a gap cursor selection for\n// them. The cursor is drawn as an element with class\n// `ProseMirror-gapcursor`. You can either include\n// `style/gapcursor.css` from the package's directory or add your own\n// styles to make it visible.\nvar gapCursor = function() {\n return new Plugin({\n props: {\n decorations: drawGapCursor,\n\n createSelectionBetween: function createSelectionBetween(_view, $anchor, $head) {\n if ($anchor.pos == $head.pos && GapCursor.valid($head)) { return new GapCursor($head) }\n },\n\n handleClick: handleClick,\n handleKeyDown: handleKeyDown\n }\n })\n};\n\nvar handleKeyDown = keydownHandler({\n \"ArrowLeft\": arrow(\"horiz\", -1),\n \"ArrowRight\": arrow(\"horiz\", 1),\n \"ArrowUp\": arrow(\"vert\", -1),\n \"ArrowDown\": arrow(\"vert\", 1)\n});\n\nfunction arrow(axis, dir) {\n var dirStr = axis == \"vert\" ? (dir > 0 ? \"down\" : \"up\") : (dir > 0 ? \"right\" : \"left\");\n return function(state, dispatch, view) {\n var sel = state.selection;\n var $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty;\n if (sel instanceof TextSelection) {\n if (!view.endOfTextblock(dirStr) || $start.depth == 0) { return false }\n mustMove = false;\n $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before());\n }\n var $found = GapCursor.findFrom($start, dir, mustMove);\n if (!$found) { return false }\n if (dispatch) { dispatch(state.tr.setSelection(new GapCursor($found))); }\n return true\n }\n}\n\nfunction handleClick(view, pos, event) {\n if (!view.editable) { return false }\n var $pos = view.state.doc.resolve(pos);\n if (!GapCursor.valid($pos)) { return false }\n var ref = view.posAtCoords({left: event.clientX, top: event.clientY});\n var inside = ref.inside;\n if (inside > -1 && NodeSelection.isSelectable(view.state.doc.nodeAt(inside))) { return false }\n view.dispatch(view.state.tr.setSelection(new GapCursor($pos)));\n return true\n}\n\nfunction drawGapCursor(state) {\n if (!(state.selection instanceof GapCursor)) { return null }\n var node = document.createElement(\"div\");\n node.className = \"ProseMirror-gapcursor\";\n return DecorationSet.create(state.doc, [Decoration.widget(state.selection.head, node, {key: \"gapcursor\"})])\n}\n\nexport { GapCursor, gapCursor };\n//# sourceMappingURL=index.es.js.map\n","import { Plugin } from 'prosemirror-state';\n\n// From https://gist.github.com/khanzadimahdi/bab8a3416bdb764b9eda5b38b35735b8\nconst dataImageRegex = /^data:((?:\\w+\\/(?:(?!;).)+)?)((?:;[\\w\\W]*?[^;])*),(.+)$/;\n\nlet parser = new DOMParser();\n\nexport default function disableBase64PastePlugin() {\n return new Plugin({\n props: {\n transformPastedHTML(html) {\n const doc = parser.parseFromString(html, 'text/html');\n doc.querySelectorAll('img').forEach((node) => {\n if (dataImageRegex.test(node.src)) {\n node.remove();\n }\n });\n\n return doc.documentElement.outerHTML;\n },\n },\n });\n}\n","import { Plugin } from 'prosemirror-state';\n\nfunction onClick(schema) {\n return (view, pos, node, nodePos, event, direct) => {\n if (direct && node.type === schema.nodes.spoiler && event.target.tagName !== 'P') {\n // TODO: Figure out why this dispatch event isn't working.\n // Mutating the node directly isn't good practice.\n // view.dispatch(\n // view.state.tr.setNodeMarkup(pos, null, { open: false })\n // );\n node.attrs.open = !node.attrs.open;\n view.focus();\n event.stopPropagation();\n event.preventDefault();\n return false;\n }\n };\n}\n\nexport default function toggleSpoiler(schema) {\n return new Plugin({\n props: {\n handleClickOn: onClick(schema),\n handleDoubleClickOn: onClick(schema),\n },\n });\n}\n","import { inputRules, wrappingInputRule, textblockTypeInputRule, emDash, ellipsis } from 'prosemirror-inputrules';\nimport { markInputRule, nodeInputRule } from 'tiptap-commands';\n\n// Copied from https://github.com/ProseMirror/prosemirror-example-setup/blob/master/src/inputrules.js\n\nfunction blockQuoteRule(nodeType) {\n return wrappingInputRule(/^\\s*>\\s$/, nodeType);\n}\n\nfunction orderedListRule(nodeType) {\n return wrappingInputRule(\n /^(\\d+)(\\.|\\))\\s$/,\n nodeType,\n (match) => ({ order: +match[1] }),\n (match, node) => node.childCount + node.attrs.order == +match[1]\n );\n}\n\nfunction bulletListRule(nodeType) {\n return wrappingInputRule(/^\\s*([-+*])\\s$/, nodeType);\n}\n\nfunction codeBlockRule(nodeType) {\n return textblockTypeInputRule(/^```$/, nodeType);\n}\n\nfunction headingRule(nodeType, maxLevel) {\n return textblockTypeInputRule(new RegExp('^(#{1,' + maxLevel + '})\\\\s$'), nodeType, (match) => ({ level: match[1].length }));\n}\n\nfunction blockSpoilerRule(nodeType) {\n return wrappingInputRule(/^\\s*>!\\s$/, nodeType);\n}\n\nexport default function buildInputRules(schema) {\n const rules = [\n ellipsis,\n blockQuoteRule(schema.nodes.blockquote),\n orderedListRule(schema.nodes.ordered_list),\n bulletListRule(schema.nodes.bullet_list),\n codeBlockRule(schema.nodes.code_block),\n headingRule(schema.nodes.heading, 6),\n blockSpoilerRule(schema.nodes.spoiler),\n nodeInputRule(/(?:___\\s|\\*\\*\\*\\s|---)$/, schema.nodes.horizontal_rule),\n textblockTypeInputRule(/^\\s*\\$\\$\\s$/, schema.nodes.math_block),\n markInputRule(/(?:\\*\\*|__)([^\\*_]+)(?:\\*\\*|__)$/, schema.marks.strong),\n markInputRule(/(?:^|[^_])(_([^_]+)_)$/, schema.marks.em),\n markInputRule(/(?:^|[^*])(\\*([^*]+)\\*)$/, schema.marks.em),\n markInputRule(/(?:`)([^`]+)(?:`)$/, schema.marks.code),\n markInputRule(/(?:~~)([^~]+)(?:~~)$/, schema.marks.strike),\n markInputRule(/(?:[^~]~)([^~]+)(?:~)$/, schema.marks.sub),\n markInputRule(/(?:\\^)([^^]+)(?:\\^)$/, schema.marks.sup),\n markInputRule(/(?:\\|\\|)([^\\|]+)(?:\\|\\|)$/, schema.marks.spoiler_inline),\n markInputRule(/(?:>!)(.+)(?:!<)$/, schema.marks.spoiler_inline),\n markInputRule(/(?:\\$)([^$]+)(?:\\$)$/, schema.marks.math_inline),\n ];\n\n return rules;\n}\n","import { baseKeymap } from 'tiptap-commands';\nimport { history } from 'prosemirror-history';\nimport { keymap } from 'prosemirror-keymap';\nimport { EditorState, Selection, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { dropCursor } from 'prosemirror-dropcursor';\nimport { gapCursor } from 'prosemirror-gapcursor';\n\nimport ItemList from 'flarum/common/utils/ItemList';\nimport disabledPlugin from './plugins/disabledPlugin';\nimport disableBase64PastePlugin from './plugins/disableBase64PastePlugin';\nimport placeholderPlugin from './plugins/placeholderPlugin';\nimport menuPlugin from './plugins/menuPlugin';\nimport toggleSpoiler from './plugins/toggleSpoiler';\nimport richTextKeymap from './key-bindings';\nimport buildInputRules from './inputrules';\nimport MarkdownSerializerBuilder from './markdown/MarkdownSerializerBuilder';\nimport MarkdownParserBuilder from './markdown/MarkdownParserBuilder';\nimport SchemaBuilder from './markdown/SchemaBuilder';\nimport { inputRules } from 'prosemirror-inputrules';\n\nexport default class ProseMirrorEditorDriver {\n constructor(target, attrs) {\n this.build(target, attrs);\n }\n\n build(target, attrs) {\n this.attrs = attrs;\n this.schema = new SchemaBuilder().build();\n\n this.parser = new MarkdownParserBuilder(this.schema).build();\n this.serializer = new MarkdownSerializerBuilder(this.schema).build();\n\n this.state = EditorState.create(this.buildEditorStateConfig());\n this.view = new EditorView(target, this.buildEditorProps());\n\n const cssClasses = attrs.classNames || [];\n cssClasses.forEach((className) => this.view.dom.classList.add(className));\n\n const callInputListeners = (e) => {\n this.attrs.inputListeners.forEach((listener) => {\n listener.call(target);\n });\n\n e.redraw = false;\n };\n\n target.oninput = callInputListeners;\n target.onclick = callInputListeners;\n target.onkeyup = callInputListeners;\n }\n\n buildEditorStateConfig() {\n return {\n doc: this.parseInitialValue(this.attrs.value),\n disabled: this.attrs.disabled,\n schema: this.schema,\n plugins: this.buildPluginItems().toArray(),\n };\n }\n\n buildPluginItems() {\n const items = new ItemList();\n\n items.add('markdownInputrules', inputRules({ rules: this.buildInputRules(this.schema) }));\n\n items.add('submit', keymap({ 'Mod-Enter': this.attrs.onsubmit }));\n\n items.add('escape', keymap({ Escape: this.attrs.escape }));\n\n items.add('richTextKeymap', keymap(richTextKeymap(this.schema)));\n\n items.add('baseKeymap', keymap(baseKeymap));\n\n items.add('placeholder', placeholderPlugin(this.attrs.placeholder));\n\n items.add('history', history());\n\n items.add('disabled', disabledPlugin());\n\n items.add('disableBase64Paste', disableBase64PastePlugin());\n\n items.add('dropCursor', dropCursor());\n\n items.add('gapCursor', gapCursor());\n\n items.add('menu', menuPlugin(this.attrs.menuState));\n\n items.add('toggleSpoiler', toggleSpoiler(this.schema));\n\n return items;\n }\n\n buildEditorProps() {\n const self = this;\n\n return {\n state: this.state,\n dispatchTransaction(transaction) {\n let newState = this.state.apply(transaction);\n this.updateState(newState);\n\n const newDoc = this.state.doc;\n const newDocPlaintext = self.serializeContent(newDoc, self.schema);\n self.attrs.oninput(newDocPlaintext);\n },\n };\n }\n\n buildInputRules(schema) {\n return buildInputRules(schema);\n }\n\n parseInitialValue(text) {\n return this.parser.parse(text);\n }\n\n serializeContent(doc) {\n return this.serializer.serialize(doc, { tightLists: true });\n }\n\n // External Control Stuff\n\n /**\n * Focus the textarea and place the cursor at the given index.\n *\n * @param {number} position\n */\n moveCursorTo(position) {\n this.setSelectionRange(position, position);\n }\n\n /**\n * Get the selected range of the textarea.\n *\n * @return {Array}\n */\n getSelectionRange() {\n return [this.view.state.selection.from, this.view.state.selection.to];\n }\n\n /**\n * Get (at most) the last N characters from the current \"text block\".\n */\n getLastNChars(n) {\n const lastNode = this.view.state.selection.$from.nodeBefore;\n\n if (!lastNode || !lastNode.text) return '';\n\n return lastNode.text.slice(Math.max(0, lastNode.text.length - n));\n }\n\n /**\n * Insert content into the textarea at the position of the cursor.\n *\n * @param {String} text\n */\n insertAtCursor(text, escape) {\n this.insertAt(this.getSelectionRange()[0], text, escape);\n $(this.view.dom).trigger('click');\n }\n\n /**\n * Insert content into the textarea at the given position.\n *\n * @param {number} pos\n * @param {String} text\n */\n insertAt(pos, text, escape) {\n this.insertBetween(pos, pos, text, escape);\n }\n\n /**\n * Insert content into the textarea between the given positions.\n *\n * If the start and end positions are different, any text between them will be\n * overwritten.\n *\n * @param start\n * @param end\n * @param text\n * @param rawMarkdown\n */\n insertBetween(start, end, text, escape = true) {\n let trailingNewLines = 0;\n\n if (escape) {\n this.view.dispatch(this.view.state.tr.insertText(text, start, end));\n } else {\n start -= 1;\n this.view.dispatch(this.view.state.tr.replaceRangeWith(start, end, this.parseInitialValue(text)));\n\n trailingNewLines = text.match(/\\s+$/)[0].split('\\n').length - 1;\n }\n\n // Move the textarea cursor to the end of the content we just inserted.\n this.moveCursorTo(Math.min(start + text.length, Selection.atEnd(this.view.state.doc).to));\n m.redraw();\n\n // TODO: accomplish this in one step.\n if (text.endsWith(' ') && !escape) {\n this.insertAtCursor(' ');\n }\n\n Array(trailingNewLines)\n .fill(0)\n .forEach(() => {\n baseKeymap['Enter'](this.view.state, this.view.dispatch);\n });\n }\n\n /**\n * Replace existing content from the start to the current cursor position.\n *\n * @param start\n * @param text\n */\n replaceBeforeCursor(start, text, escape) {\n this.insertBetween(start, this.getSelectionRange()[0], text, escape);\n }\n\n /**\n * Set the selected range of the textarea.\n *\n * @param {number} start\n * @param {number} end\n * @private\n */\n setSelectionRange(start, end) {\n const $start = this.view.state.tr.doc.resolve(start);\n const $end = this.view.state.tr.doc.resolve(end);\n\n this.view.dispatch(this.view.state.tr.setSelection(new TextSelection($start, $end)));\n this.focus();\n }\n\n getCaretCoordinates(position) {\n const viewportCoords = this.view.coordsAtPos(position);\n const editorViewportOffset = this.view.dom.getBoundingClientRect();\n return {\n left: viewportCoords.left - editorViewportOffset.left,\n top: viewportCoords.top - editorViewportOffset.top,\n };\n }\n\n focus() {\n this.view.focus();\n }\n destroy() {\n this.view.destroy();\n }\n\n disabled(disabled) {\n this.view.dispatch(this.view.state.tr.setMeta('disabled', disabled));\n }\n}\n","import { Plugin } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\n\nexport default function placeholderPlugin(text) {\n return new Plugin({\n props: {\n decorations: (state) => {\n const decorations = [];\n\n if (state.doc.childCount === 1) {\n const node = state.doc.child(0);\n if (node.type.isBlock && node.childCount === 0 && node.type == state.schema.nodes.paragraph) {\n decorations.push(\n Decoration.node(0, node.nodeSize, {\n class: 'placeholder',\n 'data-before': text,\n })\n );\n }\n }\n\n return DecorationSet.create(state.doc, decorations);\n },\n },\n });\n}\n","import { Plugin } from 'prosemirror-state';\n\nexport default function menuPlugin(menuState) {\n return new Plugin({\n view(editorView) {\n menuState.attachEditorView(editorView);\n return menuState;\n },\n });\n}\n","import { redo, undo } from 'prosemirror-history';\nimport { undoInputRule } from 'prosemirror-inputrules';\nimport { TextSelection } from 'prosemirror-state';\nimport {\n chainCommands,\n exitCode,\n liftListItem,\n newlineInCode,\n setBlockType,\n sinkListItem,\n splitListItem,\n toggleList,\n toggleMark,\n wrapIn,\n} from 'tiptap-commands';\n\nexport default function richTextKeymap(schema) {\n const considerDropdown = (state, dispatch) => {\n const emojiDropdown = $('.EmojiDropdown:visible');\n const mentionsDropdown = $('.MentionsDropdown:visible');\n\n if (emojiDropdown[0] || mentionsDropdown[0]) return true;\n };\n\n const smartExitCode = (state, dispatch, view) => {\n let { $head, $anchor } = state.selection;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) return false;\n\n const nodeBefore = state.selection.$from.nodeBefore;\n const nodeAfter = state.selection.$from.nodeAfter;\n if ((!nodeBefore || nodeBefore.text.slice(-1) === '\\n') && !nodeAfter) {\n view.dispatch(view.state.tr.delete(state.selection.from - 1, state.selection.from));\n view.dispatch(view.state.tr.setSelection(TextSelection.near(view.state.doc.resolve(view.state.selection.from))));\n return exitCode(view.state, view.dispatch);\n } else {\n return newlineInCode(state, dispatch);\n }\n };\n\n const insertHardBreak = (state, dispatch) => {\n dispatch(state.tr.replaceSelectionWith(schema.nodes.hard_break.create()).scrollIntoView());\n return true;\n };\n\n const smartInsertHardBreak = (state, dispatch, view) => {\n let { $head, $anchor } = state.selection;\n if ($head.parent.type.name !== 'paragraph' || !$head.sameParent($anchor)) return false;\n\n const nodeBefore = state.selection.$from.nodeBefore;\n const nodeAfter = state.selection.$from.nodeAfter;\n\n if (nodeBefore && nodeBefore.text && nodeBefore.text.slice(-1) !== '\\n') {\n return insertHardBreak(view.state, view.dispatch);\n } else if (nodeBefore && !nodeBefore.text && !nodeAfter) {\n view.dispatch(view.state.tr.delete(state.selection.from - 1, state.selection.from));\n view.dispatch(view.state.tr.setSelection(TextSelection.near(view.state.doc.resolve(view.state.selection.from))));\n }\n };\n\n const enterCommands = [considerDropdown, splitListItem(schema.nodes.list_item), smartExitCode];\n\n if (app.session.user.preferences().richTextCompactParagraphs) {\n enterCommands.push(smartInsertHardBreak);\n }\n\n const handleEnter = chainCommands(...enterCommands);\n\n return {\n // History\n 'Mod-z': undo,\n 'Mod-y': redo,\n 'Mod-Shift-z': redo,\n Backspace: undoInputRule,\n // Formatting: Marks\n 'Mod-b': toggleMark(schema.marks.strong),\n 'Mod-i': toggleMark(schema.marks.em),\n 'Mod-`': toggleMark(schema.marks.code),\n 'Alt-Shift-5': toggleMark(schema.marks.strike),\n 'Mod-,': toggleMark(schema.marks.sub),\n 'Mod-.': toggleMark(schema.marks.sup),\n 'Mod-;': toggleMark(schema.marks.spoiler_inline),\n // Formatting: Wrap\n 'Shift-Mod-8': toggleList(schema.nodes.bullet_list),\n 'Shift-Mod-9': toggleList(schema.nodes.ordered_list),\n 'Mod-q': wrapIn(schema.nodes.blockquote),\n // Formatting: Type\n 'Shift-Ctrl-0': setBlockType(schema.nodes.paragraph),\n 'Shift-Ctrl-1': setBlockType(schema.nodes.heading, { level: 1 }),\n 'Shift-Ctrl-2': setBlockType(schema.nodes.heading, { level: 2 }),\n 'Shift-Ctrl-3': setBlockType(schema.nodes.heading, { level: 3 }),\n 'Shift-Ctrl-4': setBlockType(schema.nodes.heading, { level: 4 }),\n 'Shift-Ctrl-5': setBlockType(schema.nodes.heading, { level: 5 }),\n 'Shift-Ctrl-6': setBlockType(schema.nodes.heading, { level: 6 }),\n 'Shift-Ctrl-\\\\': setBlockType(schema.nodes.code_block),\n // Whitespace\n 'Mod-]': sinkListItem(schema.nodes.list_item),\n 'Mod-m': sinkListItem(schema.nodes.list_item),\n 'Mod-[': liftListItem(schema.nodes.list_item),\n 'Mod-Shift-m': liftListItem(schema.nodes.list_item),\n Enter: handleEnter,\n 'Shift-Enter': chainCommands(newlineInCode, insertHardBreak),\n };\n}\n","import { Plugin, PluginKey } from 'prosemirror-state';\n\nexport default function disabledPlugin(text) {\n return new Plugin({\n key: new PluginKey('disabled'),\n\n props: {\n editable: (state) => {\n return !state.disabled$;\n },\n },\n\n state: {\n init(config) {\n return config.disabled;\n },\n\n apply(tr, curr) {\n const disabled = tr.getMeta('disabled');\n\n if (disabled !== undefined) {\n return disabled;\n }\n\n return curr;\n },\n },\n });\n}\n","// COPIED FROM https://github.com/markdown-it/markdown-it/blob/master/lib/rules_inline/text.js\n// NEEDED TO ALLOW `|` as terminator character.\n\n// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\n'use strict';\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar(ch) {\n switch (ch) {\n case 0x0a /* \\n */:\n case 0x21 /* ! */:\n case 0x23 /* # */:\n case 0x24 /* $ */:\n case 0x25 /* % */:\n case 0x26 /* & */:\n case 0x2a /* * */:\n case 0x2b /* + */:\n case 0x2d /* - */:\n case 0x3a /* : */:\n case 0x3c /* < */:\n case 0x3d /* = */:\n case 0x3e /* > */:\n case 0x40 /* @ */:\n case 0x5b /* [ */:\n case 0x5c /* \\ */:\n case 0x5d /* ] */:\n case 0x5e /* ^ */:\n case 0x5f /* _ */:\n case 0x60 /* ` */:\n case 0x7b /* { */:\n case 0x7c /* | */:\n case 0x7d /* } */:\n case 0x7e /* ~ */:\n return true;\n default:\n return false;\n }\n}\n\nconst tokenize = (state, silent) => {\n var pos = state.pos;\n\n while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n pos++;\n }\n\n if (pos === state.pos) {\n return false;\n }\n\n if (!silent) {\n state.pending += state.src.slice(state.pos, pos);\n }\n\n state.pos = pos;\n\n return true;\n};\n\nexport default function (md) {\n md.inline.ruler.before('text', 'altText', tokenize);\n md.inline.ruler.disable('text');\n}\n","// COPIED FROM https://github.com/StackExchange/Stacks-Editor/blob/main/src/shared/markdown-it/spoiler.ts\n\nimport { isSpace } from 'markdown-it/lib/common/utils';\n\n// TODO unfortunately, we cannot reliably extend blockquote since it is hardcoded to search for `>` characters\n// In addition, we cannot just call \"blockquote\" inside spoiler, because it does a lookahead for `>` characters and leaves our `!`s behind, potentially causing parsing issues\n// The official advice is to just \"copy paste then edit\" \"extended\" rules...\n// see https://github.com/markdown-it/markdown-it/blob/master/docs/development.md#general-considerations-for-plugins\n// see also https://github.com/markdown-it/markdown-it/issues/46#issuecomment-73125248\nfunction blockquoteExt(options, state, startLine, endLine, silent) {\n // NOTE: we're keeping the source as close to upstream as possible, so ignore errors like this\n // eslint-disable-next-line no-var\n var adjustTab,\n ch,\n i,\n initial,\n l,\n lastLineEmpty,\n lines,\n nextLine,\n offset,\n oldBMarks,\n oldBSCount,\n oldIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n spaceAfterMarker,\n terminate,\n terminatorRules,\n token,\n wasOutdented,\n oldLineMax = state.lineMax,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) {\n return false;\n }\n\n // check the block quote marker\n if (state.src.charCodeAt(pos) !== 0x3e /* > */ || !options.followingCharRegex.test(state.src[pos + 1])) {\n return false;\n }\n\n pos += options.markup.length;\n\n // we know that it's going to be a valid blockquote,\n // so no point trying to find the end of it in silent mode\n if (silent) {\n return true;\n }\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[startLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n // ! INSERTED\n // We need to add this hack in so that inline spoilers\n // at the start of lines don't get classified\n // as block spoilers.\n const spoiler = options.markup === '>!';\n let foundExclamation = false;\n let foundOpen = false;\n let oldPos = pos;\n if (spoiler) {\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (foundExclamation && ch === 0x3c /* < */) {\n return false;\n } else if (ch === 0x3e /* > */) {\n foundOpen = true;\n } else if (foundOpen && ch === 0x21 /* ! */) {\n break; // Inline spoiler embedded in block spoiler, this is fine.\n } else if (ch === 0x21 /* ! */) {\n foundExclamation = true;\n } else if (ch === 0x0a /* \\n */) {\n break; // Not an inline comment\n } else {\n foundExclamation = false;\n foundOpen = false;\n }\n\n pos++;\n }\n }\n pos = oldPos;\n // ! END INSERTED\n\n oldBMarks = [state.bMarks[startLine]];\n state.bMarks[startLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - ((offset + state.bsCount[startLine] + (adjustTab ? 1 : 0)) % 4);\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n oldBSCount = [state.bsCount[startLine]];\n state.bsCount[startLine] = state.sCount[startLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n lastLineEmpty = pos >= max;\n\n oldSCount = [state.sCount[startLine]];\n state.sCount[startLine] = offset - initial;\n\n oldTShift = [state.tShift[startLine]];\n state.tShift[startLine] = pos - state.bMarks[startLine];\n\n terminatorRules = state.md.block.ruler.getRules('spoiler');\n\n oldParentType = state.parentType;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore TODO adding a new parent type here...\n state.parentType = 'spoiler';\n wasOutdented = false;\n\n // Search the end of the block\n //\n // Block ends with either:\n // 1. an empty line outside:\n // ```\n // > test\n //\n // ```\n // 2. an empty line inside:\n // ```\n // >\n // test\n // ```\n // 3. another tag:\n // ```\n // > test\n // - - -\n // ```\n for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {\n // check if it's outdented, i.e. it's inside list item and indented\n // less than said list item:\n //\n // ```\n // 1. anything\n // > current blockquote\n // 2. checking this line\n // ```\n if (state.sCount[nextLine] < state.blkIndent) wasOutdented = true;\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos >= max) {\n // Case 1: line is not inside the blockquote, and this line is empty.\n break;\n }\n\n pos += options.markup.length;\n\n if (\n state.src.charCodeAt(pos - options.markup.length) === 0x3e /* > */ &&\n options.followingCharRegex.test(state.src[pos - options.markup.length + 1]) &&\n !wasOutdented\n ) {\n // This line is inside the blockquote.\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[nextLine] + pos - (state.bMarks[nextLine] + state.tShift[nextLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[nextLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n state.bMarks[nextLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - ((offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4);\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n lastLineEmpty = pos >= max;\n\n oldBSCount.push(state.bsCount[nextLine]);\n state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] = offset - initial;\n\n oldTShift.push(state.tShift[nextLine]);\n state.tShift[nextLine] = pos - state.bMarks[nextLine];\n continue;\n }\n\n // Case 2: line is not inside the blockquote, and the last line was empty.\n if (lastLineEmpty) {\n break;\n }\n\n // Case 3: another tag found.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n\n if (terminate) {\n // Quirk to enforce \"hard termination mode\" for paragraphs;\n // normally if you call `tokenize(state, startLine, nextLine)`,\n // paragraphs will look below nextLine for paragraph continuation,\n // but if blockquote is terminated by another tag, they shouldn't\n state.lineMax = nextLine;\n\n if (state.blkIndent !== 0) {\n // state.blkIndent was non-zero, we now set it to zero,\n // so we need to re-calculate all offsets to appear as\n // if indent wasn't changed\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] -= state.blkIndent;\n }\n\n break;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n\n // A negative indentation means that this is a paragraph continuation\n //\n state.sCount[nextLine] = -1;\n }\n\n oldIndent = state.blkIndent;\n state.blkIndent = 0;\n\n token = state.push(options.name + '_open', options.name, 1);\n token.markup = options.markup;\n token.map = lines = [startLine, 0];\n\n state.md.block.tokenize(state, startLine, nextLine);\n\n token = state.push(options.name + '_close', options.name, -1);\n token.markup = options.markup;\n\n state.lineMax = oldLineMax;\n state.parentType = oldParentType;\n lines[1] = state.line;\n\n // Restore original tShift; this might not be necessary since the parser\n // has already been here, but just to make sure we can do that.\n for (i = 0; i < oldTShift.length; i++) {\n state.bMarks[i + startLine] = oldBMarks[i];\n state.tShift[i + startLine] = oldTShift[i];\n state.sCount[i + startLine] = oldSCount[i];\n state.bsCount[i + startLine] = oldBSCount[i];\n }\n state.blkIndent = oldIndent;\n\n return true;\n}\n\nfunction spoilerFn(state, startLine, endLine, silent) {\n return blockquoteExt(\n {\n followingCharRegex: /!/,\n markup: '>!',\n name: 'spoiler',\n },\n state,\n startLine,\n endLine,\n silent\n );\n}\n\nfunction blockquoteFn(state, startLine, endLine, silent) {\n return blockquoteExt(\n {\n followingCharRegex: /[^!]/,\n markup: '>',\n name: 'blockquote',\n },\n state,\n startLine,\n endLine,\n silent\n );\n}\n\n/**\n * Parses out spoiler `>!` blocks\n * @param md\n */\nexport default function blockSpoiler(md) {\n // TODO necessary?\n // find all blockquote chain rules and update to be part of the spoiler chain as well\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore TODO no public way to iterate over all rules; maybe there's a better way?\n md.block.ruler.__rules__.forEach((r) => {\n const bqIndex = r.alt.indexOf('blockquote');\n if (bqIndex > -1) {\n // add in \"spoiler\" right before the \"blockquote\" entry\n r.alt.splice(bqIndex, 0, 'spoiler');\n }\n });\n md.block.ruler.before('blockquote', 'spoiler', spoilerFn, {\n // TODO stole this from blockquote, dunno what it does...\n alt: ['paragraph', 'reference', 'spoiler', 'blockquote', 'list'],\n });\n\n md.block.ruler.at('blockquote', blockquoteFn, {\n alt: ['paragraph', 'reference', 'spoiler', 'blockquote', 'list'],\n });\n}\n","/**!\n * markdown-it-mark\n *\n * Copyright (c) 2014-2015 Vitaly Puzrin, Alex Kocharin.\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n'use strict';\nconst exMark = 0x7c; /* | */\n\nconst tokenize = (frontPriorMode) => (state, silent) => {\n if (silent) return false;\n\n const start = state.pos;\n const marker = state.src.charCodeAt(start);\n\n if (marker !== exMark) return false;\n\n const scanned = state.scanDelims(state.pos, true);\n let len = scanned.length;\n const ch = String.fromCharCode(marker);\n\n if (len < 2) return false;\n\n let isOdd = false;\n if (len % 2) {\n isOdd = true;\n if (!frontPriorMode) {\n const token = state.push('text', '', 0);\n token.content = ch;\n }\n len--;\n }\n\n for (let i = 0; i < len; i += 2) {\n const token = state.push('text', '', 0);\n token.content = ch + ch;\n\n state.delimiters.push({\n marker,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n jump: i / 2, // 1 delimiter = 2 characters\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close,\n });\n }\n\n state.pos += scanned.length;\n if (isOdd && frontPriorMode) {\n state.pos--;\n }\n\n return true;\n};\n\nconst postProcess = (state, delimiters) => {\n const loneMarkers = [];\n\n for (const startDelim of delimiters) {\n if (startDelim.marker !== exMark) continue;\n if (startDelim.end === -1) continue;\n\n const endDelim = delimiters[startDelim.end];\n\n const tokenO = state.tokens[startDelim.token];\n tokenO.type = 'spoiler_inline_open';\n tokenO.tag = 'span';\n tokenO.attrs = [['class', 'spoiler_inline']];\n tokenO.nesting = 1;\n tokenO.markup = '||';\n tokenO.content = '';\n\n const tokenC = state.tokens[endDelim.token];\n tokenC.type = 'spoiler_inline_close';\n tokenC.tag = 'span';\n tokenC.nesting = -1;\n tokenC.markup = '||';\n tokenC.content = '';\n\n if (state.tokens[endDelim.token - 1].type === 'text' && state.tokens[endDelim.token - 1].content === '|') {\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's splitted\n // like this: `|||||` -> `|` + `||` + `||`, leaving one marker at the\n // start of the sequence.\n //\n // So, we have to move all those markers after subsequent spoiler_inline_close tags.\n //\n while (loneMarkers.length) {\n const i = loneMarkers.pop();\n let j = i + 1;\n\n while (j < state.tokens.length && state.tokens[j].type === 'spoiler_inline_close') {\n j++;\n }\n\n j--;\n\n if (i !== j) {\n const token = state.tokens[j];\n state.tokens[j] = state.tokens[i];\n state.tokens[i] = token;\n }\n }\n};\n\nexport default function (md, frontPriorMode = false) {\n md.inline.ruler.before('emphasis', 'spoiler_inline_bars', tokenize(frontPriorMode));\n md.inline.ruler2.before('emphasis', 'spoiler_inline_bars', (state) => {\n postProcess(state, state.delimiters);\n\n if (!state.tokens_meta) return;\n for (const meta of state.tokens_meta) {\n if (meta && meta.delimiters) {\n postProcess(state, meta.delimiters);\n }\n }\n });\n}\n","// BASED ON https://github.com/markdown-it/markdown-it-sub/blob/master/index.js\n\nconst tokenize = (frontPriorMode) => (state, silent) => {\n if (silent) return false;\n\n var scanned,\n max = state.posMax,\n start = state.pos;\n\n if (state.src.charCodeAt(start) === 0x3e /* > */ && start + 3 <= max && state.src.charCodeAt(start + 1) === 0x21 /* ! */) {\n scanned = state.scanDelims(state.pos, true);\n state.push('text', '', 0);\n state.delimiters.push({\n marker: '>!<',\n length: 2,\n jump: 0,\n token: state.tokens.length - 1,\n end: -1,\n open: true,\n close: false,\n });\n state.pos += 2;\n return true;\n }\n\n if (state.src.charCodeAt(start) === 0x21 /* ! */ && start + 2 <= max && state.src.charCodeAt(start + 1) === 0x3c /* < */) {\n state.push('text', '', 0);\n state.delimiters.push({\n marker: '>!<',\n length: 2,\n jump: 0,\n token: state.tokens.length - 1,\n end: -1,\n open: false,\n close: true,\n });\n state.pos += 2;\n return true;\n }\n\n return false;\n};\n\nfunction postProcess(state, delimiters) {\n var i,\n startDelim,\n endDelim,\n token,\n max = delimiters.length;\n\n for (i = max - 1; i >= 0; i--) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== '>!<') {\n continue;\n }\n\n // Process only opening markers\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n token = state.tokens[startDelim.token];\n token.type = 'spoiler_inline_open';\n // token.tag = isStrong ? 'strong' : 'em';\n token.nesting = 1;\n token.markup = '>!';\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = 'spoiler_inline_close';\n // token.tag = isStrong ? 'strong' : 'em';\n token.nesting = -1;\n token.markup = '!<';\n token.content = '';\n }\n}\n\nexport default function (md, frontPriorMode = false) {\n md.inline.ruler.before('emphasis', 'spoiler_inline_tags', tokenize(frontPriorMode));\n md.inline.ruler2.before('emphasis', 'spoiler_inline_bars', (state) => {\n postProcess(state, state.delimiters);\n\n if (!state.tokens_meta) return;\n for (const meta of state.tokens_meta) {\n if (meta && meta.delimiters) {\n postProcess(state, meta.delimiters);\n }\n }\n });\n}\n","import markdownit from 'markdown-it';\nimport subPlugin from 'markdown-it-sub';\nimport supPlugin from 'markdown-it-sup';\nimport latexPlugin from 'markdown-it-latex2img';\nimport { defaultMarkdownParser, MarkdownParser } from 'prosemirror-markdown';\nimport altText from './markdown-it/altText';\nimport blockSpoiler from './markdown-it/blockSpoiler';\nimport inlineSpoilerBars from './markdown-it/inlineSpoilerBars';\nimport inlineSpoilerTags from './markdown-it/inlineSpoilerTags';\n\nexport default class MarkdownParserBuilder {\n constructor(schema) {\n this.schema = schema;\n }\n\n tokenizerParams() {\n return { html: false };\n }\n\n buildTokenizer() {\n return markdownit('commonmark', this.tokenizerParams())\n .enable('strikethrough')\n .use(altText)\n .use(blockSpoiler)\n .use(latexPlugin)\n .use(subPlugin)\n .use(supPlugin)\n .use(inlineSpoilerBars)\n .use(inlineSpoilerTags);\n }\n\n buildTokens() {\n return {\n ...defaultMarkdownParser.tokens,\n\n // add support for the strike mark\n s: {\n mark: 'strike',\n },\n\n // Litedown treaks softbreaks as hard breaks\n softbreak: { node: 'hard_break' },\n\n spoiler: {\n block: 'spoiler',\n },\n\n spoiler_inline: {\n mark: 'spoiler_inline',\n },\n\n sub: {\n mark: 'sub',\n },\n\n sup: {\n mark: 'sup',\n },\n\n math_block: {\n block: 'math_block',\n noCloseToken: true,\n },\n\n math_inline: {\n mark: 'math_inline',\n noCloseToken: true,\n },\n };\n }\n\n build() {\n return new MarkdownParser(this.schema, this.buildTokenizer(), this.buildTokens());\n }\n}\n","import Dropdown from 'flarum/common/components/Dropdown';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport icon from 'flarum/common/helpers/icon';\nimport SafariModalHack from './SafariModalHack';\n\nexport default class HiddenItemsDropdown extends Dropdown {\n static initAttrs(attrs) {\n attrs.buttonClassName = 'Button Button--icon Button--link Button--menuDropdown';\n }\n\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$().on('click', (e) => {\n if ($('.App').is('.mobile-safari')) {\n // Mobile Safari doesn't support fixed items\n // So, we wrap them in a modal.\n app.modal.show(SafariModalHack, {\n title: this.attrs.tooltip,\n vnodeContent: this.attrs.buttons.map((button) => {\n return button;\n }),\n });\n e.stopPropagation();\n }\n });\n }\n\n getButtonContent(children) {\n return (\n \n {icon(this.attrs.icon)}\n \n );\n }\n\n getMenu(items) {\n return

            {this.attrs.buttons}
          ;\n }\n}\n","import { toggleBlockType, toggleWrap, wrapIn } from 'tiptap-commands';\n\nimport Component from 'flarum/common/Component';\nimport ItemList from 'flarum/common/utils/ItemList';\n\nimport CommandButton from './CommandButton';\nimport MarkButton from './MarkButton';\nimport NodeTypeDropdown from './NodeTypeDropdown';\nimport InsertImageDropdown from './InsertImageDropdown';\nimport InsertLinkDropdown from './InsertLinkDropdown';\nimport ListButton from './ListButton';\nimport insertHr from '../proseMirror/commands/insertHr';\nimport HiddenItemsDropdown from './HiddenItemsDropdown';\n\nexport default class ProseMirrorMenu extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.modifierKey = navigator.userAgent.match(/Macintosh/) ? '⌘' : 'ctrl';\n }\n view(vnode) {\n if (!this.attrs.state) return '';\n\n return
          {this.items().toArray()}
          ;\n }\n\n items() {\n const items = new ItemList();\n const state = this.attrs.state;\n const modifierKey = this.modifierKey;\n\n items.add(\n 'text_type',\n NodeTypeDropdown.component({\n type: 'text_type',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.text_type_tooltip'),\n state: state,\n options: [\n {\n title: 'H1',\n type: state.getSchema().nodes.heading,\n attrs: { level: 1 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 1 }),\n },\n {\n title: 'H2',\n type: state.getSchema().nodes.heading,\n attrs: { level: 2 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 2 }),\n },\n {\n title: 'H3',\n type: state.getSchema().nodes.heading,\n attrs: { level: 3 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 3 }),\n },\n {\n title: 'H4',\n type: state.getSchema().nodes.heading,\n attrs: { level: 4 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 4 }),\n },\n {\n title: 'H5',\n type: state.getSchema().nodes.heading,\n attrs: { level: 5 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 5 }),\n },\n {\n title: 'H6',\n type: state.getSchema().nodes.heading,\n attrs: { level: 6 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 6 }),\n },\n {\n title: 'P',\n type: state.getSchema().nodes.paragraph,\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.paragraph_tooltip', { modifierKey }),\n },\n ],\n }),\n 100\n );\n\n items.add(\n 'bold',\n MarkButton.component({\n type: 'bold',\n icon: 'fas fa-bold',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.bold_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.strong,\n }),\n 90\n );\n\n items.add(\n 'italic',\n MarkButton.component({\n type: 'italic',\n icon: 'fas fa-italic',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.italic_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.em,\n }),\n 80\n );\n\n items.add(\n 'code',\n MarkButton.component({\n type: 'code',\n icon: 'fas fa-code',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.code_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.code,\n }),\n 70\n );\n\n items.add(\n 'quote',\n CommandButton.component({\n type: 'quote',\n icon: 'fas fa-quote-left',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.quote_tooltip', { modifierKey }),\n state: state,\n command: wrapIn(state.getSchema().nodes.blockquote),\n }),\n 60\n );\n\n items.add(\n 'link',\n InsertLinkDropdown.component({\n type: 'link',\n icon: 'fas fa-link',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.link_tooltip'),\n state: state,\n mark: state.getSchema().marks.link,\n }),\n 50\n );\n\n items.add(\n 'image',\n InsertImageDropdown.component({\n type: 'image',\n icon: 'fas fa-image',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.image_tooltip'),\n state: state,\n node: state.getSchema().nodes.image,\n }),\n 40\n );\n\n items.add(\n 'unordered_list',\n ListButton.component({\n type: 'unordered_list',\n icon: 'fas fa-list-ul',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.unordered_list_tooltip', { modifierKey }),\n state: state,\n listType: state.getSchema().nodes.bullet_list,\n }),\n 30\n );\n\n items.add(\n 'ordered_list',\n ListButton.component({\n type: 'ordered_list',\n icon: 'fas fa-list-ol',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.ordered_list_tooltip', { modifierKey }),\n state: state,\n listType: state.getSchema().nodes.ordered_list,\n }),\n 20\n );\n\n items.add(\n 'additional_items',\n HiddenItemsDropdown.component({\n type: 'additional_items',\n icon: 'fas fa-plus',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.additional_items_tooltip'),\n state: state,\n buttons: this.hiddenItems().toArray(),\n })\n );\n\n return items;\n }\n\n hiddenItems() {\n const items = new ItemList();\n const state = this.attrs.state;\n const modifierKey = this.modifierKey;\n\n items.add(\n 'strike',\n MarkButton.component({\n type: 'strike',\n icon: 'fas fa-strikethrough',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.strike_tooltip'),\n state: state,\n mark: state.getSchema().marks.strike,\n })\n );\n\n items.add(\n 'sub',\n MarkButton.component({\n type: 'sub',\n icon: 'fas fa-subscript',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.sub_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.sub,\n })\n );\n\n items.add(\n 'sup',\n MarkButton.component({\n type: 'sup',\n icon: 'fas fa-superscript',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.sup_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.sup,\n })\n );\n\n items.add(\n 'spoiler_inline',\n MarkButton.component({\n type: 'spoiler_inline',\n icon: 'fas fa-eye-slash',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.spoiler_inline_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.spoiler_inline,\n })\n );\n\n items.add(\n 'code_block',\n CommandButton.component({\n type: 'code_block',\n icon: 'fas fa-terminal',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.code_block_tooltip', { modifierKey }),\n state: state,\n command: toggleBlockType(state.getSchema().nodes.code_block, state.getSchema().nodes.paragraph),\n })\n );\n\n items.add(\n 'spoiler_block',\n CommandButton.component({\n type: 'spoiler_block',\n icon: 'fas fa-caret-square-right',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.spoiler_block_tooltip', { modifierKey }),\n state: state,\n command: toggleWrap(state.getSchema().nodes.spoiler),\n })\n );\n\n items.add(\n 'horizontal_rule',\n CommandButton.component({\n type: 'horizontal_rule',\n icon: 'fas fa-minus',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.horizontal_rule_tooltip'),\n state: state,\n command: insertHr(state.getSchema().nodes.horizontal_rule),\n })\n );\n\n return items;\n }\n}\n","export default function insertHr(nodeType, attrs) {\n return function (state, dispatch) {\n dispatch(state.tr.replaceSelectionWith(nodeType.create(attrs)));\n return true;\n };\n}\n","import Button from 'flarum/common/components/Button';\nimport extractText from 'flarum/common/utils/extractText';\nimport Stream from 'flarum/common/utils/Stream';\nimport FormDropdown from './FormDropdown';\n\nimport { removeMark, updateMark } from 'tiptap-commands';\nimport insertLink from '../proseMirror/commands/insertLink';\n\nexport default class InsertLinkDropdown extends FormDropdown {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.text = Stream('');\n\n this.href = Stream('');\n this.title = Stream('');\n\n this.state.addItem(\n this.attrs.type,\n (state, dispatch) => {\n this.command(state, dispatch);\n },\n this.onEditorUpdate.bind(this)\n );\n\n this.selectionEmpty = true;\n }\n\n fields() {\n const items = super.fields();\n\n if (this.selectionEmpty && !this.active) {\n items.add(\n 'text',\n
          \n \n
          ,\n 10\n );\n }\n\n items.add(\n 'href',\n
          \n \n
          ,\n 10\n );\n\n items.add(\n 'title',\n
          \n \n
          ,\n 10\n );\n\n if (this.active) {\n items.add(\n 'remove',\n ,\n -10\n );\n }\n\n return items;\n }\n\n insert(e) {\n const linkAttrs = { href: this.href(), title: this.title() };\n\n if (this.selectionEmpty && !this.active) {\n this.command = insertLink(this.text(), this.attrs.mark, linkAttrs);\n\n this.text('');\n } else {\n this.command = updateMark(this.attrs.mark, linkAttrs);\n }\n\n this.state.run(this.attrs.type);\n }\n\n remove(e) {\n $('body').trigger('click');\n this.command = removeMark(this.attrs.mark);\n this.state.run(this.attrs.type);\n app.composer.editor.focus();\n }\n\n onEditorUpdate() {\n this.active = !!this.state.markActive(this.attrs.mark);\n this.$('.Dropdown-toggle').toggleClass('active', this.active);\n\n const attrs = this.state.markAttrs(this.attrs.mark);\n\n this.href(attrs.href);\n this.title(attrs.title);\n\n this.selectionEmpty = this.state.selectionEmpty();\n }\n}\n","export default function insertLink(text, markType, attrs) {\n return function (state, dispatch) {\n dispatch(state.tr.replaceSelectionWith(state.schema.text(text, [markType.create(attrs)]), false));\n };\n}\n","module.exports=/[!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E4E\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD803[\\uDF55-\\uDF59]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD806[\\uDC3B\\uDE3F-\\uDE46\\uDE9A-\\uDE9C\\uDE9E-\\uDEA2]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDE97-\\uDE9A]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]/","/**\n * class Ruler\n *\n * Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and\n * [[MarkdownIt#inline]] to manage sequences of functions (rules):\n *\n * - keep rules in defined order\n * - assign the name to each rule\n * - enable/disable rules\n * - add/replace rules\n * - allow assign rules to additional named chains (in the same)\n * - cacheing lists of active rules\n *\n * You will not need use this class directly until write plugins. For simple\n * rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and\n * [[MarkdownIt.use]].\n **/\n'use strict';\n\n\n/**\n * new Ruler()\n **/\nfunction Ruler() {\n // List of added rules. Each element is:\n //\n // {\n // name: XXX,\n // enabled: Boolean,\n // fn: Function(),\n // alt: [ name2, name3 ]\n // }\n //\n this.__rules__ = [];\n\n // Cached rule chains.\n //\n // First level - chain name, '' for default.\n // Second level - diginal anchor for fast filtering by charcodes.\n //\n this.__cache__ = null;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Helper methods, should not be used directly\n\n\n// Find rule index by name\n//\nRuler.prototype.__find__ = function (name) {\n for (var i = 0; i < this.__rules__.length; i++) {\n if (this.__rules__[i].name === name) {\n return i;\n }\n }\n return -1;\n};\n\n\n// Build rules lookup cache\n//\nRuler.prototype.__compile__ = function () {\n var self = this;\n var chains = [ '' ];\n\n // collect unique names\n self.__rules__.forEach(function (rule) {\n if (!rule.enabled) { return; }\n\n rule.alt.forEach(function (altName) {\n if (chains.indexOf(altName) < 0) {\n chains.push(altName);\n }\n });\n });\n\n self.__cache__ = {};\n\n chains.forEach(function (chain) {\n self.__cache__[chain] = [];\n self.__rules__.forEach(function (rule) {\n if (!rule.enabled) { return; }\n\n if (chain && rule.alt.indexOf(chain) < 0) { return; }\n\n self.__cache__[chain].push(rule.fn);\n });\n });\n};\n\n\n/**\n * Ruler.at(name, fn [, options])\n * - name (String): rule name to replace.\n * - fn (Function): new rule function.\n * - options (Object): new rule options (not mandatory).\n *\n * Replace rule by name with new function & options. Throws error if name not\n * found.\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * Replace existing typographer replacement rule with new one:\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.at('replacements', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.at = function (name, fn, options) {\n var index = this.__find__(name);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + name); }\n\n this.__rules__[index].fn = fn;\n this.__rules__[index].alt = opt.alt || [];\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.before(beforeName, ruleName, fn [, options])\n * - beforeName (String): new rule will be added before this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain before one with given name. See also\n * [[Ruler.after]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.block.ruler.before('paragraph', 'my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.before = function (beforeName, ruleName, fn, options) {\n var index = this.__find__(beforeName);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + beforeName); }\n\n this.__rules__.splice(index, 0, {\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.after(afterName, ruleName, fn [, options])\n * - afterName (String): new rule will be added after this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain after one with given name. See also\n * [[Ruler.before]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.inline.ruler.after('text', 'my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.after = function (afterName, ruleName, fn, options) {\n var index = this.__find__(afterName);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + afterName); }\n\n this.__rules__.splice(index + 1, 0, {\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n/**\n * Ruler.push(ruleName, fn [, options])\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Push new rule to the end of chain. See also\n * [[Ruler.before]], [[Ruler.after]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.push('my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.push = function (ruleName, fn, options) {\n var opt = options || {};\n\n this.__rules__.push({\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.enable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to enable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.disable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.enable = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n var result = [];\n\n // Search by name and enable\n list.forEach(function (name) {\n var idx = this.__find__(name);\n\n if (idx < 0) {\n if (ignoreInvalid) { return; }\n throw new Error('Rules manager: invalid rule name ' + name);\n }\n this.__rules__[idx].enabled = true;\n result.push(name);\n }, this);\n\n this.__cache__ = null;\n return result;\n};\n\n\n/**\n * Ruler.enableOnly(list [, ignoreInvalid])\n * - list (String|Array): list of rule names to enable (whitelist).\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names, and disable everything else. If any rule name\n * not found - throw Error. Errors can be disabled by second param.\n *\n * See also [[Ruler.disable]], [[Ruler.enable]].\n **/\nRuler.prototype.enableOnly = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n this.__rules__.forEach(function (rule) { rule.enabled = false; });\n\n this.enable(list, ignoreInvalid);\n};\n\n\n/**\n * Ruler.disable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Disable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.enable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.disable = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n var result = [];\n\n // Search by name and disable\n list.forEach(function (name) {\n var idx = this.__find__(name);\n\n if (idx < 0) {\n if (ignoreInvalid) { return; }\n throw new Error('Rules manager: invalid rule name ' + name);\n }\n this.__rules__[idx].enabled = false;\n result.push(name);\n }, this);\n\n this.__cache__ = null;\n return result;\n};\n\n\n/**\n * Ruler.getRules(chainName) -> Array\n *\n * Return array of active functions (rules) for given chain name. It analyzes\n * rules configuration, compiles caches if not exists and returns result.\n *\n * Default chain name is `''` (empty string). It can't be skipped. That's\n * done intentionally, to keep signature monomorphic for high speed.\n **/\nRuler.prototype.getRules = function (chainName) {\n if (this.__cache__ === null) {\n this.__compile__();\n }\n\n // Chain can be empty, if rules disabled. But we still have to return Array.\n return this.__cache__[chainName] || [];\n};\n\nmodule.exports = Ruler;\n","// Token class\n\n'use strict';\n\n\n/**\n * class Token\n **/\n\n/**\n * new Token(type, tag, nesting)\n *\n * Create new token and fill passed properties.\n **/\nfunction Token(type, tag, nesting) {\n /**\n * Token#type -> String\n *\n * Type of the token (string, e.g. \"paragraph_open\")\n **/\n this.type = type;\n\n /**\n * Token#tag -> String\n *\n * html tag name, e.g. \"p\"\n **/\n this.tag = tag;\n\n /**\n * Token#attrs -> Array\n *\n * Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]`\n **/\n this.attrs = null;\n\n /**\n * Token#map -> Array\n *\n * Source map info. Format: `[ line_begin, line_end ]`\n **/\n this.map = null;\n\n /**\n * Token#nesting -> Number\n *\n * Level change (number in {-1, 0, 1} set), where:\n *\n * - `1` means the tag is opening\n * - `0` means the tag is self-closing\n * - `-1` means the tag is closing\n **/\n this.nesting = nesting;\n\n /**\n * Token#level -> Number\n *\n * nesting level, the same as `state.level`\n **/\n this.level = 0;\n\n /**\n * Token#children -> Array\n *\n * An array of child nodes (inline and img tokens)\n **/\n this.children = null;\n\n /**\n * Token#content -> String\n *\n * In a case of self-closing tag (code, html, fence, etc.),\n * it has contents of this tag.\n **/\n this.content = '';\n\n /**\n * Token#markup -> String\n *\n * '*' or '_' for emphasis, fence string for fence, etc.\n **/\n this.markup = '';\n\n /**\n * Token#info -> String\n *\n * fence infostring\n **/\n this.info = '';\n\n /**\n * Token#meta -> Object\n *\n * A place for plugins to store an arbitrary data\n **/\n this.meta = null;\n\n /**\n * Token#block -> Boolean\n *\n * True for block-level tokens, false for inline tokens.\n * Used in renderer to calculate line breaks\n **/\n this.block = false;\n\n /**\n * Token#hidden -> Boolean\n *\n * If it's true, ignore this element when rendering. Used for tight lists\n * to hide paragraphs.\n **/\n this.hidden = false;\n}\n\n\n/**\n * Token.attrIndex(name) -> Number\n *\n * Search attribute index by name.\n **/\nToken.prototype.attrIndex = function attrIndex(name) {\n var attrs, i, len;\n\n if (!this.attrs) { return -1; }\n\n attrs = this.attrs;\n\n for (i = 0, len = attrs.length; i < len; i++) {\n if (attrs[i][0] === name) { return i; }\n }\n return -1;\n};\n\n\n/**\n * Token.attrPush(attrData)\n *\n * Add `[ name, value ]` attribute to list. Init attrs if necessary\n **/\nToken.prototype.attrPush = function attrPush(attrData) {\n if (this.attrs) {\n this.attrs.push(attrData);\n } else {\n this.attrs = [ attrData ];\n }\n};\n\n\n/**\n * Token.attrSet(name, value)\n *\n * Set `name` attribute to `value`. Override old value if exists.\n **/\nToken.prototype.attrSet = function attrSet(name, value) {\n var idx = this.attrIndex(name),\n attrData = [ name, value ];\n\n if (idx < 0) {\n this.attrPush(attrData);\n } else {\n this.attrs[idx] = attrData;\n }\n};\n\n\n/**\n * Token.attrGet(name)\n *\n * Get the value of attribute `name`, or null if it does not exist.\n **/\nToken.prototype.attrGet = function attrGet(name) {\n var idx = this.attrIndex(name), value = null;\n if (idx >= 0) {\n value = this.attrs[idx][1];\n }\n return value;\n};\n\n\n/**\n * Token.attrJoin(name, value)\n *\n * Join value to existing attribute via space. Or create new attribute if not\n * exists. Useful to operate with token classes.\n **/\nToken.prototype.attrJoin = function attrJoin(name, value) {\n var idx = this.attrIndex(name);\n\n if (idx < 0) {\n this.attrPush([ name, value ]);\n } else {\n this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value;\n }\n};\n\n\nmodule.exports = Token;\n","// HTML5 entities map: { name -> utf16string }\n//\n'use strict';\n\n/*eslint quotes:0*/\nmodule.exports = require('entities/lib/maps/entities.json');\n","'use strict';\n\n\nmodule.exports.encode = require('./encode');\nmodule.exports.decode = require('./decode');\nmodule.exports.format = require('./format');\nmodule.exports.parse = require('./parse');\n","module.exports=/[\\0-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/","module.exports=/[\\0-\\x1F\\x7F-\\x9F]/","module.exports=/[ \\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/","// Regexps to match html elements\n\n'use strict';\n\nvar attr_name = '[a-zA-Z_:][a-zA-Z0-9:._-]*';\n\nvar unquoted = '[^\"\\'=<>`\\\\x00-\\\\x20]+';\nvar single_quoted = \"'[^']*'\";\nvar double_quoted = '\"[^\"]*\"';\n\nvar attr_value = '(?:' + unquoted + '|' + single_quoted + '|' + double_quoted + ')';\n\nvar attribute = '(?:\\\\s+' + attr_name + '(?:\\\\s*=\\\\s*' + attr_value + ')?)';\n\nvar open_tag = '<[A-Za-z][A-Za-z0-9\\\\-]*' + attribute + '*\\\\s*\\\\/?>';\n\nvar close_tag = '<\\\\/[A-Za-z][A-Za-z0-9\\\\-]*\\\\s*>';\nvar comment = '|';\nvar processing = '<[?].*?[?]>';\nvar declaration = ']*>';\nvar cdata = '';\n\nvar HTML_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + '|' + comment +\n '|' + processing + '|' + declaration + '|' + cdata + ')');\nvar HTML_OPEN_CLOSE_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + ')');\n\nmodule.exports.HTML_TAG_RE = HTML_TAG_RE;\nmodule.exports.HTML_OPEN_CLOSE_TAG_RE = HTML_OPEN_CLOSE_TAG_RE;\n","// ~~strike through~~\n//\n'use strict';\n\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nmodule.exports.tokenize = function strikethrough(state, silent) {\n var i, scanned, token, len, ch,\n start = state.pos,\n marker = state.src.charCodeAt(start);\n\n if (silent) { return false; }\n\n if (marker !== 0x7E/* ~ */) { return false; }\n\n scanned = state.scanDelims(state.pos, true);\n len = scanned.length;\n ch = String.fromCharCode(marker);\n\n if (len < 2) { return false; }\n\n if (len % 2) {\n token = state.push('text', '', 0);\n token.content = ch;\n len--;\n }\n\n for (i = 0; i < len; i += 2) {\n token = state.push('text', '', 0);\n token.content = ch + ch;\n\n state.delimiters.push({\n marker: marker,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n jump: i,\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close\n });\n }\n\n state.pos += scanned.length;\n\n return true;\n};\n\n\nfunction postProcess(state, delimiters) {\n var i, j,\n startDelim,\n endDelim,\n token,\n loneMarkers = [],\n max = delimiters.length;\n\n for (i = 0; i < max; i++) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== 0x7E/* ~ */) {\n continue;\n }\n\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n token = state.tokens[startDelim.token];\n token.type = 's_open';\n token.tag = 's';\n token.nesting = 1;\n token.markup = '~~';\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = 's_close';\n token.tag = 's';\n token.nesting = -1;\n token.markup = '~~';\n token.content = '';\n\n if (state.tokens[endDelim.token - 1].type === 'text' &&\n state.tokens[endDelim.token - 1].content === '~') {\n\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's splitted\n // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n // start of the sequence.\n //\n // So, we have to move all those markers after subsequent s_close tags.\n //\n while (loneMarkers.length) {\n i = loneMarkers.pop();\n j = i + 1;\n\n while (j < state.tokens.length && state.tokens[j].type === 's_close') {\n j++;\n }\n\n j--;\n\n if (i !== j) {\n token = state.tokens[j];\n state.tokens[j] = state.tokens[i];\n state.tokens[i] = token;\n }\n }\n}\n\n\n// Walk through delimiter list and replace text tokens with tags\n//\nmodule.exports.postProcess = function strikethrough(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n postProcess(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n postProcess(state, tokens_meta[curr].delimiters);\n }\n }\n};\n","// Process *this* and _that_\n//\n'use strict';\n\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nmodule.exports.tokenize = function emphasis(state, silent) {\n var i, scanned, token,\n start = state.pos,\n marker = state.src.charCodeAt(start);\n\n if (silent) { return false; }\n\n if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { return false; }\n\n scanned = state.scanDelims(state.pos, marker === 0x2A);\n\n for (i = 0; i < scanned.length; i++) {\n token = state.push('text', '', 0);\n token.content = String.fromCharCode(marker);\n\n state.delimiters.push({\n // Char code of the starting marker (number).\n //\n marker: marker,\n\n // Total length of these series of delimiters.\n //\n length: scanned.length,\n\n // An amount of characters before this one that's equivalent to\n // current one. In plain English: if this delimiter does not open\n // an emphasis, neither do previous `jump` characters.\n //\n // Used to skip sequences like \"*****\" in one step, for 1st asterisk\n // value will be 0, for 2nd it's 1 and so on.\n //\n jump: i,\n\n // A position of the token this delimiter corresponds to.\n //\n token: state.tokens.length - 1,\n\n // If this delimiter is matched as a valid opener, `end` will be\n // equal to its position, otherwise it's `-1`.\n //\n end: -1,\n\n // Boolean flags that determine if this delimiter could open or close\n // an emphasis.\n //\n open: scanned.can_open,\n close: scanned.can_close\n });\n }\n\n state.pos += scanned.length;\n\n return true;\n};\n\n\nfunction postProcess(state, delimiters) {\n var i,\n startDelim,\n endDelim,\n token,\n ch,\n isStrong,\n max = delimiters.length;\n\n for (i = max - 1; i >= 0; i--) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) {\n continue;\n }\n\n // Process only opening markers\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n // If the previous delimiter has the same marker and is adjacent to this one,\n // merge those into one strong delimiter.\n //\n // `whatever` -> `whatever`\n //\n isStrong = i > 0 &&\n delimiters[i - 1].end === startDelim.end + 1 &&\n delimiters[i - 1].token === startDelim.token - 1 &&\n delimiters[startDelim.end + 1].token === endDelim.token + 1 &&\n delimiters[i - 1].marker === startDelim.marker;\n\n ch = String.fromCharCode(startDelim.marker);\n\n token = state.tokens[startDelim.token];\n token.type = isStrong ? 'strong_open' : 'em_open';\n token.tag = isStrong ? 'strong' : 'em';\n token.nesting = 1;\n token.markup = isStrong ? ch + ch : ch;\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = isStrong ? 'strong_close' : 'em_close';\n token.tag = isStrong ? 'strong' : 'em';\n token.nesting = -1;\n token.markup = isStrong ? ch + ch : ch;\n token.content = '';\n\n if (isStrong) {\n state.tokens[delimiters[i - 1].token].content = '';\n state.tokens[delimiters[startDelim.end + 1].token].content = '';\n i--;\n }\n }\n}\n\n\n// Walk through delimiter list and replace text tokens with tags\n//\nmodule.exports.postProcess = function emphasis(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n postProcess(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n postProcess(state, tokens_meta[curr].delimiters);\n }\n }\n};\n","import CommandButton from './CommandButton';\nimport FormDropdown from './FormDropdown';\nimport InsertImageDropdown from './InsertImageDropdown';\nimport InsertLinkDropdown from './InsertLinkDropdown';\nimport ListButton from './ListButton';\nimport MarkButton from './MarkButton';\nimport NodeTypeDropdown from './NodeTypeDropdown';\nimport ProseMirrorMenu from './ProseMirrorMenu';\n\nexport const components = {\n CommandButton: CommandButton,\n FormDropdown: FormDropdown,\n InsertImageDropdown: InsertImageDropdown,\n InsertLinkDropdown: InsertLinkDropdown,\n ListButton: ListButton,\n MarkButton: MarkButton,\n NodeTypeDropdown: NodeTypeDropdown,\n ProseMirrorMenu: ProseMirrorMenu,\n};\n","import updateToggleMark from './updateToggleMark';\n\nexport const commands = {\n updateToggleMark: updateToggleMark,\n};\n","import { toggleMark, updateMark } from 'tiptap-commands';\n\nexport default function updateToggleMark(type, attrs) {\n return function (state, dispatch) {\n if (state.selection.empty) {\n return toggleMark(type, attrs)(state, dispatch);\n }\n return updateMark(type, attrs)(state, dispatch);\n };\n}\n","import { commands } from './commands';\nimport { markdown } from './markdown';\nimport ProseMirrorEditorDriver from './ProseMirrorEditorDriver';\n\nexport const proseMirror = {\n commands: commands,\n markdown: markdown,\n ProseMirrorEditorDriver: ProseMirrorEditorDriver,\n};\n","import MarkdownParserBuilder from './MarkdownParserBuilder';\nimport MarkdownSerializerBuilder from './MarkdownSerializerBuilder';\nimport SchemaBuilder from './SchemaBuilder';\n\nexport const markdown = {\n MarkdownParserBuilder: MarkdownParserBuilder,\n MarkdownSerializerBuilder: MarkdownSerializerBuilder,\n SchemaBuilder: SchemaBuilder,\n};\n","import MenuState from './MenuState';\n\nexport const states = {\n MenuState: MenuState,\n};\n","import { extend, override } from 'flarum/common/extend';\n\nimport Button from 'flarum/common/components/Button';\nimport TextEditor from 'flarum/common/components/TextEditor';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport classList from 'flarum/common/utils/classList';\n\nimport ProseMirrorEditorDriver from './proseMirror/ProseMirrorEditorDriver';\nimport ProseMirrorMenu from './components/ProseMirrorMenu';\nimport MenuState from './states/MenuState';\n\nexport default function applyEditor() {\n extend(TextEditor.prototype, 'controlItems', function (items) {\n if (!app.forum.attribute('toggleRichTextEditorButton')) return;\n\n const buttonOnClick = () => {\n app.session.user.savePreferences({ useRichTextEditor: !app.session.user.preferences().useRichTextEditor }).then(() => {\n app.composer.editor.destroy();\n this.attrs.composer.editor = this.buildEditor(this.$('.TextEditor-editorContainer')[0]);\n m.redraw.sync();\n app.composer.editor.focus();\n });\n };\n\n items.add(\n 'rich-text',\n \n \n ,\n -10\n );\n });\n\n extend(TextEditor.prototype, 'toolbarItems', function (items) {\n if (!app.session.user.preferences().useRichTextEditor) return;\n\n items.remove('markdown');\n\n items.add('prosemirror-menu', , 100);\n });\n\n extend(TextEditor.prototype, 'buildEditorParams', function (items) {\n if (!app.session.user.preferences().useRichTextEditor) return;\n\n items.menuState = this.menuState = new MenuState();\n items.classNames.push('Post-body');\n items.escape = () => app.composer.close();\n });\n\n override(TextEditor.prototype, 'buildEditor', function (original, dom) {\n if (app.session.user.preferences().useRichTextEditor) {\n return new ProseMirrorEditorDriver(dom, this.buildEditorParams());\n }\n\n return original(dom);\n });\n}\n","module.exports = flarum.core.compat['common/utils/classList'];","// Process ~subscript~\n\n'use strict';\n\n// same as UNESCAPE_MD_RE plus a space\nvar UNESCAPE_RE = /\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;\n\n\nfunction subscript(state, silent) {\n var found,\n content,\n token,\n max = state.posMax,\n start = state.pos;\n\n if (state.src.charCodeAt(start) !== 0x7E/* ~ */) { return false; }\n if (silent) { return false; } // don't run any pairs in validation mode\n if (start + 2 >= max) { return false; }\n\n state.pos = start + 1;\n\n while (state.pos < max) {\n if (state.src.charCodeAt(state.pos) === 0x7E/* ~ */) {\n found = true;\n break;\n }\n\n state.md.inline.skipToken(state);\n }\n\n if (!found || start + 1 === state.pos) {\n state.pos = start;\n return false;\n }\n\n content = state.src.slice(start + 1, state.pos);\n\n // don't allow unescaped spaces/newlines inside\n if (content.match(/(^|[^\\\\])(\\\\\\\\)*\\s/)) {\n state.pos = start;\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + 1;\n\n // Earlier we checked !silent, but this implementation does not need it\n token = state.push('sub_open', 'sub', 1);\n token.markup = '~';\n\n token = state.push('text', '', 0);\n token.content = content.replace(UNESCAPE_RE, '$1');\n\n token = state.push('sub_close', 'sub', -1);\n token.markup = '~';\n\n state.pos = state.posMax + 1;\n state.posMax = max;\n return true;\n}\n\n\nmodule.exports = function sub_plugin(md) {\n md.inline.ruler.after('emphasis', 'sub', subscript);\n};\n","// Process ^superscript^\n\n'use strict';\n\n// same as UNESCAPE_MD_RE plus a space\nvar UNESCAPE_RE = /\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;\n\nfunction superscript(state, silent) {\n var found,\n content,\n token,\n max = state.posMax,\n start = state.pos;\n\n if (state.src.charCodeAt(start) !== 0x5E/* ^ */) { return false; }\n if (silent) { return false; } // don't run any pairs in validation mode\n if (start + 2 >= max) { return false; }\n\n state.pos = start + 1;\n\n while (state.pos < max) {\n if (state.src.charCodeAt(state.pos) === 0x5E/* ^ */) {\n found = true;\n break;\n }\n\n state.md.inline.skipToken(state);\n }\n\n if (!found || start + 1 === state.pos) {\n state.pos = start;\n return false;\n }\n\n content = state.src.slice(start + 1, state.pos);\n\n // don't allow unescaped spaces/newlines inside\n if (content.match(/(^|[^\\\\])(\\\\\\\\)*\\s/)) {\n state.pos = start;\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + 1;\n\n // Earlier we checked !silent, but this implementation does not need it\n token = state.push('sup_open', 'sup', 1);\n token.markup = '^';\n\n token = state.push('text', '', 0);\n token.content = content.replace(UNESCAPE_RE, '$1');\n\n token = state.push('sup_close', 'sup', -1);\n token.markup = '^';\n\n state.pos = state.posMax + 1;\n state.posMax = max;\n return true;\n}\n\n\nmodule.exports = function sup_plugin(md) {\n md.inline.ruler.after('emphasis', 'sup', superscript);\n};\n","// Process latex\n//\n\"use strict\";\n\nfunction isValidDelim(state, pos) {\n let prevChar,\n nextChar,\n max = state.posMax,\n can_open = true,\n can_close = true;\n\n prevChar = pos > 0 ? state.src.charCodeAt(pos - 1) : -1;\n nextChar = pos + 1 <= max ? state.src.charCodeAt(pos + 1) : -1;\n\n // Check non-whitespace conditions for opening and closing, and\n // check that closing delimeter isn't followed by a number\n if (\n prevChar === 0x20 /* \" \" */ ||\n prevChar === 0x09 /* \\t */ ||\n (nextChar >= 0x30 /* \"0\" */ && nextChar <= 0x39) /* \"9\" */\n ) {\n can_close = false;\n }\n if (nextChar === 0x20 /* \" \" */ || nextChar === 0x09 /* \\t */) {\n can_open = false;\n }\n\n return {\n can_open: can_open,\n can_close: can_close,\n };\n}\n\nfunction math_inline(state, silent) {\n let start, match, token, res, pos;\n\n if (state.src[state.pos] !== \"$\") {\n return false;\n }\n\n res = isValidDelim(state, state.pos);\n if (!res.can_open) {\n if (!silent) {\n state.pending += \"$\";\n }\n state.pos += 1;\n return true;\n }\n\n // First check for and bypass all properly escaped delimieters\n // This loop will assume that the first leading backtick can not\n // be the first character in state.src, which is known since\n // we have found an opening delimieter already.\n start = state.pos + 1;\n match = start;\n while ((match = state.src.indexOf(\"$\", match)) !== -1) {\n // Found potential $, look for escapes, pos will point to\n // first non escape when complete\n pos = match - 1;\n while (state.src[pos] === \"\\\\\") {\n pos -= 1;\n }\n\n // Even number of escapes, potential closing delimiter found\n if ((match - pos) % 2 == 1) {\n break;\n }\n match += 1;\n }\n\n // No closing delimter found. Consume $ and continue.\n if (match === -1) {\n if (!silent) {\n state.pending += \"$\";\n }\n state.pos = start;\n return true;\n }\n\n // Check if we have empty content, ie: $$. Do not parse.\n if (match - start === 0) {\n if (!silent) {\n state.pending += \"$$\";\n }\n state.pos = start + 1;\n return true;\n }\n\n // Check for valid closing delimiter\n res = isValidDelim(state, match);\n if (!res.can_close) {\n if (!silent) {\n state.pending += \"$\";\n }\n state.pos = start;\n return true;\n }\n\n if (!silent) {\n token = state.push(\"math_inline\", \"math\", 0);\n token.markup = \"$\";\n token.content = state.src.slice(start, match);\n }\n\n state.pos = match + 1;\n return true;\n}\n\nfunction math_block(state, start, end, silent) {\n let firstLine,\n lastLine,\n next,\n lastPos,\n found = false,\n token,\n pos = state.bMarks[start] + state.tShift[start],\n max = state.eMarks[start];\n\n if (pos + 2 > max) {\n return false;\n }\n if (state.src.slice(pos, pos + 2) !== \"$$\") {\n return false;\n }\n\n pos += 2;\n firstLine = state.src.slice(pos, max);\n\n if (silent) {\n return true;\n }\n if (firstLine.trim().slice(-2) === \"$$\") {\n // Single line expression\n firstLine = firstLine.trim().slice(0, -2);\n found = true;\n }\n\n for (next = start; !found;) {\n next++;\n\n if (next >= end) {\n break;\n }\n\n pos = state.bMarks[next] + state.tShift[next];\n max = state.eMarks[next];\n\n if (pos < max && state.tShift[next] < state.blkIndent) {\n // non-empty line with negative indent should stop the list:\n break;\n }\n\n if (state.src.slice(pos, max).trim().slice(-2) === \"$$\") {\n lastPos = state.src.slice(0, max).lastIndexOf(\"$$\");\n lastLine = state.src.slice(pos, lastPos);\n found = true;\n }\n }\n\n state.line = next + 1;\n\n token = state.push(\"math_block\", \"math\", 0);\n token.block = true;\n token.content =\n (firstLine && firstLine.trim() ? firstLine + \"\\n\" : \"\") +\n state.getLines(start + 1, next, state.tShift[start], true) +\n (lastLine && lastLine.trim() ? lastLine : \"\");\n token.map = [start, state.line];\n token.markup = \"$$\";\n return true;\n}\n\nmodule.exports = (md, options) => {\n options = options || {};\n options.server = options.server || \"https://math.now.sh\";\n options.style = options.style || \"\";\n const purifiedURL = (latex) => {\n return encodeURIComponent(latex).replace(\"(\", \"%28\").replace(\")\", \"%29\");\n };\n\n let Inline = (latex) => {\n try {\n return ``;\n } catch (error) {\n console.error(error);\n return latex;\n }\n };\n\n let Block = (latex) => {\n try {\n return `

          `;\n } catch (error) {\n console.error(error);\n return latex;\n }\n };\n\n md.inline.ruler.after(\"escape\", \"math_inline\", math_inline);\n md.block.ruler.after(\"blockquote\", \"math_block\", math_block, {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n md.renderer.rules.math_inline = (tokens, idx) => {\n return Inline(tokens[idx].content);\n };\n md.renderer.rules.math_block = (tokens, idx) => {\n return Block(tokens[idx].content);\n };\n};\n","module.exports = flarum.core.compat['common/components/Modal'];","// Main parser class\n\n'use strict';\n\n\nvar utils = require('./common/utils');\nvar helpers = require('./helpers');\nvar Renderer = require('./renderer');\nvar ParserCore = require('./parser_core');\nvar ParserBlock = require('./parser_block');\nvar ParserInline = require('./parser_inline');\nvar LinkifyIt = require('linkify-it');\nvar mdurl = require('mdurl');\nvar punycode = require('punycode');\n\n\nvar config = {\n 'default': require('./presets/default'),\n zero: require('./presets/zero'),\n commonmark: require('./presets/commonmark')\n};\n\n////////////////////////////////////////////////////////////////////////////////\n//\n// This validator can prohibit more than really needed to prevent XSS. It's a\n// tradeoff to keep code simple and to be secure by default.\n//\n// If you need different setup - override validator method as you wish. Or\n// replace it with dummy function and use external sanitizer.\n//\n\nvar BAD_PROTO_RE = /^(vbscript|javascript|file|data):/;\nvar GOOD_DATA_RE = /^data:image\\/(gif|png|jpeg|webp);/;\n\nfunction validateLink(url) {\n // url should be normalized at this point, and existing entities are decoded\n var str = url.trim().toLowerCase();\n\n return BAD_PROTO_RE.test(str) ? (GOOD_DATA_RE.test(str) ? true : false) : true;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nvar RECODE_HOSTNAME_FOR = [ 'http:', 'https:', 'mailto:' ];\n\nfunction normalizeLink(url) {\n var parsed = mdurl.parse(url, true);\n\n if (parsed.hostname) {\n // Encode hostnames in urls like:\n // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n //\n // We don't encode unknown schemas, because it's likely that we encode\n // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n //\n if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n try {\n parsed.hostname = punycode.toASCII(parsed.hostname);\n } catch (er) { /**/ }\n }\n }\n\n return mdurl.encode(mdurl.format(parsed));\n}\n\nfunction normalizeLinkText(url) {\n var parsed = mdurl.parse(url, true);\n\n if (parsed.hostname) {\n // Encode hostnames in urls like:\n // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n //\n // We don't encode unknown schemas, because it's likely that we encode\n // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n //\n if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n try {\n parsed.hostname = punycode.toUnicode(parsed.hostname);\n } catch (er) { /**/ }\n }\n }\n\n return mdurl.decode(mdurl.format(parsed));\n}\n\n\n/**\n * class MarkdownIt\n *\n * Main parser/renderer class.\n *\n * ##### Usage\n *\n * ```javascript\n * // node.js, \"classic\" way:\n * var MarkdownIt = require('markdown-it'),\n * md = new MarkdownIt();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // node.js, the same, but with sugar:\n * var md = require('markdown-it')();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // browser without AMD, added to \"window\" on script load\n * // Note, there are no dash.\n * var md = window.markdownit();\n * var result = md.render('# markdown-it rulezz!');\n * ```\n *\n * Single line rendering, without paragraph wrap:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * var result = md.renderInline('__markdown-it__ rulezz!');\n * ```\n **/\n\n/**\n * new MarkdownIt([presetName, options])\n * - presetName (String): optional, `commonmark` / `zero`\n * - options (Object)\n *\n * Creates parser instanse with given config. Can be called without `new`.\n *\n * ##### presetName\n *\n * MarkdownIt provides named presets as a convenience to quickly\n * enable/disable active syntax rules and options for common use cases.\n *\n * - [\"commonmark\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.js) -\n * configures parser to strict [CommonMark](http://commonmark.org/) mode.\n * - [default](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/default.js) -\n * similar to GFM, used when no preset name given. Enables all available rules,\n * but still without html, typographer & autolinker.\n * - [\"zero\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.js) -\n * all rules disabled. Useful to quickly setup your config via `.enable()`.\n * For example, when you need only `bold` and `italic` markup and nothing else.\n *\n * ##### options:\n *\n * - __html__ - `false`. Set `true` to enable HTML tags in source. Be careful!\n * That's not safe! You may need external sanitizer to protect output from XSS.\n * It's better to extend features via plugins, instead of enabling HTML.\n * - __xhtmlOut__ - `false`. Set `true` to add '/' when closing single tags\n * (`
          `). This is needed only for full CommonMark compatibility. In real\n * world you will need HTML output.\n * - __breaks__ - `false`. Set `true` to convert `\\n` in paragraphs into `
          `.\n * - __langPrefix__ - `language-`. CSS language class prefix for fenced blocks.\n * Can be useful for external highlighters.\n * - __linkify__ - `false`. Set `true` to autoconvert URL-like text to links.\n * - __typographer__ - `false`. Set `true` to enable [some language-neutral\n * replacement](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.js) +\n * quotes beautification (smartquotes).\n * - __quotes__ - `“”‘’`, String or Array. Double + single quotes replacement\n * pairs, when typographer enabled and smartquotes on. For example, you can\n * use `'«»„“'` for Russian, `'„“‚‘'` for German, and\n * `['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›']` for French (including nbsp).\n * - __highlight__ - `null`. Highlighter function for fenced code blocks.\n * Highlighter `function (str, lang)` should return escaped HTML. It can also\n * return empty string if the source was not changed and should be escaped\n * externaly. If result starts with `):\n *\n * ```javascript\n * var hljs = require('highlight.js') // https://highlightjs.org/\n *\n * // Actual default values\n * var md = require('markdown-it')({\n * highlight: function (str, lang) {\n * if (lang && hljs.getLanguage(lang)) {\n * try {\n * return '
          ' +\n *                hljs.highlight(lang, str, true).value +\n *                '
          ';\n * } catch (__) {}\n * }\n *\n * return '
          ' + md.utils.escapeHtml(str) + '
          ';\n * }\n * });\n * ```\n *\n **/\nfunction MarkdownIt(presetName, options) {\n if (!(this instanceof MarkdownIt)) {\n return new MarkdownIt(presetName, options);\n }\n\n if (!options) {\n if (!utils.isString(presetName)) {\n options = presetName || {};\n presetName = 'default';\n }\n }\n\n /**\n * MarkdownIt#inline -> ParserInline\n *\n * Instance of [[ParserInline]]. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.inline = new ParserInline();\n\n /**\n * MarkdownIt#block -> ParserBlock\n *\n * Instance of [[ParserBlock]]. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.block = new ParserBlock();\n\n /**\n * MarkdownIt#core -> Core\n *\n * Instance of [[Core]] chain executor. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.core = new ParserCore();\n\n /**\n * MarkdownIt#renderer -> Renderer\n *\n * Instance of [[Renderer]]. Use it to modify output look. Or to add rendering\n * rules for new token types, generated by plugins.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * function myToken(tokens, idx, options, env, self) {\n * //...\n * return result;\n * };\n *\n * md.renderer.rules['my_token'] = myToken\n * ```\n *\n * See [[Renderer]] docs and [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js).\n **/\n this.renderer = new Renderer();\n\n /**\n * MarkdownIt#linkify -> LinkifyIt\n *\n * [linkify-it](https://github.com/markdown-it/linkify-it) instance.\n * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/linkify.js)\n * rule.\n **/\n this.linkify = new LinkifyIt();\n\n /**\n * MarkdownIt#validateLink(url) -> Boolean\n *\n * Link validation function. CommonMark allows too much in links. By default\n * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas\n * except some embedded image types.\n *\n * You can change this behaviour:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * // enable everything\n * md.validateLink = function () { return true; }\n * ```\n **/\n this.validateLink = validateLink;\n\n /**\n * MarkdownIt#normalizeLink(url) -> String\n *\n * Function used to encode link url to a machine-readable format,\n * which includes url-encoding, punycode, etc.\n **/\n this.normalizeLink = normalizeLink;\n\n /**\n * MarkdownIt#normalizeLinkText(url) -> String\n *\n * Function used to decode link url to a human-readable format`\n **/\n this.normalizeLinkText = normalizeLinkText;\n\n\n // Expose utils & helpers for easy acces from plugins\n\n /**\n * MarkdownIt#utils -> utils\n *\n * Assorted utility functions, useful to write plugins. See details\n * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.js).\n **/\n this.utils = utils;\n\n /**\n * MarkdownIt#helpers -> helpers\n *\n * Link components parser functions, useful to write plugins. See details\n * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers).\n **/\n this.helpers = utils.assign({}, helpers);\n\n\n this.options = {};\n this.configure(presetName);\n\n if (options) { this.set(options); }\n}\n\n\n/** chainable\n * MarkdownIt.set(options)\n *\n * Set parser options (in the same format as in constructor). Probably, you\n * will never need it, but you can change options after constructor call.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n * .set({ html: true, breaks: true })\n * .set({ typographer, true });\n * ```\n *\n * __Note:__ To achieve the best possible performance, don't modify a\n * `markdown-it` instance options on the fly. If you need multiple configurations\n * it's best to create multiple instances and initialize each with separate\n * config.\n **/\nMarkdownIt.prototype.set = function (options) {\n utils.assign(this.options, options);\n return this;\n};\n\n\n/** chainable, internal\n * MarkdownIt.configure(presets)\n *\n * Batch load of all options and compenent settings. This is internal method,\n * and you probably will not need it. But if you with - see available presets\n * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets)\n *\n * We strongly recommend to use presets instead of direct config loads. That\n * will give better compatibility with next versions.\n **/\nMarkdownIt.prototype.configure = function (presets) {\n var self = this, presetName;\n\n if (utils.isString(presets)) {\n presetName = presets;\n presets = config[presetName];\n if (!presets) { throw new Error('Wrong `markdown-it` preset \"' + presetName + '\", check name'); }\n }\n\n if (!presets) { throw new Error('Wrong `markdown-it` preset, can\\'t be empty'); }\n\n if (presets.options) { self.set(presets.options); }\n\n if (presets.components) {\n Object.keys(presets.components).forEach(function (name) {\n if (presets.components[name].rules) {\n self[name].ruler.enableOnly(presets.components[name].rules);\n }\n if (presets.components[name].rules2) {\n self[name].ruler2.enableOnly(presets.components[name].rules2);\n }\n });\n }\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.enable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to enable\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable list or rules. It will automatically find appropriate components,\n * containing rules with given names. If rule not found, and `ignoreInvalid`\n * not set - throws exception.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n * .enable(['sub', 'sup'])\n * .disable('smartquotes');\n * ```\n **/\nMarkdownIt.prototype.enable = function (list, ignoreInvalid) {\n var result = [];\n\n if (!Array.isArray(list)) { list = [ list ]; }\n\n [ 'core', 'block', 'inline' ].forEach(function (chain) {\n result = result.concat(this[chain].ruler.enable(list, true));\n }, this);\n\n result = result.concat(this.inline.ruler2.enable(list, true));\n\n var missed = list.filter(function (name) { return result.indexOf(name) < 0; });\n\n if (missed.length && !ignoreInvalid) {\n throw new Error('MarkdownIt. Failed to enable unknown rule(s): ' + missed);\n }\n\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.disable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * The same as [[MarkdownIt.enable]], but turn specified rules off.\n **/\nMarkdownIt.prototype.disable = function (list, ignoreInvalid) {\n var result = [];\n\n if (!Array.isArray(list)) { list = [ list ]; }\n\n [ 'core', 'block', 'inline' ].forEach(function (chain) {\n result = result.concat(this[chain].ruler.disable(list, true));\n }, this);\n\n result = result.concat(this.inline.ruler2.disable(list, true));\n\n var missed = list.filter(function (name) { return result.indexOf(name) < 0; });\n\n if (missed.length && !ignoreInvalid) {\n throw new Error('MarkdownIt. Failed to disable unknown rule(s): ' + missed);\n }\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.use(plugin, params)\n *\n * Load specified plugin with given params into current parser instance.\n * It's just a sugar to call `plugin(md, params)` with curring.\n *\n * ##### Example\n *\n * ```javascript\n * var iterator = require('markdown-it-for-inline');\n * var md = require('markdown-it')()\n * .use(iterator, 'foo_replace', 'text', function (tokens, idx) {\n * tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar');\n * });\n * ```\n **/\nMarkdownIt.prototype.use = function (plugin /*, params, ... */) {\n var args = [ this ].concat(Array.prototype.slice.call(arguments, 1));\n plugin.apply(plugin, args);\n return this;\n};\n\n\n/** internal\n * MarkdownIt.parse(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Parse input string and returns list of block tokens (special token type\n * \"inline\" will contain list of inline tokens). You should not call this\n * method directly, until you write custom renderer (for example, to produce\n * AST).\n *\n * `env` is used to pass data between \"distributed\" rules and return additional\n * metadata like reference info, needed for the renderer. It also can be used to\n * inject data in specific cases. Usually, you will be ok to pass `{}`,\n * and then pass updated object to renderer.\n **/\nMarkdownIt.prototype.parse = function (src, env) {\n if (typeof src !== 'string') {\n throw new Error('Input data should be a String');\n }\n\n var state = new this.core.State(src, this, env);\n\n this.core.process(state);\n\n return state.tokens;\n};\n\n\n/**\n * MarkdownIt.render(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Render markdown string into html. It does all magic for you :).\n *\n * `env` can be used to inject additional metadata (`{}` by default).\n * But you will not need it with high probability. See also comment\n * in [[MarkdownIt.parse]].\n **/\nMarkdownIt.prototype.render = function (src, env) {\n env = env || {};\n\n return this.renderer.render(this.parse(src, env), this.options, env);\n};\n\n\n/** internal\n * MarkdownIt.parseInline(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * The same as [[MarkdownIt.parse]] but skip all block rules. It returns the\n * block tokens list with the single `inline` element, containing parsed inline\n * tokens in `children` property. Also updates `env` object.\n **/\nMarkdownIt.prototype.parseInline = function (src, env) {\n var state = new this.core.State(src, this, env);\n\n state.inlineMode = true;\n this.core.process(state);\n\n return state.tokens;\n};\n\n\n/**\n * MarkdownIt.renderInline(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Similar to [[MarkdownIt.render]] but for single paragraph content. Result\n * will NOT be wrapped into `

          ` tags.\n **/\nMarkdownIt.prototype.renderInline = function (src, env) {\n env = env || {};\n\n return this.renderer.render(this.parseInline(src, env), this.options, env);\n};\n\n\nmodule.exports = MarkdownIt;\n","\n'use strict';\n\n\nvar encodeCache = {};\n\n\n// Create a lookup array where anything but characters in `chars` string\n// and alphanumeric chars is percent-encoded.\n//\nfunction getEncodeCache(exclude) {\n var i, ch, cache = encodeCache[exclude];\n if (cache) { return cache; }\n\n cache = encodeCache[exclude] = [];\n\n for (i = 0; i < 128; i++) {\n ch = String.fromCharCode(i);\n\n if (/^[0-9a-z]$/i.test(ch)) {\n // always allow unencoded alphanumeric characters\n cache.push(ch);\n } else {\n cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2));\n }\n }\n\n for (i = 0; i < exclude.length; i++) {\n cache[exclude.charCodeAt(i)] = exclude[i];\n }\n\n return cache;\n}\n\n\n// Encode unsafe characters with percent-encoding, skipping already\n// encoded sequences.\n//\n// - string - string to encode\n// - exclude - list of characters to ignore (in addition to a-zA-Z0-9)\n// - keepEscaped - don't encode '%' in a correct escape sequence (default: true)\n//\nfunction encode(string, exclude, keepEscaped) {\n var i, l, code, nextCode, cache,\n result = '';\n\n if (typeof exclude !== 'string') {\n // encode(string, keepEscaped)\n keepEscaped = exclude;\n exclude = encode.defaultChars;\n }\n\n if (typeof keepEscaped === 'undefined') {\n keepEscaped = true;\n }\n\n cache = getEncodeCache(exclude);\n\n for (i = 0, l = string.length; i < l; i++) {\n code = string.charCodeAt(i);\n\n if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {\n if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {\n result += string.slice(i, i + 3);\n i += 2;\n continue;\n }\n }\n\n if (code < 128) {\n result += cache[code];\n continue;\n }\n\n if (code >= 0xD800 && code <= 0xDFFF) {\n if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {\n nextCode = string.charCodeAt(i + 1);\n if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {\n result += encodeURIComponent(string[i] + string[i + 1]);\n i++;\n continue;\n }\n }\n result += '%EF%BF%BD';\n continue;\n }\n\n result += encodeURIComponent(string[i]);\n }\n\n return result;\n}\n\nencode.defaultChars = \";/?:@&=+$,-_.!~*'()#\";\nencode.componentChars = \"-_.!~*'()\";\n\n\nmodule.exports = encode;\n","\n'use strict';\n\n\n/* eslint-disable no-bitwise */\n\nvar decodeCache = {};\n\nfunction getDecodeCache(exclude) {\n var i, ch, cache = decodeCache[exclude];\n if (cache) { return cache; }\n\n cache = decodeCache[exclude] = [];\n\n for (i = 0; i < 128; i++) {\n ch = String.fromCharCode(i);\n cache.push(ch);\n }\n\n for (i = 0; i < exclude.length; i++) {\n ch = exclude.charCodeAt(i);\n cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2);\n }\n\n return cache;\n}\n\n\n// Decode percent-encoded string.\n//\nfunction decode(string, exclude) {\n var cache;\n\n if (typeof exclude !== 'string') {\n exclude = decode.defaultChars;\n }\n\n cache = getDecodeCache(exclude);\n\n return string.replace(/(%[a-f0-9]{2})+/gi, function(seq) {\n var i, l, b1, b2, b3, b4, chr,\n result = '';\n\n for (i = 0, l = seq.length; i < l; i += 3) {\n b1 = parseInt(seq.slice(i + 1, i + 3), 16);\n\n if (b1 < 0x80) {\n result += cache[b1];\n continue;\n }\n\n if ((b1 & 0xE0) === 0xC0 && (i + 3 < l)) {\n // 110xxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n\n if ((b2 & 0xC0) === 0x80) {\n chr = ((b1 << 6) & 0x7C0) | (b2 & 0x3F);\n\n if (chr < 0x80) {\n result += '\\ufffd\\ufffd';\n } else {\n result += String.fromCharCode(chr);\n }\n\n i += 3;\n continue;\n }\n }\n\n if ((b1 & 0xF0) === 0xE0 && (i + 6 < l)) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n\n if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n chr = ((b1 << 12) & 0xF000) | ((b2 << 6) & 0xFC0) | (b3 & 0x3F);\n\n if (chr < 0x800 || (chr >= 0xD800 && chr <= 0xDFFF)) {\n result += '\\ufffd\\ufffd\\ufffd';\n } else {\n result += String.fromCharCode(chr);\n }\n\n i += 6;\n continue;\n }\n }\n\n if ((b1 & 0xF8) === 0xF0 && (i + 9 < l)) {\n // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n b4 = parseInt(seq.slice(i + 10, i + 12), 16);\n\n if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) {\n chr = ((b1 << 18) & 0x1C0000) | ((b2 << 12) & 0x3F000) | ((b3 << 6) & 0xFC0) | (b4 & 0x3F);\n\n if (chr < 0x10000 || chr > 0x10FFFF) {\n result += '\\ufffd\\ufffd\\ufffd\\ufffd';\n } else {\n chr -= 0x10000;\n result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF));\n }\n\n i += 9;\n continue;\n }\n }\n\n result += '\\ufffd';\n }\n\n return result;\n });\n}\n\n\ndecode.defaultChars = ';/?:@&=+$,#';\ndecode.componentChars = '';\n\n\nmodule.exports = decode;\n","\n'use strict';\n\n\nmodule.exports = function format(url) {\n var result = '';\n\n result += url.protocol || '';\n result += url.slashes ? '//' : '';\n result += url.auth ? url.auth + '@' : '';\n\n if (url.hostname && url.hostname.indexOf(':') !== -1) {\n // ipv6 address\n result += '[' + url.hostname + ']';\n } else {\n result += url.hostname || '';\n }\n\n result += url.port ? ':' + url.port : '';\n result += url.pathname || '';\n result += url.search || '';\n result += url.hash || '';\n\n return result;\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n//\n// Changes from joyent/node:\n//\n// 1. No leading slash in paths,\n// e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/`\n//\n// 2. Backslashes are not replaced with slashes,\n// so `http:\\\\example.org\\` is treated like a relative path\n//\n// 3. Trailing colon is treated like a part of the path,\n// i.e. in `http://example.org:foo` pathname is `:foo`\n//\n// 4. Nothing is URL-encoded in the resulting object,\n// (in joyent/node some chars in auth and paths are encoded)\n//\n// 5. `url.parse()` does not have `parseQueryString` argument\n//\n// 6. Removed extraneous result properties: `host`, `path`, `query`, etc.,\n// which can be constructed using other parts of the url.\n//\n\n\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.pathname = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = [ '<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t' ],\n\n // RFC 2396: characters not allowed for various reasons.\n unwise = [ '{', '}', '|', '\\\\', '^', '`' ].concat(delims),\n\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = [ '\\'' ].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = [ '%', '/', '?', ';', '#' ].concat(autoEscape),\n hostEndingChars = [ '/', '?', '#' ],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n /* eslint-disable no-script-url */\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n };\n /* eslint-enable no-script-url */\n\nfunction urlParse(url, slashesDenoteHost) {\n if (url && url instanceof Url) { return url; }\n\n var u = new Url();\n u.parse(url, slashesDenoteHost);\n return u;\n}\n\nUrl.prototype.parse = function(url, slashesDenoteHost) {\n var i, l, lowerProto, hec, slashes,\n rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n }\n return this;\n }\n }\n\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n lowerProto = proto.toLowerCase();\n this.protocol = proto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n\n if (!hostlessProtocol[proto] &&\n (slashes || (proto && !slashedProtocol[proto]))) {\n\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (i = 0; i < hostEndingChars.length; i++) {\n hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n hostEnd = hec;\n }\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = auth;\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (i = 0; i < nonHostChars.length; i++) {\n hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n hostEnd = hec;\n }\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1) {\n hostEnd = rest.length;\n }\n\n if (rest[hostEnd - 1] === ':') { hostEnd--; }\n var host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost(host);\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' &&\n this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) { continue; }\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n }\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n }\n }\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n rest = rest.slice(0, qm);\n }\n if (rest) { this.pathname = rest; }\n if (slashedProtocol[lowerProto] &&\n this.hostname && !this.pathname) {\n this.pathname = '';\n }\n\n return this;\n};\n\nUrl.prototype.parseHost = function(host) {\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) { this.hostname = host; }\n};\n\nmodule.exports = urlParse;\n","'use strict';\n\nexports.Any = require('./properties/Any/regex');\nexports.Cc = require('./categories/Cc/regex');\nexports.Cf = require('./categories/Cf/regex');\nexports.P = require('./categories/P/regex');\nexports.Z = require('./categories/Z/regex');\n","module.exports=/[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/","// Just a shortcut for bulk export\n'use strict';\n\n\nexports.parseLinkLabel = require('./parse_link_label');\nexports.parseLinkDestination = require('./parse_link_destination');\nexports.parseLinkTitle = require('./parse_link_title');\n","// Parse link label\n//\n// this function assumes that first character (\"[\") already matches;\n// returns the end of the label\n//\n'use strict';\n\nmodule.exports = function parseLinkLabel(state, start, disableNested) {\n var level, found, marker, prevPos,\n labelEnd = -1,\n max = state.posMax,\n oldPos = state.pos;\n\n state.pos = start + 1;\n level = 1;\n\n while (state.pos < max) {\n marker = state.src.charCodeAt(state.pos);\n if (marker === 0x5D /* ] */) {\n level--;\n if (level === 0) {\n found = true;\n break;\n }\n }\n\n prevPos = state.pos;\n state.md.inline.skipToken(state);\n if (marker === 0x5B /* [ */) {\n if (prevPos === state.pos - 1) {\n // increase level if we find text `[`, which is not a part of any token\n level++;\n } else if (disableNested) {\n state.pos = oldPos;\n return -1;\n }\n }\n }\n\n if (found) {\n labelEnd = state.pos;\n }\n\n // restore old state\n state.pos = oldPos;\n\n return labelEnd;\n};\n","// Parse link destination\n//\n'use strict';\n\n\nvar unescapeAll = require('../common/utils').unescapeAll;\n\n\nmodule.exports = function parseLinkDestination(str, pos, max) {\n var code, level,\n lines = 0,\n start = pos,\n result = {\n ok: false,\n pos: 0,\n lines: 0,\n str: ''\n };\n\n if (str.charCodeAt(pos) === 0x3C /* < */) {\n pos++;\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === 0x0A /* \\n */) { return result; }\n if (code === 0x3E /* > */) {\n result.pos = pos + 1;\n result.str = unescapeAll(str.slice(start + 1, pos));\n result.ok = true;\n return result;\n }\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n pos++;\n }\n\n // no closing '>'\n return result;\n }\n\n // this should be ... } else { ... branch\n\n level = 0;\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x20) { break; }\n\n // ascii control characters\n if (code < 0x20 || code === 0x7F) { break; }\n\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n if (code === 0x28 /* ( */) {\n level++;\n }\n\n if (code === 0x29 /* ) */) {\n if (level === 0) { break; }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos) { return result; }\n if (level !== 0) { return result; }\n\n result.str = unescapeAll(str.slice(start, pos));\n result.lines = lines;\n result.pos = pos;\n result.ok = true;\n return result;\n};\n","// Parse link title\n//\n'use strict';\n\n\nvar unescapeAll = require('../common/utils').unescapeAll;\n\n\nmodule.exports = function parseLinkTitle(str, pos, max) {\n var code,\n marker,\n lines = 0,\n start = pos,\n result = {\n ok: false,\n pos: 0,\n lines: 0,\n str: ''\n };\n\n if (pos >= max) { return result; }\n\n marker = str.charCodeAt(pos);\n\n if (marker !== 0x22 /* \" */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return result; }\n\n pos++;\n\n // if opening marker is \"(\", switch it to closing marker \")\"\n if (marker === 0x28) { marker = 0x29; }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === marker) {\n result.pos = pos + 1;\n result.lines = lines;\n result.str = unescapeAll(str.slice(start + 1, pos));\n result.ok = true;\n return result;\n } else if (code === 0x0A) {\n lines++;\n } else if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos++;\n if (str.charCodeAt(pos) === 0x0A) {\n lines++;\n }\n }\n\n pos++;\n }\n\n return result;\n};\n","/**\n * class Renderer\n *\n * Generates HTML from parsed token stream. Each instance has independent\n * copy of rules. Those can be rewritten with ease. Also, you can add new\n * rules if you create plugin and adds new token types.\n **/\n'use strict';\n\n\nvar assign = require('./common/utils').assign;\nvar unescapeAll = require('./common/utils').unescapeAll;\nvar escapeHtml = require('./common/utils').escapeHtml;\n\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar default_rules = {};\n\n\ndefault_rules.code_inline = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n return '' +\n escapeHtml(tokens[idx].content) +\n '';\n};\n\n\ndefault_rules.code_block = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n return '' +\n escapeHtml(tokens[idx].content) +\n '\\n';\n};\n\n\ndefault_rules.fence = function (tokens, idx, options, env, slf) {\n var token = tokens[idx],\n info = token.info ? unescapeAll(token.info).trim() : '',\n langName = '',\n highlighted, i, tmpAttrs, tmpToken;\n\n if (info) {\n langName = info.split(/\\s+/g)[0];\n }\n\n if (options.highlight) {\n highlighted = options.highlight(token.content, langName) || escapeHtml(token.content);\n } else {\n highlighted = escapeHtml(token.content);\n }\n\n if (highlighted.indexOf(''\n + highlighted\n + '\\n';\n }\n\n\n return '

          '\n        + highlighted\n        + '
          \\n';\n};\n\n\ndefault_rules.image = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n // \"alt\" attr MUST be set, even if empty. Because it's mandatory and\n // should be placed on proper position for tests.\n //\n // Replace content with actual value\n\n token.attrs[token.attrIndex('alt')][1] =\n slf.renderInlineAsText(token.children, options, env);\n\n return slf.renderToken(tokens, idx, options);\n};\n\n\ndefault_rules.hardbreak = function (tokens, idx, options /*, env */) {\n return options.xhtmlOut ? '
          \\n' : '
          \\n';\n};\ndefault_rules.softbreak = function (tokens, idx, options /*, env */) {\n return options.breaks ? (options.xhtmlOut ? '
          \\n' : '
          \\n') : '\\n';\n};\n\n\ndefault_rules.text = function (tokens, idx /*, options, env */) {\n return escapeHtml(tokens[idx].content);\n};\n\n\ndefault_rules.html_block = function (tokens, idx /*, options, env */) {\n return tokens[idx].content;\n};\ndefault_rules.html_inline = function (tokens, idx /*, options, env */) {\n return tokens[idx].content;\n};\n\n\n/**\n * new Renderer()\n *\n * Creates new [[Renderer]] instance and fill [[Renderer#rules]] with defaults.\n **/\nfunction Renderer() {\n\n /**\n * Renderer#rules -> Object\n *\n * Contains render rules for tokens. Can be updated and extended.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.renderer.rules.strong_open = function () { return ''; };\n * md.renderer.rules.strong_close = function () { return ''; };\n *\n * var result = md.renderInline(...);\n * ```\n *\n * Each rule is called as independent static function with fixed signature:\n *\n * ```javascript\n * function my_token_render(tokens, idx, options, env, renderer) {\n * // ...\n * return renderedHTML;\n * }\n * ```\n *\n * See [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js)\n * for more details and examples.\n **/\n this.rules = assign({}, default_rules);\n}\n\n\n/**\n * Renderer.renderAttrs(token) -> String\n *\n * Render token attributes to string.\n **/\nRenderer.prototype.renderAttrs = function renderAttrs(token) {\n var i, l, result;\n\n if (!token.attrs) { return ''; }\n\n result = '';\n\n for (i = 0, l = token.attrs.length; i < l; i++) {\n result += ' ' + escapeHtml(token.attrs[i][0]) + '=\"' + escapeHtml(token.attrs[i][1]) + '\"';\n }\n\n return result;\n};\n\n\n/**\n * Renderer.renderToken(tokens, idx, options) -> String\n * - tokens (Array): list of tokens\n * - idx (Numbed): token index to render\n * - options (Object): params of parser instance\n *\n * Default token renderer. Can be overriden by custom function\n * in [[Renderer#rules]].\n **/\nRenderer.prototype.renderToken = function renderToken(tokens, idx, options) {\n var nextToken,\n result = '',\n needLf = false,\n token = tokens[idx];\n\n // Tight list paragraphs\n if (token.hidden) {\n return '';\n }\n\n // Insert a newline between hidden paragraph and subsequent opening\n // block-level tag.\n //\n // For example, here we should insert a newline before blockquote:\n // - a\n // >\n //\n if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) {\n result += '\\n';\n }\n\n // Add token name, e.g. `
        • `.\n //\n needLf = false;\n }\n }\n }\n }\n\n result += needLf ? '>\\n' : '>';\n\n return result;\n};\n\n\n/**\n * Renderer.renderInline(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to renter\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * The same as [[Renderer.render]], but for single token of `inline` type.\n **/\nRenderer.prototype.renderInline = function (tokens, options, env) {\n var type,\n result = '',\n rules = this.rules;\n\n for (var i = 0, len = tokens.length; i < len; i++) {\n type = tokens[i].type;\n\n if (typeof rules[type] !== 'undefined') {\n result += rules[type](tokens, i, options, env, this);\n } else {\n result += this.renderToken(tokens, i, options);\n }\n }\n\n return result;\n};\n\n\n/** internal\n * Renderer.renderInlineAsText(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to renter\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Special kludge for image `alt` attributes to conform CommonMark spec.\n * Don't try to use it! Spec requires to show `alt` content with stripped markup,\n * instead of simple escaping.\n **/\nRenderer.prototype.renderInlineAsText = function (tokens, options, env) {\n var result = '';\n\n for (var i = 0, len = tokens.length; i < len; i++) {\n if (tokens[i].type === 'text') {\n result += tokens[i].content;\n } else if (tokens[i].type === 'image') {\n result += this.renderInlineAsText(tokens[i].children, options, env);\n }\n }\n\n return result;\n};\n\n\n/**\n * Renderer.render(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to renter\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Takes token stream and generates HTML. Probably, you will never need to call\n * this method directly.\n **/\nRenderer.prototype.render = function (tokens, options, env) {\n var i, len, type,\n result = '',\n rules = this.rules;\n\n for (i = 0, len = tokens.length; i < len; i++) {\n type = tokens[i].type;\n\n if (type === 'inline') {\n result += this.renderInline(tokens[i].children, options, env);\n } else if (typeof rules[type] !== 'undefined') {\n result += rules[tokens[i].type](tokens, i, options, env, this);\n } else {\n result += this.renderToken(tokens, i, options, env);\n }\n }\n\n return result;\n};\n\nmodule.exports = Renderer;\n","/** internal\n * class Core\n *\n * Top-level rules executor. Glues block/inline parsers and does intermediate\n * transformations.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\nvar _rules = [\n [ 'normalize', require('./rules_core/normalize') ],\n [ 'block', require('./rules_core/block') ],\n [ 'inline', require('./rules_core/inline') ],\n [ 'linkify', require('./rules_core/linkify') ],\n [ 'replacements', require('./rules_core/replacements') ],\n [ 'smartquotes', require('./rules_core/smartquotes') ]\n];\n\n\n/**\n * new Core()\n **/\nfunction Core() {\n /**\n * Core#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of core rules.\n **/\n this.ruler = new Ruler();\n\n for (var i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1]);\n }\n}\n\n\n/**\n * Core.process(state)\n *\n * Executes core chain rules.\n **/\nCore.prototype.process = function (state) {\n var i, l, rules;\n\n rules = this.ruler.getRules('');\n\n for (i = 0, l = rules.length; i < l; i++) {\n rules[i](state);\n }\n};\n\nCore.prototype.State = require('./rules_core/state_core');\n\n\nmodule.exports = Core;\n","// Normalize input string\n\n'use strict';\n\n\n// https://spec.commonmark.org/0.29/#line-ending\nvar NEWLINES_RE = /\\r\\n?|\\n/g;\nvar NULL_RE = /\\0/g;\n\n\nmodule.exports = function normalize(state) {\n var str;\n\n // Normalize newlines\n str = state.src.replace(NEWLINES_RE, '\\n');\n\n // Replace NULL characters\n str = str.replace(NULL_RE, '\\uFFFD');\n\n state.src = str;\n};\n","'use strict';\n\n\nmodule.exports = function block(state) {\n var token;\n\n if (state.inlineMode) {\n token = new state.Token('inline', '', 0);\n token.content = state.src;\n token.map = [ 0, 1 ];\n token.children = [];\n state.tokens.push(token);\n } else {\n state.md.block.parse(state.src, state.md, state.env, state.tokens);\n }\n};\n","'use strict';\n\nmodule.exports = function inline(state) {\n var tokens = state.tokens, tok, i, l;\n\n // Parse inlines\n for (i = 0, l = tokens.length; i < l; i++) {\n tok = tokens[i];\n if (tok.type === 'inline') {\n state.md.inline.parse(tok.content, state.md, state.env, tok.children);\n }\n }\n};\n","// Replace link-like texts with link nodes.\n//\n// Currently restricted by `md.validateLink()` to http/https/ftp\n//\n'use strict';\n\n\nvar arrayReplaceAt = require('../common/utils').arrayReplaceAt;\n\n\nfunction isLinkOpen(str) {\n return /^\\s]/i.test(str);\n}\nfunction isLinkClose(str) {\n return /^<\\/a\\s*>/i.test(str);\n}\n\n\nmodule.exports = function linkify(state) {\n var i, j, l, tokens, token, currentToken, nodes, ln, text, pos, lastPos,\n level, htmlLinkLevel, url, fullUrl, urlText,\n blockTokens = state.tokens,\n links;\n\n if (!state.md.options.linkify) { return; }\n\n for (j = 0, l = blockTokens.length; j < l; j++) {\n if (blockTokens[j].type !== 'inline' ||\n !state.md.linkify.pretest(blockTokens[j].content)) {\n continue;\n }\n\n tokens = blockTokens[j].children;\n\n htmlLinkLevel = 0;\n\n // We scan from the end, to keep position when new tags added.\n // Use reversed logic in links start/end match\n for (i = tokens.length - 1; i >= 0; i--) {\n currentToken = tokens[i];\n\n // Skip content of markdown links\n if (currentToken.type === 'link_close') {\n i--;\n while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') {\n i--;\n }\n continue;\n }\n\n // Skip content of html tag links\n if (currentToken.type === 'html_inline') {\n if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) {\n htmlLinkLevel--;\n }\n if (isLinkClose(currentToken.content)) {\n htmlLinkLevel++;\n }\n }\n if (htmlLinkLevel > 0) { continue; }\n\n if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) {\n\n text = currentToken.content;\n links = state.md.linkify.match(text);\n\n // Now split string to nodes\n nodes = [];\n level = currentToken.level;\n lastPos = 0;\n\n for (ln = 0; ln < links.length; ln++) {\n\n url = links[ln].url;\n fullUrl = state.md.normalizeLink(url);\n if (!state.md.validateLink(fullUrl)) { continue; }\n\n urlText = links[ln].text;\n\n // Linkifier might send raw hostnames like \"example.com\", where url\n // starts with domain name. So we prepend http:// in those cases,\n // and remove it afterwards.\n //\n if (!links[ln].schema) {\n urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\\/\\//, '');\n } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) {\n urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, '');\n } else {\n urlText = state.md.normalizeLinkText(urlText);\n }\n\n pos = links[ln].index;\n\n if (pos > lastPos) {\n token = new state.Token('text', '', 0);\n token.content = text.slice(lastPos, pos);\n token.level = level;\n nodes.push(token);\n }\n\n token = new state.Token('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.level = level++;\n token.markup = 'linkify';\n token.info = 'auto';\n nodes.push(token);\n\n token = new state.Token('text', '', 0);\n token.content = urlText;\n token.level = level;\n nodes.push(token);\n\n token = new state.Token('link_close', 'a', -1);\n token.level = --level;\n token.markup = 'linkify';\n token.info = 'auto';\n nodes.push(token);\n\n lastPos = links[ln].lastIndex;\n }\n if (lastPos < text.length) {\n token = new state.Token('text', '', 0);\n token.content = text.slice(lastPos);\n token.level = level;\n nodes.push(token);\n }\n\n // replace current node\n blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes);\n }\n }\n }\n};\n","// Simple typographic replacements\n//\n// (c) (C) → ©\n// (tm) (TM) → ™\n// (r) (R) → ®\n// +- → ±\n// (p) (P) -> §\n// ... → … (also ?.... → ?.., !.... → !..)\n// ???????? → ???, !!!!! → !!!, `,,` → `,`\n// -- → –, --- → —\n//\n'use strict';\n\n// TODO:\n// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾\n// - miltiplication 2 x 4 -> 2 × 4\n\nvar RARE_RE = /\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/;\n\n// Workaround for phantomjs - need regex without /g flag,\n// or root check will fail every second time\nvar SCOPED_ABBR_TEST_RE = /\\((c|tm|r|p)\\)/i;\n\nvar SCOPED_ABBR_RE = /\\((c|tm|r|p)\\)/ig;\nvar SCOPED_ABBR = {\n c: '©',\n r: '®',\n p: '§',\n tm: '™'\n};\n\nfunction replaceFn(match, name) {\n return SCOPED_ABBR[name.toLowerCase()];\n}\n\nfunction replace_scoped(inlineTokens) {\n var i, token, inside_autolink = 0;\n\n for (i = inlineTokens.length - 1; i >= 0; i--) {\n token = inlineTokens[i];\n\n if (token.type === 'text' && !inside_autolink) {\n token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn);\n }\n\n if (token.type === 'link_open' && token.info === 'auto') {\n inside_autolink--;\n }\n\n if (token.type === 'link_close' && token.info === 'auto') {\n inside_autolink++;\n }\n }\n}\n\nfunction replace_rare(inlineTokens) {\n var i, token, inside_autolink = 0;\n\n for (i = inlineTokens.length - 1; i >= 0; i--) {\n token = inlineTokens[i];\n\n if (token.type === 'text' && !inside_autolink) {\n if (RARE_RE.test(token.content)) {\n token.content = token.content\n .replace(/\\+-/g, '±')\n // .., ..., ....... -> …\n // but ?..... & !..... -> ?.. & !..\n .replace(/\\.{2,}/g, '…').replace(/([?!])…/g, '$1..')\n .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',')\n // em-dash\n .replace(/(^|[^-])---([^-]|$)/mg, '$1\\u2014$2')\n // en-dash\n .replace(/(^|\\s)--(\\s|$)/mg, '$1\\u2013$2')\n .replace(/(^|[^-\\s])--([^-\\s]|$)/mg, '$1\\u2013$2');\n }\n }\n\n if (token.type === 'link_open' && token.info === 'auto') {\n inside_autolink--;\n }\n\n if (token.type === 'link_close' && token.info === 'auto') {\n inside_autolink++;\n }\n }\n}\n\n\nmodule.exports = function replace(state) {\n var blkIdx;\n\n if (!state.md.options.typographer) { return; }\n\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n\n if (state.tokens[blkIdx].type !== 'inline') { continue; }\n\n if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) {\n replace_scoped(state.tokens[blkIdx].children);\n }\n\n if (RARE_RE.test(state.tokens[blkIdx].content)) {\n replace_rare(state.tokens[blkIdx].children);\n }\n\n }\n};\n","// Convert straight quotation marks to typographic ones\n//\n'use strict';\n\n\nvar isWhiteSpace = require('../common/utils').isWhiteSpace;\nvar isPunctChar = require('../common/utils').isPunctChar;\nvar isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;\n\nvar QUOTE_TEST_RE = /['\"]/;\nvar QUOTE_RE = /['\"]/g;\nvar APOSTROPHE = '\\u2019'; /* ’ */\n\n\nfunction replaceAt(str, index, ch) {\n return str.substr(0, index) + ch + str.substr(index + 1);\n}\n\nfunction process_inlines(tokens, state) {\n var i, token, text, t, pos, max, thisLevel, item, lastChar, nextChar,\n isLastPunctChar, isNextPunctChar, isLastWhiteSpace, isNextWhiteSpace,\n canOpen, canClose, j, isSingle, stack, openQuote, closeQuote;\n\n stack = [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n\n thisLevel = tokens[i].level;\n\n for (j = stack.length - 1; j >= 0; j--) {\n if (stack[j].level <= thisLevel) { break; }\n }\n stack.length = j + 1;\n\n if (token.type !== 'text') { continue; }\n\n text = token.content;\n pos = 0;\n max = text.length;\n\n /*eslint no-labels:0,block-scoped-var:0*/\n OUTER:\n while (pos < max) {\n QUOTE_RE.lastIndex = pos;\n t = QUOTE_RE.exec(text);\n if (!t) { break; }\n\n canOpen = canClose = true;\n pos = t.index + 1;\n isSingle = (t[0] === \"'\");\n\n // Find previous character,\n // default to space if it's the beginning of the line\n //\n lastChar = 0x20;\n\n if (t.index - 1 >= 0) {\n lastChar = text.charCodeAt(t.index - 1);\n } else {\n for (j = i - 1; j >= 0; j--) {\n if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // lastChar defaults to 0x20\n if (tokens[j].type !== 'text') continue;\n\n lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1);\n break;\n }\n }\n\n // Find next character,\n // default to space if it's the end of the line\n //\n nextChar = 0x20;\n\n if (pos < max) {\n nextChar = text.charCodeAt(pos);\n } else {\n for (j = i + 1; j < tokens.length; j++) {\n if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // nextChar defaults to 0x20\n if (tokens[j].type !== 'text') continue;\n\n nextChar = tokens[j].content.charCodeAt(0);\n break;\n }\n }\n\n isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));\n isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));\n\n isLastWhiteSpace = isWhiteSpace(lastChar);\n isNextWhiteSpace = isWhiteSpace(nextChar);\n\n if (isNextWhiteSpace) {\n canOpen = false;\n } else if (isNextPunctChar) {\n if (!(isLastWhiteSpace || isLastPunctChar)) {\n canOpen = false;\n }\n }\n\n if (isLastWhiteSpace) {\n canClose = false;\n } else if (isLastPunctChar) {\n if (!(isNextWhiteSpace || isNextPunctChar)) {\n canClose = false;\n }\n }\n\n if (nextChar === 0x22 /* \" */ && t[0] === '\"') {\n if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) {\n // special case: 1\"\" - count first quote as an inch\n canClose = canOpen = false;\n }\n }\n\n if (canOpen && canClose) {\n // treat this as the middle of the word\n canOpen = false;\n canClose = isNextPunctChar;\n }\n\n if (!canOpen && !canClose) {\n // middle of word\n if (isSingle) {\n token.content = replaceAt(token.content, t.index, APOSTROPHE);\n }\n continue;\n }\n\n if (canClose) {\n // this could be a closing quote, rewind the stack to get a match\n for (j = stack.length - 1; j >= 0; j--) {\n item = stack[j];\n if (stack[j].level < thisLevel) { break; }\n if (item.single === isSingle && stack[j].level === thisLevel) {\n item = stack[j];\n\n if (isSingle) {\n openQuote = state.md.options.quotes[2];\n closeQuote = state.md.options.quotes[3];\n } else {\n openQuote = state.md.options.quotes[0];\n closeQuote = state.md.options.quotes[1];\n }\n\n // replace token.content *before* tokens[item.token].content,\n // because, if they are pointing at the same token, replaceAt\n // could mess up indices when quote length != 1\n token.content = replaceAt(token.content, t.index, closeQuote);\n tokens[item.token].content = replaceAt(\n tokens[item.token].content, item.pos, openQuote);\n\n pos += closeQuote.length - 1;\n if (item.token === i) { pos += openQuote.length - 1; }\n\n text = token.content;\n max = text.length;\n\n stack.length = j;\n continue OUTER;\n }\n }\n }\n\n if (canOpen) {\n stack.push({\n token: i,\n pos: t.index,\n single: isSingle,\n level: thisLevel\n });\n } else if (canClose && isSingle) {\n token.content = replaceAt(token.content, t.index, APOSTROPHE);\n }\n }\n }\n}\n\n\nmodule.exports = function smartquotes(state) {\n /*eslint max-depth:0*/\n var blkIdx;\n\n if (!state.md.options.typographer) { return; }\n\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n\n if (state.tokens[blkIdx].type !== 'inline' ||\n !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) {\n continue;\n }\n\n process_inlines(state.tokens[blkIdx].children, state);\n }\n};\n","// Core state object\n//\n'use strict';\n\nvar Token = require('../token');\n\n\nfunction StateCore(src, md, env) {\n this.src = src;\n this.env = env;\n this.tokens = [];\n this.inlineMode = false;\n this.md = md; // link to parser instance\n}\n\n// re-export Token class to use in core rules\nStateCore.prototype.Token = Token;\n\n\nmodule.exports = StateCore;\n","/** internal\n * class ParserBlock\n *\n * Block-level tokenizer.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\nvar _rules = [\n // First 2 params - rule name & source. Secondary array - list of rules,\n // which can be terminated by this one.\n [ 'table', require('./rules_block/table'), [ 'paragraph', 'reference' ] ],\n [ 'code', require('./rules_block/code') ],\n [ 'fence', require('./rules_block/fence'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'blockquote', require('./rules_block/blockquote'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'hr', require('./rules_block/hr'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'list', require('./rules_block/list'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'reference', require('./rules_block/reference') ],\n [ 'heading', require('./rules_block/heading'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'lheading', require('./rules_block/lheading') ],\n [ 'html_block', require('./rules_block/html_block'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'paragraph', require('./rules_block/paragraph') ]\n];\n\n\n/**\n * new ParserBlock()\n **/\nfunction ParserBlock() {\n /**\n * ParserBlock#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of block rules.\n **/\n this.ruler = new Ruler();\n\n for (var i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1], { alt: (_rules[i][2] || []).slice() });\n }\n}\n\n\n// Generate tokens for input range\n//\nParserBlock.prototype.tokenize = function (state, startLine, endLine) {\n var ok, i,\n rules = this.ruler.getRules(''),\n len = rules.length,\n line = startLine,\n hasEmptyLines = false,\n maxNesting = state.md.options.maxNesting;\n\n while (line < endLine) {\n state.line = line = state.skipEmptyLines(line);\n if (line >= endLine) { break; }\n\n // Termination condition for nested calls.\n // Nested calls currently used for blockquotes & lists\n if (state.sCount[line] < state.blkIndent) { break; }\n\n // If nesting level exceeded - skip tail to the end. That's not ordinary\n // situation and we should not care about content.\n if (state.level >= maxNesting) {\n state.line = endLine;\n break;\n }\n\n // Try all possible rules.\n // On success, rule should:\n //\n // - update `state.line`\n // - update `state.tokens`\n // - return true\n\n for (i = 0; i < len; i++) {\n ok = rules[i](state, line, endLine, false);\n if (ok) { break; }\n }\n\n // set state.tight if we had an empty line before current tag\n // i.e. latest empty line should not count\n state.tight = !hasEmptyLines;\n\n // paragraph might \"eat\" one newline after it in nested lists\n if (state.isEmpty(state.line - 1)) {\n hasEmptyLines = true;\n }\n\n line = state.line;\n\n if (line < endLine && state.isEmpty(line)) {\n hasEmptyLines = true;\n line++;\n state.line = line;\n }\n }\n};\n\n\n/**\n * ParserBlock.parse(str, md, env, outTokens)\n *\n * Process input string and push block tokens into `outTokens`\n **/\nParserBlock.prototype.parse = function (src, md, env, outTokens) {\n var state;\n\n if (!src) { return; }\n\n state = new this.State(src, md, env, outTokens);\n\n this.tokenize(state, state.line, state.lineMax);\n};\n\n\nParserBlock.prototype.State = require('./rules_block/state_block');\n\n\nmodule.exports = ParserBlock;\n","// GFM table, non-standard\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nfunction getLine(state, line) {\n var pos = state.bMarks[line] + state.blkIndent,\n max = state.eMarks[line];\n\n return state.src.substr(pos, max - pos);\n}\n\nfunction escapedSplit(str) {\n var result = [],\n pos = 0,\n max = str.length,\n ch,\n escapes = 0,\n lastPos = 0,\n backTicked = false,\n lastBackTick = 0;\n\n ch = str.charCodeAt(pos);\n\n while (pos < max) {\n if (ch === 0x60/* ` */) {\n if (backTicked) {\n // make \\` close code sequence, but not open it;\n // the reason is: `\\` is correct code block\n backTicked = false;\n lastBackTick = pos;\n } else if (escapes % 2 === 0) {\n backTicked = true;\n lastBackTick = pos;\n }\n } else if (ch === 0x7c/* | */ && (escapes % 2 === 0) && !backTicked) {\n result.push(str.substring(lastPos, pos));\n lastPos = pos + 1;\n }\n\n if (ch === 0x5c/* \\ */) {\n escapes++;\n } else {\n escapes = 0;\n }\n\n pos++;\n\n // If there was an un-closed backtick, go back to just after\n // the last backtick, but as if it was a normal character\n if (pos === max && backTicked) {\n backTicked = false;\n pos = lastBackTick + 1;\n }\n\n ch = str.charCodeAt(pos);\n }\n\n result.push(str.substring(lastPos));\n\n return result;\n}\n\n\nmodule.exports = function table(state, startLine, endLine, silent) {\n var ch, lineText, pos, i, nextLine, columns, columnCount, token,\n aligns, t, tableLines, tbodyLines;\n\n // should have at least two lines\n if (startLine + 2 > endLine) { return false; }\n\n nextLine = startLine + 1;\n\n if (state.sCount[nextLine] < state.blkIndent) { return false; }\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[nextLine] - state.blkIndent >= 4) { return false; }\n\n // first character of the second line should be '|', '-', ':',\n // and no other characters are allowed but spaces;\n // basically, this is the equivalent of /^[-:|][-:|\\s]*$/ regexp\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n if (pos >= state.eMarks[nextLine]) { return false; }\n\n ch = state.src.charCodeAt(pos++);\n if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */) { return false; }\n\n while (pos < state.eMarks[nextLine]) {\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */ && !isSpace(ch)) { return false; }\n\n pos++;\n }\n\n lineText = getLine(state, startLine + 1);\n\n columns = lineText.split('|');\n aligns = [];\n for (i = 0; i < columns.length; i++) {\n t = columns[i].trim();\n if (!t) {\n // allow empty columns before and after table, but not in between columns;\n // e.g. allow ` |---| `, disallow ` ---||--- `\n if (i === 0 || i === columns.length - 1) {\n continue;\n } else {\n return false;\n }\n }\n\n if (!/^:?-+:?$/.test(t)) { return false; }\n if (t.charCodeAt(t.length - 1) === 0x3A/* : */) {\n aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right');\n } else if (t.charCodeAt(0) === 0x3A/* : */) {\n aligns.push('left');\n } else {\n aligns.push('');\n }\n }\n\n lineText = getLine(state, startLine).trim();\n if (lineText.indexOf('|') === -1) { return false; }\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n columns = escapedSplit(lineText.replace(/^\\||\\|$/g, ''));\n\n // header row will define an amount of columns in the entire table,\n // and align row shouldn't be smaller than that (the rest of the rows can)\n columnCount = columns.length;\n if (columnCount > aligns.length) { return false; }\n\n if (silent) { return true; }\n\n token = state.push('table_open', 'table', 1);\n token.map = tableLines = [ startLine, 0 ];\n\n token = state.push('thead_open', 'thead', 1);\n token.map = [ startLine, startLine + 1 ];\n\n token = state.push('tr_open', 'tr', 1);\n token.map = [ startLine, startLine + 1 ];\n\n for (i = 0; i < columns.length; i++) {\n token = state.push('th_open', 'th', 1);\n token.map = [ startLine, startLine + 1 ];\n if (aligns[i]) {\n token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ];\n }\n\n token = state.push('inline', '', 0);\n token.content = columns[i].trim();\n token.map = [ startLine, startLine + 1 ];\n token.children = [];\n\n token = state.push('th_close', 'th', -1);\n }\n\n token = state.push('tr_close', 'tr', -1);\n token = state.push('thead_close', 'thead', -1);\n\n token = state.push('tbody_open', 'tbody', 1);\n token.map = tbodyLines = [ startLine + 2, 0 ];\n\n for (nextLine = startLine + 2; nextLine < endLine; nextLine++) {\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n lineText = getLine(state, nextLine).trim();\n if (lineText.indexOf('|') === -1) { break; }\n if (state.sCount[nextLine] - state.blkIndent >= 4) { break; }\n columns = escapedSplit(lineText.replace(/^\\||\\|$/g, ''));\n\n token = state.push('tr_open', 'tr', 1);\n for (i = 0; i < columnCount; i++) {\n token = state.push('td_open', 'td', 1);\n if (aligns[i]) {\n token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ];\n }\n\n token = state.push('inline', '', 0);\n token.content = columns[i] ? columns[i].trim() : '';\n token.children = [];\n\n token = state.push('td_close', 'td', -1);\n }\n token = state.push('tr_close', 'tr', -1);\n }\n token = state.push('tbody_close', 'tbody', -1);\n token = state.push('table_close', 'table', -1);\n\n tableLines[1] = tbodyLines[1] = nextLine;\n state.line = nextLine;\n return true;\n};\n","// Code block (4 spaces padded)\n\n'use strict';\n\n\nmodule.exports = function code(state, startLine, endLine/*, silent*/) {\n var nextLine, last, token;\n\n if (state.sCount[startLine] - state.blkIndent < 4) { return false; }\n\n last = nextLine = startLine + 1;\n\n while (nextLine < endLine) {\n if (state.isEmpty(nextLine)) {\n nextLine++;\n continue;\n }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n nextLine++;\n last = nextLine;\n continue;\n }\n break;\n }\n\n state.line = last;\n\n token = state.push('code_block', 'code', 0);\n token.content = state.getLines(startLine, last, 4 + state.blkIndent, true);\n token.map = [ startLine, state.line ];\n\n return true;\n};\n","// fences (``` lang, ~~~ lang)\n\n'use strict';\n\n\nmodule.exports = function fence(state, startLine, endLine, silent) {\n var marker, len, params, nextLine, mem, token, markup,\n haveEndMarker = false,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (pos + 3 > max) { return false; }\n\n marker = state.src.charCodeAt(pos);\n\n if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) {\n return false;\n }\n\n // scan marker length\n mem = pos;\n pos = state.skipChars(pos, marker);\n\n len = pos - mem;\n\n if (len < 3) { return false; }\n\n markup = state.src.slice(mem, pos);\n params = state.src.slice(pos, max);\n\n if (marker === 0x60 /* ` */) {\n if (params.indexOf(String.fromCharCode(marker)) >= 0) {\n return false;\n }\n }\n\n // Since start is found, we can report success here in validation mode\n if (silent) { return true; }\n\n // search end of block\n nextLine = startLine;\n\n for (;;) {\n nextLine++;\n if (nextLine >= endLine) {\n // unclosed block should be autoclosed by end of document.\n // also block seems to be autoclosed by end of parent\n break;\n }\n\n pos = mem = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos < max && state.sCount[nextLine] < state.blkIndent) {\n // non-empty line with negative indent should stop the list:\n // - ```\n // test\n break;\n }\n\n if (state.src.charCodeAt(pos) !== marker) { continue; }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n // closing fence should be indented less than 4 spaces\n continue;\n }\n\n pos = state.skipChars(pos, marker);\n\n // closing code fence must be at least as long as the opening one\n if (pos - mem < len) { continue; }\n\n // make sure tail has spaces only\n pos = state.skipSpaces(pos);\n\n if (pos < max) { continue; }\n\n haveEndMarker = true;\n // found!\n break;\n }\n\n // If a fence has heading spaces, they should be removed from its inner block\n len = state.sCount[startLine];\n\n state.line = nextLine + (haveEndMarker ? 1 : 0);\n\n token = state.push('fence', 'code', 0);\n token.info = params;\n token.content = state.getLines(startLine + 1, nextLine, len, true);\n token.markup = markup;\n token.map = [ startLine, state.line ];\n\n return true;\n};\n","// Block quotes\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function blockquote(state, startLine, endLine, silent) {\n var adjustTab,\n ch,\n i,\n initial,\n l,\n lastLineEmpty,\n lines,\n nextLine,\n offset,\n oldBMarks,\n oldBSCount,\n oldIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n spaceAfterMarker,\n terminate,\n terminatorRules,\n token,\n wasOutdented,\n oldLineMax = state.lineMax,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n // check the block quote marker\n if (state.src.charCodeAt(pos++) !== 0x3E/* > */) { return false; }\n\n // we know that it's going to be a valid blockquote,\n // so no point trying to find the end of it in silent mode\n if (silent) { return true; }\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[startLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks = [ state.bMarks[startLine] ];\n state.bMarks[startLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[startLine] + (adjustTab ? 1 : 0)) % 4;\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n oldBSCount = [ state.bsCount[startLine] ];\n state.bsCount[startLine] = state.sCount[startLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n lastLineEmpty = pos >= max;\n\n oldSCount = [ state.sCount[startLine] ];\n state.sCount[startLine] = offset - initial;\n\n oldTShift = [ state.tShift[startLine] ];\n state.tShift[startLine] = pos - state.bMarks[startLine];\n\n terminatorRules = state.md.block.ruler.getRules('blockquote');\n\n oldParentType = state.parentType;\n state.parentType = 'blockquote';\n wasOutdented = false;\n\n // Search the end of the block\n //\n // Block ends with either:\n // 1. an empty line outside:\n // ```\n // > test\n //\n // ```\n // 2. an empty line inside:\n // ```\n // >\n // test\n // ```\n // 3. another tag:\n // ```\n // > test\n // - - -\n // ```\n for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {\n // check if it's outdented, i.e. it's inside list item and indented\n // less than said list item:\n //\n // ```\n // 1. anything\n // > current blockquote\n // 2. checking this line\n // ```\n if (state.sCount[nextLine] < state.blkIndent) wasOutdented = true;\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos >= max) {\n // Case 1: line is not inside the blockquote, and this line is empty.\n break;\n }\n\n if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !wasOutdented) {\n // This line is inside the blockquote.\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[nextLine] + pos - (state.bMarks[nextLine] + state.tShift[nextLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[nextLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n state.bMarks[nextLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4;\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n lastLineEmpty = pos >= max;\n\n oldBSCount.push(state.bsCount[nextLine]);\n state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] = offset - initial;\n\n oldTShift.push(state.tShift[nextLine]);\n state.tShift[nextLine] = pos - state.bMarks[nextLine];\n continue;\n }\n\n // Case 2: line is not inside the blockquote, and the last line was empty.\n if (lastLineEmpty) { break; }\n\n // Case 3: another tag found.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n\n if (terminate) {\n // Quirk to enforce \"hard termination mode\" for paragraphs;\n // normally if you call `tokenize(state, startLine, nextLine)`,\n // paragraphs will look below nextLine for paragraph continuation,\n // but if blockquote is terminated by another tag, they shouldn't\n state.lineMax = nextLine;\n\n if (state.blkIndent !== 0) {\n // state.blkIndent was non-zero, we now set it to zero,\n // so we need to re-calculate all offsets to appear as\n // if indent wasn't changed\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] -= state.blkIndent;\n }\n\n break;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n\n // A negative indentation means that this is a paragraph continuation\n //\n state.sCount[nextLine] = -1;\n }\n\n oldIndent = state.blkIndent;\n state.blkIndent = 0;\n\n token = state.push('blockquote_open', 'blockquote', 1);\n token.markup = '>';\n token.map = lines = [ startLine, 0 ];\n\n state.md.block.tokenize(state, startLine, nextLine);\n\n token = state.push('blockquote_close', 'blockquote', -1);\n token.markup = '>';\n\n state.lineMax = oldLineMax;\n state.parentType = oldParentType;\n lines[1] = state.line;\n\n // Restore original tShift; this might not be necessary since the parser\n // has already been here, but just to make sure we can do that.\n for (i = 0; i < oldTShift.length; i++) {\n state.bMarks[i + startLine] = oldBMarks[i];\n state.tShift[i + startLine] = oldTShift[i];\n state.sCount[i + startLine] = oldSCount[i];\n state.bsCount[i + startLine] = oldBSCount[i];\n }\n state.blkIndent = oldIndent;\n\n return true;\n};\n","// Horizontal rule\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function hr(state, startLine, endLine, silent) {\n var marker, cnt, ch, token,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n marker = state.src.charCodeAt(pos++);\n\n // Check hr marker\n if (marker !== 0x2A/* * */ &&\n marker !== 0x2D/* - */ &&\n marker !== 0x5F/* _ */) {\n return false;\n }\n\n // markers can be mixed with spaces, but there should be at least 3 of them\n\n cnt = 1;\n while (pos < max) {\n ch = state.src.charCodeAt(pos++);\n if (ch !== marker && !isSpace(ch)) { return false; }\n if (ch === marker) { cnt++; }\n }\n\n if (cnt < 3) { return false; }\n\n if (silent) { return true; }\n\n state.line = startLine + 1;\n\n token = state.push('hr', 'hr', 0);\n token.map = [ startLine, state.line ];\n token.markup = Array(cnt + 1).join(String.fromCharCode(marker));\n\n return true;\n};\n","// Lists\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\n// Search `[-+*][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipBulletListMarker(state, startLine) {\n var marker, pos, max, ch;\n\n pos = state.bMarks[startLine] + state.tShift[startLine];\n max = state.eMarks[startLine];\n\n marker = state.src.charCodeAt(pos++);\n // Check bullet\n if (marker !== 0x2A/* * */ &&\n marker !== 0x2D/* - */ &&\n marker !== 0x2B/* + */) {\n return -1;\n }\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (!isSpace(ch)) {\n // \" -test \" - is not a list item\n return -1;\n }\n }\n\n return pos;\n}\n\n// Search `\\d+[.)][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipOrderedListMarker(state, startLine) {\n var ch,\n start = state.bMarks[startLine] + state.tShift[startLine],\n pos = start,\n max = state.eMarks[startLine];\n\n // List marker should have at least 2 chars (digit + dot)\n if (pos + 1 >= max) { return -1; }\n\n ch = state.src.charCodeAt(pos++);\n\n if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1; }\n\n for (;;) {\n // EOL -> fail\n if (pos >= max) { return -1; }\n\n ch = state.src.charCodeAt(pos++);\n\n if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) {\n\n // List marker should have no more than 9 digits\n // (prevents integer overflow in browsers)\n if (pos - start >= 10) { return -1; }\n\n continue;\n }\n\n // found valid marker\n if (ch === 0x29/* ) */ || ch === 0x2e/* . */) {\n break;\n }\n\n return -1;\n }\n\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (!isSpace(ch)) {\n // \" 1.test \" - is not a list item\n return -1;\n }\n }\n return pos;\n}\n\nfunction markTightParagraphs(state, idx) {\n var i, l,\n level = state.level + 2;\n\n for (i = idx + 2, l = state.tokens.length - 2; i < l; i++) {\n if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {\n state.tokens[i + 2].hidden = true;\n state.tokens[i].hidden = true;\n i += 2;\n }\n }\n}\n\n\nmodule.exports = function list(state, startLine, endLine, silent) {\n var ch,\n contentStart,\n i,\n indent,\n indentAfterMarker,\n initial,\n isOrdered,\n itemLines,\n l,\n listLines,\n listTokIdx,\n markerCharCode,\n markerValue,\n max,\n nextLine,\n offset,\n oldListIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n oldTight,\n pos,\n posAfterMarker,\n prevEmptyEnd,\n start,\n terminate,\n terminatorRules,\n token,\n isTerminatingParagraph = false,\n tight = true;\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n // Special case:\n // - item 1\n // - item 2\n // - item 3\n // - item 4\n // - this one is a paragraph continuation\n if (state.listIndent >= 0 &&\n state.sCount[startLine] - state.listIndent >= 4 &&\n state.sCount[startLine] < state.blkIndent) {\n return false;\n }\n\n // limit conditions when list can interrupt\n // a paragraph (validation mode only)\n if (silent && state.parentType === 'paragraph') {\n // Next list item should still terminate previous list item;\n //\n // This code can fail if plugins use blkIndent as well as lists,\n // but I hope the spec gets fixed long before that happens.\n //\n if (state.tShift[startLine] >= state.blkIndent) {\n isTerminatingParagraph = true;\n }\n }\n\n // Detect list type and position after marker\n if ((posAfterMarker = skipOrderedListMarker(state, startLine)) >= 0) {\n isOrdered = true;\n start = state.bMarks[startLine] + state.tShift[startLine];\n markerValue = Number(state.src.substr(start, posAfterMarker - start - 1));\n\n // If we're starting a new ordered list right after\n // a paragraph, it should start with 1.\n if (isTerminatingParagraph && markerValue !== 1) return false;\n\n } else if ((posAfterMarker = skipBulletListMarker(state, startLine)) >= 0) {\n isOrdered = false;\n\n } else {\n return false;\n }\n\n // If we're starting a new unordered list right after\n // a paragraph, first line should not be empty.\n if (isTerminatingParagraph) {\n if (state.skipSpaces(posAfterMarker) >= state.eMarks[startLine]) return false;\n }\n\n // We should terminate list on style change. Remember first one to compare.\n markerCharCode = state.src.charCodeAt(posAfterMarker - 1);\n\n // For validation mode we can terminate immediately\n if (silent) { return true; }\n\n // Start list\n listTokIdx = state.tokens.length;\n\n if (isOrdered) {\n token = state.push('ordered_list_open', 'ol', 1);\n if (markerValue !== 1) {\n token.attrs = [ [ 'start', markerValue ] ];\n }\n\n } else {\n token = state.push('bullet_list_open', 'ul', 1);\n }\n\n token.map = listLines = [ startLine, 0 ];\n token.markup = String.fromCharCode(markerCharCode);\n\n //\n // Iterate list items\n //\n\n nextLine = startLine;\n prevEmptyEnd = false;\n terminatorRules = state.md.block.ruler.getRules('list');\n\n oldParentType = state.parentType;\n state.parentType = 'list';\n\n while (nextLine < endLine) {\n pos = posAfterMarker;\n max = state.eMarks[nextLine];\n\n initial = offset = state.sCount[nextLine] + posAfterMarker - (state.bMarks[startLine] + state.tShift[startLine]);\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[nextLine]) % 4;\n } else if (ch === 0x20) {\n offset++;\n } else {\n break;\n }\n\n pos++;\n }\n\n contentStart = pos;\n\n if (contentStart >= max) {\n // trimming space in \"- \\n 3\" case, indent is 1 here\n indentAfterMarker = 1;\n } else {\n indentAfterMarker = offset - initial;\n }\n\n // If we have more than 4 spaces, the indent is 1\n // (the rest is just indented code block)\n if (indentAfterMarker > 4) { indentAfterMarker = 1; }\n\n // \" - test\"\n // ^^^^^ - calculating total length of this thing\n indent = initial + indentAfterMarker;\n\n // Run subparser & write tokens\n token = state.push('list_item_open', 'li', 1);\n token.markup = String.fromCharCode(markerCharCode);\n token.map = itemLines = [ startLine, 0 ];\n\n // change current state, then restore it after parser subcall\n oldTight = state.tight;\n oldTShift = state.tShift[startLine];\n oldSCount = state.sCount[startLine];\n\n // - example list\n // ^ listIndent position will be here\n // ^ blkIndent position will be here\n //\n oldListIndent = state.listIndent;\n state.listIndent = state.blkIndent;\n state.blkIndent = indent;\n\n state.tight = true;\n state.tShift[startLine] = contentStart - state.bMarks[startLine];\n state.sCount[startLine] = offset;\n\n if (contentStart >= max && state.isEmpty(startLine + 1)) {\n // workaround for this case\n // (list item is empty, list terminates before \"foo\"):\n // ~~~~~~~~\n // -\n //\n // foo\n // ~~~~~~~~\n state.line = Math.min(state.line + 2, endLine);\n } else {\n state.md.block.tokenize(state, startLine, endLine, true);\n }\n\n // If any of list item is tight, mark list as tight\n if (!state.tight || prevEmptyEnd) {\n tight = false;\n }\n // Item become loose if finish with empty line,\n // but we should filter last element, because it means list finish\n prevEmptyEnd = (state.line - startLine) > 1 && state.isEmpty(state.line - 1);\n\n state.blkIndent = state.listIndent;\n state.listIndent = oldListIndent;\n state.tShift[startLine] = oldTShift;\n state.sCount[startLine] = oldSCount;\n state.tight = oldTight;\n\n token = state.push('list_item_close', 'li', -1);\n token.markup = String.fromCharCode(markerCharCode);\n\n nextLine = startLine = state.line;\n itemLines[1] = nextLine;\n contentStart = state.bMarks[startLine];\n\n if (nextLine >= endLine) { break; }\n\n //\n // Try to check if list is terminated or continued.\n //\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { break; }\n\n // fail if terminating block found\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n\n // fail if list has another type\n if (isOrdered) {\n posAfterMarker = skipOrderedListMarker(state, nextLine);\n if (posAfterMarker < 0) { break; }\n } else {\n posAfterMarker = skipBulletListMarker(state, nextLine);\n if (posAfterMarker < 0) { break; }\n }\n\n if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break; }\n }\n\n // Finalize list\n if (isOrdered) {\n token = state.push('ordered_list_close', 'ol', -1);\n } else {\n token = state.push('bullet_list_close', 'ul', -1);\n }\n token.markup = String.fromCharCode(markerCharCode);\n\n listLines[1] = nextLine;\n state.line = nextLine;\n\n state.parentType = oldParentType;\n\n // mark paragraphs tight if needed\n if (tight) {\n markTightParagraphs(state, listTokIdx);\n }\n\n return true;\n};\n","'use strict';\n\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function reference(state, startLine, _endLine, silent) {\n var ch,\n destEndPos,\n destEndLineNo,\n endLine,\n href,\n i,\n l,\n label,\n labelEnd,\n oldParentType,\n res,\n start,\n str,\n terminate,\n terminatorRules,\n title,\n lines = 0,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine],\n nextLine = startLine + 1;\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (state.src.charCodeAt(pos) !== 0x5B/* [ */) { return false; }\n\n // Simple check to quickly interrupt scan on [link](url) at the start of line.\n // Can be useful on practice: https://github.com/markdown-it/markdown-it/issues/54\n while (++pos < max) {\n if (state.src.charCodeAt(pos) === 0x5D /* ] */ &&\n state.src.charCodeAt(pos - 1) !== 0x5C/* \\ */) {\n if (pos + 1 === max) { return false; }\n if (state.src.charCodeAt(pos + 1) !== 0x3A/* : */) { return false; }\n break;\n }\n }\n\n endLine = state.lineMax;\n\n // jump line-by-line until empty one or EOF\n terminatorRules = state.md.block.ruler.getRules('reference');\n\n oldParentType = state.parentType;\n state.parentType = 'reference';\n\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n str = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n max = str.length;\n\n for (pos = 1; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x5B /* [ */) {\n return false;\n } else if (ch === 0x5D /* ] */) {\n labelEnd = pos;\n break;\n } else if (ch === 0x0A /* \\n */) {\n lines++;\n } else if (ch === 0x5C /* \\ */) {\n pos++;\n if (pos < max && str.charCodeAt(pos) === 0x0A) {\n lines++;\n }\n }\n }\n\n if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return false; }\n\n // [label]: destination 'title'\n // ^^^ skip optional whitespace here\n for (pos = labelEnd + 2; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x0A) {\n lines++;\n } else if (isSpace(ch)) {\n /*eslint no-empty:0*/\n } else {\n break;\n }\n }\n\n // [label]: destination 'title'\n // ^^^^^^^^^^^ parse this\n res = state.md.helpers.parseLinkDestination(str, pos, max);\n if (!res.ok) { return false; }\n\n href = state.md.normalizeLink(res.str);\n if (!state.md.validateLink(href)) { return false; }\n\n pos = res.pos;\n lines += res.lines;\n\n // save cursor state, we could require to rollback later\n destEndPos = pos;\n destEndLineNo = lines;\n\n // [label]: destination 'title'\n // ^^^ skipping those spaces\n start = pos;\n for (; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x0A) {\n lines++;\n } else if (isSpace(ch)) {\n /*eslint no-empty:0*/\n } else {\n break;\n }\n }\n\n // [label]: destination 'title'\n // ^^^^^^^ parse this\n res = state.md.helpers.parseLinkTitle(str, pos, max);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n lines += res.lines;\n } else {\n title = '';\n pos = destEndPos;\n lines = destEndLineNo;\n }\n\n // skip trailing spaces until the rest of the line\n while (pos < max) {\n ch = str.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n\n if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n if (title) {\n // garbage at the end of the line after title,\n // but it could still be a valid reference if we roll back\n title = '';\n pos = destEndPos;\n lines = destEndLineNo;\n while (pos < max) {\n ch = str.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n }\n }\n\n if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n // garbage at the end of the line\n return false;\n }\n\n label = normalizeReference(str.slice(1, labelEnd));\n if (!label) {\n // CommonMark 0.20 disallows empty labels\n return false;\n }\n\n // Reference can not terminate anything. This check is for safety only.\n /*istanbul ignore if*/\n if (silent) { return true; }\n\n if (typeof state.env.references === 'undefined') {\n state.env.references = {};\n }\n if (typeof state.env.references[label] === 'undefined') {\n state.env.references[label] = { title: title, href: href };\n }\n\n state.parentType = oldParentType;\n\n state.line = startLine + lines + 1;\n return true;\n};\n","// heading (#, ##, ...)\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function heading(state, startLine, endLine, silent) {\n var ch, level, tmp, token,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x23/* # */ || pos >= max) { return false; }\n\n // count heading level\n level = 1;\n ch = state.src.charCodeAt(++pos);\n while (ch === 0x23/* # */ && pos < max && level <= 6) {\n level++;\n ch = state.src.charCodeAt(++pos);\n }\n\n if (level > 6 || (pos < max && !isSpace(ch))) { return false; }\n\n if (silent) { return true; }\n\n // Let's cut tails like ' ### ' from the end of string\n\n max = state.skipSpacesBack(max, pos);\n tmp = state.skipCharsBack(max, 0x23, pos); // #\n if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) {\n max = tmp;\n }\n\n state.line = startLine + 1;\n\n token = state.push('heading_open', 'h' + String(level), 1);\n token.markup = '########'.slice(0, level);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = state.src.slice(pos, max).trim();\n token.map = [ startLine, state.line ];\n token.children = [];\n\n token = state.push('heading_close', 'h' + String(level), -1);\n token.markup = '########'.slice(0, level);\n\n return true;\n};\n","// lheading (---, ===)\n\n'use strict';\n\n\nmodule.exports = function lheading(state, startLine, endLine/*, silent*/) {\n var content, terminate, i, l, token, pos, max, level, marker,\n nextLine = startLine + 1, oldParentType,\n terminatorRules = state.md.block.ruler.getRules('paragraph');\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n oldParentType = state.parentType;\n state.parentType = 'paragraph'; // use paragraph to match terminatorRules\n\n // jump line-by-line until empty one or EOF\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n //\n // Check for underline in setext header\n //\n if (state.sCount[nextLine] >= state.blkIndent) {\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos < max) {\n marker = state.src.charCodeAt(pos);\n\n if (marker === 0x2D/* - */ || marker === 0x3D/* = */) {\n pos = state.skipChars(pos, marker);\n pos = state.skipSpaces(pos);\n\n if (pos >= max) {\n level = (marker === 0x3D/* = */ ? 1 : 2);\n break;\n }\n }\n }\n }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n if (!level) {\n // Didn't find valid underline\n return false;\n }\n\n content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n\n state.line = nextLine + 1;\n\n token = state.push('heading_open', 'h' + String(level), 1);\n token.markup = String.fromCharCode(marker);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = content;\n token.map = [ startLine, state.line - 1 ];\n token.children = [];\n\n token = state.push('heading_close', 'h' + String(level), -1);\n token.markup = String.fromCharCode(marker);\n\n state.parentType = oldParentType;\n\n return true;\n};\n","// HTML block\n\n'use strict';\n\n\nvar block_names = require('../common/html_blocks');\nvar HTML_OPEN_CLOSE_TAG_RE = require('../common/html_re').HTML_OPEN_CLOSE_TAG_RE;\n\n// An array of opening and corresponding closing sequences for html tags,\n// last argument defines whether it can terminate a paragraph or not\n//\nvar HTML_SEQUENCES = [\n [ /^<(script|pre|style)(?=(\\s|>|$))/i, /<\\/(script|pre|style)>/i, true ],\n [ /^/, true ],\n [ /^<\\?/, /\\?>/, true ],\n [ /^/, true ],\n [ /^/, true ],\n [ new RegExp('^|$))', 'i'), /^$/, true ],\n [ new RegExp(HTML_OPEN_CLOSE_TAG_RE.source + '\\\\s*$'), /^$/, false ]\n];\n\n\nmodule.exports = function html_block(state, startLine, endLine, silent) {\n var i, nextLine, token, lineText,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (!state.md.options.html) { return false; }\n\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\n\n lineText = state.src.slice(pos, max);\n\n for (i = 0; i < HTML_SEQUENCES.length; i++) {\n if (HTML_SEQUENCES[i][0].test(lineText)) { break; }\n }\n\n if (i === HTML_SEQUENCES.length) { return false; }\n\n if (silent) {\n // true if this sequence can be a terminator, false otherwise\n return HTML_SEQUENCES[i][2];\n }\n\n nextLine = startLine + 1;\n\n // If we are here - we detected HTML block.\n // Let's roll down till block end.\n if (!HTML_SEQUENCES[i][1].test(lineText)) {\n for (; nextLine < endLine; nextLine++) {\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n lineText = state.src.slice(pos, max);\n\n if (HTML_SEQUENCES[i][1].test(lineText)) {\n if (lineText.length !== 0) { nextLine++; }\n break;\n }\n }\n }\n\n state.line = nextLine;\n\n token = state.push('html_block', '', 0);\n token.map = [ startLine, nextLine ];\n token.content = state.getLines(startLine, nextLine, state.blkIndent, true);\n\n return true;\n};\n","// List of valid html blocks names, accorting to commonmark spec\n// http://jgm.github.io/CommonMark/spec.html#html-blocks\n\n'use strict';\n\n\nmodule.exports = [\n 'address',\n 'article',\n 'aside',\n 'base',\n 'basefont',\n 'blockquote',\n 'body',\n 'caption',\n 'center',\n 'col',\n 'colgroup',\n 'dd',\n 'details',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'frame',\n 'frameset',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hr',\n 'html',\n 'iframe',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'menu',\n 'menuitem',\n 'meta',\n 'nav',\n 'noframes',\n 'ol',\n 'optgroup',\n 'option',\n 'p',\n 'param',\n 'section',\n 'source',\n 'summary',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'title',\n 'tr',\n 'track',\n 'ul'\n];\n","// Paragraph\n\n'use strict';\n\n\nmodule.exports = function paragraph(state, startLine/*, endLine*/) {\n var content, terminate, i, l, token, oldParentType,\n nextLine = startLine + 1,\n terminatorRules = state.md.block.ruler.getRules('paragraph'),\n endLine = state.lineMax;\n\n oldParentType = state.parentType;\n state.parentType = 'paragraph';\n\n // jump line-by-line until empty one or EOF\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n\n state.line = nextLine;\n\n token = state.push('paragraph_open', 'p', 1);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = content;\n token.map = [ startLine, state.line ];\n token.children = [];\n\n token = state.push('paragraph_close', 'p', -1);\n\n state.parentType = oldParentType;\n\n return true;\n};\n","// Parser state class\n\n'use strict';\n\nvar Token = require('../token');\nvar isSpace = require('../common/utils').isSpace;\n\n\nfunction StateBlock(src, md, env, tokens) {\n var ch, s, start, pos, len, indent, offset, indent_found;\n\n this.src = src;\n\n // link to parser instance\n this.md = md;\n\n this.env = env;\n\n //\n // Internal state vartiables\n //\n\n this.tokens = tokens;\n\n this.bMarks = []; // line begin offsets for fast jumps\n this.eMarks = []; // line end offsets for fast jumps\n this.tShift = []; // offsets of the first non-space characters (tabs not expanded)\n this.sCount = []; // indents for each line (tabs expanded)\n\n // An amount of virtual spaces (tabs expanded) between beginning\n // of each line (bMarks) and real beginning of that line.\n //\n // It exists only as a hack because blockquotes override bMarks\n // losing information in the process.\n //\n // It's used only when expanding tabs, you can think about it as\n // an initial tab length, e.g. bsCount=21 applied to string `\\t123`\n // means first tab should be expanded to 4-21%4 === 3 spaces.\n //\n this.bsCount = [];\n\n // block parser variables\n this.blkIndent = 0; // required block content indent (for example, if we are\n // inside a list, it would be positioned after list marker)\n this.line = 0; // line index in src\n this.lineMax = 0; // lines count\n this.tight = false; // loose/tight mode for lists\n this.ddIndent = -1; // indent of the current dd block (-1 if there isn't any)\n this.listIndent = -1; // indent of the current list block (-1 if there isn't any)\n\n // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'\n // used in lists to determine if they interrupt a paragraph\n this.parentType = 'root';\n\n this.level = 0;\n\n // renderer\n this.result = '';\n\n // Create caches\n // Generate markers.\n s = this.src;\n indent_found = false;\n\n for (start = pos = indent = offset = 0, len = s.length; pos < len; pos++) {\n ch = s.charCodeAt(pos);\n\n if (!indent_found) {\n if (isSpace(ch)) {\n indent++;\n\n if (ch === 0x09) {\n offset += 4 - offset % 4;\n } else {\n offset++;\n }\n continue;\n } else {\n indent_found = true;\n }\n }\n\n if (ch === 0x0A || pos === len - 1) {\n if (ch !== 0x0A) { pos++; }\n this.bMarks.push(start);\n this.eMarks.push(pos);\n this.tShift.push(indent);\n this.sCount.push(offset);\n this.bsCount.push(0);\n\n indent_found = false;\n indent = 0;\n offset = 0;\n start = pos + 1;\n }\n }\n\n // Push fake entry to simplify cache bounds checks\n this.bMarks.push(s.length);\n this.eMarks.push(s.length);\n this.tShift.push(0);\n this.sCount.push(0);\n this.bsCount.push(0);\n\n this.lineMax = this.bMarks.length - 1; // don't count last fake line\n}\n\n// Push new token to \"stream\".\n//\nStateBlock.prototype.push = function (type, tag, nesting) {\n var token = new Token(type, tag, nesting);\n token.block = true;\n\n if (nesting < 0) this.level--; // closing tag\n token.level = this.level;\n if (nesting > 0) this.level++; // opening tag\n\n this.tokens.push(token);\n return token;\n};\n\nStateBlock.prototype.isEmpty = function isEmpty(line) {\n return this.bMarks[line] + this.tShift[line] >= this.eMarks[line];\n};\n\nStateBlock.prototype.skipEmptyLines = function skipEmptyLines(from) {\n for (var max = this.lineMax; from < max; from++) {\n if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) {\n break;\n }\n }\n return from;\n};\n\n// Skip spaces from given position.\nStateBlock.prototype.skipSpaces = function skipSpaces(pos) {\n var ch;\n\n for (var max = this.src.length; pos < max; pos++) {\n ch = this.src.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n }\n return pos;\n};\n\n// Skip spaces from given position in reverse.\nStateBlock.prototype.skipSpacesBack = function skipSpacesBack(pos, min) {\n if (pos <= min) { return pos; }\n\n while (pos > min) {\n if (!isSpace(this.src.charCodeAt(--pos))) { return pos + 1; }\n }\n return pos;\n};\n\n// Skip char codes from given position\nStateBlock.prototype.skipChars = function skipChars(pos, code) {\n for (var max = this.src.length; pos < max; pos++) {\n if (this.src.charCodeAt(pos) !== code) { break; }\n }\n return pos;\n};\n\n// Skip char codes reverse from given position - 1\nStateBlock.prototype.skipCharsBack = function skipCharsBack(pos, code, min) {\n if (pos <= min) { return pos; }\n\n while (pos > min) {\n if (code !== this.src.charCodeAt(--pos)) { return pos + 1; }\n }\n return pos;\n};\n\n// cut lines range from source.\nStateBlock.prototype.getLines = function getLines(begin, end, indent, keepLastLF) {\n var i, lineIndent, ch, first, last, queue, lineStart,\n line = begin;\n\n if (begin >= end) {\n return '';\n }\n\n queue = new Array(end - begin);\n\n for (i = 0; line < end; line++, i++) {\n lineIndent = 0;\n lineStart = first = this.bMarks[line];\n\n if (line + 1 < end || keepLastLF) {\n // No need for bounds check because we have fake entry on tail.\n last = this.eMarks[line] + 1;\n } else {\n last = this.eMarks[line];\n }\n\n while (first < last && lineIndent < indent) {\n ch = this.src.charCodeAt(first);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4;\n } else {\n lineIndent++;\n }\n } else if (first - lineStart < this.tShift[line]) {\n // patched tShift masked characters to look like spaces (blockquotes, list markers)\n lineIndent++;\n } else {\n break;\n }\n\n first++;\n }\n\n if (lineIndent > indent) {\n // partially expanding tabs in code blocks, e.g '\\t\\tfoobar'\n // with indent=2 becomes ' \\tfoobar'\n queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last);\n } else {\n queue[i] = this.src.slice(first, last);\n }\n }\n\n return queue.join('');\n};\n\n// re-export Token class to use in block rules\nStateBlock.prototype.Token = Token;\n\n\nmodule.exports = StateBlock;\n","/** internal\n * class ParserInline\n *\n * Tokenizes paragraph content.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Parser rules\n\nvar _rules = [\n [ 'text', require('./rules_inline/text') ],\n [ 'newline', require('./rules_inline/newline') ],\n [ 'escape', require('./rules_inline/escape') ],\n [ 'backticks', require('./rules_inline/backticks') ],\n [ 'strikethrough', require('./rules_inline/strikethrough').tokenize ],\n [ 'emphasis', require('./rules_inline/emphasis').tokenize ],\n [ 'link', require('./rules_inline/link') ],\n [ 'image', require('./rules_inline/image') ],\n [ 'autolink', require('./rules_inline/autolink') ],\n [ 'html_inline', require('./rules_inline/html_inline') ],\n [ 'entity', require('./rules_inline/entity') ]\n];\n\nvar _rules2 = [\n [ 'balance_pairs', require('./rules_inline/balance_pairs') ],\n [ 'strikethrough', require('./rules_inline/strikethrough').postProcess ],\n [ 'emphasis', require('./rules_inline/emphasis').postProcess ],\n [ 'text_collapse', require('./rules_inline/text_collapse') ]\n];\n\n\n/**\n * new ParserInline()\n **/\nfunction ParserInline() {\n var i;\n\n /**\n * ParserInline#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of inline rules.\n **/\n this.ruler = new Ruler();\n\n for (i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1]);\n }\n\n /**\n * ParserInline#ruler2 -> Ruler\n *\n * [[Ruler]] instance. Second ruler used for post-processing\n * (e.g. in emphasis-like rules).\n **/\n this.ruler2 = new Ruler();\n\n for (i = 0; i < _rules2.length; i++) {\n this.ruler2.push(_rules2[i][0], _rules2[i][1]);\n }\n}\n\n\n// Skip single token by running all rules in validation mode;\n// returns `true` if any rule reported success\n//\nParserInline.prototype.skipToken = function (state) {\n var ok, i, pos = state.pos,\n rules = this.ruler.getRules(''),\n len = rules.length,\n maxNesting = state.md.options.maxNesting,\n cache = state.cache;\n\n\n if (typeof cache[pos] !== 'undefined') {\n state.pos = cache[pos];\n return;\n }\n\n if (state.level < maxNesting) {\n for (i = 0; i < len; i++) {\n // Increment state.level and decrement it later to limit recursion.\n // It's harmless to do here, because no tokens are created. But ideally,\n // we'd need a separate private state variable for this purpose.\n //\n state.level++;\n ok = rules[i](state, true);\n state.level--;\n\n if (ok) { break; }\n }\n } else {\n // Too much nesting, just skip until the end of the paragraph.\n //\n // NOTE: this will cause links to behave incorrectly in the following case,\n // when an amount of `[` is exactly equal to `maxNesting + 1`:\n //\n // [[[[[[[[[[[[[[[[[[[[[foo]()\n //\n // TODO: remove this workaround when CM standard will allow nested links\n // (we can replace it by preventing links from being parsed in\n // validation mode)\n //\n state.pos = state.posMax;\n }\n\n if (!ok) { state.pos++; }\n cache[pos] = state.pos;\n};\n\n\n// Generate tokens for input range\n//\nParserInline.prototype.tokenize = function (state) {\n var ok, i,\n rules = this.ruler.getRules(''),\n len = rules.length,\n end = state.posMax,\n maxNesting = state.md.options.maxNesting;\n\n while (state.pos < end) {\n // Try all possible rules.\n // On success, rule should:\n //\n // - update `state.pos`\n // - update `state.tokens`\n // - return true\n\n if (state.level < maxNesting) {\n for (i = 0; i < len; i++) {\n ok = rules[i](state, false);\n if (ok) { break; }\n }\n }\n\n if (ok) {\n if (state.pos >= end) { break; }\n continue;\n }\n\n state.pending += state.src[state.pos++];\n }\n\n if (state.pending) {\n state.pushPending();\n }\n};\n\n\n/**\n * ParserInline.parse(str, md, env, outTokens)\n *\n * Process input string and push inline tokens into `outTokens`\n **/\nParserInline.prototype.parse = function (str, md, env, outTokens) {\n var i, rules, len;\n var state = new this.State(str, md, env, outTokens);\n\n this.tokenize(state);\n\n rules = this.ruler2.getRules('');\n len = rules.length;\n\n for (i = 0; i < len; i++) {\n rules[i](state);\n }\n};\n\n\nParserInline.prototype.State = require('./rules_inline/state_inline');\n\n\nmodule.exports = ParserInline;\n","// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\n'use strict';\n\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar(ch) {\n switch (ch) {\n case 0x0A/* \\n */:\n case 0x21/* ! */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2D/* - */:\n case 0x3A/* : */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true;\n default:\n return false;\n }\n}\n\nmodule.exports = function text(state, silent) {\n var pos = state.pos;\n\n while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n pos++;\n }\n\n if (pos === state.pos) { return false; }\n\n if (!silent) { state.pending += state.src.slice(state.pos, pos); }\n\n state.pos = pos;\n\n return true;\n};\n\n// Alternative implementation, for memory.\n//\n// It costs 10% of performance, but allows extend terminators list, if place it\n// to `ParcerInline` property. Probably, will switch to it sometime, such\n// flexibility required.\n\n/*\nvar TERMINATOR_RE = /[\\n!#$%&*+\\-:<=>@[\\\\\\]^_`{}~]/;\n\nmodule.exports = function text(state, silent) {\n var pos = state.pos,\n idx = state.src.slice(pos).search(TERMINATOR_RE);\n\n // first char is terminator -> empty text\n if (idx === 0) { return false; }\n\n // no terminator -> text till end of string\n if (idx < 0) {\n if (!silent) { state.pending += state.src.slice(pos); }\n state.pos = state.src.length;\n return true;\n }\n\n if (!silent) { state.pending += state.src.slice(pos, pos + idx); }\n\n state.pos += idx;\n\n return true;\n};*/\n","// Proceess '\\n'\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function newline(state, silent) {\n var pmax, max, pos = state.pos;\n\n if (state.src.charCodeAt(pos) !== 0x0A/* \\n */) { return false; }\n\n pmax = state.pending.length - 1;\n max = state.posMax;\n\n // ' \\n' -> hardbreak\n // Lookup in pending chars is bad practice! Don't copy to other rules!\n // Pending string is stored in concat mode, indexed lookups will cause\n // convertion to flat mode.\n if (!silent) {\n if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {\n if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {\n state.pending = state.pending.replace(/ +$/, '');\n state.push('hardbreak', 'br', 0);\n } else {\n state.pending = state.pending.slice(0, -1);\n state.push('softbreak', 'br', 0);\n }\n\n } else {\n state.push('softbreak', 'br', 0);\n }\n }\n\n pos++;\n\n // skip heading spaces for next line\n while (pos < max && isSpace(state.src.charCodeAt(pos))) { pos++; }\n\n state.pos = pos;\n return true;\n};\n","// Process escaped chars and hardbreaks\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\nvar ESCAPED = [];\n\nfor (var i = 0; i < 256; i++) { ESCAPED.push(0); }\n\n'\\\\!\"#$%&\\'()*+,./:;<=>?@[]^_`{|}~-'\n .split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1; });\n\n\nmodule.exports = function escape(state, silent) {\n var ch, pos = state.pos, max = state.posMax;\n\n if (state.src.charCodeAt(pos) !== 0x5C/* \\ */) { return false; }\n\n pos++;\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (ch < 256 && ESCAPED[ch] !== 0) {\n if (!silent) { state.pending += state.src[pos]; }\n state.pos += 2;\n return true;\n }\n\n if (ch === 0x0A) {\n if (!silent) {\n state.push('hardbreak', 'br', 0);\n }\n\n pos++;\n // skip leading whitespaces from next line\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n\n state.pos = pos;\n return true;\n }\n }\n\n if (!silent) { state.pending += '\\\\'; }\n state.pos++;\n return true;\n};\n","// Parse backticks\n\n'use strict';\n\nmodule.exports = function backtick(state, silent) {\n var start, max, marker, matchStart, matchEnd, token,\n pos = state.pos,\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x60/* ` */) { return false; }\n\n start = pos;\n pos++;\n max = state.posMax;\n\n while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++; }\n\n marker = state.src.slice(start, pos);\n\n matchStart = matchEnd = pos;\n\n while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) {\n matchEnd = matchStart + 1;\n\n while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++; }\n\n if (matchEnd - matchStart === marker.length) {\n if (!silent) {\n token = state.push('code_inline', 'code', 0);\n token.markup = marker;\n token.content = state.src.slice(pos, matchStart)\n .replace(/\\n/g, ' ')\n .replace(/^ (.+) $/, '$1');\n }\n state.pos = matchEnd;\n return true;\n }\n }\n\n if (!silent) { state.pending += marker; }\n state.pos += marker.length;\n return true;\n};\n","// Process [link]( \"stuff\")\n\n'use strict';\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function link(state, silent) {\n var attrs,\n code,\n label,\n labelEnd,\n labelStart,\n pos,\n res,\n ref,\n title,\n token,\n href = '',\n oldPos = state.pos,\n max = state.posMax,\n start = state.pos,\n parseReference = true;\n\n if (state.src.charCodeAt(state.pos) !== 0x5B/* [ */) { return false; }\n\n labelStart = state.pos + 1;\n labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true);\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) { return false; }\n\n pos = labelEnd + 1;\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n //\n // Inline link\n //\n\n // might have found a valid shortcut link, disable reference parsing\n parseReference = false;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n pos++;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n if (pos >= max) { return false; }\n\n // [link]( \"title\" )\n // ^^^^^^ parsing link destination\n start = pos;\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n if (res.ok) {\n href = state.md.normalizeLink(res.str);\n if (state.md.validateLink(href)) {\n pos = res.pos;\n } else {\n href = '';\n }\n }\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n start = pos;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n\n // [link]( \"title\" )\n // ^^^^^^^ parsing link title\n res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n } else {\n title = '';\n }\n\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n // parsing a valid shortcut link failed, fallback to reference\n parseReference = true;\n }\n pos++;\n }\n\n if (parseReference) {\n //\n // Link reference\n //\n if (typeof state.env.references === 'undefined') { return false; }\n\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n start = pos + 1;\n pos = state.md.helpers.parseLinkLabel(state, pos);\n if (pos >= 0) {\n label = state.src.slice(start, pos++);\n } else {\n pos = labelEnd + 1;\n }\n } else {\n pos = labelEnd + 1;\n }\n\n // covers label === '' and label === undefined\n // (collapsed reference link and shortcut reference link respectively)\n if (!label) { label = state.src.slice(labelStart, labelEnd); }\n\n ref = state.env.references[normalizeReference(label)];\n if (!ref) {\n state.pos = oldPos;\n return false;\n }\n href = ref.href;\n title = ref.title;\n }\n\n //\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n state.pos = labelStart;\n state.posMax = labelEnd;\n\n token = state.push('link_open', 'a', 1);\n token.attrs = attrs = [ [ 'href', href ] ];\n if (title) {\n attrs.push([ 'title', title ]);\n }\n\n state.md.inline.tokenize(state);\n\n token = state.push('link_close', 'a', -1);\n }\n\n state.pos = pos;\n state.posMax = max;\n return true;\n};\n","// Process ![image]( \"title\")\n\n'use strict';\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function image(state, silent) {\n var attrs,\n code,\n content,\n label,\n labelEnd,\n labelStart,\n pos,\n ref,\n res,\n title,\n token,\n tokens,\n start,\n href = '',\n oldPos = state.pos,\n max = state.posMax;\n\n if (state.src.charCodeAt(state.pos) !== 0x21/* ! */) { return false; }\n if (state.src.charCodeAt(state.pos + 1) !== 0x5B/* [ */) { return false; }\n\n labelStart = state.pos + 2;\n labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false);\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) { return false; }\n\n pos = labelEnd + 1;\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n //\n // Inline link\n //\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n pos++;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n if (pos >= max) { return false; }\n\n // [link]( \"title\" )\n // ^^^^^^ parsing link destination\n start = pos;\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n if (res.ok) {\n href = state.md.normalizeLink(res.str);\n if (state.md.validateLink(href)) {\n pos = res.pos;\n } else {\n href = '';\n }\n }\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n start = pos;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n\n // [link]( \"title\" )\n // ^^^^^^^ parsing link title\n res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n } else {\n title = '';\n }\n\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n state.pos = oldPos;\n return false;\n }\n pos++;\n } else {\n //\n // Link reference\n //\n if (typeof state.env.references === 'undefined') { return false; }\n\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n start = pos + 1;\n pos = state.md.helpers.parseLinkLabel(state, pos);\n if (pos >= 0) {\n label = state.src.slice(start, pos++);\n } else {\n pos = labelEnd + 1;\n }\n } else {\n pos = labelEnd + 1;\n }\n\n // covers label === '' and label === undefined\n // (collapsed reference link and shortcut reference link respectively)\n if (!label) { label = state.src.slice(labelStart, labelEnd); }\n\n ref = state.env.references[normalizeReference(label)];\n if (!ref) {\n state.pos = oldPos;\n return false;\n }\n href = ref.href;\n title = ref.title;\n }\n\n //\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n content = state.src.slice(labelStart, labelEnd);\n\n state.md.inline.parse(\n content,\n state.md,\n state.env,\n tokens = []\n );\n\n token = state.push('image', 'img', 0);\n token.attrs = attrs = [ [ 'src', href ], [ 'alt', '' ] ];\n token.children = tokens;\n token.content = content;\n\n if (title) {\n attrs.push([ 'title', title ]);\n }\n }\n\n state.pos = pos;\n state.posMax = max;\n return true;\n};\n","// Process autolinks ''\n\n'use strict';\n\n\n/*eslint max-len:0*/\nvar EMAIL_RE = /^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;\nvar AUTOLINK_RE = /^<([a-zA-Z][a-zA-Z0-9+.\\-]{1,31}):([^<>\\x00-\\x20]*)>/;\n\n\nmodule.exports = function autolink(state, silent) {\n var tail, linkMatch, emailMatch, url, fullUrl, token,\n pos = state.pos;\n\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\n\n tail = state.src.slice(pos);\n\n if (tail.indexOf('>') < 0) { return false; }\n\n if (AUTOLINK_RE.test(tail)) {\n linkMatch = tail.match(AUTOLINK_RE);\n\n url = linkMatch[0].slice(1, -1);\n fullUrl = state.md.normalizeLink(url);\n if (!state.md.validateLink(fullUrl)) { return false; }\n\n if (!silent) {\n token = state.push('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.markup = 'autolink';\n token.info = 'auto';\n\n token = state.push('text', '', 0);\n token.content = state.md.normalizeLinkText(url);\n\n token = state.push('link_close', 'a', -1);\n token.markup = 'autolink';\n token.info = 'auto';\n }\n\n state.pos += linkMatch[0].length;\n return true;\n }\n\n if (EMAIL_RE.test(tail)) {\n emailMatch = tail.match(EMAIL_RE);\n\n url = emailMatch[0].slice(1, -1);\n fullUrl = state.md.normalizeLink('mailto:' + url);\n if (!state.md.validateLink(fullUrl)) { return false; }\n\n if (!silent) {\n token = state.push('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.markup = 'autolink';\n token.info = 'auto';\n\n token = state.push('text', '', 0);\n token.content = state.md.normalizeLinkText(url);\n\n token = state.push('link_close', 'a', -1);\n token.markup = 'autolink';\n token.info = 'auto';\n }\n\n state.pos += emailMatch[0].length;\n return true;\n }\n\n return false;\n};\n","// Process html tags\n\n'use strict';\n\n\nvar HTML_TAG_RE = require('../common/html_re').HTML_TAG_RE;\n\n\nfunction isLetter(ch) {\n /*eslint no-bitwise:0*/\n var lc = ch | 0x20; // to lower case\n return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */);\n}\n\n\nmodule.exports = function html_inline(state, silent) {\n var ch, match, max, token,\n pos = state.pos;\n\n if (!state.md.options.html) { return false; }\n\n // Check start\n max = state.posMax;\n if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||\n pos + 2 >= max) {\n return false;\n }\n\n // Quick fail on second char\n ch = state.src.charCodeAt(pos + 1);\n if (ch !== 0x21/* ! */ &&\n ch !== 0x3F/* ? */ &&\n ch !== 0x2F/* / */ &&\n !isLetter(ch)) {\n return false;\n }\n\n match = state.src.slice(pos).match(HTML_TAG_RE);\n if (!match) { return false; }\n\n if (!silent) {\n token = state.push('html_inline', '', 0);\n token.content = state.src.slice(pos, pos + match[0].length);\n }\n state.pos += match[0].length;\n return true;\n};\n","// Process html entity - {, ¯, ", ...\n\n'use strict';\n\nvar entities = require('../common/entities');\nvar has = require('../common/utils').has;\nvar isValidEntityCode = require('../common/utils').isValidEntityCode;\nvar fromCodePoint = require('../common/utils').fromCodePoint;\n\n\nvar DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i;\nvar NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i;\n\n\nmodule.exports = function entity(state, silent) {\n var ch, code, match, pos = state.pos, max = state.posMax;\n\n if (state.src.charCodeAt(pos) !== 0x26/* & */) { return false; }\n\n if (pos + 1 < max) {\n ch = state.src.charCodeAt(pos + 1);\n\n if (ch === 0x23 /* # */) {\n match = state.src.slice(pos).match(DIGITAL_RE);\n if (match) {\n if (!silent) {\n code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10);\n state.pending += isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD);\n }\n state.pos += match[0].length;\n return true;\n }\n } else {\n match = state.src.slice(pos).match(NAMED_RE);\n if (match) {\n if (has(entities, match[1])) {\n if (!silent) { state.pending += entities[match[1]]; }\n state.pos += match[0].length;\n return true;\n }\n }\n }\n }\n\n if (!silent) { state.pending += '&'; }\n state.pos++;\n return true;\n};\n","// For each opening emphasis-like marker find a matching closing one\n//\n'use strict';\n\n\nfunction processDelimiters(state, delimiters) {\n var closerIdx, openerIdx, closer, opener, minOpenerIdx, newMinOpenerIdx,\n isOddMatch, lastJump,\n openersBottom = {},\n max = delimiters.length;\n\n for (closerIdx = 0; closerIdx < max; closerIdx++) {\n closer = delimiters[closerIdx];\n\n // Length is only used for emphasis-specific \"rule of 3\",\n // if it's not defined (in strikethrough or 3rd party plugins),\n // we can default it to 0 to disable those checks.\n //\n closer.length = closer.length || 0;\n\n if (!closer.close) continue;\n\n // Previously calculated lower bounds (previous fails)\n // for each marker and each delimiter length modulo 3.\n if (!openersBottom.hasOwnProperty(closer.marker)) {\n openersBottom[closer.marker] = [ -1, -1, -1 ];\n }\n\n minOpenerIdx = openersBottom[closer.marker][closer.length % 3];\n newMinOpenerIdx = -1;\n\n openerIdx = closerIdx - closer.jump - 1;\n\n for (; openerIdx > minOpenerIdx; openerIdx -= opener.jump + 1) {\n opener = delimiters[openerIdx];\n\n if (opener.marker !== closer.marker) continue;\n\n if (newMinOpenerIdx === -1) newMinOpenerIdx = openerIdx;\n\n if (opener.open &&\n opener.end < 0 &&\n opener.level === closer.level) {\n\n isOddMatch = false;\n\n // from spec:\n //\n // If one of the delimiters can both open and close emphasis, then the\n // sum of the lengths of the delimiter runs containing the opening and\n // closing delimiters must not be a multiple of 3 unless both lengths\n // are multiples of 3.\n //\n if (opener.close || closer.open) {\n if ((opener.length + closer.length) % 3 === 0) {\n if (opener.length % 3 !== 0 || closer.length % 3 !== 0) {\n isOddMatch = true;\n }\n }\n }\n\n if (!isOddMatch) {\n // If previous delimiter cannot be an opener, we can safely skip\n // the entire sequence in future checks. This is required to make\n // sure algorithm has linear complexity (see *_*_*_*_*_... case).\n //\n lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open ?\n delimiters[openerIdx - 1].jump + 1 :\n 0;\n\n closer.jump = closerIdx - openerIdx + lastJump;\n closer.open = false;\n opener.end = closerIdx;\n opener.jump = lastJump;\n opener.close = false;\n newMinOpenerIdx = -1;\n break;\n }\n }\n }\n\n if (newMinOpenerIdx !== -1) {\n // If match for this delimiter run failed, we want to set lower bound for\n // future lookups. This is required to make sure algorithm has linear\n // complexity.\n //\n // See details here:\n // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442\n //\n openersBottom[closer.marker][(closer.length || 0) % 3] = newMinOpenerIdx;\n }\n }\n}\n\n\nmodule.exports = function link_pairs(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n processDelimiters(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n processDelimiters(state, tokens_meta[curr].delimiters);\n }\n }\n};\n","// Clean up tokens after emphasis and strikethrough postprocessing:\n// merge adjacent text nodes into one and re-calculate all token levels\n//\n// This is necessary because initially emphasis delimiter markers (*, _, ~)\n// are treated as their own separate text tokens. Then emphasis rule either\n// leaves them as text (needed to merge with adjacent text) or turns them\n// into opening/closing tags (which messes up levels inside).\n//\n'use strict';\n\n\nmodule.exports = function text_collapse(state) {\n var curr, last,\n level = 0,\n tokens = state.tokens,\n max = state.tokens.length;\n\n for (curr = last = 0; curr < max; curr++) {\n // re-calculate levels after emphasis/strikethrough turns some text nodes\n // into opening/closing tags\n if (tokens[curr].nesting < 0) level--; // closing tag\n tokens[curr].level = level;\n if (tokens[curr].nesting > 0) level++; // opening tag\n\n if (tokens[curr].type === 'text' &&\n curr + 1 < max &&\n tokens[curr + 1].type === 'text') {\n\n // collapse two adjacent text nodes\n tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content;\n } else {\n if (curr !== last) { tokens[last] = tokens[curr]; }\n\n last++;\n }\n }\n\n if (curr !== last) {\n tokens.length = last;\n }\n};\n","// Inline parser state\n\n'use strict';\n\n\nvar Token = require('../token');\nvar isWhiteSpace = require('../common/utils').isWhiteSpace;\nvar isPunctChar = require('../common/utils').isPunctChar;\nvar isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;\n\n\nfunction StateInline(src, md, env, outTokens) {\n this.src = src;\n this.env = env;\n this.md = md;\n this.tokens = outTokens;\n this.tokens_meta = Array(outTokens.length);\n\n this.pos = 0;\n this.posMax = this.src.length;\n this.level = 0;\n this.pending = '';\n this.pendingLevel = 0;\n\n // Stores { start: end } pairs. Useful for backtrack\n // optimization of pairs parse (emphasis, strikes).\n this.cache = {};\n\n // List of emphasis-like delimiters for current tag\n this.delimiters = [];\n\n // Stack of delimiter lists for upper level tags\n this._prev_delimiters = [];\n}\n\n\n// Flush pending text\n//\nStateInline.prototype.pushPending = function () {\n var token = new Token('text', '', 0);\n token.content = this.pending;\n token.level = this.pendingLevel;\n this.tokens.push(token);\n this.pending = '';\n return token;\n};\n\n\n// Push new token to \"stream\".\n// If pending text exists - flush it as text token\n//\nStateInline.prototype.push = function (type, tag, nesting) {\n if (this.pending) {\n this.pushPending();\n }\n\n var token = new Token(type, tag, nesting);\n var token_meta = null;\n\n if (nesting < 0) {\n // closing tag\n this.level--;\n this.delimiters = this._prev_delimiters.pop();\n }\n\n token.level = this.level;\n\n if (nesting > 0) {\n // opening tag\n this.level++;\n this._prev_delimiters.push(this.delimiters);\n this.delimiters = [];\n token_meta = { delimiters: this.delimiters };\n }\n\n this.pendingLevel = this.level;\n this.tokens.push(token);\n this.tokens_meta.push(token_meta);\n return token;\n};\n\n\n// Scan a sequence of emphasis-like markers, and determine whether\n// it can start an emphasis sequence or end an emphasis sequence.\n//\n// - start - position to scan from (it should point at a valid marker);\n// - canSplitWord - determine if these markers can be found inside a word\n//\nStateInline.prototype.scanDelims = function (start, canSplitWord) {\n var pos = start, lastChar, nextChar, count, can_open, can_close,\n isLastWhiteSpace, isLastPunctChar,\n isNextWhiteSpace, isNextPunctChar,\n left_flanking = true,\n right_flanking = true,\n max = this.posMax,\n marker = this.src.charCodeAt(start);\n\n // treat beginning of the line as a whitespace\n lastChar = start > 0 ? this.src.charCodeAt(start - 1) : 0x20;\n\n while (pos < max && this.src.charCodeAt(pos) === marker) { pos++; }\n\n count = pos - start;\n\n // treat end of the line as a whitespace\n nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20;\n\n isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));\n isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));\n\n isLastWhiteSpace = isWhiteSpace(lastChar);\n isNextWhiteSpace = isWhiteSpace(nextChar);\n\n if (isNextWhiteSpace) {\n left_flanking = false;\n } else if (isNextPunctChar) {\n if (!(isLastWhiteSpace || isLastPunctChar)) {\n left_flanking = false;\n }\n }\n\n if (isLastWhiteSpace) {\n right_flanking = false;\n } else if (isLastPunctChar) {\n if (!(isNextWhiteSpace || isNextPunctChar)) {\n right_flanking = false;\n }\n }\n\n if (!canSplitWord) {\n can_open = left_flanking && (!right_flanking || isLastPunctChar);\n can_close = right_flanking && (!left_flanking || isNextPunctChar);\n } else {\n can_open = left_flanking;\n can_close = right_flanking;\n }\n\n return {\n can_open: can_open,\n can_close: can_close,\n length: count\n };\n};\n\n\n// re-export Token class to use in block rules\nStateInline.prototype.Token = Token;\n\n\nmodule.exports = StateInline;\n","'use strict';\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Helpers\n\n// Merge objects\n//\nfunction assign(obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n\n sources.forEach(function (source) {\n if (!source) { return; }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key];\n });\n });\n\n return obj;\n}\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\nfunction isString(obj) { return _class(obj) === '[object String]'; }\nfunction isObject(obj) { return _class(obj) === '[object Object]'; }\nfunction isRegExp(obj) { return _class(obj) === '[object RegExp]'; }\nfunction isFunction(obj) { return _class(obj) === '[object Function]'; }\n\n\nfunction escapeRE(str) { return str.replace(/[.?*+^$[\\]\\\\(){}|-]/g, '\\\\$&'); }\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nvar defaultOptions = {\n fuzzyLink: true,\n fuzzyEmail: true,\n fuzzyIP: false\n};\n\n\nfunction isOptionsObj(obj) {\n return Object.keys(obj || {}).reduce(function (acc, k) {\n return acc || defaultOptions.hasOwnProperty(k);\n }, false);\n}\n\n\nvar defaultSchemas = {\n 'http:': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.http) {\n // compile lazily, because \"host\"-containing variables can change on tlds update.\n self.re.http = new RegExp(\n '^\\\\/\\\\/' + self.re.src_auth + self.re.src_host_port_strict + self.re.src_path, 'i'\n );\n }\n if (self.re.http.test(tail)) {\n return tail.match(self.re.http)[0].length;\n }\n return 0;\n }\n },\n 'https:': 'http:',\n 'ftp:': 'http:',\n '//': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.no_http) {\n // compile lazily, because \"host\"-containing variables can change on tlds update.\n self.re.no_http = new RegExp(\n '^' +\n self.re.src_auth +\n // Don't allow single-level domains, because of false positives like '//test'\n // with code comments\n '(?:localhost|(?:(?:' + self.re.src_domain + ')\\\\.)+' + self.re.src_domain_root + ')' +\n self.re.src_port +\n self.re.src_host_terminator +\n self.re.src_path,\n\n 'i'\n );\n }\n\n if (self.re.no_http.test(tail)) {\n // should not be `://` & `///`, that protects from errors in protocol name\n if (pos >= 3 && text[pos - 3] === ':') { return 0; }\n if (pos >= 3 && text[pos - 3] === '/') { return 0; }\n return tail.match(self.re.no_http)[0].length;\n }\n return 0;\n }\n },\n 'mailto:': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.mailto) {\n self.re.mailto = new RegExp(\n '^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i'\n );\n }\n if (self.re.mailto.test(tail)) {\n return tail.match(self.re.mailto)[0].length;\n }\n return 0;\n }\n }\n};\n\n/*eslint-disable max-len*/\n\n// RE pattern for 2-character tlds (autogenerated by ./support/tlds_2char_gen.js)\nvar tlds_2ch_src_re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]';\n\n// DON'T try to make PRs with changes. Extend TLDs with LinkifyIt.tlds() instead\nvar tlds_default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|');\n\n/*eslint-enable max-len*/\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction resetScanCache(self) {\n self.__index__ = -1;\n self.__text_cache__ = '';\n}\n\nfunction createValidator(re) {\n return function (text, pos) {\n var tail = text.slice(pos);\n\n if (re.test(tail)) {\n return tail.match(re)[0].length;\n }\n return 0;\n };\n}\n\nfunction createNormalizer() {\n return function (match, self) {\n self.normalize(match);\n };\n}\n\n// Schemas compiler. Build regexps.\n//\nfunction compile(self) {\n\n // Load & clone RE patterns.\n var re = self.re = require('./lib/re')(self.__opts__);\n\n // Define dynamic patterns\n var tlds = self.__tlds__.slice();\n\n self.onCompile();\n\n if (!self.__tlds_replaced__) {\n tlds.push(tlds_2ch_src_re);\n }\n tlds.push(re.src_xn);\n\n re.src_tlds = tlds.join('|');\n\n function untpl(tpl) { return tpl.replace('%TLDS%', re.src_tlds); }\n\n re.email_fuzzy = RegExp(untpl(re.tpl_email_fuzzy), 'i');\n re.link_fuzzy = RegExp(untpl(re.tpl_link_fuzzy), 'i');\n re.link_no_ip_fuzzy = RegExp(untpl(re.tpl_link_no_ip_fuzzy), 'i');\n re.host_fuzzy_test = RegExp(untpl(re.tpl_host_fuzzy_test), 'i');\n\n //\n // Compile each schema\n //\n\n var aliases = [];\n\n self.__compiled__ = {}; // Reset compiled data\n\n function schemaError(name, val) {\n throw new Error('(LinkifyIt) Invalid schema \"' + name + '\": ' + val);\n }\n\n Object.keys(self.__schemas__).forEach(function (name) {\n var val = self.__schemas__[name];\n\n // skip disabled methods\n if (val === null) { return; }\n\n var compiled = { validate: null, link: null };\n\n self.__compiled__[name] = compiled;\n\n if (isObject(val)) {\n if (isRegExp(val.validate)) {\n compiled.validate = createValidator(val.validate);\n } else if (isFunction(val.validate)) {\n compiled.validate = val.validate;\n } else {\n schemaError(name, val);\n }\n\n if (isFunction(val.normalize)) {\n compiled.normalize = val.normalize;\n } else if (!val.normalize) {\n compiled.normalize = createNormalizer();\n } else {\n schemaError(name, val);\n }\n\n return;\n }\n\n if (isString(val)) {\n aliases.push(name);\n return;\n }\n\n schemaError(name, val);\n });\n\n //\n // Compile postponed aliases\n //\n\n aliases.forEach(function (alias) {\n if (!self.__compiled__[self.__schemas__[alias]]) {\n // Silently fail on missed schemas to avoid errons on disable.\n // schemaError(alias, self.__schemas__[alias]);\n return;\n }\n\n self.__compiled__[alias].validate =\n self.__compiled__[self.__schemas__[alias]].validate;\n self.__compiled__[alias].normalize =\n self.__compiled__[self.__schemas__[alias]].normalize;\n });\n\n //\n // Fake record for guessed links\n //\n self.__compiled__[''] = { validate: null, normalize: createNormalizer() };\n\n //\n // Build schema condition\n //\n var slist = Object.keys(self.__compiled__)\n .filter(function (name) {\n // Filter disabled & fake schemas\n return name.length > 0 && self.__compiled__[name];\n })\n .map(escapeRE)\n .join('|');\n // (?!_) cause 1.5x slowdown\n self.re.schema_test = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'i');\n self.re.schema_search = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'ig');\n\n self.re.pretest = RegExp(\n '(' + self.re.schema_test.source + ')|(' + self.re.host_fuzzy_test.source + ')|@',\n 'i'\n );\n\n //\n // Cleanup\n //\n\n resetScanCache(self);\n}\n\n/**\n * class Match\n *\n * Match result. Single element of array, returned by [[LinkifyIt#match]]\n **/\nfunction Match(self, shift) {\n var start = self.__index__,\n end = self.__last_index__,\n text = self.__text_cache__.slice(start, end);\n\n /**\n * Match#schema -> String\n *\n * Prefix (protocol) for matched string.\n **/\n this.schema = self.__schema__.toLowerCase();\n /**\n * Match#index -> Number\n *\n * First position of matched string.\n **/\n this.index = start + shift;\n /**\n * Match#lastIndex -> Number\n *\n * Next position after matched string.\n **/\n this.lastIndex = end + shift;\n /**\n * Match#raw -> String\n *\n * Matched string.\n **/\n this.raw = text;\n /**\n * Match#text -> String\n *\n * Notmalized text of matched string.\n **/\n this.text = text;\n /**\n * Match#url -> String\n *\n * Normalized url of matched string.\n **/\n this.url = text;\n}\n\nfunction createMatch(self, shift) {\n var match = new Match(self, shift);\n\n self.__compiled__[match.schema].normalize(match, self);\n\n return match;\n}\n\n\n/**\n * class LinkifyIt\n **/\n\n/**\n * new LinkifyIt(schemas, options)\n * - schemas (Object): Optional. Additional schemas to validate (prefix/validator)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Creates new linkifier instance with optional additional schemas.\n * Can be called without `new` keyword for convenience.\n *\n * By default understands:\n *\n * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links\n * - \"fuzzy\" links and emails (example.com, foo@bar.com).\n *\n * `schemas` is an object, where each key/value describes protocol/rule:\n *\n * - __key__ - link prefix (usually, protocol name with `:` at the end, `skype:`\n * for example). `linkify-it` makes shure that prefix is not preceeded with\n * alphanumeric char and symbols. Only whitespaces and punctuation allowed.\n * - __value__ - rule to check tail after link prefix\n * - _String_ - just alias to existing rule\n * - _Object_\n * - _validate_ - validator function (should return matched length on success),\n * or `RegExp`.\n * - _normalize_ - optional function to normalize text & url of matched result\n * (for example, for @twitter mentions).\n *\n * `options`:\n *\n * - __fuzzyLink__ - recognige URL-s without `http(s):` prefix. Default `true`.\n * - __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts\n * like version numbers. Default `false`.\n * - __fuzzyEmail__ - recognize emails without `mailto:` prefix.\n *\n **/\nfunction LinkifyIt(schemas, options) {\n if (!(this instanceof LinkifyIt)) {\n return new LinkifyIt(schemas, options);\n }\n\n if (!options) {\n if (isOptionsObj(schemas)) {\n options = schemas;\n schemas = {};\n }\n }\n\n this.__opts__ = assign({}, defaultOptions, options);\n\n // Cache last tested result. Used to skip repeating steps on next `match` call.\n this.__index__ = -1;\n this.__last_index__ = -1; // Next scan position\n this.__schema__ = '';\n this.__text_cache__ = '';\n\n this.__schemas__ = assign({}, defaultSchemas, schemas);\n this.__compiled__ = {};\n\n this.__tlds__ = tlds_default;\n this.__tlds_replaced__ = false;\n\n this.re = {};\n\n compile(this);\n}\n\n\n/** chainable\n * LinkifyIt#add(schema, definition)\n * - schema (String): rule name (fixed pattern prefix)\n * - definition (String|RegExp|Object): schema definition\n *\n * Add new rule definition. See constructor description for details.\n **/\nLinkifyIt.prototype.add = function add(schema, definition) {\n this.__schemas__[schema] = definition;\n compile(this);\n return this;\n};\n\n\n/** chainable\n * LinkifyIt#set(options)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Set recognition options for links without schema.\n **/\nLinkifyIt.prototype.set = function set(options) {\n this.__opts__ = assign(this.__opts__, options);\n return this;\n};\n\n\n/**\n * LinkifyIt#test(text) -> Boolean\n *\n * Searches linkifiable pattern and returns `true` on success or `false` on fail.\n **/\nLinkifyIt.prototype.test = function test(text) {\n // Reset scan cache\n this.__text_cache__ = text;\n this.__index__ = -1;\n\n if (!text.length) { return false; }\n\n var m, ml, me, len, shift, next, re, tld_pos, at_pos;\n\n // try to scan for link with schema - that's the most simple rule\n if (this.re.schema_test.test(text)) {\n re = this.re.schema_search;\n re.lastIndex = 0;\n while ((m = re.exec(text)) !== null) {\n len = this.testSchemaAt(text, m[2], re.lastIndex);\n if (len) {\n this.__schema__ = m[2];\n this.__index__ = m.index + m[1].length;\n this.__last_index__ = m.index + m[0].length + len;\n break;\n }\n }\n }\n\n if (this.__opts__.fuzzyLink && this.__compiled__['http:']) {\n // guess schemaless links\n tld_pos = text.search(this.re.host_fuzzy_test);\n if (tld_pos >= 0) {\n // if tld is located after found link - no need to check fuzzy pattern\n if (this.__index__ < 0 || tld_pos < this.__index__) {\n if ((ml = text.match(this.__opts__.fuzzyIP ? this.re.link_fuzzy : this.re.link_no_ip_fuzzy)) !== null) {\n\n shift = ml.index + ml[1].length;\n\n if (this.__index__ < 0 || shift < this.__index__) {\n this.__schema__ = '';\n this.__index__ = shift;\n this.__last_index__ = ml.index + ml[0].length;\n }\n }\n }\n }\n }\n\n if (this.__opts__.fuzzyEmail && this.__compiled__['mailto:']) {\n // guess schemaless emails\n at_pos = text.indexOf('@');\n if (at_pos >= 0) {\n // We can't skip this check, because this cases are possible:\n // 192.168.1.1@gmail.com, my.in@example.com\n if ((me = text.match(this.re.email_fuzzy)) !== null) {\n\n shift = me.index + me[1].length;\n next = me.index + me[0].length;\n\n if (this.__index__ < 0 || shift < this.__index__ ||\n (shift === this.__index__ && next > this.__last_index__)) {\n this.__schema__ = 'mailto:';\n this.__index__ = shift;\n this.__last_index__ = next;\n }\n }\n }\n }\n\n return this.__index__ >= 0;\n};\n\n\n/**\n * LinkifyIt#pretest(text) -> Boolean\n *\n * Very quick check, that can give false positives. Returns true if link MAY BE\n * can exists. Can be used for speed optimization, when you need to check that\n * link NOT exists.\n **/\nLinkifyIt.prototype.pretest = function pretest(text) {\n return this.re.pretest.test(text);\n};\n\n\n/**\n * LinkifyIt#testSchemaAt(text, name, position) -> Number\n * - text (String): text to scan\n * - name (String): rule (schema) name\n * - position (Number): text offset to check from\n *\n * Similar to [[LinkifyIt#test]] but checks only specific protocol tail exactly\n * at given position. Returns length of found pattern (0 on fail).\n **/\nLinkifyIt.prototype.testSchemaAt = function testSchemaAt(text, schema, pos) {\n // If not supported schema check requested - terminate\n if (!this.__compiled__[schema.toLowerCase()]) {\n return 0;\n }\n return this.__compiled__[schema.toLowerCase()].validate(text, pos, this);\n};\n\n\n/**\n * LinkifyIt#match(text) -> Array|null\n *\n * Returns array of found link descriptions or `null` on fail. We strongly\n * recommend to use [[LinkifyIt#test]] first, for best speed.\n *\n * ##### Result match description\n *\n * - __schema__ - link schema, can be empty for fuzzy links, or `//` for\n * protocol-neutral links.\n * - __index__ - offset of matched text\n * - __lastIndex__ - index of next char after mathch end\n * - __raw__ - matched text\n * - __text__ - normalized text\n * - __url__ - link, generated from matched text\n **/\nLinkifyIt.prototype.match = function match(text) {\n var shift = 0, result = [];\n\n // Try to take previous element from cache, if .test() called before\n if (this.__index__ >= 0 && this.__text_cache__ === text) {\n result.push(createMatch(this, shift));\n shift = this.__last_index__;\n }\n\n // Cut head if cache was used\n var tail = shift ? text.slice(shift) : text;\n\n // Scan string until end reached\n while (this.test(tail)) {\n result.push(createMatch(this, shift));\n\n tail = tail.slice(this.__last_index__);\n shift += this.__last_index__;\n }\n\n if (result.length) {\n return result;\n }\n\n return null;\n};\n\n\n/** chainable\n * LinkifyIt#tlds(list [, keepOld]) -> this\n * - list (Array): list of tlds\n * - keepOld (Boolean): merge with current list if `true` (`false` by default)\n *\n * Load (or merge) new tlds list. Those are user for fuzzy links (without prefix)\n * to avoid false positives. By default this algorythm used:\n *\n * - hostname with any 2-letter root zones are ok.\n * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф\n * are ok.\n * - encoded (`xn--...`) root zones are ok.\n *\n * If list is replaced, then exact match for 2-chars root zones will be checked.\n **/\nLinkifyIt.prototype.tlds = function tlds(list, keepOld) {\n list = Array.isArray(list) ? list : [ list ];\n\n if (!keepOld) {\n this.__tlds__ = list.slice();\n this.__tlds_replaced__ = true;\n compile(this);\n return this;\n }\n\n this.__tlds__ = this.__tlds__.concat(list)\n .sort()\n .filter(function (el, idx, arr) {\n return el !== arr[idx - 1];\n })\n .reverse();\n\n compile(this);\n return this;\n};\n\n/**\n * LinkifyIt#normalize(match)\n *\n * Default normalizer (if schema does not define it's own).\n **/\nLinkifyIt.prototype.normalize = function normalize(match) {\n\n // Do minimal possible changes by default. Need to collect feedback prior\n // to move forward https://github.com/markdown-it/linkify-it/issues/1\n\n if (!match.schema) { match.url = 'http://' + match.url; }\n\n if (match.schema === 'mailto:' && !/^mailto:/i.test(match.url)) {\n match.url = 'mailto:' + match.url;\n }\n};\n\n\n/**\n * LinkifyIt#onCompile()\n *\n * Override to modify basic RegExp-s.\n **/\nLinkifyIt.prototype.onCompile = function onCompile() {\n};\n\n\nmodule.exports = LinkifyIt;\n","'use strict';\n\n\nmodule.exports = function (opts) {\n var re = {};\n\n // Use direct extract instead of `regenerate` to reduse browserified size\n re.src_Any = require('uc.micro/properties/Any/regex').source;\n re.src_Cc = require('uc.micro/categories/Cc/regex').source;\n re.src_Z = require('uc.micro/categories/Z/regex').source;\n re.src_P = require('uc.micro/categories/P/regex').source;\n\n // \\p{\\Z\\P\\Cc\\CF} (white spaces + control + format + punctuation)\n re.src_ZPCc = [ re.src_Z, re.src_P, re.src_Cc ].join('|');\n\n // \\p{\\Z\\Cc} (white spaces + control)\n re.src_ZCc = [ re.src_Z, re.src_Cc ].join('|');\n\n // Experimental. List of chars, completely prohibited in links\n // because can separate it from other part of text\n var text_separators = '[><\\uff5c]';\n\n // All possible word characters (everything without punctuation, spaces & controls)\n // Defined via punctuation & spaces to save space\n // Should be something like \\p{\\L\\N\\S\\M} (\\w but without `_`)\n re.src_pseudo_letter = '(?:(?!' + text_separators + '|' + re.src_ZPCc + ')' + re.src_Any + ')';\n // The same as abothe but without [0-9]\n // var src_pseudo_letter_non_d = '(?:(?![0-9]|' + src_ZPCc + ')' + src_Any + ')';\n\n ////////////////////////////////////////////////////////////////////////////////\n\n re.src_ip4 =\n\n '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)';\n\n // Prohibit any of \"@/[]()\" in user/pass to avoid wrong domain fetch.\n re.src_auth = '(?:(?:(?!' + re.src_ZCc + '|[@/\\\\[\\\\]()]).)+@)?';\n\n re.src_port =\n\n '(?::(?:6(?:[0-4]\\\\d{3}|5(?:[0-4]\\\\d{2}|5(?:[0-2]\\\\d|3[0-5])))|[1-5]?\\\\d{1,4}))?';\n\n re.src_host_terminator =\n\n '(?=$|' + text_separators + '|' + re.src_ZPCc + ')(?!-|_|:\\\\d|\\\\.-|\\\\.(?!$|' + re.src_ZPCc + '))';\n\n re.src_path =\n\n '(?:' +\n '[/?#]' +\n '(?:' +\n '(?!' + re.src_ZCc + '|' + text_separators + '|[()[\\\\]{}.,\"\\'?!\\\\-]).|' +\n '\\\\[(?:(?!' + re.src_ZCc + '|\\\\]).)*\\\\]|' +\n '\\\\((?:(?!' + re.src_ZCc + '|[)]).)*\\\\)|' +\n '\\\\{(?:(?!' + re.src_ZCc + '|[}]).)*\\\\}|' +\n '\\\\\"(?:(?!' + re.src_ZCc + '|[\"]).)+\\\\\"|' +\n \"\\\\'(?:(?!\" + re.src_ZCc + \"|[']).)+\\\\'|\" +\n \"\\\\'(?=\" + re.src_pseudo_letter + '|[-]).|' + // allow `I'm_king` if no pair found\n '\\\\.{2,4}[a-zA-Z0-9%/]|' + // github has ... in commit range links,\n // google has .... in links (issue #66)\n // Restrict to\n // - english\n // - percent-encoded\n // - parts of file path\n // until more examples found.\n '\\\\.(?!' + re.src_ZCc + '|[.]).|' +\n (opts && opts['---'] ?\n '\\\\-(?!--(?:[^-]|$))(?:-*)|' // `---` => long dash, terminate\n :\n '\\\\-+|'\n ) +\n '\\\\,(?!' + re.src_ZCc + ').|' + // allow `,,,` in paths\n '\\\\!(?!' + re.src_ZCc + '|[!]).|' +\n '\\\\?(?!' + re.src_ZCc + '|[?]).' +\n ')+' +\n '|\\\\/' +\n ')?';\n\n // Allow anything in markdown spec, forbid quote (\") at the first position\n // because emails enclosed in quotes are far more common\n re.src_email_name =\n\n '[\\\\-;:&=\\\\+\\\\$,\\\\.a-zA-Z0-9_][\\\\-;:&=\\\\+\\\\$,\\\\\"\\\\.a-zA-Z0-9_]*';\n\n re.src_xn =\n\n 'xn--[a-z0-9\\\\-]{1,59}';\n\n // More to read about domain names\n // http://serverfault.com/questions/638260/\n\n re.src_domain_root =\n\n // Allow letters & digits (http://test1)\n '(?:' +\n re.src_xn +\n '|' +\n re.src_pseudo_letter + '{1,63}' +\n ')';\n\n re.src_domain =\n\n '(?:' +\n re.src_xn +\n '|' +\n '(?:' + re.src_pseudo_letter + ')' +\n '|' +\n '(?:' + re.src_pseudo_letter + '(?:-|' + re.src_pseudo_letter + '){0,61}' + re.src_pseudo_letter + ')' +\n ')';\n\n re.src_host =\n\n '(?:' +\n // Don't need IP check, because digits are already allowed in normal domain names\n // src_ip4 +\n // '|' +\n '(?:(?:(?:' + re.src_domain + ')\\\\.)*' + re.src_domain/*_root*/ + ')' +\n ')';\n\n re.tpl_host_fuzzy =\n\n '(?:' +\n re.src_ip4 +\n '|' +\n '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))' +\n ')';\n\n re.tpl_host_no_ip_fuzzy =\n\n '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))';\n\n re.src_host_strict =\n\n re.src_host + re.src_host_terminator;\n\n re.tpl_host_fuzzy_strict =\n\n re.tpl_host_fuzzy + re.src_host_terminator;\n\n re.src_host_port_strict =\n\n re.src_host + re.src_port + re.src_host_terminator;\n\n re.tpl_host_port_fuzzy_strict =\n\n re.tpl_host_fuzzy + re.src_port + re.src_host_terminator;\n\n re.tpl_host_port_no_ip_fuzzy_strict =\n\n re.tpl_host_no_ip_fuzzy + re.src_port + re.src_host_terminator;\n\n\n ////////////////////////////////////////////////////////////////////////////////\n // Main rules\n\n // Rude test fuzzy links by host, for quick deny\n re.tpl_host_fuzzy_test =\n\n 'localhost|www\\\\.|\\\\.\\\\d{1,3}\\\\.|(?:\\\\.(?:%TLDS%)(?:' + re.src_ZPCc + '|>|$))';\n\n re.tpl_email_fuzzy =\n\n '(^|' + text_separators + '|\"|\\\\(|' + re.src_ZCc + ')' +\n '(' + re.src_email_name + '@' + re.tpl_host_fuzzy_strict + ')';\n\n re.tpl_link_fuzzy =\n // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n // but can start with > (markdown blockquote)\n '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_fuzzy_strict + re.src_path + ')';\n\n re.tpl_link_no_ip_fuzzy =\n // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n // but can start with > (markdown blockquote)\n '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_no_ip_fuzzy_strict + re.src_path + ')';\n\n return re;\n};\n","/*! https://mths.be/punycode v1.4.1 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see \n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t counter = 0,\n\t\t length = string.length,\n\t\t value,\n\t\t extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t// 0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t inputLength = input.length,\n\t\t out,\n\t\t i = 0,\n\t\t n = initialN,\n\t\t bias = initialBias,\n\t\t basic,\n\t\t j,\n\t\t index,\n\t\t oldi,\n\t\t w,\n\t\t k,\n\t\t digit,\n\t\t t,\n\t\t /** Cached calculation results */\n\t\t baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t delta,\n\t\t handledCPCount,\n\t\t basicLength,\n\t\t bias,\n\t\t j,\n\t\t m,\n\t\t q,\n\t\t k,\n\t\t t,\n\t\t currentValue,\n\t\t output = [],\n\t\t /** `inputLength` will hold the number of code points in `input`. */\n\t\t inputLength,\n\t\t /** Cached calculation results */\n\t\t handledCPCountPlusOne,\n\t\t baseMinusT,\n\t\t qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.4.1',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see \n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine('punycode', function() {\n\t\t\treturn punycode;\n\t\t});\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) {\n\t\t\t// in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else {\n\t\t\t// in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","// markdown-it default options\n\n'use strict';\n\n\nmodule.exports = {\n options: {\n html: false, // Enable HTML tags in source\n xhtmlOut: false, // Use '/' to close single tags (
          )\n breaks: false, // Convert '\\n' in paragraphs into
          \n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with )\n breaks: false, // Convert '\\n' in paragraphs into
          \n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with )\n breaks: false, // Convert '\\n' in paragraphs into
          \n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with {\n applyEditor();\n app.extensionData.for('askvortsov-rich-text').registerSetting({\n setting: 'askvortsov-rich-text.toggle_on_editor',\n type: 'boolean',\n label: app.translator.trans('askvortsov-rich-text.admin.settings.toggle_on_editor'),\n });\n});\n\nexport * from '../common/index';\n"],"sourceRoot":""} \ No newline at end of file diff --git a/js/dist/forum.js b/js/dist/forum.js index f104f5a..f9592d6 100644 --- a/js/dist/forum.js +++ b/js/dist/forum.js @@ -3,7 +3,7 @@ module.exports=function(t){var e={};function r(n){if(e[n])return e[n].exports;va * tiptap-utils v1.13.0 * (c) 2021 überdosis GbR (limited liability) * @license MIT - */function o(t){return e=>function(t,e){for(let r=t.depth;r>0;r-=1){const n=t.node(r);if(e(n))return{pos:r>0?t.before(r):0,start:t.start(r),depth:r,node:n}}}(e.$from,t)}function i(t){return function(e){if(function(t){return t instanceof n.c}(e)){const{node:r}=e,{$from:n}=e;if(function(t,e){return Array.isArray(t)&&t.indexOf(e.type)>-1||e.type===t}(t,r))return{node:r,pos:n.pos,depth:n.depth}}}}function s(t,e){const{from:r,to:n}=t.selection;let o=[];t.doc.nodesBetween(r,n,t=>{o=[...o,...t.marks]});const i=o.find(t=>t.type.name===e.name);return i?i.attrs:{}}function a(t=null,e=null){if(!t||!e)return!1;const r=t.parent.childAfter(t.parentOffset);if(!r.node)return!1;const n=r.node.marks.find(t=>t.type===e);if(!n)return!1;let o=t.index(),i=t.start()+r.offset,s=o+1,a=i+r.node.nodeSize;for(;o>0&&n.isInSet(t.parent.child(o-1).marks);)o-=1,i-=t.parent.child(o).nodeSize;for(;st.type===e)(t.selection);return Object.keys(r).length&&n?n.node.hasMarkup(e,{...n.node.attrs,...r}):!!n}},function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));var n=r(6),o=r(2),i=function(t){function e(){return t.apply(this,arguments)||this}return Object(n.a)(e,t),e.initAttrs=function(t){t.command=Object(o.n)(t.mark)},e.prototype.onEditorUpdate=function(){this.$().toggleClass("active",!!this.state.markActive(this.attrs.mark))},e}(r(10).a)},function(t,e,r){"use strict";r.d(e,"a",(function(){return y})),r.d(e,"b",(function(){return g}));for(var n={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",229:"q"},o={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"',229:"Q"},i="undefined"!=typeof navigator&&/Chrome\/(\d+)/.exec(navigator.userAgent),s="undefined"!=typeof navigator&&/Apple Computer/.test(navigator.vendor),a="undefined"!=typeof navigator&&/Gecko\/\d+/.test(navigator.userAgent),c="undefined"!=typeof navigator&&/Mac/.test(navigator.platform),l="undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),u=i&&(c||+i[1]<57)||a&&c,p=0;p<10;p++)n[48+p]=n[96+p]=String(p);for(p=1;p<=24;p++)n[p+111]="F"+p;for(p=65;p<=90;p++)n[p]=String.fromCharCode(p+32),o[p]=String.fromCharCode(p);for(var h in n)o.hasOwnProperty(h)||(o[h]=n[h]);var f=r(1),d="undefined"!=typeof navigator&&/Mac/.test(navigator.platform);function m(t){var e,r,n,o,i=t.split(/-(?!$)/),s=i[i.length-1];"Space"==s&&(s=" ");for(var a=0;a127)&&(i=n[r.keyCode])&&i!=a){var h=e[v(i,r,!0)];if(h&&h(t.state,t.dispatch,t))return!0}else if(c&&r.shiftKey){var f=e[v(a,r,!0)];if(f&&f(t.state,t.dispatch,t))return!0}return!1}}},function(t,e){t.exports=flarum.core.compat["common/utils/ItemList"]},function(t,e){t.exports=flarum.core.compat["common/utils/Stream"]},function(t,e){t.exports=flarum.core.compat["common/components/Button"]},function(t,e){t.exports=flarum.core.compat["common/helpers/icon"]},function(t,e){t.exports=flarum.core.compat["common/components/Dropdown"]},function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));var n=r(6),o=r(54),i=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.className=function(){return"LoadingModal Modal--small"},r.title=function(){return this.attrs.title},r.oncreate=function(e){t.prototype.oncreate.call(this,e),this.$(".CommandButton").on("click",(function(){app.modal.close()}))},r.content=function(){var t=this.attrs.onsubmit?this.attrs.onsubmit.bind(this):function(){};return m("div",{className:"Modal-body"},m("form",{className:"Form",onsubmit:t},this.attrs.vnodeContent))},e}(r.n(o).a)},function(t,e,r){"use strict";r.d(e,"a",(function(){return v}));var n=r(6),o=r(18),i=r.n(o),s=r(20),a=r.n(s),c=r(9),l=r.n(c),u=r(19),p=r.n(u),h=r(16),f=r.n(h),d=r(21),v=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t),e.initAttrs=function(t){t.buttonClassName="Button Button--icon Button--link Button--menuDropdown"};var r=e.prototype;return r.oninit=function(e){t.prototype.oninit.call(this,e),this.state=this.attrs.state},r.oncreate=function(e){var r=this;t.prototype.oncreate.call(this,e),this.$().on("click",(function(t){$(".App").is(".mobile-safari")&&(app.modal.show(d.a,{title:r.attrs.tooltip,vnodeContent:r.fields().toArray(),onsubmit:r.onsubmit.bind(r)}),t.stopPropagation())})),this.$().on("shown.bs.dropdown",(function(){r.$(".Dropdown-menu").find("input, select, textarea").first().focus().select()}))},r.getButtonContent=function(t){return m(l.a,{text:this.attrs.tooltip},m("span",null,p()(this.attrs.icon)))},r.getMenu=function(t){return m("ul",{className:"Dropdown-menu dropdown-menu FormDropdown"},m("form",{className:"Form",onsubmit:this.onsubmit.bind(this)},this.fields().toArray()))},r.fields=function(){var t=new f.a;return t.add("insert",m(i.a,{type:"submit",className:"Button Button--primary"},app.translator.trans("askvortsov-rich-text.lib.composer.insert_button"))),t},r.onsubmit=function(t){app.modal.close(),t.preventDefault(),$("body").trigger("click"),this.insert(t),app.composer.editor.focus()},r.insert=function(t){},e}(a.a)},function(t,e){t.exports=flarum.core.compat["common/extend"]},function(t,e,r){"use strict";r.d(e,"a",(function(){return s}));var n=r(6),o=r(10),i=r(2),s=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.oninit=function(e){var r=this;e.attrs.command=function(t,n){return Object(i.m)(e.attrs.listType,r.active?t.schema.nodes.list_item:void 0)(t,n)},t.prototype.oninit.call(this,e)},r.onEditorUpdate=function(){this.active=!!this.state.nodeActive(this.attrs.listType),this.$().toggleClass("active",this.active)},e}(o.a)},function(t,e){t.exports=flarum.core.compat["common/components/TextEditor"]},function(t,e,r){"use strict";r.d(e,"a",(function(){return s}));var n=r(12),o=r(7);function i(t){return t.open instanceof Function||t.close instanceof Function?(error("markdown-serializer genMarkupAwareMarkSpec","Unable to extend mark config with open/close as functions",t),t):Object(n.a)({},t,{open:function(e,r){return r.attrs.markup||t.open},close:function(e,r){var n=r.attrs.markup;return(n=/^<[a-z]+>$/i.test(n)?n.replace(/^! ",null,e,(function(){return t.renderContent(e)}))},math_block:function(t,e){t.write("$$\n"),t.text(e.textContent,!1),t.ensureNewLine(),t.write("$$"),t.closeBlock(e)},paragraph:function(t,e){0===e.content.size?t.write("\n"):o.e.nodes.paragraph(t,e)},hard_break:function(t,e,r,n){for(var o=n+1;o!",close:"!<",mixable:!0,expelEnclosingWhitespace:!0}),strike:i({open:"~~",close:"~~",mixable:!0,expelEnclosingWhitespace:!0}),sub:i({open:"~",close:"~",mixable:!0,expelEnclosingWhitespace:!0}),sup:i({open:"^",close:"^",mixable:!0,expelEnclosingWhitespace:!0}),math_inline:Object(n.a)({},i({open:"$",close:"$",mixable:!1,expelEnclosingWhitespace:!0}),{escape:!1})})},e.build=function(){return new o.b(this.buildNodes(),this.buildMarks())},t}()},function(t,e,r){"use strict";t.exports=r(55)},function(t,e,r){"use strict";r.d(e,"a",(function(){return l}));var n=r(12),o=r(7),i=r(0);function s(){for(var t=arguments.length,e=new Array(t),r=0;r=e?o.empty:this.sliceInner(Math.max(0,t),Math.min(this.length,e))},o.prototype.get=function(t){if(!(t<0||t>=this.length))return this.getInner(t)},o.prototype.forEach=function(t,e,r){void 0===e&&(e=0),void 0===r&&(r=this.length),e<=r?this.forEachInner(t,e,r,0):this.forEachInvertedInner(t,e,r,0)},o.prototype.map=function(t,e,r){void 0===e&&(e=0),void 0===r&&(r=this.length);var n=[];return this.forEach((function(e,r){return n.push(t(e,r))}),e,r),n},o.from=function(t){return t instanceof o?t:t&&t.length?new i(t):o.empty};var i=function(t){function e(e){t.call(this),this.values=e}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={length:{configurable:!0},depth:{configurable:!0}};return e.prototype.flatten=function(){return this.values},e.prototype.sliceInner=function(t,r){return 0==t&&r==this.length?this:new e(this.values.slice(t,r))},e.prototype.getInner=function(t){return this.values[t]},e.prototype.forEachInner=function(t,e,r,n){for(var o=e;o=r;o--)if(!1===t(this.values[o],n+o))return!1},e.prototype.leafAppend=function(t){if(this.length+t.length<=200)return new e(this.values.concat(t.flatten()))},e.prototype.leafPrepend=function(t){if(this.length+t.length<=200)return new e(t.flatten().concat(this.values))},r.length.get=function(){return this.values.length},r.depth.get=function(){return 0},Object.defineProperties(e.prototype,r),e}(o);o.empty=new i([]);var s=function(t){function e(e,r){t.call(this),this.left=e,this.right=r,this.length=e.length+r.length,this.depth=Math.max(e.depth,r.depth)+1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},e.prototype.getInner=function(t){return to&&!1===this.right.forEachInner(t,Math.max(e-o,0),Math.min(this.length,r)-o,n+o))&&void 0)},e.prototype.forEachInvertedInner=function(t,e,r,n){var o=this.left.length;return!(e>o&&!1===this.right.forEachInvertedInner(t,e-o,Math.max(r,o)-o,n+o))&&(!(r=r?this.right.slice(t-r,e-r):this.left.slice(t,r).append(this.right.slice(0,e-r))},e.prototype.leafAppend=function(t){var r=this.right.leafAppend(t);if(r)return new e(this.left,r)},e.prototype.leafPrepend=function(t){var r=this.left.leafPrepend(t);if(r)return new e(r,this.right)},e.prototype.appendInner=function(t){return this.left.depth>=Math.max(this.right.depth,t.depth)+1?new e(this.left,new e(this.right,t)):new e(this,t)},e}(o),a=o,c=r(3),l=r(1),u=function(t,e){this.items=t,this.eventCount=e};u.prototype.popEvent=function(t,e){var r=this;if(0==this.eventCount)return null;for(var n,o,i=this.items.length;;i--){if(this.items.get(i-1).selection){--i;break}}e&&(n=this.remapping(i,this.items.length),o=n.maps.length);var s,a,c=t.tr,l=[],h=[];return this.items.forEach((function(t,e){if(!t.step)return n||(n=r.remapping(i,e+1),o=n.maps.length),o--,void h.push(t);if(n){h.push(new p(t.map));var f,d=t.step.map(n.slice(o));d&&c.maybeStep(d).doc&&(f=c.mapping.maps[c.mapping.maps.length-1],l.push(new p(f,null,null,l.length+h.length))),o--,f&&n.appendMap(f,o)}else c.maybeStep(t.step);return t.selection?(s=n?t.selection.map(n.slice(o)):t.selection,a=new u(r.items.slice(0,i).append(h.reverse().concat(l)),r.eventCount-1),!1):void 0}),this.items.length,0),{remaining:a,transform:c,selection:s}},u.prototype.addTransform=function(t,e,r,n){for(var o=[],i=this.eventCount,s=this.items,a=!n&&s.length?s.get(s.length-1):null,c=0;cf&&(v=y,(m=s).forEach((function(t,e){if(t.selection&&0==v--)return g=e,!1})),s=m.slice(g),i-=y),new u(s.append(o),i)},u.prototype.remapping=function(t,e){var r=new c.a;return this.items.forEach((function(e,n){var o=null!=e.mirrorOffset&&n-e.mirrorOffset>=t?r.maps.length-e.mirrorOffset:null;r.appendMap(e.map,o)}),t,e),r},u.prototype.addMaps=function(t){return 0==this.eventCount?this:new u(this.items.append(t.map((function(t){return new p(t)}))),this.eventCount)},u.prototype.rebased=function(t,e){if(!this.eventCount)return this;var r=[],n=Math.max(0,this.items.length-e),o=t.mapping,i=t.steps.length,s=this.eventCount;this.items.forEach((function(t){t.selection&&s--}),n);var a=e;this.items.forEach((function(e){var n=o.getMirror(--a);if(null!=n){i=Math.min(i,n);var c=o.maps[n];if(e.step){var l=t.steps[n].invert(t.docs[n]),u=e.selection&&e.selection.map(o.slice(a+1,n));u&&s++,r.push(new p(c,l,u))}else r.push(new p(c))}}),n);for(var c=[],l=e;l500&&(f=f.compress(this.items.length-r.length)),f},u.prototype.emptyItemCount=function(){var t=0;return this.items.forEach((function(e){e.step||t++})),t},u.prototype.compress=function(t){void 0===t&&(t=this.items.length);var e=this.remapping(0,t),r=e.maps.length,n=[],o=0;return this.items.forEach((function(i,s){if(s>=t)n.push(i),i.selection&&o++;else if(i.step){var a=i.step.map(e.slice(r)),c=a&&a.getMap();if(r--,c&&e.appendMap(c,r),a){var l=i.selection&&i.selection.map(e.slice(r));l&&o++;var u,h=new p(c.invert(),a,l),f=n.length-1;(u=n.length&&n[f].merge(h))?n[f]=u:n.push(h)}}else i.map&&r--}),this.items.length,0),new u(a.from(n.reverse()),o)},u.empty=new u(a.empty,0);var p=function(t,e,r,n){this.map=t,this.step=e,this.selection=r,this.mirrorOffset=n};p.prototype.merge=function(t){if(this.step&&t.step&&!t.selection){var e=t.step.merge(this.step);if(e)return new p(e.getMap().invert(),e,this.selection)}};var h=function(t,e,r,n){this.done=t,this.undone=e,this.prevRanges=r,this.prevTime=n},f=20;function d(t){var e=[];return t.forEach((function(t,r,n,o){return e.push(n,o)})),e}function v(t,e){if(!t)return null;for(var r=[],n=0;n=e[o]&&(r=!0)})),r}(r,t.prevRanges)),c=s?v(t.prevRanges,r.mapping):d(r.mapping.maps[r.steps.length-1]);return new h(t.done.addTransform(r,a?e.selection.getBookmark():null,n,k(e)),u.empty,c,r.time)}(r,n,e,t)}},config:t})}function C(t,e){var r=w.getState(t);return!(!r||0==r.done.eventCount)&&(e&&g(r,t,e,!1),!0)}function S(t,e){var r=w.getState(t);return!(!r||0==r.undone.eventCount)&&(e&&g(r,t,e,!0),!0)}var A=r(15),O=r(0),M={};if("undefined"!=typeof navigator&&"undefined"!=typeof document){var D=/Edge\/(\d+)/.exec(navigator.userAgent),E=/MSIE \d/.test(navigator.userAgent),T=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);M.mac=/Mac/.test(navigator.platform);var N=M.ie=!!(E||T||D);M.ie_version=E?document.documentMode||6:T?+T[1]:D?+D[1]:null,M.gecko=!N&&/gecko\/(\d+)/i.test(navigator.userAgent),M.gecko_version=M.gecko&&+(/Firefox\/(\d+)/.exec(navigator.userAgent)||[0,0])[1];var I=!N&&/Chrome\/(\d+)/.exec(navigator.userAgent);M.chrome=!!I,M.chrome_version=I&&+I[1],M.safari=!N&&/Apple Computer/.test(navigator.vendor),M.ios=M.safari&&(/Mobile\/\w+/.test(navigator.userAgent)||navigator.maxTouchPoints>2),M.android=/Android \d/.test(navigator.userAgent),M.webkit="webkitFontSmoothing"in document.documentElement.style,M.webkit_version=M.webkit&&+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]}var z=function(t){for(var e=0;;e++)if(!(t=t.previousSibling))return e},R=function(t){var e=t.parentNode;return e&&11==e.nodeType?e.host:e},F=null,j=function(t,e,r){var n=F||(F=document.createRange());return n.setEnd(t,null==r?t.nodeValue.length:r),n.setStart(t,e||0),n},q=function(t,e,r,n){return r&&(P(t,e,r,n,-1)||P(t,e,r,n,1))},B=/^(img|br|input|textarea|hr)$/i;function P(t,e,r,n,o){for(;;){if(t==r&&e==n)return!0;if(e==(o<0?0:L(t))){var i=t.parentNode;if(1!=i.nodeType||V(t)||B.test(t.nodeName)||"false"==t.contentEditable)return!1;e=z(t)+(o<0?0:1),t=i}else{if(1!=t.nodeType)return!1;if("false"==(t=t.childNodes[e+(o<0?-1:0)]).contentEditable)return!1;e=o<0?L(t):0}}}function L(t){return 3==t.nodeType?t.nodeValue.length:t.childNodes.length}function V(t){for(var e,r=t;r&&!(e=r.pmViewDesc);r=r.parentNode);return e&&e.node&&e.node.isBlock&&(e.dom==t||e.contentDOM==t)}var U=function(t){var e=t.isCollapsed;return e&&M.chrome&&t.rangeCount&&!t.getRangeAt(0).collapsed&&(e=!1),e};function J(t,e){var r=document.createEvent("Event");return r.initEvent("keydown",!0,!0),r.keyCode=t,r.key=r.code=e,r}function W(t){return{left:0,right:t.documentElement.clientWidth,top:0,bottom:t.documentElement.clientHeight}}function K(t,e){return"number"==typeof t?t:t[e]}function H(t){var e=t.getBoundingClientRect();return{left:e.left,right:e.left+t.clientWidth,top:e.top,bottom:e.top+t.clientHeight}}function G(t,e,r){for(var n=t.someProp("scrollThreshold")||0,o=t.someProp("scrollMargin")||5,i=t.dom.ownerDocument,s=r||t.dom;s;s=R(s))if(1==s.nodeType){var a=s==i.body||1!=s.nodeType,c=a?W(i):H(s),l=0,u=0;if(e.topc.bottom-K(n,"bottom")&&(u=e.bottom-c.bottom+K(o,"bottom")),e.leftc.right-K(n,"right")&&(l=e.right-c.right+K(o,"right")),l||u)if(a)i.defaultView.scrollBy(l,u);else{var p=s.scrollLeft,h=s.scrollTop;u&&(s.scrollTop+=u),l&&(s.scrollLeft+=l);var f=s.scrollLeft-p,d=s.scrollTop-h;e={left:e.left-f,top:e.top-d,right:e.right-f,bottom:e.bottom-d}}if(a)break}}function Z(t){for(var e=[],r=t.ownerDocument;t&&(e.push({dom:t,top:t.scrollTop,left:t.scrollLeft}),t!=r);t=R(t));return e}function Y(t,e){for(var r=0;r=a){s=Math.max(h.bottom,s),a=Math.min(h.top,a);var f=h.left>e.left?h.left-e.left:h.right=(h.left+h.right)/2?1:0));continue}}!r&&(e.left>=h.right&&e.top>=h.top||e.left>=h.left&&e.top>=h.bottom)&&(i=l+1)}}return r&&3==r.nodeType?function(t,e){for(var r=t.nodeValue.length,n=document.createRange(),o=0;o=(i.left+i.right)/2?1:0)}}return{node:t,offset:0}}(r,n):!r||o&&1==r.nodeType?{node:t,offset:i}:Q(r,n)}function tt(t,e){return t.left>=e.left-1&&t.left<=e.right+1&&t.top>=e.top-1&&t.top<=e.bottom+1}function et(t,e){var r,n,o,i,s=t.root;if(s.caretPositionFromPoint)try{var a=s.caretPositionFromPoint(e.left,e.top);a&&(o=(r=a).offsetNode,i=r.offset)}catch(t){}if(!o&&s.caretRangeFromPoint){var c=s.caretRangeFromPoint(e.left,e.top);c&&(o=(n=c).startContainer,i=n.startOffset)}var l,u=s.elementFromPoint(e.left,e.top+1);if(!u||!t.dom.contains(1!=u.nodeType?u.parentNode:u)){var p=t.dom.getBoundingClientRect();if(!tt(e,p))return null;if(!(u=function t(e,r,n){var o=e.childNodes.length;if(o&&n.tope.top&&i++}o==t.dom&&i==o.childNodes.length-1&&1==o.lastChild.nodeType&&e.top>o.lastChild.getBoundingClientRect().bottom?l=t.state.doc.content.size:0!=i&&1==o.nodeType&&"BR"==o.childNodes[i-1].nodeName||(l=function(t,e,r,n){for(var o=-1,i=e;i!=t.dom;){var s=t.docView.nearestDesc(i,!0);if(!s)return null;if(s.node.isBlock&&s.parent){var a=s.dom.getBoundingClientRect();if(a.left>n.left||a.top>n.top)o=s.posBefore;else{if(!(a.right-1?o:t.docView.posFromDOM(e,r)}(t,o,i,e))}null==l&&(l=function(t,e,r){var n=Q(e,r),o=n.node,i=n.offset,s=-1;if(1==o.nodeType&&!o.firstChild){var a=o.getBoundingClientRect();s=a.left!=a.right&&r.left>(a.left+a.right)/2?1:-1}return t.docView.posFromDOM(o,i,s)}(t,u,e));var d=t.docView.nearestDesc(u,!0);return{pos:l,inside:d?d.posAtStart-d.border:-1}}function rt(t,e){var r=t.getClientRects();return r.length?r[e<0?0:r.length-1]:t.getBoundingClientRect()}var nt=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;function ot(t,e,r){var n=t.docView.domFromPos(e,r<0?-1:1),o=n.node,i=n.offset,s=M.webkit||M.gecko;if(3==o.nodeType){if(!s||!nt.test(o.nodeValue)&&(r<0?i:i!=o.nodeValue.length)){var a=i,c=i,l=r<0?1:-1;return r<0&&!i?(c++,l=-1):r>=0&&i==o.nodeValue.length?(a--,l=1):r<0?a--:c++,it(rt(j(o,a,c),l),l<0)}var u=rt(j(o,i,i),r);if(M.gecko&&i&&/\s/.test(o.nodeValue[i-1])&&i=0)}if(i&&(r<0||i==L(o))){var m=o.childNodes[i-1],v=3==m.nodeType?j(m,L(m)-(s?0:1)):1!=m.nodeType||"BR"==m.nodeName&&m.nextSibling?null:m;if(v)return it(rt(v,1),!1)}if(i=0)}function it(t,e){if(0==t.width)return t;var r=e?t.left:t.right;return{top:t.top,bottom:t.bottom,left:r,right:r}}function st(t,e){if(0==t.height)return t;var r=e?t.top:t.bottom;return{top:r,bottom:r,left:t.left,right:t.right}}function at(t,e,r){var n=t.state,o=t.root.activeElement;n!=e&&t.updateState(e),o!=t.dom&&t.focus();try{return r()}finally{n!=e&&t.updateState(n),o!=t.dom&&o&&o.focus()}}var ct=/[\u0590-\u08ac]/;var lt=null,ut=null,pt=!1;function ht(t,e,r){return lt==e&&ut==r?pt:(lt=e,ut=r,pt="up"==r||"down"==r?function(t,e,r){var n=e.selection,o="up"==r?n.$from:n.$to;return at(t,e,(function(){for(var e=t.docView.domFromPos(o.pos,"up"==r?-1:1).node;;){var n=t.docView.nearestDesc(e,!0);if(!n)break;if(n.node.isBlock){e=n.dom;break}e=n.dom.parentNode}for(var i=ot(t,o.pos,1),s=e.firstChild;s;s=s.nextSibling){var a=void 0;if(1==s.nodeType)a=s.getClientRects();else{if(3!=s.nodeType)continue;a=j(s,0,s.nodeValue.length).getClientRects()}for(var c=0;cl.top&&("up"==r?l.bottomi.bottom-1))return!1}}return!0}))}(t,e,r):function(t,e,r){var n=e.selection.$head;if(!n.parent.isTextblock)return!1;var o=n.parentOffset,i=!o,s=o==n.parent.content.size,a=getSelection();return ct.test(n.parent.textContent)&&a.modify?at(t,e,(function(){var e=a.getRangeAt(0),o=a.focusNode,i=a.focusOffset,s=a.caretBidiLevel;a.modify("move",r,"character");var c=!(n.depth?t.docView.domAfterPos(n.before()):t.dom).contains(1==a.focusNode.nodeType?a.focusNode:a.focusNode.parentNode)||o==a.focusNode&&i==a.focusOffset;return a.removeAllRanges(),a.addRange(e),null!=s&&(a.caretBidiLevel=s),c})):"left"==r||"backward"==r?i:s}(t,e,r))}var ft=function(t,e,r,n){this.parent=t,this.children=e,this.dom=r,r.pmViewDesc=this,this.contentDOM=n,this.dirty=0},dt={beforePosition:{configurable:!0},size:{configurable:!0},border:{configurable:!0},posBefore:{configurable:!0},posAtStart:{configurable:!0},posAfter:{configurable:!0},posAtEnd:{configurable:!0},contentLost:{configurable:!0},domAtom:{configurable:!0}};ft.prototype.matchesWidget=function(){return!1},ft.prototype.matchesMark=function(){return!1},ft.prototype.matchesNode=function(){return!1},ft.prototype.matchesHack=function(){return!1},dt.beforePosition.get=function(){return!1},ft.prototype.parseRule=function(){return null},ft.prototype.stopEvent=function(){return!1},dt.size.get=function(){for(var t=0,e=0;e0:a)?this.posAtEnd:this.posAtStart},ft.prototype.nearestDesc=function(t,e){for(var r=!0,n=t;n;n=n.parentNode){var o=this.getDesc(n);if(o&&(!e||o.node)){if(!r||!o.nodeDOM||(1==o.nodeDOM.nodeType?o.nodeDOM.contains(1==t.nodeType?t:t.parentNode):o.nodeDOM==t))return o;r=!1}}},ft.prototype.getDesc=function(t){for(var e=t.pmViewDesc,r=e;r;r=r.parent)if(r==this)return e},ft.prototype.posFromDOM=function(t,e,r){for(var n=t;n;n=n.parentNode){var o=this.getDesc(n);if(o)return o.localPosFromDOM(t,e,r)}return-1},ft.prototype.descAt=function(t){for(var e=0,r=0;e=t:s>t))return i.domFromPos(t-r-i.border,e);r=s}},ft.prototype.parseRange=function(t,e,r){if(void 0===r&&(r=0),0==this.children.length)return{node:this.contentDOM,from:t,to:e,fromOffset:0,toOffset:this.contentDOM.childNodes.length};for(var n=-1,o=-1,i=r,s=0;;s++){var a=this.children[s],c=i+a.size;if(-1==n&&t<=c){var l=i+a.border;if(t>=l&&e<=c-a.border&&a.node&&a.contentDOM&&this.contentDOM.contains(a.contentDOM))return a.parseRange(t,e,l);t=i;for(var u=s;u>0;u--){var p=this.children[u-1];if(p.size&&p.dom.parentNode==this.contentDOM&&!p.emptyChildAt(1)){n=z(p.dom)+1;break}t-=p.size}-1==n&&(n=0)}if(n>-1&&(c>e||s==this.children.length-1)){e=c;for(var h=s+1;ha&&ie){var y=u;u=p,p=y}var b=document.createRange();b.setEnd(p.node,p.offset),b.setStart(u.node,u.offset),h.removeAllRanges(),h.addRange(b)}}},ft.prototype.ignoreMutation=function(t){return!this.contentDOM&&"selection"!=t.type},dt.contentLost.get=function(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)},ft.prototype.markDirty=function(t,e){for(var r=0,n=0;n=r:tr){var s=r+o.border,a=i-o.border;if(t>=s&&e<=a)return this.dirty=t==r||e==i?2:1,void(t!=s||e!=a||!o.contentLost&&o.dom.parentNode==this.contentDOM?o.markDirty(t-s,e-s):o.dirty=3);o.dirty=3}r=i}this.dirty=2},ft.prototype.markParentsDirty=function(){for(var t=1,e=this.parent;e;e=e.parent,t++){var r=1==t?2:1;e.dirty0&&(i=zt(i,0,t,n));for(var a=0;ai;)l.push(o[c++]);var y=i+m.nodeSize;if(m.isText){var b=y;c=0&&!a&&s.syncToMarks(i==r.node.childCount?O.d.none:r.node.child(i).marks,n,t),s.placeWidget(e,t,o)}),(function(e,r,i,a){s.syncToMarks(e.marks,n,t),s.findNodeMatch(e,r,i,a)||s.updateNextNode(e,r,i,t,a)||s.addNode(e,r,i,t,o),o+=e.nodeSize})),s.syncToMarks(mt,n,t),this.node.isTextblock&&s.addTextblockHacks(),s.destroyRest(),(s.changed||2==this.dirty)&&(i&&this.protectLocalComposition(t,i),function t(e,r,n){for(var o=e.firstChild,i=!1,s=0;se+this.node.content.size)){var i=t.root.getSelection(),s=function(t,e){for(;;){if(3==t.nodeType)return t;if(1==t.nodeType&&e>0){if(t.childNodes.length>e&&3==t.childNodes[e].nodeType)return t.childNodes[e];t=t.childNodes[e-1],e=L(t)}else{if(!(1==t.nodeType&&e=r){var u=c.lastIndexOf(e,n-a);if(u>=0&&u+e.length+a>=r)return a+u}}}return-1}(this.node.content,a,n-e,o-e);return c<0?null:{node:s,pos:c,text:a}}}},e.prototype.protectLocalComposition=function(t,e){var r=e.node,n=e.pos,o=e.text;if(!this.getDesc(r)){for(var i=r;i.parentNode!=this.contentDOM;i=i.parentNode){for(;i.previousSibling;)i.parentNode.removeChild(i.previousSibling);for(;i.nextSibling;)i.parentNode.removeChild(i.nextSibling);i.pmViewDesc&&(i.pmViewDesc=null)}var s=new gt(this,i,r,o);t.compositionNodes.push(s),this.children=zt(this.children,n,n+o.length,t,s)}},e.prototype.update=function(t,e,r,n){return!(3==this.dirty||!t.sameMarkup(this.node))&&(this.updateInner(t,e,r,n),!0)},e.prototype.updateInner=function(t,e,r,n){this.updateOuterDeco(e),this.node=t,this.innerDeco=r,this.contentDOM&&this.updateChildren(n,this.posAtStart),this.dirty=0},e.prototype.updateOuterDeco=function(t){if(!Et(t,this.outerDeco)){var e=1!=this.nodeDOM.nodeType,r=this.dom;this.dom=Ot(this.dom,this.nodeDOM,At(this.outerDeco,this.node,e),At(t,this.node,e)),this.dom!=r&&(r.pmViewDesc=null,this.dom.pmViewDesc=this),this.outerDeco=t}},e.prototype.selectNode=function(){this.nodeDOM.classList.add("ProseMirror-selectednode"),!this.contentDOM&&this.node.type.spec.draggable||(this.dom.draggable=!0)},e.prototype.deselectNode=function(){this.nodeDOM.classList.remove("ProseMirror-selectednode"),!this.contentDOM&&this.node.type.spec.draggable||this.dom.removeAttribute("draggable")},r.domAtom.get=function(){return this.node.isAtom},Object.defineProperties(e.prototype,r),e}(ft);function kt(t,e,r,n,o){return Dt(n,e,t),new bt(null,t,e,r,n,n,n,o,0)}var wt=function(t){function e(e,r,n,o,i,s,a){t.call(this,e,r,n,o,i,null,s,a)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={domAtom:{configurable:!0}};return e.prototype.parseRule=function(){for(var t=this.nodeDOM.parentNode;t&&t!=this.dom&&!t.pmIsDeco;)t=t.parentNode;return{skip:t||!0}},e.prototype.update=function(t,e,r,n){return!(3==this.dirty||0!=this.dirty&&!this.inParent()||!t.sameMarkup(this.node))&&(this.updateOuterDeco(e),0==this.dirty&&t.text==this.node.text||t.text==this.nodeDOM.nodeValue||(this.nodeDOM.nodeValue=t.text,n.trackWrites==this.nodeDOM&&(n.trackWrites=null)),this.node=t,this.dirty=0,!0)},e.prototype.inParent=function(){for(var t=this.parent.contentDOM,e=this.nodeDOM;e;e=e.parentNode)if(e==t)return!0;return!1},e.prototype.domFromPos=function(t){return{node:this.nodeDOM,offset:t}},e.prototype.localPosFromDOM=function(e,r,n){return e==this.nodeDOM?this.posAtStart+Math.min(r,this.node.text.length):t.prototype.localPosFromDOM.call(this,e,r,n)},e.prototype.ignoreMutation=function(t){return"characterData"!=t.type&&"selection"!=t.type},e.prototype.slice=function(t,r,n){var o=this.node.cut(t,r),i=document.createTextNode(o.text);return new e(this.parent,o,this.outerDeco,this.innerDeco,i,i,n)},r.domAtom.get=function(){return!1},Object.defineProperties(e.prototype,r),e}(bt),xt=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={domAtom:{configurable:!0}};return e.prototype.parseRule=function(){return{ignore:!0}},e.prototype.matchesHack=function(){return 0==this.dirty},r.domAtom.get=function(){return!0},Object.defineProperties(e.prototype,r),e}(ft),_t=function(t){function e(e,r,n,o,i,s,a,c,l,u){t.call(this,e,r,n,o,i,s,a,l,u),this.spec=c}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.update=function(e,r,n,o){if(3==this.dirty)return!1;if(this.spec.update){var i=this.spec.update(e,r);return i&&this.updateInner(e,r,n,o),i}return!(!this.contentDOM&&!e.isLeaf)&&t.prototype.update.call(this,e,r,n,o)},e.prototype.selectNode=function(){this.spec.selectNode?this.spec.selectNode():t.prototype.selectNode.call(this)},e.prototype.deselectNode=function(){this.spec.deselectNode?this.spec.deselectNode():t.prototype.deselectNode.call(this)},e.prototype.setSelection=function(e,r,n,o){this.spec.setSelection?this.spec.setSelection(e,r,n):t.prototype.setSelection.call(this,e,r,n,o)},e.prototype.destroy=function(){this.spec.destroy&&this.spec.destroy(),t.prototype.destroy.call(this)},e.prototype.stopEvent=function(t){return!!this.spec.stopEvent&&this.spec.stopEvent(t)},e.prototype.ignoreMutation=function(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):t.prototype.ignoreMutation.call(this,e)},e}(bt);function Ct(t){t&&(this.nodeName=t)}Ct.prototype=Object.create(null);var St=[new Ct];function At(t,e,r){if(0==t.length)return St;for(var n=r?St[0]:new Ct,o=[n],i=0;i0&&o>=0;o--){var i=e[o],s=i.node;if(s){if(s!=t.child(n-1))break;r.push(i),--n}}return{nodes:r.reverse(),offset:n}}(t.node.content,t.children);this.preMatched=r.nodes,this.preMatchOffset=r.offset};function It(t,e){return t.type.side-e.type.side}function zt(t,e,r,n,o){for(var i=[],s=0,a=0;s=r||u<=e?i.push(c):(lr&&i.push(c.slice(r-l,c.size,n)))}return i}function Rt(t,e){var r=t.root.getSelection(),n=t.state.doc;if(!r.focusNode)return null;var o=t.docView.nearestDesc(r.focusNode),i=o&&0==o.size,s=t.docView.posFromDOM(r.focusNode,r.focusOffset);if(s<0)return null;var a,c,u=n.resolve(s);if(U(r)){for(a=u;o&&!o.node;)o=o.parent;if(o&&o.node.isAtom&&l.c.isSelectable(o.node)&&o.parent&&(!o.node.isInline||!function(t,e,r){for(var n=0==e,o=e==L(t);n||o;){if(t==r)return!0;var i=z(t);if(!(t=t.parentNode))return!1;n=n&&0==i,o=o&&i==L(t)}}(r.focusNode,r.focusOffset,o.dom))){var p=o.posBefore;c=new l.c(s==p?u:n.resolve(p))}}else{var h=t.docView.posFromDOM(r.anchorNode,r.anchorOffset);if(h<0)return null;a=n.resolve(h)}c||(c=Vt(t,a,u,"pointer"==e||t.state.selection.head=this.preMatchOffset?this.preMatched[t-this.preMatchOffset]:null},Nt.prototype.destroyBetween=function(t,e){if(t!=e){for(var r=t;r>1,i=Math.min(o,t.length);n-1)s>this.index&&(this.changed=!0,this.destroyBetween(this.index,s)),this.top=this.top.children[this.index];else{var c=yt.create(this.top,t[o],e,r);this.top.children.splice(this.index,0,c),this.top=c,this.changed=!0}this.index=0,o++}},Nt.prototype.findNodeMatch=function(t,e,r,n){var o=-1,i=n<0?void 0:this.getPreMatch(n),s=this.top.children;if(i&&i.matchesNode(t,e,r))o=s.indexOf(i);else for(var a=this.index,c=Math.min(s.length,a+5);a-1&&a+this.preMatchOffset!=o)return!1;var c=s.dom;if(!(this.lock&&(c==this.lock||1==c.nodeType&&c.contains(this.lock.parentNode))&&!(t.isText&&s.node&&s.node.isText&&s.nodeDOM.nodeValue==t.text&&3!=s.dirty&&Et(e,s.outerDeco)))&&s.update(t,e,r,n))return this.destroyBetween(this.index,i),s.dom!=c&&(this.changed=!0),this.index++,!0;break}}return!1},Nt.prototype.addNode=function(t,e,r,n,o){this.top.children.splice(this.index++,0,bt.create(this.top,t,e,r,n,o)),this.changed=!0},Nt.prototype.placeWidget=function(t,e,r){var n=this.index0?n.max(o):n.min(o),s=i.parent.inlineContent?i.depth?t.doc.resolve(e>0?i.after():i.before()):null:i;return s&&l.f.findFrom(s,e)}function Wt(t,e){return t.dispatch(t.state.tr.setSelection(e).scrollIntoView()),!0}function Kt(t,e,r){var n=t.state.selection;if(!(n instanceof l.g)){if(n instanceof l.c&&n.node.isInline)return Wt(t,new l.g(e>0?n.$to:n.$from));var o=Jt(t.state,e);return!!o&&Wt(t,o)}if(!n.empty||r.indexOf("s")>-1)return!1;if(t.endOfTextblock(e>0?"right":"left")){var i=Jt(t.state,e);return!!(i&&i instanceof l.c)&&Wt(t,i)}if(!(M.mac&&r.indexOf("m")>-1)){var s,a=n.$head,c=a.textOffset?null:e<0?a.nodeBefore:a.nodeAfter;if(!c||c.isText)return!1;var u=e<0?a.pos-c.nodeSize:a.pos;return!!(c.isAtom||(s=t.docView.descAt(u))&&!s.contentDOM)&&(l.c.isSelectable(c)?Wt(t,new l.c(e<0?t.state.doc.resolve(a.pos-c.nodeSize):a)):!!M.webkit&&Wt(t,new l.g(t.state.doc.resolve(e<0?u:u+c.nodeSize))))}}function Ht(t){return 3==t.nodeType?t.nodeValue.length:t.childNodes.length}function Gt(t){var e=t.pmViewDesc;return e&&0==e.size&&(t.nextSibling||"BR"!=t.nodeName)}function Zt(t){var e=t.root.getSelection(),r=e.focusNode,n=e.focusOffset;if(r){var o,i,s=!1;for(M.gecko&&1==r.nodeType&&n0){if(1!=r.nodeType)break;var a=r.childNodes[n-1];if(Gt(a))o=r,i=--n;else{if(3!=a.nodeType)break;n=(r=a).nodeValue.length}}else{if(Xt(r))break;for(var c=r.previousSibling;c&&Gt(c);)o=r.parentNode,i=z(c),c=c.previousSibling;if(c)n=Ht(r=c);else{if((r=r.parentNode)==t.dom)break;n=0}}s?Qt(t,e,r,n):o&&Qt(t,e,o,i)}}function Yt(t){var e=t.root.getSelection(),r=e.focusNode,n=e.focusOffset;if(r){for(var o,i,s=Ht(r);;)if(n-1)return!1;if(M.mac&&r.indexOf("m")>-1)return!1;var o=n.$from,i=n.$to;if(!o.parent.inlineContent||t.endOfTextblock(e<0?"up":"down")){var s=Jt(t.state,e);if(s&&s instanceof l.c)return Wt(t,s)}if(!o.parent.inlineContent){var a=l.f.findFrom(e<0?o:i,e);return!a||Wt(t,a)}return!1}function ee(t,e){if(!(t.state.selection instanceof l.g))return!0;var r=t.state.selection,n=r.$head,o=r.$anchor,i=r.empty;if(!n.sameParent(o))return!0;if(!i)return!1;if(t.endOfTextblock(e>0?"forward":"backward"))return!0;var s=!n.textOffset&&(e<0?n.nodeBefore:n.nodeAfter);if(s&&!s.isText){var a=t.state.tr;return e<0?a.delete(n.pos-s.nodeSize,n.pos):a.delete(n.pos,n.pos+s.nodeSize),t.dispatch(a),!0}return!1}function re(t,e,r){t.domObserver.stop(),e.contentEditable=r,t.domObserver.start()}function ne(t,e){var r=e.keyCode,n=function(t){var e="";return t.ctrlKey&&(e+="c"),t.metaKey&&(e+="m"),t.altKey&&(e+="a"),t.shiftKey&&(e+="s"),e}(e);return 8==r||M.mac&&72==r&&"c"==n?ee(t,-1)||Zt(t):46==r||M.mac&&68==r&&"c"==n?ee(t,1)||Yt(t):13==r||27==r||(37==r?Kt(t,-1,n)||Zt(t):39==r?Kt(t,1,n)||Yt(t):38==r?te(t,-1,n)||Zt(t):40==r?function(t){if(M.safari&&!(t.state.selection.$head.parentOffset>0)){var e=t.root.getSelection(),r=e.focusNode,n=e.focusOffset;if(r&&1==r.nodeType&&0==n&&r.firstChild&&"false"==r.firstChild.contentEditable){var o=r.firstChild;re(t,o,!0),setTimeout((function(){return re(t,o,!1)}),20)}}}(t)||te(t,1,n)||Yt(t):n==(M.mac?"m":"c")&&(66==r||73==r||89==r||90==r))}function oe(t){var e=t.pmViewDesc;if(e)return e.parseRule();if("BR"==t.nodeName&&t.parentNode){if(M.safari&&/^(ul|ol)$/i.test(t.parentNode.nodeName)){var r=document.createElement("div");return r.appendChild(document.createElement("li")),{skip:r}}if(t.parentNode.lastChild==t||M.safari&&/^(tr|table)$/i.test(t.parentNode.nodeName))return{ignore:!0}}else if("IMG"==t.nodeName&&t.getAttribute("mark-placeholder"))return{ignore:!0}}function ie(t,e,r,n,o){if(e<0){var i=t.lastSelectionTime>Date.now()-50?t.lastSelectionOrigin:null,s=Rt(t,i);if(s&&!t.state.selection.eq(s)){var a=t.state.tr.setSelection(s);"pointer"==i?a.setMeta("pointer",!0):"key"==i&&a.scrollIntoView(),t.dispatch(a)}}else{var c=t.state.doc.resolve(e),u=c.sharedDepth(r);e=c.before(u+1),r=t.state.doc.resolve(r).after(u+1);var p=t.state.selection,h=function(t,e,r){var n=t.docView.parseRange(e,r),o=n.node,i=n.fromOffset,s=n.toOffset,a=n.from,c=n.to,l=t.root.getSelection(),u=null,p=l.anchorNode;if(p&&t.dom.contains(1==p.nodeType?p:p.parentNode)&&(u=[{node:p,offset:l.anchorOffset}],U(l)||u.push({node:l.focusNode,offset:l.focusOffset})),M.chrome&&8===t.lastKeyCode)for(var h=s;h>i;h--){var f=o.childNodes[h-1],d=f.pmViewDesc;if("BR"==f.nodeType&&!d){s=h;break}if(!d||d.size)break}var m=t.state.doc,v=t.someProp("domParser")||O.a.fromSchema(t.state.schema),g=m.resolve(a),y=null,b=v.parse(o,{topNode:g.parent,topMatch:g.parent.contentMatchAt(g.index()),topOpen:!0,from:i,to:s,preserveWhitespace:!g.parent.type.spec.code||"full",editableContent:!0,findPositions:u,ruleFromNode:oe,context:g});if(u&&null!=u[0].pos){var k=u[0].pos,w=u[1]&&u[1].pos;null==w&&(w=k),y={anchor:k+a,head:w+a}}return{doc:b,sel:y,from:a,to:c}}(t,e,r);if(M.chrome&&t.cursorWrapper&&h.sel&&h.sel.anchor==t.cursorWrapper.deco.from){var f=t.cursorWrapper.deco.type.toDOM.nextSibling,d=f&&f.nodeValue?f.nodeValue.length:1;h.sel={anchor:h.sel.anchor+d,head:h.sel.anchor+d}}var m,v,g=t.state.doc,y=g.slice(h.from,h.to);8===t.lastKeyCode&&Date.now()-100=a?i-n:0)+(c-a),a=i}else if(c=c?i-n:0)+(a-c),c=i}return{start:i,endA:a,endB:c}}(y.content,h.doc.content,h.from,m,v);if(!b){if(!(n&&p instanceof l.g&&!p.empty&&p.$head.sameParent(p.$anchor))||t.composing||h.sel&&h.sel.anchor!=h.sel.head){if(M.ios&&t.lastIOSEnter>Date.now()-225&&o.some((function(t){return"DIV"==t.nodeName||"P"==t.nodeName}))&&t.someProp("handleKeyDown",(function(e){return e(t,J(13,"Enter"))})))return void(t.lastIOSEnter=0);if(h.sel){var k=se(t,t.state.doc,h.sel);k&&!k.eq(t.state.selection)&&t.dispatch(t.state.tr.setSelection(k))}return}b={start:p.from,endA:p.to,endB:p.to}}t.domChangeCount++,t.state.selection.fromt.state.selection.from&&b.start<=t.state.selection.from+2?b.start=t.state.selection.from:b.endA=t.state.selection.to-2&&(b.endB+=t.state.selection.to-b.endA,b.endA=t.state.selection.to)),M.ie&&M.ie_version<=11&&b.endB==b.start+1&&b.endA==b.start&&b.start>h.from&&"  "==h.doc.textBetween(b.start-h.from-1,b.start-h.from+1)&&(b.start--,b.endA--,b.endB--);var w,x=h.doc.resolveNoCache(b.start-h.from),_=h.doc.resolveNoCache(b.endB-h.from),C=x.sameParent(_)&&x.parent.inlineContent;if((M.ios&&t.lastIOSEnter>Date.now()-225&&(!C||o.some((function(t){return"DIV"==t.nodeName||"P"==t.nodeName})))||!C&&x.posb.start&&function(t,e,r,n,o){if(!n.parent.isTextblock||r-e<=o.pos-n.pos||ae(n,!0,!1)r||ae(s,!0,!1)e.content.size?null:Vt(t,e.resolve(r.anchor),e.resolve(r.head))}function ae(t,e,r){for(var n=t.depth,o=e?t.end():t.pos;n>0&&(e||t.indexAfter(n)==t.node(n).childCount);)n--,o++,e=!1;if(r)for(var i=t.node(n).maybeChild(t.indexAfter(n));i&&!i.isLeaf;)i=i.firstChild,o++;return o}function ce(t,e){for(var r=[],n=e.content,o=e.openStart,i=e.openEnd;o>1&&i>1&&1==n.childCount&&1==n.firstChild.childCount;){o--,i--;var s=n.firstChild;r.push(s.type.name,s.attrs!=s.type.defaultAttrs?s.attrs:null),n=s.content}var a=t.someProp("clipboardSerializer")||O.b.fromSchema(t.state.schema),c=de(),l=c.createElement("div");l.appendChild(a.serializeFragment(n,{document:c}));for(var u,p=l.firstChild;p&&1==p.nodeType&&(u=he[p.nodeName.toLowerCase()]);){for(var h=u.length-1;h>=0;h--){for(var f=c.createElement(u[h]);l.firstChild;)f.appendChild(l.firstChild);l.appendChild(f)}p=l.firstChild}return p&&1==p.nodeType&&p.setAttribute("data-pm-slice",o+" "+i+" "+JSON.stringify(r)),{dom:l,text:t.someProp("clipboardTextSerializer",(function(t){return t(e)}))||e.content.textBetween(0,e.content.size,"\n\n")}}function le(t,e,r,n,o){var i,s,a=o.parent.type.spec.code;if(!r&&!e)return null;var c=e&&(n||a||!r);if(c){if(t.someProp("transformPastedText",(function(t){e=t(e,a||n)})),a)return new O.j(O.c.from(t.state.schema.text(e)),0,0);var l=t.someProp("clipboardTextParser",(function(t){return t(e,o,n)}));l?s=l:(i=document.createElement("div"),e.trim().split(/(?:\r\n?|\n)+/).forEach((function(t){i.appendChild(document.createElement("p")).textContent=t})))}else t.someProp("transformPastedHTML",(function(t){r=t(r)})),i=function(t){var e=/(\s*]*>)*/.exec(t);e&&(t=t.slice(e[0].length));var r,n=de().createElement("div"),o=/(?:]*>)*<([a-z][^>\s]+)/i.exec(t),i=0;(r=o&&he[o[1].toLowerCase()])&&(t=r.map((function(t){return"<"+t+">"})).join("")+t+r.map((function(t){return""})).reverse().join(""),i=r.length);n.innerHTML=t;for(var s=0;s=0;a-=2){var c=n.nodes[r[a]];if(!c||c.hasRequiredAttrs())break;o=O.c.from(c.create(r[a+1],o)),i++,s++}return new O.j(o,i,s)}(function(t,e,r){e=0;n--){var o=r(n);if(o)return o.v}return t}(s.content,o),!1),t.someProp("transformPasted",(function(t){s=t(s)})),s}function ue(t,e,r){void 0===r&&(r=0);for(var n=e.length-1;n>=r;n--)t=e[n].create(null,O.c.from(t));return t}function pe(t,e,r,n,o,i){var s=e<0?t.firstChild:t.lastChild,a=s.content;return o=r&&(a=e<0?s.contentMatchAt(0).fillBefore(a,t.childCount>1||i<=o).append(a):a.append(s.contentMatchAt(s.childCount).fillBefore(O.c.empty,!0))),t.replaceChild(e<0?0:t.childCount-1,s.copy(a))}var he={thead:["table"],tbody:["table"],tfoot:["table"],caption:["table"],colgroup:["table"],col:["table","colgroup"],tr:["table","tbody"],td:["table","tbody","tr"],th:["table","tbody","tr"]},fe=null;function de(){return fe||(fe=document.implementation.createHTMLDocument("title"))}var me={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},ve=M.ie&&M.ie_version<=11,ge=function(){this.anchorNode=this.anchorOffset=this.focusNode=this.focusOffset=null};ge.prototype.set=function(t){this.anchorNode=t.anchorNode,this.anchorOffset=t.anchorOffset,this.focusNode=t.focusNode,this.focusOffset=t.focusOffset},ge.prototype.eq=function(t){return t.anchorNode==this.anchorNode&&t.anchorOffset==this.anchorOffset&&t.focusNode==this.focusNode&&t.focusOffset==this.focusOffset};var ye=function(t,e){var r=this;this.view=t,this.handleDOMChange=e,this.queue=[],this.flushingSoon=-1,this.observer=window.MutationObserver&&new window.MutationObserver((function(t){for(var e=0;et.target.nodeValue.length}))?r.flushSoon():r.flush()})),this.currentSelection=new ge,ve&&(this.onCharData=function(t){r.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),r.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.suppressingSelectionUpdates=!1};ye.prototype.flushSoon=function(){var t=this;this.flushingSoon<0&&(this.flushingSoon=window.setTimeout((function(){t.flushingSoon=-1,t.flush()}),20))},ye.prototype.forceFlush=function(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())},ye.prototype.start=function(){this.observer&&this.observer.observe(this.view.dom,me),ve&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()},ye.prototype.stop=function(){var t=this;if(this.observer){var e=this.observer.takeRecords();if(e.length){for(var r=0;r-1)){var t=this.observer?this.observer.takeRecords():[];this.queue.length&&(t=this.queue.concat(t),this.queue.length=0);var e=this.view.root.getSelection(),r=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(e)&&Ut(this.view)&&!this.ignoreSelectionChange(e),n=-1,o=-1,i=!1,s=[];if(this.view.editable)for(var a=0;a1){var l=s.filter((function(t){return"BR"==t.nodeName}));if(2==l.length){var u=l[0],p=l[1];u.parentNode&&u.parentNode.parentNode==p.parentNode?p.remove():u.remove()}}(n>-1||r)&&(n>-1&&(this.view.docView.markDirty(n,o),function(t){if(be)return;be=!0,"normal"==getComputedStyle(t.dom).whiteSpace&&console.warn("ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.")}(this.view)),this.handleDOMChange(n,o,i,s),this.view.docView.dirty?this.view.updateState(this.view.state):this.currentSelection.eq(e)||Ft(this.view),this.currentSelection.set(e))}},ye.prototype.registerMutation=function(t,e){if(e.indexOf(t.target)>-1)return null;var r=this.view.docView.nearestDesc(t.target);if("attributes"==t.type&&(r==this.view.docView||"contenteditable"==t.attributeName||"style"==t.attributeName&&!t.oldValue&&!t.target.getAttribute("style")))return null;if(!r||r.ignoreMutation(t))return null;if("childList"==t.type){var n=t.previousSibling,o=t.nextSibling;if(M.ie&&M.ie_version<=11&&t.addedNodes.length)for(var i=0;ii.depth?e(t,r,i.nodeAfter,i.before(n),o,!0):e(t,r,i.node(n),i.before(n),o,!1)})))return{v:!0}},a=i.depth+1;a>0;a--){var c=s(a);if(c)return c.v}return!1}function Oe(t,e,r){t.focused||t.focus();var n=t.state.tr.setSelection(e);"pointer"==r&&n.setMeta("pointer",!0),t.dispatch(n)}function Me(t,e,r,n,o){return Ae(t,"handleClickOn",e,r,n)||t.someProp("handleClick",(function(r){return r(t,e,n)}))||(o?function(t,e){if(-1==e)return!1;var r,n,o=t.state.selection;o instanceof l.c&&(r=o.node);for(var i=t.state.doc.resolve(e),s=i.depth+1;s>0;s--){var a=s>i.depth?i.nodeAfter:i.node(s);if(l.c.isSelectable(a)){n=r&&o.$from.depth>0&&s>=o.$from.depth&&i.before(o.$from.depth+1)==o.$from.pos?i.before(o.$from.depth):i.before(s);break}}return null!=n&&(Oe(t,l.c.create(t.state.doc,n),"pointer"),!0)}(t,r):function(t,e){if(-1==e)return!1;var r=t.state.doc.resolve(e),n=r.nodeAfter;return!!(n&&n.isAtom&&l.c.isSelectable(n))&&(Oe(t,new l.c(r),"pointer"),!0)}(t,r))}function De(t,e,r,n){return Ae(t,"handleDoubleClickOn",e,r,n)||t.someProp("handleDoubleClick",(function(r){return r(t,e,n)}))}function Ee(t,e,r,n){return Ae(t,"handleTripleClickOn",e,r,n)||t.someProp("handleTripleClick",(function(r){return r(t,e,n)}))||function(t,e){var r=t.state.doc;if(-1==e)return!!r.inlineContent&&(Oe(t,l.g.create(r,0,r.content.size),"pointer"),!0);for(var n=r.resolve(e),o=n.depth+1;o>0;o--){var i=o>n.depth?n.nodeAfter:n.node(o),s=n.before(o);if(i.inlineContent)Oe(t,l.g.create(r,s+1,s+1+i.content.size),"pointer");else{if(!l.c.isSelectable(i))continue;Oe(t,l.c.create(r,s),"pointer")}return!0}}(t,r)}function Te(t){return qe(t)}we.keydown=function(t,e){if(t.shiftKey=16==e.keyCode||e.shiftKey,!ze(t,e))if(t.domObserver.forceFlush(),t.lastKeyCode=e.keyCode,t.lastKeyCodeTime=Date.now(),!M.ios||13!=e.keyCode||e.ctrlKey||e.altKey||e.metaKey)t.someProp("handleKeyDown",(function(r){return r(t,e)}))||ne(t,e)?e.preventDefault():xe(t,"key");else{var r=Date.now();t.lastIOSEnter=r,t.lastIOSEnterFallbackTimeout=setTimeout((function(){t.lastIOSEnter==r&&(t.someProp("handleKeyDown",(function(e){return e(t,J(13,"Enter"))})),t.lastIOSEnter=0)}),200)}},we.keyup=function(t,e){16==e.keyCode&&(t.shiftKey=!1)},we.keypress=function(t,e){if(!(ze(t,e)||!e.charCode||e.ctrlKey&&!e.altKey||M.mac&&e.metaKey))if(t.someProp("handleKeyPress",(function(r){return r(t,e)})))e.preventDefault();else{var r=t.state.selection;if(!(r instanceof l.g&&r.$from.sameParent(r.$to))){var n=String.fromCharCode(e.charCode);t.someProp("handleTextInput",(function(e){return e(t,r.$from.pos,r.$to.pos,n)}))||t.dispatch(t.state.tr.insertText(n).scrollIntoView()),e.preventDefault()}}};var Ne=M.mac?"metaKey":"ctrlKey";ke.mousedown=function(t,e){t.shiftKey=e.shiftKey;var r=Te(t),n=Date.now(),o="singleClick";n-t.lastClick.time<500&&function(t,e){var r=e.x-t.clientX,n=e.y-t.clientY;return r*r+n*n<100}(e,t.lastClick)&&!e[Ne]&&("singleClick"==t.lastClick.type?o="doubleClick":"doubleClick"==t.lastClick.type&&(o="tripleClick")),t.lastClick={time:n,x:e.clientX,y:e.clientY,type:o};var i=t.posAtCoords(Se(e));i&&("singleClick"==o?t.mouseDown=new Ie(t,i,e,r):("doubleClick"==o?De:Ee)(t,i.pos,i.inside,e)?e.preventDefault():xe(t,"pointer"))};var Ie=function(t,e,r,n){var o,i,s=this;if(this.view=t,this.startDoc=t.state.doc,this.pos=e,this.event=r,this.flushed=n,this.selectNode=r[Ne],this.allowDefault=r.shiftKey,e.inside>-1)o=t.state.doc.nodeAt(e.inside),i=e.inside;else{var a=t.state.doc.resolve(e.pos);o=a.parent,i=a.depth?a.before():0}this.mightDrag=null;var c=n?null:r.target,u=c?t.docView.nearestDesc(c,!0):null;this.target=u?u.dom:null,(o.type.spec.draggable&&!1!==o.type.spec.selectable||t.state.selection instanceof l.c&&i==t.state.selection.from)&&(this.mightDrag={node:o,pos:i,addAttr:this.target&&!this.target.draggable,setUneditable:this.target&&M.gecko&&!this.target.hasAttribute("contentEditable")}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout((function(){return s.target.setAttribute("contentEditable","false")}),20),this.view.domObserver.start()),t.root.addEventListener("mouseup",this.up=this.up.bind(this)),t.root.addEventListener("mousemove",this.move=this.move.bind(this)),xe(t,"pointer")};function ze(t,e){return!!t.composing||!!(M.safari&&Math.abs(e.timeStamp-t.compositionEndedAt)<500)&&(t.compositionEndedAt=-2e8,!0)}Ie.prototype.done=function(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.view.mouseDown=null},Ie.prototype.up=function(t){if(this.done(),this.view.dom.contains(3==t.target.nodeType?t.target.parentNode:t.target)){var e=this.pos;this.view.state.doc!=this.startDoc&&(e=this.view.posAtCoords(Se(t))),this.allowDefault||!e?xe(this.view,"pointer"):Me(this.view,e.pos,e.inside,t,this.selectNode)?t.preventDefault():this.flushed||M.safari&&this.mightDrag&&!this.mightDrag.node.isAtom||M.chrome&&!(this.view.state.selection instanceof l.g)&&(e.pos==this.view.state.selection.from||e.pos==this.view.state.selection.to)?(Oe(this.view,l.f.near(this.view.state.doc.resolve(e.pos)),"pointer"),t.preventDefault()):xe(this.view,"pointer")}},Ie.prototype.move=function(t){!this.allowDefault&&(Math.abs(this.event.x-t.clientX)>4||Math.abs(this.event.y-t.clientY)>4)&&(this.allowDefault=!0),xe(this.view,"pointer")},ke.touchdown=function(t){Te(t),xe(t,"pointer")},ke.contextmenu=function(t){return Te(t)};var Re=M.android?5e3:-1;function Fe(t,e){clearTimeout(t.composingTimeout),e>-1&&(t.composingTimeout=setTimeout((function(){return qe(t)}),e))}function je(t){for(t.composing=!1;t.compositionNodes.length>0;)t.compositionNodes.pop().markParentsDirty()}function qe(t,e){if(t.domObserver.forceFlush(),je(t),e||t.docView.dirty){var r=Rt(t);return r&&!r.eq(t.state.selection)?t.dispatch(t.state.tr.setSelection(r)):t.updateState(t.state),!0}return!1}we.compositionstart=we.compositionupdate=function(t){if(!t.composing){t.domObserver.flush();var e=t.state,r=e.selection.$from;if(e.selection.empty&&(e.storedMarks||!r.textOffset&&r.parentOffset&&r.nodeBefore.marks.some((function(t){return!1===t.type.spec.inclusive}))))t.markCursor=t.state.storedMarks||r.marks(),qe(t,!0),t.markCursor=null;else if(qe(t),M.gecko&&e.selection.empty&&r.parentOffset&&!r.textOffset&&r.nodeBefore.marks.length)for(var n=t.root.getSelection(),o=n.focusNode,i=n.focusOffset;o&&1==o.nodeType&&0!=i;){var s=i<0?o.lastChild:o.childNodes[i-1];if(!s)break;if(3==s.nodeType){n.collapse(s,s.nodeValue.length);break}o=s,i=-1}t.composing=!0}Fe(t,Re)},we.compositionend=function(t,e){t.composing&&(t.composing=!1,t.compositionEndedAt=e.timeStamp,Fe(t,20))};var Be=M.ie&&M.ie_version<15||M.ios&&M.webkit_version<604;function Pe(t,e,r,n){var o=le(t,e,r,t.shiftKey,t.state.selection.$from);if(t.someProp("handlePaste",(function(e){return e(t,n,o||O.j.empty)})))return!0;if(!o)return!1;var i=function(t){return 0==t.openStart&&0==t.openEnd&&1==t.content.childCount?t.content.firstChild:null}(o),s=i?t.state.tr.replaceSelectionWith(i,t.shiftKey):t.state.tr.replaceSelection(o);return t.dispatch(s.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}ke.copy=we.cut=function(t,e){var r=t.state.selection,n="cut"==e.type;if(!r.empty){var o=Be?null:e.clipboardData,i=ce(t,r.content()),s=i.dom,a=i.text;o?(e.preventDefault(),o.clearData(),o.setData("text/html",s.innerHTML),o.setData("text/plain",a)):function(t,e){if(t.dom.parentNode){var r=t.dom.parentNode.appendChild(document.createElement("div"));r.appendChild(e),r.style.cssText="position: fixed; left: -10000px; top: 10px";var n=getSelection(),o=document.createRange();o.selectNodeContents(e),t.dom.blur(),n.removeAllRanges(),n.addRange(o),setTimeout((function(){r.parentNode&&r.parentNode.removeChild(r),t.focus()}),50)}}(t,s),n&&t.dispatch(t.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))}},we.paste=function(t,e){var r=Be?null:e.clipboardData;r&&Pe(t,r.getData("text/plain"),r.getData("text/html"),e)?e.preventDefault():function(t,e){if(t.dom.parentNode){var r=t.shiftKey||t.state.selection.$from.parent.type.spec.code,n=t.dom.parentNode.appendChild(document.createElement(r?"textarea":"div"));r||(n.contentEditable="true"),n.style.cssText="position: fixed; left: -10000px; top: 10px",n.focus(),setTimeout((function(){t.focus(),n.parentNode&&n.parentNode.removeChild(n),r?Pe(t,n.value,null,e):Pe(t,n.textContent,n.innerHTML,e)}),50)}}(t,e)};var $e=function(t,e){this.slice=t,this.move=e},Le=M.mac?"altKey":"ctrlKey";for(var Ve in ke.dragstart=function(t,e){var r=t.mouseDown;if(r&&r.done(),e.dataTransfer){var n=t.state.selection,o=n.empty?null:t.posAtCoords(Se(e));if(o&&o.pos>=n.from&&o.pos<=(n instanceof l.c?n.to-1:n.to));else if(r&&r.mightDrag)t.dispatch(t.state.tr.setSelection(l.c.create(t.state.doc,r.mightDrag.pos)));else if(e.target&&1==e.target.nodeType){var i=t.docView.nearestDesc(e.target,!0);if(!i||!i.node.type.spec.draggable||i==t.docView)return;t.dispatch(t.state.tr.setSelection(l.c.create(t.state.doc,i.posBefore)))}var s=t.state.selection.content(),a=ce(t,s),c=a.dom,u=a.text;e.dataTransfer.clearData(),e.dataTransfer.setData(Be?"Text":"text/html",c.innerHTML),Be||e.dataTransfer.setData("text/plain",u),t.dragging=new $e(s,!e[Le])}},ke.dragend=function(t){var e=t.dragging;window.setTimeout((function(){t.dragging==e&&(t.dragging=null)}),50)},we.dragover=we.dragenter=function(t,e){return e.preventDefault()},we.drop=function(t,e){var r=t.dragging;if(t.dragging=null,e.dataTransfer){var n=t.posAtCoords(Se(e));if(n){var o=t.state.doc.resolve(n.pos);if(o){var i=r&&r.slice||le(t,e.dataTransfer.getData(Be?"Text":"text/plain"),Be?null:e.dataTransfer.getData("text/html"),!1,o),s=r&&!e[Le];if(t.someProp("handleDrop",(function(r){return r(t,e,i||O.j.empty,s)})))e.preventDefault();else if(i){e.preventDefault();var a=i?Object(c.g)(t.state.doc,o.pos,i):o.pos;null==a&&(a=o.pos);var u=t.state.tr;s&&u.deleteSelection();var p=u.mapping.map(a),h=0==i.openStart&&0==i.openEnd&&1==i.content.childCount,f=u.doc;if(h?u.replaceRangeWith(p,p,i.content.firstChild):u.replaceRange(p,p,i),!u.doc.eq(f)){var d=u.doc.resolve(p);if(h&&l.c.isSelectable(i.content.firstChild)&&d.nodeAfter&&d.nodeAfter.sameMarkup(i.content.firstChild))u.setSelection(new l.c(d));else{var m=u.mapping.map(a);u.mapping.maps[u.mapping.maps.length-1].forEach((function(t,e,r,n){return m=n})),u.setSelection(Vt(t,d,u.doc.resolve(m)))}t.focus(),t.dispatch(u.setMeta("uiEvent","drop"))}}}}}},ke.focus=function(t){t.focused||(t.domObserver.stop(),t.dom.classList.add("ProseMirror-focused"),t.domObserver.start(),t.focused=!0,setTimeout((function(){t.docView&&t.hasFocus()&&!t.domObserver.currentSelection.eq(t.root.getSelection())&&Ft(t)}),20))},ke.blur=function(t){t.focused&&(t.domObserver.stop(),t.dom.classList.remove("ProseMirror-focused"),t.domObserver.start(),t.domObserver.currentSelection.set({}),t.focused=!1)},ke.beforeinput=function(t,e){if(M.chrome&&M.android&&"deleteContentBackward"==e.inputType){var r=t.domChangeCount;setTimeout((function(){if(t.domChangeCount==r&&(t.dom.blur(),t.focus(),!t.someProp("handleKeyDown",(function(e){return e(t,J(8,"Backspace"))})))){var e=t.state.selection.$cursor;e&&e.pos>0&&t.dispatch(t.state.tr.delete(e.pos-1,e.pos).scrollIntoView())}}),50)}},we)ke[Ve]=we[Ve];function Ue(t,e){if(t==e)return!0;for(var r in t)if(t[r]!==e[r])return!1;for(var n in e)if(!(n in t))return!1;return!0}var Je=function(t,e){this.spec=e||Ye,this.side=this.spec.side||0,this.toDOM=t};Je.prototype.map=function(t,e,r,n){var o=t.mapResult(e.from+n,this.side<0?-1:1),i=o.pos;return o.deleted?null:new He(i-r,i-r,this)},Je.prototype.valid=function(){return!0},Je.prototype.eq=function(t){return this==t||t instanceof Je&&(this.spec.key&&this.spec.key==t.spec.key||this.toDOM==t.toDOM&&Ue(this.spec,t.spec))};var We=function(t,e){this.spec=e||Ye,this.attrs=t};We.prototype.map=function(t,e,r,n){var o=t.map(e.from+n,this.spec.inclusiveStart?-1:1)-r,i=t.map(e.to+n,this.spec.inclusiveEnd?1:-1)-r;return o>=i?null:new He(o,i,this)},We.prototype.valid=function(t,e){return e.from=t&&(!o||o(s.spec))&&r.push(s.copy(s.from+n,s.to+n))}for(var a=0;at){var c=this.children[a]+1;this.children[a+2].findInner(t-c,e-c,r,n+c,o)}},Xe.prototype.map=function(t,e,r){return this==Qe||0==t.maps.length?this:this.mapInner(t,e,0,0,r||Ye)},Xe.prototype.mapInner=function(t,e,r,n,o){for(var i,s=0;sc+i||(e>=a[s]+i?a[s+1]=-1:r>=o&&(l=n-r-(e-t))&&(a[s]+=l,a[s+1]+=l))}},l=0;l=n.content.size){u=!0;continue}var d=r.map(t[p+1]+i,-1)-o,m=n.content.findIndex(f),v=m.index,g=m.offset,y=n.maybeChild(v);if(y&&g==f&&g+y.nodeSize==d){var b=a[p+2].mapInner(r,y,h+1,t[p]+i+1,s);b!=Qe?(a[p]=f,a[p+1]=d,a[p+2]=b):(a[p+1]=-2,u=!0)}else u=!0}if(u){var k=or(function(t,e,r,n,o,i,s){function a(t,e){for(var i=0;is&&l.to=t){this.children[o]==t&&(r=this.children[o+2]);break}for(var i=t+1,s=i+e.content.size,a=0;ai&&c.type instanceof We){var l=Math.max(i,c.from)-i,u=Math.min(s,c.to)-i;lr&&s.to0;)e++;t.splice(e,0,r)}function cr(t){var e=[];return t.someProp("decorations",(function(r){var n=r(t.state);n&&n!=Qe&&e.push(n)})),t.cursorWrapper&&e.push(Xe.create(t.state.doc,[t.cursorWrapper.deco])),tr.from(e)}tr.prototype.forChild=function(t,e){if(e.isLeaf)return Xe.empty;for(var r=[],n=0;nn.scrollToSelection?"to selection":"preserve",p=o||!this.docView.matchesNode(t.doc,c,a);!p&&t.selection.eq(n.selection)||(i=!0);var h,f,d,m,v,g,y,b,k,w,x,_="preserve"==u&&i&&null==this.dom.style.overflowAnchor&&function(t){for(var e,r,n=t.dom.getBoundingClientRect(),o=Math.max(0,n.top),i=(n.left+n.right)/2,s=o+1;s=o-20){e=a,r=c.top;break}}}return{refDOM:e,refTop:r,stack:Z(t.dom)}}(this);if(i){this.domObserver.stop();var C=p&&(M.ie||M.chrome)&&!this.composing&&!n.selection.empty&&!t.selection.empty&&(m=n.selection,v=t.selection,g=Math.min(m.$anchor.sharedDepth(m.head),v.$anchor.sharedDepth(v.head)),m.$anchor.start(g)!=v.$anchor.start(g));if(p){var S=M.chrome?this.trackWrites=this.root.getSelection().focusNode:null;!o&&this.docView.update(t.doc,c,a,this)||(this.docView.updateOuterDeco([]),this.docView.destroy(),this.docView=kt(t.doc,c,a,this.dom,this)),S&&!this.trackWrites&&(C=!0)}C||!(this.mouseDown&&this.domObserver.currentSelection.eq(this.root.getSelection())&&(h=this,f=h.docView.domFromPos(h.state.selection.anchor,0),d=h.root.getSelection(),q(f.node,f.offset,d.anchorNode,d.anchorOffset)))?Ft(this,C):($t(this,t.selection),this.domObserver.setCurSelection()),this.domObserver.start()}if(this.updatePluginViews(n),"reset"==u)this.dom.scrollTop=0;else if("to selection"==u){var A=this.root.getSelection().focusNode;this.someProp("handleScrollToSelection",(function(t){return t(r)}))||(t.selection instanceof l.c?G(this,this.docView.domAfterPos(t.selection.from).getBoundingClientRect(),A):G(this,this.coordsAtPos(t.selection.head,1),A))}else _&&(b=(y=_).refDOM,k=y.refTop,w=y.stack,x=b?b.getBoundingClientRect().top:0,Y(w,0==x?0:x-k))},lr.prototype.destroyPluginViews=function(){for(var t;t=this.pluginViews.pop();)t.destroy&&t.destroy()},lr.prototype.updatePluginViews=function(t){if(t&&t.plugins==this.state.plugins)for(var e=0;e=0;e--){var r=t.index(e);if(0!=r)for(var n=t.node(e).child(r-1);;n=n.lastChild){if(0==n.childCount&&!n.inlineContent||n.isAtom||n.type.spec.isolating)return!0;if(n.inlineContent)return!1}}return!0}(t)||!function(t){for(var e=t.depth;e>=0;e--){var r=t.indexAfter(e),n=t.node(e);if(r!=n.childCount)for(var o=n.child(r);;o=o.firstChild){if(0==o.childCount&&!o.inlineContent||o.isAtom||o.type.spec.isolating)return!0;if(o.inlineContent)return!1}}return!0}(t))return!1;var r=e.type.spec.allowGapCursor;if(null!=r)return r;var n=e.contentMatchAt(t.index()).defaultType;return n&&n.isTextblock},e.findFrom=function(t,r,n){t:for(;;){if(!n&&e.valid(t))return t;for(var o=t.pos,i=null,s=t.depth;;s--){var a=t.node(s);if(r>0?t.indexAfter(s)0){i=a.child(r>0?t.indexAfter(s):t.index(s)-1);break}if(0==s)return null;o+=r;var c=t.doc.resolve(o);if(e.valid(c))return c}for(;;){var u=r>0?i.firstChild:i.lastChild;if(!u){if(i.isAtom&&!i.isText&&!l.c.isSelectable(i)){t=t.doc.resolve(o+i.nodeSize*r),n=!1;continue t}break}i=u,o+=r;var p=t.doc.resolve(o);if(e.valid(p))return p}return null}},e}(l.f);vr.prototype.visible=!1,l.f.jsonID("gapcursor",vr);var gr=function(t){this.pos=t};gr.prototype.map=function(t){return new gr(t.map(this.pos))},gr.prototype.resolve=function(t){var e=t.resolve(this.pos);return vr.valid(e)?new vr(e):l.f.near(e)};var yr=Object(A.a)({ArrowLeft:br("horiz",-1),ArrowRight:br("horiz",1),ArrowUp:br("vert",-1),ArrowDown:br("vert",1)});function br(t,e){var r="vert"==t?e>0?"down":"up":e>0?"right":"left";return function(t,n,o){var i=t.selection,s=e>0?i.$to:i.$from,a=i.empty;if(i instanceof l.g){if(!o.endOfTextblock(r)||0==s.depth)return!1;a=!1,s=t.doc.resolve(e>0?s.after():s.before())}var c=vr.findFrom(s,e,a);return!!c&&(n&&n(t.tr.setSelection(new vr(c))),!0)}}function kr(t,e,r){if(!t.editable)return!1;var n=t.state.doc.resolve(e);if(!vr.valid(n))return!1;var o=t.posAtCoords({left:r.clientX,top:r.clientY}).inside;return!(o>-1&&l.c.isSelectable(t.state.doc.nodeAt(o)))&&(t.dispatch(t.state.tr.setSelection(new vr(n))),!0)}function wr(t){if(!(t.selection instanceof vr))return null;var e=document.createElement("div");return e.className="ProseMirror-gapcursor",Xe.create(t.doc,[He.widget(t.selection.head,e,{key:"gapcursor"})])}var xr=r(16),_r=r.n(xr);var Cr=/^data:((?:\w+\/(?:(?!;).)+)?)((?:;[\w\W]*?[^;])*),(.+)$/,Sr=new DOMParser;function Ar(t){return function(e,r,n,o,i,s){if(s&&n.type===t.nodes.spoiler&&"P"!==i.target.tagName)return n.attrs.open=!n.attrs.open,e.focus(),i.stopPropagation(),i.preventDefault(),!1}}var Or=r(5);function Mr(t){return Object(Or.f)(/^(\d+)(\.|\))\s$/,t,(function(t){return{order:+t[1]}}),(function(t,e){return e.childCount+e.attrs.order==+t[1]}))}function Dr(t){return Object(Or.f)(/^\s*([-+*])\s$/,t)}function Er(t){return Object(Or.d)(/^```$/,t)}function Tr(t,e){return Object(Or.d)(new RegExp("^(#{1,"+e+"})\\s$"),t,(function(t){return{level:t[1].length}}))}function Nr(t){return Object(Or.f)(/^\s*>!\s$/,t)}var Ir=r(26),zr=r(34),Rr=r(28),Fr=function(){function t(t,e){this.build(t,e)}var e=t.prototype;return e.build=function(t,e){var r=this;this.attrs=e,this.schema=(new Rr.a).build(),this.parser=new zr.a(this.schema).build(),this.serializer=new Ir.a(this.schema).build(),this.state=l.b.create(this.buildEditorStateConfig()),this.view=new lr(t,this.buildEditorProps()),(e.classNames||[]).forEach((function(t){return r.view.dom.classList.add(t)}));var n=function(e){r.attrs.inputListeners.forEach((function(e){e.call(t)})),e.redraw=!1};t.oninput=n,t.onclick=n,t.onkeyup=n},e.buildEditorStateConfig=function(){return{doc:this.parseInitialValue(this.attrs.value),disabled:this.attrs.disabled,schema:this.schema,plugins:this.buildPluginItems().toArray()}},e.buildPluginItems=function(){var t,e,r,o,i=new _r.a;return i.add("markdownInputrules",Object(Or.c)({rules:this.buildInputRules(this.schema)})),i.add("submit",Object(A.b)({"Mod-Enter":this.attrs.onsubmit})),i.add("escape",Object(A.b)({Escape:this.attrs.escape})),i.add("richTextKeymap",Object(A.b)(function(t){var e=function(e,r){return r(e.tr.replaceSelectionWith(t.nodes.hard_break.create()).scrollIntoView()),!0},r=[function(t,e){var r=$(".EmojiDropdown:visible"),n=$(".MentionsDropdown:visible");if(r[0]||n[0])return!0},Object(n.k)(t.nodes.list_item),function(t,e,r){var o=t.selection,i=o.$head,s=o.$anchor;if(!i.parent.type.spec.code||!i.sameParent(s))return!1;var a=t.selection.$from.nodeBefore,c=t.selection.$from.nodeAfter;return a&&"\n"!==a.text.slice(-1)||c?Object(n.f)(t,e):(r.dispatch(r.state.tr.delete(t.selection.from-1,t.selection.from)),r.dispatch(r.state.tr.setSelection(l.g.near(r.state.doc.resolve(r.state.selection.from)))),Object(n.c)(r.state,r.dispatch))}];app.session.user.preferences().richTextCompactParagraphs&&r.push((function(t,r,n){var o=t.selection,i=o.$head,s=o.$anchor;if("paragraph"!==i.parent.type.name||!i.sameParent(s))return!1;var a=t.selection.$from.nodeBefore,c=t.selection.$from.nodeAfter;if(a&&a.text&&"\n"!==a.text.slice(-1))return e(n.state,n.dispatch);!a||a.text||c||(n.dispatch(n.state.tr.delete(t.selection.from-1,t.selection.from)),n.dispatch(n.state.tr.setSelection(l.g.near(n.state.doc.resolve(n.state.selection.from)))))}));var o=n.b.apply(void 0,r);return{"Mod-z":C,"Mod-y":S,"Mod-Shift-z":S,Backspace:Or.e,"Mod-b":Object(n.n)(t.marks.strong),"Mod-i":Object(n.n)(t.marks.em),"Mod-`":Object(n.n)(t.marks.code),"Alt-Shift-5":Object(n.n)(t.marks.strike),"Mod-,":Object(n.n)(t.marks.sub),"Mod-.":Object(n.n)(t.marks.sup),"Mod-;":Object(n.n)(t.marks.spoiler_inline),"Shift-Mod-8":Object(n.m)(t.nodes.bullet_list),"Shift-Mod-9":Object(n.m)(t.nodes.ordered_list),"Mod-q":Object(n.q)(t.nodes.blockquote),"Shift-Ctrl-0":Object(n.i)(t.nodes.paragraph),"Shift-Ctrl-1":Object(n.i)(t.nodes.heading,{level:1}),"Shift-Ctrl-2":Object(n.i)(t.nodes.heading,{level:2}),"Shift-Ctrl-3":Object(n.i)(t.nodes.heading,{level:3}),"Shift-Ctrl-4":Object(n.i)(t.nodes.heading,{level:4}),"Shift-Ctrl-5":Object(n.i)(t.nodes.heading,{level:5}),"Shift-Ctrl-6":Object(n.i)(t.nodes.heading,{level:6}),"Shift-Ctrl-\\":Object(n.i)(t.nodes.code_block),"Mod-]":Object(n.j)(t.nodes.list_item),"Mod-m":Object(n.j)(t.nodes.list_item),"Mod-[":Object(n.d)(t.nodes.list_item),"Mod-Shift-m":Object(n.d)(t.nodes.list_item),Enter:o,"Shift-Enter":Object(n.b)(n.f,e)}}(this.schema))),i.add("baseKeymap",Object(A.b)(n.a)),i.add("placeholder",(t=this.attrs.placeholder,new l.d({props:{decorations:function(e){var r=[];if(1===e.doc.childCount){var n=e.doc.child(0);n.type.isBlock&&0===n.childCount&&n.type==e.schema.nodes.paragraph&&r.push(He.node(0,n.nodeSize,{class:"placeholder","data-before":t}))}return Xe.create(e.doc,r)}}}))),i.add("history",_()),i.add("disabled",new l.d({key:new l.e("disabled"),props:{editable:function(t){return!t.disabled$}},state:{init:function(t){return t.disabled},apply:function(t,e){var r=t.getMeta("disabled");return void 0!==r?r:e}}})),i.add("disableBase64Paste",new l.d({props:{transformPastedHTML:function(t){var e=Sr.parseFromString(t,"text/html");return e.querySelectorAll("img").forEach((function(t){Cr.test(t.src)&&t.remove()})),e.documentElement.outerHTML}}})),i.add("dropCursor",(void 0===e&&(e={}),new l.d({view:function(t){return new mr(t,e)}}))),i.add("gapCursor",new l.d({props:{decorations:wr,createSelectionBetween:function(t,e,r){if(e.pos==r.pos&&vr.valid(r))return new vr(r)},handleClick:kr,handleKeyDown:yr}})),i.add("menu",(r=this.attrs.menuState,new l.d({view:function(t){return r.attachEditorView(t),r}}))),i.add("toggleSpoiler",(o=this.schema,new l.d({props:{handleClickOn:Ar(o),handleDoubleClickOn:Ar(o)}}))),i},e.buildEditorProps=function(){var t=this;return{state:this.state,dispatchTransaction:function(e){var r=this.state.apply(e);this.updateState(r);var n=this.state.doc,o=t.serializeContent(n,t.schema);t.attrs.oninput(o)}}},e.buildInputRules=function(t){return function(t){var e;return[Or.b,(e=t.nodes.blockquote,Object(Or.f)(/^\s*>\s$/,e)),Mr(t.nodes.ordered_list),Dr(t.nodes.bullet_list),Er(t.nodes.code_block),Tr(t.nodes.heading,6),Nr(t.nodes.spoiler),Object(n.g)(/(?:___\s|\*\*\*\s|---)$/,t.nodes.horizontal_rule),Object(Or.d)(/^\s*\$\$\s$/,t.nodes.math_block),Object(n.e)(/(?:\*\*|__)([^\*_]+)(?:\*\*|__)$/,t.marks.strong),Object(n.e)(/(?:^|[^_])(_([^_]+)_)$/,t.marks.em),Object(n.e)(/(?:^|[^*])(\*([^*]+)\*)$/,t.marks.em),Object(n.e)(/(?:`)([^`]+)(?:`)$/,t.marks.code),Object(n.e)(/(?:~~)([^~]+)(?:~~)$/,t.marks.strike),Object(n.e)(/(?:[^~]~)([^~]+)(?:~)$/,t.marks.sub),Object(n.e)(/(?:\^)([^^]+)(?:\^)$/,t.marks.sup),Object(n.e)(/(?:\|\|)([^\|]+)(?:\|\|)$/,t.marks.spoiler_inline),Object(n.e)(/(?:>!)(.+)(?:!<)$/,t.marks.spoiler_inline),Object(n.e)(/(?:\$)([^$]+)(?:\$)$/,t.marks.math_inline)]}(t)},e.parseInitialValue=function(t){return this.parser.parse(t)},e.serializeContent=function(t){return this.serializer.serialize(t,{tightLists:!0})},e.moveCursorTo=function(t){this.setSelectionRange(t,t)},e.getSelectionRange=function(){return[this.view.state.selection.from,this.view.state.selection.to]},e.getLastNChars=function(t){var e=this.view.state.selection.$from.nodeBefore;return e&&e.text?e.text.slice(Math.max(0,e.text.length-t)):""},e.insertAtCursor=function(t,e){this.insertAt(this.getSelectionRange()[0],t,e),$(this.view.dom).trigger("click")},e.insertAt=function(t,e,r){this.insertBetween(t,t,e,r)},e.insertBetween=function(t,e,r,o){var i,s=this;void 0===o&&(o=!0),o?this.view.dispatch(this.view.state.tr.insertText(r,t,e)):(t-=1,this.view.dispatch(this.view.state.tr.replaceRangeWith(t,e,this.parseInitialValue(r))),i=r.match(/\s+$/)[0].split("\n").length-1),this.moveCursorTo(Math.min(t+r.length,l.f.atEnd(this.view.state.doc).to)),m.redraw(),r.endsWith(" ")&&!o&&this.insertAtCursor(" "),Array(i).fill(0).forEach((function(){n.a.Enter(s.view.state,s.view.dispatch)}))},e.replaceBeforeCursor=function(t,e,r){this.insertBetween(t,this.getSelectionRange()[0],e,r)},e.setSelectionRange=function(t,e){var r=this.view.state.tr.doc.resolve(t),n=this.view.state.tr.doc.resolve(e);this.view.dispatch(this.view.state.tr.setSelection(new l.g(r,n))),this.focus()},e.getCaretCoordinates=function(t){var e=this.view.coordsAtPos(t),r=this.view.dom.getBoundingClientRect();return{left:e.left-r.left,top:e.top-r.top}},e.focus=function(){this.view.focus()},e.destroy=function(){this.view.destroy()},e.disabled=function(t){this.view.dispatch(this.view.state.tr.setMeta("disabled",t))},t}()},function(t,e,r){"use strict";r.d(e,"a",(function(){return D}));var n=r(12),o=r(27),i=r.n(o),s=r(51),a=r.n(s),c=r(52),l=r.n(c),u=r(53),p=r.n(u),h=r(7);function f(t){switch(t){case 10:case 33:case 35:case 36:case 37:case 38:case 42:case 43:case 45:case 58:case 60:case 61:case 62:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}var d=function(t,e){for(var r=t.pos;r=4)return!1;if(62!==e.src.charCodeAt(O)||!t.followingCharRegex.test(e.src[O+1]))return!1;if(O+=t.markup.length,o)return!0;c=f=e.sCount[r]+O-(e.bMarks[r]+e.tShift[r]),32===e.src.charCodeAt(O)?(O++,c++,f++,i=!1,w=!0):9===e.src.charCodeAt(O)?(w=!0,(e.bsCount[r]+f)%4==3?(O++,c++,f++,i=!1):i=!0):w=!1;var D=!1,E=!1,T=O;if(">!"===t.markup)for(;O=M,b=[e.sCount[r]],e.sCount[r]=f-c,k=[e.tShift[r]],e.tShift[r]=O-e.bMarks[r],_=e.md.block.ruler.getRules("spoiler"),y=e.parentType,e.parentType="spoiler",S=!1,h=r+1;h=(M=e.eMarks[h])));h++)if(O+=t.markup.length,62!==e.src.charCodeAt(O-t.markup.length)||!t.followingCharRegex.test(e.src[O-t.markup.length+1])||S){if(u)break;for(x=!1,a=0,l=_.length;a=M,m.push(e.bsCount[h]),e.bsCount[h]=e.sCount[h]+1+(w?1:0),b.push(e.sCount[h]),e.sCount[h]=f-c,k.push(e.tShift[h]),e.tShift[h]=O-e.bMarks[h]}for(g=e.blkIndent,e.blkIndent=0,(C=e.push(t.name+"_open",t.name,1)).markup=t.markup,C.map=p=[r,0],e.md.block.tokenize(e,r,h),(C=e.push(t.name+"_close",t.name,-1)).markup=t.markup,e.lineMax=A,e.parentType=y,p[1]=e.line,a=0;a!",name:"spoiler"},t,e,r,n)}function b(t,e,r,n){return g({followingCharRegex:/[^!]/,markup:">",name:"blockquote"},t,e,r,n)}function k(t){t.block.ruler.__rules__.forEach((function(t){var e=t.alt.indexOf("blockquote");e>-1&&t.alt.splice(e,0,"spoiler")})),t.block.ruler.before("blockquote","spoiler",y,{alt:["paragraph","reference","spoiler","blockquote","list"]}),t.block.ruler.at("blockquote",b,{alt:["paragraph","reference","spoiler","blockquote","list"]})} + */function o(t){return e=>function(t,e){for(let r=t.depth;r>0;r-=1){const n=t.node(r);if(e(n))return{pos:r>0?t.before(r):0,start:t.start(r),depth:r,node:n}}}(e.$from,t)}function i(t){return function(e){if(function(t){return t instanceof n.c}(e)){const{node:r}=e,{$from:n}=e;if(function(t,e){return Array.isArray(t)&&t.indexOf(e.type)>-1||e.type===t}(t,r))return{node:r,pos:n.pos,depth:n.depth}}}}function s(t,e){const{from:r,to:n}=t.selection;let o=[];t.doc.nodesBetween(r,n,t=>{o=[...o,...t.marks]});const i=o.find(t=>t.type.name===e.name);return i?i.attrs:{}}function a(t=null,e=null){if(!t||!e)return!1;const r=t.parent.childAfter(t.parentOffset);if(!r.node)return!1;const n=r.node.marks.find(t=>t.type===e);if(!n)return!1;let o=t.index(),i=t.start()+r.offset,s=o+1,a=i+r.node.nodeSize;for(;o>0&&n.isInSet(t.parent.child(o-1).marks);)o-=1,i-=t.parent.child(o).nodeSize;for(;st.type===e)(t.selection);return Object.keys(r).length&&n?n.node.hasMarkup(e,{...n.node.attrs,...r}):!!n}},function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));var n=r(6),o=r(2),i=function(t){function e(){return t.apply(this,arguments)||this}return Object(n.a)(e,t),e.initAttrs=function(t){t.command=Object(o.n)(t.mark)},e.prototype.onEditorUpdate=function(){this.$().toggleClass("active",!!this.state.markActive(this.attrs.mark))},e}(r(10).a)},function(t,e,r){"use strict";r.d(e,"a",(function(){return y})),r.d(e,"b",(function(){return g}));for(var n={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",229:"q"},o={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"',229:"Q"},i="undefined"!=typeof navigator&&/Chrome\/(\d+)/.exec(navigator.userAgent),s="undefined"!=typeof navigator&&/Apple Computer/.test(navigator.vendor),a="undefined"!=typeof navigator&&/Gecko\/\d+/.test(navigator.userAgent),c="undefined"!=typeof navigator&&/Mac/.test(navigator.platform),l="undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),u=i&&(c||+i[1]<57)||a&&c,p=0;p<10;p++)n[48+p]=n[96+p]=String(p);for(p=1;p<=24;p++)n[p+111]="F"+p;for(p=65;p<=90;p++)n[p]=String.fromCharCode(p+32),o[p]=String.fromCharCode(p);for(var h in n)o.hasOwnProperty(h)||(o[h]=n[h]);var f=r(1),d="undefined"!=typeof navigator&&/Mac/.test(navigator.platform);function m(t){var e,r,n,o,i=t.split(/-(?!$)/),s=i[i.length-1];"Space"==s&&(s=" ");for(var a=0;a127)&&(i=n[r.keyCode])&&i!=a){var h=e[v(i,r,!0)];if(h&&h(t.state,t.dispatch,t))return!0}else if(c&&r.shiftKey){var f=e[v(a,r,!0)];if(f&&f(t.state,t.dispatch,t))return!0}return!1}}},function(t,e){t.exports=flarum.core.compat["common/utils/ItemList"]},function(t,e){t.exports=flarum.core.compat["common/utils/Stream"]},function(t,e){t.exports=flarum.core.compat["common/components/Button"]},function(t,e){t.exports=flarum.core.compat["common/helpers/icon"]},function(t,e){t.exports=flarum.core.compat["common/components/Dropdown"]},function(t,e,r){"use strict";r.d(e,"a",(function(){return i}));var n=r(6),o=r(54),i=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.className=function(){return"LoadingModal Modal--small"},r.title=function(){return this.attrs.title},r.oncreate=function(e){t.prototype.oncreate.call(this,e),this.$(".CommandButton").on("click",(function(){app.modal.close()}))},r.content=function(){var t=this.attrs.onsubmit?this.attrs.onsubmit.bind(this):function(){};return m("div",{className:"Modal-body"},m("form",{className:"Form",onsubmit:t},this.attrs.vnodeContent))},e}(r.n(o).a)},function(t,e,r){"use strict";r.d(e,"a",(function(){return v}));var n=r(6),o=r(18),i=r.n(o),s=r(20),a=r.n(s),c=r(9),l=r.n(c),u=r(19),p=r.n(u),h=r(16),f=r.n(h),d=r(21),v=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t),e.initAttrs=function(t){t.buttonClassName="Button Button--icon Button--link Button--menuDropdown"};var r=e.prototype;return r.oninit=function(e){t.prototype.oninit.call(this,e),this.state=this.attrs.state},r.oncreate=function(e){var r=this;t.prototype.oncreate.call(this,e),this.$().on("click",(function(t){$(".App").is(".mobile-safari")&&(app.modal.show(d.a,{title:r.attrs.tooltip,vnodeContent:r.fields().toArray(),onsubmit:r.onsubmit.bind(r)}),t.stopPropagation())})),this.$().on("shown.bs.dropdown",(function(){r.$(".Dropdown-menu").find("input, select, textarea").first().focus().select()}))},r.getButtonContent=function(t){return m(l.a,{text:this.attrs.tooltip},m("span",null,p()(this.attrs.icon)))},r.getMenu=function(t){return m("ul",{className:"Dropdown-menu dropdown-menu FormDropdown"},m("form",{className:"Form",onsubmit:this.onsubmit.bind(this)},this.fields().toArray()))},r.fields=function(){var t=new f.a;return t.add("insert",m(i.a,{type:"submit",className:"Button Button--primary"},app.translator.trans("askvortsov-rich-text.lib.composer.insert_button"))),t},r.onsubmit=function(t){app.modal.close(),t.preventDefault(),$("body").trigger("click"),this.insert(t),app.composer.editor.focus()},r.insert=function(t){},e}(a.a)},function(t,e){t.exports=flarum.core.compat["common/extend"]},function(t,e,r){"use strict";r.d(e,"a",(function(){return s}));var n=r(6),o=r(10),i=r(2),s=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.oninit=function(e){var r=this;e.attrs.command=function(t,n){return Object(i.m)(e.attrs.listType,r.active?t.schema.nodes.list_item:void 0)(t,n)},t.prototype.oninit.call(this,e)},r.onEditorUpdate=function(){this.active=!!this.state.nodeActive(this.attrs.listType),this.$().toggleClass("active",this.active)},e}(o.a)},function(t,e){t.exports=flarum.core.compat["common/components/TextEditor"]},function(t,e,r){"use strict";r.d(e,"a",(function(){return s}));var n=r(12),o=r(7);function i(t){return t.open instanceof Function||t.close instanceof Function?(error("markdown-serializer genMarkupAwareMarkSpec","Unable to extend mark config with open/close as functions",t),t):Object(n.a)({},t,{open:function(e,r){return r.attrs.markup||t.open},close:function(e,r){var n=r.attrs.markup;return(n=/^<[a-z]+>$/i.test(n)?n.replace(/^! ",null,e,(function(){return t.renderContent(e)}))},math_block:function(t,e){t.write("$$\n"),t.text(e.textContent,!1),t.ensureNewLine(),t.write("$$"),t.closeBlock(e)},paragraph:function(t,e){0===e.content.size?t.write("\n"):o.e.nodes.paragraph(t,e)},hard_break:function(t,e,r,n){for(var o=n+1;o!",close:"!<",mixable:!0,expelEnclosingWhitespace:!0}),strike:i({open:"~~",close:"~~",mixable:!0,expelEnclosingWhitespace:!0}),sub:i({open:"~",close:"~",mixable:!0,expelEnclosingWhitespace:!0}),sup:i({open:"^",close:"^",mixable:!0,expelEnclosingWhitespace:!0}),math_inline:Object(n.a)({},i({open:"$",close:"$",mixable:!1,expelEnclosingWhitespace:!0}),{escape:!1})})},e.build=function(){return new o.b(this.buildNodes(),this.buildMarks())},t}()},function(t,e,r){"use strict";t.exports=r(55)},function(t,e,r){"use strict";r.d(e,"a",(function(){return l}));var n=r(12),o=r(7),i=r(0);function s(){for(var t=arguments.length,e=new Array(t),r=0;r=e?o.empty:this.sliceInner(Math.max(0,t),Math.min(this.length,e))},o.prototype.get=function(t){if(!(t<0||t>=this.length))return this.getInner(t)},o.prototype.forEach=function(t,e,r){void 0===e&&(e=0),void 0===r&&(r=this.length),e<=r?this.forEachInner(t,e,r,0):this.forEachInvertedInner(t,e,r,0)},o.prototype.map=function(t,e,r){void 0===e&&(e=0),void 0===r&&(r=this.length);var n=[];return this.forEach((function(e,r){return n.push(t(e,r))}),e,r),n},o.from=function(t){return t instanceof o?t:t&&t.length?new i(t):o.empty};var i=function(t){function e(e){t.call(this),this.values=e}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={length:{configurable:!0},depth:{configurable:!0}};return e.prototype.flatten=function(){return this.values},e.prototype.sliceInner=function(t,r){return 0==t&&r==this.length?this:new e(this.values.slice(t,r))},e.prototype.getInner=function(t){return this.values[t]},e.prototype.forEachInner=function(t,e,r,n){for(var o=e;o=r;o--)if(!1===t(this.values[o],n+o))return!1},e.prototype.leafAppend=function(t){if(this.length+t.length<=200)return new e(this.values.concat(t.flatten()))},e.prototype.leafPrepend=function(t){if(this.length+t.length<=200)return new e(t.flatten().concat(this.values))},r.length.get=function(){return this.values.length},r.depth.get=function(){return 0},Object.defineProperties(e.prototype,r),e}(o);o.empty=new i([]);var s=function(t){function e(e,r){t.call(this),this.left=e,this.right=r,this.length=e.length+r.length,this.depth=Math.max(e.depth,r.depth)+1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},e.prototype.getInner=function(t){return to&&!1===this.right.forEachInner(t,Math.max(e-o,0),Math.min(this.length,r)-o,n+o))&&void 0)},e.prototype.forEachInvertedInner=function(t,e,r,n){var o=this.left.length;return!(e>o&&!1===this.right.forEachInvertedInner(t,e-o,Math.max(r,o)-o,n+o))&&(!(r=r?this.right.slice(t-r,e-r):this.left.slice(t,r).append(this.right.slice(0,e-r))},e.prototype.leafAppend=function(t){var r=this.right.leafAppend(t);if(r)return new e(this.left,r)},e.prototype.leafPrepend=function(t){var r=this.left.leafPrepend(t);if(r)return new e(r,this.right)},e.prototype.appendInner=function(t){return this.left.depth>=Math.max(this.right.depth,t.depth)+1?new e(this.left,new e(this.right,t)):new e(this,t)},e}(o),a=o,c=r(3),l=r(1),u=function(t,e){this.items=t,this.eventCount=e};u.prototype.popEvent=function(t,e){var r=this;if(0==this.eventCount)return null;for(var n,o,i=this.items.length;;i--){if(this.items.get(i-1).selection){--i;break}}e&&(n=this.remapping(i,this.items.length),o=n.maps.length);var s,a,c=t.tr,l=[],h=[];return this.items.forEach((function(t,e){if(!t.step)return n||(n=r.remapping(i,e+1),o=n.maps.length),o--,void h.push(t);if(n){h.push(new p(t.map));var f,d=t.step.map(n.slice(o));d&&c.maybeStep(d).doc&&(f=c.mapping.maps[c.mapping.maps.length-1],l.push(new p(f,null,null,l.length+h.length))),o--,f&&n.appendMap(f,o)}else c.maybeStep(t.step);return t.selection?(s=n?t.selection.map(n.slice(o)):t.selection,a=new u(r.items.slice(0,i).append(h.reverse().concat(l)),r.eventCount-1),!1):void 0}),this.items.length,0),{remaining:a,transform:c,selection:s}},u.prototype.addTransform=function(t,e,r,n){for(var o=[],i=this.eventCount,s=this.items,a=!n&&s.length?s.get(s.length-1):null,c=0;cf&&(v=y,(m=s).forEach((function(t,e){if(t.selection&&0==v--)return g=e,!1})),s=m.slice(g),i-=y),new u(s.append(o),i)},u.prototype.remapping=function(t,e){var r=new c.a;return this.items.forEach((function(e,n){var o=null!=e.mirrorOffset&&n-e.mirrorOffset>=t?r.maps.length-e.mirrorOffset:null;r.appendMap(e.map,o)}),t,e),r},u.prototype.addMaps=function(t){return 0==this.eventCount?this:new u(this.items.append(t.map((function(t){return new p(t)}))),this.eventCount)},u.prototype.rebased=function(t,e){if(!this.eventCount)return this;var r=[],n=Math.max(0,this.items.length-e),o=t.mapping,i=t.steps.length,s=this.eventCount;this.items.forEach((function(t){t.selection&&s--}),n);var a=e;this.items.forEach((function(e){var n=o.getMirror(--a);if(null!=n){i=Math.min(i,n);var c=o.maps[n];if(e.step){var l=t.steps[n].invert(t.docs[n]),u=e.selection&&e.selection.map(o.slice(a+1,n));u&&s++,r.push(new p(c,l,u))}else r.push(new p(c))}}),n);for(var c=[],l=e;l500&&(f=f.compress(this.items.length-r.length)),f},u.prototype.emptyItemCount=function(){var t=0;return this.items.forEach((function(e){e.step||t++})),t},u.prototype.compress=function(t){void 0===t&&(t=this.items.length);var e=this.remapping(0,t),r=e.maps.length,n=[],o=0;return this.items.forEach((function(i,s){if(s>=t)n.push(i),i.selection&&o++;else if(i.step){var a=i.step.map(e.slice(r)),c=a&&a.getMap();if(r--,c&&e.appendMap(c,r),a){var l=i.selection&&i.selection.map(e.slice(r));l&&o++;var u,h=new p(c.invert(),a,l),f=n.length-1;(u=n.length&&n[f].merge(h))?n[f]=u:n.push(h)}}else i.map&&r--}),this.items.length,0),new u(a.from(n.reverse()),o)},u.empty=new u(a.empty,0);var p=function(t,e,r,n){this.map=t,this.step=e,this.selection=r,this.mirrorOffset=n};p.prototype.merge=function(t){if(this.step&&t.step&&!t.selection){var e=t.step.merge(this.step);if(e)return new p(e.getMap().invert(),e,this.selection)}};var h=function(t,e,r,n){this.done=t,this.undone=e,this.prevRanges=r,this.prevTime=n},f=20;function d(t){var e=[];return t.forEach((function(t,r,n,o){return e.push(n,o)})),e}function v(t,e){if(!t)return null;for(var r=[],n=0;n=e[o]&&(r=!0)})),r}(r,t.prevRanges)),c=s?v(t.prevRanges,r.mapping):d(r.mapping.maps[r.steps.length-1]);return new h(t.done.addTransform(r,a?e.selection.getBookmark():null,n,k(e)),u.empty,c,r.time)}(r,n,e,t)}},config:t})}function C(t,e){var r=w.getState(t);return!(!r||0==r.done.eventCount)&&(e&&g(r,t,e,!1),!0)}function S(t,e){var r=w.getState(t);return!(!r||0==r.undone.eventCount)&&(e&&g(r,t,e,!0),!0)}var A=r(15),O=r(0),M={};if("undefined"!=typeof navigator&&"undefined"!=typeof document){var D=/Edge\/(\d+)/.exec(navigator.userAgent),E=/MSIE \d/.test(navigator.userAgent),T=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);M.mac=/Mac/.test(navigator.platform);var N=M.ie=!!(E||T||D);M.ie_version=E?document.documentMode||6:T?+T[1]:D?+D[1]:null,M.gecko=!N&&/gecko\/(\d+)/i.test(navigator.userAgent),M.gecko_version=M.gecko&&+(/Firefox\/(\d+)/.exec(navigator.userAgent)||[0,0])[1];var I=!N&&/Chrome\/(\d+)/.exec(navigator.userAgent);M.chrome=!!I,M.chrome_version=I&&+I[1],M.safari=!N&&/Apple Computer/.test(navigator.vendor),M.ios=M.safari&&(/Mobile\/\w+/.test(navigator.userAgent)||navigator.maxTouchPoints>2),M.android=/Android \d/.test(navigator.userAgent),M.webkit="webkitFontSmoothing"in document.documentElement.style,M.webkit_version=M.webkit&&+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]}var z=function(t){for(var e=0;;e++)if(!(t=t.previousSibling))return e},R=function(t){var e=t.parentNode;return e&&11==e.nodeType?e.host:e},F=null,j=function(t,e,r){var n=F||(F=document.createRange());return n.setEnd(t,null==r?t.nodeValue.length:r),n.setStart(t,e||0),n},q=function(t,e,r,n){return r&&(P(t,e,r,n,-1)||P(t,e,r,n,1))},B=/^(img|br|input|textarea|hr)$/i;function P(t,e,r,n,o){for(;;){if(t==r&&e==n)return!0;if(e==(o<0?0:L(t))){var i=t.parentNode;if(1!=i.nodeType||V(t)||B.test(t.nodeName)||"false"==t.contentEditable)return!1;e=z(t)+(o<0?0:1),t=i}else{if(1!=t.nodeType)return!1;if("false"==(t=t.childNodes[e+(o<0?-1:0)]).contentEditable)return!1;e=o<0?L(t):0}}}function L(t){return 3==t.nodeType?t.nodeValue.length:t.childNodes.length}function V(t){for(var e,r=t;r&&!(e=r.pmViewDesc);r=r.parentNode);return e&&e.node&&e.node.isBlock&&(e.dom==t||e.contentDOM==t)}var U=function(t){var e=t.isCollapsed;return e&&M.chrome&&t.rangeCount&&!t.getRangeAt(0).collapsed&&(e=!1),e};function J(t,e){var r=document.createEvent("Event");return r.initEvent("keydown",!0,!0),r.keyCode=t,r.key=r.code=e,r}function W(t){return{left:0,right:t.documentElement.clientWidth,top:0,bottom:t.documentElement.clientHeight}}function K(t,e){return"number"==typeof t?t:t[e]}function H(t){var e=t.getBoundingClientRect();return{left:e.left,right:e.left+t.clientWidth,top:e.top,bottom:e.top+t.clientHeight}}function G(t,e,r){for(var n=t.someProp("scrollThreshold")||0,o=t.someProp("scrollMargin")||5,i=t.dom.ownerDocument,s=r||t.dom;s;s=R(s))if(1==s.nodeType){var a=s==i.body||1!=s.nodeType,c=a?W(i):H(s),l=0,u=0;if(e.topc.bottom-K(n,"bottom")&&(u=e.bottom-c.bottom+K(o,"bottom")),e.leftc.right-K(n,"right")&&(l=e.right-c.right+K(o,"right")),l||u)if(a)i.defaultView.scrollBy(l,u);else{var p=s.scrollLeft,h=s.scrollTop;u&&(s.scrollTop+=u),l&&(s.scrollLeft+=l);var f=s.scrollLeft-p,d=s.scrollTop-h;e={left:e.left-f,top:e.top-d,right:e.right-f,bottom:e.bottom-d}}if(a)break}}function Z(t){for(var e=[],r=t.ownerDocument;t&&(e.push({dom:t,top:t.scrollTop,left:t.scrollLeft}),t!=r);t=R(t));return e}function Y(t,e){for(var r=0;r=a){s=Math.max(h.bottom,s),a=Math.min(h.top,a);var f=h.left>e.left?h.left-e.left:h.right=(h.left+h.right)/2?1:0));continue}}!r&&(e.left>=h.right&&e.top>=h.top||e.left>=h.left&&e.top>=h.bottom)&&(i=l+1)}}return r&&3==r.nodeType?function(t,e){for(var r=t.nodeValue.length,n=document.createRange(),o=0;o=(i.left+i.right)/2?1:0)}}return{node:t,offset:0}}(r,n):!r||o&&1==r.nodeType?{node:t,offset:i}:Q(r,n)}function tt(t,e){return t.left>=e.left-1&&t.left<=e.right+1&&t.top>=e.top-1&&t.top<=e.bottom+1}function et(t,e){var r,n,o,i,s=t.root;if(s.caretPositionFromPoint)try{var a=s.caretPositionFromPoint(e.left,e.top);a&&(o=(r=a).offsetNode,i=r.offset)}catch(t){}if(!o&&s.caretRangeFromPoint){var c=s.caretRangeFromPoint(e.left,e.top);c&&(o=(n=c).startContainer,i=n.startOffset)}var l,u=s.elementFromPoint(e.left,e.top+1);if(!u||!t.dom.contains(1!=u.nodeType?u.parentNode:u)){var p=t.dom.getBoundingClientRect();if(!tt(e,p))return null;if(!(u=function t(e,r,n){var o=e.childNodes.length;if(o&&n.tope.top&&i++}o==t.dom&&i==o.childNodes.length-1&&1==o.lastChild.nodeType&&e.top>o.lastChild.getBoundingClientRect().bottom?l=t.state.doc.content.size:0!=i&&1==o.nodeType&&"BR"==o.childNodes[i-1].nodeName||(l=function(t,e,r,n){for(var o=-1,i=e;i!=t.dom;){var s=t.docView.nearestDesc(i,!0);if(!s)return null;if(s.node.isBlock&&s.parent){var a=s.dom.getBoundingClientRect();if(a.left>n.left||a.top>n.top)o=s.posBefore;else{if(!(a.right-1?o:t.docView.posFromDOM(e,r)}(t,o,i,e))}null==l&&(l=function(t,e,r){var n=Q(e,r),o=n.node,i=n.offset,s=-1;if(1==o.nodeType&&!o.firstChild){var a=o.getBoundingClientRect();s=a.left!=a.right&&r.left>(a.left+a.right)/2?1:-1}return t.docView.posFromDOM(o,i,s)}(t,u,e));var d=t.docView.nearestDesc(u,!0);return{pos:l,inside:d?d.posAtStart-d.border:-1}}function rt(t,e){var r=t.getClientRects();return r.length?r[e<0?0:r.length-1]:t.getBoundingClientRect()}var nt=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;function ot(t,e,r){var n=t.docView.domFromPos(e,r<0?-1:1),o=n.node,i=n.offset,s=M.webkit||M.gecko;if(3==o.nodeType){if(!s||!nt.test(o.nodeValue)&&(r<0?i:i!=o.nodeValue.length)){var a=i,c=i,l=r<0?1:-1;return r<0&&!i?(c++,l=-1):r>=0&&i==o.nodeValue.length?(a--,l=1):r<0?a--:c++,it(rt(j(o,a,c),l),l<0)}var u=rt(j(o,i,i),r);if(M.gecko&&i&&/\s/.test(o.nodeValue[i-1])&&i=0)}if(i&&(r<0||i==L(o))){var m=o.childNodes[i-1],v=3==m.nodeType?j(m,L(m)-(s?0:1)):1!=m.nodeType||"BR"==m.nodeName&&m.nextSibling?null:m;if(v)return it(rt(v,1),!1)}if(i=0)}function it(t,e){if(0==t.width)return t;var r=e?t.left:t.right;return{top:t.top,bottom:t.bottom,left:r,right:r}}function st(t,e){if(0==t.height)return t;var r=e?t.top:t.bottom;return{top:r,bottom:r,left:t.left,right:t.right}}function at(t,e,r){var n=t.state,o=t.root.activeElement;n!=e&&t.updateState(e),o!=t.dom&&t.focus();try{return r()}finally{n!=e&&t.updateState(n),o!=t.dom&&o&&o.focus()}}var ct=/[\u0590-\u08ac]/;var lt=null,ut=null,pt=!1;function ht(t,e,r){return lt==e&&ut==r?pt:(lt=e,ut=r,pt="up"==r||"down"==r?function(t,e,r){var n=e.selection,o="up"==r?n.$from:n.$to;return at(t,e,(function(){for(var e=t.docView.domFromPos(o.pos,"up"==r?-1:1).node;;){var n=t.docView.nearestDesc(e,!0);if(!n)break;if(n.node.isBlock){e=n.dom;break}e=n.dom.parentNode}for(var i=ot(t,o.pos,1),s=e.firstChild;s;s=s.nextSibling){var a=void 0;if(1==s.nodeType)a=s.getClientRects();else{if(3!=s.nodeType)continue;a=j(s,0,s.nodeValue.length).getClientRects()}for(var c=0;cl.top&&("up"==r?l.bottomi.bottom-1))return!1}}return!0}))}(t,e,r):function(t,e,r){var n=e.selection.$head;if(!n.parent.isTextblock)return!1;var o=n.parentOffset,i=!o,s=o==n.parent.content.size,a=getSelection();return ct.test(n.parent.textContent)&&a.modify?at(t,e,(function(){var e=a.getRangeAt(0),o=a.focusNode,i=a.focusOffset,s=a.caretBidiLevel;a.modify("move",r,"character");var c=!(n.depth?t.docView.domAfterPos(n.before()):t.dom).contains(1==a.focusNode.nodeType?a.focusNode:a.focusNode.parentNode)||o==a.focusNode&&i==a.focusOffset;return a.removeAllRanges(),a.addRange(e),null!=s&&(a.caretBidiLevel=s),c})):"left"==r||"backward"==r?i:s}(t,e,r))}var ft=function(t,e,r,n){this.parent=t,this.children=e,this.dom=r,r.pmViewDesc=this,this.contentDOM=n,this.dirty=0},dt={beforePosition:{configurable:!0},size:{configurable:!0},border:{configurable:!0},posBefore:{configurable:!0},posAtStart:{configurable:!0},posAfter:{configurable:!0},posAtEnd:{configurable:!0},contentLost:{configurable:!0},domAtom:{configurable:!0}};ft.prototype.matchesWidget=function(){return!1},ft.prototype.matchesMark=function(){return!1},ft.prototype.matchesNode=function(){return!1},ft.prototype.matchesHack=function(){return!1},dt.beforePosition.get=function(){return!1},ft.prototype.parseRule=function(){return null},ft.prototype.stopEvent=function(){return!1},dt.size.get=function(){for(var t=0,e=0;e0:a)?this.posAtEnd:this.posAtStart},ft.prototype.nearestDesc=function(t,e){for(var r=!0,n=t;n;n=n.parentNode){var o=this.getDesc(n);if(o&&(!e||o.node)){if(!r||!o.nodeDOM||(1==o.nodeDOM.nodeType?o.nodeDOM.contains(1==t.nodeType?t:t.parentNode):o.nodeDOM==t))return o;r=!1}}},ft.prototype.getDesc=function(t){for(var e=t.pmViewDesc,r=e;r;r=r.parent)if(r==this)return e},ft.prototype.posFromDOM=function(t,e,r){for(var n=t;n;n=n.parentNode){var o=this.getDesc(n);if(o)return o.localPosFromDOM(t,e,r)}return-1},ft.prototype.descAt=function(t){for(var e=0,r=0;e=t:s>t))return i.domFromPos(t-r-i.border,e);r=s}},ft.prototype.parseRange=function(t,e,r){if(void 0===r&&(r=0),0==this.children.length)return{node:this.contentDOM,from:t,to:e,fromOffset:0,toOffset:this.contentDOM.childNodes.length};for(var n=-1,o=-1,i=r,s=0;;s++){var a=this.children[s],c=i+a.size;if(-1==n&&t<=c){var l=i+a.border;if(t>=l&&e<=c-a.border&&a.node&&a.contentDOM&&this.contentDOM.contains(a.contentDOM))return a.parseRange(t,e,l);t=i;for(var u=s;u>0;u--){var p=this.children[u-1];if(p.size&&p.dom.parentNode==this.contentDOM&&!p.emptyChildAt(1)){n=z(p.dom)+1;break}t-=p.size}-1==n&&(n=0)}if(n>-1&&(c>e||s==this.children.length-1)){e=c;for(var h=s+1;ha&&ie){var y=u;u=p,p=y}var b=document.createRange();b.setEnd(p.node,p.offset),b.setStart(u.node,u.offset),h.removeAllRanges(),h.addRange(b)}}},ft.prototype.ignoreMutation=function(t){return!this.contentDOM&&"selection"!=t.type},dt.contentLost.get=function(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)},ft.prototype.markDirty=function(t,e){for(var r=0,n=0;n=r:tr){var s=r+o.border,a=i-o.border;if(t>=s&&e<=a)return this.dirty=t==r||e==i?2:1,void(t!=s||e!=a||!o.contentLost&&o.dom.parentNode==this.contentDOM?o.markDirty(t-s,e-s):o.dirty=3);o.dirty=3}r=i}this.dirty=2},ft.prototype.markParentsDirty=function(){for(var t=1,e=this.parent;e;e=e.parent,t++){var r=1==t?2:1;e.dirty0&&(i=zt(i,0,t,n));for(var a=0;ai;)l.push(o[c++]);var y=i+m.nodeSize;if(m.isText){var b=y;c=0&&!a&&s.syncToMarks(i==r.node.childCount?O.d.none:r.node.child(i).marks,n,t),s.placeWidget(e,t,o)}),(function(e,r,i,a){s.syncToMarks(e.marks,n,t),s.findNodeMatch(e,r,i,a)||s.updateNextNode(e,r,i,t,a)||s.addNode(e,r,i,t,o),o+=e.nodeSize})),s.syncToMarks(mt,n,t),this.node.isTextblock&&s.addTextblockHacks(),s.destroyRest(),(s.changed||2==this.dirty)&&(i&&this.protectLocalComposition(t,i),function t(e,r,n){for(var o=e.firstChild,i=!1,s=0;se+this.node.content.size)){var i=t.root.getSelection(),s=function(t,e){for(;;){if(3==t.nodeType)return t;if(1==t.nodeType&&e>0){if(t.childNodes.length>e&&3==t.childNodes[e].nodeType)return t.childNodes[e];t=t.childNodes[e-1],e=L(t)}else{if(!(1==t.nodeType&&e=r){var u=c.lastIndexOf(e,n-a);if(u>=0&&u+e.length+a>=r)return a+u}}}return-1}(this.node.content,a,n-e,o-e);return c<0?null:{node:s,pos:c,text:a}}}},e.prototype.protectLocalComposition=function(t,e){var r=e.node,n=e.pos,o=e.text;if(!this.getDesc(r)){for(var i=r;i.parentNode!=this.contentDOM;i=i.parentNode){for(;i.previousSibling;)i.parentNode.removeChild(i.previousSibling);for(;i.nextSibling;)i.parentNode.removeChild(i.nextSibling);i.pmViewDesc&&(i.pmViewDesc=null)}var s=new gt(this,i,r,o);t.compositionNodes.push(s),this.children=zt(this.children,n,n+o.length,t,s)}},e.prototype.update=function(t,e,r,n){return!(3==this.dirty||!t.sameMarkup(this.node))&&(this.updateInner(t,e,r,n),!0)},e.prototype.updateInner=function(t,e,r,n){this.updateOuterDeco(e),this.node=t,this.innerDeco=r,this.contentDOM&&this.updateChildren(n,this.posAtStart),this.dirty=0},e.prototype.updateOuterDeco=function(t){if(!Et(t,this.outerDeco)){var e=1!=this.nodeDOM.nodeType,r=this.dom;this.dom=Ot(this.dom,this.nodeDOM,At(this.outerDeco,this.node,e),At(t,this.node,e)),this.dom!=r&&(r.pmViewDesc=null,this.dom.pmViewDesc=this),this.outerDeco=t}},e.prototype.selectNode=function(){this.nodeDOM.classList.add("ProseMirror-selectednode"),!this.contentDOM&&this.node.type.spec.draggable||(this.dom.draggable=!0)},e.prototype.deselectNode=function(){this.nodeDOM.classList.remove("ProseMirror-selectednode"),!this.contentDOM&&this.node.type.spec.draggable||this.dom.removeAttribute("draggable")},r.domAtom.get=function(){return this.node.isAtom},Object.defineProperties(e.prototype,r),e}(ft);function kt(t,e,r,n,o){return Dt(n,e,t),new bt(null,t,e,r,n,n,n,o,0)}var wt=function(t){function e(e,r,n,o,i,s,a){t.call(this,e,r,n,o,i,null,s,a)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={domAtom:{configurable:!0}};return e.prototype.parseRule=function(){for(var t=this.nodeDOM.parentNode;t&&t!=this.dom&&!t.pmIsDeco;)t=t.parentNode;return{skip:t||!0}},e.prototype.update=function(t,e,r,n){return!(3==this.dirty||0!=this.dirty&&!this.inParent()||!t.sameMarkup(this.node))&&(this.updateOuterDeco(e),0==this.dirty&&t.text==this.node.text||t.text==this.nodeDOM.nodeValue||(this.nodeDOM.nodeValue=t.text,n.trackWrites==this.nodeDOM&&(n.trackWrites=null)),this.node=t,this.dirty=0,!0)},e.prototype.inParent=function(){for(var t=this.parent.contentDOM,e=this.nodeDOM;e;e=e.parentNode)if(e==t)return!0;return!1},e.prototype.domFromPos=function(t){return{node:this.nodeDOM,offset:t}},e.prototype.localPosFromDOM=function(e,r,n){return e==this.nodeDOM?this.posAtStart+Math.min(r,this.node.text.length):t.prototype.localPosFromDOM.call(this,e,r,n)},e.prototype.ignoreMutation=function(t){return"characterData"!=t.type&&"selection"!=t.type},e.prototype.slice=function(t,r,n){var o=this.node.cut(t,r),i=document.createTextNode(o.text);return new e(this.parent,o,this.outerDeco,this.innerDeco,i,i,n)},r.domAtom.get=function(){return!1},Object.defineProperties(e.prototype,r),e}(bt),xt=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={domAtom:{configurable:!0}};return e.prototype.parseRule=function(){return{ignore:!0}},e.prototype.matchesHack=function(){return 0==this.dirty},r.domAtom.get=function(){return!0},Object.defineProperties(e.prototype,r),e}(ft),_t=function(t){function e(e,r,n,o,i,s,a,c,l,u){t.call(this,e,r,n,o,i,s,a,l,u),this.spec=c}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.update=function(e,r,n,o){if(3==this.dirty)return!1;if(this.spec.update){var i=this.spec.update(e,r);return i&&this.updateInner(e,r,n,o),i}return!(!this.contentDOM&&!e.isLeaf)&&t.prototype.update.call(this,e,r,n,o)},e.prototype.selectNode=function(){this.spec.selectNode?this.spec.selectNode():t.prototype.selectNode.call(this)},e.prototype.deselectNode=function(){this.spec.deselectNode?this.spec.deselectNode():t.prototype.deselectNode.call(this)},e.prototype.setSelection=function(e,r,n,o){this.spec.setSelection?this.spec.setSelection(e,r,n):t.prototype.setSelection.call(this,e,r,n,o)},e.prototype.destroy=function(){this.spec.destroy&&this.spec.destroy(),t.prototype.destroy.call(this)},e.prototype.stopEvent=function(t){return!!this.spec.stopEvent&&this.spec.stopEvent(t)},e.prototype.ignoreMutation=function(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):t.prototype.ignoreMutation.call(this,e)},e}(bt);function Ct(t){t&&(this.nodeName=t)}Ct.prototype=Object.create(null);var St=[new Ct];function At(t,e,r){if(0==t.length)return St;for(var n=r?St[0]:new Ct,o=[n],i=0;i0&&o>=0;o--){var i=e[o],s=i.node;if(s){if(s!=t.child(n-1))break;r.push(i),--n}}return{nodes:r.reverse(),offset:n}}(t.node.content,t.children);this.preMatched=r.nodes,this.preMatchOffset=r.offset};function It(t,e){return t.type.side-e.type.side}function zt(t,e,r,n,o){for(var i=[],s=0,a=0;s=r||u<=e?i.push(c):(lr&&i.push(c.slice(r-l,c.size,n)))}return i}function Rt(t,e){var r=t.root.getSelection(),n=t.state.doc;if(!r.focusNode)return null;var o=t.docView.nearestDesc(r.focusNode),i=o&&0==o.size,s=t.docView.posFromDOM(r.focusNode,r.focusOffset);if(s<0)return null;var a,c,u=n.resolve(s);if(U(r)){for(a=u;o&&!o.node;)o=o.parent;if(o&&o.node.isAtom&&l.c.isSelectable(o.node)&&o.parent&&(!o.node.isInline||!function(t,e,r){for(var n=0==e,o=e==L(t);n||o;){if(t==r)return!0;var i=z(t);if(!(t=t.parentNode))return!1;n=n&&0==i,o=o&&i==L(t)}}(r.focusNode,r.focusOffset,o.dom))){var p=o.posBefore;c=new l.c(s==p?u:n.resolve(p))}}else{var h=t.docView.posFromDOM(r.anchorNode,r.anchorOffset);if(h<0)return null;a=n.resolve(h)}c||(c=Vt(t,a,u,"pointer"==e||t.state.selection.head=this.preMatchOffset?this.preMatched[t-this.preMatchOffset]:null},Nt.prototype.destroyBetween=function(t,e){if(t!=e){for(var r=t;r>1,i=Math.min(o,t.length);n-1)s>this.index&&(this.changed=!0,this.destroyBetween(this.index,s)),this.top=this.top.children[this.index];else{var c=yt.create(this.top,t[o],e,r);this.top.children.splice(this.index,0,c),this.top=c,this.changed=!0}this.index=0,o++}},Nt.prototype.findNodeMatch=function(t,e,r,n){var o=-1,i=n<0?void 0:this.getPreMatch(n),s=this.top.children;if(i&&i.matchesNode(t,e,r))o=s.indexOf(i);else for(var a=this.index,c=Math.min(s.length,a+5);a-1&&a+this.preMatchOffset!=o)return!1;var c=s.dom;if(!(this.lock&&(c==this.lock||1==c.nodeType&&c.contains(this.lock.parentNode))&&!(t.isText&&s.node&&s.node.isText&&s.nodeDOM.nodeValue==t.text&&3!=s.dirty&&Et(e,s.outerDeco)))&&s.update(t,e,r,n))return this.destroyBetween(this.index,i),s.dom!=c&&(this.changed=!0),this.index++,!0;break}}return!1},Nt.prototype.addNode=function(t,e,r,n,o){this.top.children.splice(this.index++,0,bt.create(this.top,t,e,r,n,o)),this.changed=!0},Nt.prototype.placeWidget=function(t,e,r){var n=this.index0?n.max(o):n.min(o),s=i.parent.inlineContent?i.depth?t.doc.resolve(e>0?i.after():i.before()):null:i;return s&&l.f.findFrom(s,e)}function Wt(t,e){return t.dispatch(t.state.tr.setSelection(e).scrollIntoView()),!0}function Kt(t,e,r){var n=t.state.selection;if(!(n instanceof l.g)){if(n instanceof l.c&&n.node.isInline)return Wt(t,new l.g(e>0?n.$to:n.$from));var o=Jt(t.state,e);return!!o&&Wt(t,o)}if(!n.empty||r.indexOf("s")>-1)return!1;if(t.endOfTextblock(e>0?"right":"left")){var i=Jt(t.state,e);return!!(i&&i instanceof l.c)&&Wt(t,i)}if(!(M.mac&&r.indexOf("m")>-1)){var s,a=n.$head,c=a.textOffset?null:e<0?a.nodeBefore:a.nodeAfter;if(!c||c.isText)return!1;var u=e<0?a.pos-c.nodeSize:a.pos;return!!(c.isAtom||(s=t.docView.descAt(u))&&!s.contentDOM)&&(l.c.isSelectable(c)?Wt(t,new l.c(e<0?t.state.doc.resolve(a.pos-c.nodeSize):a)):!!M.webkit&&Wt(t,new l.g(t.state.doc.resolve(e<0?u:u+c.nodeSize))))}}function Ht(t){return 3==t.nodeType?t.nodeValue.length:t.childNodes.length}function Gt(t){var e=t.pmViewDesc;return e&&0==e.size&&(t.nextSibling||"BR"!=t.nodeName)}function Zt(t){var e=t.root.getSelection(),r=e.focusNode,n=e.focusOffset;if(r){var o,i,s=!1;for(M.gecko&&1==r.nodeType&&n0){if(1!=r.nodeType)break;var a=r.childNodes[n-1];if(Gt(a))o=r,i=--n;else{if(3!=a.nodeType)break;n=(r=a).nodeValue.length}}else{if(Xt(r))break;for(var c=r.previousSibling;c&&Gt(c);)o=r.parentNode,i=z(c),c=c.previousSibling;if(c)n=Ht(r=c);else{if((r=r.parentNode)==t.dom)break;n=0}}s?Qt(t,e,r,n):o&&Qt(t,e,o,i)}}function Yt(t){var e=t.root.getSelection(),r=e.focusNode,n=e.focusOffset;if(r){for(var o,i,s=Ht(r);;)if(n-1)return!1;if(M.mac&&r.indexOf("m")>-1)return!1;var o=n.$from,i=n.$to;if(!o.parent.inlineContent||t.endOfTextblock(e<0?"up":"down")){var s=Jt(t.state,e);if(s&&s instanceof l.c)return Wt(t,s)}if(!o.parent.inlineContent){var a=l.f.findFrom(e<0?o:i,e);return!a||Wt(t,a)}return!1}function ee(t,e){if(!(t.state.selection instanceof l.g))return!0;var r=t.state.selection,n=r.$head,o=r.$anchor,i=r.empty;if(!n.sameParent(o))return!0;if(!i)return!1;if(t.endOfTextblock(e>0?"forward":"backward"))return!0;var s=!n.textOffset&&(e<0?n.nodeBefore:n.nodeAfter);if(s&&!s.isText){var a=t.state.tr;return e<0?a.delete(n.pos-s.nodeSize,n.pos):a.delete(n.pos,n.pos+s.nodeSize),t.dispatch(a),!0}return!1}function re(t,e,r){t.domObserver.stop(),e.contentEditable=r,t.domObserver.start()}function ne(t,e){var r=e.keyCode,n=function(t){var e="";return t.ctrlKey&&(e+="c"),t.metaKey&&(e+="m"),t.altKey&&(e+="a"),t.shiftKey&&(e+="s"),e}(e);return 8==r||M.mac&&72==r&&"c"==n?ee(t,-1)||Zt(t):46==r||M.mac&&68==r&&"c"==n?ee(t,1)||Yt(t):13==r||27==r||(37==r?Kt(t,-1,n)||Zt(t):39==r?Kt(t,1,n)||Yt(t):38==r?te(t,-1,n)||Zt(t):40==r?function(t){if(M.safari&&!(t.state.selection.$head.parentOffset>0)){var e=t.root.getSelection(),r=e.focusNode,n=e.focusOffset;if(r&&1==r.nodeType&&0==n&&r.firstChild&&"false"==r.firstChild.contentEditable){var o=r.firstChild;re(t,o,!0),setTimeout((function(){return re(t,o,!1)}),20)}}}(t)||te(t,1,n)||Yt(t):n==(M.mac?"m":"c")&&(66==r||73==r||89==r||90==r))}function oe(t){var e=t.pmViewDesc;if(e)return e.parseRule();if("BR"==t.nodeName&&t.parentNode){if(M.safari&&/^(ul|ol)$/i.test(t.parentNode.nodeName)){var r=document.createElement("div");return r.appendChild(document.createElement("li")),{skip:r}}if(t.parentNode.lastChild==t||M.safari&&/^(tr|table)$/i.test(t.parentNode.nodeName))return{ignore:!0}}else if("IMG"==t.nodeName&&t.getAttribute("mark-placeholder"))return{ignore:!0}}function ie(t,e,r,n,o){if(e<0){var i=t.lastSelectionTime>Date.now()-50?t.lastSelectionOrigin:null,s=Rt(t,i);if(s&&!t.state.selection.eq(s)){var a=t.state.tr.setSelection(s);"pointer"==i?a.setMeta("pointer",!0):"key"==i&&a.scrollIntoView(),t.dispatch(a)}}else{var c=t.state.doc.resolve(e),u=c.sharedDepth(r);e=c.before(u+1),r=t.state.doc.resolve(r).after(u+1);var p=t.state.selection,h=function(t,e,r){var n=t.docView.parseRange(e,r),o=n.node,i=n.fromOffset,s=n.toOffset,a=n.from,c=n.to,l=t.root.getSelection(),u=null,p=l.anchorNode;if(p&&t.dom.contains(1==p.nodeType?p:p.parentNode)&&(u=[{node:p,offset:l.anchorOffset}],U(l)||u.push({node:l.focusNode,offset:l.focusOffset})),M.chrome&&8===t.lastKeyCode)for(var h=s;h>i;h--){var f=o.childNodes[h-1],d=f.pmViewDesc;if("BR"==f.nodeType&&!d){s=h;break}if(!d||d.size)break}var m=t.state.doc,v=t.someProp("domParser")||O.a.fromSchema(t.state.schema),g=m.resolve(a),y=null,b=v.parse(o,{topNode:g.parent,topMatch:g.parent.contentMatchAt(g.index()),topOpen:!0,from:i,to:s,preserveWhitespace:!g.parent.type.spec.code||"full",editableContent:!0,findPositions:u,ruleFromNode:oe,context:g});if(u&&null!=u[0].pos){var k=u[0].pos,w=u[1]&&u[1].pos;null==w&&(w=k),y={anchor:k+a,head:w+a}}return{doc:b,sel:y,from:a,to:c}}(t,e,r);if(M.chrome&&t.cursorWrapper&&h.sel&&h.sel.anchor==t.cursorWrapper.deco.from){var f=t.cursorWrapper.deco.type.toDOM.nextSibling,d=f&&f.nodeValue?f.nodeValue.length:1;h.sel={anchor:h.sel.anchor+d,head:h.sel.anchor+d}}var m,v,g=t.state.doc,y=g.slice(h.from,h.to);8===t.lastKeyCode&&Date.now()-100=a?i-n:0)+(c-a),a=i}else if(c=c?i-n:0)+(a-c),c=i}return{start:i,endA:a,endB:c}}(y.content,h.doc.content,h.from,m,v);if(!b){if(!(n&&p instanceof l.g&&!p.empty&&p.$head.sameParent(p.$anchor))||t.composing||h.sel&&h.sel.anchor!=h.sel.head){if(M.ios&&t.lastIOSEnter>Date.now()-225&&o.some((function(t){return"DIV"==t.nodeName||"P"==t.nodeName}))&&t.someProp("handleKeyDown",(function(e){return e(t,J(13,"Enter"))})))return void(t.lastIOSEnter=0);if(h.sel){var k=se(t,t.state.doc,h.sel);k&&!k.eq(t.state.selection)&&t.dispatch(t.state.tr.setSelection(k))}return}b={start:p.from,endA:p.to,endB:p.to}}t.domChangeCount++,t.state.selection.fromt.state.selection.from&&b.start<=t.state.selection.from+2?b.start=t.state.selection.from:b.endA=t.state.selection.to-2&&(b.endB+=t.state.selection.to-b.endA,b.endA=t.state.selection.to)),M.ie&&M.ie_version<=11&&b.endB==b.start+1&&b.endA==b.start&&b.start>h.from&&"  "==h.doc.textBetween(b.start-h.from-1,b.start-h.from+1)&&(b.start--,b.endA--,b.endB--);var w,x=h.doc.resolveNoCache(b.start-h.from),_=h.doc.resolveNoCache(b.endB-h.from),C=x.sameParent(_)&&x.parent.inlineContent;if((M.ios&&t.lastIOSEnter>Date.now()-225&&(!C||o.some((function(t){return"DIV"==t.nodeName||"P"==t.nodeName})))||!C&&x.posb.start&&function(t,e,r,n,o){if(!n.parent.isTextblock||r-e<=o.pos-n.pos||ae(n,!0,!1)r||ae(s,!0,!1)e.content.size?null:Vt(t,e.resolve(r.anchor),e.resolve(r.head))}function ae(t,e,r){for(var n=t.depth,o=e?t.end():t.pos;n>0&&(e||t.indexAfter(n)==t.node(n).childCount);)n--,o++,e=!1;if(r)for(var i=t.node(n).maybeChild(t.indexAfter(n));i&&!i.isLeaf;)i=i.firstChild,o++;return o}function ce(t,e){for(var r=[],n=e.content,o=e.openStart,i=e.openEnd;o>1&&i>1&&1==n.childCount&&1==n.firstChild.childCount;){o--,i--;var s=n.firstChild;r.push(s.type.name,s.attrs!=s.type.defaultAttrs?s.attrs:null),n=s.content}var a=t.someProp("clipboardSerializer")||O.b.fromSchema(t.state.schema),c=de(),l=c.createElement("div");l.appendChild(a.serializeFragment(n,{document:c}));for(var u,p=l.firstChild;p&&1==p.nodeType&&(u=he[p.nodeName.toLowerCase()]);){for(var h=u.length-1;h>=0;h--){for(var f=c.createElement(u[h]);l.firstChild;)f.appendChild(l.firstChild);l.appendChild(f)}p=l.firstChild}return p&&1==p.nodeType&&p.setAttribute("data-pm-slice",o+" "+i+" "+JSON.stringify(r)),{dom:l,text:t.someProp("clipboardTextSerializer",(function(t){return t(e)}))||e.content.textBetween(0,e.content.size,"\n\n")}}function le(t,e,r,n,o){var i,s,a=o.parent.type.spec.code;if(!r&&!e)return null;var c=e&&(n||a||!r);if(c){if(t.someProp("transformPastedText",(function(t){e=t(e,a||n)})),a)return new O.j(O.c.from(t.state.schema.text(e)),0,0);var l=t.someProp("clipboardTextParser",(function(t){return t(e,o,n)}));l?s=l:(i=document.createElement("div"),e.trim().split(/(?:\r\n?|\n)+/).forEach((function(t){i.appendChild(document.createElement("p")).textContent=t})))}else t.someProp("transformPastedHTML",(function(t){r=t(r)})),i=function(t){var e=/(\s*]*>)*/.exec(t);e&&(t=t.slice(e[0].length));var r,n=de().createElement("div"),o=/(?:]*>)*<([a-z][^>\s]+)/i.exec(t),i=0;(r=o&&he[o[1].toLowerCase()])&&(t=r.map((function(t){return"<"+t+">"})).join("")+t+r.map((function(t){return""})).reverse().join(""),i=r.length);n.innerHTML=t;for(var s=0;s=0;a-=2){var c=n.nodes[r[a]];if(!c||c.hasRequiredAttrs())break;o=O.c.from(c.create(r[a+1],o)),i++,s++}return new O.j(o,i,s)}(function(t,e,r){e=0;n--){var o=r(n);if(o)return o.v}return t}(s.content,o),!1),t.someProp("transformPasted",(function(t){s=t(s)})),s}function ue(t,e,r){void 0===r&&(r=0);for(var n=e.length-1;n>=r;n--)t=e[n].create(null,O.c.from(t));return t}function pe(t,e,r,n,o,i){var s=e<0?t.firstChild:t.lastChild,a=s.content;return o=r&&(a=e<0?s.contentMatchAt(0).fillBefore(a,t.childCount>1||i<=o).append(a):a.append(s.contentMatchAt(s.childCount).fillBefore(O.c.empty,!0))),t.replaceChild(e<0?0:t.childCount-1,s.copy(a))}var he={thead:["table"],tbody:["table"],tfoot:["table"],caption:["table"],colgroup:["table"],col:["table","colgroup"],tr:["table","tbody"],td:["table","tbody","tr"],th:["table","tbody","tr"]},fe=null;function de(){return fe||(fe=document.implementation.createHTMLDocument("title"))}var me={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},ve=M.ie&&M.ie_version<=11,ge=function(){this.anchorNode=this.anchorOffset=this.focusNode=this.focusOffset=null};ge.prototype.set=function(t){this.anchorNode=t.anchorNode,this.anchorOffset=t.anchorOffset,this.focusNode=t.focusNode,this.focusOffset=t.focusOffset},ge.prototype.eq=function(t){return t.anchorNode==this.anchorNode&&t.anchorOffset==this.anchorOffset&&t.focusNode==this.focusNode&&t.focusOffset==this.focusOffset};var ye=function(t,e){var r=this;this.view=t,this.handleDOMChange=e,this.queue=[],this.flushingSoon=-1,this.observer=window.MutationObserver&&new window.MutationObserver((function(t){for(var e=0;et.target.nodeValue.length}))?r.flushSoon():r.flush()})),this.currentSelection=new ge,ve&&(this.onCharData=function(t){r.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),r.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.suppressingSelectionUpdates=!1};ye.prototype.flushSoon=function(){var t=this;this.flushingSoon<0&&(this.flushingSoon=window.setTimeout((function(){t.flushingSoon=-1,t.flush()}),20))},ye.prototype.forceFlush=function(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())},ye.prototype.start=function(){this.observer&&this.observer.observe(this.view.dom,me),ve&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()},ye.prototype.stop=function(){var t=this;if(this.observer){var e=this.observer.takeRecords();if(e.length){for(var r=0;r-1)){var t=this.observer?this.observer.takeRecords():[];this.queue.length&&(t=this.queue.concat(t),this.queue.length=0);var e=this.view.root.getSelection(),r=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(e)&&Ut(this.view)&&!this.ignoreSelectionChange(e),n=-1,o=-1,i=!1,s=[];if(this.view.editable)for(var a=0;a1){var l=s.filter((function(t){return"BR"==t.nodeName}));if(2==l.length){var u=l[0],p=l[1];u.parentNode&&u.parentNode.parentNode==p.parentNode?p.remove():u.remove()}}(n>-1||r)&&(n>-1&&(this.view.docView.markDirty(n,o),function(t){if(be)return;be=!0,"normal"==getComputedStyle(t.dom).whiteSpace&&console.warn("ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.")}(this.view)),this.handleDOMChange(n,o,i,s),this.view.docView.dirty?this.view.updateState(this.view.state):this.currentSelection.eq(e)||Ft(this.view),this.currentSelection.set(e))}},ye.prototype.registerMutation=function(t,e){if(e.indexOf(t.target)>-1)return null;var r=this.view.docView.nearestDesc(t.target);if("attributes"==t.type&&(r==this.view.docView||"contenteditable"==t.attributeName||"style"==t.attributeName&&!t.oldValue&&!t.target.getAttribute("style")))return null;if(!r||r.ignoreMutation(t))return null;if("childList"==t.type){var n=t.previousSibling,o=t.nextSibling;if(M.ie&&M.ie_version<=11&&t.addedNodes.length)for(var i=0;ii.depth?e(t,r,i.nodeAfter,i.before(n),o,!0):e(t,r,i.node(n),i.before(n),o,!1)})))return{v:!0}},a=i.depth+1;a>0;a--){var c=s(a);if(c)return c.v}return!1}function Oe(t,e,r){t.focused||t.focus();var n=t.state.tr.setSelection(e);"pointer"==r&&n.setMeta("pointer",!0),t.dispatch(n)}function Me(t,e,r,n,o){return Ae(t,"handleClickOn",e,r,n)||t.someProp("handleClick",(function(r){return r(t,e,n)}))||(o?function(t,e){if(-1==e)return!1;var r,n,o=t.state.selection;o instanceof l.c&&(r=o.node);for(var i=t.state.doc.resolve(e),s=i.depth+1;s>0;s--){var a=s>i.depth?i.nodeAfter:i.node(s);if(l.c.isSelectable(a)){n=r&&o.$from.depth>0&&s>=o.$from.depth&&i.before(o.$from.depth+1)==o.$from.pos?i.before(o.$from.depth):i.before(s);break}}return null!=n&&(Oe(t,l.c.create(t.state.doc,n),"pointer"),!0)}(t,r):function(t,e){if(-1==e)return!1;var r=t.state.doc.resolve(e),n=r.nodeAfter;return!!(n&&n.isAtom&&l.c.isSelectable(n))&&(Oe(t,new l.c(r),"pointer"),!0)}(t,r))}function De(t,e,r,n){return Ae(t,"handleDoubleClickOn",e,r,n)||t.someProp("handleDoubleClick",(function(r){return r(t,e,n)}))}function Ee(t,e,r,n){return Ae(t,"handleTripleClickOn",e,r,n)||t.someProp("handleTripleClick",(function(r){return r(t,e,n)}))||function(t,e){var r=t.state.doc;if(-1==e)return!!r.inlineContent&&(Oe(t,l.g.create(r,0,r.content.size),"pointer"),!0);for(var n=r.resolve(e),o=n.depth+1;o>0;o--){var i=o>n.depth?n.nodeAfter:n.node(o),s=n.before(o);if(i.inlineContent)Oe(t,l.g.create(r,s+1,s+1+i.content.size),"pointer");else{if(!l.c.isSelectable(i))continue;Oe(t,l.c.create(r,s),"pointer")}return!0}}(t,r)}function Te(t){return qe(t)}we.keydown=function(t,e){if(t.shiftKey=16==e.keyCode||e.shiftKey,!ze(t,e))if(t.domObserver.forceFlush(),t.lastKeyCode=e.keyCode,t.lastKeyCodeTime=Date.now(),!M.ios||13!=e.keyCode||e.ctrlKey||e.altKey||e.metaKey)t.someProp("handleKeyDown",(function(r){return r(t,e)}))||ne(t,e)?e.preventDefault():xe(t,"key");else{var r=Date.now();t.lastIOSEnter=r,t.lastIOSEnterFallbackTimeout=setTimeout((function(){t.lastIOSEnter==r&&(t.someProp("handleKeyDown",(function(e){return e(t,J(13,"Enter"))})),t.lastIOSEnter=0)}),200)}},we.keyup=function(t,e){16==e.keyCode&&(t.shiftKey=!1)},we.keypress=function(t,e){if(!(ze(t,e)||!e.charCode||e.ctrlKey&&!e.altKey||M.mac&&e.metaKey))if(t.someProp("handleKeyPress",(function(r){return r(t,e)})))e.preventDefault();else{var r=t.state.selection;if(!(r instanceof l.g&&r.$from.sameParent(r.$to))){var n=String.fromCharCode(e.charCode);t.someProp("handleTextInput",(function(e){return e(t,r.$from.pos,r.$to.pos,n)}))||t.dispatch(t.state.tr.insertText(n).scrollIntoView()),e.preventDefault()}}};var Ne=M.mac?"metaKey":"ctrlKey";ke.mousedown=function(t,e){t.shiftKey=e.shiftKey;var r=Te(t),n=Date.now(),o="singleClick";n-t.lastClick.time<500&&function(t,e){var r=e.x-t.clientX,n=e.y-t.clientY;return r*r+n*n<100}(e,t.lastClick)&&!e[Ne]&&("singleClick"==t.lastClick.type?o="doubleClick":"doubleClick"==t.lastClick.type&&(o="tripleClick")),t.lastClick={time:n,x:e.clientX,y:e.clientY,type:o};var i=t.posAtCoords(Se(e));i&&("singleClick"==o?t.mouseDown=new Ie(t,i,e,r):("doubleClick"==o?De:Ee)(t,i.pos,i.inside,e)?e.preventDefault():xe(t,"pointer"))};var Ie=function(t,e,r,n){var o,i,s=this;if(this.view=t,this.startDoc=t.state.doc,this.pos=e,this.event=r,this.flushed=n,this.selectNode=r[Ne],this.allowDefault=r.shiftKey,e.inside>-1)o=t.state.doc.nodeAt(e.inside),i=e.inside;else{var a=t.state.doc.resolve(e.pos);o=a.parent,i=a.depth?a.before():0}this.mightDrag=null;var c=n?null:r.target,u=c?t.docView.nearestDesc(c,!0):null;this.target=u?u.dom:null,(o.type.spec.draggable&&!1!==o.type.spec.selectable||t.state.selection instanceof l.c&&i==t.state.selection.from)&&(this.mightDrag={node:o,pos:i,addAttr:this.target&&!this.target.draggable,setUneditable:this.target&&M.gecko&&!this.target.hasAttribute("contentEditable")}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout((function(){return s.target.setAttribute("contentEditable","false")}),20),this.view.domObserver.start()),t.root.addEventListener("mouseup",this.up=this.up.bind(this)),t.root.addEventListener("mousemove",this.move=this.move.bind(this)),xe(t,"pointer")};function ze(t,e){return!!t.composing||!!(M.safari&&Math.abs(e.timeStamp-t.compositionEndedAt)<500)&&(t.compositionEndedAt=-2e8,!0)}Ie.prototype.done=function(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.view.mouseDown=null},Ie.prototype.up=function(t){if(this.done(),this.view.dom.contains(3==t.target.nodeType?t.target.parentNode:t.target)){var e=this.pos;this.view.state.doc!=this.startDoc&&(e=this.view.posAtCoords(Se(t))),this.allowDefault||!e?xe(this.view,"pointer"):Me(this.view,e.pos,e.inside,t,this.selectNode)?t.preventDefault():this.flushed||M.safari&&this.mightDrag&&!this.mightDrag.node.isAtom||M.chrome&&!(this.view.state.selection instanceof l.g)&&(e.pos==this.view.state.selection.from||e.pos==this.view.state.selection.to)?(Oe(this.view,l.f.near(this.view.state.doc.resolve(e.pos)),"pointer"),t.preventDefault()):xe(this.view,"pointer")}},Ie.prototype.move=function(t){!this.allowDefault&&(Math.abs(this.event.x-t.clientX)>4||Math.abs(this.event.y-t.clientY)>4)&&(this.allowDefault=!0),xe(this.view,"pointer")},ke.touchdown=function(t){Te(t),xe(t,"pointer")},ke.contextmenu=function(t){return Te(t)};var Re=M.android?5e3:-1;function Fe(t,e){clearTimeout(t.composingTimeout),e>-1&&(t.composingTimeout=setTimeout((function(){return qe(t)}),e))}function je(t){for(t.composing=!1;t.compositionNodes.length>0;)t.compositionNodes.pop().markParentsDirty()}function qe(t,e){if(t.domObserver.forceFlush(),je(t),e||t.docView.dirty){var r=Rt(t);return r&&!r.eq(t.state.selection)?t.dispatch(t.state.tr.setSelection(r)):t.updateState(t.state),!0}return!1}we.compositionstart=we.compositionupdate=function(t){if(!t.composing){t.domObserver.flush();var e=t.state,r=e.selection.$from;if(e.selection.empty&&(e.storedMarks||!r.textOffset&&r.parentOffset&&r.nodeBefore.marks.some((function(t){return!1===t.type.spec.inclusive}))))t.markCursor=t.state.storedMarks||r.marks(),qe(t,!0),t.markCursor=null;else if(qe(t),M.gecko&&e.selection.empty&&r.parentOffset&&!r.textOffset&&r.nodeBefore.marks.length)for(var n=t.root.getSelection(),o=n.focusNode,i=n.focusOffset;o&&1==o.nodeType&&0!=i;){var s=i<0?o.lastChild:o.childNodes[i-1];if(!s)break;if(3==s.nodeType){n.collapse(s,s.nodeValue.length);break}o=s,i=-1}t.composing=!0}Fe(t,Re)},we.compositionend=function(t,e){t.composing&&(t.composing=!1,t.compositionEndedAt=e.timeStamp,Fe(t,20))};var Be=M.ie&&M.ie_version<15||M.ios&&M.webkit_version<604;function Pe(t,e,r,n){var o=le(t,e,r,t.shiftKey,t.state.selection.$from);if(t.someProp("handlePaste",(function(e){return e(t,n,o||O.j.empty)})))return!0;if(!o)return!1;var i=function(t){return 0==t.openStart&&0==t.openEnd&&1==t.content.childCount?t.content.firstChild:null}(o),s=i?t.state.tr.replaceSelectionWith(i,t.shiftKey):t.state.tr.replaceSelection(o);return t.dispatch(s.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}ke.copy=we.cut=function(t,e){var r=t.state.selection,n="cut"==e.type;if(!r.empty){var o=Be?null:e.clipboardData,i=ce(t,r.content()),s=i.dom,a=i.text;o?(e.preventDefault(),o.clearData(),o.setData("text/html",s.innerHTML),o.setData("text/plain",a)):function(t,e){if(t.dom.parentNode){var r=t.dom.parentNode.appendChild(document.createElement("div"));r.appendChild(e),r.style.cssText="position: fixed; left: -10000px; top: 10px";var n=getSelection(),o=document.createRange();o.selectNodeContents(e),t.dom.blur(),n.removeAllRanges(),n.addRange(o),setTimeout((function(){r.parentNode&&r.parentNode.removeChild(r),t.focus()}),50)}}(t,s),n&&t.dispatch(t.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))}},we.paste=function(t,e){var r=Be?null:e.clipboardData;r&&Pe(t,r.getData("text/plain"),r.getData("text/html"),e)?e.preventDefault():function(t,e){if(t.dom.parentNode){var r=t.shiftKey||t.state.selection.$from.parent.type.spec.code,n=t.dom.parentNode.appendChild(document.createElement(r?"textarea":"div"));r||(n.contentEditable="true"),n.style.cssText="position: fixed; left: -10000px; top: 10px",n.focus(),setTimeout((function(){t.focus(),n.parentNode&&n.parentNode.removeChild(n),r?Pe(t,n.value,null,e):Pe(t,n.textContent,n.innerHTML,e)}),50)}}(t,e)};var $e=function(t,e){this.slice=t,this.move=e},Le=M.mac?"altKey":"ctrlKey";for(var Ve in ke.dragstart=function(t,e){var r=t.mouseDown;if(r&&r.done(),e.dataTransfer){var n=t.state.selection,o=n.empty?null:t.posAtCoords(Se(e));if(o&&o.pos>=n.from&&o.pos<=(n instanceof l.c?n.to-1:n.to));else if(r&&r.mightDrag)t.dispatch(t.state.tr.setSelection(l.c.create(t.state.doc,r.mightDrag.pos)));else if(e.target&&1==e.target.nodeType){var i=t.docView.nearestDesc(e.target,!0);if(!i||!i.node.type.spec.draggable||i==t.docView)return;t.dispatch(t.state.tr.setSelection(l.c.create(t.state.doc,i.posBefore)))}var s=t.state.selection.content(),a=ce(t,s),c=a.dom,u=a.text;e.dataTransfer.clearData(),e.dataTransfer.setData(Be?"Text":"text/html",c.innerHTML),Be||e.dataTransfer.setData("text/plain",u),t.dragging=new $e(s,!e[Le])}},ke.dragend=function(t){var e=t.dragging;window.setTimeout((function(){t.dragging==e&&(t.dragging=null)}),50)},we.dragover=we.dragenter=function(t,e){return e.preventDefault()},we.drop=function(t,e){var r=t.dragging;if(t.dragging=null,e.dataTransfer){var n=t.posAtCoords(Se(e));if(n){var o=t.state.doc.resolve(n.pos);if(o){var i=r&&r.slice||le(t,e.dataTransfer.getData(Be?"Text":"text/plain"),Be?null:e.dataTransfer.getData("text/html"),!1,o),s=r&&!e[Le];if(t.someProp("handleDrop",(function(r){return r(t,e,i||O.j.empty,s)})))e.preventDefault();else if(i){e.preventDefault();var a=i?Object(c.g)(t.state.doc,o.pos,i):o.pos;null==a&&(a=o.pos);var u=t.state.tr;s&&u.deleteSelection();var p=u.mapping.map(a),h=0==i.openStart&&0==i.openEnd&&1==i.content.childCount,f=u.doc;if(h?u.replaceRangeWith(p,p,i.content.firstChild):u.replaceRange(p,p,i),!u.doc.eq(f)){var d=u.doc.resolve(p);if(h&&l.c.isSelectable(i.content.firstChild)&&d.nodeAfter&&d.nodeAfter.sameMarkup(i.content.firstChild))u.setSelection(new l.c(d));else{var m=u.mapping.map(a);u.mapping.maps[u.mapping.maps.length-1].forEach((function(t,e,r,n){return m=n})),u.setSelection(Vt(t,d,u.doc.resolve(m)))}t.focus(),t.dispatch(u.setMeta("uiEvent","drop"))}}}}}},ke.focus=function(t){t.focused||(t.domObserver.stop(),t.dom.classList.add("ProseMirror-focused"),t.domObserver.start(),t.focused=!0,setTimeout((function(){t.docView&&t.hasFocus()&&!t.domObserver.currentSelection.eq(t.root.getSelection())&&Ft(t)}),20))},ke.blur=function(t){t.focused&&(t.domObserver.stop(),t.dom.classList.remove("ProseMirror-focused"),t.domObserver.start(),t.domObserver.currentSelection.set({}),t.focused=!1)},ke.beforeinput=function(t,e){if(M.chrome&&M.android&&"deleteContentBackward"==e.inputType){var r=t.domChangeCount;setTimeout((function(){if(t.domChangeCount==r&&(t.dom.blur(),t.focus(),!t.someProp("handleKeyDown",(function(e){return e(t,J(8,"Backspace"))})))){var e=t.state.selection.$cursor;e&&e.pos>0&&t.dispatch(t.state.tr.delete(e.pos-1,e.pos).scrollIntoView())}}),50)}},we)ke[Ve]=we[Ve];function Ue(t,e){if(t==e)return!0;for(var r in t)if(t[r]!==e[r])return!1;for(var n in e)if(!(n in t))return!1;return!0}var Je=function(t,e){this.spec=e||Ye,this.side=this.spec.side||0,this.toDOM=t};Je.prototype.map=function(t,e,r,n){var o=t.mapResult(e.from+n,this.side<0?-1:1),i=o.pos;return o.deleted?null:new He(i-r,i-r,this)},Je.prototype.valid=function(){return!0},Je.prototype.eq=function(t){return this==t||t instanceof Je&&(this.spec.key&&this.spec.key==t.spec.key||this.toDOM==t.toDOM&&Ue(this.spec,t.spec))};var We=function(t,e){this.spec=e||Ye,this.attrs=t};We.prototype.map=function(t,e,r,n){var o=t.map(e.from+n,this.spec.inclusiveStart?-1:1)-r,i=t.map(e.to+n,this.spec.inclusiveEnd?1:-1)-r;return o>=i?null:new He(o,i,this)},We.prototype.valid=function(t,e){return e.from=t&&(!o||o(s.spec))&&r.push(s.copy(s.from+n,s.to+n))}for(var a=0;at){var c=this.children[a]+1;this.children[a+2].findInner(t-c,e-c,r,n+c,o)}},Xe.prototype.map=function(t,e,r){return this==Qe||0==t.maps.length?this:this.mapInner(t,e,0,0,r||Ye)},Xe.prototype.mapInner=function(t,e,r,n,o){for(var i,s=0;sc+i||(e>=a[s]+i?a[s+1]=-1:r>=o&&(l=n-r-(e-t))&&(a[s]+=l,a[s+1]+=l))}},l=0;l=n.content.size){u=!0;continue}var d=r.map(t[p+1]+i,-1)-o,m=n.content.findIndex(f),v=m.index,g=m.offset,y=n.maybeChild(v);if(y&&g==f&&g+y.nodeSize==d){var b=a[p+2].mapInner(r,y,h+1,t[p]+i+1,s);b!=Qe?(a[p]=f,a[p+1]=d,a[p+2]=b):(a[p+1]=-2,u=!0)}else u=!0}if(u){var k=or(function(t,e,r,n,o,i,s){function a(t,e){for(var i=0;is&&l.to=t){this.children[o]==t&&(r=this.children[o+2]);break}for(var i=t+1,s=i+e.content.size,a=0;ai&&c.type instanceof We){var l=Math.max(i,c.from)-i,u=Math.min(s,c.to)-i;lr&&s.to0;)e++;t.splice(e,0,r)}function cr(t){var e=[];return t.someProp("decorations",(function(r){var n=r(t.state);n&&n!=Qe&&e.push(n)})),t.cursorWrapper&&e.push(Xe.create(t.state.doc,[t.cursorWrapper.deco])),tr.from(e)}tr.prototype.forChild=function(t,e){if(e.isLeaf)return Xe.empty;for(var r=[],n=0;nn.scrollToSelection?"to selection":"preserve",p=o||!this.docView.matchesNode(t.doc,c,a);!p&&t.selection.eq(n.selection)||(i=!0);var h,f,d,m,v,g,y,b,k,w,x,_="preserve"==u&&i&&null==this.dom.style.overflowAnchor&&function(t){for(var e,r,n=t.dom.getBoundingClientRect(),o=Math.max(0,n.top),i=(n.left+n.right)/2,s=o+1;s=o-20){e=a,r=c.top;break}}}return{refDOM:e,refTop:r,stack:Z(t.dom)}}(this);if(i){this.domObserver.stop();var C=p&&(M.ie||M.chrome)&&!this.composing&&!n.selection.empty&&!t.selection.empty&&(m=n.selection,v=t.selection,g=Math.min(m.$anchor.sharedDepth(m.head),v.$anchor.sharedDepth(v.head)),m.$anchor.start(g)!=v.$anchor.start(g));if(p){var S=M.chrome?this.trackWrites=this.root.getSelection().focusNode:null;!o&&this.docView.update(t.doc,c,a,this)||(this.docView.updateOuterDeco([]),this.docView.destroy(),this.docView=kt(t.doc,c,a,this.dom,this)),S&&!this.trackWrites&&(C=!0)}C||!(this.mouseDown&&this.domObserver.currentSelection.eq(this.root.getSelection())&&(h=this,f=h.docView.domFromPos(h.state.selection.anchor,0),d=h.root.getSelection(),q(f.node,f.offset,d.anchorNode,d.anchorOffset)))?Ft(this,C):($t(this,t.selection),this.domObserver.setCurSelection()),this.domObserver.start()}if(this.updatePluginViews(n),"reset"==u)this.dom.scrollTop=0;else if("to selection"==u){var A=this.root.getSelection().focusNode;this.someProp("handleScrollToSelection",(function(t){return t(r)}))||(t.selection instanceof l.c?G(this,this.docView.domAfterPos(t.selection.from).getBoundingClientRect(),A):G(this,this.coordsAtPos(t.selection.head,1),A))}else _&&(b=(y=_).refDOM,k=y.refTop,w=y.stack,x=b?b.getBoundingClientRect().top:0,Y(w,0==x?0:x-k))},lr.prototype.destroyPluginViews=function(){for(var t;t=this.pluginViews.pop();)t.destroy&&t.destroy()},lr.prototype.updatePluginViews=function(t){if(t&&t.plugins==this.state.plugins)for(var e=0;e=0;e--){var r=t.index(e);if(0!=r)for(var n=t.node(e).child(r-1);;n=n.lastChild){if(0==n.childCount&&!n.inlineContent||n.isAtom||n.type.spec.isolating)return!0;if(n.inlineContent)return!1}}return!0}(t)||!function(t){for(var e=t.depth;e>=0;e--){var r=t.indexAfter(e),n=t.node(e);if(r!=n.childCount)for(var o=n.child(r);;o=o.firstChild){if(0==o.childCount&&!o.inlineContent||o.isAtom||o.type.spec.isolating)return!0;if(o.inlineContent)return!1}}return!0}(t))return!1;var r=e.type.spec.allowGapCursor;if(null!=r)return r;var n=e.contentMatchAt(t.index()).defaultType;return n&&n.isTextblock},e.findFrom=function(t,r,n){t:for(;;){if(!n&&e.valid(t))return t;for(var o=t.pos,i=null,s=t.depth;;s--){var a=t.node(s);if(r>0?t.indexAfter(s)0){i=a.child(r>0?t.indexAfter(s):t.index(s)-1);break}if(0==s)return null;o+=r;var c=t.doc.resolve(o);if(e.valid(c))return c}for(;;){var u=r>0?i.firstChild:i.lastChild;if(!u){if(i.isAtom&&!i.isText&&!l.c.isSelectable(i)){t=t.doc.resolve(o+i.nodeSize*r),n=!1;continue t}break}i=u,o+=r;var p=t.doc.resolve(o);if(e.valid(p))return p}return null}},e}(l.f);vr.prototype.visible=!1,l.f.jsonID("gapcursor",vr);var gr=function(t){this.pos=t};gr.prototype.map=function(t){return new gr(t.map(this.pos))},gr.prototype.resolve=function(t){var e=t.resolve(this.pos);return vr.valid(e)?new vr(e):l.f.near(e)};var yr=Object(A.a)({ArrowLeft:br("horiz",-1),ArrowRight:br("horiz",1),ArrowUp:br("vert",-1),ArrowDown:br("vert",1)});function br(t,e){var r="vert"==t?e>0?"down":"up":e>0?"right":"left";return function(t,n,o){var i=t.selection,s=e>0?i.$to:i.$from,a=i.empty;if(i instanceof l.g){if(!o.endOfTextblock(r)||0==s.depth)return!1;a=!1,s=t.doc.resolve(e>0?s.after():s.before())}var c=vr.findFrom(s,e,a);return!!c&&(n&&n(t.tr.setSelection(new vr(c))),!0)}}function kr(t,e,r){if(!t.editable)return!1;var n=t.state.doc.resolve(e);if(!vr.valid(n))return!1;var o=t.posAtCoords({left:r.clientX,top:r.clientY}).inside;return!(o>-1&&l.c.isSelectable(t.state.doc.nodeAt(o)))&&(t.dispatch(t.state.tr.setSelection(new vr(n))),!0)}function wr(t){if(!(t.selection instanceof vr))return null;var e=document.createElement("div");return e.className="ProseMirror-gapcursor",Xe.create(t.doc,[He.widget(t.selection.head,e,{key:"gapcursor"})])}var xr=r(16),_r=r.n(xr);var Cr=/^data:((?:\w+\/(?:(?!;).)+)?)((?:;[\w\W]*?[^;])*),(.+)$/,Sr=new DOMParser;function Ar(t){return function(e,r,n,o,i,s){if(s&&n.type===t.nodes.spoiler&&"P"!==i.target.tagName)return n.attrs.open=!n.attrs.open,e.focus(),i.stopPropagation(),i.preventDefault(),!1}}var Or=r(5);function Mr(t){return Object(Or.f)(/^(\d+)(\.|\))\s$/,t,(function(t){return{order:+t[1]}}),(function(t,e){return e.childCount+e.attrs.order==+t[1]}))}function Dr(t){return Object(Or.f)(/^\s*([-+*])\s$/,t)}function Er(t){return Object(Or.d)(/^```$/,t)}function Tr(t,e){return Object(Or.d)(new RegExp("^(#{1,"+e+"})\\s$"),t,(function(t){return{level:t[1].length}}))}function Nr(t){return Object(Or.f)(/^\s*>!\s$/,t)}var Ir=r(26),zr=r(34),Rr=r(28),Fr=function(){function t(t,e){this.build(t,e)}var e=t.prototype;return e.build=function(t,e){var r=this;this.attrs=e,this.schema=(new Rr.a).build(),this.parser=new zr.a(this.schema).build(),this.serializer=new Ir.a(this.schema).build(),this.state=l.b.create(this.buildEditorStateConfig()),this.view=new lr(t,this.buildEditorProps()),(e.classNames||[]).forEach((function(t){return r.view.dom.classList.add(t)}));var n=function(e){r.attrs.inputListeners.forEach((function(e){e.call(t)})),e.redraw=!1};t.oninput=n,t.onclick=n,t.onkeyup=n},e.buildEditorStateConfig=function(){return{doc:this.parseInitialValue(this.attrs.value),disabled:this.attrs.disabled,schema:this.schema,plugins:this.buildPluginItems().toArray()}},e.buildPluginItems=function(){var t,e,r,o,i=new _r.a;return i.add("markdownInputrules",Object(Or.c)({rules:this.buildInputRules(this.schema)})),i.add("submit",Object(A.b)({"Mod-Enter":this.attrs.onsubmit})),i.add("escape",Object(A.b)({Escape:this.attrs.escape})),i.add("richTextKeymap",Object(A.b)(function(t){var e=function(e,r){return r(e.tr.replaceSelectionWith(t.nodes.hard_break.create()).scrollIntoView()),!0},r=[function(t,e){var r=$(".EmojiDropdown:visible"),n=$(".MentionsDropdown:visible");if(r[0]||n[0])return!0},Object(n.k)(t.nodes.list_item),function(t,e,r){var o=t.selection,i=o.$head,s=o.$anchor;if(!i.parent.type.spec.code||!i.sameParent(s))return!1;var a=t.selection.$from.nodeBefore,c=t.selection.$from.nodeAfter;return a&&"\n"!==a.text.slice(-1)||c?Object(n.f)(t,e):(r.dispatch(r.state.tr.delete(t.selection.from-1,t.selection.from)),r.dispatch(r.state.tr.setSelection(l.g.near(r.state.doc.resolve(r.state.selection.from)))),Object(n.c)(r.state,r.dispatch))}];app.session.user.preferences().richTextCompactParagraphs&&r.push((function(t,r,n){var o=t.selection,i=o.$head,s=o.$anchor;if("paragraph"!==i.parent.type.name||!i.sameParent(s))return!1;var a=t.selection.$from.nodeBefore,c=t.selection.$from.nodeAfter;if(a&&a.text&&"\n"!==a.text.slice(-1))return e(n.state,n.dispatch);!a||a.text||c||(n.dispatch(n.state.tr.delete(t.selection.from-1,t.selection.from)),n.dispatch(n.state.tr.setSelection(l.g.near(n.state.doc.resolve(n.state.selection.from)))))}));var o=n.b.apply(void 0,r);return{"Mod-z":C,"Mod-y":S,"Mod-Shift-z":S,Backspace:Or.e,"Mod-b":Object(n.n)(t.marks.strong),"Mod-i":Object(n.n)(t.marks.em),"Mod-`":Object(n.n)(t.marks.code),"Alt-Shift-5":Object(n.n)(t.marks.strike),"Mod-,":Object(n.n)(t.marks.sub),"Mod-.":Object(n.n)(t.marks.sup),"Mod-;":Object(n.n)(t.marks.spoiler_inline),"Shift-Mod-8":Object(n.m)(t.nodes.bullet_list),"Shift-Mod-9":Object(n.m)(t.nodes.ordered_list),"Mod-q":Object(n.q)(t.nodes.blockquote),"Shift-Ctrl-0":Object(n.i)(t.nodes.paragraph),"Shift-Ctrl-1":Object(n.i)(t.nodes.heading,{level:1}),"Shift-Ctrl-2":Object(n.i)(t.nodes.heading,{level:2}),"Shift-Ctrl-3":Object(n.i)(t.nodes.heading,{level:3}),"Shift-Ctrl-4":Object(n.i)(t.nodes.heading,{level:4}),"Shift-Ctrl-5":Object(n.i)(t.nodes.heading,{level:5}),"Shift-Ctrl-6":Object(n.i)(t.nodes.heading,{level:6}),"Shift-Ctrl-\\":Object(n.i)(t.nodes.code_block),"Mod-]":Object(n.j)(t.nodes.list_item),"Mod-m":Object(n.j)(t.nodes.list_item),"Mod-[":Object(n.d)(t.nodes.list_item),"Mod-Shift-m":Object(n.d)(t.nodes.list_item),Enter:o,"Shift-Enter":Object(n.b)(n.f,e)}}(this.schema))),i.add("baseKeymap",Object(A.b)(n.a)),i.add("placeholder",(t=this.attrs.placeholder,new l.d({props:{decorations:function(e){var r=[];if(1===e.doc.childCount){var n=e.doc.child(0);n.type.isBlock&&0===n.childCount&&n.type==e.schema.nodes.paragraph&&r.push(He.node(0,n.nodeSize,{class:"placeholder","data-before":t}))}return Xe.create(e.doc,r)}}}))),i.add("history",_()),i.add("disabled",new l.d({key:new l.e("disabled"),props:{editable:function(t){return!t.disabled$}},state:{init:function(t){return t.disabled},apply:function(t,e){var r=t.getMeta("disabled");return void 0!==r?r:e}}})),i.add("disableBase64Paste",new l.d({props:{transformPastedHTML:function(t){var e=Sr.parseFromString(t,"text/html");return e.querySelectorAll("img").forEach((function(t){Cr.test(t.src)&&t.remove()})),e.documentElement.outerHTML}}})),i.add("dropCursor",(void 0===e&&(e={}),new l.d({view:function(t){return new mr(t,e)}}))),i.add("gapCursor",new l.d({props:{decorations:wr,createSelectionBetween:function(t,e,r){if(e.pos==r.pos&&vr.valid(r))return new vr(r)},handleClick:kr,handleKeyDown:yr}})),i.add("menu",(r=this.attrs.menuState,new l.d({view:function(t){return r.attachEditorView(t),r}}))),i.add("toggleSpoiler",(o=this.schema,new l.d({props:{handleClickOn:Ar(o),handleDoubleClickOn:Ar(o)}}))),i},e.buildEditorProps=function(){var t=this;return{state:this.state,dispatchTransaction:function(e){var r=this.state.apply(e);this.updateState(r);var n=this.state.doc,o=t.serializeContent(n,t.schema);t.attrs.oninput(o)}}},e.buildInputRules=function(t){return function(t){var e;return[Or.b,(e=t.nodes.blockquote,Object(Or.f)(/^\s*>\s$/,e)),Mr(t.nodes.ordered_list),Dr(t.nodes.bullet_list),Er(t.nodes.code_block),Tr(t.nodes.heading,6),Nr(t.nodes.spoiler),Object(n.g)(/(?:___\s|\*\*\*\s|---)$/,t.nodes.horizontal_rule),Object(Or.d)(/^\s*\$\$\s$/,t.nodes.math_block),Object(n.e)(/(?:\*\*|__)([^\*_]+)(?:\*\*|__)$/,t.marks.strong),Object(n.e)(/(?:^|[^_])(_([^_]+)_)$/,t.marks.em),Object(n.e)(/(?:^|[^*])(\*([^*]+)\*)$/,t.marks.em),Object(n.e)(/(?:`)([^`]+)(?:`)$/,t.marks.code),Object(n.e)(/(?:~~)([^~]+)(?:~~)$/,t.marks.strike),Object(n.e)(/(?:[^~]~)([^~]+)(?:~)$/,t.marks.sub),Object(n.e)(/(?:\^)([^^]+)(?:\^)$/,t.marks.sup),Object(n.e)(/(?:\|\|)([^\|]+)(?:\|\|)$/,t.marks.spoiler_inline),Object(n.e)(/(?:>!)(.+)(?:!<)$/,t.marks.spoiler_inline),Object(n.e)(/(?:\$)([^$]+)(?:\$)$/,t.marks.math_inline)]}(t)},e.parseInitialValue=function(t){return this.parser.parse(t)},e.serializeContent=function(t){return this.serializer.serialize(t,{tightLists:!0})},e.moveCursorTo=function(t){this.setSelectionRange(t,t)},e.getSelectionRange=function(){return[this.view.state.selection.from,this.view.state.selection.to]},e.getLastNChars=function(t){var e=this.view.state.selection.$from.nodeBefore;return e&&e.text?e.text.slice(Math.max(0,e.text.length-t)):""},e.insertAtCursor=function(t,e){this.insertAt(this.getSelectionRange()[0],t,e),$(this.view.dom).trigger("click")},e.insertAt=function(t,e,r){this.insertBetween(t,t,e,r)},e.insertBetween=function(t,e,r,o){var i=this;void 0===o&&(o=!0);var s=0;o?this.view.dispatch(this.view.state.tr.insertText(r,t,e)):(t-=1,this.view.dispatch(this.view.state.tr.replaceRangeWith(t,e,this.parseInitialValue(r))),s=r.match(/\s+$/)[0].split("\n").length-1),this.moveCursorTo(Math.min(t+r.length,l.f.atEnd(this.view.state.doc).to)),m.redraw(),r.endsWith(" ")&&!o&&this.insertAtCursor(" "),Array(s).fill(0).forEach((function(){n.a.Enter(i.view.state,i.view.dispatch)}))},e.replaceBeforeCursor=function(t,e,r){this.insertBetween(t,this.getSelectionRange()[0],e,r)},e.setSelectionRange=function(t,e){var r=this.view.state.tr.doc.resolve(t),n=this.view.state.tr.doc.resolve(e);this.view.dispatch(this.view.state.tr.setSelection(new l.g(r,n))),this.focus()},e.getCaretCoordinates=function(t){var e=this.view.coordsAtPos(t),r=this.view.dom.getBoundingClientRect();return{left:e.left-r.left,top:e.top-r.top}},e.focus=function(){this.view.focus()},e.destroy=function(){this.view.destroy()},e.disabled=function(t){this.view.dispatch(this.view.state.tr.setMeta("disabled",t))},t}()},function(t,e,r){"use strict";r.d(e,"a",(function(){return D}));var n=r(12),o=r(27),i=r.n(o),s=r(51),a=r.n(s),c=r(52),l=r.n(c),u=r(53),p=r.n(u),h=r(7);function f(t){switch(t){case 10:case 33:case 35:case 36:case 37:case 38:case 42:case 43:case 45:case 58:case 60:case 61:case 62:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}var d=function(t,e){for(var r=t.pos;r=4)return!1;if(62!==e.src.charCodeAt(O)||!t.followingCharRegex.test(e.src[O+1]))return!1;if(O+=t.markup.length,o)return!0;c=f=e.sCount[r]+O-(e.bMarks[r]+e.tShift[r]),32===e.src.charCodeAt(O)?(O++,c++,f++,i=!1,w=!0):9===e.src.charCodeAt(O)?(w=!0,(e.bsCount[r]+f)%4==3?(O++,c++,f++,i=!1):i=!0):w=!1;var D=!1,E=!1,T=O;if(">!"===t.markup)for(;O=M,b=[e.sCount[r]],e.sCount[r]=f-c,k=[e.tShift[r]],e.tShift[r]=O-e.bMarks[r],_=e.md.block.ruler.getRules("spoiler"),y=e.parentType,e.parentType="spoiler",S=!1,h=r+1;h=(M=e.eMarks[h])));h++)if(O+=t.markup.length,62!==e.src.charCodeAt(O-t.markup.length)||!t.followingCharRegex.test(e.src[O-t.markup.length+1])||S){if(u)break;for(x=!1,a=0,l=_.length;a=M,m.push(e.bsCount[h]),e.bsCount[h]=e.sCount[h]+1+(w?1:0),b.push(e.sCount[h]),e.sCount[h]=f-c,k.push(e.tShift[h]),e.tShift[h]=O-e.bMarks[h]}for(g=e.blkIndent,e.blkIndent=0,(C=e.push(t.name+"_open",t.name,1)).markup=t.markup,C.map=p=[r,0],e.md.block.tokenize(e,r,h),(C=e.push(t.name+"_close",t.name,-1)).markup=t.markup,e.lineMax=A,e.parentType=y,p[1]=e.line,a=0;a!",name:"spoiler"},t,e,r,n)}function b(t,e,r,n){return g({followingCharRegex:/[^!]/,markup:">",name:"blockquote"},t,e,r,n)}function k(t){t.block.ruler.__rules__.forEach((function(t){var e=t.alt.indexOf("blockquote");e>-1&&t.alt.splice(e,0,"spoiler")})),t.block.ruler.before("blockquote","spoiler",y,{alt:["paragraph","reference","spoiler","blockquote","list"]}),t.block.ruler.at("blockquote",b,{alt:["paragraph","reference","spoiler","blockquote","list"]})} /**! * markdown-it-mark * @@ -28,5 +28,5 @@ module.exports=function(t){var e={};function r(n){if(e[n])return e[n].exports;va * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. - */function w(t,e){var r;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(r=function(t,e){if(!t)return;if("string"==typeof t)return x(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);"Object"===r&&t.constructor&&(r=t.constructor.name);if("Map"===r||"Set"===r)return Array.from(t);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return x(t,e)}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(r=t[Symbol.iterator]()).next.bind(r)}function x(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(r=t[Symbol.iterator]()).next.bind(r)}function A(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r=0;r--)">!<"===(n=e[r]).marker&&-1!==n.end&&(o=e[n.end],(i=t.tokens[n.token]).type="spoiler_inline_open",i.nesting=1,i.markup=">!",i.content="",(i=t.tokens[o.token]).type="spoiler_inline_close",i.nesting=-1,i.markup="!<",i.content="")}var M=function(t,e){void 0===e&&(e=!1),t.inline.ruler.before("emphasis","spoiler_inline_tags",(function(t,e){if(e)return!1;var r=t.posMax,n=t.pos;return 62===t.src.charCodeAt(n)&&n+3<=r&&33===t.src.charCodeAt(n+1)?(t.scanDelims(t.pos,!0),t.push("text","",0),t.delimiters.push({marker:">!<",length:2,jump:0,token:t.tokens.length-1,end:-1,open:!0,close:!1}),t.pos+=2,!0):33===t.src.charCodeAt(n)&&n+2<=r&&60===t.src.charCodeAt(n+1)&&(t.push("text","",0),t.delimiters.push({marker:">!<",length:2,jump:0,token:t.tokens.length-1,end:-1,open:!1,close:!0}),t.pos+=2,!0)})),t.inline.ruler2.before("emphasis","spoiler_inline_bars",(function(t){if(O(t,t.delimiters),t.tokens_meta)for(var e,r=S(t.tokens_meta);!(e=r()).done;){var n=e.value;n&&n.delimiters&&O(t,n.delimiters)}}))},D=function(){function t(t){this.schema=t}var e=t.prototype;return e.tokenizerParams=function(){return{html:!1}},e.buildTokenizer=function(){return i()("commonmark",this.tokenizerParams()).enable("strikethrough").use(m).use(k).use(p.a).use(a.a).use(l.a).use(C).use(M)},e.buildTokens=function(){return Object(n.a)({},h.d.tokens,{s:{mark:"strike"},softbreak:{node:"hard_break"},spoiler:{block:"spoiler"},spoiler_inline:{mark:"spoiler_inline"},sub:{mark:"sub"},sup:{mark:"sup"},math_block:{block:"math_block",noCloseToken:!0},math_inline:{mark:"math_inline",noCloseToken:!0}})},e.build=function(){return new h.a(this.schema,this.buildTokenizer(),this.buildTokens())},t}()},function(t,e,r){"use strict";r.d(e,"a",(function(){return C}));var n=r(6),o=r(2),i=r(29),s=r.n(i),a=r(16),c=r.n(a),l=r(10),u=r(14),p=r(30),h=r(31),f=r(36),d=r(24);var v=r(20),g=r.n(v),y=r(9),b=r.n(y),k=r(19),w=r.n(k),x=r(21),_=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t),e.initAttrs=function(t){t.buttonClassName="Button Button--icon Button--link Button--menuDropdown"};var r=e.prototype;return r.oninit=function(e){t.prototype.oninit.call(this,e),this.state=this.attrs.state},r.oncreate=function(e){var r=this;t.prototype.oncreate.call(this,e),this.$().on("click",(function(t){$(".App").is(".mobile-safari")&&(app.modal.show(x.a,{title:r.attrs.tooltip,vnodeContent:r.attrs.buttons.map((function(t){return t}))}),t.stopPropagation())}))},r.getButtonContent=function(t){return m(b.a,{text:this.attrs.tooltip},m("span",null,w()(this.attrs.icon)))},r.getMenu=function(t){return m("ul",{className:"Dropdown-menu dropdown-menu HiddenItemsDropdownMenu"},this.attrs.buttons)},e}(g.a),C=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.oninit=function(e){t.prototype.oninit.call(this,e),this.modifierKey=navigator.userAgent.match(/Macintosh/)?"⌘":"ctrl"},r.view=function(t){return this.attrs.state?m("div",{class:"ProseMirrorMenu"},this.items().toArray()):""},r.items=function(){var t=new c.a,e=this.attrs.state,r=this.modifierKey;return t.add("text_type",p.a.component({type:"text_type",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.text_type_tooltip"),state:e,options:[{title:"H1",type:e.getSchema().nodes.heading,attrs:{level:1},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:1})},{title:"H2",type:e.getSchema().nodes.heading,attrs:{level:2},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:2})},{title:"H3",type:e.getSchema().nodes.heading,attrs:{level:3},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:3})},{title:"H4",type:e.getSchema().nodes.heading,attrs:{level:4},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:4})},{title:"H5",type:e.getSchema().nodes.heading,attrs:{level:5},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:5})},{title:"H6",type:e.getSchema().nodes.heading,attrs:{level:6},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:6})},{title:"P",type:e.getSchema().nodes.paragraph,tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.paragraph_tooltip",{modifierKey:r})}]}),100),t.add("bold",u.a.component({type:"bold",icon:"fas fa-bold",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.bold_tooltip",{modifierKey:r}),state:e,mark:e.getSchema().marks.strong}),90),t.add("italic",u.a.component({type:"italic",icon:"fas fa-italic",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.italic_tooltip",{modifierKey:r}),state:e,mark:e.getSchema().marks.em}),80),t.add("code",u.a.component({type:"code",icon:"fas fa-code",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.code_tooltip",{modifierKey:r}),state:e,mark:e.getSchema().marks.code}),70),t.add("quote",l.a.component({type:"quote",icon:"fas fa-quote-left",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.quote_tooltip",{modifierKey:r}),state:e,command:Object(o.q)(e.getSchema().nodes.blockquote)}),60),t.add("link",f.a.component({type:"link",icon:"fas fa-link",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.link_tooltip"),state:e,mark:e.getSchema().marks.link}),50),t.add("image",h.a.component({type:"image",icon:"fas fa-image",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.image_tooltip"),state:e,node:e.getSchema().nodes.image}),40),t.add("unordered_list",d.a.component({type:"unordered_list",icon:"fas fa-list-ul",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.unordered_list_tooltip",{modifierKey:r}),state:e,listType:e.getSchema().nodes.bullet_list}),30),t.add("ordered_list",d.a.component({type:"ordered_list",icon:"fas fa-list-ol",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.ordered_list_tooltip",{modifierKey:r}),state:e,listType:e.getSchema().nodes.ordered_list}),20),t.add("additional_items",_.component({type:"additional_items",icon:"fas fa-plus",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.additional_items_tooltip"),state:e,buttons:this.hiddenItems().toArray()})),t},r.hiddenItems=function(){var t,e,r=new c.a,n=this.attrs.state,i=this.modifierKey;return r.add("strike",u.a.component({type:"strike",icon:"fas fa-strikethrough",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.strike_tooltip"),state:n,mark:n.getSchema().marks.strike})),r.add("sub",u.a.component({type:"sub",icon:"fas fa-subscript",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.sub_tooltip",{modifierKey:i}),state:n,mark:n.getSchema().marks.sub})),r.add("sup",u.a.component({type:"sup",icon:"fas fa-superscript",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.sup_tooltip",{modifierKey:i}),state:n,mark:n.getSchema().marks.sup})),r.add("spoiler_inline",u.a.component({type:"spoiler_inline",icon:"fas fa-eye-slash",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.spoiler_inline_tooltip",{modifierKey:i}),state:n,mark:n.getSchema().marks.spoiler_inline})),r.add("code_block",l.a.component({type:"code_block",icon:"fas fa-terminal",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.code_block_tooltip",{modifierKey:i}),state:n,command:Object(o.l)(n.getSchema().nodes.code_block,n.getSchema().nodes.paragraph)})),r.add("spoiler_block",l.a.component({type:"spoiler_block",icon:"fas fa-caret-square-right",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.spoiler_block_tooltip",{modifierKey:i}),state:n,command:Object(o.o)(n.getSchema().nodes.spoiler)})),r.add("horizontal_rule",l.a.component({type:"horizontal_rule",icon:"fas fa-minus",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.horizontal_rule_tooltip"),state:n,command:(t=n.getSchema().nodes.horizontal_rule,function(r,n){return n(r.tr.replaceSelectionWith(t.create(e))),!0})})),r},e}(s.a)},function(t,e,r){"use strict";r.d(e,"a",(function(){return h}));var n=r(6),o=r(18),i=r.n(o),s=r(11),a=r.n(s),c=r(17),l=r.n(c),u=r(22),p=r(2);var h=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.oninit=function(e){var r=this;t.prototype.oninit.call(this,e),this.text=l()(""),this.href=l()(""),this.title=l()(""),this.state.addItem(this.attrs.type,(function(t,e){r.command(t,e)}),this.onEditorUpdate.bind(this)),this.selectionEmpty=!0},r.fields=function(){var e=t.prototype.fields.call(this);return this.selectionEmpty&&!this.active&&e.add("text",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"text",placeholder:a()(app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.text_placeholder")),bidi:this.text,required:!0})),10),e.add("href",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"href",type:"url",placeholder:a()(app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.href_placeholder")),bidi:this.href,required:!0})),10),e.add("title",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"title",placeholder:a()(app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.title_placeholder")),bidi:this.title})),10),this.active&&e.add("remove",m(i.a,{onclick:this.remove.bind(this),className:"Button Button--danger"},app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.remove_button")),-10),e},r.insert=function(t){var e,r,n,o={href:this.href(),title:this.title()};this.selectionEmpty&&!this.active?(this.command=(e=this.text(),r=this.attrs.mark,n=o,function(t,o){o(t.tr.replaceSelectionWith(t.schema.text(e,[r.create(n)]),!1))}),this.text("")):this.command=Object(p.p)(this.attrs.mark,o),this.state.run(this.attrs.type)},r.remove=function(t){$("body").trigger("click"),this.command=Object(p.h)(this.attrs.mark),this.state.run(this.attrs.type),app.composer.editor.focus()},r.onEditorUpdate=function(){this.active=!!this.state.markActive(this.attrs.mark),this.$(".Dropdown-toggle").toggleClass("active",this.active);var t=this.state.markAttrs(this.attrs.mark);this.href(t.href),this.title(t.title),this.selectionEmpty=this.state.selectionEmpty()},e}(u.a)},function(t,e){t.exports=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4E\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/},function(t,e,r){"use strict";function n(){this.__rules__=[],this.__cache__=null}n.prototype.__find__=function(t){for(var e=0;e=0&&(r=this.attrs[e][1]),r},n.prototype.attrJoin=function(t,e){var r=this.attrIndex(t);r<0?this.attrPush([t,e]):this.attrs[r][1]=this.attrs[r][1]+" "+e},t.exports=n},function(t,e,r){"use strict";t.exports=r(56)},function(t,e,r){"use strict";t.exports.encode=r(57),t.exports.decode=r(58),t.exports.format=r(59),t.exports.parse=r(60)},function(t,e){t.exports=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/},function(t,e){t.exports=/[\0-\x1F\x7F-\x9F]/},function(t,e){t.exports=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/},function(t,e,r){"use strict";var n="<[A-Za-z][A-Za-z0-9\\-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^\"'=<>`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>",o="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",i=new RegExp("^(?:"+n+"|"+o+"|\x3c!----\x3e|\x3c!--(?:-?[^>-])(?:-?[^-])*--\x3e|<[?].*?[?]>|]*>|)"),s=new RegExp("^(?:"+n+"|"+o+")");t.exports.HTML_TAG_RE=i,t.exports.HTML_OPEN_CLOSE_TAG_RE=s},function(t,e,r){"use strict";function n(t,e){var r,n,o,i,s,a=[],c=e.length;for(r=0;r=0;r--)95!==(n=e[r]).marker&&42!==n.marker||-1!==n.end&&(o=e[n.end],a=r>0&&e[r-1].end===n.end+1&&e[r-1].token===n.token-1&&e[n.end+1].token===o.token+1&&e[r-1].marker===n.marker,s=String.fromCharCode(n.marker),(i=t.tokens[n.token]).type=a?"strong_open":"em_open",i.tag=a?"strong":"em",i.nesting=1,i.markup=a?s+s:s,i.content="",(i=t.tokens[o.token]).type=a?"strong_close":"em_close",i.tag=a?"strong":"em",i.nesting=-1,i.markup=a?s+s:s,i.content="",a&&(t.tokens[e[r-1].token].content="",t.tokens[e[n.end+1].token].content="",r--))}t.exports.tokenize=function(t,e){var r,n,o=t.pos,i=t.src.charCodeAt(o);if(e)return!1;if(95!==i&&42!==i)return!1;for(n=t.scanDelims(t.pos,42===i),r=0;r?@[\]^_`{|}~-])/g;function o(t,e){var r,o,i=t.posMax,s=t.pos;if(126!==t.src.charCodeAt(s))return!1;if(e)return!1;if(s+2>=i)return!1;for(t.pos=s+1;t.pos?@[\]^_`{|}~-])/g;function o(t,e){var r,o,i=t.posMax,s=t.pos;if(94!==t.src.charCodeAt(s))return!1;if(e)return!1;if(s+2>=i)return!1;for(t.pos=s+1;t.pos0?t.src.charCodeAt(e-1):-1,n=e+1<=o?t.src.charCodeAt(e+1):-1,(32===r||9===r||n>=48&&n<=57)&&(s=!1),32!==n&&9!==n||(i=!1),{can_open:i,can_close:s}}function o(t,e){let r,o,i,s,a;if("$"!==t.src[t.pos])return!1;if(s=n(t,t.pos),!s.can_open)return e||(t.pending+="$"),t.pos+=1,!0;for(r=t.pos+1,o=r;-1!==(o=t.src.indexOf("$",o));){for(a=o-1;"\\"===t.src[a];)a-=1;if((o-a)%2==1)break;o+=1}return-1===o?(e||(t.pending+="$"),t.pos=r,!0):o-r==0?(e||(t.pending+="$$"),t.pos=r+1,!0):(s=n(t,o),s.can_close?(e||(i=t.push("math_inline","math",0),i.markup="$",i.content=t.src.slice(r,o)),t.pos=o+1,!0):(e||(t.pending+="$"),t.pos=r,!0))}function i(t,e,r,n){let o,i,s,a,c,l=!1,u=t.bMarks[e]+t.tShift[e],p=t.eMarks[e];if(u+2>p)return!1;if("$$"!==t.src.slice(u,u+2))return!1;if(u+=2,o=t.src.slice(u,p),n)return!0;for("$$"===o.trim().slice(-2)&&(o=o.trim().slice(0,-2),l=!0),s=e;!l&&(s++,!(s>=r))&&(u=t.bMarks[s]+t.tShift[s],p=t.eMarks[s],!(u{(e=e||{}).server=e.server||"https://math.now.sh",e.style=e.style||"";const r=t=>encodeURIComponent(t).replace("(","%28").replace(")","%29");t.inline.ruler.after("escape","math_inline",o),t.block.ruler.after("blockquote","math_block",i,{alt:["paragraph","reference","blockquote","list"]}),t.renderer.rules.math_inline=(t,n)=>(t=>{try{return``}catch(e){return console.error(e),t}})(t[n].content),t.renderer.rules.math_block=(t,n)=>(t=>{try{return`

          `}catch(e){return console.error(e),t}})(t[n].content)}},function(t,e){t.exports=flarum.core.compat["common/components/Modal"]},function(t,e,r){"use strict";var n=r(4),o=r(63),i=r(67),s=r(68),a=r(76),c=r(90),l=r(103),u=r(41),p=r(105),h={default:r(108),zero:r(109),commonmark:r(110)},f=/^(vbscript|javascript|file|data):/,d=/^data:image\/(gif|png|jpeg|webp);/;function m(t){var e=t.trim().toLowerCase();return!f.test(e)||!!d.test(e)}var v=["http:","https:","mailto:"];function g(t){var e=u.parse(t,!0);if(e.hostname&&(!e.protocol||v.indexOf(e.protocol)>=0))try{e.hostname=p.toASCII(e.hostname)}catch(t){}return u.encode(u.format(e))}function y(t){var e=u.parse(t,!0);if(e.hostname&&(!e.protocol||v.indexOf(e.protocol)>=0))try{e.hostname=p.toUnicode(e.hostname)}catch(t){}return u.decode(u.format(e))}function b(t,e){if(!(this instanceof b))return new b(t,e);e||n.isString(t)||(e=t||{},t="default"),this.inline=new c,this.block=new a,this.core=new s,this.renderer=new i,this.linkify=new l,this.validateLink=m,this.normalizeLink=g,this.normalizeLinkText=y,this.utils=n,this.helpers=n.assign({},o),this.options={},this.configure(t),e&&this.set(e)}b.prototype.set=function(t){return n.assign(this.options,t),this},b.prototype.configure=function(t){var e,r=this;if(n.isString(t)&&!(t=h[e=t]))throw new Error('Wrong `markdown-it` preset "'+e+'", check name');if(!t)throw new Error("Wrong `markdown-it` preset, can't be empty");return t.options&&r.set(t.options),t.components&&Object.keys(t.components).forEach((function(e){t.components[e].rules&&r[e].ruler.enableOnly(t.components[e].rules),t.components[e].rules2&&r[e].ruler2.enableOnly(t.components[e].rules2)})),this},b.prototype.enable=function(t,e){var r=[];Array.isArray(t)||(t=[t]),["core","block","inline"].forEach((function(e){r=r.concat(this[e].ruler.enable(t,!0))}),this),r=r.concat(this.inline.ruler2.enable(t,!0));var n=t.filter((function(t){return r.indexOf(t)<0}));if(n.length&&!e)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+n);return this},b.prototype.disable=function(t,e){var r=[];Array.isArray(t)||(t=[t]),["core","block","inline"].forEach((function(e){r=r.concat(this[e].ruler.disable(t,!0))}),this),r=r.concat(this.inline.ruler2.disable(t,!0));var n=t.filter((function(t){return r.indexOf(t)<0}));if(n.length&&!e)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+n);return this},b.prototype.use=function(t){var e=[this].concat(Array.prototype.slice.call(arguments,1));return t.apply(t,e),this},b.prototype.parse=function(t,e){if("string"!=typeof t)throw new Error("Input data should be a String");var r=new this.core.State(t,this,e);return this.core.process(r),r.tokens},b.prototype.render=function(t,e){return e=e||{},this.renderer.render(this.parse(t,e),this.options,e)},b.prototype.parseInline=function(t,e){var r=new this.core.State(t,this,e);return r.inlineMode=!0,this.core.process(r),r.tokens},b.prototype.renderInline=function(t,e){return e=e||{},this.renderer.render(this.parseInline(t,e),this.options,e)},t.exports=b},function(t){t.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"\'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}')},function(t,e,r){"use strict";var n={};function o(t,e,r){var i,s,a,c,l,u="";for("string"!=typeof e&&(r=e,e=o.defaultChars),void 0===r&&(r=!0),l=function(t){var e,r,o=n[t];if(o)return o;for(o=n[t]=[],e=0;e<128;e++)r=String.fromCharCode(e),/^[0-9a-z]$/i.test(r)?o.push(r):o.push("%"+("0"+e.toString(16).toUpperCase()).slice(-2));for(e=0;e=55296&&a<=57343){if(a>=55296&&a<=56319&&i+1=56320&&c<=57343){u+=encodeURIComponent(t[i]+t[i+1]),i++;continue}u+="%EF%BF%BD"}else u+=encodeURIComponent(t[i]);return u}o.defaultChars=";/?:@&=+$,-_.!~*'()#",o.componentChars="-_.!~*'()",t.exports=o},function(t,e,r){"use strict";var n={};function o(t,e){var r;return"string"!=typeof e&&(e=o.defaultChars),r=function(t){var e,r,o=n[t];if(o)return o;for(o=n[t]=[],e=0;e<128;e++)r=String.fromCharCode(e),o.push(r);for(e=0;e=55296&&c<=57343?"���":String.fromCharCode(c),e+=6):240==(248&o)&&e+91114111?l+="����":(c-=65536,l+=String.fromCharCode(55296+(c>>10),56320+(1023&c))),e+=9):l+="�";return l}))}o.defaultChars=";/?:@&=+$,#",o.componentChars="",t.exports=o},function(t,e,r){"use strict";t.exports=function(t){var e="";return e+=t.protocol||"",e+=t.slashes?"//":"",e+=t.auth?t.auth+"@":"",t.hostname&&-1!==t.hostname.indexOf(":")?e+="["+t.hostname+"]":e+=t.hostname||"",e+=t.port?":"+t.port:"",e+=t.pathname||"",e+=t.search||"",e+=t.hash||""}},function(t,e,r){"use strict";function n(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var o=/^([a-z0-9.+-]+:)/i,i=/:[0-9]*$/,s=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,a=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),c=["'"].concat(a),l=["%","/","?",";","#"].concat(c),u=["/","?","#"],p=/^[+a-z0-9A-Z_-]{0,63}$/,h=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,f={javascript:!0,"javascript:":!0},d={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};n.prototype.parse=function(t,e){var r,n,i,a,c,m=t;if(m=m.trim(),!e&&1===t.split("#").length){var v=s.exec(m);if(v)return this.pathname=v[1],v[2]&&(this.search=v[2]),this}var g=o.exec(m);if(g&&(i=(g=g[0]).toLowerCase(),this.protocol=g,m=m.substr(g.length)),(e||g||m.match(/^\/\/[^@\/]+@[^@\/]+/))&&(!(c="//"===m.substr(0,2))||g&&f[g]||(m=m.substr(2),this.slashes=!0)),!f[g]&&(c||g&&!d[g])){var y,b,k=-1;for(r=0;r127?S+="x":S+=C[A];if(!S.match(p)){var M=_.slice(0,r),D=_.slice(r+1),E=C.match(h);E&&(M.push(E[1]),D.unshift(E[2])),D.length&&(m=D.join(".")+m),this.hostname=M.join(".");break}}}}this.hostname.length>255&&(this.hostname=""),x&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var T=m.indexOf("#");-1!==T&&(this.hash=m.substr(T),m=m.slice(0,T));var N=m.indexOf("?");return-1!==N&&(this.search=m.substr(N),m=m.slice(0,N)),m&&(this.pathname=m),d[i]&&this.hostname&&!this.pathname&&(this.pathname=""),this},n.prototype.parseHost=function(t){var e=i.exec(t);e&&(":"!==(e=e[0])&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)},t.exports=function(t,e){if(t&&t instanceof n)return t;var r=new n;return r.parse(t,e),r}},function(t,e,r){"use strict";e.Any=r(42),e.Cc=r(43),e.Cf=r(62),e.P=r(37),e.Z=r(44)},function(t,e){t.exports=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/},function(t,e,r){"use strict";e.parseLinkLabel=r(64),e.parseLinkDestination=r(65),e.parseLinkTitle=r(66)},function(t,e,r){"use strict";t.exports=function(t,e,r){var n,o,i,s,a=-1,c=t.posMax,l=t.pos;for(t.pos=e+1,n=1;t.pos=r)return c;if(34!==(i=t.charCodeAt(e))&&39!==i&&40!==i)return c;for(e++,40===i&&(i=41);e"+i(t[e].content)+""},s.code_block=function(t,e,r,n,o){var s=t[e];return""+i(t[e].content)+"\n"},s.fence=function(t,e,r,n,s){var a,c,l,u,p=t[e],h=p.info?o(p.info).trim():"",f="";return h&&(f=h.split(/\s+/g)[0]),0===(a=r.highlight&&r.highlight(p.content,f)||i(p.content)).indexOf(""+a+"\n"):"
          "+a+"
          \n"},s.image=function(t,e,r,n,o){var i=t[e];return i.attrs[i.attrIndex("alt")][1]=o.renderInlineAsText(i.children,r,n),o.renderToken(t,e,r)},s.hardbreak=function(t,e,r){return r.xhtmlOut?"
          \n":"
          \n"},s.softbreak=function(t,e,r){return r.breaks?r.xhtmlOut?"
          \n":"
          \n":"\n"},s.text=function(t,e){return i(t[e].content)},s.html_block=function(t,e){return t[e].content},s.html_inline=function(t,e){return t[e].content},a.prototype.renderAttrs=function(t){var e,r,n;if(!t.attrs)return"";for(n="",e=0,r=t.attrs.length;e\n":">")},a.prototype.renderInline=function(t,e,r){for(var n,o="",i=this.rules,s=0,a=t.length;s/i.test(t)}t.exports=function(t){var e,r,i,s,a,c,l,u,p,h,f,d,m,v,g,y,b,k,w=t.tokens;if(t.md.options.linkify)for(r=0,i=w.length;r=0;e--)if("link_close"!==(c=s[e]).type){if("html_inline"===c.type&&(k=c.content,/^\s]/i.test(k)&&m>0&&m--,o(c.content)&&m++),!(m>0)&&"text"===c.type&&t.md.linkify.test(c.content)){for(p=c.content,b=t.md.linkify.match(p),l=[],d=c.level,f=0,u=0;uf&&((a=new t.Token("text","",0)).content=p.slice(f,h),a.level=d,l.push(a)),(a=new t.Token("link_open","a",1)).attrs=[["href",g]],a.level=d++,a.markup="linkify",a.info="auto",l.push(a),(a=new t.Token("text","",0)).content=y,a.level=d,l.push(a),(a=new t.Token("link_close","a",-1)).level=--d,a.markup="linkify",a.info="auto",l.push(a),f=b[u].lastIndex);f=0;e--)"text"!==(r=t[e]).type||n||(r.content=r.content.replace(i,a)),"link_open"===r.type&&"auto"===r.info&&n--,"link_close"===r.type&&"auto"===r.info&&n++}function l(t){var e,r,o=0;for(e=t.length-1;e>=0;e--)"text"!==(r=t[e]).type||o||n.test(r.content)&&(r.content=r.content.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1—$2").replace(/(^|\s)--(\s|$)/gm,"$1–$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1–$2")),"link_open"===r.type&&"auto"===r.info&&o--,"link_close"===r.type&&"auto"===r.info&&o++}t.exports=function(t){var e;if(t.md.options.typographer)for(e=t.tokens.length-1;e>=0;e--)"inline"===t.tokens[e].type&&(o.test(t.tokens[e].content)&&c(t.tokens[e].children),n.test(t.tokens[e].content)&&l(t.tokens[e].children))}},function(t,e,r){"use strict";var n=r(4).isWhiteSpace,o=r(4).isPunctChar,i=r(4).isMdAsciiPunct,s=/['"]/,a=/['"]/g;function c(t,e,r){return t.substr(0,e)+r+t.substr(e+1)}function l(t,e){var r,s,l,u,p,h,f,d,m,v,g,y,b,k,w,x,_,C,S,A,O;for(S=[],r=0;r=0&&!(S[_].level<=f);_--);if(S.length=_+1,"text"===s.type){p=0,h=(l=s.content).length;t:for(;p=0)m=l.charCodeAt(u.index-1);else for(_=r-1;_>=0&&("softbreak"!==t[_].type&&"hardbreak"!==t[_].type);_--)if("text"===t[_].type){m=t[_].content.charCodeAt(t[_].content.length-1);break}if(v=32,p=48&&m<=57&&(x=w=!1),w&&x&&(w=!1,x=y),w||x){if(x)for(_=S.length-1;_>=0&&(d=S[_],!(S[_].level=0;e--)"inline"===t.tokens[e].type&&s.test(t.tokens[e].content)&&l(t.tokens[e].children,t)}},function(t,e,r){"use strict";var n=r(39);function o(t,e,r){this.src=t,this.env=r,this.tokens=[],this.inlineMode=!1,this.md=e}o.prototype.Token=n,t.exports=o},function(t,e,r){"use strict";var n=r(38),o=[["table",r(77),["paragraph","reference"]],["code",r(78)],["fence",r(79),["paragraph","reference","blockquote","list"]],["blockquote",r(80),["paragraph","reference","blockquote","list"]],["hr",r(81),["paragraph","reference","blockquote","list"]],["list",r(82),["paragraph","reference","blockquote"]],["reference",r(83)],["heading",r(84),["paragraph","reference","blockquote"]],["lheading",r(85)],["html_block",r(86),["paragraph","reference","blockquote"]],["paragraph",r(88)]];function i(){this.ruler=new n;for(var t=0;t=r))&&!(t.sCount[s]=c){t.line=r;break}for(n=0;nr)return!1;if(p=e+1,t.sCount[p]=4)return!1;if((l=t.bMarks[p]+t.tShift[p])>=t.eMarks[p])return!1;if(124!==(a=t.src.charCodeAt(l++))&&45!==a&&58!==a)return!1;for(;l=4)return!1;if((f=(h=i(c.replace(/^\||\|$/g,""))).length)>m.length)return!1;if(s)return!0;for((d=t.push("table_open","table",1)).map=g=[e,0],(d=t.push("thead_open","thead",1)).map=[e,e+1],(d=t.push("tr_open","tr",1)).map=[e,e+1],u=0;u=4);p++){for(h=i(c.replace(/^\||\|$/g,"")),d=t.push("tr_open","tr",1),u=0;u=4))break;o=++n}return t.line=o,(i=t.push("code_block","code",0)).content=t.getLines(e,o,4+t.blkIndent,!0),i.map=[e,t.line],!0}},function(t,e,r){"use strict";t.exports=function(t,e,r,n){var o,i,s,a,c,l,u,p=!1,h=t.bMarks[e]+t.tShift[e],f=t.eMarks[e];if(t.sCount[e]-t.blkIndent>=4)return!1;if(h+3>f)return!1;if(126!==(o=t.src.charCodeAt(h))&&96!==o)return!1;if(c=h,(i=(h=t.skipChars(h,o))-c)<3)return!1;if(u=t.src.slice(c,h),s=t.src.slice(h,f),96===o&&s.indexOf(String.fromCharCode(o))>=0)return!1;if(n)return!0;for(a=e;!(++a>=r)&&!((h=c=t.bMarks[a]+t.tShift[a])<(f=t.eMarks[a])&&t.sCount[a]=4||(h=t.skipChars(h,o))-c=4)return!1;if(62!==t.src.charCodeAt(A++))return!1;if(o)return!0;for(c=f=t.sCount[e]+A-(t.bMarks[e]+t.tShift[e]),32===t.src.charCodeAt(A)?(A++,c++,f++,i=!1,k=!0):9===t.src.charCodeAt(A)?(k=!0,(t.bsCount[e]+f)%4==3?(A++,c++,f++,i=!1):i=!0):k=!1,d=[t.bMarks[e]],t.bMarks[e]=A;A=O,y=[t.sCount[e]],t.sCount[e]=f-c,b=[t.tShift[e]],t.tShift[e]=A-t.bMarks[e],x=t.md.block.ruler.getRules("blockquote"),g=t.parentType,t.parentType="blockquote",C=!1,h=e+1;h=(O=t.eMarks[h])));h++)if(62!==t.src.charCodeAt(A++)||C){if(u)break;for(w=!1,a=0,l=x.length;a=O,m.push(t.bsCount[h]),t.bsCount[h]=t.sCount[h]+1+(k?1:0),y.push(t.sCount[h]),t.sCount[h]=f-c,b.push(t.tShift[h]),t.tShift[h]=A-t.bMarks[h]}for(v=t.blkIndent,t.blkIndent=0,(_=t.push("blockquote_open","blockquote",1)).markup=">",_.map=p=[e,0],t.md.block.tokenize(t,e,h),(_=t.push("blockquote_close","blockquote",-1)).markup=">",t.lineMax=S,t.parentType=g,p[1]=t.line,a=0;a=4)return!1;if(42!==(i=t.src.charCodeAt(l++))&&45!==i&&95!==i)return!1;for(s=1;l=s)return-1;if((r=t.src.charCodeAt(i++))<48||r>57)return-1;for(;;){if(i>=s)return-1;if(!((r=t.src.charCodeAt(i++))>=48&&r<=57)){if(41===r||46===r)break;return-1}if(i-o>=10)return-1}return i=4)return!1;if(t.listIndent>=0&&t.sCount[e]-t.listIndent>=4&&t.sCount[e]=t.blkIndent&&(z=!0),(M=i(t,e))>=0){if(h=!0,E=t.bMarks[e]+t.tShift[e],y=Number(t.src.substr(E,M-E-1)),z&&1!==y)return!1}else{if(!((M=o(t,e))>=0))return!1;h=!1}if(z&&t.skipSpaces(M)>=t.eMarks[e])return!1;if(g=t.src.charCodeAt(M-1),n)return!0;for(v=t.tokens.length,h?(I=t.push("ordered_list_open","ol",1),1!==y&&(I.attrs=[["start",y]])):I=t.push("bullet_list_open","ul",1),I.map=m=[e,0],I.markup=String.fromCharCode(g),k=e,D=!1,N=t.md.block.ruler.getRules("list"),_=t.parentType,t.parentType="list";k=b?1:w-p)>4&&(u=1),l=p+u,(I=t.push("list_item_open","li",1)).markup=String.fromCharCode(g),I.map=f=[e,0],A=t.tight,S=t.tShift[e],C=t.sCount[e],x=t.listIndent,t.listIndent=t.blkIndent,t.blkIndent=l,t.tight=!0,t.tShift[e]=a-t.bMarks[e],t.sCount[e]=w,a>=b&&t.isEmpty(e+1)?t.line=Math.min(t.line+2,r):t.md.block.tokenize(t,e,r,!0),t.tight&&!D||(R=!1),D=t.line-e>1&&t.isEmpty(t.line-1),t.blkIndent=t.listIndent,t.listIndent=x,t.tShift[e]=S,t.sCount[e]=C,t.tight=A,(I=t.push("list_item_close","li",-1)).markup=String.fromCharCode(g),k=e=t.line,f[1]=k,a=t.bMarks[e],k>=r)break;if(t.sCount[k]=4)break;for(T=!1,c=0,d=N.length;c=4)return!1;if(91!==t.src.charCodeAt(_))return!1;for(;++_3||t.sCount[S]<0)){for(b=!1,p=0,h=k.length;p=4)return!1;if(35!==(i=t.src.charCodeAt(l))||l>=u)return!1;for(s=1,i=t.src.charCodeAt(++l);35===i&&l6||ll&&n(t.src.charCodeAt(a-1))&&(u=a),t.line=e+1,(c=t.push("heading_open","h"+String(s),1)).markup="########".slice(0,s),c.map=[e,t.line],(c=t.push("inline","",0)).content=t.src.slice(l,u).trim(),c.map=[e,t.line],c.children=[],(c=t.push("heading_close","h"+String(s),-1)).markup="########".slice(0,s)),!0)}},function(t,e,r){"use strict";t.exports=function(t,e,r){var n,o,i,s,a,c,l,u,p,h,f=e+1,d=t.md.block.ruler.getRules("paragraph");if(t.sCount[e]-t.blkIndent>=4)return!1;for(h=t.parentType,t.parentType="paragraph";f3)){if(t.sCount[f]>=t.blkIndent&&(c=t.bMarks[f]+t.tShift[f])<(l=t.eMarks[f])&&(45===(p=t.src.charCodeAt(c))||61===p)&&(c=t.skipChars(c,p),(c=t.skipSpaces(c))>=l)){u=61===p?1:2;break}if(!(t.sCount[f]<0)){for(o=!1,i=0,s=d.length;i|$))/i,/<\/(script|pre|style)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(o.source+"\\s*$"),/^$/,!1]];t.exports=function(t,e,r,n){var o,s,a,c,l=t.bMarks[e]+t.tShift[e],u=t.eMarks[e];if(t.sCount[e]-t.blkIndent>=4)return!1;if(!t.md.options.html)return!1;if(60!==t.src.charCodeAt(l))return!1;for(c=t.src.slice(l,u),o=0;o3||t.sCount[c]<0)){for(n=!1,o=0,i=l.length;o0&&this.level++,this.tokens.push(o),o},i.prototype.isEmpty=function(t){return this.bMarks[t]+this.tShift[t]>=this.eMarks[t]},i.prototype.skipEmptyLines=function(t){for(var e=this.lineMax;te;)if(!o(this.src.charCodeAt(--t)))return t+1;return t},i.prototype.skipChars=function(t,e){for(var r=this.src.length;tr;)if(e!==this.src.charCodeAt(--t))return t+1;return t},i.prototype.getLines=function(t,e,r,n){var i,s,a,c,l,u,p,h=t;if(t>=e)return"";for(u=new Array(e-t),i=0;hr?new Array(s-r+1).join(" ")+this.src.slice(c,l):this.src.slice(c,l)}return u.join("")},i.prototype.Token=n,t.exports=i},function(t,e,r){"use strict";var n=r(38),o=[["text",r(91)],["newline",r(92)],["escape",r(93)],["backticks",r(94)],["strikethrough",r(46).tokenize],["emphasis",r(47).tokenize],["link",r(95)],["image",r(96)],["autolink",r(97)],["html_inline",r(98)],["entity",r(99)]],i=[["balance_pairs",r(100)],["strikethrough",r(46).postProcess],["emphasis",r(47).postProcess],["text_collapse",r(101)]];function s(){var t;for(this.ruler=new n,t=0;t=i)break}else t.pending+=t.src[t.pos++]}t.pending&&t.pushPending()},s.prototype.parse=function(t,e,r,n){var o,i,s,a=new this.State(t,e,r,n);for(this.tokenize(a),s=(i=this.ruler2.getRules("")).length,o=0;o=0&&32===t.pending.charCodeAt(r)?r>=1&&32===t.pending.charCodeAt(r-1)?(t.pending=t.pending.replace(/ +$/,""),t.push("hardbreak","br",0)):(t.pending=t.pending.slice(0,-1),t.push("softbreak","br",0)):t.push("softbreak","br",0)),i++;i?@[]^_`{|}~-".split("").forEach((function(t){o[t.charCodeAt(0)]=1})),t.exports=function(t,e){var r,i=t.pos,s=t.posMax;if(92!==t.src.charCodeAt(i))return!1;if(++i=m)return!1;for(v=l,(u=t.md.helpers.parseLinkDestination(t.src,l,t.posMax)).ok&&(f=t.md.normalizeLink(u.str),t.md.validateLink(f)?l=u.pos:f=""),v=l;l=m||41!==t.src.charCodeAt(l))&&(g=!0),l++}if(g){if(void 0===t.env.references)return!1;if(l=0?s=t.src.slice(v,l++):l=a+1):l=a+1,s||(s=t.src.slice(c,a)),!(p=t.env.references[n(s)]))return t.pos=d,!1;f=p.href,h=p.title}return e||(t.pos=c,t.posMax=a,t.push("link_open","a",1).attrs=r=[["href",f]],h&&r.push(["title",h]),t.md.inline.tokenize(t),t.push("link_close","a",-1)),t.pos=l,t.posMax=m,!0}},function(t,e,r){"use strict";var n=r(4).normalizeReference,o=r(4).isSpace;t.exports=function(t,e){var r,i,s,a,c,l,u,p,h,f,d,m,v,g="",y=t.pos,b=t.posMax;if(33!==t.src.charCodeAt(t.pos))return!1;if(91!==t.src.charCodeAt(t.pos+1))return!1;if(l=t.pos+2,(c=t.md.helpers.parseLinkLabel(t,t.pos+1,!1))<0)return!1;if((u=c+1)=b)return!1;for(v=u,(h=t.md.helpers.parseLinkDestination(t.src,u,t.posMax)).ok&&(g=t.md.normalizeLink(h.str),t.md.validateLink(g)?u=h.pos:g=""),v=u;u=b||41!==t.src.charCodeAt(u))return t.pos=y,!1;u++}else{if(void 0===t.env.references)return!1;if(u=0?a=t.src.slice(v,u++):u=c+1):u=c+1,a||(a=t.src.slice(l,c)),!(p=t.env.references[n(a)]))return t.pos=y,!1;g=p.href,f=p.title}return e||(s=t.src.slice(l,c),t.md.inline.parse(s,t.md,t.env,m=[]),(d=t.push("image","img",0)).attrs=r=[["src",g],["alt",""]],d.children=m,d.content=s,f&&r.push(["title",f])),t.pos=u,t.posMax=b,!0}},function(t,e,r){"use strict";var n=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,o=/^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>/;t.exports=function(t,e){var r,i,s,a,c,l,u=t.pos;return 60===t.src.charCodeAt(u)&&(!((r=t.src.slice(u)).indexOf(">")<0)&&(o.test(r)?(a=(i=r.match(o))[0].slice(1,-1),c=t.md.normalizeLink(a),!!t.md.validateLink(c)&&(e||((l=t.push("link_open","a",1)).attrs=[["href",c]],l.markup="autolink",l.info="auto",(l=t.push("text","",0)).content=t.md.normalizeLinkText(a),(l=t.push("link_close","a",-1)).markup="autolink",l.info="auto"),t.pos+=i[0].length,!0)):!!n.test(r)&&(a=(s=r.match(n))[0].slice(1,-1),c=t.md.normalizeLink("mailto:"+a),!!t.md.validateLink(c)&&(e||((l=t.push("link_open","a",1)).attrs=[["href",c]],l.markup="autolink",l.info="auto",(l=t.push("text","",0)).content=t.md.normalizeLinkText(a),(l=t.push("link_close","a",-1)).markup="autolink",l.info="auto"),t.pos+=s[0].length,!0))))}},function(t,e,r){"use strict";var n=r(45).HTML_TAG_RE;t.exports=function(t,e){var r,o,i,s=t.pos;return!!t.md.options.html&&(i=t.posMax,!(60!==t.src.charCodeAt(s)||s+2>=i)&&(!(33!==(r=t.src.charCodeAt(s+1))&&63!==r&&47!==r&&!function(t){var e=32|t;return e>=97&&e<=122}(r))&&(!!(o=t.src.slice(s).match(n))&&(e||(t.push("html_inline","",0).content=t.src.slice(s,s+o[0].length)),t.pos+=o[0].length,!0))))}},function(t,e,r){"use strict";var n=r(40),o=r(4).has,i=r(4).isValidEntityCode,s=r(4).fromCodePoint,a=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,c=/^&([a-z][a-z0-9]{1,31});/i;t.exports=function(t,e){var r,l,u=t.pos,p=t.posMax;if(38!==t.src.charCodeAt(u))return!1;if(u+1s;n-=i.jump+1)if((i=e[n]).marker===o.marker&&(-1===a&&(a=n),i.open&&i.end<0&&i.level===o.level&&(c=!1,(i.close||o.open)&&(i.length+o.length)%3==0&&(i.length%3==0&&o.length%3==0||(c=!0)),!c))){l=n>0&&!e[n-1].open?e[n-1].jump+1:0,o.jump=r-n+l,o.open=!1,i.end=r,i.jump=l,i.close=!1,a=-1;break}-1!==a&&(u[o.marker][(o.length||0)%3]=a)}}t.exports=function(t){var e,r=t.tokens_meta,o=t.tokens_meta.length;for(n(0,t.delimiters),e=0;e0&&n++,"text"===o[e].type&&e+10&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],i={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(o),this.tokens_meta.push(i),o},a.prototype.scanDelims=function(t,e){var r,n,a,c,l,u,p,h,f,d=t,m=!0,v=!0,g=this.posMax,y=this.src.charCodeAt(t);for(r=t>0?this.src.charCodeAt(t-1):32;d=3&&":"===t[e-3]||e>=3&&"/"===t[e-3]?0:n.match(r.re.no_http)[0].length:0}},"mailto:":{validate:function(t,e,r){var n=t.slice(e);return r.re.mailto||(r.re.mailto=new RegExp("^"+r.re.src_email_name+"@"+r.re.src_host_strict,"i")),r.re.mailto.test(n)?n.match(r.re.mailto)[0].length:0}}},l="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф".split("|");function u(t){var e=t.re=r(104)(t.__opts__),n=t.__tlds__.slice();function a(t){return t.replace("%TLDS%",e.src_tlds)}t.onCompile(),t.__tlds_replaced__||n.push("a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]"),n.push(e.src_xn),e.src_tlds=n.join("|"),e.email_fuzzy=RegExp(a(e.tpl_email_fuzzy),"i"),e.link_fuzzy=RegExp(a(e.tpl_link_fuzzy),"i"),e.link_no_ip_fuzzy=RegExp(a(e.tpl_link_no_ip_fuzzy),"i"),e.host_fuzzy_test=RegExp(a(e.tpl_host_fuzzy_test),"i");var c=[];function l(t,e){throw new Error('(LinkifyIt) Invalid schema "'+t+'": '+e)}t.__compiled__={},Object.keys(t.__schemas__).forEach((function(e){var r=t.__schemas__[e];if(null!==r){var n={validate:null,link:null};if(t.__compiled__[e]=n,"[object Object]"===o(r))return!function(t){return"[object RegExp]"===o(t)}(r.validate)?i(r.validate)?n.validate=r.validate:l(e,r):n.validate=function(t){return function(e,r){var n=e.slice(r);return t.test(n)?n.match(t)[0].length:0}}(r.validate),void(i(r.normalize)?n.normalize=r.normalize:r.normalize?l(e,r):n.normalize=function(t,e){e.normalize(t)});!function(t){return"[object String]"===o(t)}(r)?l(e,r):c.push(e)}})),c.forEach((function(e){t.__compiled__[t.__schemas__[e]]&&(t.__compiled__[e].validate=t.__compiled__[t.__schemas__[e]].validate,t.__compiled__[e].normalize=t.__compiled__[t.__schemas__[e]].normalize)})),t.__compiled__[""]={validate:null,normalize:function(t,e){e.normalize(t)}};var u=Object.keys(t.__compiled__).filter((function(e){return e.length>0&&t.__compiled__[e]})).map(s).join("|");t.re.schema_test=RegExp("(^|(?!_)(?:[><|]|"+e.src_ZPCc+"))("+u+")","i"),t.re.schema_search=RegExp("(^|(?!_)(?:[><|]|"+e.src_ZPCc+"))("+u+")","ig"),t.re.pretest=RegExp("("+t.re.schema_test.source+")|("+t.re.host_fuzzy_test.source+")|@","i"),function(t){t.__index__=-1,t.__text_cache__=""}(t)}function p(t,e){var r=t.__index__,n=t.__last_index__,o=t.__text_cache__.slice(r,n);this.schema=t.__schema__.toLowerCase(),this.index=r+e,this.lastIndex=n+e,this.raw=o,this.text=o,this.url=o}function h(t,e){var r=new p(t,e);return t.__compiled__[r.schema].normalize(r,t),r}function f(t,e){if(!(this instanceof f))return new f(t,e);var r;e||(r=t,Object.keys(r||{}).reduce((function(t,e){return t||a.hasOwnProperty(e)}),!1)&&(e=t,t={})),this.__opts__=n({},a,e),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=n({},c,t),this.__compiled__={},this.__tlds__=l,this.__tlds_replaced__=!1,this.re={},u(this)}f.prototype.add=function(t,e){return this.__schemas__[t]=e,u(this),this},f.prototype.set=function(t){return this.__opts__=n(this.__opts__,t),this},f.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;var e,r,n,o,i,s,a,c;if(this.re.schema_test.test(t))for((a=this.re.schema_search).lastIndex=0;null!==(e=a.exec(t));)if(o=this.testSchemaAt(t,e[2],a.lastIndex)){this.__schema__=e[2],this.__index__=e.index+e[1].length,this.__last_index__=e.index+e[0].length+o;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(c=t.search(this.re.host_fuzzy_test))>=0&&(this.__index__<0||c=0&&null!==(n=t.match(this.re.email_fuzzy))&&(i=n.index+n[1].length,s=n.index+n[0].length,(this.__index__<0||ithis.__last_index__)&&(this.__schema__="mailto:",this.__index__=i,this.__last_index__=s)),this.__index__>=0},f.prototype.pretest=function(t){return this.re.pretest.test(t)},f.prototype.testSchemaAt=function(t,e,r){return this.__compiled__[e.toLowerCase()]?this.__compiled__[e.toLowerCase()].validate(t,r,this):0},f.prototype.match=function(t){var e=0,r=[];this.__index__>=0&&this.__text_cache__===t&&(r.push(h(this,e)),e=this.__last_index__);for(var n=e?t.slice(e):t;this.test(n);)r.push(h(this,e)),n=n.slice(this.__last_index__),e+=this.__last_index__;return r.length?r:null},f.prototype.tlds=function(t,e){return t=Array.isArray(t)?t:[t],e?(this.__tlds__=this.__tlds__.concat(t).sort().filter((function(t,e,r){return t!==r[e-1]})).reverse(),u(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,u(this),this)},f.prototype.normalize=function(t){t.schema||(t.url="http://"+t.url),"mailto:"!==t.schema||/^mailto:/i.test(t.url)||(t.url="mailto:"+t.url)},f.prototype.onCompile=function(){},t.exports=f},function(t,e,r){"use strict";t.exports=function(t){var e={};e.src_Any=r(42).source,e.src_Cc=r(43).source,e.src_Z=r(44).source,e.src_P=r(37).source,e.src_ZPCc=[e.src_Z,e.src_P,e.src_Cc].join("|"),e.src_ZCc=[e.src_Z,e.src_Cc].join("|");return e.src_pseudo_letter="(?:(?![><|]|"+e.src_ZPCc+")"+e.src_Any+")",e.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",e.src_auth="(?:(?:(?!"+e.src_ZCc+"|[@/\\[\\]()]).)+@)?",e.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",e.src_host_terminator="(?=$|[><|]|"+e.src_ZPCc+")(?!-|_|:\\d|\\.-|\\.(?!$|"+e.src_ZPCc+"))",e.src_path="(?:[/?#](?:(?!"+e.src_ZCc+"|[><|]|[()[\\]{}.,\"'?!\\-]).|\\[(?:(?!"+e.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+e.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+e.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+e.src_ZCc+'|["]).)+\\"|\\\'(?:(?!'+e.src_ZCc+"|[']).)+\\'|\\'(?="+e.src_pseudo_letter+"|[-]).|\\.{2,4}[a-zA-Z0-9%/]|\\.(?!"+e.src_ZCc+"|[.]).|"+(t&&t["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+"\\,(?!"+e.src_ZCc+").|\\!(?!"+e.src_ZCc+"|[!]).|\\?(?!"+e.src_ZCc+"|[?]).)+|\\/)?",e.src_email_name='[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*',e.src_xn="xn--[a-z0-9\\-]{1,59}",e.src_domain_root="(?:"+e.src_xn+"|"+e.src_pseudo_letter+"{1,63})",e.src_domain="(?:"+e.src_xn+"|(?:"+e.src_pseudo_letter+")|(?:"+e.src_pseudo_letter+"(?:-|"+e.src_pseudo_letter+"){0,61}"+e.src_pseudo_letter+"))",e.src_host="(?:(?:(?:(?:"+e.src_domain+")\\.)*"+e.src_domain+"))",e.tpl_host_fuzzy="(?:"+e.src_ip4+"|(?:(?:(?:"+e.src_domain+")\\.)+(?:%TLDS%)))",e.tpl_host_no_ip_fuzzy="(?:(?:(?:"+e.src_domain+")\\.)+(?:%TLDS%))",e.src_host_strict=e.src_host+e.src_host_terminator,e.tpl_host_fuzzy_strict=e.tpl_host_fuzzy+e.src_host_terminator,e.src_host_port_strict=e.src_host+e.src_port+e.src_host_terminator,e.tpl_host_port_fuzzy_strict=e.tpl_host_fuzzy+e.src_port+e.src_host_terminator,e.tpl_host_port_no_ip_fuzzy_strict=e.tpl_host_no_ip_fuzzy+e.src_port+e.src_host_terminator,e.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+e.src_ZPCc+"|>|$))",e.tpl_email_fuzzy='(^|[><|]|"|\\(|'+e.src_ZCc+")("+e.src_email_name+"@"+e.tpl_host_fuzzy_strict+")",e.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+e.src_ZPCc+"))((?![$+<=>^`||])"+e.tpl_host_port_fuzzy_strict+e.src_path+")",e.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+e.src_ZPCc+"))((?![$+<=>^`||])"+e.tpl_host_port_no_ip_fuzzy_strict+e.src_path+")",e}},function(t,e,r){(function(t,n){var o;/*! https://mths.be/punycode v1.4.1 by @mathias */!function(i){e&&e.nodeType,t&&t.nodeType;var s="object"==typeof n&&n;s.global!==s&&s.window!==s&&s.self;var a,c=2147483647,l=/^xn--/,u=/[^\x20-\x7E]/,p=/[\x2E\u3002\uFF0E\uFF61]/g,h={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},f=Math.floor,d=String.fromCharCode;function m(t){throw new RangeError(h[t])}function v(t,e){for(var r=t.length,n=[];r--;)n[r]=e(t[r]);return n}function g(t,e){var r=t.split("@"),n="";return r.length>1&&(n=r[0]+"@",t=r[1]),n+v((t=t.replace(p,".")).split("."),e).join(".")}function y(t){for(var e,r,n=[],o=0,i=t.length;o=55296&&e<=56319&&o65535&&(e+=d((t-=65536)>>>10&1023|55296),t=56320|1023&t),e+=d(t)})).join("")}function k(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function w(t,e,r){var n=0;for(t=r?f(t/700):t>>1,t+=f(t/e);t>455;n+=36)t=f(t/35);return f(n+36*t/(t+38))}function x(t){var e,r,n,o,i,s,a,l,u,p,h,d=[],v=t.length,g=0,y=128,k=72;for((r=t.lastIndexOf("-"))<0&&(r=0),n=0;n=128&&m("not-basic"),d.push(t.charCodeAt(n));for(o=r>0?r+1:0;o=v&&m("invalid-input"),((l=(h=t.charCodeAt(o++))-48<10?h-22:h-65<26?h-65:h-97<26?h-97:36)>=36||l>f((c-g)/s))&&m("overflow"),g+=l*s,!(l<(u=a<=k?1:a>=k+26?26:a-k));a+=36)s>f(c/(p=36-u))&&m("overflow"),s*=p;k=w(g-i,e=d.length+1,0==i),f(g/e)>c-y&&m("overflow"),y+=f(g/e),g%=e,d.splice(g++,0,y)}return b(d)}function _(t){var e,r,n,o,i,s,a,l,u,p,h,v,g,b,x,_=[];for(v=(t=y(t)).length,e=128,r=0,i=72,s=0;s=e&&hf((c-r)/(g=n+1))&&m("overflow"),r+=(a-e)*g,e=a,s=0;sc&&m("overflow"),h==e){for(l=r,u=36;!(l<(p=u<=i?1:u>=i+26?26:u-i));u+=36)x=l-p,b=36-p,_.push(d(k(p+x%b,0))),l=f(x/b);_.push(d(k(l,0))),i=w(r,g,n==o),r=0,++n}++r,++e}return _.join("")}a={version:"1.4.1",ucs2:{decode:y,encode:b},decode:x,encode:_,toASCII:function(t){return g(t,(function(t){return u.test(t)?"xn--"+_(t):t}))},toUnicode:function(t){return g(t,(function(t){return l.test(t)?x(t.slice(4).toLowerCase()):t}))}},void 0===(o=function(){return a}.call(e,r,e,t))||(t.exports=o)}()}).call(this,r(106)(t),r(107))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(t){"object"==typeof window&&(r=window)}t.exports=r},function(t,e,r){"use strict";t.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}}},function(t,e,r){"use strict";t.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["paragraph"]},inline:{rules:["text"],rules2:["balance_pairs","text_collapse"]}}}},function(t,e,r){"use strict";t.exports={options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["blockquote","code","fence","heading","hr","html_block","lheading","list","reference","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","html_inline","image","link","newline","text"],rules2:["balance_pairs","emphasis","text_collapse"]}}}},function(t,e){t.exports=flarum.core.compat["common/components/Switch"]},function(t,e){t.exports=flarum.core.compat["forum/components/SettingsPage"]},function(t,e){t.exports=flarum.core.compat["common/components/FieldSet"]},function(t,e,r){"use strict";r.r(e),r.d(e,"components",(function(){return f.d})),r.d(e,"proseMirror",(function(){return f.g})),r.d(e,"states",(function(){return f.i})),r.d(e,"InputRule",(function(){return f.a})),r.d(e,"keymap",(function(){return f.e})),r.d(e,"liftListItem",(function(){return f.f})),r.d(e,"splitListItem",(function(){return f.h})),r.d(e,"wrapInList",(function(){return f.j})),r.d(e,"Plugin",(function(){return f.b})),r.d(e,"Selection",(function(){return f.c}));var n=r(49),o=r(23),i=r(113),s=r.n(i),a=r(111),c=r.n(a),l=r(112),u=r.n(l),p=r(16),h=r.n(p);var f=r(48);app.initializers.add("askvortsov/flarum-rich-text",(function(){Object(o.extend)(u.a.prototype,"settingsItems",(function(t){t.add("composer",s.a.component({label:app.translator.trans("askvortsov-rich-text.forum.settings.composer_heading"),className:"Settings-composer"},this.composerItems().toArray()))})),u.a.prototype.composerItems=function(){var t=this,e=new h.a;return e.add("useRichTextEditor",c.a.component({state:this.user.preferences().useRichTextEditor,onchange:function(e){t.useRichTextEditorLoading=!0,t.user.savePreferences({useRichTextEditor:e}).then((function(){t.useRichTextEditorLoading=!1,m.redraw()}))},loading:this.useRichTextEditorLoading},app.translator.trans("askvortsov-rich-text.forum.settings.use_rich_text_editor_label"))),e.add("richTextCompactParagraphs",c.a.component({state:this.user.preferences().richTextCompactParagraphs,onchange:function(e){t.richTextCompactParagraphsLoading=!0,t.user.savePreferences({richTextCompactParagraphs:e}).then((function(){t.richTextCompactParagraphsLoading=!1,m.redraw()}))},loading:this.richTextCompactParagraphsLoading},app.translator.trans("askvortsov-rich-text.forum.settings.rich_text_compact_paragraphs_label"))),e},Object(n.a)()}))}]); + */function w(t,e){var r;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(r=function(t,e){if(!t)return;if("string"==typeof t)return x(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);"Object"===r&&t.constructor&&(r=t.constructor.name);if("Map"===r||"Set"===r)return Array.from(t);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return x(t,e)}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(r=t[Symbol.iterator]()).next.bind(r)}function x(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(r=t[Symbol.iterator]()).next.bind(r)}function A(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r=0;r--)">!<"===(n=e[r]).marker&&-1!==n.end&&(o=e[n.end],(i=t.tokens[n.token]).type="spoiler_inline_open",i.nesting=1,i.markup=">!",i.content="",(i=t.tokens[o.token]).type="spoiler_inline_close",i.nesting=-1,i.markup="!<",i.content="")}var M=function(t,e){void 0===e&&(e=!1),t.inline.ruler.before("emphasis","spoiler_inline_tags",(function(t,e){if(e)return!1;var r=t.posMax,n=t.pos;return 62===t.src.charCodeAt(n)&&n+3<=r&&33===t.src.charCodeAt(n+1)?(t.scanDelims(t.pos,!0),t.push("text","",0),t.delimiters.push({marker:">!<",length:2,jump:0,token:t.tokens.length-1,end:-1,open:!0,close:!1}),t.pos+=2,!0):33===t.src.charCodeAt(n)&&n+2<=r&&60===t.src.charCodeAt(n+1)&&(t.push("text","",0),t.delimiters.push({marker:">!<",length:2,jump:0,token:t.tokens.length-1,end:-1,open:!1,close:!0}),t.pos+=2,!0)})),t.inline.ruler2.before("emphasis","spoiler_inline_bars",(function(t){if(O(t,t.delimiters),t.tokens_meta)for(var e,r=S(t.tokens_meta);!(e=r()).done;){var n=e.value;n&&n.delimiters&&O(t,n.delimiters)}}))},D=function(){function t(t){this.schema=t}var e=t.prototype;return e.tokenizerParams=function(){return{html:!1}},e.buildTokenizer=function(){return i()("commonmark",this.tokenizerParams()).enable("strikethrough").use(m).use(k).use(p.a).use(a.a).use(l.a).use(C).use(M)},e.buildTokens=function(){return Object(n.a)({},h.d.tokens,{s:{mark:"strike"},softbreak:{node:"hard_break"},spoiler:{block:"spoiler"},spoiler_inline:{mark:"spoiler_inline"},sub:{mark:"sub"},sup:{mark:"sup"},math_block:{block:"math_block",noCloseToken:!0},math_inline:{mark:"math_inline",noCloseToken:!0}})},e.build=function(){return new h.a(this.schema,this.buildTokenizer(),this.buildTokens())},t}()},function(t,e,r){"use strict";r.d(e,"a",(function(){return C}));var n=r(6),o=r(2),i=r(29),s=r.n(i),a=r(16),c=r.n(a),l=r(10),u=r(14),p=r(30),h=r(31),f=r(36),d=r(24);var v=r(20),g=r.n(v),y=r(9),b=r.n(y),k=r(19),w=r.n(k),x=r(21),_=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t),e.initAttrs=function(t){t.buttonClassName="Button Button--icon Button--link Button--menuDropdown"};var r=e.prototype;return r.oninit=function(e){t.prototype.oninit.call(this,e),this.state=this.attrs.state},r.oncreate=function(e){var r=this;t.prototype.oncreate.call(this,e),this.$().on("click",(function(t){$(".App").is(".mobile-safari")&&(app.modal.show(x.a,{title:r.attrs.tooltip,vnodeContent:r.attrs.buttons.map((function(t){return t}))}),t.stopPropagation())}))},r.getButtonContent=function(t){return m(b.a,{text:this.attrs.tooltip},m("span",null,w()(this.attrs.icon)))},r.getMenu=function(t){return m("ul",{className:"Dropdown-menu dropdown-menu HiddenItemsDropdownMenu"},this.attrs.buttons)},e}(g.a),C=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.oninit=function(e){t.prototype.oninit.call(this,e),this.modifierKey=navigator.userAgent.match(/Macintosh/)?"⌘":"ctrl"},r.view=function(t){return this.attrs.state?m("div",{class:"ProseMirrorMenu"},this.items().toArray()):""},r.items=function(){var t=new c.a,e=this.attrs.state,r=this.modifierKey;return t.add("text_type",p.a.component({type:"text_type",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.text_type_tooltip"),state:e,options:[{title:"H1",type:e.getSchema().nodes.heading,attrs:{level:1},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:1})},{title:"H2",type:e.getSchema().nodes.heading,attrs:{level:2},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:2})},{title:"H3",type:e.getSchema().nodes.heading,attrs:{level:3},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:3})},{title:"H4",type:e.getSchema().nodes.heading,attrs:{level:4},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:4})},{title:"H5",type:e.getSchema().nodes.heading,attrs:{level:5},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:5})},{title:"H6",type:e.getSchema().nodes.heading,attrs:{level:6},tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.header_tooltip",{modifierKey:r,level:6})},{title:"P",type:e.getSchema().nodes.paragraph,tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.paragraph_tooltip",{modifierKey:r})}]}),100),t.add("bold",u.a.component({type:"bold",icon:"fas fa-bold",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.bold_tooltip",{modifierKey:r}),state:e,mark:e.getSchema().marks.strong}),90),t.add("italic",u.a.component({type:"italic",icon:"fas fa-italic",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.italic_tooltip",{modifierKey:r}),state:e,mark:e.getSchema().marks.em}),80),t.add("code",u.a.component({type:"code",icon:"fas fa-code",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.code_tooltip",{modifierKey:r}),state:e,mark:e.getSchema().marks.code}),70),t.add("quote",l.a.component({type:"quote",icon:"fas fa-quote-left",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.quote_tooltip",{modifierKey:r}),state:e,command:Object(o.q)(e.getSchema().nodes.blockquote)}),60),t.add("link",f.a.component({type:"link",icon:"fas fa-link",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.link_tooltip"),state:e,mark:e.getSchema().marks.link}),50),t.add("image",h.a.component({type:"image",icon:"fas fa-image",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.image_tooltip"),state:e,node:e.getSchema().nodes.image}),40),t.add("unordered_list",d.a.component({type:"unordered_list",icon:"fas fa-list-ul",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.unordered_list_tooltip",{modifierKey:r}),state:e,listType:e.getSchema().nodes.bullet_list}),30),t.add("ordered_list",d.a.component({type:"ordered_list",icon:"fas fa-list-ol",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.ordered_list_tooltip",{modifierKey:r}),state:e,listType:e.getSchema().nodes.ordered_list}),20),t.add("additional_items",_.component({type:"additional_items",icon:"fas fa-plus",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.additional_items_tooltip"),state:e,buttons:this.hiddenItems().toArray()})),t},r.hiddenItems=function(){var t,e,r=new c.a,n=this.attrs.state,i=this.modifierKey;return r.add("strike",u.a.component({type:"strike",icon:"fas fa-strikethrough",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.strike_tooltip"),state:n,mark:n.getSchema().marks.strike})),r.add("sub",u.a.component({type:"sub",icon:"fas fa-subscript",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.sub_tooltip",{modifierKey:i}),state:n,mark:n.getSchema().marks.sub})),r.add("sup",u.a.component({type:"sup",icon:"fas fa-superscript",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.sup_tooltip",{modifierKey:i}),state:n,mark:n.getSchema().marks.sup})),r.add("spoiler_inline",u.a.component({type:"spoiler_inline",icon:"fas fa-eye-slash",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.spoiler_inline_tooltip",{modifierKey:i}),state:n,mark:n.getSchema().marks.spoiler_inline})),r.add("code_block",l.a.component({type:"code_block",icon:"fas fa-terminal",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.code_block_tooltip",{modifierKey:i}),state:n,command:Object(o.l)(n.getSchema().nodes.code_block,n.getSchema().nodes.paragraph)})),r.add("spoiler_block",l.a.component({type:"spoiler_block",icon:"fas fa-caret-square-right",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.spoiler_block_tooltip",{modifierKey:i}),state:n,command:Object(o.o)(n.getSchema().nodes.spoiler)})),r.add("horizontal_rule",l.a.component({type:"horizontal_rule",icon:"fas fa-minus",tooltip:app.translator.trans("askvortsov-rich-text.lib.composer.horizontal_rule_tooltip"),state:n,command:(t=n.getSchema().nodes.horizontal_rule,function(r,n){return n(r.tr.replaceSelectionWith(t.create(e))),!0})})),r},e}(s.a)},function(t,e,r){"use strict";r.d(e,"a",(function(){return h}));var n=r(6),o=r(18),i=r.n(o),s=r(11),a=r.n(s),c=r(17),l=r.n(c),u=r(22),p=r(2);var h=function(t){function e(){return t.apply(this,arguments)||this}Object(n.a)(e,t);var r=e.prototype;return r.oninit=function(e){var r=this;t.prototype.oninit.call(this,e),this.text=l()(""),this.href=l()(""),this.title=l()(""),this.state.addItem(this.attrs.type,(function(t,e){r.command(t,e)}),this.onEditorUpdate.bind(this)),this.selectionEmpty=!0},r.fields=function(){var e=t.prototype.fields.call(this);return this.selectionEmpty&&!this.active&&e.add("text",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"text",placeholder:a()(app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.text_placeholder")),bidi:this.text,required:!0})),10),e.add("href",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"href",type:"url",placeholder:a()(app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.href_placeholder")),bidi:this.href,required:!0})),10),e.add("title",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"title",placeholder:a()(app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.title_placeholder")),bidi:this.title})),10),this.active&&e.add("remove",m(i.a,{onclick:this.remove.bind(this),className:"Button Button--danger"},app.translator.trans("askvortsov-rich-text.lib.composer.insert_link.remove_button")),-10),e},r.insert=function(t){var e,r,n,o={href:this.href(),title:this.title()};this.selectionEmpty&&!this.active?(this.command=(e=this.text(),r=this.attrs.mark,n=o,function(t,o){o(t.tr.replaceSelectionWith(t.schema.text(e,[r.create(n)]),!1))}),this.text("")):this.command=Object(p.p)(this.attrs.mark,o),this.state.run(this.attrs.type)},r.remove=function(t){$("body").trigger("click"),this.command=Object(p.h)(this.attrs.mark),this.state.run(this.attrs.type),app.composer.editor.focus()},r.onEditorUpdate=function(){this.active=!!this.state.markActive(this.attrs.mark),this.$(".Dropdown-toggle").toggleClass("active",this.active);var t=this.state.markAttrs(this.attrs.mark);this.href(t.href),this.title(t.title),this.selectionEmpty=this.state.selectionEmpty()},e}(u.a)},function(t,e){t.exports=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4E\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/},function(t,e,r){"use strict";function n(){this.__rules__=[],this.__cache__=null}n.prototype.__find__=function(t){for(var e=0;e=0&&(r=this.attrs[e][1]),r},n.prototype.attrJoin=function(t,e){var r=this.attrIndex(t);r<0?this.attrPush([t,e]):this.attrs[r][1]=this.attrs[r][1]+" "+e},t.exports=n},function(t,e,r){"use strict";t.exports=r(56)},function(t,e,r){"use strict";t.exports.encode=r(57),t.exports.decode=r(58),t.exports.format=r(59),t.exports.parse=r(60)},function(t,e){t.exports=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/},function(t,e){t.exports=/[\0-\x1F\x7F-\x9F]/},function(t,e){t.exports=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/},function(t,e,r){"use strict";var n="<[A-Za-z][A-Za-z0-9\\-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^\"'=<>`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>",o="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",i=new RegExp("^(?:"+n+"|"+o+"|\x3c!----\x3e|\x3c!--(?:-?[^>-])(?:-?[^-])*--\x3e|<[?].*?[?]>|]*>|)"),s=new RegExp("^(?:"+n+"|"+o+")");t.exports.HTML_TAG_RE=i,t.exports.HTML_OPEN_CLOSE_TAG_RE=s},function(t,e,r){"use strict";function n(t,e){var r,n,o,i,s,a=[],c=e.length;for(r=0;r=0;r--)95!==(n=e[r]).marker&&42!==n.marker||-1!==n.end&&(o=e[n.end],a=r>0&&e[r-1].end===n.end+1&&e[r-1].token===n.token-1&&e[n.end+1].token===o.token+1&&e[r-1].marker===n.marker,s=String.fromCharCode(n.marker),(i=t.tokens[n.token]).type=a?"strong_open":"em_open",i.tag=a?"strong":"em",i.nesting=1,i.markup=a?s+s:s,i.content="",(i=t.tokens[o.token]).type=a?"strong_close":"em_close",i.tag=a?"strong":"em",i.nesting=-1,i.markup=a?s+s:s,i.content="",a&&(t.tokens[e[r-1].token].content="",t.tokens[e[n.end+1].token].content="",r--))}t.exports.tokenize=function(t,e){var r,n,o=t.pos,i=t.src.charCodeAt(o);if(e)return!1;if(95!==i&&42!==i)return!1;for(n=t.scanDelims(t.pos,42===i),r=0;r?@[\]^_`{|}~-])/g;function o(t,e){var r,o,i=t.posMax,s=t.pos;if(126!==t.src.charCodeAt(s))return!1;if(e)return!1;if(s+2>=i)return!1;for(t.pos=s+1;t.pos?@[\]^_`{|}~-])/g;function o(t,e){var r,o,i=t.posMax,s=t.pos;if(94!==t.src.charCodeAt(s))return!1;if(e)return!1;if(s+2>=i)return!1;for(t.pos=s+1;t.pos0?t.src.charCodeAt(e-1):-1,n=e+1<=o?t.src.charCodeAt(e+1):-1,(32===r||9===r||n>=48&&n<=57)&&(s=!1),32!==n&&9!==n||(i=!1),{can_open:i,can_close:s}}function o(t,e){let r,o,i,s,a;if("$"!==t.src[t.pos])return!1;if(s=n(t,t.pos),!s.can_open)return e||(t.pending+="$"),t.pos+=1,!0;for(r=t.pos+1,o=r;-1!==(o=t.src.indexOf("$",o));){for(a=o-1;"\\"===t.src[a];)a-=1;if((o-a)%2==1)break;o+=1}return-1===o?(e||(t.pending+="$"),t.pos=r,!0):o-r==0?(e||(t.pending+="$$"),t.pos=r+1,!0):(s=n(t,o),s.can_close?(e||(i=t.push("math_inline","math",0),i.markup="$",i.content=t.src.slice(r,o)),t.pos=o+1,!0):(e||(t.pending+="$"),t.pos=r,!0))}function i(t,e,r,n){let o,i,s,a,c,l=!1,u=t.bMarks[e]+t.tShift[e],p=t.eMarks[e];if(u+2>p)return!1;if("$$"!==t.src.slice(u,u+2))return!1;if(u+=2,o=t.src.slice(u,p),n)return!0;for("$$"===o.trim().slice(-2)&&(o=o.trim().slice(0,-2),l=!0),s=e;!l&&(s++,!(s>=r))&&(u=t.bMarks[s]+t.tShift[s],p=t.eMarks[s],!(u{(e=e||{}).server=e.server||"https://math.now.sh",e.style=e.style||"";const r=t=>encodeURIComponent(t).replace("(","%28").replace(")","%29");t.inline.ruler.after("escape","math_inline",o),t.block.ruler.after("blockquote","math_block",i,{alt:["paragraph","reference","blockquote","list"]}),t.renderer.rules.math_inline=(t,n)=>(t=>{try{return``}catch(e){return console.error(e),t}})(t[n].content),t.renderer.rules.math_block=(t,n)=>(t=>{try{return`

          `}catch(e){return console.error(e),t}})(t[n].content)}},function(t,e){t.exports=flarum.core.compat["common/components/Modal"]},function(t,e,r){"use strict";var n=r(4),o=r(63),i=r(67),s=r(68),a=r(76),c=r(90),l=r(103),u=r(41),p=r(105),h={default:r(108),zero:r(109),commonmark:r(110)},f=/^(vbscript|javascript|file|data):/,d=/^data:image\/(gif|png|jpeg|webp);/;function m(t){var e=t.trim().toLowerCase();return!f.test(e)||!!d.test(e)}var v=["http:","https:","mailto:"];function g(t){var e=u.parse(t,!0);if(e.hostname&&(!e.protocol||v.indexOf(e.protocol)>=0))try{e.hostname=p.toASCII(e.hostname)}catch(t){}return u.encode(u.format(e))}function y(t){var e=u.parse(t,!0);if(e.hostname&&(!e.protocol||v.indexOf(e.protocol)>=0))try{e.hostname=p.toUnicode(e.hostname)}catch(t){}return u.decode(u.format(e))}function b(t,e){if(!(this instanceof b))return new b(t,e);e||n.isString(t)||(e=t||{},t="default"),this.inline=new c,this.block=new a,this.core=new s,this.renderer=new i,this.linkify=new l,this.validateLink=m,this.normalizeLink=g,this.normalizeLinkText=y,this.utils=n,this.helpers=n.assign({},o),this.options={},this.configure(t),e&&this.set(e)}b.prototype.set=function(t){return n.assign(this.options,t),this},b.prototype.configure=function(t){var e,r=this;if(n.isString(t)&&!(t=h[e=t]))throw new Error('Wrong `markdown-it` preset "'+e+'", check name');if(!t)throw new Error("Wrong `markdown-it` preset, can't be empty");return t.options&&r.set(t.options),t.components&&Object.keys(t.components).forEach((function(e){t.components[e].rules&&r[e].ruler.enableOnly(t.components[e].rules),t.components[e].rules2&&r[e].ruler2.enableOnly(t.components[e].rules2)})),this},b.prototype.enable=function(t,e){var r=[];Array.isArray(t)||(t=[t]),["core","block","inline"].forEach((function(e){r=r.concat(this[e].ruler.enable(t,!0))}),this),r=r.concat(this.inline.ruler2.enable(t,!0));var n=t.filter((function(t){return r.indexOf(t)<0}));if(n.length&&!e)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+n);return this},b.prototype.disable=function(t,e){var r=[];Array.isArray(t)||(t=[t]),["core","block","inline"].forEach((function(e){r=r.concat(this[e].ruler.disable(t,!0))}),this),r=r.concat(this.inline.ruler2.disable(t,!0));var n=t.filter((function(t){return r.indexOf(t)<0}));if(n.length&&!e)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+n);return this},b.prototype.use=function(t){var e=[this].concat(Array.prototype.slice.call(arguments,1));return t.apply(t,e),this},b.prototype.parse=function(t,e){if("string"!=typeof t)throw new Error("Input data should be a String");var r=new this.core.State(t,this,e);return this.core.process(r),r.tokens},b.prototype.render=function(t,e){return e=e||{},this.renderer.render(this.parse(t,e),this.options,e)},b.prototype.parseInline=function(t,e){var r=new this.core.State(t,this,e);return r.inlineMode=!0,this.core.process(r),r.tokens},b.prototype.renderInline=function(t,e){return e=e||{},this.renderer.render(this.parseInline(t,e),this.options,e)},t.exports=b},function(t){t.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"\'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}')},function(t,e,r){"use strict";var n={};function o(t,e,r){var i,s,a,c,l,u="";for("string"!=typeof e&&(r=e,e=o.defaultChars),void 0===r&&(r=!0),l=function(t){var e,r,o=n[t];if(o)return o;for(o=n[t]=[],e=0;e<128;e++)r=String.fromCharCode(e),/^[0-9a-z]$/i.test(r)?o.push(r):o.push("%"+("0"+e.toString(16).toUpperCase()).slice(-2));for(e=0;e=55296&&a<=57343){if(a>=55296&&a<=56319&&i+1=56320&&c<=57343){u+=encodeURIComponent(t[i]+t[i+1]),i++;continue}u+="%EF%BF%BD"}else u+=encodeURIComponent(t[i]);return u}o.defaultChars=";/?:@&=+$,-_.!~*'()#",o.componentChars="-_.!~*'()",t.exports=o},function(t,e,r){"use strict";var n={};function o(t,e){var r;return"string"!=typeof e&&(e=o.defaultChars),r=function(t){var e,r,o=n[t];if(o)return o;for(o=n[t]=[],e=0;e<128;e++)r=String.fromCharCode(e),o.push(r);for(e=0;e=55296&&c<=57343?"���":String.fromCharCode(c),e+=6):240==(248&o)&&e+91114111?l+="����":(c-=65536,l+=String.fromCharCode(55296+(c>>10),56320+(1023&c))),e+=9):l+="�";return l}))}o.defaultChars=";/?:@&=+$,#",o.componentChars="",t.exports=o},function(t,e,r){"use strict";t.exports=function(t){var e="";return e+=t.protocol||"",e+=t.slashes?"//":"",e+=t.auth?t.auth+"@":"",t.hostname&&-1!==t.hostname.indexOf(":")?e+="["+t.hostname+"]":e+=t.hostname||"",e+=t.port?":"+t.port:"",e+=t.pathname||"",e+=t.search||"",e+=t.hash||""}},function(t,e,r){"use strict";function n(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var o=/^([a-z0-9.+-]+:)/i,i=/:[0-9]*$/,s=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,a=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),c=["'"].concat(a),l=["%","/","?",";","#"].concat(c),u=["/","?","#"],p=/^[+a-z0-9A-Z_-]{0,63}$/,h=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,f={javascript:!0,"javascript:":!0},d={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};n.prototype.parse=function(t,e){var r,n,i,a,c,m=t;if(m=m.trim(),!e&&1===t.split("#").length){var v=s.exec(m);if(v)return this.pathname=v[1],v[2]&&(this.search=v[2]),this}var g=o.exec(m);if(g&&(i=(g=g[0]).toLowerCase(),this.protocol=g,m=m.substr(g.length)),(e||g||m.match(/^\/\/[^@\/]+@[^@\/]+/))&&(!(c="//"===m.substr(0,2))||g&&f[g]||(m=m.substr(2),this.slashes=!0)),!f[g]&&(c||g&&!d[g])){var y,b,k=-1;for(r=0;r127?S+="x":S+=C[A];if(!S.match(p)){var M=_.slice(0,r),D=_.slice(r+1),E=C.match(h);E&&(M.push(E[1]),D.unshift(E[2])),D.length&&(m=D.join(".")+m),this.hostname=M.join(".");break}}}}this.hostname.length>255&&(this.hostname=""),x&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var T=m.indexOf("#");-1!==T&&(this.hash=m.substr(T),m=m.slice(0,T));var N=m.indexOf("?");return-1!==N&&(this.search=m.substr(N),m=m.slice(0,N)),m&&(this.pathname=m),d[i]&&this.hostname&&!this.pathname&&(this.pathname=""),this},n.prototype.parseHost=function(t){var e=i.exec(t);e&&(":"!==(e=e[0])&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)},t.exports=function(t,e){if(t&&t instanceof n)return t;var r=new n;return r.parse(t,e),r}},function(t,e,r){"use strict";e.Any=r(42),e.Cc=r(43),e.Cf=r(62),e.P=r(37),e.Z=r(44)},function(t,e){t.exports=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/},function(t,e,r){"use strict";e.parseLinkLabel=r(64),e.parseLinkDestination=r(65),e.parseLinkTitle=r(66)},function(t,e,r){"use strict";t.exports=function(t,e,r){var n,o,i,s,a=-1,c=t.posMax,l=t.pos;for(t.pos=e+1,n=1;t.pos=r)return c;if(34!==(i=t.charCodeAt(e))&&39!==i&&40!==i)return c;for(e++,40===i&&(i=41);e"+i(t[e].content)+""},s.code_block=function(t,e,r,n,o){var s=t[e];return""+i(t[e].content)+"\n"},s.fence=function(t,e,r,n,s){var a,c,l,u,p=t[e],h=p.info?o(p.info).trim():"",f="";return h&&(f=h.split(/\s+/g)[0]),0===(a=r.highlight&&r.highlight(p.content,f)||i(p.content)).indexOf(""+a+"\n"):"
          "+a+"
          \n"},s.image=function(t,e,r,n,o){var i=t[e];return i.attrs[i.attrIndex("alt")][1]=o.renderInlineAsText(i.children,r,n),o.renderToken(t,e,r)},s.hardbreak=function(t,e,r){return r.xhtmlOut?"
          \n":"
          \n"},s.softbreak=function(t,e,r){return r.breaks?r.xhtmlOut?"
          \n":"
          \n":"\n"},s.text=function(t,e){return i(t[e].content)},s.html_block=function(t,e){return t[e].content},s.html_inline=function(t,e){return t[e].content},a.prototype.renderAttrs=function(t){var e,r,n;if(!t.attrs)return"";for(n="",e=0,r=t.attrs.length;e\n":">")},a.prototype.renderInline=function(t,e,r){for(var n,o="",i=this.rules,s=0,a=t.length;s/i.test(t)}t.exports=function(t){var e,r,i,s,a,c,l,u,p,h,f,d,m,v,g,y,b,k,w=t.tokens;if(t.md.options.linkify)for(r=0,i=w.length;r=0;e--)if("link_close"!==(c=s[e]).type){if("html_inline"===c.type&&(k=c.content,/^\s]/i.test(k)&&m>0&&m--,o(c.content)&&m++),!(m>0)&&"text"===c.type&&t.md.linkify.test(c.content)){for(p=c.content,b=t.md.linkify.match(p),l=[],d=c.level,f=0,u=0;uf&&((a=new t.Token("text","",0)).content=p.slice(f,h),a.level=d,l.push(a)),(a=new t.Token("link_open","a",1)).attrs=[["href",g]],a.level=d++,a.markup="linkify",a.info="auto",l.push(a),(a=new t.Token("text","",0)).content=y,a.level=d,l.push(a),(a=new t.Token("link_close","a",-1)).level=--d,a.markup="linkify",a.info="auto",l.push(a),f=b[u].lastIndex);f=0;e--)"text"!==(r=t[e]).type||n||(r.content=r.content.replace(i,a)),"link_open"===r.type&&"auto"===r.info&&n--,"link_close"===r.type&&"auto"===r.info&&n++}function l(t){var e,r,o=0;for(e=t.length-1;e>=0;e--)"text"!==(r=t[e]).type||o||n.test(r.content)&&(r.content=r.content.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1—$2").replace(/(^|\s)--(\s|$)/gm,"$1–$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1–$2")),"link_open"===r.type&&"auto"===r.info&&o--,"link_close"===r.type&&"auto"===r.info&&o++}t.exports=function(t){var e;if(t.md.options.typographer)for(e=t.tokens.length-1;e>=0;e--)"inline"===t.tokens[e].type&&(o.test(t.tokens[e].content)&&c(t.tokens[e].children),n.test(t.tokens[e].content)&&l(t.tokens[e].children))}},function(t,e,r){"use strict";var n=r(4).isWhiteSpace,o=r(4).isPunctChar,i=r(4).isMdAsciiPunct,s=/['"]/,a=/['"]/g;function c(t,e,r){return t.substr(0,e)+r+t.substr(e+1)}function l(t,e){var r,s,l,u,p,h,f,d,m,v,g,y,b,k,w,x,_,C,S,A,O;for(S=[],r=0;r=0&&!(S[_].level<=f);_--);if(S.length=_+1,"text"===s.type){p=0,h=(l=s.content).length;t:for(;p=0)m=l.charCodeAt(u.index-1);else for(_=r-1;_>=0&&("softbreak"!==t[_].type&&"hardbreak"!==t[_].type);_--)if("text"===t[_].type){m=t[_].content.charCodeAt(t[_].content.length-1);break}if(v=32,p=48&&m<=57&&(x=w=!1),w&&x&&(w=!1,x=y),w||x){if(x)for(_=S.length-1;_>=0&&(d=S[_],!(S[_].level=0;e--)"inline"===t.tokens[e].type&&s.test(t.tokens[e].content)&&l(t.tokens[e].children,t)}},function(t,e,r){"use strict";var n=r(39);function o(t,e,r){this.src=t,this.env=r,this.tokens=[],this.inlineMode=!1,this.md=e}o.prototype.Token=n,t.exports=o},function(t,e,r){"use strict";var n=r(38),o=[["table",r(77),["paragraph","reference"]],["code",r(78)],["fence",r(79),["paragraph","reference","blockquote","list"]],["blockquote",r(80),["paragraph","reference","blockquote","list"]],["hr",r(81),["paragraph","reference","blockquote","list"]],["list",r(82),["paragraph","reference","blockquote"]],["reference",r(83)],["heading",r(84),["paragraph","reference","blockquote"]],["lheading",r(85)],["html_block",r(86),["paragraph","reference","blockquote"]],["paragraph",r(88)]];function i(){this.ruler=new n;for(var t=0;t=r))&&!(t.sCount[s]=c){t.line=r;break}for(n=0;nr)return!1;if(p=e+1,t.sCount[p]=4)return!1;if((l=t.bMarks[p]+t.tShift[p])>=t.eMarks[p])return!1;if(124!==(a=t.src.charCodeAt(l++))&&45!==a&&58!==a)return!1;for(;l=4)return!1;if((f=(h=i(c.replace(/^\||\|$/g,""))).length)>m.length)return!1;if(s)return!0;for((d=t.push("table_open","table",1)).map=g=[e,0],(d=t.push("thead_open","thead",1)).map=[e,e+1],(d=t.push("tr_open","tr",1)).map=[e,e+1],u=0;u=4);p++){for(h=i(c.replace(/^\||\|$/g,"")),d=t.push("tr_open","tr",1),u=0;u=4))break;o=++n}return t.line=o,(i=t.push("code_block","code",0)).content=t.getLines(e,o,4+t.blkIndent,!0),i.map=[e,t.line],!0}},function(t,e,r){"use strict";t.exports=function(t,e,r,n){var o,i,s,a,c,l,u,p=!1,h=t.bMarks[e]+t.tShift[e],f=t.eMarks[e];if(t.sCount[e]-t.blkIndent>=4)return!1;if(h+3>f)return!1;if(126!==(o=t.src.charCodeAt(h))&&96!==o)return!1;if(c=h,(i=(h=t.skipChars(h,o))-c)<3)return!1;if(u=t.src.slice(c,h),s=t.src.slice(h,f),96===o&&s.indexOf(String.fromCharCode(o))>=0)return!1;if(n)return!0;for(a=e;!(++a>=r)&&!((h=c=t.bMarks[a]+t.tShift[a])<(f=t.eMarks[a])&&t.sCount[a]=4||(h=t.skipChars(h,o))-c=4)return!1;if(62!==t.src.charCodeAt(A++))return!1;if(o)return!0;for(c=f=t.sCount[e]+A-(t.bMarks[e]+t.tShift[e]),32===t.src.charCodeAt(A)?(A++,c++,f++,i=!1,k=!0):9===t.src.charCodeAt(A)?(k=!0,(t.bsCount[e]+f)%4==3?(A++,c++,f++,i=!1):i=!0):k=!1,d=[t.bMarks[e]],t.bMarks[e]=A;A=O,y=[t.sCount[e]],t.sCount[e]=f-c,b=[t.tShift[e]],t.tShift[e]=A-t.bMarks[e],x=t.md.block.ruler.getRules("blockquote"),g=t.parentType,t.parentType="blockquote",C=!1,h=e+1;h=(O=t.eMarks[h])));h++)if(62!==t.src.charCodeAt(A++)||C){if(u)break;for(w=!1,a=0,l=x.length;a=O,m.push(t.bsCount[h]),t.bsCount[h]=t.sCount[h]+1+(k?1:0),y.push(t.sCount[h]),t.sCount[h]=f-c,b.push(t.tShift[h]),t.tShift[h]=A-t.bMarks[h]}for(v=t.blkIndent,t.blkIndent=0,(_=t.push("blockquote_open","blockquote",1)).markup=">",_.map=p=[e,0],t.md.block.tokenize(t,e,h),(_=t.push("blockquote_close","blockquote",-1)).markup=">",t.lineMax=S,t.parentType=g,p[1]=t.line,a=0;a=4)return!1;if(42!==(i=t.src.charCodeAt(l++))&&45!==i&&95!==i)return!1;for(s=1;l=s)return-1;if((r=t.src.charCodeAt(i++))<48||r>57)return-1;for(;;){if(i>=s)return-1;if(!((r=t.src.charCodeAt(i++))>=48&&r<=57)){if(41===r||46===r)break;return-1}if(i-o>=10)return-1}return i=4)return!1;if(t.listIndent>=0&&t.sCount[e]-t.listIndent>=4&&t.sCount[e]=t.blkIndent&&(z=!0),(M=i(t,e))>=0){if(h=!0,E=t.bMarks[e]+t.tShift[e],y=Number(t.src.substr(E,M-E-1)),z&&1!==y)return!1}else{if(!((M=o(t,e))>=0))return!1;h=!1}if(z&&t.skipSpaces(M)>=t.eMarks[e])return!1;if(g=t.src.charCodeAt(M-1),n)return!0;for(v=t.tokens.length,h?(I=t.push("ordered_list_open","ol",1),1!==y&&(I.attrs=[["start",y]])):I=t.push("bullet_list_open","ul",1),I.map=m=[e,0],I.markup=String.fromCharCode(g),k=e,D=!1,N=t.md.block.ruler.getRules("list"),_=t.parentType,t.parentType="list";k=b?1:w-p)>4&&(u=1),l=p+u,(I=t.push("list_item_open","li",1)).markup=String.fromCharCode(g),I.map=f=[e,0],A=t.tight,S=t.tShift[e],C=t.sCount[e],x=t.listIndent,t.listIndent=t.blkIndent,t.blkIndent=l,t.tight=!0,t.tShift[e]=a-t.bMarks[e],t.sCount[e]=w,a>=b&&t.isEmpty(e+1)?t.line=Math.min(t.line+2,r):t.md.block.tokenize(t,e,r,!0),t.tight&&!D||(R=!1),D=t.line-e>1&&t.isEmpty(t.line-1),t.blkIndent=t.listIndent,t.listIndent=x,t.tShift[e]=S,t.sCount[e]=C,t.tight=A,(I=t.push("list_item_close","li",-1)).markup=String.fromCharCode(g),k=e=t.line,f[1]=k,a=t.bMarks[e],k>=r)break;if(t.sCount[k]=4)break;for(T=!1,c=0,d=N.length;c=4)return!1;if(91!==t.src.charCodeAt(_))return!1;for(;++_3||t.sCount[S]<0)){for(b=!1,p=0,h=k.length;p=4)return!1;if(35!==(i=t.src.charCodeAt(l))||l>=u)return!1;for(s=1,i=t.src.charCodeAt(++l);35===i&&l6||ll&&n(t.src.charCodeAt(a-1))&&(u=a),t.line=e+1,(c=t.push("heading_open","h"+String(s),1)).markup="########".slice(0,s),c.map=[e,t.line],(c=t.push("inline","",0)).content=t.src.slice(l,u).trim(),c.map=[e,t.line],c.children=[],(c=t.push("heading_close","h"+String(s),-1)).markup="########".slice(0,s)),!0)}},function(t,e,r){"use strict";t.exports=function(t,e,r){var n,o,i,s,a,c,l,u,p,h,f=e+1,d=t.md.block.ruler.getRules("paragraph");if(t.sCount[e]-t.blkIndent>=4)return!1;for(h=t.parentType,t.parentType="paragraph";f3)){if(t.sCount[f]>=t.blkIndent&&(c=t.bMarks[f]+t.tShift[f])<(l=t.eMarks[f])&&(45===(p=t.src.charCodeAt(c))||61===p)&&(c=t.skipChars(c,p),(c=t.skipSpaces(c))>=l)){u=61===p?1:2;break}if(!(t.sCount[f]<0)){for(o=!1,i=0,s=d.length;i|$))/i,/<\/(script|pre|style)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(o.source+"\\s*$"),/^$/,!1]];t.exports=function(t,e,r,n){var o,s,a,c,l=t.bMarks[e]+t.tShift[e],u=t.eMarks[e];if(t.sCount[e]-t.blkIndent>=4)return!1;if(!t.md.options.html)return!1;if(60!==t.src.charCodeAt(l))return!1;for(c=t.src.slice(l,u),o=0;o3||t.sCount[c]<0)){for(n=!1,o=0,i=l.length;o0&&this.level++,this.tokens.push(o),o},i.prototype.isEmpty=function(t){return this.bMarks[t]+this.tShift[t]>=this.eMarks[t]},i.prototype.skipEmptyLines=function(t){for(var e=this.lineMax;te;)if(!o(this.src.charCodeAt(--t)))return t+1;return t},i.prototype.skipChars=function(t,e){for(var r=this.src.length;tr;)if(e!==this.src.charCodeAt(--t))return t+1;return t},i.prototype.getLines=function(t,e,r,n){var i,s,a,c,l,u,p,h=t;if(t>=e)return"";for(u=new Array(e-t),i=0;hr?new Array(s-r+1).join(" ")+this.src.slice(c,l):this.src.slice(c,l)}return u.join("")},i.prototype.Token=n,t.exports=i},function(t,e,r){"use strict";var n=r(38),o=[["text",r(91)],["newline",r(92)],["escape",r(93)],["backticks",r(94)],["strikethrough",r(46).tokenize],["emphasis",r(47).tokenize],["link",r(95)],["image",r(96)],["autolink",r(97)],["html_inline",r(98)],["entity",r(99)]],i=[["balance_pairs",r(100)],["strikethrough",r(46).postProcess],["emphasis",r(47).postProcess],["text_collapse",r(101)]];function s(){var t;for(this.ruler=new n,t=0;t=i)break}else t.pending+=t.src[t.pos++]}t.pending&&t.pushPending()},s.prototype.parse=function(t,e,r,n){var o,i,s,a=new this.State(t,e,r,n);for(this.tokenize(a),s=(i=this.ruler2.getRules("")).length,o=0;o=0&&32===t.pending.charCodeAt(r)?r>=1&&32===t.pending.charCodeAt(r-1)?(t.pending=t.pending.replace(/ +$/,""),t.push("hardbreak","br",0)):(t.pending=t.pending.slice(0,-1),t.push("softbreak","br",0)):t.push("softbreak","br",0)),i++;i?@[]^_`{|}~-".split("").forEach((function(t){o[t.charCodeAt(0)]=1})),t.exports=function(t,e){var r,i=t.pos,s=t.posMax;if(92!==t.src.charCodeAt(i))return!1;if(++i=m)return!1;for(v=l,(u=t.md.helpers.parseLinkDestination(t.src,l,t.posMax)).ok&&(f=t.md.normalizeLink(u.str),t.md.validateLink(f)?l=u.pos:f=""),v=l;l=m||41!==t.src.charCodeAt(l))&&(g=!0),l++}if(g){if(void 0===t.env.references)return!1;if(l=0?s=t.src.slice(v,l++):l=a+1):l=a+1,s||(s=t.src.slice(c,a)),!(p=t.env.references[n(s)]))return t.pos=d,!1;f=p.href,h=p.title}return e||(t.pos=c,t.posMax=a,t.push("link_open","a",1).attrs=r=[["href",f]],h&&r.push(["title",h]),t.md.inline.tokenize(t),t.push("link_close","a",-1)),t.pos=l,t.posMax=m,!0}},function(t,e,r){"use strict";var n=r(4).normalizeReference,o=r(4).isSpace;t.exports=function(t,e){var r,i,s,a,c,l,u,p,h,f,d,m,v,g="",y=t.pos,b=t.posMax;if(33!==t.src.charCodeAt(t.pos))return!1;if(91!==t.src.charCodeAt(t.pos+1))return!1;if(l=t.pos+2,(c=t.md.helpers.parseLinkLabel(t,t.pos+1,!1))<0)return!1;if((u=c+1)=b)return!1;for(v=u,(h=t.md.helpers.parseLinkDestination(t.src,u,t.posMax)).ok&&(g=t.md.normalizeLink(h.str),t.md.validateLink(g)?u=h.pos:g=""),v=u;u=b||41!==t.src.charCodeAt(u))return t.pos=y,!1;u++}else{if(void 0===t.env.references)return!1;if(u=0?a=t.src.slice(v,u++):u=c+1):u=c+1,a||(a=t.src.slice(l,c)),!(p=t.env.references[n(a)]))return t.pos=y,!1;g=p.href,f=p.title}return e||(s=t.src.slice(l,c),t.md.inline.parse(s,t.md,t.env,m=[]),(d=t.push("image","img",0)).attrs=r=[["src",g],["alt",""]],d.children=m,d.content=s,f&&r.push(["title",f])),t.pos=u,t.posMax=b,!0}},function(t,e,r){"use strict";var n=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,o=/^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>/;t.exports=function(t,e){var r,i,s,a,c,l,u=t.pos;return 60===t.src.charCodeAt(u)&&(!((r=t.src.slice(u)).indexOf(">")<0)&&(o.test(r)?(a=(i=r.match(o))[0].slice(1,-1),c=t.md.normalizeLink(a),!!t.md.validateLink(c)&&(e||((l=t.push("link_open","a",1)).attrs=[["href",c]],l.markup="autolink",l.info="auto",(l=t.push("text","",0)).content=t.md.normalizeLinkText(a),(l=t.push("link_close","a",-1)).markup="autolink",l.info="auto"),t.pos+=i[0].length,!0)):!!n.test(r)&&(a=(s=r.match(n))[0].slice(1,-1),c=t.md.normalizeLink("mailto:"+a),!!t.md.validateLink(c)&&(e||((l=t.push("link_open","a",1)).attrs=[["href",c]],l.markup="autolink",l.info="auto",(l=t.push("text","",0)).content=t.md.normalizeLinkText(a),(l=t.push("link_close","a",-1)).markup="autolink",l.info="auto"),t.pos+=s[0].length,!0))))}},function(t,e,r){"use strict";var n=r(45).HTML_TAG_RE;t.exports=function(t,e){var r,o,i,s=t.pos;return!!t.md.options.html&&(i=t.posMax,!(60!==t.src.charCodeAt(s)||s+2>=i)&&(!(33!==(r=t.src.charCodeAt(s+1))&&63!==r&&47!==r&&!function(t){var e=32|t;return e>=97&&e<=122}(r))&&(!!(o=t.src.slice(s).match(n))&&(e||(t.push("html_inline","",0).content=t.src.slice(s,s+o[0].length)),t.pos+=o[0].length,!0))))}},function(t,e,r){"use strict";var n=r(40),o=r(4).has,i=r(4).isValidEntityCode,s=r(4).fromCodePoint,a=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,c=/^&([a-z][a-z0-9]{1,31});/i;t.exports=function(t,e){var r,l,u=t.pos,p=t.posMax;if(38!==t.src.charCodeAt(u))return!1;if(u+1s;n-=i.jump+1)if((i=e[n]).marker===o.marker&&(-1===a&&(a=n),i.open&&i.end<0&&i.level===o.level&&(c=!1,(i.close||o.open)&&(i.length+o.length)%3==0&&(i.length%3==0&&o.length%3==0||(c=!0)),!c))){l=n>0&&!e[n-1].open?e[n-1].jump+1:0,o.jump=r-n+l,o.open=!1,i.end=r,i.jump=l,i.close=!1,a=-1;break}-1!==a&&(u[o.marker][(o.length||0)%3]=a)}}t.exports=function(t){var e,r=t.tokens_meta,o=t.tokens_meta.length;for(n(0,t.delimiters),e=0;e0&&n++,"text"===o[e].type&&e+10&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],i={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(o),this.tokens_meta.push(i),o},a.prototype.scanDelims=function(t,e){var r,n,a,c,l,u,p,h,f,d=t,m=!0,v=!0,g=this.posMax,y=this.src.charCodeAt(t);for(r=t>0?this.src.charCodeAt(t-1):32;d=3&&":"===t[e-3]||e>=3&&"/"===t[e-3]?0:n.match(r.re.no_http)[0].length:0}},"mailto:":{validate:function(t,e,r){var n=t.slice(e);return r.re.mailto||(r.re.mailto=new RegExp("^"+r.re.src_email_name+"@"+r.re.src_host_strict,"i")),r.re.mailto.test(n)?n.match(r.re.mailto)[0].length:0}}},l="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф".split("|");function u(t){var e=t.re=r(104)(t.__opts__),n=t.__tlds__.slice();function a(t){return t.replace("%TLDS%",e.src_tlds)}t.onCompile(),t.__tlds_replaced__||n.push("a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]"),n.push(e.src_xn),e.src_tlds=n.join("|"),e.email_fuzzy=RegExp(a(e.tpl_email_fuzzy),"i"),e.link_fuzzy=RegExp(a(e.tpl_link_fuzzy),"i"),e.link_no_ip_fuzzy=RegExp(a(e.tpl_link_no_ip_fuzzy),"i"),e.host_fuzzy_test=RegExp(a(e.tpl_host_fuzzy_test),"i");var c=[];function l(t,e){throw new Error('(LinkifyIt) Invalid schema "'+t+'": '+e)}t.__compiled__={},Object.keys(t.__schemas__).forEach((function(e){var r=t.__schemas__[e];if(null!==r){var n={validate:null,link:null};if(t.__compiled__[e]=n,"[object Object]"===o(r))return!function(t){return"[object RegExp]"===o(t)}(r.validate)?i(r.validate)?n.validate=r.validate:l(e,r):n.validate=function(t){return function(e,r){var n=e.slice(r);return t.test(n)?n.match(t)[0].length:0}}(r.validate),void(i(r.normalize)?n.normalize=r.normalize:r.normalize?l(e,r):n.normalize=function(t,e){e.normalize(t)});!function(t){return"[object String]"===o(t)}(r)?l(e,r):c.push(e)}})),c.forEach((function(e){t.__compiled__[t.__schemas__[e]]&&(t.__compiled__[e].validate=t.__compiled__[t.__schemas__[e]].validate,t.__compiled__[e].normalize=t.__compiled__[t.__schemas__[e]].normalize)})),t.__compiled__[""]={validate:null,normalize:function(t,e){e.normalize(t)}};var u=Object.keys(t.__compiled__).filter((function(e){return e.length>0&&t.__compiled__[e]})).map(s).join("|");t.re.schema_test=RegExp("(^|(?!_)(?:[><|]|"+e.src_ZPCc+"))("+u+")","i"),t.re.schema_search=RegExp("(^|(?!_)(?:[><|]|"+e.src_ZPCc+"))("+u+")","ig"),t.re.pretest=RegExp("("+t.re.schema_test.source+")|("+t.re.host_fuzzy_test.source+")|@","i"),function(t){t.__index__=-1,t.__text_cache__=""}(t)}function p(t,e){var r=t.__index__,n=t.__last_index__,o=t.__text_cache__.slice(r,n);this.schema=t.__schema__.toLowerCase(),this.index=r+e,this.lastIndex=n+e,this.raw=o,this.text=o,this.url=o}function h(t,e){var r=new p(t,e);return t.__compiled__[r.schema].normalize(r,t),r}function f(t,e){if(!(this instanceof f))return new f(t,e);var r;e||(r=t,Object.keys(r||{}).reduce((function(t,e){return t||a.hasOwnProperty(e)}),!1)&&(e=t,t={})),this.__opts__=n({},a,e),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=n({},c,t),this.__compiled__={},this.__tlds__=l,this.__tlds_replaced__=!1,this.re={},u(this)}f.prototype.add=function(t,e){return this.__schemas__[t]=e,u(this),this},f.prototype.set=function(t){return this.__opts__=n(this.__opts__,t),this},f.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;var e,r,n,o,i,s,a,c;if(this.re.schema_test.test(t))for((a=this.re.schema_search).lastIndex=0;null!==(e=a.exec(t));)if(o=this.testSchemaAt(t,e[2],a.lastIndex)){this.__schema__=e[2],this.__index__=e.index+e[1].length,this.__last_index__=e.index+e[0].length+o;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(c=t.search(this.re.host_fuzzy_test))>=0&&(this.__index__<0||c=0&&null!==(n=t.match(this.re.email_fuzzy))&&(i=n.index+n[1].length,s=n.index+n[0].length,(this.__index__<0||ithis.__last_index__)&&(this.__schema__="mailto:",this.__index__=i,this.__last_index__=s)),this.__index__>=0},f.prototype.pretest=function(t){return this.re.pretest.test(t)},f.prototype.testSchemaAt=function(t,e,r){return this.__compiled__[e.toLowerCase()]?this.__compiled__[e.toLowerCase()].validate(t,r,this):0},f.prototype.match=function(t){var e=0,r=[];this.__index__>=0&&this.__text_cache__===t&&(r.push(h(this,e)),e=this.__last_index__);for(var n=e?t.slice(e):t;this.test(n);)r.push(h(this,e)),n=n.slice(this.__last_index__),e+=this.__last_index__;return r.length?r:null},f.prototype.tlds=function(t,e){return t=Array.isArray(t)?t:[t],e?(this.__tlds__=this.__tlds__.concat(t).sort().filter((function(t,e,r){return t!==r[e-1]})).reverse(),u(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,u(this),this)},f.prototype.normalize=function(t){t.schema||(t.url="http://"+t.url),"mailto:"!==t.schema||/^mailto:/i.test(t.url)||(t.url="mailto:"+t.url)},f.prototype.onCompile=function(){},t.exports=f},function(t,e,r){"use strict";t.exports=function(t){var e={};e.src_Any=r(42).source,e.src_Cc=r(43).source,e.src_Z=r(44).source,e.src_P=r(37).source,e.src_ZPCc=[e.src_Z,e.src_P,e.src_Cc].join("|"),e.src_ZCc=[e.src_Z,e.src_Cc].join("|");return e.src_pseudo_letter="(?:(?![><|]|"+e.src_ZPCc+")"+e.src_Any+")",e.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",e.src_auth="(?:(?:(?!"+e.src_ZCc+"|[@/\\[\\]()]).)+@)?",e.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",e.src_host_terminator="(?=$|[><|]|"+e.src_ZPCc+")(?!-|_|:\\d|\\.-|\\.(?!$|"+e.src_ZPCc+"))",e.src_path="(?:[/?#](?:(?!"+e.src_ZCc+"|[><|]|[()[\\]{}.,\"'?!\\-]).|\\[(?:(?!"+e.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+e.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+e.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+e.src_ZCc+'|["]).)+\\"|\\\'(?:(?!'+e.src_ZCc+"|[']).)+\\'|\\'(?="+e.src_pseudo_letter+"|[-]).|\\.{2,4}[a-zA-Z0-9%/]|\\.(?!"+e.src_ZCc+"|[.]).|"+(t&&t["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+"\\,(?!"+e.src_ZCc+").|\\!(?!"+e.src_ZCc+"|[!]).|\\?(?!"+e.src_ZCc+"|[?]).)+|\\/)?",e.src_email_name='[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*',e.src_xn="xn--[a-z0-9\\-]{1,59}",e.src_domain_root="(?:"+e.src_xn+"|"+e.src_pseudo_letter+"{1,63})",e.src_domain="(?:"+e.src_xn+"|(?:"+e.src_pseudo_letter+")|(?:"+e.src_pseudo_letter+"(?:-|"+e.src_pseudo_letter+"){0,61}"+e.src_pseudo_letter+"))",e.src_host="(?:(?:(?:(?:"+e.src_domain+")\\.)*"+e.src_domain+"))",e.tpl_host_fuzzy="(?:"+e.src_ip4+"|(?:(?:(?:"+e.src_domain+")\\.)+(?:%TLDS%)))",e.tpl_host_no_ip_fuzzy="(?:(?:(?:"+e.src_domain+")\\.)+(?:%TLDS%))",e.src_host_strict=e.src_host+e.src_host_terminator,e.tpl_host_fuzzy_strict=e.tpl_host_fuzzy+e.src_host_terminator,e.src_host_port_strict=e.src_host+e.src_port+e.src_host_terminator,e.tpl_host_port_fuzzy_strict=e.tpl_host_fuzzy+e.src_port+e.src_host_terminator,e.tpl_host_port_no_ip_fuzzy_strict=e.tpl_host_no_ip_fuzzy+e.src_port+e.src_host_terminator,e.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+e.src_ZPCc+"|>|$))",e.tpl_email_fuzzy='(^|[><|]|"|\\(|'+e.src_ZCc+")("+e.src_email_name+"@"+e.tpl_host_fuzzy_strict+")",e.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+e.src_ZPCc+"))((?![$+<=>^`||])"+e.tpl_host_port_fuzzy_strict+e.src_path+")",e.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+e.src_ZPCc+"))((?![$+<=>^`||])"+e.tpl_host_port_no_ip_fuzzy_strict+e.src_path+")",e}},function(t,e,r){(function(t,n){var o;/*! https://mths.be/punycode v1.4.1 by @mathias */!function(i){e&&e.nodeType,t&&t.nodeType;var s="object"==typeof n&&n;s.global!==s&&s.window!==s&&s.self;var a,c=2147483647,l=/^xn--/,u=/[^\x20-\x7E]/,p=/[\x2E\u3002\uFF0E\uFF61]/g,h={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},f=Math.floor,d=String.fromCharCode;function m(t){throw new RangeError(h[t])}function v(t,e){for(var r=t.length,n=[];r--;)n[r]=e(t[r]);return n}function g(t,e){var r=t.split("@"),n="";return r.length>1&&(n=r[0]+"@",t=r[1]),n+v((t=t.replace(p,".")).split("."),e).join(".")}function y(t){for(var e,r,n=[],o=0,i=t.length;o=55296&&e<=56319&&o65535&&(e+=d((t-=65536)>>>10&1023|55296),t=56320|1023&t),e+=d(t)})).join("")}function k(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function w(t,e,r){var n=0;for(t=r?f(t/700):t>>1,t+=f(t/e);t>455;n+=36)t=f(t/35);return f(n+36*t/(t+38))}function x(t){var e,r,n,o,i,s,a,l,u,p,h,d=[],v=t.length,g=0,y=128,k=72;for((r=t.lastIndexOf("-"))<0&&(r=0),n=0;n=128&&m("not-basic"),d.push(t.charCodeAt(n));for(o=r>0?r+1:0;o=v&&m("invalid-input"),((l=(h=t.charCodeAt(o++))-48<10?h-22:h-65<26?h-65:h-97<26?h-97:36)>=36||l>f((c-g)/s))&&m("overflow"),g+=l*s,!(l<(u=a<=k?1:a>=k+26?26:a-k));a+=36)s>f(c/(p=36-u))&&m("overflow"),s*=p;k=w(g-i,e=d.length+1,0==i),f(g/e)>c-y&&m("overflow"),y+=f(g/e),g%=e,d.splice(g++,0,y)}return b(d)}function _(t){var e,r,n,o,i,s,a,l,u,p,h,v,g,b,x,_=[];for(v=(t=y(t)).length,e=128,r=0,i=72,s=0;s=e&&hf((c-r)/(g=n+1))&&m("overflow"),r+=(a-e)*g,e=a,s=0;sc&&m("overflow"),h==e){for(l=r,u=36;!(l<(p=u<=i?1:u>=i+26?26:u-i));u+=36)x=l-p,b=36-p,_.push(d(k(p+x%b,0))),l=f(x/b);_.push(d(k(l,0))),i=w(r,g,n==o),r=0,++n}++r,++e}return _.join("")}a={version:"1.4.1",ucs2:{decode:y,encode:b},decode:x,encode:_,toASCII:function(t){return g(t,(function(t){return u.test(t)?"xn--"+_(t):t}))},toUnicode:function(t){return g(t,(function(t){return l.test(t)?x(t.slice(4).toLowerCase()):t}))}},void 0===(o=function(){return a}.call(e,r,e,t))||(t.exports=o)}()}).call(this,r(106)(t),r(107))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(t){"object"==typeof window&&(r=window)}t.exports=r},function(t,e,r){"use strict";t.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}}},function(t,e,r){"use strict";t.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["paragraph"]},inline:{rules:["text"],rules2:["balance_pairs","text_collapse"]}}}},function(t,e,r){"use strict";t.exports={options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["blockquote","code","fence","heading","hr","html_block","lheading","list","reference","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","html_inline","image","link","newline","text"],rules2:["balance_pairs","emphasis","text_collapse"]}}}},function(t,e){t.exports=flarum.core.compat["common/components/Switch"]},function(t,e){t.exports=flarum.core.compat["forum/components/SettingsPage"]},function(t,e){t.exports=flarum.core.compat["common/components/FieldSet"]},function(t,e,r){"use strict";r.r(e),r.d(e,"components",(function(){return f.d})),r.d(e,"proseMirror",(function(){return f.g})),r.d(e,"states",(function(){return f.i})),r.d(e,"InputRule",(function(){return f.a})),r.d(e,"keymap",(function(){return f.e})),r.d(e,"liftListItem",(function(){return f.f})),r.d(e,"splitListItem",(function(){return f.h})),r.d(e,"wrapInList",(function(){return f.j})),r.d(e,"Plugin",(function(){return f.b})),r.d(e,"Selection",(function(){return f.c}));var n=r(49),o=r(23),i=r(113),s=r.n(i),a=r(111),c=r.n(a),l=r(112),u=r.n(l),p=r(16),h=r.n(p);var f=r(48);app.initializers.add("askvortsov/flarum-rich-text",(function(){Object(o.extend)(u.a.prototype,"settingsItems",(function(t){t.add("composer",s.a.component({label:app.translator.trans("askvortsov-rich-text.forum.settings.composer_heading"),className:"Settings-composer"},this.composerItems().toArray()))})),u.a.prototype.composerItems=function(){var t=this,e=new h.a;return e.add("useRichTextEditor",c.a.component({state:this.user.preferences().useRichTextEditor,onchange:function(e){t.useRichTextEditorLoading=!0,t.user.savePreferences({useRichTextEditor:e}).then((function(){t.useRichTextEditorLoading=!1,m.redraw()}))},loading:this.useRichTextEditorLoading},app.translator.trans("askvortsov-rich-text.forum.settings.use_rich_text_editor_label"))),e.add("richTextCompactParagraphs",c.a.component({state:this.user.preferences().richTextCompactParagraphs,onchange:function(e){t.richTextCompactParagraphsLoading=!0,t.user.savePreferences({richTextCompactParagraphs:e}).then((function(){t.richTextCompactParagraphsLoading=!1,m.redraw()}))},loading:this.richTextCompactParagraphsLoading},app.translator.trans("askvortsov-rich-text.forum.settings.rich_text_compact_paragraphs_label"))),e},Object(n.a)()}))}]); //# sourceMappingURL=forum.js.map \ No newline at end of file diff --git a/js/dist/forum.js.map b/js/dist/forum.js.map index fe197cc..c163617 100644 --- a/js/dist/forum.js.map +++ b/js/dist/forum.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://@askvortsov/flarum-rich-text/webpack/bootstrap","webpack://@askvortsov/flarum-rich-text/./node_modules/orderedmap/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-model/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-state/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-commands/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/tiptap-commands/dist/commands.esm.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-transform/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/utils.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-inputrules/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@askvortsov/flarum-rich-text/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-markdown/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-schema-list/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Tooltip']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/CommandButton.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/extractText']\"","webpack://@askvortsov/flarum-rich-text/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@askvortsov/flarum-rich-text/./node_modules/tiptap-utils/dist/utils.esm.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/MarkButton.js","webpack://@askvortsov/flarum-rich-text/./node_modules/w3c-keyname/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-keymap/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/ItemList']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/Stream']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Button']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/helpers/icon']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Dropdown']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/SafariModalHack.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/FormDropdown.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/extend']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/ListButton.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/TextEditor']\"","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/MarkdownSerializerBuilder.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/SchemaBuilder.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/Component']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/NodeTypeDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/InsertImageDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/states/MenuState.js","webpack://@askvortsov/flarum-rich-text/./node_modules/rope-sequence/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-history/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-view/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-dropcursor/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-gapcursor/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/disableBase64PastePlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/toggleSpoiler.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/inputrules.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/ProseMirrorEditorDriver.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/placeholderPlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/menuPlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/key-bindings.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/disabledPlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/altText.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/blockSpoiler.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/inlineSpoilerBars.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/inlineSpoilerTags.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/MarkdownParserBuilder.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/HiddenItemsDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/ProseMirrorMenu.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/insertHr.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/InsertLinkDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/insertLink.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/P/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/ruler.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/token.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/entities.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/properties/Any/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/Cc/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/Z/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/html_re.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/strikethrough.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/emphasis.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/updateToggleMark.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/states/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/applyEditor.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/classList']\"","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it-sub/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it-sup/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it-latex2img/index.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Modal']\"","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/encode.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/decode.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/format.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/parse.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/Cf/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/parse_link_label.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/parse_link_destination.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/parse_link_title.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/renderer.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/parser_core.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/normalize.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/linkify.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/replacements.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/smartquotes.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/state_core.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/parser_block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/table.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/code.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/fence.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/blockquote.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/hr.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/list.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/reference.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/heading.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/lheading.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/html_block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/html_blocks.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/paragraph.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/state_block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/parser_inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/text.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/newline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/escape.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/backticks.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/link.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/image.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/autolink.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/html_inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/entity.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/balance_pairs.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/text_collapse.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/state_inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/linkify-it/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/linkify-it/lib/re.js","webpack://@askvortsov/flarum-rich-text/./node_modules/node-libs-browser/node_modules/punycode/punycode.js","webpack://@askvortsov/flarum-rich-text/(webpack)/buildin/module.js","webpack://@askvortsov/flarum-rich-text/(webpack)/buildin/global.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/presets/default.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/presets/zero.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/presets/commonmark.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Switch']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['forum/components/SettingsPage']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/FieldSet']\"","webpack://@askvortsov/flarum-rich-text/./src/forum/index.js","webpack://@askvortsov/flarum-rich-text/./src/forum/addPreferences.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","OrderedMap","content","this","constructor","find","length","found","undefined","update","newKey","self","remove","slice","push","splice","addToStart","concat","addToEnd","addBefore","place","without","forEach","f","prepend","map","from","size","subtract","append","result","prop","Fragment","nodeSize","prototypeAccessors","firstChild","configurable","lastChild","childCount","nodesBetween","to","nodeStart","parent","pos","child","end","start","Math","max","min","descendants","textBetween","blockSeparator","leafText","text","separated","node","isText","isLeaf","isBlock","other","last","first","sameMarkup","withText","cut","cutByIndex","empty","replaceChild","index","current","copy","eq","RangeError","maybeChild","findDiffStart","a","b","childA","childB","j","inner","findDiffEnd","otherPos","posA","posB","iA","iB","same","minSize","findIndex","round","retIndex","curPos","toString","toStringInner","join","toJSON","fromJSON","schema","Array","isArray","nodeFromJSON","fromArray","array","joined","nodes","attrs","defineProperties","offset","compareDeep","p$1","Mark","type","ReplaceError","message","err","Error","__proto__","addToSet","set","placed","excludes","rank","removeFromSet","isInSet","obj","_","json","marks","sameSet","setFrom","none","sort","Slice","openStart","openEnd","prototypeAccessors$1","replace","$from","$to","depth","replaceOuter","ref","$along","extra","resolveNoCache","prepareSliceForReplace","replaceThreeWay","$start","$end","joinable","addRange","checkJoin","addNode","replaceTwoWay","parentOffset","main","sub","compatibleContent","$before","$after","target","startIndex","endIndex","textOffset","nodeAfter","nodeBefore","validContent","insertAt","fragment","insertInto","dist","insert","canReplace","removeBetween","removeRange","ref$1","indexTo","offsetTo","maxOpen","openIsolating","spec","isolating","n$1","ResolvedPos","path","prototypeAccessors$2","doc","resolveDepth","val","indexAfter","before","after","dOff","posAtIndex","tmp","inclusive","marksAcross","isInline","next","sharedDepth","blockRange","pred","inlineContent","NodeRange","sameParent","str","resolve","rem","resolveCached","resolveCache","cached","resolveCachePos","resolveCacheSize","prototypeAccessors$1$1","emptyAttrs","Node","prototypeAccessors$3","textContent","isTextblock","isAtom","startPos","hasMarkup","defaultAttrs","mark","includeParents","nodeAt","childAfter","childBefore","rangeHasMark","toDebugString","wrapMarks","contentMatchAt","match","contentMatch","matchFragment","replacement","one","two","validEnd","allowsMarks","canReplaceWith","matchType","canAppend","check","markFromJSON","nodeType","TextNode","JSON","stringify","base","ContentMatch","wrapCache","prototypeAccessors$4","defaultType","edgeCount","parse","string","nodeTypes","stream","TokenStream","expr","parseExpr","nfa","labeled","explore","states","out","term","known","indexOf","nullFrom","state","states$1","cmp","dfa","connect","compile","exprs","reduce","loop","edge","loop$1","cur","i$1","next$1","i$2","next$2","edges","work","dead","hasRequiredAttrs","checkForDeadEnds","frag","compatible","fillBefore","toEnd","seen","search","types","finished","tp","createAndFill","findWrapping","computed","computeWrapping","active","via","shift","reverse","scan","inline","tokens","split","pop","prototypeAccessors$1$2","parseExprSeq","eat","parseExprSubscript","test","typeName","type$1","groups","resolveName","parseExprAtom","parseExprRange","parseNum","Number","defaults","attrName","attr","hasDefault","default","computeAttrs","built","given","initAttrs","Attribute","tok","SyntaxError","NodeType","group","markSet","prototypeAccessors$5","atom","isRequired","createChecked","allowsMarkType","markType","allowedMarks","topType","topNode","options","prototypeAccessors$1$3","MarkType","excluded","instance","contentExprCache","prop$1","contentExpr","markExpr","gatherMarks","prop$2","excl","topNodeType","wrappings","ok","mark$1","text$1","DOMParser","rules","this$1","tags","styles","rule","tag","style","normalizeLists","some","dom","context","ParseContext","addAll","finish","parseSlice","matchTag","matches","namespace","namespaceURI","matchesContext","getAttrs","matchStyle","charCodeAt","schemaRules","priority","parseDOM","rules$1","name$1","fromSchema","domParser","blockTags","address","article","aside","blockquote","canvas","dd","div","dl","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","noscript","ol","output","pre","section","table","tfoot","ul","ignoreTags","head","script","title","listTags","wsOptionsFor","preserveWhitespace","NodeContext","pendingMarks","solid","activeMarks","stashMarks","fill","wrap","exec","popFromStashMark","applyPending","nextType","pending","markMayApply","parser","open","isOpen","topContext","topOptions","topMatch","findPositions","needsBlock","prototypeAccessors$6","top","currentPos","selector","msMatchesSelector","webkitMatchesSelector","mozMatchesSelector","v","returned","addDOM","addTextNode","getAttribute","readStyles","re","trim","parseStyles","addPendingMark","addElement","removePendingMark","nodeValue","domNodeBefore","previousSibling","nodeName","insertNode","findInText","findInside","matchAfter","ruleID","toLowerCase","prevItem","nextSibling","appendChild","normalizeList","ruleFromNode","ignore","skip","closeParent","sync","oldNeedsBlock","leafFallback","addElementByRule","consuming","ownerDocument","createTextNode","continueAfter","enter","startIn","getContent","contentDOM","contentElement","querySelector","findAround","childNodes","findAtPoint","findPlace","route","cx","enterInner","block","textblockFromContext","closeExtra","preserveWS","topOpen","contains","compareDocumentPosition","textNode","parts","option","useRoot","minDepth","part","$context","deflt","findSameMarkInSet","upto","level","lastIndexOf","stashMark","DOMSerializer","gatherToDOM","toDOM","document","window","serializeFragment","createDocumentFragment","keep","rendered","spanning","add","markDOM","serializeMark","serializeNode","renderSpec","onContent","serializeNodeAndMarks","structure","xmlNS","tagName","space","createElementNS","createElement","space$1","setAttributeNS","setAttribute","innerContent","domSerializer","nodesFromSchema","marksFromSchema","classesById","Selection","$anchor","$head","ranges","SelectionRange","anchor","tr","lastNode","lastParent","mapFrom","steps","mapping","replaceRange","selectionToInsertionEnd","replaceWith","deleteRange","replaceRangeWith","findFrom","$pos","dir","textOnly","TextSelection","findSelectionIn","near","bias","AllSelection","atStart","atEnd","cls","jsonID","id","selectionClass","getBookmark","between","visible","$cursor","ensureMarks","TextBookmark","dPos","NodeSelection","mapResult","deleted","NodeBookmark","isSelectable","selectable","delete","sel","selection","setSelection","AllBookmark","startLen","step","maps","_from","_to","_newFrom","newTo","Transaction","Transform","time","Date","now","curSelection","curSelectionFor","storedMarks","updated","meta","selectionSet","storedMarksSet","isGeneric","scrolledIntoView","setStoredMarks","addStoredMark","removeStoredMark","addStep","setTime","replaceSelection","replaceSelectionWith","inheritMarks","deleteSelection","insertText","setMeta","getMeta","scrollIntoView","FieldDesc","desc","init","apply","baseFields","config","_marks","_old","prev","Configuration","plugins","fields","pluginsByKey","plugin","EditorState","applyTransaction","filterTransaction","rootTr","transactions","trs","newState","applyInner","haveNew","appendTransaction","oldState","newInstance","field","applyListeners","$config","reconfigure","pluginFields","addApplyListener","removeApplyListener","Plugin","props","bindProps","Function","createKey","getState","keys","PluginKey","dispatch","textblockAt","side","findCutBefore","findCutAfter","newlineInCode","code","defaultBlockAt","exitCode","above","splitBlock","can","setNodeMarkup","deleteBarrier","$cut","conn","clearIncompatible","joinMaybeClear","canDelAfter","joinAt","selAfter","range","lift","at","wrap$1","end$1","wrapIn","wrapping","setBlockType","applicable","toggleMark","markApplies","has","ref$2","$from$1","$to$1","removeMark","spaceStart","spaceEnd","addMark","chainCommands","commands","len","arguments","view","backspace","endOfTextblock","del","pcBaseKeymap","macBaseKeymap","baseKeymap","navigator","platform","os","markInputRule","regexp","markEnd","markStart","matchStart","matchEnd","textStart","textEnd","getMarksBetween","filter","item","nodeInputRule","toggleBlockType","toggletype","isList","bullet_list","ordered_list","todo_list","toggleList","listType","itemType","parentList","toggleWrap","updateMark","factor16","pow","recoverIndex","MapResult","recover","StepMap","inverted","diff","recoverOffset","assoc","_map","simple","oldIndex","newIndex","oldSize","newSize","touches","oldStart","newStart","invert","Mapping","mirror","TransformError","appendMap","mirrors","setMirror","appendMapping","startSize","mirr","getMirror","appendMappingInverted","totalSize","inverse","corr","docs","docChanged","mustOverride","maybeStep","failed","getMap","stepsByID","Step","_doc","_mapping","merge","_other","stepType","stepClass","StepResult","fail","fromReplace","e","ReplaceStep","contentBetween","slice$1","ReplaceAroundStep","gapFrom","gapTo","gap","inserted","canCut","liftTarget","innerRange","around","outer","findWrappingOutside","inside","innerMatch","findWrappingInside","withAttrs","canSplit","typesAfter","innerType","index$1","rest","baseType","canJoin","joinPoint","dropPoint","pass","insertPos","mapFragment","mapped","gapStart","gapEnd","splitting","d$1","splitting$1","wrappers","canChangeType","startM","endM","newNode","typeAfter","AddMarkStep","oldSlice","RemoveMarkStep","fitsTrivially","removed","added","removing","adding","newSet","matched","toRemove","found$1","parentType","delSteps","allowed","Fitter","fit","replaceStep","unplaced","frontier","dropFromFragment","count","addToFragment","contentAt","closeNodeStart","contentAfterFits","invalidMarks","closeFragment","oldOpen","newOpen","coveredDepths","findFittable","placeNodes","openMore","dropNode","moveInline","mustMoveInline","placedSize","close","sliceDepth","frontierDepth","inject","openAtEnd","closeFrontierNode","openFrontierNode","taken","openEndCount","findCloseLevel","dropInner","match$1","move","targetDepths","preferredTarget","unshift","defining","preferredTargetIndex","leftNodes","preferredDepth","openDepth","targetDepth","expand","startSteps","point","insertPoint","covered","_hasOwnProperty","isValidEntityCode","fromCodePoint","surrogate1","surrogate2","String","fromCharCode","UNESCAPE_MD_RE","UNESCAPE_ALL_RE","RegExp","source","DIGITAL_ENTITY_TEST_RE","entities","HTML_ESCAPE_TEST_RE","HTML_ESCAPE_REPLACE_RE","HTML_REPLACEMENTS","replaceUnsafeChar","ch","REGEXP_ESCAPE_RE","UNICODE_PUNCT_RE","lib","mdurl","ucmicro","assign","sources","TypeError","isString","_class","unescapeMd","unescapeAll","escaped","entity","parseInt","replaceEntityPattern","escapeHtml","arrayReplaceAt","src","newElements","isSpace","isWhiteSpace","isMdAsciiPunct","isPunctChar","escapeRE","normalizeReference","toUpperCase","InputRule","handler","cutOff","inputRules","stored","handleTextInput","run","handleDOMEvents","compositionend","setTimeout","isInputRules","composing","textBefore","transform","undoInputRule","undoable","toUndo","ellipsis","wrappingInputRule","joinPredicate","textblockTypeInputRule","_setPrototypeOf","setPrototypeOf","_inheritsLoose","subClass","superClass","paragraph","horizontal_rule","heading","code_block","params","order","tight","hasAttribute","list_item","image","alt","draggable","hard_break","em","strong","link","href","MarkdownParseState","tokenHandlers","stack","token","noCloseToken","withoutTrailingNewline","noOp","elt","addText","merged","maybeMerge","openMark","closeMark","parseTokens","toks","openNode","closeNode","info","MarkdownParser","tokenizer","handlers","nodeType$1","children","softbreak","listIsTight","hidden","defaultMarkdownParser","html","attrGet","fence","hardbreak","code_inline","MarkdownSerializer","serialize","MarkdownSerializerState","renderContent","defaultMarkdownSerializer","wrapBlock","write","ensureNewLine","closeBlock","repeat","renderInline","markup","renderList","bullet","maxW","nStr","esc","quote","mixable","expelEnclosingWhitespace","_state","isPlainURL","_mark","backticksFor","escape","ticks","delim","closed","inTightList","tightLists","flushClose","atBlank","delimMin","firstDelim","old","lines","startOfLine","render","trailing","progress","leading","lead","inner$1","trail","noEsc","markString","isTight","prevTight","getEnclosingWhitespace","wrapInList","doJoin","outerRange","$insert","joinBefore","splitDepth","splitPos","doWrapInList","splitListItem","grandParent","keepItem","tr$1","liftListItem","endOfList","liftToOuterList","list","indexBefore","liftOutOfList","sinkListItem","nestedBefore","flarum","core","compat","CommandButton","oninit","vnode","addItem","command","onEditorUpdate","extractText","tooltip","className","onclick","click","onkeydown","keydown","icon","preventDefault","app","translator","trans","Component","_extends","findParentNode","predicate","findParentNodeClosestToPos","findSelectedNodeOfType","isNodeSelection","equalNodeType","getMarkAttrs","markItem","getMarkRange","endPos","markIsActive","nodeIsActive","MarkButton","$","toggleClass","markActive","8","9","10","12","13","16","17","18","20","27","32","33","34","35","36","37","38","39","40","44","45","46","59","61","91","92","106","107","108","109","110","111","144","145","160","161","162","163","164","165","173","186","187","188","189","190","191","192","219","220","221","222","229","48","49","50","51","52","53","54","55","56","57","chrome","userAgent","safari","vendor","gecko","mac","ie","brokenModifierNames","normalizeKeyName","ctrl","mod","modifiers","event","altKey","ctrlKey","metaKey","shiftKey","keymap","bindings","handleKeyDown","keydownHandler","normalize","baseName","keyCode","keyName","isChar","direct","fromCode","withShift","SafariModalHack","oncreate","on","modal","onsubmit","vnodeContent","Modal","FormDropdown","buttonClassName","is","show","toArray","stopPropagation","focus","select","getButtonContent","getMenu","items","ItemList","trigger","composer","editor","Dropdown","ListButton","nodeActive","genMarkupAwareMarkConfig","error","MarkdownSerializerBuilder","buildNodes","spoiler","math_block","buildMarks","spoiler_inline","strike","sup","math_inline","build","genHtmlInlineMarkSpec","spoilerNodeSpec","class","mathBlockNodeSpec","SchemaBuilder","Schema","NodeTypeDropdown","getNodeTypeButtons","getButton","data-toggle","activeIndex","element","innerText","InsertImageDropdown","Stream","placeholder","bidi","required","MenuState","attachEditorView","editorView","getSchema","destroy","markAttrs","selectionEmpty","transaction","RopeSequence","leafAppend","leafPrepend","appendInner","Append","sliceInner","getInner","forEachInner","forEachInvertedInner","values","Leaf","flatten","left","right","leftLen","Branch","eventCount","popEvent","preserveItems","remap","remapping","remaining","addAfter","Item","addTransform","histOptions","newItems","oldItems","lastItem","cutPoint","overflow","DEPTH_OVERFLOW","mirrorPos","mirrorOffset","addMaps","rebased","rebasedTransform","rebasedCount","rebasedItems","newUntil","iRebased","newMaps","branch","emptyItemCount","compress","events","newItem","HistoryState","done","undone","prevRanges","prevTime","rangesFor","mapRanges","histTransaction","history","redo","mustPreserveItems","historyKey","newHist","historyState","cachedPreserveItems","cachedPreserveItemsPlugins","historyPreserveItems","closeHistoryKey","newGroupDelay","hist","historyTr","appended","newGroup","adjacent","isAdjacentTo","undo","ie_edge","ie_upto10","ie_11up","ie_version","documentMode","gecko_version","chrome_version","ios","maxTouchPoints","android","webkit","documentElement","webkit_version","domIndex","parentNode","host","reusedRange","textRange","createRange","setEnd","setStart","isEquivalentPosition","off","targetNode","targetOff","scanFor","atomElements","hasBlockDesc","contentEditable","pmViewDesc","selectionCollapsed","domSel","collapsed","isCollapsed","rangeCount","getRangeAt","keyEvent","createEvent","initEvent","windowRect","clientWidth","bottom","clientHeight","getSide","clientRect","rect","getBoundingClientRect","scrollRectIntoView","startDOM","scrollThreshold","someProp","scrollMargin","atTop","body","bounding","moveX","moveY","defaultView","scrollBy","startX","scrollLeft","startY","scrollTop","dX","dY","scrollStack","restoreScrollStack","dTop","preventScrollSupported","findOffsetInNode","coords","closest","coordsClosest","dxClosest","rowBot","rowTop","childIndex","rects","getClientRects","dx","singleRect","inRect","findOffsetInText","posAtCoords","assign$1","root","caretPositionFromPoint","pos$1","offsetNode","caretRangeFromPoint","startContainer","startOffset","elementFromPoint","box","startI","floor","targetKludge","box$1","outside","docView","nearestDesc","posBefore","posAfter","posFromDOM","posFromCaret","posFromElement","posAtStart","border","BIDI","coordsAtPos","domFromPos","supportEmptyRange","takeSide","flattenV","rectBefore","rectAfter","flattenH","before$1","after$1","target$1","width","x","height","y","withFlushedState","viewState","activeElement","updateState","maybeRTL","cachedState","cachedDir","cachedResult","nearest","boxes","endOfTextblockVertical","getSelection","modify","oldRange","oldNode","focusNode","oldOff","focusOffset","oldBidiLevel","caretBidiLevel","domAfterPos","removeAllRanges","endOfTextblockHorizontal","dirty","beforePosition","posAtEnd","contentLost","domAtom","matchesWidget","matchesMark","matchesNode","matchesHack","parseRule","stopEvent","posBeforeChild","localPosFromDOM","domBefore","domAfter","desc$1","search$1","onlyNodes","getDesc","nodeDOM","descAt","parseRange","fromOffset","toOffset","childBase","emptyChildAt","j$1","force","anchorDOM","headDOM","brKludge","offset$1","anchorNode","anchorOffset","domSelExtended","extend","collapse","DOMException","ignoreMutation","mutation","markDirty","startInside","endInside","markParentsDirty","nothing","WidgetViewDesc","ViewDesc","widget","raw","classList","stop","ignoreSelection","CompositionViewDesc","textDOM","mut","oldValue","MarkViewDesc","custom","nodeViews","replaceNodes","NodeViewDesc","outerDeco","innerDeco","updateChildren","descObj","applyOuterDeco","CustomNodeViewDesc","TextViewDesc","reparseInView","sameOuterDeco","composition","localCompositionNode","updater","ViewTreeUpdater","deco","onWidget","onNode","locals","forChild","decoIndex","restNode","parentIndex","widgets","compareSide","child$1","cutAt","i$3","iterDeco","insideNode","syncToMarks","placeWidget","findNodeMatch","updateNextNode","addTextblockHacks","destroyRest","changed","protectLocalComposition","renderDescs","parentDOM","descs","written","childDOM","rm","insertBefore","trackWrites","oldCSS","cssText","getComputedStyle","listStyle","iosHacks","nearbyTextNode","textPos","childStart","findTextInFragment","removeChild","compositionNodes","updateInner","updateOuterDeco","needsWrap","oldDOM","patchOuterDeco","computeOuterDeco","selectNode","deselectNode","removeAttribute","docViewDesc","pmIsDeco","inParent","BRHackViewDesc","OuterDecoLevel","noDeco","outerDOM","prevComputed","curComputed","curDOM","patchAttributes","prevList","curList","removeProperty","lockedNode","lock","preMatch","preMatched","preMatchOffset","selectionFromDOM","origin","inWidget","isOnEdge","selectionBetween","selectionToDOM","syncNodeSelection","editable","hasFocus","hasSelection","domObserver","disconnectSelection","cursorWrapper","img","disabled","selectCursorWrapper","resetEditableFrom","resetEditableTo","brokenSelectBetweenUneditable","temporarilyEditableNear","resetEditable","removeEventListener","hideSelectionGuard","addEventListener","removeClassOnSelectionChange","setCurSelection","connectSelection","getPreMatch","destroyBetween","maxKeep","markDesc","nextDOM","setEditable","wasDraggable","lastSelectedViewDesc","clearNodeSelection","moveSelectionBlock","$side","selectHorizontally","mods","nodePos","nodeLen","isIgnorable","skipIgnoredNodesLeft","moveNode","moveOffset","isBlockNode","setSelFocus","skipIgnoredNodesRight","selectVertically","beyond","stopNativeHorizontalDelete","nextNode","switchEditable","captureKeyDown","getMods","safariDownArrowBug","readDOMChange","typeOver","addedNodes","lastSelectionTime","lastSelectionOrigin","newSel","shared","from_","to_","lastKeyCode","startDoc","editableContent","anchor$1","parseBetween","preferredPos","preferredSide","compare","lastKeyCodeTime","change","endA","endB","adjust","findDiff","lastIOSEnter","sel$1","resolveSelection","domChangeCount","nextSel","inlineChange","$newStart","$newEnd","skipClosingAndOpening","$next","looksLikeJoin","suppressSelectionUpdates","markChange","$from1","chFrom","chTo","curMarks","prevMarks","isMarkChange","sel$2","parsedSel","fromEnd","mayOpen","serializeForClipboard","serializer","detachedDoc","wrapMap","wrapper","parseFromClipboard","plainText","inCode","asText","parsed","metas","firstTag","innerHTML","readHTML","contextNode","sliceData","addContext","closeRange","closeSlice","lastWrap","inLast","addToSibling","sibling","withWrappers","closeRight","wrapped","normalizeSiblings","thead","tbody","caption","colgroup","col","td","th","_detachedDoc","implementation","createHTMLDocument","observeOptions","childList","characterData","characterDataOldValue","attributes","attributeOldValue","subtree","useCharData","SelectionState","DOMObserver","handleDOMChange","queue","flushingSoon","observer","MutationObserver","mutations","removedNodes","flushSoon","flush","currentSelection","onCharData","prevValue","onSelectionChange","suppressingSelectionUpdates","forceFlush","clearTimeout","observe","take","takeRecords","disconnect","ignoreSelectionChange","container","commonAncestorContainer","result$1","registerMutation","brs","cssChecked","whiteSpace","console","checkCSS","attributeName","editHandlers","setSelectionOrigin","ensureListeners","currentHandlers","eventHandlers","runCustomHandler","defaultPrevented","eventCoords","clientX","clientY","runHandlerOnContext","propName","updateSelection","focused","handleSingleClick","selectedNode","selectAt","selectClickedNode","selectClickedLeaf","handleDoubleClick","handleTripleClick","defaultTripleClick","forceDOMFlush","endComposition","inOrNearComposition","lastIOSEnterFallbackTimeout","keyup","keypress","charCode","selectNodeModifier","mousedown","flushed","lastClick","dy","isNear","mouseDown","targetPos","allowDefault","mightDrag","targetDesc","addAttr","setUneditable","up","abs","timeStamp","compositionEndedAt","touchdown","contextmenu","timeoutComposition","scheduleComposeEnd","delay","composingTimeout","clearComposition","forceUpdate","compositionstart","compositionupdate","markCursor","brokenClipboardAPI","doPaste","singleNode","sliceSingleNode","data","clipboardData","clearData","setData","selectNodeContents","blur","captureCopy","paste","getData","capturePaste","Dragging","dragCopyModifier","dragstart","dataTransfer","dragging","dragend","dragover","dragenter","drop","eventPos","$mouse","isNode","beforeInsert","beforeinput","inputType","compareObjs","WidgetType","noSpec","span","oldOffset","Decoration","valid","InlineType","inclusiveStart","inclusiveEnd","DecorationSet","local","decorations","buildTree","findInner","childOff","mapInner","newLocal","onRemove","oldChildren","oldEnd","newEnd","dSize","mustRebuild","fromLocal","toLocal","childOffset","childNode","gather","mapAndGatherRemainingDecorations","from$1","byPos","mapChildren","addInner","baseOffset","takeSpansForNode","moveSpans","withoutNulls","removeInner","span$1","dec","localSet","DecorationGroup","removeOverlap","localsInner","members","spans","hasNulls","localStart","working","insertAhead","viewDecorations","sorted","EditorView","_props","_root","mount","mounted","getEditable","updateCursorWrapper","buildNodeViews","computeDocDeco","bubbles","eventBelongsToView","initInput","pluginViews","updatePluginViews","contenteditable","updateStateInner","setProps","reconfigured","redraw","updateSel","nA","nB","changedNodeViews","scroll","scrollToSelection","updateDoc","sel1","sel2","refDOM","refTop","newRefTop","oldScrollPos","overflowAnchor","innerHeight","localRect","storeScrollPos","forceSelUpdate","chromeKludge","destroyPluginViews","prevState","pluginView","setActive","preventScroll","focusPreventScroll","getPrototypeOf","domAtPos","posAtDOM","destroyInput","dispatchEvent","dispatchTransaction","DropCursorView","color","cursorPos","timeout","updateOverlay","setCursor","nodeRect","parentLeft","parentTop","offsetParent","position","pageXOffset","pageYOffset","rect$1","scheduleRemoval","dragleave","relatedTarget","GapCursor","GapBookmark","closedBefore","closedAfter","override","allowGapCursor","mustMove","$cur","$cur$1","arrow","axis","dirStr","$found","handleClick","drawGapCursor","dataImageRegex","onClick","orderedListRule","bulletListRule","codeBlockRule","headingRule","maxLevel","blockSpoilerRule","ProseMirrorEditorDriver","MarkdownParserBuilder","buildEditorStateConfig","buildEditorProps","classNames","callInputListeners","inputListeners","listener","oninput","onkeyup","parseInitialValue","buildPluginItems","menuState","buildInputRules","Escape","insertHardBreak","enterCommands","emojiDropdown","mentionsDropdown","session","user","preferences","richTextCompactParagraphs","handleEnter","Backspace","Enter","richTextKeymap","disabled$","curr","transformPastedHTML","parseFromString","querySelectorAll","outerHTML","createSelectionBetween","_view","handleClickOn","handleDoubleClickOn","newDoc","newDocPlaintext","serializeContent","moveCursorTo","setSelectionRange","getSelectionRange","getLastNChars","insertAtCursor","insertBetween","trailingNewLines","endsWith","replaceBeforeCursor","getCaretCoordinates","viewportCoords","editorViewportOffset","isTerminatorChar","tokenize","silent","posMax","md","ruler","disable","blockquoteExt","startLine","endLine","adjustTab","initial","lastLineEmpty","nextLine","oldBMarks","oldBSCount","oldIndent","oldParentType","oldSCount","oldTShift","spaceAfterMarker","terminate","terminatorRules","wasOutdented","oldLineMax","lineMax","bMarks","tShift","eMarks","sCount","blkIndent","followingCharRegex","bsCount","foundExclamation","foundOpen","oldPos","getRules","line","spoilerFn","blockquoteFn","blockSpoiler","__rules__","bqIndex","postProcess","delimiters","loneMarkers","startDelim","marker","endDelim","tokenO","nesting","tokenC","frontPriorMode","scanned","scanDelims","isOdd","jump","can_open","can_close","ruler2","tokens_meta","tokenizerParams","buildTokenizer","markdownit","enable","use","altText","latexPlugin","subPlugin","supPlugin","inlineSpoilerBars","inlineSpoilerTags","buildTokens","HiddenItemsDropdown","buttons","button","ProseMirrorMenu","modifierKey","component","InsertLinkDropdown","hiddenItems","linkAttrs","Ruler","__cache__","__find__","__compile__","chains","enabled","altName","chain","fn","opt","beforeName","ruleName","afterName","ignoreInvalid","idx","enableOnly","chainName","Token","attrIndex","attrPush","attrData","attrSet","attrJoin","encode","decode","format","open_tag","close_tag","HTML_TAG_RE","HTML_OPEN_CLOSE_TAG_RE","isStrong","components","updateToggleMark","proseMirror","markdown","applyEditor","TextEditor","forum","attribute","Button","useRichTextEditor","savePreferences","then","buildEditor","original","buildEditorParams","UNESCAPE_RE","subscript","skipToken","superscript","isValidDelim","prevChar","nextChar","res","firstLine","lastLine","lastPos","getLines","server","purifiedURL","latex","encodeURIComponent","renderer","Inline","Block","utils","helpers","Renderer","ParserCore","ParserBlock","ParserInline","LinkifyIt","punycode","zero","commonmark","BAD_PROTO_RE","GOOD_DATA_RE","validateLink","url","RECODE_HOSTNAME_FOR","normalizeLink","hostname","protocol","toASCII","er","normalizeLinkText","toUnicode","MarkdownIt","presetName","linkify","configure","presets","rules2","missed","args","env","State","process","parseInline","inlineMode","encodeCache","exclude","keepEscaped","nextCode","cache","defaultChars","getEncodeCache","componentChars","decodeCache","getDecodeCache","seq","b1","b2","b3","b4","chr","slashes","auth","port","pathname","hash","Url","protocolPattern","portPattern","simplePathPattern","unwise","autoEscape","nonHostChars","hostEndingChars","hostnamePartPattern","hostnamePartStart","hostlessProtocol","slashedProtocol","slashesDenoteHost","lowerProto","hec","simplePath","proto","substr","atSign","hostEnd","parseHost","ipv6Hostname","hostparts","newpart","k","validParts","notHost","bit","qm","u","Any","Cc","Cf","P","Z","parseLinkLabel","parseLinkDestination","parseLinkTitle","disableNested","prevPos","labelEnd","default_rules","slf","renderAttrs","highlighted","tmpAttrs","tmpToken","langName","highlight","langPrefix","renderInlineAsText","renderToken","xhtmlOut","breaks","html_block","html_inline","nextToken","needLf","_rules","Core","NEWLINES_RE","NULL_RE","isLinkClose","currentToken","ln","htmlLinkLevel","fullUrl","urlText","links","blockTokens","pretest","lastIndex","RARE_RE","SCOPED_ABBR_TEST_RE","SCOPED_ABBR_RE","SCOPED_ABBR","tm","replaceFn","replace_scoped","inlineTokens","inside_autolink","replace_rare","blkIdx","typographer","QUOTE_TEST_RE","QUOTE_RE","replaceAt","process_inlines","thisLevel","lastChar","isLastPunctChar","isNextPunctChar","isLastWhiteSpace","isNextWhiteSpace","canOpen","canClose","isSingle","openQuote","closeQuote","OUTER","single","quotes","StateCore","hasEmptyLines","maxNesting","skipEmptyLines","isEmpty","outTokens","getLine","escapedSplit","escapes","backTicked","lastBackTick","substring","lineText","columns","columnCount","aligns","tableLines","tbodyLines","mem","haveEndMarker","skipChars","skipSpaces","cnt","skipBulletListMarker","skipOrderedListMarker","contentStart","indent","indentAfterMarker","isOrdered","itemLines","listLines","listTokIdx","markerCharCode","markerValue","oldListIndent","oldTight","posAfterMarker","prevEmptyEnd","isTerminatingParagraph","listIndent","markTightParagraphs","_endLine","destEndPos","destEndLineNo","label","references","skipSpacesBack","skipCharsBack","block_names","HTML_SEQUENCES","StateBlock","indent_found","ddIndent","begin","keepLastLF","lineIndent","lineStart","_rules2","pushPending","pmax","ESCAPED","labelStart","parseReference","EMAIL_RE","AUTOLINK_RE","tail","linkMatch","emailMatch","lc","isLetter","DIGITAL_RE","NAMED_RE","processDelimiters","closerIdx","openerIdx","closer","opener","minOpenerIdx","newMinOpenerIdx","isOddMatch","lastJump","openersBottom","StateInline","pendingLevel","_prev_delimiters","token_meta","canSplitWord","left_flanking","right_flanking","isFunction","defaultOptions","fuzzyLink","fuzzyEmail","fuzzyIP","defaultSchemas","validate","http","src_auth","src_host_port_strict","src_path","no_http","src_domain","src_domain_root","src_port","src_host_terminator","mailto","src_email_name","src_host_strict","tlds_default","__opts__","tlds","__tlds__","untpl","tpl","src_tlds","onCompile","__tlds_replaced__","src_xn","email_fuzzy","tpl_email_fuzzy","link_fuzzy","tpl_link_fuzzy","link_no_ip_fuzzy","tpl_link_no_ip_fuzzy","host_fuzzy_test","tpl_host_fuzzy_test","aliases","schemaError","__compiled__","__schemas__","compiled","isRegExp","createValidator","alias","slist","schema_test","src_ZPCc","schema_search","__index__","__text_cache__","resetScanCache","Match","__last_index__","__schema__","createMatch","schemas","acc","definition","ml","me","tld_pos","testSchemaAt","keepOld","el","arr","opts","src_Any","src_Cc","src_Z","src_P","src_ZCc","src_pseudo_letter","src_ip4","src_host","tpl_host_fuzzy","tpl_host_no_ip_fuzzy","tpl_host_fuzzy_strict","tpl_host_port_fuzzy_strict","tpl_host_port_no_ip_fuzzy_strict","freeGlobal","global","maxInt","regexPunycode","regexNonASCII","regexSeparators","errors","stringFromCharCode","mapDomain","ucs2decode","counter","ucs2encode","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","baseMinusTMin","input","basic","oldi","w","baseMinusT","codePoint","inputLength","handledCPCount","basicLength","q","currentValue","handledCPCountPlusOne","qMinusT","webpackPolyfill","deprecate","paths","g","initializers","SettingsPage","FieldSet","composerItems","Switch","onchange","useRichTextEditorLoading","loading","richTextCompactParagraphsLoading"],"mappings":"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","file":"forum.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 114);\n","// ::- Persistent data structure representing an ordered mapping from\n// strings to values, with some convenient update methods.\nfunction OrderedMap(content) {\n this.content = content;\n}\n\nOrderedMap.prototype = {\n constructor: OrderedMap,\n\n find: function(key) {\n for (var i = 0; i < this.content.length; i += 2)\n if (this.content[i] === key) return i\n return -1\n },\n\n // :: (string) → ?any\n // Retrieve the value stored under `key`, or return undefined when\n // no such key exists.\n get: function(key) {\n var found = this.find(key);\n return found == -1 ? undefined : this.content[found + 1]\n },\n\n // :: (string, any, ?string) → OrderedMap\n // Create a new map by replacing the value of `key` with a new\n // value, or adding a binding to the end of the map. If `newKey` is\n // given, the key of the binding will be replaced with that key.\n update: function(key, value, newKey) {\n var self = newKey && newKey != key ? this.remove(newKey) : this;\n var found = self.find(key), content = self.content.slice();\n if (found == -1) {\n content.push(newKey || key, value);\n } else {\n content[found + 1] = value;\n if (newKey) content[found] = newKey;\n }\n return new OrderedMap(content)\n },\n\n // :: (string) → OrderedMap\n // Return a map with the given key removed, if it existed.\n remove: function(key) {\n var found = this.find(key);\n if (found == -1) return this\n var content = this.content.slice();\n content.splice(found, 2);\n return new OrderedMap(content)\n },\n\n // :: (string, any) → OrderedMap\n // Add a new key to the start of the map.\n addToStart: function(key, value) {\n return new OrderedMap([key, value].concat(this.remove(key).content))\n },\n\n // :: (string, any) → OrderedMap\n // Add a new key to the end of the map.\n addToEnd: function(key, value) {\n var content = this.remove(key).content.slice();\n content.push(key, value);\n return new OrderedMap(content)\n },\n\n // :: (string, string, any) → OrderedMap\n // Add a key after the given key. If `place` is not found, the new\n // key is added to the end.\n addBefore: function(place, key, value) {\n var without = this.remove(key), content = without.content.slice();\n var found = without.find(place);\n content.splice(found == -1 ? content.length : found, 0, key, value);\n return new OrderedMap(content)\n },\n\n // :: ((key: string, value: any))\n // Call the given function for each key/value pair in the map, in\n // order.\n forEach: function(f) {\n for (var i = 0; i < this.content.length; i += 2)\n f(this.content[i], this.content[i + 1]);\n },\n\n // :: (union) → OrderedMap\n // Create a new map by prepending the keys in this map that don't\n // appear in `map` before the keys in `map`.\n prepend: function(map) {\n map = OrderedMap.from(map);\n if (!map.size) return this\n return new OrderedMap(map.content.concat(this.subtract(map).content))\n },\n\n // :: (union) → OrderedMap\n // Create a new map by appending the keys in this map that don't\n // appear in `map` after the keys in `map`.\n append: function(map) {\n map = OrderedMap.from(map);\n if (!map.size) return this\n return new OrderedMap(this.subtract(map).content.concat(map.content))\n },\n\n // :: (union) → OrderedMap\n // Create a map containing all the keys in this map that don't\n // appear in `map`.\n subtract: function(map) {\n var result = this;\n map = OrderedMap.from(map);\n for (var i = 0; i < map.content.length; i += 2)\n result = result.remove(map.content[i]);\n return result\n },\n\n // :: number\n // The amount of keys in this map.\n get size() {\n return this.content.length >> 1\n }\n};\n\n// :: (?union) → OrderedMap\n// Return a map with the given content. If null, create an empty\n// map. If given an ordered map, return that map itself. If given an\n// object, create a map from the object's properties.\nOrderedMap.from = function(value) {\n if (value instanceof OrderedMap) return value\n var content = [];\n if (value) for (var prop in value) content.push(prop, value[prop]);\n return new OrderedMap(content)\n};\n\nvar orderedmap = OrderedMap;\n\nexport default orderedmap;\n","import OrderedMap from 'orderedmap';\n\nfunction findDiffStart(a, b, pos) {\n for (var i = 0;; i++) {\n if (i == a.childCount || i == b.childCount)\n { return a.childCount == b.childCount ? null : pos }\n\n var childA = a.child(i), childB = b.child(i);\n if (childA == childB) { pos += childA.nodeSize; continue }\n\n if (!childA.sameMarkup(childB)) { return pos }\n\n if (childA.isText && childA.text != childB.text) {\n for (var j = 0; childA.text[j] == childB.text[j]; j++)\n { pos++; }\n return pos\n }\n if (childA.content.size || childB.content.size) {\n var inner = findDiffStart(childA.content, childB.content, pos + 1);\n if (inner != null) { return inner }\n }\n pos += childA.nodeSize;\n }\n}\n\nfunction findDiffEnd(a, b, posA, posB) {\n for (var iA = a.childCount, iB = b.childCount;;) {\n if (iA == 0 || iB == 0)\n { return iA == iB ? null : {a: posA, b: posB} }\n\n var childA = a.child(--iA), childB = b.child(--iB), size = childA.nodeSize;\n if (childA == childB) {\n posA -= size; posB -= size;\n continue\n }\n\n if (!childA.sameMarkup(childB)) { return {a: posA, b: posB} }\n\n if (childA.isText && childA.text != childB.text) {\n var same = 0, minSize = Math.min(childA.text.length, childB.text.length);\n while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) {\n same++; posA--; posB--;\n }\n return {a: posA, b: posB}\n }\n if (childA.content.size || childB.content.size) {\n var inner = findDiffEnd(childA.content, childB.content, posA - 1, posB - 1);\n if (inner) { return inner }\n }\n posA -= size; posB -= size;\n }\n}\n\n// ::- A fragment represents a node's collection of child nodes.\n//\n// Like nodes, fragments are persistent data structures, and you\n// should not mutate them or their content. Rather, you create new\n// instances whenever needed. The API tries to make this easy.\nvar Fragment = function Fragment(content, size) {\n this.content = content;\n // :: number\n // The size of the fragment, which is the total of the size of its\n // content nodes.\n this.size = size || 0;\n if (size == null) { for (var i = 0; i < content.length; i++)\n { this.size += content[i].nodeSize; } }\n};\n\nvar prototypeAccessors = { firstChild: { configurable: true },lastChild: { configurable: true },childCount: { configurable: true } };\n\n// :: (number, number, (node: Node, start: number, parent: Node, index: number) → ?bool, ?number)\n// Invoke a callback for all descendant nodes between the given two\n// positions (relative to start of this fragment). Doesn't descend\n// into a node when the callback returns `false`.\nFragment.prototype.nodesBetween = function nodesBetween (from, to, f, nodeStart, parent) {\n if ( nodeStart === void 0 ) nodeStart = 0;\n\n for (var i = 0, pos = 0; pos < to; i++) {\n var child = this.content[i], end = pos + child.nodeSize;\n if (end > from && f(child, nodeStart + pos, parent, i) !== false && child.content.size) {\n var start = pos + 1;\n child.nodesBetween(Math.max(0, from - start),\n Math.min(child.content.size, to - start),\n f, nodeStart + start);\n }\n pos = end;\n }\n};\n\n// :: ((node: Node, pos: number, parent: Node) → ?bool)\n// Call the given callback for every descendant node. The callback\n// may return `false` to prevent traversal of a given node's children.\nFragment.prototype.descendants = function descendants (f) {\n this.nodesBetween(0, this.size, f);\n};\n\n// : (number, number, ?string, ?string) → string\nFragment.prototype.textBetween = function textBetween (from, to, blockSeparator, leafText) {\n var text = \"\", separated = true;\n this.nodesBetween(from, to, function (node, pos) {\n if (node.isText) {\n text += node.text.slice(Math.max(from, pos) - pos, to - pos);\n separated = !blockSeparator;\n } else if (node.isLeaf && leafText) {\n text += leafText;\n separated = !blockSeparator;\n } else if (!separated && node.isBlock) {\n text += blockSeparator;\n separated = true;\n }\n }, 0);\n return text\n};\n\n// :: (Fragment) → Fragment\n// Create a new fragment containing the combined content of this\n// fragment and the other.\nFragment.prototype.append = function append (other) {\n if (!other.size) { return this }\n if (!this.size) { return other }\n var last = this.lastChild, first = other.firstChild, content = this.content.slice(), i = 0;\n if (last.isText && last.sameMarkup(first)) {\n content[content.length - 1] = last.withText(last.text + first.text);\n i = 1;\n }\n for (; i < other.content.length; i++) { content.push(other.content[i]); }\n return new Fragment(content, this.size + other.size)\n};\n\n// :: (number, ?number) → Fragment\n// Cut out the sub-fragment between the two given positions.\nFragment.prototype.cut = function cut (from, to) {\n if (to == null) { to = this.size; }\n if (from == 0 && to == this.size) { return this }\n var result = [], size = 0;\n if (to > from) { for (var i = 0, pos = 0; pos < to; i++) {\n var child = this.content[i], end = pos + child.nodeSize;\n if (end > from) {\n if (pos < from || end > to) {\n if (child.isText)\n { child = child.cut(Math.max(0, from - pos), Math.min(child.text.length, to - pos)); }\n else\n { child = child.cut(Math.max(0, from - pos - 1), Math.min(child.content.size, to - pos - 1)); }\n }\n result.push(child);\n size += child.nodeSize;\n }\n pos = end;\n } }\n return new Fragment(result, size)\n};\n\nFragment.prototype.cutByIndex = function cutByIndex (from, to) {\n if (from == to) { return Fragment.empty }\n if (from == 0 && to == this.content.length) { return this }\n return new Fragment(this.content.slice(from, to))\n};\n\n// :: (number, Node) → Fragment\n// Create a new fragment in which the node at the given index is\n// replaced by the given node.\nFragment.prototype.replaceChild = function replaceChild (index, node) {\n var current = this.content[index];\n if (current == node) { return this }\n var copy = this.content.slice();\n var size = this.size + node.nodeSize - current.nodeSize;\n copy[index] = node;\n return new Fragment(copy, size)\n};\n\n// : (Node) → Fragment\n// Create a new fragment by prepending the given node to this\n// fragment.\nFragment.prototype.addToStart = function addToStart (node) {\n return new Fragment([node].concat(this.content), this.size + node.nodeSize)\n};\n\n// : (Node) → Fragment\n// Create a new fragment by appending the given node to this\n// fragment.\nFragment.prototype.addToEnd = function addToEnd (node) {\n return new Fragment(this.content.concat(node), this.size + node.nodeSize)\n};\n\n// :: (Fragment) → bool\n// Compare this fragment to another one.\nFragment.prototype.eq = function eq (other) {\n if (this.content.length != other.content.length) { return false }\n for (var i = 0; i < this.content.length; i++)\n { if (!this.content[i].eq(other.content[i])) { return false } }\n return true\n};\n\n// :: ?Node\n// The first child of the fragment, or `null` if it is empty.\nprototypeAccessors.firstChild.get = function () { return this.content.length ? this.content[0] : null };\n\n// :: ?Node\n// The last child of the fragment, or `null` if it is empty.\nprototypeAccessors.lastChild.get = function () { return this.content.length ? this.content[this.content.length - 1] : null };\n\n// :: number\n// The number of child nodes in this fragment.\nprototypeAccessors.childCount.get = function () { return this.content.length };\n\n// :: (number) → Node\n// Get the child node at the given index. Raise an error when the\n// index is out of range.\nFragment.prototype.child = function child (index) {\n var found = this.content[index];\n if (!found) { throw new RangeError(\"Index \" + index + \" out of range for \" + this) }\n return found\n};\n\n// :: (number) → ?Node\n// Get the child node at the given index, if it exists.\nFragment.prototype.maybeChild = function maybeChild (index) {\n return this.content[index]\n};\n\n// :: ((node: Node, offset: number, index: number))\n// Call `f` for every child node, passing the node, its offset\n// into this parent node, and its index.\nFragment.prototype.forEach = function forEach (f) {\n for (var i = 0, p = 0; i < this.content.length; i++) {\n var child = this.content[i];\n f(child, p, i);\n p += child.nodeSize;\n }\n};\n\n// :: (Fragment) → ?number\n// Find the first position at which this fragment and another\n// fragment differ, or `null` if they are the same.\nFragment.prototype.findDiffStart = function findDiffStart$1 (other, pos) {\n if ( pos === void 0 ) pos = 0;\n\n return findDiffStart(this, other, pos)\n};\n\n// :: (Fragment) → ?{a: number, b: number}\n// Find the first position, searching from the end, at which this\n// fragment and the given fragment differ, or `null` if they are the\n// same. Since this position will not be the same in both nodes, an\n// object with two separate positions is returned.\nFragment.prototype.findDiffEnd = function findDiffEnd$1 (other, pos, otherPos) {\n if ( pos === void 0 ) pos = this.size;\n if ( otherPos === void 0 ) otherPos = other.size;\n\n return findDiffEnd(this, other, pos, otherPos)\n};\n\n// : (number, ?number) → {index: number, offset: number}\n// Find the index and inner offset corresponding to a given relative\n// position in this fragment. The result object will be reused\n// (overwritten) the next time the function is called. (Not public.)\nFragment.prototype.findIndex = function findIndex (pos, round) {\n if ( round === void 0 ) round = -1;\n\n if (pos == 0) { return retIndex(0, pos) }\n if (pos == this.size) { return retIndex(this.content.length, pos) }\n if (pos > this.size || pos < 0) { throw new RangeError((\"Position \" + pos + \" outside of fragment (\" + (this) + \")\")) }\n for (var i = 0, curPos = 0;; i++) {\n var cur = this.child(i), end = curPos + cur.nodeSize;\n if (end >= pos) {\n if (end == pos || round > 0) { return retIndex(i + 1, end) }\n return retIndex(i, curPos)\n }\n curPos = end;\n }\n};\n\n// :: () → string\n// Return a debugging string that describes this fragment.\nFragment.prototype.toString = function toString () { return \"<\" + this.toStringInner() + \">\" };\n\nFragment.prototype.toStringInner = function toStringInner () { return this.content.join(\", \") };\n\n// :: () → ?Object\n// Create a JSON-serializeable representation of this fragment.\nFragment.prototype.toJSON = function toJSON () {\n return this.content.length ? this.content.map(function (n) { return n.toJSON(); }) : null\n};\n\n// :: (Schema, ?Object) → Fragment\n// Deserialize a fragment from its JSON representation.\nFragment.fromJSON = function fromJSON (schema, value) {\n if (!value) { return Fragment.empty }\n if (!Array.isArray(value)) { throw new RangeError(\"Invalid input for Fragment.fromJSON\") }\n return new Fragment(value.map(schema.nodeFromJSON))\n};\n\n// :: ([Node]) → Fragment\n// Build a fragment from an array of nodes. Ensures that adjacent\n// text nodes with the same marks are joined together.\nFragment.fromArray = function fromArray (array) {\n if (!array.length) { return Fragment.empty }\n var joined, size = 0;\n for (var i = 0; i < array.length; i++) {\n var node = array[i];\n size += node.nodeSize;\n if (i && node.isText && array[i - 1].sameMarkup(node)) {\n if (!joined) { joined = array.slice(0, i); }\n joined[joined.length - 1] = node.withText(joined[joined.length - 1].text + node.text);\n } else if (joined) {\n joined.push(node);\n }\n }\n return new Fragment(joined || array, size)\n};\n\n// :: (?union) → Fragment\n// Create a fragment from something that can be interpreted as a set\n// of nodes. For `null`, it returns the empty fragment. For a\n// fragment, the fragment itself. For a node or array of nodes, a\n// fragment containing those nodes.\nFragment.from = function from (nodes) {\n if (!nodes) { return Fragment.empty }\n if (nodes instanceof Fragment) { return nodes }\n if (Array.isArray(nodes)) { return this.fromArray(nodes) }\n if (nodes.attrs) { return new Fragment([nodes], nodes.nodeSize) }\n throw new RangeError(\"Can not convert \" + nodes + \" to a Fragment\" +\n (nodes.nodesBetween ? \" (looks like multiple versions of prosemirror-model were loaded)\" : \"\"))\n};\n\nObject.defineProperties( Fragment.prototype, prototypeAccessors );\n\nvar found = {index: 0, offset: 0};\nfunction retIndex(index, offset) {\n found.index = index;\n found.offset = offset;\n return found\n}\n\n// :: Fragment\n// An empty fragment. Intended to be reused whenever a node doesn't\n// contain anything (rather than allocating a new empty fragment for\n// each leaf node).\nFragment.empty = new Fragment([], 0);\n\nfunction compareDeep(a, b) {\n if (a === b) { return true }\n if (!(a && typeof a == \"object\") ||\n !(b && typeof b == \"object\")) { return false }\n var array = Array.isArray(a);\n if (Array.isArray(b) != array) { return false }\n if (array) {\n if (a.length != b.length) { return false }\n for (var i = 0; i < a.length; i++) { if (!compareDeep(a[i], b[i])) { return false } }\n } else {\n for (var p in a) { if (!(p in b) || !compareDeep(a[p], b[p])) { return false } }\n for (var p$1 in b) { if (!(p$1 in a)) { return false } }\n }\n return true\n}\n\n// ::- A mark is a piece of information that can be attached to a node,\n// such as it being emphasized, in code font, or a link. It has a type\n// and optionally a set of attributes that provide further information\n// (such as the target of the link). Marks are created through a\n// `Schema`, which controls which types exist and which\n// attributes they have.\nvar Mark = function Mark(type, attrs) {\n // :: MarkType\n // The type of this mark.\n this.type = type;\n // :: Object\n // The attributes associated with this mark.\n this.attrs = attrs;\n};\n\n// :: ([Mark]) → [Mark]\n// Given a set of marks, create a new set which contains this one as\n// well, in the right position. If this mark is already in the set,\n// the set itself is returned. If any marks that are set to be\n// [exclusive](#model.MarkSpec.excludes) with this mark are present,\n// those are replaced by this one.\nMark.prototype.addToSet = function addToSet (set) {\n var copy, placed = false;\n for (var i = 0; i < set.length; i++) {\n var other = set[i];\n if (this.eq(other)) { return set }\n if (this.type.excludes(other.type)) {\n if (!copy) { copy = set.slice(0, i); }\n } else if (other.type.excludes(this.type)) {\n return set\n } else {\n if (!placed && other.type.rank > this.type.rank) {\n if (!copy) { copy = set.slice(0, i); }\n copy.push(this);\n placed = true;\n }\n if (copy) { copy.push(other); }\n }\n }\n if (!copy) { copy = set.slice(); }\n if (!placed) { copy.push(this); }\n return copy\n};\n\n// :: ([Mark]) → [Mark]\n// Remove this mark from the given set, returning a new set. If this\n// mark is not in the set, the set itself is returned.\nMark.prototype.removeFromSet = function removeFromSet (set) {\n for (var i = 0; i < set.length; i++)\n { if (this.eq(set[i]))\n { return set.slice(0, i).concat(set.slice(i + 1)) } }\n return set\n};\n\n// :: ([Mark]) → bool\n// Test whether this mark is in the given set of marks.\nMark.prototype.isInSet = function isInSet (set) {\n for (var i = 0; i < set.length; i++)\n { if (this.eq(set[i])) { return true } }\n return false\n};\n\n// :: (Mark) → bool\n// Test whether this mark has the same type and attributes as\n// another mark.\nMark.prototype.eq = function eq (other) {\n return this == other ||\n (this.type == other.type && compareDeep(this.attrs, other.attrs))\n};\n\n// :: () → Object\n// Convert this mark to a JSON-serializeable representation.\nMark.prototype.toJSON = function toJSON () {\n var obj = {type: this.type.name};\n for (var _ in this.attrs) {\n obj.attrs = this.attrs;\n break\n }\n return obj\n};\n\n// :: (Schema, Object) → Mark\nMark.fromJSON = function fromJSON (schema, json) {\n if (!json) { throw new RangeError(\"Invalid input for Mark.fromJSON\") }\n var type = schema.marks[json.type];\n if (!type) { throw new RangeError((\"There is no mark type \" + (json.type) + \" in this schema\")) }\n return type.create(json.attrs)\n};\n\n// :: ([Mark], [Mark]) → bool\n// Test whether two sets of marks are identical.\nMark.sameSet = function sameSet (a, b) {\n if (a == b) { return true }\n if (a.length != b.length) { return false }\n for (var i = 0; i < a.length; i++)\n { if (!a[i].eq(b[i])) { return false } }\n return true\n};\n\n// :: (?union) → [Mark]\n// Create a properly sorted mark set from null, a single mark, or an\n// unsorted array of marks.\nMark.setFrom = function setFrom (marks) {\n if (!marks || marks.length == 0) { return Mark.none }\n if (marks instanceof Mark) { return [marks] }\n var copy = marks.slice();\n copy.sort(function (a, b) { return a.type.rank - b.type.rank; });\n return copy\n};\n\n// :: [Mark] The empty set of marks.\nMark.none = [];\n\n// ReplaceError:: class extends Error\n// Error type raised by [`Node.replace`](#model.Node.replace) when\n// given an invalid replacement.\n\nfunction ReplaceError(message) {\n var err = Error.call(this, message);\n err.__proto__ = ReplaceError.prototype;\n return err\n}\n\nReplaceError.prototype = Object.create(Error.prototype);\nReplaceError.prototype.constructor = ReplaceError;\nReplaceError.prototype.name = \"ReplaceError\";\n\n// ::- A slice represents a piece cut out of a larger document. It\n// stores not only a fragment, but also the depth up to which nodes on\n// both side are ‘open’ (cut through).\nvar Slice = function Slice(content, openStart, openEnd) {\n // :: Fragment The slice's content.\n this.content = content;\n // :: number The open depth at the start.\n this.openStart = openStart;\n // :: number The open depth at the end.\n this.openEnd = openEnd;\n};\n\nvar prototypeAccessors$1 = { size: { configurable: true } };\n\n// :: number\n// The size this slice would add when inserted into a document.\nprototypeAccessors$1.size.get = function () {\n return this.content.size - this.openStart - this.openEnd\n};\n\nSlice.prototype.insertAt = function insertAt (pos, fragment) {\n var content = insertInto(this.content, pos + this.openStart, fragment, null);\n return content && new Slice(content, this.openStart, this.openEnd)\n};\n\nSlice.prototype.removeBetween = function removeBetween (from, to) {\n return new Slice(removeRange(this.content, from + this.openStart, to + this.openStart), this.openStart, this.openEnd)\n};\n\n// :: (Slice) → bool\n// Tests whether this slice is equal to another slice.\nSlice.prototype.eq = function eq (other) {\n return this.content.eq(other.content) && this.openStart == other.openStart && this.openEnd == other.openEnd\n};\n\nSlice.prototype.toString = function toString () {\n return this.content + \"(\" + this.openStart + \",\" + this.openEnd + \")\"\n};\n\n// :: () → ?Object\n// Convert a slice to a JSON-serializable representation.\nSlice.prototype.toJSON = function toJSON () {\n if (!this.content.size) { return null }\n var json = {content: this.content.toJSON()};\n if (this.openStart > 0) { json.openStart = this.openStart; }\n if (this.openEnd > 0) { json.openEnd = this.openEnd; }\n return json\n};\n\n// :: (Schema, ?Object) → Slice\n// Deserialize a slice from its JSON representation.\nSlice.fromJSON = function fromJSON (schema, json) {\n if (!json) { return Slice.empty }\n var openStart = json.openStart || 0, openEnd = json.openEnd || 0;\n if (typeof openStart != \"number\" || typeof openEnd != \"number\")\n { throw new RangeError(\"Invalid input for Slice.fromJSON\") }\n return new Slice(Fragment.fromJSON(schema, json.content), openStart, openEnd)\n};\n\n// :: (Fragment, ?bool) → Slice\n// Create a slice from a fragment by taking the maximum possible\n// open value on both side of the fragment.\nSlice.maxOpen = function maxOpen (fragment, openIsolating) {\n if ( openIsolating === void 0 ) openIsolating=true;\n\n var openStart = 0, openEnd = 0;\n for (var n = fragment.firstChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.firstChild) { openStart++; }\n for (var n$1 = fragment.lastChild; n$1 && !n$1.isLeaf && (openIsolating || !n$1.type.spec.isolating); n$1 = n$1.lastChild) { openEnd++; }\n return new Slice(fragment, openStart, openEnd)\n};\n\nObject.defineProperties( Slice.prototype, prototypeAccessors$1 );\n\nfunction removeRange(content, from, to) {\n var ref = content.findIndex(from);\n var index = ref.index;\n var offset = ref.offset;\n var child = content.maybeChild(index);\n var ref$1 = content.findIndex(to);\n var indexTo = ref$1.index;\n var offsetTo = ref$1.offset;\n if (offset == from || child.isText) {\n if (offsetTo != to && !content.child(indexTo).isText) { throw new RangeError(\"Removing non-flat range\") }\n return content.cut(0, from).append(content.cut(to))\n }\n if (index != indexTo) { throw new RangeError(\"Removing non-flat range\") }\n return content.replaceChild(index, child.copy(removeRange(child.content, from - offset - 1, to - offset - 1)))\n}\n\nfunction insertInto(content, dist, insert, parent) {\n var ref = content.findIndex(dist);\n var index = ref.index;\n var offset = ref.offset;\n var child = content.maybeChild(index);\n if (offset == dist || child.isText) {\n if (parent && !parent.canReplace(index, index, insert)) { return null }\n return content.cut(0, dist).append(insert).append(content.cut(dist))\n }\n var inner = insertInto(child.content, dist - offset - 1, insert);\n return inner && content.replaceChild(index, child.copy(inner))\n}\n\n// :: Slice\n// The empty slice.\nSlice.empty = new Slice(Fragment.empty, 0, 0);\n\nfunction replace($from, $to, slice) {\n if (slice.openStart > $from.depth)\n { throw new ReplaceError(\"Inserted content deeper than insertion position\") }\n if ($from.depth - slice.openStart != $to.depth - slice.openEnd)\n { throw new ReplaceError(\"Inconsistent open depths\") }\n return replaceOuter($from, $to, slice, 0)\n}\n\nfunction replaceOuter($from, $to, slice, depth) {\n var index = $from.index(depth), node = $from.node(depth);\n if (index == $to.index(depth) && depth < $from.depth - slice.openStart) {\n var inner = replaceOuter($from, $to, slice, depth + 1);\n return node.copy(node.content.replaceChild(index, inner))\n } else if (!slice.content.size) {\n return close(node, replaceTwoWay($from, $to, depth))\n } else if (!slice.openStart && !slice.openEnd && $from.depth == depth && $to.depth == depth) { // Simple, flat case\n var parent = $from.parent, content = parent.content;\n return close(parent, content.cut(0, $from.parentOffset).append(slice.content).append(content.cut($to.parentOffset)))\n } else {\n var ref = prepareSliceForReplace(slice, $from);\n var start = ref.start;\n var end = ref.end;\n return close(node, replaceThreeWay($from, start, end, $to, depth))\n }\n}\n\nfunction checkJoin(main, sub) {\n if (!sub.type.compatibleContent(main.type))\n { throw new ReplaceError(\"Cannot join \" + sub.type.name + \" onto \" + main.type.name) }\n}\n\nfunction joinable($before, $after, depth) {\n var node = $before.node(depth);\n checkJoin(node, $after.node(depth));\n return node\n}\n\nfunction addNode(child, target) {\n var last = target.length - 1;\n if (last >= 0 && child.isText && child.sameMarkup(target[last]))\n { target[last] = child.withText(target[last].text + child.text); }\n else\n { target.push(child); }\n}\n\nfunction addRange($start, $end, depth, target) {\n var node = ($end || $start).node(depth);\n var startIndex = 0, endIndex = $end ? $end.index(depth) : node.childCount;\n if ($start) {\n startIndex = $start.index(depth);\n if ($start.depth > depth) {\n startIndex++;\n } else if ($start.textOffset) {\n addNode($start.nodeAfter, target);\n startIndex++;\n }\n }\n for (var i = startIndex; i < endIndex; i++) { addNode(node.child(i), target); }\n if ($end && $end.depth == depth && $end.textOffset)\n { addNode($end.nodeBefore, target); }\n}\n\nfunction close(node, content) {\n if (!node.type.validContent(content))\n { throw new ReplaceError(\"Invalid content for node \" + node.type.name) }\n return node.copy(content)\n}\n\nfunction replaceThreeWay($from, $start, $end, $to, depth) {\n var openStart = $from.depth > depth && joinable($from, $start, depth + 1);\n var openEnd = $to.depth > depth && joinable($end, $to, depth + 1);\n\n var content = [];\n addRange(null, $from, depth, content);\n if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {\n checkJoin(openStart, openEnd);\n addNode(close(openStart, replaceThreeWay($from, $start, $end, $to, depth + 1)), content);\n } else {\n if (openStart)\n { addNode(close(openStart, replaceTwoWay($from, $start, depth + 1)), content); }\n addRange($start, $end, depth, content);\n if (openEnd)\n { addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content); }\n }\n addRange($to, null, depth, content);\n return new Fragment(content)\n}\n\nfunction replaceTwoWay($from, $to, depth) {\n var content = [];\n addRange(null, $from, depth, content);\n if ($from.depth > depth) {\n var type = joinable($from, $to, depth + 1);\n addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content);\n }\n addRange($to, null, depth, content);\n return new Fragment(content)\n}\n\nfunction prepareSliceForReplace(slice, $along) {\n var extra = $along.depth - slice.openStart, parent = $along.node(extra);\n var node = parent.copy(slice.content);\n for (var i = extra - 1; i >= 0; i--)\n { node = $along.node(i).copy(Fragment.from(node)); }\n return {start: node.resolveNoCache(slice.openStart + extra),\n end: node.resolveNoCache(node.content.size - slice.openEnd - extra)}\n}\n\n// ::- You can [_resolve_](#model.Node.resolve) a position to get more\n// information about it. Objects of this class represent such a\n// resolved position, providing various pieces of context information,\n// and some helper methods.\n//\n// Throughout this interface, methods that take an optional `depth`\n// parameter will interpret undefined as `this.depth` and negative\n// numbers as `this.depth + value`.\nvar ResolvedPos = function ResolvedPos(pos, path, parentOffset) {\n // :: number The position that was resolved.\n this.pos = pos;\n this.path = path;\n // :: number\n // The number of levels the parent node is from the root. If this\n // position points directly into the root node, it is 0. If it\n // points into a top-level paragraph, 1, and so on.\n this.depth = path.length / 3 - 1;\n // :: number The offset this position has into its parent node.\n this.parentOffset = parentOffset;\n};\n\nvar prototypeAccessors$2 = { parent: { configurable: true },doc: { configurable: true },textOffset: { configurable: true },nodeAfter: { configurable: true },nodeBefore: { configurable: true } };\n\nResolvedPos.prototype.resolveDepth = function resolveDepth (val) {\n if (val == null) { return this.depth }\n if (val < 0) { return this.depth + val }\n return val\n};\n\n// :: Node\n// The parent node that the position points into. Note that even if\n// a position points into a text node, that node is not considered\n// the parent—text nodes are ‘flat’ in this model, and have no content.\nprototypeAccessors$2.parent.get = function () { return this.node(this.depth) };\n\n// :: Node\n// The root node in which the position was resolved.\nprototypeAccessors$2.doc.get = function () { return this.node(0) };\n\n// :: (?number) → Node\n// The ancestor node at the given level. `p.node(p.depth)` is the\n// same as `p.parent`.\nResolvedPos.prototype.node = function node (depth) { return this.path[this.resolveDepth(depth) * 3] };\n\n// :: (?number) → number\n// The index into the ancestor at the given level. If this points at\n// the 3rd node in the 2nd paragraph on the top level, for example,\n// `p.index(0)` is 1 and `p.index(1)` is 2.\nResolvedPos.prototype.index = function index (depth) { return this.path[this.resolveDepth(depth) * 3 + 1] };\n\n// :: (?number) → number\n// The index pointing after this position into the ancestor at the\n// given level.\nResolvedPos.prototype.indexAfter = function indexAfter (depth) {\n depth = this.resolveDepth(depth);\n return this.index(depth) + (depth == this.depth && !this.textOffset ? 0 : 1)\n};\n\n// :: (?number) → number\n// The (absolute) position at the start of the node at the given\n// level.\nResolvedPos.prototype.start = function start (depth) {\n depth = this.resolveDepth(depth);\n return depth == 0 ? 0 : this.path[depth * 3 - 1] + 1\n};\n\n// :: (?number) → number\n// The (absolute) position at the end of the node at the given\n// level.\nResolvedPos.prototype.end = function end (depth) {\n depth = this.resolveDepth(depth);\n return this.start(depth) + this.node(depth).content.size\n};\n\n// :: (?number) → number\n// The (absolute) position directly before the wrapping node at the\n// given level, or, when `depth` is `this.depth + 1`, the original\n// position.\nResolvedPos.prototype.before = function before (depth) {\n depth = this.resolveDepth(depth);\n if (!depth) { throw new RangeError(\"There is no position before the top-level node\") }\n return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1]\n};\n\n// :: (?number) → number\n// The (absolute) position directly after the wrapping node at the\n// given level, or the original position when `depth` is `this.depth + 1`.\nResolvedPos.prototype.after = function after (depth) {\n depth = this.resolveDepth(depth);\n if (!depth) { throw new RangeError(\"There is no position after the top-level node\") }\n return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1] + this.path[depth * 3].nodeSize\n};\n\n// :: number\n// When this position points into a text node, this returns the\n// distance between the position and the start of the text node.\n// Will be zero for positions that point between nodes.\nprototypeAccessors$2.textOffset.get = function () { return this.pos - this.path[this.path.length - 1] };\n\n// :: ?Node\n// Get the node directly after the position, if any. If the position\n// points into a text node, only the part of that node after the\n// position is returned.\nprototypeAccessors$2.nodeAfter.get = function () {\n var parent = this.parent, index = this.index(this.depth);\n if (index == parent.childCount) { return null }\n var dOff = this.pos - this.path[this.path.length - 1], child = parent.child(index);\n return dOff ? parent.child(index).cut(dOff) : child\n};\n\n// :: ?Node\n// Get the node directly before the position, if any. If the\n// position points into a text node, only the part of that node\n// before the position is returned.\nprototypeAccessors$2.nodeBefore.get = function () {\n var index = this.index(this.depth);\n var dOff = this.pos - this.path[this.path.length - 1];\n if (dOff) { return this.parent.child(index).cut(0, dOff) }\n return index == 0 ? null : this.parent.child(index - 1)\n};\n\n// :: (number, ?number) → number\n// Get the position at the given index in the parent node at the\n// given depth (which defaults to `this.depth`).\nResolvedPos.prototype.posAtIndex = function posAtIndex (index, depth) {\n depth = this.resolveDepth(depth);\n var node = this.path[depth * 3], pos = depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n for (var i = 0; i < index; i++) { pos += node.child(i).nodeSize; }\n return pos\n};\n\n// :: () → [Mark]\n// Get the marks at this position, factoring in the surrounding\n// marks' [`inclusive`](#model.MarkSpec.inclusive) property. If the\n// position is at the start of a non-empty node, the marks of the\n// node after it (if any) are returned.\nResolvedPos.prototype.marks = function marks () {\n var parent = this.parent, index = this.index();\n\n // In an empty parent, return the empty array\n if (parent.content.size == 0) { return Mark.none }\n\n // When inside a text node, just return the text node's marks\n if (this.textOffset) { return parent.child(index).marks }\n\n var main = parent.maybeChild(index - 1), other = parent.maybeChild(index);\n // If the `after` flag is true of there is no node before, make\n // the node after this position the main reference.\n if (!main) { var tmp = main; main = other; other = tmp; }\n\n // Use all marks in the main node, except those that have\n // `inclusive` set to false and are not present in the other node.\n var marks = main.marks;\n for (var i = 0; i < marks.length; i++)\n { if (marks[i].type.spec.inclusive === false && (!other || !marks[i].isInSet(other.marks)))\n { marks = marks[i--].removeFromSet(marks); } }\n\n return marks\n};\n\n// :: (ResolvedPos) → ?[Mark]\n// Get the marks after the current position, if any, except those\n// that are non-inclusive and not present at position `$end`. This\n// is mostly useful for getting the set of marks to preserve after a\n// deletion. Will return `null` if this position is at the end of\n// its parent node or its parent node isn't a textblock (in which\n// case no marks should be preserved).\nResolvedPos.prototype.marksAcross = function marksAcross ($end) {\n var after = this.parent.maybeChild(this.index());\n if (!after || !after.isInline) { return null }\n\n var marks = after.marks, next = $end.parent.maybeChild($end.index());\n for (var i = 0; i < marks.length; i++)\n { if (marks[i].type.spec.inclusive === false && (!next || !marks[i].isInSet(next.marks)))\n { marks = marks[i--].removeFromSet(marks); } }\n return marks\n};\n\n// :: (number) → number\n// The depth up to which this position and the given (non-resolved)\n// position share the same parent nodes.\nResolvedPos.prototype.sharedDepth = function sharedDepth (pos) {\n for (var depth = this.depth; depth > 0; depth--)\n { if (this.start(depth) <= pos && this.end(depth) >= pos) { return depth } }\n return 0\n};\n\n// :: (?ResolvedPos, ?(Node) → bool) → ?NodeRange\n// Returns a range based on the place where this position and the\n// given position diverge around block content. If both point into\n// the same textblock, for example, a range around that textblock\n// will be returned. If they point into different blocks, the range\n// around those blocks in their shared ancestor is returned. You can\n// pass in an optional predicate that will be called with a parent\n// node to see if a range into that parent is acceptable.\nResolvedPos.prototype.blockRange = function blockRange (other, pred) {\n if ( other === void 0 ) other = this;\n\n if (other.pos < this.pos) { return other.blockRange(this) }\n for (var d = this.depth - (this.parent.inlineContent || this.pos == other.pos ? 1 : 0); d >= 0; d--)\n { if (other.pos <= this.end(d) && (!pred || pred(this.node(d))))\n { return new NodeRange(this, other, d) } }\n};\n\n// :: (ResolvedPos) → bool\n// Query whether the given position shares the same parent node.\nResolvedPos.prototype.sameParent = function sameParent (other) {\n return this.pos - this.parentOffset == other.pos - other.parentOffset\n};\n\n// :: (ResolvedPos) → ResolvedPos\n// Return the greater of this and the given position.\nResolvedPos.prototype.max = function max (other) {\n return other.pos > this.pos ? other : this\n};\n\n// :: (ResolvedPos) → ResolvedPos\n// Return the smaller of this and the given position.\nResolvedPos.prototype.min = function min (other) {\n return other.pos < this.pos ? other : this\n};\n\nResolvedPos.prototype.toString = function toString () {\n var str = \"\";\n for (var i = 1; i <= this.depth; i++)\n { str += (str ? \"/\" : \"\") + this.node(i).type.name + \"_\" + this.index(i - 1); }\n return str + \":\" + this.parentOffset\n};\n\nResolvedPos.resolve = function resolve (doc, pos) {\n if (!(pos >= 0 && pos <= doc.content.size)) { throw new RangeError(\"Position \" + pos + \" out of range\") }\n var path = [];\n var start = 0, parentOffset = pos;\n for (var node = doc;;) {\n var ref = node.content.findIndex(parentOffset);\n var index = ref.index;\n var offset = ref.offset;\n var rem = parentOffset - offset;\n path.push(node, index, start + offset);\n if (!rem) { break }\n node = node.child(index);\n if (node.isText) { break }\n parentOffset = rem - 1;\n start += offset + 1;\n }\n return new ResolvedPos(pos, path, parentOffset)\n};\n\nResolvedPos.resolveCached = function resolveCached (doc, pos) {\n for (var i = 0; i < resolveCache.length; i++) {\n var cached = resolveCache[i];\n if (cached.pos == pos && cached.doc == doc) { return cached }\n }\n var result = resolveCache[resolveCachePos] = ResolvedPos.resolve(doc, pos);\n resolveCachePos = (resolveCachePos + 1) % resolveCacheSize;\n return result\n};\n\nObject.defineProperties( ResolvedPos.prototype, prototypeAccessors$2 );\n\nvar resolveCache = [], resolveCachePos = 0, resolveCacheSize = 12;\n\n// ::- Represents a flat range of content, i.e. one that starts and\n// ends in the same node.\nvar NodeRange = function NodeRange($from, $to, depth) {\n // :: ResolvedPos A resolved position along the start of the\n // content. May have a `depth` greater than this object's `depth`\n // property, since these are the positions that were used to\n // compute the range, not re-resolved positions directly at its\n // boundaries.\n this.$from = $from;\n // :: ResolvedPos A position along the end of the content. See\n // caveat for [`$from`](#model.NodeRange.$from).\n this.$to = $to;\n // :: number The depth of the node that this range points into.\n this.depth = depth;\n};\n\nvar prototypeAccessors$1$1 = { start: { configurable: true },end: { configurable: true },parent: { configurable: true },startIndex: { configurable: true },endIndex: { configurable: true } };\n\n// :: number The position at the start of the range.\nprototypeAccessors$1$1.start.get = function () { return this.$from.before(this.depth + 1) };\n// :: number The position at the end of the range.\nprototypeAccessors$1$1.end.get = function () { return this.$to.after(this.depth + 1) };\n\n// :: Node The parent node that the range points into.\nprototypeAccessors$1$1.parent.get = function () { return this.$from.node(this.depth) };\n// :: number The start index of the range in the parent node.\nprototypeAccessors$1$1.startIndex.get = function () { return this.$from.index(this.depth) };\n// :: number The end index of the range in the parent node.\nprototypeAccessors$1$1.endIndex.get = function () { return this.$to.indexAfter(this.depth) };\n\nObject.defineProperties( NodeRange.prototype, prototypeAccessors$1$1 );\n\nvar emptyAttrs = Object.create(null);\n\n// ::- This class represents a node in the tree that makes up a\n// ProseMirror document. So a document is an instance of `Node`, with\n// children that are also instances of `Node`.\n//\n// Nodes are persistent data structures. Instead of changing them, you\n// create new ones with the content you want. Old ones keep pointing\n// at the old document shape. This is made cheaper by sharing\n// structure between the old and new data as much as possible, which a\n// tree shape like this (without back pointers) makes easy.\n//\n// **Do not** directly mutate the properties of a `Node` object. See\n// [the guide](/docs/guide/#doc) for more information.\nvar Node = function Node(type, attrs, content, marks) {\n // :: NodeType\n // The type of node that this is.\n this.type = type;\n\n // :: Object\n // An object mapping attribute names to values. The kind of\n // attributes allowed and required are\n // [determined](#model.NodeSpec.attrs) by the node type.\n this.attrs = attrs;\n\n // :: Fragment\n // A container holding the node's children.\n this.content = content || Fragment.empty;\n\n // :: [Mark]\n // The marks (things like whether it is emphasized or part of a\n // link) applied to this node.\n this.marks = marks || Mark.none;\n};\n\nvar prototypeAccessors$3 = { nodeSize: { configurable: true },childCount: { configurable: true },textContent: { configurable: true },firstChild: { configurable: true },lastChild: { configurable: true },isBlock: { configurable: true },isTextblock: { configurable: true },inlineContent: { configurable: true },isInline: { configurable: true },isText: { configurable: true },isLeaf: { configurable: true },isAtom: { configurable: true } };\n\n// text:: ?string\n// For text nodes, this contains the node's text content.\n\n// :: number\n// The size of this node, as defined by the integer-based [indexing\n// scheme](/docs/guide/#doc.indexing). For text nodes, this is the\n// amount of characters. For other leaf nodes, it is one. For\n// non-leaf nodes, it is the size of the content plus two (the start\n// and end token).\nprototypeAccessors$3.nodeSize.get = function () { return this.isLeaf ? 1 : 2 + this.content.size };\n\n// :: number\n// The number of children that the node has.\nprototypeAccessors$3.childCount.get = function () { return this.content.childCount };\n\n// :: (number) → Node\n// Get the child node at the given index. Raises an error when the\n// index is out of range.\nNode.prototype.child = function child (index) { return this.content.child(index) };\n\n// :: (number) → ?Node\n// Get the child node at the given index, if it exists.\nNode.prototype.maybeChild = function maybeChild (index) { return this.content.maybeChild(index) };\n\n// :: ((node: Node, offset: number, index: number))\n// Call `f` for every child node, passing the node, its offset\n// into this parent node, and its index.\nNode.prototype.forEach = function forEach (f) { this.content.forEach(f); };\n\n// :: (number, number, (node: Node, pos: number, parent: Node, index: number) → ?bool, ?number)\n// Invoke a callback for all descendant nodes recursively between\n// the given two positions that are relative to start of this node's\n// content. The callback is invoked with the node, its\n// parent-relative position, its parent node, and its child index.\n// When the callback returns false for a given node, that node's\n// children will not be recursed over. The last parameter can be\n// used to specify a starting position to count from.\nNode.prototype.nodesBetween = function nodesBetween (from, to, f, startPos) {\n if ( startPos === void 0 ) startPos = 0;\n\n this.content.nodesBetween(from, to, f, startPos, this);\n};\n\n// :: ((node: Node, pos: number, parent: Node) → ?bool)\n// Call the given callback for every descendant node. Doesn't\n// descend into a node when the callback returns `false`.\nNode.prototype.descendants = function descendants (f) {\n this.nodesBetween(0, this.content.size, f);\n};\n\n// :: string\n// Concatenates all the text nodes found in this fragment and its\n// children.\nprototypeAccessors$3.textContent.get = function () { return this.textBetween(0, this.content.size, \"\") };\n\n// :: (number, number, ?string, ?string) → string\n// Get all text between positions `from` and `to`. When\n// `blockSeparator` is given, it will be inserted whenever a new\n// block node is started. When `leafText` is given, it'll be\n// inserted for every non-text leaf node encountered.\nNode.prototype.textBetween = function textBetween (from, to, blockSeparator, leafText) {\n return this.content.textBetween(from, to, blockSeparator, leafText)\n};\n\n// :: ?Node\n// Returns this node's first child, or `null` if there are no\n// children.\nprototypeAccessors$3.firstChild.get = function () { return this.content.firstChild };\n\n// :: ?Node\n// Returns this node's last child, or `null` if there are no\n// children.\nprototypeAccessors$3.lastChild.get = function () { return this.content.lastChild };\n\n// :: (Node) → bool\n// Test whether two nodes represent the same piece of document.\nNode.prototype.eq = function eq (other) {\n return this == other || (this.sameMarkup(other) && this.content.eq(other.content))\n};\n\n// :: (Node) → bool\n// Compare the markup (type, attributes, and marks) of this node to\n// those of another. Returns `true` if both have the same markup.\nNode.prototype.sameMarkup = function sameMarkup (other) {\n return this.hasMarkup(other.type, other.attrs, other.marks)\n};\n\n// :: (NodeType, ?Object, ?[Mark]) → bool\n// Check whether this node's markup correspond to the given type,\n// attributes, and marks.\nNode.prototype.hasMarkup = function hasMarkup (type, attrs, marks) {\n return this.type == type &&\n compareDeep(this.attrs, attrs || type.defaultAttrs || emptyAttrs) &&\n Mark.sameSet(this.marks, marks || Mark.none)\n};\n\n// :: (?Fragment) → Node\n// Create a new node with the same markup as this node, containing\n// the given content (or empty, if no content is given).\nNode.prototype.copy = function copy (content) {\n if ( content === void 0 ) content = null;\n\n if (content == this.content) { return this }\n return new this.constructor(this.type, this.attrs, content, this.marks)\n};\n\n// :: ([Mark]) → Node\n// Create a copy of this node, with the given set of marks instead\n// of the node's own marks.\nNode.prototype.mark = function mark (marks) {\n return marks == this.marks ? this : new this.constructor(this.type, this.attrs, this.content, marks)\n};\n\n// :: (number, ?number) → Node\n// Create a copy of this node with only the content between the\n// given positions. If `to` is not given, it defaults to the end of\n// the node.\nNode.prototype.cut = function cut (from, to) {\n if (from == 0 && to == this.content.size) { return this }\n return this.copy(this.content.cut(from, to))\n};\n\n// :: (number, ?number) → Slice\n// Cut out the part of the document between the given positions, and\n// return it as a `Slice` object.\nNode.prototype.slice = function slice (from, to, includeParents) {\n if ( to === void 0 ) to = this.content.size;\n if ( includeParents === void 0 ) includeParents = false;\n\n if (from == to) { return Slice.empty }\n\n var $from = this.resolve(from), $to = this.resolve(to);\n var depth = includeParents ? 0 : $from.sharedDepth(to);\n var start = $from.start(depth), node = $from.node(depth);\n var content = node.content.cut($from.pos - start, $to.pos - start);\n return new Slice(content, $from.depth - depth, $to.depth - depth)\n};\n\n// :: (number, number, Slice) → Node\n// Replace the part of the document between the given positions with\n// the given slice. The slice must 'fit', meaning its open sides\n// must be able to connect to the surrounding content, and its\n// content nodes must be valid children for the node they are placed\n// into. If any of this is violated, an error of type\n// [`ReplaceError`](#model.ReplaceError) is thrown.\nNode.prototype.replace = function replace$1 (from, to, slice) {\n return replace(this.resolve(from), this.resolve(to), slice)\n};\n\n// :: (number) → ?Node\n// Find the node directly after the given position.\nNode.prototype.nodeAt = function nodeAt (pos) {\n for (var node = this;;) {\n var ref = node.content.findIndex(pos);\n var index = ref.index;\n var offset = ref.offset;\n node = node.maybeChild(index);\n if (!node) { return null }\n if (offset == pos || node.isText) { return node }\n pos -= offset + 1;\n }\n};\n\n// :: (number) → {node: ?Node, index: number, offset: number}\n// Find the (direct) child node after the given offset, if any,\n// and return it along with its index and offset relative to this\n// node.\nNode.prototype.childAfter = function childAfter (pos) {\n var ref = this.content.findIndex(pos);\n var index = ref.index;\n var offset = ref.offset;\n return {node: this.content.maybeChild(index), index: index, offset: offset}\n};\n\n// :: (number) → {node: ?Node, index: number, offset: number}\n// Find the (direct) child node before the given offset, if any,\n// and return it along with its index and offset relative to this\n// node.\nNode.prototype.childBefore = function childBefore (pos) {\n if (pos == 0) { return {node: null, index: 0, offset: 0} }\n var ref = this.content.findIndex(pos);\n var index = ref.index;\n var offset = ref.offset;\n if (offset < pos) { return {node: this.content.child(index), index: index, offset: offset} }\n var node = this.content.child(index - 1);\n return {node: node, index: index - 1, offset: offset - node.nodeSize}\n};\n\n// :: (number) → ResolvedPos\n// Resolve the given position in the document, returning an\n// [object](#model.ResolvedPos) with information about its context.\nNode.prototype.resolve = function resolve (pos) { return ResolvedPos.resolveCached(this, pos) };\n\nNode.prototype.resolveNoCache = function resolveNoCache (pos) { return ResolvedPos.resolve(this, pos) };\n\n// :: (number, number, union) → bool\n// Test whether a given mark or mark type occurs in this document\n// between the two given positions.\nNode.prototype.rangeHasMark = function rangeHasMark (from, to, type) {\n var found = false;\n if (to > from) { this.nodesBetween(from, to, function (node) {\n if (type.isInSet(node.marks)) { found = true; }\n return !found\n }); }\n return found\n};\n\n// :: bool\n// True when this is a block (non-inline node)\nprototypeAccessors$3.isBlock.get = function () { return this.type.isBlock };\n\n// :: bool\n// True when this is a textblock node, a block node with inline\n// content.\nprototypeAccessors$3.isTextblock.get = function () { return this.type.isTextblock };\n\n// :: bool\n// True when this node allows inline content.\nprototypeAccessors$3.inlineContent.get = function () { return this.type.inlineContent };\n\n// :: bool\n// True when this is an inline node (a text node or a node that can\n// appear among text).\nprototypeAccessors$3.isInline.get = function () { return this.type.isInline };\n\n// :: bool\n// True when this is a text node.\nprototypeAccessors$3.isText.get = function () { return this.type.isText };\n\n// :: bool\n// True when this is a leaf node.\nprototypeAccessors$3.isLeaf.get = function () { return this.type.isLeaf };\n\n// :: bool\n// True when this is an atom, i.e. when it does not have directly\n// editable content. This is usually the same as `isLeaf`, but can\n// be configured with the [`atom` property](#model.NodeSpec.atom) on\n// a node's spec (typically used when the node is displayed as an\n// uneditable [node view](#view.NodeView)).\nprototypeAccessors$3.isAtom.get = function () { return this.type.isAtom };\n\n// :: () → string\n// Return a string representation of this node for debugging\n// purposes.\nNode.prototype.toString = function toString () {\n if (this.type.spec.toDebugString) { return this.type.spec.toDebugString(this) }\n var name = this.type.name;\n if (this.content.size)\n { name += \"(\" + this.content.toStringInner() + \")\"; }\n return wrapMarks(this.marks, name)\n};\n\n// :: (number) → ContentMatch\n// Get the content match in this node at the given index.\nNode.prototype.contentMatchAt = function contentMatchAt (index) {\n var match = this.type.contentMatch.matchFragment(this.content, 0, index);\n if (!match) { throw new Error(\"Called contentMatchAt on a node with invalid content\") }\n return match\n};\n\n// :: (number, number, ?Fragment, ?number, ?number) → bool\n// Test whether replacing the range between `from` and `to` (by\n// child index) with the given replacement fragment (which defaults\n// to the empty fragment) would leave the node's content valid. You\n// can optionally pass `start` and `end` indices into the\n// replacement fragment.\nNode.prototype.canReplace = function canReplace (from, to, replacement, start, end) {\n if ( replacement === void 0 ) replacement = Fragment.empty;\n if ( start === void 0 ) start = 0;\n if ( end === void 0 ) end = replacement.childCount;\n\n var one = this.contentMatchAt(from).matchFragment(replacement, start, end);\n var two = one && one.matchFragment(this.content, to);\n if (!two || !two.validEnd) { return false }\n for (var i = start; i < end; i++) { if (!this.type.allowsMarks(replacement.child(i).marks)) { return false } }\n return true\n};\n\n// :: (number, number, NodeType, ?[Mark]) → bool\n// Test whether replacing the range `from` to `to` (by index) with a\n// node of the given type would leave the node's content valid.\nNode.prototype.canReplaceWith = function canReplaceWith (from, to, type, marks) {\n if (marks && !this.type.allowsMarks(marks)) { return false }\n var start = this.contentMatchAt(from).matchType(type);\n var end = start && start.matchFragment(this.content, to);\n return end ? end.validEnd : false\n};\n\n// :: (Node) → bool\n// Test whether the given node's content could be appended to this\n// node. If that node is empty, this will only return true if there\n// is at least one node type that can appear in both nodes (to avoid\n// merging completely incompatible nodes).\nNode.prototype.canAppend = function canAppend (other) {\n if (other.content.size) { return this.canReplace(this.childCount, this.childCount, other.content) }\n else { return this.type.compatibleContent(other.type) }\n};\n\n// :: ()\n// Check whether this node and its descendants conform to the\n// schema, and raise error when they do not.\nNode.prototype.check = function check () {\n if (!this.type.validContent(this.content))\n { throw new RangeError((\"Invalid content for node \" + (this.type.name) + \": \" + (this.content.toString().slice(0, 50)))) }\n this.content.forEach(function (node) { return node.check(); });\n};\n\n// :: () → Object\n// Return a JSON-serializeable representation of this node.\nNode.prototype.toJSON = function toJSON () {\n var obj = {type: this.type.name};\n for (var _ in this.attrs) {\n obj.attrs = this.attrs;\n break\n }\n if (this.content.size)\n { obj.content = this.content.toJSON(); }\n if (this.marks.length)\n { obj.marks = this.marks.map(function (n) { return n.toJSON(); }); }\n return obj\n};\n\n// :: (Schema, Object) → Node\n// Deserialize a node from its JSON representation.\nNode.fromJSON = function fromJSON (schema, json) {\n if (!json) { throw new RangeError(\"Invalid input for Node.fromJSON\") }\n var marks = null;\n if (json.marks) {\n if (!Array.isArray(json.marks)) { throw new RangeError(\"Invalid mark data for Node.fromJSON\") }\n marks = json.marks.map(schema.markFromJSON);\n }\n if (json.type == \"text\") {\n if (typeof json.text != \"string\") { throw new RangeError(\"Invalid text node in JSON\") }\n return schema.text(json.text, marks)\n }\n var content = Fragment.fromJSON(schema, json.content);\n return schema.nodeType(json.type).create(json.attrs, content, marks)\n};\n\nObject.defineProperties( Node.prototype, prototypeAccessors$3 );\n\nvar TextNode = /*@__PURE__*/(function (Node) {\n function TextNode(type, attrs, content, marks) {\n Node.call(this, type, attrs, null, marks);\n\n if (!content) { throw new RangeError(\"Empty text nodes are not allowed\") }\n\n this.text = content;\n }\n\n if ( Node ) TextNode.__proto__ = Node;\n TextNode.prototype = Object.create( Node && Node.prototype );\n TextNode.prototype.constructor = TextNode;\n\n var prototypeAccessors$1 = { textContent: { configurable: true },nodeSize: { configurable: true } };\n\n TextNode.prototype.toString = function toString () {\n if (this.type.spec.toDebugString) { return this.type.spec.toDebugString(this) }\n return wrapMarks(this.marks, JSON.stringify(this.text))\n };\n\n prototypeAccessors$1.textContent.get = function () { return this.text };\n\n TextNode.prototype.textBetween = function textBetween (from, to) { return this.text.slice(from, to) };\n\n prototypeAccessors$1.nodeSize.get = function () { return this.text.length };\n\n TextNode.prototype.mark = function mark (marks) {\n return marks == this.marks ? this : new TextNode(this.type, this.attrs, this.text, marks)\n };\n\n TextNode.prototype.withText = function withText (text) {\n if (text == this.text) { return this }\n return new TextNode(this.type, this.attrs, text, this.marks)\n };\n\n TextNode.prototype.cut = function cut (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.text.length;\n\n if (from == 0 && to == this.text.length) { return this }\n return this.withText(this.text.slice(from, to))\n };\n\n TextNode.prototype.eq = function eq (other) {\n return this.sameMarkup(other) && this.text == other.text\n };\n\n TextNode.prototype.toJSON = function toJSON () {\n var base = Node.prototype.toJSON.call(this);\n base.text = this.text;\n return base\n };\n\n Object.defineProperties( TextNode.prototype, prototypeAccessors$1 );\n\n return TextNode;\n}(Node));\n\nfunction wrapMarks(marks, str) {\n for (var i = marks.length - 1; i >= 0; i--)\n { str = marks[i].type.name + \"(\" + str + \")\"; }\n return str\n}\n\n// ::- Instances of this class represent a match state of a node\n// type's [content expression](#model.NodeSpec.content), and can be\n// used to find out whether further content matches here, and whether\n// a given position is a valid end of the node.\nvar ContentMatch = function ContentMatch(validEnd) {\n // :: bool\n // True when this match state represents a valid end of the node.\n this.validEnd = validEnd;\n this.next = [];\n this.wrapCache = [];\n};\n\nvar prototypeAccessors$4 = { inlineContent: { configurable: true },defaultType: { configurable: true },edgeCount: { configurable: true } };\n\nContentMatch.parse = function parse (string, nodeTypes) {\n var stream = new TokenStream(string, nodeTypes);\n if (stream.next == null) { return ContentMatch.empty }\n var expr = parseExpr(stream);\n if (stream.next) { stream.err(\"Unexpected trailing text\"); }\n var match = dfa(nfa(expr));\n checkForDeadEnds(match, stream);\n return match\n};\n\n// :: (NodeType) → ?ContentMatch\n// Match a node type, returning a match after that node if\n// successful.\nContentMatch.prototype.matchType = function matchType (type) {\n for (var i = 0; i < this.next.length; i += 2)\n { if (this.next[i] == type) { return this.next[i + 1] } }\n return null\n};\n\n// :: (Fragment, ?number, ?number) → ?ContentMatch\n// Try to match a fragment. Returns the resulting match when\n// successful.\nContentMatch.prototype.matchFragment = function matchFragment (frag, start, end) {\n if ( start === void 0 ) start = 0;\n if ( end === void 0 ) end = frag.childCount;\n\n var cur = this;\n for (var i = start; cur && i < end; i++)\n { cur = cur.matchType(frag.child(i).type); }\n return cur\n};\n\nprototypeAccessors$4.inlineContent.get = function () {\n var first = this.next[0];\n return first ? first.isInline : false\n};\n\n// :: ?NodeType\n// Get the first matching node type at this match position that can\n// be generated.\nprototypeAccessors$4.defaultType.get = function () {\n for (var i = 0; i < this.next.length; i += 2) {\n var type = this.next[i];\n if (!(type.isText || type.hasRequiredAttrs())) { return type }\n }\n};\n\nContentMatch.prototype.compatible = function compatible (other) {\n for (var i = 0; i < this.next.length; i += 2)\n { for (var j = 0; j < other.next.length; j += 2)\n { if (this.next[i] == other.next[j]) { return true } } }\n return false\n};\n\n// :: (Fragment, bool, ?number) → ?Fragment\n// Try to match the given fragment, and if that fails, see if it can\n// be made to match by inserting nodes in front of it. When\n// successful, return a fragment of inserted nodes (which may be\n// empty if nothing had to be inserted). When `toEnd` is true, only\n// return a fragment if the resulting match goes to the end of the\n// content expression.\nContentMatch.prototype.fillBefore = function fillBefore (after, toEnd, startIndex) {\n if ( toEnd === void 0 ) toEnd = false;\n if ( startIndex === void 0 ) startIndex = 0;\n\n var seen = [this];\n function search(match, types) {\n var finished = match.matchFragment(after, startIndex);\n if (finished && (!toEnd || finished.validEnd))\n { return Fragment.from(types.map(function (tp) { return tp.createAndFill(); })) }\n\n for (var i = 0; i < match.next.length; i += 2) {\n var type = match.next[i], next = match.next[i + 1];\n if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) {\n seen.push(next);\n var found = search(next, types.concat(type));\n if (found) { return found }\n }\n }\n }\n\n return search(this, [])\n};\n\n// :: (NodeType) → ?[NodeType]\n// Find a set of wrapping node types that would allow a node of the\n// given type to appear at this position. The result may be empty\n// (when it fits directly) and will be null when no such wrapping\n// exists.\nContentMatch.prototype.findWrapping = function findWrapping (target) {\n for (var i = 0; i < this.wrapCache.length; i += 2)\n { if (this.wrapCache[i] == target) { return this.wrapCache[i + 1] } }\n var computed = this.computeWrapping(target);\n this.wrapCache.push(target, computed);\n return computed\n};\n\nContentMatch.prototype.computeWrapping = function computeWrapping (target) {\n var seen = Object.create(null), active = [{match: this, type: null, via: null}];\n while (active.length) {\n var current = active.shift(), match = current.match;\n if (match.matchType(target)) {\n var result = [];\n for (var obj = current; obj.type; obj = obj.via)\n { result.push(obj.type); }\n return result.reverse()\n }\n for (var i = 0; i < match.next.length; i += 2) {\n var type = match.next[i];\n if (!type.isLeaf && !type.hasRequiredAttrs() && !(type.name in seen) && (!current.type || match.next[i + 1].validEnd)) {\n active.push({match: type.contentMatch, type: type, via: current});\n seen[type.name] = true;\n }\n }\n }\n};\n\n// :: number\n// The number of outgoing edges this node has in the finite\n// automaton that describes the content expression.\nprototypeAccessors$4.edgeCount.get = function () {\n return this.next.length >> 1\n};\n\n// :: (number) → {type: NodeType, next: ContentMatch}\n// Get the _n_​th outgoing edge from this node in the finite\n// automaton that describes the content expression.\nContentMatch.prototype.edge = function edge (n) {\n var i = n << 1;\n if (i >= this.next.length) { throw new RangeError((\"There's no \" + n + \"th edge in this content match\")) }\n return {type: this.next[i], next: this.next[i + 1]}\n};\n\nContentMatch.prototype.toString = function toString () {\n var seen = [];\n function scan(m) {\n seen.push(m);\n for (var i = 1; i < m.next.length; i += 2)\n { if (seen.indexOf(m.next[i]) == -1) { scan(m.next[i]); } }\n }\n scan(this);\n return seen.map(function (m, i) {\n var out = i + (m.validEnd ? \"*\" : \" \") + \" \";\n for (var i$1 = 0; i$1 < m.next.length; i$1 += 2)\n { out += (i$1 ? \", \" : \"\") + m.next[i$1].name + \"->\" + seen.indexOf(m.next[i$1 + 1]); }\n return out\n }).join(\"\\n\")\n};\n\nObject.defineProperties( ContentMatch.prototype, prototypeAccessors$4 );\n\nContentMatch.empty = new ContentMatch(true);\n\nvar TokenStream = function TokenStream(string, nodeTypes) {\n this.string = string;\n this.nodeTypes = nodeTypes;\n this.inline = null;\n this.pos = 0;\n this.tokens = string.split(/\\s*(?=\\b|\\W|$)/);\n if (this.tokens[this.tokens.length - 1] == \"\") { this.tokens.pop(); }\n if (this.tokens[0] == \"\") { this.tokens.shift(); }\n};\n\nvar prototypeAccessors$1$2 = { next: { configurable: true } };\n\nprototypeAccessors$1$2.next.get = function () { return this.tokens[this.pos] };\n\nTokenStream.prototype.eat = function eat (tok) { return this.next == tok && (this.pos++ || true) };\n\nTokenStream.prototype.err = function err (str) { throw new SyntaxError(str + \" (in content expression '\" + this.string + \"')\") };\n\nObject.defineProperties( TokenStream.prototype, prototypeAccessors$1$2 );\n\nfunction parseExpr(stream) {\n var exprs = [];\n do { exprs.push(parseExprSeq(stream)); }\n while (stream.eat(\"|\"))\n return exprs.length == 1 ? exprs[0] : {type: \"choice\", exprs: exprs}\n}\n\nfunction parseExprSeq(stream) {\n var exprs = [];\n do { exprs.push(parseExprSubscript(stream)); }\n while (stream.next && stream.next != \")\" && stream.next != \"|\")\n return exprs.length == 1 ? exprs[0] : {type: \"seq\", exprs: exprs}\n}\n\nfunction parseExprSubscript(stream) {\n var expr = parseExprAtom(stream);\n for (;;) {\n if (stream.eat(\"+\"))\n { expr = {type: \"plus\", expr: expr}; }\n else if (stream.eat(\"*\"))\n { expr = {type: \"star\", expr: expr}; }\n else if (stream.eat(\"?\"))\n { expr = {type: \"opt\", expr: expr}; }\n else if (stream.eat(\"{\"))\n { expr = parseExprRange(stream, expr); }\n else { break }\n }\n return expr\n}\n\nfunction parseNum(stream) {\n if (/\\D/.test(stream.next)) { stream.err(\"Expected number, got '\" + stream.next + \"'\"); }\n var result = Number(stream.next);\n stream.pos++;\n return result\n}\n\nfunction parseExprRange(stream, expr) {\n var min = parseNum(stream), max = min;\n if (stream.eat(\",\")) {\n if (stream.next != \"}\") { max = parseNum(stream); }\n else { max = -1; }\n }\n if (!stream.eat(\"}\")) { stream.err(\"Unclosed braced range\"); }\n return {type: \"range\", min: min, max: max, expr: expr}\n}\n\nfunction resolveName(stream, name) {\n var types = stream.nodeTypes, type = types[name];\n if (type) { return [type] }\n var result = [];\n for (var typeName in types) {\n var type$1 = types[typeName];\n if (type$1.groups.indexOf(name) > -1) { result.push(type$1); }\n }\n if (result.length == 0) { stream.err(\"No node type or group '\" + name + \"' found\"); }\n return result\n}\n\nfunction parseExprAtom(stream) {\n if (stream.eat(\"(\")) {\n var expr = parseExpr(stream);\n if (!stream.eat(\")\")) { stream.err(\"Missing closing paren\"); }\n return expr\n } else if (!/\\W/.test(stream.next)) {\n var exprs = resolveName(stream, stream.next).map(function (type) {\n if (stream.inline == null) { stream.inline = type.isInline; }\n else if (stream.inline != type.isInline) { stream.err(\"Mixing inline and block content\"); }\n return {type: \"name\", value: type}\n });\n stream.pos++;\n return exprs.length == 1 ? exprs[0] : {type: \"choice\", exprs: exprs}\n } else {\n stream.err(\"Unexpected token '\" + stream.next + \"'\");\n }\n}\n\n// The code below helps compile a regular-expression-like language\n// into a deterministic finite automaton. For a good introduction to\n// these concepts, see https://swtch.com/~rsc/regexp/regexp1.html\n\n// : (Object) → [[{term: ?any, to: number}]]\n// Construct an NFA from an expression as returned by the parser. The\n// NFA is represented as an array of states, which are themselves\n// arrays of edges, which are `{term, to}` objects. The first state is\n// the entry state and the last node is the success state.\n//\n// Note that unlike typical NFAs, the edge ordering in this one is\n// significant, in that it is used to contruct filler content when\n// necessary.\nfunction nfa(expr) {\n var nfa = [[]];\n connect(compile(expr, 0), node());\n return nfa\n\n function node() { return nfa.push([]) - 1 }\n function edge(from, to, term) {\n var edge = {term: term, to: to};\n nfa[from].push(edge);\n return edge\n }\n function connect(edges, to) { edges.forEach(function (edge) { return edge.to = to; }); }\n\n function compile(expr, from) {\n if (expr.type == \"choice\") {\n return expr.exprs.reduce(function (out, expr) { return out.concat(compile(expr, from)); }, [])\n } else if (expr.type == \"seq\") {\n for (var i = 0;; i++) {\n var next = compile(expr.exprs[i], from);\n if (i == expr.exprs.length - 1) { return next }\n connect(next, from = node());\n }\n } else if (expr.type == \"star\") {\n var loop = node();\n edge(from, loop);\n connect(compile(expr.expr, loop), loop);\n return [edge(loop)]\n } else if (expr.type == \"plus\") {\n var loop$1 = node();\n connect(compile(expr.expr, from), loop$1);\n connect(compile(expr.expr, loop$1), loop$1);\n return [edge(loop$1)]\n } else if (expr.type == \"opt\") {\n return [edge(from)].concat(compile(expr.expr, from))\n } else if (expr.type == \"range\") {\n var cur = from;\n for (var i$1 = 0; i$1 < expr.min; i$1++) {\n var next$1 = node();\n connect(compile(expr.expr, cur), next$1);\n cur = next$1;\n }\n if (expr.max == -1) {\n connect(compile(expr.expr, cur), cur);\n } else {\n for (var i$2 = expr.min; i$2 < expr.max; i$2++) {\n var next$2 = node();\n edge(cur, next$2);\n connect(compile(expr.expr, cur), next$2);\n cur = next$2;\n }\n }\n return [edge(cur)]\n } else if (expr.type == \"name\") {\n return [edge(from, null, expr.value)]\n }\n }\n}\n\nfunction cmp(a, b) { return b - a }\n\n// Get the set of nodes reachable by null edges from `node`. Omit\n// nodes with only a single null-out-edge, since they may lead to\n// needless duplicated nodes.\nfunction nullFrom(nfa, node) {\n var result = [];\n scan(node);\n return result.sort(cmp)\n\n function scan(node) {\n var edges = nfa[node];\n if (edges.length == 1 && !edges[0].term) { return scan(edges[0].to) }\n result.push(node);\n for (var i = 0; i < edges.length; i++) {\n var ref = edges[i];\n var term = ref.term;\n var to = ref.to;\n if (!term && result.indexOf(to) == -1) { scan(to); }\n }\n }\n}\n\n// : ([[{term: ?any, to: number}]]) → ContentMatch\n// Compiles an NFA as produced by `nfa` into a DFA, modeled as a set\n// of state objects (`ContentMatch` instances) with transitions\n// between them.\nfunction dfa(nfa) {\n var labeled = Object.create(null);\n return explore(nullFrom(nfa, 0))\n\n function explore(states) {\n var out = [];\n states.forEach(function (node) {\n nfa[node].forEach(function (ref) {\n var term = ref.term;\n var to = ref.to;\n\n if (!term) { return }\n var known = out.indexOf(term), set = known > -1 && out[known + 1];\n nullFrom(nfa, to).forEach(function (node) {\n if (!set) { out.push(term, set = []); }\n if (set.indexOf(node) == -1) { set.push(node); }\n });\n });\n });\n var state = labeled[states.join(\",\")] = new ContentMatch(states.indexOf(nfa.length - 1) > -1);\n for (var i = 0; i < out.length; i += 2) {\n var states$1 = out[i + 1].sort(cmp);\n state.next.push(out[i], labeled[states$1.join(\",\")] || explore(states$1));\n }\n return state\n }\n}\n\nfunction checkForDeadEnds(match, stream) {\n for (var i = 0, work = [match]; i < work.length; i++) {\n var state = work[i], dead = !state.validEnd, nodes = [];\n for (var j = 0; j < state.next.length; j += 2) {\n var node = state.next[j], next = state.next[j + 1];\n nodes.push(node.name);\n if (dead && !(node.isText || node.hasRequiredAttrs())) { dead = false; }\n if (work.indexOf(next) == -1) { work.push(next); }\n }\n if (dead) { stream.err(\"Only non-generatable nodes (\" + nodes.join(\", \") + \") in a required position (see https://prosemirror.net/docs/guide/#generatable)\"); }\n }\n}\n\n// For node types where all attrs have a default value (or which don't\n// have any attributes), build up a single reusable default attribute\n// object, and use it for all nodes that don't specify specific\n// attributes.\nfunction defaultAttrs(attrs) {\n var defaults = Object.create(null);\n for (var attrName in attrs) {\n var attr = attrs[attrName];\n if (!attr.hasDefault) { return null }\n defaults[attrName] = attr.default;\n }\n return defaults\n}\n\nfunction computeAttrs(attrs, value) {\n var built = Object.create(null);\n for (var name in attrs) {\n var given = value && value[name];\n if (given === undefined) {\n var attr = attrs[name];\n if (attr.hasDefault) { given = attr.default; }\n else { throw new RangeError(\"No value supplied for attribute \" + name) }\n }\n built[name] = given;\n }\n return built\n}\n\nfunction initAttrs(attrs) {\n var result = Object.create(null);\n if (attrs) { for (var name in attrs) { result[name] = new Attribute(attrs[name]); } }\n return result\n}\n\n// ::- Node types are objects allocated once per `Schema` and used to\n// [tag](#model.Node.type) `Node` instances. They contain information\n// about the node type, such as its name and what kind of node it\n// represents.\nvar NodeType = function NodeType(name, schema, spec) {\n // :: string\n // The name the node type has in this schema.\n this.name = name;\n\n // :: Schema\n // A link back to the `Schema` the node type belongs to.\n this.schema = schema;\n\n // :: NodeSpec\n // The spec that this type is based on\n this.spec = spec;\n\n this.groups = spec.group ? spec.group.split(\" \") : [];\n this.attrs = initAttrs(spec.attrs);\n\n this.defaultAttrs = defaultAttrs(this.attrs);\n\n // :: ContentMatch\n // The starting match of the node type's content expression.\n this.contentMatch = null;\n\n // : ?[MarkType]\n // The set of marks allowed in this node. `null` means all marks\n // are allowed.\n this.markSet = null;\n\n // :: bool\n // True if this node type has inline content.\n this.inlineContent = null;\n\n // :: bool\n // True if this is a block type\n this.isBlock = !(spec.inline || name == \"text\");\n\n // :: bool\n // True if this is the text node type.\n this.isText = name == \"text\";\n};\n\nvar prototypeAccessors$5 = { isInline: { configurable: true },isTextblock: { configurable: true },isLeaf: { configurable: true },isAtom: { configurable: true } };\n\n// :: bool\n// True if this is an inline type.\nprototypeAccessors$5.isInline.get = function () { return !this.isBlock };\n\n// :: bool\n// True if this is a textblock type, a block that contains inline\n// content.\nprototypeAccessors$5.isTextblock.get = function () { return this.isBlock && this.inlineContent };\n\n// :: bool\n// True for node types that allow no content.\nprototypeAccessors$5.isLeaf.get = function () { return this.contentMatch == ContentMatch.empty };\n\n// :: bool\n// True when this node is an atom, i.e. when it does not have\n// directly editable content.\nprototypeAccessors$5.isAtom.get = function () { return this.isLeaf || this.spec.atom };\n\n// :: () → bool\n// Tells you whether this node type has any required attributes.\nNodeType.prototype.hasRequiredAttrs = function hasRequiredAttrs () {\n for (var n in this.attrs) { if (this.attrs[n].isRequired) { return true } }\n return false\n};\n\nNodeType.prototype.compatibleContent = function compatibleContent (other) {\n return this == other || this.contentMatch.compatible(other.contentMatch)\n};\n\nNodeType.prototype.computeAttrs = function computeAttrs$1 (attrs) {\n if (!attrs && this.defaultAttrs) { return this.defaultAttrs }\n else { return computeAttrs(this.attrs, attrs) }\n};\n\n// :: (?Object, ?union, ?[Mark]) → Node\n// Create a `Node` of this type. The given attributes are\n// checked and defaulted (you can pass `null` to use the type's\n// defaults entirely, if no required attributes exist). `content`\n// may be a `Fragment`, a node, an array of nodes, or\n// `null`. Similarly `marks` may be `null` to default to the empty\n// set of marks.\nNodeType.prototype.create = function create (attrs, content, marks) {\n if (this.isText) { throw new Error(\"NodeType.create can't construct text nodes\") }\n return new Node(this, this.computeAttrs(attrs), Fragment.from(content), Mark.setFrom(marks))\n};\n\n// :: (?Object, ?union, ?[Mark]) → Node\n// Like [`create`](#model.NodeType.create), but check the given content\n// against the node type's content restrictions, and throw an error\n// if it doesn't match.\nNodeType.prototype.createChecked = function createChecked (attrs, content, marks) {\n content = Fragment.from(content);\n if (!this.validContent(content))\n { throw new RangeError(\"Invalid content for node \" + this.name) }\n return new Node(this, this.computeAttrs(attrs), content, Mark.setFrom(marks))\n};\n\n// :: (?Object, ?union, ?[Mark]) → ?Node\n// Like [`create`](#model.NodeType.create), but see if it is necessary to\n// add nodes to the start or end of the given fragment to make it\n// fit the node. If no fitting wrapping can be found, return null.\n// Note that, due to the fact that required nodes can always be\n// created, this will always succeed if you pass null or\n// `Fragment.empty` as content.\nNodeType.prototype.createAndFill = function createAndFill (attrs, content, marks) {\n attrs = this.computeAttrs(attrs);\n content = Fragment.from(content);\n if (content.size) {\n var before = this.contentMatch.fillBefore(content);\n if (!before) { return null }\n content = before.append(content);\n }\n var after = this.contentMatch.matchFragment(content).fillBefore(Fragment.empty, true);\n if (!after) { return null }\n return new Node(this, attrs, content.append(after), Mark.setFrom(marks))\n};\n\n// :: (Fragment) → bool\n// Returns true if the given fragment is valid content for this node\n// type with the given attributes.\nNodeType.prototype.validContent = function validContent (content) {\n var result = this.contentMatch.matchFragment(content);\n if (!result || !result.validEnd) { return false }\n for (var i = 0; i < content.childCount; i++)\n { if (!this.allowsMarks(content.child(i).marks)) { return false } }\n return true\n};\n\n// :: (MarkType) → bool\n// Check whether the given mark type is allowed in this node.\nNodeType.prototype.allowsMarkType = function allowsMarkType (markType) {\n return this.markSet == null || this.markSet.indexOf(markType) > -1\n};\n\n// :: ([Mark]) → bool\n// Test whether the given set of marks are allowed in this node.\nNodeType.prototype.allowsMarks = function allowsMarks (marks) {\n if (this.markSet == null) { return true }\n for (var i = 0; i < marks.length; i++) { if (!this.allowsMarkType(marks[i].type)) { return false } }\n return true\n};\n\n// :: ([Mark]) → [Mark]\n// Removes the marks that are not allowed in this node from the given set.\nNodeType.prototype.allowedMarks = function allowedMarks (marks) {\n if (this.markSet == null) { return marks }\n var copy;\n for (var i = 0; i < marks.length; i++) {\n if (!this.allowsMarkType(marks[i].type)) {\n if (!copy) { copy = marks.slice(0, i); }\n } else if (copy) {\n copy.push(marks[i]);\n }\n }\n return !copy ? marks : copy.length ? copy : Mark.empty\n};\n\nNodeType.compile = function compile (nodes, schema) {\n var result = Object.create(null);\n nodes.forEach(function (name, spec) { return result[name] = new NodeType(name, schema, spec); });\n\n var topType = schema.spec.topNode || \"doc\";\n if (!result[topType]) { throw new RangeError(\"Schema is missing its top node type ('\" + topType + \"')\") }\n if (!result.text) { throw new RangeError(\"Every schema needs a 'text' type\") }\n for (var _ in result.text.attrs) { throw new RangeError(\"The text node type should not have attributes\") }\n\n return result\n};\n\nObject.defineProperties( NodeType.prototype, prototypeAccessors$5 );\n\n// Attribute descriptors\n\nvar Attribute = function Attribute(options) {\n this.hasDefault = Object.prototype.hasOwnProperty.call(options, \"default\");\n this.default = options.default;\n};\n\nvar prototypeAccessors$1$3 = { isRequired: { configurable: true } };\n\nprototypeAccessors$1$3.isRequired.get = function () {\n return !this.hasDefault\n};\n\nObject.defineProperties( Attribute.prototype, prototypeAccessors$1$3 );\n\n// Marks\n\n// ::- Like nodes, marks (which are associated with nodes to signify\n// things like emphasis or being part of a link) are\n// [tagged](#model.Mark.type) with type objects, which are\n// instantiated once per `Schema`.\nvar MarkType = function MarkType(name, rank, schema, spec) {\n // :: string\n // The name of the mark type.\n this.name = name;\n\n // :: Schema\n // The schema that this mark type instance is part of.\n this.schema = schema;\n\n // :: MarkSpec\n // The spec on which the type is based.\n this.spec = spec;\n\n this.attrs = initAttrs(spec.attrs);\n\n this.rank = rank;\n this.excluded = null;\n var defaults = defaultAttrs(this.attrs);\n this.instance = defaults && new Mark(this, defaults);\n};\n\n// :: (?Object) → Mark\n// Create a mark of this type. `attrs` may be `null` or an object\n// containing only some of the mark's attributes. The others, if\n// they have defaults, will be added.\nMarkType.prototype.create = function create (attrs) {\n if (!attrs && this.instance) { return this.instance }\n return new Mark(this, computeAttrs(this.attrs, attrs))\n};\n\nMarkType.compile = function compile (marks, schema) {\n var result = Object.create(null), rank = 0;\n marks.forEach(function (name, spec) { return result[name] = new MarkType(name, rank++, schema, spec); });\n return result\n};\n\n// :: ([Mark]) → [Mark]\n// When there is a mark of this type in the given set, a new set\n// without it is returned. Otherwise, the input set is returned.\nMarkType.prototype.removeFromSet = function removeFromSet (set) {\n for (var i = 0; i < set.length; i++) { if (set[i].type == this) {\n set = set.slice(0, i).concat(set.slice(i + 1));\n i--;\n } }\n return set\n};\n\n// :: ([Mark]) → ?Mark\n// Tests whether there is a mark of this type in the given set.\nMarkType.prototype.isInSet = function isInSet (set) {\n for (var i = 0; i < set.length; i++)\n { if (set[i].type == this) { return set[i] } }\n};\n\n// :: (MarkType) → bool\n// Queries whether a given mark type is\n// [excluded](#model.MarkSpec.excludes) by this one.\nMarkType.prototype.excludes = function excludes (other) {\n return this.excluded.indexOf(other) > -1\n};\n\n// SchemaSpec:: interface\n// An object describing a schema, as passed to the [`Schema`](#model.Schema)\n// constructor.\n//\n// nodes:: union, OrderedMap>\n// The node types in this schema. Maps names to\n// [`NodeSpec`](#model.NodeSpec) objects that describe the node type\n// associated with that name. Their order is significant—it\n// determines which [parse rules](#model.NodeSpec.parseDOM) take\n// precedence by default, and which nodes come first in a given\n// [group](#model.NodeSpec.group).\n//\n// marks:: ?union, OrderedMap>\n// The mark types that exist in this schema. The order in which they\n// are provided determines the order in which [mark\n// sets](#model.Mark.addToSet) are sorted and in which [parse\n// rules](#model.MarkSpec.parseDOM) are tried.\n//\n// topNode:: ?string\n// The name of the default top-level node for the schema. Defaults\n// to `\"doc\"`.\n\n// NodeSpec:: interface\n//\n// content:: ?string\n// The content expression for this node, as described in the [schema\n// guide](/docs/guide/#schema.content_expressions). When not given,\n// the node does not allow any content.\n//\n// marks:: ?string\n// The marks that are allowed inside of this node. May be a\n// space-separated string referring to mark names or groups, `\"_\"`\n// to explicitly allow all marks, or `\"\"` to disallow marks. When\n// not given, nodes with inline content default to allowing all\n// marks, other nodes default to not allowing marks.\n//\n// group:: ?string\n// The group or space-separated groups to which this node belongs,\n// which can be referred to in the content expressions for the\n// schema.\n//\n// inline:: ?bool\n// Should be set to true for inline nodes. (Implied for text nodes.)\n//\n// atom:: ?bool\n// Can be set to true to indicate that, though this isn't a [leaf\n// node](#model.NodeType.isLeaf), it doesn't have directly editable\n// content and should be treated as a single unit in the view.\n//\n// attrs:: ?Object\n// The attributes that nodes of this type get.\n//\n// selectable:: ?bool\n// Controls whether nodes of this type can be selected as a [node\n// selection](#state.NodeSelection). Defaults to true for non-text\n// nodes.\n//\n// draggable:: ?bool\n// Determines whether nodes of this type can be dragged without\n// being selected. Defaults to false.\n//\n// code:: ?bool\n// Can be used to indicate that this node contains code, which\n// causes some commands to behave differently.\n//\n// defining:: ?bool\n// Determines whether this node is considered an important parent\n// node during replace operations (such as paste). Non-defining (the\n// default) nodes get dropped when their entire content is replaced,\n// whereas defining nodes persist and wrap the inserted content.\n// Likewise, in _inserted_ content the defining parents of the\n// content are preserved when possible. Typically,\n// non-default-paragraph textblock types, and possibly list items,\n// are marked as defining.\n//\n// isolating:: ?bool\n// When enabled (default is false), the sides of nodes of this type\n// count as boundaries that regular editing operations, like\n// backspacing or lifting, won't cross. An example of a node that\n// should probably have this enabled is a table cell.\n//\n// toDOM:: ?(node: Node) → DOMOutputSpec\n// Defines the default way a node of this type should be serialized\n// to DOM/HTML (as used by\n// [`DOMSerializer.fromSchema`](#model.DOMSerializer^fromSchema)).\n// Should return a DOM node or an [array\n// structure](#model.DOMOutputSpec) that describes one, with an\n// optional number zero (“hole”) in it to indicate where the node's\n// content should be inserted.\n//\n// For text nodes, the default is to create a text DOM node. Though\n// it is possible to create a serializer where text is rendered\n// differently, this is not supported inside the editor, so you\n// shouldn't override that in your text node spec.\n//\n// parseDOM:: ?[ParseRule]\n// Associates DOM parser information with this node, which can be\n// used by [`DOMParser.fromSchema`](#model.DOMParser^fromSchema) to\n// automatically derive a parser. The `node` field in the rules is\n// implied (the name of this node will be filled in automatically).\n// If you supply your own parser, you do not need to also specify\n// parsing rules in your schema.\n//\n// toDebugString:: ?(node: Node) -> string\n// Defines the default way a node of this type should be serialized\n// to a string representation for debugging (e.g. in error messages).\n\n// MarkSpec:: interface\n//\n// attrs:: ?Object\n// The attributes that marks of this type get.\n//\n// inclusive:: ?bool\n// Whether this mark should be active when the cursor is positioned\n// at its end (or at its start when that is also the start of the\n// parent node). Defaults to true.\n//\n// excludes:: ?string\n// Determines which other marks this mark can coexist with. Should\n// be a space-separated strings naming other marks or groups of marks.\n// When a mark is [added](#model.Mark.addToSet) to a set, all marks\n// that it excludes are removed in the process. If the set contains\n// any mark that excludes the new mark but is not, itself, excluded\n// by the new mark, the mark can not be added an the set. You can\n// use the value `\"_\"` to indicate that the mark excludes all\n// marks in the schema.\n//\n// Defaults to only being exclusive with marks of the same type. You\n// can set it to an empty string (or any string not containing the\n// mark's own name) to allow multiple marks of a given type to\n// coexist (as long as they have different attributes).\n//\n// group:: ?string\n// The group or space-separated groups to which this mark belongs.\n//\n// spanning:: ?bool\n// Determines whether marks of this type can span multiple adjacent\n// nodes when serialized to DOM/HTML. Defaults to true.\n//\n// toDOM:: ?(mark: Mark, inline: bool) → DOMOutputSpec\n// Defines the default way marks of this type should be serialized\n// to DOM/HTML. When the resulting spec contains a hole, that is\n// where the marked content is placed. Otherwise, it is appended to\n// the top node.\n//\n// parseDOM:: ?[ParseRule]\n// Associates DOM parser information with this mark (see the\n// corresponding [node spec field](#model.NodeSpec.parseDOM)). The\n// `mark` field in the rules is implied.\n\n// AttributeSpec:: interface\n//\n// Used to [define](#model.NodeSpec.attrs) attributes on nodes or\n// marks.\n//\n// default:: ?any\n// The default value for this attribute, to use when no explicit\n// value is provided. Attributes that have no default must be\n// provided whenever a node or mark of a type that has them is\n// created.\n\n// ::- A document schema. Holds [node](#model.NodeType) and [mark\n// type](#model.MarkType) objects for the nodes and marks that may\n// occur in conforming documents, and provides functionality for\n// creating and deserializing such documents.\nvar Schema = function Schema(spec) {\n // :: SchemaSpec\n // The [spec](#model.SchemaSpec) on which the schema is based,\n // with the added guarantee that its `nodes` and `marks`\n // properties are\n // [`OrderedMap`](https://github.com/marijnh/orderedmap) instances\n // (not raw objects).\n this.spec = {};\n for (var prop in spec) { this.spec[prop] = spec[prop]; }\n this.spec.nodes = OrderedMap.from(spec.nodes);\n this.spec.marks = OrderedMap.from(spec.marks);\n\n // :: Object\n // An object mapping the schema's node names to node type objects.\n this.nodes = NodeType.compile(this.spec.nodes, this);\n\n // :: Object\n // A map from mark names to mark type objects.\n this.marks = MarkType.compile(this.spec.marks, this);\n\n var contentExprCache = Object.create(null);\n for (var prop$1 in this.nodes) {\n if (prop$1 in this.marks)\n { throw new RangeError(prop$1 + \" can not be both a node and a mark\") }\n var type = this.nodes[prop$1], contentExpr = type.spec.content || \"\", markExpr = type.spec.marks;\n type.contentMatch = contentExprCache[contentExpr] ||\n (contentExprCache[contentExpr] = ContentMatch.parse(contentExpr, this.nodes));\n type.inlineContent = type.contentMatch.inlineContent;\n type.markSet = markExpr == \"_\" ? null :\n markExpr ? gatherMarks(this, markExpr.split(\" \")) :\n markExpr == \"\" || !type.inlineContent ? [] : null;\n }\n for (var prop$2 in this.marks) {\n var type$1 = this.marks[prop$2], excl = type$1.spec.excludes;\n type$1.excluded = excl == null ? [type$1] : excl == \"\" ? [] : gatherMarks(this, excl.split(\" \"));\n }\n\n this.nodeFromJSON = this.nodeFromJSON.bind(this);\n this.markFromJSON = this.markFromJSON.bind(this);\n\n // :: NodeType\n // The type of the [default top node](#model.SchemaSpec.topNode)\n // for this schema.\n this.topNodeType = this.nodes[this.spec.topNode || \"doc\"];\n\n // :: Object\n // An object for storing whatever values modules may want to\n // compute and cache per schema. (If you want to store something\n // in it, try to use property names unlikely to clash.)\n this.cached = Object.create(null);\n this.cached.wrappings = Object.create(null);\n};\n\n// :: (union, ?Object, ?union, ?[Mark]) → Node\n// Create a node in this schema. The `type` may be a string or a\n// `NodeType` instance. Attributes will be extended\n// with defaults, `content` may be a `Fragment`,\n// `null`, a `Node`, or an array of nodes.\nSchema.prototype.node = function node (type, attrs, content, marks) {\n if (typeof type == \"string\")\n { type = this.nodeType(type); }\n else if (!(type instanceof NodeType))\n { throw new RangeError(\"Invalid node type: \" + type) }\n else if (type.schema != this)\n { throw new RangeError(\"Node type from different schema used (\" + type.name + \")\") }\n\n return type.createChecked(attrs, content, marks)\n};\n\n// :: (string, ?[Mark]) → Node\n// Create a text node in the schema. Empty text nodes are not\n// allowed.\nSchema.prototype.text = function text (text$1, marks) {\n var type = this.nodes.text;\n return new TextNode(type, type.defaultAttrs, text$1, Mark.setFrom(marks))\n};\n\n// :: (union, ?Object) → Mark\n// Create a mark with the given type and attributes.\nSchema.prototype.mark = function mark (type, attrs) {\n if (typeof type == \"string\") { type = this.marks[type]; }\n return type.create(attrs)\n};\n\n// :: (Object) → Node\n// Deserialize a node from its JSON representation. This method is\n// bound.\nSchema.prototype.nodeFromJSON = function nodeFromJSON (json) {\n return Node.fromJSON(this, json)\n};\n\n// :: (Object) → Mark\n// Deserialize a mark from its JSON representation. This method is\n// bound.\nSchema.prototype.markFromJSON = function markFromJSON (json) {\n return Mark.fromJSON(this, json)\n};\n\nSchema.prototype.nodeType = function nodeType (name) {\n var found = this.nodes[name];\n if (!found) { throw new RangeError(\"Unknown node type: \" + name) }\n return found\n};\n\nfunction gatherMarks(schema, marks) {\n var found = [];\n for (var i = 0; i < marks.length; i++) {\n var name = marks[i], mark = schema.marks[name], ok = mark;\n if (mark) {\n found.push(mark);\n } else {\n for (var prop in schema.marks) {\n var mark$1 = schema.marks[prop];\n if (name == \"_\" || (mark$1.spec.group && mark$1.spec.group.split(\" \").indexOf(name) > -1))\n { found.push(ok = mark$1); }\n }\n }\n if (!ok) { throw new SyntaxError(\"Unknown mark type: '\" + marks[i] + \"'\") }\n }\n return found\n}\n\n// ParseOptions:: interface\n// These are the options recognized by the\n// [`parse`](#model.DOMParser.parse) and\n// [`parseSlice`](#model.DOMParser.parseSlice) methods.\n//\n// preserveWhitespace:: ?union\n// By default, whitespace is collapsed as per HTML's rules. Pass\n// `true` to preserve whitespace, but normalize newlines to\n// spaces, and `\"full\"` to preserve whitespace entirely.\n//\n// findPositions:: ?[{node: dom.Node, offset: number}]\n// When given, the parser will, beside parsing the content,\n// record the document positions of the given DOM positions. It\n// will do so by writing to the objects, adding a `pos` property\n// that holds the document position. DOM positions that are not\n// in the parsed content will not be written to.\n//\n// from:: ?number\n// The child node index to start parsing from.\n//\n// to:: ?number\n// The child node index to stop parsing at.\n//\n// topNode:: ?Node\n// By default, the content is parsed into the schema's default\n// [top node type](#model.Schema.topNodeType). You can pass this\n// option to use the type and attributes from a different node\n// as the top container.\n//\n// topMatch:: ?ContentMatch\n// Provide the starting content match that content parsed into the\n// top node is matched against.\n//\n// context:: ?ResolvedPos\n// A set of additional nodes to count as\n// [context](#model.ParseRule.context) when parsing, above the\n// given [top node](#model.ParseOptions.topNode).\n\n// ParseRule:: interface\n// A value that describes how to parse a given DOM node or inline\n// style as a ProseMirror node or mark.\n//\n// tag:: ?string\n// A CSS selector describing the kind of DOM elements to match. A\n// single rule should have _either_ a `tag` or a `style` property.\n//\n// namespace:: ?string\n// The namespace to match. This should be used with `tag`.\n// Nodes are only matched when the namespace matches or this property\n// is null.\n//\n// style:: ?string\n// A CSS property name to match. When given, this rule matches\n// inline styles that list that property. May also have the form\n// `\"property=value\"`, in which case the rule only matches if the\n// property's value exactly matches the given value. (For more\n// complicated filters, use [`getAttrs`](#model.ParseRule.getAttrs)\n// and return false to indicate that the match failed.) Rules\n// matching styles may only produce [marks](#model.ParseRule.mark),\n// not nodes.\n//\n// priority:: ?number\n// Can be used to change the order in which the parse rules in a\n// schema are tried. Those with higher priority come first. Rules\n// without a priority are counted as having priority 50. This\n// property is only meaningful in a schema—when directly\n// constructing a parser, the order of the rule array is used.\n//\n// consuming:: ?boolean\n// By default, when a rule matches an element or style, no further\n// rules get a chance to match it. By setting this to `false`, you\n// indicate that even when this rule matches, other rules that come\n// after it should also run.\n//\n// context:: ?string\n// When given, restricts this rule to only match when the current\n// context—the parent nodes into which the content is being\n// parsed—matches this expression. Should contain one or more node\n// names or node group names followed by single or double slashes.\n// For example `\"paragraph/\"` means the rule only matches when the\n// parent node is a paragraph, `\"blockquote/paragraph/\"` restricts\n// it to be in a paragraph that is inside a blockquote, and\n// `\"section//\"` matches any position inside a section—a double\n// slash matches any sequence of ancestor nodes. To allow multiple\n// different contexts, they can be separated by a pipe (`|`)\n// character, as in `\"blockquote/|list_item/\"`.\n//\n// node:: ?string\n// The name of the node type to create when this rule matches. Only\n// valid for rules with a `tag` property, not for style rules. Each\n// rule should have one of a `node`, `mark`, or `ignore` property\n// (except when it appears in a [node](#model.NodeSpec.parseDOM) or\n// [mark spec](#model.MarkSpec.parseDOM), in which case the `node`\n// or `mark` property will be derived from its position).\n//\n// mark:: ?string\n// The name of the mark type to wrap the matched content in.\n//\n// ignore:: ?bool\n// When true, ignore content that matches this rule.\n//\n// closeParent:: ?bool\n// When true, finding an element that matches this rule will close\n// the current node.\n//\n// skip:: ?bool\n// When true, ignore the node that matches this rule, but do parse\n// its content.\n//\n// attrs:: ?Object\n// Attributes for the node or mark created by this rule. When\n// `getAttrs` is provided, it takes precedence.\n//\n// getAttrs:: ?(union) → ?union\n// A function used to compute the attributes for the node or mark\n// created by this rule. Can also be used to describe further\n// conditions the DOM element or style must match. When it returns\n// `false`, the rule won't match. When it returns null or undefined,\n// that is interpreted as an empty/default set of attributes.\n//\n// Called with a DOM Element for `tag` rules, and with a string (the\n// style's value) for `style` rules.\n//\n// contentElement:: ?union\n// For `tag` rules that produce non-leaf nodes or marks, by default\n// the content of the DOM element is parsed as content of the mark\n// or node. If the child nodes are in a descendent node, this may be\n// a CSS selector string that the parser must use to find the actual\n// content element, or a function that returns the actual content\n// element to the parser.\n//\n// getContent:: ?(dom.Node, schema: Schema) → Fragment\n// Can be used to override the content of a matched node. When\n// present, instead of parsing the node's child nodes, the result of\n// this function is used.\n//\n// preserveWhitespace:: ?union\n// Controls whether whitespace should be preserved when parsing the\n// content inside the matched element. `false` means whitespace may\n// be collapsed, `true` means that whitespace should be preserved\n// but newlines normalized to spaces, and `\"full\"` means that\n// newlines should also be preserved.\n\n// ::- A DOM parser represents a strategy for parsing DOM content into\n// a ProseMirror document conforming to a given schema. Its behavior\n// is defined by an array of [rules](#model.ParseRule).\nvar DOMParser = function DOMParser(schema, rules) {\n var this$1 = this;\n\n // :: Schema\n // The schema into which the parser parses.\n this.schema = schema;\n // :: [ParseRule]\n // The set of [parse rules](#model.ParseRule) that the parser\n // uses, in order of precedence.\n this.rules = rules;\n this.tags = [];\n this.styles = [];\n\n rules.forEach(function (rule) {\n if (rule.tag) { this$1.tags.push(rule); }\n else if (rule.style) { this$1.styles.push(rule); }\n });\n\n // Only normalize list elements when lists in the schema can't directly contain themselves\n this.normalizeLists = !this.tags.some(function (r) {\n if (!/^(ul|ol)\\b/.test(r.tag) || !r.node) { return false }\n var node = schema.nodes[r.node];\n return node.contentMatch.matchType(node)\n });\n};\n\n// :: (dom.Node, ?ParseOptions) → Node\n// Parse a document from the content of a DOM node.\nDOMParser.prototype.parse = function parse (dom, options) {\n if ( options === void 0 ) options = {};\n\n var context = new ParseContext(this, options, false);\n context.addAll(dom, null, options.from, options.to);\n return context.finish()\n};\n\n// :: (dom.Node, ?ParseOptions) → Slice\n// Parses the content of the given DOM node, like\n// [`parse`](#model.DOMParser.parse), and takes the same set of\n// options. But unlike that method, which produces a whole node,\n// this one returns a slice that is open at the sides, meaning that\n// the schema constraints aren't applied to the start of nodes to\n// the left of the input and the end of nodes at the end.\nDOMParser.prototype.parseSlice = function parseSlice (dom, options) {\n if ( options === void 0 ) options = {};\n\n var context = new ParseContext(this, options, true);\n context.addAll(dom, null, options.from, options.to);\n return Slice.maxOpen(context.finish())\n};\n\nDOMParser.prototype.matchTag = function matchTag (dom, context, after) {\n for (var i = after ? this.tags.indexOf(after) + 1 : 0; i < this.tags.length; i++) {\n var rule = this.tags[i];\n if (matches(dom, rule.tag) &&\n (rule.namespace === undefined || dom.namespaceURI == rule.namespace) &&\n (!rule.context || context.matchesContext(rule.context))) {\n if (rule.getAttrs) {\n var result = rule.getAttrs(dom);\n if (result === false) { continue }\n rule.attrs = result;\n }\n return rule\n }\n }\n};\n\nDOMParser.prototype.matchStyle = function matchStyle (prop, value, context, after) {\n for (var i = after ? this.styles.indexOf(after) + 1 : 0; i < this.styles.length; i++) {\n var rule = this.styles[i];\n if (rule.style.indexOf(prop) != 0 ||\n rule.context && !context.matchesContext(rule.context) ||\n // Test that the style string either precisely matches the prop,\n // or has an '=' sign after the prop, followed by the given\n // value.\n rule.style.length > prop.length &&\n (rule.style.charCodeAt(prop.length) != 61 || rule.style.slice(prop.length + 1) != value))\n { continue }\n if (rule.getAttrs) {\n var result = rule.getAttrs(value);\n if (result === false) { continue }\n rule.attrs = result;\n }\n return rule\n }\n};\n\n// : (Schema) → [ParseRule]\nDOMParser.schemaRules = function schemaRules (schema) {\n var result = [];\n function insert(rule) {\n var priority = rule.priority == null ? 50 : rule.priority, i = 0;\n for (; i < result.length; i++) {\n var next = result[i], nextPriority = next.priority == null ? 50 : next.priority;\n if (nextPriority < priority) { break }\n }\n result.splice(i, 0, rule);\n }\n\n var loop = function ( name ) {\n var rules = schema.marks[name].spec.parseDOM;\n if (rules) { rules.forEach(function (rule) {\n insert(rule = copy(rule));\n rule.mark = name;\n }); }\n };\n\n for (var name in schema.marks) loop( name );\n var loop$1 = function ( name ) {\n var rules$1 = schema.nodes[name$1].spec.parseDOM;\n if (rules$1) { rules$1.forEach(function (rule) {\n insert(rule = copy(rule));\n rule.node = name$1;\n }); }\n };\n\n for (var name$1 in schema.nodes) loop$1();\n return result\n};\n\n// :: (Schema) → DOMParser\n// Construct a DOM parser using the parsing rules listed in a\n// schema's [node specs](#model.NodeSpec.parseDOM), reordered by\n// [priority](#model.ParseRule.priority).\nDOMParser.fromSchema = function fromSchema (schema) {\n return schema.cached.domParser ||\n (schema.cached.domParser = new DOMParser(schema, DOMParser.schemaRules(schema)))\n};\n\n// : Object The block-level tags in HTML5\nvar blockTags = {\n address: true, article: true, aside: true, blockquote: true, canvas: true,\n dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true,\n footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true,\n h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true,\n output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true\n};\n\n// : Object The tags that we normally ignore.\nvar ignoreTags = {\n head: true, noscript: true, object: true, script: true, style: true, title: true\n};\n\n// : Object List tags.\nvar listTags = {ol: true, ul: true};\n\n// Using a bitfield for node context options\nvar OPT_PRESERVE_WS = 1, OPT_PRESERVE_WS_FULL = 2, OPT_OPEN_LEFT = 4;\n\nfunction wsOptionsFor(preserveWhitespace) {\n return (preserveWhitespace ? OPT_PRESERVE_WS : 0) | (preserveWhitespace === \"full\" ? OPT_PRESERVE_WS_FULL : 0)\n}\n\nvar NodeContext = function NodeContext(type, attrs, marks, pendingMarks, solid, match, options) {\n this.type = type;\n this.attrs = attrs;\n this.solid = solid;\n this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch);\n this.options = options;\n this.content = [];\n // Marks applied to this node itself\n this.marks = marks;\n // Marks applied to its children\n this.activeMarks = Mark.none;\n // Marks that can't apply here, but will be used in children if possible\n this.pendingMarks = pendingMarks;\n // Nested Marks with same type\n this.stashMarks = [];\n};\n\nNodeContext.prototype.findWrapping = function findWrapping (node) {\n if (!this.match) {\n if (!this.type) { return [] }\n var fill = this.type.contentMatch.fillBefore(Fragment.from(node));\n if (fill) {\n this.match = this.type.contentMatch.matchFragment(fill);\n } else {\n var start = this.type.contentMatch, wrap;\n if (wrap = start.findWrapping(node.type)) {\n this.match = start;\n return wrap\n } else {\n return null\n }\n }\n }\n return this.match.findWrapping(node.type)\n};\n\nNodeContext.prototype.finish = function finish (openEnd) {\n if (!(this.options & OPT_PRESERVE_WS)) { // Strip trailing whitespace\n var last = this.content[this.content.length - 1], m;\n if (last && last.isText && (m = /[ \\t\\r\\n\\u000c]+$/.exec(last.text))) {\n if (last.text.length == m[0].length) { this.content.pop(); }\n else { this.content[this.content.length - 1] = last.withText(last.text.slice(0, last.text.length - m[0].length)); }\n }\n }\n var content = Fragment.from(this.content);\n if (!openEnd && this.match)\n { content = content.append(this.match.fillBefore(Fragment.empty, true)); }\n return this.type ? this.type.create(this.attrs, content, this.marks) : content\n};\n\nNodeContext.prototype.popFromStashMark = function popFromStashMark (mark) {\n for (var i = this.stashMarks.length - 1; i >= 0; i--)\n { if (mark.eq(this.stashMarks[i])) { return this.stashMarks.splice(i, 1)[0] } }\n};\n\nNodeContext.prototype.applyPending = function applyPending (nextType) {\n for (var i = 0, pending = this.pendingMarks; i < pending.length; i++) {\n var mark = pending[i];\n if ((this.type ? this.type.allowsMarkType(mark.type) : markMayApply(mark.type, nextType)) &&\n !mark.isInSet(this.activeMarks)) {\n this.activeMarks = mark.addToSet(this.activeMarks);\n this.pendingMarks = mark.removeFromSet(this.pendingMarks);\n }\n }\n};\n\nvar ParseContext = function ParseContext(parser, options, open) {\n // : DOMParser The parser we are using.\n this.parser = parser;\n // : Object The options passed to this parse.\n this.options = options;\n this.isOpen = open;\n var topNode = options.topNode, topContext;\n var topOptions = wsOptionsFor(options.preserveWhitespace) | (open ? OPT_OPEN_LEFT : 0);\n if (topNode)\n { topContext = new NodeContext(topNode.type, topNode.attrs, Mark.none, Mark.none, true,\n options.topMatch || topNode.type.contentMatch, topOptions); }\n else if (open)\n { topContext = new NodeContext(null, null, Mark.none, Mark.none, true, null, topOptions); }\n else\n { topContext = new NodeContext(parser.schema.topNodeType, null, Mark.none, Mark.none, true, null, topOptions); }\n this.nodes = [topContext];\n // : [Mark] The current set of marks\n this.open = 0;\n this.find = options.findPositions;\n this.needsBlock = false;\n};\n\nvar prototypeAccessors$6 = { top: { configurable: true },currentPos: { configurable: true } };\n\nprototypeAccessors$6.top.get = function () {\n return this.nodes[this.open]\n};\n\n// : (dom.Node)\n// Add a DOM node to the content. Text is inserted as text node,\n// otherwise, the node is passed to `addElement` or, if it has a\n// `style` attribute, `addElementWithStyles`.\nParseContext.prototype.addDOM = function addDOM (dom) {\n if (dom.nodeType == 3) {\n this.addTextNode(dom);\n } else if (dom.nodeType == 1) {\n var style = dom.getAttribute(\"style\");\n var marks = style ? this.readStyles(parseStyles(style)) : null, top = this.top;\n if (marks != null) { for (var i = 0; i < marks.length; i++) { this.addPendingMark(marks[i]); } }\n this.addElement(dom);\n if (marks != null) { for (var i$1 = 0; i$1 < marks.length; i$1++) { this.removePendingMark(marks[i$1], top); } }\n }\n};\n\nParseContext.prototype.addTextNode = function addTextNode (dom) {\n var value = dom.nodeValue;\n var top = this.top;\n if ((top.type ? top.type.inlineContent : top.content.length && top.content[0].isInline) || /[^ \\t\\r\\n\\u000c]/.test(value)) {\n if (!(top.options & OPT_PRESERVE_WS)) {\n value = value.replace(/[ \\t\\r\\n\\u000c]+/g, \" \");\n // If this starts with whitespace, and there is no node before it, or\n // a hard break, or a text node that ends with whitespace, strip the\n // leading space.\n if (/^[ \\t\\r\\n\\u000c]/.test(value) && this.open == this.nodes.length - 1) {\n var nodeBefore = top.content[top.content.length - 1];\n var domNodeBefore = dom.previousSibling;\n if (!nodeBefore ||\n (domNodeBefore && domNodeBefore.nodeName == 'BR') ||\n (nodeBefore.isText && /[ \\t\\r\\n\\u000c]$/.test(nodeBefore.text)))\n { value = value.slice(1); }\n }\n } else if (!(top.options & OPT_PRESERVE_WS_FULL)) {\n value = value.replace(/\\r?\\n|\\r/g, \" \");\n }\n if (value) { this.insertNode(this.parser.schema.text(value)); }\n this.findInText(dom);\n } else {\n this.findInside(dom);\n }\n};\n\n// : (dom.Element, ?ParseRule)\n// Try to find a handler for the given tag and use that to parse. If\n// none is found, the element's content nodes are added directly.\nParseContext.prototype.addElement = function addElement (dom, matchAfter) {\n var name = dom.nodeName.toLowerCase(), ruleID;\n if (listTags.hasOwnProperty(name) && this.parser.normalizeLists) { normalizeList(dom); }\n var rule = (this.options.ruleFromNode && this.options.ruleFromNode(dom)) ||\n (ruleID = this.parser.matchTag(dom, this, matchAfter));\n if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) {\n this.findInside(dom);\n } else if (!rule || rule.skip || rule.closeParent) {\n if (rule && rule.closeParent) { this.open = Math.max(0, this.open - 1); }\n else if (rule && rule.skip.nodeType) { dom = rule.skip; }\n var sync, top = this.top, oldNeedsBlock = this.needsBlock;\n if (blockTags.hasOwnProperty(name)) {\n sync = true;\n if (!top.type) { this.needsBlock = true; }\n } else if (!dom.firstChild) {\n this.leafFallback(dom);\n return\n }\n this.addAll(dom);\n if (sync) { this.sync(top); }\n this.needsBlock = oldNeedsBlock;\n } else {\n this.addElementByRule(dom, rule, rule.consuming === false ? ruleID : null);\n }\n};\n\n// Called for leaf DOM nodes that would otherwise be ignored\nParseContext.prototype.leafFallback = function leafFallback (dom) {\n if (dom.nodeName == \"BR\" && this.top.type && this.top.type.inlineContent)\n { this.addTextNode(dom.ownerDocument.createTextNode(\"\\n\")); }\n};\n\n// Run any style parser associated with the node's styles. Either\n// return an array of marks, or null to indicate some of the styles\n// had a rule with `ignore` set.\nParseContext.prototype.readStyles = function readStyles (styles) {\n var marks = Mark.none;\n style: for (var i = 0; i < styles.length; i += 2) {\n for (var after = null;;) {\n var rule = this.parser.matchStyle(styles[i], styles[i + 1], this, after);\n if (!rule) { continue style }\n if (rule.ignore) { return null }\n marks = this.parser.schema.marks[rule.mark].create(rule.attrs).addToSet(marks);\n if (rule.consuming === false) { after = rule; }\n else { break }\n }\n }\n return marks\n};\n\n// : (dom.Element, ParseRule) → bool\n// Look up a handler for the given node. If none are found, return\n// false. Otherwise, apply it, use its return value to drive the way\n// the node's content is wrapped, and return true.\nParseContext.prototype.addElementByRule = function addElementByRule (dom, rule, continueAfter) {\n var this$1 = this;\n\n var sync, nodeType, markType, mark;\n if (rule.node) {\n nodeType = this.parser.schema.nodes[rule.node];\n if (!nodeType.isLeaf) {\n sync = this.enter(nodeType, rule.attrs, rule.preserveWhitespace);\n } else if (!this.insertNode(nodeType.create(rule.attrs))) {\n this.leafFallback(dom);\n }\n } else {\n markType = this.parser.schema.marks[rule.mark];\n mark = markType.create(rule.attrs);\n this.addPendingMark(mark);\n }\n var startIn = this.top;\n\n if (nodeType && nodeType.isLeaf) {\n this.findInside(dom);\n } else if (continueAfter) {\n this.addElement(dom, continueAfter);\n } else if (rule.getContent) {\n this.findInside(dom);\n rule.getContent(dom, this.parser.schema).forEach(function (node) { return this$1.insertNode(node); });\n } else {\n var contentDOM = rule.contentElement;\n if (typeof contentDOM == \"string\") { contentDOM = dom.querySelector(contentDOM); }\n else if (typeof contentDOM == \"function\") { contentDOM = contentDOM(dom); }\n if (!contentDOM) { contentDOM = dom; }\n this.findAround(dom, contentDOM, true);\n this.addAll(contentDOM, sync);\n }\n if (sync) { this.sync(startIn); this.open--; }\n if (mark) { this.removePendingMark(mark, startIn); }\n};\n\n// : (dom.Node, ?NodeBuilder, ?number, ?number)\n// Add all child nodes between `startIndex` and `endIndex` (or the\n// whole node, if not given). If `sync` is passed, use it to\n// synchronize after every block element.\nParseContext.prototype.addAll = function addAll (parent, sync, startIndex, endIndex) {\n var index = startIndex || 0;\n for (var dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild,\n end = endIndex == null ? null : parent.childNodes[endIndex];\n dom != end; dom = dom.nextSibling, ++index) {\n this.findAtPoint(parent, index);\n this.addDOM(dom);\n if (sync && blockTags.hasOwnProperty(dom.nodeName.toLowerCase()))\n { this.sync(sync); }\n }\n this.findAtPoint(parent, index);\n};\n\n// Try to find a way to fit the given node type into the current\n// context. May add intermediate wrappers and/or leave non-solid\n// nodes that we're in.\nParseContext.prototype.findPlace = function findPlace (node) {\n var route, sync;\n for (var depth = this.open; depth >= 0; depth--) {\n var cx = this.nodes[depth];\n var found = cx.findWrapping(node);\n if (found && (!route || route.length > found.length)) {\n route = found;\n sync = cx;\n if (!found.length) { break }\n }\n if (cx.solid) { break }\n }\n if (!route) { return false }\n this.sync(sync);\n for (var i = 0; i < route.length; i++)\n { this.enterInner(route[i], null, false); }\n return true\n};\n\n// : (Node) → ?Node\n// Try to insert the given node, adjusting the context when needed.\nParseContext.prototype.insertNode = function insertNode (node) {\n if (node.isInline && this.needsBlock && !this.top.type) {\n var block = this.textblockFromContext();\n if (block) { this.enterInner(block); }\n }\n if (this.findPlace(node)) {\n this.closeExtra();\n var top = this.top;\n top.applyPending(node.type);\n if (top.match) { top.match = top.match.matchType(node.type); }\n var marks = top.activeMarks;\n for (var i = 0; i < node.marks.length; i++)\n { if (!top.type || top.type.allowsMarkType(node.marks[i].type))\n { marks = node.marks[i].addToSet(marks); } }\n top.content.push(node.mark(marks));\n return true\n }\n return false\n};\n\n// : (NodeType, ?Object) → bool\n// Try to start a node of the given type, adjusting the context when\n// necessary.\nParseContext.prototype.enter = function enter (type, attrs, preserveWS) {\n var ok = this.findPlace(type.create(attrs));\n if (ok) { this.enterInner(type, attrs, true, preserveWS); }\n return ok\n};\n\n// Open a node of the given type\nParseContext.prototype.enterInner = function enterInner (type, attrs, solid, preserveWS) {\n this.closeExtra();\n var top = this.top;\n top.applyPending(type);\n top.match = top.match && top.match.matchType(type, attrs);\n var options = preserveWS == null ? top.options & ~OPT_OPEN_LEFT : wsOptionsFor(preserveWS);\n if ((top.options & OPT_OPEN_LEFT) && top.content.length == 0) { options |= OPT_OPEN_LEFT; }\n this.nodes.push(new NodeContext(type, attrs, top.activeMarks, top.pendingMarks, solid, null, options));\n this.open++;\n};\n\n// Make sure all nodes above this.open are finished and added to\n// their parents\nParseContext.prototype.closeExtra = function closeExtra (openEnd) {\n var i = this.nodes.length - 1;\n if (i > this.open) {\n for (; i > this.open; i--) { this.nodes[i - 1].content.push(this.nodes[i].finish(openEnd)); }\n this.nodes.length = this.open + 1;\n }\n};\n\nParseContext.prototype.finish = function finish () {\n this.open = 0;\n this.closeExtra(this.isOpen);\n return this.nodes[0].finish(this.isOpen || this.options.topOpen)\n};\n\nParseContext.prototype.sync = function sync (to) {\n for (var i = this.open; i >= 0; i--) { if (this.nodes[i] == to) {\n this.open = i;\n return\n } }\n};\n\nprototypeAccessors$6.currentPos.get = function () {\n this.closeExtra();\n var pos = 0;\n for (var i = this.open; i >= 0; i--) {\n var content = this.nodes[i].content;\n for (var j = content.length - 1; j >= 0; j--)\n { pos += content[j].nodeSize; }\n if (i) { pos++; }\n }\n return pos\n};\n\nParseContext.prototype.findAtPoint = function findAtPoint (parent, offset) {\n if (this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].node == parent && this.find[i].offset == offset)\n { this.find[i].pos = this.currentPos; }\n } }\n};\n\nParseContext.prototype.findInside = function findInside (parent) {\n if (this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node))\n { this.find[i].pos = this.currentPos; }\n } }\n};\n\nParseContext.prototype.findAround = function findAround (parent, content, before) {\n if (parent != content && this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) {\n var pos = content.compareDocumentPosition(this.find[i].node);\n if (pos & (before ? 2 : 4))\n { this.find[i].pos = this.currentPos; }\n }\n } }\n};\n\nParseContext.prototype.findInText = function findInText (textNode) {\n if (this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].node == textNode)\n { this.find[i].pos = this.currentPos - (textNode.nodeValue.length - this.find[i].offset); }\n } }\n};\n\n// : (string) → bool\n// Determines whether the given [context\n// string](#ParseRule.context) matches this context.\nParseContext.prototype.matchesContext = function matchesContext (context) {\n var this$1 = this;\n\n if (context.indexOf(\"|\") > -1)\n { return context.split(/\\s*\\|\\s*/).some(this.matchesContext, this) }\n\n var parts = context.split(\"/\");\n var option = this.options.context;\n var useRoot = !this.isOpen && (!option || option.parent.type == this.nodes[0].type);\n var minDepth = -(option ? option.depth + 1 : 0) + (useRoot ? 0 : 1);\n var match = function (i, depth) {\n for (; i >= 0; i--) {\n var part = parts[i];\n if (part == \"\") {\n if (i == parts.length - 1 || i == 0) { continue }\n for (; depth >= minDepth; depth--)\n { if (match(i - 1, depth)) { return true } }\n return false\n } else {\n var next = depth > 0 || (depth == 0 && useRoot) ? this$1.nodes[depth].type\n : option && depth >= minDepth ? option.node(depth - minDepth).type\n : null;\n if (!next || (next.name != part && next.groups.indexOf(part) == -1))\n { return false }\n depth--;\n }\n }\n return true\n };\n return match(parts.length - 1, this.open)\n};\n\nParseContext.prototype.textblockFromContext = function textblockFromContext () {\n var $context = this.options.context;\n if ($context) { for (var d = $context.depth; d >= 0; d--) {\n var deflt = $context.node(d).contentMatchAt($context.indexAfter(d)).defaultType;\n if (deflt && deflt.isTextblock && deflt.defaultAttrs) { return deflt }\n } }\n for (var name in this.parser.schema.nodes) {\n var type = this.parser.schema.nodes[name];\n if (type.isTextblock && type.defaultAttrs) { return type }\n }\n};\n\nParseContext.prototype.addPendingMark = function addPendingMark (mark) {\n var found = findSameMarkInSet(mark, this.top.pendingMarks);\n if (found) { this.top.stashMarks.push(found); }\n this.top.pendingMarks = mark.addToSet(this.top.pendingMarks);\n};\n\nParseContext.prototype.removePendingMark = function removePendingMark (mark, upto) {\n for (var depth = this.open; depth >= 0; depth--) {\n var level = this.nodes[depth];\n var found = level.pendingMarks.lastIndexOf(mark);\n if (found > -1) {\n level.pendingMarks = mark.removeFromSet(level.pendingMarks);\n } else {\n level.activeMarks = mark.removeFromSet(level.activeMarks);\n var stashMark = level.popFromStashMark(mark);\n if (stashMark && level.type && level.type.allowsMarkType(stashMark.type))\n { level.activeMarks = stashMark.addToSet(level.activeMarks); }\n }\n if (level == upto) { break }\n }\n};\n\nObject.defineProperties( ParseContext.prototype, prototypeAccessors$6 );\n\n// Kludge to work around directly nested list nodes produced by some\n// tools and allowed by browsers to mean that the nested list is\n// actually part of the list item above it.\nfunction normalizeList(dom) {\n for (var child = dom.firstChild, prevItem = null; child; child = child.nextSibling) {\n var name = child.nodeType == 1 ? child.nodeName.toLowerCase() : null;\n if (name && listTags.hasOwnProperty(name) && prevItem) {\n prevItem.appendChild(child);\n child = prevItem;\n } else if (name == \"li\") {\n prevItem = child;\n } else if (name) {\n prevItem = null;\n }\n }\n}\n\n// Apply a CSS selector.\nfunction matches(dom, selector) {\n return (dom.matches || dom.msMatchesSelector || dom.webkitMatchesSelector || dom.mozMatchesSelector).call(dom, selector)\n}\n\n// : (string) → [string]\n// Tokenize a style attribute into property/value pairs.\nfunction parseStyles(style) {\n var re = /\\s*([\\w-]+)\\s*:\\s*([^;]+)/g, m, result = [];\n while (m = re.exec(style)) { result.push(m[1], m[2].trim()); }\n return result\n}\n\nfunction copy(obj) {\n var copy = {};\n for (var prop in obj) { copy[prop] = obj[prop]; }\n return copy\n}\n\n// Used when finding a mark at the top level of a fragment parse.\n// Checks whether it would be reasonable to apply a given mark type to\n// a given node, by looking at the way the mark occurs in the schema.\nfunction markMayApply(markType, nodeType) {\n var nodes = nodeType.schema.nodes;\n var loop = function ( name ) {\n var parent = nodes[name];\n if (!parent.allowsMarkType(markType)) { return }\n var seen = [], scan = function (match) {\n seen.push(match);\n for (var i = 0; i < match.edgeCount; i++) {\n var ref = match.edge(i);\n var type = ref.type;\n var next = ref.next;\n if (type == nodeType) { return true }\n if (seen.indexOf(next) < 0 && scan(next)) { return true }\n }\n };\n if (scan(parent.contentMatch)) { return { v: true } }\n };\n\n for (var name in nodes) {\n var returned = loop( name );\n\n if ( returned ) return returned.v;\n }\n}\n\nfunction findSameMarkInSet(mark, set) {\n for (var i = 0; i < set.length; i++) {\n if (mark.eq(set[i])) { return set[i] }\n }\n}\n\n// DOMOutputSpec:: interface\n// A description of a DOM structure. Can be either a string, which is\n// interpreted as a text node, a DOM node, which is interpreted as\n// itself, a `{dom: Node, contentDOM: ?Node}` object, or an array.\n//\n// An array describes a DOM element. The first value in the array\n// should be a string—the name of the DOM element, optionally prefixed\n// by a namespace URL and a space. If the second element is plain\n// object, it is interpreted as a set of attributes for the element.\n// Any elements after that (including the 2nd if it's not an attribute\n// object) are interpreted as children of the DOM elements, and must\n// either be valid `DOMOutputSpec` values, or the number zero.\n//\n// The number zero (pronounced “hole”) is used to indicate the place\n// where a node's child nodes should be inserted. If it occurs in an\n// output spec, it should be the only child element in its parent\n// node.\n\n// ::- A DOM serializer knows how to convert ProseMirror nodes and\n// marks of various types to DOM nodes.\nvar DOMSerializer = function DOMSerializer(nodes, marks) {\n // :: Object<(node: Node) → DOMOutputSpec>\n // The node serialization functions.\n this.nodes = nodes || {};\n // :: Object\n // The mark serialization functions.\n this.marks = marks || {};\n};\n\n// :: (Fragment, ?Object) → dom.DocumentFragment\n// Serialize the content of this fragment to a DOM fragment. When\n// not in the browser, the `document` option, containing a DOM\n// document, should be passed so that the serializer can create\n// nodes.\nDOMSerializer.prototype.serializeFragment = function serializeFragment (fragment, options, target) {\n var this$1 = this;\n if ( options === void 0 ) options = {};\n\n if (!target) { target = doc(options).createDocumentFragment(); }\n\n var top = target, active = null;\n fragment.forEach(function (node) {\n if (active || node.marks.length) {\n if (!active) { active = []; }\n var keep = 0, rendered = 0;\n while (keep < active.length && rendered < node.marks.length) {\n var next = node.marks[rendered];\n if (!this$1.marks[next.type.name]) { rendered++; continue }\n if (!next.eq(active[keep]) || next.type.spec.spanning === false) { break }\n keep += 2; rendered++;\n }\n while (keep < active.length) {\n top = active.pop();\n active.pop();\n }\n while (rendered < node.marks.length) {\n var add = node.marks[rendered++];\n var markDOM = this$1.serializeMark(add, node.isInline, options);\n if (markDOM) {\n active.push(add, top);\n top.appendChild(markDOM.dom);\n top = markDOM.contentDOM || markDOM.dom;\n }\n }\n }\n top.appendChild(this$1.serializeNode(node, options));\n });\n\n return target\n};\n\n// :: (Node, ?Object) → dom.Node\n// Serialize this node to a DOM node. This can be useful when you\n// need to serialize a part of a document, as opposed to the whole\n// document. To serialize a whole document, use\n// [`serializeFragment`](#model.DOMSerializer.serializeFragment) on\n// its [content](#model.Node.content).\nDOMSerializer.prototype.serializeNode = function serializeNode (node, options) {\n if ( options === void 0 ) options = {};\n\n var ref =\n DOMSerializer.renderSpec(doc(options), this.nodes[node.type.name](node));\n var dom = ref.dom;\n var contentDOM = ref.contentDOM;\n if (contentDOM) {\n if (node.isLeaf)\n { throw new RangeError(\"Content hole not allowed in a leaf node spec\") }\n if (options.onContent)\n { options.onContent(node, contentDOM, options); }\n else\n { this.serializeFragment(node.content, options, contentDOM); }\n }\n return dom\n};\n\nDOMSerializer.prototype.serializeNodeAndMarks = function serializeNodeAndMarks (node, options) {\n if ( options === void 0 ) options = {};\n\n var dom = this.serializeNode(node, options);\n for (var i = node.marks.length - 1; i >= 0; i--) {\n var wrap = this.serializeMark(node.marks[i], node.isInline, options);\n if (wrap) {\n(wrap.contentDOM || wrap.dom).appendChild(dom);\n dom = wrap.dom;\n }\n }\n return dom\n};\n\nDOMSerializer.prototype.serializeMark = function serializeMark (mark, inline, options) {\n if ( options === void 0 ) options = {};\n\n var toDOM = this.marks[mark.type.name];\n return toDOM && DOMSerializer.renderSpec(doc(options), toDOM(mark, inline))\n};\n\n// :: (dom.Document, DOMOutputSpec) → {dom: dom.Node, contentDOM: ?dom.Node}\n// Render an [output spec](#model.DOMOutputSpec) to a DOM node. If\n// the spec has a hole (zero) in it, `contentDOM` will point at the\n// node with the hole.\nDOMSerializer.renderSpec = function renderSpec (doc, structure, xmlNS) {\n if ( xmlNS === void 0 ) xmlNS = null;\n\n if (typeof structure == \"string\")\n { return {dom: doc.createTextNode(structure)} }\n if (structure.nodeType != null)\n { return {dom: structure} }\n if (structure.dom && structure.dom.nodeType != null)\n { return structure }\n var tagName = structure[0], space = tagName.indexOf(\" \");\n if (space > 0) {\n xmlNS = tagName.slice(0, space);\n tagName = tagName.slice(space + 1);\n }\n var contentDOM = null, dom = xmlNS ? doc.createElementNS(xmlNS, tagName) : doc.createElement(tagName);\n var attrs = structure[1], start = 1;\n if (attrs && typeof attrs == \"object\" && attrs.nodeType == null && !Array.isArray(attrs)) {\n start = 2;\n for (var name in attrs) { if (attrs[name] != null) {\n var space$1 = name.indexOf(\" \");\n if (space$1 > 0) { dom.setAttributeNS(name.slice(0, space$1), name.slice(space$1 + 1), attrs[name]); }\n else { dom.setAttribute(name, attrs[name]); }\n } }\n }\n for (var i = start; i < structure.length; i++) {\n var child = structure[i];\n if (child === 0) {\n if (i < structure.length - 1 || i > start)\n { throw new RangeError(\"Content hole must be the only child of its parent node\") }\n return {dom: dom, contentDOM: dom}\n } else {\n var ref = DOMSerializer.renderSpec(doc, child, xmlNS);\n var inner = ref.dom;\n var innerContent = ref.contentDOM;\n dom.appendChild(inner);\n if (innerContent) {\n if (contentDOM) { throw new RangeError(\"Multiple content holes\") }\n contentDOM = innerContent;\n }\n }\n }\n return {dom: dom, contentDOM: contentDOM}\n};\n\n// :: (Schema) → DOMSerializer\n// Build a serializer using the [`toDOM`](#model.NodeSpec.toDOM)\n// properties in a schema's node and mark specs.\nDOMSerializer.fromSchema = function fromSchema (schema) {\n return schema.cached.domSerializer ||\n (schema.cached.domSerializer = new DOMSerializer(this.nodesFromSchema(schema), this.marksFromSchema(schema)))\n};\n\n// : (Schema) → Object<(node: Node) → DOMOutputSpec>\n// Gather the serializers in a schema's node specs into an object.\n// This can be useful as a base to build a custom serializer from.\nDOMSerializer.nodesFromSchema = function nodesFromSchema (schema) {\n var result = gatherToDOM(schema.nodes);\n if (!result.text) { result.text = function (node) { return node.text; }; }\n return result\n};\n\n// : (Schema) → Object<(mark: Mark) → DOMOutputSpec>\n// Gather the serializers in a schema's mark specs into an object.\nDOMSerializer.marksFromSchema = function marksFromSchema (schema) {\n return gatherToDOM(schema.marks)\n};\n\nfunction gatherToDOM(obj) {\n var result = {};\n for (var name in obj) {\n var toDOM = obj[name].spec.toDOM;\n if (toDOM) { result[name] = toDOM; }\n }\n return result\n}\n\nfunction doc(options) {\n // declare global: window\n return options.document || window.document\n}\n\nexport { ContentMatch, DOMParser, DOMSerializer, Fragment, Mark, MarkType, Node, NodeRange, NodeType, ReplaceError, ResolvedPos, Schema, Slice };\n//# sourceMappingURL=index.es.js.map\n","import { Slice, Fragment, Mark, Node } from 'prosemirror-model';\nimport { ReplaceStep, ReplaceAroundStep, Transform } from 'prosemirror-transform';\n\nvar classesById = Object.create(null);\n\n// ::- Superclass for editor selections. Every selection type should\n// extend this. Should not be instantiated directly.\nvar Selection = function Selection($anchor, $head, ranges) {\n // :: [SelectionRange]\n // The ranges covered by the selection.\n this.ranges = ranges || [new SelectionRange($anchor.min($head), $anchor.max($head))];\n // :: ResolvedPos\n // The resolved anchor of the selection (the side that stays in\n // place when the selection is modified).\n this.$anchor = $anchor;\n // :: ResolvedPos\n // The resolved head of the selection (the side that moves when\n // the selection is modified).\n this.$head = $head;\n};\n\nvar prototypeAccessors = { anchor: { configurable: true },head: { configurable: true },from: { configurable: true },to: { configurable: true },$from: { configurable: true },$to: { configurable: true },empty: { configurable: true } };\n\n// :: number\n// The selection's anchor, as an unresolved position.\nprototypeAccessors.anchor.get = function () { return this.$anchor.pos };\n\n// :: number\n// The selection's head.\nprototypeAccessors.head.get = function () { return this.$head.pos };\n\n// :: number\n// The lower bound of the selection's main range.\nprototypeAccessors.from.get = function () { return this.$from.pos };\n\n// :: number\n// The upper bound of the selection's main range.\nprototypeAccessors.to.get = function () { return this.$to.pos };\n\n// :: ResolvedPos\n// The resolved lowerbound of the selection's main range.\nprototypeAccessors.$from.get = function () {\n return this.ranges[0].$from\n};\n\n// :: ResolvedPos\n// The resolved upper bound of the selection's main range.\nprototypeAccessors.$to.get = function () {\n return this.ranges[0].$to\n};\n\n// :: bool\n// Indicates whether the selection contains any content.\nprototypeAccessors.empty.get = function () {\n var ranges = this.ranges;\n for (var i = 0; i < ranges.length; i++)\n { if (ranges[i].$from.pos != ranges[i].$to.pos) { return false } }\n return true\n};\n\n// eq:: (Selection) → bool\n// Test whether the selection is the same as another selection.\n\n// map:: (doc: Node, mapping: Mappable) → Selection\n// Map this selection through a [mappable](#transform.Mappable) thing. `doc`\n// should be the new document to which we are mapping.\n\n// :: () → Slice\n// Get the content of this selection as a slice.\nSelection.prototype.content = function content () {\n return this.$from.node(0).slice(this.from, this.to, true)\n};\n\n// :: (Transaction, ?Slice)\n// Replace the selection with a slice or, if no slice is given,\n// delete the selection. Will append to the given transaction.\nSelection.prototype.replace = function replace (tr, content) {\n if ( content === void 0 ) content = Slice.empty;\n\n // Put the new selection at the position after the inserted\n // content. When that ended in an inline node, search backwards,\n // to get the position after that node. If not, search forward.\n var lastNode = content.content.lastChild, lastParent = null;\n for (var i = 0; i < content.openEnd; i++) {\n lastParent = lastNode;\n lastNode = lastNode.lastChild;\n }\n\n var mapFrom = tr.steps.length, ranges = this.ranges;\n for (var i$1 = 0; i$1 < ranges.length; i$1++) {\n var ref = ranges[i$1];\n var $from = ref.$from;\n var $to = ref.$to;\n var mapping = tr.mapping.slice(mapFrom);\n tr.replaceRange(mapping.map($from.pos), mapping.map($to.pos), i$1 ? Slice.empty : content);\n if (i$1 == 0)\n { selectionToInsertionEnd(tr, mapFrom, (lastNode ? lastNode.isInline : lastParent && lastParent.isTextblock) ? -1 : 1); }\n }\n};\n\n// :: (Transaction, Node)\n// Replace the selection with the given node, appending the changes\n// to the given transaction.\nSelection.prototype.replaceWith = function replaceWith (tr, node) {\n var mapFrom = tr.steps.length, ranges = this.ranges;\n for (var i = 0; i < ranges.length; i++) {\n var ref = ranges[i];\n var $from = ref.$from;\n var $to = ref.$to;\n var mapping = tr.mapping.slice(mapFrom);\n var from = mapping.map($from.pos), to = mapping.map($to.pos);\n if (i) {\n tr.deleteRange(from, to);\n } else {\n tr.replaceRangeWith(from, to, node);\n selectionToInsertionEnd(tr, mapFrom, node.isInline ? -1 : 1);\n }\n }\n};\n\n// toJSON:: () → Object\n// Convert the selection to a JSON representation. When implementing\n// this for a custom selection class, make sure to give the object a\n// `type` property whose value matches the ID under which you\n// [registered](#state.Selection^jsonID) your class.\n\n// :: (ResolvedPos, number, ?bool) → ?Selection\n// Find a valid cursor or leaf node selection starting at the given\n// position and searching back if `dir` is negative, and forward if\n// positive. When `textOnly` is true, only consider cursor\n// selections. Will return null when no valid selection position is\n// found.\nSelection.findFrom = function findFrom ($pos, dir, textOnly) {\n var inner = $pos.parent.inlineContent ? new TextSelection($pos)\n : findSelectionIn($pos.node(0), $pos.parent, $pos.pos, $pos.index(), dir, textOnly);\n if (inner) { return inner }\n\n for (var depth = $pos.depth - 1; depth >= 0; depth--) {\n var found = dir < 0\n ? findSelectionIn($pos.node(0), $pos.node(depth), $pos.before(depth + 1), $pos.index(depth), dir, textOnly)\n : findSelectionIn($pos.node(0), $pos.node(depth), $pos.after(depth + 1), $pos.index(depth) + 1, dir, textOnly);\n if (found) { return found }\n }\n};\n\n// :: (ResolvedPos, ?number) → Selection\n// Find a valid cursor or leaf node selection near the given\n// position. Searches forward first by default, but if `bias` is\n// negative, it will search backwards first.\nSelection.near = function near ($pos, bias) {\n if ( bias === void 0 ) bias = 1;\n\n return this.findFrom($pos, bias) || this.findFrom($pos, -bias) || new AllSelection($pos.node(0))\n};\n\n// :: (Node) → Selection\n// Find the cursor or leaf node selection closest to the start of\n// the given document. Will return an\n// [`AllSelection`](#state.AllSelection) if no valid position\n// exists.\nSelection.atStart = function atStart (doc) {\n return findSelectionIn(doc, doc, 0, 0, 1) || new AllSelection(doc)\n};\n\n// :: (Node) → Selection\n// Find the cursor or leaf node selection closest to the end of the\n// given document.\nSelection.atEnd = function atEnd (doc) {\n return findSelectionIn(doc, doc, doc.content.size, doc.childCount, -1) || new AllSelection(doc)\n};\n\n// :: (Node, Object) → Selection\n// Deserialize the JSON representation of a selection. Must be\n// implemented for custom classes (as a static class method).\nSelection.fromJSON = function fromJSON (doc, json) {\n if (!json || !json.type) { throw new RangeError(\"Invalid input for Selection.fromJSON\") }\n var cls = classesById[json.type];\n if (!cls) { throw new RangeError((\"No selection type \" + (json.type) + \" defined\")) }\n return cls.fromJSON(doc, json)\n};\n\n// :: (string, constructor)\n// To be able to deserialize selections from JSON, custom selection\n// classes must register themselves with an ID string, so that they\n// can be disambiguated. Try to pick something that's unlikely to\n// clash with classes from other modules.\nSelection.jsonID = function jsonID (id, selectionClass) {\n if (id in classesById) { throw new RangeError(\"Duplicate use of selection JSON ID \" + id) }\n classesById[id] = selectionClass;\n selectionClass.prototype.jsonID = id;\n return selectionClass\n};\n\n// :: () → SelectionBookmark\n// Get a [bookmark](#state.SelectionBookmark) for this selection,\n// which is a value that can be mapped without having access to a\n// current document, and later resolved to a real selection for a\n// given document again. (This is used mostly by the history to\n// track and restore old selections.) The default implementation of\n// this method just converts the selection to a text selection and\n// returns the bookmark for that.\nSelection.prototype.getBookmark = function getBookmark () {\n return TextSelection.between(this.$anchor, this.$head).getBookmark()\n};\n\nObject.defineProperties( Selection.prototype, prototypeAccessors );\n\n// :: bool\n// Controls whether, when a selection of this type is active in the\n// browser, the selected range should be visible to the user. Defaults\n// to `true`.\nSelection.prototype.visible = true;\n\n// SelectionBookmark:: interface\n// A lightweight, document-independent representation of a selection.\n// You can define a custom bookmark type for a custom selection class\n// to make the history handle it well.\n//\n// map:: (mapping: Mapping) → SelectionBookmark\n// Map the bookmark through a set of changes.\n//\n// resolve:: (doc: Node) → Selection\n// Resolve the bookmark to a real selection again. This may need to\n// do some error checking and may fall back to a default (usually\n// [`TextSelection.between`](#state.TextSelection^between)) if\n// mapping made the bookmark invalid.\n\n// ::- Represents a selected range in a document.\nvar SelectionRange = function SelectionRange($from, $to) {\n // :: ResolvedPos\n // The lower bound of the range.\n this.$from = $from;\n // :: ResolvedPos\n // The upper bound of the range.\n this.$to = $to;\n};\n\n// ::- A text selection represents a classical editor selection, with\n// a head (the moving side) and anchor (immobile side), both of which\n// point into textblock nodes. It can be empty (a regular cursor\n// position).\nvar TextSelection = /*@__PURE__*/(function (Selection) {\n function TextSelection($anchor, $head) {\n if ( $head === void 0 ) $head = $anchor;\n\n Selection.call(this, $anchor, $head);\n }\n\n if ( Selection ) TextSelection.__proto__ = Selection;\n TextSelection.prototype = Object.create( Selection && Selection.prototype );\n TextSelection.prototype.constructor = TextSelection;\n\n var prototypeAccessors$1 = { $cursor: { configurable: true } };\n\n // :: ?ResolvedPos\n // Returns a resolved position if this is a cursor selection (an\n // empty text selection), and null otherwise.\n prototypeAccessors$1.$cursor.get = function () { return this.$anchor.pos == this.$head.pos ? this.$head : null };\n\n TextSelection.prototype.map = function map (doc, mapping) {\n var $head = doc.resolve(mapping.map(this.head));\n if (!$head.parent.inlineContent) { return Selection.near($head) }\n var $anchor = doc.resolve(mapping.map(this.anchor));\n return new TextSelection($anchor.parent.inlineContent ? $anchor : $head, $head)\n };\n\n TextSelection.prototype.replace = function replace (tr, content) {\n if ( content === void 0 ) content = Slice.empty;\n\n Selection.prototype.replace.call(this, tr, content);\n if (content == Slice.empty) {\n var marks = this.$from.marksAcross(this.$to);\n if (marks) { tr.ensureMarks(marks); }\n }\n };\n\n TextSelection.prototype.eq = function eq (other) {\n return other instanceof TextSelection && other.anchor == this.anchor && other.head == this.head\n };\n\n TextSelection.prototype.getBookmark = function getBookmark () {\n return new TextBookmark(this.anchor, this.head)\n };\n\n TextSelection.prototype.toJSON = function toJSON () {\n return {type: \"text\", anchor: this.anchor, head: this.head}\n };\n\n TextSelection.fromJSON = function fromJSON (doc, json) {\n if (typeof json.anchor != \"number\" || typeof json.head != \"number\")\n { throw new RangeError(\"Invalid input for TextSelection.fromJSON\") }\n return new TextSelection(doc.resolve(json.anchor), doc.resolve(json.head))\n };\n\n // :: (Node, number, ?number) → TextSelection\n // Create a text selection from non-resolved positions.\n TextSelection.create = function create (doc, anchor, head) {\n if ( head === void 0 ) head = anchor;\n\n var $anchor = doc.resolve(anchor);\n return new this($anchor, head == anchor ? $anchor : doc.resolve(head))\n };\n\n // :: (ResolvedPos, ResolvedPos, ?number) → Selection\n // Return a text selection that spans the given positions or, if\n // they aren't text positions, find a text selection near them.\n // `bias` determines whether the method searches forward (default)\n // or backwards (negative number) first. Will fall back to calling\n // [`Selection.near`](#state.Selection^near) when the document\n // doesn't contain a valid text position.\n TextSelection.between = function between ($anchor, $head, bias) {\n var dPos = $anchor.pos - $head.pos;\n if (!bias || dPos) { bias = dPos >= 0 ? 1 : -1; }\n if (!$head.parent.inlineContent) {\n var found = Selection.findFrom($head, bias, true) || Selection.findFrom($head, -bias, true);\n if (found) { $head = found.$head; }\n else { return Selection.near($head, bias) }\n }\n if (!$anchor.parent.inlineContent) {\n if (dPos == 0) {\n $anchor = $head;\n } else {\n $anchor = (Selection.findFrom($anchor, -bias, true) || Selection.findFrom($anchor, bias, true)).$anchor;\n if (($anchor.pos < $head.pos) != (dPos < 0)) { $anchor = $head; }\n }\n }\n return new TextSelection($anchor, $head)\n };\n\n Object.defineProperties( TextSelection.prototype, prototypeAccessors$1 );\n\n return TextSelection;\n}(Selection));\n\nSelection.jsonID(\"text\", TextSelection);\n\nvar TextBookmark = function TextBookmark(anchor, head) {\n this.anchor = anchor;\n this.head = head;\n};\nTextBookmark.prototype.map = function map (mapping) {\n return new TextBookmark(mapping.map(this.anchor), mapping.map(this.head))\n};\nTextBookmark.prototype.resolve = function resolve (doc) {\n return TextSelection.between(doc.resolve(this.anchor), doc.resolve(this.head))\n};\n\n// ::- A node selection is a selection that points at a single node.\n// All nodes marked [selectable](#model.NodeSpec.selectable) can be\n// the target of a node selection. In such a selection, `from` and\n// `to` point directly before and after the selected node, `anchor`\n// equals `from`, and `head` equals `to`..\nvar NodeSelection = /*@__PURE__*/(function (Selection) {\n function NodeSelection($pos) {\n var node = $pos.nodeAfter;\n var $end = $pos.node(0).resolve($pos.pos + node.nodeSize);\n Selection.call(this, $pos, $end);\n // :: Node The selected node.\n this.node = node;\n }\n\n if ( Selection ) NodeSelection.__proto__ = Selection;\n NodeSelection.prototype = Object.create( Selection && Selection.prototype );\n NodeSelection.prototype.constructor = NodeSelection;\n\n NodeSelection.prototype.map = function map (doc, mapping) {\n var ref = mapping.mapResult(this.anchor);\n var deleted = ref.deleted;\n var pos = ref.pos;\n var $pos = doc.resolve(pos);\n if (deleted) { return Selection.near($pos) }\n return new NodeSelection($pos)\n };\n\n NodeSelection.prototype.content = function content () {\n return new Slice(Fragment.from(this.node), 0, 0)\n };\n\n NodeSelection.prototype.eq = function eq (other) {\n return other instanceof NodeSelection && other.anchor == this.anchor\n };\n\n NodeSelection.prototype.toJSON = function toJSON () {\n return {type: \"node\", anchor: this.anchor}\n };\n\n NodeSelection.prototype.getBookmark = function getBookmark () { return new NodeBookmark(this.anchor) };\n\n NodeSelection.fromJSON = function fromJSON (doc, json) {\n if (typeof json.anchor != \"number\")\n { throw new RangeError(\"Invalid input for NodeSelection.fromJSON\") }\n return new NodeSelection(doc.resolve(json.anchor))\n };\n\n // :: (Node, number) → NodeSelection\n // Create a node selection from non-resolved positions.\n NodeSelection.create = function create (doc, from) {\n return new this(doc.resolve(from))\n };\n\n // :: (Node) → bool\n // Determines whether the given node may be selected as a node\n // selection.\n NodeSelection.isSelectable = function isSelectable (node) {\n return !node.isText && node.type.spec.selectable !== false\n };\n\n return NodeSelection;\n}(Selection));\n\nNodeSelection.prototype.visible = false;\n\nSelection.jsonID(\"node\", NodeSelection);\n\nvar NodeBookmark = function NodeBookmark(anchor) {\n this.anchor = anchor;\n};\nNodeBookmark.prototype.map = function map (mapping) {\n var ref = mapping.mapResult(this.anchor);\n var deleted = ref.deleted;\n var pos = ref.pos;\n return deleted ? new TextBookmark(pos, pos) : new NodeBookmark(pos)\n};\nNodeBookmark.prototype.resolve = function resolve (doc) {\n var $pos = doc.resolve(this.anchor), node = $pos.nodeAfter;\n if (node && NodeSelection.isSelectable(node)) { return new NodeSelection($pos) }\n return Selection.near($pos)\n};\n\n// ::- A selection type that represents selecting the whole document\n// (which can not necessarily be expressed with a text selection, when\n// there are for example leaf block nodes at the start or end of the\n// document).\nvar AllSelection = /*@__PURE__*/(function (Selection) {\n function AllSelection(doc) {\n Selection.call(this, doc.resolve(0), doc.resolve(doc.content.size));\n }\n\n if ( Selection ) AllSelection.__proto__ = Selection;\n AllSelection.prototype = Object.create( Selection && Selection.prototype );\n AllSelection.prototype.constructor = AllSelection;\n\n AllSelection.prototype.replace = function replace (tr, content) {\n if ( content === void 0 ) content = Slice.empty;\n\n if (content == Slice.empty) {\n tr.delete(0, tr.doc.content.size);\n var sel = Selection.atStart(tr.doc);\n if (!sel.eq(tr.selection)) { tr.setSelection(sel); }\n } else {\n Selection.prototype.replace.call(this, tr, content);\n }\n };\n\n AllSelection.prototype.toJSON = function toJSON () { return {type: \"all\"} };\n\n AllSelection.fromJSON = function fromJSON (doc) { return new AllSelection(doc) };\n\n AllSelection.prototype.map = function map (doc) { return new AllSelection(doc) };\n\n AllSelection.prototype.eq = function eq (other) { return other instanceof AllSelection };\n\n AllSelection.prototype.getBookmark = function getBookmark () { return AllBookmark };\n\n return AllSelection;\n}(Selection));\n\nSelection.jsonID(\"all\", AllSelection);\n\nvar AllBookmark = {\n map: function map() { return this },\n resolve: function resolve(doc) { return new AllSelection(doc) }\n};\n\n// FIXME we'll need some awareness of text direction when scanning for selections\n\n// Try to find a selection inside the given node. `pos` points at the\n// position where the search starts. When `text` is true, only return\n// text selections.\nfunction findSelectionIn(doc, node, pos, index, dir, text) {\n if (node.inlineContent) { return TextSelection.create(doc, pos) }\n for (var i = index - (dir > 0 ? 0 : 1); dir > 0 ? i < node.childCount : i >= 0; i += dir) {\n var child = node.child(i);\n if (!child.isAtom) {\n var inner = findSelectionIn(doc, child, pos + dir, dir < 0 ? child.childCount : 0, dir, text);\n if (inner) { return inner }\n } else if (!text && NodeSelection.isSelectable(child)) {\n return NodeSelection.create(doc, pos - (dir < 0 ? child.nodeSize : 0))\n }\n pos += child.nodeSize * dir;\n }\n}\n\nfunction selectionToInsertionEnd(tr, startLen, bias) {\n var last = tr.steps.length - 1;\n if (last < startLen) { return }\n var step = tr.steps[last];\n if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) { return }\n var map = tr.mapping.maps[last], end;\n map.forEach(function (_from, _to, _newFrom, newTo) { if (end == null) { end = newTo; } });\n tr.setSelection(Selection.near(tr.doc.resolve(end), bias));\n}\n\nvar UPDATED_SEL = 1, UPDATED_MARKS = 2, UPDATED_SCROLL = 4;\n\n// ::- An editor state transaction, which can be applied to a state to\n// create an updated state. Use\n// [`EditorState.tr`](#state.EditorState.tr) to create an instance.\n//\n// Transactions track changes to the document (they are a subclass of\n// [`Transform`](#transform.Transform)), but also other state changes,\n// like selection updates and adjustments of the set of [stored\n// marks](#state.EditorState.storedMarks). In addition, you can store\n// metadata properties in a transaction, which are extra pieces of\n// information that client code or plugins can use to describe what a\n// transacion represents, so that they can update their [own\n// state](#state.StateField) accordingly.\n//\n// The [editor view](#view.EditorView) uses a few metadata properties:\n// it will attach a property `\"pointer\"` with the value `true` to\n// selection transactions directly caused by mouse or touch input, and\n// a `\"uiEvent\"` property of that may be `\"paste\"`, `\"cut\"`, or `\"drop\"`.\nvar Transaction = /*@__PURE__*/(function (Transform) {\n function Transaction(state) {\n Transform.call(this, state.doc);\n // :: number\n // The timestamp associated with this transaction, in the same\n // format as `Date.now()`.\n this.time = Date.now();\n this.curSelection = state.selection;\n // The step count for which the current selection is valid.\n this.curSelectionFor = 0;\n // :: ?[Mark]\n // The stored marks set by this transaction, if any.\n this.storedMarks = state.storedMarks;\n // Bitfield to track which aspects of the state were updated by\n // this transaction.\n this.updated = 0;\n // Object used to store metadata properties for the transaction.\n this.meta = Object.create(null);\n }\n\n if ( Transform ) Transaction.__proto__ = Transform;\n Transaction.prototype = Object.create( Transform && Transform.prototype );\n Transaction.prototype.constructor = Transaction;\n\n var prototypeAccessors = { selection: { configurable: true },selectionSet: { configurable: true },storedMarksSet: { configurable: true },isGeneric: { configurable: true },scrolledIntoView: { configurable: true } };\n\n // :: Selection\n // The transaction's current selection. This defaults to the editor\n // selection [mapped](#state.Selection.map) through the steps in the\n // transaction, but can be overwritten with\n // [`setSelection`](#state.Transaction.setSelection).\n prototypeAccessors.selection.get = function () {\n if (this.curSelectionFor < this.steps.length) {\n this.curSelection = this.curSelection.map(this.doc, this.mapping.slice(this.curSelectionFor));\n this.curSelectionFor = this.steps.length;\n }\n return this.curSelection\n };\n\n // :: (Selection) → Transaction\n // Update the transaction's current selection. Will determine the\n // selection that the editor gets when the transaction is applied.\n Transaction.prototype.setSelection = function setSelection (selection) {\n if (selection.$from.doc != this.doc)\n { throw new RangeError(\"Selection passed to setSelection must point at the current document\") }\n this.curSelection = selection;\n this.curSelectionFor = this.steps.length;\n this.updated = (this.updated | UPDATED_SEL) & ~UPDATED_MARKS;\n this.storedMarks = null;\n return this\n };\n\n // :: bool\n // Whether the selection was explicitly updated by this transaction.\n prototypeAccessors.selectionSet.get = function () {\n return (this.updated & UPDATED_SEL) > 0\n };\n\n // :: (?[Mark]) → Transaction\n // Set the current stored marks.\n Transaction.prototype.setStoredMarks = function setStoredMarks (marks) {\n this.storedMarks = marks;\n this.updated |= UPDATED_MARKS;\n return this\n };\n\n // :: ([Mark]) → Transaction\n // Make sure the current stored marks or, if that is null, the marks\n // at the selection, match the given set of marks. Does nothing if\n // this is already the case.\n Transaction.prototype.ensureMarks = function ensureMarks (marks) {\n if (!Mark.sameSet(this.storedMarks || this.selection.$from.marks(), marks))\n { this.setStoredMarks(marks); }\n return this\n };\n\n // :: (Mark) → Transaction\n // Add a mark to the set of stored marks.\n Transaction.prototype.addStoredMark = function addStoredMark (mark) {\n return this.ensureMarks(mark.addToSet(this.storedMarks || this.selection.$head.marks()))\n };\n\n // :: (union) → Transaction\n // Remove a mark or mark type from the set of stored marks.\n Transaction.prototype.removeStoredMark = function removeStoredMark (mark) {\n return this.ensureMarks(mark.removeFromSet(this.storedMarks || this.selection.$head.marks()))\n };\n\n // :: bool\n // Whether the stored marks were explicitly set for this transaction.\n prototypeAccessors.storedMarksSet.get = function () {\n return (this.updated & UPDATED_MARKS) > 0\n };\n\n Transaction.prototype.addStep = function addStep (step, doc) {\n Transform.prototype.addStep.call(this, step, doc);\n this.updated = this.updated & ~UPDATED_MARKS;\n this.storedMarks = null;\n };\n\n // :: (number) → Transaction\n // Update the timestamp for the transaction.\n Transaction.prototype.setTime = function setTime (time) {\n this.time = time;\n return this\n };\n\n // :: (Slice) → Transaction\n // Replace the current selection with the given slice.\n Transaction.prototype.replaceSelection = function replaceSelection (slice) {\n this.selection.replace(this, slice);\n return this\n };\n\n // :: (Node, ?bool) → Transaction\n // Replace the selection with the given node. When `inheritMarks` is\n // true and the content is inline, it inherits the marks from the\n // place where it is inserted.\n Transaction.prototype.replaceSelectionWith = function replaceSelectionWith (node, inheritMarks) {\n var selection = this.selection;\n if (inheritMarks !== false)\n { node = node.mark(this.storedMarks || (selection.empty ? selection.$from.marks() : (selection.$from.marksAcross(selection.$to) || Mark.none))); }\n selection.replaceWith(this, node);\n return this\n };\n\n // :: () → Transaction\n // Delete the selection.\n Transaction.prototype.deleteSelection = function deleteSelection () {\n this.selection.replace(this);\n return this\n };\n\n // :: (string, from: ?number, to: ?number) → Transaction\n // Replace the given range, or the selection if no range is given,\n // with a text node containing the given string.\n Transaction.prototype.insertText = function insertText (text, from, to) {\n if ( to === void 0 ) to = from;\n\n var schema = this.doc.type.schema;\n if (from == null) {\n if (!text) { return this.deleteSelection() }\n return this.replaceSelectionWith(schema.text(text), true)\n } else {\n if (!text) { return this.deleteRange(from, to) }\n var marks = this.storedMarks;\n if (!marks) {\n var $from = this.doc.resolve(from);\n marks = to == from ? $from.marks() : $from.marksAcross(this.doc.resolve(to));\n }\n this.replaceRangeWith(from, to, schema.text(text, marks));\n if (!this.selection.empty) { this.setSelection(Selection.near(this.selection.$to)); }\n return this\n }\n };\n\n // :: (union, any) → Transaction\n // Store a metadata property in this transaction, keyed either by\n // name or by plugin.\n Transaction.prototype.setMeta = function setMeta (key, value) {\n this.meta[typeof key == \"string\" ? key : key.key] = value;\n return this\n };\n\n // :: (union) → any\n // Retrieve a metadata property for a given name or plugin.\n Transaction.prototype.getMeta = function getMeta (key) {\n return this.meta[typeof key == \"string\" ? key : key.key]\n };\n\n // :: bool\n // Returns true if this transaction doesn't contain any metadata,\n // and can thus safely be extended.\n prototypeAccessors.isGeneric.get = function () {\n for (var _ in this.meta) { return false }\n return true\n };\n\n // :: () → Transaction\n // Indicate that the editor should scroll the selection into view\n // when updated to the state produced by this transaction.\n Transaction.prototype.scrollIntoView = function scrollIntoView () {\n this.updated |= UPDATED_SCROLL;\n return this\n };\n\n prototypeAccessors.scrolledIntoView.get = function () {\n return (this.updated & UPDATED_SCROLL) > 0\n };\n\n Object.defineProperties( Transaction.prototype, prototypeAccessors );\n\n return Transaction;\n}(Transform));\n\nfunction bind(f, self) {\n return !self || !f ? f : f.bind(self)\n}\n\nvar FieldDesc = function FieldDesc(name, desc, self) {\n this.name = name;\n this.init = bind(desc.init, self);\n this.apply = bind(desc.apply, self);\n};\n\nvar baseFields = [\n new FieldDesc(\"doc\", {\n init: function init(config) { return config.doc || config.schema.topNodeType.createAndFill() },\n apply: function apply(tr) { return tr.doc }\n }),\n\n new FieldDesc(\"selection\", {\n init: function init(config, instance) { return config.selection || Selection.atStart(instance.doc) },\n apply: function apply(tr) { return tr.selection }\n }),\n\n new FieldDesc(\"storedMarks\", {\n init: function init(config) { return config.storedMarks || null },\n apply: function apply(tr, _marks, _old, state) { return state.selection.$cursor ? tr.storedMarks : null }\n }),\n\n new FieldDesc(\"scrollToSelection\", {\n init: function init() { return 0 },\n apply: function apply(tr, prev) { return tr.scrolledIntoView ? prev + 1 : prev }\n })\n];\n\n// Object wrapping the part of a state object that stays the same\n// across transactions. Stored in the state's `config` property.\nvar Configuration = function Configuration(schema, plugins) {\n var this$1 = this;\n\n this.schema = schema;\n this.fields = baseFields.concat();\n this.plugins = [];\n this.pluginsByKey = Object.create(null);\n if (plugins) { plugins.forEach(function (plugin) {\n if (this$1.pluginsByKey[plugin.key])\n { throw new RangeError(\"Adding different instances of a keyed plugin (\" + plugin.key + \")\") }\n this$1.plugins.push(plugin);\n this$1.pluginsByKey[plugin.key] = plugin;\n if (plugin.spec.state)\n { this$1.fields.push(new FieldDesc(plugin.key, plugin.spec.state, plugin)); }\n }); }\n};\n\n// ::- The state of a ProseMirror editor is represented by an object\n// of this type. A state is a persistent data structure—it isn't\n// updated, but rather a new state value is computed from an old one\n// using the [`apply`](#state.EditorState.apply) method.\n//\n// A state holds a number of built-in fields, and plugins can\n// [define](#state.PluginSpec.state) additional fields.\nvar EditorState = function EditorState(config) {\n this.config = config;\n};\n\nvar prototypeAccessors$1 = { schema: { configurable: true },plugins: { configurable: true },tr: { configurable: true } };\n\n// doc:: Node\n// The current document.\n\n// selection:: Selection\n// The selection.\n\n// storedMarks:: ?[Mark]\n// A set of marks to apply to the next input. Will be null when\n// no explicit marks have been set.\n\n// :: Schema\n// The schema of the state's document.\nprototypeAccessors$1.schema.get = function () {\n return this.config.schema\n};\n\n// :: [Plugin]\n// The plugins that are active in this state.\nprototypeAccessors$1.plugins.get = function () {\n return this.config.plugins\n};\n\n// :: (Transaction) → EditorState\n// Apply the given transaction to produce a new state.\nEditorState.prototype.apply = function apply (tr) {\n return this.applyTransaction(tr).state\n};\n\n// : (Transaction) → bool\nEditorState.prototype.filterTransaction = function filterTransaction (tr, ignore) {\n if ( ignore === void 0 ) ignore = -1;\n\n for (var i = 0; i < this.config.plugins.length; i++) { if (i != ignore) {\n var plugin = this.config.plugins[i];\n if (plugin.spec.filterTransaction && !plugin.spec.filterTransaction.call(plugin, tr, this))\n { return false }\n } }\n return true\n};\n\n// :: (Transaction) → {state: EditorState, transactions: [Transaction]}\n// Verbose variant of [`apply`](#state.EditorState.apply) that\n// returns the precise transactions that were applied (which might\n// be influenced by the [transaction\n// hooks](#state.PluginSpec.filterTransaction) of\n// plugins) along with the new state.\nEditorState.prototype.applyTransaction = function applyTransaction (rootTr) {\n if (!this.filterTransaction(rootTr)) { return {state: this, transactions: []} }\n\n var trs = [rootTr], newState = this.applyInner(rootTr), seen = null;\n // This loop repeatedly gives plugins a chance to respond to\n // transactions as new transactions are added, making sure to only\n // pass the transactions the plugin did not see before.\n for (;;) {\n var haveNew = false;\n for (var i = 0; i < this.config.plugins.length; i++) {\n var plugin = this.config.plugins[i];\n if (plugin.spec.appendTransaction) {\n var n = seen ? seen[i].n : 0, oldState = seen ? seen[i].state : this;\n var tr = n < trs.length &&\n plugin.spec.appendTransaction.call(plugin, n ? trs.slice(n) : trs, oldState, newState);\n if (tr && newState.filterTransaction(tr, i)) {\n tr.setMeta(\"appendedTransaction\", rootTr);\n if (!seen) {\n seen = [];\n for (var j = 0; j < this.config.plugins.length; j++)\n { seen.push(j < i ? {state: newState, n: trs.length} : {state: this, n: 0}); }\n }\n trs.push(tr);\n newState = newState.applyInner(tr);\n haveNew = true;\n }\n if (seen) { seen[i] = {state: newState, n: trs.length}; }\n }\n }\n if (!haveNew) { return {state: newState, transactions: trs} }\n }\n};\n\n// : (Transaction) → EditorState\nEditorState.prototype.applyInner = function applyInner (tr) {\n if (!tr.before.eq(this.doc)) { throw new RangeError(\"Applying a mismatched transaction\") }\n var newInstance = new EditorState(this.config), fields = this.config.fields;\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n newInstance[field.name] = field.apply(tr, this[field.name], this, newInstance);\n }\n for (var i$1 = 0; i$1 < applyListeners.length; i$1++) { applyListeners[i$1](this, tr, newInstance); }\n return newInstance\n};\n\n// :: Transaction\n// Start a [transaction](#state.Transaction) from this state.\nprototypeAccessors$1.tr.get = function () { return new Transaction(this) };\n\n// :: (Object) → EditorState\n// Create a new state.\n//\n// config::- Configuration options. Must contain `schema` or `doc` (or both).\n//\n// schema:: ?Schema\n// The schema to use (only relevant if no `doc` is specified).\n//\n// doc:: ?Node\n// The starting document.\n//\n// selection:: ?Selection\n// A valid selection in the document.\n//\n// storedMarks:: ?[Mark]\n// The initial set of [stored marks](#state.EditorState.storedMarks).\n//\n// plugins:: ?[Plugin]\n// The plugins that should be active in this state.\nEditorState.create = function create (config) {\n var $config = new Configuration(config.doc ? config.doc.type.schema : config.schema, config.plugins);\n var instance = new EditorState($config);\n for (var i = 0; i < $config.fields.length; i++)\n { instance[$config.fields[i].name] = $config.fields[i].init(config, instance); }\n return instance\n};\n\n// :: (Object) → EditorState\n// Create a new state based on this one, but with an adjusted set of\n// active plugins. State fields that exist in both sets of plugins\n// are kept unchanged. Those that no longer exist are dropped, and\n// those that are new are initialized using their\n// [`init`](#state.StateField.init) method, passing in the new\n// configuration object..\n//\n// config::- configuration options\n//\n// plugins:: [Plugin]\n// New set of active plugins.\nEditorState.prototype.reconfigure = function reconfigure (config) {\n var $config = new Configuration(this.schema, config.plugins);\n var fields = $config.fields, instance = new EditorState($config);\n for (var i = 0; i < fields.length; i++) {\n var name = fields[i].name;\n instance[name] = this.hasOwnProperty(name) ? this[name] : fields[i].init(config, instance);\n }\n return instance\n};\n\n// :: (?union, string, number>) → Object\n// Serialize this state to JSON. If you want to serialize the state\n// of plugins, pass an object mapping property names to use in the\n// resulting JSON object to plugin objects. The argument may also be\n// a string or number, in which case it is ignored, to support the\n// way `JSON.stringify` calls `toString` methods.\nEditorState.prototype.toJSON = function toJSON (pluginFields) {\n var result = {doc: this.doc.toJSON(), selection: this.selection.toJSON()};\n if (this.storedMarks) { result.storedMarks = this.storedMarks.map(function (m) { return m.toJSON(); }); }\n if (pluginFields && typeof pluginFields == 'object') { for (var prop in pluginFields) {\n if (prop == \"doc\" || prop == \"selection\")\n { throw new RangeError(\"The JSON fields `doc` and `selection` are reserved\") }\n var plugin = pluginFields[prop], state = plugin.spec.state;\n if (state && state.toJSON) { result[prop] = state.toJSON.call(plugin, this[plugin.key]); }\n } }\n return result\n};\n\n// :: (Object, Object, ?Object) → EditorState\n// Deserialize a JSON representation of a state. `config` should\n// have at least a `schema` field, and should contain array of\n// plugins to initialize the state with. `pluginFields` can be used\n// to deserialize the state of plugins, by associating plugin\n// instances with the property names they use in the JSON object.\n//\n// config::- configuration options\n//\n// schema:: Schema\n// The schema to use.\n//\n// plugins:: ?[Plugin]\n// The set of active plugins.\nEditorState.fromJSON = function fromJSON (config, json, pluginFields) {\n if (!json) { throw new RangeError(\"Invalid input for EditorState.fromJSON\") }\n if (!config.schema) { throw new RangeError(\"Required config field 'schema' missing\") }\n var $config = new Configuration(config.schema, config.plugins);\n var instance = new EditorState($config);\n $config.fields.forEach(function (field) {\n if (field.name == \"doc\") {\n instance.doc = Node.fromJSON(config.schema, json.doc);\n } else if (field.name == \"selection\") {\n instance.selection = Selection.fromJSON(instance.doc, json.selection);\n } else if (field.name == \"storedMarks\") {\n if (json.storedMarks) { instance.storedMarks = json.storedMarks.map(config.schema.markFromJSON); }\n } else {\n if (pluginFields) { for (var prop in pluginFields) {\n var plugin = pluginFields[prop], state = plugin.spec.state;\n if (plugin.key == field.name && state && state.fromJSON &&\n Object.prototype.hasOwnProperty.call(json, prop)) {\n // This field belongs to a plugin mapped to a JSON field, read it from there.\n instance[field.name] = state.fromJSON.call(plugin, config, json[prop], instance);\n return\n }\n } }\n instance[field.name] = field.init(config, instance);\n }\n });\n return instance\n};\n\n// Kludge to allow the view to track mappings between different\n// instances of a state.\n//\n// FIXME this is no longer needed as of prosemirror-view 1.9.0,\n// though due to backwards-compat we should probably keep it around\n// for a while (if only as a no-op)\nEditorState.addApplyListener = function addApplyListener (f) {\n applyListeners.push(f);\n};\nEditorState.removeApplyListener = function removeApplyListener (f) {\n var found = applyListeners.indexOf(f);\n if (found > -1) { applyListeners.splice(found, 1); }\n};\n\nObject.defineProperties( EditorState.prototype, prototypeAccessors$1 );\n\nvar applyListeners = [];\n\n// PluginSpec:: interface\n//\n// This is the type passed to the [`Plugin`](#state.Plugin)\n// constructor. It provides a definition for a plugin.\n//\n// props:: ?EditorProps\n// The [view props](#view.EditorProps) added by this plugin. Props\n// that are functions will be bound to have the plugin instance as\n// their `this` binding.\n//\n// state:: ?StateField\n// Allows a plugin to define a [state field](#state.StateField), an\n// extra slot in the state object in which it can keep its own data.\n//\n// key:: ?PluginKey\n// Can be used to make this a keyed plugin. You can have only one\n// plugin with a given key in a given state, but it is possible to\n// access the plugin's configuration and state through the key,\n// without having access to the plugin instance object.\n//\n// view:: ?(EditorView) → Object\n// When the plugin needs to interact with the editor view, or\n// set something up in the DOM, use this field. The function\n// will be called when the plugin's state is associated with an\n// editor view.\n//\n// return::-\n// Should return an object with the following optional\n// properties:\n//\n// update:: ?(view: EditorView, prevState: EditorState)\n// Called whenever the view's state is updated.\n//\n// destroy:: ?()\n// Called when the view is destroyed or receives a state\n// with different plugins.\n//\n// filterTransaction:: ?(Transaction, EditorState) → bool\n// When present, this will be called before a transaction is\n// applied by the state, allowing the plugin to cancel it (by\n// returning false).\n//\n// appendTransaction:: ?(transactions: [Transaction], oldState: EditorState, newState: EditorState) → ?Transaction\n// Allows the plugin to append another transaction to be applied\n// after the given array of transactions. When another plugin\n// appends a transaction after this was called, it is called again\n// with the new state and new transactions—but only the new\n// transactions, i.e. it won't be passed transactions that it\n// already saw.\n\nfunction bindProps(obj, self, target) {\n for (var prop in obj) {\n var val = obj[prop];\n if (val instanceof Function) { val = val.bind(self); }\n else if (prop == \"handleDOMEvents\") { val = bindProps(val, self, {}); }\n target[prop] = val;\n }\n return target\n}\n\n// ::- Plugins bundle functionality that can be added to an editor.\n// They are part of the [editor state](#state.EditorState) and\n// may influence that state and the view that contains it.\nvar Plugin = function Plugin(spec) {\n // :: EditorProps\n // The [props](#view.EditorProps) exported by this plugin.\n this.props = {};\n if (spec.props) { bindProps(spec.props, this, this.props); }\n // :: Object\n // The plugin's [spec object](#state.PluginSpec).\n this.spec = spec;\n this.key = spec.key ? spec.key.key : createKey(\"plugin\");\n};\n\n// :: (EditorState) → any\n// Extract the plugin's state field from an editor state.\nPlugin.prototype.getState = function getState (state) { return state[this.key] };\n\n// StateField:: interface\n// A plugin spec may provide a state field (under its\n// [`state`](#state.PluginSpec.state) property) of this type, which\n// describes the state it wants to keep. Functions provided here are\n// always called with the plugin instance as their `this` binding.\n//\n// init:: (config: Object, instance: EditorState) → T\n// Initialize the value of the field. `config` will be the object\n// passed to [`EditorState.create`](#state.EditorState^create). Note\n// that `instance` is a half-initialized state instance, and will\n// not have values for plugin fields initialized after this one.\n//\n// apply:: (tr: Transaction, value: T, oldState: EditorState, newState: EditorState) → T\n// Apply the given transaction to this state field, producing a new\n// field value. Note that the `newState` argument is again a partially\n// constructed state does not yet contain the state from plugins\n// coming after this one.\n//\n// toJSON:: ?(value: T) → *\n// Convert this field to JSON. Optional, can be left off to disable\n// JSON serialization for the field.\n//\n// fromJSON:: ?(config: Object, value: *, state: EditorState) → T\n// Deserialize the JSON representation of this field. Note that the\n// `state` argument is again a half-initialized state.\n\nvar keys = Object.create(null);\n\nfunction createKey(name) {\n if (name in keys) { return name + \"$\" + ++keys[name] }\n keys[name] = 0;\n return name + \"$\"\n}\n\n// ::- A key is used to [tag](#state.PluginSpec.key)\n// plugins in a way that makes it possible to find them, given an\n// editor state. Assigning a key does mean only one plugin of that\n// type can be active in a state.\nvar PluginKey = function PluginKey(name) {\nif ( name === void 0 ) name = \"key\";\n this.key = createKey(name); };\n\n// :: (EditorState) → ?Plugin\n// Get the active plugin with this key, if any, from an editor\n// state.\nPluginKey.prototype.get = function get (state) { return state.config.pluginsByKey[this.key] };\n\n// :: (EditorState) → ?any\n// Get the plugin's state from an editor state.\nPluginKey.prototype.getState = function getState (state) { return state[this.key] };\n\nexport { AllSelection, EditorState, NodeSelection, Plugin, PluginKey, Selection, SelectionRange, TextSelection, Transaction };\n//# sourceMappingURL=index.es.js.map\n","import { liftTarget, canJoin, joinPoint, canSplit, ReplaceAroundStep, findWrapping } from 'prosemirror-transform';\nimport { Fragment, Slice } from 'prosemirror-model';\nimport { NodeSelection, Selection, TextSelection, AllSelection } from 'prosemirror-state';\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Delete the selection, if there is one.\nfunction deleteSelection(state, dispatch) {\n if (state.selection.empty) { return false }\n if (dispatch) { dispatch(state.tr.deleteSelection().scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// If the selection is empty and at the start of a textblock, try to\n// reduce the distance between that block and the one before it—if\n// there's a block directly before it that can be joined, join them.\n// If not, try to move the selected block closer to the next one in\n// the document structure by lifting it out of its parent or moving it\n// into a parent of the previous block. Will use the view for accurate\n// (bidi-aware) start-of-textblock detection if given.\nfunction joinBackward(state, dispatch, view) {\n var ref = state.selection;\n var $cursor = ref.$cursor;\n if (!$cursor || (view ? !view.endOfTextblock(\"backward\", state)\n : $cursor.parentOffset > 0))\n { return false }\n\n var $cut = findCutBefore($cursor);\n\n // If there is no node before this, try to lift\n if (!$cut) {\n var range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null) { return false }\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n }\n\n var before = $cut.nodeBefore;\n // Apply the joining algorithm\n if (!before.type.spec.isolating && deleteBarrier(state, $cut, dispatch))\n { return true }\n\n // If the node below has no content and the node above is\n // selectable, delete the node below and select the one above.\n if ($cursor.parent.content.size == 0 &&\n (textblockAt(before, \"end\") || NodeSelection.isSelectable(before))) {\n if (dispatch) {\n var tr = state.tr.deleteRange($cursor.before(), $cursor.after());\n tr.setSelection(textblockAt(before, \"end\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos, -1)), -1)\n : NodeSelection.create(tr.doc, $cut.pos - before.nodeSize));\n dispatch(tr.scrollIntoView());\n }\n return true\n }\n\n // If the node before is an atom, delete it\n if (before.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch) { dispatch(state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView()); }\n return true\n }\n\n return false\n}\n\nfunction textblockAt(node, side) {\n for (; node; node = (side == \"start\" ? node.firstChild : node.lastChild))\n { if (node.isTextblock) { return true } }\n return false\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// When the selection is empty and at the start of a textblock, select\n// the node before that textblock, if possible. This is intended to be\n// bound to keys like backspace, after\n// [`joinBackward`](#commands.joinBackward) or other deleting\n// commands, as a fall-back behavior when the schema doesn't allow\n// deletion at the selected point.\nfunction selectNodeBackward(state, dispatch, view) {\n var ref = state.selection;\n var $head = ref.$head;\n var empty = ref.empty;\n var $cut = $head;\n if (!empty) { return false }\n\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"backward\", state) : $head.parentOffset > 0) { return false }\n $cut = findCutBefore($head);\n }\n var node = $cut && $cut.nodeBefore;\n if (!node || !NodeSelection.isSelectable(node)) { return false }\n if (dispatch)\n { dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView()); }\n return true\n}\n\nfunction findCutBefore($pos) {\n if (!$pos.parent.type.spec.isolating) { for (var i = $pos.depth - 1; i >= 0; i--) {\n if ($pos.index(i) > 0) { return $pos.doc.resolve($pos.before(i + 1)) }\n if ($pos.node(i).type.spec.isolating) { break }\n } }\n return null\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// If the selection is empty and the cursor is at the end of a\n// textblock, try to reduce or remove the boundary between that block\n// and the one after it, either by joining them or by moving the other\n// block closer to this one in the tree structure. Will use the view\n// for accurate start-of-textblock detection if given.\nfunction joinForward(state, dispatch, view) {\n var ref = state.selection;\n var $cursor = ref.$cursor;\n if (!$cursor || (view ? !view.endOfTextblock(\"forward\", state)\n : $cursor.parentOffset < $cursor.parent.content.size))\n { return false }\n\n var $cut = findCutAfter($cursor);\n\n // If there is no node after this, there's nothing to do\n if (!$cut) { return false }\n\n var after = $cut.nodeAfter;\n // Try the joining algorithm\n if (deleteBarrier(state, $cut, dispatch)) { return true }\n\n // If the node above has no content and the node below is\n // selectable, delete the node above and select the one below.\n if ($cursor.parent.content.size == 0 &&\n (textblockAt(after, \"start\") || NodeSelection.isSelectable(after))) {\n if (dispatch) {\n var tr = state.tr.deleteRange($cursor.before(), $cursor.after());\n tr.setSelection(textblockAt(after, \"start\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos)), 1)\n : NodeSelection.create(tr.doc, tr.mapping.map($cut.pos)));\n dispatch(tr.scrollIntoView());\n }\n return true\n }\n\n // If the next node is an atom, delete it\n if (after.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch) { dispatch(state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView()); }\n return true\n }\n\n return false\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// When the selection is empty and at the end of a textblock, select\n// the node coming after that textblock, if possible. This is intended\n// to be bound to keys like delete, after\n// [`joinForward`](#commands.joinForward) and similar deleting\n// commands, to provide a fall-back behavior when the schema doesn't\n// allow deletion at the selected point.\nfunction selectNodeForward(state, dispatch, view) {\n var ref = state.selection;\n var $head = ref.$head;\n var empty = ref.empty;\n var $cut = $head;\n if (!empty) { return false }\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"forward\", state) : $head.parentOffset < $head.parent.content.size)\n { return false }\n $cut = findCutAfter($head);\n }\n var node = $cut && $cut.nodeAfter;\n if (!node || !NodeSelection.isSelectable(node)) { return false }\n if (dispatch)\n { dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos)).scrollIntoView()); }\n return true\n}\n\nfunction findCutAfter($pos) {\n if (!$pos.parent.type.spec.isolating) { for (var i = $pos.depth - 1; i >= 0; i--) {\n var parent = $pos.node(i);\n if ($pos.index(i) + 1 < parent.childCount) { return $pos.doc.resolve($pos.after(i + 1)) }\n if (parent.type.spec.isolating) { break }\n } }\n return null\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Join the selected block or, if there is a text selection, the\n// closest ancestor block of the selection that can be joined, with\n// the sibling above it.\nfunction joinUp(state, dispatch) {\n var sel = state.selection, nodeSel = sel instanceof NodeSelection, point;\n if (nodeSel) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.from)) { return false }\n point = sel.from;\n } else {\n point = joinPoint(state.doc, sel.from, -1);\n if (point == null) { return false }\n }\n if (dispatch) {\n var tr = state.tr.join(point);\n if (nodeSel) { tr.setSelection(NodeSelection.create(tr.doc, point - state.doc.resolve(point).nodeBefore.nodeSize)); }\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Join the selected block, or the closest ancestor of the selection\n// that can be joined, with the sibling after it.\nfunction joinDown(state, dispatch) {\n var sel = state.selection, point;\n if (sel instanceof NodeSelection) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.to)) { return false }\n point = sel.to;\n } else {\n point = joinPoint(state.doc, sel.to, 1);\n if (point == null) { return false }\n }\n if (dispatch)\n { dispatch(state.tr.join(point).scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Lift the selected block, or the closest ancestor block of the\n// selection that can be lifted, out of its parent node.\nfunction lift(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to), target = range && liftTarget(range);\n if (target == null) { return false }\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// If the selection is in a node whose type has a truthy\n// [`code`](#model.NodeSpec.code) property in its spec, replace the\n// selection with a newline character.\nfunction newlineInCode(state, dispatch) {\n var ref = state.selection;\n var $head = ref.$head;\n var $anchor = ref.$anchor;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) { return false }\n if (dispatch) { dispatch(state.tr.insertText(\"\\n\").scrollIntoView()); }\n return true\n}\n\nfunction defaultBlockAt(match) {\n for (var i = 0; i < match.edgeCount; i++) {\n var ref = match.edge(i);\n var type = ref.type;\n if (type.isTextblock && !type.hasRequiredAttrs()) { return type }\n }\n return null\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// When the selection is in a node with a truthy\n// [`code`](#model.NodeSpec.code) property in its spec, create a\n// default block after the code block, and move the cursor there.\nfunction exitCode(state, dispatch) {\n var ref = state.selection;\n var $head = ref.$head;\n var $anchor = ref.$anchor;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) { return false }\n var above = $head.node(-1), after = $head.indexAfter(-1), type = defaultBlockAt(above.contentMatchAt(after));\n if (!above.canReplaceWith(after, after, type)) { return false }\n if (dispatch) {\n var pos = $head.after(), tr = state.tr.replaceWith(pos, pos, type.createAndFill());\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// If a block node is selected, create an empty paragraph before (if\n// it is its parent's first child) or after it.\nfunction createParagraphNear(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n if ($from.parent.inlineContent || $to.parent.inlineContent) { return false }\n var type = defaultBlockAt($from.parent.contentMatchAt($to.indexAfter()));\n if (!type || !type.isTextblock) { return false }\n if (dispatch) {\n var side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos;\n var tr = state.tr.insert(side, type.createAndFill());\n tr.setSelection(TextSelection.create(tr.doc, side + 1));\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// If the cursor is in an empty textblock that can be lifted, lift the\n// block.\nfunction liftEmptyBlock(state, dispatch) {\n var ref = state.selection;\n var $cursor = ref.$cursor;\n if (!$cursor || $cursor.parent.content.size) { return false }\n if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) {\n var before = $cursor.before();\n if (canSplit(state.doc, before)) {\n if (dispatch) { dispatch(state.tr.split(before).scrollIntoView()); }\n return true\n }\n }\n var range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null) { return false }\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Split the parent block of the selection. If the selection is a text\n// selection, also delete its content.\nfunction splitBlock(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n if (state.selection instanceof NodeSelection && state.selection.node.isBlock) {\n if (!$from.parentOffset || !canSplit(state.doc, $from.pos)) { return false }\n if (dispatch) { dispatch(state.tr.split($from.pos).scrollIntoView()); }\n return true\n }\n\n if (!$from.parent.isBlock) { return false }\n\n if (dispatch) {\n var atEnd = $to.parentOffset == $to.parent.content.size;\n var tr = state.tr;\n if (state.selection instanceof TextSelection) { tr.deleteSelection(); }\n var deflt = $from.depth == 0 ? null : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)));\n var types = atEnd && deflt ? [{type: deflt}] : null;\n var can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types);\n if (!types && !can && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt && [{type: deflt}])) {\n types = [{type: deflt}];\n can = true;\n }\n if (can) {\n tr.split(tr.mapping.map($from.pos), 1, types);\n if (!atEnd && !$from.parentOffset && $from.parent.type != deflt &&\n $from.node(-1).canReplace($from.index(-1), $from.indexAfter(-1), Fragment.from([deflt.create(), $from.parent])))\n { tr.setNodeMarkup(tr.mapping.map($from.before()), deflt); }\n }\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Acts like [`splitBlock`](#commands.splitBlock), but without\n// resetting the set of active marks at the cursor.\nfunction splitBlockKeepMarks(state, dispatch) {\n return splitBlock(state, dispatch && (function (tr) {\n var marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n if (marks) { tr.ensureMarks(marks); }\n dispatch(tr);\n }))\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Move the selection to the node wrapping the current selection, if\n// any. (Will not select the document node.)\nfunction selectParentNode(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var to = ref.to;\n var pos;\n var same = $from.sharedDepth(to);\n if (same == 0) { return false }\n pos = $from.before(same);\n if (dispatch) { dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos))); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Select the whole document.\nfunction selectAll(state, dispatch) {\n if (dispatch) { dispatch(state.tr.setSelection(new AllSelection(state.doc))); }\n return true\n}\n\nfunction joinMaybeClear(state, $pos, dispatch) {\n var before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index();\n if (!before || !after || !before.type.compatibleContent(after.type)) { return false }\n if (!before.content.size && $pos.parent.canReplace(index - 1, index)) {\n if (dispatch) { dispatch(state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView()); }\n return true\n }\n if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || canJoin(state.doc, $pos.pos)))\n { return false }\n if (dispatch)\n { dispatch(state.tr\n .clearIncompatible($pos.pos, before.type, before.contentMatchAt(before.childCount))\n .join($pos.pos)\n .scrollIntoView()); }\n return true\n}\n\nfunction deleteBarrier(state, $cut, dispatch) {\n var before = $cut.nodeBefore, after = $cut.nodeAfter, conn, match;\n if (before.type.spec.isolating || after.type.spec.isolating) { return false }\n if (joinMaybeClear(state, $cut, dispatch)) { return true }\n\n var canDelAfter = $cut.parent.canReplace($cut.index(), $cut.index() + 1);\n if (canDelAfter &&\n (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) &&\n match.matchType(conn[0] || after.type).validEnd) {\n if (dispatch) {\n var end = $cut.pos + after.nodeSize, wrap = Fragment.empty;\n for (var i = conn.length - 1; i >= 0; i--)\n { wrap = Fragment.from(conn[i].create(null, wrap)); }\n wrap = Fragment.from(before.copy(wrap));\n var tr = state.tr.step(new ReplaceAroundStep($cut.pos - 1, end, $cut.pos, end, new Slice(wrap, 1, 0), conn.length, true));\n var joinAt = end + 2 * conn.length;\n if (canJoin(tr.doc, joinAt)) { tr.join(joinAt); }\n dispatch(tr.scrollIntoView());\n }\n return true\n }\n\n var selAfter = Selection.findFrom($cut, 1);\n var range = selAfter && selAfter.$from.blockRange(selAfter.$to), target = range && liftTarget(range);\n if (target != null && target >= $cut.depth) {\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n }\n\n if (canDelAfter && after.isTextblock && textblockAt(before, \"end\")) {\n var at = before, wrap$1 = [];\n for (;;) {\n wrap$1.push(at);\n if (at.isTextblock) { break }\n at = at.lastChild;\n }\n if (at.canReplace(at.childCount, at.childCount, after.content)) {\n if (dispatch) {\n var end$1 = Fragment.empty;\n for (var i$1 = wrap$1.length - 1; i$1 >= 0; i$1--) { end$1 = Fragment.from(wrap$1[i$1].copy(end$1)); }\n var tr$1 = state.tr.step(new ReplaceAroundStep($cut.pos - wrap$1.length, $cut.pos + after.nodeSize,\n $cut.pos + 1, $cut.pos + after.nodeSize - 1,\n new Slice(end$1, wrap$1.length, 0), 0, true));\n dispatch(tr$1.scrollIntoView());\n }\n return true\n }\n }\n\n return false\n}\n\n// Parameterized commands\n\n// :: (NodeType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Wrap the selection in a node of the given type with the given\n// attributes.\nfunction wrapIn(nodeType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to), wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping) { return false }\n if (dispatch) { dispatch(state.tr.wrap(range, wrapping).scrollIntoView()); }\n return true\n }\n}\n\n// :: (NodeType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Returns a command that tries to set the selected textblocks to the\n// given node type with the given attributes.\nfunction setBlockType(nodeType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var from = ref.from;\n var to = ref.to;\n var applicable = false;\n state.doc.nodesBetween(from, to, function (node, pos) {\n if (applicable) { return false }\n if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) { return }\n if (node.type == nodeType) {\n applicable = true;\n } else {\n var $pos = state.doc.resolve(pos), index = $pos.index();\n applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n }\n });\n if (!applicable) { return false }\n if (dispatch) { dispatch(state.tr.setBlockType(from, to, nodeType, attrs).scrollIntoView()); }\n return true\n }\n}\n\nfunction markApplies(doc, ranges, type) {\n var loop = function ( i ) {\n var ref = ranges[i];\n var $from = ref.$from;\n var $to = ref.$to;\n var can = $from.depth == 0 ? doc.type.allowsMarkType(type) : false;\n doc.nodesBetween($from.pos, $to.pos, function (node) {\n if (can) { return false }\n can = node.inlineContent && node.type.allowsMarkType(type);\n });\n if (can) { return { v: true } }\n };\n\n for (var i = 0; i < ranges.length; i++) {\n var returned = loop( i );\n\n if ( returned ) return returned.v;\n }\n return false\n}\n\n// :: (MarkType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Create a command function that toggles the given mark with the\n// given attributes. Will return `false` when the current selection\n// doesn't support that mark. This will remove the mark if any marks\n// of that type exist in the selection, or add it otherwise. If the\n// selection is empty, this applies to the [stored\n// marks](#state.EditorState.storedMarks) instead of a range of the\n// document.\nfunction toggleMark(markType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var empty = ref.empty;\n var $cursor = ref.$cursor;\n var ranges = ref.ranges;\n if ((empty && !$cursor) || !markApplies(state.doc, ranges, markType)) { return false }\n if (dispatch) {\n if ($cursor) {\n if (markType.isInSet(state.storedMarks || $cursor.marks()))\n { dispatch(state.tr.removeStoredMark(markType)); }\n else\n { dispatch(state.tr.addStoredMark(markType.create(attrs))); }\n } else {\n var has = false, tr = state.tr;\n for (var i = 0; !has && i < ranges.length; i++) {\n var ref$1 = ranges[i];\n var $from = ref$1.$from;\n var $to = ref$1.$to;\n has = state.doc.rangeHasMark($from.pos, $to.pos, markType);\n }\n for (var i$1 = 0; i$1 < ranges.length; i$1++) {\n var ref$2 = ranges[i$1];\n var $from$1 = ref$2.$from;\n var $to$1 = ref$2.$to;\n if (has) {\n tr.removeMark($from$1.pos, $to$1.pos, markType);\n } else {\n var from = $from$1.pos, to = $to$1.pos, start = $from$1.nodeAfter, end = $to$1.nodeBefore;\n var spaceStart = start && start.isText ? /^\\s*/.exec(start.text)[0].length : 0;\n var spaceEnd = end && end.isText ? /\\s*$/.exec(end.text)[0].length : 0;\n if (from + spaceStart < to) { from += spaceStart; to -= spaceEnd; }\n tr.addMark(from, to, markType.create(attrs));\n }\n }\n dispatch(tr.scrollIntoView());\n }\n }\n return true\n }\n}\n\nfunction wrapDispatchForJoin(dispatch, isJoinable) {\n return function (tr) {\n if (!tr.isGeneric) { return dispatch(tr) }\n\n var ranges = [];\n for (var i = 0; i < tr.mapping.maps.length; i++) {\n var map = tr.mapping.maps[i];\n for (var j = 0; j < ranges.length; j++)\n { ranges[j] = map.map(ranges[j]); }\n map.forEach(function (_s, _e, from, to) { return ranges.push(from, to); });\n }\n\n // Figure out which joinable points exist inside those ranges,\n // by checking all node boundaries in their parent nodes.\n var joinable = [];\n for (var i$1 = 0; i$1 < ranges.length; i$1 += 2) {\n var from = ranges[i$1], to = ranges[i$1 + 1];\n var $from = tr.doc.resolve(from), depth = $from.sharedDepth(to), parent = $from.node(depth);\n for (var index = $from.indexAfter(depth), pos = $from.after(depth + 1); pos <= to; ++index) {\n var after = parent.maybeChild(index);\n if (!after) { break }\n if (index && joinable.indexOf(pos) == -1) {\n var before = parent.child(index - 1);\n if (before.type == after.type && isJoinable(before, after))\n { joinable.push(pos); }\n }\n pos += after.nodeSize;\n }\n }\n // Join the joinable points\n joinable.sort(function (a, b) { return a - b; });\n for (var i$2 = joinable.length - 1; i$2 >= 0; i$2--) {\n if (canJoin(tr.doc, joinable[i$2])) { tr.join(joinable[i$2]); }\n }\n dispatch(tr);\n }\n}\n\n// :: ((state: EditorState, ?(tr: Transaction)) → bool, union<(before: Node, after: Node) → bool, [string]>) → (state: EditorState, ?(tr: Transaction)) → bool\n// Wrap a command so that, when it produces a transform that causes\n// two joinable nodes to end up next to each other, those are joined.\n// Nodes are considered joinable when they are of the same type and\n// when the `isJoinable` predicate returns true for them or, if an\n// array of strings was passed, if their node type name is in that\n// array.\nfunction autoJoin(command, isJoinable) {\n if (Array.isArray(isJoinable)) {\n var types = isJoinable;\n isJoinable = function (node) { return types.indexOf(node.type.name) > -1; };\n }\n return function (state, dispatch) { return command(state, dispatch && wrapDispatchForJoin(dispatch, isJoinable)); }\n}\n\n// :: (...[(EditorState, ?(tr: Transaction), ?EditorView) → bool]) → (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// Combine a number of command functions into a single function (which\n// calls them one by one until one returns true).\nfunction chainCommands() {\n var commands = [], len = arguments.length;\n while ( len-- ) commands[ len ] = arguments[ len ];\n\n return function(state, dispatch, view) {\n for (var i = 0; i < commands.length; i++)\n { if (commands[i](state, dispatch, view)) { return true } }\n return false\n }\n}\n\nvar backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward);\nvar del = chainCommands(deleteSelection, joinForward, selectNodeForward);\n\n// :: Object\n// A basic keymap containing bindings not specific to any schema.\n// Binds the following keys (when multiple commands are listed, they\n// are chained with [`chainCommands`](#commands.chainCommands)):\n//\n// * **Enter** to `newlineInCode`, `createParagraphNear`, `liftEmptyBlock`, `splitBlock`\n// * **Mod-Enter** to `exitCode`\n// * **Backspace** and **Mod-Backspace** to `deleteSelection`, `joinBackward`, `selectNodeBackward`\n// * **Delete** and **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n// * **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n// * **Mod-a** to `selectAll`\nvar pcBaseKeymap = {\n \"Enter\": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock),\n \"Mod-Enter\": exitCode,\n \"Backspace\": backspace,\n \"Mod-Backspace\": backspace,\n \"Delete\": del,\n \"Mod-Delete\": del,\n \"Mod-a\": selectAll\n};\n\n// :: Object\n// A copy of `pcBaseKeymap` that also binds **Ctrl-h** like Backspace,\n// **Ctrl-d** like Delete, **Alt-Backspace** like Ctrl-Backspace, and\n// **Ctrl-Alt-Backspace**, **Alt-Delete**, and **Alt-d** like\n// Ctrl-Delete.\nvar macBaseKeymap = {\n \"Ctrl-h\": pcBaseKeymap[\"Backspace\"],\n \"Alt-Backspace\": pcBaseKeymap[\"Mod-Backspace\"],\n \"Ctrl-d\": pcBaseKeymap[\"Delete\"],\n \"Ctrl-Alt-Backspace\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-Delete\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-d\": pcBaseKeymap[\"Mod-Delete\"]\n};\nfor (var key in pcBaseKeymap) { macBaseKeymap[key] = pcBaseKeymap[key]; }\n\n// declare global: os, navigator\nvar mac = typeof navigator != \"undefined\" ? /Mac/.test(navigator.platform)\n : typeof os != \"undefined\" ? os.platform() == \"darwin\" : false;\n\n// :: Object\n// Depending on the detected platform, this will hold\n// [`pcBasekeymap`](#commands.pcBaseKeymap) or\n// [`macBaseKeymap`](#commands.macBaseKeymap).\nvar baseKeymap = mac ? macBaseKeymap : pcBaseKeymap;\n\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, setBlockType, splitBlock, splitBlockKeepMarks, toggleMark, wrapIn };\n//# sourceMappingURL=index.es.js.map\n","\n /*!\n * tiptap-commands v1.17.0\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { setBlockType, lift, wrapIn } from 'prosemirror-commands';\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, setBlockType, splitBlock, splitBlockKeepMarks, toggleMark, wrapIn } from 'prosemirror-commands';\nimport { liftListItem, wrapInList } from 'prosemirror-schema-list';\nexport { addListNodes, liftListItem, sinkListItem, splitListItem, wrapInList } from 'prosemirror-schema-list';\nimport { InputRule } from 'prosemirror-inputrules';\nexport { textblockTypeInputRule, wrappingInputRule } from 'prosemirror-inputrules';\nimport { Plugin } from 'prosemirror-state';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { getMarkRange, nodeIsActive, findParentNode } from 'tiptap-utils';\n\nfunction insertText (text = '') {\n return (state, dispatch) => {\n const {\n $from\n } = state.selection;\n const {\n pos\n } = $from.pos;\n dispatch(state.tr.insertText(text, pos));\n return true;\n };\n}\n\nfunction getMarksBetween(start, end, state) {\n let marks = [];\n state.doc.nodesBetween(start, end, (node, pos) => {\n marks = [...marks, ...node.marks.map(mark => ({\n start: pos,\n end: pos + node.nodeSize,\n mark\n }))];\n });\n return marks;\n}\n\nfunction markInputRule (regexp, markType, getAttrs) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {\n tr\n } = state;\n const m = match.length - 1;\n let markEnd = end;\n let markStart = start;\n\n if (match[m]) {\n const matchStart = start + match[0].indexOf(match[m - 1]);\n const matchEnd = matchStart + match[m - 1].length - 1;\n const textStart = matchStart + match[m - 1].lastIndexOf(match[m]);\n const textEnd = textStart + match[m].length;\n const excludedMarks = getMarksBetween(start, end, state).filter(item => {\n const {\n excluded\n } = item.mark.type;\n return excluded.find(type => type.name === markType.name);\n }).filter(item => item.end > matchStart);\n\n if (excludedMarks.length) {\n return false;\n }\n\n if (textEnd < matchEnd) {\n tr.delete(textEnd, matchEnd);\n }\n\n if (textStart > matchStart) {\n tr.delete(matchStart, textStart);\n }\n\n markStart = matchStart;\n markEnd = markStart + match[m].length;\n }\n\n tr.addMark(markStart, markEnd, markType.create(attrs));\n tr.removeStoredMark(markType);\n return tr;\n });\n}\n\nfunction nodeInputRule (regexp, type, getAttrs) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {\n tr\n } = state;\n\n if (match[0]) {\n tr.replaceWith(start - 1, end, type.create(attrs));\n }\n\n return tr;\n });\n}\n\nfunction pasteRule (regexp, type, getAttrs) {\n const handler = fragment => {\n const nodes = [];\n fragment.forEach(child => {\n if (child.isText) {\n const {\n text\n } = child;\n let pos = 0;\n let match;\n\n do {\n match = regexp.exec(text);\n\n if (match) {\n const start = match.index;\n const end = start + match[0].length;\n const attrs = getAttrs instanceof Function ? getAttrs(match[0]) : getAttrs;\n\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n }\n\n nodes.push(child.cut(start, end).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } while (match);\n\n if (pos < text.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content)));\n }\n });\n return Fragment.fromArray(nodes);\n };\n\n return new Plugin({\n props: {\n transformPasted: slice => new Slice(handler(slice.content), slice.openStart, slice.openEnd)\n }\n });\n}\n\nfunction markPasteRule (regexp, type, getAttrs) {\n const handler = (fragment, parent) => {\n const nodes = [];\n fragment.forEach(child => {\n if (child.isText) {\n const {\n text,\n marks\n } = child;\n let pos = 0;\n let match;\n const isLink = !!marks.filter(x => x.type.name === 'link')[0]; // eslint-disable-next-line\n\n while (!isLink && (match = regexp.exec(text)) !== null) {\n if (parent && parent.type.allowsMarkType(type) && match[1]) {\n const start = match.index;\n const end = start + match[0].length;\n const textStart = start + match[0].indexOf(match[1]);\n const textEnd = textStart + match[1].length;\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs; // adding text before markdown to nodes\n\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n } // adding the markdown part to nodes\n\n\n nodes.push(child.cut(textStart, textEnd).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } // adding rest of text to nodes\n\n\n if (pos < text.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content, child)));\n }\n });\n return Fragment.fromArray(nodes);\n };\n\n return new Plugin({\n props: {\n transformPasted: slice => new Slice(handler(slice.content), slice.openStart, slice.openEnd)\n }\n });\n}\n\nfunction removeMark (type) {\n return (state, dispatch) => {\n const {\n tr,\n selection\n } = state;\n let {\n from,\n to\n } = selection;\n const {\n $from,\n empty\n } = selection;\n\n if (empty) {\n const range = getMarkRange($from, type);\n from = range.from;\n to = range.to;\n }\n\n tr.removeMark(from, to, type);\n return dispatch(tr);\n };\n}\n\nfunction replaceText (range = null, type, attrs = {}, fragment = Fragment.empty) {\n return (state, dispatch) => {\n const {\n $from,\n $to\n } = state.selection;\n const index = $from.index();\n const from = range ? range.from : $from.pos;\n const to = range ? range.to : $to.pos;\n\n if (!$from.parent.canReplaceWith(index, index, type)) {\n return false;\n }\n\n if (dispatch) {\n dispatch(state.tr.replaceWith(from, to, type.create(attrs, fragment)));\n }\n\n return true;\n };\n}\n\nfunction setInlineBlockType (type, attrs = {}) {\n return (state, dispatch) => {\n const {\n $from\n } = state.selection;\n const index = $from.index();\n\n if (!$from.parent.canReplaceWith(index, index, type)) {\n return false;\n }\n\n if (dispatch) {\n dispatch(state.tr.replaceSelectionWith(type.create(attrs)));\n }\n\n return true;\n };\n}\n\n// see https://github.com/ProseMirror/prosemirror-transform/blob/main/src/structure.js\n// Since this piece of code was \"borrowed\" from prosemirror, ESLint rules are ignored.\n\n/* eslint-disable max-len, no-plusplus, no-undef, eqeqeq */\n\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n const $pos = doc.resolve(pos);\n const base = $pos.depth - depth;\n const innerType = typesAfter && typesAfter[typesAfter.length - 1] || $pos.parent;\n if (base < 0 || $pos.parent.type.spec.isolating || !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) || !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount))) return false;\n\n for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n const node = $pos.node(d);\n const index = $pos.index(d);\n if (node.type.spec.isolating) return false;\n let rest = node.content.cutByIndex(index, node.childCount);\n const after = typesAfter && typesAfter[i] || node;\n if (after != node) rest = rest.replaceChild(0, after.type.create(after.attrs));\n /* Change starts from here */\n // if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n // return false\n\n if (!node.canReplace(index + 1, node.childCount)) return false;\n /* Change ends here */\n }\n\n const index = $pos.indexAfter(base);\n const baseType = typesAfter && typesAfter[0];\n return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n} // this is a copy of splitListItem\n// see https://github.com/ProseMirror/prosemirror-schema-list/blob/main/src/schema-list.js\n\n\nfunction splitToDefaultListItem(itemType) {\n return function (state, dispatch) {\n const {\n $from,\n $to,\n node\n } = state.selection;\n if (node && node.isBlock || $from.depth < 2 || !$from.sameParent($to)) return false;\n const grandParent = $from.node(-1);\n if (grandParent.type != itemType) return false;\n\n if ($from.parent.content.size == 0) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if ($from.depth == 2 || $from.node(-3).type != itemType || $from.index(-2) != $from.node(-2).childCount - 1) return false;\n\n if (dispatch) {\n let wrap = Fragment.empty;\n const keepItem = $from.index(-1) > 0; // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n\n for (let d = $from.depth - (keepItem ? 1 : 2); d >= $from.depth - 3; d--) wrap = Fragment.from($from.node(d).copy(wrap)); // Add a second list item with an empty default start node\n\n\n wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n const tr = state.tr.replace($from.before(keepItem ? null : -1), $from.after(-3), new Slice(wrap, keepItem ? 3 : 2, 2));\n tr.setSelection(state.selection.constructor.near(tr.doc.resolve($from.pos + (keepItem ? 3 : 2))));\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n }\n\n const nextType = $to.pos == $from.end() ? grandParent.contentMatchAt($from.indexAfter(-1)).defaultType : null;\n const tr = state.tr.delete($from.pos, $to.pos);\n /* Change starts from here */\n // let types = nextType && [null, {type: nextType}]\n\n let types = nextType && [{\n type: itemType\n }, {\n type: nextType\n }];\n if (!types) types = [{\n type: itemType\n }, null];\n /* Change ends here */\n\n if (!canSplit(tr.doc, $from.pos, 2, types)) return false;\n if (dispatch) dispatch(tr.split($from.pos, 2, types).scrollIntoView());\n return true;\n };\n}\n/* eslint-enable max-len, no-plusplus, no-undef, eqeqeq */\n\nfunction toggleBlockType (type, toggletype, attrs = {}) {\n return (state, dispatch, view) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return setBlockType(toggletype)(state, dispatch, view);\n }\n\n return setBlockType(type, attrs)(state, dispatch, view);\n };\n}\n\nfunction isList(node, schema) {\n return node.type === schema.nodes.bullet_list || node.type === schema.nodes.ordered_list || node.type === schema.nodes.todo_list;\n}\n\nfunction toggleList(listType, itemType) {\n return (state, dispatch, view) => {\n const {\n schema,\n selection\n } = state;\n const {\n $from,\n $to\n } = selection;\n const range = $from.blockRange($to);\n\n if (!range) {\n return false;\n }\n\n const parentList = findParentNode(node => isList(node, schema))(selection);\n\n if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n if (parentList.node.type === listType) {\n return liftListItem(itemType)(state, dispatch, view);\n }\n\n if (isList(parentList.node, schema) && listType.validContent(parentList.node.content)) {\n const {\n tr\n } = state;\n tr.setNodeMarkup(parentList.pos, listType);\n\n if (dispatch) {\n dispatch(tr);\n }\n\n return false;\n }\n }\n\n return wrapInList(listType)(state, dispatch, view);\n };\n}\n\nfunction toggleWrap (type, attrs = {}) {\n return (state, dispatch, view) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return lift(state, dispatch);\n }\n\n return wrapIn(type, attrs)(state, dispatch, view);\n };\n}\n\nfunction updateMark (type, attrs) {\n return (state, dispatch) => {\n const {\n tr,\n selection,\n doc\n } = state;\n const {\n ranges,\n empty\n } = selection;\n\n if (empty) {\n const {\n from,\n to\n } = getMarkRange(selection.$from, type);\n\n if (doc.rangeHasMark(from, to, type)) {\n tr.removeMark(from, to, type);\n }\n\n tr.addMark(from, to, type.create(attrs));\n } else {\n ranges.forEach(ref$1 => {\n const {\n $to,\n $from\n } = ref$1;\n\n if (doc.rangeHasMark($from.pos, $to.pos, type)) {\n tr.removeMark($from.pos, $to.pos, type);\n }\n\n tr.addMark($from.pos, $to.pos, type.create(attrs));\n });\n }\n\n return dispatch(tr);\n };\n}\n\nexport { insertText, markInputRule, markPasteRule, nodeInputRule, pasteRule, removeMark, replaceText, setInlineBlockType, splitToDefaultListItem, toggleBlockType, toggleList, toggleWrap, updateMark };\n","import { ReplaceError, Slice, Fragment, MarkType } from 'prosemirror-model';\n\n// Mappable:: interface\n// There are several things that positions can be mapped through.\n// Such objects conform to this interface.\n//\n// map:: (pos: number, assoc: ?number) → number\n// Map a position through this object. When given, `assoc` (should\n// be -1 or 1, defaults to 1) determines with which side the\n// position is associated, which determines in which direction to\n// move when a chunk of content is inserted at the mapped position.\n//\n// mapResult:: (pos: number, assoc: ?number) → MapResult\n// Map a position, and return an object containing additional\n// information about the mapping. The result's `deleted` field tells\n// you whether the position was deleted (completely enclosed in a\n// replaced range) during the mapping. When content on only one side\n// is deleted, the position itself is only considered deleted when\n// `assoc` points in the direction of the deleted content.\n\n// Recovery values encode a range index and an offset. They are\n// represented as numbers, because tons of them will be created when\n// mapping, for example, a large number of decorations. The number's\n// lower 16 bits provide the index, the remaining bits the offset.\n//\n// Note: We intentionally don't use bit shift operators to en- and\n// decode these, since those clip to 32 bits, which we might in rare\n// cases want to overflow. A 64-bit float can represent 48-bit\n// integers precisely.\n\nvar lower16 = 0xffff;\nvar factor16 = Math.pow(2, 16);\n\nfunction makeRecover(index, offset) { return index + offset * factor16 }\nfunction recoverIndex(value) { return value & lower16 }\nfunction recoverOffset(value) { return (value - (value & lower16)) / factor16 }\n\n// ::- An object representing a mapped position with extra\n// information.\nvar MapResult = function MapResult(pos, deleted, recover) {\n if ( deleted === void 0 ) deleted = false;\n if ( recover === void 0 ) recover = null;\n\n // :: number The mapped version of the position.\n this.pos = pos;\n // :: bool Tells you whether the position was deleted, that is,\n // whether the step removed its surroundings from the document.\n this.deleted = deleted;\n this.recover = recover;\n};\n\n// :: class extends Mappable\n// A map describing the deletions and insertions made by a step, which\n// can be used to find the correspondence between positions in the\n// pre-step version of a document and the same position in the\n// post-step version.\nvar StepMap = function StepMap(ranges, inverted) {\n if ( inverted === void 0 ) inverted = false;\n\n this.ranges = ranges;\n this.inverted = inverted;\n};\n\nStepMap.prototype.recover = function recover (value) {\n var diff = 0, index = recoverIndex(value);\n if (!this.inverted) { for (var i = 0; i < index; i++)\n { diff += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1]; } }\n return this.ranges[index * 3] + diff + recoverOffset(value)\n};\n\n// : (number, ?number) → MapResult\nStepMap.prototype.mapResult = function mapResult (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n return this._map(pos, assoc, false) };\n\n// : (number, ?number) → number\nStepMap.prototype.map = function map (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n return this._map(pos, assoc, true) };\n\nStepMap.prototype._map = function _map (pos, assoc, simple) {\n var diff = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (var i = 0; i < this.ranges.length; i += 3) {\n var start = this.ranges[i] - (this.inverted ? diff : 0);\n if (start > pos) { break }\n var oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end = start + oldSize;\n if (pos <= end) {\n var side = !oldSize ? assoc : pos == start ? -1 : pos == end ? 1 : assoc;\n var result = start + diff + (side < 0 ? 0 : newSize);\n if (simple) { return result }\n var recover = pos == (assoc < 0 ? start : end) ? null : makeRecover(i / 3, pos - start);\n return new MapResult(result, assoc < 0 ? pos != start : pos != end, recover)\n }\n diff += newSize - oldSize;\n }\n return simple ? pos + diff : new MapResult(pos + diff)\n};\n\nStepMap.prototype.touches = function touches (pos, recover) {\n var diff = 0, index = recoverIndex(recover);\n var oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (var i = 0; i < this.ranges.length; i += 3) {\n var start = this.ranges[i] - (this.inverted ? diff : 0);\n if (start > pos) { break }\n var oldSize = this.ranges[i + oldIndex], end = start + oldSize;\n if (pos <= end && i == index * 3) { return true }\n diff += this.ranges[i + newIndex] - oldSize;\n }\n return false\n};\n\n// :: ((oldStart: number, oldEnd: number, newStart: number, newEnd: number))\n// Calls the given function on each of the changed ranges included in\n// this map.\nStepMap.prototype.forEach = function forEach (f) {\n var oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (var i = 0, diff = 0; i < this.ranges.length; i += 3) {\n var start = this.ranges[i], oldStart = start - (this.inverted ? diff : 0), newStart = start + (this.inverted ? 0 : diff);\n var oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex];\n f(oldStart, oldStart + oldSize, newStart, newStart + newSize);\n diff += newSize - oldSize;\n }\n};\n\n// :: () → StepMap\n// Create an inverted version of this map. The result can be used to\n// map positions in the post-step document to the pre-step document.\nStepMap.prototype.invert = function invert () {\n return new StepMap(this.ranges, !this.inverted)\n};\n\nStepMap.prototype.toString = function toString () {\n return (this.inverted ? \"-\" : \"\") + JSON.stringify(this.ranges)\n};\n\n// :: (n: number) → StepMap\n// Create a map that moves all positions by offset `n` (which may be\n// negative). This can be useful when applying steps meant for a\n// sub-document to a larger document, or vice-versa.\nStepMap.offset = function offset (n) {\n return n == 0 ? StepMap.empty : new StepMap(n < 0 ? [0, -n, 0] : [0, 0, n])\n};\n\nStepMap.empty = new StepMap([]);\n\n// :: class extends Mappable\n// A mapping represents a pipeline of zero or more [step\n// maps](#transform.StepMap). It has special provisions for losslessly\n// handling mapping positions through a series of steps in which some\n// steps are inverted versions of earlier steps. (This comes up when\n// ‘[rebasing](/docs/guide/#transform.rebasing)’ steps for\n// collaboration or history management.)\nvar Mapping = function Mapping(maps, mirror, from, to) {\n // :: [StepMap]\n // The step maps in this mapping.\n this.maps = maps || [];\n // :: number\n // The starting position in the `maps` array, used when `map` or\n // `mapResult` is called.\n this.from = from || 0;\n // :: number\n // The end position in the `maps` array.\n this.to = to == null ? this.maps.length : to;\n this.mirror = mirror;\n};\n\n// :: (?number, ?number) → Mapping\n// Create a mapping that maps only through a part of this one.\nMapping.prototype.slice = function slice (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.maps.length;\n\n return new Mapping(this.maps, this.mirror, from, to)\n};\n\nMapping.prototype.copy = function copy () {\n return new Mapping(this.maps.slice(), this.mirror && this.mirror.slice(), this.from, this.to)\n};\n\n// :: (StepMap, ?number)\n// Add a step map to the end of this mapping. If `mirrors` is\n// given, it should be the index of the step map that is the mirror\n// image of this one.\nMapping.prototype.appendMap = function appendMap (map, mirrors) {\n this.to = this.maps.push(map);\n if (mirrors != null) { this.setMirror(this.maps.length - 1, mirrors); }\n};\n\n// :: (Mapping)\n// Add all the step maps in a given mapping to this one (preserving\n// mirroring information).\nMapping.prototype.appendMapping = function appendMapping (mapping) {\n for (var i = 0, startSize = this.maps.length; i < mapping.maps.length; i++) {\n var mirr = mapping.getMirror(i);\n this.appendMap(mapping.maps[i], mirr != null && mirr < i ? startSize + mirr : null);\n }\n};\n\n// :: (number) → ?number\n// Finds the offset of the step map that mirrors the map at the\n// given offset, in this mapping (as per the second argument to\n// `appendMap`).\nMapping.prototype.getMirror = function getMirror (n) {\n if (this.mirror) { for (var i = 0; i < this.mirror.length; i++)\n { if (this.mirror[i] == n) { return this.mirror[i + (i % 2 ? -1 : 1)] } } }\n};\n\nMapping.prototype.setMirror = function setMirror (n, m) {\n if (!this.mirror) { this.mirror = []; }\n this.mirror.push(n, m);\n};\n\n// :: (Mapping)\n// Append the inverse of the given mapping to this one.\nMapping.prototype.appendMappingInverted = function appendMappingInverted (mapping) {\n for (var i = mapping.maps.length - 1, totalSize = this.maps.length + mapping.maps.length; i >= 0; i--) {\n var mirr = mapping.getMirror(i);\n this.appendMap(mapping.maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : null);\n }\n};\n\n// :: () → Mapping\n// Create an inverted version of this mapping.\nMapping.prototype.invert = function invert () {\n var inverse = new Mapping;\n inverse.appendMappingInverted(this);\n return inverse\n};\n\n// : (number, ?number) → number\n// Map a position through this mapping.\nMapping.prototype.map = function map (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n\n if (this.mirror) { return this._map(pos, assoc, true) }\n for (var i = this.from; i < this.to; i++)\n { pos = this.maps[i].map(pos, assoc); }\n return pos\n};\n\n// : (number, ?number) → MapResult\n// Map a position through this mapping, returning a mapping\n// result.\nMapping.prototype.mapResult = function mapResult (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n return this._map(pos, assoc, false) };\n\nMapping.prototype._map = function _map (pos, assoc, simple) {\n var deleted = false;\n\n for (var i = this.from; i < this.to; i++) {\n var map = this.maps[i], result = map.mapResult(pos, assoc);\n if (result.recover != null) {\n var corr = this.getMirror(i);\n if (corr != null && corr > i && corr < this.to) {\n i = corr;\n pos = this.maps[corr].recover(result.recover);\n continue\n }\n }\n\n if (result.deleted) { deleted = true; }\n pos = result.pos;\n }\n\n return simple ? pos : new MapResult(pos, deleted)\n};\n\nfunction TransformError(message) {\n var err = Error.call(this, message);\n err.__proto__ = TransformError.prototype;\n return err\n}\n\nTransformError.prototype = Object.create(Error.prototype);\nTransformError.prototype.constructor = TransformError;\nTransformError.prototype.name = \"TransformError\";\n\n// ::- Abstraction to build up and track an array of\n// [steps](#transform.Step) representing a document transformation.\n//\n// Most transforming methods return the `Transform` object itself, so\n// that they can be chained.\nvar Transform = function Transform(doc) {\n // :: Node\n // The current document (the result of applying the steps in the\n // transform).\n this.doc = doc;\n // :: [Step]\n // The steps in this transform.\n this.steps = [];\n // :: [Node]\n // The documents before each of the steps.\n this.docs = [];\n // :: Mapping\n // A mapping with the maps for each of the steps in this transform.\n this.mapping = new Mapping;\n};\n\nvar prototypeAccessors = { before: { configurable: true },docChanged: { configurable: true } };\n\n// :: Node The starting document.\nprototypeAccessors.before.get = function () { return this.docs.length ? this.docs[0] : this.doc };\n\n// :: (step: Step) → this\n// Apply a new step in this transform, saving the result. Throws an\n// error when the step fails.\nTransform.prototype.step = function step (object) {\n var result = this.maybeStep(object);\n if (result.failed) { throw new TransformError(result.failed) }\n return this\n};\n\n// :: (Step) → StepResult\n// Try to apply a step in this transformation, ignoring it if it\n// fails. Returns the step result.\nTransform.prototype.maybeStep = function maybeStep (step) {\n var result = step.apply(this.doc);\n if (!result.failed) { this.addStep(step, result.doc); }\n return result\n};\n\n// :: bool\n// True when the document has been changed (when there are any\n// steps).\nprototypeAccessors.docChanged.get = function () {\n return this.steps.length > 0\n};\n\nTransform.prototype.addStep = function addStep (step, doc) {\n this.docs.push(this.doc);\n this.steps.push(step);\n this.mapping.appendMap(step.getMap());\n this.doc = doc;\n};\n\nObject.defineProperties( Transform.prototype, prototypeAccessors );\n\nfunction mustOverride() { throw new Error(\"Override me\") }\n\nvar stepsByID = Object.create(null);\n\n// ::- A step object represents an atomic change. It generally applies\n// only to the document it was created for, since the positions\n// stored in it will only make sense for that document.\n//\n// New steps are defined by creating classes that extend `Step`,\n// overriding the `apply`, `invert`, `map`, `getMap` and `fromJSON`\n// methods, and registering your class with a unique\n// JSON-serialization identifier using\n// [`Step.jsonID`](#transform.Step^jsonID).\nvar Step = function Step () {};\n\nStep.prototype.apply = function apply (_doc) { return mustOverride() };\n\n// :: () → StepMap\n// Get the step map that represents the changes made by this step,\n// and which can be used to transform between positions in the old\n// and the new document.\nStep.prototype.getMap = function getMap () { return StepMap.empty };\n\n// :: (doc: Node) → Step\n// Create an inverted version of this step. Needs the document as it\n// was before the step as argument.\nStep.prototype.invert = function invert (_doc) { return mustOverride() };\n\n// :: (mapping: Mappable) → ?Step\n// Map this step through a mappable thing, returning either a\n// version of that step with its positions adjusted, or `null` if\n// the step was entirely deleted by the mapping.\nStep.prototype.map = function map (_mapping) { return mustOverride() };\n\n// :: (other: Step) → ?Step\n// Try to merge this step with another one, to be applied directly\n// after it. Returns the merged step when possible, null if the\n// steps can't be merged.\nStep.prototype.merge = function merge (_other) { return null };\n\n// :: () → Object\n// Create a JSON-serializeable representation of this step. When\n// defining this for a custom subclass, make sure the result object\n// includes the step type's [JSON id](#transform.Step^jsonID) under\n// the `stepType` property.\nStep.prototype.toJSON = function toJSON () { return mustOverride() };\n\n// :: (Schema, Object) → Step\n// Deserialize a step from its JSON representation. Will call\n// through to the step class' own implementation of this method.\nStep.fromJSON = function fromJSON (schema, json) {\n if (!json || !json.stepType) { throw new RangeError(\"Invalid input for Step.fromJSON\") }\n var type = stepsByID[json.stepType];\n if (!type) { throw new RangeError((\"No step type \" + (json.stepType) + \" defined\")) }\n return type.fromJSON(schema, json)\n};\n\n// :: (string, constructor)\n// To be able to serialize steps to JSON, each step needs a string\n// ID to attach to its JSON representation. Use this method to\n// register an ID for your step classes. Try to pick something\n// that's unlikely to clash with steps from other modules.\nStep.jsonID = function jsonID (id, stepClass) {\n if (id in stepsByID) { throw new RangeError(\"Duplicate use of step JSON ID \" + id) }\n stepsByID[id] = stepClass;\n stepClass.prototype.jsonID = id;\n return stepClass\n};\n\n// ::- The result of [applying](#transform.Step.apply) a step. Contains either a\n// new document or a failure value.\nvar StepResult = function StepResult(doc, failed) {\n // :: ?Node The transformed document.\n this.doc = doc;\n // :: ?string Text providing information about a failed step.\n this.failed = failed;\n};\n\n// :: (Node) → StepResult\n// Create a successful step result.\nStepResult.ok = function ok (doc) { return new StepResult(doc, null) };\n\n// :: (string) → StepResult\n// Create a failed step result.\nStepResult.fail = function fail (message) { return new StepResult(null, message) };\n\n// :: (Node, number, number, Slice) → StepResult\n// Call [`Node.replace`](#model.Node.replace) with the given\n// arguments. Create a successful result if it succeeds, and a\n// failed one if it throws a `ReplaceError`.\nStepResult.fromReplace = function fromReplace (doc, from, to, slice) {\n try {\n return StepResult.ok(doc.replace(from, to, slice))\n } catch (e) {\n if (e instanceof ReplaceError) { return StepResult.fail(e.message) }\n throw e\n }\n};\n\n// ::- Replace a part of the document with a slice of new content.\nvar ReplaceStep = /*@__PURE__*/(function (Step) {\n function ReplaceStep(from, to, slice, structure) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.slice = slice;\n this.structure = !!structure;\n }\n\n if ( Step ) ReplaceStep.__proto__ = Step;\n ReplaceStep.prototype = Object.create( Step && Step.prototype );\n ReplaceStep.prototype.constructor = ReplaceStep;\n\n ReplaceStep.prototype.apply = function apply (doc) {\n if (this.structure && contentBetween(doc, this.from, this.to))\n { return StepResult.fail(\"Structure replace would overwrite content\") }\n return StepResult.fromReplace(doc, this.from, this.to, this.slice)\n };\n\n ReplaceStep.prototype.getMap = function getMap () {\n return new StepMap([this.from, this.to - this.from, this.slice.size])\n };\n\n ReplaceStep.prototype.invert = function invert (doc) {\n return new ReplaceStep(this.from, this.from + this.slice.size, doc.slice(this.from, this.to))\n };\n\n ReplaceStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted) { return null }\n return new ReplaceStep(from.pos, Math.max(from.pos, to.pos), this.slice)\n };\n\n ReplaceStep.prototype.merge = function merge (other) {\n if (!(other instanceof ReplaceStep) || other.structure != this.structure) { return null }\n\n if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) {\n var slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd);\n return new ReplaceStep(this.from, this.to + (other.to - other.from), slice, this.structure)\n } else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) {\n var slice$1 = this.slice.size + other.slice.size == 0 ? Slice.empty\n : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd);\n return new ReplaceStep(other.from, this.to, slice$1, this.structure)\n } else {\n return null\n }\n };\n\n ReplaceStep.prototype.toJSON = function toJSON () {\n var json = {stepType: \"replace\", from: this.from, to: this.to};\n if (this.slice.size) { json.slice = this.slice.toJSON(); }\n if (this.structure) { json.structure = true; }\n return json\n };\n\n ReplaceStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n { throw new RangeError(\"Invalid input for ReplaceStep.fromJSON\") }\n return new ReplaceStep(json.from, json.to, Slice.fromJSON(schema, json.slice), !!json.structure)\n };\n\n return ReplaceStep;\n}(Step));\n\nStep.jsonID(\"replace\", ReplaceStep);\n\n// ::- Replace a part of the document with a slice of content, but\n// preserve a range of the replaced content by moving it into the\n// slice.\nvar ReplaceAroundStep = /*@__PURE__*/(function (Step) {\n function ReplaceAroundStep(from, to, gapFrom, gapTo, slice, insert, structure) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.gapFrom = gapFrom;\n this.gapTo = gapTo;\n this.slice = slice;\n this.insert = insert;\n this.structure = !!structure;\n }\n\n if ( Step ) ReplaceAroundStep.__proto__ = Step;\n ReplaceAroundStep.prototype = Object.create( Step && Step.prototype );\n ReplaceAroundStep.prototype.constructor = ReplaceAroundStep;\n\n ReplaceAroundStep.prototype.apply = function apply (doc) {\n if (this.structure && (contentBetween(doc, this.from, this.gapFrom) ||\n contentBetween(doc, this.gapTo, this.to)))\n { return StepResult.fail(\"Structure gap-replace would overwrite content\") }\n\n var gap = doc.slice(this.gapFrom, this.gapTo);\n if (gap.openStart || gap.openEnd)\n { return StepResult.fail(\"Gap is not a flat range\") }\n var inserted = this.slice.insertAt(this.insert, gap.content);\n if (!inserted) { return StepResult.fail(\"Content does not fit in gap\") }\n return StepResult.fromReplace(doc, this.from, this.to, inserted)\n };\n\n ReplaceAroundStep.prototype.getMap = function getMap () {\n return new StepMap([this.from, this.gapFrom - this.from, this.insert,\n this.gapTo, this.to - this.gapTo, this.slice.size - this.insert])\n };\n\n ReplaceAroundStep.prototype.invert = function invert (doc) {\n var gap = this.gapTo - this.gapFrom;\n return new ReplaceAroundStep(this.from, this.from + this.slice.size + gap,\n this.from + this.insert, this.from + this.insert + gap,\n doc.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from),\n this.gapFrom - this.from, this.structure)\n };\n\n ReplaceAroundStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n var gapFrom = mapping.map(this.gapFrom, -1), gapTo = mapping.map(this.gapTo, 1);\n if ((from.deleted && to.deleted) || gapFrom < from.pos || gapTo > to.pos) { return null }\n return new ReplaceAroundStep(from.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure)\n };\n\n ReplaceAroundStep.prototype.toJSON = function toJSON () {\n var json = {stepType: \"replaceAround\", from: this.from, to: this.to,\n gapFrom: this.gapFrom, gapTo: this.gapTo, insert: this.insert};\n if (this.slice.size) { json.slice = this.slice.toJSON(); }\n if (this.structure) { json.structure = true; }\n return json\n };\n\n ReplaceAroundStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\" ||\n typeof json.gapFrom != \"number\" || typeof json.gapTo != \"number\" || typeof json.insert != \"number\")\n { throw new RangeError(\"Invalid input for ReplaceAroundStep.fromJSON\") }\n return new ReplaceAroundStep(json.from, json.to, json.gapFrom, json.gapTo,\n Slice.fromJSON(schema, json.slice), json.insert, !!json.structure)\n };\n\n return ReplaceAroundStep;\n}(Step));\n\nStep.jsonID(\"replaceAround\", ReplaceAroundStep);\n\nfunction contentBetween(doc, from, to) {\n var $from = doc.resolve(from), dist = to - from, depth = $from.depth;\n while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) {\n depth--;\n dist--;\n }\n if (dist > 0) {\n var next = $from.node(depth).maybeChild($from.indexAfter(depth));\n while (dist > 0) {\n if (!next || next.isLeaf) { return true }\n next = next.firstChild;\n dist--;\n }\n }\n return false\n}\n\nfunction canCut(node, start, end) {\n return (start == 0 || node.canReplace(start, node.childCount)) &&\n (end == node.childCount || node.canReplace(0, end))\n}\n\n// :: (NodeRange) → ?number\n// Try to find a target depth to which the content in the given range\n// can be lifted. Will not go across\n// [isolating](#model.NodeSpec.isolating) parent nodes.\nfunction liftTarget(range) {\n var parent = range.parent;\n var content = parent.content.cutByIndex(range.startIndex, range.endIndex);\n for (var depth = range.depth;; --depth) {\n var node = range.$from.node(depth);\n var index = range.$from.index(depth), endIndex = range.$to.indexAfter(depth);\n if (depth < range.depth && node.canReplace(index, endIndex, content))\n { return depth }\n if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex)) { break }\n }\n}\n\n// :: (NodeRange, number) → this\n// Split the content in the given range off from its parent, if there\n// is sibling content before or after it, and move it up the tree to\n// the depth specified by `target`. You'll probably want to use\n// [`liftTarget`](#transform.liftTarget) to compute `target`, to make\n// sure the lift is valid.\nTransform.prototype.lift = function(range, target) {\n var $from = range.$from;\n var $to = range.$to;\n var depth = range.depth;\n\n var gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1);\n var start = gapStart, end = gapEnd;\n\n var before = Fragment.empty, openStart = 0;\n for (var d = depth, splitting = false; d > target; d--)\n { if (splitting || $from.index(d) > 0) {\n splitting = true;\n before = Fragment.from($from.node(d).copy(before));\n openStart++;\n } else {\n start--;\n } }\n var after = Fragment.empty, openEnd = 0;\n for (var d$1 = depth, splitting$1 = false; d$1 > target; d$1--)\n { if (splitting$1 || $to.after(d$1 + 1) < $to.end(d$1)) {\n splitting$1 = true;\n after = Fragment.from($to.node(d$1).copy(after));\n openEnd++;\n } else {\n end++;\n } }\n\n return this.step(new ReplaceAroundStep(start, end, gapStart, gapEnd,\n new Slice(before.append(after), openStart, openEnd),\n before.size - openStart, true))\n};\n\n// :: (NodeRange, NodeType, ?Object, ?NodeRange) → ?[{type: NodeType, attrs: ?Object}]\n// Try to find a valid way to wrap the content in the given range in a\n// node of the given type. May introduce extra nodes around and inside\n// the wrapper node, if necessary. Returns null if no valid wrapping\n// could be found. When `innerRange` is given, that range's content is\n// used as the content to fit into the wrapping, instead of the\n// content of `range`.\nfunction findWrapping(range, nodeType, attrs, innerRange) {\n if ( innerRange === void 0 ) innerRange = range;\n\n var around = findWrappingOutside(range, nodeType);\n var inner = around && findWrappingInside(innerRange, nodeType);\n if (!inner) { return null }\n return around.map(withAttrs).concat({type: nodeType, attrs: attrs}).concat(inner.map(withAttrs))\n}\n\nfunction withAttrs(type) { return {type: type, attrs: null} }\n\nfunction findWrappingOutside(range, type) {\n var parent = range.parent;\n var startIndex = range.startIndex;\n var endIndex = range.endIndex;\n var around = parent.contentMatchAt(startIndex).findWrapping(type);\n if (!around) { return null }\n var outer = around.length ? around[0] : type;\n return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null\n}\n\nfunction findWrappingInside(range, type) {\n var parent = range.parent;\n var startIndex = range.startIndex;\n var endIndex = range.endIndex;\n var inner = parent.child(startIndex);\n var inside = type.contentMatch.findWrapping(inner.type);\n if (!inside) { return null }\n var lastType = inside.length ? inside[inside.length - 1] : type;\n var innerMatch = lastType.contentMatch;\n for (var i = startIndex; innerMatch && i < endIndex; i++)\n { innerMatch = innerMatch.matchType(parent.child(i).type); }\n if (!innerMatch || !innerMatch.validEnd) { return null }\n return inside\n}\n\n// :: (NodeRange, [{type: NodeType, attrs: ?Object}]) → this\n// Wrap the given [range](#model.NodeRange) in the given set of wrappers.\n// The wrappers are assumed to be valid in this position, and should\n// probably be computed with [`findWrapping`](#transform.findWrapping).\nTransform.prototype.wrap = function(range, wrappers) {\n var content = Fragment.empty;\n for (var i = wrappers.length - 1; i >= 0; i--)\n { content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content)); }\n\n var start = range.start, end = range.end;\n return this.step(new ReplaceAroundStep(start, end, start, end, new Slice(content, 0, 0), wrappers.length, true))\n};\n\n// :: (number, ?number, NodeType, ?Object) → this\n// Set the type of all textblocks (partly) between `from` and `to` to\n// the given node type with the given attributes.\nTransform.prototype.setBlockType = function(from, to, type, attrs) {\n var this$1 = this;\n if ( to === void 0 ) to = from;\n\n if (!type.isTextblock) { throw new RangeError(\"Type given to setBlockType should be a textblock\") }\n var mapFrom = this.steps.length;\n this.doc.nodesBetween(from, to, function (node, pos) {\n if (node.isTextblock && !node.hasMarkup(type, attrs) && canChangeType(this$1.doc, this$1.mapping.slice(mapFrom).map(pos), type)) {\n // Ensure all markup that isn't allowed in the new node type is cleared\n this$1.clearIncompatible(this$1.mapping.slice(mapFrom).map(pos, 1), type);\n var mapping = this$1.mapping.slice(mapFrom);\n var startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1);\n this$1.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1,\n new Slice(Fragment.from(type.create(attrs, null, node.marks)), 0, 0), 1, true));\n return false\n }\n });\n return this\n};\n\nfunction canChangeType(doc, pos, type) {\n var $pos = doc.resolve(pos), index = $pos.index();\n return $pos.parent.canReplaceWith(index, index + 1, type)\n}\n\n// :: (number, ?NodeType, ?Object, ?[Mark]) → this\n// Change the type, attributes, and/or marks of the node at `pos`.\n// When `type` isn't given, the existing node type is preserved,\nTransform.prototype.setNodeMarkup = function(pos, type, attrs, marks) {\n var node = this.doc.nodeAt(pos);\n if (!node) { throw new RangeError(\"No node at given position\") }\n if (!type) { type = node.type; }\n var newNode = type.create(attrs, null, marks || node.marks);\n if (node.isLeaf)\n { return this.replaceWith(pos, pos + node.nodeSize, newNode) }\n\n if (!type.validContent(node.content))\n { throw new RangeError(\"Invalid content for node type \" + type.name) }\n\n return this.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1,\n new Slice(Fragment.from(newNode), 0, 0), 1, true))\n};\n\n// :: (Node, number, number, ?[?{type: NodeType, attrs: ?Object}]) → bool\n// Check whether splitting at the given position is allowed.\nfunction canSplit(doc, pos, depth, typesAfter) {\n if ( depth === void 0 ) depth = 1;\n\n var $pos = doc.resolve(pos), base = $pos.depth - depth;\n var innerType = (typesAfter && typesAfter[typesAfter.length - 1]) || $pos.parent;\n if (base < 0 || $pos.parent.type.spec.isolating ||\n !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) ||\n !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount)))\n { return false }\n for (var d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n var node = $pos.node(d), index$1 = $pos.index(d);\n if (node.type.spec.isolating) { return false }\n var rest = node.content.cutByIndex(index$1, node.childCount);\n var after = (typesAfter && typesAfter[i]) || node;\n if (after != node) { rest = rest.replaceChild(0, after.type.create(after.attrs)); }\n if (!node.canReplace(index$1 + 1, node.childCount) || !after.type.validContent(rest))\n { return false }\n }\n var index = $pos.indexAfter(base);\n var baseType = typesAfter && typesAfter[0];\n return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type)\n}\n\n// :: (number, ?number, ?[?{type: NodeType, attrs: ?Object}]) → this\n// Split the node at the given position, and optionally, if `depth` is\n// greater than one, any number of nodes above that. By default, the\n// parts split off will inherit the node type of the original node.\n// This can be changed by passing an array of types and attributes to\n// use after the split.\nTransform.prototype.split = function(pos, depth, typesAfter) {\n if ( depth === void 0 ) depth = 1;\n\n var $pos = this.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty;\n for (var d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) {\n before = Fragment.from($pos.node(d).copy(before));\n var typeAfter = typesAfter && typesAfter[i];\n after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after));\n }\n return this.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true))\n};\n\n// :: (Node, number) → bool\n// Test whether the blocks before and after a given position can be\n// joined.\nfunction canJoin(doc, pos) {\n var $pos = doc.resolve(pos), index = $pos.index();\n return joinable($pos.nodeBefore, $pos.nodeAfter) &&\n $pos.parent.canReplace(index, index + 1)\n}\n\nfunction joinable(a, b) {\n return a && b && !a.isLeaf && a.canAppend(b)\n}\n\n// :: (Node, number, ?number) → ?number\n// Find an ancestor of the given position that can be joined to the\n// block before (or after if `dir` is positive). Returns the joinable\n// point, if any.\nfunction joinPoint(doc, pos, dir) {\n if ( dir === void 0 ) dir = -1;\n\n var $pos = doc.resolve(pos);\n for (var d = $pos.depth;; d--) {\n var before = (void 0), after = (void 0), index = $pos.index(d);\n if (d == $pos.depth) {\n before = $pos.nodeBefore;\n after = $pos.nodeAfter;\n } else if (dir > 0) {\n before = $pos.node(d + 1);\n index++;\n after = $pos.node(d).maybeChild(index);\n } else {\n before = $pos.node(d).maybeChild(index - 1);\n after = $pos.node(d + 1);\n }\n if (before && !before.isTextblock && joinable(before, after) &&\n $pos.node(d).canReplace(index, index + 1)) { return pos }\n if (d == 0) { break }\n pos = dir < 0 ? $pos.before(d) : $pos.after(d);\n }\n}\n\n// :: (number, ?number) → this\n// Join the blocks around the given position. If depth is 2, their\n// last and first siblings are also joined, and so on.\nTransform.prototype.join = function(pos, depth) {\n if ( depth === void 0 ) depth = 1;\n\n var step = new ReplaceStep(pos - depth, pos + depth, Slice.empty, true);\n return this.step(step)\n};\n\n// :: (Node, number, NodeType) → ?number\n// Try to find a point where a node of the given type can be inserted\n// near `pos`, by searching up the node hierarchy when `pos` itself\n// isn't a valid place but is at the start or end of a node. Return\n// null if no position was found.\nfunction insertPoint(doc, pos, nodeType) {\n var $pos = doc.resolve(pos);\n if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType)) { return pos }\n\n if ($pos.parentOffset == 0)\n { for (var d = $pos.depth - 1; d >= 0; d--) {\n var index = $pos.index(d);\n if ($pos.node(d).canReplaceWith(index, index, nodeType)) { return $pos.before(d + 1) }\n if (index > 0) { return null }\n } }\n if ($pos.parentOffset == $pos.parent.content.size)\n { for (var d$1 = $pos.depth - 1; d$1 >= 0; d$1--) {\n var index$1 = $pos.indexAfter(d$1);\n if ($pos.node(d$1).canReplaceWith(index$1, index$1, nodeType)) { return $pos.after(d$1 + 1) }\n if (index$1 < $pos.node(d$1).childCount) { return null }\n } }\n}\n\n// :: (Node, number, Slice) → ?number\n// Finds a position at or around the given position where the given\n// slice can be inserted. Will look at parent nodes' nearest boundary\n// and try there, even if the original position wasn't directly at the\n// start or end of that node. Returns null when no position was found.\nfunction dropPoint(doc, pos, slice) {\n var $pos = doc.resolve(pos);\n if (!slice.content.size) { return pos }\n var content = slice.content;\n for (var i = 0; i < slice.openStart; i++) { content = content.firstChild.content; }\n for (var pass = 1; pass <= (slice.openStart == 0 && slice.size ? 2 : 1); pass++) {\n for (var d = $pos.depth; d >= 0; d--) {\n var bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1;\n var insertPos = $pos.index(d) + (bias > 0 ? 1 : 0);\n if (pass == 1\n ? $pos.node(d).canReplace(insertPos, insertPos, content)\n : $pos.node(d).contentMatchAt(insertPos).findWrapping(content.firstChild.type))\n { return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1) }\n }\n }\n return null\n}\n\nfunction mapFragment(fragment, f, parent) {\n var mapped = [];\n for (var i = 0; i < fragment.childCount; i++) {\n var child = fragment.child(i);\n if (child.content.size) { child = child.copy(mapFragment(child.content, f, child)); }\n if (child.isInline) { child = f(child, parent, i); }\n mapped.push(child);\n }\n return Fragment.fromArray(mapped)\n}\n\n// ::- Add a mark to all inline content between two positions.\nvar AddMarkStep = /*@__PURE__*/(function (Step) {\n function AddMarkStep(from, to, mark) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.mark = mark;\n }\n\n if ( Step ) AddMarkStep.__proto__ = Step;\n AddMarkStep.prototype = Object.create( Step && Step.prototype );\n AddMarkStep.prototype.constructor = AddMarkStep;\n\n AddMarkStep.prototype.apply = function apply (doc) {\n var this$1 = this;\n\n var oldSlice = doc.slice(this.from, this.to), $from = doc.resolve(this.from);\n var parent = $from.node($from.sharedDepth(this.to));\n var slice = new Slice(mapFragment(oldSlice.content, function (node, parent) {\n if (!node.isAtom || !parent.type.allowsMarkType(this$1.mark.type)) { return node }\n return node.mark(this$1.mark.addToSet(node.marks))\n }, parent), oldSlice.openStart, oldSlice.openEnd);\n return StepResult.fromReplace(doc, this.from, this.to, slice)\n };\n\n AddMarkStep.prototype.invert = function invert () {\n return new RemoveMarkStep(this.from, this.to, this.mark)\n };\n\n AddMarkStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted || from.pos >= to.pos) { return null }\n return new AddMarkStep(from.pos, to.pos, this.mark)\n };\n\n AddMarkStep.prototype.merge = function merge (other) {\n if (other instanceof AddMarkStep &&\n other.mark.eq(this.mark) &&\n this.from <= other.to && this.to >= other.from)\n { return new AddMarkStep(Math.min(this.from, other.from),\n Math.max(this.to, other.to), this.mark) }\n };\n\n AddMarkStep.prototype.toJSON = function toJSON () {\n return {stepType: \"addMark\", mark: this.mark.toJSON(),\n from: this.from, to: this.to}\n };\n\n AddMarkStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n { throw new RangeError(\"Invalid input for AddMarkStep.fromJSON\") }\n return new AddMarkStep(json.from, json.to, schema.markFromJSON(json.mark))\n };\n\n return AddMarkStep;\n}(Step));\n\nStep.jsonID(\"addMark\", AddMarkStep);\n\n// ::- Remove a mark from all inline content between two positions.\nvar RemoveMarkStep = /*@__PURE__*/(function (Step) {\n function RemoveMarkStep(from, to, mark) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.mark = mark;\n }\n\n if ( Step ) RemoveMarkStep.__proto__ = Step;\n RemoveMarkStep.prototype = Object.create( Step && Step.prototype );\n RemoveMarkStep.prototype.constructor = RemoveMarkStep;\n\n RemoveMarkStep.prototype.apply = function apply (doc) {\n var this$1 = this;\n\n var oldSlice = doc.slice(this.from, this.to);\n var slice = new Slice(mapFragment(oldSlice.content, function (node) {\n return node.mark(this$1.mark.removeFromSet(node.marks))\n }), oldSlice.openStart, oldSlice.openEnd);\n return StepResult.fromReplace(doc, this.from, this.to, slice)\n };\n\n RemoveMarkStep.prototype.invert = function invert () {\n return new AddMarkStep(this.from, this.to, this.mark)\n };\n\n RemoveMarkStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted || from.pos >= to.pos) { return null }\n return new RemoveMarkStep(from.pos, to.pos, this.mark)\n };\n\n RemoveMarkStep.prototype.merge = function merge (other) {\n if (other instanceof RemoveMarkStep &&\n other.mark.eq(this.mark) &&\n this.from <= other.to && this.to >= other.from)\n { return new RemoveMarkStep(Math.min(this.from, other.from),\n Math.max(this.to, other.to), this.mark) }\n };\n\n RemoveMarkStep.prototype.toJSON = function toJSON () {\n return {stepType: \"removeMark\", mark: this.mark.toJSON(),\n from: this.from, to: this.to}\n };\n\n RemoveMarkStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n { throw new RangeError(\"Invalid input for RemoveMarkStep.fromJSON\") }\n return new RemoveMarkStep(json.from, json.to, schema.markFromJSON(json.mark))\n };\n\n return RemoveMarkStep;\n}(Step));\n\nStep.jsonID(\"removeMark\", RemoveMarkStep);\n\n// :: (number, number, Mark) → this\n// Add the given mark to the inline content between `from` and `to`.\nTransform.prototype.addMark = function(from, to, mark) {\n var this$1 = this;\n\n var removed = [], added = [], removing = null, adding = null;\n this.doc.nodesBetween(from, to, function (node, pos, parent) {\n if (!node.isInline) { return }\n var marks = node.marks;\n if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) {\n var start = Math.max(pos, from), end = Math.min(pos + node.nodeSize, to);\n var newSet = mark.addToSet(marks);\n\n for (var i = 0; i < marks.length; i++) {\n if (!marks[i].isInSet(newSet)) {\n if (removing && removing.to == start && removing.mark.eq(marks[i]))\n { removing.to = end; }\n else\n { removed.push(removing = new RemoveMarkStep(start, end, marks[i])); }\n }\n }\n\n if (adding && adding.to == start)\n { adding.to = end; }\n else\n { added.push(adding = new AddMarkStep(start, end, mark)); }\n }\n });\n\n removed.forEach(function (s) { return this$1.step(s); });\n added.forEach(function (s) { return this$1.step(s); });\n return this\n};\n\n// :: (number, number, ?union) → this\n// Remove marks from inline nodes between `from` and `to`. When `mark`\n// is a single mark, remove precisely that mark. When it is a mark type,\n// remove all marks of that type. When it is null, remove all marks of\n// any type.\nTransform.prototype.removeMark = function(from, to, mark) {\n var this$1 = this;\n if ( mark === void 0 ) mark = null;\n\n var matched = [], step = 0;\n this.doc.nodesBetween(from, to, function (node, pos) {\n if (!node.isInline) { return }\n step++;\n var toRemove = null;\n if (mark instanceof MarkType) {\n var set = node.marks, found;\n while (found = mark.isInSet(set)) {\n(toRemove || (toRemove = [])).push(found);\n set = found.removeFromSet(set);\n }\n } else if (mark) {\n if (mark.isInSet(node.marks)) { toRemove = [mark]; }\n } else {\n toRemove = node.marks;\n }\n if (toRemove && toRemove.length) {\n var end = Math.min(pos + node.nodeSize, to);\n for (var i = 0; i < toRemove.length; i++) {\n var style = toRemove[i], found$1 = (void 0);\n for (var j = 0; j < matched.length; j++) {\n var m = matched[j];\n if (m.step == step - 1 && style.eq(matched[j].style)) { found$1 = m; }\n }\n if (found$1) {\n found$1.to = end;\n found$1.step = step;\n } else {\n matched.push({style: style, from: Math.max(pos, from), to: end, step: step});\n }\n }\n }\n });\n matched.forEach(function (m) { return this$1.step(new RemoveMarkStep(m.from, m.to, m.style)); });\n return this\n};\n\n// :: (number, NodeType, ?ContentMatch) → this\n// Removes all marks and nodes from the content of the node at `pos`\n// that don't match the given new parent node type. Accepts an\n// optional starting [content match](#model.ContentMatch) as third\n// argument.\nTransform.prototype.clearIncompatible = function(pos, parentType, match) {\n if ( match === void 0 ) match = parentType.contentMatch;\n\n var node = this.doc.nodeAt(pos);\n var delSteps = [], cur = pos + 1;\n for (var i = 0; i < node.childCount; i++) {\n var child = node.child(i), end = cur + child.nodeSize;\n var allowed = match.matchType(child.type, child.attrs);\n if (!allowed) {\n delSteps.push(new ReplaceStep(cur, end, Slice.empty));\n } else {\n match = allowed;\n for (var j = 0; j < child.marks.length; j++) { if (!parentType.allowsMarkType(child.marks[j].type))\n { this.step(new RemoveMarkStep(cur, end, child.marks[j])); } }\n }\n cur = end;\n }\n if (!match.validEnd) {\n var fill = match.fillBefore(Fragment.empty, true);\n this.replace(cur, cur, new Slice(fill, 0, 0));\n }\n for (var i$1 = delSteps.length - 1; i$1 >= 0; i$1--) { this.step(delSteps[i$1]); }\n return this\n};\n\n// :: (Node, number, ?number, ?Slice) → ?Step\n// ‘Fit’ a slice into a given position in the document, producing a\n// [step](#transform.Step) that inserts it. Will return null if\n// there's no meaningful way to insert the slice here, or inserting it\n// would be a no-op (an empty slice over an empty range).\nfunction replaceStep(doc, from, to, slice) {\n if ( to === void 0 ) to = from;\n if ( slice === void 0 ) slice = Slice.empty;\n\n if (from == to && !slice.size) { return null }\n\n var $from = doc.resolve(from), $to = doc.resolve(to);\n // Optimization -- avoid work if it's obvious that it's not needed.\n if (fitsTrivially($from, $to, slice)) { return new ReplaceStep(from, to, slice) }\n return new Fitter($from, $to, slice).fit()\n}\n\n// :: (number, ?number, ?Slice) → this\n// Replace the part of the document between `from` and `to` with the\n// given `slice`.\nTransform.prototype.replace = function(from, to, slice) {\n if ( to === void 0 ) to = from;\n if ( slice === void 0 ) slice = Slice.empty;\n\n var step = replaceStep(this.doc, from, to, slice);\n if (step) { this.step(step); }\n return this\n};\n\n// :: (number, number, union) → this\n// Replace the given range with the given content, which may be a\n// fragment, node, or array of nodes.\nTransform.prototype.replaceWith = function(from, to, content) {\n return this.replace(from, to, new Slice(Fragment.from(content), 0, 0))\n};\n\n// :: (number, number) → this\n// Delete the content between the given positions.\nTransform.prototype.delete = function(from, to) {\n return this.replace(from, to, Slice.empty)\n};\n\n// :: (number, union) → this\n// Insert the given content at the given position.\nTransform.prototype.insert = function(pos, content) {\n return this.replaceWith(pos, pos, content)\n};\n\nfunction fitsTrivially($from, $to, slice) {\n return !slice.openStart && !slice.openEnd && $from.start() == $to.start() &&\n $from.parent.canReplace($from.index(), $to.index(), slice.content)\n}\n\n// Algorithm for 'placing' the elements of a slice into a gap:\n//\n// We consider the content of each node that is open to the left to be\n// independently placeable. I.e. in , when the\n// paragraph on the left is open, \"foo\" can be placed (somewhere on\n// the left side of the replacement gap) independently from p(\"bar\").\n//\n// This class tracks the state of the placement progress in the\n// following properties:\n//\n// - `frontier` holds a stack of `{type, match}` objects that\n// represent the open side of the replacement. It starts at\n// `$from`, then moves forward as content is placed, and is finally\n// reconciled with `$to`.\n//\n// - `unplaced` is a slice that represents the content that hasn't\n// been placed yet.\n//\n// - `placed` is a fragment of placed content. Its open-start value\n// is implicit in `$from`, and its open-end value in `frontier`.\nvar Fitter = function Fitter($from, $to, slice) {\n this.$to = $to;\n this.$from = $from;\n this.unplaced = slice;\n\n this.frontier = [];\n for (var i = 0; i <= $from.depth; i++) {\n var node = $from.node(i);\n this.frontier.push({\n type: node.type,\n match: node.contentMatchAt($from.indexAfter(i))\n });\n }\n\n this.placed = Fragment.empty;\n for (var i$1 = $from.depth; i$1 > 0; i$1--)\n { this.placed = Fragment.from($from.node(i$1).copy(this.placed)); }\n};\n\nvar prototypeAccessors$1 = { depth: { configurable: true } };\n\nprototypeAccessors$1.depth.get = function () { return this.frontier.length - 1 };\n\nFitter.prototype.fit = function fit () {\n // As long as there's unplaced content, try to place some of it.\n // If that fails, either increase the open score of the unplaced\n // slice, or drop nodes from it, and then try again.\n while (this.unplaced.size) {\n var fit = this.findFittable();\n if (fit) { this.placeNodes(fit); }\n else { this.openMore() || this.dropNode(); }\n }\n // When there's inline content directly after the frontier _and_\n // directly after `this.$to`, we must generate a `ReplaceAround`\n // step that pulls that content into the node after the frontier.\n // That means the fitting must be done to the end of the textblock\n // node after `this.$to`, not `this.$to` itself.\n var moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth;\n var $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline));\n if (!$to) { return null }\n\n // If closing to `$to` succeeded, create a step\n var content = this.placed, openStart = $from.depth, openEnd = $to.depth;\n while (openStart && openEnd && content.childCount == 1) { // Normalize by dropping open parent nodes\n content = content.firstChild.content;\n openStart--; openEnd--;\n }\n var slice = new Slice(content, openStart, openEnd);\n if (moveInline > -1)\n { return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice, placedSize) }\n if (slice.size || $from.pos != this.$to.pos) // Don't generate no-op steps\n { return new ReplaceStep($from.pos, $to.pos, slice) }\n};\n\n// Find a position on the start spine of `this.unplaced` that has\n// content that can be moved somewhere on the frontier. Returns two\n// depths, one for the slice and one for the frontier.\nFitter.prototype.findFittable = function findFittable () {\n // Only try wrapping nodes (pass 2) after finding a place without\n // wrapping failed.\n for (var pass = 1; pass <= 2; pass++) {\n for (var sliceDepth = this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) {\n var fragment = (void 0), parent = (void 0);\n if (sliceDepth) {\n parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild;\n fragment = parent.content;\n } else {\n fragment = this.unplaced.content;\n }\n var first = fragment.firstChild;\n for (var frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) {\n var ref = this.frontier[frontierDepth];\n var type = ref.type;\n var match = ref.match;\n var wrap = (void 0), inject = (void 0);\n // In pass 1, if the next node matches, or there is no next\n // node but the parents look compatible, we've found a\n // place.\n if (pass == 1 && (first ? match.matchType(first.type) || (inject = match.fillBefore(Fragment.from(first), false))\n : type.compatibleContent(parent.type)))\n { return {sliceDepth: sliceDepth, frontierDepth: frontierDepth, parent: parent, inject: inject} }\n // In pass 2, look for a set of wrapping nodes that make\n // `first` fit here.\n else if (pass == 2 && first && (wrap = match.findWrapping(first.type)))\n { return {sliceDepth: sliceDepth, frontierDepth: frontierDepth, parent: parent, wrap: wrap} }\n // Don't continue looking further up if the parent node\n // would fit here.\n if (parent && match.matchType(parent.type)) { break }\n }\n }\n }\n};\n\nFitter.prototype.openMore = function openMore () {\n var ref = this.unplaced;\n var content = ref.content;\n var openStart = ref.openStart;\n var openEnd = ref.openEnd;\n var inner = contentAt(content, openStart);\n if (!inner.childCount || inner.firstChild.isLeaf) { return false }\n this.unplaced = new Slice(content, openStart + 1,\n Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0));\n return true\n};\n\nFitter.prototype.dropNode = function dropNode () {\n var ref = this.unplaced;\n var content = ref.content;\n var openStart = ref.openStart;\n var openEnd = ref.openEnd;\n var inner = contentAt(content, openStart);\n if (inner.childCount <= 1 && openStart > 0) {\n var openAtEnd = content.size - openStart <= openStart + inner.size;\n this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1,\n openAtEnd ? openStart - 1 : openEnd);\n } else {\n this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd);\n }\n};\n\n// : ({sliceDepth: number, frontierDepth: number, parent: ?Node, wrap: ?[NodeType], inject: ?Fragment})\n// Move content from the unplaced slice at `sliceDepth` to the\n// frontier node at `frontierDepth`. Close that frontier node when\n// applicable.\nFitter.prototype.placeNodes = function placeNodes (ref) {\n var sliceDepth = ref.sliceDepth;\n var frontierDepth = ref.frontierDepth;\n var parent = ref.parent;\n var inject = ref.inject;\n var wrap = ref.wrap;\n\n while (this.depth > frontierDepth) { this.closeFrontierNode(); }\n if (wrap) { for (var i = 0; i < wrap.length; i++) { this.openFrontierNode(wrap[i]); } }\n\n var slice = this.unplaced, fragment = parent ? parent.content : slice.content;\n var openStart = slice.openStart - sliceDepth;\n var taken = 0, add = [];\n var ref$1 = this.frontier[frontierDepth];\n var match = ref$1.match;\n var type = ref$1.type;\n if (inject) {\n for (var i$1 = 0; i$1 < inject.childCount; i$1++) { add.push(inject.child(i$1)); }\n match = match.matchFragment(inject);\n }\n // Computes the amount of (end) open nodes at the end of the\n // fragment. When 0, the parent is open, but no more. When\n // negative, nothing is open.\n var openEndCount = (fragment.size + sliceDepth) - (slice.content.size - slice.openEnd);\n // Scan over the fragment, fitting as many child nodes as\n // possible.\n while (taken < fragment.childCount) {\n var next = fragment.child(taken), matches = match.matchType(next.type);\n if (!matches) { break }\n taken++;\n if (taken > 1 || openStart == 0 || next.content.size) { // Drop empty open nodes\n match = matches;\n add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0,\n taken == fragment.childCount ? openEndCount : -1));\n }\n }\n var toEnd = taken == fragment.childCount;\n if (!toEnd) { openEndCount = -1; }\n\n this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add));\n this.frontier[frontierDepth].match = match;\n\n // If the parent types match, and the entire node was moved, and\n // it's not open, close this frontier node right away.\n if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1)\n { this.closeFrontierNode(); }\n\n // Add new frontier nodes for any open nodes at the end.\n for (var i$2 = 0, cur = fragment; i$2 < openEndCount; i$2++) {\n var node = cur.lastChild;\n this.frontier.push({type: node.type, match: node.contentMatchAt(node.childCount)});\n cur = node.content;\n }\n\n // Update `this.unplaced`. Drop the entire node from which we\n // placed it we got to its end, otherwise just drop the placed\n // nodes.\n this.unplaced = !toEnd ? new Slice(dropFromFragment(slice.content, sliceDepth, taken), slice.openStart, slice.openEnd)\n : sliceDepth == 0 ? Slice.empty\n : new Slice(dropFromFragment(slice.content, sliceDepth - 1, 1),\n sliceDepth - 1, openEndCount < 0 ? slice.openEnd : sliceDepth - 1);\n};\n\nFitter.prototype.mustMoveInline = function mustMoveInline () {\n if (!this.$to.parent.isTextblock || this.$to.end() == this.$to.pos) { return -1 }\n var top = this.frontier[this.depth], level;\n if (!top.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top.type, top.match, false) ||\n (this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth)) { return -1 }\n\n var ref = this.$to;\n var depth = ref.depth;\n var after = this.$to.after(depth);\n while (depth > 1 && after == this.$to.end(--depth)) { ++after; }\n return after\n};\n\nFitter.prototype.findCloseLevel = function findCloseLevel ($to) {\n scan: for (var i = Math.min(this.depth, $to.depth); i >= 0; i--) {\n var ref = this.frontier[i];\n var match = ref.match;\n var type = ref.type;\n var dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1));\n var fit = contentAfterFits($to, i, type, match, dropInner);\n if (!fit) { continue }\n for (var d = i - 1; d >= 0; d--) {\n var ref$1 = this.frontier[d];\n var match$1 = ref$1.match;\n var type$1 = ref$1.type;\n var matches = contentAfterFits($to, d, type$1, match$1, true);\n if (!matches || matches.childCount) { continue scan }\n }\n return {depth: i, fit: fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to}\n }\n};\n\nFitter.prototype.close = function close ($to) {\n var close = this.findCloseLevel($to);\n if (!close) { return null }\n\n while (this.depth > close.depth) { this.closeFrontierNode(); }\n if (close.fit.childCount) { this.placed = addToFragment(this.placed, close.depth, close.fit); }\n $to = close.move;\n for (var d = close.depth + 1; d <= $to.depth; d++) {\n var node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d));\n this.openFrontierNode(node.type, node.attrs, add);\n }\n return $to\n};\n\nFitter.prototype.openFrontierNode = function openFrontierNode (type, attrs, content) {\n var top = this.frontier[this.depth];\n top.match = top.match.matchType(type);\n this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content)));\n this.frontier.push({type: type, match: type.contentMatch});\n};\n\nFitter.prototype.closeFrontierNode = function closeFrontierNode () {\n var open = this.frontier.pop();\n var add = open.match.fillBefore(Fragment.empty, true);\n if (add.childCount) { this.placed = addToFragment(this.placed, this.frontier.length, add); }\n};\n\nObject.defineProperties( Fitter.prototype, prototypeAccessors$1 );\n\nfunction dropFromFragment(fragment, depth, count) {\n if (depth == 0) { return fragment.cutByIndex(count) }\n return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count)))\n}\n\nfunction addToFragment(fragment, depth, content) {\n if (depth == 0) { return fragment.append(content) }\n return fragment.replaceChild(fragment.childCount - 1,\n fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content)))\n}\n\nfunction contentAt(fragment, depth) {\n for (var i = 0; i < depth; i++) { fragment = fragment.firstChild.content; }\n return fragment\n}\n\nfunction closeNodeStart(node, openStart, openEnd) {\n if (openStart <= 0) { return node }\n var frag = node.content;\n if (openStart > 1)\n { frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0)); }\n if (openStart > 0) {\n frag = node.type.contentMatch.fillBefore(frag).append(frag);\n if (openEnd <= 0) { frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true)); }\n }\n return node.copy(frag)\n}\n\nfunction contentAfterFits($to, depth, type, match, open) {\n var node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth);\n if (index == node.childCount && !type.compatibleContent(node.type)) { return null }\n var fit = match.fillBefore(node.content, true, index);\n return fit && !invalidMarks(type, node.content, index) ? fit : null\n}\n\nfunction invalidMarks(type, fragment, start) {\n for (var i = start; i < fragment.childCount; i++)\n { if (!type.allowsMarks(fragment.child(i).marks)) { return true } }\n return false\n}\n\n// :: (number, number, Slice) → this\n// Replace a range of the document with a given slice, using `from`,\n// `to`, and the slice's [`openStart`](#model.Slice.openStart) property\n// as hints, rather than fixed start and end points. This method may\n// grow the replaced area or close open nodes in the slice in order to\n// get a fit that is more in line with WYSIWYG expectations, by\n// dropping fully covered parent nodes of the replaced region when\n// they are marked [non-defining](#model.NodeSpec.defining), or\n// including an open parent node from the slice that _is_ marked as\n// [defining](#model.NodeSpec.defining).\n//\n// This is the method, for example, to handle paste. The similar\n// [`replace`](#transform.Transform.replace) method is a more\n// primitive tool which will _not_ move the start and end of its given\n// range, and is useful in situations where you need more precise\n// control over what happens.\nTransform.prototype.replaceRange = function(from, to, slice) {\n if (!slice.size) { return this.deleteRange(from, to) }\n\n var $from = this.doc.resolve(from), $to = this.doc.resolve(to);\n if (fitsTrivially($from, $to, slice))\n { return this.step(new ReplaceStep(from, to, slice)) }\n\n var targetDepths = coveredDepths($from, this.doc.resolve(to));\n // Can't replace the whole document, so remove 0 if it's present\n if (targetDepths[targetDepths.length - 1] == 0) { targetDepths.pop(); }\n // Negative numbers represent not expansion over the whole node at\n // that depth, but replacing from $from.before(-D) to $to.pos.\n var preferredTarget = -($from.depth + 1);\n targetDepths.unshift(preferredTarget);\n // This loop picks a preferred target depth, if one of the covering\n // depths is not outside of a defining node, and adds negative\n // depths for any depth that has $from at its start and does not\n // cross a defining node.\n for (var d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) {\n var spec = $from.node(d).type.spec;\n if (spec.defining || spec.isolating) { break }\n if (targetDepths.indexOf(d) > -1) { preferredTarget = d; }\n else if ($from.before(d) == pos) { targetDepths.splice(1, 0, -d); }\n }\n // Try to fit each possible depth of the slice into each possible\n // target depth, starting with the preferred depths.\n var preferredTargetIndex = targetDepths.indexOf(preferredTarget);\n\n var leftNodes = [], preferredDepth = slice.openStart;\n for (var content = slice.content, i = 0;; i++) {\n var node = content.firstChild;\n leftNodes.push(node);\n if (i == slice.openStart) { break }\n content = node.content;\n }\n // Back up if the node directly above openStart, or the node above\n // that separated only by a non-defining textblock node, is defining.\n if (preferredDepth > 0 && leftNodes[preferredDepth - 1].type.spec.defining &&\n $from.node(preferredTargetIndex).type != leftNodes[preferredDepth - 1].type)\n { preferredDepth -= 1; }\n else if (preferredDepth >= 2 && leftNodes[preferredDepth - 1].isTextblock && leftNodes[preferredDepth - 2].type.spec.defining &&\n $from.node(preferredTargetIndex).type != leftNodes[preferredDepth - 2].type)\n { preferredDepth -= 2; }\n\n for (var j = slice.openStart; j >= 0; j--) {\n var openDepth = (j + preferredDepth + 1) % (slice.openStart + 1);\n var insert = leftNodes[openDepth];\n if (!insert) { continue }\n for (var i$1 = 0; i$1 < targetDepths.length; i$1++) {\n // Loop over possible expansion levels, starting with the\n // preferred one\n var targetDepth = targetDepths[(i$1 + preferredTargetIndex) % targetDepths.length], expand = true;\n if (targetDepth < 0) { expand = false; targetDepth = -targetDepth; }\n var parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1);\n if (parent.canReplaceWith(index, index, insert.type, insert.marks))\n { return this.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to,\n new Slice(closeFragment(slice.content, 0, slice.openStart, openDepth),\n openDepth, slice.openEnd)) }\n }\n }\n\n var startSteps = this.steps.length;\n for (var i$2 = targetDepths.length - 1; i$2 >= 0; i$2--) {\n this.replace(from, to, slice);\n if (this.steps.length > startSteps) { break }\n var depth = targetDepths[i$2];\n if (i$2 < 0) { continue }\n from = $from.before(depth); to = $to.after(depth);\n }\n return this\n};\n\nfunction closeFragment(fragment, depth, oldOpen, newOpen, parent) {\n if (depth < oldOpen) {\n var first = fragment.firstChild;\n fragment = fragment.replaceChild(0, first.copy(closeFragment(first.content, depth + 1, oldOpen, newOpen, first)));\n }\n if (depth > newOpen) {\n var match = parent.contentMatchAt(0);\n var start = match.fillBefore(fragment).append(fragment);\n fragment = start.append(match.matchFragment(start).fillBefore(Fragment.empty, true));\n }\n return fragment\n}\n\n// :: (number, number, Node) → this\n// Replace the given range with a node, but use `from` and `to` as\n// hints, rather than precise positions. When from and to are the same\n// and are at the start or end of a parent node in which the given\n// node doesn't fit, this method may _move_ them out towards a parent\n// that does allow the given node to be placed. When the given range\n// completely covers a parent node, this method may completely replace\n// that parent node.\nTransform.prototype.replaceRangeWith = function(from, to, node) {\n if (!node.isInline && from == to && this.doc.resolve(from).parent.content.size) {\n var point = insertPoint(this.doc, from, node.type);\n if (point != null) { from = to = point; }\n }\n return this.replaceRange(from, to, new Slice(Fragment.from(node), 0, 0))\n};\n\n// :: (number, number) → this\n// Delete the given range, expanding it to cover fully covered\n// parent nodes until a valid replace is found.\nTransform.prototype.deleteRange = function(from, to) {\n var $from = this.doc.resolve(from), $to = this.doc.resolve(to);\n var covered = coveredDepths($from, $to);\n for (var i = 0; i < covered.length; i++) {\n var depth = covered[i], last = i == covered.length - 1;\n if ((last && depth == 0) || $from.node(depth).type.contentMatch.validEnd)\n { return this.delete($from.start(depth), $to.end(depth)) }\n if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1))))\n { return this.delete($from.before(depth), $to.after(depth)) }\n }\n for (var d = 1; d <= $from.depth && d <= $to.depth; d++) {\n if (from - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d)\n { return this.delete($from.before(d), to) }\n }\n return this.delete(from, to)\n};\n\n// : (ResolvedPos, ResolvedPos) → [number]\n// Returns an array of all depths for which $from - $to spans the\n// whole content of the nodes at that depth.\nfunction coveredDepths($from, $to) {\n var result = [], minDepth = Math.min($from.depth, $to.depth);\n for (var d = minDepth; d >= 0; d--) {\n var start = $from.start(d);\n if (start < $from.pos - ($from.depth - d) ||\n $to.end(d) > $to.pos + ($to.depth - d) ||\n $from.node(d).type.spec.isolating ||\n $to.node(d).type.spec.isolating) { break }\n if (start == $to.start(d)) { result.push(d); }\n }\n return result\n}\n\nexport { AddMarkStep, MapResult, Mapping, RemoveMarkStep, ReplaceAroundStep, ReplaceStep, Step, StepMap, StepResult, Transform, TransformError, canJoin, canSplit, dropPoint, findWrapping, insertPoint, joinPoint, liftTarget, replaceStep };\n//# sourceMappingURL=index.es.js.map\n","// Utilities\n//\n'use strict';\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction isString(obj) { return _class(obj) === '[object String]'; }\n\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction has(object, key) {\n return _hasOwnProperty.call(object, key);\n}\n\n// Merge objects\n//\nfunction assign(obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n\n sources.forEach(function (source) {\n if (!source) { return; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be object');\n }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key];\n });\n });\n\n return obj;\n}\n\n// Remove element from array and put another array at those position.\n// Useful for some operations with tokens\nfunction arrayReplaceAt(src, pos, newElements) {\n return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1));\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction isValidEntityCode(c) {\n /*eslint no-bitwise:0*/\n // broken sequence\n if (c >= 0xD800 && c <= 0xDFFF) { return false; }\n // never used\n if (c >= 0xFDD0 && c <= 0xFDEF) { return false; }\n if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false; }\n // control codes\n if (c >= 0x00 && c <= 0x08) { return false; }\n if (c === 0x0B) { return false; }\n if (c >= 0x0E && c <= 0x1F) { return false; }\n if (c >= 0x7F && c <= 0x9F) { return false; }\n // out of range\n if (c > 0x10FFFF) { return false; }\n return true;\n}\n\nfunction fromCodePoint(c) {\n /*eslint no-bitwise:0*/\n if (c > 0xffff) {\n c -= 0x10000;\n var surrogate1 = 0xd800 + (c >> 10),\n surrogate2 = 0xdc00 + (c & 0x3ff);\n\n return String.fromCharCode(surrogate1, surrogate2);\n }\n return String.fromCharCode(c);\n}\n\n\nvar UNESCAPE_MD_RE = /\\\\([!\"#$%&'()*+,\\-.\\/:;<=>?@[\\\\\\]^_`{|}~])/g;\nvar ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi;\nvar UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi');\n\nvar DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;\n\nvar entities = require('./entities');\n\nfunction replaceEntityPattern(match, name) {\n var code = 0;\n\n if (has(entities, name)) {\n return entities[name];\n }\n\n if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n code = name[1].toLowerCase() === 'x' ?\n parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10);\n\n if (isValidEntityCode(code)) {\n return fromCodePoint(code);\n }\n }\n\n return match;\n}\n\n/*function replaceEntities(str) {\n if (str.indexOf('&') < 0) { return str; }\n\n return str.replace(ENTITY_RE, replaceEntityPattern);\n}*/\n\nfunction unescapeMd(str) {\n if (str.indexOf('\\\\') < 0) { return str; }\n return str.replace(UNESCAPE_MD_RE, '$1');\n}\n\nfunction unescapeAll(str) {\n if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str; }\n\n return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n if (escaped) { return escaped; }\n return replaceEntityPattern(match, entity);\n });\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar HTML_ESCAPE_TEST_RE = /[&<>\"]/;\nvar HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g;\nvar HTML_REPLACEMENTS = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"'\n};\n\nfunction replaceUnsafeChar(ch) {\n return HTML_REPLACEMENTS[ch];\n}\n\nfunction escapeHtml(str) {\n if (HTML_ESCAPE_TEST_RE.test(str)) {\n return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar);\n }\n return str;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g;\n\nfunction escapeRE(str) {\n return str.replace(REGEXP_ESCAPE_RE, '\\\\$&');\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction isSpace(code) {\n switch (code) {\n case 0x09:\n case 0x20:\n return true;\n }\n return false;\n}\n\n// Zs (unicode class) || [\\t\\f\\v\\r\\n]\nfunction isWhiteSpace(code) {\n if (code >= 0x2000 && code <= 0x200A) { return true; }\n switch (code) {\n case 0x09: // \\t\n case 0x0A: // \\n\n case 0x0B: // \\v\n case 0x0C: // \\f\n case 0x0D: // \\r\n case 0x20:\n case 0xA0:\n case 0x1680:\n case 0x202F:\n case 0x205F:\n case 0x3000:\n return true;\n }\n return false;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/*eslint-disable max-len*/\nvar UNICODE_PUNCT_RE = require('uc.micro/categories/P/regex');\n\n// Currently without astral characters support.\nfunction isPunctChar(ch) {\n return UNICODE_PUNCT_RE.test(ch);\n}\n\n\n// Markdown ASCII punctuation characters.\n//\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\n//\n// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.\n//\nfunction isMdAsciiPunct(ch) {\n switch (ch) {\n case 0x21/* ! */:\n case 0x22/* \" */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x27/* ' */:\n case 0x28/* ( */:\n case 0x29/* ) */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2C/* , */:\n case 0x2D/* - */:\n case 0x2E/* . */:\n case 0x2F/* / */:\n case 0x3A/* : */:\n case 0x3B/* ; */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x3F/* ? */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7C/* | */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true;\n default:\n return false;\n }\n}\n\n// Hepler to unify [reference labels].\n//\nfunction normalizeReference(str) {\n // Trim and collapse whitespace\n //\n str = str.trim().replace(/\\s+/g, ' ');\n\n // In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug\n // fixed in v12 (couldn't find any details).\n //\n // So treat this one as a special case\n // (remove this when node v10 is no longer supported).\n //\n if ('ẞ'.toLowerCase() === 'Ṿ') {\n str = str.replace(/ẞ/g, 'ß');\n }\n\n // .toLowerCase().toUpperCase() should get rid of all differences\n // between letter variants.\n //\n // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently\n // uppercased versions).\n //\n // Here's an example showing how it happens. Lets take greek letter omega:\n // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)\n //\n // Unicode entries:\n // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n // 03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8;\n //\n // Case-insensitive comparison should treat all of them as equivalent.\n //\n // But .toLowerCase() doesn't change ϑ (it's already lowercase),\n // and .toUpperCase() doesn't change ϴ (already uppercase).\n //\n // Applying first lower then upper case normalizes any character:\n // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n //\n // Note: this is equivalent to unicode case folding; unicode normalization\n // is a different step that is not required here.\n //\n // Final result should be uppercased, because it's later stored in an object\n // (this avoid a conflict with Object.prototype members,\n // most notably, `__proto__`)\n //\n return str.toLowerCase().toUpperCase();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Re-export libraries commonly used in both markdown-it and its plugins,\n// so plugins won't have to depend on them explicitly, which reduces their\n// bundled size (e.g. a browser build).\n//\nexports.lib = {};\nexports.lib.mdurl = require('mdurl');\nexports.lib.ucmicro = require('uc.micro');\n\nexports.assign = assign;\nexports.isString = isString;\nexports.has = has;\nexports.unescapeMd = unescapeMd;\nexports.unescapeAll = unescapeAll;\nexports.isValidEntityCode = isValidEntityCode;\nexports.fromCodePoint = fromCodePoint;\n// exports.replaceEntities = replaceEntities;\nexports.escapeHtml = escapeHtml;\nexports.arrayReplaceAt = arrayReplaceAt;\nexports.isSpace = isSpace;\nexports.isWhiteSpace = isWhiteSpace;\nexports.isMdAsciiPunct = isMdAsciiPunct;\nexports.isPunctChar = isPunctChar;\nexports.escapeRE = escapeRE;\nexports.normalizeReference = normalizeReference;\n","import { Plugin } from 'prosemirror-state';\nimport { findWrapping, canJoin } from 'prosemirror-transform';\n\n// ::- Input rules are regular expressions describing a piece of text\n// that, when typed, causes something to happen. This might be\n// changing two dashes into an emdash, wrapping a paragraph starting\n// with `\"> \"` into a blockquote, or something entirely different.\nvar InputRule = function InputRule(match, handler) {\n this.match = match;\n this.handler = typeof handler == \"string\" ? stringHandler(handler) : handler;\n};\n\nfunction stringHandler(string) {\n return function(state, match, start, end) {\n var insert = string;\n if (match[1]) {\n var offset = match[0].lastIndexOf(match[1]);\n insert += match[0].slice(offset + match[1].length);\n start += offset;\n var cutOff = start - end;\n if (cutOff > 0) {\n insert = match[0].slice(offset - cutOff, offset) + insert;\n start = end;\n }\n }\n return state.tr.insertText(insert, start, end)\n }\n}\n\nvar MAX_MATCH = 500;\n\n// :: (config: {rules: [InputRule]}) → Plugin\n// Create an input rules plugin. When enabled, it will cause text\n// input that matches any of the given rules to trigger the rule's\n// action.\nfunction inputRules(ref) {\n var rules = ref.rules;\n\n var plugin = new Plugin({\n state: {\n init: function init() { return null },\n apply: function apply(tr, prev) {\n var stored = tr.getMeta(this);\n if (stored) { return stored }\n return tr.selectionSet || tr.docChanged ? null : prev\n }\n },\n\n props: {\n handleTextInput: function handleTextInput(view, from, to, text) {\n return run(view, from, to, text, rules, plugin)\n },\n handleDOMEvents: {\n compositionend: function (view) {\n setTimeout(function () {\n var ref = view.state.selection;\n var $cursor = ref.$cursor;\n if ($cursor) { run(view, $cursor.pos, $cursor.pos, \"\", rules, plugin); }\n });\n }\n }\n },\n\n isInputRules: true\n });\n return plugin\n}\n\nfunction run(view, from, to, text, rules, plugin) {\n if (view.composing) { return false }\n var state = view.state, $from = state.doc.resolve(from);\n if ($from.parent.type.spec.code) { return false }\n var textBefore = $from.parent.textBetween(Math.max(0, $from.parentOffset - MAX_MATCH), $from.parentOffset,\n null, \"\\ufffc\") + text;\n for (var i = 0; i < rules.length; i++) {\n var match = rules[i].match.exec(textBefore);\n var tr = match && rules[i].handler(state, match, from - (match[0].length - text.length), to);\n if (!tr) { continue }\n view.dispatch(tr.setMeta(plugin, {transform: tr, from: from, to: to, text: text}));\n return true\n }\n return false\n}\n\n// :: (EditorState, ?(Transaction)) → bool\n// This is a command that will undo an input rule, if applying such a\n// rule was the last thing that the user did.\nfunction undoInputRule(state, dispatch) {\n var plugins = state.plugins;\n for (var i = 0; i < plugins.length; i++) {\n var plugin = plugins[i], undoable = (void 0);\n if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) {\n if (dispatch) {\n var tr = state.tr, toUndo = undoable.transform;\n for (var j = toUndo.steps.length - 1; j >= 0; j--)\n { tr.step(toUndo.steps[j].invert(toUndo.docs[j])); }\n if (undoable.text) {\n var marks = tr.doc.resolve(undoable.from).marks();\n tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks));\n } else {\n tr.delete(undoable.from, undoable.to);\n }\n dispatch(tr);\n }\n return true\n }\n }\n return false\n}\n\n// :: InputRule Converts double dashes to an emdash.\nvar emDash = new InputRule(/--$/, \"—\");\n// :: InputRule Converts three dots to an ellipsis character.\nvar ellipsis = new InputRule(/\\.\\.\\.$/, \"…\");\n// :: InputRule “Smart” opening double quotes.\nvar openDoubleQuote = new InputRule(/(?:^|[\\s\\{\\[\\(\\<'\"\\u2018\\u201C])(\")$/, \"“\");\n// :: InputRule “Smart” closing double quotes.\nvar closeDoubleQuote = new InputRule(/\"$/, \"”\");\n// :: InputRule “Smart” opening single quotes.\nvar openSingleQuote = new InputRule(/(?:^|[\\s\\{\\[\\(\\<'\"\\u2018\\u201C])(')$/, \"‘\");\n// :: InputRule “Smart” closing single quotes.\nvar closeSingleQuote = new InputRule(/'$/, \"’\");\n\n// :: [InputRule] Smart-quote related input rules.\nvar smartQuotes = [openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote];\n\n// :: (RegExp, NodeType, ?union, ?([string], Node) → bool) → InputRule\n// Build an input rule for automatically wrapping a textblock when a\n// given string is typed. The `regexp` argument is\n// directly passed through to the `InputRule` constructor. You'll\n// probably want the regexp to start with `^`, so that the pattern can\n// only occur at the start of a textblock.\n//\n// `nodeType` is the type of node to wrap in. If it needs attributes,\n// you can either pass them directly, or pass a function that will\n// compute them from the regular expression match.\n//\n// By default, if there's a node with the same type above the newly\n// wrapped node, the rule will try to [join](#transform.Transform.join) those\n// two nodes. You can pass a join predicate, which takes a regular\n// expression match and the node before the wrapped node, and can\n// return a boolean to indicate whether a join should happen.\nfunction wrappingInputRule(regexp, nodeType, getAttrs, joinPredicate) {\n return new InputRule(regexp, function (state, match, start, end) {\n var attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n var tr = state.tr.delete(start, end);\n var $start = tr.doc.resolve(start), range = $start.blockRange(), wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping) { return null }\n tr.wrap(range, wrapping);\n var before = tr.doc.resolve(start - 1).nodeBefore;\n if (before && before.type == nodeType && canJoin(tr.doc, start - 1) &&\n (!joinPredicate || joinPredicate(match, before)))\n { tr.join(start - 1); }\n return tr\n })\n}\n\n// :: (RegExp, NodeType, ?union) → InputRule\n// Build an input rule that changes the type of a textblock when the\n// matched text is typed into it. You'll usually want to start your\n// regexp with `^` to that it is only matched at the start of a\n// textblock. The optional `getAttrs` parameter can be used to compute\n// the new node's attributes, and works the same as in the\n// `wrappingInputRule` function.\nfunction textblockTypeInputRule(regexp, nodeType, getAttrs) {\n return new InputRule(regexp, function (state, match, start, end) {\n var $start = state.doc.resolve(start);\n var attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), nodeType)) { return null }\n return state.tr\n .delete(start, end)\n .setBlockType(start, start, nodeType, attrs)\n })\n}\n\nexport { InputRule, closeDoubleQuote, closeSingleQuote, ellipsis, emDash, inputRules, openDoubleQuote, openSingleQuote, smartQuotes, textblockTypeInputRule, undoInputRule, wrappingInputRule };\n//# sourceMappingURL=index.es.js.map\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"@babel/runtime/helpers/esm/setPrototypeOf\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","import { Schema, Mark } from 'prosemirror-model';\nimport markdownit from 'markdown-it';\n\n// ::Schema Document schema for the data model used by CommonMark.\nvar schema = new Schema({\n nodes: {\n doc: {\n content: \"block+\"\n },\n\n paragraph: {\n content: \"inline*\",\n group: \"block\",\n parseDOM: [{tag: \"p\"}],\n toDOM: function toDOM() { return [\"p\", 0] }\n },\n\n blockquote: {\n content: \"block+\",\n group: \"block\",\n parseDOM: [{tag: \"blockquote\"}],\n toDOM: function toDOM() { return [\"blockquote\", 0] }\n },\n\n horizontal_rule: {\n group: \"block\",\n parseDOM: [{tag: \"hr\"}],\n toDOM: function toDOM() { return [\"div\", [\"hr\"]] }\n },\n\n heading: {\n attrs: {level: {default: 1}},\n content: \"(text | image)*\",\n group: \"block\",\n defining: true,\n parseDOM: [{tag: \"h1\", attrs: {level: 1}},\n {tag: \"h2\", attrs: {level: 2}},\n {tag: \"h3\", attrs: {level: 3}},\n {tag: \"h4\", attrs: {level: 4}},\n {tag: \"h5\", attrs: {level: 5}},\n {tag: \"h6\", attrs: {level: 6}}],\n toDOM: function toDOM(node) { return [\"h\" + node.attrs.level, 0] }\n },\n\n code_block: {\n content: \"text*\",\n group: \"block\",\n code: true,\n defining: true,\n marks: \"\",\n attrs: {params: {default: \"\"}},\n parseDOM: [{tag: \"pre\", preserveWhitespace: \"full\", getAttrs: function (node) { return (\n {params: node.getAttribute(\"data-params\") || \"\"}\n ); }}],\n toDOM: function toDOM(node) { return [\"pre\", node.attrs.params ? {\"data-params\": node.attrs.params} : {}, [\"code\", 0]] }\n },\n\n ordered_list: {\n content: \"list_item+\",\n group: \"block\",\n attrs: {order: {default: 1}, tight: {default: false}},\n parseDOM: [{tag: \"ol\", getAttrs: function getAttrs(dom) {\n return {order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\") : 1,\n tight: dom.hasAttribute(\"data-tight\")}\n }}],\n toDOM: function toDOM(node) {\n return [\"ol\", {start: node.attrs.order == 1 ? null : node.attrs.order,\n \"data-tight\": node.attrs.tight ? \"true\" : null}, 0]\n }\n },\n\n bullet_list: {\n content: \"list_item+\",\n group: \"block\",\n attrs: {tight: {default: false}},\n parseDOM: [{tag: \"ul\", getAttrs: function (dom) { return ({tight: dom.hasAttribute(\"data-tight\")}); }}],\n toDOM: function toDOM(node) { return [\"ul\", {\"data-tight\": node.attrs.tight ? \"true\" : null}, 0] }\n },\n\n list_item: {\n content: \"paragraph block*\",\n defining: true,\n parseDOM: [{tag: \"li\"}],\n toDOM: function toDOM() { return [\"li\", 0] }\n },\n\n text: {\n group: \"inline\"\n },\n\n image: {\n inline: true,\n attrs: {\n src: {},\n alt: {default: null},\n title: {default: null}\n },\n group: \"inline\",\n draggable: true,\n parseDOM: [{tag: \"img[src]\", getAttrs: function getAttrs(dom) {\n return {\n src: dom.getAttribute(\"src\"),\n title: dom.getAttribute(\"title\"),\n alt: dom.getAttribute(\"alt\")\n }\n }}],\n toDOM: function toDOM(node) { return [\"img\", node.attrs] }\n },\n\n hard_break: {\n inline: true,\n group: \"inline\",\n selectable: false,\n parseDOM: [{tag: \"br\"}],\n toDOM: function toDOM() { return [\"br\"] }\n }\n },\n\n marks: {\n em: {\n parseDOM: [{tag: \"i\"}, {tag: \"em\"},\n {style: \"font-style\", getAttrs: function (value) { return value == \"italic\" && null; }}],\n toDOM: function toDOM() { return [\"em\"] }\n },\n\n strong: {\n parseDOM: [{tag: \"b\"}, {tag: \"strong\"},\n {style: \"font-weight\", getAttrs: function (value) { return /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null; }}],\n toDOM: function toDOM() { return [\"strong\"] }\n },\n\n link: {\n attrs: {\n href: {},\n title: {default: null}\n },\n inclusive: false,\n parseDOM: [{tag: \"a[href]\", getAttrs: function getAttrs(dom) {\n return {href: dom.getAttribute(\"href\"), title: dom.getAttribute(\"title\")}\n }}],\n toDOM: function toDOM(node) { return [\"a\", node.attrs] }\n },\n\n code: {\n parseDOM: [{tag: \"code\"}],\n toDOM: function toDOM() { return [\"code\"] }\n }\n }\n});\n\nfunction maybeMerge(a, b) {\n if (a.isText && b.isText && Mark.sameSet(a.marks, b.marks))\n { return a.withText(a.text + b.text) }\n}\n\n// Object used to track the context of a running parse.\nvar MarkdownParseState = function MarkdownParseState(schema, tokenHandlers) {\n this.schema = schema;\n this.stack = [{type: schema.topNodeType, content: []}];\n this.marks = Mark.none;\n this.tokenHandlers = tokenHandlers;\n};\n\nMarkdownParseState.prototype.top = function top () {\n return this.stack[this.stack.length - 1]\n};\n\nMarkdownParseState.prototype.push = function push (elt) {\n if (this.stack.length) { this.top().content.push(elt); }\n};\n\n// : (string)\n// Adds the given text to the current position in the document,\n// using the current marks as styling.\nMarkdownParseState.prototype.addText = function addText (text) {\n if (!text) { return }\n var nodes = this.top().content, last = nodes[nodes.length - 1];\n var node = this.schema.text(text, this.marks), merged;\n if (last && (merged = maybeMerge(last, node))) { nodes[nodes.length - 1] = merged; }\n else { nodes.push(node); }\n};\n\n// : (Mark)\n// Adds the given mark to the set of active marks.\nMarkdownParseState.prototype.openMark = function openMark (mark) {\n this.marks = mark.addToSet(this.marks);\n};\n\n// : (Mark)\n// Removes the given mark from the set of active marks.\nMarkdownParseState.prototype.closeMark = function closeMark (mark) {\n this.marks = mark.removeFromSet(this.marks);\n};\n\nMarkdownParseState.prototype.parseTokens = function parseTokens (toks) {\n for (var i = 0; i < toks.length; i++) {\n var tok = toks[i];\n var handler = this.tokenHandlers[tok.type];\n if (!handler)\n { throw new Error(\"Token type `\" + tok.type + \"` not supported by Markdown parser\") }\n handler(this, tok, toks, i);\n }\n};\n\n// : (NodeType, ?Object, ?[Node]) → ?Node\n// Add a node at the current position.\nMarkdownParseState.prototype.addNode = function addNode (type, attrs, content) {\n var node = type.createAndFill(attrs, content, this.marks);\n if (!node) { return null }\n this.push(node);\n return node\n};\n\n// : (NodeType, ?Object)\n// Wrap subsequent content in a node of the given type.\nMarkdownParseState.prototype.openNode = function openNode (type, attrs) {\n this.stack.push({type: type, attrs: attrs, content: []});\n};\n\n// : () → ?Node\n// Close and return the node that is currently on top of the stack.\nMarkdownParseState.prototype.closeNode = function closeNode () {\n if (this.marks.length) { this.marks = Mark.none; }\n var info = this.stack.pop();\n return this.addNode(info.type, info.attrs, info.content)\n};\n\nfunction attrs(spec, token, tokens, i) {\n if (spec.getAttrs) { return spec.getAttrs(token, tokens, i) }\n // For backwards compatibility when `attrs` is a Function\n else if (spec.attrs instanceof Function) { return spec.attrs(token) }\n else { return spec.attrs }\n}\n\n// Code content is represented as a single token with a `content`\n// property in Markdown-it.\nfunction noCloseToken(spec, type) {\n return spec.noCloseToken || type == \"code_inline\" || type == \"code_block\" || type == \"fence\"\n}\n\nfunction withoutTrailingNewline(str) {\n return str[str.length - 1] == \"\\n\" ? str.slice(0, str.length - 1) : str\n}\n\nfunction noOp() {}\n\nfunction tokenHandlers(schema, tokens) {\n var handlers = Object.create(null);\n var loop = function ( type ) {\n var spec = tokens[type];\n if (spec.block) {\n var nodeType = schema.nodeType(spec.block);\n if (noCloseToken(spec, type)) {\n handlers[type] = function (state, tok, tokens, i) {\n state.openNode(nodeType, attrs(spec, tok, tokens, i));\n state.addText(withoutTrailingNewline(tok.content));\n state.closeNode();\n };\n } else {\n handlers[type + \"_open\"] = function (state, tok, tokens, i) { return state.openNode(nodeType, attrs(spec, tok, tokens, i)); };\n handlers[type + \"_close\"] = function (state) { return state.closeNode(); };\n }\n } else if (spec.node) {\n var nodeType$1 = schema.nodeType(spec.node);\n handlers[type] = function (state, tok, tokens, i) { return state.addNode(nodeType$1, attrs(spec, tok, tokens, i)); };\n } else if (spec.mark) {\n var markType = schema.marks[spec.mark];\n if (noCloseToken(spec, type)) {\n handlers[type] = function (state, tok, tokens, i) {\n state.openMark(markType.create(attrs(spec, tok, tokens, i)));\n state.addText(withoutTrailingNewline(tok.content));\n state.closeMark(markType);\n };\n } else {\n handlers[type + \"_open\"] = function (state, tok, tokens, i) { return state.openMark(markType.create(attrs(spec, tok, tokens, i))); };\n handlers[type + \"_close\"] = function (state) { return state.closeMark(markType); };\n }\n } else if (spec.ignore) {\n if (noCloseToken(spec, type)) {\n handlers[type] = noOp;\n } else {\n handlers[type + '_open'] = noOp;\n handlers[type + '_close'] = noOp;\n }\n } else {\n throw new RangeError(\"Unrecognized parsing spec \" + JSON.stringify(spec))\n }\n };\n\n for (var type in tokens) loop( type );\n\n handlers.text = function (state, tok) { return state.addText(tok.content); };\n handlers.inline = function (state, tok) { return state.parseTokens(tok.children); };\n handlers.softbreak = handlers.softbreak || (function (state) { return state.addText(\"\\n\"); });\n\n return handlers\n}\n\n// ::- A configuration of a Markdown parser. Such a parser uses\n// [markdown-it](https://github.com/markdown-it/markdown-it) to\n// tokenize a file, and then runs the custom rules it is given over\n// the tokens to create a ProseMirror document tree.\nvar MarkdownParser = function MarkdownParser(schema, tokenizer, tokens) {\n // :: Object The value of the `tokens` object used to construct\n // this parser. Can be useful to copy and modify to base other\n // parsers on.\n this.tokens = tokens;\n this.schema = schema;\n this.tokenizer = tokenizer;\n this.tokenHandlers = tokenHandlers(schema, tokens);\n};\n\n// :: (string) → Node\n// Parse a string as [CommonMark](http://commonmark.org/) markup,\n// and create a ProseMirror document as prescribed by this parser's\n// rules.\nMarkdownParser.prototype.parse = function parse (text) {\n var state = new MarkdownParseState(this.schema, this.tokenHandlers), doc;\n state.parseTokens(this.tokenizer.parse(text, {}));\n do { doc = state.closeNode(); } while (state.stack.length)\n return doc\n};\n\nfunction listIsTight(tokens, i) {\n while (++i < tokens.length)\n { if (tokens[i].type != \"list_item_open\") { return tokens[i].hidden } }\n return false\n}\n\n// :: MarkdownParser\n// A parser parsing unextended [CommonMark](http://commonmark.org/),\n// without inline HTML, and producing a document in the basic schema.\nvar defaultMarkdownParser = new MarkdownParser(schema, markdownit(\"commonmark\", {html: false}), {\n blockquote: {block: \"blockquote\"},\n paragraph: {block: \"paragraph\"},\n list_item: {block: \"list_item\"},\n bullet_list: {block: \"bullet_list\", getAttrs: function (_, tokens, i) { return ({tight: listIsTight(tokens, i)}); }},\n ordered_list: {block: \"ordered_list\", getAttrs: function (tok, tokens, i) { return ({\n order: +tok.attrGet(\"start\") || 1,\n tight: listIsTight(tokens, i)\n }); }},\n heading: {block: \"heading\", getAttrs: function (tok) { return ({level: +tok.tag.slice(1)}); }},\n code_block: {block: \"code_block\", noCloseToken: true},\n fence: {block: \"code_block\", getAttrs: function (tok) { return ({params: tok.info || \"\"}); }, noCloseToken: true},\n hr: {node: \"horizontal_rule\"},\n image: {node: \"image\", getAttrs: function (tok) { return ({\n src: tok.attrGet(\"src\"),\n title: tok.attrGet(\"title\") || null,\n alt: tok.children[0] && tok.children[0].content || null\n }); }},\n hardbreak: {node: \"hard_break\"},\n\n em: {mark: \"em\"},\n strong: {mark: \"strong\"},\n link: {mark: \"link\", getAttrs: function (tok) { return ({\n href: tok.attrGet(\"href\"),\n title: tok.attrGet(\"title\") || null\n }); }},\n code_inline: {mark: \"code\", noCloseToken: true}\n});\n\n// ::- A specification for serializing a ProseMirror document as\n// Markdown/CommonMark text.\nvar MarkdownSerializer = function MarkdownSerializer(nodes, marks) {\n // :: Object<(MarkdownSerializerState, Node)> The node serializer\n // functions for this serializer.\n this.nodes = nodes;\n // :: Object The mark serializer info.\n this.marks = marks;\n};\n\n// :: (Node, ?Object) → string\n// Serialize the content of the given node to\n// [CommonMark](http://commonmark.org/).\nMarkdownSerializer.prototype.serialize = function serialize (content, options) {\n var state = new MarkdownSerializerState(this.nodes, this.marks, options);\n state.renderContent(content);\n return state.out\n};\n\n// :: MarkdownSerializer\n// A serializer for the [basic schema](#schema).\nvar defaultMarkdownSerializer = new MarkdownSerializer({\n blockquote: function blockquote(state, node) {\n state.wrapBlock(\"> \", null, node, function () { return state.renderContent(node); });\n },\n code_block: function code_block(state, node) {\n state.write(\"```\" + (node.attrs.params || \"\") + \"\\n\");\n state.text(node.textContent, false);\n state.ensureNewLine();\n state.write(\"```\");\n state.closeBlock(node);\n },\n heading: function heading(state, node) {\n state.write(state.repeat(\"#\", node.attrs.level) + \" \");\n state.renderInline(node);\n state.closeBlock(node);\n },\n horizontal_rule: function horizontal_rule(state, node) {\n state.write(node.attrs.markup || \"---\");\n state.closeBlock(node);\n },\n bullet_list: function bullet_list(state, node) {\n state.renderList(node, \" \", function () { return (node.attrs.bullet || \"*\") + \" \"; });\n },\n ordered_list: function ordered_list(state, node) {\n var start = node.attrs.order || 1;\n var maxW = String(start + node.childCount - 1).length;\n var space = state.repeat(\" \", maxW + 2);\n state.renderList(node, space, function (i) {\n var nStr = String(start + i);\n return state.repeat(\" \", maxW - nStr.length) + nStr + \". \"\n });\n },\n list_item: function list_item(state, node) {\n state.renderContent(node);\n },\n paragraph: function paragraph(state, node) {\n state.renderInline(node);\n state.closeBlock(node);\n },\n\n image: function image(state, node) {\n state.write(\"![\" + state.esc(node.attrs.alt || \"\") + \"](\" + state.esc(node.attrs.src) +\n (node.attrs.title ? \" \" + state.quote(node.attrs.title) : \"\") + \")\");\n },\n hard_break: function hard_break(state, node, parent, index) {\n for (var i = index + 1; i < parent.childCount; i++)\n { if (parent.child(i).type != node.type) {\n state.write(\"\\\\\\n\");\n return\n } }\n },\n text: function text(state, node) {\n state.text(node.text);\n }\n}, {\n em: {open: \"*\", close: \"*\", mixable: true, expelEnclosingWhitespace: true},\n strong: {open: \"**\", close: \"**\", mixable: true, expelEnclosingWhitespace: true},\n link: {\n open: function open(_state, mark, parent, index) {\n return isPlainURL(mark, parent, index, 1) ? \"<\" : \"[\"\n },\n close: function close(state, mark, parent, index) {\n return isPlainURL(mark, parent, index, -1) ? \">\"\n : \"](\" + state.esc(mark.attrs.href) + (mark.attrs.title ? \" \" + state.quote(mark.attrs.title) : \"\") + \")\"\n }\n },\n code: {open: function open(_state, _mark, parent, index) { return backticksFor(parent.child(index), -1) },\n close: function close(_state, _mark, parent, index) { return backticksFor(parent.child(index - 1), 1) },\n escape: false}\n});\n\nfunction backticksFor(node, side) {\n var ticks = /`+/g, m, len = 0;\n if (node.isText) { while (m = ticks.exec(node.text)) { len = Math.max(len, m[0].length); } }\n var result = len > 0 && side > 0 ? \" `\" : \"`\";\n for (var i = 0; i < len; i++) { result += \"`\"; }\n if (len > 0 && side < 0) { result += \" \"; }\n return result\n}\n\nfunction isPlainURL(link, parent, index, side) {\n if (link.attrs.title || !/^\\w+:/.test(link.attrs.href)) { return false }\n var content = parent.child(index + (side < 0 ? -1 : 0));\n if (!content.isText || content.text != link.attrs.href || content.marks[content.marks.length - 1] != link) { return false }\n if (index == (side < 0 ? 1 : parent.childCount - 1)) { return true }\n var next = parent.child(index + (side < 0 ? -2 : 1));\n return !link.isInSet(next.marks)\n}\n\n// ::- This is an object used to track state and expose\n// methods related to markdown serialization. Instances are passed to\n// node and mark serialization methods (see `toMarkdown`).\nvar MarkdownSerializerState = function MarkdownSerializerState(nodes, marks, options) {\n this.nodes = nodes;\n this.marks = marks;\n this.delim = this.out = \"\";\n this.closed = false;\n this.inTightList = false;\n // :: Object\n // The options passed to the serializer.\n // tightLists:: ?bool\n // Whether to render lists in a tight style. This can be overridden\n // on a node level by specifying a tight attribute on the node.\n // Defaults to false.\n this.options = options || {};\n if (typeof this.options.tightLists == \"undefined\")\n { this.options.tightLists = false; }\n};\n\nMarkdownSerializerState.prototype.flushClose = function flushClose (size) {\n if (this.closed) {\n if (!this.atBlank()) { this.out += \"\\n\"; }\n if (size == null) { size = 2; }\n if (size > 1) {\n var delimMin = this.delim;\n var trim = /\\s+$/.exec(delimMin);\n if (trim) { delimMin = delimMin.slice(0, delimMin.length - trim[0].length); }\n for (var i = 1; i < size; i++)\n { this.out += delimMin + \"\\n\"; }\n }\n this.closed = false;\n }\n};\n\n// :: (string, ?string, Node, ())\n// Render a block, prefixing each line with `delim`, and the first\n// line in `firstDelim`. `node` should be the node that is closed at\n// the end of the block, and `f` is a function that renders the\n// content of the block.\nMarkdownSerializerState.prototype.wrapBlock = function wrapBlock (delim, firstDelim, node, f) {\n var old = this.delim;\n this.write(firstDelim || delim);\n this.delim += delim;\n f();\n this.delim = old;\n this.closeBlock(node);\n};\n\nMarkdownSerializerState.prototype.atBlank = function atBlank () {\n return /(^|\\n)$/.test(this.out)\n};\n\n// :: ()\n// Ensure the current content ends with a newline.\nMarkdownSerializerState.prototype.ensureNewLine = function ensureNewLine () {\n if (!this.atBlank()) { this.out += \"\\n\"; }\n};\n\n// :: (?string)\n// Prepare the state for writing output (closing closed paragraphs,\n// adding delimiters, and so on), and then optionally add content\n// (unescaped) to the output.\nMarkdownSerializerState.prototype.write = function write (content) {\n this.flushClose();\n if (this.delim && this.atBlank())\n { this.out += this.delim; }\n if (content) { this.out += content; }\n};\n\n// :: (Node)\n// Close the block for the given node.\nMarkdownSerializerState.prototype.closeBlock = function closeBlock (node) {\n this.closed = node;\n};\n\n// :: (string, ?bool)\n// Add the given text to the document. When escape is not `false`,\n// it will be escaped.\nMarkdownSerializerState.prototype.text = function text (text$1, escape) {\n var lines = text$1.split(\"\\n\");\n for (var i = 0; i < lines.length; i++) {\n var startOfLine = this.atBlank() || this.closed;\n this.write();\n this.out += escape !== false ? this.esc(lines[i], startOfLine) : lines[i];\n if (i != lines.length - 1) { this.out += \"\\n\"; }\n }\n};\n\n// :: (Node)\n// Render the given node as a block.\nMarkdownSerializerState.prototype.render = function render (node, parent, index) {\n if (typeof parent == \"number\") { throw new Error(\"!\") }\n if (!this.nodes[node.type.name]) { throw new Error(\"Token type `\" + node.type.name + \"` not supported by Markdown renderer\") }\n this.nodes[node.type.name](this, node, parent, index);\n};\n\n// :: (Node)\n// Render the contents of `parent` as block nodes.\nMarkdownSerializerState.prototype.renderContent = function renderContent (parent) {\n var this$1 = this;\n\n parent.forEach(function (node, _, i) { return this$1.render(node, parent, i); });\n};\n\n// :: (Node)\n// Render the contents of `parent` as inline content.\nMarkdownSerializerState.prototype.renderInline = function renderInline (parent) {\n var this$1 = this;\n\n var active = [], trailing = \"\";\n var progress = function (node, _, index) {\n var marks = node ? node.marks : [];\n\n // Remove marks from `hard_break` that are the last node inside\n // that mark to prevent parser edge cases with new lines just\n // before closing marks.\n // (FIXME it'd be nice if we had a schema-agnostic way to\n // identify nodes that serialize as hard breaks)\n if (node && node.type.name === \"hard_break\")\n { marks = marks.filter(function (m) {\n if (index + 1 == parent.childCount) { return false }\n var next = parent.child(index + 1);\n return m.isInSet(next.marks) && (!next.isText || /\\S/.test(next.text))\n }); }\n\n var leading = trailing;\n trailing = \"\";\n // If whitespace has to be expelled from the node, adjust\n // leading and trailing accordingly.\n if (node && node.isText && marks.some(function (mark) {\n var info = this$1.marks[mark.type.name];\n return info && info.expelEnclosingWhitespace\n })) {\n var ref = /^(\\s*)(.*?)(\\s*)$/m.exec(node.text);\n var _$1 = ref[0];\n var lead = ref[1];\n var inner$1 = ref[2];\n var trail = ref[3];\n leading += lead;\n trailing = trail;\n if (lead || trail) {\n node = inner$1 ? node.withText(inner$1) : null;\n if (!node) { marks = active; }\n }\n }\n\n var inner = marks.length && marks[marks.length - 1], noEsc = inner && this$1.marks[inner.type.name].escape === false;\n var len = marks.length - (noEsc ? 1 : 0);\n\n // Try to reorder 'mixable' marks, such as em and strong, which\n // in Markdown may be opened and closed in different order, so\n // that order of the marks for the token matches the order in\n // active.\n outer: for (var i = 0; i < len; i++) {\n var mark = marks[i];\n if (!this$1.marks[mark.type.name].mixable) { break }\n for (var j = 0; j < active.length; j++) {\n var other = active[j];\n if (!this$1.marks[other.type.name].mixable) { break }\n if (mark.eq(other)) {\n if (i > j)\n { marks = marks.slice(0, j).concat(mark).concat(marks.slice(j, i)).concat(marks.slice(i + 1, len)); }\n else if (j > i)\n { marks = marks.slice(0, i).concat(marks.slice(i + 1, j)).concat(mark).concat(marks.slice(j, len)); }\n continue outer\n }\n }\n }\n\n // Find the prefix of the mark set that didn't change\n var keep = 0;\n while (keep < Math.min(active.length, len) && marks[keep].eq(active[keep])) { ++keep; }\n\n // Close the marks that need to be closed\n while (keep < active.length)\n { this$1.text(this$1.markString(active.pop(), false, parent, index), false); }\n\n // Output any previously expelled trailing whitespace outside the marks\n if (leading) { this$1.text(leading); }\n\n // Open the marks that need to be opened\n if (node) {\n while (active.length < len) {\n var add = marks[active.length];\n active.push(add);\n this$1.text(this$1.markString(add, true, parent, index), false);\n }\n\n // Render the node. Special case code marks, since their content\n // may not be escaped.\n if (noEsc && node.isText)\n { this$1.text(this$1.markString(inner, true, parent, index) + node.text +\n this$1.markString(inner, false, parent, index + 1), false); }\n else\n { this$1.render(node, parent, index); }\n }\n };\n parent.forEach(progress);\n progress(null, null, parent.childCount);\n};\n\n// :: (Node, string, (number) → string)\n// Render a node's content as a list. `delim` should be the extra\n// indentation added to all lines except the first in an item,\n// `firstDelim` is a function going from an item index to a\n// delimiter for the first line of the item.\nMarkdownSerializerState.prototype.renderList = function renderList (node, delim, firstDelim) {\n var this$1 = this;\n\n if (this.closed && this.closed.type == node.type)\n { this.flushClose(3); }\n else if (this.inTightList)\n { this.flushClose(1); }\n\n var isTight = typeof node.attrs.tight != \"undefined\" ? node.attrs.tight : this.options.tightLists;\n var prevTight = this.inTightList;\n this.inTightList = isTight;\n node.forEach(function (child, _, i) {\n if (i && isTight) { this$1.flushClose(1); }\n this$1.wrapBlock(delim, firstDelim(i), node, function () { return this$1.render(child, node, i); });\n });\n this.inTightList = prevTight;\n};\n\n// :: (string, ?bool) → string\n// Escape the given string so that it can safely appear in Markdown\n// content. If `startOfLine` is true, also escape characters that\n// have special meaning only at the start of the line.\nMarkdownSerializerState.prototype.esc = function esc (str, startOfLine) {\n str = str.replace(/[`*\\\\~\\[\\]]/g, \"\\\\$&\");\n if (startOfLine) { str = str.replace(/^[:#\\-*+]/, \"\\\\$&\").replace(/^(\\s*\\d+)\\./, \"$1\\\\.\"); }\n return str\n};\n\nMarkdownSerializerState.prototype.quote = function quote (str) {\n var wrap = str.indexOf('\"') == -1 ? '\"\"' : str.indexOf(\"'\") == -1 ? \"''\" : \"()\";\n return wrap[0] + str + wrap[1]\n};\n\n// :: (string, number) → string\n// Repeat the given string `n` times.\nMarkdownSerializerState.prototype.repeat = function repeat (str, n) {\n var out = \"\";\n for (var i = 0; i < n; i++) { out += str; }\n return out\n};\n\n// : (Mark, bool, string?) → string\n// Get the markdown string for a given opening or closing mark.\nMarkdownSerializerState.prototype.markString = function markString (mark, open, parent, index) {\n var info = this.marks[mark.type.name];\n var value = open ? info.open : info.close;\n return typeof value == \"string\" ? value : value(this, mark, parent, index)\n};\n\n// :: (string) → { leading: ?string, trailing: ?string }\n// Get leading and trailing whitespace from a string. Values of\n// leading or trailing property of the return object will be undefined\n// if there is no match.\nMarkdownSerializerState.prototype.getEnclosingWhitespace = function getEnclosingWhitespace (text) {\n return {\n leading: (text.match(/^(\\s+)/) || [])[0],\n trailing: (text.match(/(\\s+)$/) || [])[0]\n }\n};\n\nexport { MarkdownParser, MarkdownSerializer, MarkdownSerializerState, defaultMarkdownParser, defaultMarkdownSerializer, schema };\n//# sourceMappingURL=index.es.js.map\n","import { findWrapping, ReplaceAroundStep, canSplit, liftTarget } from 'prosemirror-transform';\nimport { NodeRange, Fragment, Slice } from 'prosemirror-model';\n\nvar olDOM = [\"ol\", 0], ulDOM = [\"ul\", 0], liDOM = [\"li\", 0];\n\n// :: NodeSpec\n// An ordered list [node spec](#model.NodeSpec). Has a single\n// attribute, `order`, which determines the number at which the list\n// starts counting, and defaults to 1. Represented as an `
            `\n// element.\nvar orderedList = {\n attrs: {order: {default: 1}},\n parseDOM: [{tag: \"ol\", getAttrs: function getAttrs(dom) {\n return {order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\") : 1}\n }}],\n toDOM: function toDOM(node) {\n return node.attrs.order == 1 ? olDOM : [\"ol\", {start: node.attrs.order}, 0]\n }\n};\n\n// :: NodeSpec\n// A bullet list node spec, represented in the DOM as `
              `.\nvar bulletList = {\n parseDOM: [{tag: \"ul\"}],\n toDOM: function toDOM() { return ulDOM }\n};\n\n// :: NodeSpec\n// A list item (`
            • `) spec.\nvar listItem = {\n parseDOM: [{tag: \"li\"}],\n toDOM: function toDOM() { return liDOM },\n defining: true\n};\n\nfunction add(obj, props) {\n var copy = {};\n for (var prop in obj) { copy[prop] = obj[prop]; }\n for (var prop$1 in props) { copy[prop$1] = props[prop$1]; }\n return copy\n}\n\n// :: (OrderedMap, string, ?string) → OrderedMap\n// Convenience function for adding list-related node types to a map\n// specifying the nodes for a schema. Adds\n// [`orderedList`](#schema-list.orderedList) as `\"ordered_list\"`,\n// [`bulletList`](#schema-list.bulletList) as `\"bullet_list\"`, and\n// [`listItem`](#schema-list.listItem) as `\"list_item\"`.\n//\n// `itemContent` determines the content expression for the list items.\n// If you want the commands defined in this module to apply to your\n// list structure, it should have a shape like `\"paragraph block*\"` or\n// `\"paragraph (ordered_list | bullet_list)*\"`. `listGroup` can be\n// given to assign a group name to the list node types, for example\n// `\"block\"`.\nfunction addListNodes(nodes, itemContent, listGroup) {\n return nodes.append({\n ordered_list: add(orderedList, {content: \"list_item+\", group: listGroup}),\n bullet_list: add(bulletList, {content: \"list_item+\", group: listGroup}),\n list_item: add(listItem, {content: itemContent})\n })\n}\n\n// :: (NodeType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Returns a command function that wraps the selection in a list with\n// the given type an attributes. If `dispatch` is null, only return a\n// value to indicate whether this is possible, but don't actually\n// perform the change.\nfunction wrapInList(listType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to), doJoin = false, outerRange = range;\n if (!range) { return false }\n // This is at the top of an existing list item\n if (range.depth >= 2 && $from.node(range.depth - 1).type.compatibleContent(listType) && range.startIndex == 0) {\n // Don't do anything if this is the top of the list\n if ($from.index(range.depth - 1) == 0) { return false }\n var $insert = state.doc.resolve(range.start - 2);\n outerRange = new NodeRange($insert, $insert, range.depth);\n if (range.endIndex < range.parent.childCount)\n { range = new NodeRange($from, state.doc.resolve($to.end(range.depth)), range.depth); }\n doJoin = true;\n }\n var wrap = findWrapping(outerRange, listType, attrs, range);\n if (!wrap) { return false }\n if (dispatch) { dispatch(doWrapInList(state.tr, range, wrap, doJoin, listType).scrollIntoView()); }\n return true\n }\n}\n\nfunction doWrapInList(tr, range, wrappers, joinBefore, listType) {\n var content = Fragment.empty;\n for (var i = wrappers.length - 1; i >= 0; i--)\n { content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content)); }\n\n tr.step(new ReplaceAroundStep(range.start - (joinBefore ? 2 : 0), range.end, range.start, range.end,\n new Slice(content, 0, 0), wrappers.length, true));\n\n var found = 0;\n for (var i$1 = 0; i$1 < wrappers.length; i$1++) { if (wrappers[i$1].type == listType) { found = i$1 + 1; } }\n var splitDepth = wrappers.length - found;\n\n var splitPos = range.start + wrappers.length - (joinBefore ? 2 : 0), parent = range.parent;\n for (var i$2 = range.startIndex, e = range.endIndex, first = true; i$2 < e; i$2++, first = false) {\n if (!first && canSplit(tr.doc, splitPos, splitDepth)) {\n tr.split(splitPos, splitDepth);\n splitPos += 2 * splitDepth;\n }\n splitPos += parent.child(i$2).nodeSize;\n }\n return tr\n}\n\n// :: (NodeType) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Build a command that splits a non-empty textblock at the top level\n// of a list item by also splitting that list item.\nfunction splitListItem(itemType) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var node = ref.node;\n if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to)) { return false }\n var grandParent = $from.node(-1);\n if (grandParent.type != itemType) { return false }\n if ($from.parent.content.size == 0 && $from.node(-1).childCount == $from.indexAfter(-1)) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if ($from.depth == 2 || $from.node(-3).type != itemType ||\n $from.index(-2) != $from.node(-2).childCount - 1) { return false }\n if (dispatch) {\n var wrap = Fragment.empty, keepItem = $from.index(-1) > 0;\n // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n for (var d = $from.depth - (keepItem ? 1 : 2); d >= $from.depth - 3; d--)\n { wrap = Fragment.from($from.node(d).copy(wrap)); }\n // Add a second list item with an empty default start node\n wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n var tr$1 = state.tr.replace($from.before(keepItem ? null : -1), $from.after(-3), new Slice(wrap, keepItem ? 3 : 2, 2));\n tr$1.setSelection(state.selection.constructor.near(tr$1.doc.resolve($from.pos + (keepItem ? 3 : 2))));\n dispatch(tr$1.scrollIntoView());\n }\n return true\n }\n var nextType = $to.pos == $from.end() ? grandParent.contentMatchAt(0).defaultType : null;\n var tr = state.tr.delete($from.pos, $to.pos);\n var types = nextType && [null, {type: nextType}];\n if (!canSplit(tr.doc, $from.pos, 2, types)) { return false }\n if (dispatch) { dispatch(tr.split($from.pos, 2, types).scrollIntoView()); }\n return true\n }\n}\n\n// :: (NodeType) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Create a command to lift the list item around the selection up into\n// a wrapping list.\nfunction liftListItem(itemType) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to, function (node) { return node.childCount && node.firstChild.type == itemType; });\n if (!range) { return false }\n if (!dispatch) { return true }\n if ($from.node(range.depth - 1).type == itemType) // Inside a parent list\n { return liftToOuterList(state, dispatch, itemType, range) }\n else // Outer list node\n { return liftOutOfList(state, dispatch, range) }\n }\n}\n\nfunction liftToOuterList(state, dispatch, itemType, range) {\n var tr = state.tr, end = range.end, endOfList = range.$to.end(range.depth);\n if (end < endOfList) {\n // There are siblings after the lifted items, which must become\n // children of the last item\n tr.step(new ReplaceAroundStep(end - 1, endOfList, end, endOfList,\n new Slice(Fragment.from(itemType.create(null, range.parent.copy())), 1, 0), 1, true));\n range = new NodeRange(tr.doc.resolve(range.$from.pos), tr.doc.resolve(endOfList), range.depth);\n }\n dispatch(tr.lift(range, liftTarget(range)).scrollIntoView());\n return true\n}\n\nfunction liftOutOfList(state, dispatch, range) {\n var tr = state.tr, list = range.parent;\n // Merge the list items into a single big item\n for (var pos = range.end, i = range.endIndex - 1, e = range.startIndex; i > e; i--) {\n pos -= list.child(i).nodeSize;\n tr.delete(pos - 1, pos + 1);\n }\n var $start = tr.doc.resolve(range.start), item = $start.nodeAfter;\n var atStart = range.startIndex == 0, atEnd = range.endIndex == list.childCount;\n var parent = $start.node(-1), indexBefore = $start.index(-1);\n if (!parent.canReplace(indexBefore + (atStart ? 0 : 1), indexBefore + 1,\n item.content.append(atEnd ? Fragment.empty : Fragment.from(list))))\n { return false }\n var start = $start.pos, end = start + item.nodeSize;\n // Strip off the surrounding list. At the sides where we're not at\n // the end of the list, the existing list is closed. At sides where\n // this is the end, it is overwritten to its end.\n tr.step(new ReplaceAroundStep(start - (atStart ? 1 : 0), end + (atEnd ? 1 : 0), start + 1, end - 1,\n new Slice((atStart ? Fragment.empty : Fragment.from(list.copy(Fragment.empty)))\n .append(atEnd ? Fragment.empty : Fragment.from(list.copy(Fragment.empty))),\n atStart ? 0 : 1, atEnd ? 0 : 1), atStart ? 0 : 1));\n dispatch(tr.scrollIntoView());\n return true\n}\n\n// :: (NodeType) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Create a command to sink the list item around the selection down\n// into an inner list.\nfunction sinkListItem(itemType) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to, function (node) { return node.childCount && node.firstChild.type == itemType; });\n if (!range) { return false }\n var startIndex = range.startIndex;\n if (startIndex == 0) { return false }\n var parent = range.parent, nodeBefore = parent.child(startIndex - 1);\n if (nodeBefore.type != itemType) { return false }\n\n if (dispatch) {\n var nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type == parent.type;\n var inner = Fragment.from(nestedBefore ? itemType.create() : null);\n var slice = new Slice(Fragment.from(itemType.create(null, Fragment.from(parent.type.create(null, inner)))),\n nestedBefore ? 3 : 1, 0);\n var before = range.start, after = range.end;\n dispatch(state.tr.step(new ReplaceAroundStep(before - (nestedBefore ? 3 : 1), after,\n before, after, slice, 1, true))\n .scrollIntoView());\n }\n return true\n }\n}\n\nexport { addListNodes, bulletList, liftListItem, listItem, orderedList, sinkListItem, splitListItem, wrapInList };\n//# sourceMappingURL=index.es.js.map\n","module.exports = flarum.core.compat['common/components/Tooltip'];","import Component from 'flarum/common/Component';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport icon from 'flarum/common/helpers/icon';\nimport extractText from 'flarum/common/utils/extractText';\n\nexport default class CommandButton extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n this.state.addItem(this.attrs.type, this.attrs.command, this.onEditorUpdate.bind(this));\n }\n\n view() {\n return (\n \n \n \n );\n }\n\n keydown(e) {\n if (e.key === ' ' || e.key === 'Enter') {\n this.click(e);\n }\n }\n\n click(e) {\n e.preventDefault();\n return this.state.run(this.attrs.type);\n }\n\n title() {\n let tooltip = app.translator.trans(`askvortsov-rich-text.lib.composer.${this.attrs.type}_tooltip`);\n\n return tooltip;\n }\n\n onEditorUpdate() {}\n}\n","module.exports = flarum.core.compat['common/utils/extractText'];","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","\n /*!\n * tiptap-utils v1.13.0\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { NodeSelection } from 'prosemirror-state';\n\nfunction createCell(cellType, cellContent) {\n if (cellContent) {\n return cellType.createChecked(null, cellContent);\n }\n\n return cellType.createAndFill();\n}\n\nfunction getTableNodeTypes(schema) {\n if (schema.cached.tableNodeTypes) {\n return schema.cached.tableNodeTypes;\n }\n\n const roles = {};\n Object.keys(schema.nodes).forEach(type => {\n const nodeType = schema.nodes[type];\n\n if (nodeType.spec.tableRole) {\n roles[nodeType.spec.tableRole] = nodeType;\n }\n }); // eslint-disable-next-line\n\n schema.cached.tableNodeTypes = roles;\n return roles;\n}\n\nfunction createTable(schema, rowsCount, colsCount, withHeaderRow, cellContent) {\n const types = getTableNodeTypes(schema);\n const headerCells = [];\n const cells = [];\n\n for (let index = 0; index < colsCount; index += 1) {\n const cell = createCell(types.cell, cellContent);\n\n if (cell) {\n cells.push(cell);\n }\n\n if (withHeaderRow) {\n const headerCell = createCell(types.header_cell, cellContent);\n\n if (headerCell) {\n headerCells.push(headerCell);\n }\n }\n }\n\n const rows = [];\n\n for (let index = 0; index < rowsCount; index += 1) {\n rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells));\n }\n\n return types.table.createChecked(null, rows);\n}\n\nfunction equalNodeType(nodeType, node) {\n return Array.isArray(nodeType) && nodeType.indexOf(node.type) > -1 || node.type === nodeType;\n}\n\nfunction flatten(node) {\n // eslint-disable-next-line\n const descend = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!node) {\n throw new Error('Invalid \"node\" parameter');\n }\n\n const result = []; // eslint-disable-next-line\n\n node.descendants((child, pos) => {\n result.push({\n node: child,\n pos\n });\n\n if (!descend) {\n return false;\n }\n });\n return result;\n}\n\nfunction findChildren(node, predicate, descend) {\n if (!node) {\n throw new Error('Invalid \"node\" parameter');\n } else if (!predicate) {\n throw new Error('Invalid \"predicate\" parameter');\n }\n\n return flatten(node, descend).filter(child => predicate(child.node));\n}\n\nfunction findBlockNodes(node, descend) {\n return findChildren(node, child => child.isBlock, descend);\n}\n\n// eslint-disable-next-line\nfunction findParentNodeClosestToPos($pos, predicate) {\n for (let i = $pos.depth; i > 0; i -= 1) {\n const node = $pos.node(i);\n\n if (predicate(node)) {\n return {\n pos: i > 0 ? $pos.before(i) : 0,\n start: $pos.start(i),\n depth: i,\n node\n };\n }\n }\n}\n\nfunction findParentNode(predicate) {\n return selection => findParentNodeClosestToPos(selection.$from, predicate);\n}\n\nfunction isNodeSelection(selection) {\n return selection instanceof NodeSelection;\n}\n\nfunction findSelectedNodeOfType(nodeType) {\n // eslint-disable-next-line\n return function (selection) {\n if (isNodeSelection(selection)) {\n const {\n node\n } = selection;\n const {\n $from\n } = selection;\n\n if (equalNodeType(nodeType, node)) {\n return {\n node,\n pos: $from.pos,\n depth: $from.depth\n };\n }\n }\n };\n}\n\nfunction getMarkAttrs(state, type) {\n const {\n from,\n to\n } = state.selection;\n let marks = [];\n state.doc.nodesBetween(from, to, node => {\n marks = [...marks, ...node.marks];\n });\n const mark = marks.find(markItem => markItem.type.name === type.name);\n\n if (mark) {\n return mark.attrs;\n }\n\n return {};\n}\n\nfunction getMarkRange($pos = null, type = null) {\n if (!$pos || !type) {\n return false;\n }\n\n const start = $pos.parent.childAfter($pos.parentOffset);\n\n if (!start.node) {\n return false;\n }\n\n const link = start.node.marks.find(mark => mark.type === type);\n\n if (!link) {\n return false;\n }\n\n let startIndex = $pos.index();\n let startPos = $pos.start() + start.offset;\n let endIndex = startIndex + 1;\n let endPos = startPos + start.node.nodeSize;\n\n while (startIndex > 0 && link.isInSet($pos.parent.child(startIndex - 1).marks)) {\n startIndex -= 1;\n startPos -= $pos.parent.child(startIndex).nodeSize;\n }\n\n while (endIndex < $pos.parent.childCount && link.isInSet($pos.parent.child(endIndex).marks)) {\n endPos += $pos.parent.child(endIndex).nodeSize;\n endIndex += 1;\n }\n\n return {\n from: startPos,\n to: endPos\n };\n}\n\nfunction getNodeAttrs(state, type) {\n const {\n from,\n to\n } = state.selection;\n let nodes = [];\n state.doc.nodesBetween(from, to, node => {\n nodes = [...nodes, node];\n });\n const node = nodes.reverse().find(nodeItem => nodeItem.type.name === type.name);\n\n if (node) {\n return node.attrs;\n }\n\n return {};\n}\n\nfunction markIsActive(state, type) {\n const {\n from,\n $from,\n to,\n empty\n } = state.selection;\n\n if (empty) {\n return !!type.isInSet(state.storedMarks || $from.marks());\n }\n\n return !!state.doc.rangeHasMark(from, to, type);\n}\n\nfunction nodeEqualsType({\n types,\n node\n}) {\n return Array.isArray(types) && types.includes(node.type) || node.type === types;\n}\n\nfunction nodeIsActive(state, type, attrs = {}) {\n const predicate = node => node.type === type;\n\n const node = findSelectedNodeOfType(type)(state.selection) || findParentNode(predicate)(state.selection);\n\n if (!Object.keys(attrs).length || !node) {\n return !!node;\n }\n\n return node.node.hasMarkup(type, { ...node.node.attrs,\n ...attrs\n });\n}\n\nexport { createCell, createTable, equalNodeType, findBlockNodes, findChildren, findParentNode, findParentNodeClosestToPos, findSelectedNodeOfType, flatten, getMarkAttrs, getMarkRange, getNodeAttrs, getTableNodeTypes, isNodeSelection, markIsActive, nodeEqualsType, nodeIsActive };\n","import { toggleMark } from 'tiptap-commands';\nimport CommandButton from './CommandButton';\n\nexport default class MarkButton extends CommandButton {\n static initAttrs(attrs) {\n attrs.command = toggleMark(attrs.mark);\n }\n\n onEditorUpdate() {\n this.$().toggleClass('active', !!this.state.markActive(this.attrs.mark));\n }\n}\n","export var base = {\n 8: \"Backspace\",\n 9: \"Tab\",\n 10: \"Enter\",\n 12: \"NumLock\",\n 13: \"Enter\",\n 16: \"Shift\",\n 17: \"Control\",\n 18: \"Alt\",\n 20: \"CapsLock\",\n 27: \"Escape\",\n 32: \" \",\n 33: \"PageUp\",\n 34: \"PageDown\",\n 35: \"End\",\n 36: \"Home\",\n 37: \"ArrowLeft\",\n 38: \"ArrowUp\",\n 39: \"ArrowRight\",\n 40: \"ArrowDown\",\n 44: \"PrintScreen\",\n 45: \"Insert\",\n 46: \"Delete\",\n 59: \";\",\n 61: \"=\",\n 91: \"Meta\",\n 92: \"Meta\",\n 106: \"*\",\n 107: \"+\",\n 108: \",\",\n 109: \"-\",\n 110: \".\",\n 111: \"/\",\n 144: \"NumLock\",\n 145: \"ScrollLock\",\n 160: \"Shift\",\n 161: \"Shift\",\n 162: \"Control\",\n 163: \"Control\",\n 164: \"Alt\",\n 165: \"Alt\",\n 173: \"-\",\n 186: \";\",\n 187: \"=\",\n 188: \",\",\n 189: \"-\",\n 190: \".\",\n 191: \"/\",\n 192: \"`\",\n 219: \"[\",\n 220: \"\\\\\",\n 221: \"]\",\n 222: \"'\",\n 229: \"q\"\n}\n\nexport var shift = {\n 48: \")\",\n 49: \"!\",\n 50: \"@\",\n 51: \"#\",\n 52: \"$\",\n 53: \"%\",\n 54: \"^\",\n 55: \"&\",\n 56: \"*\",\n 57: \"(\",\n 59: \":\",\n 61: \"+\",\n 173: \"_\",\n 186: \":\",\n 187: \"+\",\n 188: \"<\",\n 189: \"_\",\n 190: \">\",\n 191: \"?\",\n 192: \"~\",\n 219: \"{\",\n 220: \"|\",\n 221: \"}\",\n 222: \"\\\"\",\n 229: \"Q\"\n}\n\nvar chrome = typeof navigator != \"undefined\" && /Chrome\\/(\\d+)/.exec(navigator.userAgent)\nvar safari = typeof navigator != \"undefined\" && /Apple Computer/.test(navigator.vendor)\nvar gecko = typeof navigator != \"undefined\" && /Gecko\\/\\d+/.test(navigator.userAgent)\nvar mac = typeof navigator != \"undefined\" && /Mac/.test(navigator.platform)\nvar ie = typeof navigator != \"undefined\" && /MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent)\nvar brokenModifierNames = chrome && (mac || +chrome[1] < 57) || gecko && mac\n\n// Fill in the digit keys\nfor (var i = 0; i < 10; i++) base[48 + i] = base[96 + i] = String(i)\n\n// The function keys\nfor (var i = 1; i <= 24; i++) base[i + 111] = \"F\" + i\n\n// And the alphabetic keys\nfor (var i = 65; i <= 90; i++) {\n base[i] = String.fromCharCode(i + 32)\n shift[i] = String.fromCharCode(i)\n}\n\n// For each code that doesn't have a shift-equivalent, copy the base name\nfor (var code in base) if (!shift.hasOwnProperty(code)) shift[code] = base[code]\n\nexport function keyName(event) {\n // Don't trust event.key in Chrome when there are modifiers until\n // they fix https://bugs.chromium.org/p/chromium/issues/detail?id=633838\n var ignoreKey = brokenModifierNames && (event.ctrlKey || event.altKey || event.metaKey) ||\n (safari || ie) && event.shiftKey && event.key && event.key.length == 1\n var name = (!ignoreKey && event.key) ||\n (event.shiftKey ? shift : base)[event.keyCode] ||\n event.key || \"Unidentified\"\n // Edge sometimes produces wrong names (Issue #3)\n if (name == \"Esc\") name = \"Escape\"\n if (name == \"Del\") name = \"Delete\"\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/\n if (name == \"Left\") name = \"ArrowLeft\"\n if (name == \"Up\") name = \"ArrowUp\"\n if (name == \"Right\") name = \"ArrowRight\"\n if (name == \"Down\") name = \"ArrowDown\"\n return name\n}\n","import { keyName, base } from 'w3c-keyname';\nimport { Plugin } from 'prosemirror-state';\n\n// declare global: navigator\n\nvar mac = typeof navigator != \"undefined\" ? /Mac/.test(navigator.platform) : false;\n\nfunction normalizeKeyName(name) {\n var parts = name.split(/-(?!$)/), result = parts[parts.length - 1];\n if (result == \"Space\") { result = \" \"; }\n var alt, ctrl, shift, meta;\n for (var i = 0; i < parts.length - 1; i++) {\n var mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod)) { meta = true; }\n else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n else if (/^mod$/i.test(mod)) { if (mac) { meta = true; } else { ctrl = true; } }\n else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n }\n if (alt) { result = \"Alt-\" + result; }\n if (ctrl) { result = \"Ctrl-\" + result; }\n if (meta) { result = \"Meta-\" + result; }\n if (shift) { result = \"Shift-\" + result; }\n return result\n}\n\nfunction normalize(map) {\n var copy = Object.create(null);\n for (var prop in map) { copy[normalizeKeyName(prop)] = map[prop]; }\n return copy\n}\n\nfunction modifiers(name, event, shift) {\n if (event.altKey) { name = \"Alt-\" + name; }\n if (event.ctrlKey) { name = \"Ctrl-\" + name; }\n if (event.metaKey) { name = \"Meta-\" + name; }\n if (shift !== false && event.shiftKey) { name = \"Shift-\" + name; }\n return name\n}\n\n// :: (Object) → Plugin\n// Create a keymap plugin for the given set of bindings.\n//\n// Bindings should map key names to [command](#commands)-style\n// functions, which will be called with `(EditorState, dispatch,\n// EditorView)` arguments, and should return true when they've handled\n// the key. Note that the view argument isn't part of the command\n// protocol, but can be used as an escape hatch if a binding needs to\n// directly interact with the UI.\n//\n// Key names may be strings like `\"Shift-Ctrl-Enter\"`—a key\n// identifier prefixed with zero or more modifiers. Key identifiers\n// are based on the strings that can appear in\n// [`KeyEvent.key`](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).\n// Use lowercase letters to refer to letter keys (or uppercase letters\n// if you want shift to be held). You may use `\"Space\"` as an alias\n// for the `\" \"` name.\n//\n// Modifiers can be given in any order. `Shift-` (or `s-`), `Alt-` (or\n// `a-`), `Ctrl-` (or `c-` or `Control-`) and `Cmd-` (or `m-` or\n// `Meta-`) are recognized. For characters that are created by holding\n// shift, the `Shift-` prefix is implied, and should not be added\n// explicitly.\n//\n// You can use `Mod-` as a shorthand for `Cmd-` on Mac and `Ctrl-` on\n// other platforms.\n//\n// You can add multiple keymap plugins to an editor. The order in\n// which they appear determines their precedence (the ones early in\n// the array get to dispatch first).\nfunction keymap(bindings) {\n return new Plugin({props: {handleKeyDown: keydownHandler(bindings)}})\n}\n\n// :: (Object) → (view: EditorView, event: dom.Event) → bool\n// Given a set of bindings (using the same format as\n// [`keymap`](#keymap.keymap), return a [keydown\n// handler](#view.EditorProps.handleKeyDown) that handles them.\nfunction keydownHandler(bindings) {\n var map = normalize(bindings);\n return function(view, event) {\n var name = keyName(event), isChar = name.length == 1 && name != \" \", baseName;\n var direct = map[modifiers(name, event, !isChar)];\n if (direct && direct(view.state, view.dispatch, view)) { return true }\n if (isChar && (event.shiftKey || event.altKey || event.metaKey || name.charCodeAt(0) > 127) &&\n (baseName = base[event.keyCode]) && baseName != name) {\n // Try falling back to the keyCode when there's a modifier\n // active or the character produced isn't ASCII, and our table\n // produces a different name from the the keyCode. See #668,\n // #1060\n var fromCode = map[modifiers(baseName, event, true)];\n if (fromCode && fromCode(view.state, view.dispatch, view)) { return true }\n } else if (isChar && event.shiftKey) {\n // Otherwise, if shift is active, also try the binding with the\n // Shift- prefix enabled. See #997\n var withShift = map[modifiers(name, event, true)];\n if (withShift && withShift(view.state, view.dispatch, view)) { return true }\n }\n return false\n }\n}\n\nexport { keydownHandler, keymap };\n//# sourceMappingURL=index.es.js.map\n","module.exports = flarum.core.compat['common/utils/ItemList'];","module.exports = flarum.core.compat['common/utils/Stream'];","module.exports = flarum.core.compat['common/components/Button'];","module.exports = flarum.core.compat['common/helpers/icon'];","module.exports = flarum.core.compat['common/components/Dropdown'];","import Modal from 'flarum/common/components/Modal';\n\nexport default class SafariModalHack extends Modal {\n className() {\n return 'LoadingModal Modal--small';\n }\n\n title() {\n return this.attrs.title;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$('.CommandButton').on('click', () => {\n app.modal.close();\n });\n }\n\n content() {\n const onsubmit = this.attrs.onsubmit ? this.attrs.onsubmit.bind(this) : () => {};\n return (\n
              \n
              \n {this.attrs.vnodeContent}\n
              \n
              \n );\n }\n}\n","import Button from 'flarum/common/components/Button';\nimport Dropdown from 'flarum/common/components/Dropdown';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport icon from 'flarum/common/helpers/icon';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport SafariModalHack from './SafariModalHack';\n\nexport default class FormDropdown extends Dropdown {\n static initAttrs(attrs) {\n attrs.buttonClassName = 'Button Button--icon Button--link Button--menuDropdown';\n }\n\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$().on('click', (e) => {\n if ($('.App').is('.mobile-safari')) {\n // Mobile Safari doesn't support fixed items\n // So, we wrap them in a modal.\n app.modal.show(SafariModalHack, {\n title: this.attrs.tooltip,\n vnodeContent: this.fields().toArray(),\n onsubmit: this.onsubmit.bind(this),\n });\n e.stopPropagation();\n }\n });\n\n this.$().on('shown.bs.dropdown', () => {\n this.$('.Dropdown-menu').find('input, select, textarea').first().focus().select();\n });\n }\n\n getButtonContent(children) {\n return (\n \n {icon(this.attrs.icon)}\n \n );\n }\n\n getMenu(items) {\n return (\n
                \n
                \n {this.fields().toArray()}\n
                \n
              \n );\n }\n\n fields() {\n const items = new ItemList();\n\n items.add(\n 'insert',\n \n );\n\n return items;\n }\n\n onsubmit(e) {\n // Here for the safari workaround\n app.modal.close();\n e.preventDefault();\n $('body').trigger('click');\n this.insert(e);\n app.composer.editor.focus();\n }\n\n insert(e) {}\n}\n","module.exports = flarum.core.compat['common/extend'];","import CommandButton from './CommandButton';\nimport { toggleList } from 'tiptap-commands';\n\nexport default class ListButton extends CommandButton {\n oninit(vnode) {\n vnode.attrs.command = (state, dispatch) => {\n return toggleList(vnode.attrs.listType, this.active ? state.schema.nodes.list_item : undefined)(state, dispatch);\n };\n\n super.oninit(vnode);\n }\n\n onEditorUpdate() {\n this.active = !!this.state.nodeActive(this.attrs.listType);\n this.$().toggleClass('active', this.active);\n }\n}\n","module.exports = flarum.core.compat['common/components/TextEditor'];","import { defaultMarkdownSerializer, MarkdownSerializer, MarkdownSerializerState } from 'prosemirror-markdown';\n\n/**\n * COPIED FROM https://github.com/StackExchange/Stacks-Editor/blob/main/src/rich-text/markdown-serializer.ts\n *\n * Generates a config from a base config that is aware of special \"markup\" added by the markdown tokenizer;\n * typically this will be differences in how markdown can be written (e.g. * vs _ for emphasis),\n * but could also be html tags from our extended html support plugin (e.g. * vs for emphasis)\n * @param config The base config to extend\n */\nfunction genMarkupAwareMarkConfig(config) {\n // we don't support function open/close since these could have fairly complicated logic in them\n if (config.open instanceof Function || config.close instanceof Function) {\n // log an error to the console and return the unmodified base config\n error('markdown-serializer genMarkupAwareMarkSpec', 'Unable to extend mark config with open/close as functions', config);\n return config;\n }\n\n return {\n ...config,\n open(_, mark) {\n const markup = mark.attrs.markup;\n return markup || config.open;\n },\n close(_, mark) {\n let markup = mark.attrs.markup;\n // insert the `/` on html closing tags\n markup = /^<[a-z]+>$/i.test(markup) ? markup.replace(/^! ', null, node, () => state.renderContent(node));\n },\n\n math_block(state, node) {\n state.write('$$\\n');\n state.text(node.textContent, false);\n state.ensureNewLine();\n state.write('$$');\n state.closeBlock(node);\n },\n\n // We still want to put a new line for empty paragraphs\n paragraph(state, node) {\n if (node.content.size === 0) {\n state.write('\\n');\n } else {\n defaultMarkdownSerializer.nodes.paragraph(state, node);\n }\n },\n\n // Override this to put in just a whiteline, since Litedown doesn't like line-ending slashes.\n hard_break(state, node, parent, index) {\n for (let i = index + 1; i < parent.childCount; i++)\n if (parent.child(i).type != node.type) {\n state.write('\\n');\n return;\n }\n },\n };\n }\n\n buildMarks() {\n return {\n ...defaultMarkdownSerializer.marks,\n\n spoiler_inline: genMarkupAwareMarkConfig({\n open: '>!',\n close: '!<',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n strike: genMarkupAwareMarkConfig({\n open: '~~',\n close: '~~',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n sub: genMarkupAwareMarkConfig({\n open: '~',\n close: '~',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n sup: genMarkupAwareMarkConfig({\n open: '^',\n close: '^',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n math_inline: {\n ...genMarkupAwareMarkConfig({\n open: '$',\n close: '$',\n mixable: false,\n expelEnclosingWhitespace: true,\n }),\n escape: false,\n },\n };\n }\n\n build() {\n return new MarkdownSerializer(this.buildNodes(), this.buildMarks());\n }\n}\n","'use strict';\n\n\nmodule.exports = require('./lib/');\n","import { schema } from 'prosemirror-markdown';\nimport { Schema } from 'prosemirror-model';\n\n/**\n * COPIED FROM https://github.com/StackExchange/Stacks-Editor/blob/main/src/shared/schema.ts\n *\n * Creates a generic html MarkSpec for an inline html tag\n * @param tag The name of the tag to use in the Prosemirror dom\n */\nfunction genHtmlInlineMarkSpec(...tags) {\n return {\n toDOM() {\n return [tags[0], 0];\n },\n parseDOM: tags.map((tag) => ({ tag: tag })),\n };\n}\n\nconst spoilerNodeSpec = {\n content: 'block+',\n group: 'block',\n attrs: { open: { default: true } },\n parseDOM: [\n {\n tag: 'details',\n },\n ],\n toDOM(node) {\n const attrs = { class: 'spoiler' };\n\n if (node.attrs.open) attrs.open = true;\n\n return ['details', attrs, 0];\n },\n};\n\nconst mathBlockNodeSpec = {\n content: 'text*',\n code: true,\n group: 'block',\n parseDOM: [\n {\n tag: 'pre',\n },\n ],\n toDOM(node) {\n return ['pre', { class: 'math' }, ['code', 0]];\n },\n};\n\nexport default class SchemaBuilder {\n buildNodes() {\n return (\n schema.spec.nodes\n // Make lists tight by default\n .update(\n 'ordered_list',\n Object.assign({}, schema.spec.nodes.get('ordered_list'), { attrs: { order: { default: 1 }, tight: { default: true } } })\n )\n .update('bullet_list', Object.assign({}, schema.spec.nodes.get('bullet_list'), { attrs: { tight: { default: true } } }))\n .addBefore('blockquote', 'spoiler', spoilerNodeSpec)\n .addBefore('blockquote', 'math_block', mathBlockNodeSpec)\n );\n }\n\n buildMarks() {\n return schema.spec.marks\n .addBefore('strong', 'strike', genHtmlInlineMarkSpec('del', 's', 'strike'))\n .addBefore('strong', 'sub', genHtmlInlineMarkSpec('sub'))\n .addBefore('strong', 'sup', genHtmlInlineMarkSpec('sup'))\n .addBefore('strong', 'spoiler_inline', {\n attrs: { open: { default: true } },\n parseDOM: [\n {\n tag: 'spoiler',\n },\n ],\n toDOM(node) {\n return ['spoiler', 0];\n },\n })\n .addBefore('strong', 'math_inline', {\n parseDOM: [\n {\n tag: 'math',\n },\n ],\n toDOM(node) {\n return ['math', 0];\n },\n excludes: '_',\n });\n }\n\n build() {\n return new Schema({\n nodes: this.buildNodes(),\n marks: this.buildMarks(),\n });\n }\n}\n","module.exports = flarum.core.compat['common/Component'];","import Dropdown from 'flarum/common/components/Dropdown';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport extractText from 'flarum/common/utils/extractText';\nimport { setBlockType } from 'tiptap-commands';\nimport SafariModalHack from './SafariModalHack';\n\nexport default class NodeTypeDropdown extends Dropdown {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n this.state.addItem(\n this.attrs.type,\n (state, dispatch) => {\n return this.command(state, dispatch);\n },\n this.onEditorUpdate.bind(this)\n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$().on('click', (e) => {\n if ($('.App').is('.mobile-safari')) {\n // Mobile Safari doesn't support fixed items\n // So, we wrap them in a modal.\n app.modal.show(SafariModalHack, {\n title: this.attrs.tooltip,\n vnodeContent: this.getNodeTypeButtons(),\n });\n e.stopPropagation();\n }\n });\n\n this.onEditorUpdate();\n }\n\n getButton(children) {\n return (\n \n );\n }\n\n getNodeTypeButtons() {\n return this.attrs.options\n .filter((_, i) => i !== this.activeIndex)\n .map((option) => (\n \n \n {option.title}\n \n \n ));\n }\n\n getMenu(items) {\n return
                {this.getNodeTypeButtons()}
              ;\n }\n\n keydown(type, attrs, e) {\n if (e.key === ' ' || e.key === 'Enter') {\n this.click(type, attrs, e);\n }\n }\n\n click(type, attrs, e) {\n // Here for the safari workaround\n app.modal.close();\n e.preventDefault();\n this.command = setBlockType(type, attrs);\n return this.state.run(this.attrs.type);\n }\n\n onEditorUpdate() {\n if (!this.element) return;\n\n this.attrs.options.forEach((option, i) => {\n if (this.state.nodeActive(option.type, option.attrs)) {\n this.element.children[0].children[0].innerText = option.title;\n this.activeIndex = i;\n }\n });\n }\n}\n","import extractText from 'flarum/common/utils/extractText';\nimport Stream from 'flarum/common/utils/Stream';\nimport FormDropdown from './FormDropdown';\n\nexport default class InsertImageDropdown extends FormDropdown {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.src = Stream('');\n this.title = Stream('');\n }\n\n fields() {\n const items = super.fields();\n\n items.add(\n 'src',\n
              \n \n
              ,\n 10\n );\n\n items.add(\n 'title',\n
              \n \n
              ,\n 10\n );\n\n return items;\n }\n\n insert(e) {\n this.state.insertNode(this.attrs.node, {\n src: this.src(),\n title: this.title(),\n });\n\n this.src('');\n this.title('');\n }\n}\n","import { getMarkAttrs, markIsActive, nodeIsActive } from 'tiptap-utils';\n\nexport default class MenuState {\n constructor() {\n this.items = {};\n }\n\n attachEditorView(editorView) {\n this.editorView = editorView;\n }\n\n addItem(key, command, onEditorUpdate) {\n this.items[key] = { command, onEditorUpdate };\n }\n\n getSchema() {\n return this.editorView.state.schema;\n }\n\n update() {\n app.editor = this.editorView;\n Object.keys(this.items).forEach((key) => {\n this.items[key].onEditorUpdate();\n });\n }\n\n destroy() {\n // No need for this: Mithril will destroy the editor DOM when the composer closes.\n }\n\n markActive(markType) {\n return markIsActive(this.editorView.state, markType);\n }\n\n markAttrs(markType) {\n return getMarkAttrs(this.editorView.state, markType);\n }\n\n nodeActive(nodeType, attrs) {\n return nodeIsActive(this.editorView.state, nodeType, attrs);\n }\n\n selectionEmpty() {\n return this.editorView.state.selection.empty;\n }\n\n insertNode(nodeType, attrs) {\n const node = nodeType.createAndFill(attrs);\n\n let transaction;\n if (this.editorView.state.selection.empty) {\n transaction = this.editorView.state.tr.insert(this.editorView.state.selection.from, node);\n } else {\n transaction = this.editorView.state.tr.replaceSelection(node);\n }\n this.editorView.dispatch(transaction);\n this.editorView.focus();\n }\n\n run(key) {\n if (this.items[key]) {\n this.editorView.focus();\n this.items[key].command(this.editorView.state, this.editorView.dispatch, this.editorView);\n }\n }\n}\n","var GOOD_LEAF_SIZE = 200;\n\n// :: class A rope sequence is a persistent sequence data structure\n// that supports appending, prepending, and slicing without doing a\n// full copy. It is represented as a mostly-balanced tree.\nvar RopeSequence = function RopeSequence () {};\n\nRopeSequence.prototype.append = function append (other) {\n if (!other.length) { return this }\n other = RopeSequence.from(other);\n\n return (!this.length && other) ||\n (other.length < GOOD_LEAF_SIZE && this.leafAppend(other)) ||\n (this.length < GOOD_LEAF_SIZE && other.leafPrepend(this)) ||\n this.appendInner(other)\n};\n\n// :: (union<[T], RopeSequence>) → RopeSequence\n// Prepend an array or other rope to this one, returning a new rope.\nRopeSequence.prototype.prepend = function prepend (other) {\n if (!other.length) { return this }\n return RopeSequence.from(other).append(this)\n};\n\nRopeSequence.prototype.appendInner = function appendInner (other) {\n return new Append(this, other)\n};\n\n// :: (?number, ?number) → RopeSequence\n// Create a rope repesenting a sub-sequence of this rope.\nRopeSequence.prototype.slice = function slice (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n if (from >= to) { return RopeSequence.empty }\n return this.sliceInner(Math.max(0, from), Math.min(this.length, to))\n};\n\n// :: (number) → T\n// Retrieve the element at the given position from this rope.\nRopeSequence.prototype.get = function get (i) {\n if (i < 0 || i >= this.length) { return undefined }\n return this.getInner(i)\n};\n\n// :: ((element: T, index: number) → ?bool, ?number, ?number)\n// Call the given function for each element between the given\n// indices. This tends to be more efficient than looping over the\n// indices and calling `get`, because it doesn't have to descend the\n// tree for every element.\nRopeSequence.prototype.forEach = function forEach (f, from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n if (from <= to)\n { this.forEachInner(f, from, to, 0); }\n else\n { this.forEachInvertedInner(f, from, to, 0); }\n};\n\n// :: ((element: T, index: number) → U, ?number, ?number) → [U]\n// Map the given functions over the elements of the rope, producing\n// a flat array.\nRopeSequence.prototype.map = function map (f, from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n var result = [];\n this.forEach(function (elt, i) { return result.push(f(elt, i)); }, from, to);\n return result\n};\n\n// :: (?union<[T], RopeSequence>) → RopeSequence\n// Create a rope representing the given array, or return the rope\n// itself if a rope was given.\nRopeSequence.from = function from (values) {\n if (values instanceof RopeSequence) { return values }\n return values && values.length ? new Leaf(values) : RopeSequence.empty\n};\n\nvar Leaf = /*@__PURE__*/(function (RopeSequence) {\n function Leaf(values) {\n RopeSequence.call(this);\n this.values = values;\n }\n\n if ( RopeSequence ) Leaf.__proto__ = RopeSequence;\n Leaf.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n Leaf.prototype.constructor = Leaf;\n\n var prototypeAccessors = { length: { configurable: true },depth: { configurable: true } };\n\n Leaf.prototype.flatten = function flatten () {\n return this.values\n };\n\n Leaf.prototype.sliceInner = function sliceInner (from, to) {\n if (from == 0 && to == this.length) { return this }\n return new Leaf(this.values.slice(from, to))\n };\n\n Leaf.prototype.getInner = function getInner (i) {\n return this.values[i]\n };\n\n Leaf.prototype.forEachInner = function forEachInner (f, from, to, start) {\n for (var i = from; i < to; i++)\n { if (f(this.values[i], start + i) === false) { return false } }\n };\n\n Leaf.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n for (var i = from - 1; i >= to; i--)\n { if (f(this.values[i], start + i) === false) { return false } }\n };\n\n Leaf.prototype.leafAppend = function leafAppend (other) {\n if (this.length + other.length <= GOOD_LEAF_SIZE)\n { return new Leaf(this.values.concat(other.flatten())) }\n };\n\n Leaf.prototype.leafPrepend = function leafPrepend (other) {\n if (this.length + other.length <= GOOD_LEAF_SIZE)\n { return new Leaf(other.flatten().concat(this.values)) }\n };\n\n prototypeAccessors.length.get = function () { return this.values.length };\n\n prototypeAccessors.depth.get = function () { return 0 };\n\n Object.defineProperties( Leaf.prototype, prototypeAccessors );\n\n return Leaf;\n}(RopeSequence));\n\n// :: RopeSequence\n// The empty rope sequence.\nRopeSequence.empty = new Leaf([]);\n\nvar Append = /*@__PURE__*/(function (RopeSequence) {\n function Append(left, right) {\n RopeSequence.call(this);\n this.left = left;\n this.right = right;\n this.length = left.length + right.length;\n this.depth = Math.max(left.depth, right.depth) + 1;\n }\n\n if ( RopeSequence ) Append.__proto__ = RopeSequence;\n Append.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n Append.prototype.constructor = Append;\n\n Append.prototype.flatten = function flatten () {\n return this.left.flatten().concat(this.right.flatten())\n };\n\n Append.prototype.getInner = function getInner (i) {\n return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length)\n };\n\n Append.prototype.forEachInner = function forEachInner (f, from, to, start) {\n var leftLen = this.left.length;\n if (from < leftLen &&\n this.left.forEachInner(f, from, Math.min(to, leftLen), start) === false)\n { return false }\n if (to > leftLen &&\n this.right.forEachInner(f, Math.max(from - leftLen, 0), Math.min(this.length, to) - leftLen, start + leftLen) === false)\n { return false }\n };\n\n Append.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n var leftLen = this.left.length;\n if (from > leftLen &&\n this.right.forEachInvertedInner(f, from - leftLen, Math.max(to, leftLen) - leftLen, start + leftLen) === false)\n { return false }\n if (to < leftLen &&\n this.left.forEachInvertedInner(f, Math.min(from, leftLen), to, start) === false)\n { return false }\n };\n\n Append.prototype.sliceInner = function sliceInner (from, to) {\n if (from == 0 && to == this.length) { return this }\n var leftLen = this.left.length;\n if (to <= leftLen) { return this.left.slice(from, to) }\n if (from >= leftLen) { return this.right.slice(from - leftLen, to - leftLen) }\n return this.left.slice(from, leftLen).append(this.right.slice(0, to - leftLen))\n };\n\n Append.prototype.leafAppend = function leafAppend (other) {\n var inner = this.right.leafAppend(other);\n if (inner) { return new Append(this.left, inner) }\n };\n\n Append.prototype.leafPrepend = function leafPrepend (other) {\n var inner = this.left.leafPrepend(other);\n if (inner) { return new Append(inner, this.right) }\n };\n\n Append.prototype.appendInner = function appendInner (other) {\n if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1)\n { return new Append(this.left, new Append(this.right, other)) }\n return new Append(this, other)\n };\n\n return Append;\n}(RopeSequence));\n\nvar ropeSequence = RopeSequence;\n\nexport default ropeSequence;\n","import RopeSequence from 'rope-sequence';\nimport { Mapping } from 'prosemirror-transform';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\n// ProseMirror's history isn't simply a way to roll back to a previous\n// state, because ProseMirror supports applying changes without adding\n// them to the history (for example during collaboration).\n//\n// To this end, each 'Branch' (one for the undo history and one for\n// the redo history) keeps an array of 'Items', which can optionally\n// hold a step (an actual undoable change), and always hold a position\n// map (which is needed to move changes below them to apply to the\n// current document).\n//\n// An item that has both a step and a selection bookmark is the start\n// of an 'event' — a group of changes that will be undone or redone at\n// once. (It stores only the bookmark, since that way we don't have to\n// provide a document until the selection is actually applied, which\n// is useful when compressing.)\n\n// Used to schedule history compression\nvar max_empty_items = 500;\n\nvar Branch = function Branch(items, eventCount) {\n this.items = items;\n this.eventCount = eventCount;\n};\n\n// : (EditorState, bool) → ?{transform: Transform, selection: ?SelectionBookmark, remaining: Branch}\n// Pop the latest event off the branch's history and apply it\n// to a document transform.\nBranch.prototype.popEvent = function popEvent (state, preserveItems) {\n var this$1 = this;\n\n if (this.eventCount == 0) { return null }\n\n var end = this.items.length;\n for (;; end--) {\n var next = this.items.get(end - 1);\n if (next.selection) { --end; break }\n }\n\n var remap, mapFrom;\n if (preserveItems) {\n remap = this.remapping(end, this.items.length);\n mapFrom = remap.maps.length;\n }\n var transform = state.tr;\n var selection, remaining;\n var addAfter = [], addBefore = [];\n\n this.items.forEach(function (item, i) {\n if (!item.step) {\n if (!remap) {\n remap = this$1.remapping(end, i + 1);\n mapFrom = remap.maps.length;\n }\n mapFrom--;\n addBefore.push(item);\n return\n }\n\n if (remap) {\n addBefore.push(new Item(item.map));\n var step = item.step.map(remap.slice(mapFrom)), map;\n\n if (step && transform.maybeStep(step).doc) {\n map = transform.mapping.maps[transform.mapping.maps.length - 1];\n addAfter.push(new Item(map, null, null, addAfter.length + addBefore.length));\n }\n mapFrom--;\n if (map) { remap.appendMap(map, mapFrom); }\n } else {\n transform.maybeStep(item.step);\n }\n\n if (item.selection) {\n selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection;\n remaining = new Branch(this$1.items.slice(0, end).append(addBefore.reverse().concat(addAfter)), this$1.eventCount - 1);\n return false\n }\n }, this.items.length, 0);\n\n return {remaining: remaining, transform: transform, selection: selection}\n};\n\n// : (Transform, ?SelectionBookmark, Object) → Branch\n// Create a new branch with the given transform added.\nBranch.prototype.addTransform = function addTransform (transform, selection, histOptions, preserveItems) {\n var newItems = [], eventCount = this.eventCount;\n var oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null;\n\n for (var i = 0; i < transform.steps.length; i++) {\n var step = transform.steps[i].invert(transform.docs[i]);\n var item = new Item(transform.mapping.maps[i], step, selection), merged = (void 0);\n if (merged = lastItem && lastItem.merge(item)) {\n item = merged;\n if (i) { newItems.pop(); }\n else { oldItems = oldItems.slice(0, oldItems.length - 1); }\n }\n newItems.push(item);\n if (selection) {\n eventCount++;\n selection = null;\n }\n if (!preserveItems) { lastItem = item; }\n }\n var overflow = eventCount - histOptions.depth;\n if (overflow > DEPTH_OVERFLOW) {\n oldItems = cutOffEvents(oldItems, overflow);\n eventCount -= overflow;\n }\n return new Branch(oldItems.append(newItems), eventCount)\n};\n\nBranch.prototype.remapping = function remapping (from, to) {\n var maps = new Mapping;\n this.items.forEach(function (item, i) {\n var mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from\n ? maps.maps.length - item.mirrorOffset : null;\n maps.appendMap(item.map, mirrorPos);\n }, from, to);\n return maps\n};\n\nBranch.prototype.addMaps = function addMaps (array) {\n if (this.eventCount == 0) { return this }\n return new Branch(this.items.append(array.map(function (map) { return new Item(map); })), this.eventCount)\n};\n\n// : (Transform, number)\n// When the collab module receives remote changes, the history has\n// to know about those, so that it can adjust the steps that were\n// rebased on top of the remote changes, and include the position\n// maps for the remote changes in its array of items.\nBranch.prototype.rebased = function rebased (rebasedTransform, rebasedCount) {\n if (!this.eventCount) { return this }\n\n var rebasedItems = [], start = Math.max(0, this.items.length - rebasedCount);\n\n var mapping = rebasedTransform.mapping;\n var newUntil = rebasedTransform.steps.length;\n var eventCount = this.eventCount;\n this.items.forEach(function (item) { if (item.selection) { eventCount--; } }, start);\n\n var iRebased = rebasedCount;\n this.items.forEach(function (item) {\n var pos = mapping.getMirror(--iRebased);\n if (pos == null) { return }\n newUntil = Math.min(newUntil, pos);\n var map = mapping.maps[pos];\n if (item.step) {\n var step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]);\n var selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos));\n if (selection) { eventCount++; }\n rebasedItems.push(new Item(map, step, selection));\n } else {\n rebasedItems.push(new Item(map));\n }\n }, start);\n\n var newMaps = [];\n for (var i = rebasedCount; i < newUntil; i++)\n { newMaps.push(new Item(mapping.maps[i])); }\n var items = this.items.slice(0, start).append(newMaps).append(rebasedItems);\n var branch = new Branch(items, eventCount);\n\n if (branch.emptyItemCount() > max_empty_items)\n { branch = branch.compress(this.items.length - rebasedItems.length); }\n return branch\n};\n\nBranch.prototype.emptyItemCount = function emptyItemCount () {\n var count = 0;\n this.items.forEach(function (item) { if (!item.step) { count++; } });\n return count\n};\n\n// Compressing a branch means rewriting it to push the air (map-only\n// items) out. During collaboration, these naturally accumulate\n// because each remote change adds one. The `upto` argument is used\n// to ensure that only the items below a given level are compressed,\n// because `rebased` relies on a clean, untouched set of items in\n// order to associate old items with rebased steps.\nBranch.prototype.compress = function compress (upto) {\n if ( upto === void 0 ) upto = this.items.length;\n\n var remap = this.remapping(0, upto), mapFrom = remap.maps.length;\n var items = [], events = 0;\n this.items.forEach(function (item, i) {\n if (i >= upto) {\n items.push(item);\n if (item.selection) { events++; }\n } else if (item.step) {\n var step = item.step.map(remap.slice(mapFrom)), map = step && step.getMap();\n mapFrom--;\n if (map) { remap.appendMap(map, mapFrom); }\n if (step) {\n var selection = item.selection && item.selection.map(remap.slice(mapFrom));\n if (selection) { events++; }\n var newItem = new Item(map.invert(), step, selection), merged, last = items.length - 1;\n if (merged = items.length && items[last].merge(newItem))\n { items[last] = merged; }\n else\n { items.push(newItem); }\n }\n } else if (item.map) {\n mapFrom--;\n }\n }, this.items.length, 0);\n return new Branch(RopeSequence.from(items.reverse()), events)\n};\n\nBranch.empty = new Branch(RopeSequence.empty, 0);\n\nfunction cutOffEvents(items, n) {\n var cutPoint;\n items.forEach(function (item, i) {\n if (item.selection && (n-- == 0)) {\n cutPoint = i;\n return false\n }\n });\n return items.slice(cutPoint)\n}\n\nvar Item = function Item(map, step, selection, mirrorOffset) {\n // The (forward) step map for this item.\n this.map = map;\n // The inverted step\n this.step = step;\n // If this is non-null, this item is the start of a group, and\n // this selection is the starting selection for the group (the one\n // that was active before the first step was applied)\n this.selection = selection;\n // If this item is the inverse of a previous mapping on the stack,\n // this points at the inverse's offset\n this.mirrorOffset = mirrorOffset;\n};\n\nItem.prototype.merge = function merge (other) {\n if (this.step && other.step && !other.selection) {\n var step = other.step.merge(this.step);\n if (step) { return new Item(step.getMap().invert(), step, this.selection) }\n }\n};\n\n// The value of the state field that tracks undo/redo history for that\n// state. Will be stored in the plugin state when the history plugin\n// is active.\nvar HistoryState = function HistoryState(done, undone, prevRanges, prevTime) {\n this.done = done;\n this.undone = undone;\n this.prevRanges = prevRanges;\n this.prevTime = prevTime;\n};\n\nvar DEPTH_OVERFLOW = 20;\n\n// : (HistoryState, EditorState, Transaction, Object)\n// Record a transformation in undo history.\nfunction applyTransaction(history, state, tr, options) {\n var historyTr = tr.getMeta(historyKey), rebased;\n if (historyTr) { return historyTr.historyState }\n\n if (tr.getMeta(closeHistoryKey)) { history = new HistoryState(history.done, history.undone, null, 0); }\n\n var appended = tr.getMeta(\"appendedTransaction\");\n\n if (tr.steps.length == 0) {\n return history\n } else if (appended && appended.getMeta(historyKey)) {\n if (appended.getMeta(historyKey).redo)\n { return new HistoryState(history.done.addTransform(tr, null, options, mustPreserveItems(state)),\n history.undone, rangesFor(tr.mapping.maps[tr.steps.length - 1]), history.prevTime) }\n else\n { return new HistoryState(history.done, history.undone.addTransform(tr, null, options, mustPreserveItems(state)),\n null, history.prevTime) }\n } else if (tr.getMeta(\"addToHistory\") !== false && !(appended && appended.getMeta(\"addToHistory\") === false)) {\n // Group transforms that occur in quick succession into one event.\n var newGroup = history.prevTime == 0 || !appended && (history.prevTime < (tr.time || 0) - options.newGroupDelay ||\n !isAdjacentTo(tr, history.prevRanges));\n var prevRanges = appended ? mapRanges(history.prevRanges, tr.mapping) : rangesFor(tr.mapping.maps[tr.steps.length - 1]);\n return new HistoryState(history.done.addTransform(tr, newGroup ? state.selection.getBookmark() : null,\n options, mustPreserveItems(state)),\n Branch.empty, prevRanges, tr.time)\n } else if (rebased = tr.getMeta(\"rebased\")) {\n // Used by the collab module to tell the history that some of its\n // content has been rebased.\n return new HistoryState(history.done.rebased(tr, rebased),\n history.undone.rebased(tr, rebased),\n mapRanges(history.prevRanges, tr.mapping), history.prevTime)\n } else {\n return new HistoryState(history.done.addMaps(tr.mapping.maps),\n history.undone.addMaps(tr.mapping.maps),\n mapRanges(history.prevRanges, tr.mapping), history.prevTime)\n }\n}\n\nfunction isAdjacentTo(transform, prevRanges) {\n if (!prevRanges) { return false }\n if (!transform.docChanged) { return true }\n var adjacent = false;\n transform.mapping.maps[0].forEach(function (start, end) {\n for (var i = 0; i < prevRanges.length; i += 2)\n { if (start <= prevRanges[i + 1] && end >= prevRanges[i])\n { adjacent = true; } }\n });\n return adjacent\n}\n\nfunction rangesFor(map) {\n var result = [];\n map.forEach(function (_from, _to, from, to) { return result.push(from, to); });\n return result\n}\n\nfunction mapRanges(ranges, mapping) {\n if (!ranges) { return null }\n var result = [];\n for (var i = 0; i < ranges.length; i += 2) {\n var from = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1);\n if (from <= to) { result.push(from, to); }\n }\n return result\n}\n\n// : (HistoryState, EditorState, (tr: Transaction), bool)\n// Apply the latest event from one branch to the document and shift the event\n// onto the other branch.\nfunction histTransaction(history, state, dispatch, redo) {\n var preserveItems = mustPreserveItems(state), histOptions = historyKey.get(state).spec.config;\n var pop = (redo ? history.undone : history.done).popEvent(state, preserveItems);\n if (!pop) { return }\n\n var selection = pop.selection.resolve(pop.transform.doc);\n var added = (redo ? history.done : history.undone).addTransform(pop.transform, state.selection.getBookmark(),\n histOptions, preserveItems);\n\n var newHist = new HistoryState(redo ? added : pop.remaining, redo ? pop.remaining : added, null, 0);\n dispatch(pop.transform.setSelection(selection).setMeta(historyKey, {redo: redo, historyState: newHist}).scrollIntoView());\n}\n\nvar cachedPreserveItems = false, cachedPreserveItemsPlugins = null;\n// Check whether any plugin in the given state has a\n// `historyPreserveItems` property in its spec, in which case we must\n// preserve steps exactly as they came in, so that they can be\n// rebased.\nfunction mustPreserveItems(state) {\n var plugins = state.plugins;\n if (cachedPreserveItemsPlugins != plugins) {\n cachedPreserveItems = false;\n cachedPreserveItemsPlugins = plugins;\n for (var i = 0; i < plugins.length; i++) { if (plugins[i].spec.historyPreserveItems) {\n cachedPreserveItems = true;\n break\n } }\n }\n return cachedPreserveItems\n}\n\n// :: (Transaction) → Transaction\n// Set a flag on the given transaction that will prevent further steps\n// from being appended to an existing history event (so that they\n// require a separate undo command to undo).\nfunction closeHistory(tr) {\n return tr.setMeta(closeHistoryKey, true)\n}\n\nvar historyKey = new PluginKey(\"history\");\nvar closeHistoryKey = new PluginKey(\"closeHistory\");\n\n// :: (?Object) → Plugin\n// Returns a plugin that enables the undo history for an editor. The\n// plugin will track undo and redo stacks, which can be used with the\n// [`undo`](#history.undo) and [`redo`](#history.redo) commands.\n//\n// You can set an `\"addToHistory\"` [metadata\n// property](#state.Transaction.setMeta) of `false` on a transaction\n// to prevent it from being rolled back by undo.\n//\n// config::-\n// Supports the following configuration options:\n//\n// depth:: ?number\n// The amount of history events that are collected before the\n// oldest events are discarded. Defaults to 100.\n//\n// newGroupDelay:: ?number\n// The delay between changes after which a new group should be\n// started. Defaults to 500 (milliseconds). Note that when changes\n// aren't adjacent, a new group is always started.\nfunction history(config) {\n config = {depth: config && config.depth || 100,\n newGroupDelay: config && config.newGroupDelay || 500};\n return new Plugin({\n key: historyKey,\n\n state: {\n init: function init() {\n return new HistoryState(Branch.empty, Branch.empty, null, 0)\n },\n apply: function apply(tr, hist, state) {\n return applyTransaction(hist, state, tr, config)\n }\n },\n\n config: config\n })\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// A command function that undoes the last change, if any.\nfunction undo(state, dispatch) {\n var hist = historyKey.getState(state);\n if (!hist || hist.done.eventCount == 0) { return false }\n if (dispatch) { histTransaction(hist, state, dispatch, false); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// A command function that redoes the last undone change, if any.\nfunction redo(state, dispatch) {\n var hist = historyKey.getState(state);\n if (!hist || hist.undone.eventCount == 0) { return false }\n if (dispatch) { histTransaction(hist, state, dispatch, true); }\n return true\n}\n\n// :: (EditorState) → number\n// The amount of undoable events available in a given state.\nfunction undoDepth(state) {\n var hist = historyKey.getState(state);\n return hist ? hist.done.eventCount : 0\n}\n\n// :: (EditorState) → number\n// The amount of redoable events available in a given editor state.\nfunction redoDepth(state) {\n var hist = historyKey.getState(state);\n return hist ? hist.undone.eventCount : 0\n}\n\nexport { HistoryState, closeHistory, history, redo, redoDepth, undo, undoDepth };\n//# sourceMappingURL=index.es.js.map\n","import { TextSelection, NodeSelection, Selection } from 'prosemirror-state';\nimport { DOMSerializer, Fragment, Mark, DOMParser, Slice } from 'prosemirror-model';\nimport { dropPoint } from 'prosemirror-transform';\n\nvar result = {};\n\nif (typeof navigator != \"undefined\" && typeof document != \"undefined\") {\n var ie_edge = /Edge\\/(\\d+)/.exec(navigator.userAgent);\n var ie_upto10 = /MSIE \\d/.test(navigator.userAgent);\n var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);\n\n result.mac = /Mac/.test(navigator.platform);\n var ie = result.ie = !!(ie_upto10 || ie_11up || ie_edge);\n result.ie_version = ie_upto10 ? document.documentMode || 6 : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : null;\n result.gecko = !ie && /gecko\\/(\\d+)/i.test(navigator.userAgent);\n result.gecko_version = result.gecko && +(/Firefox\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1];\n var chrome = !ie && /Chrome\\/(\\d+)/.exec(navigator.userAgent);\n result.chrome = !!chrome;\n result.chrome_version = chrome && +chrome[1];\n // Is true for both iOS and iPadOS for convenience\n result.safari = !ie && /Apple Computer/.test(navigator.vendor);\n result.ios = result.safari && (/Mobile\\/\\w+/.test(navigator.userAgent) || navigator.maxTouchPoints > 2);\n result.android = /Android \\d/.test(navigator.userAgent);\n result.webkit = \"webkitFontSmoothing\" in document.documentElement.style;\n result.webkit_version = result.webkit && +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1];\n}\n\nvar domIndex = function(node) {\n for (var index = 0;; index++) {\n node = node.previousSibling;\n if (!node) { return index }\n }\n};\n\nvar parentNode = function(node) {\n var parent = node.parentNode;\n return parent && parent.nodeType == 11 ? parent.host : parent\n};\n\nvar reusedRange = null;\n\n// Note that this will always return the same range, because DOM range\n// objects are every expensive, and keep slowing down subsequent DOM\n// updates, for some reason.\nvar textRange = function(node, from, to) {\n var range = reusedRange || (reusedRange = document.createRange());\n range.setEnd(node, to == null ? node.nodeValue.length : to);\n range.setStart(node, from || 0);\n return range\n};\n\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nvar isEquivalentPosition = function(node, off, targetNode, targetOff) {\n return targetNode && (scanFor(node, off, targetNode, targetOff, -1) ||\n scanFor(node, off, targetNode, targetOff, 1))\n};\n\nvar atomElements = /^(img|br|input|textarea|hr)$/i;\n\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n for (;;) {\n if (node == targetNode && off == targetOff) { return true }\n if (off == (dir < 0 ? 0 : nodeSize(node))) {\n var parent = node.parentNode;\n if (parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) || node.contentEditable == \"false\")\n { return false }\n off = domIndex(node) + (dir < 0 ? 0 : 1);\n node = parent;\n } else if (node.nodeType == 1) {\n node = node.childNodes[off + (dir < 0 ? -1 : 0)];\n if (node.contentEditable == \"false\") { return false }\n off = dir < 0 ? nodeSize(node) : 0;\n } else {\n return false\n }\n }\n}\n\nfunction nodeSize(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length\n}\n\nfunction isOnEdge(node, offset, parent) {\n for (var atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd;) {\n if (node == parent) { return true }\n var index = domIndex(node);\n node = node.parentNode;\n if (!node) { return false }\n atStart = atStart && index == 0;\n atEnd = atEnd && index == nodeSize(node);\n }\n}\n\nfunction hasBlockDesc(dom) {\n var desc;\n for (var cur = dom; cur; cur = cur.parentNode) { if (desc = cur.pmViewDesc) { break } }\n return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom)\n}\n\n// Work around Chrome issue https://bugs.chromium.org/p/chromium/issues/detail?id=447523\n// (isCollapsed inappropriately returns true in shadow dom)\nvar selectionCollapsed = function(domSel) {\n var collapsed = domSel.isCollapsed;\n if (collapsed && result.chrome && domSel.rangeCount && !domSel.getRangeAt(0).collapsed)\n { collapsed = false; }\n return collapsed\n};\n\nfunction keyEvent(keyCode, key) {\n var event = document.createEvent(\"Event\");\n event.initEvent(\"keydown\", true, true);\n event.keyCode = keyCode;\n event.key = event.code = key;\n return event\n}\n\nfunction windowRect(doc) {\n return {left: 0, right: doc.documentElement.clientWidth,\n top: 0, bottom: doc.documentElement.clientHeight}\n}\n\nfunction getSide(value, side) {\n return typeof value == \"number\" ? value : value[side]\n}\n\nfunction clientRect(node) {\n var rect = node.getBoundingClientRect();\n // Make sure scrollbar width isn't included in the rectangle\n return {left: rect.left, right: rect.left + node.clientWidth,\n top: rect.top, bottom: rect.top + node.clientHeight}\n}\n\nfunction scrollRectIntoView(view, rect, startDOM) {\n var scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n var doc = view.dom.ownerDocument;\n for (var parent = startDOM || view.dom;; parent = parentNode(parent)) {\n if (!parent) { break }\n if (parent.nodeType != 1) { continue }\n var atTop = parent == doc.body || parent.nodeType != 1;\n var bounding = atTop ? windowRect(doc) : clientRect(parent);\n var moveX = 0, moveY = 0;\n if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n { moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\")); }\n else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n { moveY = rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\"); }\n if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n { moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\")); }\n else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n { moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\"); }\n if (moveX || moveY) {\n if (atTop) {\n doc.defaultView.scrollBy(moveX, moveY);\n } else {\n var startX = parent.scrollLeft, startY = parent.scrollTop;\n if (moveY) { parent.scrollTop += moveY; }\n if (moveX) { parent.scrollLeft += moveX; }\n var dX = parent.scrollLeft - startX, dY = parent.scrollTop - startY;\n rect = {left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY};\n }\n }\n if (atTop) { break }\n }\n}\n\n// Store the scroll position of the editor's parent nodes, along with\n// the top position of an element near the top of the editor, which\n// will be used to make sure the visible viewport remains stable even\n// when the size of the content above changes.\nfunction storeScrollPos(view) {\n var rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n var refDOM, refTop;\n for (var x = (rect.left + rect.right) / 2, y = startY + 1;\n y < Math.min(innerHeight, rect.bottom); y += 5) {\n var dom = view.root.elementFromPoint(x, y);\n if (dom == view.dom || !view.dom.contains(dom)) { continue }\n var localRect = dom.getBoundingClientRect();\n if (localRect.top >= startY - 20) {\n refDOM = dom;\n refTop = localRect.top;\n break\n }\n }\n return {refDOM: refDOM, refTop: refTop, stack: scrollStack(view.dom)}\n}\n\nfunction scrollStack(dom) {\n var stack = [], doc = dom.ownerDocument;\n for (; dom; dom = parentNode(dom)) {\n stack.push({dom: dom, top: dom.scrollTop, left: dom.scrollLeft});\n if (dom == doc) { break }\n }\n return stack\n}\n\n// Reset the scroll position of the editor's parent nodes to that what\n// it was before, when storeScrollPos was called.\nfunction resetScrollPos(ref) {\n var refDOM = ref.refDOM;\n var refTop = ref.refTop;\n var stack = ref.stack;\n\n var newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\n\nfunction restoreScrollStack(stack, dTop) {\n for (var i = 0; i < stack.length; i++) {\n var ref = stack[i];\n var dom = ref.dom;\n var top = ref.top;\n var left = ref.left;\n if (dom.scrollTop != top + dTop) { dom.scrollTop = top + dTop; }\n if (dom.scrollLeft != left) { dom.scrollLeft = left; }\n }\n}\n\nvar preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n if (dom.setActive) { return dom.setActive() } // in IE\n if (preventScrollSupported) { return dom.focus(preventScrollSupported) }\n\n var stored = scrollStack(dom);\n dom.focus(preventScrollSupported == null ? {\n get preventScroll() {\n preventScrollSupported = {preventScroll: true};\n return true\n }\n } : undefined);\n if (!preventScrollSupported) {\n preventScrollSupported = false;\n restoreScrollStack(stored, 0);\n }\n}\n\nfunction findOffsetInNode(node, coords) {\n var closest, dxClosest = 2e8, coordsClosest, offset = 0;\n var rowBot = coords.top, rowTop = coords.top;\n for (var child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n var rects = (void 0);\n if (child.nodeType == 1) { rects = child.getClientRects(); }\n else if (child.nodeType == 3) { rects = textRange(child).getClientRects(); }\n else { continue }\n\n for (var i = 0; i < rects.length; i++) {\n var rect = rects[i];\n if (rect.top <= rowBot && rect.bottom >= rowTop) {\n rowBot = Math.max(rect.bottom, rowBot);\n rowTop = Math.min(rect.top, rowTop);\n var dx = rect.left > coords.left ? rect.left - coords.left\n : rect.right < coords.left ? coords.left - rect.right : 0;\n if (dx < dxClosest) {\n closest = child;\n dxClosest = dx;\n coordsClosest = dx && closest.nodeType == 3 ? {left: rect.right < coords.left ? rect.right : rect.left, top: coords.top} : coords;\n if (child.nodeType == 1 && dx)\n { offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0); }\n continue\n }\n }\n if (!closest && (coords.left >= rect.right && coords.top >= rect.top ||\n coords.left >= rect.left && coords.top >= rect.bottom))\n { offset = childIndex + 1; }\n }\n }\n if (closest && closest.nodeType == 3) { return findOffsetInText(closest, coordsClosest) }\n if (!closest || (dxClosest && closest.nodeType == 1)) { return {node: node, offset: offset} }\n return findOffsetInNode(closest, coordsClosest)\n}\n\nfunction findOffsetInText(node, coords) {\n var len = node.nodeValue.length;\n var range = document.createRange();\n for (var i = 0; i < len; i++) {\n range.setEnd(node, i + 1);\n range.setStart(node, i);\n var rect = singleRect(range, 1);\n if (rect.top == rect.bottom) { continue }\n if (inRect(coords, rect))\n { return {node: node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0)} }\n }\n return {node: node, offset: 0}\n}\n\nfunction inRect(coords, rect) {\n return coords.left >= rect.left - 1 && coords.left <= rect.right + 1&&\n coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1\n}\n\nfunction targetKludge(dom, coords) {\n var parent = dom.parentNode;\n if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n { return parent }\n return dom\n}\n\nfunction posFromElement(view, elt, coords) {\n var ref = findOffsetInNode(elt, coords);\n var node = ref.node;\n var offset = ref.offset;\n var bias = -1;\n if (node.nodeType == 1 && !node.firstChild) {\n var rect = node.getBoundingClientRect();\n bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n }\n return view.docView.posFromDOM(node, offset, bias)\n}\n\nfunction posFromCaret(view, node, offset, coords) {\n // Browser (in caretPosition/RangeFromPoint) will agressively\n // normalize towards nearby inline nodes. Since we are interested in\n // positions between block nodes too, we first walk up the hierarchy\n // of nodes to see if there are block nodes that the coordinates\n // fall outside of. If so, we take the position before/after that\n // block. If not, we call `posFromDOM` on the raw node/offset.\n var outside = -1;\n for (var cur = node;;) {\n if (cur == view.dom) { break }\n var desc = view.docView.nearestDesc(cur, true);\n if (!desc) { return null }\n if (desc.node.isBlock && desc.parent) {\n var rect = desc.dom.getBoundingClientRect();\n if (rect.left > coords.left || rect.top > coords.top) { outside = desc.posBefore; }\n else if (rect.right < coords.left || rect.bottom < coords.top) { outside = desc.posAfter; }\n else { break }\n }\n cur = desc.dom.parentNode;\n }\n return outside > -1 ? outside : view.docView.posFromDOM(node, offset)\n}\n\nfunction elementFromPoint(element, coords, box) {\n var len = element.childNodes.length;\n if (len && box.top < box.bottom) {\n for (var startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {\n var child = element.childNodes[i];\n if (child.nodeType == 1) {\n var rects = child.getClientRects();\n for (var j = 0; j < rects.length; j++) {\n var rect = rects[j];\n if (inRect(coords, rect)) { return elementFromPoint(child, coords, rect) }\n }\n }\n if ((i = (i + 1) % len) == startI) { break }\n }\n }\n return element\n}\n\n// Given an x,y position on the editor, get the position in the document.\nfunction posAtCoords(view, coords) {\n var assign, assign$1;\n\n var root = view.root, node, offset;\n if (root.caretPositionFromPoint) {\n try { // Firefox throws for this call in hard-to-predict circumstances (#994)\n var pos$1 = root.caretPositionFromPoint(coords.left, coords.top);\n if (pos$1) { ((assign = pos$1, node = assign.offsetNode, offset = assign.offset)); }\n } catch (_) {}\n }\n if (!node && root.caretRangeFromPoint) {\n var range = root.caretRangeFromPoint(coords.left, coords.top);\n if (range) { ((assign$1 = range, node = assign$1.startContainer, offset = assign$1.startOffset)); }\n }\n\n var elt = root.elementFromPoint(coords.left, coords.top + 1), pos;\n if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n var box = view.dom.getBoundingClientRect();\n if (!inRect(coords, box)) { return null }\n elt = elementFromPoint(view.dom, coords, box);\n if (!elt) { return null }\n }\n // Safari's caretRangeFromPoint returns nonsense when on a draggable element\n if (result.safari && elt.draggable) { node = offset = null; }\n elt = targetKludge(elt, coords);\n if (node) {\n if (result.gecko && node.nodeType == 1) {\n // Firefox will sometimes return offsets into nodes, which\n // have no actual children, from caretPositionFromPoint (#953)\n offset = Math.min(offset, node.childNodes.length);\n // It'll also move the returned position before image nodes,\n // even if those are behind it.\n if (offset < node.childNodes.length) {\n var next = node.childNodes[offset], box$1;\n if (next.nodeName == \"IMG\" && (box$1 = next.getBoundingClientRect()).right <= coords.left &&\n box$1.bottom > coords.top)\n { offset++; }\n }\n }\n // Suspiciously specific kludge to work around caret*FromPoint\n // never returning a position at the end of the document\n if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&\n coords.top > node.lastChild.getBoundingClientRect().bottom)\n { pos = view.state.doc.content.size; }\n // Ignore positions directly after a BR, since caret*FromPoint\n // 'round up' positions that would be more accurately placed\n // before the BR node.\n else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n { pos = posFromCaret(view, node, offset, coords); }\n }\n if (pos == null) { pos = posFromElement(view, elt, coords); }\n\n var desc = view.docView.nearestDesc(elt, true);\n return {pos: pos, inside: desc ? desc.posAtStart - desc.border : -1}\n}\n\nfunction singleRect(object, bias) {\n var rects = object.getClientRects();\n return !rects.length ? object.getBoundingClientRect() : rects[bias < 0 ? 0 : rects.length - 1]\n}\n\nvar BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n\n// : (EditorView, number, number) → {left: number, top: number, right: number, bottom: number}\n// Given a position in the document model, get a bounding box of the\n// character at that position, relative to the window.\nfunction coordsAtPos(view, pos, side) {\n var ref = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n var node = ref.node;\n var offset = ref.offset;\n\n var supportEmptyRange = result.webkit || result.gecko;\n if (node.nodeType == 3) {\n // These browsers support querying empty text ranges. Prefer that in\n // bidi context or when at the end of a node.\n if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n var rect = singleRect(textRange(node, offset, offset), side);\n // Firefox returns bad results (the position before the space)\n // when querying a position directly after line-broken\n // whitespace. Detect this situation and and kludge around it\n if (result.gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n var rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n if (rectBefore.top == rect.top) {\n var rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n if (rectAfter.top != rect.top)\n { return flattenV(rectAfter, rectAfter.left < rectBefore.left) }\n }\n }\n return rect\n } else {\n var from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n if (side < 0 && !offset) { to++; takeSide = -1; }\n else if (side >= 0 && offset == node.nodeValue.length) { from--; takeSide = 1; }\n else if (side < 0) { from--; }\n else { to ++; }\n return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0)\n }\n }\n\n // Return a horizontal line in block context\n if (!view.state.doc.resolve(pos).parent.inlineContent) {\n if (offset && (side < 0 || offset == nodeSize(node))) {\n var before = node.childNodes[offset - 1];\n if (before.nodeType == 1) { return flattenH(before.getBoundingClientRect(), false) }\n }\n if (offset < nodeSize(node)) {\n var after = node.childNodes[offset];\n if (after.nodeType == 1) { return flattenH(after.getBoundingClientRect(), true) }\n }\n return flattenH(node.getBoundingClientRect(), side >= 0)\n }\n\n // Inline, not in text node (this is not Bidi-safe)\n if (offset && (side < 0 || offset == nodeSize(node))) {\n var before$1 = node.childNodes[offset - 1];\n var target = before$1.nodeType == 3 ? textRange(before$1, nodeSize(before$1) - (supportEmptyRange ? 0 : 1))\n // BR nodes tend to only return the rectangle before them.\n // Only use them if they are the last element in their parent\n : before$1.nodeType == 1 && (before$1.nodeName != \"BR\" || !before$1.nextSibling) ? before$1 : null;\n if (target) { return flattenV(singleRect(target, 1), false) }\n }\n if (offset < nodeSize(node)) {\n var after$1 = node.childNodes[offset];\n var target$1 = after$1.nodeType == 3 ? textRange(after$1, 0, (supportEmptyRange ? 0 : 1))\n : after$1.nodeType == 1 ? after$1 : null;\n if (target$1) { return flattenV(singleRect(target$1, -1), true) }\n }\n // All else failed, just try to get a rectangle for the target node\n return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0)\n}\n\nfunction flattenV(rect, left) {\n if (rect.width == 0) { return rect }\n var x = left ? rect.left : rect.right;\n return {top: rect.top, bottom: rect.bottom, left: x, right: x}\n}\n\nfunction flattenH(rect, top) {\n if (rect.height == 0) { return rect }\n var y = top ? rect.top : rect.bottom;\n return {top: y, bottom: y, left: rect.left, right: rect.right}\n}\n\nfunction withFlushedState(view, state, f) {\n var viewState = view.state, active = view.root.activeElement;\n if (viewState != state) { view.updateState(state); }\n if (active != view.dom) { view.focus(); }\n try {\n return f()\n } finally {\n if (viewState != state) { view.updateState(viewState); }\n if (active != view.dom && active) { active.focus(); }\n }\n}\n\n// : (EditorView, number, number)\n// Whether vertical position motion in a given direction\n// from a position would leave a text block.\nfunction endOfTextblockVertical(view, state, dir) {\n var sel = state.selection;\n var $pos = dir == \"up\" ? sel.$from : sel.$to;\n return withFlushedState(view, state, function () {\n var ref = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n var dom = ref.node;\n for (;;) {\n var nearest = view.docView.nearestDesc(dom, true);\n if (!nearest) { break }\n if (nearest.node.isBlock) { dom = nearest.dom; break }\n dom = nearest.dom.parentNode;\n }\n var coords = coordsAtPos(view, $pos.pos, 1);\n for (var child = dom.firstChild; child; child = child.nextSibling) {\n var boxes = (void 0);\n if (child.nodeType == 1) { boxes = child.getClientRects(); }\n else if (child.nodeType == 3) { boxes = textRange(child, 0, child.nodeValue.length).getClientRects(); }\n else { continue }\n for (var i = 0; i < boxes.length; i++) {\n var box = boxes[i];\n if (box.bottom > box.top && (dir == \"up\" ? box.bottom < coords.top + 1 : box.top > coords.bottom - 1))\n { return false }\n }\n }\n return true\n })\n}\n\nvar maybeRTL = /[\\u0590-\\u08ac]/;\n\nfunction endOfTextblockHorizontal(view, state, dir) {\n var ref = state.selection;\n var $head = ref.$head;\n if (!$head.parent.isTextblock) { return false }\n var offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n var sel = getSelection();\n // If the textblock is all LTR, or the browser doesn't support\n // Selection.modify (Edge), fall back to a primitive approach\n if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n { return dir == \"left\" || dir == \"backward\" ? atStart : atEnd }\n\n return withFlushedState(view, state, function () {\n // This is a huge hack, but appears to be the best we can\n // currently do: use `Selection.modify` to move the selection by\n // one character, and see if that moves the cursor out of the\n // textblock (or doesn't move it at all, when at the start/end of\n // the document).\n var oldRange = sel.getRangeAt(0), oldNode = sel.focusNode, oldOff = sel.focusOffset;\n var oldBidiLevel = sel.caretBidiLevel; // Only for Firefox\n sel.modify(\"move\", dir, \"character\");\n var parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n var result = !parentDOM.contains(sel.focusNode.nodeType == 1 ? sel.focusNode : sel.focusNode.parentNode) ||\n (oldNode == sel.focusNode && oldOff == sel.focusOffset);\n // Restore the previous selection\n sel.removeAllRanges();\n sel.addRange(oldRange);\n if (oldBidiLevel != null) { sel.caretBidiLevel = oldBidiLevel; }\n return result\n })\n}\n\nvar cachedState = null, cachedDir = null, cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n if (cachedState == state && cachedDir == dir) { return cachedResult }\n cachedState = state; cachedDir = dir;\n return cachedResult = dir == \"up\" || dir == \"down\"\n ? endOfTextblockVertical(view, state, dir)\n : endOfTextblockHorizontal(view, state, dir)\n}\n\n// NodeView:: interface\n//\n// By default, document nodes are rendered using the result of the\n// [`toDOM`](#model.NodeSpec.toDOM) method of their spec, and managed\n// entirely by the editor. For some use cases, such as embedded\n// node-specific editing interfaces, you want more control over\n// the behavior of a node's in-editor representation, and need to\n// [define](#view.EditorProps.nodeViews) a custom node view.\n//\n// Mark views only support `dom` and `contentDOM`, and don't support\n// any of the node view methods.\n//\n// Objects returned as node views must conform to this interface.\n//\n// dom:: ?dom.Node\n// The outer DOM node that represents the document node. When not\n// given, the default strategy is used to create a DOM node.\n//\n// contentDOM:: ?dom.Node\n// The DOM node that should hold the node's content. Only meaningful\n// if the node view also defines a `dom` property and if its node\n// type is not a leaf node type. When this is present, ProseMirror\n// will take care of rendering the node's children into it. When it\n// is not present, the node view itself is responsible for rendering\n// (or deciding not to render) its child nodes.\n//\n// update:: ?(node: Node, decorations: [Decoration]) → bool\n// When given, this will be called when the view is updating itself.\n// It will be given a node (possibly of a different type), and an\n// array of active decorations (which are automatically drawn, and\n// the node view may ignore if it isn't interested in them), and\n// should return true if it was able to update to that node, and\n// false otherwise. If the node view has a `contentDOM` property (or\n// no `dom` property), updating its child nodes will be handled by\n// ProseMirror.\n//\n// selectNode:: ?()\n// Can be used to override the way the node's selected status (as a\n// node selection) is displayed.\n//\n// deselectNode:: ?()\n// When defining a `selectNode` method, you should also provide a\n// `deselectNode` method to remove the effect again.\n//\n// setSelection:: ?(anchor: number, head: number, root: dom.Document)\n// This will be called to handle setting the selection inside the\n// node. The `anchor` and `head` positions are relative to the start\n// of the node. By default, a DOM selection will be created between\n// the DOM positions corresponding to those positions, but if you\n// override it you can do something else.\n//\n// stopEvent:: ?(event: dom.Event) → bool\n// Can be used to prevent the editor view from trying to handle some\n// or all DOM events that bubble up from the node view. Events for\n// which this returns true are not handled by the editor.\n//\n// ignoreMutation:: ?(dom.MutationRecord) → bool\n// Called when a DOM\n// [mutation](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver)\n// or a selection change happens within the view. When the change is\n// a selection change, the record will have a `type` property of\n// `\"selection\"` (which doesn't occur for native mutation records).\n// Return false if the editor should re-read the selection or\n// re-parse the range around the mutation, true if it can safely be\n// ignored.\n//\n// destroy:: ?()\n// Called when the node view is removed from the editor or the whole\n// editor is destroyed. (Not available for marks.)\n\n// View descriptions are data structures that describe the DOM that is\n// used to represent the editor's content. They are used for:\n//\n// - Incremental redrawing when the document changes\n//\n// - Figuring out what part of the document a given DOM position\n// corresponds to\n//\n// - Wiring in custom implementations of the editing interface for a\n// given node\n//\n// They form a doubly-linked mutable tree, starting at `view.docView`.\n\nvar NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\n\n// Superclass for the various kinds of descriptions. Defines their\n// basic structure and shared methods.\nvar ViewDesc = function ViewDesc(parent, children, dom, contentDOM) {\n this.parent = parent;\n this.children = children;\n this.dom = dom;\n // An expando property on the DOM node provides a link back to its\n // description.\n dom.pmViewDesc = this;\n // This is the node that holds the child views. It may be null for\n // descs that don't have children.\n this.contentDOM = contentDOM;\n this.dirty = NOT_DIRTY;\n};\n\nvar prototypeAccessors = { beforePosition: { configurable: true },size: { configurable: true },border: { configurable: true },posBefore: { configurable: true },posAtStart: { configurable: true },posAfter: { configurable: true },posAtEnd: { configurable: true },contentLost: { configurable: true },domAtom: { configurable: true } };\n\n// Used to check whether a given description corresponds to a\n// widget/mark/node.\nViewDesc.prototype.matchesWidget = function matchesWidget () { return false };\nViewDesc.prototype.matchesMark = function matchesMark () { return false };\nViewDesc.prototype.matchesNode = function matchesNode () { return false };\nViewDesc.prototype.matchesHack = function matchesHack () { return false };\n\nprototypeAccessors.beforePosition.get = function () { return false };\n\n// : () → ?ParseRule\n// When parsing in-editor content (in domchange.js), we allow\n// descriptions to determine the parse rules that should be used to\n// parse them.\nViewDesc.prototype.parseRule = function parseRule () { return null };\n\n// : (dom.Event) → bool\n// Used by the editor's event handler to ignore events that come\n// from certain descs.\nViewDesc.prototype.stopEvent = function stopEvent () { return false };\n\n// The size of the content represented by this desc.\nprototypeAccessors.size.get = function () {\n var size = 0;\n for (var i = 0; i < this.children.length; i++) { size += this.children[i].size; }\n return size\n};\n\n// For block nodes, this represents the space taken up by their\n// start/end tokens.\nprototypeAccessors.border.get = function () { return 0 };\n\nViewDesc.prototype.destroy = function destroy () {\n this.parent = null;\n if (this.dom.pmViewDesc == this) { this.dom.pmViewDesc = null; }\n for (var i = 0; i < this.children.length; i++)\n { this.children[i].destroy(); }\n};\n\nViewDesc.prototype.posBeforeChild = function posBeforeChild (child) {\n for (var i = 0, pos = this.posAtStart; i < this.children.length; i++) {\n var cur = this.children[i];\n if (cur == child) { return pos }\n pos += cur.size;\n }\n};\n\nprototypeAccessors.posBefore.get = function () {\n return this.parent.posBeforeChild(this)\n};\n\nprototypeAccessors.posAtStart.get = function () {\n return this.parent ? this.parent.posBeforeChild(this) + this.border : 0\n};\n\nprototypeAccessors.posAfter.get = function () {\n return this.posBefore + this.size\n};\n\nprototypeAccessors.posAtEnd.get = function () {\n return this.posAtStart + this.size - 2 * this.border\n};\n\n// : (dom.Node, number, ?number) → number\nViewDesc.prototype.localPosFromDOM = function localPosFromDOM (dom, offset, bias) {\n // If the DOM position is in the content, use the child desc after\n // it to figure out a position.\n if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n if (bias < 0) {\n var domBefore, desc;\n if (dom == this.contentDOM) {\n domBefore = dom.childNodes[offset - 1];\n } else {\n while (dom.parentNode != this.contentDOM) { dom = dom.parentNode; }\n domBefore = dom.previousSibling;\n }\n while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this)) { domBefore = domBefore.previousSibling; }\n return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart\n } else {\n var domAfter, desc$1;\n if (dom == this.contentDOM) {\n domAfter = dom.childNodes[offset];\n } else {\n while (dom.parentNode != this.contentDOM) { dom = dom.parentNode; }\n domAfter = dom.nextSibling;\n }\n while (domAfter && !((desc$1 = domAfter.pmViewDesc) && desc$1.parent == this)) { domAfter = domAfter.nextSibling; }\n return domAfter ? this.posBeforeChild(desc$1) : this.posAtEnd\n }\n }\n // Otherwise, use various heuristics, falling back on the bias\n // parameter, to determine whether to return the position at the\n // start or at the end of this view desc.\n var atEnd;\n if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n } else if (this.dom.firstChild) {\n if (offset == 0) { for (var search = dom;; search = search.parentNode) {\n if (search == this.dom) { atEnd = false; break }\n if (search.parentNode.firstChild != search) { break }\n } }\n if (atEnd == null && offset == dom.childNodes.length) { for (var search$1 = dom;; search$1 = search$1.parentNode) {\n if (search$1 == this.dom) { atEnd = true; break }\n if (search$1.parentNode.lastChild != search$1) { break }\n } }\n }\n return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart\n};\n\n// Scan up the dom finding the first desc that is a descendant of\n// this one.\nViewDesc.prototype.nearestDesc = function nearestDesc (dom, onlyNodes) {\n for (var first = true, cur = dom; cur; cur = cur.parentNode) {\n var desc = this.getDesc(cur);\n if (desc && (!onlyNodes || desc.node)) {\n // If dom is outside of this desc's nodeDOM, don't count it.\n if (first && desc.nodeDOM &&\n !(desc.nodeDOM.nodeType == 1 ? desc.nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : desc.nodeDOM == dom))\n { first = false; }\n else\n { return desc }\n }\n }\n};\n\nViewDesc.prototype.getDesc = function getDesc (dom) {\n var desc = dom.pmViewDesc;\n for (var cur = desc; cur; cur = cur.parent) { if (cur == this) { return desc } }\n};\n\nViewDesc.prototype.posFromDOM = function posFromDOM (dom, offset, bias) {\n for (var scan = dom; scan; scan = scan.parentNode) {\n var desc = this.getDesc(scan);\n if (desc) { return desc.localPosFromDOM(dom, offset, bias) }\n }\n return -1\n};\n\n// : (number) → ?NodeViewDesc\n// Find the desc for the node after the given pos, if any. (When a\n// parent node overrode rendering, there might not be one.)\nViewDesc.prototype.descAt = function descAt (pos) {\n for (var i = 0, offset = 0; i < this.children.length; i++) {\n var child = this.children[i], end = offset + child.size;\n if (offset == pos && end != offset) {\n while (!child.border && child.children.length) { child = child.children[0]; }\n return child\n }\n if (pos < end) { return child.descAt(pos - offset - child.border) }\n offset = end;\n }\n};\n\n// : (number, number) → {node: dom.Node, offset: number}\nViewDesc.prototype.domFromPos = function domFromPos (pos, side) {\n if (!this.contentDOM) { return {node: this.dom, offset: 0} }\n for (var offset = 0, i = 0, first = true;; i++, first = false) {\n // Skip removed or always-before children\n while (i < this.children.length && (this.children[i].beforePosition ||\n this.children[i].dom.parentNode != this.contentDOM))\n { offset += this.children[i++].size; }\n var child = i == this.children.length ? null : this.children[i];\n if (offset == pos && (side == 0 || !child || !child.size || child.border || (side < 0 && first)) ||\n child && child.domAtom && pos < offset + child.size) { return {\n node: this.contentDOM,\n offset: child ? domIndex(child.dom) : this.contentDOM.childNodes.length\n } }\n if (!child) { throw new Error(\"Invalid position \" + pos) }\n var end = offset + child.size;\n if (!child.domAtom && (side < 0 && !child.border ? end >= pos : end > pos))\n { return child.domFromPos(pos - offset - child.border, side) }\n offset = end;\n }\n};\n\n// Used to find a DOM range in a single parent for a given changed\n// range.\nViewDesc.prototype.parseRange = function parseRange (from, to, base) {\n if ( base === void 0 ) base = 0;\n\n if (this.children.length == 0)\n { return {node: this.contentDOM, from: from, to: to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length} }\n\n var fromOffset = -1, toOffset = -1;\n for (var offset = base, i = 0;; i++) {\n var child = this.children[i], end = offset + child.size;\n if (fromOffset == -1 && from <= end) {\n var childBase = offset + child.border;\n // FIXME maybe descend mark views to parse a narrower range?\n if (from >= childBase && to <= end - child.border && child.node &&\n child.contentDOM && this.contentDOM.contains(child.contentDOM))\n { return child.parseRange(from, to, childBase) }\n\n from = offset;\n for (var j = i; j > 0; j--) {\n var prev = this.children[j - 1];\n if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n fromOffset = domIndex(prev.dom) + 1;\n break\n }\n from -= prev.size;\n }\n if (fromOffset == -1) { fromOffset = 0; }\n }\n if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n to = end;\n for (var j$1 = i + 1; j$1 < this.children.length; j$1++) {\n var next = this.children[j$1];\n if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n toOffset = domIndex(next.dom);\n break\n }\n to += next.size;\n }\n if (toOffset == -1) { toOffset = this.contentDOM.childNodes.length; }\n break\n }\n offset = end;\n }\n return {node: this.contentDOM, from: from, to: to, fromOffset: fromOffset, toOffset: toOffset}\n};\n\nViewDesc.prototype.emptyChildAt = function emptyChildAt (side) {\n if (this.border || !this.contentDOM || !this.children.length) { return false }\n var child = this.children[side < 0 ? 0 : this.children.length - 1];\n return child.size == 0 || child.emptyChildAt(side)\n};\n\n// : (number) → dom.Node\nViewDesc.prototype.domAfterPos = function domAfterPos (pos) {\n var ref = this.domFromPos(pos, 0);\n var node = ref.node;\n var offset = ref.offset;\n if (node.nodeType != 1 || offset == node.childNodes.length)\n { throw new RangeError(\"No node after pos \" + pos) }\n return node.childNodes[offset]\n};\n\n// : (number, number, dom.Document)\n// View descs are responsible for setting any selection that falls\n// entirely inside of them, so that custom implementations can do\n// custom things with the selection. Note that this falls apart when\n// a selection starts in such a node and ends in another, in which\n// case we just use whatever domFromPos produces as a best effort.\nViewDesc.prototype.setSelection = function setSelection (anchor, head, root, force) {\n // If the selection falls entirely in a child, give it to that child\n var from = Math.min(anchor, head), to = Math.max(anchor, head);\n for (var i = 0, offset = 0; i < this.children.length; i++) {\n var child = this.children[i], end = offset + child.size;\n if (from > offset && to < end)\n { return child.setSelection(anchor - offset - child.border, head - offset - child.border, root, force) }\n offset = end;\n }\n\n var anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n var headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n var domSel = root.getSelection();\n\n var brKludge = false;\n // On Firefox, using Selection.collapse to put the cursor after a\n // BR node for some reason doesn't always work (#1073). On Safari,\n // the cursor sometimes inexplicable visually lags behind its\n // reported position in such situations (#1092).\n if ((result.gecko || result.safari) && anchor == head) {\n var node = anchorDOM.node;\n var offset$1 = anchorDOM.offset;\n if (node.nodeType == 3) {\n brKludge = offset$1 && node.nodeValue[offset$1 - 1] == \"\\n\";\n // Issue #1128\n if (brKludge && offset$1 == node.nodeValue.length &&\n node.nextSibling && node.nextSibling.nodeName == \"BR\")\n { anchorDOM = headDOM = {node: node.parentNode, offset: domIndex(node) + 1}; }\n } else {\n var prev = node.childNodes[offset$1 - 1];\n brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n }\n }\n\n if (!(force || brKludge && result.safari) &&\n isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) &&\n isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset))\n { return }\n\n // Selection.extend can be used to create an 'inverted' selection\n // (one where the focus is before the anchor), but not all\n // browsers support it yet.\n var domSelExtended = false;\n if ((domSel.extend || anchor == head) && !brKludge) {\n domSel.collapse(anchorDOM.node, anchorDOM.offset);\n try {\n if (anchor != head) { domSel.extend(headDOM.node, headDOM.offset); }\n domSelExtended = true;\n } catch (err) {\n // In some cases with Chrome the selection is empty after calling\n // collapse, even when it should be valid. This appears to be a bug, but\n // it is difficult to isolate. If this happens fallback to the old path\n // without using extend.\n if (!(err instanceof DOMException)) { throw err }\n // declare global: DOMException\n }\n }\n if (!domSelExtended) {\n if (anchor > head) { var tmp = anchorDOM; anchorDOM = headDOM; headDOM = tmp; }\n var range = document.createRange();\n range.setEnd(headDOM.node, headDOM.offset);\n range.setStart(anchorDOM.node, anchorDOM.offset);\n domSel.removeAllRanges();\n domSel.addRange(range);\n }\n};\n\n// : (dom.MutationRecord) → bool\nViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return !this.contentDOM && mutation.type != \"selection\"\n};\n\nprototypeAccessors.contentLost.get = function () {\n return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM)\n};\n\n// Remove a subtree of the element tree that has been touched\n// by a DOM change, so that the next update will redraw it.\nViewDesc.prototype.markDirty = function markDirty (from, to) {\n for (var offset = 0, i = 0; i < this.children.length; i++) {\n var child = this.children[i], end = offset + child.size;\n if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n var startInside = offset + child.border, endInside = end - child.border;\n if (from >= startInside && to <= endInside) {\n this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n if (from == startInside && to == endInside &&\n (child.contentLost || child.dom.parentNode != this.contentDOM)) { child.dirty = NODE_DIRTY; }\n else { child.markDirty(from - startInside, to - startInside); }\n return\n } else {\n child.dirty = NODE_DIRTY;\n }\n }\n offset = end;\n }\n this.dirty = CONTENT_DIRTY;\n};\n\nViewDesc.prototype.markParentsDirty = function markParentsDirty () {\n var level = 1;\n for (var node = this.parent; node; node = node.parent, level++) {\n var dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n if (node.dirty < dirty) { node.dirty = dirty; }\n }\n};\n\nprototypeAccessors.domAtom.get = function () { return false };\n\nObject.defineProperties( ViewDesc.prototype, prototypeAccessors );\n\n// Reused array to avoid allocating fresh arrays for things that will\n// stay empty anyway.\nvar nothing = [];\n\n// A widget desc represents a widget decoration, which is a DOM node\n// drawn between the document nodes.\nvar WidgetViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function WidgetViewDesc(parent, widget, view, pos) {\n var self, dom = widget.type.toDOM;\n if (typeof dom == \"function\") { dom = dom(view, function () {\n if (!self) { return pos }\n if (self.parent) { return self.parent.posBeforeChild(self) }\n }); }\n if (!widget.type.spec.raw) {\n if (dom.nodeType != 1) {\n var wrap = document.createElement(\"span\");\n wrap.appendChild(dom);\n dom = wrap;\n }\n dom.contentEditable = false;\n dom.classList.add(\"ProseMirror-widget\");\n }\n ViewDesc.call(this, parent, nothing, dom, null);\n this.widget = widget;\n self = this;\n }\n\n if ( ViewDesc ) WidgetViewDesc.__proto__ = ViewDesc;\n WidgetViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n WidgetViewDesc.prototype.constructor = WidgetViewDesc;\n\n var prototypeAccessors$1 = { beforePosition: { configurable: true },domAtom: { configurable: true } };\n\n prototypeAccessors$1.beforePosition.get = function () {\n return this.widget.type.side < 0\n };\n\n WidgetViewDesc.prototype.matchesWidget = function matchesWidget (widget) {\n return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type)\n };\n\n WidgetViewDesc.prototype.parseRule = function parseRule () { return {ignore: true} };\n\n WidgetViewDesc.prototype.stopEvent = function stopEvent (event) {\n var stop = this.widget.spec.stopEvent;\n return stop ? stop(event) : false\n };\n\n WidgetViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return mutation.type != \"selection\" || this.widget.spec.ignoreSelection\n };\n\n prototypeAccessors$1.domAtom.get = function () { return true };\n\n Object.defineProperties( WidgetViewDesc.prototype, prototypeAccessors$1 );\n\n return WidgetViewDesc;\n}(ViewDesc));\n\nvar CompositionViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function CompositionViewDesc(parent, dom, textDOM, text) {\n ViewDesc.call(this, parent, nothing, dom, null);\n this.textDOM = textDOM;\n this.text = text;\n }\n\n if ( ViewDesc ) CompositionViewDesc.__proto__ = ViewDesc;\n CompositionViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n CompositionViewDesc.prototype.constructor = CompositionViewDesc;\n\n var prototypeAccessors$2 = { size: { configurable: true } };\n\n prototypeAccessors$2.size.get = function () { return this.text.length };\n\n CompositionViewDesc.prototype.localPosFromDOM = function localPosFromDOM (dom, offset) {\n if (dom != this.textDOM) { return this.posAtStart + (offset ? this.size : 0) }\n return this.posAtStart + offset\n };\n\n CompositionViewDesc.prototype.domFromPos = function domFromPos (pos) {\n return {node: this.textDOM, offset: pos}\n };\n\n CompositionViewDesc.prototype.ignoreMutation = function ignoreMutation (mut) {\n return mut.type === 'characterData' && mut.target.nodeValue == mut.oldValue\n };\n\n Object.defineProperties( CompositionViewDesc.prototype, prototypeAccessors$2 );\n\n return CompositionViewDesc;\n}(ViewDesc));\n\n// A mark desc represents a mark. May have multiple children,\n// depending on how the mark is split. Note that marks are drawn using\n// a fixed nesting order, for simplicity and predictability, so in\n// some cases they will be split more often than would appear\n// necessary.\nvar MarkViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function MarkViewDesc(parent, mark, dom, contentDOM) {\n ViewDesc.call(this, parent, [], dom, contentDOM);\n this.mark = mark;\n }\n\n if ( ViewDesc ) MarkViewDesc.__proto__ = ViewDesc;\n MarkViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n MarkViewDesc.prototype.constructor = MarkViewDesc;\n\n MarkViewDesc.create = function create (parent, mark, inline, view) {\n var custom = view.nodeViews[mark.type.name];\n var spec = custom && custom(mark, view, inline);\n if (!spec || !spec.dom)\n { spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline)); }\n return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom)\n };\n\n MarkViewDesc.prototype.parseRule = function parseRule () { return {mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM} };\n\n MarkViewDesc.prototype.matchesMark = function matchesMark (mark) { return this.dirty != NODE_DIRTY && this.mark.eq(mark) };\n\n MarkViewDesc.prototype.markDirty = function markDirty (from, to) {\n ViewDesc.prototype.markDirty.call(this, from, to);\n // Move dirty info to nearest node view\n if (this.dirty != NOT_DIRTY) {\n var parent = this.parent;\n while (!parent.node) { parent = parent.parent; }\n if (parent.dirty < this.dirty) { parent.dirty = this.dirty; }\n this.dirty = NOT_DIRTY;\n }\n };\n\n MarkViewDesc.prototype.slice = function slice (from, to, view) {\n var copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n var nodes = this.children, size = this.size;\n if (to < size) { nodes = replaceNodes(nodes, to, size, view); }\n if (from > 0) { nodes = replaceNodes(nodes, 0, from, view); }\n for (var i = 0; i < nodes.length; i++) { nodes[i].parent = copy; }\n copy.children = nodes;\n return copy\n };\n\n return MarkViewDesc;\n}(ViewDesc));\n\n// Node view descs are the main, most common type of view desc, and\n// correspond to an actual node in the document. Unlike mark descs,\n// they populate their child array themselves.\nvar NodeViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) {\n ViewDesc.call(this, parent, node.isLeaf ? nothing : [], dom, contentDOM);\n this.nodeDOM = nodeDOM;\n this.node = node;\n this.outerDeco = outerDeco;\n this.innerDeco = innerDeco;\n if (contentDOM) { this.updateChildren(view, pos); }\n }\n\n if ( ViewDesc ) NodeViewDesc.__proto__ = ViewDesc;\n NodeViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n NodeViewDesc.prototype.constructor = NodeViewDesc;\n\n var prototypeAccessors$3 = { size: { configurable: true },border: { configurable: true },domAtom: { configurable: true } };\n\n // By default, a node is rendered using the `toDOM` method from the\n // node type spec. But client code can use the `nodeViews` spec to\n // supply a custom node view, which can influence various aspects of\n // the way the node works.\n //\n // (Using subclassing for this was intentionally decided against,\n // since it'd require exposing a whole slew of finnicky\n // implementation details to the user code that they probably will\n // never need.)\n NodeViewDesc.create = function create (parent, node, outerDeco, innerDeco, view, pos) {\n var assign;\n\n var custom = view.nodeViews[node.type.name], descObj;\n var spec = custom && custom(node, view, function () {\n // (This is a function that allows the custom view to find its\n // own position)\n if (!descObj) { return pos }\n if (descObj.parent) { return descObj.parent.posBeforeChild(descObj) }\n }, outerDeco);\n\n var dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n if (node.isText) {\n if (!dom) { dom = document.createTextNode(node.text); }\n else if (dom.nodeType != 3) { throw new RangeError(\"Text must be rendered as a DOM text node\") }\n } else if (!dom) {\n((assign = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node)), dom = assign.dom, contentDOM = assign.contentDOM));\n }\n if (!contentDOM && !node.isText && dom.nodeName != \"BR\") { // Chrome gets confused by
              \n if (!dom.hasAttribute(\"contenteditable\")) { dom.contentEditable = false; }\n if (node.type.spec.draggable) { dom.draggable = true; }\n }\n\n var nodeDOM = dom;\n dom = applyOuterDeco(dom, outerDeco, node);\n\n if (spec)\n { return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM,\n spec, view, pos + 1) }\n else if (node.isText)\n { return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) }\n else\n { return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos + 1) }\n };\n\n NodeViewDesc.prototype.parseRule = function parseRule () {\n var this$1 = this;\n\n // Experimental kludge to allow opt-in re-parsing of nodes\n if (this.node.type.spec.reparseInView) { return null }\n // FIXME the assumption that this can always return the current\n // attrs means that if the user somehow manages to change the\n // attrs in the dom, that won't be picked up. Not entirely sure\n // whether this is a problem\n var rule = {node: this.node.type.name, attrs: this.node.attrs};\n if (this.node.type.spec.code) { rule.preserveWhitespace = \"full\"; }\n if (this.contentDOM && !this.contentLost) { rule.contentElement = this.contentDOM; }\n else { rule.getContent = function () { return this$1.contentDOM ? Fragment.empty : this$1.node.content; }; }\n return rule\n };\n\n NodeViewDesc.prototype.matchesNode = function matchesNode (node, outerDeco, innerDeco) {\n return this.dirty == NOT_DIRTY && node.eq(this.node) &&\n sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco)\n };\n\n prototypeAccessors$3.size.get = function () { return this.node.nodeSize };\n\n prototypeAccessors$3.border.get = function () { return this.node.isLeaf ? 0 : 1 };\n\n // Syncs `this.children` to match `this.node.content` and the local\n // decorations, possibly introducing nesting for marks. Then, in a\n // separate step, syncs the DOM inside `this.contentDOM` to\n // `this.children`.\n NodeViewDesc.prototype.updateChildren = function updateChildren (view, pos) {\n var this$1 = this;\n\n var inline = this.node.inlineContent, off = pos;\n var composition = inline && view.composing && this.localCompositionNode(view, pos);\n var updater = new ViewTreeUpdater(this, composition && composition.node);\n iterDeco(this.node, this.innerDeco, function (widget, i, insideNode) {\n if (widget.spec.marks)\n { updater.syncToMarks(widget.spec.marks, inline, view); }\n else if (widget.type.side >= 0 && !insideNode)\n { updater.syncToMarks(i == this$1.node.childCount ? Mark.none : this$1.node.child(i).marks, inline, view); }\n // If the next node is a desc matching this widget, reuse it,\n // otherwise insert the widget as a new view desc.\n updater.placeWidget(widget, view, off);\n }, function (child, outerDeco, innerDeco, i) {\n // Make sure the wrapping mark descs match the node's marks.\n updater.syncToMarks(child.marks, inline, view);\n // Either find an existing desc that exactly matches this node,\n // and drop the descs before it.\n updater.findNodeMatch(child, outerDeco, innerDeco, i) ||\n // Or try updating the next desc to reflect this node.\n updater.updateNextNode(child, outerDeco, innerDeco, view, i) ||\n // Or just add it as a new desc.\n updater.addNode(child, outerDeco, innerDeco, view, off);\n off += child.nodeSize;\n });\n // Drop all remaining descs after the current position.\n updater.syncToMarks(nothing, inline, view);\n if (this.node.isTextblock) { updater.addTextblockHacks(); }\n updater.destroyRest();\n\n // Sync the DOM if anything changed\n if (updater.changed || this.dirty == CONTENT_DIRTY) {\n // May have to protect focused DOM from being changed if a composition is active\n if (composition) { this.protectLocalComposition(view, composition); }\n renderDescs(this.contentDOM, this.children, view);\n if (result.ios) { iosHacks(this.dom); }\n }\n };\n\n NodeViewDesc.prototype.localCompositionNode = function localCompositionNode (view, pos) {\n // Only do something if both the selection and a focused text node\n // are inside of this node, and the node isn't already part of a\n // view that's a child of this view\n var ref = view.state.selection;\n var from = ref.from;\n var to = ref.to;\n if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size) { return }\n var sel = view.root.getSelection();\n var textNode = nearbyTextNode(sel.focusNode, sel.focusOffset);\n if (!textNode || !this.dom.contains(textNode.parentNode)) { return }\n\n // Find the text in the focused node in the node, stop if it's not\n // there (may have been modified through other means, in which\n // case it should overwritten)\n var text = textNode.nodeValue;\n var textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n\n return textPos < 0 ? null : {node: textNode, pos: textPos, text: text}\n };\n\n NodeViewDesc.prototype.protectLocalComposition = function protectLocalComposition (view, ref) {\n var node = ref.node;\n var pos = ref.pos;\n var text = ref.text;\n\n // The node is already part of a local view desc, leave it there\n if (this.getDesc(node)) { return }\n\n // Create a composition view for the orphaned nodes\n var topNode = node;\n for (;; topNode = topNode.parentNode) {\n if (topNode.parentNode == this.contentDOM) { break }\n while (topNode.previousSibling) { topNode.parentNode.removeChild(topNode.previousSibling); }\n while (topNode.nextSibling) { topNode.parentNode.removeChild(topNode.nextSibling); }\n if (topNode.pmViewDesc) { topNode.pmViewDesc = null; }\n }\n var desc = new CompositionViewDesc(this, topNode, node, text);\n view.compositionNodes.push(desc);\n\n // Patch up this.children to contain the composition view\n this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n };\n\n // : (Node, [Decoration], DecorationSet, EditorView) → bool\n // If this desc be updated to match the given node decoration,\n // do so and return true.\n NodeViewDesc.prototype.update = function update (node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY ||\n !node.sameMarkup(this.node)) { return false }\n this.updateInner(node, outerDeco, innerDeco, view);\n return true\n };\n\n NodeViewDesc.prototype.updateInner = function updateInner (node, outerDeco, innerDeco, view) {\n this.updateOuterDeco(outerDeco);\n this.node = node;\n this.innerDeco = innerDeco;\n if (this.contentDOM) { this.updateChildren(view, this.posAtStart); }\n this.dirty = NOT_DIRTY;\n };\n\n NodeViewDesc.prototype.updateOuterDeco = function updateOuterDeco (outerDeco) {\n if (sameOuterDeco(outerDeco, this.outerDeco)) { return }\n var needsWrap = this.nodeDOM.nodeType != 1;\n var oldDOM = this.dom;\n this.dom = patchOuterDeco(this.dom, this.nodeDOM,\n computeOuterDeco(this.outerDeco, this.node, needsWrap),\n computeOuterDeco(outerDeco, this.node, needsWrap));\n if (this.dom != oldDOM) {\n oldDOM.pmViewDesc = null;\n this.dom.pmViewDesc = this;\n }\n this.outerDeco = outerDeco;\n };\n\n // Mark this node as being the selected node.\n NodeViewDesc.prototype.selectNode = function selectNode () {\n this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable) { this.dom.draggable = true; }\n };\n\n // Remove selected node marking from this node.\n NodeViewDesc.prototype.deselectNode = function deselectNode () {\n this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable) { this.dom.removeAttribute(\"draggable\"); }\n };\n\n prototypeAccessors$3.domAtom.get = function () { return this.node.isAtom };\n\n Object.defineProperties( NodeViewDesc.prototype, prototypeAccessors$3 );\n\n return NodeViewDesc;\n}(ViewDesc));\n\n// Create a view desc for the top-level document node, to be exported\n// and used by the view class.\nfunction docViewDesc(doc, outerDeco, innerDeco, dom, view) {\n applyOuterDeco(dom, outerDeco, doc);\n return new NodeViewDesc(null, doc, outerDeco, innerDeco, dom, dom, dom, view, 0)\n}\n\nvar TextViewDesc = /*@__PURE__*/(function (NodeViewDesc) {\n function TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) {\n NodeViewDesc.call(this, parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view);\n }\n\n if ( NodeViewDesc ) TextViewDesc.__proto__ = NodeViewDesc;\n TextViewDesc.prototype = Object.create( NodeViewDesc && NodeViewDesc.prototype );\n TextViewDesc.prototype.constructor = TextViewDesc;\n\n var prototypeAccessors$4 = { domAtom: { configurable: true } };\n\n TextViewDesc.prototype.parseRule = function parseRule () {\n var skip = this.nodeDOM.parentNode;\n while (skip && skip != this.dom && !skip.pmIsDeco) { skip = skip.parentNode; }\n return {skip: skip || true}\n };\n\n TextViewDesc.prototype.update = function update (node, outerDeco, _, view) {\n if (this.dirty == NODE_DIRTY || (this.dirty != NOT_DIRTY && !this.inParent()) ||\n !node.sameMarkup(this.node)) { return false }\n this.updateOuterDeco(outerDeco);\n if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n this.nodeDOM.nodeValue = node.text;\n if (view.trackWrites == this.nodeDOM) { view.trackWrites = null; }\n }\n this.node = node;\n this.dirty = NOT_DIRTY;\n return true\n };\n\n TextViewDesc.prototype.inParent = function inParent () {\n var parentDOM = this.parent.contentDOM;\n for (var n = this.nodeDOM; n; n = n.parentNode) { if (n == parentDOM) { return true } }\n return false\n };\n\n TextViewDesc.prototype.domFromPos = function domFromPos (pos) {\n return {node: this.nodeDOM, offset: pos}\n };\n\n TextViewDesc.prototype.localPosFromDOM = function localPosFromDOM (dom, offset, bias) {\n if (dom == this.nodeDOM) { return this.posAtStart + Math.min(offset, this.node.text.length) }\n return NodeViewDesc.prototype.localPosFromDOM.call(this, dom, offset, bias)\n };\n\n TextViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return mutation.type != \"characterData\" && mutation.type != \"selection\"\n };\n\n TextViewDesc.prototype.slice = function slice (from, to, view) {\n var node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view)\n };\n\n prototypeAccessors$4.domAtom.get = function () { return false };\n\n Object.defineProperties( TextViewDesc.prototype, prototypeAccessors$4 );\n\n return TextViewDesc;\n}(NodeViewDesc));\n\n// A dummy desc used to tag trailing BR or span nodes created to work\n// around contentEditable terribleness.\nvar BRHackViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function BRHackViewDesc () {\n ViewDesc.apply(this, arguments);\n }\n\n if ( ViewDesc ) BRHackViewDesc.__proto__ = ViewDesc;\n BRHackViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n BRHackViewDesc.prototype.constructor = BRHackViewDesc;\n\n var prototypeAccessors$5 = { domAtom: { configurable: true } };\n\n BRHackViewDesc.prototype.parseRule = function parseRule () { return {ignore: true} };\n BRHackViewDesc.prototype.matchesHack = function matchesHack () { return this.dirty == NOT_DIRTY };\n prototypeAccessors$5.domAtom.get = function () { return true };\n\n Object.defineProperties( BRHackViewDesc.prototype, prototypeAccessors$5 );\n\n return BRHackViewDesc;\n}(ViewDesc));\n\n// A separate subclass is used for customized node views, so that the\n// extra checks only have to be made for nodes that are actually\n// customized.\nvar CustomNodeViewDesc = /*@__PURE__*/(function (NodeViewDesc) {\n function CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) {\n NodeViewDesc.call(this, parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos);\n this.spec = spec;\n }\n\n if ( NodeViewDesc ) CustomNodeViewDesc.__proto__ = NodeViewDesc;\n CustomNodeViewDesc.prototype = Object.create( NodeViewDesc && NodeViewDesc.prototype );\n CustomNodeViewDesc.prototype.constructor = CustomNodeViewDesc;\n\n // A custom `update` method gets to decide whether the update goes\n // through. If it does, and there's a `contentDOM` node, our logic\n // updates the children.\n CustomNodeViewDesc.prototype.update = function update (node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY) { return false }\n if (this.spec.update) {\n var result = this.spec.update(node, outerDeco);\n if (result) { this.updateInner(node, outerDeco, innerDeco, view); }\n return result\n } else if (!this.contentDOM && !node.isLeaf) {\n return false\n } else {\n return NodeViewDesc.prototype.update.call(this, node, outerDeco, innerDeco, view)\n }\n };\n\n CustomNodeViewDesc.prototype.selectNode = function selectNode () {\n this.spec.selectNode ? this.spec.selectNode() : NodeViewDesc.prototype.selectNode.call(this);\n };\n\n CustomNodeViewDesc.prototype.deselectNode = function deselectNode () {\n this.spec.deselectNode ? this.spec.deselectNode() : NodeViewDesc.prototype.deselectNode.call(this);\n };\n\n CustomNodeViewDesc.prototype.setSelection = function setSelection (anchor, head, root, force) {\n this.spec.setSelection ? this.spec.setSelection(anchor, head, root)\n : NodeViewDesc.prototype.setSelection.call(this, anchor, head, root, force);\n };\n\n CustomNodeViewDesc.prototype.destroy = function destroy () {\n if (this.spec.destroy) { this.spec.destroy(); }\n NodeViewDesc.prototype.destroy.call(this);\n };\n\n CustomNodeViewDesc.prototype.stopEvent = function stopEvent (event) {\n return this.spec.stopEvent ? this.spec.stopEvent(event) : false\n };\n\n CustomNodeViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : NodeViewDesc.prototype.ignoreMutation.call(this, mutation)\n };\n\n return CustomNodeViewDesc;\n}(NodeViewDesc));\n\n// : (dom.Node, [ViewDesc])\n// Sync the content of the given DOM node with the nodes associated\n// with the given array of view descs, recursing into mark descs\n// because this should sync the subtree for a whole node at a time.\nfunction renderDescs(parentDOM, descs, view) {\n var dom = parentDOM.firstChild, written = false;\n for (var i = 0; i < descs.length; i++) {\n var desc = descs[i], childDOM = desc.dom;\n if (childDOM.parentNode == parentDOM) {\n while (childDOM != dom) { dom = rm(dom); written = true; }\n dom = dom.nextSibling;\n } else {\n written = true;\n parentDOM.insertBefore(childDOM, dom);\n }\n if (desc instanceof MarkViewDesc) {\n var pos = dom ? dom.previousSibling : parentDOM.lastChild;\n renderDescs(desc.contentDOM, desc.children, view);\n dom = pos ? pos.nextSibling : parentDOM.firstChild;\n }\n }\n while (dom) { dom = rm(dom); written = true; }\n if (written && view.trackWrites == parentDOM) { view.trackWrites = null; }\n}\n\nfunction OuterDecoLevel(nodeName) {\n if (nodeName) { this.nodeName = nodeName; }\n}\nOuterDecoLevel.prototype = Object.create(null);\n\nvar noDeco = [new OuterDecoLevel];\n\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n if (outerDeco.length == 0) { return noDeco }\n\n var top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top];\n\n for (var i = 0; i < outerDeco.length; i++) {\n var attrs = outerDeco[i].type.attrs;\n if (!attrs) { continue }\n if (attrs.nodeName)\n { result.push(top = new OuterDecoLevel(attrs.nodeName)); }\n\n for (var name in attrs) {\n var val = attrs[name];\n if (val == null) { continue }\n if (needsWrap && result.length == 1)\n { result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\")); }\n if (name == \"class\") { top.class = (top.class ? top.class + \" \" : \"\") + val; }\n else if (name == \"style\") { top.style = (top.style ? top.style + \";\" : \"\") + val; }\n else if (name != \"nodeName\") { top[name] = val; }\n }\n }\n\n return result\n}\n\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n // Shortcut for trivial case\n if (prevComputed == noDeco && curComputed == noDeco) { return nodeDOM }\n\n var curDOM = nodeDOM;\n for (var i = 0; i < curComputed.length; i++) {\n var deco = curComputed[i], prev = prevComputed[i];\n if (i) {\n var parent = (void 0);\n if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM &&\n (parent = curDOM.parentNode) && parent.tagName.toLowerCase() == deco.nodeName) {\n curDOM = parent;\n } else {\n parent = document.createElement(deco.nodeName);\n parent.pmIsDeco = true;\n parent.appendChild(curDOM);\n prev = noDeco[0];\n curDOM = parent;\n }\n }\n patchAttributes(curDOM, prev || noDeco[0], deco);\n }\n return curDOM\n}\n\nfunction patchAttributes(dom, prev, cur) {\n for (var name in prev)\n { if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n { dom.removeAttribute(name); } }\n for (var name$1 in cur)\n { if (name$1 != \"class\" && name$1 != \"style\" && name$1 != \"nodeName\" && cur[name$1] != prev[name$1])\n { dom.setAttribute(name$1, cur[name$1]); } }\n if (prev.class != cur.class) {\n var prevList = prev.class ? prev.class.split(\" \") : nothing;\n var curList = cur.class ? cur.class.split(\" \") : nothing;\n for (var i = 0; i < prevList.length; i++) { if (curList.indexOf(prevList[i]) == -1)\n { dom.classList.remove(prevList[i]); } }\n for (var i$1 = 0; i$1 < curList.length; i$1++) { if (prevList.indexOf(curList[i$1]) == -1)\n { dom.classList.add(curList[i$1]); } }\n }\n if (prev.style != cur.style) {\n if (prev.style) {\n var prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n while (m = prop.exec(prev.style))\n { dom.style.removeProperty(m[1]); }\n }\n if (cur.style)\n { dom.style.cssText += cur.style; }\n }\n}\n\nfunction applyOuterDeco(dom, deco, node) {\n return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1))\n}\n\n// : ([Decoration], [Decoration]) → bool\nfunction sameOuterDeco(a, b) {\n if (a.length != b.length) { return false }\n for (var i = 0; i < a.length; i++) { if (!a[i].type.eq(b[i].type)) { return false } }\n return true\n}\n\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n var next = dom.nextSibling;\n dom.parentNode.removeChild(dom);\n return next\n}\n\n// Helper class for incrementally updating a tree of mark descs and\n// the widget and node descs inside of them.\nvar ViewTreeUpdater = function ViewTreeUpdater(top, lockedNode) {\n this.top = top;\n this.lock = lockedNode;\n // Index into `this.top`'s child array, represents the current\n // update position.\n this.index = 0;\n // When entering a mark, the current top and index are pushed\n // onto this.\n this.stack = [];\n // Tracks whether anything was changed\n this.changed = false;\n\n var pre = preMatch(top.node.content, top.children);\n this.preMatched = pre.nodes;\n this.preMatchOffset = pre.offset;\n};\n\nViewTreeUpdater.prototype.getPreMatch = function getPreMatch (index) {\n return index >= this.preMatchOffset ? this.preMatched[index - this.preMatchOffset] : null\n};\n\n// Destroy and remove the children between the given indices in\n// `this.top`.\nViewTreeUpdater.prototype.destroyBetween = function destroyBetween (start, end) {\n if (start == end) { return }\n for (var i = start; i < end; i++) { this.top.children[i].destroy(); }\n this.top.children.splice(start, end - start);\n this.changed = true;\n};\n\n// Destroy all remaining children in `this.top`.\nViewTreeUpdater.prototype.destroyRest = function destroyRest () {\n this.destroyBetween(this.index, this.top.children.length);\n};\n\n// : ([Mark], EditorView)\n// Sync the current stack of mark descs with the given array of\n// marks, reusing existing mark descs when possible.\nViewTreeUpdater.prototype.syncToMarks = function syncToMarks (marks, inline, view) {\n var keep = 0, depth = this.stack.length >> 1;\n var maxKeep = Math.min(depth, marks.length);\n while (keep < maxKeep &&\n (keep == depth - 1 ? this.top : this.stack[(keep + 1) << 1]).matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n { keep++; }\n\n while (keep < depth) {\n this.destroyRest();\n this.top.dirty = NOT_DIRTY;\n this.index = this.stack.pop();\n this.top = this.stack.pop();\n depth--;\n }\n while (depth < marks.length) {\n this.stack.push(this.top, this.index + 1);\n var found = -1;\n for (var i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) {\n if (this.top.children[i].matchesMark(marks[depth])) { found = i; break }\n }\n if (found > -1) {\n if (found > this.index) {\n this.changed = true;\n this.destroyBetween(this.index, found);\n }\n this.top = this.top.children[this.index];\n } else {\n var markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n this.top.children.splice(this.index, 0, markDesc);\n this.top = markDesc;\n this.changed = true;\n }\n this.index = 0;\n depth++;\n }\n};\n\n// : (Node, [Decoration], DecorationSet) → bool\n// Try to find a node desc matching the given data. Skip over it and\n// return true when successful.\nViewTreeUpdater.prototype.findNodeMatch = function findNodeMatch (node, outerDeco, innerDeco, index) {\n var found = -1, preMatch = index < 0 ? undefined : this.getPreMatch(index), children = this.top.children;\n if (preMatch && preMatch.matchesNode(node, outerDeco, innerDeco)) {\n found = children.indexOf(preMatch);\n } else {\n for (var i = this.index, e = Math.min(children.length, i + 5); i < e; i++) {\n var child = children[i];\n if (child.matchesNode(node, outerDeco, innerDeco) && this.preMatched.indexOf(child) < 0) {\n found = i;\n break\n }\n }\n }\n if (found < 0) { return false }\n this.destroyBetween(this.index, found);\n this.index++;\n return true\n};\n\n// : (Node, [Decoration], DecorationSet, EditorView, Fragment, number) → bool\n// Try to update the next node, if any, to the given data. Checks\n// pre-matches to avoid overwriting nodes that could still be used.\nViewTreeUpdater.prototype.updateNextNode = function updateNextNode (node, outerDeco, innerDeco, view, index) {\n for (var i = this.index; i < this.top.children.length; i++) {\n var next = this.top.children[i];\n if (next instanceof NodeViewDesc) {\n var preMatch = this.preMatched.indexOf(next);\n if (preMatch > -1 && preMatch + this.preMatchOffset != index) { return false }\n var nextDOM = next.dom;\n\n // Can't update if nextDOM is or contains this.lock, except if\n // it's a text node whose content already matches the new text\n // and whose decorations match the new ones.\n var locked = this.lock && (nextDOM == this.lock || nextDOM.nodeType == 1 && nextDOM.contains(this.lock.parentNode)) &&\n !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text &&\n next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n this.destroyBetween(this.index, i);\n if (next.dom != nextDOM) { this.changed = true; }\n this.index++;\n return true\n }\n break\n }\n }\n return false\n};\n\n// : (Node, [Decoration], DecorationSet, EditorView)\n// Insert the node as a newly created node desc.\nViewTreeUpdater.prototype.addNode = function addNode (node, outerDeco, innerDeco, view, pos) {\n this.top.children.splice(this.index++, 0, NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos));\n this.changed = true;\n};\n\nViewTreeUpdater.prototype.placeWidget = function placeWidget (widget, view, pos) {\n var next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n if (next && next.matchesWidget(widget) && (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n this.index++;\n } else {\n var desc = new WidgetViewDesc(this.top, widget, view, pos);\n this.top.children.splice(this.index++, 0, desc);\n this.changed = true;\n }\n};\n\n// Make sure a textblock looks and behaves correctly in\n// contentEditable.\nViewTreeUpdater.prototype.addTextblockHacks = function addTextblockHacks () {\n var lastChild = this.top.children[this.index - 1];\n while (lastChild instanceof MarkViewDesc) { lastChild = lastChild.children[lastChild.children.length - 1]; }\n\n if (!lastChild || // Empty textblock\n !(lastChild instanceof TextViewDesc) ||\n /\\n$/.test(lastChild.node.text)) {\n if (this.index < this.top.children.length && this.top.children[this.index].matchesHack()) {\n this.index++;\n } else {\n var dom = document.createElement(\"br\");\n this.top.children.splice(this.index++, 0, new BRHackViewDesc(this.top, nothing, dom, null));\n this.changed = true;\n }\n }\n};\n\n// : (Fragment, [ViewDesc]) → [ViewDesc]\n// Iterate from the end of the fragment and array of descs to find\n// directly matching ones, in order to avoid overeagerly reusing\n// those for other nodes. Returns an array whose positions correspond\n// to node positions in the fragment, and whose elements are either\n// descs matched to the child at that index, or empty.\nfunction preMatch(frag, descs) {\n var result = [], end = frag.childCount;\n for (var i = descs.length - 1; end > 0 && i >= 0; i--) {\n var desc = descs[i], node = desc.node;\n if (!node) { continue }\n if (node != frag.child(end - 1)) { break }\n result.push(desc);\n --end;\n }\n return {nodes: result.reverse(), offset: end}\n}\n\nfunction compareSide(a, b) { return a.type.side - b.type.side }\n\n// : (ViewDesc, DecorationSet, (Decoration, number), (Node, [Decoration], DecorationSet, number))\n// This function abstracts iterating over the nodes and decorations in\n// a fragment. Calls `onNode` for each node, with its local and child\n// decorations. Splits text nodes when there is a decoration starting\n// or ending inside of them. Calls `onWidget` for each widget.\nfunction iterDeco(parent, deco, onWidget, onNode) {\n var locals = deco.locals(parent), offset = 0;\n // Simple, cheap variant for when there are no local decorations\n if (locals.length == 0) {\n for (var i = 0; i < parent.childCount; i++) {\n var child = parent.child(i);\n onNode(child, locals, deco.forChild(offset, child), i);\n offset += child.nodeSize;\n }\n return\n }\n\n var decoIndex = 0, active = [], restNode = null;\n for (var parentIndex = 0;;) {\n if (decoIndex < locals.length && locals[decoIndex].to == offset) {\n var widget = locals[decoIndex++], widgets = (void 0);\n while (decoIndex < locals.length && locals[decoIndex].to == offset)\n { (widgets || (widgets = [widget])).push(locals[decoIndex++]); }\n if (widgets) {\n widgets.sort(compareSide);\n for (var i$1 = 0; i$1 < widgets.length; i$1++) { onWidget(widgets[i$1], parentIndex, !!restNode); }\n } else {\n onWidget(widget, parentIndex, !!restNode);\n }\n }\n\n var child$1 = (void 0), index = (void 0);\n if (restNode) {\n index = -1;\n child$1 = restNode;\n restNode = null;\n } else if (parentIndex < parent.childCount) {\n index = parentIndex;\n child$1 = parent.child(parentIndex++);\n } else {\n break\n }\n\n for (var i$2 = 0; i$2 < active.length; i$2++) { if (active[i$2].to <= offset) { active.splice(i$2--, 1); } }\n while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n { active.push(locals[decoIndex++]); }\n\n var end = offset + child$1.nodeSize;\n if (child$1.isText) {\n var cutAt = end;\n if (decoIndex < locals.length && locals[decoIndex].from < cutAt) { cutAt = locals[decoIndex].from; }\n for (var i$3 = 0; i$3 < active.length; i$3++) { if (active[i$3].to < cutAt) { cutAt = active[i$3].to; } }\n if (cutAt < end) {\n restNode = child$1.cut(cutAt - offset);\n child$1 = child$1.cut(0, cutAt - offset);\n end = cutAt;\n index = -1;\n }\n }\n\n var outerDeco = !active.length ? nothing\n : child$1.isInline && !child$1.isLeaf ? active.filter(function (d) { return !d.inline; })\n : active.slice();\n onNode(child$1, outerDeco, deco.forChild(offset, child$1), index);\n offset = end;\n }\n}\n\n// List markers in Mobile Safari will mysteriously disappear\n// sometimes. This works around that.\nfunction iosHacks(dom) {\n if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n var oldCSS = dom.style.cssText;\n dom.style.cssText = oldCSS + \"; list-style: square !important\";\n window.getComputedStyle(dom).listStyle;\n dom.style.cssText = oldCSS;\n }\n}\n\nfunction nearbyTextNode(node, offset) {\n for (;;) {\n if (node.nodeType == 3) { return node }\n if (node.nodeType == 1 && offset > 0) {\n if (node.childNodes.length > offset && node.childNodes[offset].nodeType == 3)\n { return node.childNodes[offset] }\n node = node.childNodes[offset - 1];\n offset = nodeSize(node);\n } else if (node.nodeType == 1 && offset < node.childNodes.length) {\n node = node.childNodes[offset];\n offset = 0;\n } else {\n return null\n }\n }\n}\n\n// Find a piece of text in an inline fragment, overlapping from-to\nfunction findTextInFragment(frag, text, from, to) {\n for (var i = 0, pos = 0; i < frag.childCount && pos <= to;) {\n var child = frag.child(i++), childStart = pos;\n pos += child.nodeSize;\n if (!child.isText) { continue }\n var str = child.text;\n while (i < frag.childCount) {\n var next = frag.child(i++);\n pos += next.nodeSize;\n if (!next.isText) { break }\n str += next.text;\n }\n if (pos >= from) {\n var found = str.lastIndexOf(text, to - childStart);\n if (found >= 0 && found + text.length + childStart >= from)\n { return childStart + found }\n }\n }\n return -1\n}\n\n// Replace range from-to in an array of view descs with replacement\n// (may be null to just delete). This goes very much against the grain\n// of the rest of this code, which tends to create nodes with the\n// right shape in one go, rather than messing with them after\n// creation, but is necessary in the composition hack.\nfunction replaceNodes(nodes, from, to, view, replacement) {\n var result = [];\n for (var i = 0, off = 0; i < nodes.length; i++) {\n var child = nodes[i], start = off, end = off += child.size;\n if (start >= to || end <= from) {\n result.push(child);\n } else {\n if (start < from) { result.push(child.slice(0, from - start, view)); }\n if (replacement) {\n result.push(replacement);\n replacement = null;\n }\n if (end > to) { result.push(child.slice(to - start, child.size, view)); }\n }\n }\n return result\n}\n\nfunction selectionFromDOM(view, origin) {\n var domSel = view.root.getSelection(), doc = view.state.doc;\n if (!domSel.focusNode) { return null }\n var nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n var head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset);\n if (head < 0) { return null }\n var $head = doc.resolve(head), $anchor, selection;\n if (selectionCollapsed(domSel)) {\n $anchor = $head;\n while (nearestDesc && !nearestDesc.node) { nearestDesc = nearestDesc.parent; }\n if (nearestDesc && nearestDesc.node.isAtom && NodeSelection.isSelectable(nearestDesc.node) && nearestDesc.parent\n && !(nearestDesc.node.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n var pos = nearestDesc.posBefore;\n selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));\n }\n } else {\n var anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset);\n if (anchor < 0) { return null }\n $anchor = doc.resolve(anchor);\n }\n\n if (!selection) {\n var bias = origin == \"pointer\" || (view.state.selection.head < $head.pos && !inWidget) ? 1 : -1;\n selection = selectionBetween(view, $anchor, $head, bias);\n }\n return selection\n}\n\nfunction selectionToDOM(view, force) {\n var sel = view.state.selection;\n syncNodeSelection(view, sel);\n\n if (view.editable ? !view.hasFocus() :\n !(hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom))) { return }\n\n view.domObserver.disconnectSelection();\n\n if (view.cursorWrapper) {\n selectCursorWrapper(view);\n } else {\n var anchor = sel.anchor;\n var head = sel.head;\n var resetEditableFrom, resetEditableTo;\n if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n if (!sel.$from.parent.inlineContent)\n { resetEditableFrom = temporarilyEditableNear(view, sel.from); }\n if (!sel.empty && !sel.$from.parent.inlineContent)\n { resetEditableTo = temporarilyEditableNear(view, sel.to); }\n }\n view.docView.setSelection(anchor, head, view.root, force);\n if (brokenSelectBetweenUneditable) {\n if (resetEditableFrom) { resetEditable(resetEditableFrom); }\n if (resetEditableTo) { resetEditable(resetEditableTo); }\n }\n if (sel.visible) {\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n } else {\n view.dom.classList.add(\"ProseMirror-hideselection\");\n if (\"onselectionchange\" in document) { removeClassOnSelectionChange(view); }\n }\n }\n\n view.domObserver.setCurSelection();\n view.domObserver.connectSelection();\n}\n\n// Kludge to work around Webkit not allowing a selection to start/end\n// between non-editable block nodes. We briefly make something\n// editable, set the selection, then set it uneditable again.\n\nvar brokenSelectBetweenUneditable = result.safari || result.chrome && result.chrome_version < 63;\n\nfunction temporarilyEditableNear(view, pos) {\n var ref = view.docView.domFromPos(pos, 0);\n var node = ref.node;\n var offset = ref.offset;\n var after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n var before = offset ? node.childNodes[offset - 1] : null;\n if (result.safari && after && after.contentEditable == \"false\") { return setEditable(after) }\n if ((!after || after.contentEditable == \"false\") && (!before || before.contentEditable == \"false\")) {\n if (after) { return setEditable(after) }\n else if (before) { return setEditable(before) }\n }\n}\n\nfunction setEditable(element) {\n element.contentEditable = \"true\";\n if (result.safari && element.draggable) { element.draggable = false; element.wasDraggable = true; }\n return element\n}\n\nfunction resetEditable(element) {\n element.contentEditable = \"false\";\n if (element.wasDraggable) { element.draggable = true; element.wasDraggable = null; }\n}\n\nfunction removeClassOnSelectionChange(view) {\n var doc = view.dom.ownerDocument;\n doc.removeEventListener(\"selectionchange\", view.hideSelectionGuard);\n var domSel = view.root.getSelection();\n var node = domSel.anchorNode, offset = domSel.anchorOffset;\n doc.addEventListener(\"selectionchange\", view.hideSelectionGuard = function () {\n if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n doc.removeEventListener(\"selectionchange\", view.hideSelectionGuard);\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n }\n });\n}\n\nfunction selectCursorWrapper(view) {\n var domSel = view.root.getSelection(), range = document.createRange();\n var node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n if (img) { range.setEnd(node.parentNode, domIndex(node) + 1); }\n else { range.setEnd(node, 0); }\n range.collapse(false);\n domSel.removeAllRanges();\n domSel.addRange(range);\n // Kludge to kill 'control selection' in IE11 when selecting an\n // invisible cursor wrapper, since that would result in those weird\n // resize handles and a selection that considers the absolutely\n // positioned wrapper, rather than the root editable node, the\n // focused element.\n if (!img && !view.state.selection.visible && result.ie && result.ie_version <= 11) {\n node.disabled = true;\n node.disabled = false;\n }\n}\n\nfunction syncNodeSelection(view, sel) {\n if (sel instanceof NodeSelection) {\n var desc = view.docView.descAt(sel.from);\n if (desc != view.lastSelectedViewDesc) {\n clearNodeSelection(view);\n if (desc) { desc.selectNode(); }\n view.lastSelectedViewDesc = desc;\n }\n } else {\n clearNodeSelection(view);\n }\n}\n\n// Clear all DOM statefulness of the last node selection.\nfunction clearNodeSelection(view) {\n if (view.lastSelectedViewDesc) {\n if (view.lastSelectedViewDesc.parent)\n { view.lastSelectedViewDesc.deselectNode(); }\n view.lastSelectedViewDesc = null;\n }\n}\n\nfunction selectionBetween(view, $anchor, $head, bias) {\n return view.someProp(\"createSelectionBetween\", function (f) { return f(view, $anchor, $head); })\n || TextSelection.between($anchor, $head, bias)\n}\n\nfunction hasFocusAndSelection(view) {\n if (view.editable && view.root.activeElement != view.dom) { return false }\n return hasSelection(view)\n}\n\nfunction hasSelection(view) {\n var sel = view.root.getSelection();\n if (!sel.anchorNode) { return false }\n try {\n // Firefox will raise 'permission denied' errors when accessing\n // properties of `sel.anchorNode` when it's in a generated CSS\n // element.\n return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&\n (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode))\n } catch(_) {\n return false\n }\n}\n\nfunction anchorInRightPlace(view) {\n var anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n var domSel = view.root.getSelection();\n return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset)\n}\n\nfunction moveSelectionBlock(state, dir) {\n var ref = state.selection;\n var $anchor = ref.$anchor;\n var $head = ref.$head;\n var $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n var $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n return $start && Selection.findFrom($start, dir)\n}\n\nfunction apply(view, sel) {\n view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n return true\n}\n\nfunction selectHorizontally(view, dir, mods) {\n var sel = view.state.selection;\n if (sel instanceof TextSelection) {\n if (!sel.empty || mods.indexOf(\"s\") > -1) {\n return false\n } else if (view.endOfTextblock(dir > 0 ? \"right\" : \"left\")) {\n var next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection)) { return apply(view, next) }\n return false\n } else if (!(result.mac && mods.indexOf(\"m\") > -1)) {\n var $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n if (!node || node.isText) { return false }\n var nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM)) { return false }\n if (NodeSelection.isSelectable(node)) {\n return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head))\n } else if (result.webkit) {\n // Chrome and Safari will introduce extra pointless cursor\n // positions around inline uneditable nodes, so we have to\n // take over and move the cursor past them (#937)\n return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)))\n } else {\n return false\n }\n }\n } else if (sel instanceof NodeSelection && sel.node.isInline) {\n return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from))\n } else {\n var next$1 = moveSelectionBlock(view.state, dir);\n if (next$1) { return apply(view, next$1) }\n return false\n }\n}\n\nfunction nodeLen(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length\n}\n\nfunction isIgnorable(dom) {\n var desc = dom.pmViewDesc;\n return desc && desc.size == 0 && (dom.nextSibling || dom.nodeName != \"BR\")\n}\n\n// Make sure the cursor isn't directly after one or more ignored\n// nodes, which will confuse the browser's cursor motion logic.\nfunction skipIgnoredNodesLeft(view) {\n var sel = view.root.getSelection();\n var node = sel.focusNode, offset = sel.focusOffset;\n if (!node) { return }\n var moveNode, moveOffset, force = false;\n // Gecko will do odd things when the selection is directly in front\n // of a non-editable node, so in that case, move it into the next\n // node if possible. Issue prosemirror/prosemirror#832.\n if (result.gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset])) { force = true; }\n for (;;) {\n if (offset > 0) {\n if (node.nodeType != 1) {\n break\n } else {\n var before = node.childNodes[offset - 1];\n if (isIgnorable(before)) {\n moveNode = node;\n moveOffset = --offset;\n } else if (before.nodeType == 3) {\n node = before;\n offset = node.nodeValue.length;\n } else { break }\n }\n } else if (isBlockNode(node)) {\n break\n } else {\n var prev = node.previousSibling;\n while (prev && isIgnorable(prev)) {\n moveNode = node.parentNode;\n moveOffset = domIndex(prev);\n prev = prev.previousSibling;\n }\n if (!prev) {\n node = node.parentNode;\n if (node == view.dom) { break }\n offset = 0;\n } else {\n node = prev;\n offset = nodeLen(node);\n }\n }\n }\n if (force) { setSelFocus(view, sel, node, offset); }\n else if (moveNode) { setSelFocus(view, sel, moveNode, moveOffset); }\n}\n\n// Make sure the cursor isn't directly before one or more ignored\n// nodes.\nfunction skipIgnoredNodesRight(view) {\n var sel = view.root.getSelection();\n var node = sel.focusNode, offset = sel.focusOffset;\n if (!node) { return }\n var len = nodeLen(node);\n var moveNode, moveOffset;\n for (;;) {\n if (offset < len) {\n if (node.nodeType != 1) { break }\n var after = node.childNodes[offset];\n if (isIgnorable(after)) {\n moveNode = node;\n moveOffset = ++offset;\n }\n else { break }\n } else if (isBlockNode(node)) {\n break\n } else {\n var next = node.nextSibling;\n while (next && isIgnorable(next)) {\n moveNode = next.parentNode;\n moveOffset = domIndex(next) + 1;\n next = next.nextSibling;\n }\n if (!next) {\n node = node.parentNode;\n if (node == view.dom) { break }\n offset = len = 0;\n } else {\n node = next;\n offset = 0;\n len = nodeLen(node);\n }\n }\n }\n if (moveNode) { setSelFocus(view, sel, moveNode, moveOffset); }\n}\n\nfunction isBlockNode(dom) {\n var desc = dom.pmViewDesc;\n return desc && desc.node && desc.node.isBlock\n}\n\nfunction setSelFocus(view, sel, node, offset) {\n if (selectionCollapsed(sel)) {\n var range = document.createRange();\n range.setEnd(node, offset);\n range.setStart(node, offset);\n sel.removeAllRanges();\n sel.addRange(range);\n } else if (sel.extend) {\n sel.extend(node, offset);\n }\n view.domObserver.setCurSelection();\n var state = view.state;\n // If no state update ends up happening, reset the selection.\n setTimeout(function () {\n if (view.state == state) { selectionToDOM(view); }\n }, 50);\n}\n\n// : (EditorState, number)\n// Check whether vertical selection motion would involve node\n// selections. If so, apply it (if not, the result is left to the\n// browser)\nfunction selectVertically(view, dir, mods) {\n var sel = view.state.selection;\n if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1) { return false }\n if (result.mac && mods.indexOf(\"m\") > -1) { return false }\n var $from = sel.$from;\n var $to = sel.$to;\n\n if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n var next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection))\n { return apply(view, next) }\n }\n if (!$from.parent.inlineContent) {\n var beyond = Selection.findFrom(dir < 0 ? $from : $to, dir);\n return beyond ? apply(view, beyond) : true\n }\n return false\n}\n\nfunction stopNativeHorizontalDelete(view, dir) {\n if (!(view.state.selection instanceof TextSelection)) { return true }\n var ref = view.state.selection;\n var $head = ref.$head;\n var $anchor = ref.$anchor;\n var empty = ref.empty;\n if (!$head.sameParent($anchor)) { return true }\n if (!empty) { return false }\n if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\")) { return true }\n var nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n if (nextNode && !nextNode.isText) {\n var tr = view.state.tr;\n if (dir < 0) { tr.delete($head.pos - nextNode.nodeSize, $head.pos); }\n else { tr.delete($head.pos, $head.pos + nextNode.nodeSize); }\n view.dispatch(tr);\n return true\n }\n return false\n}\n\nfunction switchEditable(view, node, state) {\n view.domObserver.stop();\n node.contentEditable = state;\n view.domObserver.start();\n}\n\n// Issue #867 / #1090 / https://bugs.chromium.org/p/chromium/issues/detail?id=903821\n// In which Safari (and at some point in the past, Chrome) does really\n// wrong things when the down arrow is pressed when the cursor is\n// directly at the start of a textblock and has an uneditable node\n// after it\nfunction safariDownArrowBug(view) {\n if (!result.safari || view.state.selection.$head.parentOffset > 0) { return }\n var ref = view.root.getSelection();\n var focusNode = ref.focusNode;\n var focusOffset = ref.focusOffset;\n if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&\n focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n var child = focusNode.firstChild;\n switchEditable(view, child, true);\n setTimeout(function () { return switchEditable(view, child, false); }, 20);\n }\n}\n\n// A backdrop key mapping used to make sure we always suppress keys\n// that have a dangerous default effect, even if the commands they are\n// bound to return false, and to make sure that cursor-motion keys\n// find a cursor (as opposed to a node selection) when pressed. For\n// cursor-motion keys, the code in the handlers also takes care of\n// block selections.\n\nfunction getMods(event) {\n var result = \"\";\n if (event.ctrlKey) { result += \"c\"; }\n if (event.metaKey) { result += \"m\"; }\n if (event.altKey) { result += \"a\"; }\n if (event.shiftKey) { result += \"s\"; }\n return result\n}\n\nfunction captureKeyDown(view, event) {\n var code = event.keyCode, mods = getMods(event);\n if (code == 8 || (result.mac && code == 72 && mods == \"c\")) { // Backspace, Ctrl-h on Mac\n return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodesLeft(view)\n } else if (code == 46 || (result.mac && code == 68 && mods == \"c\")) { // Delete, Ctrl-d on Mac\n return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodesRight(view)\n } else if (code == 13 || code == 27) { // Enter, Esc\n return true\n } else if (code == 37) { // Left arrow\n return selectHorizontally(view, -1, mods) || skipIgnoredNodesLeft(view)\n } else if (code == 39) { // Right arrow\n return selectHorizontally(view, 1, mods) || skipIgnoredNodesRight(view)\n } else if (code == 38) { // Up arrow\n return selectVertically(view, -1, mods) || skipIgnoredNodesLeft(view)\n } else if (code == 40) { // Down arrow\n return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodesRight(view)\n } else if (mods == (result.mac ? \"m\" : \"c\") &&\n (code == 66 || code == 73 || code == 89 || code == 90)) { // Mod-[biyz]\n return true\n }\n return false\n}\n\n// Note that all referencing and parsing is done with the\n// start-of-operation selection and document, since that's the one\n// that the DOM represents. If any changes came in in the meantime,\n// the modification is mapped over those before it is applied, in\n// readDOMChange.\n\nfunction parseBetween(view, from_, to_) {\n var ref = view.docView.parseRange(from_, to_);\n var parent = ref.node;\n var fromOffset = ref.fromOffset;\n var toOffset = ref.toOffset;\n var from = ref.from;\n var to = ref.to;\n\n var domSel = view.root.getSelection(), find = null, anchor = domSel.anchorNode;\n if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {\n find = [{node: anchor, offset: domSel.anchorOffset}];\n if (!selectionCollapsed(domSel))\n { find.push({node: domSel.focusNode, offset: domSel.focusOffset}); }\n }\n // Work around issue in Chrome where backspacing sometimes replaces\n // the deleted content with a random BR node (issues #799, #831)\n if (result.chrome && view.lastKeyCode === 8) {\n for (var off = toOffset; off > fromOffset; off--) {\n var node = parent.childNodes[off - 1], desc = node.pmViewDesc;\n if (node.nodeType == \"BR\" && !desc) { toOffset = off; break }\n if (!desc || desc.size) { break }\n }\n }\n var startDoc = view.state.doc;\n var parser = view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n var $from = startDoc.resolve(from);\n\n var sel = null, doc = parser.parse(parent, {\n topNode: $from.parent,\n topMatch: $from.parent.contentMatchAt($from.index()),\n topOpen: true,\n from: fromOffset,\n to: toOffset,\n preserveWhitespace: $from.parent.type.spec.code ? \"full\" : true,\n editableContent: true,\n findPositions: find,\n ruleFromNode: ruleFromNode,\n context: $from\n });\n if (find && find[0].pos != null) {\n var anchor$1 = find[0].pos, head = find[1] && find[1].pos;\n if (head == null) { head = anchor$1; }\n sel = {anchor: anchor$1 + from, head: head + from};\n }\n return {doc: doc, sel: sel, from: from, to: to}\n}\n\nfunction ruleFromNode(dom) {\n var desc = dom.pmViewDesc;\n if (desc) {\n return desc.parseRule()\n } else if (dom.nodeName == \"BR\" && dom.parentNode) {\n // Safari replaces the list item or table cell with a BR\n // directly in the list node (?!) if you delete the last\n // character in a list item or table cell (#708, #862)\n if (result.safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) {\n var skip = document.createElement(\"div\");\n skip.appendChild(document.createElement(\"li\"));\n return {skip: skip}\n } else if (dom.parentNode.lastChild == dom || result.safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) {\n return {ignore: true}\n }\n } else if (dom.nodeName == \"IMG\" && dom.getAttribute(\"mark-placeholder\")) {\n return {ignore: true}\n }\n}\n\nfunction readDOMChange(view, from, to, typeOver, addedNodes) {\n if (from < 0) {\n var origin = view.lastSelectionTime > Date.now() - 50 ? view.lastSelectionOrigin : null;\n var newSel = selectionFromDOM(view, origin);\n if (newSel && !view.state.selection.eq(newSel)) {\n var tr$1 = view.state.tr.setSelection(newSel);\n if (origin == \"pointer\") { tr$1.setMeta(\"pointer\", true); }\n else if (origin == \"key\") { tr$1.scrollIntoView(); }\n view.dispatch(tr$1);\n }\n return\n }\n\n var $before = view.state.doc.resolve(from);\n var shared = $before.sharedDepth(to);\n from = $before.before(shared + 1);\n to = view.state.doc.resolve(to).after(shared + 1);\n\n var sel = view.state.selection;\n var parse = parseBetween(view, from, to);\n // Chrome sometimes leaves the cursor before the inserted text when\n // composing after a cursor wrapper. This moves it forward.\n if (result.chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from) {\n var text = view.cursorWrapper.deco.type.toDOM.nextSibling;\n var size = text && text.nodeValue ? text.nodeValue.length : 1;\n parse.sel = {anchor: parse.sel.anchor + size, head: parse.sel.anchor + size};\n }\n\n var doc = view.state.doc, compare = doc.slice(parse.from, parse.to);\n var preferredPos, preferredSide;\n // Prefer anchoring to end when Backspace is pressed\n if (view.lastKeyCode === 8 && Date.now() - 100 < view.lastKeyCodeTime) {\n preferredPos = view.state.selection.to;\n preferredSide = \"end\";\n } else {\n preferredPos = view.state.selection.from;\n preferredSide = \"start\";\n }\n view.lastKeyCode = null;\n\n var change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);\n if (!change) {\n if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) &&\n !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) {\n change = {start: sel.from, endA: sel.to, endB: sel.to};\n } else if (result.ios && view.lastIOSEnter > Date.now() - 225 &&\n addedNodes.some(function (n) { return n.nodeName == \"DIV\" || n.nodeName == \"P\"; }) &&\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); })) {\n view.lastIOSEnter = 0;\n return\n } else {\n if (parse.sel) {\n var sel$1 = resolveSelection(view, view.state.doc, parse.sel);\n if (sel$1 && !sel$1.eq(view.state.selection)) { view.dispatch(view.state.tr.setSelection(sel$1)); }\n }\n return\n }\n }\n view.domChangeCount++;\n // Handle the case where overwriting a selection by typing matches\n // the start or end of the selected content, creating a change\n // that's smaller than what was actually overwritten.\n if (view.state.selection.from < view.state.selection.to &&\n change.start == change.endB &&\n view.state.selection instanceof TextSelection) {\n if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2) {\n change.start = view.state.selection.from;\n } else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2) {\n change.endB += (view.state.selection.to - change.endA);\n change.endA = view.state.selection.to;\n }\n }\n\n // IE11 will insert a non-breaking space _ahead_ of the space after\n // the cursor space when adding a space before another space. When\n // that happened, adjust the change to cover the space instead.\n if (result.ie && result.ie_version <= 11 && change.endB == change.start + 1 &&\n change.endA == change.start && change.start > parse.from &&\n parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == \" \\u00a0\") {\n change.start--;\n change.endA--;\n change.endB--;\n }\n\n var $from = parse.doc.resolveNoCache(change.start - parse.from);\n var $to = parse.doc.resolveNoCache(change.endB - parse.from);\n var inlineChange = $from.sameParent($to) && $from.parent.inlineContent;\n var nextSel;\n // If this looks like the effect of pressing Enter (or was recorded\n // as being an iOS enter press), just dispatch an Enter key instead.\n if (((result.ios && view.lastIOSEnter > Date.now() - 225 &&\n (!inlineChange || addedNodes.some(function (n) { return n.nodeName == \"DIV\" || n.nodeName == \"P\"; }))) ||\n (!inlineChange && $from.pos < parse.doc.content.size &&\n (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&\n nextSel.head == $to.pos)) &&\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); })) {\n view.lastIOSEnter = 0;\n return\n }\n // Same for backspace\n if (view.state.selection.anchor > change.start &&\n looksLikeJoin(doc, change.start, change.endA, $from, $to) &&\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(8, \"Backspace\")); })) {\n if (result.android && result.chrome) { view.domObserver.suppressSelectionUpdates(); } // #820\n return\n }\n\n // This tries to detect Android virtual keyboard\n // enter-and-pick-suggestion action. That sometimes (see issue\n // #1059) first fires a DOM mutation, before moving the selection to\n // the newly created block. And then, because ProseMirror cleans up\n // the DOM selection, it gives up moving the selection entirely,\n // leaving the cursor in the wrong place. When that happens, we drop\n // the new paragraph from the initial change, and fire a simulated\n // enter key afterwards.\n if (result.android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth &&\n parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) {\n change.endB -= 2;\n $to = parse.doc.resolveNoCache(change.endB - parse.from);\n setTimeout(function () {\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n }, 20);\n }\n\n var chFrom = change.start, chTo = change.endA;\n\n var tr, storedMarks, markChange, $from1;\n if (inlineChange) {\n if ($from.pos == $to.pos) { // Deletion\n // IE11 sometimes weirdly moves the DOM selection around after\n // backspacing out the first element in a textblock\n if (result.ie && result.ie_version <= 11 && $from.parentOffset == 0) {\n view.domObserver.suppressSelectionUpdates();\n setTimeout(function () { return selectionToDOM(view); }, 20);\n }\n tr = view.state.tr.delete(chFrom, chTo);\n storedMarks = doc.resolve(change.start).marksAcross(doc.resolve(change.endA));\n } else if ( // Adding or removing a mark\n change.endA == change.endB && ($from1 = doc.resolve(change.start)) &&\n (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset),\n $from1.parent.content.cut($from1.parentOffset, change.endA - $from1.start())))\n ) {\n tr = view.state.tr;\n if (markChange.type == \"add\") { tr.addMark(chFrom, chTo, markChange.mark); }\n else { tr.removeMark(chFrom, chTo, markChange.mark); }\n } else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {\n // Both positions in the same text node -- simply insert text\n var text$1 = $from.parent.textBetween($from.parentOffset, $to.parentOffset);\n if (view.someProp(\"handleTextInput\", function (f) { return f(view, chFrom, chTo, text$1); })) { return }\n tr = view.state.tr.insertText(text$1, chFrom, chTo);\n }\n }\n\n if (!tr)\n { tr = view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from)); }\n if (parse.sel) {\n var sel$2 = resolveSelection(view, tr.doc, parse.sel);\n // Chrome Android will sometimes, during composition, report the\n // selection in the wrong place. If it looks like that is\n // happening, don't update the selection.\n // Edge just doesn't move the cursor forward when you start typing\n // in an empty block or between br nodes.\n if (sel$2 && !(result.chrome && result.android && view.composing && sel$2.empty &&\n (sel$2.head == chFrom || sel$2.head == tr.mapping.map(chTo) - 1) ||\n result.ie && sel$2.empty && sel$2.head == chFrom))\n { tr.setSelection(sel$2); }\n }\n if (storedMarks) { tr.ensureMarks(storedMarks); }\n view.dispatch(tr.scrollIntoView());\n}\n\nfunction resolveSelection(view, doc, parsedSel) {\n if (Math.max(parsedSel.anchor, parsedSel.head) > doc.content.size) { return null }\n return selectionBetween(view, doc.resolve(parsedSel.anchor), doc.resolve(parsedSel.head))\n}\n\n// : (Fragment, Fragment) → ?{mark: Mark, type: string}\n// Given two same-length, non-empty fragments of inline content,\n// determine whether the first could be created from the second by\n// removing or adding a single mark type.\nfunction isMarkChange(cur, prev) {\n var curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks;\n var added = curMarks, removed = prevMarks, type, mark, update;\n for (var i = 0; i < prevMarks.length; i++) { added = prevMarks[i].removeFromSet(added); }\n for (var i$1 = 0; i$1 < curMarks.length; i$1++) { removed = curMarks[i$1].removeFromSet(removed); }\n if (added.length == 1 && removed.length == 0) {\n mark = added[0];\n type = \"add\";\n update = function (node) { return node.mark(mark.addToSet(node.marks)); };\n } else if (added.length == 0 && removed.length == 1) {\n mark = removed[0];\n type = \"remove\";\n update = function (node) { return node.mark(mark.removeFromSet(node.marks)); };\n } else {\n return null\n }\n var updated = [];\n for (var i$2 = 0; i$2 < prev.childCount; i$2++) { updated.push(update(prev.child(i$2))); }\n if (Fragment.from(updated).eq(cur)) { return {mark: mark, type: type} }\n}\n\nfunction looksLikeJoin(old, start, end, $newStart, $newEnd) {\n if (!$newStart.parent.isTextblock ||\n // The content must have shrunk\n end - start <= $newEnd.pos - $newStart.pos ||\n // newEnd must point directly at or after the end of the block that newStart points into\n skipClosingAndOpening($newStart, true, false) < $newEnd.pos)\n { return false }\n\n var $start = old.resolve(start);\n // Start must be at the end of a block\n if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock)\n { return false }\n var $next = old.resolve(skipClosingAndOpening($start, true, true));\n // The next textblock must start before end and end near it\n if (!$next.parent.isTextblock || $next.pos > end ||\n skipClosingAndOpening($next, true, false) < end)\n { return false }\n\n // The fragments after the join point must match\n return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content)\n}\n\nfunction skipClosingAndOpening($pos, fromEnd, mayOpen) {\n var depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;\n while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {\n depth--;\n end++;\n fromEnd = false;\n }\n if (mayOpen) {\n var next = $pos.node(depth).maybeChild($pos.indexAfter(depth));\n while (next && !next.isLeaf) {\n next = next.firstChild;\n end++;\n }\n }\n return end\n}\n\nfunction findDiff(a, b, pos, preferredPos, preferredSide) {\n var start = a.findDiffStart(b, pos);\n if (start == null) { return null }\n var ref = a.findDiffEnd(b, pos + a.size, pos + b.size);\n var endA = ref.a;\n var endB = ref.b;\n if (preferredSide == \"end\") {\n var adjust = Math.max(0, start - Math.min(endA, endB));\n preferredPos -= endA + adjust - start;\n }\n if (endA < start && a.size < b.size) {\n var move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;\n start -= move;\n endB = start + (endB - endA);\n endA = start;\n } else if (endB < start) {\n var move$1 = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;\n start -= move$1;\n endA = start + (endA - endB);\n endB = start;\n }\n return {start: start, endA: endA, endB: endB}\n}\n\nfunction serializeForClipboard(view, slice) {\n var context = [];\n var content = slice.content;\n var openStart = slice.openStart;\n var openEnd = slice.openEnd;\n while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n openStart--;\n openEnd--;\n var node = content.firstChild;\n context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n content = node.content;\n }\n\n var serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n var doc = detachedDoc(), wrap = doc.createElement(\"div\");\n wrap.appendChild(serializer.serializeFragment(content, {document: doc}));\n\n var firstChild = wrap.firstChild, needsWrap;\n while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n for (var i = needsWrap.length - 1; i >= 0; i--) {\n var wrapper = doc.createElement(needsWrap[i]);\n while (wrap.firstChild) { wrapper.appendChild(wrap.firstChild); }\n wrap.appendChild(wrapper);\n }\n firstChild = wrap.firstChild;\n }\n\n if (firstChild && firstChild.nodeType == 1)\n { firstChild.setAttribute(\"data-pm-slice\", (openStart + \" \" + openEnd + \" \" + (JSON.stringify(context)))); }\n\n var text = view.someProp(\"clipboardTextSerializer\", function (f) { return f(slice); }) ||\n slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n\n return {dom: wrap, text: text}\n}\n\n// : (EditorView, string, string, ?bool, ResolvedPos) → ?Slice\n// Read a slice of content from the clipboard (or drop data).\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n var dom, inCode = $context.parent.type.spec.code, slice;\n if (!html && !text) { return null }\n var asText = text && (plainText || inCode || !html);\n if (asText) {\n view.someProp(\"transformPastedText\", function (f) { text = f(text, inCode || plainText); });\n if (inCode) { return new Slice(Fragment.from(view.state.schema.text(text)), 0, 0) }\n var parsed = view.someProp(\"clipboardTextParser\", function (f) { return f(text, $context, plainText); });\n if (parsed) {\n slice = parsed;\n } else {\n dom = document.createElement(\"div\");\n text.trim().split(/(?:\\r\\n?|\\n)+/).forEach(function (block) {\n dom.appendChild(document.createElement(\"p\")).textContent = block;\n });\n }\n } else {\n view.someProp(\"transformPastedHTML\", function (f) { html = f(html); });\n dom = readHTML(html);\n }\n\n var contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n var sliceData = contextNode && /^(\\d+) (\\d+) (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\"));\n if (!slice) {\n var parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n slice = parser.parseSlice(dom, {preserveWhitespace: !!(asText || sliceData), context: $context});\n }\n if (sliceData)\n { slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[3]); }\n else // HTML wasn't created by ProseMirror. Make sure top-level siblings are coherent\n { slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), false); }\n\n view.someProp(\"transformPasted\", function (f) { slice = f(slice); });\n return slice\n}\n\n// Takes a slice parsed with parseSlice, which means there hasn't been\n// any content-expression checking done on the top nodes, tries to\n// find a parent node in the current context that might fit the nodes,\n// and if successful, rebuilds the slice so that it fits into that parent.\n//\n// This addresses the problem that Transform.replace expects a\n// coherent slice, and will fail to place a set of siblings that don't\n// fit anywhere in the schema.\nfunction normalizeSiblings(fragment, $context) {\n if (fragment.childCount < 2) { return fragment }\n var loop = function ( d ) {\n var parent = $context.node(d);\n var match = parent.contentMatchAt($context.index(d));\n var lastWrap = (void 0), result = [];\n fragment.forEach(function (node) {\n if (!result) { return }\n var wrap = match.findWrapping(node.type), inLast;\n if (!wrap) { return result = null }\n if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n result[result.length - 1] = inLast;\n } else {\n if (result.length) { result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length); }\n var wrapped = withWrappers(node, wrap);\n result.push(wrapped);\n match = match.matchType(wrapped.type, wrapped.attrs);\n lastWrap = wrap;\n }\n });\n if (result) { return { v: Fragment.from(result) } }\n };\n\n for (var d = $context.depth; d >= 0; d--) {\n var returned = loop( d );\n\n if ( returned ) return returned.v;\n }\n return fragment\n}\n\nfunction withWrappers(node, wrap, from) {\n if ( from === void 0 ) from = 0;\n\n for (var i = wrap.length - 1; i >= from; i--)\n { node = wrap[i].create(null, Fragment.from(node)); }\n return node\n}\n\n// Used to group adjacent nodes wrapped in similar parents by\n// normalizeSiblings into the same parent node\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n var inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n if (inner) { return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner)) }\n var match = sibling.contentMatchAt(sibling.childCount);\n if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n { return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1)))) }\n }\n}\n\nfunction closeRight(node, depth) {\n if (depth == 0) { return node }\n var fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n var fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n return node.copy(fragment.append(fill))\n}\n\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n var node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n if (depth < to - 1) { inner = closeRange(inner, side, from, to, depth + 1, openEnd); }\n if (depth >= from)\n { inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, fragment.childCount > 1 || openEnd <= depth).append(inner)\n : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true)); }\n return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner))\n}\n\nfunction closeSlice(slice, openStart, openEnd) {\n if (openStart < slice.openStart)\n { slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd); }\n if (openEnd < slice.openEnd)\n { slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd); }\n return slice\n}\n\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"..\"` the table cells are ignored.\nvar wrapMap = {\n thead: [\"table\"],\n tbody: [\"table\"],\n tfoot: [\"table\"],\n caption: [\"table\"],\n colgroup: [\"table\"],\n col: [\"table\", \"colgroup\"],\n tr: [\"table\", \"tbody\"],\n td: [\"table\", \"tbody\", \"tr\"],\n th: [\"table\", \"tbody\", \"tr\"]\n};\n\nvar _detachedDoc = null;\nfunction detachedDoc() {\n return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"))\n}\n\nfunction readHTML(html) {\n var metas = /(\\s*]*>)*/.exec(html);\n if (metas) { html = html.slice(metas[0].length); }\n var elt = detachedDoc().createElement(\"div\");\n var firstTag = /(?:]*>)*<([a-z][^>\\s]+)/i.exec(html), wrap, depth = 0;\n if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()]) {\n html = wrap.map(function (n) { return \"<\" + n + \">\"; }).join(\"\") + html + wrap.map(function (n) { return \"\"; }).reverse().join(\"\");\n depth = wrap.length;\n }\n elt.innerHTML = html;\n for (var i = 0; i < depth; i++) { elt = elt.firstChild; }\n return elt\n}\n\nfunction addContext(slice, context) {\n if (!slice.size) { return slice }\n var schema = slice.content.firstChild.type.schema, array;\n try { array = JSON.parse(context); }\n catch(e) { return slice }\n var content = slice.content;\n var openStart = slice.openStart;\n var openEnd = slice.openEnd;\n for (var i = array.length - 2; i >= 0; i -= 2) {\n var type = schema.nodes[array[i]];\n if (!type || type.hasRequiredAttrs()) { break }\n content = Fragment.from(type.create(array[i + 1], content));\n openStart++; openEnd++;\n }\n return new Slice(content, openStart, openEnd)\n}\n\nvar observeOptions = {\n childList: true,\n characterData: true,\n characterDataOldValue: true,\n attributes: true,\n attributeOldValue: true,\n subtree: true\n};\n// IE11 has very broken mutation observers, so we also listen to DOMCharacterDataModified\nvar useCharData = result.ie && result.ie_version <= 11;\n\nvar SelectionState = function SelectionState() {\n this.anchorNode = this.anchorOffset = this.focusNode = this.focusOffset = null;\n};\n\nSelectionState.prototype.set = function set (sel) {\n this.anchorNode = sel.anchorNode; this.anchorOffset = sel.anchorOffset;\n this.focusNode = sel.focusNode; this.focusOffset = sel.focusOffset;\n};\n\nSelectionState.prototype.eq = function eq (sel) {\n return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset &&\n sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset\n};\n\nvar DOMObserver = function DOMObserver(view, handleDOMChange) {\n var this$1 = this;\n\n this.view = view;\n this.handleDOMChange = handleDOMChange;\n this.queue = [];\n this.flushingSoon = -1;\n this.observer = window.MutationObserver &&\n new window.MutationObserver(function (mutations) {\n for (var i = 0; i < mutations.length; i++) { this$1.queue.push(mutations[i]); }\n // IE11 will sometimes (on backspacing out a single character\n // text node after a BR node) call the observer callback\n // before actually updating the DOM, which will cause\n // ProseMirror to miss the change (see #930)\n if (result.ie && result.ie_version <= 11 && mutations.some(\n function (m) { return m.type == \"childList\" && m.removedNodes.length ||\n m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length; }))\n { this$1.flushSoon(); }\n else\n { this$1.flush(); }\n });\n this.currentSelection = new SelectionState;\n if (useCharData) {\n this.onCharData = function (e) {\n this$1.queue.push({target: e.target, type: \"characterData\", oldValue: e.prevValue});\n this$1.flushSoon();\n };\n }\n this.onSelectionChange = this.onSelectionChange.bind(this);\n this.suppressingSelectionUpdates = false;\n};\n\nDOMObserver.prototype.flushSoon = function flushSoon () {\n var this$1 = this;\n\n if (this.flushingSoon < 0)\n { this.flushingSoon = window.setTimeout(function () { this$1.flushingSoon = -1; this$1.flush(); }, 20); }\n};\n\nDOMObserver.prototype.forceFlush = function forceFlush () {\n if (this.flushingSoon > -1) {\n window.clearTimeout(this.flushingSoon);\n this.flushingSoon = -1;\n this.flush();\n }\n};\n\nDOMObserver.prototype.start = function start () {\n if (this.observer)\n { this.observer.observe(this.view.dom, observeOptions); }\n if (useCharData)\n { this.view.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData); }\n this.connectSelection();\n};\n\nDOMObserver.prototype.stop = function stop () {\n var this$1 = this;\n\n if (this.observer) {\n var take = this.observer.takeRecords();\n if (take.length) {\n for (var i = 0; i < take.length; i++) { this.queue.push(take[i]); }\n window.setTimeout(function () { return this$1.flush(); }, 20);\n }\n this.observer.disconnect();\n }\n if (useCharData) { this.view.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData); }\n this.disconnectSelection();\n};\n\nDOMObserver.prototype.connectSelection = function connectSelection () {\n this.view.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n};\n\nDOMObserver.prototype.disconnectSelection = function disconnectSelection () {\n this.view.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n};\n\nDOMObserver.prototype.suppressSelectionUpdates = function suppressSelectionUpdates () {\n var this$1 = this;\n\n this.suppressingSelectionUpdates = true;\n setTimeout(function () { return this$1.suppressingSelectionUpdates = false; }, 50);\n};\n\nDOMObserver.prototype.onSelectionChange = function onSelectionChange () {\n if (!hasFocusAndSelection(this.view)) { return }\n if (this.suppressingSelectionUpdates) { return selectionToDOM(this.view) }\n // Deletions on IE11 fire their events in the wrong order, giving\n // us a selection change event before the DOM changes are\n // reported.\n if (result.ie && result.ie_version <= 11 && !this.view.state.selection.empty) {\n var sel = this.view.root.getSelection();\n // Selection.isCollapsed isn't reliable on IE\n if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n { return this.flushSoon() }\n }\n this.flush();\n};\n\nDOMObserver.prototype.setCurSelection = function setCurSelection () {\n this.currentSelection.set(this.view.root.getSelection());\n};\n\nDOMObserver.prototype.ignoreSelectionChange = function ignoreSelectionChange (sel) {\n if (sel.rangeCount == 0) { return true }\n var container = sel.getRangeAt(0).commonAncestorContainer;\n var desc = this.view.docView.nearestDesc(container);\n if (desc && desc.ignoreMutation({type: \"selection\", target: container.nodeType == 3 ? container.parentNode : container})) {\n this.setCurSelection();\n return true\n }\n};\n\nDOMObserver.prototype.flush = function flush () {\n if (!this.view.docView || this.flushingSoon > -1) { return }\n var mutations = this.observer ? this.observer.takeRecords() : [];\n if (this.queue.length) {\n mutations = this.queue.concat(mutations);\n this.queue.length = 0;\n }\n\n var sel = this.view.root.getSelection();\n var newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasSelection(this.view) && !this.ignoreSelectionChange(sel);\n\n var from = -1, to = -1, typeOver = false, added = [];\n if (this.view.editable) {\n for (var i = 0; i < mutations.length; i++) {\n var result$1 = this.registerMutation(mutations[i], added);\n if (result$1) {\n from = from < 0 ? result$1.from : Math.min(result$1.from, from);\n to = to < 0 ? result$1.to : Math.max(result$1.to, to);\n if (result$1.typeOver) { typeOver = true; }\n }\n }\n }\n\n if (result.gecko && added.length > 1) {\n var brs = added.filter(function (n) { return n.nodeName == \"BR\"; });\n if (brs.length == 2) {\n var a = brs[0];\n var b = brs[1];\n if (a.parentNode && a.parentNode.parentNode == b.parentNode) { b.remove(); }\n else { a.remove(); }\n }\n }\n\n if (from > -1 || newSel) {\n if (from > -1) {\n this.view.docView.markDirty(from, to);\n checkCSS(this.view);\n }\n this.handleDOMChange(from, to, typeOver, added);\n if (this.view.docView.dirty) { this.view.updateState(this.view.state); }\n else if (!this.currentSelection.eq(sel)) { selectionToDOM(this.view); }\n this.currentSelection.set(sel);\n }\n};\n\nDOMObserver.prototype.registerMutation = function registerMutation (mut, added) {\n // Ignore mutations inside nodes that were already noted as inserted\n if (added.indexOf(mut.target) > -1) { return null }\n var desc = this.view.docView.nearestDesc(mut.target);\n if (mut.type == \"attributes\" &&\n (desc == this.view.docView || mut.attributeName == \"contenteditable\" ||\n // Firefox sometimes fires spurious events for null/empty styles\n (mut.attributeName == \"style\" && !mut.oldValue && !mut.target.getAttribute(\"style\"))))\n { return null }\n if (!desc || desc.ignoreMutation(mut)) { return null }\n\n if (mut.type == \"childList\") {\n var prev = mut.previousSibling, next = mut.nextSibling;\n if (result.ie && result.ie_version <= 11 && mut.addedNodes.length) {\n // IE11 gives us incorrect next/prev siblings for some\n // insertions, so if there are added nodes, recompute those\n for (var i = 0; i < mut.addedNodes.length; i++) {\n var ref = mut.addedNodes[i];\n var previousSibling = ref.previousSibling;\n var nextSibling = ref.nextSibling;\n if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0) { prev = previousSibling; }\n if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0) { next = nextSibling; }\n }\n }\n var fromOffset = prev && prev.parentNode == mut.target\n ? domIndex(prev) + 1 : 0;\n var from = desc.localPosFromDOM(mut.target, fromOffset, -1);\n var toOffset = next && next.parentNode == mut.target\n ? domIndex(next) : mut.target.childNodes.length;\n for (var i$1 = 0; i$1 < mut.addedNodes.length; i$1++) { added.push(mut.addedNodes[i$1]); }\n var to = desc.localPosFromDOM(mut.target, toOffset, 1);\n return {from: from, to: to}\n } else if (mut.type == \"attributes\") {\n return {from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border}\n } else { // \"characterData\"\n return {\n from: desc.posAtStart,\n to: desc.posAtEnd,\n // An event was generated for a text change that didn't change\n // any text. Mark the dom change to fall back to assuming the\n // selection was typed over with an identical value if it can't\n // find another change.\n typeOver: mut.target.nodeValue == mut.oldValue\n }\n }\n};\n\nvar cssChecked = false;\n\nfunction checkCSS(view) {\n if (cssChecked) { return }\n cssChecked = true;\n if (getComputedStyle(view.dom).whiteSpace == \"normal\")\n { console[\"warn\"](\"ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.\"); }\n}\n\n// A collection of DOM events that occur within the editor, and callback functions\n// to invoke when the event fires.\nvar handlers = {}, editHandlers = {};\n\nfunction initInput(view) {\n view.shiftKey = false;\n view.mouseDown = null;\n view.lastKeyCode = null;\n view.lastKeyCodeTime = 0;\n view.lastClick = {time: 0, x: 0, y: 0, type: \"\"};\n view.lastSelectionOrigin = null;\n view.lastSelectionTime = 0;\n\n view.lastIOSEnter = 0;\n view.lastIOSEnterFallbackTimeout = null;\n\n view.composing = false;\n view.composingTimeout = null;\n view.compositionNodes = [];\n view.compositionEndedAt = -2e8;\n\n view.domObserver = new DOMObserver(view, function (from, to, typeOver, added) { return readDOMChange(view, from, to, typeOver, added); });\n view.domObserver.start();\n // Used by hacks like the beforeinput handler to check whether anything happened in the DOM\n view.domChangeCount = 0;\n\n view.eventHandlers = Object.create(null);\n var loop = function ( event ) {\n var handler = handlers[event];\n view.dom.addEventListener(event, view.eventHandlers[event] = function (event) {\n if (eventBelongsToView(view, event) && !runCustomHandler(view, event) &&\n (view.editable || !(event.type in editHandlers)))\n { handler(view, event); }\n });\n };\n\n for (var event in handlers) loop( event );\n // On Safari, for reasons beyond my understanding, adding an input\n // event handler makes an issue where the composition vanishes when\n // you press enter go away.\n if (result.safari) { view.dom.addEventListener(\"input\", function () { return null; }); }\n\n ensureListeners(view);\n}\n\nfunction setSelectionOrigin(view, origin) {\n view.lastSelectionOrigin = origin;\n view.lastSelectionTime = Date.now();\n}\n\nfunction destroyInput(view) {\n view.domObserver.stop();\n for (var type in view.eventHandlers)\n { view.dom.removeEventListener(type, view.eventHandlers[type]); }\n clearTimeout(view.composingTimeout);\n clearTimeout(view.lastIOSEnterFallbackTimeout);\n}\n\nfunction ensureListeners(view) {\n view.someProp(\"handleDOMEvents\", function (currentHandlers) {\n for (var type in currentHandlers) { if (!view.eventHandlers[type])\n { view.dom.addEventListener(type, view.eventHandlers[type] = function (event) { return runCustomHandler(view, event); }); } }\n });\n}\n\nfunction runCustomHandler(view, event) {\n return view.someProp(\"handleDOMEvents\", function (handlers) {\n var handler = handlers[event.type];\n return handler ? handler(view, event) || event.defaultPrevented : false\n })\n}\n\nfunction eventBelongsToView(view, event) {\n if (!event.bubbles) { return true }\n if (event.defaultPrevented) { return false }\n for (var node = event.target; node != view.dom; node = node.parentNode)\n { if (!node || node.nodeType == 11 ||\n (node.pmViewDesc && node.pmViewDesc.stopEvent(event)))\n { return false } }\n return true\n}\n\nfunction dispatchEvent(view, event) {\n if (!runCustomHandler(view, event) && handlers[event.type] &&\n (view.editable || !(event.type in editHandlers)))\n { handlers[event.type](view, event); }\n}\n\neditHandlers.keydown = function (view, event) {\n view.shiftKey = event.keyCode == 16 || event.shiftKey;\n if (inOrNearComposition(view, event)) { return }\n view.domObserver.forceFlush();\n view.lastKeyCode = event.keyCode;\n view.lastKeyCodeTime = Date.now();\n // On iOS, if we preventDefault enter key presses, the virtual\n // keyboard gets confused. So the hack here is to set a flag that\n // makes the DOM change code recognize that what just happens should\n // be replaced by whatever the Enter key handlers do.\n if (result.ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n var now = Date.now();\n view.lastIOSEnter = now;\n view.lastIOSEnterFallbackTimeout = setTimeout(function () {\n if (view.lastIOSEnter == now) {\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n view.lastIOSEnter = 0;\n }\n }, 200);\n } else if (view.someProp(\"handleKeyDown\", function (f) { return f(view, event); }) || captureKeyDown(view, event)) {\n event.preventDefault();\n } else {\n setSelectionOrigin(view, \"key\");\n }\n};\n\neditHandlers.keyup = function (view, e) {\n if (e.keyCode == 16) { view.shiftKey = false; }\n};\n\neditHandlers.keypress = function (view, event) {\n if (inOrNearComposition(view, event) || !event.charCode ||\n event.ctrlKey && !event.altKey || result.mac && event.metaKey) { return }\n\n if (view.someProp(\"handleKeyPress\", function (f) { return f(view, event); })) {\n event.preventDefault();\n return\n }\n\n var sel = view.state.selection;\n if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) {\n var text = String.fromCharCode(event.charCode);\n if (!view.someProp(\"handleTextInput\", function (f) { return f(view, sel.$from.pos, sel.$to.pos, text); }))\n { view.dispatch(view.state.tr.insertText(text).scrollIntoView()); }\n event.preventDefault();\n }\n};\n\nfunction eventCoords(event) { return {left: event.clientX, top: event.clientY} }\n\nfunction isNear(event, click) {\n var dx = click.x - event.clientX, dy = click.y - event.clientY;\n return dx * dx + dy * dy < 100\n}\n\nfunction runHandlerOnContext(view, propName, pos, inside, event) {\n if (inside == -1) { return false }\n var $pos = view.state.doc.resolve(inside);\n var loop = function ( i ) {\n if (view.someProp(propName, function (f) { return i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true)\n : f(view, pos, $pos.node(i), $pos.before(i), event, false); }))\n { return { v: true } }\n };\n\n for (var i = $pos.depth + 1; i > 0; i--) {\n var returned = loop( i );\n\n if ( returned ) return returned.v;\n }\n return false\n}\n\nfunction updateSelection(view, selection, origin) {\n if (!view.focused) { view.focus(); }\n var tr = view.state.tr.setSelection(selection);\n if (origin == \"pointer\") { tr.setMeta(\"pointer\", true); }\n view.dispatch(tr);\n}\n\nfunction selectClickedLeaf(view, inside) {\n if (inside == -1) { return false }\n var $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter;\n if (node && node.isAtom && NodeSelection.isSelectable(node)) {\n updateSelection(view, new NodeSelection($pos), \"pointer\");\n return true\n }\n return false\n}\n\nfunction selectClickedNode(view, inside) {\n if (inside == -1) { return false }\n var sel = view.state.selection, selectedNode, selectAt;\n if (sel instanceof NodeSelection) { selectedNode = sel.node; }\n\n var $pos = view.state.doc.resolve(inside);\n for (var i = $pos.depth + 1; i > 0; i--) {\n var node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n if (NodeSelection.isSelectable(node)) {\n if (selectedNode && sel.$from.depth > 0 &&\n i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos)\n { selectAt = $pos.before(sel.$from.depth); }\n else\n { selectAt = $pos.before(i); }\n break\n }\n }\n\n if (selectAt != null) {\n updateSelection(view, NodeSelection.create(view.state.doc, selectAt), \"pointer\");\n return true\n } else {\n return false\n }\n}\n\nfunction handleSingleClick(view, pos, inside, event, selectNode) {\n return runHandlerOnContext(view, \"handleClickOn\", pos, inside, event) ||\n view.someProp(\"handleClick\", function (f) { return f(view, pos, event); }) ||\n (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside))\n}\n\nfunction handleDoubleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleDoubleClickOn\", pos, inside, event) ||\n view.someProp(\"handleDoubleClick\", function (f) { return f(view, pos, event); })\n}\n\nfunction handleTripleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleTripleClickOn\", pos, inside, event) ||\n view.someProp(\"handleTripleClick\", function (f) { return f(view, pos, event); }) ||\n defaultTripleClick(view, inside)\n}\n\nfunction defaultTripleClick(view, inside) {\n var doc = view.state.doc;\n if (inside == -1) {\n if (doc.inlineContent) {\n updateSelection(view, TextSelection.create(doc, 0, doc.content.size), \"pointer\");\n return true\n }\n return false\n }\n\n var $pos = doc.resolve(inside);\n for (var i = $pos.depth + 1; i > 0; i--) {\n var node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n var nodePos = $pos.before(i);\n if (node.inlineContent)\n { updateSelection(view, TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size), \"pointer\"); }\n else if (NodeSelection.isSelectable(node))\n { updateSelection(view, NodeSelection.create(doc, nodePos), \"pointer\"); }\n else\n { continue }\n return true\n }\n}\n\nfunction forceDOMFlush(view) {\n return endComposition(view)\n}\n\nvar selectNodeModifier = result.mac ? \"metaKey\" : \"ctrlKey\";\n\nhandlers.mousedown = function (view, event) {\n view.shiftKey = event.shiftKey;\n var flushed = forceDOMFlush(view);\n var now = Date.now(), type = \"singleClick\";\n if (now - view.lastClick.time < 500 && isNear(event, view.lastClick) && !event[selectNodeModifier]) {\n if (view.lastClick.type == \"singleClick\") { type = \"doubleClick\"; }\n else if (view.lastClick.type == \"doubleClick\") { type = \"tripleClick\"; }\n }\n view.lastClick = {time: now, x: event.clientX, y: event.clientY, type: type};\n\n var pos = view.posAtCoords(eventCoords(event));\n if (!pos) { return }\n\n if (type == \"singleClick\")\n { view.mouseDown = new MouseDown(view, pos, event, flushed); }\n else if ((type == \"doubleClick\" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event))\n { event.preventDefault(); }\n else\n { setSelectionOrigin(view, \"pointer\"); }\n};\n\nvar MouseDown = function MouseDown(view, pos, event, flushed) {\n var this$1 = this;\n\n this.view = view;\n this.startDoc = view.state.doc;\n this.pos = pos;\n this.event = event;\n this.flushed = flushed;\n this.selectNode = event[selectNodeModifier];\n this.allowDefault = event.shiftKey;\n\n var targetNode, targetPos;\n if (pos.inside > -1) {\n targetNode = view.state.doc.nodeAt(pos.inside);\n targetPos = pos.inside;\n } else {\n var $pos = view.state.doc.resolve(pos.pos);\n targetNode = $pos.parent;\n targetPos = $pos.depth ? $pos.before() : 0;\n }\n\n this.mightDrag = null;\n\n var target = flushed ? null : event.target;\n var targetDesc = target ? view.docView.nearestDesc(target, true) : null;\n this.target = targetDesc ? targetDesc.dom : null;\n\n if (targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false ||\n view.state.selection instanceof NodeSelection && targetPos == view.state.selection.from)\n { this.mightDrag = {node: targetNode,\n pos: targetPos,\n addAttr: this.target && !this.target.draggable,\n setUneditable: this.target && result.gecko && !this.target.hasAttribute(\"contentEditable\")}; }\n\n if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr) { this.target.draggable = true; }\n if (this.mightDrag.setUneditable)\n { setTimeout(function () { return this$1.target.setAttribute(\"contentEditable\", \"false\"); }, 20); }\n this.view.domObserver.start();\n }\n\n view.root.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n view.root.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n setSelectionOrigin(view, \"pointer\");\n};\n\nMouseDown.prototype.done = function done () {\n this.view.root.removeEventListener(\"mouseup\", this.up);\n this.view.root.removeEventListener(\"mousemove\", this.move);\n if (this.mightDrag && this.target) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr) { this.target.removeAttribute(\"draggable\"); }\n if (this.mightDrag.setUneditable) { this.target.removeAttribute(\"contentEditable\"); }\n this.view.domObserver.start();\n }\n this.view.mouseDown = null;\n};\n\nMouseDown.prototype.up = function up (event) {\n this.done();\n\n if (!this.view.dom.contains(event.target.nodeType == 3 ? event.target.parentNode : event.target))\n { return }\n\n var pos = this.pos;\n if (this.view.state.doc != this.startDoc) { pos = this.view.posAtCoords(eventCoords(event)); }\n\n if (this.allowDefault || !pos) {\n setSelectionOrigin(this.view, \"pointer\");\n } else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {\n event.preventDefault();\n } else if (this.flushed ||\n // Safari ignores clicks on draggable elements\n (result.safari && this.mightDrag && !this.mightDrag.node.isAtom) ||\n // Chrome will sometimes treat a node selection as a\n // cursor, but still report that the node is selected\n // when asked through getSelection. You'll then get a\n // situation where clicking at the point where that\n // (hidden) cursor is doesn't change the selection, and\n // thus doesn't get a reaction from ProseMirror. This\n // works around that.\n (result.chrome && !(this.view.state.selection instanceof TextSelection) &&\n (pos.pos == this.view.state.selection.from || pos.pos == this.view.state.selection.to))) {\n updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), \"pointer\");\n event.preventDefault();\n } else {\n setSelectionOrigin(this.view, \"pointer\");\n }\n};\n\nMouseDown.prototype.move = function move (event) {\n if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||\n Math.abs(this.event.y - event.clientY) > 4))\n { this.allowDefault = true; }\n setSelectionOrigin(this.view, \"pointer\");\n};\n\nhandlers.touchdown = function (view) {\n forceDOMFlush(view);\n setSelectionOrigin(view, \"pointer\");\n};\n\nhandlers.contextmenu = function (view) { return forceDOMFlush(view); };\n\nfunction inOrNearComposition(view, event) {\n if (view.composing) { return true }\n // See https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/.\n // On Japanese input method editors (IMEs), the Enter key is used to confirm character\n // selection. On Safari, when Enter is pressed, compositionend and keydown events are\n // emitted. The keydown event triggers newline insertion, which we don't want.\n // This method returns true if the keydown event should be ignored.\n // We only ignore it once, as pressing Enter a second time *should* insert a newline.\n // Furthermore, the keydown event timestamp must be close to the compositionEndedAt timestamp.\n // This guards against the case where compositionend is triggered without the keyboard\n // (e.g. character confirmation may be done with the mouse), and keydown is triggered\n // afterwards- we wouldn't want to ignore the keydown event in this case.\n if (result.safari && Math.abs(event.timeStamp - view.compositionEndedAt) < 500) {\n view.compositionEndedAt = -2e8;\n return true\n }\n return false\n}\n\n// Drop active composition after 5 seconds of inactivity on Android\nvar timeoutComposition = result.android ? 5000 : -1;\n\neditHandlers.compositionstart = editHandlers.compositionupdate = function (view) {\n if (!view.composing) {\n view.domObserver.flush();\n var state = view.state;\n var $pos = state.selection.$from;\n if (state.selection.empty &&\n (state.storedMarks ||\n (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(function (m) { return m.type.spec.inclusive === false; })))) {\n // Need to wrap the cursor in mark nodes different from the ones in the DOM context\n view.markCursor = view.state.storedMarks || $pos.marks();\n endComposition(view, true);\n view.markCursor = null;\n } else {\n endComposition(view);\n // In firefox, if the cursor is after but outside a marked node,\n // the inserted text won't inherit the marks. So this moves it\n // inside if necessary.\n if (result.gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {\n var sel = view.root.getSelection();\n for (var node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0;) {\n var before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];\n if (!before) { break }\n if (before.nodeType == 3) {\n sel.collapse(before, before.nodeValue.length);\n break\n } else {\n node = before;\n offset = -1;\n }\n }\n }\n }\n view.composing = true;\n }\n scheduleComposeEnd(view, timeoutComposition);\n};\n\neditHandlers.compositionend = function (view, event) {\n if (view.composing) {\n view.composing = false;\n view.compositionEndedAt = event.timeStamp;\n scheduleComposeEnd(view, 20);\n }\n};\n\nfunction scheduleComposeEnd(view, delay) {\n clearTimeout(view.composingTimeout);\n if (delay > -1) { view.composingTimeout = setTimeout(function () { return endComposition(view); }, delay); }\n}\n\nfunction clearComposition(view) {\n view.composing = false;\n while (view.compositionNodes.length > 0) { view.compositionNodes.pop().markParentsDirty(); }\n}\n\nfunction endComposition(view, forceUpdate) {\n view.domObserver.forceFlush();\n clearComposition(view);\n if (forceUpdate || view.docView.dirty) {\n var sel = selectionFromDOM(view);\n if (sel && !sel.eq(view.state.selection)) { view.dispatch(view.state.tr.setSelection(sel)); }\n else { view.updateState(view.state); }\n return true\n }\n return false\n}\n\nfunction captureCopy(view, dom) {\n // The extra wrapper is somehow necessary on IE/Edge to prevent the\n // content from being mangled when it is put onto the clipboard\n if (!view.dom.parentNode) { return }\n var wrap = view.dom.parentNode.appendChild(document.createElement(\"div\"));\n wrap.appendChild(dom);\n wrap.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n var sel = getSelection(), range = document.createRange();\n range.selectNodeContents(dom);\n // Done because IE will fire a selectionchange moving the selection\n // to its start when removeAllRanges is called and the editor still\n // has focus (which will mess up the editor's selection state).\n view.dom.blur();\n sel.removeAllRanges();\n sel.addRange(range);\n setTimeout(function () {\n if (wrap.parentNode) { wrap.parentNode.removeChild(wrap); }\n view.focus();\n }, 50);\n}\n\n// This is very crude, but unfortunately both these browsers _pretend_\n// that they have a clipboard API—all the objects and methods are\n// there, they just don't work, and they are hard to test.\nvar brokenClipboardAPI = (result.ie && result.ie_version < 15) ||\n (result.ios && result.webkit_version < 604);\n\nhandlers.copy = editHandlers.cut = function (view, e) {\n var sel = view.state.selection, cut = e.type == \"cut\";\n if (sel.empty) { return }\n\n // IE and Edge's clipboard interface is completely broken\n var data = brokenClipboardAPI ? null : e.clipboardData;\n var slice = sel.content();\n var ref = serializeForClipboard(view, slice);\n var dom = ref.dom;\n var text = ref.text;\n if (data) {\n e.preventDefault();\n data.clearData();\n data.setData(\"text/html\", dom.innerHTML);\n data.setData(\"text/plain\", text);\n } else {\n captureCopy(view, dom);\n }\n if (cut) { view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\")); }\n};\n\nfunction sliceSingleNode(slice) {\n return slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1 ? slice.content.firstChild : null\n}\n\nfunction capturePaste(view, e) {\n if (!view.dom.parentNode) { return }\n var plainText = view.shiftKey || view.state.selection.$from.parent.type.spec.code;\n var target = view.dom.parentNode.appendChild(document.createElement(plainText ? \"textarea\" : \"div\"));\n if (!plainText) { target.contentEditable = \"true\"; }\n target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n target.focus();\n setTimeout(function () {\n view.focus();\n if (target.parentNode) { target.parentNode.removeChild(target); }\n if (plainText) { doPaste(view, target.value, null, e); }\n else { doPaste(view, target.textContent, target.innerHTML, e); }\n }, 50);\n}\n\nfunction doPaste(view, text, html, e) {\n var slice = parseFromClipboard(view, text, html, view.shiftKey, view.state.selection.$from);\n if (view.someProp(\"handlePaste\", function (f) { return f(view, e, slice || Slice.empty); })) { return true }\n if (!slice) { return false }\n\n var singleNode = sliceSingleNode(slice);\n var tr = singleNode ? view.state.tr.replaceSelectionWith(singleNode, view.shiftKey) : view.state.tr.replaceSelection(slice);\n view.dispatch(tr.scrollIntoView().setMeta(\"paste\", true).setMeta(\"uiEvent\", \"paste\"));\n return true\n}\n\neditHandlers.paste = function (view, e) {\n var data = brokenClipboardAPI ? null : e.clipboardData;\n if (data && doPaste(view, data.getData(\"text/plain\"), data.getData(\"text/html\"), e)) { e.preventDefault(); }\n else { capturePaste(view, e); }\n};\n\nvar Dragging = function Dragging(slice, move) {\n this.slice = slice;\n this.move = move;\n};\n\nvar dragCopyModifier = result.mac ? \"altKey\" : \"ctrlKey\";\n\nhandlers.dragstart = function (view, e) {\n var mouseDown = view.mouseDown;\n if (mouseDown) { mouseDown.done(); }\n if (!e.dataTransfer) { return }\n\n var sel = view.state.selection;\n var pos = sel.empty ? null : view.posAtCoords(eventCoords(e));\n if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1: sel.to)) ; else if (mouseDown && mouseDown.mightDrag) {\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos)));\n } else if (e.target && e.target.nodeType == 1) {\n var desc = view.docView.nearestDesc(e.target, true);\n if (!desc || !desc.node.type.spec.draggable || desc == view.docView) { return }\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, desc.posBefore)));\n }\n var slice = view.state.selection.content();\n var ref = serializeForClipboard(view, slice);\n var dom = ref.dom;\n var text = ref.text;\n e.dataTransfer.clearData();\n e.dataTransfer.setData(brokenClipboardAPI ? \"Text\" : \"text/html\", dom.innerHTML);\n if (!brokenClipboardAPI) { e.dataTransfer.setData(\"text/plain\", text); }\n view.dragging = new Dragging(slice, !e[dragCopyModifier]);\n};\n\nhandlers.dragend = function (view) {\n var dragging = view.dragging;\n window.setTimeout(function () {\n if (view.dragging == dragging) { view.dragging = null; }\n }, 50);\n};\n\neditHandlers.dragover = editHandlers.dragenter = function (_, e) { return e.preventDefault(); };\n\neditHandlers.drop = function (view, e) {\n var dragging = view.dragging;\n view.dragging = null;\n\n if (!e.dataTransfer) { return }\n\n var eventPos = view.posAtCoords(eventCoords(e));\n if (!eventPos) { return }\n var $mouse = view.state.doc.resolve(eventPos.pos);\n if (!$mouse) { return }\n var slice = dragging && dragging.slice ||\n parseFromClipboard(view, e.dataTransfer.getData(brokenClipboardAPI ? \"Text\" : \"text/plain\"),\n brokenClipboardAPI ? null : e.dataTransfer.getData(\"text/html\"), false, $mouse);\n var move = dragging && !e[dragCopyModifier];\n if (view.someProp(\"handleDrop\", function (f) { return f(view, e, slice || Slice.empty, move); })) {\n e.preventDefault();\n return\n }\n if (!slice) { return }\n\n e.preventDefault();\n var insertPos = slice ? dropPoint(view.state.doc, $mouse.pos, slice) : $mouse.pos;\n if (insertPos == null) { insertPos = $mouse.pos; }\n\n var tr = view.state.tr;\n if (move) { tr.deleteSelection(); }\n\n var pos = tr.mapping.map(insertPos);\n var isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1;\n var beforeInsert = tr.doc;\n if (isNode)\n { tr.replaceRangeWith(pos, pos, slice.content.firstChild); }\n else\n { tr.replaceRange(pos, pos, slice); }\n if (tr.doc.eq(beforeInsert)) { return }\n\n var $pos = tr.doc.resolve(pos);\n if (isNode && NodeSelection.isSelectable(slice.content.firstChild) &&\n $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild)) {\n tr.setSelection(new NodeSelection($pos));\n } else {\n var end = tr.mapping.map(insertPos);\n tr.mapping.maps[tr.mapping.maps.length - 1].forEach(function (_from, _to, _newFrom, newTo) { return end = newTo; });\n tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)));\n }\n view.focus();\n view.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n};\n\nhandlers.focus = function (view) {\n if (!view.focused) {\n view.domObserver.stop();\n view.dom.classList.add(\"ProseMirror-focused\");\n view.domObserver.start();\n view.focused = true;\n setTimeout(function () {\n if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.root.getSelection()))\n { selectionToDOM(view); }\n }, 20);\n }\n};\n\nhandlers.blur = function (view) {\n if (view.focused) {\n view.domObserver.stop();\n view.dom.classList.remove(\"ProseMirror-focused\");\n view.domObserver.start();\n view.domObserver.currentSelection.set({});\n view.focused = false;\n }\n};\n\nhandlers.beforeinput = function (view, event) {\n // We should probably do more with beforeinput events, but support\n // is so spotty that I'm still waiting to see where they are going.\n\n // Very specific hack to deal with backspace sometimes failing on\n // Chrome Android when after an uneditable node.\n if (result.chrome && result.android && event.inputType == \"deleteContentBackward\") {\n var domChangeCount = view.domChangeCount;\n setTimeout(function () {\n if (view.domChangeCount != domChangeCount) { return } // Event already had some effect\n // This bug tends to close the virtual keyboard, so we refocus\n view.dom.blur();\n view.focus();\n if (view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(8, \"Backspace\")); })) { return }\n var ref = view.state.selection;\n var $cursor = ref.$cursor;\n // Crude approximation of backspace behavior when no command handled it\n if ($cursor && $cursor.pos > 0) { view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView()); }\n }, 50);\n }\n};\n\n// Make sure all handlers get registered\nfor (var prop in editHandlers) { handlers[prop] = editHandlers[prop]; }\n\nfunction compareObjs(a, b) {\n if (a == b) { return true }\n for (var p in a) { if (a[p] !== b[p]) { return false } }\n for (var p$1 in b) { if (!(p$1 in a)) { return false } }\n return true\n}\n\nvar WidgetType = function WidgetType(toDOM, spec) {\n this.spec = spec || noSpec;\n this.side = this.spec.side || 0;\n this.toDOM = toDOM;\n};\n\nWidgetType.prototype.map = function map (mapping, span, offset, oldOffset) {\n var ref = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1);\n var pos = ref.pos;\n var deleted = ref.deleted;\n return deleted ? null : new Decoration(pos - offset, pos - offset, this)\n};\n\nWidgetType.prototype.valid = function valid () { return true };\n\nWidgetType.prototype.eq = function eq (other) {\n return this == other ||\n (other instanceof WidgetType &&\n (this.spec.key && this.spec.key == other.spec.key ||\n this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)))\n};\n\nvar InlineType = function InlineType(attrs, spec) {\n this.spec = spec || noSpec;\n this.attrs = attrs;\n};\n\nInlineType.prototype.map = function map (mapping, span, offset, oldOffset) {\n var from = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset;\n var to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset;\n return from >= to ? null : new Decoration(from, to, this)\n};\n\nInlineType.prototype.valid = function valid (_, span) { return span.from < span.to };\n\nInlineType.prototype.eq = function eq (other) {\n return this == other ||\n (other instanceof InlineType && compareObjs(this.attrs, other.attrs) &&\n compareObjs(this.spec, other.spec))\n};\n\nInlineType.is = function is (span) { return span.type instanceof InlineType };\n\nvar NodeType = function NodeType(attrs, spec) {\n this.spec = spec || noSpec;\n this.attrs = attrs;\n};\n\nNodeType.prototype.map = function map (mapping, span, offset, oldOffset) {\n var from = mapping.mapResult(span.from + oldOffset, 1);\n if (from.deleted) { return null }\n var to = mapping.mapResult(span.to + oldOffset, -1);\n if (to.deleted || to.pos <= from.pos) { return null }\n return new Decoration(from.pos - offset, to.pos - offset, this)\n};\n\nNodeType.prototype.valid = function valid (node, span) {\n var ref = node.content.findIndex(span.from);\n var index = ref.index;\n var offset = ref.offset;\n return offset == span.from && offset + node.child(index).nodeSize == span.to\n};\n\nNodeType.prototype.eq = function eq (other) {\n return this == other ||\n (other instanceof NodeType && compareObjs(this.attrs, other.attrs) &&\n compareObjs(this.spec, other.spec))\n};\n\n// ::- Decoration objects can be provided to the view through the\n// [`decorations` prop](#view.EditorProps.decorations). They come in\n// several variants—see the static members of this class for details.\nvar Decoration = function Decoration(from, to, type) {\n // :: number\n // The start position of the decoration.\n this.from = from;\n // :: number\n // The end position. Will be the same as `from` for [widget\n // decorations](#view.Decoration^widget).\n this.to = to;\n this.type = type;\n};\n\nvar prototypeAccessors$1 = { spec: { configurable: true },inline: { configurable: true } };\n\nDecoration.prototype.copy = function copy (from, to) {\n return new Decoration(from, to, this.type)\n};\n\nDecoration.prototype.eq = function eq (other, offset) {\n if ( offset === void 0 ) offset = 0;\n\n return this.type.eq(other.type) && this.from + offset == other.from && this.to + offset == other.to\n};\n\nDecoration.prototype.map = function map (mapping, offset, oldOffset) {\n return this.type.map(mapping, this, offset, oldOffset)\n};\n\n// :: (number, union<(view: EditorView, getPos: () → number) → dom.Node, dom.Node>, ?Object) → Decoration\n// Creates a widget decoration, which is a DOM node that's shown in\n// the document at the given position. It is recommended that you\n// delay rendering the widget by passing a function that will be\n// called when the widget is actually drawn in a view, but you can\n// also directly pass a DOM node. `getPos` can be used to find the\n// widget's current document position.\n//\n// spec::- These options are supported:\n//\n// side:: ?number\n// Controls which side of the document position this widget is\n// associated with. When negative, it is drawn before a cursor\n// at its position, and content inserted at that position ends\n// up after the widget. When zero (the default) or positive, the\n// widget is drawn after the cursor and content inserted there\n// ends up before the widget.\n//\n// When there are multiple widgets at a given position, their\n// `side` values determine the order in which they appear. Those\n// with lower values appear first. The ordering of widgets with\n// the same `side` value is unspecified.\n//\n// When `marks` is null, `side` also determines the marks that\n// the widget is wrapped in—those of the node before when\n// negative, those of the node after when positive.\n//\n// marks:: ?[Mark]\n// The precise set of marks to draw around the widget.\n//\n// stopEvent:: ?(event: dom.Event) → bool\n// Can be used to control which DOM events, when they bubble out\n// of this widget, the editor view should ignore.\n//\n// ignoreSelection:: ?bool\n// When set (defaults to false), selection changes inside the\n// widget are ignored, and don't cause ProseMirror to try and\n// re-sync the selection with its selection state.\n//\n// key:: ?string\n// When comparing decorations of this type (in order to decide\n// whether it needs to be redrawn), ProseMirror will by default\n// compare the widget DOM node by identity. If you pass a key,\n// that key will be compared instead, which can be useful when\n// you generate decorations on the fly and don't want to store\n// and reuse DOM nodes. Make sure that any widgets with the same\n// key are interchangeable—if widgets differ in, for example,\n// the behavior of some event handler, they should get\n// different keys.\nDecoration.widget = function widget (pos, toDOM, spec) {\n return new Decoration(pos, pos, new WidgetType(toDOM, spec))\n};\n\n// :: (number, number, DecorationAttrs, ?Object) → Decoration\n// Creates an inline decoration, which adds the given attributes to\n// each inline node between `from` and `to`.\n//\n// spec::- These options are recognized:\n//\n// inclusiveStart:: ?bool\n// Determines how the left side of the decoration is\n// [mapped](#transform.Position_Mapping) when content is\n// inserted directly at that position. By default, the decoration\n// won't include the new content, but you can set this to `true`\n// to make it inclusive.\n//\n// inclusiveEnd:: ?bool\n// Determines how the right side of the decoration is mapped.\n// See\n// [`inclusiveStart`](#view.Decoration^inline^spec.inclusiveStart).\nDecoration.inline = function inline (from, to, attrs, spec) {\n return new Decoration(from, to, new InlineType(attrs, spec))\n};\n\n// :: (number, number, DecorationAttrs, ?Object) → Decoration\n// Creates a node decoration. `from` and `to` should point precisely\n// before and after a node in the document. That node, and only that\n// node, will receive the given attributes.\n//\n// spec::-\n//\n// Optional information to store with the decoration. It\n// is also used when comparing decorators for equality.\nDecoration.node = function node (from, to, attrs, spec) {\n return new Decoration(from, to, new NodeType(attrs, spec))\n};\n\n// :: Object\n// The spec provided when creating this decoration. Can be useful\n// if you've stored extra information in that object.\nprototypeAccessors$1.spec.get = function () { return this.type.spec };\n\nprototypeAccessors$1.inline.get = function () { return this.type instanceof InlineType };\n\nObject.defineProperties( Decoration.prototype, prototypeAccessors$1 );\n\n// DecorationAttrs:: interface\n// A set of attributes to add to a decorated node. Most properties\n// simply directly correspond to DOM attributes of the same name,\n// which will be set to the property's value. These are exceptions:\n//\n// class:: ?string\n// A CSS class name or a space-separated set of class names to be\n// _added_ to the classes that the node already had.\n//\n// style:: ?string\n// A string of CSS to be _added_ to the node's existing `style` property.\n//\n// nodeName:: ?string\n// When non-null, the target node is wrapped in a DOM element of\n// this type (and the other attributes are applied to this element).\n\nvar none = [], noSpec = {};\n\n// ::- A collection of [decorations](#view.Decoration), organized in\n// such a way that the drawing algorithm can efficiently use and\n// compare them. This is a persistent data structure—it is not\n// modified, updates create a new value.\nvar DecorationSet = function DecorationSet(local, children) {\n this.local = local && local.length ? local : none;\n this.children = children && children.length ? children : none;\n};\n\n// :: (Node, [Decoration]) → DecorationSet\n// Create a set of decorations, using the structure of the given\n// document.\nDecorationSet.create = function create (doc, decorations) {\n return decorations.length ? buildTree(decorations, doc, 0, noSpec) : empty\n};\n\n// :: (?number, ?number, ?(spec: Object) → bool) → [Decoration]\n// Find all decorations in this set which touch the given range\n// (including decorations that start or end directly at the\n// boundaries) and match the given predicate on their spec. When\n// `start` and `end` are omitted, all decorations in the set are\n// considered. When `predicate` isn't given, all decorations are\n// assumed to match.\nDecorationSet.prototype.find = function find (start, end, predicate) {\n var result = [];\n this.findInner(start == null ? 0 : start, end == null ? 1e9 : end, result, 0, predicate);\n return result\n};\n\nDecorationSet.prototype.findInner = function findInner (start, end, result, offset, predicate) {\n for (var i = 0; i < this.local.length; i++) {\n var span = this.local[i];\n if (span.from <= end && span.to >= start && (!predicate || predicate(span.spec)))\n { result.push(span.copy(span.from + offset, span.to + offset)); }\n }\n for (var i$1 = 0; i$1 < this.children.length; i$1 += 3) {\n if (this.children[i$1] < end && this.children[i$1 + 1] > start) {\n var childOff = this.children[i$1] + 1;\n this.children[i$1 + 2].findInner(start - childOff, end - childOff, result, offset + childOff, predicate);\n }\n }\n};\n\n// :: (Mapping, Node, ?Object) → DecorationSet\n// Map the set of decorations in response to a change in the\n// document.\n//\n// options::- An optional set of options.\n//\n// onRemove:: ?(decorationSpec: Object)\n// When given, this function will be called for each decoration\n// that gets dropped as a result of the mapping, passing the\n// spec of that decoration.\nDecorationSet.prototype.map = function map (mapping, doc, options) {\n if (this == empty || mapping.maps.length == 0) { return this }\n return this.mapInner(mapping, doc, 0, 0, options || noSpec)\n};\n\nDecorationSet.prototype.mapInner = function mapInner (mapping, node, offset, oldOffset, options) {\n var newLocal;\n for (var i = 0; i < this.local.length; i++) {\n var mapped = this.local[i].map(mapping, offset, oldOffset);\n if (mapped && mapped.type.valid(node, mapped)) { (newLocal || (newLocal = [])).push(mapped); }\n else if (options.onRemove) { options.onRemove(this.local[i].spec); }\n }\n\n if (this.children.length)\n { return mapChildren(this.children, newLocal, mapping, node, offset, oldOffset, options) }\n else\n { return newLocal ? new DecorationSet(newLocal.sort(byPos)) : empty }\n};\n\n// :: (Node, [Decoration]) → DecorationSet\n// Add the given array of decorations to the ones in the set,\n// producing a new set. Needs access to the current document to\n// create the appropriate tree structure.\nDecorationSet.prototype.add = function add (doc, decorations) {\n if (!decorations.length) { return this }\n if (this == empty) { return DecorationSet.create(doc, decorations) }\n return this.addInner(doc, decorations, 0)\n};\n\nDecorationSet.prototype.addInner = function addInner (doc, decorations, offset) {\n var this$1 = this;\n\n var children, childIndex = 0;\n doc.forEach(function (childNode, childOffset) {\n var baseOffset = childOffset + offset, found;\n if (!(found = takeSpansForNode(decorations, childNode, baseOffset))) { return }\n\n if (!children) { children = this$1.children.slice(); }\n while (childIndex < children.length && children[childIndex] < childOffset) { childIndex += 3; }\n if (children[childIndex] == childOffset)\n { children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found, baseOffset + 1); }\n else\n { children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found, childNode, baseOffset + 1, noSpec)); }\n childIndex += 3;\n });\n\n var local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset);\n for (var i = 0; i < local.length; i++) { if (!local[i].type.valid(doc, local[i])) { local.splice(i--, 1); } }\n\n return new DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local,\n children || this.children)\n};\n\n// :: ([Decoration]) → DecorationSet\n// Create a new set that contains the decorations in this set, minus\n// the ones in the given array.\nDecorationSet.prototype.remove = function remove (decorations) {\n if (decorations.length == 0 || this == empty) { return this }\n return this.removeInner(decorations, 0)\n};\n\nDecorationSet.prototype.removeInner = function removeInner (decorations, offset) {\n var children = this.children, local = this.local;\n for (var i = 0; i < children.length; i += 3) {\n var found = (void 0), from = children[i] + offset, to = children[i + 1] + offset;\n for (var j = 0, span = (void 0); j < decorations.length; j++) { if (span = decorations[j]) {\n if (span.from > from && span.to < to) {\n decorations[j] = null\n ;(found || (found = [])).push(span);\n }\n } }\n if (!found) { continue }\n if (children == this.children) { children = this.children.slice(); }\n var removed = children[i + 2].removeInner(found, from + 1);\n if (removed != empty) {\n children[i + 2] = removed;\n } else {\n children.splice(i, 3);\n i -= 3;\n }\n }\n if (local.length) { for (var i$1 = 0, span$1 = (void 0); i$1 < decorations.length; i$1++) { if (span$1 = decorations[i$1]) {\n for (var j$1 = 0; j$1 < local.length; j$1++) { if (local[j$1].eq(span$1, offset)) {\n if (local == this.local) { local = this.local.slice(); }\n local.splice(j$1--, 1);\n } }\n } } }\n if (children == this.children && local == this.local) { return this }\n return local.length || children.length ? new DecorationSet(local, children) : empty\n};\n\nDecorationSet.prototype.forChild = function forChild (offset, node) {\n if (this == empty) { return this }\n if (node.isLeaf) { return DecorationSet.empty }\n\n var child, local;\n for (var i = 0; i < this.children.length; i += 3) { if (this.children[i] >= offset) {\n if (this.children[i] == offset) { child = this.children[i + 2]; }\n break\n } }\n var start = offset + 1, end = start + node.content.size;\n for (var i$1 = 0; i$1 < this.local.length; i$1++) {\n var dec = this.local[i$1];\n if (dec.from < end && dec.to > start && (dec.type instanceof InlineType)) {\n var from = Math.max(start, dec.from) - start, to = Math.min(end, dec.to) - start;\n if (from < to) { (local || (local = [])).push(dec.copy(from, to)); }\n }\n }\n if (local) {\n var localSet = new DecorationSet(local.sort(byPos));\n return child ? new DecorationGroup([localSet, child]) : localSet\n }\n return child || empty\n};\n\nDecorationSet.prototype.eq = function eq (other) {\n if (this == other) { return true }\n if (!(other instanceof DecorationSet) ||\n this.local.length != other.local.length ||\n this.children.length != other.children.length) { return false }\n for (var i = 0; i < this.local.length; i++)\n { if (!this.local[i].eq(other.local[i])) { return false } }\n for (var i$1 = 0; i$1 < this.children.length; i$1 += 3)\n { if (this.children[i$1] != other.children[i$1] ||\n this.children[i$1 + 1] != other.children[i$1 + 1] ||\n !this.children[i$1 + 2].eq(other.children[i$1 + 2])) { return false } }\n return true\n};\n\nDecorationSet.prototype.locals = function locals (node) {\n return removeOverlap(this.localsInner(node))\n};\n\nDecorationSet.prototype.localsInner = function localsInner (node) {\n if (this == empty) { return none }\n if (node.inlineContent || !this.local.some(InlineType.is)) { return this.local }\n var result = [];\n for (var i = 0; i < this.local.length; i++) {\n if (!(this.local[i].type instanceof InlineType))\n { result.push(this.local[i]); }\n }\n return result\n};\n\nvar empty = new DecorationSet();\n\n// :: DecorationSet\n// The empty set of decorations.\nDecorationSet.empty = empty;\n\nDecorationSet.removeOverlap = removeOverlap;\n\n// :- An abstraction that allows the code dealing with decorations to\n// treat multiple DecorationSet objects as if it were a single object\n// with (a subset of) the same interface.\nvar DecorationGroup = function DecorationGroup(members) {\n this.members = members;\n};\n\nDecorationGroup.prototype.forChild = function forChild (offset, child) {\n if (child.isLeaf) { return DecorationSet.empty }\n var found = [];\n for (var i = 0; i < this.members.length; i++) {\n var result = this.members[i].forChild(offset, child);\n if (result == empty) { continue }\n if (result instanceof DecorationGroup) { found = found.concat(result.members); }\n else { found.push(result); }\n }\n return DecorationGroup.from(found)\n};\n\nDecorationGroup.prototype.eq = function eq (other) {\n if (!(other instanceof DecorationGroup) ||\n other.members.length != this.members.length) { return false }\n for (var i = 0; i < this.members.length; i++)\n { if (!this.members[i].eq(other.members[i])) { return false } }\n return true\n};\n\nDecorationGroup.prototype.locals = function locals (node) {\n var result, sorted = true;\n for (var i = 0; i < this.members.length; i++) {\n var locals = this.members[i].localsInner(node);\n if (!locals.length) { continue }\n if (!result) {\n result = locals;\n } else {\n if (sorted) {\n result = result.slice();\n sorted = false;\n }\n for (var j = 0; j < locals.length; j++) { result.push(locals[j]); }\n }\n }\n return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none\n};\n\n// : ([DecorationSet]) → union\n// Create a group for the given array of decoration sets, or return\n// a single set when possible.\nDecorationGroup.from = function from (members) {\n switch (members.length) {\n case 0: return empty\n case 1: return members[0]\n default: return new DecorationGroup(members)\n }\n};\n\nfunction mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {\n var children = oldChildren.slice();\n\n // Mark the children that are directly touched by changes, and\n // move those that are after the changes.\n var shift = function (oldStart, oldEnd, newStart, newEnd) {\n for (var i = 0; i < children.length; i += 3) {\n var end = children[i + 1], dSize = (void 0);\n if (end == -1 || oldStart > end + oldOffset) { continue }\n if (oldEnd >= children[i] + oldOffset) {\n children[i + 1] = -1;\n } else if (newStart >= offset && (dSize = (newEnd - newStart) - (oldEnd - oldStart))) {\n children[i] += dSize;\n children[i + 1] += dSize;\n }\n }\n };\n for (var i = 0; i < mapping.maps.length; i++) { mapping.maps[i].forEach(shift); }\n\n // Find the child nodes that still correspond to a single node,\n // recursively call mapInner on them and update their positions.\n var mustRebuild = false;\n for (var i$1 = 0; i$1 < children.length; i$1 += 3) { if (children[i$1 + 1] == -1) { // Touched nodes\n var from = mapping.map(oldChildren[i$1] + oldOffset), fromLocal = from - offset;\n if (fromLocal < 0 || fromLocal >= node.content.size) {\n mustRebuild = true;\n continue\n }\n // Must read oldChildren because children was tagged with -1\n var to = mapping.map(oldChildren[i$1 + 1] + oldOffset, -1), toLocal = to - offset;\n var ref = node.content.findIndex(fromLocal);\n var index = ref.index;\n var childOffset = ref.offset;\n var childNode = node.maybeChild(index);\n if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) {\n var mapped = children[i$1 + 2].mapInner(mapping, childNode, from + 1, oldChildren[i$1] + oldOffset + 1, options);\n if (mapped != empty) {\n children[i$1] = fromLocal;\n children[i$1 + 1] = toLocal;\n children[i$1 + 2] = mapped;\n } else {\n children[i$1 + 1] = -2;\n mustRebuild = true;\n }\n } else {\n mustRebuild = true;\n }\n } }\n\n // Remaining children must be collected and rebuilt into the appropriate structure\n if (mustRebuild) {\n var decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal || [], mapping,\n offset, oldOffset, options);\n var built = buildTree(decorations, node, 0, options);\n newLocal = built.local;\n for (var i$2 = 0; i$2 < children.length; i$2 += 3) { if (children[i$2 + 1] < 0) {\n children.splice(i$2, 3);\n i$2 -= 3;\n } }\n for (var i$3 = 0, j = 0; i$3 < built.children.length; i$3 += 3) {\n var from$1 = built.children[i$3];\n while (j < children.length && children[j] < from$1) { j += 3; }\n children.splice(j, 0, built.children[i$3], built.children[i$3 + 1], built.children[i$3 + 2]);\n }\n }\n\n return new DecorationSet(newLocal && newLocal.sort(byPos), children)\n}\n\nfunction moveSpans(spans, offset) {\n if (!offset || !spans.length) { return spans }\n var result = [];\n for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n result.push(new Decoration(span.from + offset, span.to + offset, span.type));\n }\n return result\n}\n\nfunction mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset, oldOffset, options) {\n // Gather all decorations from the remaining marked children\n function gather(set, oldOffset) {\n for (var i = 0; i < set.local.length; i++) {\n var mapped = set.local[i].map(mapping, offset, oldOffset);\n if (mapped) { decorations.push(mapped); }\n else if (options.onRemove) { options.onRemove(set.local[i].spec); }\n }\n for (var i$1 = 0; i$1 < set.children.length; i$1 += 3)\n { gather(set.children[i$1 + 2], set.children[i$1] + oldOffset + 1); }\n }\n for (var i = 0; i < children.length; i += 3) { if (children[i + 1] == -1)\n { gather(children[i + 2], oldChildren[i] + oldOffset + 1); } }\n\n return decorations\n}\n\nfunction takeSpansForNode(spans, node, offset) {\n if (node.isLeaf) { return null }\n var end = offset + node.nodeSize, found = null;\n for (var i = 0, span = (void 0); i < spans.length; i++) {\n if ((span = spans[i]) && span.from > offset && span.to < end) {\n(found || (found = [])).push(span);\n spans[i] = null;\n }\n }\n return found\n}\n\nfunction withoutNulls(array) {\n var result = [];\n for (var i = 0; i < array.length; i++)\n { if (array[i] != null) { result.push(array[i]); } }\n return result\n}\n\n// : ([Decoration], Node, number) → DecorationSet\n// Build up a tree that corresponds to a set of decorations. `offset`\n// is a base offset that should be subtractet from the `from` and `to`\n// positions in the spans (so that we don't have to allocate new spans\n// for recursive calls).\nfunction buildTree(spans, node, offset, options) {\n var children = [], hasNulls = false;\n node.forEach(function (childNode, localStart) {\n var found = takeSpansForNode(spans, childNode, localStart + offset);\n if (found) {\n hasNulls = true;\n var subtree = buildTree(found, childNode, offset + localStart + 1, options);\n if (subtree != empty)\n { children.push(localStart, localStart + childNode.nodeSize, subtree); }\n }\n });\n var locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset).sort(byPos);\n for (var i = 0; i < locals.length; i++) { if (!locals[i].type.valid(node, locals[i])) {\n if (options.onRemove) { options.onRemove(locals[i].spec); }\n locals.splice(i--, 1);\n } }\n return locals.length || children.length ? new DecorationSet(locals, children) : empty\n}\n\n// : (Decoration, Decoration) → number\n// Used to sort decorations so that ones with a low start position\n// come first, and within a set with the same start position, those\n// with an smaller end position come first.\nfunction byPos(a, b) {\n return a.from - b.from || a.to - b.to\n}\n\n// : ([Decoration]) → [Decoration]\n// Scan a sorted array of decorations for partially overlapping spans,\n// and split those so that only fully overlapping spans are left (to\n// make subsequent rendering easier). Will return the input array if\n// no partially overlapping spans are found (the common case).\nfunction removeOverlap(spans) {\n var working = spans;\n for (var i = 0; i < working.length - 1; i++) {\n var span = working[i];\n if (span.from != span.to) { for (var j = i + 1; j < working.length; j++) {\n var next = working[j];\n if (next.from == span.from) {\n if (next.to != span.to) {\n if (working == spans) { working = spans.slice(); }\n // Followed by a partially overlapping larger span. Split that\n // span.\n working[j] = next.copy(next.from, span.to);\n insertAhead(working, j + 1, next.copy(span.to, next.to));\n }\n continue\n } else {\n if (next.from < span.to) {\n if (working == spans) { working = spans.slice(); }\n // The end of this one overlaps with a subsequent span. Split\n // this one.\n working[i] = span.copy(span.from, next.from);\n insertAhead(working, j, span.copy(next.from, span.to));\n }\n break\n }\n } }\n }\n return working\n}\n\nfunction insertAhead(array, i, deco) {\n while (i < array.length && byPos(deco, array[i]) > 0) { i++; }\n array.splice(i, 0, deco);\n}\n\n// : (EditorView) → union\n// Get the decorations associated with the current props of a view.\nfunction viewDecorations(view) {\n var found = [];\n view.someProp(\"decorations\", function (f) {\n var result = f(view.state);\n if (result && result != empty) { found.push(result); }\n });\n if (view.cursorWrapper)\n { found.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco])); }\n return DecorationGroup.from(found)\n}\n\n// ::- An editor view manages the DOM structure that represents an\n// editable document. Its state and behavior are determined by its\n// [props](#view.DirectEditorProps).\nvar EditorView = function EditorView(place, props) {\n this._props = props;\n // :: EditorState\n // The view's current [state](#state.EditorState).\n this.state = props.state;\n\n this.dispatch = this.dispatch.bind(this);\n\n this._root = null;\n this.focused = false;\n // Kludge used to work around a Chrome bug\n this.trackWrites = null;\n\n // :: dom.Element\n // An editable DOM node containing the document. (You probably\n // should not directly interfere with its content.)\n this.dom = (place && place.mount) || document.createElement(\"div\");\n if (place) {\n if (place.appendChild) { place.appendChild(this.dom); }\n else if (place.apply) { place(this.dom); }\n else if (place.mount) { this.mounted = true; }\n }\n\n // :: bool\n // Indicates whether the editor is currently [editable](#view.EditorProps.editable).\n this.editable = getEditable(this);\n this.markCursor = null;\n this.cursorWrapper = null;\n updateCursorWrapper(this);\n this.nodeViews = buildNodeViews(this);\n this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this);\n\n this.lastSelectedViewDesc = null;\n // :: ?{slice: Slice, move: bool}\n // When editor content is being dragged, this object contains\n // information about the dragged slice and whether it is being\n // copied or moved. At any other time, it is null.\n this.dragging = null;\n\n initInput(this);\n\n this.pluginViews = [];\n this.updatePluginViews();\n};\n\nvar prototypeAccessors$2 = { props: { configurable: true },root: { configurable: true } };\n\n// composing:: boolean\n// Holds `true` when a\n// [composition](https://developer.mozilla.org/en-US/docs/Mozilla/IME_handling_guide)\n// is active.\n\n// :: DirectEditorProps\n// The view's current [props](#view.EditorProps).\nprototypeAccessors$2.props.get = function () {\n if (this._props.state != this.state) {\n var prev = this._props;\n this._props = {};\n for (var name in prev) { this._props[name] = prev[name]; }\n this._props.state = this.state;\n }\n return this._props\n};\n\n// :: (DirectEditorProps)\n// Update the view's props. Will immediately cause an update to\n// the DOM.\nEditorView.prototype.update = function update (props) {\n if (props.handleDOMEvents != this._props.handleDOMEvents) { ensureListeners(this); }\n this._props = props;\n this.updateStateInner(props.state, true);\n};\n\n// :: (DirectEditorProps)\n// Update the view by updating existing props object with the object\n// given as argument. Equivalent to `view.update(Object.assign({},\n// view.props, props))`.\nEditorView.prototype.setProps = function setProps (props) {\n var updated = {};\n for (var name in this._props) { updated[name] = this._props[name]; }\n updated.state = this.state;\n for (var name$1 in props) { updated[name$1] = props[name$1]; }\n this.update(updated);\n};\n\n// :: (EditorState)\n// Update the editor's `state` prop, without touching any of the\n// other props.\nEditorView.prototype.updateState = function updateState (state) {\n this.updateStateInner(state, this.state.plugins != state.plugins);\n};\n\nEditorView.prototype.updateStateInner = function updateStateInner (state, reconfigured) {\n var this$1 = this;\n\n var prev = this.state, redraw = false, updateSel = false;\n // When stored marks are added, stop composition, so that they can\n // be displayed.\n if (state.storedMarks && this.composing) {\n clearComposition(this);\n updateSel = true;\n }\n this.state = state;\n if (reconfigured) {\n var nodeViews = buildNodeViews(this);\n if (changedNodeViews(nodeViews, this.nodeViews)) {\n this.nodeViews = nodeViews;\n redraw = true;\n }\n ensureListeners(this);\n }\n\n this.editable = getEditable(this);\n updateCursorWrapper(this);\n var innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this);\n\n var scroll = reconfigured ? \"reset\"\n : state.scrollToSelection > prev.scrollToSelection ? \"to selection\" : \"preserve\";\n var updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco);\n if (updateDoc || !state.selection.eq(prev.selection)) { updateSel = true; }\n var oldScrollPos = scroll == \"preserve\" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this);\n\n if (updateSel) {\n this.domObserver.stop();\n // Work around an issue in Chrome, IE, and Edge where changing\n // the DOM around an active selection puts it into a broken\n // state where the thing the user sees differs from the\n // selection reported by the Selection object (#710, #973,\n // #1011, #1013, #1035).\n var forceSelUpdate = updateDoc && (result.ie || result.chrome) && !this.composing &&\n !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection);\n if (updateDoc) {\n // If the node that the selection points into is written to,\n // Chrome sometimes starts misreporting the selection, so this\n // tracks that and forces a selection reset when our update\n // did write to the node.\n var chromeKludge = result.chrome ? (this.trackWrites = this.root.getSelection().focusNode) : null;\n if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) {\n this.docView.updateOuterDeco([]);\n this.docView.destroy();\n this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this);\n }\n if (chromeKludge && !this.trackWrites) { forceSelUpdate = true; }\n }\n // Work around for an issue where an update arriving right between\n // a DOM selection change and the \"selectionchange\" event for it\n // can cause a spurious DOM selection update, disrupting mouse\n // drag selection.\n if (forceSelUpdate ||\n !(this.mouseDown && this.domObserver.currentSelection.eq(this.root.getSelection()) && anchorInRightPlace(this))) {\n selectionToDOM(this, forceSelUpdate);\n } else {\n syncNodeSelection(this, state.selection);\n this.domObserver.setCurSelection();\n }\n this.domObserver.start();\n }\n\n this.updatePluginViews(prev);\n\n if (scroll == \"reset\") {\n this.dom.scrollTop = 0;\n } else if (scroll == \"to selection\") {\n var startDOM = this.root.getSelection().focusNode;\n if (this.someProp(\"handleScrollToSelection\", function (f) { return f(this$1); }))\n ; // Handled\n else if (state.selection instanceof NodeSelection)\n { scrollRectIntoView(this, this.docView.domAfterPos(state.selection.from).getBoundingClientRect(), startDOM); }\n else\n { scrollRectIntoView(this, this.coordsAtPos(state.selection.head, 1), startDOM); }\n } else if (oldScrollPos) {\n resetScrollPos(oldScrollPos);\n }\n};\n\nEditorView.prototype.destroyPluginViews = function destroyPluginViews () {\n var view;\n while (view = this.pluginViews.pop()) { if (view.destroy) { view.destroy(); } }\n};\n\nEditorView.prototype.updatePluginViews = function updatePluginViews (prevState) {\n if (!prevState || prevState.plugins != this.state.plugins) {\n this.destroyPluginViews();\n for (var i = 0; i < this.state.plugins.length; i++) {\n var plugin = this.state.plugins[i];\n if (plugin.spec.view) { this.pluginViews.push(plugin.spec.view(this)); }\n }\n } else {\n for (var i$1 = 0; i$1 < this.pluginViews.length; i$1++) {\n var pluginView = this.pluginViews[i$1];\n if (pluginView.update) { pluginView.update(this, prevState); }\n }\n }\n};\n\n// :: (string, ?(prop: *) → *) → *\n// Goes over the values of a prop, first those provided directly,\n// then those from plugins (in order), and calls `f` every time a\n// non-undefined value is found. When `f` returns a truthy value,\n// that is immediately returned. When `f` isn't provided, it is\n// treated as the identity function (the prop value is returned\n// directly).\nEditorView.prototype.someProp = function someProp (propName, f) {\n var prop = this._props && this._props[propName], value;\n if (prop != null && (value = f ? f(prop) : prop)) { return value }\n var plugins = this.state.plugins;\n if (plugins) { for (var i = 0; i < plugins.length; i++) {\n var prop$1 = plugins[i].props[propName];\n if (prop$1 != null && (value = f ? f(prop$1) : prop$1)) { return value }\n } }\n};\n\n// :: () → bool\n// Query whether the view has focus.\nEditorView.prototype.hasFocus = function hasFocus () {\n return this.root.activeElement == this.dom\n};\n\n// :: ()\n// Focus the editor.\nEditorView.prototype.focus = function focus () {\n this.domObserver.stop();\n if (this.editable) { focusPreventScroll(this.dom); }\n selectionToDOM(this);\n this.domObserver.start();\n};\n\n// :: union\n// Get the document root in which the editor exists. This will\n// usually be the top-level `document`, but might be a [shadow\n// DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM)\n// root if the editor is inside one.\nprototypeAccessors$2.root.get = function () {\n var cached = this._root;\n if (cached == null) { for (var search = this.dom.parentNode; search; search = search.parentNode) {\n if (search.nodeType == 9 || (search.nodeType == 11 && search.host)) {\n if (!search.getSelection) { Object.getPrototypeOf(search).getSelection = function () { return document.getSelection(); }; }\n return this._root = search\n }\n } }\n return cached || document\n};\n\n// :: ({left: number, top: number}) → ?{pos: number, inside: number}\n// Given a pair of viewport coordinates, return the document\n// position that corresponds to them. May return null if the given\n// coordinates aren't inside of the editor. When an object is\n// returned, its `pos` property is the position nearest to the\n// coordinates, and its `inside` property holds the position of the\n// inner node that the position falls inside of, or -1 if it is at\n// the top level, not in any node.\nEditorView.prototype.posAtCoords = function posAtCoords$1 (coords) {\n return posAtCoords(this, coords)\n};\n\n// :: (number, number) → {left: number, right: number, top: number, bottom: number}\n// Returns the viewport rectangle at a given document position.\n// `left` and `right` will be the same number, as this returns a\n// flat cursor-ish rectangle. If the position is between two things\n// that aren't directly adjacent, `side` determines which element is\n// used. When < 0, the element before the position is used,\n// otherwise the element after.\nEditorView.prototype.coordsAtPos = function coordsAtPos$1 (pos, side) {\n if ( side === void 0 ) side = 1;\n\n return coordsAtPos(this, pos, side)\n};\n\n// :: (number, number) → {node: dom.Node, offset: number}\n// Find the DOM position that corresponds to the given document\n// position. When `side` is negative, find the position as close as\n// possible to the content before the position. When positive,\n// prefer positions close to the content after the position. When\n// zero, prefer as shallow a position as possible.\n//\n// Note that you should **not** mutate the editor's internal DOM,\n// only inspect it (and even that is usually not necessary).\nEditorView.prototype.domAtPos = function domAtPos (pos, side) {\n if ( side === void 0 ) side = 0;\n\n return this.docView.domFromPos(pos, side)\n};\n\n// :: (number) → ?dom.Node\n// Find the DOM node that represents the document node after the\n// given position. May return `null` when the position doesn't point\n// in front of a node or if the node is inside an opaque node view.\n//\n// This is intended to be able to call things like\n// `getBoundingClientRect` on that DOM node. Do **not** mutate the\n// editor DOM directly, or add styling this way, since that will be\n// immediately overriden by the editor as it redraws the node.\nEditorView.prototype.nodeDOM = function nodeDOM (pos) {\n var desc = this.docView.descAt(pos);\n return desc ? desc.nodeDOM : null\n};\n\n// :: (dom.Node, number, ?number) → number\n// Find the document position that corresponds to a given DOM\n// position. (Whenever possible, it is preferable to inspect the\n// document structure directly, rather than poking around in the\n// DOM, but sometimes—for example when interpreting an event\n// target—you don't have a choice.)\n//\n// The `bias` parameter can be used to influence which side of a DOM\n// node to use when the position is inside a leaf node.\nEditorView.prototype.posAtDOM = function posAtDOM (node, offset, bias) {\n if ( bias === void 0 ) bias = -1;\n\n var pos = this.docView.posFromDOM(node, offset, bias);\n if (pos == null) { throw new RangeError(\"DOM position not inside the editor\") }\n return pos\n};\n\n// :: (union<\"up\", \"down\", \"left\", \"right\", \"forward\", \"backward\">, ?EditorState) → bool\n// Find out whether the selection is at the end of a textblock when\n// moving in a given direction. When, for example, given `\"left\"`,\n// it will return true if moving left from the current cursor\n// position would leave that position's parent textblock. Will apply\n// to the view's current state by default, but it is possible to\n// pass a different state.\nEditorView.prototype.endOfTextblock = function endOfTextblock$1 (dir, state) {\n return endOfTextblock(this, state || this.state, dir)\n};\n\n// :: ()\n// Removes the editor from the DOM and destroys all [node\n// views](#view.NodeView).\nEditorView.prototype.destroy = function destroy () {\n if (!this.docView) { return }\n destroyInput(this);\n this.destroyPluginViews();\n if (this.mounted) {\n this.docView.update(this.state.doc, [], viewDecorations(this), this);\n this.dom.textContent = \"\";\n } else if (this.dom.parentNode) {\n this.dom.parentNode.removeChild(this.dom);\n }\n this.docView.destroy();\n this.docView = null;\n};\n\n// Used for testing.\nEditorView.prototype.dispatchEvent = function dispatchEvent$1 (event) {\n return dispatchEvent(this, event)\n};\n\n// :: (Transaction)\n// Dispatch a transaction. Will call\n// [`dispatchTransaction`](#view.DirectEditorProps.dispatchTransaction)\n// when given, and otherwise defaults to applying the transaction to\n// the current state and calling\n// [`updateState`](#view.EditorView.updateState) with the result.\n// This method is bound to the view instance, so that it can be\n// easily passed around.\nEditorView.prototype.dispatch = function dispatch (tr) {\n var dispatchTransaction = this._props.dispatchTransaction;\n if (dispatchTransaction) { dispatchTransaction.call(this, tr); }\n else { this.updateState(this.state.apply(tr)); }\n};\n\nObject.defineProperties( EditorView.prototype, prototypeAccessors$2 );\n\nfunction computeDocDeco(view) {\n var attrs = Object.create(null);\n attrs.class = \"ProseMirror\";\n attrs.contenteditable = String(view.editable);\n\n view.someProp(\"attributes\", function (value) {\n if (typeof value == \"function\") { value = value(view.state); }\n if (value) { for (var attr in value) {\n if (attr == \"class\")\n { attrs.class += \" \" + value[attr]; }\n else if (!attrs[attr] && attr != \"contenteditable\" && attr != \"nodeName\")\n { attrs[attr] = String(value[attr]); }\n } }\n });\n\n return [Decoration.node(0, view.state.doc.content.size, attrs)]\n}\n\nfunction updateCursorWrapper(view) {\n if (view.markCursor) {\n var dom = document.createElement(\"img\");\n dom.setAttribute(\"mark-placeholder\", \"true\");\n view.cursorWrapper = {dom: dom, deco: Decoration.widget(view.state.selection.head, dom, {raw: true, marks: view.markCursor})};\n } else {\n view.cursorWrapper = null;\n }\n}\n\nfunction getEditable(view) {\n return !view.someProp(\"editable\", function (value) { return value(view.state) === false; })\n}\n\nfunction selectionContextChanged(sel1, sel2) {\n var depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head));\n return sel1.$anchor.start(depth) != sel2.$anchor.start(depth)\n}\n\nfunction buildNodeViews(view) {\n var result = {};\n view.someProp(\"nodeViews\", function (obj) {\n for (var prop in obj) { if (!Object.prototype.hasOwnProperty.call(result, prop))\n { result[prop] = obj[prop]; } }\n });\n return result\n}\n\nfunction changedNodeViews(a, b) {\n var nA = 0, nB = 0;\n for (var prop in a) {\n if (a[prop] != b[prop]) { return true }\n nA++;\n }\n for (var _ in b) { nB++; }\n return nA != nB\n}\n\n// EditorProps:: interface\n//\n// Props are configuration values that can be passed to an editor view\n// or included in a plugin. This interface lists the supported props.\n//\n// The various event-handling functions may all return `true` to\n// indicate that they handled the given event. The view will then take\n// care to call `preventDefault` on the event, except with\n// `handleDOMEvents`, where the handler itself is responsible for that.\n//\n// How a prop is resolved depends on the prop. Handler functions are\n// called one at a time, starting with the base props and then\n// searching through the plugins (in order of appearance) until one of\n// them returns true. For some props, the first plugin that yields a\n// value gets precedence.\n//\n// handleDOMEvents:: ?Object<(view: EditorView, event: dom.Event) → bool>\n// Can be an object mapping DOM event type names to functions that\n// handle them. Such functions will be called before any handling\n// ProseMirror does of events fired on the editable DOM element.\n// Contrary to the other event handling props, when returning true\n// from such a function, you are responsible for calling\n// `preventDefault` yourself (or not, if you want to allow the\n// default behavior).\n//\n// handleKeyDown:: ?(view: EditorView, event: dom.KeyboardEvent) → bool\n// Called when the editor receives a `keydown` event.\n//\n// handleKeyPress:: ?(view: EditorView, event: dom.KeyboardEvent) → bool\n// Handler for `keypress` events.\n//\n// handleTextInput:: ?(view: EditorView, from: number, to: number, text: string) → bool\n// Whenever the user directly input text, this handler is called\n// before the input is applied. If it returns `true`, the default\n// behavior of actually inserting the text is suppressed.\n//\n// handleClickOn:: ?(view: EditorView, pos: number, node: Node, nodePos: number, event: dom.MouseEvent, direct: bool) → bool\n// Called for each node around a click, from the inside out. The\n// `direct` flag will be true for the inner node.\n//\n// handleClick:: ?(view: EditorView, pos: number, event: dom.MouseEvent) → bool\n// Called when the editor is clicked, after `handleClickOn` handlers\n// have been called.\n//\n// handleDoubleClickOn:: ?(view: EditorView, pos: number, node: Node, nodePos: number, event: dom.MouseEvent, direct: bool) → bool\n// Called for each node around a double click.\n//\n// handleDoubleClick:: ?(view: EditorView, pos: number, event: dom.MouseEvent) → bool\n// Called when the editor is double-clicked, after `handleDoubleClickOn`.\n//\n// handleTripleClickOn:: ?(view: EditorView, pos: number, node: Node, nodePos: number, event: dom.MouseEvent, direct: bool) → bool\n// Called for each node around a triple click.\n//\n// handleTripleClick:: ?(view: EditorView, pos: number, event: dom.MouseEvent) → bool\n// Called when the editor is triple-clicked, after `handleTripleClickOn`.\n//\n// handlePaste:: ?(view: EditorView, event: dom.ClipboardEvent, slice: Slice) → bool\n// Can be used to override the behavior of pasting. `slice` is the\n// pasted content parsed by the editor, but you can directly access\n// the event to get at the raw content.\n//\n// handleDrop:: ?(view: EditorView, event: dom.Event, slice: Slice, moved: bool) → bool\n// Called when something is dropped on the editor. `moved` will be\n// true if this drop moves from the current selection (which should\n// thus be deleted).\n//\n// handleScrollToSelection:: ?(view: EditorView) → bool\n// Called when the view, after updating its state, tries to scroll\n// the selection into view. A handler function may return false to\n// indicate that it did not handle the scrolling and further\n// handlers or the default behavior should be tried.\n//\n// createSelectionBetween:: ?(view: EditorView, anchor: ResolvedPos, head: ResolvedPos) → ?Selection\n// Can be used to override the way a selection is created when\n// reading a DOM selection between the given anchor and head.\n//\n// domParser:: ?DOMParser\n// The [parser](#model.DOMParser) to use when reading editor changes\n// from the DOM. Defaults to calling\n// [`DOMParser.fromSchema`](#model.DOMParser^fromSchema) on the\n// editor's schema.\n//\n// transformPastedHTML:: ?(html: string) → string\n// Can be used to transform pasted HTML text, _before_ it is parsed,\n// for example to clean it up.\n//\n// clipboardParser:: ?DOMParser\n// The [parser](#model.DOMParser) to use when reading content from\n// the clipboard. When not given, the value of the\n// [`domParser`](#view.EditorProps.domParser) prop is used.\n//\n// transformPastedText:: ?(text: string, plain: bool) → string\n// Transform pasted plain text. The `plain` flag will be true when\n// the text is pasted as plain text.\n//\n// clipboardTextParser:: ?(text: string, $context: ResolvedPos, plain: bool) → Slice\n// A function to parse text from the clipboard into a document\n// slice. Called after\n// [`transformPastedText`](#view.EditorProps.transformPastedText).\n// The default behavior is to split the text into lines, wrap them\n// in `

              ` tags, and call\n// [`clipboardParser`](#view.EditorProps.clipboardParser) on it.\n// The `plain` flag will be true when the text is pasted as plain text.\n//\n// transformPasted:: ?(Slice) → Slice\n// Can be used to transform pasted content before it is applied to\n// the document.\n//\n// nodeViews:: ?Object<(node: Node, view: EditorView, getPos: () → number, decorations: [Decoration]) → NodeView>\n// Allows you to pass custom rendering and behavior logic for nodes\n// and marks. Should map node and mark names to constructor\n// functions that produce a [`NodeView`](#view.NodeView) object\n// implementing the node's display behavior. For nodes, the third\n// argument `getPos` is a function that can be called to get the\n// node's current position, which can be useful when creating\n// transactions to update it. For marks, the third argument is a\n// boolean that indicates whether the mark's content is inline.\n//\n// `decorations` is an array of node or inline decorations that are\n// active around the node. They are automatically drawn in the\n// normal way, and you will usually just want to ignore this, but\n// they can also be used as a way to provide context information to\n// the node view without adding it to the document itself.\n//\n// clipboardSerializer:: ?DOMSerializer\n// The DOM serializer to use when putting content onto the\n// clipboard. If not given, the result of\n// [`DOMSerializer.fromSchema`](#model.DOMSerializer^fromSchema)\n// will be used.\n//\n// clipboardTextSerializer:: ?(Slice) → string\n// A function that will be called to get the text for the current\n// selection when copying text to the clipboard. By default, the\n// editor will use [`textBetween`](#model.Node.textBetween) on the\n// selected range.\n//\n// decorations:: ?(state: EditorState) → ?DecorationSet\n// A set of [document decorations](#view.Decoration) to show in the\n// view.\n//\n// editable:: ?(state: EditorState) → bool\n// When this returns false, the content of the view is not directly\n// editable.\n//\n// attributes:: ?union, (EditorState) → ?Object>\n// Control the DOM attributes of the editable element. May be either\n// an object or a function going from an editor state to an object.\n// By default, the element will get a class `\"ProseMirror\"`, and\n// will have its `contentEditable` attribute determined by the\n// [`editable` prop](#view.EditorProps.editable). Additional classes\n// provided here will be added to the class. For other attributes,\n// the value provided first (as in\n// [`someProp`](#view.EditorView.someProp)) will be used.\n//\n// scrollThreshold:: ?union\n// Determines the distance (in pixels) between the cursor and the\n// end of the visible viewport at which point, when scrolling the\n// cursor into view, scrolling takes place. Defaults to 0.\n//\n// scrollMargin:: ?union\n// Determines the extra space (in pixels) that is left above or\n// below the cursor when it is scrolled into view. Defaults to 5.\n\n// DirectEditorProps:: interface extends EditorProps\n//\n// The props object given directly to the editor view supports two\n// fields that can't be used in plugins:\n//\n// state:: EditorState\n// The current state of the editor.\n//\n// dispatchTransaction:: ?(tr: Transaction)\n// The callback over which to send transactions (state updates)\n// produced by the view. If you specify this, you probably want to\n// make sure this ends up calling the view's\n// [`updateState`](#view.EditorView.updateState) method with a new\n// state that has the transaction\n// [applied](#state.EditorState.apply). The callback will be bound to have\n// the view instance as its `this` binding.\n\nexport { Decoration, DecorationSet, EditorView, endComposition as __endComposition, parseFromClipboard as __parseFromClipboard, serializeForClipboard as __serializeForClipboard };\n//# sourceMappingURL=index.es.js.map\n","import { Plugin } from 'prosemirror-state';\nimport { dropPoint } from 'prosemirror-transform';\n\n// :: (options: ?Object) → Plugin\n// Create a plugin that, when added to a ProseMirror instance,\n// causes a decoration to show up at the drop position when something\n// is dragged over the editor.\n//\n// options::- These options are supported:\n//\n// color:: ?string\n// The color of the cursor. Defaults to `black`.\n//\n// width:: ?number\n// The precise width of the cursor in pixels. Defaults to 1.\n//\n// class:: ?string\n// A CSS class name to add to the cursor element.\nfunction dropCursor(options) {\n if ( options === void 0 ) options = {};\n\n return new Plugin({\n view: function view(editorView) { return new DropCursorView(editorView, options) }\n })\n}\n\nvar DropCursorView = function DropCursorView(editorView, options) {\n var this$1 = this;\n\n this.editorView = editorView;\n this.width = options.width || 1;\n this.color = options.color || \"black\";\n this.class = options.class;\n this.cursorPos = null;\n this.element = null;\n this.timeout = null;\n\n this.handlers = [\"dragover\", \"dragend\", \"drop\", \"dragleave\"].map(function (name) {\n var handler = function (e) { return this$1[name](e); };\n editorView.dom.addEventListener(name, handler);\n return {name: name, handler: handler}\n });\n};\n\nDropCursorView.prototype.destroy = function destroy () {\n var this$1 = this;\n\n this.handlers.forEach(function (ref) {\n var name = ref.name;\n var handler = ref.handler;\n\n return this$1.editorView.dom.removeEventListener(name, handler);\n });\n};\n\nDropCursorView.prototype.update = function update (editorView, prevState) {\n if (this.cursorPos != null && prevState.doc != editorView.state.doc) { this.updateOverlay(); }\n};\n\nDropCursorView.prototype.setCursor = function setCursor (pos) {\n if (pos == this.cursorPos) { return }\n this.cursorPos = pos;\n if (pos == null) {\n this.element.parentNode.removeChild(this.element);\n this.element = null;\n } else {\n this.updateOverlay();\n }\n};\n\nDropCursorView.prototype.updateOverlay = function updateOverlay () {\n var $pos = this.editorView.state.doc.resolve(this.cursorPos), rect;\n if (!$pos.parent.inlineContent) {\n var before = $pos.nodeBefore, after = $pos.nodeAfter;\n if (before || after) {\n var nodeRect = this.editorView.nodeDOM(this.cursorPos - (before ?before.nodeSize : 0)).getBoundingClientRect();\n var top = before ? nodeRect.bottom : nodeRect.top;\n if (before && after)\n { top = (top + this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top) / 2; }\n rect = {left: nodeRect.left, right: nodeRect.right, top: top - this.width / 2, bottom: top + this.width / 2};\n }\n }\n if (!rect) {\n var coords = this.editorView.coordsAtPos(this.cursorPos);\n rect = {left: coords.left - this.width / 2, right: coords.left + this.width / 2, top: coords.top, bottom: coords.bottom};\n }\n\n var parent = this.editorView.dom.offsetParent;\n if (!this.element) {\n this.element = parent.appendChild(document.createElement(\"div\"));\n if (this.class) { this.element.className = this.class; }\n this.element.style.cssText = \"position: absolute; z-index: 50; pointer-events: none; background-color: \" + this.color;\n }\n var parentLeft, parentTop;\n if (!parent || parent == document.body && getComputedStyle(parent).position == \"static\") {\n parentLeft = -pageXOffset;\n parentTop = -pageYOffset;\n } else {\n var rect$1 = parent.getBoundingClientRect();\n parentLeft = rect$1.left - parent.scrollLeft;\n parentTop = rect$1.top - parent.scrollTop;\n }\n this.element.style.left = (rect.left - parentLeft) + \"px\";\n this.element.style.top = (rect.top - parentTop) + \"px\";\n this.element.style.width = (rect.right - rect.left) + \"px\";\n this.element.style.height = (rect.bottom - rect.top) + \"px\";\n};\n\nDropCursorView.prototype.scheduleRemoval = function scheduleRemoval (timeout) {\n var this$1 = this;\n\n clearTimeout(this.timeout);\n this.timeout = setTimeout(function () { return this$1.setCursor(null); }, timeout);\n};\n\nDropCursorView.prototype.dragover = function dragover (event) {\n if (!this.editorView.editable) { return }\n var pos = this.editorView.posAtCoords({left: event.clientX, top: event.clientY});\n if (pos) {\n var target = pos.pos;\n if (this.editorView.dragging && this.editorView.dragging.slice) {\n target = dropPoint(this.editorView.state.doc, target, this.editorView.dragging.slice);\n if (target == null) { target = pos.pos; }\n }\n this.setCursor(target);\n this.scheduleRemoval(5000);\n }\n};\n\nDropCursorView.prototype.dragend = function dragend () {\n this.scheduleRemoval(20);\n};\n\nDropCursorView.prototype.drop = function drop () {\n this.scheduleRemoval(20);\n};\n\nDropCursorView.prototype.dragleave = function dragleave (event) {\n if (event.target == this.editorView.dom || !this.editorView.dom.contains(event.relatedTarget))\n { this.setCursor(null); }\n};\n\nexport { dropCursor };\n//# sourceMappingURL=index.es.js.map\n","import { keydownHandler } from 'prosemirror-keymap';\nimport { NodeSelection, Selection, Plugin, TextSelection } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Slice } from 'prosemirror-model';\n\n// ::- Gap cursor selections are represented using this class. Its\n// `$anchor` and `$head` properties both point at the cursor position.\nvar GapCursor = /*@__PURE__*/(function (Selection) {\n function GapCursor($pos) {\n Selection.call(this, $pos, $pos);\n }\n\n if ( Selection ) GapCursor.__proto__ = Selection;\n GapCursor.prototype = Object.create( Selection && Selection.prototype );\n GapCursor.prototype.constructor = GapCursor;\n\n GapCursor.prototype.map = function map (doc, mapping) {\n var $pos = doc.resolve(mapping.map(this.head));\n return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos)\n };\n\n GapCursor.prototype.content = function content () { return Slice.empty };\n\n GapCursor.prototype.eq = function eq (other) {\n return other instanceof GapCursor && other.head == this.head\n };\n\n GapCursor.prototype.toJSON = function toJSON () {\n return {type: \"gapcursor\", pos: this.head}\n };\n\n GapCursor.fromJSON = function fromJSON (doc, json) {\n if (typeof json.pos != \"number\") { throw new RangeError(\"Invalid input for GapCursor.fromJSON\") }\n return new GapCursor(doc.resolve(json.pos))\n };\n\n GapCursor.prototype.getBookmark = function getBookmark () { return new GapBookmark(this.anchor) };\n\n GapCursor.valid = function valid ($pos) {\n var parent = $pos.parent;\n if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos)) { return false }\n var override = parent.type.spec.allowGapCursor;\n if (override != null) { return override }\n var deflt = parent.contentMatchAt($pos.index()).defaultType;\n return deflt && deflt.isTextblock\n };\n\n GapCursor.findFrom = function findFrom ($pos, dir, mustMove) {\n search: for (;;) {\n if (!mustMove && GapCursor.valid($pos)) { return $pos }\n var pos = $pos.pos, next = null;\n // Scan up from this position\n for (var d = $pos.depth;; d--) {\n var parent = $pos.node(d);\n if (dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0) {\n next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1);\n break\n } else if (d == 0) {\n return null\n }\n pos += dir;\n var $cur = $pos.doc.resolve(pos);\n if (GapCursor.valid($cur)) { return $cur }\n }\n\n // And then down into the next node\n for (;;) {\n var inside = dir > 0 ? next.firstChild : next.lastChild;\n if (!inside) {\n if (next.isAtom && !next.isText && !NodeSelection.isSelectable(next)) {\n $pos = $pos.doc.resolve(pos + next.nodeSize * dir);\n mustMove = false;\n continue search\n }\n break\n }\n next = inside;\n pos += dir;\n var $cur$1 = $pos.doc.resolve(pos);\n if (GapCursor.valid($cur$1)) { return $cur$1 }\n }\n\n return null\n }\n };\n\n return GapCursor;\n}(Selection));\n\nGapCursor.prototype.visible = false;\n\nSelection.jsonID(\"gapcursor\", GapCursor);\n\nvar GapBookmark = function GapBookmark(pos) {\n this.pos = pos;\n};\nGapBookmark.prototype.map = function map (mapping) {\n return new GapBookmark(mapping.map(this.pos))\n};\nGapBookmark.prototype.resolve = function resolve (doc) {\n var $pos = doc.resolve(this.pos);\n return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos)\n};\n\nfunction closedBefore($pos) {\n for (var d = $pos.depth; d >= 0; d--) {\n var index = $pos.index(d);\n // At the start of this parent, look at next one\n if (index == 0) { continue }\n // See if the node before (or its first ancestor) is closed\n for (var before = $pos.node(d).child(index - 1);; before = before.lastChild) {\n if ((before.childCount == 0 && !before.inlineContent) || before.isAtom || before.type.spec.isolating) { return true }\n if (before.inlineContent) { return false }\n }\n }\n // Hit start of document\n return true\n}\n\nfunction closedAfter($pos) {\n for (var d = $pos.depth; d >= 0; d--) {\n var index = $pos.indexAfter(d), parent = $pos.node(d);\n if (index == parent.childCount) { continue }\n for (var after = parent.child(index);; after = after.firstChild) {\n if ((after.childCount == 0 && !after.inlineContent) || after.isAtom || after.type.spec.isolating) { return true }\n if (after.inlineContent) { return false }\n }\n }\n return true\n}\n\n// :: () → Plugin\n// Create a gap cursor plugin. When enabled, this will capture clicks\n// near and arrow-key-motion past places that don't have a normally\n// selectable position nearby, and create a gap cursor selection for\n// them. The cursor is drawn as an element with class\n// `ProseMirror-gapcursor`. You can either include\n// `style/gapcursor.css` from the package's directory or add your own\n// styles to make it visible.\nvar gapCursor = function() {\n return new Plugin({\n props: {\n decorations: drawGapCursor,\n\n createSelectionBetween: function createSelectionBetween(_view, $anchor, $head) {\n if ($anchor.pos == $head.pos && GapCursor.valid($head)) { return new GapCursor($head) }\n },\n\n handleClick: handleClick,\n handleKeyDown: handleKeyDown\n }\n })\n};\n\nvar handleKeyDown = keydownHandler({\n \"ArrowLeft\": arrow(\"horiz\", -1),\n \"ArrowRight\": arrow(\"horiz\", 1),\n \"ArrowUp\": arrow(\"vert\", -1),\n \"ArrowDown\": arrow(\"vert\", 1)\n});\n\nfunction arrow(axis, dir) {\n var dirStr = axis == \"vert\" ? (dir > 0 ? \"down\" : \"up\") : (dir > 0 ? \"right\" : \"left\");\n return function(state, dispatch, view) {\n var sel = state.selection;\n var $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty;\n if (sel instanceof TextSelection) {\n if (!view.endOfTextblock(dirStr) || $start.depth == 0) { return false }\n mustMove = false;\n $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before());\n }\n var $found = GapCursor.findFrom($start, dir, mustMove);\n if (!$found) { return false }\n if (dispatch) { dispatch(state.tr.setSelection(new GapCursor($found))); }\n return true\n }\n}\n\nfunction handleClick(view, pos, event) {\n if (!view.editable) { return false }\n var $pos = view.state.doc.resolve(pos);\n if (!GapCursor.valid($pos)) { return false }\n var ref = view.posAtCoords({left: event.clientX, top: event.clientY});\n var inside = ref.inside;\n if (inside > -1 && NodeSelection.isSelectable(view.state.doc.nodeAt(inside))) { return false }\n view.dispatch(view.state.tr.setSelection(new GapCursor($pos)));\n return true\n}\n\nfunction drawGapCursor(state) {\n if (!(state.selection instanceof GapCursor)) { return null }\n var node = document.createElement(\"div\");\n node.className = \"ProseMirror-gapcursor\";\n return DecorationSet.create(state.doc, [Decoration.widget(state.selection.head, node, {key: \"gapcursor\"})])\n}\n\nexport { GapCursor, gapCursor };\n//# sourceMappingURL=index.es.js.map\n","import { Plugin } from 'prosemirror-state';\n\n// From https://gist.github.com/khanzadimahdi/bab8a3416bdb764b9eda5b38b35735b8\nconst dataImageRegex = /^data:((?:\\w+\\/(?:(?!;).)+)?)((?:;[\\w\\W]*?[^;])*),(.+)$/;\n\nlet parser = new DOMParser();\n\nexport default function disableBase64PastePlugin() {\n return new Plugin({\n props: {\n transformPastedHTML(html) {\n const doc = parser.parseFromString(html, 'text/html');\n doc.querySelectorAll('img').forEach((node) => {\n if (dataImageRegex.test(node.src)) {\n node.remove();\n }\n });\n\n return doc.documentElement.outerHTML;\n },\n },\n });\n}\n","import { Plugin } from 'prosemirror-state';\n\nfunction onClick(schema) {\n return (view, pos, node, nodePos, event, direct) => {\n if (direct && node.type === schema.nodes.spoiler && event.target.tagName !== 'P') {\n // TODO: Figure out why this dispatch event isn't working.\n // Mutating the node directly isn't good practice.\n // view.dispatch(\n // view.state.tr.setNodeMarkup(pos, null, { open: false })\n // );\n node.attrs.open = !node.attrs.open;\n view.focus();\n event.stopPropagation();\n event.preventDefault();\n return false;\n }\n };\n}\n\nexport default function toggleSpoiler(schema) {\n return new Plugin({\n props: {\n handleClickOn: onClick(schema),\n handleDoubleClickOn: onClick(schema),\n },\n });\n}\n","import { inputRules, wrappingInputRule, textblockTypeInputRule, emDash, ellipsis } from 'prosemirror-inputrules';\nimport { markInputRule, nodeInputRule } from 'tiptap-commands';\n\n// Copied from https://github.com/ProseMirror/prosemirror-example-setup/blob/master/src/inputrules.js\n\nfunction blockQuoteRule(nodeType) {\n return wrappingInputRule(/^\\s*>\\s$/, nodeType);\n}\n\nfunction orderedListRule(nodeType) {\n return wrappingInputRule(\n /^(\\d+)(\\.|\\))\\s$/,\n nodeType,\n (match) => ({ order: +match[1] }),\n (match, node) => node.childCount + node.attrs.order == +match[1]\n );\n}\n\nfunction bulletListRule(nodeType) {\n return wrappingInputRule(/^\\s*([-+*])\\s$/, nodeType);\n}\n\nfunction codeBlockRule(nodeType) {\n return textblockTypeInputRule(/^```$/, nodeType);\n}\n\nfunction headingRule(nodeType, maxLevel) {\n return textblockTypeInputRule(new RegExp('^(#{1,' + maxLevel + '})\\\\s$'), nodeType, (match) => ({ level: match[1].length }));\n}\n\nfunction blockSpoilerRule(nodeType) {\n return wrappingInputRule(/^\\s*>!\\s$/, nodeType);\n}\n\nexport default function buildInputRules(schema) {\n const rules = [\n ellipsis,\n blockQuoteRule(schema.nodes.blockquote),\n orderedListRule(schema.nodes.ordered_list),\n bulletListRule(schema.nodes.bullet_list),\n codeBlockRule(schema.nodes.code_block),\n headingRule(schema.nodes.heading, 6),\n blockSpoilerRule(schema.nodes.spoiler),\n nodeInputRule(/(?:___\\s|\\*\\*\\*\\s|---)$/, schema.nodes.horizontal_rule),\n textblockTypeInputRule(/^\\s*\\$\\$\\s$/, schema.nodes.math_block),\n markInputRule(/(?:\\*\\*|__)([^\\*_]+)(?:\\*\\*|__)$/, schema.marks.strong),\n markInputRule(/(?:^|[^_])(_([^_]+)_)$/, schema.marks.em),\n markInputRule(/(?:^|[^*])(\\*([^*]+)\\*)$/, schema.marks.em),\n markInputRule(/(?:`)([^`]+)(?:`)$/, schema.marks.code),\n markInputRule(/(?:~~)([^~]+)(?:~~)$/, schema.marks.strike),\n markInputRule(/(?:[^~]~)([^~]+)(?:~)$/, schema.marks.sub),\n markInputRule(/(?:\\^)([^^]+)(?:\\^)$/, schema.marks.sup),\n markInputRule(/(?:\\|\\|)([^\\|]+)(?:\\|\\|)$/, schema.marks.spoiler_inline),\n markInputRule(/(?:>!)(.+)(?:!<)$/, schema.marks.spoiler_inline),\n markInputRule(/(?:\\$)([^$]+)(?:\\$)$/, schema.marks.math_inline),\n ];\n\n return rules;\n}\n","import { baseKeymap } from 'tiptap-commands';\nimport { history } from 'prosemirror-history';\nimport { keymap } from 'prosemirror-keymap';\nimport { EditorState, Selection, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { dropCursor } from 'prosemirror-dropcursor';\nimport { gapCursor } from 'prosemirror-gapcursor';\n\nimport ItemList from 'flarum/common/utils/ItemList';\nimport disabledPlugin from './plugins/disabledPlugin';\nimport disableBase64PastePlugin from './plugins/disableBase64PastePlugin';\nimport placeholderPlugin from './plugins/placeholderPlugin';\nimport menuPlugin from './plugins/menuPlugin';\nimport toggleSpoiler from './plugins/toggleSpoiler';\nimport richTextKeymap from './key-bindings';\nimport buildInputRules from './inputrules';\nimport MarkdownSerializerBuilder from './markdown/MarkdownSerializerBuilder';\nimport MarkdownParserBuilder from './markdown/MarkdownParserBuilder';\nimport SchemaBuilder from './markdown/SchemaBuilder';\nimport { inputRules } from 'prosemirror-inputrules';\n\nexport default class ProseMirrorEditorDriver {\n constructor(target, attrs) {\n this.build(target, attrs);\n }\n\n build(target, attrs) {\n this.attrs = attrs;\n this.schema = new SchemaBuilder().build();\n\n this.parser = new MarkdownParserBuilder(this.schema).build();\n this.serializer = new MarkdownSerializerBuilder(this.schema).build();\n\n this.state = EditorState.create(this.buildEditorStateConfig());\n this.view = new EditorView(target, this.buildEditorProps());\n\n const cssClasses = attrs.classNames || [];\n cssClasses.forEach((className) => this.view.dom.classList.add(className));\n\n const callInputListeners = (e) => {\n this.attrs.inputListeners.forEach((listener) => {\n listener.call(target);\n });\n\n e.redraw = false;\n };\n\n target.oninput = callInputListeners;\n target.onclick = callInputListeners;\n target.onkeyup = callInputListeners;\n }\n\n buildEditorStateConfig() {\n return {\n doc: this.parseInitialValue(this.attrs.value),\n disabled: this.attrs.disabled,\n schema: this.schema,\n plugins: this.buildPluginItems().toArray(),\n };\n }\n\n buildPluginItems() {\n const items = new ItemList();\n\n items.add('markdownInputrules', inputRules({ rules: this.buildInputRules(this.schema) }));\n\n items.add('submit', keymap({ 'Mod-Enter': this.attrs.onsubmit }));\n\n items.add('escape', keymap({ Escape: this.attrs.escape }));\n\n items.add('richTextKeymap', keymap(richTextKeymap(this.schema)));\n\n items.add('baseKeymap', keymap(baseKeymap));\n\n items.add('placeholder', placeholderPlugin(this.attrs.placeholder));\n\n items.add('history', history());\n\n items.add('disabled', disabledPlugin());\n\n items.add('disableBase64Paste', disableBase64PastePlugin());\n\n items.add('dropCursor', dropCursor());\n\n items.add('gapCursor', gapCursor());\n\n items.add('menu', menuPlugin(this.attrs.menuState));\n\n items.add('toggleSpoiler', toggleSpoiler(this.schema));\n\n return items;\n }\n\n buildEditorProps() {\n const self = this;\n\n return {\n state: this.state,\n dispatchTransaction(transaction) {\n let newState = this.state.apply(transaction);\n this.updateState(newState);\n\n const newDoc = this.state.doc;\n const newDocPlaintext = self.serializeContent(newDoc, self.schema);\n self.attrs.oninput(newDocPlaintext);\n },\n };\n }\n\n buildInputRules(schema) {\n return buildInputRules(schema);\n }\n\n parseInitialValue(text) {\n return this.parser.parse(text);\n }\n\n serializeContent(doc) {\n return this.serializer.serialize(doc, { tightLists: true });\n }\n\n // External Control Stuff\n\n /**\n * Focus the textarea and place the cursor at the given index.\n *\n * @param {number} position\n */\n moveCursorTo(position) {\n this.setSelectionRange(position, position);\n }\n\n /**\n * Get the selected range of the textarea.\n *\n * @return {Array}\n */\n getSelectionRange() {\n return [this.view.state.selection.from, this.view.state.selection.to];\n }\n\n /**\n * Get (at most) the last N characters from the current \"text block\".\n */\n getLastNChars(n) {\n const lastNode = this.view.state.selection.$from.nodeBefore;\n\n if (!lastNode || !lastNode.text) return '';\n\n return lastNode.text.slice(Math.max(0, lastNode.text.length - n));\n }\n\n /**\n * Insert content into the textarea at the position of the cursor.\n *\n * @param {String} text\n */\n insertAtCursor(text, escape) {\n this.insertAt(this.getSelectionRange()[0], text, escape);\n $(this.view.dom).trigger('click');\n }\n\n /**\n * Insert content into the textarea at the given position.\n *\n * @param {number} pos\n * @param {String} text\n */\n insertAt(pos, text, escape) {\n this.insertBetween(pos, pos, text, escape);\n }\n\n /**\n * Insert content into the textarea between the given positions.\n *\n * If the start and end positions are different, any text between them will be\n * overwritten.\n *\n * @param start\n * @param end\n * @param text\n * @param rawMarkdown\n */\n insertBetween(start, end, text, escape = true) {\n let trailingNewLines;\n\n if (escape) {\n this.view.dispatch(this.view.state.tr.insertText(text, start, end));\n } else {\n start -= 1;\n this.view.dispatch(this.view.state.tr.replaceRangeWith(start, end, this.parseInitialValue(text)));\n\n trailingNewLines = text.match(/\\s+$/)[0].split('\\n').length - 1;\n }\n\n // Move the textarea cursor to the end of the content we just inserted.\n this.moveCursorTo(Math.min(start + text.length, Selection.atEnd(this.view.state.doc).to));\n m.redraw();\n\n // TODO: accomplish this in one step.\n if (text.endsWith(' ') && !escape) {\n this.insertAtCursor(' ');\n }\n\n Array(trailingNewLines)\n .fill(0)\n .forEach(() => {\n baseKeymap['Enter'](this.view.state, this.view.dispatch);\n });\n }\n\n /**\n * Replace existing content from the start to the current cursor position.\n *\n * @param start\n * @param text\n */\n replaceBeforeCursor(start, text, escape) {\n this.insertBetween(start, this.getSelectionRange()[0], text, escape);\n }\n\n /**\n * Set the selected range of the textarea.\n *\n * @param {number} start\n * @param {number} end\n * @private\n */\n setSelectionRange(start, end) {\n const $start = this.view.state.tr.doc.resolve(start);\n const $end = this.view.state.tr.doc.resolve(end);\n\n this.view.dispatch(this.view.state.tr.setSelection(new TextSelection($start, $end)));\n this.focus();\n }\n\n getCaretCoordinates(position) {\n const viewportCoords = this.view.coordsAtPos(position);\n const editorViewportOffset = this.view.dom.getBoundingClientRect();\n return {\n left: viewportCoords.left - editorViewportOffset.left,\n top: viewportCoords.top - editorViewportOffset.top,\n };\n }\n\n focus() {\n this.view.focus();\n }\n destroy() {\n this.view.destroy();\n }\n\n disabled(disabled) {\n this.view.dispatch(this.view.state.tr.setMeta('disabled', disabled));\n }\n}\n","import { Plugin } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\n\nexport default function placeholderPlugin(text) {\n return new Plugin({\n props: {\n decorations: (state) => {\n const decorations = [];\n\n if (state.doc.childCount === 1) {\n const node = state.doc.child(0);\n if (node.type.isBlock && node.childCount === 0 && node.type == state.schema.nodes.paragraph) {\n decorations.push(\n Decoration.node(0, node.nodeSize, {\n class: 'placeholder',\n 'data-before': text,\n })\n );\n }\n }\n\n return DecorationSet.create(state.doc, decorations);\n },\n },\n });\n}\n","import { Plugin } from 'prosemirror-state';\n\nexport default function menuPlugin(menuState) {\n return new Plugin({\n view(editorView) {\n menuState.attachEditorView(editorView);\n return menuState;\n },\n });\n}\n","import { redo, undo } from 'prosemirror-history';\nimport { undoInputRule } from 'prosemirror-inputrules';\nimport { TextSelection } from 'prosemirror-state';\nimport {\n chainCommands,\n exitCode,\n liftListItem,\n newlineInCode,\n setBlockType,\n sinkListItem,\n splitListItem,\n toggleList,\n toggleMark,\n wrapIn,\n} from 'tiptap-commands';\n\nexport default function richTextKeymap(schema) {\n const considerDropdown = (state, dispatch) => {\n const emojiDropdown = $('.EmojiDropdown:visible');\n const mentionsDropdown = $('.MentionsDropdown:visible');\n\n if (emojiDropdown[0] || mentionsDropdown[0]) return true;\n };\n\n const smartExitCode = (state, dispatch, view) => {\n let { $head, $anchor } = state.selection;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) return false;\n\n const nodeBefore = state.selection.$from.nodeBefore;\n const nodeAfter = state.selection.$from.nodeAfter;\n if ((!nodeBefore || nodeBefore.text.slice(-1) === '\\n') && !nodeAfter) {\n view.dispatch(view.state.tr.delete(state.selection.from - 1, state.selection.from));\n view.dispatch(view.state.tr.setSelection(TextSelection.near(view.state.doc.resolve(view.state.selection.from))));\n return exitCode(view.state, view.dispatch);\n } else {\n return newlineInCode(state, dispatch);\n }\n };\n\n const insertHardBreak = (state, dispatch) => {\n dispatch(state.tr.replaceSelectionWith(schema.nodes.hard_break.create()).scrollIntoView());\n return true;\n };\n\n const smartInsertHardBreak = (state, dispatch, view) => {\n let { $head, $anchor } = state.selection;\n if ($head.parent.type.name !== 'paragraph' || !$head.sameParent($anchor)) return false;\n\n const nodeBefore = state.selection.$from.nodeBefore;\n const nodeAfter = state.selection.$from.nodeAfter;\n\n if (nodeBefore && nodeBefore.text && nodeBefore.text.slice(-1) !== '\\n') {\n return insertHardBreak(view.state, view.dispatch);\n } else if (nodeBefore && !nodeBefore.text && !nodeAfter) {\n view.dispatch(view.state.tr.delete(state.selection.from - 1, state.selection.from));\n view.dispatch(view.state.tr.setSelection(TextSelection.near(view.state.doc.resolve(view.state.selection.from))));\n }\n };\n\n const enterCommands = [considerDropdown, splitListItem(schema.nodes.list_item), smartExitCode];\n\n if (app.session.user.preferences().richTextCompactParagraphs) {\n enterCommands.push(smartInsertHardBreak);\n }\n\n const handleEnter = chainCommands(...enterCommands);\n\n return {\n // History\n 'Mod-z': undo,\n 'Mod-y': redo,\n 'Mod-Shift-z': redo,\n Backspace: undoInputRule,\n // Formatting: Marks\n 'Mod-b': toggleMark(schema.marks.strong),\n 'Mod-i': toggleMark(schema.marks.em),\n 'Mod-`': toggleMark(schema.marks.code),\n 'Alt-Shift-5': toggleMark(schema.marks.strike),\n 'Mod-,': toggleMark(schema.marks.sub),\n 'Mod-.': toggleMark(schema.marks.sup),\n 'Mod-;': toggleMark(schema.marks.spoiler_inline),\n // Formatting: Wrap\n 'Shift-Mod-8': toggleList(schema.nodes.bullet_list),\n 'Shift-Mod-9': toggleList(schema.nodes.ordered_list),\n 'Mod-q': wrapIn(schema.nodes.blockquote),\n // Formatting: Type\n 'Shift-Ctrl-0': setBlockType(schema.nodes.paragraph),\n 'Shift-Ctrl-1': setBlockType(schema.nodes.heading, { level: 1 }),\n 'Shift-Ctrl-2': setBlockType(schema.nodes.heading, { level: 2 }),\n 'Shift-Ctrl-3': setBlockType(schema.nodes.heading, { level: 3 }),\n 'Shift-Ctrl-4': setBlockType(schema.nodes.heading, { level: 4 }),\n 'Shift-Ctrl-5': setBlockType(schema.nodes.heading, { level: 5 }),\n 'Shift-Ctrl-6': setBlockType(schema.nodes.heading, { level: 6 }),\n 'Shift-Ctrl-\\\\': setBlockType(schema.nodes.code_block),\n // Whitespace\n 'Mod-]': sinkListItem(schema.nodes.list_item),\n 'Mod-m': sinkListItem(schema.nodes.list_item),\n 'Mod-[': liftListItem(schema.nodes.list_item),\n 'Mod-Shift-m': liftListItem(schema.nodes.list_item),\n Enter: handleEnter,\n 'Shift-Enter': chainCommands(newlineInCode, insertHardBreak),\n };\n}\n","import { Plugin, PluginKey } from 'prosemirror-state';\n\nexport default function disabledPlugin(text) {\n return new Plugin({\n key: new PluginKey('disabled'),\n\n props: {\n editable: (state) => {\n return !state.disabled$;\n },\n },\n\n state: {\n init(config) {\n return config.disabled;\n },\n\n apply(tr, curr) {\n const disabled = tr.getMeta('disabled');\n\n if (disabled !== undefined) {\n return disabled;\n }\n\n return curr;\n },\n },\n });\n}\n","// COPIED FROM https://github.com/markdown-it/markdown-it/blob/master/lib/rules_inline/text.js\n// NEEDED TO ALLOW `|` as terminator character.\n\n// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\n'use strict';\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar(ch) {\n switch (ch) {\n case 0x0a /* \\n */:\n case 0x21 /* ! */:\n case 0x23 /* # */:\n case 0x24 /* $ */:\n case 0x25 /* % */:\n case 0x26 /* & */:\n case 0x2a /* * */:\n case 0x2b /* + */:\n case 0x2d /* - */:\n case 0x3a /* : */:\n case 0x3c /* < */:\n case 0x3d /* = */:\n case 0x3e /* > */:\n case 0x40 /* @ */:\n case 0x5b /* [ */:\n case 0x5c /* \\ */:\n case 0x5d /* ] */:\n case 0x5e /* ^ */:\n case 0x5f /* _ */:\n case 0x60 /* ` */:\n case 0x7b /* { */:\n case 0x7c /* | */:\n case 0x7d /* } */:\n case 0x7e /* ~ */:\n return true;\n default:\n return false;\n }\n}\n\nconst tokenize = (state, silent) => {\n var pos = state.pos;\n\n while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n pos++;\n }\n\n if (pos === state.pos) {\n return false;\n }\n\n if (!silent) {\n state.pending += state.src.slice(state.pos, pos);\n }\n\n state.pos = pos;\n\n return true;\n};\n\nexport default function (md) {\n md.inline.ruler.before('text', 'altText', tokenize);\n md.inline.ruler.disable('text');\n}\n","// COPIED FROM https://github.com/StackExchange/Stacks-Editor/blob/main/src/shared/markdown-it/spoiler.ts\n\nimport { isSpace } from 'markdown-it/lib/common/utils';\n\n// TODO unfortunately, we cannot reliably extend blockquote since it is hardcoded to search for `>` characters\n// In addition, we cannot just call \"blockquote\" inside spoiler, because it does a lookahead for `>` characters and leaves our `!`s behind, potentially causing parsing issues\n// The official advice is to just \"copy paste then edit\" \"extended\" rules...\n// see https://github.com/markdown-it/markdown-it/blob/master/docs/development.md#general-considerations-for-plugins\n// see also https://github.com/markdown-it/markdown-it/issues/46#issuecomment-73125248\nfunction blockquoteExt(options, state, startLine, endLine, silent) {\n // NOTE: we're keeping the source as close to upstream as possible, so ignore errors like this\n // eslint-disable-next-line no-var\n var adjustTab,\n ch,\n i,\n initial,\n l,\n lastLineEmpty,\n lines,\n nextLine,\n offset,\n oldBMarks,\n oldBSCount,\n oldIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n spaceAfterMarker,\n terminate,\n terminatorRules,\n token,\n wasOutdented,\n oldLineMax = state.lineMax,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) {\n return false;\n }\n\n // check the block quote marker\n if (state.src.charCodeAt(pos) !== 0x3e /* > */ || !options.followingCharRegex.test(state.src[pos + 1])) {\n return false;\n }\n\n pos += options.markup.length;\n\n // we know that it's going to be a valid blockquote,\n // so no point trying to find the end of it in silent mode\n if (silent) {\n return true;\n }\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[startLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n // ! INSERTED\n // We need to add this hack in so that inline spoilers\n // at the start of lines don't get classified\n // as block spoilers.\n const spoiler = options.markup === '>!';\n let foundExclamation = false;\n let foundOpen = false;\n let oldPos = pos;\n if (spoiler) {\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (foundExclamation && ch === 0x3c /* < */) {\n return false;\n } else if (ch === 0x3e /* > */) {\n foundOpen = true;\n } else if (foundOpen && ch === 0x21 /* ! */) {\n break; // Inline spoiler embedded in block spoiler, this is fine.\n } else if (ch === 0x21 /* ! */) {\n foundExclamation = true;\n } else if (ch === 0x0a /* \\n */) {\n break; // Not an inline comment\n } else {\n foundExclamation = false;\n foundOpen = false;\n }\n\n pos++;\n }\n }\n pos = oldPos;\n // ! END INSERTED\n\n oldBMarks = [state.bMarks[startLine]];\n state.bMarks[startLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - ((offset + state.bsCount[startLine] + (adjustTab ? 1 : 0)) % 4);\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n oldBSCount = [state.bsCount[startLine]];\n state.bsCount[startLine] = state.sCount[startLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n lastLineEmpty = pos >= max;\n\n oldSCount = [state.sCount[startLine]];\n state.sCount[startLine] = offset - initial;\n\n oldTShift = [state.tShift[startLine]];\n state.tShift[startLine] = pos - state.bMarks[startLine];\n\n terminatorRules = state.md.block.ruler.getRules('spoiler');\n\n oldParentType = state.parentType;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore TODO adding a new parent type here...\n state.parentType = 'spoiler';\n wasOutdented = false;\n\n // Search the end of the block\n //\n // Block ends with either:\n // 1. an empty line outside:\n // ```\n // > test\n //\n // ```\n // 2. an empty line inside:\n // ```\n // >\n // test\n // ```\n // 3. another tag:\n // ```\n // > test\n // - - -\n // ```\n for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {\n // check if it's outdented, i.e. it's inside list item and indented\n // less than said list item:\n //\n // ```\n // 1. anything\n // > current blockquote\n // 2. checking this line\n // ```\n if (state.sCount[nextLine] < state.blkIndent) wasOutdented = true;\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos >= max) {\n // Case 1: line is not inside the blockquote, and this line is empty.\n break;\n }\n\n pos += options.markup.length;\n\n if (\n state.src.charCodeAt(pos - options.markup.length) === 0x3e /* > */ &&\n options.followingCharRegex.test(state.src[pos - options.markup.length + 1]) &&\n !wasOutdented\n ) {\n // This line is inside the blockquote.\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[nextLine] + pos - (state.bMarks[nextLine] + state.tShift[nextLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[nextLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n state.bMarks[nextLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - ((offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4);\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n lastLineEmpty = pos >= max;\n\n oldBSCount.push(state.bsCount[nextLine]);\n state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] = offset - initial;\n\n oldTShift.push(state.tShift[nextLine]);\n state.tShift[nextLine] = pos - state.bMarks[nextLine];\n continue;\n }\n\n // Case 2: line is not inside the blockquote, and the last line was empty.\n if (lastLineEmpty) {\n break;\n }\n\n // Case 3: another tag found.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n\n if (terminate) {\n // Quirk to enforce \"hard termination mode\" for paragraphs;\n // normally if you call `tokenize(state, startLine, nextLine)`,\n // paragraphs will look below nextLine for paragraph continuation,\n // but if blockquote is terminated by another tag, they shouldn't\n state.lineMax = nextLine;\n\n if (state.blkIndent !== 0) {\n // state.blkIndent was non-zero, we now set it to zero,\n // so we need to re-calculate all offsets to appear as\n // if indent wasn't changed\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] -= state.blkIndent;\n }\n\n break;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n\n // A negative indentation means that this is a paragraph continuation\n //\n state.sCount[nextLine] = -1;\n }\n\n oldIndent = state.blkIndent;\n state.blkIndent = 0;\n\n token = state.push(options.name + '_open', options.name, 1);\n token.markup = options.markup;\n token.map = lines = [startLine, 0];\n\n state.md.block.tokenize(state, startLine, nextLine);\n\n token = state.push(options.name + '_close', options.name, -1);\n token.markup = options.markup;\n\n state.lineMax = oldLineMax;\n state.parentType = oldParentType;\n lines[1] = state.line;\n\n // Restore original tShift; this might not be necessary since the parser\n // has already been here, but just to make sure we can do that.\n for (i = 0; i < oldTShift.length; i++) {\n state.bMarks[i + startLine] = oldBMarks[i];\n state.tShift[i + startLine] = oldTShift[i];\n state.sCount[i + startLine] = oldSCount[i];\n state.bsCount[i + startLine] = oldBSCount[i];\n }\n state.blkIndent = oldIndent;\n\n return true;\n}\n\nfunction spoilerFn(state, startLine, endLine, silent) {\n return blockquoteExt(\n {\n followingCharRegex: /!/,\n markup: '>!',\n name: 'spoiler',\n },\n state,\n startLine,\n endLine,\n silent\n );\n}\n\nfunction blockquoteFn(state, startLine, endLine, silent) {\n return blockquoteExt(\n {\n followingCharRegex: /[^!]/,\n markup: '>',\n name: 'blockquote',\n },\n state,\n startLine,\n endLine,\n silent\n );\n}\n\n/**\n * Parses out spoiler `>!` blocks\n * @param md\n */\nexport default function blockSpoiler(md) {\n // TODO necessary?\n // find all blockquote chain rules and update to be part of the spoiler chain as well\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore TODO no public way to iterate over all rules; maybe there's a better way?\n md.block.ruler.__rules__.forEach((r) => {\n const bqIndex = r.alt.indexOf('blockquote');\n if (bqIndex > -1) {\n // add in \"spoiler\" right before the \"blockquote\" entry\n r.alt.splice(bqIndex, 0, 'spoiler');\n }\n });\n md.block.ruler.before('blockquote', 'spoiler', spoilerFn, {\n // TODO stole this from blockquote, dunno what it does...\n alt: ['paragraph', 'reference', 'spoiler', 'blockquote', 'list'],\n });\n\n md.block.ruler.at('blockquote', blockquoteFn, {\n alt: ['paragraph', 'reference', 'spoiler', 'blockquote', 'list'],\n });\n}\n","/**!\n * markdown-it-mark\n *\n * Copyright (c) 2014-2015 Vitaly Puzrin, Alex Kocharin.\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n'use strict';\nconst exMark = 0x7c; /* | */\n\nconst tokenize = (frontPriorMode) => (state, silent) => {\n if (silent) return false;\n\n const start = state.pos;\n const marker = state.src.charCodeAt(start);\n\n if (marker !== exMark) return false;\n\n const scanned = state.scanDelims(state.pos, true);\n let len = scanned.length;\n const ch = String.fromCharCode(marker);\n\n if (len < 2) return false;\n\n let isOdd = false;\n if (len % 2) {\n isOdd = true;\n if (!frontPriorMode) {\n const token = state.push('text', '', 0);\n token.content = ch;\n }\n len--;\n }\n\n for (let i = 0; i < len; i += 2) {\n const token = state.push('text', '', 0);\n token.content = ch + ch;\n\n state.delimiters.push({\n marker,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n jump: i / 2, // 1 delimiter = 2 characters\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close,\n });\n }\n\n state.pos += scanned.length;\n if (isOdd && frontPriorMode) {\n state.pos--;\n }\n\n return true;\n};\n\nconst postProcess = (state, delimiters) => {\n const loneMarkers = [];\n\n for (const startDelim of delimiters) {\n if (startDelim.marker !== exMark) continue;\n if (startDelim.end === -1) continue;\n\n const endDelim = delimiters[startDelim.end];\n\n const tokenO = state.tokens[startDelim.token];\n tokenO.type = 'spoiler_inline_open';\n tokenO.tag = 'span';\n tokenO.attrs = [['class', 'spoiler_inline']];\n tokenO.nesting = 1;\n tokenO.markup = '||';\n tokenO.content = '';\n\n const tokenC = state.tokens[endDelim.token];\n tokenC.type = 'spoiler_inline_close';\n tokenC.tag = 'span';\n tokenC.nesting = -1;\n tokenC.markup = '||';\n tokenC.content = '';\n\n if (state.tokens[endDelim.token - 1].type === 'text' && state.tokens[endDelim.token - 1].content === '|') {\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's splitted\n // like this: `|||||` -> `|` + `||` + `||`, leaving one marker at the\n // start of the sequence.\n //\n // So, we have to move all those markers after subsequent spoiler_inline_close tags.\n //\n while (loneMarkers.length) {\n const i = loneMarkers.pop();\n let j = i + 1;\n\n while (j < state.tokens.length && state.tokens[j].type === 'spoiler_inline_close') {\n j++;\n }\n\n j--;\n\n if (i !== j) {\n const token = state.tokens[j];\n state.tokens[j] = state.tokens[i];\n state.tokens[i] = token;\n }\n }\n};\n\nexport default function (md, frontPriorMode = false) {\n md.inline.ruler.before('emphasis', 'spoiler_inline_bars', tokenize(frontPriorMode));\n md.inline.ruler2.before('emphasis', 'spoiler_inline_bars', (state) => {\n postProcess(state, state.delimiters);\n\n if (!state.tokens_meta) return;\n for (const meta of state.tokens_meta) {\n if (meta && meta.delimiters) {\n postProcess(state, meta.delimiters);\n }\n }\n });\n}\n","// BASED ON https://github.com/markdown-it/markdown-it-sub/blob/master/index.js\n\nconst tokenize = (frontPriorMode) => (state, silent) => {\n if (silent) return false;\n\n var scanned,\n max = state.posMax,\n start = state.pos;\n\n if (state.src.charCodeAt(start) === 0x3e /* > */ && start + 3 <= max && state.src.charCodeAt(start + 1) === 0x21 /* ! */) {\n scanned = state.scanDelims(state.pos, true);\n state.push('text', '', 0);\n state.delimiters.push({\n marker: '>!<',\n length: 2,\n jump: 0,\n token: state.tokens.length - 1,\n end: -1,\n open: true,\n close: false,\n });\n state.pos += 2;\n return true;\n }\n\n if (state.src.charCodeAt(start) === 0x21 /* ! */ && start + 2 <= max && state.src.charCodeAt(start + 1) === 0x3c /* < */) {\n state.push('text', '', 0);\n state.delimiters.push({\n marker: '>!<',\n length: 2,\n jump: 0,\n token: state.tokens.length - 1,\n end: -1,\n open: false,\n close: true,\n });\n state.pos += 2;\n return true;\n }\n\n return false;\n};\n\nfunction postProcess(state, delimiters) {\n var i,\n startDelim,\n endDelim,\n token,\n max = delimiters.length;\n\n for (i = max - 1; i >= 0; i--) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== '>!<') {\n continue;\n }\n\n // Process only opening markers\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n token = state.tokens[startDelim.token];\n token.type = 'spoiler_inline_open';\n // token.tag = isStrong ? 'strong' : 'em';\n token.nesting = 1;\n token.markup = '>!';\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = 'spoiler_inline_close';\n // token.tag = isStrong ? 'strong' : 'em';\n token.nesting = -1;\n token.markup = '!<';\n token.content = '';\n }\n}\n\nexport default function (md, frontPriorMode = false) {\n md.inline.ruler.before('emphasis', 'spoiler_inline_tags', tokenize(frontPriorMode));\n md.inline.ruler2.before('emphasis', 'spoiler_inline_bars', (state) => {\n postProcess(state, state.delimiters);\n\n if (!state.tokens_meta) return;\n for (const meta of state.tokens_meta) {\n if (meta && meta.delimiters) {\n postProcess(state, meta.delimiters);\n }\n }\n });\n}\n","import markdownit from 'markdown-it';\nimport subPlugin from 'markdown-it-sub';\nimport supPlugin from 'markdown-it-sup';\nimport latexPlugin from 'markdown-it-latex2img';\nimport { defaultMarkdownParser, MarkdownParser } from 'prosemirror-markdown';\nimport altText from './markdown-it/altText';\nimport blockSpoiler from './markdown-it/blockSpoiler';\nimport inlineSpoilerBars from './markdown-it/inlineSpoilerBars';\nimport inlineSpoilerTags from './markdown-it/inlineSpoilerTags';\n\nexport default class MarkdownParserBuilder {\n constructor(schema) {\n this.schema = schema;\n }\n\n tokenizerParams() {\n return { html: false };\n }\n\n buildTokenizer() {\n return markdownit('commonmark', this.tokenizerParams())\n .enable('strikethrough')\n .use(altText)\n .use(blockSpoiler)\n .use(latexPlugin)\n .use(subPlugin)\n .use(supPlugin)\n .use(inlineSpoilerBars)\n .use(inlineSpoilerTags);\n }\n\n buildTokens() {\n return {\n ...defaultMarkdownParser.tokens,\n\n // add support for the strike mark\n s: {\n mark: 'strike',\n },\n\n // Litedown treaks softbreaks as hard breaks\n softbreak: { node: 'hard_break' },\n\n spoiler: {\n block: 'spoiler',\n },\n\n spoiler_inline: {\n mark: 'spoiler_inline',\n },\n\n sub: {\n mark: 'sub',\n },\n\n sup: {\n mark: 'sup',\n },\n\n math_block: {\n block: 'math_block',\n noCloseToken: true,\n },\n\n math_inline: {\n mark: 'math_inline',\n noCloseToken: true,\n },\n };\n }\n\n build() {\n return new MarkdownParser(this.schema, this.buildTokenizer(), this.buildTokens());\n }\n}\n","import Dropdown from 'flarum/common/components/Dropdown';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport icon from 'flarum/common/helpers/icon';\nimport SafariModalHack from './SafariModalHack';\n\nexport default class HiddenItemsDropdown extends Dropdown {\n static initAttrs(attrs) {\n attrs.buttonClassName = 'Button Button--icon Button--link Button--menuDropdown';\n }\n\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$().on('click', (e) => {\n if ($('.App').is('.mobile-safari')) {\n // Mobile Safari doesn't support fixed items\n // So, we wrap them in a modal.\n app.modal.show(SafariModalHack, {\n title: this.attrs.tooltip,\n vnodeContent: this.attrs.buttons.map((button) => {\n return button;\n }),\n });\n e.stopPropagation();\n }\n });\n }\n\n getButtonContent(children) {\n return (\n \n {icon(this.attrs.icon)}\n \n );\n }\n\n getMenu(items) {\n return

                {this.attrs.buttons}
              ;\n }\n}\n","import { toggleBlockType, toggleWrap, wrapIn } from 'tiptap-commands';\n\nimport Component from 'flarum/common/Component';\nimport ItemList from 'flarum/common/utils/ItemList';\n\nimport CommandButton from './CommandButton';\nimport MarkButton from './MarkButton';\nimport NodeTypeDropdown from './NodeTypeDropdown';\nimport InsertImageDropdown from './InsertImageDropdown';\nimport InsertLinkDropdown from './InsertLinkDropdown';\nimport ListButton from './ListButton';\nimport insertHr from '../proseMirror/commands/insertHr';\nimport HiddenItemsDropdown from './HiddenItemsDropdown';\n\nexport default class ProseMirrorMenu extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.modifierKey = navigator.userAgent.match(/Macintosh/) ? '⌘' : 'ctrl';\n }\n view(vnode) {\n if (!this.attrs.state) return '';\n\n return
              {this.items().toArray()}
              ;\n }\n\n items() {\n const items = new ItemList();\n const state = this.attrs.state;\n const modifierKey = this.modifierKey;\n\n items.add(\n 'text_type',\n NodeTypeDropdown.component({\n type: 'text_type',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.text_type_tooltip'),\n state: state,\n options: [\n {\n title: 'H1',\n type: state.getSchema().nodes.heading,\n attrs: { level: 1 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 1 }),\n },\n {\n title: 'H2',\n type: state.getSchema().nodes.heading,\n attrs: { level: 2 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 2 }),\n },\n {\n title: 'H3',\n type: state.getSchema().nodes.heading,\n attrs: { level: 3 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 3 }),\n },\n {\n title: 'H4',\n type: state.getSchema().nodes.heading,\n attrs: { level: 4 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 4 }),\n },\n {\n title: 'H5',\n type: state.getSchema().nodes.heading,\n attrs: { level: 5 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 5 }),\n },\n {\n title: 'H6',\n type: state.getSchema().nodes.heading,\n attrs: { level: 6 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 6 }),\n },\n {\n title: 'P',\n type: state.getSchema().nodes.paragraph,\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.paragraph_tooltip', { modifierKey }),\n },\n ],\n }),\n 100\n );\n\n items.add(\n 'bold',\n MarkButton.component({\n type: 'bold',\n icon: 'fas fa-bold',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.bold_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.strong,\n }),\n 90\n );\n\n items.add(\n 'italic',\n MarkButton.component({\n type: 'italic',\n icon: 'fas fa-italic',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.italic_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.em,\n }),\n 80\n );\n\n items.add(\n 'code',\n MarkButton.component({\n type: 'code',\n icon: 'fas fa-code',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.code_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.code,\n }),\n 70\n );\n\n items.add(\n 'quote',\n CommandButton.component({\n type: 'quote',\n icon: 'fas fa-quote-left',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.quote_tooltip', { modifierKey }),\n state: state,\n command: wrapIn(state.getSchema().nodes.blockquote),\n }),\n 60\n );\n\n items.add(\n 'link',\n InsertLinkDropdown.component({\n type: 'link',\n icon: 'fas fa-link',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.link_tooltip'),\n state: state,\n mark: state.getSchema().marks.link,\n }),\n 50\n );\n\n items.add(\n 'image',\n InsertImageDropdown.component({\n type: 'image',\n icon: 'fas fa-image',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.image_tooltip'),\n state: state,\n node: state.getSchema().nodes.image,\n }),\n 40\n );\n\n items.add(\n 'unordered_list',\n ListButton.component({\n type: 'unordered_list',\n icon: 'fas fa-list-ul',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.unordered_list_tooltip', { modifierKey }),\n state: state,\n listType: state.getSchema().nodes.bullet_list,\n }),\n 30\n );\n\n items.add(\n 'ordered_list',\n ListButton.component({\n type: 'ordered_list',\n icon: 'fas fa-list-ol',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.ordered_list_tooltip', { modifierKey }),\n state: state,\n listType: state.getSchema().nodes.ordered_list,\n }),\n 20\n );\n\n items.add(\n 'additional_items',\n HiddenItemsDropdown.component({\n type: 'additional_items',\n icon: 'fas fa-plus',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.additional_items_tooltip'),\n state: state,\n buttons: this.hiddenItems().toArray(),\n })\n );\n\n return items;\n }\n\n hiddenItems() {\n const items = new ItemList();\n const state = this.attrs.state;\n const modifierKey = this.modifierKey;\n\n items.add(\n 'strike',\n MarkButton.component({\n type: 'strike',\n icon: 'fas fa-strikethrough',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.strike_tooltip'),\n state: state,\n mark: state.getSchema().marks.strike,\n })\n );\n\n items.add(\n 'sub',\n MarkButton.component({\n type: 'sub',\n icon: 'fas fa-subscript',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.sub_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.sub,\n })\n );\n\n items.add(\n 'sup',\n MarkButton.component({\n type: 'sup',\n icon: 'fas fa-superscript',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.sup_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.sup,\n })\n );\n\n items.add(\n 'spoiler_inline',\n MarkButton.component({\n type: 'spoiler_inline',\n icon: 'fas fa-eye-slash',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.spoiler_inline_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.spoiler_inline,\n })\n );\n\n items.add(\n 'code_block',\n CommandButton.component({\n type: 'code_block',\n icon: 'fas fa-terminal',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.code_block_tooltip', { modifierKey }),\n state: state,\n command: toggleBlockType(state.getSchema().nodes.code_block, state.getSchema().nodes.paragraph),\n })\n );\n\n items.add(\n 'spoiler_block',\n CommandButton.component({\n type: 'spoiler_block',\n icon: 'fas fa-caret-square-right',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.spoiler_block_tooltip', { modifierKey }),\n state: state,\n command: toggleWrap(state.getSchema().nodes.spoiler),\n })\n );\n\n items.add(\n 'horizontal_rule',\n CommandButton.component({\n type: 'horizontal_rule',\n icon: 'fas fa-minus',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.horizontal_rule_tooltip'),\n state: state,\n command: insertHr(state.getSchema().nodes.horizontal_rule),\n })\n );\n\n return items;\n }\n}\n","export default function insertHr(nodeType, attrs) {\n return function (state, dispatch) {\n dispatch(state.tr.replaceSelectionWith(nodeType.create(attrs)));\n return true;\n };\n}\n","import Button from 'flarum/common/components/Button';\nimport extractText from 'flarum/common/utils/extractText';\nimport Stream from 'flarum/common/utils/Stream';\nimport FormDropdown from './FormDropdown';\n\nimport { removeMark, updateMark } from 'tiptap-commands';\nimport insertLink from '../proseMirror/commands/insertLink';\n\nexport default class InsertLinkDropdown extends FormDropdown {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.text = Stream('');\n\n this.href = Stream('');\n this.title = Stream('');\n\n this.state.addItem(\n this.attrs.type,\n (state, dispatch) => {\n this.command(state, dispatch);\n },\n this.onEditorUpdate.bind(this)\n );\n\n this.selectionEmpty = true;\n }\n\n fields() {\n const items = super.fields();\n\n if (this.selectionEmpty && !this.active) {\n items.add(\n 'text',\n
              \n \n
              ,\n 10\n );\n }\n\n items.add(\n 'href',\n
              \n \n
              ,\n 10\n );\n\n items.add(\n 'title',\n
              \n \n
              ,\n 10\n );\n\n if (this.active) {\n items.add(\n 'remove',\n ,\n -10\n );\n }\n\n return items;\n }\n\n insert(e) {\n const linkAttrs = { href: this.href(), title: this.title() };\n\n if (this.selectionEmpty && !this.active) {\n this.command = insertLink(this.text(), this.attrs.mark, linkAttrs);\n\n this.text('');\n } else {\n this.command = updateMark(this.attrs.mark, linkAttrs);\n }\n\n this.state.run(this.attrs.type);\n }\n\n remove(e) {\n $('body').trigger('click');\n this.command = removeMark(this.attrs.mark);\n this.state.run(this.attrs.type);\n app.composer.editor.focus();\n }\n\n onEditorUpdate() {\n this.active = !!this.state.markActive(this.attrs.mark);\n this.$('.Dropdown-toggle').toggleClass('active', this.active);\n\n const attrs = this.state.markAttrs(this.attrs.mark);\n\n this.href(attrs.href);\n this.title(attrs.title);\n\n this.selectionEmpty = this.state.selectionEmpty();\n }\n}\n","export default function insertLink(text, markType, attrs) {\n return function (state, dispatch) {\n dispatch(state.tr.replaceSelectionWith(state.schema.text(text, [markType.create(attrs)]), false));\n };\n}\n","module.exports=/[!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E4E\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD803[\\uDF55-\\uDF59]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD806[\\uDC3B\\uDE3F-\\uDE46\\uDE9A-\\uDE9C\\uDE9E-\\uDEA2]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDE97-\\uDE9A]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]/","/**\n * class Ruler\n *\n * Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and\n * [[MarkdownIt#inline]] to manage sequences of functions (rules):\n *\n * - keep rules in defined order\n * - assign the name to each rule\n * - enable/disable rules\n * - add/replace rules\n * - allow assign rules to additional named chains (in the same)\n * - cacheing lists of active rules\n *\n * You will not need use this class directly until write plugins. For simple\n * rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and\n * [[MarkdownIt.use]].\n **/\n'use strict';\n\n\n/**\n * new Ruler()\n **/\nfunction Ruler() {\n // List of added rules. Each element is:\n //\n // {\n // name: XXX,\n // enabled: Boolean,\n // fn: Function(),\n // alt: [ name2, name3 ]\n // }\n //\n this.__rules__ = [];\n\n // Cached rule chains.\n //\n // First level - chain name, '' for default.\n // Second level - diginal anchor for fast filtering by charcodes.\n //\n this.__cache__ = null;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Helper methods, should not be used directly\n\n\n// Find rule index by name\n//\nRuler.prototype.__find__ = function (name) {\n for (var i = 0; i < this.__rules__.length; i++) {\n if (this.__rules__[i].name === name) {\n return i;\n }\n }\n return -1;\n};\n\n\n// Build rules lookup cache\n//\nRuler.prototype.__compile__ = function () {\n var self = this;\n var chains = [ '' ];\n\n // collect unique names\n self.__rules__.forEach(function (rule) {\n if (!rule.enabled) { return; }\n\n rule.alt.forEach(function (altName) {\n if (chains.indexOf(altName) < 0) {\n chains.push(altName);\n }\n });\n });\n\n self.__cache__ = {};\n\n chains.forEach(function (chain) {\n self.__cache__[chain] = [];\n self.__rules__.forEach(function (rule) {\n if (!rule.enabled) { return; }\n\n if (chain && rule.alt.indexOf(chain) < 0) { return; }\n\n self.__cache__[chain].push(rule.fn);\n });\n });\n};\n\n\n/**\n * Ruler.at(name, fn [, options])\n * - name (String): rule name to replace.\n * - fn (Function): new rule function.\n * - options (Object): new rule options (not mandatory).\n *\n * Replace rule by name with new function & options. Throws error if name not\n * found.\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * Replace existing typographer replacement rule with new one:\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.at('replacements', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.at = function (name, fn, options) {\n var index = this.__find__(name);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + name); }\n\n this.__rules__[index].fn = fn;\n this.__rules__[index].alt = opt.alt || [];\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.before(beforeName, ruleName, fn [, options])\n * - beforeName (String): new rule will be added before this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain before one with given name. See also\n * [[Ruler.after]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.block.ruler.before('paragraph', 'my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.before = function (beforeName, ruleName, fn, options) {\n var index = this.__find__(beforeName);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + beforeName); }\n\n this.__rules__.splice(index, 0, {\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.after(afterName, ruleName, fn [, options])\n * - afterName (String): new rule will be added after this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain after one with given name. See also\n * [[Ruler.before]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.inline.ruler.after('text', 'my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.after = function (afterName, ruleName, fn, options) {\n var index = this.__find__(afterName);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + afterName); }\n\n this.__rules__.splice(index + 1, 0, {\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n/**\n * Ruler.push(ruleName, fn [, options])\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Push new rule to the end of chain. See also\n * [[Ruler.before]], [[Ruler.after]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.push('my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.push = function (ruleName, fn, options) {\n var opt = options || {};\n\n this.__rules__.push({\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.enable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to enable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.disable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.enable = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n var result = [];\n\n // Search by name and enable\n list.forEach(function (name) {\n var idx = this.__find__(name);\n\n if (idx < 0) {\n if (ignoreInvalid) { return; }\n throw new Error('Rules manager: invalid rule name ' + name);\n }\n this.__rules__[idx].enabled = true;\n result.push(name);\n }, this);\n\n this.__cache__ = null;\n return result;\n};\n\n\n/**\n * Ruler.enableOnly(list [, ignoreInvalid])\n * - list (String|Array): list of rule names to enable (whitelist).\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names, and disable everything else. If any rule name\n * not found - throw Error. Errors can be disabled by second param.\n *\n * See also [[Ruler.disable]], [[Ruler.enable]].\n **/\nRuler.prototype.enableOnly = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n this.__rules__.forEach(function (rule) { rule.enabled = false; });\n\n this.enable(list, ignoreInvalid);\n};\n\n\n/**\n * Ruler.disable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Disable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.enable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.disable = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n var result = [];\n\n // Search by name and disable\n list.forEach(function (name) {\n var idx = this.__find__(name);\n\n if (idx < 0) {\n if (ignoreInvalid) { return; }\n throw new Error('Rules manager: invalid rule name ' + name);\n }\n this.__rules__[idx].enabled = false;\n result.push(name);\n }, this);\n\n this.__cache__ = null;\n return result;\n};\n\n\n/**\n * Ruler.getRules(chainName) -> Array\n *\n * Return array of active functions (rules) for given chain name. It analyzes\n * rules configuration, compiles caches if not exists and returns result.\n *\n * Default chain name is `''` (empty string). It can't be skipped. That's\n * done intentionally, to keep signature monomorphic for high speed.\n **/\nRuler.prototype.getRules = function (chainName) {\n if (this.__cache__ === null) {\n this.__compile__();\n }\n\n // Chain can be empty, if rules disabled. But we still have to return Array.\n return this.__cache__[chainName] || [];\n};\n\nmodule.exports = Ruler;\n","// Token class\n\n'use strict';\n\n\n/**\n * class Token\n **/\n\n/**\n * new Token(type, tag, nesting)\n *\n * Create new token and fill passed properties.\n **/\nfunction Token(type, tag, nesting) {\n /**\n * Token#type -> String\n *\n * Type of the token (string, e.g. \"paragraph_open\")\n **/\n this.type = type;\n\n /**\n * Token#tag -> String\n *\n * html tag name, e.g. \"p\"\n **/\n this.tag = tag;\n\n /**\n * Token#attrs -> Array\n *\n * Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]`\n **/\n this.attrs = null;\n\n /**\n * Token#map -> Array\n *\n * Source map info. Format: `[ line_begin, line_end ]`\n **/\n this.map = null;\n\n /**\n * Token#nesting -> Number\n *\n * Level change (number in {-1, 0, 1} set), where:\n *\n * - `1` means the tag is opening\n * - `0` means the tag is self-closing\n * - `-1` means the tag is closing\n **/\n this.nesting = nesting;\n\n /**\n * Token#level -> Number\n *\n * nesting level, the same as `state.level`\n **/\n this.level = 0;\n\n /**\n * Token#children -> Array\n *\n * An array of child nodes (inline and img tokens)\n **/\n this.children = null;\n\n /**\n * Token#content -> String\n *\n * In a case of self-closing tag (code, html, fence, etc.),\n * it has contents of this tag.\n **/\n this.content = '';\n\n /**\n * Token#markup -> String\n *\n * '*' or '_' for emphasis, fence string for fence, etc.\n **/\n this.markup = '';\n\n /**\n * Token#info -> String\n *\n * fence infostring\n **/\n this.info = '';\n\n /**\n * Token#meta -> Object\n *\n * A place for plugins to store an arbitrary data\n **/\n this.meta = null;\n\n /**\n * Token#block -> Boolean\n *\n * True for block-level tokens, false for inline tokens.\n * Used in renderer to calculate line breaks\n **/\n this.block = false;\n\n /**\n * Token#hidden -> Boolean\n *\n * If it's true, ignore this element when rendering. Used for tight lists\n * to hide paragraphs.\n **/\n this.hidden = false;\n}\n\n\n/**\n * Token.attrIndex(name) -> Number\n *\n * Search attribute index by name.\n **/\nToken.prototype.attrIndex = function attrIndex(name) {\n var attrs, i, len;\n\n if (!this.attrs) { return -1; }\n\n attrs = this.attrs;\n\n for (i = 0, len = attrs.length; i < len; i++) {\n if (attrs[i][0] === name) { return i; }\n }\n return -1;\n};\n\n\n/**\n * Token.attrPush(attrData)\n *\n * Add `[ name, value ]` attribute to list. Init attrs if necessary\n **/\nToken.prototype.attrPush = function attrPush(attrData) {\n if (this.attrs) {\n this.attrs.push(attrData);\n } else {\n this.attrs = [ attrData ];\n }\n};\n\n\n/**\n * Token.attrSet(name, value)\n *\n * Set `name` attribute to `value`. Override old value if exists.\n **/\nToken.prototype.attrSet = function attrSet(name, value) {\n var idx = this.attrIndex(name),\n attrData = [ name, value ];\n\n if (idx < 0) {\n this.attrPush(attrData);\n } else {\n this.attrs[idx] = attrData;\n }\n};\n\n\n/**\n * Token.attrGet(name)\n *\n * Get the value of attribute `name`, or null if it does not exist.\n **/\nToken.prototype.attrGet = function attrGet(name) {\n var idx = this.attrIndex(name), value = null;\n if (idx >= 0) {\n value = this.attrs[idx][1];\n }\n return value;\n};\n\n\n/**\n * Token.attrJoin(name, value)\n *\n * Join value to existing attribute via space. Or create new attribute if not\n * exists. Useful to operate with token classes.\n **/\nToken.prototype.attrJoin = function attrJoin(name, value) {\n var idx = this.attrIndex(name);\n\n if (idx < 0) {\n this.attrPush([ name, value ]);\n } else {\n this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value;\n }\n};\n\n\nmodule.exports = Token;\n","// HTML5 entities map: { name -> utf16string }\n//\n'use strict';\n\n/*eslint quotes:0*/\nmodule.exports = require('entities/lib/maps/entities.json');\n","'use strict';\n\n\nmodule.exports.encode = require('./encode');\nmodule.exports.decode = require('./decode');\nmodule.exports.format = require('./format');\nmodule.exports.parse = require('./parse');\n","module.exports=/[\\0-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/","module.exports=/[\\0-\\x1F\\x7F-\\x9F]/","module.exports=/[ \\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/","// Regexps to match html elements\n\n'use strict';\n\nvar attr_name = '[a-zA-Z_:][a-zA-Z0-9:._-]*';\n\nvar unquoted = '[^\"\\'=<>`\\\\x00-\\\\x20]+';\nvar single_quoted = \"'[^']*'\";\nvar double_quoted = '\"[^\"]*\"';\n\nvar attr_value = '(?:' + unquoted + '|' + single_quoted + '|' + double_quoted + ')';\n\nvar attribute = '(?:\\\\s+' + attr_name + '(?:\\\\s*=\\\\s*' + attr_value + ')?)';\n\nvar open_tag = '<[A-Za-z][A-Za-z0-9\\\\-]*' + attribute + '*\\\\s*\\\\/?>';\n\nvar close_tag = '<\\\\/[A-Za-z][A-Za-z0-9\\\\-]*\\\\s*>';\nvar comment = '|';\nvar processing = '<[?].*?[?]>';\nvar declaration = ']*>';\nvar cdata = '';\n\nvar HTML_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + '|' + comment +\n '|' + processing + '|' + declaration + '|' + cdata + ')');\nvar HTML_OPEN_CLOSE_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + ')');\n\nmodule.exports.HTML_TAG_RE = HTML_TAG_RE;\nmodule.exports.HTML_OPEN_CLOSE_TAG_RE = HTML_OPEN_CLOSE_TAG_RE;\n","// ~~strike through~~\n//\n'use strict';\n\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nmodule.exports.tokenize = function strikethrough(state, silent) {\n var i, scanned, token, len, ch,\n start = state.pos,\n marker = state.src.charCodeAt(start);\n\n if (silent) { return false; }\n\n if (marker !== 0x7E/* ~ */) { return false; }\n\n scanned = state.scanDelims(state.pos, true);\n len = scanned.length;\n ch = String.fromCharCode(marker);\n\n if (len < 2) { return false; }\n\n if (len % 2) {\n token = state.push('text', '', 0);\n token.content = ch;\n len--;\n }\n\n for (i = 0; i < len; i += 2) {\n token = state.push('text', '', 0);\n token.content = ch + ch;\n\n state.delimiters.push({\n marker: marker,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n jump: i,\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close\n });\n }\n\n state.pos += scanned.length;\n\n return true;\n};\n\n\nfunction postProcess(state, delimiters) {\n var i, j,\n startDelim,\n endDelim,\n token,\n loneMarkers = [],\n max = delimiters.length;\n\n for (i = 0; i < max; i++) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== 0x7E/* ~ */) {\n continue;\n }\n\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n token = state.tokens[startDelim.token];\n token.type = 's_open';\n token.tag = 's';\n token.nesting = 1;\n token.markup = '~~';\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = 's_close';\n token.tag = 's';\n token.nesting = -1;\n token.markup = '~~';\n token.content = '';\n\n if (state.tokens[endDelim.token - 1].type === 'text' &&\n state.tokens[endDelim.token - 1].content === '~') {\n\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's splitted\n // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n // start of the sequence.\n //\n // So, we have to move all those markers after subsequent s_close tags.\n //\n while (loneMarkers.length) {\n i = loneMarkers.pop();\n j = i + 1;\n\n while (j < state.tokens.length && state.tokens[j].type === 's_close') {\n j++;\n }\n\n j--;\n\n if (i !== j) {\n token = state.tokens[j];\n state.tokens[j] = state.tokens[i];\n state.tokens[i] = token;\n }\n }\n}\n\n\n// Walk through delimiter list and replace text tokens with tags\n//\nmodule.exports.postProcess = function strikethrough(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n postProcess(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n postProcess(state, tokens_meta[curr].delimiters);\n }\n }\n};\n","// Process *this* and _that_\n//\n'use strict';\n\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nmodule.exports.tokenize = function emphasis(state, silent) {\n var i, scanned, token,\n start = state.pos,\n marker = state.src.charCodeAt(start);\n\n if (silent) { return false; }\n\n if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { return false; }\n\n scanned = state.scanDelims(state.pos, marker === 0x2A);\n\n for (i = 0; i < scanned.length; i++) {\n token = state.push('text', '', 0);\n token.content = String.fromCharCode(marker);\n\n state.delimiters.push({\n // Char code of the starting marker (number).\n //\n marker: marker,\n\n // Total length of these series of delimiters.\n //\n length: scanned.length,\n\n // An amount of characters before this one that's equivalent to\n // current one. In plain English: if this delimiter does not open\n // an emphasis, neither do previous `jump` characters.\n //\n // Used to skip sequences like \"*****\" in one step, for 1st asterisk\n // value will be 0, for 2nd it's 1 and so on.\n //\n jump: i,\n\n // A position of the token this delimiter corresponds to.\n //\n token: state.tokens.length - 1,\n\n // If this delimiter is matched as a valid opener, `end` will be\n // equal to its position, otherwise it's `-1`.\n //\n end: -1,\n\n // Boolean flags that determine if this delimiter could open or close\n // an emphasis.\n //\n open: scanned.can_open,\n close: scanned.can_close\n });\n }\n\n state.pos += scanned.length;\n\n return true;\n};\n\n\nfunction postProcess(state, delimiters) {\n var i,\n startDelim,\n endDelim,\n token,\n ch,\n isStrong,\n max = delimiters.length;\n\n for (i = max - 1; i >= 0; i--) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) {\n continue;\n }\n\n // Process only opening markers\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n // If the previous delimiter has the same marker and is adjacent to this one,\n // merge those into one strong delimiter.\n //\n // `whatever` -> `whatever`\n //\n isStrong = i > 0 &&\n delimiters[i - 1].end === startDelim.end + 1 &&\n delimiters[i - 1].token === startDelim.token - 1 &&\n delimiters[startDelim.end + 1].token === endDelim.token + 1 &&\n delimiters[i - 1].marker === startDelim.marker;\n\n ch = String.fromCharCode(startDelim.marker);\n\n token = state.tokens[startDelim.token];\n token.type = isStrong ? 'strong_open' : 'em_open';\n token.tag = isStrong ? 'strong' : 'em';\n token.nesting = 1;\n token.markup = isStrong ? ch + ch : ch;\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = isStrong ? 'strong_close' : 'em_close';\n token.tag = isStrong ? 'strong' : 'em';\n token.nesting = -1;\n token.markup = isStrong ? ch + ch : ch;\n token.content = '';\n\n if (isStrong) {\n state.tokens[delimiters[i - 1].token].content = '';\n state.tokens[delimiters[startDelim.end + 1].token].content = '';\n i--;\n }\n }\n}\n\n\n// Walk through delimiter list and replace text tokens with tags\n//\nmodule.exports.postProcess = function emphasis(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n postProcess(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n postProcess(state, tokens_meta[curr].delimiters);\n }\n }\n};\n","import CommandButton from './CommandButton';\nimport FormDropdown from './FormDropdown';\nimport InsertImageDropdown from './InsertImageDropdown';\nimport InsertLinkDropdown from './InsertLinkDropdown';\nimport ListButton from './ListButton';\nimport MarkButton from './MarkButton';\nimport NodeTypeDropdown from './NodeTypeDropdown';\nimport ProseMirrorMenu from './ProseMirrorMenu';\n\nexport const components = {\n CommandButton: CommandButton,\n FormDropdown: FormDropdown,\n InsertImageDropdown: InsertImageDropdown,\n InsertLinkDropdown: InsertLinkDropdown,\n ListButton: ListButton,\n MarkButton: MarkButton,\n NodeTypeDropdown: NodeTypeDropdown,\n ProseMirrorMenu: ProseMirrorMenu,\n};\n","import updateToggleMark from './updateToggleMark';\n\nexport const commands = {\n updateToggleMark: updateToggleMark,\n};\n","import { toggleMark, updateMark } from 'tiptap-commands';\n\nexport default function updateToggleMark(type, attrs) {\n return function (state, dispatch) {\n if (state.selection.empty) {\n return toggleMark(type, attrs)(state, dispatch);\n }\n return updateMark(type, attrs)(state, dispatch);\n };\n}\n","import { commands } from './commands';\nimport { markdown } from './markdown';\nimport ProseMirrorEditorDriver from './ProseMirrorEditorDriver';\n\nexport const proseMirror = {\n commands: commands,\n markdown: markdown,\n ProseMirrorEditorDriver: ProseMirrorEditorDriver,\n};\n","import MarkdownParserBuilder from './MarkdownParserBuilder';\nimport MarkdownSerializerBuilder from './MarkdownSerializerBuilder';\nimport SchemaBuilder from './SchemaBuilder';\n\nexport const markdown = {\n MarkdownParserBuilder: MarkdownParserBuilder,\n MarkdownSerializerBuilder: MarkdownSerializerBuilder,\n SchemaBuilder: SchemaBuilder,\n};\n","import MenuState from './MenuState';\n\nexport const states = {\n MenuState: MenuState,\n};\n","import { extend, override } from 'flarum/common/extend';\n\nimport Button from 'flarum/common/components/Button';\nimport TextEditor from 'flarum/common/components/TextEditor';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport classList from 'flarum/common/utils/classList';\n\nimport ProseMirrorEditorDriver from './proseMirror/ProseMirrorEditorDriver';\nimport ProseMirrorMenu from './components/ProseMirrorMenu';\nimport MenuState from './states/MenuState';\n\nexport default function applyEditor() {\n extend(TextEditor.prototype, 'controlItems', function (items) {\n if (!app.forum.attribute('toggleRichTextEditorButton')) return;\n\n const buttonOnClick = () => {\n app.session.user.savePreferences({ useRichTextEditor: !app.session.user.preferences().useRichTextEditor }).then(() => {\n app.composer.editor.destroy();\n this.attrs.composer.editor = this.buildEditor(this.$('.TextEditor-editorContainer')[0]);\n m.redraw.sync();\n app.composer.editor.focus();\n });\n };\n\n items.add(\n 'rich-text',\n \n \n ,\n -10\n );\n });\n\n extend(TextEditor.prototype, 'toolbarItems', function (items) {\n if (!app.session.user.preferences().useRichTextEditor) return;\n\n items.remove('markdown');\n\n items.add('prosemirror-menu', , 100);\n });\n\n extend(TextEditor.prototype, 'buildEditorParams', function (items) {\n if (!app.session.user.preferences().useRichTextEditor) return;\n\n items.menuState = this.menuState = new MenuState();\n items.classNames.push('Post-body');\n items.escape = () => app.composer.close();\n });\n\n override(TextEditor.prototype, 'buildEditor', function (original, dom) {\n if (app.session.user.preferences().useRichTextEditor) {\n return new ProseMirrorEditorDriver(dom, this.buildEditorParams());\n }\n\n return original(dom);\n });\n}\n","module.exports = flarum.core.compat['common/utils/classList'];","// Process ~subscript~\n\n'use strict';\n\n// same as UNESCAPE_MD_RE plus a space\nvar UNESCAPE_RE = /\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;\n\n\nfunction subscript(state, silent) {\n var found,\n content,\n token,\n max = state.posMax,\n start = state.pos;\n\n if (state.src.charCodeAt(start) !== 0x7E/* ~ */) { return false; }\n if (silent) { return false; } // don't run any pairs in validation mode\n if (start + 2 >= max) { return false; }\n\n state.pos = start + 1;\n\n while (state.pos < max) {\n if (state.src.charCodeAt(state.pos) === 0x7E/* ~ */) {\n found = true;\n break;\n }\n\n state.md.inline.skipToken(state);\n }\n\n if (!found || start + 1 === state.pos) {\n state.pos = start;\n return false;\n }\n\n content = state.src.slice(start + 1, state.pos);\n\n // don't allow unescaped spaces/newlines inside\n if (content.match(/(^|[^\\\\])(\\\\\\\\)*\\s/)) {\n state.pos = start;\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + 1;\n\n // Earlier we checked !silent, but this implementation does not need it\n token = state.push('sub_open', 'sub', 1);\n token.markup = '~';\n\n token = state.push('text', '', 0);\n token.content = content.replace(UNESCAPE_RE, '$1');\n\n token = state.push('sub_close', 'sub', -1);\n token.markup = '~';\n\n state.pos = state.posMax + 1;\n state.posMax = max;\n return true;\n}\n\n\nmodule.exports = function sub_plugin(md) {\n md.inline.ruler.after('emphasis', 'sub', subscript);\n};\n","// Process ^superscript^\n\n'use strict';\n\n// same as UNESCAPE_MD_RE plus a space\nvar UNESCAPE_RE = /\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;\n\nfunction superscript(state, silent) {\n var found,\n content,\n token,\n max = state.posMax,\n start = state.pos;\n\n if (state.src.charCodeAt(start) !== 0x5E/* ^ */) { return false; }\n if (silent) { return false; } // don't run any pairs in validation mode\n if (start + 2 >= max) { return false; }\n\n state.pos = start + 1;\n\n while (state.pos < max) {\n if (state.src.charCodeAt(state.pos) === 0x5E/* ^ */) {\n found = true;\n break;\n }\n\n state.md.inline.skipToken(state);\n }\n\n if (!found || start + 1 === state.pos) {\n state.pos = start;\n return false;\n }\n\n content = state.src.slice(start + 1, state.pos);\n\n // don't allow unescaped spaces/newlines inside\n if (content.match(/(^|[^\\\\])(\\\\\\\\)*\\s/)) {\n state.pos = start;\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + 1;\n\n // Earlier we checked !silent, but this implementation does not need it\n token = state.push('sup_open', 'sup', 1);\n token.markup = '^';\n\n token = state.push('text', '', 0);\n token.content = content.replace(UNESCAPE_RE, '$1');\n\n token = state.push('sup_close', 'sup', -1);\n token.markup = '^';\n\n state.pos = state.posMax + 1;\n state.posMax = max;\n return true;\n}\n\n\nmodule.exports = function sup_plugin(md) {\n md.inline.ruler.after('emphasis', 'sup', superscript);\n};\n","// Process latex\n//\n\"use strict\";\n\nfunction isValidDelim(state, pos) {\n let prevChar,\n nextChar,\n max = state.posMax,\n can_open = true,\n can_close = true;\n\n prevChar = pos > 0 ? state.src.charCodeAt(pos - 1) : -1;\n nextChar = pos + 1 <= max ? state.src.charCodeAt(pos + 1) : -1;\n\n // Check non-whitespace conditions for opening and closing, and\n // check that closing delimeter isn't followed by a number\n if (\n prevChar === 0x20 /* \" \" */ ||\n prevChar === 0x09 /* \\t */ ||\n (nextChar >= 0x30 /* \"0\" */ && nextChar <= 0x39) /* \"9\" */\n ) {\n can_close = false;\n }\n if (nextChar === 0x20 /* \" \" */ || nextChar === 0x09 /* \\t */) {\n can_open = false;\n }\n\n return {\n can_open: can_open,\n can_close: can_close,\n };\n}\n\nfunction math_inline(state, silent) {\n let start, match, token, res, pos;\n\n if (state.src[state.pos] !== \"$\") {\n return false;\n }\n\n res = isValidDelim(state, state.pos);\n if (!res.can_open) {\n if (!silent) {\n state.pending += \"$\";\n }\n state.pos += 1;\n return true;\n }\n\n // First check for and bypass all properly escaped delimieters\n // This loop will assume that the first leading backtick can not\n // be the first character in state.src, which is known since\n // we have found an opening delimieter already.\n start = state.pos + 1;\n match = start;\n while ((match = state.src.indexOf(\"$\", match)) !== -1) {\n // Found potential $, look for escapes, pos will point to\n // first non escape when complete\n pos = match - 1;\n while (state.src[pos] === \"\\\\\") {\n pos -= 1;\n }\n\n // Even number of escapes, potential closing delimiter found\n if ((match - pos) % 2 == 1) {\n break;\n }\n match += 1;\n }\n\n // No closing delimter found. Consume $ and continue.\n if (match === -1) {\n if (!silent) {\n state.pending += \"$\";\n }\n state.pos = start;\n return true;\n }\n\n // Check if we have empty content, ie: $$. Do not parse.\n if (match - start === 0) {\n if (!silent) {\n state.pending += \"$$\";\n }\n state.pos = start + 1;\n return true;\n }\n\n // Check for valid closing delimiter\n res = isValidDelim(state, match);\n if (!res.can_close) {\n if (!silent) {\n state.pending += \"$\";\n }\n state.pos = start;\n return true;\n }\n\n if (!silent) {\n token = state.push(\"math_inline\", \"math\", 0);\n token.markup = \"$\";\n token.content = state.src.slice(start, match);\n }\n\n state.pos = match + 1;\n return true;\n}\n\nfunction math_block(state, start, end, silent) {\n let firstLine,\n lastLine,\n next,\n lastPos,\n found = false,\n token,\n pos = state.bMarks[start] + state.tShift[start],\n max = state.eMarks[start];\n\n if (pos + 2 > max) {\n return false;\n }\n if (state.src.slice(pos, pos + 2) !== \"$$\") {\n return false;\n }\n\n pos += 2;\n firstLine = state.src.slice(pos, max);\n\n if (silent) {\n return true;\n }\n if (firstLine.trim().slice(-2) === \"$$\") {\n // Single line expression\n firstLine = firstLine.trim().slice(0, -2);\n found = true;\n }\n\n for (next = start; !found;) {\n next++;\n\n if (next >= end) {\n break;\n }\n\n pos = state.bMarks[next] + state.tShift[next];\n max = state.eMarks[next];\n\n if (pos < max && state.tShift[next] < state.blkIndent) {\n // non-empty line with negative indent should stop the list:\n break;\n }\n\n if (state.src.slice(pos, max).trim().slice(-2) === \"$$\") {\n lastPos = state.src.slice(0, max).lastIndexOf(\"$$\");\n lastLine = state.src.slice(pos, lastPos);\n found = true;\n }\n }\n\n state.line = next + 1;\n\n token = state.push(\"math_block\", \"math\", 0);\n token.block = true;\n token.content =\n (firstLine && firstLine.trim() ? firstLine + \"\\n\" : \"\") +\n state.getLines(start + 1, next, state.tShift[start], true) +\n (lastLine && lastLine.trim() ? lastLine : \"\");\n token.map = [start, state.line];\n token.markup = \"$$\";\n return true;\n}\n\nmodule.exports = (md, options) => {\n options = options || {};\n options.server = options.server || \"https://math.now.sh\";\n options.style = options.style || \"\";\n const purifiedURL = (latex) => {\n return encodeURIComponent(latex).replace(\"(\", \"%28\").replace(\")\", \"%29\");\n };\n\n let Inline = (latex) => {\n try {\n return ``;\n } catch (error) {\n console.error(error);\n return latex;\n }\n };\n\n let Block = (latex) => {\n try {\n return `

              `;\n } catch (error) {\n console.error(error);\n return latex;\n }\n };\n\n md.inline.ruler.after(\"escape\", \"math_inline\", math_inline);\n md.block.ruler.after(\"blockquote\", \"math_block\", math_block, {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n md.renderer.rules.math_inline = (tokens, idx) => {\n return Inline(tokens[idx].content);\n };\n md.renderer.rules.math_block = (tokens, idx) => {\n return Block(tokens[idx].content);\n };\n};\n","module.exports = flarum.core.compat['common/components/Modal'];","// Main parser class\n\n'use strict';\n\n\nvar utils = require('./common/utils');\nvar helpers = require('./helpers');\nvar Renderer = require('./renderer');\nvar ParserCore = require('./parser_core');\nvar ParserBlock = require('./parser_block');\nvar ParserInline = require('./parser_inline');\nvar LinkifyIt = require('linkify-it');\nvar mdurl = require('mdurl');\nvar punycode = require('punycode');\n\n\nvar config = {\n 'default': require('./presets/default'),\n zero: require('./presets/zero'),\n commonmark: require('./presets/commonmark')\n};\n\n////////////////////////////////////////////////////////////////////////////////\n//\n// This validator can prohibit more than really needed to prevent XSS. It's a\n// tradeoff to keep code simple and to be secure by default.\n//\n// If you need different setup - override validator method as you wish. Or\n// replace it with dummy function and use external sanitizer.\n//\n\nvar BAD_PROTO_RE = /^(vbscript|javascript|file|data):/;\nvar GOOD_DATA_RE = /^data:image\\/(gif|png|jpeg|webp);/;\n\nfunction validateLink(url) {\n // url should be normalized at this point, and existing entities are decoded\n var str = url.trim().toLowerCase();\n\n return BAD_PROTO_RE.test(str) ? (GOOD_DATA_RE.test(str) ? true : false) : true;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nvar RECODE_HOSTNAME_FOR = [ 'http:', 'https:', 'mailto:' ];\n\nfunction normalizeLink(url) {\n var parsed = mdurl.parse(url, true);\n\n if (parsed.hostname) {\n // Encode hostnames in urls like:\n // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n //\n // We don't encode unknown schemas, because it's likely that we encode\n // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n //\n if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n try {\n parsed.hostname = punycode.toASCII(parsed.hostname);\n } catch (er) { /**/ }\n }\n }\n\n return mdurl.encode(mdurl.format(parsed));\n}\n\nfunction normalizeLinkText(url) {\n var parsed = mdurl.parse(url, true);\n\n if (parsed.hostname) {\n // Encode hostnames in urls like:\n // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n //\n // We don't encode unknown schemas, because it's likely that we encode\n // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n //\n if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n try {\n parsed.hostname = punycode.toUnicode(parsed.hostname);\n } catch (er) { /**/ }\n }\n }\n\n return mdurl.decode(mdurl.format(parsed));\n}\n\n\n/**\n * class MarkdownIt\n *\n * Main parser/renderer class.\n *\n * ##### Usage\n *\n * ```javascript\n * // node.js, \"classic\" way:\n * var MarkdownIt = require('markdown-it'),\n * md = new MarkdownIt();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // node.js, the same, but with sugar:\n * var md = require('markdown-it')();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // browser without AMD, added to \"window\" on script load\n * // Note, there are no dash.\n * var md = window.markdownit();\n * var result = md.render('# markdown-it rulezz!');\n * ```\n *\n * Single line rendering, without paragraph wrap:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * var result = md.renderInline('__markdown-it__ rulezz!');\n * ```\n **/\n\n/**\n * new MarkdownIt([presetName, options])\n * - presetName (String): optional, `commonmark` / `zero`\n * - options (Object)\n *\n * Creates parser instanse with given config. Can be called without `new`.\n *\n * ##### presetName\n *\n * MarkdownIt provides named presets as a convenience to quickly\n * enable/disable active syntax rules and options for common use cases.\n *\n * - [\"commonmark\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.js) -\n * configures parser to strict [CommonMark](http://commonmark.org/) mode.\n * - [default](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/default.js) -\n * similar to GFM, used when no preset name given. Enables all available rules,\n * but still without html, typographer & autolinker.\n * - [\"zero\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.js) -\n * all rules disabled. Useful to quickly setup your config via `.enable()`.\n * For example, when you need only `bold` and `italic` markup and nothing else.\n *\n * ##### options:\n *\n * - __html__ - `false`. Set `true` to enable HTML tags in source. Be careful!\n * That's not safe! You may need external sanitizer to protect output from XSS.\n * It's better to extend features via plugins, instead of enabling HTML.\n * - __xhtmlOut__ - `false`. Set `true` to add '/' when closing single tags\n * (`
              `). This is needed only for full CommonMark compatibility. In real\n * world you will need HTML output.\n * - __breaks__ - `false`. Set `true` to convert `\\n` in paragraphs into `
              `.\n * - __langPrefix__ - `language-`. CSS language class prefix for fenced blocks.\n * Can be useful for external highlighters.\n * - __linkify__ - `false`. Set `true` to autoconvert URL-like text to links.\n * - __typographer__ - `false`. Set `true` to enable [some language-neutral\n * replacement](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.js) +\n * quotes beautification (smartquotes).\n * - __quotes__ - `“”‘’`, String or Array. Double + single quotes replacement\n * pairs, when typographer enabled and smartquotes on. For example, you can\n * use `'«»„“'` for Russian, `'„“‚‘'` for German, and\n * `['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›']` for French (including nbsp).\n * - __highlight__ - `null`. Highlighter function for fenced code blocks.\n * Highlighter `function (str, lang)` should return escaped HTML. It can also\n * return empty string if the source was not changed and should be escaped\n * externaly. If result starts with `):\n *\n * ```javascript\n * var hljs = require('highlight.js') // https://highlightjs.org/\n *\n * // Actual default values\n * var md = require('markdown-it')({\n * highlight: function (str, lang) {\n * if (lang && hljs.getLanguage(lang)) {\n * try {\n * return '
              ' +\n *                hljs.highlight(lang, str, true).value +\n *                '
              ';\n * } catch (__) {}\n * }\n *\n * return '
              ' + md.utils.escapeHtml(str) + '
              ';\n * }\n * });\n * ```\n *\n **/\nfunction MarkdownIt(presetName, options) {\n if (!(this instanceof MarkdownIt)) {\n return new MarkdownIt(presetName, options);\n }\n\n if (!options) {\n if (!utils.isString(presetName)) {\n options = presetName || {};\n presetName = 'default';\n }\n }\n\n /**\n * MarkdownIt#inline -> ParserInline\n *\n * Instance of [[ParserInline]]. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.inline = new ParserInline();\n\n /**\n * MarkdownIt#block -> ParserBlock\n *\n * Instance of [[ParserBlock]]. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.block = new ParserBlock();\n\n /**\n * MarkdownIt#core -> Core\n *\n * Instance of [[Core]] chain executor. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.core = new ParserCore();\n\n /**\n * MarkdownIt#renderer -> Renderer\n *\n * Instance of [[Renderer]]. Use it to modify output look. Or to add rendering\n * rules for new token types, generated by plugins.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * function myToken(tokens, idx, options, env, self) {\n * //...\n * return result;\n * };\n *\n * md.renderer.rules['my_token'] = myToken\n * ```\n *\n * See [[Renderer]] docs and [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js).\n **/\n this.renderer = new Renderer();\n\n /**\n * MarkdownIt#linkify -> LinkifyIt\n *\n * [linkify-it](https://github.com/markdown-it/linkify-it) instance.\n * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/linkify.js)\n * rule.\n **/\n this.linkify = new LinkifyIt();\n\n /**\n * MarkdownIt#validateLink(url) -> Boolean\n *\n * Link validation function. CommonMark allows too much in links. By default\n * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas\n * except some embedded image types.\n *\n * You can change this behaviour:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * // enable everything\n * md.validateLink = function () { return true; }\n * ```\n **/\n this.validateLink = validateLink;\n\n /**\n * MarkdownIt#normalizeLink(url) -> String\n *\n * Function used to encode link url to a machine-readable format,\n * which includes url-encoding, punycode, etc.\n **/\n this.normalizeLink = normalizeLink;\n\n /**\n * MarkdownIt#normalizeLinkText(url) -> String\n *\n * Function used to decode link url to a human-readable format`\n **/\n this.normalizeLinkText = normalizeLinkText;\n\n\n // Expose utils & helpers for easy acces from plugins\n\n /**\n * MarkdownIt#utils -> utils\n *\n * Assorted utility functions, useful to write plugins. See details\n * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.js).\n **/\n this.utils = utils;\n\n /**\n * MarkdownIt#helpers -> helpers\n *\n * Link components parser functions, useful to write plugins. See details\n * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers).\n **/\n this.helpers = utils.assign({}, helpers);\n\n\n this.options = {};\n this.configure(presetName);\n\n if (options) { this.set(options); }\n}\n\n\n/** chainable\n * MarkdownIt.set(options)\n *\n * Set parser options (in the same format as in constructor). Probably, you\n * will never need it, but you can change options after constructor call.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n * .set({ html: true, breaks: true })\n * .set({ typographer, true });\n * ```\n *\n * __Note:__ To achieve the best possible performance, don't modify a\n * `markdown-it` instance options on the fly. If you need multiple configurations\n * it's best to create multiple instances and initialize each with separate\n * config.\n **/\nMarkdownIt.prototype.set = function (options) {\n utils.assign(this.options, options);\n return this;\n};\n\n\n/** chainable, internal\n * MarkdownIt.configure(presets)\n *\n * Batch load of all options and compenent settings. This is internal method,\n * and you probably will not need it. But if you with - see available presets\n * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets)\n *\n * We strongly recommend to use presets instead of direct config loads. That\n * will give better compatibility with next versions.\n **/\nMarkdownIt.prototype.configure = function (presets) {\n var self = this, presetName;\n\n if (utils.isString(presets)) {\n presetName = presets;\n presets = config[presetName];\n if (!presets) { throw new Error('Wrong `markdown-it` preset \"' + presetName + '\", check name'); }\n }\n\n if (!presets) { throw new Error('Wrong `markdown-it` preset, can\\'t be empty'); }\n\n if (presets.options) { self.set(presets.options); }\n\n if (presets.components) {\n Object.keys(presets.components).forEach(function (name) {\n if (presets.components[name].rules) {\n self[name].ruler.enableOnly(presets.components[name].rules);\n }\n if (presets.components[name].rules2) {\n self[name].ruler2.enableOnly(presets.components[name].rules2);\n }\n });\n }\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.enable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to enable\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable list or rules. It will automatically find appropriate components,\n * containing rules with given names. If rule not found, and `ignoreInvalid`\n * not set - throws exception.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n * .enable(['sub', 'sup'])\n * .disable('smartquotes');\n * ```\n **/\nMarkdownIt.prototype.enable = function (list, ignoreInvalid) {\n var result = [];\n\n if (!Array.isArray(list)) { list = [ list ]; }\n\n [ 'core', 'block', 'inline' ].forEach(function (chain) {\n result = result.concat(this[chain].ruler.enable(list, true));\n }, this);\n\n result = result.concat(this.inline.ruler2.enable(list, true));\n\n var missed = list.filter(function (name) { return result.indexOf(name) < 0; });\n\n if (missed.length && !ignoreInvalid) {\n throw new Error('MarkdownIt. Failed to enable unknown rule(s): ' + missed);\n }\n\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.disable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * The same as [[MarkdownIt.enable]], but turn specified rules off.\n **/\nMarkdownIt.prototype.disable = function (list, ignoreInvalid) {\n var result = [];\n\n if (!Array.isArray(list)) { list = [ list ]; }\n\n [ 'core', 'block', 'inline' ].forEach(function (chain) {\n result = result.concat(this[chain].ruler.disable(list, true));\n }, this);\n\n result = result.concat(this.inline.ruler2.disable(list, true));\n\n var missed = list.filter(function (name) { return result.indexOf(name) < 0; });\n\n if (missed.length && !ignoreInvalid) {\n throw new Error('MarkdownIt. Failed to disable unknown rule(s): ' + missed);\n }\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.use(plugin, params)\n *\n * Load specified plugin with given params into current parser instance.\n * It's just a sugar to call `plugin(md, params)` with curring.\n *\n * ##### Example\n *\n * ```javascript\n * var iterator = require('markdown-it-for-inline');\n * var md = require('markdown-it')()\n * .use(iterator, 'foo_replace', 'text', function (tokens, idx) {\n * tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar');\n * });\n * ```\n **/\nMarkdownIt.prototype.use = function (plugin /*, params, ... */) {\n var args = [ this ].concat(Array.prototype.slice.call(arguments, 1));\n plugin.apply(plugin, args);\n return this;\n};\n\n\n/** internal\n * MarkdownIt.parse(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Parse input string and returns list of block tokens (special token type\n * \"inline\" will contain list of inline tokens). You should not call this\n * method directly, until you write custom renderer (for example, to produce\n * AST).\n *\n * `env` is used to pass data between \"distributed\" rules and return additional\n * metadata like reference info, needed for the renderer. It also can be used to\n * inject data in specific cases. Usually, you will be ok to pass `{}`,\n * and then pass updated object to renderer.\n **/\nMarkdownIt.prototype.parse = function (src, env) {\n if (typeof src !== 'string') {\n throw new Error('Input data should be a String');\n }\n\n var state = new this.core.State(src, this, env);\n\n this.core.process(state);\n\n return state.tokens;\n};\n\n\n/**\n * MarkdownIt.render(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Render markdown string into html. It does all magic for you :).\n *\n * `env` can be used to inject additional metadata (`{}` by default).\n * But you will not need it with high probability. See also comment\n * in [[MarkdownIt.parse]].\n **/\nMarkdownIt.prototype.render = function (src, env) {\n env = env || {};\n\n return this.renderer.render(this.parse(src, env), this.options, env);\n};\n\n\n/** internal\n * MarkdownIt.parseInline(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * The same as [[MarkdownIt.parse]] but skip all block rules. It returns the\n * block tokens list with the single `inline` element, containing parsed inline\n * tokens in `children` property. Also updates `env` object.\n **/\nMarkdownIt.prototype.parseInline = function (src, env) {\n var state = new this.core.State(src, this, env);\n\n state.inlineMode = true;\n this.core.process(state);\n\n return state.tokens;\n};\n\n\n/**\n * MarkdownIt.renderInline(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Similar to [[MarkdownIt.render]] but for single paragraph content. Result\n * will NOT be wrapped into `

              ` tags.\n **/\nMarkdownIt.prototype.renderInline = function (src, env) {\n env = env || {};\n\n return this.renderer.render(this.parseInline(src, env), this.options, env);\n};\n\n\nmodule.exports = MarkdownIt;\n","\n'use strict';\n\n\nvar encodeCache = {};\n\n\n// Create a lookup array where anything but characters in `chars` string\n// and alphanumeric chars is percent-encoded.\n//\nfunction getEncodeCache(exclude) {\n var i, ch, cache = encodeCache[exclude];\n if (cache) { return cache; }\n\n cache = encodeCache[exclude] = [];\n\n for (i = 0; i < 128; i++) {\n ch = String.fromCharCode(i);\n\n if (/^[0-9a-z]$/i.test(ch)) {\n // always allow unencoded alphanumeric characters\n cache.push(ch);\n } else {\n cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2));\n }\n }\n\n for (i = 0; i < exclude.length; i++) {\n cache[exclude.charCodeAt(i)] = exclude[i];\n }\n\n return cache;\n}\n\n\n// Encode unsafe characters with percent-encoding, skipping already\n// encoded sequences.\n//\n// - string - string to encode\n// - exclude - list of characters to ignore (in addition to a-zA-Z0-9)\n// - keepEscaped - don't encode '%' in a correct escape sequence (default: true)\n//\nfunction encode(string, exclude, keepEscaped) {\n var i, l, code, nextCode, cache,\n result = '';\n\n if (typeof exclude !== 'string') {\n // encode(string, keepEscaped)\n keepEscaped = exclude;\n exclude = encode.defaultChars;\n }\n\n if (typeof keepEscaped === 'undefined') {\n keepEscaped = true;\n }\n\n cache = getEncodeCache(exclude);\n\n for (i = 0, l = string.length; i < l; i++) {\n code = string.charCodeAt(i);\n\n if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {\n if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {\n result += string.slice(i, i + 3);\n i += 2;\n continue;\n }\n }\n\n if (code < 128) {\n result += cache[code];\n continue;\n }\n\n if (code >= 0xD800 && code <= 0xDFFF) {\n if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {\n nextCode = string.charCodeAt(i + 1);\n if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {\n result += encodeURIComponent(string[i] + string[i + 1]);\n i++;\n continue;\n }\n }\n result += '%EF%BF%BD';\n continue;\n }\n\n result += encodeURIComponent(string[i]);\n }\n\n return result;\n}\n\nencode.defaultChars = \";/?:@&=+$,-_.!~*'()#\";\nencode.componentChars = \"-_.!~*'()\";\n\n\nmodule.exports = encode;\n","\n'use strict';\n\n\n/* eslint-disable no-bitwise */\n\nvar decodeCache = {};\n\nfunction getDecodeCache(exclude) {\n var i, ch, cache = decodeCache[exclude];\n if (cache) { return cache; }\n\n cache = decodeCache[exclude] = [];\n\n for (i = 0; i < 128; i++) {\n ch = String.fromCharCode(i);\n cache.push(ch);\n }\n\n for (i = 0; i < exclude.length; i++) {\n ch = exclude.charCodeAt(i);\n cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2);\n }\n\n return cache;\n}\n\n\n// Decode percent-encoded string.\n//\nfunction decode(string, exclude) {\n var cache;\n\n if (typeof exclude !== 'string') {\n exclude = decode.defaultChars;\n }\n\n cache = getDecodeCache(exclude);\n\n return string.replace(/(%[a-f0-9]{2})+/gi, function(seq) {\n var i, l, b1, b2, b3, b4, chr,\n result = '';\n\n for (i = 0, l = seq.length; i < l; i += 3) {\n b1 = parseInt(seq.slice(i + 1, i + 3), 16);\n\n if (b1 < 0x80) {\n result += cache[b1];\n continue;\n }\n\n if ((b1 & 0xE0) === 0xC0 && (i + 3 < l)) {\n // 110xxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n\n if ((b2 & 0xC0) === 0x80) {\n chr = ((b1 << 6) & 0x7C0) | (b2 & 0x3F);\n\n if (chr < 0x80) {\n result += '\\ufffd\\ufffd';\n } else {\n result += String.fromCharCode(chr);\n }\n\n i += 3;\n continue;\n }\n }\n\n if ((b1 & 0xF0) === 0xE0 && (i + 6 < l)) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n\n if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n chr = ((b1 << 12) & 0xF000) | ((b2 << 6) & 0xFC0) | (b3 & 0x3F);\n\n if (chr < 0x800 || (chr >= 0xD800 && chr <= 0xDFFF)) {\n result += '\\ufffd\\ufffd\\ufffd';\n } else {\n result += String.fromCharCode(chr);\n }\n\n i += 6;\n continue;\n }\n }\n\n if ((b1 & 0xF8) === 0xF0 && (i + 9 < l)) {\n // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n b4 = parseInt(seq.slice(i + 10, i + 12), 16);\n\n if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) {\n chr = ((b1 << 18) & 0x1C0000) | ((b2 << 12) & 0x3F000) | ((b3 << 6) & 0xFC0) | (b4 & 0x3F);\n\n if (chr < 0x10000 || chr > 0x10FFFF) {\n result += '\\ufffd\\ufffd\\ufffd\\ufffd';\n } else {\n chr -= 0x10000;\n result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF));\n }\n\n i += 9;\n continue;\n }\n }\n\n result += '\\ufffd';\n }\n\n return result;\n });\n}\n\n\ndecode.defaultChars = ';/?:@&=+$,#';\ndecode.componentChars = '';\n\n\nmodule.exports = decode;\n","\n'use strict';\n\n\nmodule.exports = function format(url) {\n var result = '';\n\n result += url.protocol || '';\n result += url.slashes ? '//' : '';\n result += url.auth ? url.auth + '@' : '';\n\n if (url.hostname && url.hostname.indexOf(':') !== -1) {\n // ipv6 address\n result += '[' + url.hostname + ']';\n } else {\n result += url.hostname || '';\n }\n\n result += url.port ? ':' + url.port : '';\n result += url.pathname || '';\n result += url.search || '';\n result += url.hash || '';\n\n return result;\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n//\n// Changes from joyent/node:\n//\n// 1. No leading slash in paths,\n// e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/`\n//\n// 2. Backslashes are not replaced with slashes,\n// so `http:\\\\example.org\\` is treated like a relative path\n//\n// 3. Trailing colon is treated like a part of the path,\n// i.e. in `http://example.org:foo` pathname is `:foo`\n//\n// 4. Nothing is URL-encoded in the resulting object,\n// (in joyent/node some chars in auth and paths are encoded)\n//\n// 5. `url.parse()` does not have `parseQueryString` argument\n//\n// 6. Removed extraneous result properties: `host`, `path`, `query`, etc.,\n// which can be constructed using other parts of the url.\n//\n\n\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.pathname = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = [ '<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t' ],\n\n // RFC 2396: characters not allowed for various reasons.\n unwise = [ '{', '}', '|', '\\\\', '^', '`' ].concat(delims),\n\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = [ '\\'' ].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = [ '%', '/', '?', ';', '#' ].concat(autoEscape),\n hostEndingChars = [ '/', '?', '#' ],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n /* eslint-disable no-script-url */\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n };\n /* eslint-enable no-script-url */\n\nfunction urlParse(url, slashesDenoteHost) {\n if (url && url instanceof Url) { return url; }\n\n var u = new Url();\n u.parse(url, slashesDenoteHost);\n return u;\n}\n\nUrl.prototype.parse = function(url, slashesDenoteHost) {\n var i, l, lowerProto, hec, slashes,\n rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n }\n return this;\n }\n }\n\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n lowerProto = proto.toLowerCase();\n this.protocol = proto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n\n if (!hostlessProtocol[proto] &&\n (slashes || (proto && !slashedProtocol[proto]))) {\n\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (i = 0; i < hostEndingChars.length; i++) {\n hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n hostEnd = hec;\n }\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = auth;\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (i = 0; i < nonHostChars.length; i++) {\n hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n hostEnd = hec;\n }\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1) {\n hostEnd = rest.length;\n }\n\n if (rest[hostEnd - 1] === ':') { hostEnd--; }\n var host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost(host);\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' &&\n this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) { continue; }\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n }\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n }\n }\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n rest = rest.slice(0, qm);\n }\n if (rest) { this.pathname = rest; }\n if (slashedProtocol[lowerProto] &&\n this.hostname && !this.pathname) {\n this.pathname = '';\n }\n\n return this;\n};\n\nUrl.prototype.parseHost = function(host) {\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) { this.hostname = host; }\n};\n\nmodule.exports = urlParse;\n","'use strict';\n\nexports.Any = require('./properties/Any/regex');\nexports.Cc = require('./categories/Cc/regex');\nexports.Cf = require('./categories/Cf/regex');\nexports.P = require('./categories/P/regex');\nexports.Z = require('./categories/Z/regex');\n","module.exports=/[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/","// Just a shortcut for bulk export\n'use strict';\n\n\nexports.parseLinkLabel = require('./parse_link_label');\nexports.parseLinkDestination = require('./parse_link_destination');\nexports.parseLinkTitle = require('./parse_link_title');\n","// Parse link label\n//\n// this function assumes that first character (\"[\") already matches;\n// returns the end of the label\n//\n'use strict';\n\nmodule.exports = function parseLinkLabel(state, start, disableNested) {\n var level, found, marker, prevPos,\n labelEnd = -1,\n max = state.posMax,\n oldPos = state.pos;\n\n state.pos = start + 1;\n level = 1;\n\n while (state.pos < max) {\n marker = state.src.charCodeAt(state.pos);\n if (marker === 0x5D /* ] */) {\n level--;\n if (level === 0) {\n found = true;\n break;\n }\n }\n\n prevPos = state.pos;\n state.md.inline.skipToken(state);\n if (marker === 0x5B /* [ */) {\n if (prevPos === state.pos - 1) {\n // increase level if we find text `[`, which is not a part of any token\n level++;\n } else if (disableNested) {\n state.pos = oldPos;\n return -1;\n }\n }\n }\n\n if (found) {\n labelEnd = state.pos;\n }\n\n // restore old state\n state.pos = oldPos;\n\n return labelEnd;\n};\n","// Parse link destination\n//\n'use strict';\n\n\nvar unescapeAll = require('../common/utils').unescapeAll;\n\n\nmodule.exports = function parseLinkDestination(str, pos, max) {\n var code, level,\n lines = 0,\n start = pos,\n result = {\n ok: false,\n pos: 0,\n lines: 0,\n str: ''\n };\n\n if (str.charCodeAt(pos) === 0x3C /* < */) {\n pos++;\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === 0x0A /* \\n */) { return result; }\n if (code === 0x3E /* > */) {\n result.pos = pos + 1;\n result.str = unescapeAll(str.slice(start + 1, pos));\n result.ok = true;\n return result;\n }\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n pos++;\n }\n\n // no closing '>'\n return result;\n }\n\n // this should be ... } else { ... branch\n\n level = 0;\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x20) { break; }\n\n // ascii control characters\n if (code < 0x20 || code === 0x7F) { break; }\n\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n if (code === 0x28 /* ( */) {\n level++;\n }\n\n if (code === 0x29 /* ) */) {\n if (level === 0) { break; }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos) { return result; }\n if (level !== 0) { return result; }\n\n result.str = unescapeAll(str.slice(start, pos));\n result.lines = lines;\n result.pos = pos;\n result.ok = true;\n return result;\n};\n","// Parse link title\n//\n'use strict';\n\n\nvar unescapeAll = require('../common/utils').unescapeAll;\n\n\nmodule.exports = function parseLinkTitle(str, pos, max) {\n var code,\n marker,\n lines = 0,\n start = pos,\n result = {\n ok: false,\n pos: 0,\n lines: 0,\n str: ''\n };\n\n if (pos >= max) { return result; }\n\n marker = str.charCodeAt(pos);\n\n if (marker !== 0x22 /* \" */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return result; }\n\n pos++;\n\n // if opening marker is \"(\", switch it to closing marker \")\"\n if (marker === 0x28) { marker = 0x29; }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === marker) {\n result.pos = pos + 1;\n result.lines = lines;\n result.str = unescapeAll(str.slice(start + 1, pos));\n result.ok = true;\n return result;\n } else if (code === 0x0A) {\n lines++;\n } else if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos++;\n if (str.charCodeAt(pos) === 0x0A) {\n lines++;\n }\n }\n\n pos++;\n }\n\n return result;\n};\n","/**\n * class Renderer\n *\n * Generates HTML from parsed token stream. Each instance has independent\n * copy of rules. Those can be rewritten with ease. Also, you can add new\n * rules if you create plugin and adds new token types.\n **/\n'use strict';\n\n\nvar assign = require('./common/utils').assign;\nvar unescapeAll = require('./common/utils').unescapeAll;\nvar escapeHtml = require('./common/utils').escapeHtml;\n\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar default_rules = {};\n\n\ndefault_rules.code_inline = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n return '' +\n escapeHtml(tokens[idx].content) +\n '';\n};\n\n\ndefault_rules.code_block = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n return '' +\n escapeHtml(tokens[idx].content) +\n '\\n';\n};\n\n\ndefault_rules.fence = function (tokens, idx, options, env, slf) {\n var token = tokens[idx],\n info = token.info ? unescapeAll(token.info).trim() : '',\n langName = '',\n highlighted, i, tmpAttrs, tmpToken;\n\n if (info) {\n langName = info.split(/\\s+/g)[0];\n }\n\n if (options.highlight) {\n highlighted = options.highlight(token.content, langName) || escapeHtml(token.content);\n } else {\n highlighted = escapeHtml(token.content);\n }\n\n if (highlighted.indexOf(''\n + highlighted\n + '\\n';\n }\n\n\n return '

              '\n        + highlighted\n        + '
              \\n';\n};\n\n\ndefault_rules.image = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n // \"alt\" attr MUST be set, even if empty. Because it's mandatory and\n // should be placed on proper position for tests.\n //\n // Replace content with actual value\n\n token.attrs[token.attrIndex('alt')][1] =\n slf.renderInlineAsText(token.children, options, env);\n\n return slf.renderToken(tokens, idx, options);\n};\n\n\ndefault_rules.hardbreak = function (tokens, idx, options /*, env */) {\n return options.xhtmlOut ? '
              \\n' : '
              \\n';\n};\ndefault_rules.softbreak = function (tokens, idx, options /*, env */) {\n return options.breaks ? (options.xhtmlOut ? '
              \\n' : '
              \\n') : '\\n';\n};\n\n\ndefault_rules.text = function (tokens, idx /*, options, env */) {\n return escapeHtml(tokens[idx].content);\n};\n\n\ndefault_rules.html_block = function (tokens, idx /*, options, env */) {\n return tokens[idx].content;\n};\ndefault_rules.html_inline = function (tokens, idx /*, options, env */) {\n return tokens[idx].content;\n};\n\n\n/**\n * new Renderer()\n *\n * Creates new [[Renderer]] instance and fill [[Renderer#rules]] with defaults.\n **/\nfunction Renderer() {\n\n /**\n * Renderer#rules -> Object\n *\n * Contains render rules for tokens. Can be updated and extended.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.renderer.rules.strong_open = function () { return ''; };\n * md.renderer.rules.strong_close = function () { return ''; };\n *\n * var result = md.renderInline(...);\n * ```\n *\n * Each rule is called as independent static function with fixed signature:\n *\n * ```javascript\n * function my_token_render(tokens, idx, options, env, renderer) {\n * // ...\n * return renderedHTML;\n * }\n * ```\n *\n * See [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js)\n * for more details and examples.\n **/\n this.rules = assign({}, default_rules);\n}\n\n\n/**\n * Renderer.renderAttrs(token) -> String\n *\n * Render token attributes to string.\n **/\nRenderer.prototype.renderAttrs = function renderAttrs(token) {\n var i, l, result;\n\n if (!token.attrs) { return ''; }\n\n result = '';\n\n for (i = 0, l = token.attrs.length; i < l; i++) {\n result += ' ' + escapeHtml(token.attrs[i][0]) + '=\"' + escapeHtml(token.attrs[i][1]) + '\"';\n }\n\n return result;\n};\n\n\n/**\n * Renderer.renderToken(tokens, idx, options) -> String\n * - tokens (Array): list of tokens\n * - idx (Numbed): token index to render\n * - options (Object): params of parser instance\n *\n * Default token renderer. Can be overriden by custom function\n * in [[Renderer#rules]].\n **/\nRenderer.prototype.renderToken = function renderToken(tokens, idx, options) {\n var nextToken,\n result = '',\n needLf = false,\n token = tokens[idx];\n\n // Tight list paragraphs\n if (token.hidden) {\n return '';\n }\n\n // Insert a newline between hidden paragraph and subsequent opening\n // block-level tag.\n //\n // For example, here we should insert a newline before blockquote:\n // - a\n // >\n //\n if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) {\n result += '\\n';\n }\n\n // Add token name, e.g. `
            • `.\n //\n needLf = false;\n }\n }\n }\n }\n\n result += needLf ? '>\\n' : '>';\n\n return result;\n};\n\n\n/**\n * Renderer.renderInline(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to renter\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * The same as [[Renderer.render]], but for single token of `inline` type.\n **/\nRenderer.prototype.renderInline = function (tokens, options, env) {\n var type,\n result = '',\n rules = this.rules;\n\n for (var i = 0, len = tokens.length; i < len; i++) {\n type = tokens[i].type;\n\n if (typeof rules[type] !== 'undefined') {\n result += rules[type](tokens, i, options, env, this);\n } else {\n result += this.renderToken(tokens, i, options);\n }\n }\n\n return result;\n};\n\n\n/** internal\n * Renderer.renderInlineAsText(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to renter\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Special kludge for image `alt` attributes to conform CommonMark spec.\n * Don't try to use it! Spec requires to show `alt` content with stripped markup,\n * instead of simple escaping.\n **/\nRenderer.prototype.renderInlineAsText = function (tokens, options, env) {\n var result = '';\n\n for (var i = 0, len = tokens.length; i < len; i++) {\n if (tokens[i].type === 'text') {\n result += tokens[i].content;\n } else if (tokens[i].type === 'image') {\n result += this.renderInlineAsText(tokens[i].children, options, env);\n }\n }\n\n return result;\n};\n\n\n/**\n * Renderer.render(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to renter\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Takes token stream and generates HTML. Probably, you will never need to call\n * this method directly.\n **/\nRenderer.prototype.render = function (tokens, options, env) {\n var i, len, type,\n result = '',\n rules = this.rules;\n\n for (i = 0, len = tokens.length; i < len; i++) {\n type = tokens[i].type;\n\n if (type === 'inline') {\n result += this.renderInline(tokens[i].children, options, env);\n } else if (typeof rules[type] !== 'undefined') {\n result += rules[tokens[i].type](tokens, i, options, env, this);\n } else {\n result += this.renderToken(tokens, i, options, env);\n }\n }\n\n return result;\n};\n\nmodule.exports = Renderer;\n","/** internal\n * class Core\n *\n * Top-level rules executor. Glues block/inline parsers and does intermediate\n * transformations.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\nvar _rules = [\n [ 'normalize', require('./rules_core/normalize') ],\n [ 'block', require('./rules_core/block') ],\n [ 'inline', require('./rules_core/inline') ],\n [ 'linkify', require('./rules_core/linkify') ],\n [ 'replacements', require('./rules_core/replacements') ],\n [ 'smartquotes', require('./rules_core/smartquotes') ]\n];\n\n\n/**\n * new Core()\n **/\nfunction Core() {\n /**\n * Core#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of core rules.\n **/\n this.ruler = new Ruler();\n\n for (var i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1]);\n }\n}\n\n\n/**\n * Core.process(state)\n *\n * Executes core chain rules.\n **/\nCore.prototype.process = function (state) {\n var i, l, rules;\n\n rules = this.ruler.getRules('');\n\n for (i = 0, l = rules.length; i < l; i++) {\n rules[i](state);\n }\n};\n\nCore.prototype.State = require('./rules_core/state_core');\n\n\nmodule.exports = Core;\n","// Normalize input string\n\n'use strict';\n\n\n// https://spec.commonmark.org/0.29/#line-ending\nvar NEWLINES_RE = /\\r\\n?|\\n/g;\nvar NULL_RE = /\\0/g;\n\n\nmodule.exports = function normalize(state) {\n var str;\n\n // Normalize newlines\n str = state.src.replace(NEWLINES_RE, '\\n');\n\n // Replace NULL characters\n str = str.replace(NULL_RE, '\\uFFFD');\n\n state.src = str;\n};\n","'use strict';\n\n\nmodule.exports = function block(state) {\n var token;\n\n if (state.inlineMode) {\n token = new state.Token('inline', '', 0);\n token.content = state.src;\n token.map = [ 0, 1 ];\n token.children = [];\n state.tokens.push(token);\n } else {\n state.md.block.parse(state.src, state.md, state.env, state.tokens);\n }\n};\n","'use strict';\n\nmodule.exports = function inline(state) {\n var tokens = state.tokens, tok, i, l;\n\n // Parse inlines\n for (i = 0, l = tokens.length; i < l; i++) {\n tok = tokens[i];\n if (tok.type === 'inline') {\n state.md.inline.parse(tok.content, state.md, state.env, tok.children);\n }\n }\n};\n","// Replace link-like texts with link nodes.\n//\n// Currently restricted by `md.validateLink()` to http/https/ftp\n//\n'use strict';\n\n\nvar arrayReplaceAt = require('../common/utils').arrayReplaceAt;\n\n\nfunction isLinkOpen(str) {\n return /^\\s]/i.test(str);\n}\nfunction isLinkClose(str) {\n return /^<\\/a\\s*>/i.test(str);\n}\n\n\nmodule.exports = function linkify(state) {\n var i, j, l, tokens, token, currentToken, nodes, ln, text, pos, lastPos,\n level, htmlLinkLevel, url, fullUrl, urlText,\n blockTokens = state.tokens,\n links;\n\n if (!state.md.options.linkify) { return; }\n\n for (j = 0, l = blockTokens.length; j < l; j++) {\n if (blockTokens[j].type !== 'inline' ||\n !state.md.linkify.pretest(blockTokens[j].content)) {\n continue;\n }\n\n tokens = blockTokens[j].children;\n\n htmlLinkLevel = 0;\n\n // We scan from the end, to keep position when new tags added.\n // Use reversed logic in links start/end match\n for (i = tokens.length - 1; i >= 0; i--) {\n currentToken = tokens[i];\n\n // Skip content of markdown links\n if (currentToken.type === 'link_close') {\n i--;\n while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') {\n i--;\n }\n continue;\n }\n\n // Skip content of html tag links\n if (currentToken.type === 'html_inline') {\n if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) {\n htmlLinkLevel--;\n }\n if (isLinkClose(currentToken.content)) {\n htmlLinkLevel++;\n }\n }\n if (htmlLinkLevel > 0) { continue; }\n\n if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) {\n\n text = currentToken.content;\n links = state.md.linkify.match(text);\n\n // Now split string to nodes\n nodes = [];\n level = currentToken.level;\n lastPos = 0;\n\n for (ln = 0; ln < links.length; ln++) {\n\n url = links[ln].url;\n fullUrl = state.md.normalizeLink(url);\n if (!state.md.validateLink(fullUrl)) { continue; }\n\n urlText = links[ln].text;\n\n // Linkifier might send raw hostnames like \"example.com\", where url\n // starts with domain name. So we prepend http:// in those cases,\n // and remove it afterwards.\n //\n if (!links[ln].schema) {\n urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\\/\\//, '');\n } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) {\n urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, '');\n } else {\n urlText = state.md.normalizeLinkText(urlText);\n }\n\n pos = links[ln].index;\n\n if (pos > lastPos) {\n token = new state.Token('text', '', 0);\n token.content = text.slice(lastPos, pos);\n token.level = level;\n nodes.push(token);\n }\n\n token = new state.Token('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.level = level++;\n token.markup = 'linkify';\n token.info = 'auto';\n nodes.push(token);\n\n token = new state.Token('text', '', 0);\n token.content = urlText;\n token.level = level;\n nodes.push(token);\n\n token = new state.Token('link_close', 'a', -1);\n token.level = --level;\n token.markup = 'linkify';\n token.info = 'auto';\n nodes.push(token);\n\n lastPos = links[ln].lastIndex;\n }\n if (lastPos < text.length) {\n token = new state.Token('text', '', 0);\n token.content = text.slice(lastPos);\n token.level = level;\n nodes.push(token);\n }\n\n // replace current node\n blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes);\n }\n }\n }\n};\n","// Simple typographic replacements\n//\n// (c) (C) → ©\n// (tm) (TM) → ™\n// (r) (R) → ®\n// +- → ±\n// (p) (P) -> §\n// ... → … (also ?.... → ?.., !.... → !..)\n// ???????? → ???, !!!!! → !!!, `,,` → `,`\n// -- → –, --- → —\n//\n'use strict';\n\n// TODO:\n// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾\n// - miltiplication 2 x 4 -> 2 × 4\n\nvar RARE_RE = /\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/;\n\n// Workaround for phantomjs - need regex without /g flag,\n// or root check will fail every second time\nvar SCOPED_ABBR_TEST_RE = /\\((c|tm|r|p)\\)/i;\n\nvar SCOPED_ABBR_RE = /\\((c|tm|r|p)\\)/ig;\nvar SCOPED_ABBR = {\n c: '©',\n r: '®',\n p: '§',\n tm: '™'\n};\n\nfunction replaceFn(match, name) {\n return SCOPED_ABBR[name.toLowerCase()];\n}\n\nfunction replace_scoped(inlineTokens) {\n var i, token, inside_autolink = 0;\n\n for (i = inlineTokens.length - 1; i >= 0; i--) {\n token = inlineTokens[i];\n\n if (token.type === 'text' && !inside_autolink) {\n token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn);\n }\n\n if (token.type === 'link_open' && token.info === 'auto') {\n inside_autolink--;\n }\n\n if (token.type === 'link_close' && token.info === 'auto') {\n inside_autolink++;\n }\n }\n}\n\nfunction replace_rare(inlineTokens) {\n var i, token, inside_autolink = 0;\n\n for (i = inlineTokens.length - 1; i >= 0; i--) {\n token = inlineTokens[i];\n\n if (token.type === 'text' && !inside_autolink) {\n if (RARE_RE.test(token.content)) {\n token.content = token.content\n .replace(/\\+-/g, '±')\n // .., ..., ....... -> …\n // but ?..... & !..... -> ?.. & !..\n .replace(/\\.{2,}/g, '…').replace(/([?!])…/g, '$1..')\n .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',')\n // em-dash\n .replace(/(^|[^-])---([^-]|$)/mg, '$1\\u2014$2')\n // en-dash\n .replace(/(^|\\s)--(\\s|$)/mg, '$1\\u2013$2')\n .replace(/(^|[^-\\s])--([^-\\s]|$)/mg, '$1\\u2013$2');\n }\n }\n\n if (token.type === 'link_open' && token.info === 'auto') {\n inside_autolink--;\n }\n\n if (token.type === 'link_close' && token.info === 'auto') {\n inside_autolink++;\n }\n }\n}\n\n\nmodule.exports = function replace(state) {\n var blkIdx;\n\n if (!state.md.options.typographer) { return; }\n\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n\n if (state.tokens[blkIdx].type !== 'inline') { continue; }\n\n if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) {\n replace_scoped(state.tokens[blkIdx].children);\n }\n\n if (RARE_RE.test(state.tokens[blkIdx].content)) {\n replace_rare(state.tokens[blkIdx].children);\n }\n\n }\n};\n","// Convert straight quotation marks to typographic ones\n//\n'use strict';\n\n\nvar isWhiteSpace = require('../common/utils').isWhiteSpace;\nvar isPunctChar = require('../common/utils').isPunctChar;\nvar isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;\n\nvar QUOTE_TEST_RE = /['\"]/;\nvar QUOTE_RE = /['\"]/g;\nvar APOSTROPHE = '\\u2019'; /* ’ */\n\n\nfunction replaceAt(str, index, ch) {\n return str.substr(0, index) + ch + str.substr(index + 1);\n}\n\nfunction process_inlines(tokens, state) {\n var i, token, text, t, pos, max, thisLevel, item, lastChar, nextChar,\n isLastPunctChar, isNextPunctChar, isLastWhiteSpace, isNextWhiteSpace,\n canOpen, canClose, j, isSingle, stack, openQuote, closeQuote;\n\n stack = [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n\n thisLevel = tokens[i].level;\n\n for (j = stack.length - 1; j >= 0; j--) {\n if (stack[j].level <= thisLevel) { break; }\n }\n stack.length = j + 1;\n\n if (token.type !== 'text') { continue; }\n\n text = token.content;\n pos = 0;\n max = text.length;\n\n /*eslint no-labels:0,block-scoped-var:0*/\n OUTER:\n while (pos < max) {\n QUOTE_RE.lastIndex = pos;\n t = QUOTE_RE.exec(text);\n if (!t) { break; }\n\n canOpen = canClose = true;\n pos = t.index + 1;\n isSingle = (t[0] === \"'\");\n\n // Find previous character,\n // default to space if it's the beginning of the line\n //\n lastChar = 0x20;\n\n if (t.index - 1 >= 0) {\n lastChar = text.charCodeAt(t.index - 1);\n } else {\n for (j = i - 1; j >= 0; j--) {\n if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // lastChar defaults to 0x20\n if (tokens[j].type !== 'text') continue;\n\n lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1);\n break;\n }\n }\n\n // Find next character,\n // default to space if it's the end of the line\n //\n nextChar = 0x20;\n\n if (pos < max) {\n nextChar = text.charCodeAt(pos);\n } else {\n for (j = i + 1; j < tokens.length; j++) {\n if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // nextChar defaults to 0x20\n if (tokens[j].type !== 'text') continue;\n\n nextChar = tokens[j].content.charCodeAt(0);\n break;\n }\n }\n\n isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));\n isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));\n\n isLastWhiteSpace = isWhiteSpace(lastChar);\n isNextWhiteSpace = isWhiteSpace(nextChar);\n\n if (isNextWhiteSpace) {\n canOpen = false;\n } else if (isNextPunctChar) {\n if (!(isLastWhiteSpace || isLastPunctChar)) {\n canOpen = false;\n }\n }\n\n if (isLastWhiteSpace) {\n canClose = false;\n } else if (isLastPunctChar) {\n if (!(isNextWhiteSpace || isNextPunctChar)) {\n canClose = false;\n }\n }\n\n if (nextChar === 0x22 /* \" */ && t[0] === '\"') {\n if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) {\n // special case: 1\"\" - count first quote as an inch\n canClose = canOpen = false;\n }\n }\n\n if (canOpen && canClose) {\n // treat this as the middle of the word\n canOpen = false;\n canClose = isNextPunctChar;\n }\n\n if (!canOpen && !canClose) {\n // middle of word\n if (isSingle) {\n token.content = replaceAt(token.content, t.index, APOSTROPHE);\n }\n continue;\n }\n\n if (canClose) {\n // this could be a closing quote, rewind the stack to get a match\n for (j = stack.length - 1; j >= 0; j--) {\n item = stack[j];\n if (stack[j].level < thisLevel) { break; }\n if (item.single === isSingle && stack[j].level === thisLevel) {\n item = stack[j];\n\n if (isSingle) {\n openQuote = state.md.options.quotes[2];\n closeQuote = state.md.options.quotes[3];\n } else {\n openQuote = state.md.options.quotes[0];\n closeQuote = state.md.options.quotes[1];\n }\n\n // replace token.content *before* tokens[item.token].content,\n // because, if they are pointing at the same token, replaceAt\n // could mess up indices when quote length != 1\n token.content = replaceAt(token.content, t.index, closeQuote);\n tokens[item.token].content = replaceAt(\n tokens[item.token].content, item.pos, openQuote);\n\n pos += closeQuote.length - 1;\n if (item.token === i) { pos += openQuote.length - 1; }\n\n text = token.content;\n max = text.length;\n\n stack.length = j;\n continue OUTER;\n }\n }\n }\n\n if (canOpen) {\n stack.push({\n token: i,\n pos: t.index,\n single: isSingle,\n level: thisLevel\n });\n } else if (canClose && isSingle) {\n token.content = replaceAt(token.content, t.index, APOSTROPHE);\n }\n }\n }\n}\n\n\nmodule.exports = function smartquotes(state) {\n /*eslint max-depth:0*/\n var blkIdx;\n\n if (!state.md.options.typographer) { return; }\n\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n\n if (state.tokens[blkIdx].type !== 'inline' ||\n !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) {\n continue;\n }\n\n process_inlines(state.tokens[blkIdx].children, state);\n }\n};\n","// Core state object\n//\n'use strict';\n\nvar Token = require('../token');\n\n\nfunction StateCore(src, md, env) {\n this.src = src;\n this.env = env;\n this.tokens = [];\n this.inlineMode = false;\n this.md = md; // link to parser instance\n}\n\n// re-export Token class to use in core rules\nStateCore.prototype.Token = Token;\n\n\nmodule.exports = StateCore;\n","/** internal\n * class ParserBlock\n *\n * Block-level tokenizer.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\nvar _rules = [\n // First 2 params - rule name & source. Secondary array - list of rules,\n // which can be terminated by this one.\n [ 'table', require('./rules_block/table'), [ 'paragraph', 'reference' ] ],\n [ 'code', require('./rules_block/code') ],\n [ 'fence', require('./rules_block/fence'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'blockquote', require('./rules_block/blockquote'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'hr', require('./rules_block/hr'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'list', require('./rules_block/list'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'reference', require('./rules_block/reference') ],\n [ 'heading', require('./rules_block/heading'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'lheading', require('./rules_block/lheading') ],\n [ 'html_block', require('./rules_block/html_block'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'paragraph', require('./rules_block/paragraph') ]\n];\n\n\n/**\n * new ParserBlock()\n **/\nfunction ParserBlock() {\n /**\n * ParserBlock#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of block rules.\n **/\n this.ruler = new Ruler();\n\n for (var i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1], { alt: (_rules[i][2] || []).slice() });\n }\n}\n\n\n// Generate tokens for input range\n//\nParserBlock.prototype.tokenize = function (state, startLine, endLine) {\n var ok, i,\n rules = this.ruler.getRules(''),\n len = rules.length,\n line = startLine,\n hasEmptyLines = false,\n maxNesting = state.md.options.maxNesting;\n\n while (line < endLine) {\n state.line = line = state.skipEmptyLines(line);\n if (line >= endLine) { break; }\n\n // Termination condition for nested calls.\n // Nested calls currently used for blockquotes & lists\n if (state.sCount[line] < state.blkIndent) { break; }\n\n // If nesting level exceeded - skip tail to the end. That's not ordinary\n // situation and we should not care about content.\n if (state.level >= maxNesting) {\n state.line = endLine;\n break;\n }\n\n // Try all possible rules.\n // On success, rule should:\n //\n // - update `state.line`\n // - update `state.tokens`\n // - return true\n\n for (i = 0; i < len; i++) {\n ok = rules[i](state, line, endLine, false);\n if (ok) { break; }\n }\n\n // set state.tight if we had an empty line before current tag\n // i.e. latest empty line should not count\n state.tight = !hasEmptyLines;\n\n // paragraph might \"eat\" one newline after it in nested lists\n if (state.isEmpty(state.line - 1)) {\n hasEmptyLines = true;\n }\n\n line = state.line;\n\n if (line < endLine && state.isEmpty(line)) {\n hasEmptyLines = true;\n line++;\n state.line = line;\n }\n }\n};\n\n\n/**\n * ParserBlock.parse(str, md, env, outTokens)\n *\n * Process input string and push block tokens into `outTokens`\n **/\nParserBlock.prototype.parse = function (src, md, env, outTokens) {\n var state;\n\n if (!src) { return; }\n\n state = new this.State(src, md, env, outTokens);\n\n this.tokenize(state, state.line, state.lineMax);\n};\n\n\nParserBlock.prototype.State = require('./rules_block/state_block');\n\n\nmodule.exports = ParserBlock;\n","// GFM table, non-standard\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nfunction getLine(state, line) {\n var pos = state.bMarks[line] + state.blkIndent,\n max = state.eMarks[line];\n\n return state.src.substr(pos, max - pos);\n}\n\nfunction escapedSplit(str) {\n var result = [],\n pos = 0,\n max = str.length,\n ch,\n escapes = 0,\n lastPos = 0,\n backTicked = false,\n lastBackTick = 0;\n\n ch = str.charCodeAt(pos);\n\n while (pos < max) {\n if (ch === 0x60/* ` */) {\n if (backTicked) {\n // make \\` close code sequence, but not open it;\n // the reason is: `\\` is correct code block\n backTicked = false;\n lastBackTick = pos;\n } else if (escapes % 2 === 0) {\n backTicked = true;\n lastBackTick = pos;\n }\n } else if (ch === 0x7c/* | */ && (escapes % 2 === 0) && !backTicked) {\n result.push(str.substring(lastPos, pos));\n lastPos = pos + 1;\n }\n\n if (ch === 0x5c/* \\ */) {\n escapes++;\n } else {\n escapes = 0;\n }\n\n pos++;\n\n // If there was an un-closed backtick, go back to just after\n // the last backtick, but as if it was a normal character\n if (pos === max && backTicked) {\n backTicked = false;\n pos = lastBackTick + 1;\n }\n\n ch = str.charCodeAt(pos);\n }\n\n result.push(str.substring(lastPos));\n\n return result;\n}\n\n\nmodule.exports = function table(state, startLine, endLine, silent) {\n var ch, lineText, pos, i, nextLine, columns, columnCount, token,\n aligns, t, tableLines, tbodyLines;\n\n // should have at least two lines\n if (startLine + 2 > endLine) { return false; }\n\n nextLine = startLine + 1;\n\n if (state.sCount[nextLine] < state.blkIndent) { return false; }\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[nextLine] - state.blkIndent >= 4) { return false; }\n\n // first character of the second line should be '|', '-', ':',\n // and no other characters are allowed but spaces;\n // basically, this is the equivalent of /^[-:|][-:|\\s]*$/ regexp\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n if (pos >= state.eMarks[nextLine]) { return false; }\n\n ch = state.src.charCodeAt(pos++);\n if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */) { return false; }\n\n while (pos < state.eMarks[nextLine]) {\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */ && !isSpace(ch)) { return false; }\n\n pos++;\n }\n\n lineText = getLine(state, startLine + 1);\n\n columns = lineText.split('|');\n aligns = [];\n for (i = 0; i < columns.length; i++) {\n t = columns[i].trim();\n if (!t) {\n // allow empty columns before and after table, but not in between columns;\n // e.g. allow ` |---| `, disallow ` ---||--- `\n if (i === 0 || i === columns.length - 1) {\n continue;\n } else {\n return false;\n }\n }\n\n if (!/^:?-+:?$/.test(t)) { return false; }\n if (t.charCodeAt(t.length - 1) === 0x3A/* : */) {\n aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right');\n } else if (t.charCodeAt(0) === 0x3A/* : */) {\n aligns.push('left');\n } else {\n aligns.push('');\n }\n }\n\n lineText = getLine(state, startLine).trim();\n if (lineText.indexOf('|') === -1) { return false; }\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n columns = escapedSplit(lineText.replace(/^\\||\\|$/g, ''));\n\n // header row will define an amount of columns in the entire table,\n // and align row shouldn't be smaller than that (the rest of the rows can)\n columnCount = columns.length;\n if (columnCount > aligns.length) { return false; }\n\n if (silent) { return true; }\n\n token = state.push('table_open', 'table', 1);\n token.map = tableLines = [ startLine, 0 ];\n\n token = state.push('thead_open', 'thead', 1);\n token.map = [ startLine, startLine + 1 ];\n\n token = state.push('tr_open', 'tr', 1);\n token.map = [ startLine, startLine + 1 ];\n\n for (i = 0; i < columns.length; i++) {\n token = state.push('th_open', 'th', 1);\n token.map = [ startLine, startLine + 1 ];\n if (aligns[i]) {\n token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ];\n }\n\n token = state.push('inline', '', 0);\n token.content = columns[i].trim();\n token.map = [ startLine, startLine + 1 ];\n token.children = [];\n\n token = state.push('th_close', 'th', -1);\n }\n\n token = state.push('tr_close', 'tr', -1);\n token = state.push('thead_close', 'thead', -1);\n\n token = state.push('tbody_open', 'tbody', 1);\n token.map = tbodyLines = [ startLine + 2, 0 ];\n\n for (nextLine = startLine + 2; nextLine < endLine; nextLine++) {\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n lineText = getLine(state, nextLine).trim();\n if (lineText.indexOf('|') === -1) { break; }\n if (state.sCount[nextLine] - state.blkIndent >= 4) { break; }\n columns = escapedSplit(lineText.replace(/^\\||\\|$/g, ''));\n\n token = state.push('tr_open', 'tr', 1);\n for (i = 0; i < columnCount; i++) {\n token = state.push('td_open', 'td', 1);\n if (aligns[i]) {\n token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ];\n }\n\n token = state.push('inline', '', 0);\n token.content = columns[i] ? columns[i].trim() : '';\n token.children = [];\n\n token = state.push('td_close', 'td', -1);\n }\n token = state.push('tr_close', 'tr', -1);\n }\n token = state.push('tbody_close', 'tbody', -1);\n token = state.push('table_close', 'table', -1);\n\n tableLines[1] = tbodyLines[1] = nextLine;\n state.line = nextLine;\n return true;\n};\n","// Code block (4 spaces padded)\n\n'use strict';\n\n\nmodule.exports = function code(state, startLine, endLine/*, silent*/) {\n var nextLine, last, token;\n\n if (state.sCount[startLine] - state.blkIndent < 4) { return false; }\n\n last = nextLine = startLine + 1;\n\n while (nextLine < endLine) {\n if (state.isEmpty(nextLine)) {\n nextLine++;\n continue;\n }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n nextLine++;\n last = nextLine;\n continue;\n }\n break;\n }\n\n state.line = last;\n\n token = state.push('code_block', 'code', 0);\n token.content = state.getLines(startLine, last, 4 + state.blkIndent, true);\n token.map = [ startLine, state.line ];\n\n return true;\n};\n","// fences (``` lang, ~~~ lang)\n\n'use strict';\n\n\nmodule.exports = function fence(state, startLine, endLine, silent) {\n var marker, len, params, nextLine, mem, token, markup,\n haveEndMarker = false,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (pos + 3 > max) { return false; }\n\n marker = state.src.charCodeAt(pos);\n\n if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) {\n return false;\n }\n\n // scan marker length\n mem = pos;\n pos = state.skipChars(pos, marker);\n\n len = pos - mem;\n\n if (len < 3) { return false; }\n\n markup = state.src.slice(mem, pos);\n params = state.src.slice(pos, max);\n\n if (marker === 0x60 /* ` */) {\n if (params.indexOf(String.fromCharCode(marker)) >= 0) {\n return false;\n }\n }\n\n // Since start is found, we can report success here in validation mode\n if (silent) { return true; }\n\n // search end of block\n nextLine = startLine;\n\n for (;;) {\n nextLine++;\n if (nextLine >= endLine) {\n // unclosed block should be autoclosed by end of document.\n // also block seems to be autoclosed by end of parent\n break;\n }\n\n pos = mem = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos < max && state.sCount[nextLine] < state.blkIndent) {\n // non-empty line with negative indent should stop the list:\n // - ```\n // test\n break;\n }\n\n if (state.src.charCodeAt(pos) !== marker) { continue; }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n // closing fence should be indented less than 4 spaces\n continue;\n }\n\n pos = state.skipChars(pos, marker);\n\n // closing code fence must be at least as long as the opening one\n if (pos - mem < len) { continue; }\n\n // make sure tail has spaces only\n pos = state.skipSpaces(pos);\n\n if (pos < max) { continue; }\n\n haveEndMarker = true;\n // found!\n break;\n }\n\n // If a fence has heading spaces, they should be removed from its inner block\n len = state.sCount[startLine];\n\n state.line = nextLine + (haveEndMarker ? 1 : 0);\n\n token = state.push('fence', 'code', 0);\n token.info = params;\n token.content = state.getLines(startLine + 1, nextLine, len, true);\n token.markup = markup;\n token.map = [ startLine, state.line ];\n\n return true;\n};\n","// Block quotes\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function blockquote(state, startLine, endLine, silent) {\n var adjustTab,\n ch,\n i,\n initial,\n l,\n lastLineEmpty,\n lines,\n nextLine,\n offset,\n oldBMarks,\n oldBSCount,\n oldIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n spaceAfterMarker,\n terminate,\n terminatorRules,\n token,\n wasOutdented,\n oldLineMax = state.lineMax,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n // check the block quote marker\n if (state.src.charCodeAt(pos++) !== 0x3E/* > */) { return false; }\n\n // we know that it's going to be a valid blockquote,\n // so no point trying to find the end of it in silent mode\n if (silent) { return true; }\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[startLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks = [ state.bMarks[startLine] ];\n state.bMarks[startLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[startLine] + (adjustTab ? 1 : 0)) % 4;\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n oldBSCount = [ state.bsCount[startLine] ];\n state.bsCount[startLine] = state.sCount[startLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n lastLineEmpty = pos >= max;\n\n oldSCount = [ state.sCount[startLine] ];\n state.sCount[startLine] = offset - initial;\n\n oldTShift = [ state.tShift[startLine] ];\n state.tShift[startLine] = pos - state.bMarks[startLine];\n\n terminatorRules = state.md.block.ruler.getRules('blockquote');\n\n oldParentType = state.parentType;\n state.parentType = 'blockquote';\n wasOutdented = false;\n\n // Search the end of the block\n //\n // Block ends with either:\n // 1. an empty line outside:\n // ```\n // > test\n //\n // ```\n // 2. an empty line inside:\n // ```\n // >\n // test\n // ```\n // 3. another tag:\n // ```\n // > test\n // - - -\n // ```\n for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {\n // check if it's outdented, i.e. it's inside list item and indented\n // less than said list item:\n //\n // ```\n // 1. anything\n // > current blockquote\n // 2. checking this line\n // ```\n if (state.sCount[nextLine] < state.blkIndent) wasOutdented = true;\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos >= max) {\n // Case 1: line is not inside the blockquote, and this line is empty.\n break;\n }\n\n if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !wasOutdented) {\n // This line is inside the blockquote.\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[nextLine] + pos - (state.bMarks[nextLine] + state.tShift[nextLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[nextLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n state.bMarks[nextLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4;\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n lastLineEmpty = pos >= max;\n\n oldBSCount.push(state.bsCount[nextLine]);\n state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] = offset - initial;\n\n oldTShift.push(state.tShift[nextLine]);\n state.tShift[nextLine] = pos - state.bMarks[nextLine];\n continue;\n }\n\n // Case 2: line is not inside the blockquote, and the last line was empty.\n if (lastLineEmpty) { break; }\n\n // Case 3: another tag found.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n\n if (terminate) {\n // Quirk to enforce \"hard termination mode\" for paragraphs;\n // normally if you call `tokenize(state, startLine, nextLine)`,\n // paragraphs will look below nextLine for paragraph continuation,\n // but if blockquote is terminated by another tag, they shouldn't\n state.lineMax = nextLine;\n\n if (state.blkIndent !== 0) {\n // state.blkIndent was non-zero, we now set it to zero,\n // so we need to re-calculate all offsets to appear as\n // if indent wasn't changed\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] -= state.blkIndent;\n }\n\n break;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n\n // A negative indentation means that this is a paragraph continuation\n //\n state.sCount[nextLine] = -1;\n }\n\n oldIndent = state.blkIndent;\n state.blkIndent = 0;\n\n token = state.push('blockquote_open', 'blockquote', 1);\n token.markup = '>';\n token.map = lines = [ startLine, 0 ];\n\n state.md.block.tokenize(state, startLine, nextLine);\n\n token = state.push('blockquote_close', 'blockquote', -1);\n token.markup = '>';\n\n state.lineMax = oldLineMax;\n state.parentType = oldParentType;\n lines[1] = state.line;\n\n // Restore original tShift; this might not be necessary since the parser\n // has already been here, but just to make sure we can do that.\n for (i = 0; i < oldTShift.length; i++) {\n state.bMarks[i + startLine] = oldBMarks[i];\n state.tShift[i + startLine] = oldTShift[i];\n state.sCount[i + startLine] = oldSCount[i];\n state.bsCount[i + startLine] = oldBSCount[i];\n }\n state.blkIndent = oldIndent;\n\n return true;\n};\n","// Horizontal rule\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function hr(state, startLine, endLine, silent) {\n var marker, cnt, ch, token,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n marker = state.src.charCodeAt(pos++);\n\n // Check hr marker\n if (marker !== 0x2A/* * */ &&\n marker !== 0x2D/* - */ &&\n marker !== 0x5F/* _ */) {\n return false;\n }\n\n // markers can be mixed with spaces, but there should be at least 3 of them\n\n cnt = 1;\n while (pos < max) {\n ch = state.src.charCodeAt(pos++);\n if (ch !== marker && !isSpace(ch)) { return false; }\n if (ch === marker) { cnt++; }\n }\n\n if (cnt < 3) { return false; }\n\n if (silent) { return true; }\n\n state.line = startLine + 1;\n\n token = state.push('hr', 'hr', 0);\n token.map = [ startLine, state.line ];\n token.markup = Array(cnt + 1).join(String.fromCharCode(marker));\n\n return true;\n};\n","// Lists\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\n// Search `[-+*][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipBulletListMarker(state, startLine) {\n var marker, pos, max, ch;\n\n pos = state.bMarks[startLine] + state.tShift[startLine];\n max = state.eMarks[startLine];\n\n marker = state.src.charCodeAt(pos++);\n // Check bullet\n if (marker !== 0x2A/* * */ &&\n marker !== 0x2D/* - */ &&\n marker !== 0x2B/* + */) {\n return -1;\n }\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (!isSpace(ch)) {\n // \" -test \" - is not a list item\n return -1;\n }\n }\n\n return pos;\n}\n\n// Search `\\d+[.)][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipOrderedListMarker(state, startLine) {\n var ch,\n start = state.bMarks[startLine] + state.tShift[startLine],\n pos = start,\n max = state.eMarks[startLine];\n\n // List marker should have at least 2 chars (digit + dot)\n if (pos + 1 >= max) { return -1; }\n\n ch = state.src.charCodeAt(pos++);\n\n if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1; }\n\n for (;;) {\n // EOL -> fail\n if (pos >= max) { return -1; }\n\n ch = state.src.charCodeAt(pos++);\n\n if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) {\n\n // List marker should have no more than 9 digits\n // (prevents integer overflow in browsers)\n if (pos - start >= 10) { return -1; }\n\n continue;\n }\n\n // found valid marker\n if (ch === 0x29/* ) */ || ch === 0x2e/* . */) {\n break;\n }\n\n return -1;\n }\n\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (!isSpace(ch)) {\n // \" 1.test \" - is not a list item\n return -1;\n }\n }\n return pos;\n}\n\nfunction markTightParagraphs(state, idx) {\n var i, l,\n level = state.level + 2;\n\n for (i = idx + 2, l = state.tokens.length - 2; i < l; i++) {\n if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {\n state.tokens[i + 2].hidden = true;\n state.tokens[i].hidden = true;\n i += 2;\n }\n }\n}\n\n\nmodule.exports = function list(state, startLine, endLine, silent) {\n var ch,\n contentStart,\n i,\n indent,\n indentAfterMarker,\n initial,\n isOrdered,\n itemLines,\n l,\n listLines,\n listTokIdx,\n markerCharCode,\n markerValue,\n max,\n nextLine,\n offset,\n oldListIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n oldTight,\n pos,\n posAfterMarker,\n prevEmptyEnd,\n start,\n terminate,\n terminatorRules,\n token,\n isTerminatingParagraph = false,\n tight = true;\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n // Special case:\n // - item 1\n // - item 2\n // - item 3\n // - item 4\n // - this one is a paragraph continuation\n if (state.listIndent >= 0 &&\n state.sCount[startLine] - state.listIndent >= 4 &&\n state.sCount[startLine] < state.blkIndent) {\n return false;\n }\n\n // limit conditions when list can interrupt\n // a paragraph (validation mode only)\n if (silent && state.parentType === 'paragraph') {\n // Next list item should still terminate previous list item;\n //\n // This code can fail if plugins use blkIndent as well as lists,\n // but I hope the spec gets fixed long before that happens.\n //\n if (state.tShift[startLine] >= state.blkIndent) {\n isTerminatingParagraph = true;\n }\n }\n\n // Detect list type and position after marker\n if ((posAfterMarker = skipOrderedListMarker(state, startLine)) >= 0) {\n isOrdered = true;\n start = state.bMarks[startLine] + state.tShift[startLine];\n markerValue = Number(state.src.substr(start, posAfterMarker - start - 1));\n\n // If we're starting a new ordered list right after\n // a paragraph, it should start with 1.\n if (isTerminatingParagraph && markerValue !== 1) return false;\n\n } else if ((posAfterMarker = skipBulletListMarker(state, startLine)) >= 0) {\n isOrdered = false;\n\n } else {\n return false;\n }\n\n // If we're starting a new unordered list right after\n // a paragraph, first line should not be empty.\n if (isTerminatingParagraph) {\n if (state.skipSpaces(posAfterMarker) >= state.eMarks[startLine]) return false;\n }\n\n // We should terminate list on style change. Remember first one to compare.\n markerCharCode = state.src.charCodeAt(posAfterMarker - 1);\n\n // For validation mode we can terminate immediately\n if (silent) { return true; }\n\n // Start list\n listTokIdx = state.tokens.length;\n\n if (isOrdered) {\n token = state.push('ordered_list_open', 'ol', 1);\n if (markerValue !== 1) {\n token.attrs = [ [ 'start', markerValue ] ];\n }\n\n } else {\n token = state.push('bullet_list_open', 'ul', 1);\n }\n\n token.map = listLines = [ startLine, 0 ];\n token.markup = String.fromCharCode(markerCharCode);\n\n //\n // Iterate list items\n //\n\n nextLine = startLine;\n prevEmptyEnd = false;\n terminatorRules = state.md.block.ruler.getRules('list');\n\n oldParentType = state.parentType;\n state.parentType = 'list';\n\n while (nextLine < endLine) {\n pos = posAfterMarker;\n max = state.eMarks[nextLine];\n\n initial = offset = state.sCount[nextLine] + posAfterMarker - (state.bMarks[startLine] + state.tShift[startLine]);\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[nextLine]) % 4;\n } else if (ch === 0x20) {\n offset++;\n } else {\n break;\n }\n\n pos++;\n }\n\n contentStart = pos;\n\n if (contentStart >= max) {\n // trimming space in \"- \\n 3\" case, indent is 1 here\n indentAfterMarker = 1;\n } else {\n indentAfterMarker = offset - initial;\n }\n\n // If we have more than 4 spaces, the indent is 1\n // (the rest is just indented code block)\n if (indentAfterMarker > 4) { indentAfterMarker = 1; }\n\n // \" - test\"\n // ^^^^^ - calculating total length of this thing\n indent = initial + indentAfterMarker;\n\n // Run subparser & write tokens\n token = state.push('list_item_open', 'li', 1);\n token.markup = String.fromCharCode(markerCharCode);\n token.map = itemLines = [ startLine, 0 ];\n\n // change current state, then restore it after parser subcall\n oldTight = state.tight;\n oldTShift = state.tShift[startLine];\n oldSCount = state.sCount[startLine];\n\n // - example list\n // ^ listIndent position will be here\n // ^ blkIndent position will be here\n //\n oldListIndent = state.listIndent;\n state.listIndent = state.blkIndent;\n state.blkIndent = indent;\n\n state.tight = true;\n state.tShift[startLine] = contentStart - state.bMarks[startLine];\n state.sCount[startLine] = offset;\n\n if (contentStart >= max && state.isEmpty(startLine + 1)) {\n // workaround for this case\n // (list item is empty, list terminates before \"foo\"):\n // ~~~~~~~~\n // -\n //\n // foo\n // ~~~~~~~~\n state.line = Math.min(state.line + 2, endLine);\n } else {\n state.md.block.tokenize(state, startLine, endLine, true);\n }\n\n // If any of list item is tight, mark list as tight\n if (!state.tight || prevEmptyEnd) {\n tight = false;\n }\n // Item become loose if finish with empty line,\n // but we should filter last element, because it means list finish\n prevEmptyEnd = (state.line - startLine) > 1 && state.isEmpty(state.line - 1);\n\n state.blkIndent = state.listIndent;\n state.listIndent = oldListIndent;\n state.tShift[startLine] = oldTShift;\n state.sCount[startLine] = oldSCount;\n state.tight = oldTight;\n\n token = state.push('list_item_close', 'li', -1);\n token.markup = String.fromCharCode(markerCharCode);\n\n nextLine = startLine = state.line;\n itemLines[1] = nextLine;\n contentStart = state.bMarks[startLine];\n\n if (nextLine >= endLine) { break; }\n\n //\n // Try to check if list is terminated or continued.\n //\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { break; }\n\n // fail if terminating block found\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n\n // fail if list has another type\n if (isOrdered) {\n posAfterMarker = skipOrderedListMarker(state, nextLine);\n if (posAfterMarker < 0) { break; }\n } else {\n posAfterMarker = skipBulletListMarker(state, nextLine);\n if (posAfterMarker < 0) { break; }\n }\n\n if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break; }\n }\n\n // Finalize list\n if (isOrdered) {\n token = state.push('ordered_list_close', 'ol', -1);\n } else {\n token = state.push('bullet_list_close', 'ul', -1);\n }\n token.markup = String.fromCharCode(markerCharCode);\n\n listLines[1] = nextLine;\n state.line = nextLine;\n\n state.parentType = oldParentType;\n\n // mark paragraphs tight if needed\n if (tight) {\n markTightParagraphs(state, listTokIdx);\n }\n\n return true;\n};\n","'use strict';\n\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function reference(state, startLine, _endLine, silent) {\n var ch,\n destEndPos,\n destEndLineNo,\n endLine,\n href,\n i,\n l,\n label,\n labelEnd,\n oldParentType,\n res,\n start,\n str,\n terminate,\n terminatorRules,\n title,\n lines = 0,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine],\n nextLine = startLine + 1;\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (state.src.charCodeAt(pos) !== 0x5B/* [ */) { return false; }\n\n // Simple check to quickly interrupt scan on [link](url) at the start of line.\n // Can be useful on practice: https://github.com/markdown-it/markdown-it/issues/54\n while (++pos < max) {\n if (state.src.charCodeAt(pos) === 0x5D /* ] */ &&\n state.src.charCodeAt(pos - 1) !== 0x5C/* \\ */) {\n if (pos + 1 === max) { return false; }\n if (state.src.charCodeAt(pos + 1) !== 0x3A/* : */) { return false; }\n break;\n }\n }\n\n endLine = state.lineMax;\n\n // jump line-by-line until empty one or EOF\n terminatorRules = state.md.block.ruler.getRules('reference');\n\n oldParentType = state.parentType;\n state.parentType = 'reference';\n\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n str = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n max = str.length;\n\n for (pos = 1; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x5B /* [ */) {\n return false;\n } else if (ch === 0x5D /* ] */) {\n labelEnd = pos;\n break;\n } else if (ch === 0x0A /* \\n */) {\n lines++;\n } else if (ch === 0x5C /* \\ */) {\n pos++;\n if (pos < max && str.charCodeAt(pos) === 0x0A) {\n lines++;\n }\n }\n }\n\n if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return false; }\n\n // [label]: destination 'title'\n // ^^^ skip optional whitespace here\n for (pos = labelEnd + 2; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x0A) {\n lines++;\n } else if (isSpace(ch)) {\n /*eslint no-empty:0*/\n } else {\n break;\n }\n }\n\n // [label]: destination 'title'\n // ^^^^^^^^^^^ parse this\n res = state.md.helpers.parseLinkDestination(str, pos, max);\n if (!res.ok) { return false; }\n\n href = state.md.normalizeLink(res.str);\n if (!state.md.validateLink(href)) { return false; }\n\n pos = res.pos;\n lines += res.lines;\n\n // save cursor state, we could require to rollback later\n destEndPos = pos;\n destEndLineNo = lines;\n\n // [label]: destination 'title'\n // ^^^ skipping those spaces\n start = pos;\n for (; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x0A) {\n lines++;\n } else if (isSpace(ch)) {\n /*eslint no-empty:0*/\n } else {\n break;\n }\n }\n\n // [label]: destination 'title'\n // ^^^^^^^ parse this\n res = state.md.helpers.parseLinkTitle(str, pos, max);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n lines += res.lines;\n } else {\n title = '';\n pos = destEndPos;\n lines = destEndLineNo;\n }\n\n // skip trailing spaces until the rest of the line\n while (pos < max) {\n ch = str.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n\n if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n if (title) {\n // garbage at the end of the line after title,\n // but it could still be a valid reference if we roll back\n title = '';\n pos = destEndPos;\n lines = destEndLineNo;\n while (pos < max) {\n ch = str.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n }\n }\n\n if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n // garbage at the end of the line\n return false;\n }\n\n label = normalizeReference(str.slice(1, labelEnd));\n if (!label) {\n // CommonMark 0.20 disallows empty labels\n return false;\n }\n\n // Reference can not terminate anything. This check is for safety only.\n /*istanbul ignore if*/\n if (silent) { return true; }\n\n if (typeof state.env.references === 'undefined') {\n state.env.references = {};\n }\n if (typeof state.env.references[label] === 'undefined') {\n state.env.references[label] = { title: title, href: href };\n }\n\n state.parentType = oldParentType;\n\n state.line = startLine + lines + 1;\n return true;\n};\n","// heading (#, ##, ...)\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function heading(state, startLine, endLine, silent) {\n var ch, level, tmp, token,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x23/* # */ || pos >= max) { return false; }\n\n // count heading level\n level = 1;\n ch = state.src.charCodeAt(++pos);\n while (ch === 0x23/* # */ && pos < max && level <= 6) {\n level++;\n ch = state.src.charCodeAt(++pos);\n }\n\n if (level > 6 || (pos < max && !isSpace(ch))) { return false; }\n\n if (silent) { return true; }\n\n // Let's cut tails like ' ### ' from the end of string\n\n max = state.skipSpacesBack(max, pos);\n tmp = state.skipCharsBack(max, 0x23, pos); // #\n if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) {\n max = tmp;\n }\n\n state.line = startLine + 1;\n\n token = state.push('heading_open', 'h' + String(level), 1);\n token.markup = '########'.slice(0, level);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = state.src.slice(pos, max).trim();\n token.map = [ startLine, state.line ];\n token.children = [];\n\n token = state.push('heading_close', 'h' + String(level), -1);\n token.markup = '########'.slice(0, level);\n\n return true;\n};\n","// lheading (---, ===)\n\n'use strict';\n\n\nmodule.exports = function lheading(state, startLine, endLine/*, silent*/) {\n var content, terminate, i, l, token, pos, max, level, marker,\n nextLine = startLine + 1, oldParentType,\n terminatorRules = state.md.block.ruler.getRules('paragraph');\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n oldParentType = state.parentType;\n state.parentType = 'paragraph'; // use paragraph to match terminatorRules\n\n // jump line-by-line until empty one or EOF\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n //\n // Check for underline in setext header\n //\n if (state.sCount[nextLine] >= state.blkIndent) {\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos < max) {\n marker = state.src.charCodeAt(pos);\n\n if (marker === 0x2D/* - */ || marker === 0x3D/* = */) {\n pos = state.skipChars(pos, marker);\n pos = state.skipSpaces(pos);\n\n if (pos >= max) {\n level = (marker === 0x3D/* = */ ? 1 : 2);\n break;\n }\n }\n }\n }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n if (!level) {\n // Didn't find valid underline\n return false;\n }\n\n content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n\n state.line = nextLine + 1;\n\n token = state.push('heading_open', 'h' + String(level), 1);\n token.markup = String.fromCharCode(marker);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = content;\n token.map = [ startLine, state.line - 1 ];\n token.children = [];\n\n token = state.push('heading_close', 'h' + String(level), -1);\n token.markup = String.fromCharCode(marker);\n\n state.parentType = oldParentType;\n\n return true;\n};\n","// HTML block\n\n'use strict';\n\n\nvar block_names = require('../common/html_blocks');\nvar HTML_OPEN_CLOSE_TAG_RE = require('../common/html_re').HTML_OPEN_CLOSE_TAG_RE;\n\n// An array of opening and corresponding closing sequences for html tags,\n// last argument defines whether it can terminate a paragraph or not\n//\nvar HTML_SEQUENCES = [\n [ /^<(script|pre|style)(?=(\\s|>|$))/i, /<\\/(script|pre|style)>/i, true ],\n [ /^/, true ],\n [ /^<\\?/, /\\?>/, true ],\n [ /^/, true ],\n [ /^/, true ],\n [ new RegExp('^|$))', 'i'), /^$/, true ],\n [ new RegExp(HTML_OPEN_CLOSE_TAG_RE.source + '\\\\s*$'), /^$/, false ]\n];\n\n\nmodule.exports = function html_block(state, startLine, endLine, silent) {\n var i, nextLine, token, lineText,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (!state.md.options.html) { return false; }\n\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\n\n lineText = state.src.slice(pos, max);\n\n for (i = 0; i < HTML_SEQUENCES.length; i++) {\n if (HTML_SEQUENCES[i][0].test(lineText)) { break; }\n }\n\n if (i === HTML_SEQUENCES.length) { return false; }\n\n if (silent) {\n // true if this sequence can be a terminator, false otherwise\n return HTML_SEQUENCES[i][2];\n }\n\n nextLine = startLine + 1;\n\n // If we are here - we detected HTML block.\n // Let's roll down till block end.\n if (!HTML_SEQUENCES[i][1].test(lineText)) {\n for (; nextLine < endLine; nextLine++) {\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n lineText = state.src.slice(pos, max);\n\n if (HTML_SEQUENCES[i][1].test(lineText)) {\n if (lineText.length !== 0) { nextLine++; }\n break;\n }\n }\n }\n\n state.line = nextLine;\n\n token = state.push('html_block', '', 0);\n token.map = [ startLine, nextLine ];\n token.content = state.getLines(startLine, nextLine, state.blkIndent, true);\n\n return true;\n};\n","// List of valid html blocks names, accorting to commonmark spec\n// http://jgm.github.io/CommonMark/spec.html#html-blocks\n\n'use strict';\n\n\nmodule.exports = [\n 'address',\n 'article',\n 'aside',\n 'base',\n 'basefont',\n 'blockquote',\n 'body',\n 'caption',\n 'center',\n 'col',\n 'colgroup',\n 'dd',\n 'details',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'frame',\n 'frameset',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hr',\n 'html',\n 'iframe',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'menu',\n 'menuitem',\n 'meta',\n 'nav',\n 'noframes',\n 'ol',\n 'optgroup',\n 'option',\n 'p',\n 'param',\n 'section',\n 'source',\n 'summary',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'title',\n 'tr',\n 'track',\n 'ul'\n];\n","// Paragraph\n\n'use strict';\n\n\nmodule.exports = function paragraph(state, startLine/*, endLine*/) {\n var content, terminate, i, l, token, oldParentType,\n nextLine = startLine + 1,\n terminatorRules = state.md.block.ruler.getRules('paragraph'),\n endLine = state.lineMax;\n\n oldParentType = state.parentType;\n state.parentType = 'paragraph';\n\n // jump line-by-line until empty one or EOF\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n\n state.line = nextLine;\n\n token = state.push('paragraph_open', 'p', 1);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = content;\n token.map = [ startLine, state.line ];\n token.children = [];\n\n token = state.push('paragraph_close', 'p', -1);\n\n state.parentType = oldParentType;\n\n return true;\n};\n","// Parser state class\n\n'use strict';\n\nvar Token = require('../token');\nvar isSpace = require('../common/utils').isSpace;\n\n\nfunction StateBlock(src, md, env, tokens) {\n var ch, s, start, pos, len, indent, offset, indent_found;\n\n this.src = src;\n\n // link to parser instance\n this.md = md;\n\n this.env = env;\n\n //\n // Internal state vartiables\n //\n\n this.tokens = tokens;\n\n this.bMarks = []; // line begin offsets for fast jumps\n this.eMarks = []; // line end offsets for fast jumps\n this.tShift = []; // offsets of the first non-space characters (tabs not expanded)\n this.sCount = []; // indents for each line (tabs expanded)\n\n // An amount of virtual spaces (tabs expanded) between beginning\n // of each line (bMarks) and real beginning of that line.\n //\n // It exists only as a hack because blockquotes override bMarks\n // losing information in the process.\n //\n // It's used only when expanding tabs, you can think about it as\n // an initial tab length, e.g. bsCount=21 applied to string `\\t123`\n // means first tab should be expanded to 4-21%4 === 3 spaces.\n //\n this.bsCount = [];\n\n // block parser variables\n this.blkIndent = 0; // required block content indent (for example, if we are\n // inside a list, it would be positioned after list marker)\n this.line = 0; // line index in src\n this.lineMax = 0; // lines count\n this.tight = false; // loose/tight mode for lists\n this.ddIndent = -1; // indent of the current dd block (-1 if there isn't any)\n this.listIndent = -1; // indent of the current list block (-1 if there isn't any)\n\n // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'\n // used in lists to determine if they interrupt a paragraph\n this.parentType = 'root';\n\n this.level = 0;\n\n // renderer\n this.result = '';\n\n // Create caches\n // Generate markers.\n s = this.src;\n indent_found = false;\n\n for (start = pos = indent = offset = 0, len = s.length; pos < len; pos++) {\n ch = s.charCodeAt(pos);\n\n if (!indent_found) {\n if (isSpace(ch)) {\n indent++;\n\n if (ch === 0x09) {\n offset += 4 - offset % 4;\n } else {\n offset++;\n }\n continue;\n } else {\n indent_found = true;\n }\n }\n\n if (ch === 0x0A || pos === len - 1) {\n if (ch !== 0x0A) { pos++; }\n this.bMarks.push(start);\n this.eMarks.push(pos);\n this.tShift.push(indent);\n this.sCount.push(offset);\n this.bsCount.push(0);\n\n indent_found = false;\n indent = 0;\n offset = 0;\n start = pos + 1;\n }\n }\n\n // Push fake entry to simplify cache bounds checks\n this.bMarks.push(s.length);\n this.eMarks.push(s.length);\n this.tShift.push(0);\n this.sCount.push(0);\n this.bsCount.push(0);\n\n this.lineMax = this.bMarks.length - 1; // don't count last fake line\n}\n\n// Push new token to \"stream\".\n//\nStateBlock.prototype.push = function (type, tag, nesting) {\n var token = new Token(type, tag, nesting);\n token.block = true;\n\n if (nesting < 0) this.level--; // closing tag\n token.level = this.level;\n if (nesting > 0) this.level++; // opening tag\n\n this.tokens.push(token);\n return token;\n};\n\nStateBlock.prototype.isEmpty = function isEmpty(line) {\n return this.bMarks[line] + this.tShift[line] >= this.eMarks[line];\n};\n\nStateBlock.prototype.skipEmptyLines = function skipEmptyLines(from) {\n for (var max = this.lineMax; from < max; from++) {\n if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) {\n break;\n }\n }\n return from;\n};\n\n// Skip spaces from given position.\nStateBlock.prototype.skipSpaces = function skipSpaces(pos) {\n var ch;\n\n for (var max = this.src.length; pos < max; pos++) {\n ch = this.src.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n }\n return pos;\n};\n\n// Skip spaces from given position in reverse.\nStateBlock.prototype.skipSpacesBack = function skipSpacesBack(pos, min) {\n if (pos <= min) { return pos; }\n\n while (pos > min) {\n if (!isSpace(this.src.charCodeAt(--pos))) { return pos + 1; }\n }\n return pos;\n};\n\n// Skip char codes from given position\nStateBlock.prototype.skipChars = function skipChars(pos, code) {\n for (var max = this.src.length; pos < max; pos++) {\n if (this.src.charCodeAt(pos) !== code) { break; }\n }\n return pos;\n};\n\n// Skip char codes reverse from given position - 1\nStateBlock.prototype.skipCharsBack = function skipCharsBack(pos, code, min) {\n if (pos <= min) { return pos; }\n\n while (pos > min) {\n if (code !== this.src.charCodeAt(--pos)) { return pos + 1; }\n }\n return pos;\n};\n\n// cut lines range from source.\nStateBlock.prototype.getLines = function getLines(begin, end, indent, keepLastLF) {\n var i, lineIndent, ch, first, last, queue, lineStart,\n line = begin;\n\n if (begin >= end) {\n return '';\n }\n\n queue = new Array(end - begin);\n\n for (i = 0; line < end; line++, i++) {\n lineIndent = 0;\n lineStart = first = this.bMarks[line];\n\n if (line + 1 < end || keepLastLF) {\n // No need for bounds check because we have fake entry on tail.\n last = this.eMarks[line] + 1;\n } else {\n last = this.eMarks[line];\n }\n\n while (first < last && lineIndent < indent) {\n ch = this.src.charCodeAt(first);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4;\n } else {\n lineIndent++;\n }\n } else if (first - lineStart < this.tShift[line]) {\n // patched tShift masked characters to look like spaces (blockquotes, list markers)\n lineIndent++;\n } else {\n break;\n }\n\n first++;\n }\n\n if (lineIndent > indent) {\n // partially expanding tabs in code blocks, e.g '\\t\\tfoobar'\n // with indent=2 becomes ' \\tfoobar'\n queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last);\n } else {\n queue[i] = this.src.slice(first, last);\n }\n }\n\n return queue.join('');\n};\n\n// re-export Token class to use in block rules\nStateBlock.prototype.Token = Token;\n\n\nmodule.exports = StateBlock;\n","/** internal\n * class ParserInline\n *\n * Tokenizes paragraph content.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Parser rules\n\nvar _rules = [\n [ 'text', require('./rules_inline/text') ],\n [ 'newline', require('./rules_inline/newline') ],\n [ 'escape', require('./rules_inline/escape') ],\n [ 'backticks', require('./rules_inline/backticks') ],\n [ 'strikethrough', require('./rules_inline/strikethrough').tokenize ],\n [ 'emphasis', require('./rules_inline/emphasis').tokenize ],\n [ 'link', require('./rules_inline/link') ],\n [ 'image', require('./rules_inline/image') ],\n [ 'autolink', require('./rules_inline/autolink') ],\n [ 'html_inline', require('./rules_inline/html_inline') ],\n [ 'entity', require('./rules_inline/entity') ]\n];\n\nvar _rules2 = [\n [ 'balance_pairs', require('./rules_inline/balance_pairs') ],\n [ 'strikethrough', require('./rules_inline/strikethrough').postProcess ],\n [ 'emphasis', require('./rules_inline/emphasis').postProcess ],\n [ 'text_collapse', require('./rules_inline/text_collapse') ]\n];\n\n\n/**\n * new ParserInline()\n **/\nfunction ParserInline() {\n var i;\n\n /**\n * ParserInline#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of inline rules.\n **/\n this.ruler = new Ruler();\n\n for (i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1]);\n }\n\n /**\n * ParserInline#ruler2 -> Ruler\n *\n * [[Ruler]] instance. Second ruler used for post-processing\n * (e.g. in emphasis-like rules).\n **/\n this.ruler2 = new Ruler();\n\n for (i = 0; i < _rules2.length; i++) {\n this.ruler2.push(_rules2[i][0], _rules2[i][1]);\n }\n}\n\n\n// Skip single token by running all rules in validation mode;\n// returns `true` if any rule reported success\n//\nParserInline.prototype.skipToken = function (state) {\n var ok, i, pos = state.pos,\n rules = this.ruler.getRules(''),\n len = rules.length,\n maxNesting = state.md.options.maxNesting,\n cache = state.cache;\n\n\n if (typeof cache[pos] !== 'undefined') {\n state.pos = cache[pos];\n return;\n }\n\n if (state.level < maxNesting) {\n for (i = 0; i < len; i++) {\n // Increment state.level and decrement it later to limit recursion.\n // It's harmless to do here, because no tokens are created. But ideally,\n // we'd need a separate private state variable for this purpose.\n //\n state.level++;\n ok = rules[i](state, true);\n state.level--;\n\n if (ok) { break; }\n }\n } else {\n // Too much nesting, just skip until the end of the paragraph.\n //\n // NOTE: this will cause links to behave incorrectly in the following case,\n // when an amount of `[` is exactly equal to `maxNesting + 1`:\n //\n // [[[[[[[[[[[[[[[[[[[[[foo]()\n //\n // TODO: remove this workaround when CM standard will allow nested links\n // (we can replace it by preventing links from being parsed in\n // validation mode)\n //\n state.pos = state.posMax;\n }\n\n if (!ok) { state.pos++; }\n cache[pos] = state.pos;\n};\n\n\n// Generate tokens for input range\n//\nParserInline.prototype.tokenize = function (state) {\n var ok, i,\n rules = this.ruler.getRules(''),\n len = rules.length,\n end = state.posMax,\n maxNesting = state.md.options.maxNesting;\n\n while (state.pos < end) {\n // Try all possible rules.\n // On success, rule should:\n //\n // - update `state.pos`\n // - update `state.tokens`\n // - return true\n\n if (state.level < maxNesting) {\n for (i = 0; i < len; i++) {\n ok = rules[i](state, false);\n if (ok) { break; }\n }\n }\n\n if (ok) {\n if (state.pos >= end) { break; }\n continue;\n }\n\n state.pending += state.src[state.pos++];\n }\n\n if (state.pending) {\n state.pushPending();\n }\n};\n\n\n/**\n * ParserInline.parse(str, md, env, outTokens)\n *\n * Process input string and push inline tokens into `outTokens`\n **/\nParserInline.prototype.parse = function (str, md, env, outTokens) {\n var i, rules, len;\n var state = new this.State(str, md, env, outTokens);\n\n this.tokenize(state);\n\n rules = this.ruler2.getRules('');\n len = rules.length;\n\n for (i = 0; i < len; i++) {\n rules[i](state);\n }\n};\n\n\nParserInline.prototype.State = require('./rules_inline/state_inline');\n\n\nmodule.exports = ParserInline;\n","// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\n'use strict';\n\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar(ch) {\n switch (ch) {\n case 0x0A/* \\n */:\n case 0x21/* ! */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2D/* - */:\n case 0x3A/* : */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true;\n default:\n return false;\n }\n}\n\nmodule.exports = function text(state, silent) {\n var pos = state.pos;\n\n while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n pos++;\n }\n\n if (pos === state.pos) { return false; }\n\n if (!silent) { state.pending += state.src.slice(state.pos, pos); }\n\n state.pos = pos;\n\n return true;\n};\n\n// Alternative implementation, for memory.\n//\n// It costs 10% of performance, but allows extend terminators list, if place it\n// to `ParcerInline` property. Probably, will switch to it sometime, such\n// flexibility required.\n\n/*\nvar TERMINATOR_RE = /[\\n!#$%&*+\\-:<=>@[\\\\\\]^_`{}~]/;\n\nmodule.exports = function text(state, silent) {\n var pos = state.pos,\n idx = state.src.slice(pos).search(TERMINATOR_RE);\n\n // first char is terminator -> empty text\n if (idx === 0) { return false; }\n\n // no terminator -> text till end of string\n if (idx < 0) {\n if (!silent) { state.pending += state.src.slice(pos); }\n state.pos = state.src.length;\n return true;\n }\n\n if (!silent) { state.pending += state.src.slice(pos, pos + idx); }\n\n state.pos += idx;\n\n return true;\n};*/\n","// Proceess '\\n'\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function newline(state, silent) {\n var pmax, max, pos = state.pos;\n\n if (state.src.charCodeAt(pos) !== 0x0A/* \\n */) { return false; }\n\n pmax = state.pending.length - 1;\n max = state.posMax;\n\n // ' \\n' -> hardbreak\n // Lookup in pending chars is bad practice! Don't copy to other rules!\n // Pending string is stored in concat mode, indexed lookups will cause\n // convertion to flat mode.\n if (!silent) {\n if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {\n if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {\n state.pending = state.pending.replace(/ +$/, '');\n state.push('hardbreak', 'br', 0);\n } else {\n state.pending = state.pending.slice(0, -1);\n state.push('softbreak', 'br', 0);\n }\n\n } else {\n state.push('softbreak', 'br', 0);\n }\n }\n\n pos++;\n\n // skip heading spaces for next line\n while (pos < max && isSpace(state.src.charCodeAt(pos))) { pos++; }\n\n state.pos = pos;\n return true;\n};\n","// Process escaped chars and hardbreaks\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\nvar ESCAPED = [];\n\nfor (var i = 0; i < 256; i++) { ESCAPED.push(0); }\n\n'\\\\!\"#$%&\\'()*+,./:;<=>?@[]^_`{|}~-'\n .split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1; });\n\n\nmodule.exports = function escape(state, silent) {\n var ch, pos = state.pos, max = state.posMax;\n\n if (state.src.charCodeAt(pos) !== 0x5C/* \\ */) { return false; }\n\n pos++;\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (ch < 256 && ESCAPED[ch] !== 0) {\n if (!silent) { state.pending += state.src[pos]; }\n state.pos += 2;\n return true;\n }\n\n if (ch === 0x0A) {\n if (!silent) {\n state.push('hardbreak', 'br', 0);\n }\n\n pos++;\n // skip leading whitespaces from next line\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n\n state.pos = pos;\n return true;\n }\n }\n\n if (!silent) { state.pending += '\\\\'; }\n state.pos++;\n return true;\n};\n","// Parse backticks\n\n'use strict';\n\nmodule.exports = function backtick(state, silent) {\n var start, max, marker, matchStart, matchEnd, token,\n pos = state.pos,\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x60/* ` */) { return false; }\n\n start = pos;\n pos++;\n max = state.posMax;\n\n while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++; }\n\n marker = state.src.slice(start, pos);\n\n matchStart = matchEnd = pos;\n\n while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) {\n matchEnd = matchStart + 1;\n\n while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++; }\n\n if (matchEnd - matchStart === marker.length) {\n if (!silent) {\n token = state.push('code_inline', 'code', 0);\n token.markup = marker;\n token.content = state.src.slice(pos, matchStart)\n .replace(/\\n/g, ' ')\n .replace(/^ (.+) $/, '$1');\n }\n state.pos = matchEnd;\n return true;\n }\n }\n\n if (!silent) { state.pending += marker; }\n state.pos += marker.length;\n return true;\n};\n","// Process [link]( \"stuff\")\n\n'use strict';\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function link(state, silent) {\n var attrs,\n code,\n label,\n labelEnd,\n labelStart,\n pos,\n res,\n ref,\n title,\n token,\n href = '',\n oldPos = state.pos,\n max = state.posMax,\n start = state.pos,\n parseReference = true;\n\n if (state.src.charCodeAt(state.pos) !== 0x5B/* [ */) { return false; }\n\n labelStart = state.pos + 1;\n labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true);\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) { return false; }\n\n pos = labelEnd + 1;\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n //\n // Inline link\n //\n\n // might have found a valid shortcut link, disable reference parsing\n parseReference = false;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n pos++;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n if (pos >= max) { return false; }\n\n // [link]( \"title\" )\n // ^^^^^^ parsing link destination\n start = pos;\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n if (res.ok) {\n href = state.md.normalizeLink(res.str);\n if (state.md.validateLink(href)) {\n pos = res.pos;\n } else {\n href = '';\n }\n }\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n start = pos;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n\n // [link]( \"title\" )\n // ^^^^^^^ parsing link title\n res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n } else {\n title = '';\n }\n\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n // parsing a valid shortcut link failed, fallback to reference\n parseReference = true;\n }\n pos++;\n }\n\n if (parseReference) {\n //\n // Link reference\n //\n if (typeof state.env.references === 'undefined') { return false; }\n\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n start = pos + 1;\n pos = state.md.helpers.parseLinkLabel(state, pos);\n if (pos >= 0) {\n label = state.src.slice(start, pos++);\n } else {\n pos = labelEnd + 1;\n }\n } else {\n pos = labelEnd + 1;\n }\n\n // covers label === '' and label === undefined\n // (collapsed reference link and shortcut reference link respectively)\n if (!label) { label = state.src.slice(labelStart, labelEnd); }\n\n ref = state.env.references[normalizeReference(label)];\n if (!ref) {\n state.pos = oldPos;\n return false;\n }\n href = ref.href;\n title = ref.title;\n }\n\n //\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n state.pos = labelStart;\n state.posMax = labelEnd;\n\n token = state.push('link_open', 'a', 1);\n token.attrs = attrs = [ [ 'href', href ] ];\n if (title) {\n attrs.push([ 'title', title ]);\n }\n\n state.md.inline.tokenize(state);\n\n token = state.push('link_close', 'a', -1);\n }\n\n state.pos = pos;\n state.posMax = max;\n return true;\n};\n","// Process ![image]( \"title\")\n\n'use strict';\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function image(state, silent) {\n var attrs,\n code,\n content,\n label,\n labelEnd,\n labelStart,\n pos,\n ref,\n res,\n title,\n token,\n tokens,\n start,\n href = '',\n oldPos = state.pos,\n max = state.posMax;\n\n if (state.src.charCodeAt(state.pos) !== 0x21/* ! */) { return false; }\n if (state.src.charCodeAt(state.pos + 1) !== 0x5B/* [ */) { return false; }\n\n labelStart = state.pos + 2;\n labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false);\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) { return false; }\n\n pos = labelEnd + 1;\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n //\n // Inline link\n //\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n pos++;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n if (pos >= max) { return false; }\n\n // [link]( \"title\" )\n // ^^^^^^ parsing link destination\n start = pos;\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n if (res.ok) {\n href = state.md.normalizeLink(res.str);\n if (state.md.validateLink(href)) {\n pos = res.pos;\n } else {\n href = '';\n }\n }\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n start = pos;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n\n // [link]( \"title\" )\n // ^^^^^^^ parsing link title\n res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n } else {\n title = '';\n }\n\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n state.pos = oldPos;\n return false;\n }\n pos++;\n } else {\n //\n // Link reference\n //\n if (typeof state.env.references === 'undefined') { return false; }\n\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n start = pos + 1;\n pos = state.md.helpers.parseLinkLabel(state, pos);\n if (pos >= 0) {\n label = state.src.slice(start, pos++);\n } else {\n pos = labelEnd + 1;\n }\n } else {\n pos = labelEnd + 1;\n }\n\n // covers label === '' and label === undefined\n // (collapsed reference link and shortcut reference link respectively)\n if (!label) { label = state.src.slice(labelStart, labelEnd); }\n\n ref = state.env.references[normalizeReference(label)];\n if (!ref) {\n state.pos = oldPos;\n return false;\n }\n href = ref.href;\n title = ref.title;\n }\n\n //\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n content = state.src.slice(labelStart, labelEnd);\n\n state.md.inline.parse(\n content,\n state.md,\n state.env,\n tokens = []\n );\n\n token = state.push('image', 'img', 0);\n token.attrs = attrs = [ [ 'src', href ], [ 'alt', '' ] ];\n token.children = tokens;\n token.content = content;\n\n if (title) {\n attrs.push([ 'title', title ]);\n }\n }\n\n state.pos = pos;\n state.posMax = max;\n return true;\n};\n","// Process autolinks ''\n\n'use strict';\n\n\n/*eslint max-len:0*/\nvar EMAIL_RE = /^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;\nvar AUTOLINK_RE = /^<([a-zA-Z][a-zA-Z0-9+.\\-]{1,31}):([^<>\\x00-\\x20]*)>/;\n\n\nmodule.exports = function autolink(state, silent) {\n var tail, linkMatch, emailMatch, url, fullUrl, token,\n pos = state.pos;\n\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\n\n tail = state.src.slice(pos);\n\n if (tail.indexOf('>') < 0) { return false; }\n\n if (AUTOLINK_RE.test(tail)) {\n linkMatch = tail.match(AUTOLINK_RE);\n\n url = linkMatch[0].slice(1, -1);\n fullUrl = state.md.normalizeLink(url);\n if (!state.md.validateLink(fullUrl)) { return false; }\n\n if (!silent) {\n token = state.push('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.markup = 'autolink';\n token.info = 'auto';\n\n token = state.push('text', '', 0);\n token.content = state.md.normalizeLinkText(url);\n\n token = state.push('link_close', 'a', -1);\n token.markup = 'autolink';\n token.info = 'auto';\n }\n\n state.pos += linkMatch[0].length;\n return true;\n }\n\n if (EMAIL_RE.test(tail)) {\n emailMatch = tail.match(EMAIL_RE);\n\n url = emailMatch[0].slice(1, -1);\n fullUrl = state.md.normalizeLink('mailto:' + url);\n if (!state.md.validateLink(fullUrl)) { return false; }\n\n if (!silent) {\n token = state.push('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.markup = 'autolink';\n token.info = 'auto';\n\n token = state.push('text', '', 0);\n token.content = state.md.normalizeLinkText(url);\n\n token = state.push('link_close', 'a', -1);\n token.markup = 'autolink';\n token.info = 'auto';\n }\n\n state.pos += emailMatch[0].length;\n return true;\n }\n\n return false;\n};\n","// Process html tags\n\n'use strict';\n\n\nvar HTML_TAG_RE = require('../common/html_re').HTML_TAG_RE;\n\n\nfunction isLetter(ch) {\n /*eslint no-bitwise:0*/\n var lc = ch | 0x20; // to lower case\n return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */);\n}\n\n\nmodule.exports = function html_inline(state, silent) {\n var ch, match, max, token,\n pos = state.pos;\n\n if (!state.md.options.html) { return false; }\n\n // Check start\n max = state.posMax;\n if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||\n pos + 2 >= max) {\n return false;\n }\n\n // Quick fail on second char\n ch = state.src.charCodeAt(pos + 1);\n if (ch !== 0x21/* ! */ &&\n ch !== 0x3F/* ? */ &&\n ch !== 0x2F/* / */ &&\n !isLetter(ch)) {\n return false;\n }\n\n match = state.src.slice(pos).match(HTML_TAG_RE);\n if (!match) { return false; }\n\n if (!silent) {\n token = state.push('html_inline', '', 0);\n token.content = state.src.slice(pos, pos + match[0].length);\n }\n state.pos += match[0].length;\n return true;\n};\n","// Process html entity - {, ¯, ", ...\n\n'use strict';\n\nvar entities = require('../common/entities');\nvar has = require('../common/utils').has;\nvar isValidEntityCode = require('../common/utils').isValidEntityCode;\nvar fromCodePoint = require('../common/utils').fromCodePoint;\n\n\nvar DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i;\nvar NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i;\n\n\nmodule.exports = function entity(state, silent) {\n var ch, code, match, pos = state.pos, max = state.posMax;\n\n if (state.src.charCodeAt(pos) !== 0x26/* & */) { return false; }\n\n if (pos + 1 < max) {\n ch = state.src.charCodeAt(pos + 1);\n\n if (ch === 0x23 /* # */) {\n match = state.src.slice(pos).match(DIGITAL_RE);\n if (match) {\n if (!silent) {\n code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10);\n state.pending += isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD);\n }\n state.pos += match[0].length;\n return true;\n }\n } else {\n match = state.src.slice(pos).match(NAMED_RE);\n if (match) {\n if (has(entities, match[1])) {\n if (!silent) { state.pending += entities[match[1]]; }\n state.pos += match[0].length;\n return true;\n }\n }\n }\n }\n\n if (!silent) { state.pending += '&'; }\n state.pos++;\n return true;\n};\n","// For each opening emphasis-like marker find a matching closing one\n//\n'use strict';\n\n\nfunction processDelimiters(state, delimiters) {\n var closerIdx, openerIdx, closer, opener, minOpenerIdx, newMinOpenerIdx,\n isOddMatch, lastJump,\n openersBottom = {},\n max = delimiters.length;\n\n for (closerIdx = 0; closerIdx < max; closerIdx++) {\n closer = delimiters[closerIdx];\n\n // Length is only used for emphasis-specific \"rule of 3\",\n // if it's not defined (in strikethrough or 3rd party plugins),\n // we can default it to 0 to disable those checks.\n //\n closer.length = closer.length || 0;\n\n if (!closer.close) continue;\n\n // Previously calculated lower bounds (previous fails)\n // for each marker and each delimiter length modulo 3.\n if (!openersBottom.hasOwnProperty(closer.marker)) {\n openersBottom[closer.marker] = [ -1, -1, -1 ];\n }\n\n minOpenerIdx = openersBottom[closer.marker][closer.length % 3];\n newMinOpenerIdx = -1;\n\n openerIdx = closerIdx - closer.jump - 1;\n\n for (; openerIdx > minOpenerIdx; openerIdx -= opener.jump + 1) {\n opener = delimiters[openerIdx];\n\n if (opener.marker !== closer.marker) continue;\n\n if (newMinOpenerIdx === -1) newMinOpenerIdx = openerIdx;\n\n if (opener.open &&\n opener.end < 0 &&\n opener.level === closer.level) {\n\n isOddMatch = false;\n\n // from spec:\n //\n // If one of the delimiters can both open and close emphasis, then the\n // sum of the lengths of the delimiter runs containing the opening and\n // closing delimiters must not be a multiple of 3 unless both lengths\n // are multiples of 3.\n //\n if (opener.close || closer.open) {\n if ((opener.length + closer.length) % 3 === 0) {\n if (opener.length % 3 !== 0 || closer.length % 3 !== 0) {\n isOddMatch = true;\n }\n }\n }\n\n if (!isOddMatch) {\n // If previous delimiter cannot be an opener, we can safely skip\n // the entire sequence in future checks. This is required to make\n // sure algorithm has linear complexity (see *_*_*_*_*_... case).\n //\n lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open ?\n delimiters[openerIdx - 1].jump + 1 :\n 0;\n\n closer.jump = closerIdx - openerIdx + lastJump;\n closer.open = false;\n opener.end = closerIdx;\n opener.jump = lastJump;\n opener.close = false;\n newMinOpenerIdx = -1;\n break;\n }\n }\n }\n\n if (newMinOpenerIdx !== -1) {\n // If match for this delimiter run failed, we want to set lower bound for\n // future lookups. This is required to make sure algorithm has linear\n // complexity.\n //\n // See details here:\n // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442\n //\n openersBottom[closer.marker][(closer.length || 0) % 3] = newMinOpenerIdx;\n }\n }\n}\n\n\nmodule.exports = function link_pairs(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n processDelimiters(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n processDelimiters(state, tokens_meta[curr].delimiters);\n }\n }\n};\n","// Clean up tokens after emphasis and strikethrough postprocessing:\n// merge adjacent text nodes into one and re-calculate all token levels\n//\n// This is necessary because initially emphasis delimiter markers (*, _, ~)\n// are treated as their own separate text tokens. Then emphasis rule either\n// leaves them as text (needed to merge with adjacent text) or turns them\n// into opening/closing tags (which messes up levels inside).\n//\n'use strict';\n\n\nmodule.exports = function text_collapse(state) {\n var curr, last,\n level = 0,\n tokens = state.tokens,\n max = state.tokens.length;\n\n for (curr = last = 0; curr < max; curr++) {\n // re-calculate levels after emphasis/strikethrough turns some text nodes\n // into opening/closing tags\n if (tokens[curr].nesting < 0) level--; // closing tag\n tokens[curr].level = level;\n if (tokens[curr].nesting > 0) level++; // opening tag\n\n if (tokens[curr].type === 'text' &&\n curr + 1 < max &&\n tokens[curr + 1].type === 'text') {\n\n // collapse two adjacent text nodes\n tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content;\n } else {\n if (curr !== last) { tokens[last] = tokens[curr]; }\n\n last++;\n }\n }\n\n if (curr !== last) {\n tokens.length = last;\n }\n};\n","// Inline parser state\n\n'use strict';\n\n\nvar Token = require('../token');\nvar isWhiteSpace = require('../common/utils').isWhiteSpace;\nvar isPunctChar = require('../common/utils').isPunctChar;\nvar isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;\n\n\nfunction StateInline(src, md, env, outTokens) {\n this.src = src;\n this.env = env;\n this.md = md;\n this.tokens = outTokens;\n this.tokens_meta = Array(outTokens.length);\n\n this.pos = 0;\n this.posMax = this.src.length;\n this.level = 0;\n this.pending = '';\n this.pendingLevel = 0;\n\n // Stores { start: end } pairs. Useful for backtrack\n // optimization of pairs parse (emphasis, strikes).\n this.cache = {};\n\n // List of emphasis-like delimiters for current tag\n this.delimiters = [];\n\n // Stack of delimiter lists for upper level tags\n this._prev_delimiters = [];\n}\n\n\n// Flush pending text\n//\nStateInline.prototype.pushPending = function () {\n var token = new Token('text', '', 0);\n token.content = this.pending;\n token.level = this.pendingLevel;\n this.tokens.push(token);\n this.pending = '';\n return token;\n};\n\n\n// Push new token to \"stream\".\n// If pending text exists - flush it as text token\n//\nStateInline.prototype.push = function (type, tag, nesting) {\n if (this.pending) {\n this.pushPending();\n }\n\n var token = new Token(type, tag, nesting);\n var token_meta = null;\n\n if (nesting < 0) {\n // closing tag\n this.level--;\n this.delimiters = this._prev_delimiters.pop();\n }\n\n token.level = this.level;\n\n if (nesting > 0) {\n // opening tag\n this.level++;\n this._prev_delimiters.push(this.delimiters);\n this.delimiters = [];\n token_meta = { delimiters: this.delimiters };\n }\n\n this.pendingLevel = this.level;\n this.tokens.push(token);\n this.tokens_meta.push(token_meta);\n return token;\n};\n\n\n// Scan a sequence of emphasis-like markers, and determine whether\n// it can start an emphasis sequence or end an emphasis sequence.\n//\n// - start - position to scan from (it should point at a valid marker);\n// - canSplitWord - determine if these markers can be found inside a word\n//\nStateInline.prototype.scanDelims = function (start, canSplitWord) {\n var pos = start, lastChar, nextChar, count, can_open, can_close,\n isLastWhiteSpace, isLastPunctChar,\n isNextWhiteSpace, isNextPunctChar,\n left_flanking = true,\n right_flanking = true,\n max = this.posMax,\n marker = this.src.charCodeAt(start);\n\n // treat beginning of the line as a whitespace\n lastChar = start > 0 ? this.src.charCodeAt(start - 1) : 0x20;\n\n while (pos < max && this.src.charCodeAt(pos) === marker) { pos++; }\n\n count = pos - start;\n\n // treat end of the line as a whitespace\n nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20;\n\n isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));\n isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));\n\n isLastWhiteSpace = isWhiteSpace(lastChar);\n isNextWhiteSpace = isWhiteSpace(nextChar);\n\n if (isNextWhiteSpace) {\n left_flanking = false;\n } else if (isNextPunctChar) {\n if (!(isLastWhiteSpace || isLastPunctChar)) {\n left_flanking = false;\n }\n }\n\n if (isLastWhiteSpace) {\n right_flanking = false;\n } else if (isLastPunctChar) {\n if (!(isNextWhiteSpace || isNextPunctChar)) {\n right_flanking = false;\n }\n }\n\n if (!canSplitWord) {\n can_open = left_flanking && (!right_flanking || isLastPunctChar);\n can_close = right_flanking && (!left_flanking || isNextPunctChar);\n } else {\n can_open = left_flanking;\n can_close = right_flanking;\n }\n\n return {\n can_open: can_open,\n can_close: can_close,\n length: count\n };\n};\n\n\n// re-export Token class to use in block rules\nStateInline.prototype.Token = Token;\n\n\nmodule.exports = StateInline;\n","'use strict';\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Helpers\n\n// Merge objects\n//\nfunction assign(obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n\n sources.forEach(function (source) {\n if (!source) { return; }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key];\n });\n });\n\n return obj;\n}\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\nfunction isString(obj) { return _class(obj) === '[object String]'; }\nfunction isObject(obj) { return _class(obj) === '[object Object]'; }\nfunction isRegExp(obj) { return _class(obj) === '[object RegExp]'; }\nfunction isFunction(obj) { return _class(obj) === '[object Function]'; }\n\n\nfunction escapeRE(str) { return str.replace(/[.?*+^$[\\]\\\\(){}|-]/g, '\\\\$&'); }\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nvar defaultOptions = {\n fuzzyLink: true,\n fuzzyEmail: true,\n fuzzyIP: false\n};\n\n\nfunction isOptionsObj(obj) {\n return Object.keys(obj || {}).reduce(function (acc, k) {\n return acc || defaultOptions.hasOwnProperty(k);\n }, false);\n}\n\n\nvar defaultSchemas = {\n 'http:': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.http) {\n // compile lazily, because \"host\"-containing variables can change on tlds update.\n self.re.http = new RegExp(\n '^\\\\/\\\\/' + self.re.src_auth + self.re.src_host_port_strict + self.re.src_path, 'i'\n );\n }\n if (self.re.http.test(tail)) {\n return tail.match(self.re.http)[0].length;\n }\n return 0;\n }\n },\n 'https:': 'http:',\n 'ftp:': 'http:',\n '//': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.no_http) {\n // compile lazily, because \"host\"-containing variables can change on tlds update.\n self.re.no_http = new RegExp(\n '^' +\n self.re.src_auth +\n // Don't allow single-level domains, because of false positives like '//test'\n // with code comments\n '(?:localhost|(?:(?:' + self.re.src_domain + ')\\\\.)+' + self.re.src_domain_root + ')' +\n self.re.src_port +\n self.re.src_host_terminator +\n self.re.src_path,\n\n 'i'\n );\n }\n\n if (self.re.no_http.test(tail)) {\n // should not be `://` & `///`, that protects from errors in protocol name\n if (pos >= 3 && text[pos - 3] === ':') { return 0; }\n if (pos >= 3 && text[pos - 3] === '/') { return 0; }\n return tail.match(self.re.no_http)[0].length;\n }\n return 0;\n }\n },\n 'mailto:': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.mailto) {\n self.re.mailto = new RegExp(\n '^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i'\n );\n }\n if (self.re.mailto.test(tail)) {\n return tail.match(self.re.mailto)[0].length;\n }\n return 0;\n }\n }\n};\n\n/*eslint-disable max-len*/\n\n// RE pattern for 2-character tlds (autogenerated by ./support/tlds_2char_gen.js)\nvar tlds_2ch_src_re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]';\n\n// DON'T try to make PRs with changes. Extend TLDs with LinkifyIt.tlds() instead\nvar tlds_default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|');\n\n/*eslint-enable max-len*/\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction resetScanCache(self) {\n self.__index__ = -1;\n self.__text_cache__ = '';\n}\n\nfunction createValidator(re) {\n return function (text, pos) {\n var tail = text.slice(pos);\n\n if (re.test(tail)) {\n return tail.match(re)[0].length;\n }\n return 0;\n };\n}\n\nfunction createNormalizer() {\n return function (match, self) {\n self.normalize(match);\n };\n}\n\n// Schemas compiler. Build regexps.\n//\nfunction compile(self) {\n\n // Load & clone RE patterns.\n var re = self.re = require('./lib/re')(self.__opts__);\n\n // Define dynamic patterns\n var tlds = self.__tlds__.slice();\n\n self.onCompile();\n\n if (!self.__tlds_replaced__) {\n tlds.push(tlds_2ch_src_re);\n }\n tlds.push(re.src_xn);\n\n re.src_tlds = tlds.join('|');\n\n function untpl(tpl) { return tpl.replace('%TLDS%', re.src_tlds); }\n\n re.email_fuzzy = RegExp(untpl(re.tpl_email_fuzzy), 'i');\n re.link_fuzzy = RegExp(untpl(re.tpl_link_fuzzy), 'i');\n re.link_no_ip_fuzzy = RegExp(untpl(re.tpl_link_no_ip_fuzzy), 'i');\n re.host_fuzzy_test = RegExp(untpl(re.tpl_host_fuzzy_test), 'i');\n\n //\n // Compile each schema\n //\n\n var aliases = [];\n\n self.__compiled__ = {}; // Reset compiled data\n\n function schemaError(name, val) {\n throw new Error('(LinkifyIt) Invalid schema \"' + name + '\": ' + val);\n }\n\n Object.keys(self.__schemas__).forEach(function (name) {\n var val = self.__schemas__[name];\n\n // skip disabled methods\n if (val === null) { return; }\n\n var compiled = { validate: null, link: null };\n\n self.__compiled__[name] = compiled;\n\n if (isObject(val)) {\n if (isRegExp(val.validate)) {\n compiled.validate = createValidator(val.validate);\n } else if (isFunction(val.validate)) {\n compiled.validate = val.validate;\n } else {\n schemaError(name, val);\n }\n\n if (isFunction(val.normalize)) {\n compiled.normalize = val.normalize;\n } else if (!val.normalize) {\n compiled.normalize = createNormalizer();\n } else {\n schemaError(name, val);\n }\n\n return;\n }\n\n if (isString(val)) {\n aliases.push(name);\n return;\n }\n\n schemaError(name, val);\n });\n\n //\n // Compile postponed aliases\n //\n\n aliases.forEach(function (alias) {\n if (!self.__compiled__[self.__schemas__[alias]]) {\n // Silently fail on missed schemas to avoid errons on disable.\n // schemaError(alias, self.__schemas__[alias]);\n return;\n }\n\n self.__compiled__[alias].validate =\n self.__compiled__[self.__schemas__[alias]].validate;\n self.__compiled__[alias].normalize =\n self.__compiled__[self.__schemas__[alias]].normalize;\n });\n\n //\n // Fake record for guessed links\n //\n self.__compiled__[''] = { validate: null, normalize: createNormalizer() };\n\n //\n // Build schema condition\n //\n var slist = Object.keys(self.__compiled__)\n .filter(function (name) {\n // Filter disabled & fake schemas\n return name.length > 0 && self.__compiled__[name];\n })\n .map(escapeRE)\n .join('|');\n // (?!_) cause 1.5x slowdown\n self.re.schema_test = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'i');\n self.re.schema_search = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'ig');\n\n self.re.pretest = RegExp(\n '(' + self.re.schema_test.source + ')|(' + self.re.host_fuzzy_test.source + ')|@',\n 'i'\n );\n\n //\n // Cleanup\n //\n\n resetScanCache(self);\n}\n\n/**\n * class Match\n *\n * Match result. Single element of array, returned by [[LinkifyIt#match]]\n **/\nfunction Match(self, shift) {\n var start = self.__index__,\n end = self.__last_index__,\n text = self.__text_cache__.slice(start, end);\n\n /**\n * Match#schema -> String\n *\n * Prefix (protocol) for matched string.\n **/\n this.schema = self.__schema__.toLowerCase();\n /**\n * Match#index -> Number\n *\n * First position of matched string.\n **/\n this.index = start + shift;\n /**\n * Match#lastIndex -> Number\n *\n * Next position after matched string.\n **/\n this.lastIndex = end + shift;\n /**\n * Match#raw -> String\n *\n * Matched string.\n **/\n this.raw = text;\n /**\n * Match#text -> String\n *\n * Notmalized text of matched string.\n **/\n this.text = text;\n /**\n * Match#url -> String\n *\n * Normalized url of matched string.\n **/\n this.url = text;\n}\n\nfunction createMatch(self, shift) {\n var match = new Match(self, shift);\n\n self.__compiled__[match.schema].normalize(match, self);\n\n return match;\n}\n\n\n/**\n * class LinkifyIt\n **/\n\n/**\n * new LinkifyIt(schemas, options)\n * - schemas (Object): Optional. Additional schemas to validate (prefix/validator)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Creates new linkifier instance with optional additional schemas.\n * Can be called without `new` keyword for convenience.\n *\n * By default understands:\n *\n * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links\n * - \"fuzzy\" links and emails (example.com, foo@bar.com).\n *\n * `schemas` is an object, where each key/value describes protocol/rule:\n *\n * - __key__ - link prefix (usually, protocol name with `:` at the end, `skype:`\n * for example). `linkify-it` makes shure that prefix is not preceeded with\n * alphanumeric char and symbols. Only whitespaces and punctuation allowed.\n * - __value__ - rule to check tail after link prefix\n * - _String_ - just alias to existing rule\n * - _Object_\n * - _validate_ - validator function (should return matched length on success),\n * or `RegExp`.\n * - _normalize_ - optional function to normalize text & url of matched result\n * (for example, for @twitter mentions).\n *\n * `options`:\n *\n * - __fuzzyLink__ - recognige URL-s without `http(s):` prefix. Default `true`.\n * - __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts\n * like version numbers. Default `false`.\n * - __fuzzyEmail__ - recognize emails without `mailto:` prefix.\n *\n **/\nfunction LinkifyIt(schemas, options) {\n if (!(this instanceof LinkifyIt)) {\n return new LinkifyIt(schemas, options);\n }\n\n if (!options) {\n if (isOptionsObj(schemas)) {\n options = schemas;\n schemas = {};\n }\n }\n\n this.__opts__ = assign({}, defaultOptions, options);\n\n // Cache last tested result. Used to skip repeating steps on next `match` call.\n this.__index__ = -1;\n this.__last_index__ = -1; // Next scan position\n this.__schema__ = '';\n this.__text_cache__ = '';\n\n this.__schemas__ = assign({}, defaultSchemas, schemas);\n this.__compiled__ = {};\n\n this.__tlds__ = tlds_default;\n this.__tlds_replaced__ = false;\n\n this.re = {};\n\n compile(this);\n}\n\n\n/** chainable\n * LinkifyIt#add(schema, definition)\n * - schema (String): rule name (fixed pattern prefix)\n * - definition (String|RegExp|Object): schema definition\n *\n * Add new rule definition. See constructor description for details.\n **/\nLinkifyIt.prototype.add = function add(schema, definition) {\n this.__schemas__[schema] = definition;\n compile(this);\n return this;\n};\n\n\n/** chainable\n * LinkifyIt#set(options)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Set recognition options for links without schema.\n **/\nLinkifyIt.prototype.set = function set(options) {\n this.__opts__ = assign(this.__opts__, options);\n return this;\n};\n\n\n/**\n * LinkifyIt#test(text) -> Boolean\n *\n * Searches linkifiable pattern and returns `true` on success or `false` on fail.\n **/\nLinkifyIt.prototype.test = function test(text) {\n // Reset scan cache\n this.__text_cache__ = text;\n this.__index__ = -1;\n\n if (!text.length) { return false; }\n\n var m, ml, me, len, shift, next, re, tld_pos, at_pos;\n\n // try to scan for link with schema - that's the most simple rule\n if (this.re.schema_test.test(text)) {\n re = this.re.schema_search;\n re.lastIndex = 0;\n while ((m = re.exec(text)) !== null) {\n len = this.testSchemaAt(text, m[2], re.lastIndex);\n if (len) {\n this.__schema__ = m[2];\n this.__index__ = m.index + m[1].length;\n this.__last_index__ = m.index + m[0].length + len;\n break;\n }\n }\n }\n\n if (this.__opts__.fuzzyLink && this.__compiled__['http:']) {\n // guess schemaless links\n tld_pos = text.search(this.re.host_fuzzy_test);\n if (tld_pos >= 0) {\n // if tld is located after found link - no need to check fuzzy pattern\n if (this.__index__ < 0 || tld_pos < this.__index__) {\n if ((ml = text.match(this.__opts__.fuzzyIP ? this.re.link_fuzzy : this.re.link_no_ip_fuzzy)) !== null) {\n\n shift = ml.index + ml[1].length;\n\n if (this.__index__ < 0 || shift < this.__index__) {\n this.__schema__ = '';\n this.__index__ = shift;\n this.__last_index__ = ml.index + ml[0].length;\n }\n }\n }\n }\n }\n\n if (this.__opts__.fuzzyEmail && this.__compiled__['mailto:']) {\n // guess schemaless emails\n at_pos = text.indexOf('@');\n if (at_pos >= 0) {\n // We can't skip this check, because this cases are possible:\n // 192.168.1.1@gmail.com, my.in@example.com\n if ((me = text.match(this.re.email_fuzzy)) !== null) {\n\n shift = me.index + me[1].length;\n next = me.index + me[0].length;\n\n if (this.__index__ < 0 || shift < this.__index__ ||\n (shift === this.__index__ && next > this.__last_index__)) {\n this.__schema__ = 'mailto:';\n this.__index__ = shift;\n this.__last_index__ = next;\n }\n }\n }\n }\n\n return this.__index__ >= 0;\n};\n\n\n/**\n * LinkifyIt#pretest(text) -> Boolean\n *\n * Very quick check, that can give false positives. Returns true if link MAY BE\n * can exists. Can be used for speed optimization, when you need to check that\n * link NOT exists.\n **/\nLinkifyIt.prototype.pretest = function pretest(text) {\n return this.re.pretest.test(text);\n};\n\n\n/**\n * LinkifyIt#testSchemaAt(text, name, position) -> Number\n * - text (String): text to scan\n * - name (String): rule (schema) name\n * - position (Number): text offset to check from\n *\n * Similar to [[LinkifyIt#test]] but checks only specific protocol tail exactly\n * at given position. Returns length of found pattern (0 on fail).\n **/\nLinkifyIt.prototype.testSchemaAt = function testSchemaAt(text, schema, pos) {\n // If not supported schema check requested - terminate\n if (!this.__compiled__[schema.toLowerCase()]) {\n return 0;\n }\n return this.__compiled__[schema.toLowerCase()].validate(text, pos, this);\n};\n\n\n/**\n * LinkifyIt#match(text) -> Array|null\n *\n * Returns array of found link descriptions or `null` on fail. We strongly\n * recommend to use [[LinkifyIt#test]] first, for best speed.\n *\n * ##### Result match description\n *\n * - __schema__ - link schema, can be empty for fuzzy links, or `//` for\n * protocol-neutral links.\n * - __index__ - offset of matched text\n * - __lastIndex__ - index of next char after mathch end\n * - __raw__ - matched text\n * - __text__ - normalized text\n * - __url__ - link, generated from matched text\n **/\nLinkifyIt.prototype.match = function match(text) {\n var shift = 0, result = [];\n\n // Try to take previous element from cache, if .test() called before\n if (this.__index__ >= 0 && this.__text_cache__ === text) {\n result.push(createMatch(this, shift));\n shift = this.__last_index__;\n }\n\n // Cut head if cache was used\n var tail = shift ? text.slice(shift) : text;\n\n // Scan string until end reached\n while (this.test(tail)) {\n result.push(createMatch(this, shift));\n\n tail = tail.slice(this.__last_index__);\n shift += this.__last_index__;\n }\n\n if (result.length) {\n return result;\n }\n\n return null;\n};\n\n\n/** chainable\n * LinkifyIt#tlds(list [, keepOld]) -> this\n * - list (Array): list of tlds\n * - keepOld (Boolean): merge with current list if `true` (`false` by default)\n *\n * Load (or merge) new tlds list. Those are user for fuzzy links (without prefix)\n * to avoid false positives. By default this algorythm used:\n *\n * - hostname with any 2-letter root zones are ok.\n * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф\n * are ok.\n * - encoded (`xn--...`) root zones are ok.\n *\n * If list is replaced, then exact match for 2-chars root zones will be checked.\n **/\nLinkifyIt.prototype.tlds = function tlds(list, keepOld) {\n list = Array.isArray(list) ? list : [ list ];\n\n if (!keepOld) {\n this.__tlds__ = list.slice();\n this.__tlds_replaced__ = true;\n compile(this);\n return this;\n }\n\n this.__tlds__ = this.__tlds__.concat(list)\n .sort()\n .filter(function (el, idx, arr) {\n return el !== arr[idx - 1];\n })\n .reverse();\n\n compile(this);\n return this;\n};\n\n/**\n * LinkifyIt#normalize(match)\n *\n * Default normalizer (if schema does not define it's own).\n **/\nLinkifyIt.prototype.normalize = function normalize(match) {\n\n // Do minimal possible changes by default. Need to collect feedback prior\n // to move forward https://github.com/markdown-it/linkify-it/issues/1\n\n if (!match.schema) { match.url = 'http://' + match.url; }\n\n if (match.schema === 'mailto:' && !/^mailto:/i.test(match.url)) {\n match.url = 'mailto:' + match.url;\n }\n};\n\n\n/**\n * LinkifyIt#onCompile()\n *\n * Override to modify basic RegExp-s.\n **/\nLinkifyIt.prototype.onCompile = function onCompile() {\n};\n\n\nmodule.exports = LinkifyIt;\n","'use strict';\n\n\nmodule.exports = function (opts) {\n var re = {};\n\n // Use direct extract instead of `regenerate` to reduse browserified size\n re.src_Any = require('uc.micro/properties/Any/regex').source;\n re.src_Cc = require('uc.micro/categories/Cc/regex').source;\n re.src_Z = require('uc.micro/categories/Z/regex').source;\n re.src_P = require('uc.micro/categories/P/regex').source;\n\n // \\p{\\Z\\P\\Cc\\CF} (white spaces + control + format + punctuation)\n re.src_ZPCc = [ re.src_Z, re.src_P, re.src_Cc ].join('|');\n\n // \\p{\\Z\\Cc} (white spaces + control)\n re.src_ZCc = [ re.src_Z, re.src_Cc ].join('|');\n\n // Experimental. List of chars, completely prohibited in links\n // because can separate it from other part of text\n var text_separators = '[><\\uff5c]';\n\n // All possible word characters (everything without punctuation, spaces & controls)\n // Defined via punctuation & spaces to save space\n // Should be something like \\p{\\L\\N\\S\\M} (\\w but without `_`)\n re.src_pseudo_letter = '(?:(?!' + text_separators + '|' + re.src_ZPCc + ')' + re.src_Any + ')';\n // The same as abothe but without [0-9]\n // var src_pseudo_letter_non_d = '(?:(?![0-9]|' + src_ZPCc + ')' + src_Any + ')';\n\n ////////////////////////////////////////////////////////////////////////////////\n\n re.src_ip4 =\n\n '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)';\n\n // Prohibit any of \"@/[]()\" in user/pass to avoid wrong domain fetch.\n re.src_auth = '(?:(?:(?!' + re.src_ZCc + '|[@/\\\\[\\\\]()]).)+@)?';\n\n re.src_port =\n\n '(?::(?:6(?:[0-4]\\\\d{3}|5(?:[0-4]\\\\d{2}|5(?:[0-2]\\\\d|3[0-5])))|[1-5]?\\\\d{1,4}))?';\n\n re.src_host_terminator =\n\n '(?=$|' + text_separators + '|' + re.src_ZPCc + ')(?!-|_|:\\\\d|\\\\.-|\\\\.(?!$|' + re.src_ZPCc + '))';\n\n re.src_path =\n\n '(?:' +\n '[/?#]' +\n '(?:' +\n '(?!' + re.src_ZCc + '|' + text_separators + '|[()[\\\\]{}.,\"\\'?!\\\\-]).|' +\n '\\\\[(?:(?!' + re.src_ZCc + '|\\\\]).)*\\\\]|' +\n '\\\\((?:(?!' + re.src_ZCc + '|[)]).)*\\\\)|' +\n '\\\\{(?:(?!' + re.src_ZCc + '|[}]).)*\\\\}|' +\n '\\\\\"(?:(?!' + re.src_ZCc + '|[\"]).)+\\\\\"|' +\n \"\\\\'(?:(?!\" + re.src_ZCc + \"|[']).)+\\\\'|\" +\n \"\\\\'(?=\" + re.src_pseudo_letter + '|[-]).|' + // allow `I'm_king` if no pair found\n '\\\\.{2,4}[a-zA-Z0-9%/]|' + // github has ... in commit range links,\n // google has .... in links (issue #66)\n // Restrict to\n // - english\n // - percent-encoded\n // - parts of file path\n // until more examples found.\n '\\\\.(?!' + re.src_ZCc + '|[.]).|' +\n (opts && opts['---'] ?\n '\\\\-(?!--(?:[^-]|$))(?:-*)|' // `---` => long dash, terminate\n :\n '\\\\-+|'\n ) +\n '\\\\,(?!' + re.src_ZCc + ').|' + // allow `,,,` in paths\n '\\\\!(?!' + re.src_ZCc + '|[!]).|' +\n '\\\\?(?!' + re.src_ZCc + '|[?]).' +\n ')+' +\n '|\\\\/' +\n ')?';\n\n // Allow anything in markdown spec, forbid quote (\") at the first position\n // because emails enclosed in quotes are far more common\n re.src_email_name =\n\n '[\\\\-;:&=\\\\+\\\\$,\\\\.a-zA-Z0-9_][\\\\-;:&=\\\\+\\\\$,\\\\\"\\\\.a-zA-Z0-9_]*';\n\n re.src_xn =\n\n 'xn--[a-z0-9\\\\-]{1,59}';\n\n // More to read about domain names\n // http://serverfault.com/questions/638260/\n\n re.src_domain_root =\n\n // Allow letters & digits (http://test1)\n '(?:' +\n re.src_xn +\n '|' +\n re.src_pseudo_letter + '{1,63}' +\n ')';\n\n re.src_domain =\n\n '(?:' +\n re.src_xn +\n '|' +\n '(?:' + re.src_pseudo_letter + ')' +\n '|' +\n '(?:' + re.src_pseudo_letter + '(?:-|' + re.src_pseudo_letter + '){0,61}' + re.src_pseudo_letter + ')' +\n ')';\n\n re.src_host =\n\n '(?:' +\n // Don't need IP check, because digits are already allowed in normal domain names\n // src_ip4 +\n // '|' +\n '(?:(?:(?:' + re.src_domain + ')\\\\.)*' + re.src_domain/*_root*/ + ')' +\n ')';\n\n re.tpl_host_fuzzy =\n\n '(?:' +\n re.src_ip4 +\n '|' +\n '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))' +\n ')';\n\n re.tpl_host_no_ip_fuzzy =\n\n '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))';\n\n re.src_host_strict =\n\n re.src_host + re.src_host_terminator;\n\n re.tpl_host_fuzzy_strict =\n\n re.tpl_host_fuzzy + re.src_host_terminator;\n\n re.src_host_port_strict =\n\n re.src_host + re.src_port + re.src_host_terminator;\n\n re.tpl_host_port_fuzzy_strict =\n\n re.tpl_host_fuzzy + re.src_port + re.src_host_terminator;\n\n re.tpl_host_port_no_ip_fuzzy_strict =\n\n re.tpl_host_no_ip_fuzzy + re.src_port + re.src_host_terminator;\n\n\n ////////////////////////////////////////////////////////////////////////////////\n // Main rules\n\n // Rude test fuzzy links by host, for quick deny\n re.tpl_host_fuzzy_test =\n\n 'localhost|www\\\\.|\\\\.\\\\d{1,3}\\\\.|(?:\\\\.(?:%TLDS%)(?:' + re.src_ZPCc + '|>|$))';\n\n re.tpl_email_fuzzy =\n\n '(^|' + text_separators + '|\"|\\\\(|' + re.src_ZCc + ')' +\n '(' + re.src_email_name + '@' + re.tpl_host_fuzzy_strict + ')';\n\n re.tpl_link_fuzzy =\n // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n // but can start with > (markdown blockquote)\n '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_fuzzy_strict + re.src_path + ')';\n\n re.tpl_link_no_ip_fuzzy =\n // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n // but can start with > (markdown blockquote)\n '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_no_ip_fuzzy_strict + re.src_path + ')';\n\n return re;\n};\n","/*! https://mths.be/punycode v1.4.1 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see \n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t counter = 0,\n\t\t length = string.length,\n\t\t value,\n\t\t extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t// 0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t inputLength = input.length,\n\t\t out,\n\t\t i = 0,\n\t\t n = initialN,\n\t\t bias = initialBias,\n\t\t basic,\n\t\t j,\n\t\t index,\n\t\t oldi,\n\t\t w,\n\t\t k,\n\t\t digit,\n\t\t t,\n\t\t /** Cached calculation results */\n\t\t baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t delta,\n\t\t handledCPCount,\n\t\t basicLength,\n\t\t bias,\n\t\t j,\n\t\t m,\n\t\t q,\n\t\t k,\n\t\t t,\n\t\t currentValue,\n\t\t output = [],\n\t\t /** `inputLength` will hold the number of code points in `input`. */\n\t\t inputLength,\n\t\t /** Cached calculation results */\n\t\t handledCPCountPlusOne,\n\t\t baseMinusT,\n\t\t qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.4.1',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see \n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine('punycode', function() {\n\t\t\treturn punycode;\n\t\t});\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) {\n\t\t\t// in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else {\n\t\t\t// in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","// markdown-it default options\n\n'use strict';\n\n\nmodule.exports = {\n options: {\n html: false, // Enable HTML tags in source\n xhtmlOut: false, // Use '/' to close single tags (
              )\n breaks: false, // Convert '\\n' in paragraphs into
              \n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with )\n breaks: false, // Convert '\\n' in paragraphs into
              \n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with )\n breaks: false, // Convert '\\n' in paragraphs into
              \n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with {\n addPreferences();\n applyEditor();\n});\n\nexport * from '../common/index';\n","import { extend } from 'flarum/common/extend';\nimport FieldSet from 'flarum/common/components/FieldSet';\nimport Switch from 'flarum/common/components/Switch';\nimport SettingsPage from 'flarum/forum/components/SettingsPage';\nimport ItemList from 'flarum/common/utils/ItemList';\n\nexport default function addPreferences() {\n extend(SettingsPage.prototype, 'settingsItems', function (items) {\n items.add(\n 'composer',\n FieldSet.component(\n {\n label: app.translator.trans('askvortsov-rich-text.forum.settings.composer_heading'),\n className: 'Settings-composer',\n },\n this.composerItems().toArray()\n )\n );\n });\n\n SettingsPage.prototype['composerItems'] = function () {\n const items = new ItemList();\n\n items.add(\n 'useRichTextEditor',\n Switch.component(\n {\n state: this.user.preferences().useRichTextEditor,\n onchange: (value) => {\n this.useRichTextEditorLoading = true;\n\n this.user.savePreferences({ useRichTextEditor: value }).then(() => {\n this.useRichTextEditorLoading = false;\n m.redraw();\n });\n },\n loading: this.useRichTextEditorLoading,\n },\n app.translator.trans('askvortsov-rich-text.forum.settings.use_rich_text_editor_label')\n )\n );\n\n items.add(\n 'richTextCompactParagraphs',\n Switch.component(\n {\n state: this.user.preferences().richTextCompactParagraphs,\n onchange: (value) => {\n this.richTextCompactParagraphsLoading = true;\n\n this.user.savePreferences({ richTextCompactParagraphs: value }).then(() => {\n this.richTextCompactParagraphsLoading = false;\n m.redraw();\n });\n },\n loading: this.richTextCompactParagraphsLoading,\n },\n app.translator.trans('askvortsov-rich-text.forum.settings.rich_text_compact_paragraphs_label')\n )\n );\n\n return items;\n };\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://@askvortsov/flarum-rich-text/webpack/bootstrap","webpack://@askvortsov/flarum-rich-text/./node_modules/orderedmap/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-model/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-state/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-commands/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/tiptap-commands/dist/commands.esm.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-transform/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/utils.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-inputrules/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@askvortsov/flarum-rich-text/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-markdown/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-schema-list/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Tooltip']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/CommandButton.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/extractText']\"","webpack://@askvortsov/flarum-rich-text/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@askvortsov/flarum-rich-text/./node_modules/tiptap-utils/dist/utils.esm.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/MarkButton.js","webpack://@askvortsov/flarum-rich-text/./node_modules/w3c-keyname/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-keymap/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/ItemList']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/Stream']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Button']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/helpers/icon']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Dropdown']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/SafariModalHack.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/FormDropdown.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/extend']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/ListButton.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/TextEditor']\"","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/MarkdownSerializerBuilder.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/SchemaBuilder.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/Component']\"","webpack://@askvortsov/flarum-rich-text/./src/common/components/NodeTypeDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/InsertImageDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/states/MenuState.js","webpack://@askvortsov/flarum-rich-text/./node_modules/rope-sequence/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-history/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-view/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-dropcursor/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./node_modules/prosemirror-gapcursor/dist/index.es.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/disableBase64PastePlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/toggleSpoiler.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/inputrules.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/ProseMirrorEditorDriver.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/placeholderPlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/menuPlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/key-bindings.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/plugins/disabledPlugin.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/altText.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/blockSpoiler.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/inlineSpoilerBars.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/markdown-it/inlineSpoilerTags.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/MarkdownParserBuilder.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/HiddenItemsDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/ProseMirrorMenu.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/insertHr.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/InsertLinkDropdown.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/insertLink.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/P/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/ruler.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/token.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/entities.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/properties/Any/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/Cc/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/Z/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/html_re.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/strikethrough.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/emphasis.js","webpack://@askvortsov/flarum-rich-text/./src/common/components/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/commands/updateToggleMark.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/proseMirror/markdown/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/states/index.js","webpack://@askvortsov/flarum-rich-text/./src/common/applyEditor.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/utils/classList']\"","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it-sub/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it-sup/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it-latex2img/index.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Modal']\"","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/encode.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/decode.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/format.js","webpack://@askvortsov/flarum-rich-text/./node_modules/mdurl/parse.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/uc.micro/categories/Cf/regex.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/parse_link_label.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/parse_link_destination.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/helpers/parse_link_title.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/renderer.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/parser_core.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/normalize.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/linkify.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/replacements.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/smartquotes.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_core/state_core.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/parser_block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/table.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/code.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/fence.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/blockquote.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/hr.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/list.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/reference.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/heading.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/lheading.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/html_block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/common/html_blocks.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/paragraph.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_block/state_block.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/parser_inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/text.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/newline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/escape.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/backticks.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/link.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/image.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/autolink.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/html_inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/entity.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/balance_pairs.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/text_collapse.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/rules_inline/state_inline.js","webpack://@askvortsov/flarum-rich-text/./node_modules/linkify-it/index.js","webpack://@askvortsov/flarum-rich-text/./node_modules/linkify-it/lib/re.js","webpack://@askvortsov/flarum-rich-text/./node_modules/node-libs-browser/node_modules/punycode/punycode.js","webpack://@askvortsov/flarum-rich-text/(webpack)/buildin/module.js","webpack://@askvortsov/flarum-rich-text/(webpack)/buildin/global.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/presets/default.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/presets/zero.js","webpack://@askvortsov/flarum-rich-text/./node_modules/markdown-it/lib/presets/commonmark.js","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/Switch']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['forum/components/SettingsPage']\"","webpack://@askvortsov/flarum-rich-text/external \"flarum.core.compat['common/components/FieldSet']\"","webpack://@askvortsov/flarum-rich-text/./src/forum/index.js","webpack://@askvortsov/flarum-rich-text/./src/forum/addPreferences.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","OrderedMap","content","this","constructor","find","length","found","undefined","update","newKey","self","remove","slice","push","splice","addToStart","concat","addToEnd","addBefore","place","without","forEach","f","prepend","map","from","size","subtract","append","result","prop","Fragment","nodeSize","prototypeAccessors","firstChild","configurable","lastChild","childCount","nodesBetween","to","nodeStart","parent","pos","child","end","start","Math","max","min","descendants","textBetween","blockSeparator","leafText","text","separated","node","isText","isLeaf","isBlock","other","last","first","sameMarkup","withText","cut","cutByIndex","empty","replaceChild","index","current","copy","eq","RangeError","maybeChild","findDiffStart","a","b","childA","childB","j","inner","findDiffEnd","otherPos","posA","posB","iA","iB","same","minSize","findIndex","round","retIndex","curPos","toString","toStringInner","join","toJSON","fromJSON","schema","Array","isArray","nodeFromJSON","fromArray","array","joined","nodes","attrs","defineProperties","offset","compareDeep","p$1","Mark","type","ReplaceError","message","err","Error","__proto__","addToSet","set","placed","excludes","rank","removeFromSet","isInSet","obj","_","json","marks","sameSet","setFrom","none","sort","Slice","openStart","openEnd","prototypeAccessors$1","replace","$from","$to","depth","replaceOuter","ref","$along","extra","resolveNoCache","prepareSliceForReplace","replaceThreeWay","$start","$end","joinable","addRange","checkJoin","addNode","replaceTwoWay","parentOffset","main","sub","compatibleContent","$before","$after","target","startIndex","endIndex","textOffset","nodeAfter","nodeBefore","validContent","insertAt","fragment","insertInto","dist","insert","canReplace","removeBetween","removeRange","ref$1","indexTo","offsetTo","maxOpen","openIsolating","spec","isolating","n$1","ResolvedPos","path","prototypeAccessors$2","doc","resolveDepth","val","indexAfter","before","after","dOff","posAtIndex","tmp","inclusive","marksAcross","isInline","next","sharedDepth","blockRange","pred","inlineContent","NodeRange","sameParent","str","resolve","rem","resolveCached","resolveCache","cached","resolveCachePos","resolveCacheSize","prototypeAccessors$1$1","emptyAttrs","Node","prototypeAccessors$3","textContent","isTextblock","isAtom","startPos","hasMarkup","defaultAttrs","mark","includeParents","nodeAt","childAfter","childBefore","rangeHasMark","toDebugString","wrapMarks","contentMatchAt","match","contentMatch","matchFragment","replacement","one","two","validEnd","allowsMarks","canReplaceWith","matchType","canAppend","check","markFromJSON","nodeType","TextNode","JSON","stringify","base","ContentMatch","wrapCache","prototypeAccessors$4","defaultType","edgeCount","parse","string","nodeTypes","stream","TokenStream","expr","parseExpr","nfa","labeled","explore","states","out","term","known","indexOf","nullFrom","state","states$1","cmp","dfa","connect","compile","exprs","reduce","loop","edge","loop$1","cur","i$1","next$1","i$2","next$2","edges","work","dead","hasRequiredAttrs","checkForDeadEnds","frag","compatible","fillBefore","toEnd","seen","search","types","finished","tp","createAndFill","findWrapping","computed","computeWrapping","active","via","shift","reverse","scan","inline","tokens","split","pop","prototypeAccessors$1$2","parseExprSeq","eat","parseExprSubscript","test","typeName","type$1","groups","resolveName","parseExprAtom","parseExprRange","parseNum","Number","defaults","attrName","attr","hasDefault","default","computeAttrs","built","given","initAttrs","Attribute","tok","SyntaxError","NodeType","group","markSet","prototypeAccessors$5","atom","isRequired","createChecked","allowsMarkType","markType","allowedMarks","topType","topNode","options","prototypeAccessors$1$3","MarkType","excluded","instance","contentExprCache","prop$1","contentExpr","markExpr","gatherMarks","prop$2","excl","topNodeType","wrappings","ok","mark$1","text$1","DOMParser","rules","this$1","tags","styles","rule","tag","style","normalizeLists","some","dom","context","ParseContext","addAll","finish","parseSlice","matchTag","matches","namespace","namespaceURI","matchesContext","getAttrs","matchStyle","charCodeAt","schemaRules","priority","parseDOM","rules$1","name$1","fromSchema","domParser","blockTags","address","article","aside","blockquote","canvas","dd","div","dl","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","noscript","ol","output","pre","section","table","tfoot","ul","ignoreTags","head","script","title","listTags","wsOptionsFor","preserveWhitespace","NodeContext","pendingMarks","solid","activeMarks","stashMarks","fill","wrap","exec","popFromStashMark","applyPending","nextType","pending","markMayApply","parser","open","isOpen","topContext","topOptions","topMatch","findPositions","needsBlock","prototypeAccessors$6","top","currentPos","selector","msMatchesSelector","webkitMatchesSelector","mozMatchesSelector","v","returned","addDOM","addTextNode","getAttribute","readStyles","re","trim","parseStyles","addPendingMark","addElement","removePendingMark","nodeValue","domNodeBefore","previousSibling","nodeName","insertNode","findInText","findInside","matchAfter","ruleID","toLowerCase","prevItem","nextSibling","appendChild","normalizeList","ruleFromNode","ignore","skip","closeParent","sync","oldNeedsBlock","leafFallback","addElementByRule","consuming","ownerDocument","createTextNode","continueAfter","enter","startIn","getContent","contentDOM","contentElement","querySelector","findAround","childNodes","findAtPoint","findPlace","route","cx","enterInner","block","textblockFromContext","closeExtra","preserveWS","topOpen","contains","compareDocumentPosition","textNode","parts","option","useRoot","minDepth","part","$context","deflt","findSameMarkInSet","upto","level","lastIndexOf","stashMark","DOMSerializer","gatherToDOM","toDOM","document","window","serializeFragment","createDocumentFragment","keep","rendered","spanning","add","markDOM","serializeMark","serializeNode","renderSpec","onContent","serializeNodeAndMarks","structure","xmlNS","tagName","space","createElementNS","createElement","space$1","setAttributeNS","setAttribute","innerContent","domSerializer","nodesFromSchema","marksFromSchema","classesById","Selection","$anchor","$head","ranges","SelectionRange","anchor","tr","lastNode","lastParent","mapFrom","steps","mapping","replaceRange","selectionToInsertionEnd","replaceWith","deleteRange","replaceRangeWith","findFrom","$pos","dir","textOnly","TextSelection","findSelectionIn","near","bias","AllSelection","atStart","atEnd","cls","jsonID","id","selectionClass","getBookmark","between","visible","$cursor","ensureMarks","TextBookmark","dPos","NodeSelection","mapResult","deleted","NodeBookmark","isSelectable","selectable","delete","sel","selection","setSelection","AllBookmark","startLen","step","maps","_from","_to","_newFrom","newTo","Transaction","Transform","time","Date","now","curSelection","curSelectionFor","storedMarks","updated","meta","selectionSet","storedMarksSet","isGeneric","scrolledIntoView","setStoredMarks","addStoredMark","removeStoredMark","addStep","setTime","replaceSelection","replaceSelectionWith","inheritMarks","deleteSelection","insertText","setMeta","getMeta","scrollIntoView","FieldDesc","desc","init","apply","baseFields","config","_marks","_old","prev","Configuration","plugins","fields","pluginsByKey","plugin","EditorState","applyTransaction","filterTransaction","rootTr","transactions","trs","newState","applyInner","haveNew","appendTransaction","oldState","newInstance","field","applyListeners","$config","reconfigure","pluginFields","addApplyListener","removeApplyListener","Plugin","props","bindProps","Function","createKey","getState","keys","PluginKey","dispatch","textblockAt","side","findCutBefore","findCutAfter","newlineInCode","code","defaultBlockAt","exitCode","above","splitBlock","can","setNodeMarkup","deleteBarrier","$cut","conn","clearIncompatible","joinMaybeClear","canDelAfter","joinAt","selAfter","range","lift","at","wrap$1","end$1","wrapIn","wrapping","setBlockType","applicable","toggleMark","markApplies","has","ref$2","$from$1","$to$1","removeMark","spaceStart","spaceEnd","addMark","chainCommands","commands","len","arguments","view","backspace","endOfTextblock","del","pcBaseKeymap","macBaseKeymap","baseKeymap","navigator","platform","os","markInputRule","regexp","markEnd","markStart","matchStart","matchEnd","textStart","textEnd","getMarksBetween","filter","item","nodeInputRule","toggleBlockType","toggletype","isList","bullet_list","ordered_list","todo_list","toggleList","listType","itemType","parentList","toggleWrap","updateMark","factor16","pow","recoverIndex","MapResult","recover","StepMap","inverted","diff","recoverOffset","assoc","_map","simple","oldIndex","newIndex","oldSize","newSize","touches","oldStart","newStart","invert","Mapping","mirror","TransformError","appendMap","mirrors","setMirror","appendMapping","startSize","mirr","getMirror","appendMappingInverted","totalSize","inverse","corr","docs","docChanged","mustOverride","maybeStep","failed","getMap","stepsByID","Step","_doc","_mapping","merge","_other","stepType","stepClass","StepResult","fail","fromReplace","e","ReplaceStep","contentBetween","slice$1","ReplaceAroundStep","gapFrom","gapTo","gap","inserted","canCut","liftTarget","innerRange","around","outer","findWrappingOutside","inside","innerMatch","findWrappingInside","withAttrs","canSplit","typesAfter","innerType","index$1","rest","baseType","canJoin","joinPoint","dropPoint","pass","insertPos","mapFragment","mapped","gapStart","gapEnd","splitting","d$1","splitting$1","wrappers","canChangeType","startM","endM","newNode","typeAfter","AddMarkStep","oldSlice","RemoveMarkStep","fitsTrivially","removed","added","removing","adding","newSet","matched","toRemove","found$1","parentType","delSteps","allowed","Fitter","fit","replaceStep","unplaced","frontier","dropFromFragment","count","addToFragment","contentAt","closeNodeStart","contentAfterFits","invalidMarks","closeFragment","oldOpen","newOpen","coveredDepths","findFittable","placeNodes","openMore","dropNode","moveInline","mustMoveInline","placedSize","close","sliceDepth","frontierDepth","inject","openAtEnd","closeFrontierNode","openFrontierNode","taken","openEndCount","findCloseLevel","dropInner","match$1","move","targetDepths","preferredTarget","unshift","defining","preferredTargetIndex","leftNodes","preferredDepth","openDepth","targetDepth","expand","startSteps","point","insertPoint","covered","_hasOwnProperty","isValidEntityCode","fromCodePoint","surrogate1","surrogate2","String","fromCharCode","UNESCAPE_MD_RE","UNESCAPE_ALL_RE","RegExp","source","DIGITAL_ENTITY_TEST_RE","entities","HTML_ESCAPE_TEST_RE","HTML_ESCAPE_REPLACE_RE","HTML_REPLACEMENTS","replaceUnsafeChar","ch","REGEXP_ESCAPE_RE","UNICODE_PUNCT_RE","lib","mdurl","ucmicro","assign","sources","TypeError","isString","_class","unescapeMd","unescapeAll","escaped","entity","parseInt","replaceEntityPattern","escapeHtml","arrayReplaceAt","src","newElements","isSpace","isWhiteSpace","isMdAsciiPunct","isPunctChar","escapeRE","normalizeReference","toUpperCase","InputRule","handler","cutOff","inputRules","stored","handleTextInput","run","handleDOMEvents","compositionend","setTimeout","isInputRules","composing","textBefore","transform","undoInputRule","undoable","toUndo","ellipsis","wrappingInputRule","joinPredicate","textblockTypeInputRule","_setPrototypeOf","setPrototypeOf","_inheritsLoose","subClass","superClass","paragraph","horizontal_rule","heading","code_block","params","order","tight","hasAttribute","list_item","image","alt","draggable","hard_break","em","strong","link","href","MarkdownParseState","tokenHandlers","stack","token","noCloseToken","withoutTrailingNewline","noOp","elt","addText","merged","maybeMerge","openMark","closeMark","parseTokens","toks","openNode","closeNode","info","MarkdownParser","tokenizer","handlers","nodeType$1","children","softbreak","listIsTight","hidden","defaultMarkdownParser","html","attrGet","fence","hardbreak","code_inline","MarkdownSerializer","serialize","MarkdownSerializerState","renderContent","defaultMarkdownSerializer","wrapBlock","write","ensureNewLine","closeBlock","repeat","renderInline","markup","renderList","bullet","maxW","nStr","esc","quote","mixable","expelEnclosingWhitespace","_state","isPlainURL","_mark","backticksFor","escape","ticks","delim","closed","inTightList","tightLists","flushClose","atBlank","delimMin","firstDelim","old","lines","startOfLine","render","trailing","progress","leading","lead","inner$1","trail","noEsc","markString","isTight","prevTight","getEnclosingWhitespace","wrapInList","doJoin","outerRange","$insert","joinBefore","splitDepth","splitPos","doWrapInList","splitListItem","grandParent","keepItem","tr$1","liftListItem","endOfList","liftToOuterList","list","indexBefore","liftOutOfList","sinkListItem","nestedBefore","flarum","core","compat","CommandButton","oninit","vnode","addItem","command","onEditorUpdate","extractText","tooltip","className","onclick","click","onkeydown","keydown","icon","preventDefault","app","translator","trans","Component","_extends","findParentNode","predicate","findParentNodeClosestToPos","findSelectedNodeOfType","isNodeSelection","equalNodeType","getMarkAttrs","markItem","getMarkRange","endPos","markIsActive","nodeIsActive","MarkButton","$","toggleClass","markActive","8","9","10","12","13","16","17","18","20","27","32","33","34","35","36","37","38","39","40","44","45","46","59","61","91","92","106","107","108","109","110","111","144","145","160","161","162","163","164","165","173","186","187","188","189","190","191","192","219","220","221","222","229","48","49","50","51","52","53","54","55","56","57","chrome","userAgent","safari","vendor","gecko","mac","ie","brokenModifierNames","normalizeKeyName","ctrl","mod","modifiers","event","altKey","ctrlKey","metaKey","shiftKey","keymap","bindings","handleKeyDown","keydownHandler","normalize","baseName","keyCode","keyName","isChar","direct","fromCode","withShift","SafariModalHack","oncreate","on","modal","onsubmit","vnodeContent","Modal","FormDropdown","buttonClassName","is","show","toArray","stopPropagation","focus","select","getButtonContent","getMenu","items","ItemList","trigger","composer","editor","Dropdown","ListButton","nodeActive","genMarkupAwareMarkConfig","error","MarkdownSerializerBuilder","buildNodes","spoiler","math_block","buildMarks","spoiler_inline","strike","sup","math_inline","build","genHtmlInlineMarkSpec","spoilerNodeSpec","class","mathBlockNodeSpec","SchemaBuilder","Schema","NodeTypeDropdown","getNodeTypeButtons","getButton","data-toggle","activeIndex","element","innerText","InsertImageDropdown","Stream","placeholder","bidi","required","MenuState","attachEditorView","editorView","getSchema","destroy","markAttrs","selectionEmpty","transaction","RopeSequence","leafAppend","leafPrepend","appendInner","Append","sliceInner","getInner","forEachInner","forEachInvertedInner","values","Leaf","flatten","left","right","leftLen","Branch","eventCount","popEvent","preserveItems","remap","remapping","remaining","addAfter","Item","addTransform","histOptions","newItems","oldItems","lastItem","cutPoint","overflow","DEPTH_OVERFLOW","mirrorPos","mirrorOffset","addMaps","rebased","rebasedTransform","rebasedCount","rebasedItems","newUntil","iRebased","newMaps","branch","emptyItemCount","compress","events","newItem","HistoryState","done","undone","prevRanges","prevTime","rangesFor","mapRanges","histTransaction","history","redo","mustPreserveItems","historyKey","newHist","historyState","cachedPreserveItems","cachedPreserveItemsPlugins","historyPreserveItems","closeHistoryKey","newGroupDelay","hist","historyTr","appended","newGroup","adjacent","isAdjacentTo","undo","ie_edge","ie_upto10","ie_11up","ie_version","documentMode","gecko_version","chrome_version","ios","maxTouchPoints","android","webkit","documentElement","webkit_version","domIndex","parentNode","host","reusedRange","textRange","createRange","setEnd","setStart","isEquivalentPosition","off","targetNode","targetOff","scanFor","atomElements","hasBlockDesc","contentEditable","pmViewDesc","selectionCollapsed","domSel","collapsed","isCollapsed","rangeCount","getRangeAt","keyEvent","createEvent","initEvent","windowRect","clientWidth","bottom","clientHeight","getSide","clientRect","rect","getBoundingClientRect","scrollRectIntoView","startDOM","scrollThreshold","someProp","scrollMargin","atTop","body","bounding","moveX","moveY","defaultView","scrollBy","startX","scrollLeft","startY","scrollTop","dX","dY","scrollStack","restoreScrollStack","dTop","preventScrollSupported","findOffsetInNode","coords","closest","coordsClosest","dxClosest","rowBot","rowTop","childIndex","rects","getClientRects","dx","singleRect","inRect","findOffsetInText","posAtCoords","assign$1","root","caretPositionFromPoint","pos$1","offsetNode","caretRangeFromPoint","startContainer","startOffset","elementFromPoint","box","startI","floor","targetKludge","box$1","outside","docView","nearestDesc","posBefore","posAfter","posFromDOM","posFromCaret","posFromElement","posAtStart","border","BIDI","coordsAtPos","domFromPos","supportEmptyRange","takeSide","flattenV","rectBefore","rectAfter","flattenH","before$1","after$1","target$1","width","x","height","y","withFlushedState","viewState","activeElement","updateState","maybeRTL","cachedState","cachedDir","cachedResult","nearest","boxes","endOfTextblockVertical","getSelection","modify","oldRange","oldNode","focusNode","oldOff","focusOffset","oldBidiLevel","caretBidiLevel","domAfterPos","removeAllRanges","endOfTextblockHorizontal","dirty","beforePosition","posAtEnd","contentLost","domAtom","matchesWidget","matchesMark","matchesNode","matchesHack","parseRule","stopEvent","posBeforeChild","localPosFromDOM","domBefore","domAfter","desc$1","search$1","onlyNodes","getDesc","nodeDOM","descAt","parseRange","fromOffset","toOffset","childBase","emptyChildAt","j$1","force","anchorDOM","headDOM","brKludge","offset$1","anchorNode","anchorOffset","domSelExtended","extend","collapse","DOMException","ignoreMutation","mutation","markDirty","startInside","endInside","markParentsDirty","nothing","WidgetViewDesc","ViewDesc","widget","raw","classList","stop","ignoreSelection","CompositionViewDesc","textDOM","mut","oldValue","MarkViewDesc","custom","nodeViews","replaceNodes","NodeViewDesc","outerDeco","innerDeco","updateChildren","descObj","applyOuterDeco","CustomNodeViewDesc","TextViewDesc","reparseInView","sameOuterDeco","composition","localCompositionNode","updater","ViewTreeUpdater","deco","onWidget","onNode","locals","forChild","decoIndex","restNode","parentIndex","widgets","compareSide","child$1","cutAt","i$3","iterDeco","insideNode","syncToMarks","placeWidget","findNodeMatch","updateNextNode","addTextblockHacks","destroyRest","changed","protectLocalComposition","renderDescs","parentDOM","descs","written","childDOM","rm","insertBefore","trackWrites","oldCSS","cssText","getComputedStyle","listStyle","iosHacks","nearbyTextNode","textPos","childStart","findTextInFragment","removeChild","compositionNodes","updateInner","updateOuterDeco","needsWrap","oldDOM","patchOuterDeco","computeOuterDeco","selectNode","deselectNode","removeAttribute","docViewDesc","pmIsDeco","inParent","BRHackViewDesc","OuterDecoLevel","noDeco","outerDOM","prevComputed","curComputed","curDOM","patchAttributes","prevList","curList","removeProperty","lockedNode","lock","preMatch","preMatched","preMatchOffset","selectionFromDOM","origin","inWidget","isOnEdge","selectionBetween","selectionToDOM","syncNodeSelection","editable","hasFocus","hasSelection","domObserver","disconnectSelection","cursorWrapper","img","disabled","selectCursorWrapper","resetEditableFrom","resetEditableTo","brokenSelectBetweenUneditable","temporarilyEditableNear","resetEditable","removeEventListener","hideSelectionGuard","addEventListener","removeClassOnSelectionChange","setCurSelection","connectSelection","getPreMatch","destroyBetween","maxKeep","markDesc","nextDOM","setEditable","wasDraggable","lastSelectedViewDesc","clearNodeSelection","moveSelectionBlock","$side","selectHorizontally","mods","nodePos","nodeLen","isIgnorable","skipIgnoredNodesLeft","moveNode","moveOffset","isBlockNode","setSelFocus","skipIgnoredNodesRight","selectVertically","beyond","stopNativeHorizontalDelete","nextNode","switchEditable","captureKeyDown","getMods","safariDownArrowBug","readDOMChange","typeOver","addedNodes","lastSelectionTime","lastSelectionOrigin","newSel","shared","from_","to_","lastKeyCode","startDoc","editableContent","anchor$1","parseBetween","preferredPos","preferredSide","compare","lastKeyCodeTime","change","endA","endB","adjust","findDiff","lastIOSEnter","sel$1","resolveSelection","domChangeCount","nextSel","inlineChange","$newStart","$newEnd","skipClosingAndOpening","$next","looksLikeJoin","suppressSelectionUpdates","markChange","$from1","chFrom","chTo","curMarks","prevMarks","isMarkChange","sel$2","parsedSel","fromEnd","mayOpen","serializeForClipboard","serializer","detachedDoc","wrapMap","wrapper","parseFromClipboard","plainText","inCode","asText","parsed","metas","firstTag","innerHTML","readHTML","contextNode","sliceData","addContext","closeRange","closeSlice","lastWrap","inLast","addToSibling","sibling","withWrappers","closeRight","wrapped","normalizeSiblings","thead","tbody","caption","colgroup","col","td","th","_detachedDoc","implementation","createHTMLDocument","observeOptions","childList","characterData","characterDataOldValue","attributes","attributeOldValue","subtree","useCharData","SelectionState","DOMObserver","handleDOMChange","queue","flushingSoon","observer","MutationObserver","mutations","removedNodes","flushSoon","flush","currentSelection","onCharData","prevValue","onSelectionChange","suppressingSelectionUpdates","forceFlush","clearTimeout","observe","take","takeRecords","disconnect","ignoreSelectionChange","container","commonAncestorContainer","result$1","registerMutation","brs","cssChecked","whiteSpace","console","checkCSS","attributeName","editHandlers","setSelectionOrigin","ensureListeners","currentHandlers","eventHandlers","runCustomHandler","defaultPrevented","eventCoords","clientX","clientY","runHandlerOnContext","propName","updateSelection","focused","handleSingleClick","selectedNode","selectAt","selectClickedNode","selectClickedLeaf","handleDoubleClick","handleTripleClick","defaultTripleClick","forceDOMFlush","endComposition","inOrNearComposition","lastIOSEnterFallbackTimeout","keyup","keypress","charCode","selectNodeModifier","mousedown","flushed","lastClick","dy","isNear","mouseDown","targetPos","allowDefault","mightDrag","targetDesc","addAttr","setUneditable","up","abs","timeStamp","compositionEndedAt","touchdown","contextmenu","timeoutComposition","scheduleComposeEnd","delay","composingTimeout","clearComposition","forceUpdate","compositionstart","compositionupdate","markCursor","brokenClipboardAPI","doPaste","singleNode","sliceSingleNode","data","clipboardData","clearData","setData","selectNodeContents","blur","captureCopy","paste","getData","capturePaste","Dragging","dragCopyModifier","dragstart","dataTransfer","dragging","dragend","dragover","dragenter","drop","eventPos","$mouse","isNode","beforeInsert","beforeinput","inputType","compareObjs","WidgetType","noSpec","span","oldOffset","Decoration","valid","InlineType","inclusiveStart","inclusiveEnd","DecorationSet","local","decorations","buildTree","findInner","childOff","mapInner","newLocal","onRemove","oldChildren","oldEnd","newEnd","dSize","mustRebuild","fromLocal","toLocal","childOffset","childNode","gather","mapAndGatherRemainingDecorations","from$1","byPos","mapChildren","addInner","baseOffset","takeSpansForNode","moveSpans","withoutNulls","removeInner","span$1","dec","localSet","DecorationGroup","removeOverlap","localsInner","members","spans","hasNulls","localStart","working","insertAhead","viewDecorations","sorted","EditorView","_props","_root","mount","mounted","getEditable","updateCursorWrapper","buildNodeViews","computeDocDeco","bubbles","eventBelongsToView","initInput","pluginViews","updatePluginViews","contenteditable","updateStateInner","setProps","reconfigured","redraw","updateSel","nA","nB","changedNodeViews","scroll","scrollToSelection","updateDoc","sel1","sel2","refDOM","refTop","newRefTop","oldScrollPos","overflowAnchor","innerHeight","localRect","storeScrollPos","forceSelUpdate","chromeKludge","destroyPluginViews","prevState","pluginView","setActive","preventScroll","focusPreventScroll","getPrototypeOf","domAtPos","posAtDOM","destroyInput","dispatchEvent","dispatchTransaction","DropCursorView","color","cursorPos","timeout","updateOverlay","setCursor","nodeRect","parentLeft","parentTop","offsetParent","position","pageXOffset","pageYOffset","rect$1","scheduleRemoval","dragleave","relatedTarget","GapCursor","GapBookmark","closedBefore","closedAfter","override","allowGapCursor","mustMove","$cur","$cur$1","arrow","axis","dirStr","$found","handleClick","drawGapCursor","dataImageRegex","onClick","orderedListRule","bulletListRule","codeBlockRule","headingRule","maxLevel","blockSpoilerRule","ProseMirrorEditorDriver","MarkdownParserBuilder","buildEditorStateConfig","buildEditorProps","classNames","callInputListeners","inputListeners","listener","oninput","onkeyup","parseInitialValue","buildPluginItems","menuState","buildInputRules","Escape","insertHardBreak","enterCommands","emojiDropdown","mentionsDropdown","session","user","preferences","richTextCompactParagraphs","handleEnter","Backspace","Enter","richTextKeymap","disabled$","curr","transformPastedHTML","parseFromString","querySelectorAll","outerHTML","createSelectionBetween","_view","handleClickOn","handleDoubleClickOn","newDoc","newDocPlaintext","serializeContent","moveCursorTo","setSelectionRange","getSelectionRange","getLastNChars","insertAtCursor","insertBetween","trailingNewLines","endsWith","replaceBeforeCursor","getCaretCoordinates","viewportCoords","editorViewportOffset","isTerminatorChar","tokenize","silent","posMax","md","ruler","disable","blockquoteExt","startLine","endLine","adjustTab","initial","lastLineEmpty","nextLine","oldBMarks","oldBSCount","oldIndent","oldParentType","oldSCount","oldTShift","spaceAfterMarker","terminate","terminatorRules","wasOutdented","oldLineMax","lineMax","bMarks","tShift","eMarks","sCount","blkIndent","followingCharRegex","bsCount","foundExclamation","foundOpen","oldPos","getRules","line","spoilerFn","blockquoteFn","blockSpoiler","__rules__","bqIndex","postProcess","delimiters","loneMarkers","startDelim","marker","endDelim","tokenO","nesting","tokenC","frontPriorMode","scanned","scanDelims","isOdd","jump","can_open","can_close","ruler2","tokens_meta","tokenizerParams","buildTokenizer","markdownit","enable","use","altText","latexPlugin","subPlugin","supPlugin","inlineSpoilerBars","inlineSpoilerTags","buildTokens","HiddenItemsDropdown","buttons","button","ProseMirrorMenu","modifierKey","component","InsertLinkDropdown","hiddenItems","linkAttrs","Ruler","__cache__","__find__","__compile__","chains","enabled","altName","chain","fn","opt","beforeName","ruleName","afterName","ignoreInvalid","idx","enableOnly","chainName","Token","attrIndex","attrPush","attrData","attrSet","attrJoin","encode","decode","format","open_tag","close_tag","HTML_TAG_RE","HTML_OPEN_CLOSE_TAG_RE","isStrong","components","updateToggleMark","proseMirror","markdown","applyEditor","TextEditor","forum","attribute","Button","useRichTextEditor","savePreferences","then","buildEditor","original","buildEditorParams","UNESCAPE_RE","subscript","skipToken","superscript","isValidDelim","prevChar","nextChar","res","firstLine","lastLine","lastPos","getLines","server","purifiedURL","latex","encodeURIComponent","renderer","Inline","Block","utils","helpers","Renderer","ParserCore","ParserBlock","ParserInline","LinkifyIt","punycode","zero","commonmark","BAD_PROTO_RE","GOOD_DATA_RE","validateLink","url","RECODE_HOSTNAME_FOR","normalizeLink","hostname","protocol","toASCII","er","normalizeLinkText","toUnicode","MarkdownIt","presetName","linkify","configure","presets","rules2","missed","args","env","State","process","parseInline","inlineMode","encodeCache","exclude","keepEscaped","nextCode","cache","defaultChars","getEncodeCache","componentChars","decodeCache","getDecodeCache","seq","b1","b2","b3","b4","chr","slashes","auth","port","pathname","hash","Url","protocolPattern","portPattern","simplePathPattern","unwise","autoEscape","nonHostChars","hostEndingChars","hostnamePartPattern","hostnamePartStart","hostlessProtocol","slashedProtocol","slashesDenoteHost","lowerProto","hec","simplePath","proto","substr","atSign","hostEnd","parseHost","ipv6Hostname","hostparts","newpart","k","validParts","notHost","bit","qm","u","Any","Cc","Cf","P","Z","parseLinkLabel","parseLinkDestination","parseLinkTitle","disableNested","prevPos","labelEnd","default_rules","slf","renderAttrs","highlighted","tmpAttrs","tmpToken","langName","highlight","langPrefix","renderInlineAsText","renderToken","xhtmlOut","breaks","html_block","html_inline","nextToken","needLf","_rules","Core","NEWLINES_RE","NULL_RE","isLinkClose","currentToken","ln","htmlLinkLevel","fullUrl","urlText","links","blockTokens","pretest","lastIndex","RARE_RE","SCOPED_ABBR_TEST_RE","SCOPED_ABBR_RE","SCOPED_ABBR","tm","replaceFn","replace_scoped","inlineTokens","inside_autolink","replace_rare","blkIdx","typographer","QUOTE_TEST_RE","QUOTE_RE","replaceAt","process_inlines","thisLevel","lastChar","isLastPunctChar","isNextPunctChar","isLastWhiteSpace","isNextWhiteSpace","canOpen","canClose","isSingle","openQuote","closeQuote","OUTER","single","quotes","StateCore","hasEmptyLines","maxNesting","skipEmptyLines","isEmpty","outTokens","getLine","escapedSplit","escapes","backTicked","lastBackTick","substring","lineText","columns","columnCount","aligns","tableLines","tbodyLines","mem","haveEndMarker","skipChars","skipSpaces","cnt","skipBulletListMarker","skipOrderedListMarker","contentStart","indent","indentAfterMarker","isOrdered","itemLines","listLines","listTokIdx","markerCharCode","markerValue","oldListIndent","oldTight","posAfterMarker","prevEmptyEnd","isTerminatingParagraph","listIndent","markTightParagraphs","_endLine","destEndPos","destEndLineNo","label","references","skipSpacesBack","skipCharsBack","block_names","HTML_SEQUENCES","StateBlock","indent_found","ddIndent","begin","keepLastLF","lineIndent","lineStart","_rules2","pushPending","pmax","ESCAPED","labelStart","parseReference","EMAIL_RE","AUTOLINK_RE","tail","linkMatch","emailMatch","lc","isLetter","DIGITAL_RE","NAMED_RE","processDelimiters","closerIdx","openerIdx","closer","opener","minOpenerIdx","newMinOpenerIdx","isOddMatch","lastJump","openersBottom","StateInline","pendingLevel","_prev_delimiters","token_meta","canSplitWord","left_flanking","right_flanking","isFunction","defaultOptions","fuzzyLink","fuzzyEmail","fuzzyIP","defaultSchemas","validate","http","src_auth","src_host_port_strict","src_path","no_http","src_domain","src_domain_root","src_port","src_host_terminator","mailto","src_email_name","src_host_strict","tlds_default","__opts__","tlds","__tlds__","untpl","tpl","src_tlds","onCompile","__tlds_replaced__","src_xn","email_fuzzy","tpl_email_fuzzy","link_fuzzy","tpl_link_fuzzy","link_no_ip_fuzzy","tpl_link_no_ip_fuzzy","host_fuzzy_test","tpl_host_fuzzy_test","aliases","schemaError","__compiled__","__schemas__","compiled","isRegExp","createValidator","alias","slist","schema_test","src_ZPCc","schema_search","__index__","__text_cache__","resetScanCache","Match","__last_index__","__schema__","createMatch","schemas","acc","definition","ml","me","tld_pos","testSchemaAt","keepOld","el","arr","opts","src_Any","src_Cc","src_Z","src_P","src_ZCc","src_pseudo_letter","src_ip4","src_host","tpl_host_fuzzy","tpl_host_no_ip_fuzzy","tpl_host_fuzzy_strict","tpl_host_port_fuzzy_strict","tpl_host_port_no_ip_fuzzy_strict","freeGlobal","global","maxInt","regexPunycode","regexNonASCII","regexSeparators","errors","stringFromCharCode","mapDomain","ucs2decode","counter","ucs2encode","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","baseMinusTMin","input","basic","oldi","w","baseMinusT","codePoint","inputLength","handledCPCount","basicLength","q","currentValue","handledCPCountPlusOne","qMinusT","webpackPolyfill","deprecate","paths","g","initializers","SettingsPage","FieldSet","composerItems","Switch","onchange","useRichTextEditorLoading","loading","richTextCompactParagraphsLoading"],"mappings":"2BACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QA0Df,OArDAF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,K,+BChFrD,SAASC,EAAWC,GAClBC,KAAKD,QAAUA,E,sVAGjBD,EAAWJ,UAAY,CACrBO,YAAaH,EAEbI,KAAM,SAASb,GACb,IAAK,IAAIvB,EAAI,EAAGA,EAAIkC,KAAKD,QAAQI,OAAQrC,GAAK,EAC5C,GAAIkC,KAAKD,QAAQjC,KAAOuB,EAAK,OAAOvB,EACtC,OAAQ,GAMVa,IAAK,SAASU,GACZ,IAAIe,EAAQJ,KAAKE,KAAKb,GACtB,OAAiB,GAAVe,OAAcC,EAAYL,KAAKD,QAAQK,EAAQ,IAOxDE,OAAQ,SAASjB,EAAKN,EAAOwB,GAC3B,IAAIC,EAAOD,GAAUA,GAAUlB,EAAMW,KAAKS,OAAOF,GAAUP,KACvDI,EAAQI,EAAKN,KAAKb,GAAMU,EAAUS,EAAKT,QAAQW,QAOnD,OANc,GAAVN,EACFL,EAAQY,KAAKJ,GAAUlB,EAAKN,IAE5BgB,EAAQK,EAAQ,GAAKrB,EACjBwB,IAAQR,EAAQK,GAASG,IAExB,IAAIT,EAAWC,IAKxBU,OAAQ,SAASpB,GACf,IAAIe,EAAQJ,KAAKE,KAAKb,GACtB,IAAc,GAAVe,EAAa,OAAOJ,KACxB,IAAID,EAAUC,KAAKD,QAAQW,QAE3B,OADAX,EAAQa,OAAOR,EAAO,GACf,IAAIN,EAAWC,IAKxBc,WAAY,SAASxB,EAAKN,GACxB,OAAO,IAAIe,EAAW,CAACT,EAAKN,GAAO+B,OAAOd,KAAKS,OAAOpB,GAAKU,WAK7DgB,SAAU,SAAS1B,EAAKN,GACtB,IAAIgB,EAAUC,KAAKS,OAAOpB,GAAKU,QAAQW,QAEvC,OADAX,EAAQY,KAAKtB,EAAKN,GACX,IAAIe,EAAWC,IAMxBiB,UAAW,SAASC,EAAO5B,EAAKN,GAC9B,IAAImC,EAAUlB,KAAKS,OAAOpB,GAAMU,EAAUmB,EAAQnB,QAAQW,QACtDN,EAAQc,EAAQhB,KAAKe,GAEzB,OADAlB,EAAQa,QAAiB,GAAVR,EAAcL,EAAQI,OAASC,EAAO,EAAGf,EAAKN,GACtD,IAAIe,EAAWC,IAMxBoB,QAAS,SAASC,GAChB,IAAK,IAAItD,EAAI,EAAGA,EAAIkC,KAAKD,QAAQI,OAAQrC,GAAK,EAC5CsD,EAAEpB,KAAKD,QAAQjC,GAAIkC,KAAKD,QAAQjC,EAAI,KAMxCuD,QAAS,SAASC,GAEhB,OADAA,EAAMxB,EAAWyB,KAAKD,IACbE,KACF,IAAI1B,EAAWwB,EAAIvB,QAAQe,OAAOd,KAAKyB,SAASH,GAAKvB,UADtCC,MAOxB0B,OAAQ,SAASJ,GAEf,OADAA,EAAMxB,EAAWyB,KAAKD,IACbE,KACF,IAAI1B,EAAWE,KAAKyB,SAASH,GAAKvB,QAAQe,OAAOQ,EAAIvB,UADtCC,MAOxByB,SAAU,SAASH,GACjB,IAAIK,EAAS3B,KACbsB,EAAMxB,EAAWyB,KAAKD,GACtB,IAAK,IAAIxD,EAAI,EAAGA,EAAIwD,EAAIvB,QAAQI,OAAQrC,GAAK,EAC3C6D,EAASA,EAAOlB,OAAOa,EAAIvB,QAAQjC,IACrC,OAAO6D,GAKT,WACE,OAAO3B,KAAKD,QAAQI,QAAU,IAQlCL,EAAWyB,KAAO,SAASxC,GACzB,GAAIA,aAAiBe,EAAY,OAAOf,EACxC,IAAIgB,EAAU,GACd,GAAIhB,EAAO,IAAK,IAAI6C,KAAQ7C,EAAOgB,EAAQY,KAAKiB,EAAM7C,EAAM6C,IAC5D,OAAO,IAAI9B,EAAWC,IAGxB,IAEe,EAFED,ECtEjB,IAAI+B,EAAW,SAAkB9B,EAASyB,GAMxC,GALAxB,KAAKD,QAAUA,EAIfC,KAAKwB,KAAOA,GAAQ,EACR,MAARA,EAAgB,IAAK,IAAI1D,EAAI,EAAGA,EAAIiC,EAAQI,OAAQrC,IACpDkC,KAAKwB,MAAQzB,EAAQjC,GAAGgE,UAG1BC,EAAqB,CAAEC,WAAY,CAAEC,cAAc,GAAOC,UAAW,CAAED,cAAc,GAAOE,WAAY,CAAEF,cAAc,IAM5HJ,EAASnC,UAAU0C,aAAe,SAAuBb,EAAMc,EAAIjB,EAAGkB,EAAWC,QAC1D,IAAdD,IAAuBA,EAAY,GAE1C,IAAK,IAAIxE,EAAI,EAAG0E,EAAM,EAAGA,EAAMH,EAAIvE,IAAK,CACtC,IAAI2E,EAAQzC,KAAKD,QAAQjC,GAAI4E,EAAMF,EAAMC,EAAMX,SAC/C,GAAIY,EAAMnB,IAAiD,IAAzCH,EAAEqB,EAAOH,EAAYE,EAAKD,EAAQzE,IAAgB2E,EAAM1C,QAAQyB,KAAM,CACtF,IAAImB,EAAQH,EAAM,EAClBC,EAAML,aAAaQ,KAAKC,IAAI,EAAGtB,EAAOoB,GACnBC,KAAKE,IAAIL,EAAM1C,QAAQyB,KAAMa,EAAKM,GAClCvB,EAAGkB,EAAYK,GAEpCH,EAAME,IAOVb,EAASnC,UAAUqD,YAAc,SAAsB3B,GACrDpB,KAAKoC,aAAa,EAAGpC,KAAKwB,KAAMJ,IAIlCS,EAASnC,UAAUsD,YAAc,SAAsBzB,EAAMc,EAAIY,EAAgBC,GAC/E,IAAIC,EAAO,GAAIC,GAAY,EAa3B,OAZApD,KAAKoC,aAAab,EAAMc,GAAI,SAAUgB,EAAMb,GACtCa,EAAKC,QACPH,GAAQE,EAAKF,KAAKzC,MAAMkC,KAAKC,IAAItB,EAAMiB,GAAOA,EAAKH,EAAKG,GACxDY,GAAaH,GACJI,EAAKE,QAAUL,GACxBC,GAAQD,EACRE,GAAaH,IACHG,GAAaC,EAAKG,UAC5BL,GAAQF,EACRG,GAAY,KAEb,GACID,GAMTtB,EAASnC,UAAUgC,OAAS,SAAiB+B,GAC3C,IAAKA,EAAMjC,KAAQ,OAAOxB,KAC1B,IAAKA,KAAKwB,KAAQ,OAAOiC,EACzB,IAAIC,EAAO1D,KAAKkC,UAAWyB,EAAQF,EAAMzB,WAAYjC,EAAUC,KAAKD,QAAQW,QAAS5C,EAAI,EAKzF,IAJI4F,EAAKJ,QAAUI,EAAKE,WAAWD,KACjC5D,EAAQA,EAAQI,OAAS,GAAKuD,EAAKG,SAASH,EAAKP,KAAOQ,EAAMR,MAC9DrF,EAAI,GAECA,EAAI2F,EAAM1D,QAAQI,OAAQrC,IAAOiC,EAAQY,KAAK8C,EAAM1D,QAAQjC,IACnE,OAAO,IAAI+D,EAAS9B,EAASC,KAAKwB,KAAOiC,EAAMjC,OAKjDK,EAASnC,UAAUoE,IAAM,SAAcvC,EAAMc,GAE3C,GADU,MAANA,IAAcA,EAAKrC,KAAKwB,MAChB,GAARD,GAAac,GAAMrC,KAAKwB,KAAQ,OAAOxB,KAC3C,IAAI2B,EAAS,GAAIH,EAAO,EACxB,GAAIa,EAAKd,EAAQ,IAAK,IAAIzD,EAAI,EAAG0E,EAAM,EAAGA,EAAMH,EAAIvE,IAAK,CACvD,IAAI2E,EAAQzC,KAAKD,QAAQjC,GAAI4E,EAAMF,EAAMC,EAAMX,SAC3CY,EAAMnB,KACJiB,EAAMjB,GAAQmB,EAAML,KAElBI,EADAA,EAAMa,OACEb,EAAMqB,IAAIlB,KAAKC,IAAI,EAAGtB,EAAOiB,GAAMI,KAAKE,IAAIL,EAAMU,KAAKhD,OAAQkC,EAAKG,IAEpEC,EAAMqB,IAAIlB,KAAKC,IAAI,EAAGtB,EAAOiB,EAAM,GAAII,KAAKE,IAAIL,EAAM1C,QAAQyB,KAAMa,EAAKG,EAAM,KAE7Fb,EAAOhB,KAAK8B,GACZjB,GAAQiB,EAAMX,UAEhBU,EAAME,EAER,OAAO,IAAIb,EAASF,EAAQH,IAG9BK,EAASnC,UAAUqE,WAAa,SAAqBxC,EAAMc,GACzD,OAAId,GAAQc,EAAaR,EAASmC,MACtB,GAARzC,GAAac,GAAMrC,KAAKD,QAAQI,OAAiBH,KAC9C,IAAI6B,EAAS7B,KAAKD,QAAQW,MAAMa,EAAMc,KAM/CR,EAASnC,UAAUuE,aAAe,SAAuBC,EAAOb,GAC9D,IAAIc,EAAUnE,KAAKD,QAAQmE,GAC3B,GAAIC,GAAWd,EAAQ,OAAOrD,KAC9B,IAAIoE,EAAOpE,KAAKD,QAAQW,QACpBc,EAAOxB,KAAKwB,KAAO6B,EAAKvB,SAAWqC,EAAQrC,SAE/C,OADAsC,EAAKF,GAASb,EACP,IAAIxB,EAASuC,EAAM5C,IAM5BK,EAASnC,UAAUmB,WAAa,SAAqBwC,GACnD,OAAO,IAAIxB,EAAS,CAACwB,GAAMvC,OAAOd,KAAKD,SAAUC,KAAKwB,KAAO6B,EAAKvB,WAMpED,EAASnC,UAAUqB,SAAW,SAAmBsC,GAC/C,OAAO,IAAIxB,EAAS7B,KAAKD,QAAQe,OAAOuC,GAAOrD,KAAKwB,KAAO6B,EAAKvB,WAKlED,EAASnC,UAAU2E,GAAK,SAAaZ,GACnC,GAAIzD,KAAKD,QAAQI,QAAUsD,EAAM1D,QAAQI,OAAU,OAAO,EAC1D,IAAK,IAAIrC,EAAI,EAAGA,EAAIkC,KAAKD,QAAQI,OAAQrC,IACrC,IAAKkC,KAAKD,QAAQjC,GAAGuG,GAAGZ,EAAM1D,QAAQjC,IAAO,OAAO,EACxD,OAAO,GAKTiE,EAAmBC,WAAWrD,IAAM,WAAc,OAAOqB,KAAKD,QAAQI,OAASH,KAAKD,QAAQ,GAAK,MAIjGgC,EAAmBG,UAAUvD,IAAM,WAAc,OAAOqB,KAAKD,QAAQI,OAASH,KAAKD,QAAQC,KAAKD,QAAQI,OAAS,GAAK,MAItH4B,EAAmBI,WAAWxD,IAAM,WAAc,OAAOqB,KAAKD,QAAQI,QAKtE0B,EAASnC,UAAU+C,MAAQ,SAAgByB,GACzC,IAAI9D,EAAQJ,KAAKD,QAAQmE,GACzB,IAAK9D,EAAS,MAAM,IAAIkE,WAAW,SAAWJ,EAAQ,qBAAuBlE,MAC7E,OAAOI,GAKTyB,EAASnC,UAAU6E,WAAa,SAAqBL,GACnD,OAAOlE,KAAKD,QAAQmE,IAMtBrC,EAASnC,UAAUyB,QAAU,SAAkBC,GAC7C,IAAK,IAAItD,EAAI,EAAG8B,EAAI,EAAG9B,EAAIkC,KAAKD,QAAQI,OAAQrC,IAAK,CACnD,IAAI2E,EAAQzC,KAAKD,QAAQjC,GACzBsD,EAAEqB,EAAO7C,EAAG9B,GACZ8B,GAAK6C,EAAMX,WAOfD,EAASnC,UAAU8E,cAAgB,SAA0Bf,EAAOjB,GAGlE,YAFe,IAARA,IAAiBA,EAAM,GAzOhC,SAASgC,EAAcC,EAAGC,EAAGlC,GAC3B,IAAK,IAAI1E,EAAI,GAAIA,IAAK,CACpB,GAAIA,GAAK2G,EAAEtC,YAAcrE,GAAK4G,EAAEvC,WAC5B,OAAOsC,EAAEtC,YAAcuC,EAAEvC,WAAa,KAAOK,EAEjD,IAAImC,EAASF,EAAEhC,MAAM3E,GAAI8G,EAASF,EAAEjC,MAAM3E,GAC1C,GAAI6G,GAAUC,EAAd,CAEA,IAAKD,EAAOf,WAAWgB,GAAW,OAAOpC,EAEzC,GAAImC,EAAOrB,QAAUqB,EAAOxB,MAAQyB,EAAOzB,KAAM,CAC/C,IAAK,IAAI0B,EAAI,EAAGF,EAAOxB,KAAK0B,IAAMD,EAAOzB,KAAK0B,GAAIA,IAC9CrC,IACJ,OAAOA,EAET,GAAImC,EAAO5E,QAAQyB,MAAQoD,EAAO7E,QAAQyB,KAAM,CAC9C,IAAIsD,EAAQN,EAAcG,EAAO5E,QAAS6E,EAAO7E,QAASyC,EAAM,GAChE,GAAa,MAATsC,EAAiB,OAAOA,EAE9BtC,GAAOmC,EAAO7C,cAbUU,GAAOmC,EAAO7C,UAqOjC0C,CAAcxE,KAAMyD,EAAOjB,IAQpCX,EAASnC,UAAUqF,YAAc,SAAwBtB,EAAOjB,EAAKwC,GAInE,YAHe,IAARxC,IAAiBA,EAAMxC,KAAKwB,WACf,IAAbwD,IAAsBA,EAAWvB,EAAMjC,MA9NhD,SAASuD,EAAYN,EAAGC,EAAGO,EAAMC,GAC/B,IAAK,IAAIC,EAAKV,EAAEtC,WAAYiD,EAAKV,EAAEvC,aAAc,CAC/C,GAAU,GAANgD,GAAiB,GAANC,EACX,OAAOD,GAAMC,EAAK,KAAO,CAACX,EAAGQ,EAAMP,EAAGQ,GAE1C,IAAIP,EAASF,EAAEhC,QAAQ0C,GAAKP,EAASF,EAAEjC,QAAQ2C,GAAK5D,EAAOmD,EAAO7C,SAClE,GAAI6C,GAAUC,EAAd,CAKA,IAAKD,EAAOf,WAAWgB,GAAW,MAAO,CAACH,EAAGQ,EAAMP,EAAGQ,GAEtD,GAAIP,EAAOrB,QAAUqB,EAAOxB,MAAQyB,EAAOzB,KAAM,CAE/C,IADA,IAAIkC,EAAO,EAAGC,EAAU1C,KAAKE,IAAI6B,EAAOxB,KAAKhD,OAAQyE,EAAOzB,KAAKhD,QAC1DkF,EAAOC,GAAWX,EAAOxB,KAAKwB,EAAOxB,KAAKhD,OAASkF,EAAO,IAAMT,EAAOzB,KAAKyB,EAAOzB,KAAKhD,OAASkF,EAAO,IAC7GA,IAAQJ,IAAQC,IAElB,MAAO,CAACT,EAAGQ,EAAMP,EAAGQ,GAEtB,GAAIP,EAAO5E,QAAQyB,MAAQoD,EAAO7E,QAAQyB,KAAM,CAC9C,IAAIsD,EAAQC,EAAYJ,EAAO5E,QAAS6E,EAAO7E,QAASkF,EAAO,EAAGC,EAAO,GACzE,GAAIJ,EAAS,OAAOA,EAEtBG,GAAQzD,EAAM0D,GAAQ1D,OAjBpByD,GAAQzD,EAAM0D,GAAQ1D,GAyNnBuD,CAAY/E,KAAMyD,EAAOjB,EAAKwC,IAOvCnD,EAASnC,UAAU6F,UAAY,SAAoB/C,EAAKgD,GAGtD,QAFiB,IAAVA,IAAmBA,GAAS,GAExB,GAAPhD,EAAY,OAAOiD,EAAS,EAAGjD,GACnC,GAAIA,GAAOxC,KAAKwB,KAAQ,OAAOiE,EAASzF,KAAKD,QAAQI,OAAQqC,GAC7D,GAAIA,EAAMxC,KAAKwB,MAAQgB,EAAM,EAAK,MAAM,IAAI8B,WAAY,YAAc9B,EAAM,yBAA2B,KAAS,KAChH,IAAK,IAAI1E,EAAI,EAAG4H,EAAS,GAAI5H,IAAK,CAChC,IAAyB4E,EAAMgD,EAArB1F,KAAKyC,MAAM3E,GAAuBgE,SAC5C,GAAIY,GAAOF,EACT,OAAIE,GAAOF,GAAOgD,EAAQ,EAAYC,EAAS3H,EAAI,EAAG4E,GAC/C+C,EAAS3H,EAAG4H,GAErBA,EAAShD,IAMbb,EAASnC,UAAUiG,SAAW,WAAuB,MAAO,IAAM3F,KAAK4F,gBAAkB,KAEzF/D,EAASnC,UAAUkG,cAAgB,WAA4B,OAAO5F,KAAKD,QAAQ8F,KAAK,OAIxFhE,EAASnC,UAAUoG,OAAS,WAC1B,OAAO9F,KAAKD,QAAQI,OAASH,KAAKD,QAAQuB,KAAI,SAAU/B,GAAK,OAAOA,EAAEuG,YAAe,MAKvFjE,EAASkE,SAAW,SAAmBC,EAAQjH,GAC7C,IAAKA,EAAS,OAAO8C,EAASmC,MAC9B,IAAKiC,MAAMC,QAAQnH,GAAU,MAAM,IAAIuF,WAAW,uCAClD,OAAO,IAAIzC,EAAS9C,EAAMuC,IAAI0E,EAAOG,gBAMvCtE,EAASuE,UAAY,SAAoBC,GACvC,IAAKA,EAAMlG,OAAU,OAAO0B,EAASmC,MAErC,IADA,IAAIsC,EAAQ9E,EAAO,EACV1D,EAAI,EAAGA,EAAIuI,EAAMlG,OAAQrC,IAAK,CACrC,IAAIuF,EAAOgD,EAAMvI,GACjB0D,GAAQ6B,EAAKvB,SACThE,GAAKuF,EAAKC,QAAU+C,EAAMvI,EAAI,GAAG8F,WAAWP,IACzCiD,IAAUA,EAASD,EAAM3F,MAAM,EAAG5C,IACvCwI,EAAOA,EAAOnG,OAAS,GAAKkD,EAAKQ,SAASyC,EAAOA,EAAOnG,OAAS,GAAGgD,KAAOE,EAAKF,OACvEmD,GACTA,EAAO3F,KAAK0C,GAGhB,OAAO,IAAIxB,EAASyE,GAAUD,EAAO7E,IAQvCK,EAASN,KAAO,SAAegF,GAC7B,IAAKA,EAAS,OAAO1E,EAASmC,MAC9B,GAAIuC,aAAiB1E,EAAY,OAAO0E,EACxC,GAAIN,MAAMC,QAAQK,GAAU,OAAOvG,KAAKoG,UAAUG,GAClD,GAAIA,EAAMC,MAAS,OAAO,IAAI3E,EAAS,CAAC0E,GAAQA,EAAMzE,UACtD,MAAM,IAAIwC,WAAW,mBAAqBiC,EAAQ,kBAC5BA,EAAMnE,aAAe,mEAAqE,MAGlH5D,OAAOiI,iBAAkB5E,EAASnC,UAAWqC,GAE7C,IAAI3B,EAAQ,CAAC8D,MAAO,EAAGwC,OAAQ,GAC/B,SAASjB,EAASvB,EAAOwC,GAGvB,OAFAtG,EAAM8D,MAAQA,EACd9D,EAAMsG,OAASA,EACRtG,EAST,SAASuG,EAAYlC,EAAGC,GACtB,GAAID,IAAMC,EAAK,OAAO,EACtB,IAAMD,GAAiB,iBAALA,IACZC,GAAiB,iBAALA,EAAkB,OAAO,EAC3C,IAAI2B,EAAQJ,MAAMC,QAAQzB,GAC1B,GAAIwB,MAAMC,QAAQxB,IAAM2B,EAAS,OAAO,EACxC,GAAIA,EAAO,CACT,GAAI5B,EAAEtE,QAAUuE,EAAEvE,OAAU,OAAO,EACnC,IAAK,IAAIrC,EAAI,EAAGA,EAAI2G,EAAEtE,OAAQrC,IAAO,IAAK6I,EAAYlC,EAAE3G,GAAI4G,EAAE5G,IAAO,OAAO,MACvE,CACL,IAAK,IAAI8B,KAAK6E,EAAK,KAAM7E,KAAK8E,KAAOiC,EAAYlC,EAAE7E,GAAI8E,EAAE9E,IAAO,OAAO,EACvE,IAAK,IAAIgH,KAAOlC,EAAK,KAAMkC,KAAOnC,GAAM,OAAO,EAEjD,OAAO,EAfT5C,EAASmC,MAAQ,IAAInC,EAAS,GAAI,GAwBlC,IAAIgF,EAAO,SAAcC,EAAMN,GAG7BxG,KAAK8G,KAAOA,EAGZ9G,KAAKwG,MAAQA,GAyGf,SAASO,EAAaC,GACpB,IAAIC,EAAMC,MAAMjJ,KAAK+B,KAAMgH,GAE3B,OADAC,EAAIE,UAAYJ,EAAarH,UACtBuH,EAnGTJ,EAAKnH,UAAU0H,SAAW,SAAmBC,GAE3C,IADA,IAAIjD,EAAMkD,GAAS,EACVxJ,EAAI,EAAGA,EAAIuJ,EAAIlH,OAAQrC,IAAK,CACnC,IAAI2F,EAAQ4D,EAAIvJ,GAChB,GAAIkC,KAAKqE,GAAGZ,GAAU,OAAO4D,EAC7B,GAAIrH,KAAK8G,KAAKS,SAAS9D,EAAMqD,MACtB1C,IAAQA,EAAOiD,EAAI3G,MAAM,EAAG5C,QAC5B,IAAI2F,EAAMqD,KAAKS,SAASvH,KAAK8G,MAClC,OAAOO,GAEFC,GAAU7D,EAAMqD,KAAKU,KAAOxH,KAAK8G,KAAKU,OACpCpD,IAAQA,EAAOiD,EAAI3G,MAAM,EAAG5C,IACjCsG,EAAKzD,KAAKX,MACVsH,GAAS,GAEPlD,GAAQA,EAAKzD,KAAK8C,IAK1B,OAFKW,IAAQA,EAAOiD,EAAI3G,SACnB4G,GAAUlD,EAAKzD,KAAKX,MAClBoE,GAMTyC,EAAKnH,UAAU+H,cAAgB,SAAwBJ,GACrD,IAAK,IAAIvJ,EAAI,EAAGA,EAAIuJ,EAAIlH,OAAQrC,IAC5B,GAAIkC,KAAKqE,GAAGgD,EAAIvJ,IACd,OAAOuJ,EAAI3G,MAAM,EAAG5C,GAAGgD,OAAOuG,EAAI3G,MAAM5C,EAAI,IAClD,OAAOuJ,GAKTR,EAAKnH,UAAUgI,QAAU,SAAkBL,GACzC,IAAK,IAAIvJ,EAAI,EAAGA,EAAIuJ,EAAIlH,OAAQrC,IAC5B,GAAIkC,KAAKqE,GAAGgD,EAAIvJ,IAAO,OAAO,EAClC,OAAO,GAMT+I,EAAKnH,UAAU2E,GAAK,SAAaZ,GAC/B,OAAOzD,MAAQyD,GACZzD,KAAK8G,MAAQrD,EAAMqD,MAAQH,EAAY3G,KAAKwG,MAAO/C,EAAM+C,QAK9DK,EAAKnH,UAAUoG,OAAS,WACtB,IAAI6B,EAAM,CAACb,KAAM9G,KAAK8G,KAAKzI,MAC3B,IAAK,IAAIuJ,KAAK5H,KAAKwG,MAAO,CACxBmB,EAAInB,MAAQxG,KAAKwG,MACjB,MAEF,OAAOmB,GAITd,EAAKd,SAAW,SAAmBC,EAAQ6B,GACzC,IAAKA,EAAQ,MAAM,IAAIvD,WAAW,mCAClC,IAAIwC,EAAOd,EAAO8B,MAAMD,EAAKf,MAC7B,IAAKA,EAAQ,MAAM,IAAIxC,WAAY,yBAA4BuD,EAAS,KAAI,mBAC5E,OAAOf,EAAK1H,OAAOyI,EAAKrB,QAK1BK,EAAKkB,QAAU,SAAkBtD,EAAGC,GAClC,GAAID,GAAKC,EAAK,OAAO,EACrB,GAAID,EAAEtE,QAAUuE,EAAEvE,OAAU,OAAO,EACnC,IAAK,IAAIrC,EAAI,EAAGA,EAAI2G,EAAEtE,OAAQrC,IAC1B,IAAK2G,EAAE3G,GAAGuG,GAAGK,EAAE5G,IAAO,OAAO,EACjC,OAAO,GAMT+I,EAAKmB,QAAU,SAAkBF,GAC/B,IAAKA,GAAyB,GAAhBA,EAAM3H,OAAe,OAAO0G,EAAKoB,KAC/C,GAAIH,aAAiBjB,EAAQ,MAAO,CAACiB,GACrC,IAAI1D,EAAO0D,EAAMpH,QAEjB,OADA0D,EAAK8D,MAAK,SAAUzD,EAAGC,GAAK,OAAOD,EAAEqC,KAAKU,KAAO9C,EAAEoC,KAAKU,QACjDpD,GAITyC,EAAKoB,KAAO,GAYZlB,EAAarH,UAAYlB,OAAOY,OAAO8H,MAAMxH,WAC7CqH,EAAarH,UAAUO,YAAc8G,EACrCA,EAAarH,UAAUrB,KAAO,eAK9B,IAAI8J,EAAQ,SAAepI,EAASqI,EAAWC,GAE7CrI,KAAKD,QAAUA,EAEfC,KAAKoI,UAAYA,EAEjBpI,KAAKqI,QAAUA,GAGbC,EAAuB,CAAE9G,KAAM,CAAES,cAAc,IA8FnD,SAASsG,EAAQC,EAAOC,EAAK/H,GAC3B,GAAIA,EAAM0H,UAAYI,EAAME,MACxB,MAAM,IAAI3B,EAAa,mDAC3B,GAAIyB,EAAME,MAAQhI,EAAM0H,WAAaK,EAAIC,MAAQhI,EAAM2H,QACnD,MAAM,IAAItB,EAAa,4BAC3B,OAGF,SAAS4B,EAAaH,EAAOC,EAAK/H,EAAOgI,GACvC,IAAIxE,EAAQsE,EAAMtE,MAAMwE,GAAQrF,EAAOmF,EAAMnF,KAAKqF,GAClD,GAAIxE,GAASuE,EAAIvE,MAAMwE,IAAUA,EAAQF,EAAME,MAAQhI,EAAM0H,UAAW,CACtE,IAAItD,EAAQ6D,EAAaH,EAAOC,EAAK/H,EAAOgI,EAAQ,GACpD,OAAOrF,EAAKe,KAAKf,EAAKtD,QAAQkE,aAAaC,EAAOY,IAC7C,GAAKpE,EAAMX,QAAQyB,KAEnB,IAAKd,EAAM0H,WAAc1H,EAAM2H,SAAWG,EAAME,OAASA,GAASD,EAAIC,OAASA,EAG/E,CACL,IAAIE,EAgFR,SAAgClI,EAAOmI,GAGrC,IAFA,IAAIC,EAAQD,EAAOH,MAAQhI,EAAM0H,UAC7B/E,EADiDwF,EAAOxF,KAAKyF,GAC/C1E,KAAK1D,EAAMX,SACpBjC,EAAIgL,EAAQ,EAAGhL,GAAK,EAAGA,IAC5BuF,EAAOwF,EAAOxF,KAAKvF,GAAGsG,KAAKvC,EAASN,KAAK8B,IAC7C,MAAO,CAACV,MAAOU,EAAK0F,eAAerI,EAAM0H,UAAYU,GAC7CpG,IAAKW,EAAK0F,eAAe1F,EAAKtD,QAAQyB,KAAOd,EAAM2H,QAAUS,IAtFzDE,CAAuBtI,EAAO8H,GACpC7F,EAAQiG,EAAIjG,MACZD,EAAMkG,EAAIlG,IACd,OAAO,EAAMW,EA8CjB,SAAS4F,EAAgBT,EAAOU,EAAQC,EAAMV,EAAKC,GACjD,IAAIN,EAAYI,EAAME,MAAQA,GAASU,EAASZ,EAAOU,EAAQR,EAAQ,GACnEL,EAAUI,EAAIC,MAAQA,GAASU,EAASD,EAAMV,EAAKC,EAAQ,GAE3D3I,EAAU,GACdsJ,EAAS,KAAMb,EAAOE,EAAO3I,GACzBqI,GAAaC,GAAWa,EAAOhF,MAAMwE,IAAUS,EAAKjF,MAAMwE,IAC5DY,EAAUlB,EAAWC,GACrBkB,EAAQ,EAAMnB,EAAWa,EAAgBT,EAAOU,EAAQC,EAAMV,EAAKC,EAAQ,IAAK3I,KAE5EqI,GACAmB,EAAQ,EAAMnB,EAAWoB,EAAchB,EAAOU,EAAQR,EAAQ,IAAK3I,GACvEsJ,EAASH,EAAQC,EAAMT,EAAO3I,GAC1BsI,GACAkB,EAAQ,EAAMlB,EAASmB,EAAcL,EAAMV,EAAKC,EAAQ,IAAK3I,IAGnE,OADAsJ,EAASZ,EAAK,KAAMC,EAAO3I,GACpB,IAAI8B,EAAS9B,GA/DCkJ,CAAgBT,EAAO7F,EAAOD,EAAK+F,EAAKC,IAN3D,IAAInG,EAASiG,EAAMjG,OAAQxC,EAAUwC,EAAOxC,QAC5C,OAAO,EAAMwC,EAAQxC,EAAQ+D,IAAI,EAAG0E,EAAMiB,cAAc/H,OAAOhB,EAAMX,SAAS2B,OAAO3B,EAAQ+D,IAAI2E,EAAIgB,gBAHrG,OAAO,EAAMpG,EAAMmG,EAAchB,EAAOC,EAAKC,IATxCC,CAAaH,EAAOC,EAAK/H,EAAO,GAqBzC,SAAS4I,EAAUI,EAAMC,GACvB,IAAKA,EAAI7C,KAAK8C,kBAAkBF,EAAK5C,MACjC,MAAM,IAAIC,EAAa,eAAiB4C,EAAI7C,KAAKzI,KAAO,SAAWqL,EAAK5C,KAAKzI,MAGnF,SAAS+K,EAASS,EAASC,EAAQpB,GACjC,IAAIrF,EAAOwG,EAAQxG,KAAKqF,GAExB,OADAY,EAAUjG,EAAMyG,EAAOzG,KAAKqF,IACrBrF,EAGT,SAASkG,EAAQ9G,EAAOsH,GACtB,IAAIrG,EAAOqG,EAAO5J,OAAS,EACvBuD,GAAQ,GAAKjB,EAAMa,QAAUb,EAAMmB,WAAWmG,EAAOrG,IACrDqG,EAAOrG,GAAQjB,EAAMoB,SAASkG,EAAOrG,GAAMP,KAAOV,EAAMU,MAExD4G,EAAOpJ,KAAK8B,GAGlB,SAAS4G,EAASH,EAAQC,EAAMT,EAAOqB,GACrC,IAAI1G,GAAQ8F,GAAQD,GAAQ7F,KAAKqF,GAC7BsB,EAAa,EAAGC,EAAWd,EAAOA,EAAKjF,MAAMwE,GAASrF,EAAKlB,WAC3D+G,IACFc,EAAad,EAAOhF,MAAMwE,GACtBQ,EAAOR,MAAQA,EACjBsB,IACSd,EAAOgB,aAChBX,EAAQL,EAAOiB,UAAWJ,GAC1BC,MAGJ,IAAK,IAAIlM,EAAIkM,EAAYlM,EAAImM,EAAUnM,IAAOyL,EAAQlG,EAAKZ,MAAM3E,GAAIiM,GACjEZ,GAAQA,EAAKT,OAASA,GAASS,EAAKe,YACpCX,EAAQJ,EAAKiB,WAAYL,GAG/B,SAAS,EAAM1G,EAAMtD,GACnB,IAAKsD,EAAKyD,KAAKuD,aAAatK,GACxB,MAAM,IAAIgH,EAAa,4BAA8B1D,EAAKyD,KAAKzI,MACnE,OAAOgF,EAAKe,KAAKrE,GAuBnB,SAASyJ,EAAchB,EAAOC,EAAKC,GACjC,IAAI3I,EAAU,IACdsJ,EAAS,KAAMb,EAAOE,EAAO3I,GACzByI,EAAME,MAAQA,IAEhBa,EAAQ,EADGH,EAASZ,EAAOC,EAAKC,EAAQ,GACpBc,EAAchB,EAAOC,EAAKC,EAAQ,IAAK3I,GAG7D,OADAsJ,EAASZ,EAAK,KAAMC,EAAO3I,GACpB,IAAI8B,EAAS9B,GA1LtBuI,EAAqB9G,KAAK7C,IAAM,WAC9B,OAAOqB,KAAKD,QAAQyB,KAAOxB,KAAKoI,UAAYpI,KAAKqI,SAGnDF,EAAMzI,UAAU4K,SAAW,SAAmB9H,EAAK+H,GACjD,IAAIxK,EAoEN,SAASyK,EAAWzK,EAAS0K,EAAMC,EAAQnI,GACzC,IAAIqG,EAAM7I,EAAQwF,UAAUkF,GACxBvG,EAAQ0E,EAAI1E,MACZwC,EAASkC,EAAIlC,OACbjE,EAAQ1C,EAAQwE,WAAWL,GAC/B,GAAIwC,GAAU+D,GAAQhI,EAAMa,OAC1B,OAAIf,IAAWA,EAAOoI,WAAWzG,EAAOA,EAAOwG,GAAkB,KAC1D3K,EAAQ+D,IAAI,EAAG2G,GAAM/I,OAAOgJ,GAAQhJ,OAAO3B,EAAQ+D,IAAI2G,IAEhE,IAAI3F,EAAQ0F,EAAW/H,EAAM1C,QAAS0K,EAAO/D,EAAS,EAAGgE,GACzD,OAAO5F,GAAS/E,EAAQkE,aAAaC,EAAOzB,EAAM2B,KAAKU,IA9EzC0F,CAAWxK,KAAKD,QAASyC,EAAMxC,KAAKoI,UAAWmC,EAAU,MACvE,OAAOxK,GAAW,IAAIoI,EAAMpI,EAASC,KAAKoI,UAAWpI,KAAKqI,UAG5DF,EAAMzI,UAAUkL,cAAgB,SAAwBrJ,EAAMc,GAC5D,OAAO,IAAI8F,EA+Cb,SAAS0C,EAAY9K,EAASwB,EAAMc,GAClC,IAAIuG,EAAM7I,EAAQwF,UAAUhE,GACxB2C,EAAQ0E,EAAI1E,MACZwC,EAASkC,EAAIlC,OACbjE,EAAQ1C,EAAQwE,WAAWL,GAC3B4G,EAAQ/K,EAAQwF,UAAUlD,GAC1B0I,EAAUD,EAAM5G,MAChB8G,EAAWF,EAAMpE,OACrB,GAAIA,GAAUnF,GAAQkB,EAAMa,OAAQ,CAClC,GAAI0H,GAAY3I,IAAOtC,EAAQ0C,MAAMsI,GAASzH,OAAU,MAAM,IAAIgB,WAAW,2BAC7E,OAAOvE,EAAQ+D,IAAI,EAAGvC,GAAMG,OAAO3B,EAAQ+D,IAAIzB,IAEjD,GAAI6B,GAAS6G,EAAW,MAAM,IAAIzG,WAAW,2BAC7C,OAAOvE,EAAQkE,aAAaC,EAAOzB,EAAM2B,KAAKyG,EAAYpI,EAAM1C,QAASwB,EAAOmF,EAAS,EAAGrE,EAAKqE,EAAS,KA5DzFmE,CAAY7K,KAAKD,QAASwB,EAAOvB,KAAKoI,UAAW/F,EAAKrC,KAAKoI,WAAYpI,KAAKoI,UAAWpI,KAAKqI,UAK/GF,EAAMzI,UAAU2E,GAAK,SAAaZ,GAChC,OAAOzD,KAAKD,QAAQsE,GAAGZ,EAAM1D,UAAYC,KAAKoI,WAAa3E,EAAM2E,WAAapI,KAAKqI,SAAW5E,EAAM4E,SAGtGF,EAAMzI,UAAUiG,SAAW,WACzB,OAAO3F,KAAKD,QAAU,IAAMC,KAAKoI,UAAY,IAAMpI,KAAKqI,QAAU,KAKpEF,EAAMzI,UAAUoG,OAAS,WACvB,IAAK9F,KAAKD,QAAQyB,KAAQ,OAAO,KACjC,IAAIqG,EAAO,CAAC9H,QAASC,KAAKD,QAAQ+F,UAGlC,OAFI9F,KAAKoI,UAAY,IAAKP,EAAKO,UAAYpI,KAAKoI,WAC5CpI,KAAKqI,QAAU,IAAKR,EAAKQ,QAAUrI,KAAKqI,SACrCR,GAKTM,EAAMpC,SAAW,SAAmBC,EAAQ6B,GAC1C,IAAKA,EAAQ,OAAOM,EAAMnE,MAC1B,IAAIoE,EAAYP,EAAKO,WAAa,EAAGC,EAAUR,EAAKQ,SAAW,EAC/D,GAAwB,iBAAbD,GAA2C,iBAAXC,EACvC,MAAM,IAAI/D,WAAW,oCACzB,OAAO,IAAI6D,EAAMtG,EAASkE,SAASC,EAAQ6B,EAAK9H,SAAUqI,EAAWC,IAMvEF,EAAM8C,QAAU,SAAkBV,EAAUW,QACjB,IAAlBA,IAA2BA,GAAc,GAGhD,IADA,IAAI9C,EAAY,EAAGC,EAAU,EACpB9I,EAAIgL,EAASvI,WAAYzC,IAAMA,EAAEgE,SAAW2H,IAAkB3L,EAAEuH,KAAKqE,KAAKC,WAAY7L,EAAIA,EAAEyC,WAAcoG,IACnH,IAAK,IAAIiD,EAAMd,EAASrI,UAAWmJ,IAAQA,EAAI9H,SAAW2H,IAAkBG,EAAIvE,KAAKqE,KAAKC,WAAYC,EAAMA,EAAInJ,UAAamG,IAC7H,OAAO,IAAIF,EAAMoC,EAAUnC,EAAWC,IAGxC7J,OAAOiI,iBAAkB0B,EAAMzI,UAAW4I,GAiC1CH,EAAMnE,MAAQ,IAAImE,EAAMtG,EAASmC,MAAO,EAAG,GAsH3C,IAAIsH,EAAc,SAAqB9I,EAAK+I,EAAM9B,GAEhDzJ,KAAKwC,IAAMA,EACXxC,KAAKuL,KAAOA,EAKZvL,KAAK0I,MAAQ6C,EAAKpL,OAAS,EAAI,EAE/BH,KAAKyJ,aAAeA,GAGlB+B,EAAuB,CAAEjJ,OAAQ,CAAEN,cAAc,GAAOwJ,IAAK,CAAExJ,cAAc,GAAOiI,WAAY,CAAEjI,cAAc,GAAOkI,UAAW,CAAElI,cAAc,GAAOmI,WAAY,CAAEnI,cAAc,IAEzLqJ,EAAY5L,UAAUgM,aAAe,SAAuBC,GAC1D,OAAW,MAAPA,EAAsB3L,KAAK0I,MAC3BiD,EAAM,EAAY3L,KAAK0I,MAAQiD,EAC5BA,GAOTH,EAAqBjJ,OAAO5D,IAAM,WAAc,OAAOqB,KAAKqD,KAAKrD,KAAK0I,QAItE8C,EAAqBC,IAAI9M,IAAM,WAAc,OAAOqB,KAAKqD,KAAK,IAK9DiI,EAAY5L,UAAU2D,KAAO,SAAeqF,GAAS,OAAO1I,KAAKuL,KAAgC,EAA3BvL,KAAK0L,aAAahD,KAMxF4C,EAAY5L,UAAUwE,MAAQ,SAAgBwE,GAAS,OAAO1I,KAAKuL,KAAgC,EAA3BvL,KAAK0L,aAAahD,GAAa,IAKvG4C,EAAY5L,UAAUkM,WAAa,SAAqBlD,GAEtD,OADAA,EAAQ1I,KAAK0L,aAAahD,GACnB1I,KAAKkE,MAAMwE,IAAUA,GAAS1I,KAAK0I,OAAU1I,KAAKkK,WAAiB,EAAJ,IAMxEoB,EAAY5L,UAAUiD,MAAQ,SAAgB+F,GAE5C,OAAgB,IADhBA,EAAQ1I,KAAK0L,aAAahD,IACN,EAAI1I,KAAKuL,KAAa,EAAR7C,EAAY,GAAK,GAMrD4C,EAAY5L,UAAUgD,IAAM,SAAcgG,GAExC,OADAA,EAAQ1I,KAAK0L,aAAahD,GACnB1I,KAAK2C,MAAM+F,GAAS1I,KAAKqD,KAAKqF,GAAO3I,QAAQyB,MAOtD8J,EAAY5L,UAAUmM,OAAS,SAAiBnD,GAE9C,KADAA,EAAQ1I,KAAK0L,aAAahD,IACZ,MAAM,IAAIpE,WAAW,kDACnC,OAAOoE,GAAS1I,KAAK0I,MAAQ,EAAI1I,KAAKwC,IAAMxC,KAAKuL,KAAa,EAAR7C,EAAY,IAMpE4C,EAAY5L,UAAUoM,MAAQ,SAAgBpD,GAE5C,KADAA,EAAQ1I,KAAK0L,aAAahD,IACZ,MAAM,IAAIpE,WAAW,iDACnC,OAAOoE,GAAS1I,KAAK0I,MAAQ,EAAI1I,KAAKwC,IAAMxC,KAAKuL,KAAa,EAAR7C,EAAY,GAAK1I,KAAKuL,KAAa,EAAR7C,GAAW5G,UAO9F0J,EAAqBtB,WAAWvL,IAAM,WAAc,OAAOqB,KAAKwC,IAAMxC,KAAKuL,KAAKvL,KAAKuL,KAAKpL,OAAS,IAMnGqL,EAAqBrB,UAAUxL,IAAM,WACnC,IAAI4D,EAASvC,KAAKuC,OAAQ2B,EAAQlE,KAAKkE,MAAMlE,KAAK0I,OAClD,GAAIxE,GAAS3B,EAAOJ,WAAc,OAAO,KACzC,IAAI4J,EAAO/L,KAAKwC,IAAMxC,KAAKuL,KAAKvL,KAAKuL,KAAKpL,OAAS,GAAIsC,EAAQF,EAAOE,MAAMyB,GAC5E,OAAO6H,EAAOxJ,EAAOE,MAAMyB,GAAOJ,IAAIiI,GAAQtJ,GAOhD+I,EAAqBpB,WAAWzL,IAAM,WACpC,IAAIuF,EAAQlE,KAAKkE,MAAMlE,KAAK0I,OACxBqD,EAAO/L,KAAKwC,IAAMxC,KAAKuL,KAAKvL,KAAKuL,KAAKpL,OAAS,GACnD,OAAI4L,EAAe/L,KAAKuC,OAAOE,MAAMyB,GAAOJ,IAAI,EAAGiI,GACnC,GAAT7H,EAAa,KAAOlE,KAAKuC,OAAOE,MAAMyB,EAAQ,IAMvDoH,EAAY5L,UAAUsM,WAAa,SAAqB9H,EAAOwE,GAC7DA,EAAQ1I,KAAK0L,aAAahD,GAE1B,IADA,IAAIrF,EAAOrD,KAAKuL,KAAa,EAAR7C,GAAYlG,EAAe,GAATkG,EAAa,EAAI1I,KAAKuL,KAAa,EAAR7C,EAAY,GAAK,EAC1E5K,EAAI,EAAGA,EAAIoG,EAAOpG,IAAO0E,GAAOa,EAAKZ,MAAM3E,GAAGgE,SACvD,OAAOU,GAQT8I,EAAY5L,UAAUoI,MAAQ,WAC5B,IAAIvF,EAASvC,KAAKuC,OAAQ2B,EAAQlE,KAAKkE,QAGvC,GAA2B,GAAvB3B,EAAOxC,QAAQyB,KAAa,OAAOqF,EAAKoB,KAG5C,GAAIjI,KAAKkK,WAAc,OAAO3H,EAAOE,MAAMyB,GAAO4D,MAElD,IAAI4B,EAAOnH,EAAOgC,WAAWL,EAAQ,GAAIT,EAAQlB,EAAOgC,WAAWL,GAGnE,IAAKwF,EAAM,CAAE,IAAIuC,EAAMvC,EAAMA,EAAOjG,EAAOA,EAAQwI,EAKnD,IADA,IAAInE,EAAQ4B,EAAK5B,MACRhK,EAAI,EAAGA,EAAIgK,EAAM3H,OAAQrC,KACO,IAAjCgK,EAAMhK,GAAGgJ,KAAKqE,KAAKe,WAAyBzI,GAAUqE,EAAMhK,GAAG4J,QAAQjE,EAAMqE,SAC/EA,EAAQA,EAAMhK,KAAK2J,cAAcK,IAEvC,OAAOA,GAUTwD,EAAY5L,UAAUyM,YAAc,SAAsBhD,GACxD,IAAI2C,EAAQ9L,KAAKuC,OAAOgC,WAAWvE,KAAKkE,SACxC,IAAK4H,IAAUA,EAAMM,SAAY,OAAO,KAGxC,IADA,IAAItE,EAAQgE,EAAMhE,MAAOuE,EAAOlD,EAAK5G,OAAOgC,WAAW4E,EAAKjF,SACnDpG,EAAI,EAAGA,EAAIgK,EAAM3H,OAAQrC,KACO,IAAjCgK,EAAMhK,GAAGgJ,KAAKqE,KAAKe,WAAyBG,GAASvE,EAAMhK,GAAG4J,QAAQ2E,EAAKvE,SAC7EA,EAAQA,EAAMhK,KAAK2J,cAAcK,IACvC,OAAOA,GAMTwD,EAAY5L,UAAU4M,YAAc,SAAsB9J,GACxD,IAAK,IAAIkG,EAAQ1I,KAAK0I,MAAOA,EAAQ,EAAGA,IACpC,GAAI1I,KAAK2C,MAAM+F,IAAUlG,GAAOxC,KAAK0C,IAAIgG,IAAUlG,EAAO,OAAOkG,EACrE,OAAO,GAWT4C,EAAY5L,UAAU6M,WAAa,SAAqB9I,EAAO+I,GAG7D,QAFiB,IAAV/I,IAAmBA,EAAQzD,MAE9ByD,EAAMjB,IAAMxC,KAAKwC,IAAO,OAAOiB,EAAM8I,WAAWvM,MACpD,IAAK,IAAI5B,EAAI4B,KAAK0I,OAAS1I,KAAKuC,OAAOkK,eAAiBzM,KAAKwC,KAAOiB,EAAMjB,IAAM,EAAI,GAAIpE,GAAK,EAAGA,IAC5F,GAAIqF,EAAMjB,KAAOxC,KAAK0C,IAAItE,MAAQoO,GAAQA,EAAKxM,KAAKqD,KAAKjF,KACvD,OAAO,IAAIsO,EAAU1M,KAAMyD,EAAOrF,IAK1CkN,EAAY5L,UAAUiN,WAAa,SAAqBlJ,GACtD,OAAOzD,KAAKwC,IAAMxC,KAAKyJ,cAAgBhG,EAAMjB,IAAMiB,EAAMgG,cAK3D6B,EAAY5L,UAAUmD,IAAM,SAAcY,GACxC,OAAOA,EAAMjB,IAAMxC,KAAKwC,IAAMiB,EAAQzD,MAKxCsL,EAAY5L,UAAUoD,IAAM,SAAcW,GACxC,OAAOA,EAAMjB,IAAMxC,KAAKwC,IAAMiB,EAAQzD,MAGxCsL,EAAY5L,UAAUiG,SAAW,WAE/B,IADA,IAAIiH,EAAM,GACD9O,EAAI,EAAGA,GAAKkC,KAAK0I,MAAO5K,IAC7B8O,IAAQA,EAAM,IAAM,IAAM5M,KAAKqD,KAAKvF,GAAGgJ,KAAKzI,KAAO,IAAM2B,KAAKkE,MAAMpG,EAAI,GAC5E,OAAO8O,EAAM,IAAM5M,KAAKyJ,cAG1B6B,EAAYuB,QAAU,SAAkBpB,EAAKjJ,GAC3C,KAAMA,GAAO,GAAKA,GAAOiJ,EAAI1L,QAAQyB,MAAS,MAAM,IAAI8C,WAAW,YAAc9B,EAAM,iBAGvF,IAFA,IAAI+I,EAAO,GACP5I,EAAQ,EAAG8G,EAAejH,EACrBa,EAAOoI,IAAO,CACrB,IAAI7C,EAAMvF,EAAKtD,QAAQwF,UAAUkE,GAC3BvF,EAAQ0E,EAAI1E,MACZwC,EAASkC,EAAIlC,OACfoG,EAAMrD,EAAe/C,EAEzB,GADA6E,EAAK5K,KAAK0C,EAAMa,EAAOvB,EAAQ+D,IAC1BoG,EAAO,MAEZ,IADAzJ,EAAOA,EAAKZ,MAAMyB,IACTZ,OAAU,MACnBmG,EAAeqD,EAAM,EACrBnK,GAAS+D,EAAS,EAEpB,OAAO,IAAI4E,EAAY9I,EAAK+I,EAAM9B,IAGpC6B,EAAYyB,cAAgB,SAAwBtB,EAAKjJ,GACvD,IAAK,IAAI1E,EAAI,EAAGA,EAAIkP,EAAa7M,OAAQrC,IAAK,CAC5C,IAAImP,EAASD,EAAalP,GAC1B,GAAImP,EAAOzK,KAAOA,GAAOyK,EAAOxB,KAAOA,EAAO,OAAOwB,EAEvD,IAAItL,EAASqL,EAAaE,GAAmB5B,EAAYuB,QAAQpB,EAAKjJ,GAEtE,OADA0K,GAAmBA,EAAkB,GAAKC,EACnCxL,GAGTnD,OAAOiI,iBAAkB6E,EAAY5L,UAAW8L,GAEhD,IAAIwB,EAAe,GAAIE,EAAkB,EAAGC,EAAmB,GAI3DT,EAAY,SAAmBlE,EAAOC,EAAKC,GAM7C1I,KAAKwI,MAAQA,EAGbxI,KAAKyI,IAAMA,EAEXzI,KAAK0I,MAAQA,GAGX0E,EAAyB,CAAEzK,MAAO,CAAEV,cAAc,GAAOS,IAAK,CAAET,cAAc,GAAOM,OAAQ,CAAEN,cAAc,GAAO+H,WAAY,CAAE/H,cAAc,GAAOgI,SAAU,CAAEhI,cAAc,IAGrLmL,EAAuBzK,MAAMhE,IAAM,WAAc,OAAOqB,KAAKwI,MAAMqD,OAAO7L,KAAK0I,MAAQ,IAEvF0E,EAAuB1K,IAAI/D,IAAM,WAAc,OAAOqB,KAAKyI,IAAIqD,MAAM9L,KAAK0I,MAAQ,IAGlF0E,EAAuB7K,OAAO5D,IAAM,WAAc,OAAOqB,KAAKwI,MAAMnF,KAAKrD,KAAK0I,QAE9E0E,EAAuBpD,WAAWrL,IAAM,WAAc,OAAOqB,KAAKwI,MAAMtE,MAAMlE,KAAK0I,QAEnF0E,EAAuBnD,SAAStL,IAAM,WAAc,OAAOqB,KAAKyI,IAAImD,WAAW5L,KAAK0I,QAEpFlK,OAAOiI,iBAAkBiG,EAAUhN,UAAW0N,GAE9C,IAAIC,EAAa7O,OAAOY,OAAO,MAc3BkO,EAAO,SAAcxG,EAAMN,EAAOzG,EAAS+H,GAG7C9H,KAAK8G,KAAOA,EAMZ9G,KAAKwG,MAAQA,EAIbxG,KAAKD,QAAUA,GAAW8B,EAASmC,MAKnChE,KAAK8H,MAAQA,GAASjB,EAAKoB,MAGzBsF,EAAuB,CAAEzL,SAAU,CAAEG,cAAc,GAAOE,WAAY,CAAEF,cAAc,GAAOuL,YAAa,CAAEvL,cAAc,GAAOD,WAAY,CAAEC,cAAc,GAAOC,UAAW,CAAED,cAAc,GAAOuB,QAAS,CAAEvB,cAAc,GAAOwL,YAAa,CAAExL,cAAc,GAAOwK,cAAe,CAAExK,cAAc,GAAOmK,SAAU,CAAEnK,cAAc,GAAOqB,OAAQ,CAAErB,cAAc,GAAOsB,OAAQ,CAAEtB,cAAc,GAAOyL,OAAQ,CAAEzL,cAAc,IAW3asL,EAAqBzL,SAASnD,IAAM,WAAc,OAAOqB,KAAKuD,OAAS,EAAI,EAAIvD,KAAKD,QAAQyB,MAI5F+L,EAAqBpL,WAAWxD,IAAM,WAAc,OAAOqB,KAAKD,QAAQoC,YAKxEmL,EAAK5N,UAAU+C,MAAQ,SAAgByB,GAAS,OAAOlE,KAAKD,QAAQ0C,MAAMyB,IAI1EoJ,EAAK5N,UAAU6E,WAAa,SAAqBL,GAAS,OAAOlE,KAAKD,QAAQwE,WAAWL,IAKzFoJ,EAAK5N,UAAUyB,QAAU,SAAkBC,GAAKpB,KAAKD,QAAQoB,QAAQC,IAUrEkM,EAAK5N,UAAU0C,aAAe,SAAuBb,EAAMc,EAAIjB,EAAGuM,QAC5C,IAAbA,IAAsBA,EAAW,GAExC3N,KAAKD,QAAQqC,aAAab,EAAMc,EAAIjB,EAAGuM,EAAU3N,OAMnDsN,EAAK5N,UAAUqD,YAAc,SAAsB3B,GACjDpB,KAAKoC,aAAa,EAAGpC,KAAKD,QAAQyB,KAAMJ,IAM1CmM,EAAqBC,YAAY7O,IAAM,WAAc,OAAOqB,KAAKgD,YAAY,EAAGhD,KAAKD,QAAQyB,KAAM,KAOnG8L,EAAK5N,UAAUsD,YAAc,SAAsBzB,EAAMc,EAAIY,EAAgBC,GAC3E,OAAOlD,KAAKD,QAAQiD,YAAYzB,EAAMc,EAAIY,EAAgBC,IAM5DqK,EAAqBvL,WAAWrD,IAAM,WAAc,OAAOqB,KAAKD,QAAQiC,YAKxEuL,EAAqBrL,UAAUvD,IAAM,WAAc,OAAOqB,KAAKD,QAAQmC,WAIvEoL,EAAK5N,UAAU2E,GAAK,SAAaZ,GAC/B,OAAOzD,MAAQyD,GAAUzD,KAAK4D,WAAWH,IAAUzD,KAAKD,QAAQsE,GAAGZ,EAAM1D,UAM3EuN,EAAK5N,UAAUkE,WAAa,SAAqBH,GAC/C,OAAOzD,KAAK4N,UAAUnK,EAAMqD,KAAMrD,EAAM+C,MAAO/C,EAAMqE,QAMvDwF,EAAK5N,UAAUkO,UAAY,SAAoB9G,EAAMN,EAAOsB,GAC1D,OAAO9H,KAAK8G,MAAQA,GAClBH,EAAY3G,KAAKwG,MAAOA,GAASM,EAAK+G,cAAgBR,IACtDxG,EAAKkB,QAAQ/H,KAAK8H,MAAOA,GAASjB,EAAKoB,OAM3CqF,EAAK5N,UAAU0E,KAAO,SAAerE,GAGnC,YAFmB,IAAZA,IAAqBA,EAAU,MAElCA,GAAWC,KAAKD,QAAkBC,KAC/B,IAAIA,KAAKC,YAAYD,KAAK8G,KAAM9G,KAAKwG,MAAOzG,EAASC,KAAK8H,QAMnEwF,EAAK5N,UAAUoO,KAAO,SAAehG,GACnC,OAAOA,GAAS9H,KAAK8H,MAAQ9H,KAAO,IAAIA,KAAKC,YAAYD,KAAK8G,KAAM9G,KAAKwG,MAAOxG,KAAKD,QAAS+H,IAOhGwF,EAAK5N,UAAUoE,IAAM,SAAcvC,EAAMc,GACvC,OAAY,GAARd,GAAac,GAAMrC,KAAKD,QAAQyB,KAAexB,KAC5CA,KAAKoE,KAAKpE,KAAKD,QAAQ+D,IAAIvC,EAAMc,KAM1CiL,EAAK5N,UAAUgB,MAAQ,SAAgBa,EAAMc,EAAI0L,GAI/C,QAHc,IAAP1L,IAAgBA,EAAKrC,KAAKD,QAAQyB,WACf,IAAnBuM,IAA4BA,GAAiB,GAEhDxM,GAAQc,EAAM,OAAO8F,EAAMnE,MAE/B,IAAIwE,EAAQxI,KAAK6M,QAAQtL,GAAOkH,EAAMzI,KAAK6M,QAAQxK,GAC/CqG,EAAQqF,EAAiB,EAAIvF,EAAM8D,YAAYjK,GAC/CM,EAAQ6F,EAAM7F,MAAM+F,GACpB3I,EADmCyI,EAAMnF,KAAKqF,GAC/B3I,QAAQ+D,IAAI0E,EAAMhG,IAAMG,EAAO8F,EAAIjG,IAAMG,GAC5D,OAAO,IAAIwF,EAAMpI,EAASyI,EAAME,MAAQA,EAAOD,EAAIC,MAAQA,IAU7D4E,EAAK5N,UAAU6I,QAAU,SAAoBhH,EAAMc,EAAI3B,GACrD,OAAO6H,EAAQvI,KAAK6M,QAAQtL,GAAOvB,KAAK6M,QAAQxK,GAAK3B,IAKvD4M,EAAK5N,UAAUsO,OAAS,SAAiBxL,GACvC,IAAK,IAAIa,EAAOrD,OAAQ,CACtB,IAAI4I,EAAMvF,EAAKtD,QAAQwF,UAAU/C,GAC3B0B,EAAQ0E,EAAI1E,MACZwC,EAASkC,EAAIlC,OAEnB,KADArD,EAAOA,EAAKkB,WAAWL,IACV,OAAO,KACpB,GAAIwC,GAAUlE,GAAOa,EAAKC,OAAU,OAAOD,EAC3Cb,GAAOkE,EAAS,IAQpB4G,EAAK5N,UAAUuO,WAAa,SAAqBzL,GAC/C,IAAIoG,EAAM5I,KAAKD,QAAQwF,UAAU/C,GAC3B0B,EAAQ0E,EAAI1E,MACZwC,EAASkC,EAAIlC,OACnB,MAAO,CAACrD,KAAMrD,KAAKD,QAAQwE,WAAWL,GAAQA,MAAOA,EAAOwC,OAAQA,IAOtE4G,EAAK5N,UAAUwO,YAAc,SAAsB1L,GACjD,GAAW,GAAPA,EAAY,MAAO,CAACa,KAAM,KAAMa,MAAO,EAAGwC,OAAQ,GACtD,IAAIkC,EAAM5I,KAAKD,QAAQwF,UAAU/C,GAC3B0B,EAAQ0E,EAAI1E,MACZwC,EAASkC,EAAIlC,OACnB,GAAIA,EAASlE,EAAO,MAAO,CAACa,KAAMrD,KAAKD,QAAQ0C,MAAMyB,GAAQA,MAAOA,EAAOwC,OAAQA,GACnF,IAAIrD,EAAOrD,KAAKD,QAAQ0C,MAAMyB,EAAQ,GACtC,MAAO,CAACb,KAAMA,EAAMa,MAAOA,EAAQ,EAAGwC,OAAQA,EAASrD,EAAKvB,WAM9DwL,EAAK5N,UAAUmN,QAAU,SAAkBrK,GAAO,OAAO8I,EAAYyB,cAAc/M,KAAMwC,IAEzF8K,EAAK5N,UAAUqJ,eAAiB,SAAyBvG,GAAO,OAAO8I,EAAYuB,QAAQ7M,KAAMwC,IAKjG8K,EAAK5N,UAAUyO,aAAe,SAAuB5M,EAAMc,EAAIyE,GAC7D,IAAI1G,GAAQ,EAKZ,OAJIiC,EAAKd,GAAQvB,KAAKoC,aAAab,EAAMc,GAAI,SAAUgB,GAErD,OADIyD,EAAKY,QAAQrE,EAAKyE,SAAU1H,GAAQ,IAChCA,KAEHA,GAKTmN,EAAqB/J,QAAQ7E,IAAM,WAAc,OAAOqB,KAAK8G,KAAKtD,SAKlE+J,EAAqBE,YAAY9O,IAAM,WAAc,OAAOqB,KAAK8G,KAAK2G,aAItEF,EAAqBd,cAAc9N,IAAM,WAAc,OAAOqB,KAAK8G,KAAK2F,eAKxEc,EAAqBnB,SAASzN,IAAM,WAAc,OAAOqB,KAAK8G,KAAKsF,UAInEmB,EAAqBjK,OAAO3E,IAAM,WAAc,OAAOqB,KAAK8G,KAAKxD,QAIjEiK,EAAqBhK,OAAO5E,IAAM,WAAc,OAAOqB,KAAK8G,KAAKvD,QAQjEgK,EAAqBG,OAAO/O,IAAM,WAAc,OAAOqB,KAAK8G,KAAK4G,QAKjEJ,EAAK5N,UAAUiG,SAAW,WACxB,GAAI3F,KAAK8G,KAAKqE,KAAKiD,cAAiB,OAAOpO,KAAK8G,KAAKqE,KAAKiD,cAAcpO,MACxE,IAAI3B,EAAO2B,KAAK8G,KAAKzI,KAGrB,OAFI2B,KAAKD,QAAQyB,OACbnD,GAAQ,IAAM2B,KAAKD,QAAQ6F,gBAAkB,KAC1CyI,EAAUrO,KAAK8H,MAAOzJ,IAK/BiP,EAAK5N,UAAU4O,eAAiB,SAAyBpK,GACvD,IAAIqK,EAAQvO,KAAK8G,KAAK0H,aAAaC,cAAczO,KAAKD,QAAS,EAAGmE,GAClE,IAAKqK,EAAS,MAAM,IAAIrH,MAAM,wDAC9B,OAAOqH,GASTjB,EAAK5N,UAAUiL,WAAa,SAAqBpJ,EAAMc,EAAIqM,EAAa/L,EAAOD,QACtD,IAAhBgM,IAAyBA,EAAc7M,EAASmC,YACtC,IAAVrB,IAAmBA,EAAQ,QACnB,IAARD,IAAiBA,EAAMgM,EAAYvM,YAE1C,IAAIwM,EAAM3O,KAAKsO,eAAe/M,GAAMkN,cAAcC,EAAa/L,EAAOD,GAClEkM,EAAMD,GAAOA,EAAIF,cAAczO,KAAKD,QAASsC,GACjD,IAAKuM,IAAQA,EAAIC,SAAY,OAAO,EACpC,IAAK,IAAI/Q,EAAI6E,EAAO7E,EAAI4E,EAAK5E,IAAO,IAAKkC,KAAK8G,KAAKgI,YAAYJ,EAAYjM,MAAM3E,GAAGgK,OAAU,OAAO,EACrG,OAAO,GAMTwF,EAAK5N,UAAUqP,eAAiB,SAAyBxN,EAAMc,EAAIyE,EAAMgB,GACvE,GAAIA,IAAU9H,KAAK8G,KAAKgI,YAAYhH,GAAU,OAAO,EACrD,IAAInF,EAAQ3C,KAAKsO,eAAe/M,GAAMyN,UAAUlI,GAC5CpE,EAAMC,GAASA,EAAM8L,cAAczO,KAAKD,QAASsC,GACrD,QAAOK,GAAMA,EAAImM,UAQnBvB,EAAK5N,UAAUuP,UAAY,SAAoBxL,GAC7C,OAAIA,EAAM1D,QAAQyB,KAAexB,KAAK2K,WAAW3K,KAAKmC,WAAYnC,KAAKmC,WAAYsB,EAAM1D,SAC3EC,KAAK8G,KAAK8C,kBAAkBnG,EAAMqD,OAMlDwG,EAAK5N,UAAUwP,MAAQ,WACrB,IAAKlP,KAAK8G,KAAKuD,aAAarK,KAAKD,SAC7B,MAAM,IAAIuE,WAAY,4BAA+BtE,KAAK8G,KAAS,KAAI,KAAQ9G,KAAKD,QAAQ4F,WAAWjF,MAAM,EAAG,KACpHV,KAAKD,QAAQoB,SAAQ,SAAUkC,GAAQ,OAAOA,EAAK6L,YAKrD5B,EAAK5N,UAAUoG,OAAS,WACtB,IAAI6B,EAAM,CAACb,KAAM9G,KAAK8G,KAAKzI,MAC3B,IAAK,IAAIuJ,KAAK5H,KAAKwG,MAAO,CACxBmB,EAAInB,MAAQxG,KAAKwG,MACjB,MAMF,OAJIxG,KAAKD,QAAQyB,OACbmG,EAAI5H,QAAUC,KAAKD,QAAQ+F,UAC3B9F,KAAK8H,MAAM3H,SACXwH,EAAIG,MAAQ9H,KAAK8H,MAAMxG,KAAI,SAAU/B,GAAK,OAAOA,EAAEuG,aAChD6B,GAKT2F,EAAKvH,SAAW,SAAmBC,EAAQ6B,GACzC,IAAKA,EAAQ,MAAM,IAAIvD,WAAW,mCAClC,IAAIwD,EAAQ,KACZ,GAAID,EAAKC,MAAO,CACd,IAAK7B,MAAMC,QAAQ2B,EAAKC,OAAU,MAAM,IAAIxD,WAAW,uCACvDwD,EAAQD,EAAKC,MAAMxG,IAAI0E,EAAOmJ,cAEhC,GAAiB,QAAbtH,EAAKf,KAAgB,CACvB,GAAwB,iBAAbe,EAAK1E,KAAoB,MAAM,IAAImB,WAAW,6BACzD,OAAO0B,EAAO7C,KAAK0E,EAAK1E,KAAM2E,GAEhC,IAAI/H,EAAU8B,EAASkE,SAASC,EAAQ6B,EAAK9H,SAC7C,OAAOiG,EAAOoJ,SAASvH,EAAKf,MAAM1H,OAAOyI,EAAKrB,MAAOzG,EAAS+H,IAGhEtJ,OAAOiI,iBAAkB6G,EAAK5N,UAAW6N,GAEzC,IAAI8B,EAAyB,SAAU/B,GACrC,SAAS+B,EAASvI,EAAMN,EAAOzG,EAAS+H,GAGtC,GAFAwF,EAAKrP,KAAK+B,KAAM8G,EAAMN,EAAO,KAAMsB,IAE9B/H,EAAW,MAAM,IAAIuE,WAAW,oCAErCtE,KAAKmD,KAAOpD,EAGTuN,IAAO+B,EAASlI,UAAYmG,GACjC+B,EAAS3P,UAAYlB,OAAOY,OAAQkO,GAAQA,EAAK5N,WACjD2P,EAAS3P,UAAUO,YAAcoP,EAEjC,IAAI/G,EAAuB,CAAEkF,YAAa,CAAEvL,cAAc,GAAOH,SAAU,CAAEG,cAAc,IA0C3F,OAxCAoN,EAAS3P,UAAUiG,SAAW,WAC5B,OAAI3F,KAAK8G,KAAKqE,KAAKiD,cAAwBpO,KAAK8G,KAAKqE,KAAKiD,cAAcpO,MACjEqO,EAAUrO,KAAK8H,MAAOwH,KAAKC,UAAUvP,KAAKmD,QAGnDmF,EAAqBkF,YAAY7O,IAAM,WAAc,OAAOqB,KAAKmD,MAEjEkM,EAAS3P,UAAUsD,YAAc,SAAsBzB,EAAMc,GAAM,OAAOrC,KAAKmD,KAAKzC,MAAMa,EAAMc,IAEhGiG,EAAqBxG,SAASnD,IAAM,WAAc,OAAOqB,KAAKmD,KAAKhD,QAEnEkP,EAAS3P,UAAUoO,KAAO,SAAehG,GACvC,OAAOA,GAAS9H,KAAK8H,MAAQ9H,KAAO,IAAIqP,EAASrP,KAAK8G,KAAM9G,KAAKwG,MAAOxG,KAAKmD,KAAM2E,IAGrFuH,EAAS3P,UAAUmE,SAAW,SAAmBV,GAC/C,OAAIA,GAAQnD,KAAKmD,KAAenD,KACzB,IAAIqP,EAASrP,KAAK8G,KAAM9G,KAAKwG,MAAOrD,EAAMnD,KAAK8H,QAGxDuH,EAAS3P,UAAUoE,IAAM,SAAcvC,EAAMc,GAI3C,YAHc,IAATd,IAAkBA,EAAO,QAClB,IAAPc,IAAgBA,EAAKrC,KAAKmD,KAAKhD,QAExB,GAARoB,GAAac,GAAMrC,KAAKmD,KAAKhD,OAAiBH,KAC3CA,KAAK6D,SAAS7D,KAAKmD,KAAKzC,MAAMa,EAAMc,KAG7CgN,EAAS3P,UAAU2E,GAAK,SAAaZ,GACnC,OAAOzD,KAAK4D,WAAWH,IAAUzD,KAAKmD,MAAQM,EAAMN,MAGtDkM,EAAS3P,UAAUoG,OAAS,WAC1B,IAAI0J,EAAOlC,EAAK5N,UAAUoG,OAAO7H,KAAK+B,MAEtC,OADAwP,EAAKrM,KAAOnD,KAAKmD,KACVqM,GAGThR,OAAOiI,iBAAkB4I,EAAS3P,UAAW4I,GAEtC+G,EAvDmB,CAwD1B/B,GAEF,SAASe,EAAUvG,EAAO8E,GACxB,IAAK,IAAI9O,EAAIgK,EAAM3H,OAAS,EAAGrC,GAAK,EAAGA,IACnC8O,EAAM9E,EAAMhK,GAAGgJ,KAAKzI,KAAO,IAAMuO,EAAM,IAC3C,OAAOA,EAOT,IAAI6C,EAAe,SAAsBZ,GAGvC7O,KAAK6O,SAAWA,EAChB7O,KAAKqM,KAAO,GACZrM,KAAK0P,UAAY,IAGfC,EAAuB,CAAElD,cAAe,CAAExK,cAAc,GAAO2N,YAAa,CAAE3N,cAAc,GAAO4N,UAAW,CAAE5N,cAAc,IAElIwN,EAAaK,MAAQ,SAAgBC,EAAQC,GAC3C,IAAIC,EAAS,IAAIC,EAAYH,EAAQC,GACrC,GAAmB,MAAfC,EAAO5D,KAAgB,OAAOoD,EAAazL,MAC/C,IAAImM,EAAOC,EAAUH,GACjBA,EAAO5D,MAAQ4D,EAAOhJ,IAAI,4BAC9B,IAAIsH,EAuVN,SAAa8B,GACX,IAAIC,EAAU9R,OAAOY,OAAO,MAC5B,OAEA,SAASmR,EAAQC,GACf,IAAIC,EAAM,GACVD,EAAOrP,SAAQ,SAAUkC,GACvBgN,EAAIhN,GAAMlC,SAAQ,SAAUyH,GAC1B,IAAI8H,EAAO9H,EAAI8H,KACXrO,EAAKuG,EAAIvG,GAEb,GAAKqO,EAAL,CACA,IAAIC,EAAQF,EAAIG,QAAQF,GAAOrJ,EAAMsJ,GAAS,GAAKF,EAAIE,EAAQ,GAC/DE,EAASR,EAAKhO,GAAIlB,SAAQ,SAAUkC,GAC7BgE,GAAOoJ,EAAI9P,KAAK+P,EAAMrJ,EAAM,KACP,GAAtBA,EAAIuJ,QAAQvN,IAAegE,EAAI1G,KAAK0C,aAK9C,IADA,IAAIyN,EAAQR,EAAQE,EAAO3K,KAAK,MAAQ,IAAI4J,EAAae,EAAOI,QAAQP,EAAIlQ,OAAS,IAAM,GAClFrC,EAAI,EAAGA,EAAI2S,EAAItQ,OAAQrC,GAAK,EAAG,CACtC,IAAIiT,EAAWN,EAAI3S,EAAI,GAAGoK,KAAK8I,GAC/BF,EAAMzE,KAAK1L,KAAK8P,EAAI3S,GAAIwS,EAAQS,EAASlL,KAAK,OAAS0K,EAAQQ,IAEjE,OAAOD,EAtBFP,CAAQM,EAASR,EAAK,IAzVjBY,CAkQd,SAAad,GACX,IAAIE,EAAM,CAAC,IAEX,OADAa,EAWA,SAASC,EAAQhB,EAAM5O,GACrB,GAAiB,UAAb4O,EAAKrJ,KACP,OAAOqJ,EAAKiB,MAAMC,QAAO,SAAUZ,EAAKN,GAAQ,OAAOM,EAAI3P,OAAOqQ,EAAQhB,EAAM5O,MAAW,IACtF,GAAiB,OAAb4O,EAAKrJ,KACd,IAAK,IAAIhJ,EAAI,GAAIA,IAAK,CACpB,IAAIuO,EAAO8E,EAAQhB,EAAKiB,MAAMtT,GAAIyD,GAClC,GAAIzD,GAAKqS,EAAKiB,MAAMjR,OAAS,EAAK,OAAOkM,EACzC6E,EAAQ7E,EAAM9K,EAAO8B,SAElB,IAAiB,QAAb8M,EAAKrJ,KAAgB,CAC9B,IAAIwK,EAAOjO,IAGX,OAFAkO,EAAKhQ,EAAM+P,GACXJ,EAAQC,EAAQhB,EAAKA,KAAMmB,GAAOA,GAC3B,CAACC,EAAKD,IACR,GAAiB,QAAbnB,EAAKrJ,KAAgB,CAC9B,IAAI0K,EAASnO,IAGb,OAFA6N,EAAQC,EAAQhB,EAAKA,KAAM5O,GAAOiQ,GAClCN,EAAQC,EAAQhB,EAAKA,KAAMqB,GAASA,GAC7B,CAACD,EAAKC,IACR,GAAiB,OAAbrB,EAAKrJ,KACd,MAAO,CAACyK,EAAKhQ,IAAOT,OAAOqQ,EAAQhB,EAAKA,KAAM5O,IACzC,GAAiB,SAAb4O,EAAKrJ,KAAiB,CAE/B,IADA,IAAI2K,EAAMlQ,EACDmQ,EAAM,EAAGA,EAAMvB,EAAKrN,IAAK4O,IAAO,CACvC,IAAIC,EAAStO,IACb6N,EAAQC,EAAQhB,EAAKA,KAAMsB,GAAME,GACjCF,EAAME,EAER,IAAiB,GAAbxB,EAAKtN,IACPqO,EAAQC,EAAQhB,EAAKA,KAAMsB,GAAMA,QAEjC,IAAK,IAAIG,EAAMzB,EAAKrN,IAAK8O,EAAMzB,EAAKtN,IAAK+O,IAAO,CAC9C,IAAIC,EAASxO,IACbkO,EAAKE,EAAKI,GACVX,EAAQC,EAAQhB,EAAKA,KAAMsB,GAAMI,GACjCJ,EAAMI,EAGV,MAAO,CAACN,EAAKE,IACR,GAAiB,QAAbtB,EAAKrJ,KACd,MAAO,CAACyK,EAAKhQ,EAAM,KAAM4O,EAAKpR,SAnD1BoS,CAAQhB,EAAM,GAAI9M,KACnBgN,EAEP,SAAShN,IAAS,OAAOgN,EAAI1P,KAAK,IAAM,EACxC,SAAS4Q,EAAKhQ,EAAMc,EAAIqO,GACtB,IAAIa,EAAO,CAACb,KAAMA,EAAMrO,GAAIA,GAE5B,OADAgO,EAAI9O,GAAMZ,KAAK4Q,GACRA,EAET,SAASL,EAAQY,EAAOzP,GAAMyP,EAAM3Q,SAAQ,SAAUoQ,GAAQ,OAAOA,EAAKlP,GAAKA,MA7Q/DgO,CAAIF,IAEpB,OAiXF,SAA0B5B,EAAO0B,GAC/B,IAAK,IAAInS,EAAI,EAAGiU,EAAO,CAACxD,GAAQzQ,EAAIiU,EAAK5R,OAAQrC,IAAK,CAEpD,IADA,IAAIgT,EAAQiB,EAAKjU,GAAIkU,GAAQlB,EAAMjC,SAAUtI,EAAQ,GAC5C1B,EAAI,EAAGA,EAAIiM,EAAMzE,KAAKlM,OAAQ0E,GAAK,EAAG,CAC7C,IAAIxB,EAAOyN,EAAMzE,KAAKxH,GAAIwH,EAAOyE,EAAMzE,KAAKxH,EAAI,GAChD0B,EAAM5F,KAAK0C,EAAKhF,OACZ2T,GAAU3O,EAAKC,QAAUD,EAAK4O,qBAAuBD,GAAO,IACrC,GAAvBD,EAAKnB,QAAQvE,IAAe0F,EAAKpR,KAAK0L,GAExC2F,GAAQ/B,EAAOhJ,IAAI,+BAAiCV,EAAMV,KAAK,MAAQ,mFA3X7EqM,CAAiB3D,EAAO0B,GACjB1B,GAMTkB,EAAa/P,UAAUsP,UAAY,SAAoBlI,GACrD,IAAK,IAAIhJ,EAAI,EAAGA,EAAIkC,KAAKqM,KAAKlM,OAAQrC,GAAK,EACvC,GAAIkC,KAAKqM,KAAKvO,IAAMgJ,EAAQ,OAAO9G,KAAKqM,KAAKvO,EAAI,GACrD,OAAO,MAMT2R,EAAa/P,UAAU+O,cAAgB,SAAwB0D,EAAMxP,EAAOD,QACzD,IAAVC,IAAmBA,EAAQ,QACnB,IAARD,IAAiBA,EAAMyP,EAAKhQ,YAGnC,IADA,IAAIsP,EAAMzR,KACDlC,EAAI6E,EAAO8O,GAAO3T,EAAI4E,EAAK5E,IAChC2T,EAAMA,EAAIzC,UAAUmD,EAAK1P,MAAM3E,GAAGgJ,MACtC,OAAO2K,GAGT9B,EAAqBlD,cAAc9N,IAAM,WACvC,IAAIgF,EAAQ3D,KAAKqM,KAAK,GACtB,QAAO1I,GAAQA,EAAMyI,UAMvBuD,EAAqBC,YAAYjR,IAAM,WACrC,IAAK,IAAIb,EAAI,EAAGA,EAAIkC,KAAKqM,KAAKlM,OAAQrC,GAAK,EAAG,CAC5C,IAAIgJ,EAAO9G,KAAKqM,KAAKvO,GACrB,IAAMgJ,EAAKxD,SAAUwD,EAAKmL,mBAAuB,OAAOnL,IAI5D2I,EAAa/P,UAAU0S,WAAa,SAAqB3O,GACvD,IAAK,IAAI3F,EAAI,EAAGA,EAAIkC,KAAKqM,KAAKlM,OAAQrC,GAAK,EACvC,IAAK,IAAI+G,EAAI,EAAGA,EAAIpB,EAAM4I,KAAKlM,OAAQ0E,GAAK,EAC1C,GAAI7E,KAAKqM,KAAKvO,IAAM2F,EAAM4I,KAAKxH,GAAM,OAAO,EAClD,OAAO,GAUT4K,EAAa/P,UAAU2S,WAAa,SAAqBvG,EAAOwG,EAAOtI,QACpD,IAAVsI,IAAmBA,GAAQ,QACZ,IAAftI,IAAwBA,EAAa,GAE5C,IAAIuI,EAAO,CAACvS,MAgBZ,OAfA,SAASwS,EAAOjE,EAAOkE,GACrB,IAAIC,EAAWnE,EAAME,cAAc3C,EAAO9B,GAC1C,GAAI0I,KAAcJ,GAASI,EAAS7D,UAChC,OAAOhN,EAASN,KAAKkR,EAAMnR,KAAI,SAAUqR,GAAM,OAAOA,EAAGC,oBAE7D,IAAK,IAAI9U,EAAI,EAAGA,EAAIyQ,EAAMlC,KAAKlM,OAAQrC,GAAK,EAAG,CAC7C,IAAIgJ,EAAOyH,EAAMlC,KAAKvO,GAAIuO,EAAOkC,EAAMlC,KAAKvO,EAAI,GAChD,IAAMgJ,EAAKxD,SAAUwD,EAAKmL,qBAA8C,GAAvBM,EAAK3B,QAAQvE,GAAa,CACzEkG,EAAK5R,KAAK0L,GACV,IAAIjM,EAAQoS,EAAOnG,EAAMoG,EAAM3R,OAAOgG,IACtC,GAAI1G,EAAS,OAAOA,IAKnBoS,CAAOxS,KAAM,KAQtByP,EAAa/P,UAAUmT,aAAe,SAAuB9I,GAC3D,IAAK,IAAIjM,EAAI,EAAGA,EAAIkC,KAAK0P,UAAUvP,OAAQrC,GAAK,EAC5C,GAAIkC,KAAK0P,UAAU5R,IAAMiM,EAAU,OAAO/J,KAAK0P,UAAU5R,EAAI,GACjE,IAAIgV,EAAW9S,KAAK+S,gBAAgBhJ,GAEpC,OADA/J,KAAK0P,UAAU/O,KAAKoJ,EAAQ+I,GACrBA,GAGTrD,EAAa/P,UAAUqT,gBAAkB,SAA0BhJ,GAEjE,IADA,IAAIwI,EAAO/T,OAAOY,OAAO,MAAO4T,EAAS,CAAC,CAACzE,MAAOvO,KAAM8G,KAAM,KAAMmM,IAAK,OAClED,EAAO7S,QAAQ,CACpB,IAAIgE,EAAU6O,EAAOE,QAAS3E,EAAQpK,EAAQoK,MAC9C,GAAIA,EAAMS,UAAUjF,GAAS,CAE3B,IADA,IAAIpI,EAAS,GACJgG,EAAMxD,EAASwD,EAAIb,KAAMa,EAAMA,EAAIsL,IACxCtR,EAAOhB,KAAKgH,EAAIb,MACpB,OAAOnF,EAAOwR,UAEhB,IAAK,IAAIrV,EAAI,EAAGA,EAAIyQ,EAAMlC,KAAKlM,OAAQrC,GAAK,EAAG,CAC7C,IAAIgJ,EAAOyH,EAAMlC,KAAKvO,GACjBgJ,EAAKvD,QAAWuD,EAAKmL,oBAAwBnL,EAAKzI,QAAQkU,GAAWpO,EAAQ2C,OAAQyH,EAAMlC,KAAKvO,EAAI,GAAG+Q,WAC1GmE,EAAOrS,KAAK,CAAC4N,MAAOzH,EAAK0H,aAAc1H,KAAMA,EAAMmM,IAAK9O,IACxDoO,EAAKzL,EAAKzI,OAAQ,MAS1BsR,EAAqBE,UAAUlR,IAAM,WACnC,OAAOqB,KAAKqM,KAAKlM,QAAU,GAM7BsP,EAAa/P,UAAU6R,KAAO,SAAehS,GAC3C,IAAIzB,EAAIyB,GAAK,EACb,GAAIzB,GAAKkC,KAAKqM,KAAKlM,OAAU,MAAM,IAAImE,WAAY,cAAgB/E,EAAI,iCACvE,MAAO,CAACuH,KAAM9G,KAAKqM,KAAKvO,GAAIuO,KAAMrM,KAAKqM,KAAKvO,EAAI,KAGlD2R,EAAa/P,UAAUiG,SAAW,WAChC,IAAI4M,EAAO,GAOX,OANA,SAASa,EAAKlV,GACZqU,EAAK5R,KAAKzC,GACV,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAEmO,KAAKlM,OAAQrC,GAAK,GACJ,GAA5ByU,EAAK3B,QAAQ1S,EAAEmO,KAAKvO,KAAasV,EAAKlV,EAAEmO,KAAKvO,IAEvDsV,CAAKpT,MACEuS,EAAKjR,KAAI,SAAUpD,EAAGJ,GAE3B,IADA,IAAI2S,EAAM3S,GAAKI,EAAE2Q,SAAW,IAAM,KAAO,IAChC6C,EAAM,EAAGA,EAAMxT,EAAEmO,KAAKlM,OAAQuR,GAAO,EAC1CjB,IAAQiB,EAAM,KAAO,IAAMxT,EAAEmO,KAAKqF,GAAKrT,KAAO,KAAOkU,EAAK3B,QAAQ1S,EAAEmO,KAAKqF,EAAM,IACnF,OAAOjB,KACN5K,KAAK,OAGVrH,OAAOiI,iBAAkBgJ,EAAa/P,UAAWiQ,GAEjDF,EAAazL,MAAQ,IAAIyL,GAAa,GAEtC,IAAIS,EAAc,SAAqBH,EAAQC,GAC7ChQ,KAAK+P,OAASA,EACd/P,KAAKgQ,UAAYA,EACjBhQ,KAAKqT,OAAS,KACdrT,KAAKwC,IAAM,EACXxC,KAAKsT,OAASvD,EAAOwD,MAAM,kBACgB,IAAvCvT,KAAKsT,OAAOtT,KAAKsT,OAAOnT,OAAS,IAAYH,KAAKsT,OAAOE,MACvC,IAAlBxT,KAAKsT,OAAO,IAAYtT,KAAKsT,OAAOJ,SAGtCO,EAAyB,CAAEpH,KAAM,CAAEpK,cAAc,IAUrD,SAASmO,EAAUH,GACjB,IAAImB,EAAQ,GACZ,GAAKA,EAAMzQ,KAAK+S,EAAazD,UACtBA,EAAO0D,IAAI,MAClB,OAAuB,GAAhBvC,EAAMjR,OAAciR,EAAM,GAAK,CAACtK,KAAM,SAAUsK,MAAOA,GAGhE,SAASsC,EAAazD,GACpB,IAAImB,EAAQ,GACZ,GAAKA,EAAMzQ,KAAKiT,EAAmB3D,UAC5BA,EAAO5D,MAAuB,KAAf4D,EAAO5D,MAA8B,KAAf4D,EAAO5D,MACnD,OAAuB,GAAhB+E,EAAMjR,OAAciR,EAAM,GAAK,CAACtK,KAAM,MAAOsK,MAAOA,GAG7D,SAASwC,EAAmB3D,GAE1B,IADA,IAAIE,EA4CN,SAAuBF,GACrB,GAAIA,EAAO0D,IAAI,KAAM,CACnB,IAAIxD,EAAOC,EAAUH,GAErB,OADKA,EAAO0D,IAAI,MAAQ1D,EAAOhJ,IAAI,yBAC5BkJ,EACF,IAAK,KAAK0D,KAAK5D,EAAO5D,MAAO,CAClC,IAAI+E,EAlBR,SAAqBnB,EAAQ5R,GAC3B,IAAIoU,EAAQxC,EAAOD,UAAWlJ,EAAO2L,EAAMpU,GAC3C,GAAIyI,EAAQ,MAAO,CAACA,GACpB,IAAInF,EAAS,GACb,IAAK,IAAImS,KAAYrB,EAAO,CAC1B,IAAIsB,EAAStB,EAAMqB,GACfC,EAAOC,OAAOpD,QAAQvS,IAAS,GAAKsD,EAAOhB,KAAKoT,GAEjC,GAAjBpS,EAAOxB,QAAe8P,EAAOhJ,IAAI,0BAA4B5I,EAAO,WACxE,OAAOsD,EASOsS,CAAYhE,EAAQA,EAAO5D,MAAM/K,KAAI,SAAUwF,GAGzD,OAFqB,MAAjBmJ,EAAOoD,OAAkBpD,EAAOoD,OAASvM,EAAKsF,SACzC6D,EAAOoD,QAAUvM,EAAKsF,UAAY6D,EAAOhJ,IAAI,mCAC/C,CAACH,KAAM,OAAQ/H,MAAO+H,MAG/B,OADAmJ,EAAOzN,MACgB,GAAhB4O,EAAMjR,OAAciR,EAAM,GAAK,CAACtK,KAAM,SAAUsK,MAAOA,GAE9DnB,EAAOhJ,IAAI,qBAAuBgJ,EAAO5D,KAAO,KA1DvC6H,CAAcjE,KAEvB,GAAIA,EAAO0D,IAAI,KACXxD,EAAO,CAACrJ,KAAM,OAAQqJ,KAAMA,QAC3B,GAAIF,EAAO0D,IAAI,KAChBxD,EAAO,CAACrJ,KAAM,OAAQqJ,KAAMA,QAC3B,GAAIF,EAAO0D,IAAI,KAChBxD,EAAO,CAACrJ,KAAM,MAAOqJ,KAAMA,OAC1B,KAAIF,EAAO0D,IAAI,KAEb,MADHxD,EAAOgE,EAAelE,EAAQE,GAGpC,OAAOA,EAGT,SAASiE,EAASnE,GACZ,KAAK4D,KAAK5D,EAAO5D,OAAS4D,EAAOhJ,IAAI,yBAA2BgJ,EAAO5D,KAAO,KAClF,IAAI1K,EAAS0S,OAAOpE,EAAO5D,MAE3B,OADA4D,EAAOzN,MACAb,EAGT,SAASwS,EAAelE,EAAQE,GAC9B,IAAIrN,EAAMsR,EAASnE,GAASpN,EAAMC,EAMlC,OALImN,EAAO0D,IAAI,OACa9Q,EAAP,KAAfoN,EAAO5D,KAAqB+H,EAASnE,IAC3B,GAEXA,EAAO0D,IAAI,MAAQ1D,EAAOhJ,IAAI,yBAC5B,CAACH,KAAM,QAAShE,IAAKA,EAAKD,IAAKA,EAAKsN,KAAMA,GAwGnD,SAASa,EAAIvM,EAAGC,GAAK,OAAOA,EAAID,EAKhC,SAASoM,EAASR,EAAKhN,GACrB,IAAI1B,EAAS,GAEb,OAEA,SAASyR,EAAK/P,GACZ,IAAIyO,EAAQzB,EAAIhN,GAChB,GAAoB,GAAhByO,EAAM3R,SAAgB2R,EAAM,GAAGpB,KAAQ,OAAO0C,EAAKtB,EAAM,GAAGzP,IAChEV,EAAOhB,KAAK0C,GACZ,IAAK,IAAIvF,EAAI,EAAGA,EAAIgU,EAAM3R,OAAQrC,IAAK,CACrC,IAAI8K,EAAMkJ,EAAMhU,GACZ4S,EAAO9H,EAAI8H,KACXrO,EAAKuG,EAAIvG,GACRqO,IAA+B,GAAvB/O,EAAOiP,QAAQvO,IAAa+Q,EAAK/Q,IAXlD+Q,CAAK/P,GACE1B,EAAOuG,KAAK8I,GAgErB,SAASnD,EAAarH,GACpB,IAAI8N,EAAW9V,OAAOY,OAAO,MAC7B,IAAK,IAAImV,KAAY/N,EAAO,CAC1B,IAAIgO,EAAOhO,EAAM+N,GACjB,IAAKC,EAAKC,WAAc,OAAO,KAC/BH,EAASC,GAAYC,EAAKE,QAE5B,OAAOJ,EAGT,SAASK,EAAanO,EAAOzH,GAC3B,IAAI6V,EAAQpW,OAAOY,OAAO,MAC1B,IAAK,IAAIf,KAAQmI,EAAO,CACtB,IAAIqO,EAAQ9V,GAASA,EAAMV,GAC3B,QAAcgC,IAAVwU,EAAqB,CACvB,IAAIL,EAAOhO,EAAMnI,GACjB,IAAImW,EAAKC,WACF,MAAM,IAAInQ,WAAW,mCAAqCjG,GAD1CwW,EAAQL,EAAKE,QAGtCE,EAAMvW,GAAQwW,EAEhB,OAAOD,EAGT,SAASE,EAAUtO,GACjB,IAAI7E,EAASnD,OAAOY,OAAO,MAC3B,GAAIoH,EAAS,IAAK,IAAInI,KAAQmI,EAAS7E,EAAOtD,GAAQ,IAAI0W,EAAUvO,EAAMnI,IAC1E,OAAOsD,EA/PT8R,EAAuBpH,KAAK1N,IAAM,WAAc,OAAOqB,KAAKsT,OAAOtT,KAAKwC,MAExE0N,EAAYxQ,UAAUiU,IAAM,SAAcqB,GAAO,OAAOhV,KAAKqM,MAAQ2I,IAAQhV,KAAKwC,QAAS,IAE3F0N,EAAYxQ,UAAUuH,IAAM,SAAc2F,GAAO,MAAM,IAAIqI,YAAYrI,EAAM,4BAA8B5M,KAAK+P,OAAS,OAEzHvR,OAAOiI,iBAAkByJ,EAAYxQ,UAAW+T,GAgQhD,IAAIyB,EAAW,SAAkB7W,EAAM2H,EAAQmF,GAG7CnL,KAAK3B,KAAOA,EAIZ2B,KAAKgG,OAASA,EAIdhG,KAAKmL,KAAOA,EAEZnL,KAAKgU,OAAS7I,EAAKgK,MAAQhK,EAAKgK,MAAM5B,MAAM,KAAO,GACnDvT,KAAKwG,MAAQsO,EAAU3J,EAAK3E,OAE5BxG,KAAK6N,aAAeA,EAAa7N,KAAKwG,OAItCxG,KAAKwO,aAAe,KAKpBxO,KAAKoV,QAAU,KAIfpV,KAAKyM,cAAgB,KAIrBzM,KAAKwD,UAAY2H,EAAKkI,QAAkB,QAARhV,GAIhC2B,KAAKsD,OAAiB,QAARjF,GAGZgX,EAAuB,CAAEjJ,SAAU,CAAEnK,cAAc,GAAOwL,YAAa,CAAExL,cAAc,GAAOsB,OAAQ,CAAEtB,cAAc,GAAOyL,OAAQ,CAAEzL,cAAc,IAIzJoT,EAAqBjJ,SAASzN,IAAM,WAAc,OAAQqB,KAAKwD,SAK/D6R,EAAqB5H,YAAY9O,IAAM,WAAc,OAAOqB,KAAKwD,SAAWxD,KAAKyM,eAIjF4I,EAAqB9R,OAAO5E,IAAM,WAAc,OAAOqB,KAAKwO,cAAgBiB,EAAazL,OAKzFqR,EAAqB3H,OAAO/O,IAAM,WAAc,OAAOqB,KAAKuD,QAAUvD,KAAKmL,KAAKmK,MAIhFJ,EAASxV,UAAUuS,iBAAmB,WACpC,IAAK,IAAI1S,KAAKS,KAAKwG,MAAS,GAAIxG,KAAKwG,MAAMjH,GAAGgW,WAAc,OAAO,EACnE,OAAO,GAGTL,EAASxV,UAAUkK,kBAAoB,SAA4BnG,GACjE,OAAOzD,MAAQyD,GAASzD,KAAKwO,aAAa4D,WAAW3O,EAAM+K,eAG7D0G,EAASxV,UAAUiV,aAAe,SAAyBnO,GACzD,OAAKA,GAASxG,KAAK6N,aAAuB7N,KAAK6N,aACjC8G,EAAa3U,KAAKwG,MAAOA,IAUzC0O,EAASxV,UAAUN,OAAS,SAAiBoH,EAAOzG,EAAS+H,GAC3D,GAAI9H,KAAKsD,OAAU,MAAM,IAAI4D,MAAM,8CACnC,OAAO,IAAIoG,EAAKtN,KAAMA,KAAK2U,aAAanO,GAAQ3E,EAASN,KAAKxB,GAAU8G,EAAKmB,QAAQF,KAOvFoN,EAASxV,UAAU8V,cAAgB,SAAwBhP,EAAOzG,EAAS+H,GAEzE,GADA/H,EAAU8B,EAASN,KAAKxB,IACnBC,KAAKqK,aAAatK,GACnB,MAAM,IAAIuE,WAAW,4BAA8BtE,KAAK3B,MAC5D,OAAO,IAAIiP,EAAKtN,KAAMA,KAAK2U,aAAanO,GAAQzG,EAAS8G,EAAKmB,QAAQF,KAUxEoN,EAASxV,UAAUkT,cAAgB,SAAwBpM,EAAOzG,EAAS+H,GAGzE,GAFAtB,EAAQxG,KAAK2U,aAAanO,IAC1BzG,EAAU8B,EAASN,KAAKxB,IACZyB,KAAM,CAChB,IAAIqK,EAAS7L,KAAKwO,aAAa6D,WAAWtS,GAC1C,IAAK8L,EAAU,OAAO,KACtB9L,EAAU8L,EAAOnK,OAAO3B,GAE1B,IAAI+L,EAAQ9L,KAAKwO,aAAaC,cAAc1O,GAASsS,WAAWxQ,EAASmC,OAAO,GAChF,OAAK8H,EACE,IAAIwB,EAAKtN,KAAMwG,EAAOzG,EAAQ2B,OAAOoK,GAAQjF,EAAKmB,QAAQF,IAD5C,MAOvBoN,EAASxV,UAAU2K,aAAe,SAAuBtK,GACvD,IAAI4B,EAAS3B,KAAKwO,aAAaC,cAAc1O,GAC7C,IAAK4B,IAAWA,EAAOkN,SAAY,OAAO,EAC1C,IAAK,IAAI/Q,EAAI,EAAGA,EAAIiC,EAAQoC,WAAYrE,IACpC,IAAKkC,KAAK8O,YAAY/O,EAAQ0C,MAAM3E,GAAGgK,OAAU,OAAO,EAC5D,OAAO,GAKToN,EAASxV,UAAU+V,eAAiB,SAAyBC,GAC3D,OAAuB,MAAhB1V,KAAKoV,SAAmBpV,KAAKoV,QAAQxE,QAAQ8E,IAAa,GAKnER,EAASxV,UAAUoP,YAAc,SAAsBhH,GACrD,GAAoB,MAAhB9H,KAAKoV,QAAmB,OAAO,EACnC,IAAK,IAAItX,EAAI,EAAGA,EAAIgK,EAAM3H,OAAQrC,IAAO,IAAKkC,KAAKyV,eAAe3N,EAAMhK,GAAGgJ,MAAS,OAAO,EAC3F,OAAO,GAKToO,EAASxV,UAAUiW,aAAe,SAAuB7N,GACvD,GAAoB,MAAhB9H,KAAKoV,QAAmB,OAAOtN,EAEnC,IADA,IAAI1D,EACKtG,EAAI,EAAGA,EAAIgK,EAAM3H,OAAQrC,IAC3BkC,KAAKyV,eAAe3N,EAAMhK,GAAGgJ,MAEvB1C,GACTA,EAAKzD,KAAKmH,EAAMhK,IAFXsG,IAAQA,EAAO0D,EAAMpH,MAAM,EAAG5C,IAKvC,OAAQsG,EAAeA,EAAKjE,OAASiE,EAAOyC,EAAK7C,MAAlC8D,GAGjBoN,EAAS/D,QAAU,SAAkB5K,EAAOP,GAC1C,IAAIrE,EAASnD,OAAOY,OAAO,MAC3BmH,EAAMpF,SAAQ,SAAU9C,EAAM8M,GAAQ,OAAOxJ,EAAOtD,GAAQ,IAAI6W,EAAS7W,EAAM2H,EAAQmF,MAEvF,IAAIyK,EAAU5P,EAAOmF,KAAK0K,SAAW,MACrC,IAAKlU,EAAOiU,GAAY,MAAM,IAAItR,WAAW,yCAA2CsR,EAAU,MAClG,IAAKjU,EAAOwB,KAAQ,MAAM,IAAImB,WAAW,oCACzC,IAAK,IAAIsD,KAAKjG,EAAOwB,KAAKqD,MAAS,MAAM,IAAIlC,WAAW,iDAExD,OAAO3C,GAGTnD,OAAOiI,iBAAkByO,EAASxV,UAAW2V,GAI7C,IAAIN,EAAY,SAAmBe,GACjC9V,KAAKyU,WAAajW,OAAOkB,UAAUC,eAAe1B,KAAK6X,EAAS,WAChE9V,KAAK0U,QAAUoB,EAAQpB,SAGrBqB,EAAyB,CAAER,WAAY,CAAEtT,cAAc,IAE3D8T,EAAuBR,WAAW5W,IAAM,WACtC,OAAQqB,KAAKyU,YAGfjW,OAAOiI,iBAAkBsO,EAAUrV,UAAWqW,GAQ9C,IAAIC,EAAW,SAAkB3X,EAAMmJ,EAAMxB,EAAQmF,GAGnDnL,KAAK3B,KAAOA,EAIZ2B,KAAKgG,OAASA,EAIdhG,KAAKmL,KAAOA,EAEZnL,KAAKwG,MAAQsO,EAAU3J,EAAK3E,OAE5BxG,KAAKwH,KAAOA,EACZxH,KAAKiW,SAAW,KAChB,IAAI3B,EAAWzG,EAAa7N,KAAKwG,OACjCxG,KAAKkW,SAAW5B,GAAY,IAAIzN,EAAK7G,KAAMsU,IAO7C0B,EAAStW,UAAUN,OAAS,SAAiBoH,GAC3C,OAAKA,GAASxG,KAAKkW,SAAmBlW,KAAKkW,SACpC,IAAIrP,EAAK7G,KAAM2U,EAAa3U,KAAKwG,MAAOA,KAGjDwP,EAAS7E,QAAU,SAAkBrJ,EAAO9B,GAC1C,IAAIrE,EAASnD,OAAOY,OAAO,MAAOoI,EAAO,EAEzC,OADAM,EAAM3G,SAAQ,SAAU9C,EAAM8M,GAAQ,OAAOxJ,EAAOtD,GAAQ,IAAI2X,EAAS3X,EAAMmJ,IAAQxB,EAAQmF,MACxFxJ,GAMTqU,EAAStW,UAAU+H,cAAgB,SAAwBJ,GACzD,IAAK,IAAIvJ,EAAI,EAAGA,EAAIuJ,EAAIlH,OAAQrC,IAAWuJ,EAAIvJ,GAAGgJ,MAAQ9G,OACxDqH,EAAMA,EAAI3G,MAAM,EAAG5C,GAAGgD,OAAOuG,EAAI3G,MAAM5C,EAAI,IAC3CA,KAEF,OAAOuJ,GAKT2O,EAAStW,UAAUgI,QAAU,SAAkBL,GAC7C,IAAK,IAAIvJ,EAAI,EAAGA,EAAIuJ,EAAIlH,OAAQrC,IAC5B,GAAIuJ,EAAIvJ,GAAGgJ,MAAQ9G,KAAQ,OAAOqH,EAAIvJ,IAM5CkY,EAAStW,UAAU6H,SAAW,SAAmB9D,GAC/C,OAAOzD,KAAKiW,SAASrF,QAAQnN,IAAU,GAwKzC,IAAI,EAAS,SAAgB0H,GAQ3B,IAAK,IAAIvJ,KADT5B,KAAKmL,KAAO,GACKA,EAAQnL,KAAKmL,KAAKvJ,GAAQuJ,EAAKvJ,GAChD5B,KAAKmL,KAAK5E,MAAQ,EAAWhF,KAAK4J,EAAK5E,OACvCvG,KAAKmL,KAAKrD,MAAQ,EAAWvG,KAAK4J,EAAKrD,OAIvC9H,KAAKuG,MAAQ2O,EAAS/D,QAAQnR,KAAKmL,KAAK5E,MAAOvG,MAI/CA,KAAK8H,MAAQkO,EAAS7E,QAAQnR,KAAKmL,KAAKrD,MAAO9H,MAE/C,IAAImW,EAAmB3X,OAAOY,OAAO,MACrC,IAAK,IAAIgX,KAAUpW,KAAKuG,MAAO,CAC7B,GAAI6P,KAAUpW,KAAK8H,MACf,MAAM,IAAIxD,WAAW8R,EAAS,sCAClC,IAAItP,EAAO9G,KAAKuG,MAAM6P,GAASC,EAAcvP,EAAKqE,KAAKpL,SAAW,GAAIuW,EAAWxP,EAAKqE,KAAKrD,MAC3FhB,EAAK0H,aAAe2H,EAAiBE,KAClCF,EAAiBE,GAAe5G,EAAaK,MAAMuG,EAAarW,KAAKuG,QACxEO,EAAK2F,cAAgB3F,EAAK0H,aAAa/B,cACvC3F,EAAKsO,QAAsB,KAAZkB,EAAkB,KAC/BA,EAAWC,EAAYvW,KAAMsW,EAAS/C,MAAM,MAChC,IAAZ+C,GAAmBxP,EAAK2F,cAAqB,KAAL,GAE5C,IAAK,IAAI+J,KAAUxW,KAAK8H,MAAO,CAC7B,IAAIiM,EAAS/T,KAAK8H,MAAM0O,GAASC,EAAO1C,EAAO5I,KAAK5D,SACpDwM,EAAOkC,SAAmB,MAARQ,EAAe,CAAC1C,GAAkB,IAAR0C,EAAa,GAAKF,EAAYvW,KAAMyW,EAAKlD,MAAM,MAG7FvT,KAAKmG,aAAenG,KAAKmG,aAAa7G,KAAKU,MAC3CA,KAAKmP,aAAenP,KAAKmP,aAAa7P,KAAKU,MAK3CA,KAAK0W,YAAc1W,KAAKuG,MAAMvG,KAAKmL,KAAK0K,SAAW,OAMnD7V,KAAKiN,OAASzO,OAAOY,OAAO,MAC5BY,KAAKiN,OAAO0J,UAAYnY,OAAOY,OAAO,OAsDxC,SAASmX,EAAYvQ,EAAQ8B,GAE3B,IADA,IAAI1H,EAAQ,GACHtC,EAAI,EAAGA,EAAIgK,EAAM3H,OAAQrC,IAAK,CACrC,IAAIO,EAAOyJ,EAAMhK,GAAIgQ,EAAO9H,EAAO8B,MAAMzJ,GAAOuY,EAAK9I,EACrD,GAAIA,EACF1N,EAAMO,KAAKmN,QAEX,IAAK,IAAIlM,KAAQoE,EAAO8B,MAAO,CAC7B,IAAI+O,EAAS7Q,EAAO8B,MAAMlG,IACd,KAARvD,GAAgBwY,EAAO1L,KAAKgK,OAAS0B,EAAO1L,KAAKgK,MAAM5B,MAAM,KAAK3C,QAAQvS,IAAS,IACnF+B,EAAMO,KAAKiW,EAAKC,GAGxB,IAAKD,EAAM,MAAM,IAAI3B,YAAY,uBAAyBnN,EAAMhK,GAAK,KAEvE,OAAOsC,EA7DT,EAAOV,UAAU2D,KAAO,SAAeyD,EAAMN,EAAOzG,EAAS+H,GAC3D,GAAmB,iBAARhB,EACPA,EAAO9G,KAAKoP,SAAStI,OACpB,MAAMA,aAAgBoO,GACvB,MAAM,IAAI5Q,WAAW,sBAAwBwC,GAC5C,GAAIA,EAAKd,QAAUhG,KACpB,MAAM,IAAIsE,WAAW,yCAA2CwC,EAAKzI,KAAO,KAEhF,OAAOyI,EAAK0O,cAAchP,EAAOzG,EAAS+H,IAM5C,EAAOpI,UAAUyD,KAAO,SAAe2T,EAAQhP,GAC7C,IAAIhB,EAAO9G,KAAKuG,MAAMpD,KACtB,OAAO,IAAIkM,EAASvI,EAAMA,EAAK+G,aAAciJ,EAAQjQ,EAAKmB,QAAQF,KAKpE,EAAOpI,UAAUoO,KAAO,SAAehH,EAAMN,GAE3C,MADmB,iBAARM,IAAoBA,EAAO9G,KAAK8H,MAAMhB,IAC1CA,EAAK1H,OAAOoH,IAMrB,EAAO9G,UAAUyG,aAAe,SAAuB0B,GACrD,OAAOyF,EAAKvH,SAAS/F,KAAM6H,IAM7B,EAAOnI,UAAUyP,aAAe,SAAuBtH,GACrD,OAAOhB,EAAKd,SAAS/F,KAAM6H,IAG7B,EAAOnI,UAAU0P,SAAW,SAAmB/Q,GAC7C,IAAI+B,EAAQJ,KAAKuG,MAAMlI,GACvB,IAAK+B,EAAS,MAAM,IAAIkE,WAAW,sBAAwBjG,GAC3D,OAAO+B,GAuKT,IAAI2W,GAAY,SAAmB/Q,EAAQgR,GACzC,IAAIC,EAASjX,KAIbA,KAAKgG,OAASA,EAIdhG,KAAKgX,MAAQA,EACbhX,KAAKkX,KAAO,GACZlX,KAAKmX,OAAS,GAEdH,EAAM7V,SAAQ,SAAUiW,GAClBA,EAAKC,IAAOJ,EAAOC,KAAKvW,KAAKyW,GACxBA,EAAKE,OAASL,EAAOE,OAAOxW,KAAKyW,MAI5CpX,KAAKuX,gBAAkBvX,KAAKkX,KAAKM,MAAK,SAAU5Y,GAC9C,IAAK,aAAaiV,KAAKjV,EAAEyY,OAASzY,EAAEyE,KAAQ,OAAO,EACnD,IAAIA,EAAO2C,EAAOO,MAAM3H,EAAEyE,MAC1B,OAAOA,EAAKmL,aAAaQ,UAAU3L,OAMvC0T,GAAUrX,UAAUoQ,MAAQ,SAAgB2H,EAAK3B,QAC5B,IAAZA,IAAqBA,EAAU,IAEtC,IAAI4B,EAAU,IAAIC,GAAa3X,KAAM8V,GAAS,GAE9C,OADA4B,EAAQE,OAAOH,EAAK,KAAM3B,EAAQvU,KAAMuU,EAAQzT,IACzCqV,EAAQG,UAUjBd,GAAUrX,UAAUoY,WAAa,SAAqBL,EAAK3B,QACtC,IAAZA,IAAqBA,EAAU,IAEtC,IAAI4B,EAAU,IAAIC,GAAa3X,KAAM8V,GAAS,GAE9C,OADA4B,EAAQE,OAAOH,EAAK,KAAM3B,EAAQvU,KAAMuU,EAAQzT,IACzC8F,EAAM8C,QAAQyM,EAAQG,WAG/Bd,GAAUrX,UAAUqY,SAAW,SAAmBN,EAAKC,EAAS5L,GAC9D,IAAK,IAAIhO,EAAIgO,EAAQ9L,KAAKkX,KAAKtG,QAAQ9E,GAAS,EAAI,EAAGhO,EAAIkC,KAAKkX,KAAK/W,OAAQrC,IAAK,CAChF,IAAIsZ,EAAOpX,KAAKkX,KAAKpZ,GACrB,GAAIka,GAAQP,EAAKL,EAAKC,YACEhX,IAAnB+W,EAAKa,WAA2BR,EAAIS,cAAgBd,EAAKa,cACxDb,EAAKM,SAAWA,EAAQS,eAAef,EAAKM,UAAW,CAC3D,GAAIN,EAAKgB,SAAU,CACjB,IAAIzW,EAASyV,EAAKgB,SAASX,GAC3B,IAAe,IAAX9V,EAAoB,SACxByV,EAAK5Q,MAAQ7E,EAEf,OAAOyV,KAKbL,GAAUrX,UAAU2Y,WAAa,SAAqBzW,EAAM7C,EAAO2Y,EAAS5L,GAC1E,IAAK,IAAIhO,EAAIgO,EAAQ9L,KAAKmX,OAAOvG,QAAQ9E,GAAS,EAAI,EAAGhO,EAAIkC,KAAKmX,OAAOhX,OAAQrC,IAAK,CACpF,IAAIsZ,EAAOpX,KAAKmX,OAAOrZ,GACvB,KAAgC,GAA5BsZ,EAAKE,MAAM1G,QAAQhP,IACnBwV,EAAKM,UAAYA,EAAQS,eAAef,EAAKM,UAI7CN,EAAKE,MAAMnX,OAASyB,EAAKzB,SACc,IAAtCiX,EAAKE,MAAMgB,WAAW1W,EAAKzB,SAAiBiX,EAAKE,MAAM5W,MAAMkB,EAAKzB,OAAS,IAAMpB,IANtF,CAQA,GAAIqY,EAAKgB,SAAU,CACjB,IAAIzW,EAASyV,EAAKgB,SAASrZ,GAC3B,IAAe,IAAX4C,EAAoB,SACxByV,EAAK5Q,MAAQ7E,EAEf,OAAOyV,KAKXL,GAAUwB,YAAc,SAAsBvS,GAC5C,IAAIrE,EAAS,GACb,SAAS+I,EAAO0M,GAEd,IADA,IAAIoB,EAA4B,MAAjBpB,EAAKoB,SAAmB,GAAKpB,EAAKoB,SAAU1a,EAAI,EACxDA,EAAI6D,EAAOxB,OAAQrC,IAAK,CAC7B,IAAIuO,EAAO1K,EAAO7D,GAClB,IADsD,MAAjBuO,EAAKmM,SAAmB,GAAKnM,EAAKmM,UACpDA,EAAY,MAEjC7W,EAAOf,OAAO9C,EAAG,EAAGsZ,GAGtB,IAAI9F,EAAO,SAAWjT,GACpB,IAAI2Y,EAAQhR,EAAO8B,MAAMzJ,GAAM8M,KAAKsN,SAChCzB,GAASA,EAAM7V,SAAQ,SAAUiW,GACnC1M,EAAO0M,EAAOhT,GAAKgT,IACnBA,EAAKtJ,KAAOzP,MAId,IAAK,IAAIA,KAAQ2H,EAAO8B,MAAOwJ,EAAMjT,GACvC,IACMqa,EAOJ,IAAK,IAAIC,KAAU3S,EAAOO,MAPtBmS,YAAU1S,EAAOO,MAAMoS,GAAQxN,KAAKsN,WACzBC,EAAQvX,SAAQ,SAAUiW,GACvC1M,EAAO0M,EAAOhT,GAAKgT,IACnBA,EAAK/T,KAAOsV,KAKhB,OAAOhX,GAOToV,GAAU6B,WAAa,SAAqB5S,GAC1C,OAAOA,EAAOiH,OAAO4L,YAClB7S,EAAOiH,OAAO4L,UAAY,IAAI9B,GAAU/Q,EAAQ+Q,GAAUwB,YAAYvS,MAI3E,IAAI8S,GAAY,CACdC,SAAS,EAAMC,SAAS,EAAMC,OAAO,EAAMC,YAAY,EAAMC,QAAQ,EACrEC,IAAI,EAAMC,KAAK,EAAMC,IAAI,EAAMC,UAAU,EAAMC,YAAY,EAAMC,QAAQ,EACzEC,QAAQ,EAAMC,MAAM,EAAMC,IAAI,EAAMC,IAAI,EAAMC,IAAI,EAAMC,IAAI,EAAMC,IAAI,EACtEC,IAAI,EAAMC,QAAQ,EAAMC,QAAQ,EAAMC,IAAI,EAAMC,IAAI,EAAMC,UAAU,EAAMC,IAAI,EAC9EC,QAAQ,EAAM5a,GAAG,EAAM6a,KAAK,EAAMC,SAAS,EAAMC,OAAO,EAAMC,OAAO,EAAMC,IAAI,GAI7EC,GAAa,CACfC,MAAM,EAAMT,UAAU,EAAM9a,QAAQ,EAAMwb,QAAQ,EAAM1D,OAAO,EAAM2D,OAAO,GAI1EC,GAAW,CAACX,IAAI,EAAMM,IAAI,GAK9B,SAASM,GAAaC,GACpB,OAAQA,EAHY,EAG2B,IAA6B,SAAvBA,EAHP,EAG8D,GAG9G,IAAIC,GAAc,SAAqBvU,EAAMN,EAAOsB,EAAOwT,EAAcC,EAAOhN,EAAOuH,GACrF9V,KAAK8G,KAAOA,EACZ9G,KAAKwG,MAAQA,EACbxG,KAAKub,MAAQA,EACbvb,KAAKuO,MAAQA,IAVoD,EAU1CuH,EAA0B,KAAOhP,EAAK0H,cAC7DxO,KAAK8V,QAAUA,EACf9V,KAAKD,QAAU,GAEfC,KAAK8H,MAAQA,EAEb9H,KAAKwb,YAAc3U,EAAKoB,KAExBjI,KAAKsb,aAAeA,EAEpBtb,KAAKyb,WAAa,IAGpBJ,GAAY3b,UAAUmT,aAAe,SAAuBxP,GAC1D,IAAKrD,KAAKuO,MAAO,CACf,IAAKvO,KAAK8G,KAAQ,MAAO,GACzB,IAAI4U,EAAO1b,KAAK8G,KAAK0H,aAAa6D,WAAWxQ,EAASN,KAAK8B,IAC3D,IAAIqY,EAEG,CACL,IAAoCC,EAAhChZ,EAAQ3C,KAAK8G,KAAK0H,aACtB,OAAImN,EAAOhZ,EAAMkQ,aAAaxP,EAAKyD,QACjC9G,KAAKuO,MAAQ5L,EACNgZ,GAEA,KAPT3b,KAAKuO,MAAQvO,KAAK8G,KAAK0H,aAAaC,cAAciN,GAWtD,OAAO1b,KAAKuO,MAAMsE,aAAaxP,EAAKyD,OAGtCuU,GAAY3b,UAAUmY,OAAS,SAAiBxP,GAC9C,KA3CoB,EA2CdrI,KAAK8V,SAA4B,CACrC,IAAkD5X,EAA9CwF,EAAO1D,KAAKD,QAAQC,KAAKD,QAAQI,OAAS,GAC1CuD,GAAQA,EAAKJ,SAAWpF,EAAI,oBAAoB0d,KAAKlY,EAAKP,SACxDO,EAAKP,KAAKhD,QAAUjC,EAAE,GAAGiC,OAAUH,KAAKD,QAAQyT,MAC7CxT,KAAKD,QAAQC,KAAKD,QAAQI,OAAS,GAAKuD,EAAKG,SAASH,EAAKP,KAAKzC,MAAM,EAAGgD,EAAKP,KAAKhD,OAASjC,EAAE,GAAGiC,UAG5G,IAAIJ,EAAU8B,EAASN,KAAKvB,KAAKD,SAGjC,OAFKsI,GAAWrI,KAAKuO,QACjBxO,EAAUA,EAAQ2B,OAAO1B,KAAKuO,MAAM8D,WAAWxQ,EAASmC,OAAO,KAC5DhE,KAAK8G,KAAO9G,KAAK8G,KAAK1H,OAAOY,KAAKwG,MAAOzG,EAASC,KAAK8H,OAAS/H,GAGzEsb,GAAY3b,UAAUmc,iBAAmB,SAA2B/N,GAClE,IAAK,IAAIhQ,EAAIkC,KAAKyb,WAAWtb,OAAS,EAAGrC,GAAK,EAAGA,IAC7C,GAAIgQ,EAAKzJ,GAAGrE,KAAKyb,WAAW3d,IAAO,OAAOkC,KAAKyb,WAAW7a,OAAO9C,EAAG,GAAG,IAG7Eud,GAAY3b,UAAUoc,aAAe,SAAuBC,GAC1D,IAAK,IAAIje,EAAI,EAAGke,EAAUhc,KAAKsb,aAAcxd,EAAIke,EAAQ7b,OAAQrC,IAAK,CACpE,IAAIgQ,EAAOkO,EAAQle,IACdkC,KAAK8G,KAAO9G,KAAK8G,KAAK2O,eAAe3H,EAAKhH,MAAQmV,GAAanO,EAAKhH,KAAMiV,MAC1EjO,EAAKpG,QAAQ1H,KAAKwb,eACrBxb,KAAKwb,YAAc1N,EAAK1G,SAASpH,KAAKwb,aACtCxb,KAAKsb,aAAexN,EAAKrG,cAAczH,KAAKsb,iBAKlD,IAAI3D,GAAe,SAAsBuE,EAAQpG,EAASqG,GAExDnc,KAAKkc,OAASA,EAEdlc,KAAK8V,QAAUA,EACf9V,KAAKoc,OAASD,EACd,IAA+BE,EAA3BxG,EAAUC,EAAQD,QAClByG,EAAanB,GAAarF,EAAQsF,qBAAuBe,EA/EI,EA+EmB,GAEhFE,EADAxG,EACa,IAAIwF,GAAYxF,EAAQ/O,KAAM+O,EAAQrP,MAAOK,EAAKoB,KAAMpB,EAAKoB,MAAM,EACrD6N,EAAQyG,UAAY1G,EAAQ/O,KAAK0H,aAAc8N,GAE7D,IAAIjB,GADZc,EACwB,KAEAD,EAAOlW,OAAO0Q,YAFR,KAAM7P,EAAKoB,KAAMpB,EAAKoB,MAAM,EAAM,KAAMqU,GAG/Etc,KAAKuG,MAAQ,CAAC8V,GAEdrc,KAAKmc,KAAO,EACZnc,KAAKE,KAAO4V,EAAQ0G,cACpBxc,KAAKyc,YAAa,GAGhBC,GAAuB,CAAEC,IAAK,CAAE1a,cAAc,GAAO2a,WAAY,CAAE3a,cAAc,IA4XrF,SAAS+V,GAAQP,EAAKoF,GACpB,OAAQpF,EAAIO,SAAWP,EAAIqF,mBAAqBrF,EAAIsF,uBAAyBtF,EAAIuF,oBAAoB/e,KAAKwZ,EAAKoF,GAWjH,SAASzY,GAAKuD,GACZ,IAAIvD,EAAO,GACX,IAAK,IAAIxC,KAAQ+F,EAAOvD,EAAKxC,GAAQ+F,EAAI/F,GACzC,OAAOwC,EAMT,SAAS6X,GAAavG,EAAUtG,GAC9B,IAAI7I,EAAQ6I,EAASpJ,OAAOO,MACxB+K,EAAO,SAAWjT,GACpB,IAAIkE,EAASgE,EAAMlI,GACnB,GAAKkE,EAAOkT,eAAeC,GAA3B,CACA,IAAInD,EAAO,GAAIa,EAAO,SAAU7E,GAC9BgE,EAAK5R,KAAK4N,GACV,IAAK,IAAIzQ,EAAI,EAAGA,EAAIyQ,EAAMsB,UAAW/R,IAAK,CACxC,IAAI8K,EAAM2F,EAAMgD,KAAKzT,GACjBgJ,EAAO8B,EAAI9B,KACXuF,EAAOzD,EAAIyD,KACf,GAAIvF,GAAQsI,EAAY,OAAO,EAC/B,GAAImD,EAAK3B,QAAQvE,GAAQ,GAAK+G,EAAK/G,GAAS,OAAO,IAGvD,OAAI+G,EAAK7Q,EAAOiM,cAAwB,CAAEyO,GAAG,QAA7C,IAGF,IAAK,IAAI5e,KAAQkI,EAAO,CACtB,IAAI2W,EAAW5L,EAAMjT,GAErB,GAAK6e,EAAW,OAAOA,EAASD,GApapCP,GAAqBC,IAAIhe,IAAM,WAC7B,OAAOqB,KAAKuG,MAAMvG,KAAKmc,OAOzBxE,GAAajY,UAAUyd,OAAS,SAAiB1F,GAC/C,GAAoB,GAAhBA,EAAIrI,SACNpP,KAAKod,YAAY3F,QACZ,GAAoB,GAAhBA,EAAIrI,SAAe,CAC5B,IAAIkI,EAAQG,EAAI4F,aAAa,SACzBvV,EAAQwP,EAAQtX,KAAKsd,WAmX7B,SAAqBhG,GACnB,IAAuCpZ,EAAnCqf,EAAK,6BAAiC5b,EAAS,GACnD,KAAOzD,EAAIqf,EAAG3B,KAAKtE,IAAU3V,EAAOhB,KAAKzC,EAAE,GAAIA,EAAE,GAAGsf,QACpD,OAAO7b,EAtX+B8b,CAAYnG,IAAU,KAAMqF,EAAM3c,KAAK2c,IAC3E,GAAa,MAAT7U,EAAiB,IAAK,IAAIhK,EAAI,EAAGA,EAAIgK,EAAM3H,OAAQrC,IAAOkC,KAAK0d,eAAe5V,EAAMhK,IAExF,GADAkC,KAAK2d,WAAWlG,GACH,MAAT3P,EAAiB,IAAK,IAAI4J,EAAM,EAAGA,EAAM5J,EAAM3H,OAAQuR,IAAS1R,KAAK4d,kBAAkB9V,EAAM4J,GAAMiL,KAI3GhF,GAAajY,UAAU0d,YAAc,SAAsB3F,GACzD,IAAI1Y,EAAQ0Y,EAAIoG,UACZlB,EAAM3c,KAAK2c,IACf,IAAKA,EAAI7V,KAAO6V,EAAI7V,KAAK2F,cAAgBkQ,EAAI5c,QAAQI,QAAUwc,EAAI5c,QAAQ,GAAGqM,WAAa,mBAAmByH,KAAK9U,GAAQ,CACzH,GAxHkB,EAwHZ4d,EAAI7G,QAxHkC,EAqI/B6G,EAAI7G,UACf/W,EAAQA,EAAMwJ,QAAQ,YAAa,WATnC,GAJAxJ,EAAQA,EAAMwJ,QAAQ,oBAAqB,KAIvC,mBAAmBsL,KAAK9U,IAAUiB,KAAKmc,MAAQnc,KAAKuG,MAAMpG,OAAS,EAAG,CACxE,IAAIiK,EAAauS,EAAI5c,QAAQ4c,EAAI5c,QAAQI,OAAS,GAC9C2d,EAAgBrG,EAAIsG,kBACnB3T,GACA0T,GAA2C,MAA1BA,EAAcE,UAC/B5T,EAAW9G,QAAU,mBAAmBuQ,KAAKzJ,EAAWjH,SACzDpE,EAAQA,EAAM2B,MAAM,IAKxB3B,GAASiB,KAAKie,WAAWje,KAAKkc,OAAOlW,OAAO7C,KAAKpE,IACrDiB,KAAKke,WAAWzG,QAEhBzX,KAAKme,WAAW1G,IAOpBE,GAAajY,UAAUie,WAAa,SAAqBlG,EAAK2G,GAC5D,IAAuCC,EAAnChgB,EAAOoZ,EAAIuG,SAASM,cACpBpD,GAASvb,eAAetB,IAAS2B,KAAKkc,OAAO3E,gBAuTnD,SAAuBE,GACrB,IAAK,IAAIhV,EAAQgV,EAAIzV,WAAYuc,EAAW,KAAM9b,EAAOA,EAAQA,EAAM+b,YAAa,CAClF,IAAIngB,EAAyB,GAAlBoE,EAAM2M,SAAgB3M,EAAMub,SAASM,cAAgB,KAC5DjgB,GAAQ6c,GAASvb,eAAetB,IAASkgB,GAC3CA,EAASE,YAAYhc,GACrBA,EAAQ8b,GACS,MAARlgB,EACTkgB,EAAW9b,EACFpE,IACTkgB,EAAW,OAhUoDG,CAAcjH,GACjF,IAAIL,EAAQpX,KAAK8V,QAAQ6I,cAAgB3e,KAAK8V,QAAQ6I,aAAalH,KAC9D4G,EAASre,KAAKkc,OAAOnE,SAASN,EAAKzX,KAAMoe,IAC9C,GAAIhH,EAAOA,EAAKwH,OAAS9D,GAAWnb,eAAetB,GACjD2B,KAAKme,WAAW1G,QACX,IAAKL,GAAQA,EAAKyH,MAAQzH,EAAK0H,YAAa,CAC7C1H,GAAQA,EAAK0H,YAAe9e,KAAKmc,KAAOvZ,KAAKC,IAAI,EAAG7C,KAAKmc,KAAO,GAC3D/E,GAAQA,EAAKyH,KAAKzP,WAAYqI,EAAML,EAAKyH,MAClD,IAAIE,EAAMpC,EAAM3c,KAAK2c,IAAKqC,EAAgBhf,KAAKyc,WAC/C,GAAI3D,GAAUnZ,eAAetB,GAC3B0gB,GAAO,EACFpC,EAAI7V,OAAQ9G,KAAKyc,YAAa,QAC9B,IAAKhF,EAAIzV,WAEd,YADAhC,KAAKif,aAAaxH,GAGpBzX,KAAK4X,OAAOH,GACRsH,GAAQ/e,KAAK+e,KAAKpC,GACtB3c,KAAKyc,WAAauC,OAElBhf,KAAKkf,iBAAiBzH,EAAKL,GAAyB,IAAnBA,EAAK+H,UAAsBd,EAAS,OAKzE1G,GAAajY,UAAUuf,aAAe,SAAuBxH,GACvC,MAAhBA,EAAIuG,UAAoBhe,KAAK2c,IAAI7V,MAAQ9G,KAAK2c,IAAI7V,KAAK2F,eACvDzM,KAAKod,YAAY3F,EAAI2H,cAAcC,eAAe,QAMxD1H,GAAajY,UAAU4d,WAAa,SAAqBnG,GACvD,IAAIrP,EAAQjB,EAAKoB,KACjBqP,EAAO,IAAK,IAAIxZ,EAAI,EAAGA,EAAIqZ,EAAOhX,OAAQrC,GAAK,EAC7C,IAAK,IAAIgO,EAAQ,OAAQ,CACvB,IAAIsL,EAAOpX,KAAKkc,OAAO7D,WAAWlB,EAAOrZ,GAAIqZ,EAAOrZ,EAAI,GAAIkC,KAAM8L,GAClE,IAAKsL,EAAQ,SAASE,EACtB,GAAIF,EAAKwH,OAAU,OAAO,KAE1B,GADA9W,EAAQ9H,KAAKkc,OAAOlW,OAAO8B,MAAMsP,EAAKtJ,MAAM1O,OAAOgY,EAAK5Q,OAAOY,SAASU,IACjD,IAAnBsP,EAAK+H,UACF,MADyBrT,EAAQsL,EAI5C,OAAOtP,GAOT6P,GAAajY,UAAUwf,iBAAmB,SAA2BzH,EAAKL,EAAMkI,GAC5E,IAEEP,EAAM3P,EAAoBtB,EAFxBmJ,EAASjX,KAGXoX,EAAK/T,MACP+L,EAAWpP,KAAKkc,OAAOlW,OAAOO,MAAM6Q,EAAK/T,OAC3BE,OAEFvD,KAAKie,WAAW7O,EAAShQ,OAAOgY,EAAK5Q,SAC/CxG,KAAKif,aAAaxH,GAFlBsH,EAAO/e,KAAKuf,MAAMnQ,EAAUgI,EAAK5Q,MAAO4Q,EAAKgE,qBAM/CtN,EADW9N,KAAKkc,OAAOlW,OAAO8B,MAAMsP,EAAKtJ,MACzB1O,OAAOgY,EAAK5Q,OAC5BxG,KAAK0d,eAAe5P,IAEtB,IAAI0R,EAAUxf,KAAK2c,IAEnB,GAAIvN,GAAYA,EAAS7L,OACvBvD,KAAKme,WAAW1G,QACX,GAAI6H,EACTtf,KAAK2d,WAAWlG,EAAK6H,QAChB,GAAIlI,EAAKqI,WACdzf,KAAKme,WAAW1G,GAChBL,EAAKqI,WAAWhI,EAAKzX,KAAKkc,OAAOlW,QAAQ7E,SAAQ,SAAUkC,GAAQ,OAAO4T,EAAOgH,WAAW5a,UACvF,CACL,IAAIqc,EAAatI,EAAKuI,eACG,iBAAdD,EAA0BA,EAAajI,EAAImI,cAAcF,GACtC,mBAAdA,IAA4BA,EAAaA,EAAWjI,IAC/DiI,IAAcA,EAAajI,GAChCzX,KAAK6f,WAAWpI,EAAKiI,GAAY,GACjC1f,KAAK4X,OAAO8H,EAAYX,GAEtBA,IAAQ/e,KAAK+e,KAAKS,GAAUxf,KAAKmc,QACjCrO,GAAQ9N,KAAK4d,kBAAkB9P,EAAM0R,IAO3C7H,GAAajY,UAAUkY,OAAS,SAAiBrV,EAAQwc,EAAM/U,EAAYC,GAEzE,IADA,IAAI/F,EAAQ8F,GAAc,EACjByN,EAAMzN,EAAazH,EAAOud,WAAW9V,GAAczH,EAAOP,WAC1DU,EAAkB,MAAZuH,EAAmB,KAAO1H,EAAOud,WAAW7V,GACtDwN,GAAO/U,EAAK+U,EAAMA,EAAI+G,cAAeta,EACxClE,KAAK+f,YAAYxd,EAAQ2B,GACzBlE,KAAKmd,OAAO1F,GACRsH,GAAQjG,GAAUnZ,eAAe8X,EAAIuG,SAASM,gBAC9Cte,KAAK+e,KAAKA,GAEhB/e,KAAK+f,YAAYxd,EAAQ2B,IAM3ByT,GAAajY,UAAUsgB,UAAY,SAAoB3c,GAErD,IADA,IAAI4c,EAAOlB,EACFrW,EAAQ1I,KAAKmc,KAAMzT,GAAS,EAAGA,IAAS,CAC/C,IAAIwX,EAAKlgB,KAAKuG,MAAMmC,GAChBtI,EAAQ8f,EAAGrN,aAAaxP,GAC5B,GAAIjD,KAAW6f,GAASA,EAAM9f,OAASC,EAAMD,UAC3C8f,EAAQ7f,EACR2e,EAAOmB,GACF9f,EAAMD,QAAU,MAEvB,GAAI+f,EAAG3E,MAAS,MAElB,IAAK0E,EAAS,OAAO,EACrBjgB,KAAK+e,KAAKA,GACV,IAAK,IAAIjhB,EAAI,EAAGA,EAAImiB,EAAM9f,OAAQrC,IAC9BkC,KAAKmgB,WAAWF,EAAMniB,GAAI,MAAM,GACpC,OAAO,GAKT6Z,GAAajY,UAAUue,WAAa,SAAqB5a,GACvD,GAAIA,EAAK+I,UAAYpM,KAAKyc,aAAezc,KAAK2c,IAAI7V,KAAM,CACtD,IAAIsZ,EAAQpgB,KAAKqgB,uBACbD,GAASpgB,KAAKmgB,WAAWC,GAE/B,GAAIpgB,KAAKggB,UAAU3c,GAAO,CACxBrD,KAAKsgB,aACL,IAAI3D,EAAM3c,KAAK2c,IACfA,EAAIb,aAAazY,EAAKyD,MAClB6V,EAAIpO,QAASoO,EAAIpO,MAAQoO,EAAIpO,MAAMS,UAAU3L,EAAKyD,OAEtD,IADA,IAAIgB,EAAQ6U,EAAInB,YACP1d,EAAI,EAAGA,EAAIuF,EAAKyE,MAAM3H,OAAQrC,IAC9B6e,EAAI7V,OAAQ6V,EAAI7V,KAAK2O,eAAepS,EAAKyE,MAAMhK,GAAGgJ,QACrDgB,EAAQzE,EAAKyE,MAAMhK,GAAGsJ,SAASU,IAErC,OADA6U,EAAI5c,QAAQY,KAAK0C,EAAKyK,KAAKhG,KACpB,EAET,OAAO,GAMT6P,GAAajY,UAAU6f,MAAQ,SAAgBzY,EAAMN,EAAO+Z,GAC1D,IAAI3J,EAAK5W,KAAKggB,UAAUlZ,EAAK1H,OAAOoH,IAEpC,OADIoQ,GAAM5W,KAAKmgB,WAAWrZ,EAAMN,GAAO,EAAM+Z,GACtC3J,GAITe,GAAajY,UAAUygB,WAAa,SAAqBrZ,EAAMN,EAAO+U,EAAOgF,GAC3EvgB,KAAKsgB,aACL,IAAI3D,EAAM3c,KAAK2c,IACfA,EAAIb,aAAahV,GACjB6V,EAAIpO,MAAQoO,EAAIpO,OAASoO,EAAIpO,MAAMS,UAAUlI,EAAMN,GACnD,IAAIsP,EAAwB,MAAdyK,GAAmC,EAAd5D,EAAI7G,QAA2BqF,GAAaoF,GAzTd,EA0T5D5D,EAAI7G,SAAkD,GAAtB6G,EAAI5c,QAAQI,SAAe2V,GA1TC,GA2TjE9V,KAAKuG,MAAM5F,KAAK,IAAI0a,GAAYvU,EAAMN,EAAOmW,EAAInB,YAAamB,EAAIrB,aAAcC,EAAO,KAAMzF,IAC7F9V,KAAKmc,QAKPxE,GAAajY,UAAU4gB,WAAa,SAAqBjY,GACvD,IAAIvK,EAAIkC,KAAKuG,MAAMpG,OAAS,EAC5B,GAAIrC,EAAIkC,KAAKmc,KAAM,CACjB,KAAOre,EAAIkC,KAAKmc,KAAMre,IAAOkC,KAAKuG,MAAMzI,EAAI,GAAGiC,QAAQY,KAAKX,KAAKuG,MAAMzI,GAAG+Z,OAAOxP,IACjFrI,KAAKuG,MAAMpG,OAASH,KAAKmc,KAAO,IAIpCxE,GAAajY,UAAUmY,OAAS,WAG9B,OAFA7X,KAAKmc,KAAO,EACZnc,KAAKsgB,WAAWtgB,KAAKoc,QACdpc,KAAKuG,MAAM,GAAGsR,OAAO7X,KAAKoc,QAAUpc,KAAK8V,QAAQ0K,UAG1D7I,GAAajY,UAAUqf,KAAO,SAAe1c,GAC3C,IAAK,IAAIvE,EAAIkC,KAAKmc,KAAMre,GAAK,EAAGA,IAAO,GAAIkC,KAAKuG,MAAMzI,IAAMuE,EAE1D,YADArC,KAAKmc,KAAOre,IAKhB4e,GAAqBE,WAAWje,IAAM,WACpCqB,KAAKsgB,aAEL,IADA,IAAI9d,EAAM,EACD1E,EAAIkC,KAAKmc,KAAMre,GAAK,EAAGA,IAAK,CAEnC,IADA,IAAIiC,EAAUC,KAAKuG,MAAMzI,GAAGiC,QACnB8E,EAAI9E,EAAQI,OAAS,EAAG0E,GAAK,EAAGA,IACrCrC,GAAOzC,EAAQ8E,GAAG/C,SAClBhE,GAAK0E,IAEX,OAAOA,GAGTmV,GAAajY,UAAUqgB,YAAc,SAAsBxd,EAAQmE,GACjE,GAAI1G,KAAKE,KAAQ,IAAK,IAAIpC,EAAI,EAAGA,EAAIkC,KAAKE,KAAKC,OAAQrC,IACjDkC,KAAKE,KAAKpC,GAAGuF,MAAQd,GAAUvC,KAAKE,KAAKpC,GAAG4I,QAAUA,IACtD1G,KAAKE,KAAKpC,GAAG0E,IAAMxC,KAAK4c,aAIhCjF,GAAajY,UAAUye,WAAa,SAAqB5b,GACvD,GAAIvC,KAAKE,KAAQ,IAAK,IAAIpC,EAAI,EAAGA,EAAIkC,KAAKE,KAAKC,OAAQrC,IAC7B,MAApBkC,KAAKE,KAAKpC,GAAG0E,KAAkC,GAAnBD,EAAO6M,UAAiB7M,EAAOke,SAASzgB,KAAKE,KAAKpC,GAAGuF,QACjFrD,KAAKE,KAAKpC,GAAG0E,IAAMxC,KAAK4c,aAIhCjF,GAAajY,UAAUmgB,WAAa,SAAqBtd,EAAQxC,EAAS8L,GACxE,GAAItJ,GAAUxC,GAAWC,KAAKE,KAAQ,IAAK,IAAIpC,EAAI,EAAGA,EAAIkC,KAAKE,KAAKC,OAAQrC,IAAK,CAC/E,GAAwB,MAApBkC,KAAKE,KAAKpC,GAAG0E,KAAkC,GAAnBD,EAAO6M,UAAiB7M,EAAOke,SAASzgB,KAAKE,KAAKpC,GAAGuF,MACzEtD,EAAQ2gB,wBAAwB1gB,KAAKE,KAAKpC,GAAGuF,OAC5CwI,EAAS,EAAI,KACpB7L,KAAKE,KAAKpC,GAAG0E,IAAMxC,KAAK4c,cAKlCjF,GAAajY,UAAUwe,WAAa,SAAqByC,GACvD,GAAI3gB,KAAKE,KAAQ,IAAK,IAAIpC,EAAI,EAAGA,EAAIkC,KAAKE,KAAKC,OAAQrC,IACjDkC,KAAKE,KAAKpC,GAAGuF,MAAQsd,IACrB3gB,KAAKE,KAAKpC,GAAG0E,IAAMxC,KAAK4c,YAAc+D,EAAS9C,UAAU1d,OAASH,KAAKE,KAAKpC,GAAG4I,UAOvFiR,GAAajY,UAAUyY,eAAiB,SAAyBT,GAC7D,IAAIT,EAASjX,KAEf,GAAI0X,EAAQ9G,QAAQ,MAAQ,EACxB,OAAO8G,EAAQnE,MAAM,YAAYiE,KAAKxX,KAAKmY,eAAgBnY,MAE/D,IAAI4gB,EAAQlJ,EAAQnE,MAAM,KACtBsN,EAAS7gB,KAAK8V,QAAQ4B,QACtBoJ,IAAW9gB,KAAKoc,QAAYyE,GAAUA,EAAOte,OAAOuE,MAAQ9G,KAAKuG,MAAM,GAAGO,MAC1Eia,IAAaF,EAASA,EAAOnY,MAAQ,EAAI,IAAMoY,EAAU,EAAI,GAC7DvS,EAAQ,SAAUzQ,EAAG4K,GACvB,KAAO5K,GAAK,EAAGA,IAAK,CAClB,IAAIkjB,EAAOJ,EAAM9iB,GACjB,GAAY,IAARkjB,EAAY,CACd,GAAIljB,GAAK8iB,EAAMzgB,OAAS,GAAU,GAALrC,EAAU,SACvC,KAAO4K,GAASqY,EAAUrY,IACtB,GAAI6F,EAAMzQ,EAAI,EAAG4K,GAAU,OAAO,EACtC,OAAO,EAEP,IAAI2D,EAAO3D,EAAQ,GAAe,GAATA,GAAcoY,EAAW7J,EAAO1Q,MAAMmC,GAAO5B,KAChE+Z,GAAUnY,GAASqY,EAAWF,EAAOxd,KAAKqF,EAAQqY,GAAUja,KAC5D,KACN,IAAKuF,GAASA,EAAKhO,MAAQ2iB,IAAsC,GAA9B3U,EAAK2H,OAAOpD,QAAQoQ,GACnD,OAAO,EACXtY,IAGJ,OAAO,GAET,OAAO6F,EAAMqS,EAAMzgB,OAAS,EAAGH,KAAKmc,OAGtCxE,GAAajY,UAAU2gB,qBAAuB,WAC5C,IAAIY,EAAWjhB,KAAK8V,QAAQ4B,QAC5B,GAAIuJ,EAAY,IAAK,IAAI7iB,EAAI6iB,EAASvY,MAAOtK,GAAK,EAAGA,IAAK,CACxD,IAAI8iB,EAAQD,EAAS5d,KAAKjF,GAAGkQ,eAAe2S,EAASrV,WAAWxN,IAAIwR,YACpE,GAAIsR,GAASA,EAAMzT,aAAeyT,EAAMrT,aAAgB,OAAOqT,EAEjE,IAAK,IAAI7iB,KAAQ2B,KAAKkc,OAAOlW,OAAOO,MAAO,CACzC,IAAIO,EAAO9G,KAAKkc,OAAOlW,OAAOO,MAAMlI,GACpC,GAAIyI,EAAK2G,aAAe3G,EAAK+G,aAAgB,OAAO/G,IAIxD6Q,GAAajY,UAAUge,eAAiB,SAAyB5P,GAC/D,IAAI1N,EAuFN,SAA2B0N,EAAMzG,GAC/B,IAAK,IAAIvJ,EAAI,EAAGA,EAAIuJ,EAAIlH,OAAQrC,IAC9B,GAAIgQ,EAAKzJ,GAAGgD,EAAIvJ,IAAO,OAAOuJ,EAAIvJ,GAzFxBqjB,CAAkBrT,EAAM9N,KAAK2c,IAAIrB,cACzClb,GAASJ,KAAK2c,IAAIlB,WAAW9a,KAAKP,GACtCJ,KAAK2c,IAAIrB,aAAexN,EAAK1G,SAASpH,KAAK2c,IAAIrB,eAGjD3D,GAAajY,UAAUke,kBAAoB,SAA4B9P,EAAMsT,GAC3E,IAAK,IAAI1Y,EAAQ1I,KAAKmc,KAAMzT,GAAS,EAAGA,IAAS,CAC/C,IAAI2Y,EAAQrhB,KAAKuG,MAAMmC,GAEvB,GADY2Y,EAAM/F,aAAagG,YAAYxT,IAC9B,EACXuT,EAAM/F,aAAexN,EAAKrG,cAAc4Z,EAAM/F,kBACzC,CACL+F,EAAM7F,YAAc1N,EAAKrG,cAAc4Z,EAAM7F,aAC7C,IAAI+F,EAAYF,EAAMxF,iBAAiB/N,GACnCyT,GAAaF,EAAMva,MAAQua,EAAMva,KAAK2O,eAAe8L,EAAUza,QAC/Dua,EAAM7F,YAAc+F,EAAUna,SAASia,EAAM7F,cAEnD,GAAI6F,GAASD,EAAQ,QAIzB5iB,OAAOiI,iBAAkBkR,GAAajY,UAAWgd,IA4FjD,IAAI8E,GAAgB,SAAuBjb,EAAOuB,GAGhD9H,KAAKuG,MAAQA,GAAS,GAGtBvG,KAAK8H,MAAQA,GAAS,IAiKxB,SAAS2Z,GAAY9Z,GACnB,IAAIhG,EAAS,GACb,IAAK,IAAItD,KAAQsJ,EAAK,CACpB,IAAI+Z,EAAQ/Z,EAAItJ,GAAM8M,KAAKuW,MACvBA,IAAS/f,EAAOtD,GAAQqjB,GAE9B,OAAO/f,EAGT,SAAS8J,GAAIqK,GAEX,OAAOA,EAAQ6L,UAAYC,OAAOD,SApKpCH,GAAc9hB,UAAUmiB,kBAAoB,SAA4BtX,EAAUuL,EAAS/L,GACvF,IAAIkN,EAASjX,UACI,IAAZ8V,IAAqBA,EAAU,IAEjC/L,IAAUA,EAAS0B,GAAIqK,GAASgM,0BAErC,IAAInF,EAAM5S,EAAQiJ,EAAS,KA4B3B,OA3BAzI,EAASpJ,SAAQ,SAAUkC,GACzB,GAAI2P,GAAU3P,EAAKyE,MAAM3H,OAAQ,CAC1B6S,IAAUA,EAAS,IAExB,IADA,IAAI+O,EAAO,EAAGC,EAAW,EAClBD,EAAO/O,EAAO7S,QAAU6hB,EAAW3e,EAAKyE,MAAM3H,QAAQ,CAC3D,IAAIkM,EAAOhJ,EAAKyE,MAAMka,GACtB,GAAK/K,EAAOnP,MAAMuE,EAAKvF,KAAKzI,MAA5B,CACA,IAAKgO,EAAKhI,GAAG2O,EAAO+O,MAAsC,IAA5B1V,EAAKvF,KAAKqE,KAAK8W,SAAsB,MACnEF,GAAQ,EAAGC,SAF0BA,IAIvC,KAAOD,EAAO/O,EAAO7S,QACnBwc,EAAM3J,EAAOQ,MACbR,EAAOQ,MAET,KAAOwO,EAAW3e,EAAKyE,MAAM3H,QAAQ,CACnC,IAAI+hB,EAAM7e,EAAKyE,MAAMka,KACjBG,EAAUlL,EAAOmL,cAAcF,EAAK7e,EAAK+I,SAAU0J,GACnDqM,IACFnP,EAAOrS,KAAKuhB,EAAKvF,GACjBA,EAAI8B,YAAY0D,EAAQ1K,KACxBkF,EAAMwF,EAAQzC,YAAcyC,EAAQ1K,MAI1CkF,EAAI8B,YAAYxH,EAAOoL,cAAchf,EAAMyS,OAGtC/L,GASTyX,GAAc9hB,UAAU2iB,cAAgB,SAAwBhf,EAAMyS,QACjD,IAAZA,IAAqBA,EAAU,IAEtC,IAAIlN,EACA4Y,GAAcc,WAAW7W,GAAIqK,GAAU9V,KAAKuG,MAAMlD,EAAKyD,KAAKzI,MAAMgF,IAChEoU,EAAM7O,EAAI6O,IACViI,EAAa9W,EAAI8W,WACvB,GAAIA,EAAY,CACd,GAAIrc,EAAKE,OACL,MAAM,IAAIe,WAAW,gDACrBwR,EAAQyM,UACRzM,EAAQyM,UAAUlf,EAAMqc,EAAY5J,GAEpC9V,KAAK6hB,kBAAkBxe,EAAKtD,QAAS+V,EAAS4J,GAEpD,OAAOjI,GAGT+J,GAAc9hB,UAAU8iB,sBAAwB,SAAgCnf,EAAMyS,QACjE,IAAZA,IAAqBA,EAAU,IAGtC,IADA,IAAI2B,EAAMzX,KAAKqiB,cAAchf,EAAMyS,GAC1BhY,EAAIuF,EAAKyE,MAAM3H,OAAS,EAAGrC,GAAK,EAAGA,IAAK,CAC/C,IAAI6d,EAAO3b,KAAKoiB,cAAc/e,EAAKyE,MAAMhK,GAAIuF,EAAK+I,SAAU0J,GACxD6F,KACPA,EAAK+D,YAAc/D,EAAKlE,KAAKgH,YAAYhH,GACpCA,EAAMkE,EAAKlE,KAGf,OAAOA,GAGT+J,GAAc9hB,UAAU0iB,cAAgB,SAAwBtU,EAAMuF,EAAQyC,QACzD,IAAZA,IAAqBA,EAAU,IAEtC,IAAI4L,EAAQ1hB,KAAK8H,MAAMgG,EAAKhH,KAAKzI,MACjC,OAAOqjB,GAASF,GAAcc,WAAW7W,GAAIqK,GAAU4L,EAAM5T,EAAMuF,KAOrEmO,GAAcc,WAAa,SAAqB7W,EAAKgX,EAAWC,GAG9D,QAFiB,IAAVA,IAAmBA,EAAQ,MAEV,iBAAbD,EACP,MAAO,CAAChL,IAAKhM,EAAI4T,eAAeoD,IACpC,GAA0B,MAAtBA,EAAUrT,SACV,MAAO,CAACqI,IAAKgL,GACjB,GAAIA,EAAUhL,KAAiC,MAA1BgL,EAAUhL,IAAIrI,SAC/B,OAAOqT,EACX,IAAIE,EAAUF,EAAU,GAAIG,EAAQD,EAAQ/R,QAAQ,KAChDgS,EAAQ,IACVF,EAAQC,EAAQjiB,MAAM,EAAGkiB,GACzBD,EAAUA,EAAQjiB,MAAMkiB,EAAQ,IAElC,IAAIlD,EAAa,KAAMjI,EAAMiL,EAAQjX,EAAIoX,gBAAgBH,EAAOC,GAAWlX,EAAIqX,cAAcH,GACzFnc,EAAQic,EAAU,GAAI9f,EAAQ,EAClC,GAAI6D,GAAyB,iBAATA,GAAuC,MAAlBA,EAAM4I,WAAqBnJ,MAAMC,QAAQM,GAEhF,IAAK,IAAInI,KADTsE,EAAQ,EACS6D,EAAS,GAAmB,MAAfA,EAAMnI,GAAe,CACjD,IAAI0kB,EAAU1kB,EAAKuS,QAAQ,KACvBmS,EAAU,EAAKtL,EAAIuL,eAAe3kB,EAAKqC,MAAM,EAAGqiB,GAAU1kB,EAAKqC,MAAMqiB,EAAU,GAAIvc,EAAMnI,IACtFoZ,EAAIwL,aAAa5kB,EAAMmI,EAAMnI,IAGxC,IAAK,IAAIP,EAAI6E,EAAO7E,EAAI2kB,EAAUtiB,OAAQrC,IAAK,CAC7C,IAAI2E,EAAQggB,EAAU3kB,GACtB,GAAc,IAAV2E,EAAa,CACf,GAAI3E,EAAI2kB,EAAUtiB,OAAS,GAAKrC,EAAI6E,EAChC,MAAM,IAAI2B,WAAW,0DACzB,MAAO,CAACmT,IAAKA,EAAKiI,WAAYjI,GAE9B,IAAI7O,EAAM4Y,GAAcc,WAAW7W,EAAKhJ,EAAOigB,GACzC5d,EAAQ8D,EAAI6O,IACZyL,EAAeta,EAAI8W,WAEzB,GADAjI,EAAIgH,YAAY3Z,GACZoe,EAAc,CAChB,GAAIxD,EAAc,MAAM,IAAIpb,WAAW,0BACvCob,EAAawD,GAInB,MAAO,CAACzL,IAAKA,EAAKiI,WAAYA,IAMhC8B,GAAc5I,WAAa,SAAqB5S,GAC9C,OAAOA,EAAOiH,OAAOkW,gBAClBnd,EAAOiH,OAAOkW,cAAgB,IAAI3B,GAAcxhB,KAAKojB,gBAAgBpd,GAAShG,KAAKqjB,gBAAgBrd,MAMxGwb,GAAc4B,gBAAkB,SAA0Bpd,GACxD,IAAIrE,EAAS8f,GAAYzb,EAAOO,OAEhC,OADK5E,EAAOwB,OAAQxB,EAAOwB,KAAO,SAAUE,GAAQ,OAAOA,EAAKF,OACzDxB,GAKT6f,GAAc6B,gBAAkB,SAA0Brd,GACxD,OAAOyb,GAAYzb,EAAO8B,S,6BC31G5B,gQAGIwb,EAAc9kB,OAAOY,OAAO,MAI5BmkB,EAAY,SAAmBC,EAASC,EAAOC,GAGjD1jB,KAAK0jB,OAASA,GAAU,CAAC,IAAIC,EAAeH,EAAQ1gB,IAAI2gB,GAAQD,EAAQ3gB,IAAI4gB,KAI5EzjB,KAAKwjB,QAAUA,EAIfxjB,KAAKyjB,MAAQA,GAGX1hB,EAAqB,CAAE6hB,OAAQ,CAAE3hB,cAAc,GAAO8Y,KAAM,CAAE9Y,cAAc,GAAOV,KAAM,CAAEU,cAAc,GAAOI,GAAI,CAAEJ,cAAc,GAAOuG,MAAO,CAAEvG,cAAc,GAAOwG,IAAK,CAAExG,cAAc,GAAO+B,MAAO,CAAE/B,cAAc,IAIhOF,EAAmB6hB,OAAOjlB,IAAM,WAAc,OAAOqB,KAAKwjB,QAAQhhB,KAIlET,EAAmBgZ,KAAKpc,IAAM,WAAc,OAAOqB,KAAKyjB,MAAMjhB,KAI9DT,EAAmBR,KAAK5C,IAAM,WAAc,OAAOqB,KAAKwI,MAAMhG,KAI9DT,EAAmBM,GAAG1D,IAAM,WAAc,OAAOqB,KAAKyI,IAAIjG,KAI1DT,EAAmByG,MAAM7J,IAAM,WAC7B,OAAOqB,KAAK0jB,OAAO,GAAGlb,OAKxBzG,EAAmB0G,IAAI9J,IAAM,WAC3B,OAAOqB,KAAK0jB,OAAO,GAAGjb,KAKxB1G,EAAmBiC,MAAMrF,IAAM,WAE7B,IADA,IAAI+kB,EAAS1jB,KAAK0jB,OACT5lB,EAAI,EAAGA,EAAI4lB,EAAOvjB,OAAQrC,IAC/B,GAAI4lB,EAAO5lB,GAAG0K,MAAMhG,KAAOkhB,EAAO5lB,GAAG2K,IAAIjG,IAAO,OAAO,EAC3D,OAAO,GAYT+gB,EAAU7jB,UAAUK,QAAU,WAC5B,OAAOC,KAAKwI,MAAMnF,KAAK,GAAG3C,MAAMV,KAAKuB,KAAMvB,KAAKqC,IAAI,IAMtDkhB,EAAU7jB,UAAU6I,QAAU,SAAkBsb,EAAI9jB,QAC/B,IAAZA,IAAqBA,EAAU,IAAMiE,OAM5C,IADA,IAAI8f,EAAW/jB,EAAQA,QAAQmC,UAAW6hB,EAAa,KAC9CjmB,EAAI,EAAGA,EAAIiC,EAAQsI,QAASvK,IACnCimB,EAAaD,EACbA,EAAWA,EAAS5hB,UAItB,IADA,IAAI8hB,EAAUH,EAAGI,MAAM9jB,OAAQujB,EAAS1jB,KAAK0jB,OACpChS,EAAM,EAAGA,EAAMgS,EAAOvjB,OAAQuR,IAAO,CAC5C,IAAI9I,EAAM8a,EAAOhS,GACXlJ,EAAQI,EAAIJ,MACZC,EAAMG,EAAIH,IACVyb,EAAUL,EAAGK,QAAQxjB,MAAMsjB,GACjCH,EAAGM,aAAaD,EAAQ5iB,IAAIkH,EAAMhG,KAAM0hB,EAAQ5iB,IAAImH,EAAIjG,KAAMkP,EAAM,IAAM1N,MAAQjE,GACvE,GAAP2R,GACA0S,EAAwBP,EAAIG,GAAUF,EAAWA,EAAS1X,SAAW2X,GAAcA,EAAWtW,cAAgB,EAAI,KAO1H8V,EAAU7jB,UAAU2kB,YAAc,SAAsBR,EAAIxgB,GAE1D,IADA,IAAI2gB,EAAUH,EAAGI,MAAM9jB,OAAQujB,EAAS1jB,KAAK0jB,OACpC5lB,EAAI,EAAGA,EAAI4lB,EAAOvjB,OAAQrC,IAAK,CACtC,IAAI8K,EAAM8a,EAAO5lB,GACX0K,EAAQI,EAAIJ,MACZC,EAAMG,EAAIH,IACVyb,EAAUL,EAAGK,QAAQxjB,MAAMsjB,GAC7BziB,EAAO2iB,EAAQ5iB,IAAIkH,EAAMhG,KAAMH,EAAK6hB,EAAQ5iB,IAAImH,EAAIjG,KACpD1E,EACF+lB,EAAGS,YAAY/iB,EAAMc,IAErBwhB,EAAGU,iBAAiBhjB,EAAMc,EAAIgB,GAC9B+gB,EAAwBP,EAAIG,EAAS3gB,EAAK+I,UAAY,EAAI,MAiBhEmX,EAAUiB,SAAW,SAAmBC,EAAMC,EAAKC,GACjD,IAAI7f,EAAQ2f,EAAKliB,OAAOkK,cAAgB,IAAImY,EAAcH,GACpDI,EAAgBJ,EAAKphB,KAAK,GAAIohB,EAAKliB,OAAQkiB,EAAKjiB,IAAKiiB,EAAKvgB,QAASwgB,EAAKC,GAC9E,GAAI7f,EAAS,OAAOA,EAEpB,IAAK,IAAI4D,EAAQ+b,EAAK/b,MAAQ,EAAGA,GAAS,EAAGA,IAAS,CACpD,IAAItI,EAAQskB,EAAM,EACZG,EAAgBJ,EAAKphB,KAAK,GAAIohB,EAAKphB,KAAKqF,GAAQ+b,EAAK5Y,OAAOnD,EAAQ,GAAI+b,EAAKvgB,MAAMwE,GAAQgc,EAAKC,GAChGE,EAAgBJ,EAAKphB,KAAK,GAAIohB,EAAKphB,KAAKqF,GAAQ+b,EAAK3Y,MAAMpD,EAAQ,GAAI+b,EAAKvgB,MAAMwE,GAAS,EAAGgc,EAAKC,GACzG,GAAIvkB,EAAS,OAAOA,IAQxBmjB,EAAUuB,KAAO,SAAeL,EAAMM,GAGpC,YAFgB,IAATA,IAAkBA,EAAO,GAEzB/kB,KAAKwkB,SAASC,EAAMM,IAAS/kB,KAAKwkB,SAASC,GAAOM,IAAS,IAAIC,EAAaP,EAAKphB,KAAK,KAQ/FkgB,EAAU0B,QAAU,SAAkBxZ,GACpC,OAAOoZ,EAAgBpZ,EAAKA,EAAK,EAAG,EAAG,IAAM,IAAIuZ,EAAavZ,IAMhE8X,EAAU2B,MAAQ,SAAgBzZ,GAChC,OAAOoZ,EAAgBpZ,EAAKA,EAAKA,EAAI1L,QAAQyB,KAAMiK,EAAItJ,YAAa,IAAM,IAAI6iB,EAAavZ,IAM7F8X,EAAUxd,SAAW,SAAmB0F,EAAK5D,GAC3C,IAAKA,IAASA,EAAKf,KAAQ,MAAM,IAAIxC,WAAW,wCAChD,IAAI6gB,EAAM7B,EAAYzb,EAAKf,MAC3B,IAAKqe,EAAO,MAAM,IAAI7gB,WAAY,qBAAwBuD,EAAS,KAAI,YACvE,OAAOsd,EAAIpf,SAAS0F,EAAK5D,IAQ3B0b,EAAU6B,OAAS,SAAiBC,EAAIC,GACtC,GAAID,KAAM/B,EAAe,MAAM,IAAIhf,WAAW,sCAAwC+gB,GAGtF,OAFA/B,EAAY+B,GAAMC,EAClBA,EAAe5lB,UAAU0lB,OAASC,EAC3BC,GAWT/B,EAAU7jB,UAAU6lB,YAAc,WAChC,OAAOX,EAAcY,QAAQxlB,KAAKwjB,QAASxjB,KAAKyjB,OAAO8B,eAGzD/mB,OAAOiI,iBAAkB8c,EAAU7jB,UAAWqC,GAM9CwhB,EAAU7jB,UAAU+lB,SAAU,EAiB9B,IAAI9B,EAAiB,SAAwBnb,EAAOC,GAGlDzI,KAAKwI,MAAQA,EAGbxI,KAAKyI,IAAMA,GAOTmc,EAA8B,SAAUrB,GAC1C,SAASqB,EAAcpB,EAASC,QACf,IAAVA,IAAmBA,EAAQD,GAEhCD,EAAUtlB,KAAK+B,KAAMwjB,EAASC,GAG3BF,IAAYqB,EAAczd,UAAYoc,GAC3CqB,EAAcllB,UAAYlB,OAAOY,OAAQmkB,GAAaA,EAAU7jB,WAChEklB,EAAcllB,UAAUO,YAAc2kB,EAEtC,IAAItc,EAAuB,CAAEod,QAAS,CAAEzjB,cAAc,IA+EtD,OA1EAqG,EAAqBod,QAAQ/mB,IAAM,WAAc,OAAOqB,KAAKwjB,QAAQhhB,KAAOxC,KAAKyjB,MAAMjhB,IAAMxC,KAAKyjB,MAAQ,MAE1GmB,EAAcllB,UAAU4B,IAAM,SAAcmK,EAAKyY,GAC/C,IAAIT,EAAQhY,EAAIoB,QAAQqX,EAAQ5iB,IAAItB,KAAK+a,OACzC,IAAK0I,EAAMlhB,OAAOkK,cAAiB,OAAO8W,EAAUuB,KAAKrB,GACzD,IAAID,EAAU/X,EAAIoB,QAAQqX,EAAQ5iB,IAAItB,KAAK4jB,SAC3C,OAAO,IAAIgB,EAAcpB,EAAQjhB,OAAOkK,cAAgB+W,EAAUC,EAAOA,IAG3EmB,EAAcllB,UAAU6I,QAAU,SAAkBsb,EAAI9jB,GAItD,QAHiB,IAAZA,IAAqBA,EAAU,IAAMiE,OAE1Cuf,EAAU7jB,UAAU6I,QAAQtK,KAAK+B,KAAM6jB,EAAI9jB,GACvCA,GAAW,IAAMiE,MAAO,CAC1B,IAAI8D,EAAQ9H,KAAKwI,MAAM2D,YAAYnM,KAAKyI,KACpCX,GAAS+b,EAAG8B,YAAY7d,KAIhC8c,EAAcllB,UAAU2E,GAAK,SAAaZ,GACxC,OAAOA,aAAiBmhB,GAAiBnhB,EAAMmgB,QAAU5jB,KAAK4jB,QAAUngB,EAAMsX,MAAQ/a,KAAK+a,MAG7F6J,EAAcllB,UAAU6lB,YAAc,WACpC,OAAO,IAAIK,EAAa5lB,KAAK4jB,OAAQ5jB,KAAK+a,OAG5C6J,EAAcllB,UAAUoG,OAAS,WAC/B,MAAO,CAACgB,KAAM,OAAQ8c,OAAQ5jB,KAAK4jB,OAAQ7I,KAAM/a,KAAK+a,OAGxD6J,EAAc7e,SAAW,SAAmB0F,EAAK5D,GAC/C,GAA0B,iBAAfA,EAAK+b,QAA0C,iBAAb/b,EAAKkT,KAC9C,MAAM,IAAIzW,WAAW,4CACzB,OAAO,IAAIsgB,EAAcnZ,EAAIoB,QAAQhF,EAAK+b,QAASnY,EAAIoB,QAAQhF,EAAKkT,QAKtE6J,EAAcxlB,OAAS,SAAiBqM,EAAKmY,EAAQ7I,QACrC,IAATA,IAAkBA,EAAO6I,GAE9B,IAAIJ,EAAU/X,EAAIoB,QAAQ+W,GAC1B,OAAO,IAAI5jB,KAAKwjB,EAASzI,GAAQ6I,EAASJ,EAAU/X,EAAIoB,QAAQkO,KAUlE6J,EAAcY,QAAU,SAAkBhC,EAASC,EAAOsB,GACxD,IAAIc,EAAOrC,EAAQhhB,IAAMihB,EAAMjhB,IAE/B,GADKuiB,IAAQc,IAAQd,EAAOc,GAAQ,EAAI,GAAK,IACxCpC,EAAMlhB,OAAOkK,cAAe,CAC/B,IAAIrM,EAAQmjB,EAAUiB,SAASf,EAAOsB,GAAM,IAASxB,EAAUiB,SAASf,GAAQsB,GAAM,GACtF,IAAI3kB,EACG,OAAOmjB,EAAUuB,KAAKrB,EAAOsB,GADvBtB,EAAQrjB,EAAMqjB,MAW7B,OARKD,EAAQjhB,OAAOkK,gBACN,GAARoZ,IAGFrC,GAAWD,EAAUiB,SAAShB,GAAUuB,GAAM,IAASxB,EAAUiB,SAAShB,EAASuB,GAAM,IAAOvB,SACnFhhB,IAAMihB,EAAMjhB,KAASqjB,EAAO,KAHzCrC,EAAUC,GAMP,IAAImB,EAAcpB,EAASC,IAGpCjlB,OAAOiI,iBAAkBme,EAAcllB,UAAW4I,GAE3Csc,EA1FwB,CA2F/BrB,GAEFA,EAAU6B,OAAO,OAAQR,GAEzB,IAAIgB,EAAe,SAAsBhC,EAAQ7I,GAC/C/a,KAAK4jB,OAASA,EACd5jB,KAAK+a,KAAOA,GAEd6K,EAAalmB,UAAU4B,IAAM,SAAc4iB,GACzC,OAAO,IAAI0B,EAAa1B,EAAQ5iB,IAAItB,KAAK4jB,QAASM,EAAQ5iB,IAAItB,KAAK+a,QAErE6K,EAAalmB,UAAUmN,QAAU,SAAkBpB,GACjD,OAAOmZ,EAAcY,QAAQ/Z,EAAIoB,QAAQ7M,KAAK4jB,QAASnY,EAAIoB,QAAQ7M,KAAK+a,QAQ1E,IAAI+K,EAA8B,SAAUvC,GAC1C,SAASuC,EAAcrB,GACrB,IAAIphB,EAAOohB,EAAKta,UACZhB,EAAOsb,EAAKphB,KAAK,GAAGwJ,QAAQ4X,EAAKjiB,IAAMa,EAAKvB,UAChDyhB,EAAUtlB,KAAK+B,KAAMykB,EAAMtb,GAE3BnJ,KAAKqD,KAAOA,EAiDd,OA9CKkgB,IAAYuC,EAAc3e,UAAYoc,GAC3CuC,EAAcpmB,UAAYlB,OAAOY,OAAQmkB,GAAaA,EAAU7jB,WAChEomB,EAAcpmB,UAAUO,YAAc6lB,EAEtCA,EAAcpmB,UAAU4B,IAAM,SAAcmK,EAAKyY,GAC/C,IAAItb,EAAMsb,EAAQ6B,UAAU/lB,KAAK4jB,QAC7BoC,EAAUpd,EAAIod,QACdxjB,EAAMoG,EAAIpG,IACViiB,EAAOhZ,EAAIoB,QAAQrK,GACvB,OAAIwjB,EAAkBzC,EAAUuB,KAAKL,GAC9B,IAAIqB,EAAcrB,IAG3BqB,EAAcpmB,UAAUK,QAAU,WAChC,OAAO,IAAI,IAAM,IAASwB,KAAKvB,KAAKqD,MAAO,EAAG,IAGhDyiB,EAAcpmB,UAAU2E,GAAK,SAAaZ,GACxC,OAAOA,aAAiBqiB,GAAiBriB,EAAMmgB,QAAU5jB,KAAK4jB,QAGhEkC,EAAcpmB,UAAUoG,OAAS,WAC/B,MAAO,CAACgB,KAAM,OAAQ8c,OAAQ5jB,KAAK4jB,SAGrCkC,EAAcpmB,UAAU6lB,YAAc,WAA0B,OAAO,IAAIU,EAAajmB,KAAK4jB,SAE7FkC,EAAc/f,SAAW,SAAmB0F,EAAK5D,GAC/C,GAA0B,iBAAfA,EAAK+b,OACZ,MAAM,IAAItf,WAAW,4CACzB,OAAO,IAAIwhB,EAAcra,EAAIoB,QAAQhF,EAAK+b,UAK5CkC,EAAc1mB,OAAS,SAAiBqM,EAAKlK,GAC3C,OAAO,IAAIvB,KAAKyL,EAAIoB,QAAQtL,KAM9BukB,EAAcI,aAAe,SAAuB7iB,GAClD,OAAQA,EAAKC,SAAwC,IAA9BD,EAAKyD,KAAKqE,KAAKgb,YAGjCL,EAvDwB,CAwD/BvC,GAEFuC,EAAcpmB,UAAU+lB,SAAU,EAElClC,EAAU6B,OAAO,OAAQU,GAEzB,IAAIG,EAAe,SAAsBrC,GACvC5jB,KAAK4jB,OAASA,GAEhBqC,EAAavmB,UAAU4B,IAAM,SAAc4iB,GACzC,IAAItb,EAAMsb,EAAQ6B,UAAU/lB,KAAK4jB,QAC3BoC,EAAUpd,EAAIod,QACdxjB,EAAMoG,EAAIpG,IAChB,OAAOwjB,EAAU,IAAIJ,EAAapjB,EAAKA,GAAO,IAAIyjB,EAAazjB,IAEjEyjB,EAAavmB,UAAUmN,QAAU,SAAkBpB,GACjD,IAAIgZ,EAAOhZ,EAAIoB,QAAQ7M,KAAK4jB,QAASvgB,EAAOohB,EAAKta,UACjD,OAAI9G,GAAQyiB,EAAcI,aAAa7iB,GAAgB,IAAIyiB,EAAcrB,GAClElB,EAAUuB,KAAKL,IAOxB,IAAIO,EAA6B,SAAUzB,GACzC,SAASyB,EAAavZ,GACpB8X,EAAUtlB,KAAK+B,KAAMyL,EAAIoB,QAAQ,GAAIpB,EAAIoB,QAAQpB,EAAI1L,QAAQyB,OA6B/D,OA1BK+hB,IAAYyB,EAAa7d,UAAYoc,GAC1CyB,EAAatlB,UAAYlB,OAAOY,OAAQmkB,GAAaA,EAAU7jB,WAC/DslB,EAAatlB,UAAUO,YAAc+kB,EAErCA,EAAatlB,UAAU6I,QAAU,SAAkBsb,EAAI9jB,GAGrD,QAFiB,IAAZA,IAAqBA,EAAU,IAAMiE,OAEtCjE,GAAW,IAAMiE,MAAO,CAC1B6f,EAAGuC,OAAO,EAAGvC,EAAGpY,IAAI1L,QAAQyB,MAC5B,IAAI6kB,EAAM9C,EAAU0B,QAAQpB,EAAGpY,KAC1B4a,EAAIhiB,GAAGwf,EAAGyC,YAAczC,EAAG0C,aAAaF,QAE7C9C,EAAU7jB,UAAU6I,QAAQtK,KAAK+B,KAAM6jB,EAAI9jB,IAI/CilB,EAAatlB,UAAUoG,OAAS,WAAqB,MAAO,CAACgB,KAAM,QAEnEke,EAAajf,SAAW,SAAmB0F,GAAO,OAAO,IAAIuZ,EAAavZ,IAE1EuZ,EAAatlB,UAAU4B,IAAM,SAAcmK,GAAO,OAAO,IAAIuZ,EAAavZ,IAE1EuZ,EAAatlB,UAAU2E,GAAK,SAAaZ,GAAS,OAAOA,aAAiBuhB,GAE1EA,EAAatlB,UAAU6lB,YAAc,WAA0B,OAAOiB,GAE/DxB,EA/BuB,CAgC9BzB,GAEFA,EAAU6B,OAAO,MAAOJ,GAExB,IAAIwB,EAAc,CAChBllB,IAAK,WAAiB,OAAOtB,MAC7B6M,QAAS,SAAiBpB,GAAO,OAAO,IAAIuZ,EAAavZ,KAQ3D,SAASoZ,EAAgBpZ,EAAKpI,EAAMb,EAAK0B,EAAOwgB,EAAKvhB,GACnD,GAAIE,EAAKoJ,cAAiB,OAAOmY,EAAcxlB,OAAOqM,EAAKjJ,GAC3D,IAAK,IAAI1E,EAAIoG,GAASwgB,EAAM,EAAI,EAAI,GAAIA,EAAM,EAAI5mB,EAAIuF,EAAKlB,WAAarE,GAAK,EAAGA,GAAK4mB,EAAK,CACxF,IAAIjiB,EAAQY,EAAKZ,MAAM3E,GACvB,GAAK2E,EAAMiL,QAGJ,IAAKvK,GAAQ2iB,EAAcI,aAAazjB,GAC7C,OAAOqjB,EAAc1mB,OAAOqM,EAAKjJ,GAAOkiB,EAAM,EAAIjiB,EAAMX,SAAW,QAJlD,CACjB,IAAIgD,EAAQ+f,EAAgBpZ,EAAKhJ,EAAOD,EAAMkiB,EAAKA,EAAM,EAAIjiB,EAAMN,WAAa,EAAGuiB,EAAKvhB,GACxF,GAAI2B,EAAS,OAAOA,EAItBtC,GAAOC,EAAMX,SAAW4iB,GAI5B,SAASN,EAAwBP,EAAI4C,EAAU1B,GAC7C,IAAIrhB,EAAOmgB,EAAGI,MAAM9jB,OAAS,EAC7B,KAAIuD,EAAO+iB,GAAX,CACA,IAEiC/jB,EAF7BgkB,EAAO7C,EAAGI,MAAMvgB,GACpB,GAAMgjB,aAAgB,KAAeA,aAAgB,IAC3C7C,EAAGK,QAAQyC,KAAKjjB,GACtBvC,SAAQ,SAAUylB,EAAOC,EAAKC,EAAUC,GAAoB,MAAPrkB,IAAeA,EAAMqkB,MAC9ElD,EAAG0C,aAAahD,EAAUuB,KAAKjB,EAAGpY,IAAIoB,QAAQnK,GAAMqiB,KAGtD,IAmBIiC,EAA4B,SAAUC,GACxC,SAASD,EAAYlW,GACnBmW,EAAUhpB,KAAK+B,KAAM8Q,EAAMrF,KAI3BzL,KAAKknB,KAAOC,KAAKC,MACjBpnB,KAAKqnB,aAAevW,EAAMwV,UAE1BtmB,KAAKsnB,gBAAkB,EAGvBtnB,KAAKunB,YAAczW,EAAMyW,YAGzBvnB,KAAKwnB,QAAU,EAEfxnB,KAAKynB,KAAOjpB,OAAOY,OAAO,MAGvB6nB,IAAYD,EAAY7f,UAAY8f,GACzCD,EAAYtnB,UAAYlB,OAAOY,OAAQ6nB,GAAaA,EAAUvnB,WAC9DsnB,EAAYtnB,UAAUO,YAAc+mB,EAEpC,IAAIjlB,EAAqB,CAAEukB,UAAW,CAAErkB,cAAc,GAAOylB,aAAc,CAAEzlB,cAAc,GAAO0lB,eAAgB,CAAE1lB,cAAc,GAAO2lB,UAAW,CAAE3lB,cAAc,GAAO4lB,iBAAkB,CAAE5lB,cAAc,IAwK7M,OAjKAF,EAAmBukB,UAAU3nB,IAAM,WAKjC,OAJIqB,KAAKsnB,gBAAkBtnB,KAAKikB,MAAM9jB,SACpCH,KAAKqnB,aAAernB,KAAKqnB,aAAa/lB,IAAItB,KAAKyL,IAAKzL,KAAKkkB,QAAQxjB,MAAMV,KAAKsnB,kBAC5EtnB,KAAKsnB,gBAAkBtnB,KAAKikB,MAAM9jB,QAE7BH,KAAKqnB,cAMdL,EAAYtnB,UAAU6mB,aAAe,SAAuBD,GAC1D,GAAIA,EAAU9d,MAAMiD,KAAOzL,KAAKyL,IAC5B,MAAM,IAAInH,WAAW,uEAKzB,OAJAtE,KAAKqnB,aAAef,EACpBtmB,KAAKsnB,gBAAkBtnB,KAAKikB,MAAM9jB,OAClCH,KAAKwnB,SAAyC,GAlEhC,EAkEExnB,KAAKwnB,SACrBxnB,KAAKunB,YAAc,KACZvnB,MAKT+B,EAAmB2lB,aAAa/oB,IAAM,WACpC,OA1Ec,EA0ENqB,KAAKwnB,SAAyB,GAKxCR,EAAYtnB,UAAUooB,eAAiB,SAAyBhgB,GAG9D,OAFA9H,KAAKunB,YAAczf,EACnB9H,KAAKwnB,SAjF4B,EAkF1BxnB,MAOTgnB,EAAYtnB,UAAUimB,YAAc,SAAsB7d,GAGxD,OAFK,IAAKC,QAAQ/H,KAAKunB,aAAevnB,KAAKsmB,UAAU9d,MAAMV,QAASA,IAChE9H,KAAK8nB,eAAehgB,GACjB9H,MAKTgnB,EAAYtnB,UAAUqoB,cAAgB,SAAwBja,GAC5D,OAAO9N,KAAK2lB,YAAY7X,EAAK1G,SAASpH,KAAKunB,aAAevnB,KAAKsmB,UAAU7C,MAAM3b,WAKjFkf,EAAYtnB,UAAUsoB,iBAAmB,SAA2Bla,GAClE,OAAO9N,KAAK2lB,YAAY7X,EAAKrG,cAAczH,KAAKunB,aAAevnB,KAAKsmB,UAAU7C,MAAM3b,WAKtF/F,EAAmB4lB,eAAehpB,IAAM,WACtC,OA9GiC,EA8GzBqB,KAAKwnB,SAA2B,GAG1CR,EAAYtnB,UAAUuoB,QAAU,SAAkBvB,EAAMjb,GACtDwb,EAAUvnB,UAAUuoB,QAAQhqB,KAAK+B,KAAM0mB,EAAMjb,GAC7CzL,KAAKwnB,SAAyB,EAAfxnB,KAAKwnB,QACpBxnB,KAAKunB,YAAc,MAKrBP,EAAYtnB,UAAUwoB,QAAU,SAAkBhB,GAEhD,OADAlnB,KAAKknB,KAAOA,EACLlnB,MAKTgnB,EAAYtnB,UAAUyoB,iBAAmB,SAA2BznB,GAElE,OADAV,KAAKsmB,UAAU/d,QAAQvI,KAAMU,GACtBV,MAOTgnB,EAAYtnB,UAAU0oB,qBAAuB,SAA+B/kB,EAAMglB,GAChF,IAAI/B,EAAYtmB,KAAKsmB,UAIrB,OAHqB,IAAjB+B,IACAhlB,EAAOA,EAAKyK,KAAK9N,KAAKunB,cAAgBjB,EAAUtiB,MAAQsiB,EAAU9d,MAAMV,QAAWwe,EAAU9d,MAAM2D,YAAYma,EAAU7d,MAAQ,IAAKR,QAC1Iqe,EAAUjC,YAAYrkB,KAAMqD,GACrBrD,MAKTgnB,EAAYtnB,UAAU4oB,gBAAkB,WAEtC,OADAtoB,KAAKsmB,UAAU/d,QAAQvI,MAChBA,MAMTgnB,EAAYtnB,UAAU6oB,WAAa,SAAqBplB,EAAM5B,EAAMc,QACtD,IAAPA,IAAgBA,EAAKd,GAE1B,IAAIyE,EAAShG,KAAKyL,IAAI3E,KAAKd,OAC3B,GAAY,MAARzE,EACF,OAAK4B,EACEnD,KAAKooB,qBAAqBpiB,EAAO7C,KAAKA,IAAO,GADhCnD,KAAKsoB,kBAGzB,IAAKnlB,EAAQ,OAAOnD,KAAKskB,YAAY/iB,EAAMc,GAC3C,IAAIyF,EAAQ9H,KAAKunB,YACjB,IAAKzf,EAAO,CACV,IAAIU,EAAQxI,KAAKyL,IAAIoB,QAAQtL,GAC7BuG,EAAQzF,GAAMd,EAAOiH,EAAMV,QAAUU,EAAM2D,YAAYnM,KAAKyL,IAAIoB,QAAQxK,IAI1E,OAFArC,KAAKukB,iBAAiBhjB,EAAMc,EAAI2D,EAAO7C,KAAKA,EAAM2E,IAC7C9H,KAAKsmB,UAAUtiB,OAAShE,KAAKumB,aAAahD,EAAUuB,KAAK9kB,KAAKsmB,UAAU7d,MACtEzI,MAOXgnB,EAAYtnB,UAAU8oB,QAAU,SAAkBnpB,EAAKN,GAErD,OADAiB,KAAKynB,KAAmB,iBAAPpoB,EAAkBA,EAAMA,EAAIA,KAAON,EAC7CiB,MAKTgnB,EAAYtnB,UAAU+oB,QAAU,SAAkBppB,GAChD,OAAOW,KAAKynB,KAAmB,iBAAPpoB,EAAkBA,EAAMA,EAAIA,MAMtD0C,EAAmB6lB,UAAUjpB,IAAM,WACjC,IAAK,IAAIiJ,KAAK5H,KAAKynB,KAAQ,OAAO,EAClC,OAAO,GAMTT,EAAYtnB,UAAUgpB,eAAiB,WAErC,OADA1oB,KAAKwnB,SAzMgD,EA0M9CxnB,MAGT+B,EAAmB8lB,iBAAiBlpB,IAAM,WACxC,OA9MqD,EA8M7CqB,KAAKwnB,SAA4B,GAG3ChpB,OAAOiI,iBAAkBugB,EAAYtnB,UAAWqC,GAEzCilB,EAhMsB,CAiM7B,KAEF,SAAS1nB,EAAK8B,EAAGZ,GACf,OAAQA,GAASY,EAAQA,EAAE9B,KAAKkB,GAAXY,EAGvB,IAAIunB,EAAY,SAAmBtqB,EAAMuqB,EAAMpoB,GAC7CR,KAAK3B,KAAOA,EACZ2B,KAAK6oB,KAAOvpB,EAAKspB,EAAKC,KAAMroB,GAC5BR,KAAK8oB,MAAQxpB,EAAKspB,EAAKE,MAAOtoB,IAG5BuoB,EAAa,CACf,IAAIJ,EAAU,MAAO,CACnBE,KAAM,SAAcG,GAAU,OAAOA,EAAOvd,KAAOud,EAAOhjB,OAAO0Q,YAAY9D,iBAC7EkW,MAAO,SAAejF,GAAM,OAAOA,EAAGpY,OAGxC,IAAIkd,EAAU,YAAa,CACzBE,KAAM,SAAcG,EAAQ9S,GAAY,OAAO8S,EAAO1C,WAAa/C,EAAU0B,QAAQ/O,EAASzK,MAC9Fqd,MAAO,SAAejF,GAAM,OAAOA,EAAGyC,aAGxC,IAAIqC,EAAU,cAAe,CAC3BE,KAAM,SAAcG,GAAU,OAAOA,EAAOzB,aAAe,MAC3DuB,MAAO,SAAejF,EAAIoF,EAAQC,EAAMpY,GAAS,OAAOA,EAAMwV,UAAUZ,QAAU7B,EAAG0D,YAAc,QAGrG,IAAIoB,EAAU,oBAAqB,CACjCE,KAAM,WAAkB,OAAO,GAC/BC,MAAO,SAAejF,EAAIsF,GAAQ,OAAOtF,EAAGgE,iBAAmBsB,EAAO,EAAIA,MAM1EC,EAAgB,SAAuBpjB,EAAQqjB,GACjD,IAAIpS,EAASjX,KAEbA,KAAKgG,OAASA,EACdhG,KAAKspB,OAASP,EAAWjoB,SACzBd,KAAKqpB,QAAU,GACfrpB,KAAKupB,aAAe/qB,OAAOY,OAAO,MAC9BiqB,GAAWA,EAAQloB,SAAQ,SAAUqoB,GACvC,GAAIvS,EAAOsS,aAAaC,EAAOnqB,KAC3B,MAAM,IAAIiF,WAAW,iDAAmDklB,EAAOnqB,IAAM,KACzF4X,EAAOoS,QAAQ1oB,KAAK6oB,GACpBvS,EAAOsS,aAAaC,EAAOnqB,KAAOmqB,EAC9BA,EAAOre,KAAK2F,OACZmG,EAAOqS,OAAO3oB,KAAK,IAAIgoB,EAAUa,EAAOnqB,IAAKmqB,EAAOre,KAAK2F,MAAO0Y,QAWpEC,EAAc,SAAqBT,GACrChpB,KAAKgpB,OAASA,GAGZ1gB,EAAuB,CAAEtC,OAAQ,CAAE/D,cAAc,GAAOonB,QAAS,CAAEpnB,cAAc,GAAO4hB,GAAI,CAAE5hB,cAAc,IAchHqG,EAAqBtC,OAAOrH,IAAM,WAChC,OAAOqB,KAAKgpB,OAAOhjB,QAKrBsC,EAAqB+gB,QAAQ1qB,IAAM,WACjC,OAAOqB,KAAKgpB,OAAOK,SAKrBI,EAAY/pB,UAAUopB,MAAQ,SAAgBjF,GAC5C,OAAO7jB,KAAK0pB,iBAAiB7F,GAAI/S,OAInC2Y,EAAY/pB,UAAUiqB,kBAAoB,SAA4B9F,EAAIjF,QACtD,IAAXA,IAAoBA,GAAU,GAErC,IAAK,IAAI9gB,EAAI,EAAGA,EAAIkC,KAAKgpB,OAAOK,QAAQlpB,OAAQrC,IAAO,GAAIA,GAAK8gB,EAAQ,CACtE,IAAI4K,EAASxpB,KAAKgpB,OAAOK,QAAQvrB,GACjC,GAAI0rB,EAAOre,KAAKwe,oBAAsBH,EAAOre,KAAKwe,kBAAkB1rB,KAAKurB,EAAQ3F,EAAI7jB,MACjF,OAAO,EAEb,OAAO,GASTypB,EAAY/pB,UAAUgqB,iBAAmB,SAA2BE,GAClE,IAAK5pB,KAAK2pB,kBAAkBC,GAAW,MAAO,CAAC9Y,MAAO9Q,KAAM6pB,aAAc,IAMzE,IAJD,IAAIC,EAAM,CAACF,GAASG,EAAW/pB,KAAKgqB,WAAWJ,GAASrX,EAAO,OAIrD,CAER,IADA,IAAI0X,GAAU,EACLnsB,EAAI,EAAGA,EAAIkC,KAAKgpB,OAAOK,QAAQlpB,OAAQrC,IAAK,CACnD,IAAI0rB,EAASxpB,KAAKgpB,OAAOK,QAAQvrB,GACjC,GAAI0rB,EAAOre,KAAK+e,kBAAmB,CACjC,IAAI3qB,EAAIgT,EAAOA,EAAKzU,GAAGyB,EAAI,EAAG4qB,EAAW5X,EAAOA,EAAKzU,GAAGgT,MAAQ9Q,KAC5D6jB,EAAKtkB,EAAIuqB,EAAI3pB,QACbqpB,EAAOre,KAAK+e,kBAAkBjsB,KAAKurB,EAAQjqB,EAAIuqB,EAAIppB,MAAMnB,GAAKuqB,EAAKK,EAAUJ,GACjF,GAAIlG,GAAMkG,EAASJ,kBAAkB9F,EAAI/lB,GAAI,CAE3C,GADA+lB,EAAG2E,QAAQ,sBAAuBoB,IAC7BrX,EAAM,CACTA,EAAO,GACP,IAAK,IAAI1N,EAAI,EAAGA,EAAI7E,KAAKgpB,OAAOK,QAAQlpB,OAAQ0E,IAC5C0N,EAAK5R,KAAKkE,EAAI/G,EAAI,CAACgT,MAAOiZ,EAAUxqB,EAAGuqB,EAAI3pB,QAAU,CAAC2Q,MAAO9Q,KAAMT,EAAG,IAE5EuqB,EAAInpB,KAAKkjB,GACTkG,EAAWA,EAASC,WAAWnG,GAC/BoG,GAAU,EAER1X,IAAQA,EAAKzU,GAAK,CAACgT,MAAOiZ,EAAUxqB,EAAGuqB,EAAI3pB,UAGnD,IAAK8pB,EAAW,MAAO,CAACnZ,MAAOiZ,EAAUF,aAAcC,KAK3DL,EAAY/pB,UAAUsqB,WAAa,SAAqBnG,GACtD,IAAKA,EAAGhY,OAAOxH,GAAGrE,KAAKyL,KAAQ,MAAM,IAAInH,WAAW,qCAEpD,IADA,IAAI8lB,EAAc,IAAIX,EAAYzpB,KAAKgpB,QAASM,EAAStpB,KAAKgpB,OAAOM,OAC5DxrB,EAAI,EAAGA,EAAIwrB,EAAOnpB,OAAQrC,IAAK,CACtC,IAAIusB,EAAQf,EAAOxrB,GACnBssB,EAAYC,EAAMhsB,MAAQgsB,EAAMvB,MAAMjF,EAAI7jB,KAAKqqB,EAAMhsB,MAAO2B,KAAMoqB,GAEpE,IAAK,IAAI1Y,EAAM,EAAGA,EAAM4Y,EAAenqB,OAAQuR,IAAS4Y,EAAe5Y,GAAK1R,KAAM6jB,EAAIuG,GACtF,OAAOA,GAKT9hB,EAAqBub,GAAGllB,IAAM,WAAc,OAAO,IAAIqoB,EAAYhnB,OAqBnEypB,EAAYrqB,OAAS,SAAiB4pB,GAGpC,IAFA,IAAIuB,EAAU,IAAInB,EAAcJ,EAAOvd,IAAMud,EAAOvd,IAAI3E,KAAKd,OAASgjB,EAAOhjB,OAAQgjB,EAAOK,SACxFnT,EAAW,IAAIuT,EAAYc,GACtBzsB,EAAI,EAAGA,EAAIysB,EAAQjB,OAAOnpB,OAAQrC,IACvCoY,EAASqU,EAAQjB,OAAOxrB,GAAGO,MAAQksB,EAAQjB,OAAOxrB,GAAG+qB,KAAKG,EAAQ9S,GACtE,OAAOA,GAeTuT,EAAY/pB,UAAU8qB,YAAc,SAAsBxB,GAGxD,IAFA,IAAIuB,EAAU,IAAInB,EAAcppB,KAAKgG,OAAQgjB,EAAOK,SAChDC,EAASiB,EAAQjB,OAAQpT,EAAW,IAAIuT,EAAYc,GAC/CzsB,EAAI,EAAGA,EAAIwrB,EAAOnpB,OAAQrC,IAAK,CACtC,IAAIO,EAAOirB,EAAOxrB,GAAGO,KACrB6X,EAAS7X,GAAQ2B,KAAKL,eAAetB,GAAQ2B,KAAK3B,GAAQirB,EAAOxrB,GAAG+qB,KAAKG,EAAQ9S,GAEnF,OAAOA,GASTuT,EAAY/pB,UAAUoG,OAAS,SAAiB2kB,GAC9C,IAAI9oB,EAAS,CAAC8J,IAAKzL,KAAKyL,IAAI3F,SAAUwgB,UAAWtmB,KAAKsmB,UAAUxgB,UAEhE,GADI9F,KAAKunB,cAAe5lB,EAAO4lB,YAAcvnB,KAAKunB,YAAYjmB,KAAI,SAAUpD,GAAK,OAAOA,EAAE4H,aACtF2kB,GAAuC,iBAAhBA,EAA4B,IAAK,IAAI7oB,KAAQ6oB,EAAc,CACpF,GAAY,OAAR7oB,GAAyB,aAARA,EACjB,MAAM,IAAI0C,WAAW,sDACzB,IAAIklB,EAASiB,EAAa7oB,GAAOkP,EAAQ0Y,EAAOre,KAAK2F,MACjDA,GAASA,EAAMhL,SAAUnE,EAAOC,GAAQkP,EAAMhL,OAAO7H,KAAKurB,EAAQxpB,KAAKwpB,EAAOnqB,OAEpF,OAAOsC,GAiBT8nB,EAAY1jB,SAAW,SAAmBijB,EAAQnhB,EAAM4iB,GACtD,IAAK5iB,EAAQ,MAAM,IAAIvD,WAAW,0CAClC,IAAK0kB,EAAOhjB,OAAU,MAAM,IAAI1B,WAAW,0CAC3C,IAAIimB,EAAU,IAAInB,EAAcJ,EAAOhjB,OAAQgjB,EAAOK,SAClDnT,EAAW,IAAIuT,EAAYc,GAqB/B,OApBAA,EAAQjB,OAAOnoB,SAAQ,SAAUkpB,GAC/B,GAAkB,OAAdA,EAAMhsB,KACR6X,EAASzK,IAAM,IAAK1F,SAASijB,EAAOhjB,OAAQ6B,EAAK4D,UAC5C,GAAkB,aAAd4e,EAAMhsB,KACf6X,EAASoQ,UAAY/C,EAAUxd,SAASmQ,EAASzK,IAAK5D,EAAKye,gBACtD,GAAkB,eAAd+D,EAAMhsB,KACXwJ,EAAK0f,cAAerR,EAASqR,YAAc1f,EAAK0f,YAAYjmB,IAAI0nB,EAAOhjB,OAAOmJ,mBAC7E,CACL,GAAIsb,EAAgB,IAAK,IAAI7oB,KAAQ6oB,EAAc,CACjD,IAAIjB,EAASiB,EAAa7oB,GAAOkP,EAAQ0Y,EAAOre,KAAK2F,MACrD,GAAI0Y,EAAOnqB,KAAOgrB,EAAMhsB,MAAQyS,GAASA,EAAM/K,UAC3CvH,OAAOkB,UAAUC,eAAe1B,KAAK4J,EAAMjG,GAG7C,YADAsU,EAASmU,EAAMhsB,MAAQyS,EAAM/K,SAAS9H,KAAKurB,EAAQR,EAAQnhB,EAAKjG,GAAOsU,IAI3EA,EAASmU,EAAMhsB,MAAQgsB,EAAMxB,KAAKG,EAAQ9S,OAGvCA,GASTuT,EAAYiB,iBAAmB,SAA2BtpB,GACxDkpB,EAAe3pB,KAAKS,IAEtBqoB,EAAYkB,oBAAsB,SAA8BvpB,GAC9D,IAAIhB,EAAQkqB,EAAe1Z,QAAQxP,GAC/BhB,GAAS,GAAKkqB,EAAe1pB,OAAOR,EAAO,IAGjD5B,OAAOiI,iBAAkBgjB,EAAY/pB,UAAW4I,GAEhD,IAAIgiB,EAAiB,GAiErB,IAAIM,EAAS,SAAgBzf,GAG3BnL,KAAK6qB,MAAQ,GACT1f,EAAK0f,OAjBX,SAASC,EAAUnjB,EAAKnH,EAAMuJ,GAC5B,IAAK,IAAInI,KAAQ+F,EAAK,CACpB,IAAIgE,EAAMhE,EAAI/F,GACV+J,aAAeof,SAAYpf,EAAMA,EAAIrM,KAAKkB,GAC7B,mBAARoB,IAA6B+J,EAAMmf,EAAUnf,EAAKnL,EAAM,KACjEuJ,EAAOnI,GAAQ+J,EAEjB,OAAO5B,EAUW+gB,CAAU3f,EAAK0f,MAAO7qB,KAAMA,KAAK6qB,OAGnD7qB,KAAKmL,KAAOA,EACZnL,KAAKX,IAAM8L,EAAK9L,IAAM8L,EAAK9L,IAAIA,IAAM2rB,EAAU,WAKjDJ,EAAOlrB,UAAUurB,SAAW,SAAmBna,GAAS,OAAOA,EAAM9Q,KAAKX,MA4B1E,IAAI6rB,EAAO1sB,OAAOY,OAAO,MAEzB,SAAS4rB,EAAU3sB,GACjB,OAAIA,KAAQ6sB,EAAe7sB,EAAO,OAAQ6sB,EAAK7sB,IAC/C6sB,EAAK7sB,GAAQ,EACNA,EAAO,KAOhB,IAAI8sB,EAAY,SAAmB9sB,QACrB,IAATA,IAAkBA,EAAO,OAC7B2B,KAAKX,IAAM2rB,EAAU3sB,IAKtB8sB,EAAUzrB,UAAUf,IAAM,SAAcmS,GAAS,OAAOA,EAAMkY,OAAOO,aAAavpB,KAAKX,MAIvF8rB,EAAUzrB,UAAUurB,SAAW,SAAmBna,GAAS,OAAOA,EAAM9Q,KAAKX,O,8nBCpmC7E,SAASipB,EAAgBxX,EAAOsa,GAC9B,OAAIta,EAAMwV,UAAUtiB,QAChBonB,GAAYA,EAASta,EAAM+S,GAAGyE,kBAAkBI,mBAC7C,GAuDT,SAAS2C,EAAYhoB,EAAMioB,GACzB,KAAOjoB,EAAMA,EAAgB,SAARioB,EAAkBjoB,EAAKrB,WAAaqB,EAAKnB,UAC1D,GAAImB,EAAKoK,YAAe,OAAO,EACnC,OAAO,EA4BT,SAAS8d,EAAc9G,GACrB,IAAKA,EAAKliB,OAAOuE,KAAKqE,KAAKC,UAAa,IAAK,IAAItN,EAAI2mB,EAAK/b,MAAQ,EAAG5K,GAAK,EAAGA,IAAK,CAChF,GAAI2mB,EAAKvgB,MAAMpG,GAAK,EAAK,OAAO2mB,EAAKhZ,IAAIoB,QAAQ4X,EAAK5Y,OAAO/N,EAAI,IACjE,GAAI2mB,EAAKphB,KAAKvF,GAAGgJ,KAAKqE,KAAKC,UAAa,MAE1C,OAAO,KAwET,SAASogB,EAAa/G,GACpB,IAAKA,EAAKliB,OAAOuE,KAAKqE,KAAKC,UAAa,IAAK,IAAItN,EAAI2mB,EAAK/b,MAAQ,EAAG5K,GAAK,EAAGA,IAAK,CAChF,IAAIyE,EAASkiB,EAAKphB,KAAKvF,GACvB,GAAI2mB,EAAKvgB,MAAMpG,GAAK,EAAIyE,EAAOJ,WAAc,OAAOsiB,EAAKhZ,IAAIoB,QAAQ4X,EAAK3Y,MAAMhO,EAAI,IACpF,GAAIyE,EAAOuE,KAAKqE,KAAKC,UAAa,MAEpC,OAAO,KA0DT,SAASqgB,EAAc3a,EAAOsa,GAC5B,IAAIxiB,EAAMkI,EAAMwV,UACZ7C,EAAQ7a,EAAI6a,MACZD,EAAU5a,EAAI4a,QAClB,SAAKC,EAAMlhB,OAAOuE,KAAKqE,KAAKugB,OAASjI,EAAM9W,WAAW6W,MAClD4H,GAAYA,EAASta,EAAM+S,GAAG0E,WAAW,MAAMG,mBAC5C,GAGT,SAASiD,EAAepd,GACtB,IAAK,IAAIzQ,EAAI,EAAGA,EAAIyQ,EAAMsB,UAAW/R,IAAK,CACxC,IACIgJ,EADMyH,EAAMgD,KAAKzT,GACNgJ,KACf,GAAIA,EAAK2G,cAAgB3G,EAAKmL,mBAAsB,OAAOnL,EAE7D,OAAO,KAOT,SAAS8kB,EAAS9a,EAAOsa,GACvB,IAAIxiB,EAAMkI,EAAMwV,UACZ7C,EAAQ7a,EAAI6a,MACZD,EAAU5a,EAAI4a,QAClB,IAAKC,EAAMlhB,OAAOuE,KAAKqE,KAAKugB,OAASjI,EAAM9W,WAAW6W,GAAY,OAAO,EACzE,IAAIqI,EAAQpI,EAAMpgB,MAAM,GAAIyI,EAAQ2X,EAAM7X,YAAY,GAAI9E,EAAO6kB,EAAeE,EAAMvd,eAAexC,IACrG,IAAK+f,EAAM9c,eAAejD,EAAOA,EAAOhF,GAAS,OAAO,EACxD,GAAIskB,EAAU,CACZ,IAAI5oB,EAAMihB,EAAM3X,QAAS+X,EAAK/S,EAAM+S,GAAGQ,YAAY7hB,EAAKA,EAAKsE,EAAK8L,iBAClEiR,EAAG0C,aAAa,IAAUzB,KAAKjB,EAAGpY,IAAIoB,QAAQrK,GAAM,IACpD4oB,EAASvH,EAAG6E,kBAEd,OAAO,EA6CT,SAASoD,EAAWhb,EAAOsa,GACzB,IAAIxiB,EAAMkI,EAAMwV,UACZ9d,EAAQI,EAAIJ,MACZC,EAAMG,EAAIH,IACd,GAAIqI,EAAMwV,qBAAqB,KAAiBxV,EAAMwV,UAAUjjB,KAAKG,QACnE,SAAKgF,EAAMiB,eAAiB,YAASqH,EAAMrF,IAAKjD,EAAMhG,QAClD4oB,GAAYA,EAASta,EAAM+S,GAAGtQ,MAAM/K,EAAMhG,KAAKkmB,mBAC5C,GAGT,IAAKlgB,EAAMjG,OAAOiB,QAAW,OAAO,EAEpC,GAAI4nB,EAAU,CACZ,IAAIlG,EAAQzc,EAAIgB,cAAgBhB,EAAIlG,OAAOxC,QAAQyB,KAC/CqiB,EAAK/S,EAAM+S,GACX/S,EAAMwV,qBAAqB,KAAiBzC,EAAGyE,kBACnD,IAAIpH,EAAuB,GAAf1Y,EAAME,MAAa,KAAOijB,EAAenjB,EAAMnF,MAAM,GAAGiL,eAAe9F,EAAMoD,YAAY,KACjG6G,EAAQyS,GAAShE,EAAQ,CAAC,CAACpa,KAAMoa,IAAU,KAC3C6K,EAAM,YAASlI,EAAGpY,IAAKoY,EAAGK,QAAQ5iB,IAAIkH,EAAMhG,KAAM,EAAGiQ,GACpDA,GAAUsZ,IAAO,YAASlI,EAAGpY,IAAKoY,EAAGK,QAAQ5iB,IAAIkH,EAAMhG,KAAM,EAAG0e,GAAS,CAAC,CAACpa,KAAMoa,OACpFzO,EAAQ,CAAC,CAAC3L,KAAMoa,IAChB6K,GAAM,GAEJA,IACFlI,EAAGtQ,MAAMsQ,EAAGK,QAAQ5iB,IAAIkH,EAAMhG,KAAM,EAAGiQ,GAClCyS,GAAU1c,EAAMiB,cAAgBjB,EAAMjG,OAAOuE,MAAQoa,IACtD1Y,EAAMnF,MAAM,GAAGsH,WAAWnC,EAAMtE,OAAO,GAAIsE,EAAMoD,YAAY,GAAI,IAASrK,KAAK,CAAC2f,EAAM9hB,SAAUoJ,EAAMjG,WACtGshB,EAAGmI,cAAcnI,EAAGK,QAAQ5iB,IAAIkH,EAAMqD,UAAWqV,IAEvDkK,EAASvH,EAAG6E,kBAEd,OAAO,EAqDT,SAASuD,EAAcnb,EAAOob,EAAMd,GAClC,IAAsDe,EAAM5d,EAAxD1C,EAASqgB,EAAK9hB,WAAY0B,EAAQogB,EAAK/hB,UAC3C,GAAI0B,EAAO/E,KAAKqE,KAAKC,WAAaU,EAAMhF,KAAKqE,KAAKC,UAAa,OAAO,EACtE,GApBF,SAAwB0F,EAAO2T,EAAM2G,GACnC,IAAIvf,EAAS4Y,EAAKra,WAAY0B,EAAQ2Y,EAAKta,UAAWjG,EAAQugB,EAAKvgB,QACnE,SAAK2H,GAAWC,GAAUD,EAAO/E,KAAK8C,kBAAkBkC,EAAMhF,UACzD+E,EAAO9L,QAAQyB,MAAQijB,EAAKliB,OAAOoI,WAAWzG,EAAQ,EAAGA,IACxDknB,GAAYA,EAASta,EAAM+S,GAAGuC,OAAO3B,EAAKjiB,IAAMqJ,EAAO/J,SAAU2iB,EAAKjiB,KAAKkmB,mBACxE,MAEJjE,EAAKliB,OAAOoI,WAAWzG,EAAOA,EAAQ,KAAQ4H,EAAM2B,cAAe,YAAQqD,EAAMrF,IAAKgZ,EAAKjiB,QAE5F4oB,GACAA,EAASta,EAAM+S,GACPuI,kBAAkB3H,EAAKjiB,IAAKqJ,EAAO/E,KAAM+E,EAAOyC,eAAezC,EAAO1J,aACtE0D,KAAK4e,EAAKjiB,KACVkmB,mBACL,IAMH2D,CAAevb,EAAOob,EAAMd,GAAa,OAAO,EAEpD,IAAIkB,EAAcJ,EAAK3pB,OAAOoI,WAAWuhB,EAAKhoB,QAASgoB,EAAKhoB,QAAU,GACtE,GAAIooB,IACCH,GAAQ5d,EAAQ1C,EAAOyC,eAAezC,EAAO1J,aAAa0Q,aAAa/G,EAAMhF,QAC9EyH,EAAMS,UAAUmd,EAAK,IAAMrgB,EAAMhF,MAAM+H,SAAU,CACnD,GAAIuc,EAAU,CAEZ,IADA,IAAI1oB,EAAMwpB,EAAK1pB,IAAMsJ,EAAMhK,SAAU6Z,EAAO,IAAS3X,MAC5ClG,EAAIquB,EAAKhsB,OAAS,EAAGrC,GAAK,EAAGA,IAClC6d,EAAO,IAASpa,KAAK4qB,EAAKruB,GAAGsB,OAAO,KAAMuc,IAC9CA,EAAO,IAASpa,KAAKsK,EAAOzH,KAAKuX,IACjC,IAAIkI,EAAK/S,EAAM+S,GAAG6C,KAAK,IAAI,IAAkBwF,EAAK1pB,IAAM,EAAGE,EAAKwpB,EAAK1pB,IAAKE,EAAK,IAAI,IAAMiZ,EAAM,EAAG,GAAIwQ,EAAKhsB,QAAQ,IAC/GosB,EAAS7pB,EAAM,EAAIypB,EAAKhsB,OACxB,YAAQ0jB,EAAGpY,IAAK8gB,IAAW1I,EAAGhe,KAAK0mB,GACvCnB,EAASvH,EAAG6E,kBAEd,OAAO,EAGT,IAAI8D,EAAW,IAAUhI,SAAS0H,EAAM,GACpCO,EAAQD,GAAYA,EAAShkB,MAAM+D,WAAWigB,EAAS/jB,KAAMsB,EAAS0iB,GAAS,YAAWA,GAC9F,GAAc,MAAV1iB,GAAkBA,GAAUmiB,EAAKxjB,MAEnC,OADI0iB,GAAYA,EAASta,EAAM+S,GAAG6I,KAAKD,EAAO1iB,GAAQ2e,mBAC/C,EAGT,GAAI4D,GAAexgB,EAAM2B,aAAe4d,EAAYxf,EAAQ,OAAQ,CAElE,IADA,IAAI8gB,EAAK9gB,EAAQ+gB,EAAS,GAExBA,EAAOjsB,KAAKgsB,IACRA,EAAGlf,aACPkf,EAAKA,EAAGzqB,UAEV,GAAIyqB,EAAGhiB,WAAWgiB,EAAGxqB,WAAYwqB,EAAGxqB,WAAY2J,EAAM/L,SAAU,CAC9D,GAAIqrB,EAAU,CAEZ,IADA,IAAIyB,EAAQ,IAAS7oB,MACZ0N,EAAMkb,EAAOzsB,OAAS,EAAGuR,GAAO,EAAGA,IAASmb,EAAQ,IAAStrB,KAAKqrB,EAAOlb,GAAKtN,KAAKyoB,IAI5FzB,EAHWta,EAAM+S,GAAG6C,KAAK,IAAI,IAAkBwF,EAAK1pB,IAAMoqB,EAAOzsB,OAAQ+rB,EAAK1pB,IAAMsJ,EAAMhK,SAC7CoqB,EAAK1pB,IAAM,EAAG0pB,EAAK1pB,IAAMsJ,EAAMhK,SAAW,EAC1C,IAAI,IAAM+qB,EAAOD,EAAOzsB,OAAQ,GAAI,GAAG,IACtEuoB,kBAEhB,OAAO,GAIX,OAAO,EAQT,SAASoE,EAAO1d,EAAU5I,GACxB,OAAO,SAASsK,EAAOsa,GACrB,IAAIxiB,EAAMkI,EAAMwV,UACZ9d,EAAQI,EAAIJ,MACZC,EAAMG,EAAIH,IACVgkB,EAAQjkB,EAAM+D,WAAW9D,GAAMskB,EAAWN,GAAS,YAAaA,EAAOrd,EAAU5I,GACrF,QAAKumB,IACD3B,GAAYA,EAASta,EAAM+S,GAAGlI,KAAK8Q,EAAOM,GAAUrE,mBACjD,IAOX,SAASsE,EAAa5d,EAAU5I,GAC9B,OAAO,SAASsK,EAAOsa,GACrB,IAAIxiB,EAAMkI,EAAMwV,UACZ/kB,EAAOqH,EAAIrH,KACXc,EAAKuG,EAAIvG,GACT4qB,GAAa,EAWjB,OAVAnc,EAAMrF,IAAIrJ,aAAab,EAAMc,GAAI,SAAUgB,EAAMb,GAC/C,GAAIyqB,EAAc,OAAO,EACzB,GAAK5pB,EAAKoK,cAAepK,EAAKuK,UAAUwB,EAAU5I,GAClD,GAAInD,EAAKyD,MAAQsI,EACf6d,GAAa,MACR,CACL,IAAIxI,EAAO3T,EAAMrF,IAAIoB,QAAQrK,GAAM0B,EAAQugB,EAAKvgB,QAChD+oB,EAAaxI,EAAKliB,OAAOwM,eAAe7K,EAAOA,EAAQ,EAAGkL,SAGzD6d,IACD7B,GAAYA,EAASta,EAAM+S,GAAGmJ,aAAazrB,EAAMc,EAAI+M,EAAU5I,GAAOkiB,mBACnE,IAiCX,SAASwE,EAAWxX,EAAUlP,GAC5B,OAAO,SAASsK,EAAOsa,GACrB,IAAIxiB,EAAMkI,EAAMwV,UACZtiB,EAAQ4E,EAAI5E,MACZ0hB,EAAU9c,EAAI8c,QACdhC,EAAS9a,EAAI8a,OACjB,GAAK1f,IAAU0hB,IAnCnB,SAAqBja,EAAKiY,EAAQ5c,GAahC,IAZA,IAAIwK,EAAO,SAAWxT,GACpB,IAAI8K,EAAM8a,EAAO5lB,GACb0K,EAAQI,EAAIJ,MACZC,EAAMG,EAAIH,IACVsjB,EAAqB,GAAfvjB,EAAME,OAAa+C,EAAI3E,KAAK2O,eAAe3O,GAKrD,GAJA2E,EAAIrJ,aAAaoG,EAAMhG,IAAKiG,EAAIjG,KAAK,SAAUa,GAC7C,GAAI0oB,EAAO,OAAO,EAClBA,EAAM1oB,EAAKoJ,eAAiBpJ,EAAKyD,KAAK2O,eAAe3O,MAEnDilB,EAAO,MAAO,CAAE9O,GAAG,IAGhBnf,EAAI,EAAGA,EAAI4lB,EAAOvjB,OAAQrC,IAAK,CACtC,IAAIof,EAAW5L,EAAMxT,GAErB,GAAKof,EAAW,OAAOA,EAASD,EAElC,OAAO,EAiBuBkQ,CAAYrc,EAAMrF,IAAKiY,EAAQhO,GAAa,OAAO,EAC/E,GAAI0V,EACF,GAAI1F,EACEhQ,EAAShO,QAAQoJ,EAAMyW,aAAe7B,EAAQ5d,SAC9CsjB,EAASta,EAAM+S,GAAGmE,iBAAiBtS,IAEnC0V,EAASta,EAAM+S,GAAGkE,cAAcrS,EAAStW,OAAOoH,SAC/C,CAEL,IADA,IAAI4mB,GAAM,EAAOvJ,EAAK/S,EAAM+S,GACnB/lB,EAAI,GAAIsvB,GAAOtvB,EAAI4lB,EAAOvjB,OAAQrC,IAAK,CAC9C,IAAIgN,EAAQ4Y,EAAO5lB,GACf0K,EAAQsC,EAAMtC,MACdC,EAAMqC,EAAMrC,IAChB2kB,EAAMtc,EAAMrF,IAAI0C,aAAa3F,EAAMhG,IAAKiG,EAAIjG,IAAKkT,GAEnD,IAAK,IAAIhE,EAAM,EAAGA,EAAMgS,EAAOvjB,OAAQuR,IAAO,CAC5C,IAAI2b,EAAQ3J,EAAOhS,GACf4b,EAAUD,EAAM7kB,MAChB+kB,EAAQF,EAAM5kB,IAClB,GAAI2kB,EACFvJ,EAAG2J,WAAWF,EAAQ9qB,IAAK+qB,EAAM/qB,IAAKkT,OACjC,CACL,IAAInU,EAAO+rB,EAAQ9qB,IAAKH,EAAKkrB,EAAM/qB,IAAKG,EAAQ2qB,EAAQnjB,UAAWzH,EAAM6qB,EAAMnjB,WAC3EqjB,EAAa9qB,GAASA,EAAMW,OAAS,OAAOsY,KAAKjZ,EAAMQ,MAAM,GAAGhD,OAAS,EACzEutB,EAAWhrB,GAAOA,EAAIY,OAAS,OAAOsY,KAAKlZ,EAAIS,MAAM,GAAGhD,OAAS,EACjEoB,EAAOksB,EAAaprB,IAAMd,GAAQksB,EAAYprB,GAAMqrB,GACxD7J,EAAG8J,QAAQpsB,EAAMc,EAAIqT,EAAStW,OAAOoH,KAGzC4kB,EAASvH,EAAG6E,kBAGhB,OAAO,GA4DX,SAASkF,IAEP,IADA,IAAIC,EAAW,GAAIC,EAAMC,UAAU5tB,OAC3B2tB,KAAQD,EAAUC,GAAQC,UAAWD,GAE7C,OAAO,SAAShd,EAAOsa,EAAU4C,GAC/B,IAAK,IAAIlwB,EAAI,EAAGA,EAAI+vB,EAAS1tB,OAAQrC,IACjC,GAAI+vB,EAAS/vB,GAAGgT,EAAOsa,EAAU4C,GAAS,OAAO,EACrD,OAAO,GAIX,IAAIC,EAAYL,EAActF,GAnmB9B,SAAsBxX,EAAOsa,EAAU4C,GACrC,IACItI,EADM5U,EAAMwV,UACEZ,QAClB,IAAKA,IAAYsI,GAAQA,EAAKE,eAAe,WAAYpd,GACjC4U,EAAQjc,aAAe,GAC3C,OAAO,EAEX,IAAIyiB,EAAOX,EAAc7F,GAGzB,IAAKwG,EAAM,CACT,IAAIO,EAAQ/G,EAAQnZ,aAAcxC,EAAS0iB,GAAS,YAAWA,GAC/D,OAAc,MAAV1iB,IACAqhB,GAAYA,EAASta,EAAM+S,GAAG6I,KAAKD,EAAO1iB,GAAQ2e,mBAC/C,GAGT,IAAI7c,EAASqgB,EAAK9hB,WAElB,IAAKyB,EAAO/E,KAAKqE,KAAKC,WAAa6gB,EAAcnb,EAAOob,EAAMd,GAC1D,OAAO,EAIX,GAAmC,GAA/B1F,EAAQnjB,OAAOxC,QAAQyB,OACtB6pB,EAAYxf,EAAQ,QAAU,IAAcqa,aAAara,IAAU,CACtE,GAAIuf,EAAU,CACZ,IAAIvH,EAAK/S,EAAM+S,GAAGS,YAAYoB,EAAQ7Z,SAAU6Z,EAAQ5Z,SACxD+X,EAAG0C,aAAa8E,EAAYxf,EAAQ,OAAS,IAAU2Y,SAASX,EAAGpY,IAAIoB,QAAQgX,EAAGK,QAAQ5iB,IAAI4qB,EAAK1pB,KAAM,KAAM,GAC7F,IAAcpD,OAAOykB,EAAGpY,IAAKygB,EAAK1pB,IAAMqJ,EAAO/J,WACjEspB,EAASvH,EAAG6E,kBAEd,OAAO,EAIT,SAAI7c,EAAO6B,QAAUwe,EAAKxjB,OAASgd,EAAQhd,MAAQ,KAC7C0iB,GAAYA,EAASta,EAAM+S,GAAGuC,OAAO8F,EAAK1pB,IAAMqJ,EAAO/J,SAAUoqB,EAAK1pB,KAAKkmB,mBACxE,MAmBX,SAA4B5X,EAAOsa,EAAU4C,GAC3C,IAAIplB,EAAMkI,EAAMwV,UACZ7C,EAAQ7a,EAAI6a,MAEZyI,EAAOzI,EACX,IAFY7a,EAAI5E,MAEF,OAAO,EAErB,GAAIyf,EAAMlhB,OAAOkL,YAAa,CAC5B,GAAIugB,GAAQA,EAAKE,eAAe,WAAYpd,GAAS2S,EAAMha,aAAe,EAAK,OAAO,EACtFyiB,EAAOX,EAAc9H,GAEvB,IAAIpgB,EAAO6oB,GAAQA,EAAK9hB,WACxB,SAAK/G,IAAS,IAAc6iB,aAAa7iB,MACrC+nB,GACAA,EAASta,EAAM+S,GAAG0C,aAAa,IAAcnnB,OAAO0R,EAAMrF,IAAKygB,EAAK1pB,IAAMa,EAAKvB,WAAW4mB,mBACvF,MA4hBLyF,EAAMP,EAActF,GA3gBxB,SAAqBxX,EAAOsa,EAAU4C,GACpC,IACItI,EADM5U,EAAMwV,UACEZ,QAClB,IAAKA,IAAYsI,GAAQA,EAAKE,eAAe,UAAWpd,GAChC4U,EAAQjc,aAAeic,EAAQnjB,OAAOxC,QAAQyB,MAClE,OAAO,EAEX,IAAI0qB,EAAOV,EAAa9F,GAGxB,IAAKwG,EAAQ,OAAO,EAEpB,IAAIpgB,EAAQogB,EAAK/hB,UAEjB,GAAI8hB,EAAcnb,EAAOob,EAAMd,GAAa,OAAO,EAInD,GAAmC,GAA/B1F,EAAQnjB,OAAOxC,QAAQyB,OACtB6pB,EAAYvf,EAAO,UAAY,IAAcoa,aAAapa,IAAS,CACtE,GAAIsf,EAAU,CACZ,IAAIvH,EAAK/S,EAAM+S,GAAGS,YAAYoB,EAAQ7Z,SAAU6Z,EAAQ5Z,SACxD+X,EAAG0C,aAAa8E,EAAYvf,EAAO,SAAW,IAAU0Y,SAASX,EAAGpY,IAAIoB,QAAQgX,EAAGK,QAAQ5iB,IAAI4qB,EAAK1pB,MAAO,GACzF,IAAcpD,OAAOykB,EAAGpY,IAAKoY,EAAGK,QAAQ5iB,IAAI4qB,EAAK1pB,OACnE4oB,EAASvH,EAAG6E,kBAEd,OAAO,EAIT,SAAI5c,EAAM4B,QAAUwe,EAAKxjB,OAASgd,EAAQhd,MAAQ,KAC5C0iB,GAAYA,EAASta,EAAM+S,GAAGuC,OAAO8F,EAAK1pB,IAAK0pB,EAAK1pB,IAAMsJ,EAAMhK,UAAU4mB,mBACvE,MAaX,SAA2B5X,EAAOsa,EAAU4C,GAC1C,IAAIplB,EAAMkI,EAAMwV,UACZ7C,EAAQ7a,EAAI6a,MAEZyI,EAAOzI,EACX,IAFY7a,EAAI5E,MAEF,OAAO,EACrB,GAAIyf,EAAMlhB,OAAOkL,YAAa,CAC5B,GAAIugB,GAAQA,EAAKE,eAAe,UAAWpd,GAAS2S,EAAMha,aAAega,EAAMlhB,OAAOxC,QAAQyB,KAC1F,OAAO,EACX0qB,EAAOV,EAAa/H,GAEtB,IAAIpgB,EAAO6oB,GAAQA,EAAK/hB,UACxB,SAAK9G,IAAS,IAAc6iB,aAAa7iB,MACrC+nB,GACAA,EAASta,EAAM+S,GAAG0C,aAAa,IAAcnnB,OAAO0R,EAAMrF,IAAKygB,EAAK1pB,MAAMkmB,mBACvE,MA4dL0F,EAAe,CACjB,MAASR,EAAcnC,GAlXzB,SAA6B3a,EAAOsa,GAClC,IAAIxiB,EAAMkI,EAAMwV,UACZ9d,EAAQI,EAAIJ,MACZC,EAAMG,EAAIH,IACd,GAAID,EAAMjG,OAAOkK,eAAiBhE,EAAIlG,OAAOkK,cAAiB,OAAO,EACrE,IAAI3F,EAAO6kB,EAAenjB,EAAMjG,OAAO+L,eAAe7F,EAAImD,eAC1D,IAAK9E,IAASA,EAAK2G,YAAe,OAAO,EACzC,GAAI2d,EAAU,CACZ,IAAIE,IAAS9iB,EAAMiB,cAAgBhB,EAAIvE,QAAUuE,EAAIlG,OAAOJ,WAAaqG,EAAQC,GAAKjG,IAClFqhB,EAAK/S,EAAM+S,GAAGnZ,OAAO4gB,EAAMxkB,EAAK8L,iBACpCiR,EAAG0C,aAAa,IAAcnnB,OAAOykB,EAAGpY,IAAK6f,EAAO,IACpDF,EAASvH,EAAG6E,kBAEd,OAAO,KAMT,SAAwB5X,EAAOsa,GAC7B,IACI1F,EADM5U,EAAMwV,UACEZ,QAClB,IAAKA,GAAWA,EAAQnjB,OAAOxC,QAAQyB,KAAQ,OAAO,EACtD,GAAIkkB,EAAQhd,MAAQ,GAAKgd,EAAQ5Z,SAAW4Z,EAAQhjB,KAAK,GAAI,CAC3D,IAAImJ,EAAS6Z,EAAQ7Z,SACrB,GAAI,YAASiF,EAAMrF,IAAKI,GAEtB,OADIuf,GAAYA,EAASta,EAAM+S,GAAGtQ,MAAM1H,GAAQ6c,mBACzC,EAGX,IAAI+D,EAAQ/G,EAAQnZ,aAAcxC,EAAS0iB,GAAS,YAAWA,GAC/D,OAAc,MAAV1iB,IACAqhB,GAAYA,EAASta,EAAM+S,GAAG6I,KAAKD,EAAO1iB,GAAQ2e,mBAC/C,KAiVoEoD,GAC3E,YAAaF,EACb,UAAaqC,EACb,gBAAiBA,EACjB,OAAUE,EACV,aAAcA,EACd,QAnRF,SAAmBrd,EAAOsa,GAExB,OADIA,GAAYA,EAASta,EAAM+S,GAAG0C,aAAa,IAAI,IAAazV,EAAMrF,QAC/D,IAyRL4iB,EAAgB,CAClB,SAAUD,EAAwB,UAClC,gBAAiBA,EAAa,iBAC9B,SAAUA,EAAqB,OAC/B,qBAAsBA,EAAa,cACnC,aAAcA,EAAa,cAC3B,QAASA,EAAa,eAExB,IAAK,IAAI/uB,KAAO+uB,EAAgBC,EAAchvB,GAAO+uB,EAAa/uB,GAGlE,IAOIivB,GAP0B,oBAAbC,UAA2B,MAAM1a,KAAK0a,UAAUC,UACxC,oBAANC,IAAqC,UAAjBA,GAAGD,YAMnBH,EAAgBD,E,sBC5nBvC,SAASM,EAAeC,EAAQjZ,EAAU0C,GACxC,OAAO,IAAI,IAAUuW,EAAQ,CAAC7d,EAAOvC,EAAO5L,EAAOD,KACjD,MAAM8D,EAAQ4R,aAAoB2S,SAAW3S,EAAS7J,GAAS6J,GACzD,GACJyL,GACE/S,EACE5S,EAAIqQ,EAAMpO,OAAS,EACzB,IAAIyuB,EAAUlsB,EACVmsB,EAAYlsB,EAEhB,GAAI4L,EAAMrQ,GAAI,CACZ,MAAM4wB,EAAansB,EAAQ4L,EAAM,GAAGqC,QAAQrC,EAAMrQ,EAAI,IAChD6wB,EAAWD,EAAavgB,EAAMrQ,EAAI,GAAGiC,OAAS,EAC9C6uB,EAAYF,EAAavgB,EAAMrQ,EAAI,GAAGojB,YAAY/S,EAAMrQ,IACxD+wB,EAAUD,EAAYzgB,EAAMrQ,GAAGiC,OAQrC,GAlCN,SAAyBwC,EAAOD,EAAKoO,GACnC,IAAIhJ,EAAQ,GAQZ,OAPAgJ,EAAMrF,IAAIrJ,aAAaO,EAAOD,EAAK,CAACW,EAAMb,KACxCsF,EAAQ,IAAIA,KAAUzE,EAAKyE,MAAMxG,IAAIwM,IAAQ,CAC3CnL,MAAOH,EACPE,IAAKF,EAAMa,EAAKvB,SAChBgM,aAGGhG,EAkBmBonB,CAAgBvsB,EAAOD,EAAKoO,GAAOqe,OAAOC,IAC9D,MAAM,SACJnZ,GACEmZ,EAAKthB,KAAKhH,KACd,OAAOmP,EAAS/V,KAAK4G,GAAQA,EAAKzI,OAASqX,EAASrX,QACnD8wB,OAAOC,GAAQA,EAAK1sB,IAAMosB,GAEX3uB,OAChB,OAAO,EAGL8uB,EAAUF,GACZlL,EAAGuC,OAAO6I,EAASF,GAGjBC,EAAYF,GACdjL,EAAGuC,OAAO0I,EAAYE,GAGxBH,EAAYC,EACZF,EAAUC,EAAYtgB,EAAMrQ,GAAGiC,OAKjC,OAFA0jB,EAAG8J,QAAQkB,EAAWD,EAASlZ,EAAStW,OAAOoH,IAC/Cqd,EAAGmE,iBAAiBtS,GACbmO,IAIX,SAASwL,EAAeV,EAAQ7nB,EAAMsR,GACpC,OAAO,IAAI,IAAUuW,EAAQ,CAAC7d,EAAOvC,EAAO5L,EAAOD,KACjD,MAAM8D,EAAQ4R,aAAoB2S,SAAW3S,EAAS7J,GAAS6J,GACzD,GACJyL,GACE/S,EAMJ,OAJIvC,EAAM,IACRsV,EAAGQ,YAAY1hB,EAAQ,EAAGD,EAAKoE,EAAK1H,OAAOoH,IAGtCqd,IAkGX,SAAS2J,EAAY1mB,GACnB,MAAO,CAACgK,EAAOsa,KACb,MAAM,GACJvH,EAAE,UACFyC,GACExV,EACJ,IAAI,KACFvP,EAAI,GACJc,GACEikB,EACJ,MAAM,MACJ9d,EAAK,MACLxE,GACEsiB,EAEJ,GAAItiB,EAAO,CACT,MAAMyoB,EAAQ,YAAajkB,EAAO1B,GAClCvF,EAAOkrB,EAAMlrB,KACbc,EAAKoqB,EAAMpqB,GAIb,OADAwhB,EAAG2J,WAAWjsB,EAAMc,EAAIyE,GACjBskB,EAASvH,IAsIpB,SAASyL,EAAiBxoB,EAAMyoB,EAAY/oB,EAAQ,IAClD,MAAO,CAACsK,EAAOsa,EAAU4C,IACN,YAAald,EAAOhK,EAAMN,GAGlCwmB,EAAauC,EAAbvC,CAAyBlc,EAAOsa,EAAU4C,GAG5ChB,EAAalmB,EAAMN,EAAnBwmB,CAA0Blc,EAAOsa,EAAU4C,GAItD,SAASwB,EAAOnsB,EAAM2C,GACpB,OAAO3C,EAAKyD,OAASd,EAAOO,MAAMkpB,aAAepsB,EAAKyD,OAASd,EAAOO,MAAMmpB,cAAgBrsB,EAAKyD,OAASd,EAAOO,MAAMopB,UAGzH,SAASC,EAAWC,EAAUC,GAC5B,MAAO,CAAChf,EAAOsa,EAAU4C,KACvB,MAAM,OACJhoB,EAAM,UACNsgB,GACExV,GACE,MACJtI,EAAK,IACLC,GACE6d,EACEmG,EAAQjkB,EAAM+D,WAAW9D,GAE/B,IAAKgkB,EACH,OAAO,EAGT,MAAMsD,EAAa,YAAe1sB,GAAQmsB,EAAOnsB,EAAM2C,GAApC,CAA6CsgB,GAEhE,GAAImG,EAAM/jB,OAAS,GAAKqnB,GAActD,EAAM/jB,MAAQqnB,EAAWrnB,OAAS,EAAG,CACzE,GAAIqnB,EAAW1sB,KAAKyD,OAAS+oB,EAC3B,OAAO,YAAaC,EAAb,CAAuBhf,EAAOsa,EAAU4C,GAGjD,GAAIwB,EAAOO,EAAW1sB,KAAM2C,IAAW6pB,EAASxlB,aAAa0lB,EAAW1sB,KAAKtD,SAAU,CACrF,MAAM,GACJ8jB,GACE/S,EAOJ,OANA+S,EAAGmI,cAAc+D,EAAWvtB,IAAKqtB,GAE7BzE,GACFA,EAASvH,IAGJ,GAIX,OAAO,YAAWgM,EAAX,CAAqB/e,EAAOsa,EAAU4C,IAIjD,SAASgC,EAAYlpB,EAAMN,EAAQ,IACjC,MAAO,CAACsK,EAAOsa,EAAU4C,IACN,YAAald,EAAOhK,EAAMN,GD5L/C,SAAcsK,EAAOsa,GACnB,IAAIxiB,EAAMkI,EAAMwV,UACZ9d,EAAQI,EAAIJ,MACZC,EAAMG,EAAIH,IACVgkB,EAAQjkB,EAAM+D,WAAW9D,GAAMsB,EAAS0iB,GAAS,YAAWA,GAChE,OAAc,MAAV1iB,IACAqhB,GAAYA,EAASta,EAAM+S,GAAG6I,KAAKD,EAAO1iB,GAAQ2e,mBAC/C,GCwLIgE,CAAK5b,EAAOsa,GAGd0B,EAAOhmB,EAAMN,EAAbsmB,CAAoBhc,EAAOsa,EAAU4C,GAIhD,SAASiC,EAAYnpB,EAAMN,GACzB,MAAO,CAACsK,EAAOsa,KACb,MAAM,GACJvH,EAAE,UACFyC,EAAS,IACT7a,GACEqF,GACE,OACJ4S,EAAM,MACN1f,GACEsiB,EAEJ,GAAItiB,EAAO,CACT,MAAM,KACJzC,EAAI,GACJc,GACE,YAAaikB,EAAU9d,MAAO1B,GAE9B2E,EAAI0C,aAAa5M,EAAMc,EAAIyE,IAC7B+c,EAAG2J,WAAWjsB,EAAMc,EAAIyE,GAG1B+c,EAAG8J,QAAQpsB,EAAMc,EAAIyE,EAAK1H,OAAOoH,SAEjCkd,EAAOviB,QAAQ2J,IACb,MAAM,IACJrC,EAAG,MACHD,GACEsC,EAEAW,EAAI0C,aAAa3F,EAAMhG,IAAKiG,EAAIjG,IAAKsE,IACvC+c,EAAG2J,WAAWhlB,EAAMhG,IAAKiG,EAAIjG,IAAKsE,GAGpC+c,EAAG8J,QAAQnlB,EAAMhG,IAAKiG,EAAIjG,IAAKsE,EAAK1H,OAAOoH,MAI/C,OAAO4kB,EAASvH,M,6BC1cpB,+VA+BIqM,EAAWttB,KAAKutB,IAAI,EAAG,IAG3B,SAASC,EAAarxB,GAAS,OAJjB,MAIwBA,EAKtC,IAAIsxB,EAAY,SAAmB7tB,EAAKwjB,EAASsK,QAC9B,IAAZtK,IAAqBA,GAAU,QACnB,IAAZsK,IAAqBA,EAAU,MAGpCtwB,KAAKwC,IAAMA,EAGXxC,KAAKgmB,QAAUA,EACfhmB,KAAKswB,QAAUA,GAQbC,EAAU,SAAiB7M,EAAQ8M,QACnB,IAAbA,IAAsBA,GAAW,GAEtCxwB,KAAK0jB,OAASA,EACd1jB,KAAKwwB,SAAWA,GAGlBD,EAAQ7wB,UAAU4wB,QAAU,SAAkBvxB,GAC5C,IAAI0xB,EAAO,EAAGvsB,EAAQksB,EAAarxB,GACnC,IAAKiB,KAAKwwB,SAAY,IAAK,IAAI1yB,EAAI,EAAGA,EAAIoG,EAAOpG,IAC7C2yB,GAAQzwB,KAAK0jB,OAAW,EAAJ5lB,EAAQ,GAAKkC,KAAK0jB,OAAW,EAAJ5lB,EAAQ,GACzD,OAAOkC,KAAK0jB,OAAe,EAARxf,GAAausB,EAhClC,SAAuB1xB,GAAS,OAAQA,GAL1B,MAKmCA,IAAoBmxB,EAgC5BQ,CAAc3xB,IAIvDwxB,EAAQ7wB,UAAUqmB,UAAY,SAAoBvjB,EAAKmuB,GAEtD,YADgB,IAAVA,IAAmBA,EAAQ,GAC1B3wB,KAAK4wB,KAAKpuB,EAAKmuB,GAAO,IAG9BJ,EAAQ7wB,UAAU4B,IAAM,SAAckB,EAAKmuB,GAE1C,YADgB,IAAVA,IAAmBA,EAAQ,GAC1B3wB,KAAK4wB,KAAKpuB,EAAKmuB,GAAO,IAE9BJ,EAAQ7wB,UAAUkxB,KAAO,SAAepuB,EAAKmuB,EAAOE,GAElD,IADA,IAAIJ,EAAO,EAAGK,EAAW9wB,KAAKwwB,SAAW,EAAI,EAAGO,EAAW/wB,KAAKwwB,SAAW,EAAI,EACtE1yB,EAAI,EAAGA,EAAIkC,KAAK0jB,OAAOvjB,OAAQrC,GAAK,EAAG,CAC9C,IAAI6E,EAAQ3C,KAAK0jB,OAAO5lB,IAAMkC,KAAKwwB,SAAWC,EAAO,GACrD,GAAI9tB,EAAQH,EAAO,MACnB,IAAIwuB,EAAUhxB,KAAK0jB,OAAO5lB,EAAIgzB,GAAWG,EAAUjxB,KAAK0jB,OAAO5lB,EAAIizB,GAAWruB,EAAMC,EAAQquB,EAC5F,GAAIxuB,GAAOE,EAAK,CACd,IACIf,EAASgB,EAAQ8tB,IADTO,EAAkBxuB,GAAOG,GAAS,EAAIH,GAAOE,EAAM,EAAIiuB,EAA7CA,GACc,EAAI,EAAIM,GAC5C,GAAIJ,EAAU,OAAOlvB,EACrB,IAAI2uB,EAAU9tB,IAAQmuB,EAAQ,EAAIhuB,EAAQD,GAAO,KAAmB5E,EAAI,GAAG0E,EAAMG,GAzDzButB,EA0DxD,OAAO,IAAIG,EAAU1uB,EAAQgvB,EAAQ,EAAInuB,GAAOG,EAAQH,GAAOE,EAAK4tB,GAEtEG,GAAQQ,EAAUD,EAEpB,OAAOH,EAASruB,EAAMiuB,EAAO,IAAIJ,EAAU7tB,EAAMiuB,IAGnDF,EAAQ7wB,UAAUwxB,QAAU,SAAkB1uB,EAAK8tB,GAGjD,IAFA,IAAIG,EAAO,EAAGvsB,EAAQksB,EAAaE,GAC/BQ,EAAW9wB,KAAKwwB,SAAW,EAAI,EAAGO,EAAW/wB,KAAKwwB,SAAW,EAAI,EAC5D1yB,EAAI,EAAGA,EAAIkC,KAAK0jB,OAAOvjB,OAAQrC,GAAK,EAAG,CAC9C,IAAI6E,EAAQ3C,KAAK0jB,OAAO5lB,IAAMkC,KAAKwwB,SAAWC,EAAO,GACrD,GAAI9tB,EAAQH,EAAO,MACnB,IAAIwuB,EAAUhxB,KAAK0jB,OAAO5lB,EAAIgzB,GAC9B,GAAItuB,GAD2CG,EAAQquB,GACrClzB,GAAa,EAARoG,EAAa,OAAO,EAC3CusB,GAAQzwB,KAAK0jB,OAAO5lB,EAAIizB,GAAYC,EAEtC,OAAO,GAMTT,EAAQ7wB,UAAUyB,QAAU,SAAkBC,GAE5C,IADA,IAAI0vB,EAAW9wB,KAAKwwB,SAAW,EAAI,EAAGO,EAAW/wB,KAAKwwB,SAAW,EAAI,EAC5D1yB,EAAI,EAAG2yB,EAAO,EAAG3yB,EAAIkC,KAAK0jB,OAAOvjB,OAAQrC,GAAK,EAAG,CACxD,IAAI6E,EAAQ3C,KAAK0jB,OAAO5lB,GAAIqzB,EAAWxuB,GAAS3C,KAAKwwB,SAAWC,EAAO,GAAIW,EAAWzuB,GAAS3C,KAAKwwB,SAAW,EAAIC,GAC/GO,EAAUhxB,KAAK0jB,OAAO5lB,EAAIgzB,GAAWG,EAAUjxB,KAAK0jB,OAAO5lB,EAAIizB,GACnE3vB,EAAE+vB,EAAUA,EAAWH,EAASI,EAAUA,EAAWH,GACrDR,GAAQQ,EAAUD,IAOtBT,EAAQ7wB,UAAU2xB,OAAS,WACzB,OAAO,IAAId,EAAQvwB,KAAK0jB,QAAS1jB,KAAKwwB,WAGxCD,EAAQ7wB,UAAUiG,SAAW,WAC3B,OAAQ3F,KAAKwwB,SAAW,IAAM,IAAMlhB,KAAKC,UAAUvP,KAAK0jB,SAO1D6M,EAAQ7pB,OAAS,SAAiBnH,GAChC,OAAY,GAALA,EAASgxB,EAAQvsB,MAAQ,IAAIusB,EAAQhxB,EAAI,EAAI,CAAC,GAAIA,EAAG,GAAK,CAAC,EAAG,EAAGA,KAG1EgxB,EAAQvsB,MAAQ,IAAIusB,EAAQ,IAS5B,IAAIe,EAAU,SAAiB3K,EAAM4K,EAAQhwB,EAAMc,GAGjDrC,KAAK2mB,KAAOA,GAAQ,GAIpB3mB,KAAKuB,KAAOA,GAAQ,EAGpBvB,KAAKqC,GAAW,MAANA,EAAarC,KAAK2mB,KAAKxmB,OAASkC,EAC1CrC,KAAKuxB,OAASA,GAyGhB,SAASC,EAAexqB,GACtB,IAAIC,EAAMC,MAAMjJ,KAAK+B,KAAMgH,GAE3B,OADAC,EAAIE,UAAYqqB,EAAe9xB,UACxBuH,EAvGTqqB,EAAQ5xB,UAAUgB,MAAQ,SAAgBa,EAAMc,GAI9C,YAHgB,IAATd,IAAkBA,EAAO,QAClB,IAAPc,IAAgBA,EAAKrC,KAAK2mB,KAAKxmB,QAE/B,IAAImxB,EAAQtxB,KAAK2mB,KAAM3mB,KAAKuxB,OAAQhwB,EAAMc,IAGnDivB,EAAQ5xB,UAAU0E,KAAO,WACvB,OAAO,IAAIktB,EAAQtxB,KAAK2mB,KAAKjmB,QAASV,KAAKuxB,QAAUvxB,KAAKuxB,OAAO7wB,QAASV,KAAKuB,KAAMvB,KAAKqC,KAO5FivB,EAAQ5xB,UAAU+xB,UAAY,SAAoBnwB,EAAKowB,GACrD1xB,KAAKqC,GAAKrC,KAAK2mB,KAAKhmB,KAAKW,GACV,MAAXowB,GAAmB1xB,KAAK2xB,UAAU3xB,KAAK2mB,KAAKxmB,OAAS,EAAGuxB,IAM9DJ,EAAQ5xB,UAAUkyB,cAAgB,SAAwB1N,GACxD,IAAK,IAAIpmB,EAAI,EAAG+zB,EAAY7xB,KAAK2mB,KAAKxmB,OAAQrC,EAAIomB,EAAQyC,KAAKxmB,OAAQrC,IAAK,CAC1E,IAAIg0B,EAAO5N,EAAQ6N,UAAUj0B,GAC7BkC,KAAKyxB,UAAUvN,EAAQyC,KAAK7oB,GAAY,MAARg0B,GAAgBA,EAAOh0B,EAAI+zB,EAAYC,EAAO,QAQlFR,EAAQ5xB,UAAUqyB,UAAY,SAAoBxyB,GAChD,GAAIS,KAAKuxB,OAAU,IAAK,IAAIzzB,EAAI,EAAGA,EAAIkC,KAAKuxB,OAAOpxB,OAAQrC,IACvD,GAAIkC,KAAKuxB,OAAOzzB,IAAMyB,EAAK,OAAOS,KAAKuxB,OAAOzzB,GAAKA,EAAI,GAAK,EAAI,KAGtEwzB,EAAQ5xB,UAAUiyB,UAAY,SAAoBpyB,EAAGrB,GAC9C8B,KAAKuxB,SAAUvxB,KAAKuxB,OAAS,IAClCvxB,KAAKuxB,OAAO5wB,KAAKpB,EAAGrB,IAKtBozB,EAAQ5xB,UAAUsyB,sBAAwB,SAAgC9N,GACxE,IAAK,IAAIpmB,EAAIomB,EAAQyC,KAAKxmB,OAAS,EAAG8xB,EAAYjyB,KAAK2mB,KAAKxmB,OAAS+jB,EAAQyC,KAAKxmB,OAAQrC,GAAK,EAAGA,IAAK,CACrG,IAAIg0B,EAAO5N,EAAQ6N,UAAUj0B,GAC7BkC,KAAKyxB,UAAUvN,EAAQyC,KAAK7oB,GAAGuzB,SAAkB,MAARS,GAAgBA,EAAOh0B,EAAIm0B,EAAYH,EAAO,EAAI,QAM/FR,EAAQ5xB,UAAU2xB,OAAS,WACzB,IAAIa,EAAU,IAAIZ,EAElB,OADAY,EAAQF,sBAAsBhyB,MACvBkyB,GAKTZ,EAAQ5xB,UAAU4B,IAAM,SAAckB,EAAKmuB,GAGzC,QAFiB,IAAVA,IAAmBA,EAAQ,GAE9B3wB,KAAKuxB,OAAU,OAAOvxB,KAAK4wB,KAAKpuB,EAAKmuB,GAAO,GAChD,IAAK,IAAI7yB,EAAIkC,KAAKuB,KAAMzD,EAAIkC,KAAKqC,GAAIvE,IACjC0E,EAAMxC,KAAK2mB,KAAK7oB,GAAGwD,IAAIkB,EAAKmuB,GAChC,OAAOnuB,GAMT8uB,EAAQ5xB,UAAUqmB,UAAY,SAAoBvjB,EAAKmuB,GAEtD,YADgB,IAAVA,IAAmBA,EAAQ,GAC1B3wB,KAAK4wB,KAAKpuB,EAAKmuB,GAAO,IAE9BW,EAAQ5xB,UAAUkxB,KAAO,SAAepuB,EAAKmuB,EAAOE,GAGlD,IAFA,IAAI7K,GAAU,EAELloB,EAAIkC,KAAKuB,KAAMzD,EAAIkC,KAAKqC,GAAIvE,IAAK,CACxC,IAAwB6D,EAAd3B,KAAK2mB,KAAK7oB,GAAiBioB,UAAUvjB,EAAKmuB,GACpD,GAAsB,MAAlBhvB,EAAO2uB,QAAiB,CAC1B,IAAI6B,EAAOnyB,KAAK+xB,UAAUj0B,GAC1B,GAAY,MAARq0B,GAAgBA,EAAOr0B,GAAKq0B,EAAOnyB,KAAKqC,GAAI,CAC9CvE,EAAIq0B,EACJ3vB,EAAMxC,KAAK2mB,KAAKwL,GAAM7B,QAAQ3uB,EAAO2uB,SACrC,UAIA3uB,EAAOqkB,UAAWA,GAAU,GAChCxjB,EAAMb,EAAOa,IAGf,OAAOquB,EAASruB,EAAM,IAAI6tB,EAAU7tB,EAAKwjB,IAS3CwL,EAAe9xB,UAAYlB,OAAOY,OAAO8H,MAAMxH,WAC/C8xB,EAAe9xB,UAAUO,YAAcuxB,EACvCA,EAAe9xB,UAAUrB,KAAO,iBAOhC,IAAI4oB,EAAY,SAAmBxb,GAIjCzL,KAAKyL,IAAMA,EAGXzL,KAAKikB,MAAQ,GAGbjkB,KAAKoyB,KAAO,GAGZpyB,KAAKkkB,QAAU,IAAIoN,GAGjBvvB,EAAqB,CAAE8J,OAAQ,CAAE5J,cAAc,GAAOowB,WAAY,CAAEpwB,cAAc,IAuCtF,SAASqwB,IAAiB,MAAM,IAAIprB,MAAM,eApC1CnF,EAAmB8J,OAAOlN,IAAM,WAAc,OAAOqB,KAAKoyB,KAAKjyB,OAASH,KAAKoyB,KAAK,GAAKpyB,KAAKyL,KAK5Fwb,EAAUvnB,UAAUgnB,KAAO,SAAelnB,GACxC,IAAImC,EAAS3B,KAAKuyB,UAAU/yB,GAC5B,GAAImC,EAAO6wB,OAAU,MAAM,IAAIhB,EAAe7vB,EAAO6wB,QACrD,OAAOxyB,MAMTinB,EAAUvnB,UAAU6yB,UAAY,SAAoB7L,GAClD,IAAI/kB,EAAS+kB,EAAKoC,MAAM9oB,KAAKyL,KAE7B,OADK9J,EAAO6wB,QAAUxyB,KAAKioB,QAAQvB,EAAM/kB,EAAO8J,KACzC9J,GAMTI,EAAmBswB,WAAW1zB,IAAM,WAClC,OAAOqB,KAAKikB,MAAM9jB,OAAS,GAG7B8mB,EAAUvnB,UAAUuoB,QAAU,SAAkBvB,EAAMjb,GACpDzL,KAAKoyB,KAAKzxB,KAAKX,KAAKyL,KACpBzL,KAAKikB,MAAMtjB,KAAK+lB,GAChB1mB,KAAKkkB,QAAQuN,UAAU/K,EAAK+L,UAC5BzyB,KAAKyL,IAAMA,GAGbjN,OAAOiI,iBAAkBwgB,EAAUvnB,UAAWqC,GAI9C,IAAI2wB,EAAYl0B,OAAOY,OAAO,MAW1BuzB,EAAO,aAEXA,EAAKjzB,UAAUopB,MAAQ,SAAgB8J,GAAQ,OAAON,KAMtDK,EAAKjzB,UAAU+yB,OAAS,WAAqB,OAAOlC,EAAQvsB,OAK5D2uB,EAAKjzB,UAAU2xB,OAAS,SAAiBuB,GAAQ,OAAON,KAMxDK,EAAKjzB,UAAU4B,IAAM,SAAcuxB,GAAY,OAAOP,KAMtDK,EAAKjzB,UAAUozB,MAAQ,SAAgBC,GAAU,OAAO,MAOxDJ,EAAKjzB,UAAUoG,OAAS,WAAqB,OAAOwsB,KAKpDK,EAAK5sB,SAAW,SAAmBC,EAAQ6B,GACzC,IAAKA,IAASA,EAAKmrB,SAAY,MAAM,IAAI1uB,WAAW,mCACpD,IAAIwC,EAAO4rB,EAAU7qB,EAAKmrB,UAC1B,IAAKlsB,EAAQ,MAAM,IAAIxC,WAAY,gBAAmBuD,EAAa,SAAI,YACvE,OAAOf,EAAKf,SAASC,EAAQ6B,IAQ/B8qB,EAAKvN,OAAS,SAAiBC,EAAI4N,GACjC,GAAI5N,KAAMqN,EAAa,MAAM,IAAIpuB,WAAW,iCAAmC+gB,GAG/E,OAFAqN,EAAUrN,GAAM4N,EAChBA,EAAUvzB,UAAU0lB,OAASC,EACtB4N,GAKT,IAAIC,EAAa,SAAoBznB,EAAK+mB,GAExCxyB,KAAKyL,IAAMA,EAEXzL,KAAKwyB,OAASA,GAKhBU,EAAWtc,GAAK,SAAanL,GAAO,OAAO,IAAIynB,EAAWznB,EAAK,OAI/DynB,EAAWC,KAAO,SAAensB,GAAW,OAAO,IAAIksB,EAAW,KAAMlsB,IAMxEksB,EAAWE,YAAc,SAAsB3nB,EAAKlK,EAAMc,EAAI3B,GAC5D,IACE,OAAOwyB,EAAWtc,GAAGnL,EAAIlD,QAAQhH,EAAMc,EAAI3B,IAC3C,MAAO2yB,GACP,GAAIA,aAAa,IAAgB,OAAOH,EAAWC,KAAKE,EAAErsB,SAC1D,MAAMqsB,IAKV,IAAIC,EAA4B,SAAUX,GACxC,SAASW,EAAY/xB,EAAMc,EAAI3B,EAAO+hB,GACpCkQ,EAAK10B,KAAK+B,MACVA,KAAKuB,KAAOA,EACZvB,KAAKqC,GAAKA,EACVrC,KAAKU,MAAQA,EACbV,KAAKyiB,YAAcA,EAwDrB,OArDKkQ,IAAOW,EAAYnsB,UAAYwrB,GACpCW,EAAY5zB,UAAYlB,OAAOY,OAAQuzB,GAAQA,EAAKjzB,WACpD4zB,EAAY5zB,UAAUO,YAAcqzB,EAEpCA,EAAY5zB,UAAUopB,MAAQ,SAAgBrd,GAC5C,OAAIzL,KAAKyiB,WAAa8Q,EAAe9nB,EAAKzL,KAAKuB,KAAMvB,KAAKqC,IAC/C6wB,EAAWC,KAAK,6CACpBD,EAAWE,YAAY3nB,EAAKzL,KAAKuB,KAAMvB,KAAKqC,GAAIrC,KAAKU,QAG9D4yB,EAAY5zB,UAAU+yB,OAAS,WAC7B,OAAO,IAAIlC,EAAQ,CAACvwB,KAAKuB,KAAMvB,KAAKqC,GAAKrC,KAAKuB,KAAMvB,KAAKU,MAAMc,QAGjE8xB,EAAY5zB,UAAU2xB,OAAS,SAAiB5lB,GAC9C,OAAO,IAAI6nB,EAAYtzB,KAAKuB,KAAMvB,KAAKuB,KAAOvB,KAAKU,MAAMc,KAAMiK,EAAI/K,MAAMV,KAAKuB,KAAMvB,KAAKqC,MAG3FixB,EAAY5zB,UAAU4B,IAAM,SAAc4iB,GACxC,IAAI3iB,EAAO2iB,EAAQ6B,UAAU/lB,KAAKuB,KAAM,GAAIc,EAAK6hB,EAAQ6B,UAAU/lB,KAAKqC,IAAK,GAC7E,OAAId,EAAKykB,SAAW3jB,EAAG2jB,QAAkB,KAClC,IAAIsN,EAAY/xB,EAAKiB,IAAKI,KAAKC,IAAItB,EAAKiB,IAAKH,EAAGG,KAAMxC,KAAKU,QAGpE4yB,EAAY5zB,UAAUozB,MAAQ,SAAgBrvB,GAC5C,KAAMA,aAAiB6vB,IAAgB7vB,EAAMgf,WAAaziB,KAAKyiB,UAAa,OAAO,KAEnF,GAAIziB,KAAKuB,KAAOvB,KAAKU,MAAMc,MAAQiC,EAAMlC,MAASvB,KAAKU,MAAM2H,SAAY5E,EAAM/C,MAAM0H,UAI9E,IAAI3E,EAAMpB,IAAMrC,KAAKuB,MAASvB,KAAKU,MAAM0H,WAAc3E,EAAM/C,MAAM2H,QAKxE,OAAO,KAJP,IAAImrB,EAAUxzB,KAAKU,MAAMc,KAAOiC,EAAM/C,MAAMc,MAAQ,EAAI,IAAMwC,MACxD,IAAI,IAAMP,EAAM/C,MAAMX,QAAQ2B,OAAO1B,KAAKU,MAAMX,SAAU0D,EAAM/C,MAAM0H,UAAWpI,KAAKU,MAAM2H,SAClG,OAAO,IAAIirB,EAAY7vB,EAAMlC,KAAMvB,KAAKqC,GAAImxB,EAASxzB,KAAKyiB,WAN1D,IAAI/hB,EAAQV,KAAKU,MAAMc,KAAOiC,EAAM/C,MAAMc,MAAQ,EAAI,IAAMwC,MACtD,IAAI,IAAMhE,KAAKU,MAAMX,QAAQ2B,OAAO+B,EAAM/C,MAAMX,SAAUC,KAAKU,MAAM0H,UAAW3E,EAAM/C,MAAM2H,SAClG,OAAO,IAAIirB,EAAYtzB,KAAKuB,KAAMvB,KAAKqC,IAAMoB,EAAMpB,GAAKoB,EAAMlC,MAAOb,EAAOV,KAAKyiB,YAUrF6Q,EAAY5zB,UAAUoG,OAAS,WAC7B,IAAI+B,EAAO,CAACmrB,SAAU,UAAWzxB,KAAMvB,KAAKuB,KAAMc,GAAIrC,KAAKqC,IAG3D,OAFIrC,KAAKU,MAAMc,OAAQqG,EAAKnH,MAAQV,KAAKU,MAAMoF,UAC3C9F,KAAKyiB,YAAa5a,EAAK4a,WAAY,GAChC5a,GAGTyrB,EAAYvtB,SAAW,SAAmBC,EAAQ6B,GAChD,GAAwB,iBAAbA,EAAKtG,MAAsC,iBAAXsG,EAAKxF,GAC5C,MAAM,IAAIiC,WAAW,0CACzB,OAAO,IAAIgvB,EAAYzrB,EAAKtG,KAAMsG,EAAKxF,GAAI,IAAM0D,SAASC,EAAQ6B,EAAKnH,SAAUmH,EAAK4a,YAGjF6Q,EA9DsB,CA+D7BX,GAEFA,EAAKvN,OAAO,UAAWkO,GAKvB,IAAIG,EAAkC,SAAUd,GAC9C,SAASc,EAAkBlyB,EAAMc,EAAIqxB,EAASC,EAAOjzB,EAAOgK,EAAQ+X,GAClEkQ,EAAK10B,KAAK+B,MACVA,KAAKuB,KAAOA,EACZvB,KAAKqC,GAAKA,EACVrC,KAAK0zB,QAAUA,EACf1zB,KAAK2zB,MAAQA,EACb3zB,KAAKU,MAAQA,EACbV,KAAK0K,OAASA,EACd1K,KAAKyiB,YAAcA,EAwDrB,OArDKkQ,IAAOc,EAAkBtsB,UAAYwrB,GAC1Cc,EAAkB/zB,UAAYlB,OAAOY,OAAQuzB,GAAQA,EAAKjzB,WAC1D+zB,EAAkB/zB,UAAUO,YAAcwzB,EAE1CA,EAAkB/zB,UAAUopB,MAAQ,SAAgBrd,GAClD,GAAIzL,KAAKyiB,YAAc8Q,EAAe9nB,EAAKzL,KAAKuB,KAAMvB,KAAK0zB,UACpCH,EAAe9nB,EAAKzL,KAAK2zB,MAAO3zB,KAAKqC,KACxD,OAAO6wB,EAAWC,KAAK,iDAE3B,IAAIS,EAAMnoB,EAAI/K,MAAMV,KAAK0zB,QAAS1zB,KAAK2zB,OACvC,GAAIC,EAAIxrB,WAAawrB,EAAIvrB,QACrB,OAAO6qB,EAAWC,KAAK,2BAC3B,IAAIU,EAAW7zB,KAAKU,MAAM4J,SAAStK,KAAK0K,OAAQkpB,EAAI7zB,SACpD,OAAK8zB,EACEX,EAAWE,YAAY3nB,EAAKzL,KAAKuB,KAAMvB,KAAKqC,GAAIwxB,GAD/BX,EAAWC,KAAK,gCAI1CM,EAAkB/zB,UAAU+yB,OAAS,WACnC,OAAO,IAAIlC,EAAQ,CAACvwB,KAAKuB,KAAMvB,KAAK0zB,QAAU1zB,KAAKuB,KAAMvB,KAAK0K,OAC1C1K,KAAK2zB,MAAO3zB,KAAKqC,GAAKrC,KAAK2zB,MAAO3zB,KAAKU,MAAMc,KAAOxB,KAAK0K,UAG/E+oB,EAAkB/zB,UAAU2xB,OAAS,SAAiB5lB,GACpD,IAAImoB,EAAM5zB,KAAK2zB,MAAQ3zB,KAAK0zB,QAC5B,OAAO,IAAID,EAAkBzzB,KAAKuB,KAAMvB,KAAKuB,KAAOvB,KAAKU,MAAMc,KAAOoyB,EACzC5zB,KAAKuB,KAAOvB,KAAK0K,OAAQ1K,KAAKuB,KAAOvB,KAAK0K,OAASkpB,EACnDnoB,EAAI/K,MAAMV,KAAKuB,KAAMvB,KAAKqC,IAAIuI,cAAc5K,KAAK0zB,QAAU1zB,KAAKuB,KAAMvB,KAAK2zB,MAAQ3zB,KAAKuB,MACxFvB,KAAK0zB,QAAU1zB,KAAKuB,KAAMvB,KAAKyiB,YAG9DgR,EAAkB/zB,UAAU4B,IAAM,SAAc4iB,GAC9C,IAAI3iB,EAAO2iB,EAAQ6B,UAAU/lB,KAAKuB,KAAM,GAAIc,EAAK6hB,EAAQ6B,UAAU/lB,KAAKqC,IAAK,GACzEqxB,EAAUxP,EAAQ5iB,IAAItB,KAAK0zB,SAAU,GAAIC,EAAQzP,EAAQ5iB,IAAItB,KAAK2zB,MAAO,GAC7E,OAAKpyB,EAAKykB,SAAW3jB,EAAG2jB,SAAY0N,EAAUnyB,EAAKiB,KAAOmxB,EAAQtxB,EAAGG,IAAc,KAC5E,IAAIixB,EAAkBlyB,EAAKiB,IAAKH,EAAGG,IAAKkxB,EAASC,EAAO3zB,KAAKU,MAAOV,KAAK0K,OAAQ1K,KAAKyiB,YAG/FgR,EAAkB/zB,UAAUoG,OAAS,WACnC,IAAI+B,EAAO,CAACmrB,SAAU,gBAAiBzxB,KAAMvB,KAAKuB,KAAMc,GAAIrC,KAAKqC,GACrDqxB,QAAS1zB,KAAK0zB,QAASC,MAAO3zB,KAAK2zB,MAAOjpB,OAAQ1K,KAAK0K,QAGnE,OAFI1K,KAAKU,MAAMc,OAAQqG,EAAKnH,MAAQV,KAAKU,MAAMoF,UAC3C9F,KAAKyiB,YAAa5a,EAAK4a,WAAY,GAChC5a,GAGT4rB,EAAkB1tB,SAAW,SAAmBC,EAAQ6B,GACtD,GAAwB,iBAAbA,EAAKtG,MAAsC,iBAAXsG,EAAKxF,IACrB,iBAAhBwF,EAAK6rB,SAA4C,iBAAd7rB,EAAK8rB,OAA2C,iBAAf9rB,EAAK6C,OAChF,MAAM,IAAIpG,WAAW,gDACzB,OAAO,IAAImvB,EAAkB5rB,EAAKtG,KAAMsG,EAAKxF,GAAIwF,EAAK6rB,QAAS7rB,EAAK8rB,MACvC,IAAM5tB,SAASC,EAAQ6B,EAAKnH,OAAQmH,EAAK6C,SAAU7C,EAAK4a,YAGhFgR,EAjE4B,CAkEnCd,GAIF,SAASY,EAAe9nB,EAAKlK,EAAMc,GAEjC,IADA,IAAImG,EAAQiD,EAAIoB,QAAQtL,GAAOkJ,EAAOpI,EAAKd,EAAMmH,EAAQF,EAAME,MACxD+B,EAAO,GAAK/B,EAAQ,GAAKF,EAAMoD,WAAWlD,IAAUF,EAAMnF,KAAKqF,GAAOvG,YAC3EuG,IACA+B,IAEF,GAAIA,EAAO,EAET,IADA,IAAI4B,EAAO7D,EAAMnF,KAAKqF,GAAOnE,WAAWiE,EAAMoD,WAAWlD,IAClD+B,EAAO,GAAG,CACf,IAAK4B,GAAQA,EAAK9I,OAAU,OAAO,EACnC8I,EAAOA,EAAKrK,WACZyI,IAGJ,OAAO,EAGT,SAASqpB,EAAOzwB,EAAMV,EAAOD,GAC3B,OAAiB,GAATC,GAAcU,EAAKsH,WAAWhI,EAAOU,EAAKlB,eAC/CO,GAAOW,EAAKlB,YAAckB,EAAKsH,WAAW,EAAGjI,IAOlD,SAASqxB,EAAWtH,GAGlB,IAFA,IACI1sB,EADS0sB,EAAMlqB,OACExC,QAAQgE,WAAW0oB,EAAMziB,WAAYyiB,EAAMxiB,UACvDvB,EAAQ+jB,EAAM/jB,SAAUA,EAAO,CACtC,IAAIrF,EAAOopB,EAAMjkB,MAAMnF,KAAKqF,GACxBxE,EAAQuoB,EAAMjkB,MAAMtE,MAAMwE,GAAQuB,EAAWwiB,EAAMhkB,IAAImD,WAAWlD,GACtE,GAAIA,EAAQ+jB,EAAM/jB,OAASrF,EAAKsH,WAAWzG,EAAO+F,EAAUlK,GACxD,OAAO2I,EACX,GAAa,GAATA,GAAcrF,EAAKyD,KAAKqE,KAAKC,YAAc0oB,EAAOzwB,EAAMa,EAAO+F,GAAa,OAiDpF,SAAS4I,EAAa4Z,EAAOrd,EAAU5I,EAAOwtB,QACxB,IAAfA,IAAwBA,EAAavH,GAE1C,IAAIwH,EAQN,SAA6BxH,EAAO3lB,GAClC,IAAIvE,EAASkqB,EAAMlqB,OACfyH,EAAayiB,EAAMziB,WACnBC,EAAWwiB,EAAMxiB,SACjBgqB,EAAS1xB,EAAO+L,eAAetE,GAAY6I,aAAa/L,GAC5D,IAAKmtB,EAAU,OAAO,KACtB,IAAIC,EAAQD,EAAO9zB,OAAS8zB,EAAO,GAAKntB,EACxC,OAAOvE,EAAOwM,eAAe/E,EAAYC,EAAUiqB,GAASD,EAAS,KAfxDE,CAAoB1H,EAAOrd,GACpCtK,EAAQmvB,GAiBd,SAA4BxH,EAAO3lB,GACjC,IAAIvE,EAASkqB,EAAMlqB,OACfyH,EAAayiB,EAAMziB,WACnBC,EAAWwiB,EAAMxiB,SACjBnF,EAAQvC,EAAOE,MAAMuH,GACrBoqB,EAASttB,EAAK0H,aAAaqE,aAAa/N,EAAMgC,MAClD,IAAKstB,EAAU,OAAO,KAGtB,IAFA,IACIC,GADWD,EAAOj0B,OAASi0B,EAAOA,EAAOj0B,OAAS,GAAK2G,GACjC0H,aACjB1Q,EAAIkM,EAAYqqB,GAAcv2B,EAAImM,EAAUnM,IACjDu2B,EAAaA,EAAWrlB,UAAUzM,EAAOE,MAAM3E,GAAGgJ,MACtD,IAAKutB,IAAeA,EAAWxlB,SAAY,OAAO,KAClD,OAAOulB,EA7BeE,CAAmBN,EAAY5kB,GACrD,OAAKtK,EACEmvB,EAAO3yB,IAAIizB,GAAWzzB,OAAO,CAACgG,KAAMsI,EAAU5I,MAAOA,IAAQ1F,OAAOgE,EAAMxD,IAAIizB,IADhE,KAIvB,SAASA,EAAUztB,GAAQ,MAAO,CAACA,KAAMA,EAAMN,MAAO,MAwFtD,SAASguB,EAAS/oB,EAAKjJ,EAAKkG,EAAO+rB,QAClB,IAAV/rB,IAAmBA,EAAQ,GAEhC,IAAI+b,EAAOhZ,EAAIoB,QAAQrK,GAAMgN,EAAOiV,EAAK/b,MAAQA,EAC7CgsB,EAAaD,GAAcA,EAAWA,EAAWt0B,OAAS,IAAOskB,EAAKliB,OAC1E,GAAIiN,EAAO,GAAKiV,EAAKliB,OAAOuE,KAAKqE,KAAKC,YACjCqZ,EAAKliB,OAAOoI,WAAW8Z,EAAKvgB,QAASugB,EAAKliB,OAAOJ,cACjDuyB,EAAU5tB,KAAKuD,aAAaoa,EAAKliB,OAAOxC,QAAQgE,WAAW0gB,EAAKvgB,QAASugB,EAAKliB,OAAOJ,aACtF,OAAO,EACX,IAAK,IAAI/D,EAAIqmB,EAAK/b,MAAQ,EAAG5K,EAAI4K,EAAQ,EAAGtK,EAAIoR,EAAMpR,IAAKN,IAAK,CAC9D,IAAIuF,EAAOohB,EAAKphB,KAAKjF,GAAIu2B,EAAUlQ,EAAKvgB,MAAM9F,GAC9C,GAAIiF,EAAKyD,KAAKqE,KAAKC,UAAa,OAAO,EACvC,IAAIwpB,EAAOvxB,EAAKtD,QAAQgE,WAAW4wB,EAAStxB,EAAKlB,YAC7C2J,EAAS2oB,GAAcA,EAAW32B,IAAOuF,EAE7C,GADIyI,GAASzI,IAAQuxB,EAAOA,EAAK3wB,aAAa,EAAG6H,EAAMhF,KAAK1H,OAAO0M,EAAMtF,UACpEnD,EAAKsH,WAAWgqB,EAAU,EAAGtxB,EAAKlB,cAAgB2J,EAAMhF,KAAKuD,aAAauqB,GAC3E,OAAO,EAEb,IAAI1wB,EAAQugB,EAAK7Y,WAAW4D,GACxBqlB,EAAWJ,GAAcA,EAAW,GACxC,OAAOhQ,EAAKphB,KAAKmM,GAAMT,eAAe7K,EAAOA,EAAO2wB,EAAWA,EAAS/tB,KAAO2d,EAAKphB,KAAKmM,EAAO,GAAG1I,MAwBrG,SAASguB,EAAQrpB,EAAKjJ,GACpB,IAAIiiB,EAAOhZ,EAAIoB,QAAQrK,GAAM0B,EAAQugB,EAAKvgB,QAC1C,OAAOkF,EAASqb,EAAKra,WAAYqa,EAAKta,YACpCsa,EAAKliB,OAAOoI,WAAWzG,EAAOA,EAAQ,GAG1C,SAASkF,EAAS3E,EAAGC,GACnB,OAAOD,GAAKC,IAAMD,EAAElB,QAAUkB,EAAEwK,UAAUvK,GAO5C,SAASqwB,EAAUtpB,EAAKjJ,EAAKkiB,QACd,IAARA,IAAiBA,GAAO,GAG7B,IADA,IAAID,EAAOhZ,EAAIoB,QAAQrK,GACdpE,EAAIqmB,EAAK/b,OAAQtK,IAAK,CAC7B,IAAIyN,OAAS,EAAUC,OAAQ,EAAU5H,EAAQugB,EAAKvgB,MAAM9F,GAY5D,GAXIA,GAAKqmB,EAAK/b,OACZmD,EAAS4Y,EAAKra,WACd0B,EAAQ2Y,EAAKta,WACJua,EAAM,GACf7Y,EAAS4Y,EAAKphB,KAAKjF,EAAI,GACvB8F,IACA4H,EAAQ2Y,EAAKphB,KAAKjF,GAAGmG,WAAWL,KAEhC2H,EAAS4Y,EAAKphB,KAAKjF,GAAGmG,WAAWL,EAAQ,GACzC4H,EAAQ2Y,EAAKphB,KAAKjF,EAAI,IAEpByN,IAAWA,EAAO4B,aAAerE,EAASyC,EAAQC,IAClD2Y,EAAKphB,KAAKjF,GAAGuM,WAAWzG,EAAOA,EAAQ,GAAM,OAAO1B,EACxD,GAAS,GAALpE,EAAU,MACdoE,EAAMkiB,EAAM,EAAID,EAAK5Y,OAAOzN,GAAKqmB,EAAK3Y,MAAM1N,IA0ChD,SAAS42B,EAAUvpB,EAAKjJ,EAAK9B,GAC3B,IAAI+jB,EAAOhZ,EAAIoB,QAAQrK,GACvB,IAAK9B,EAAMX,QAAQyB,KAAQ,OAAOgB,EAElC,IADA,IAAIzC,EAAUW,EAAMX,QACXjC,EAAI,EAAGA,EAAI4C,EAAM0H,UAAWtK,IAAOiC,EAAUA,EAAQiC,WAAWjC,QACzE,IAAK,IAAIk1B,EAAO,EAAGA,IAA4B,GAAnBv0B,EAAM0H,WAAkB1H,EAAMc,KAAO,EAAI,GAAIyzB,IACvE,IAAK,IAAI72B,EAAIqmB,EAAK/b,MAAOtK,GAAK,EAAGA,IAAK,CACpC,IAAI2mB,EAAO3mB,GAAKqmB,EAAK/b,MAAQ,EAAI+b,EAAKjiB,MAAQiiB,EAAK9hB,MAAMvE,EAAI,GAAKqmB,EAAK/hB,IAAItE,EAAI,IAAM,GAAK,EAAI,EAC1F82B,EAAYzQ,EAAKvgB,MAAM9F,IAAM2mB,EAAO,EAAI,EAAI,GAChD,GAAY,GAARkQ,EACExQ,EAAKphB,KAAKjF,GAAGuM,WAAWuqB,EAAWA,EAAWn1B,GAC9C0kB,EAAKphB,KAAKjF,GAAGkQ,eAAe4mB,GAAWriB,aAAa9S,EAAQiC,WAAW8E,MACzE,OAAe,GAARie,EAAYN,EAAKjiB,IAAMuiB,EAAO,EAAIN,EAAK5Y,OAAOzN,EAAI,GAAKqmB,EAAK3Y,MAAM1N,EAAI,GAGrF,OAAO,KAGT,SAAS+2B,EAAY5qB,EAAUnJ,EAAGmB,GAEhC,IADA,IAAI6yB,EAAS,GACJt3B,EAAI,EAAGA,EAAIyM,EAASpI,WAAYrE,IAAK,CAC5C,IAAI2E,EAAQ8H,EAAS9H,MAAM3E,GACvB2E,EAAM1C,QAAQyB,OAAQiB,EAAQA,EAAM2B,KAAK+wB,EAAY1yB,EAAM1C,QAASqB,EAAGqB,KACvEA,EAAM2J,WAAY3J,EAAQrB,EAAEqB,EAAOF,EAAQzE,IAC/Cs3B,EAAOz0B,KAAK8B,GAEd,OAAO,IAAS2D,UAAUgvB,GAxU5BzC,EAAKvN,OAAO,gBAAiBqO,GA8C7BxM,EAAUvnB,UAAUgtB,KAAO,SAASD,EAAO1iB,GASzC,IARA,IAAIvB,EAAQikB,EAAMjkB,MACdC,EAAMgkB,EAAMhkB,IACZC,EAAQ+jB,EAAM/jB,MAEd2sB,EAAW7sB,EAAMqD,OAAOnD,EAAQ,GAAI4sB,EAAS7sB,EAAIqD,MAAMpD,EAAQ,GAC/D/F,EAAQ0yB,EAAU3yB,EAAM4yB,EAExBzpB,EAAS,IAAS7H,MAAOoE,EAAY,EAChChK,EAAIsK,EAAO6sB,GAAY,EAAOn3B,EAAI2L,EAAQ3L,IAC3Cm3B,GAAa/sB,EAAMtE,MAAM9F,GAAK,GAClCm3B,GAAY,EACZ1pB,EAAS,IAAStK,KAAKiH,EAAMnF,KAAKjF,GAAGgG,KAAKyH,IAC1CzD,KAEAzF,IAGJ,IADA,IAAImJ,EAAQ,IAAS9H,MAAOqE,EAAU,EAC7BmtB,EAAM9sB,EAAO+sB,GAAc,EAAOD,EAAMzrB,EAAQyrB,IACjDC,GAAehtB,EAAIqD,MAAM0pB,EAAM,GAAK/sB,EAAI/F,IAAI8yB,IAChDC,GAAc,EACd3pB,EAAQ,IAASvK,KAAKkH,EAAIpF,KAAKmyB,GAAKpxB,KAAK0H,IACzCzD,KAEA3F,IAGJ,OAAO1C,KAAK0mB,KAAK,IAAI+M,EAAkB9wB,EAAOD,EAAK2yB,EAAUC,EACtB,IAAI,IAAMzpB,EAAOnK,OAAOoK,GAAQ1D,EAAWC,GAC3CwD,EAAOrK,KAAO4G,GAAW,KAkDlE6e,EAAUvnB,UAAUic,KAAO,SAAS8Q,EAAOiJ,GAEzC,IADA,IAAI31B,EAAU,IAASiE,MACdlG,EAAI43B,EAASv1B,OAAS,EAAGrC,GAAK,EAAGA,IACtCiC,EAAU,IAASwB,KAAKm0B,EAAS53B,GAAGgJ,KAAK1H,OAAOs2B,EAAS53B,GAAG0I,MAAOzG,IAEvE,IAAI4C,EAAQ8pB,EAAM9pB,MAAOD,EAAM+pB,EAAM/pB,IACrC,OAAO1C,KAAK0mB,KAAK,IAAI+M,EAAkB9wB,EAAOD,EAAKC,EAAOD,EAAK,IAAI,IAAM3C,EAAS,EAAG,GAAI21B,EAASv1B,QAAQ,KAM5G8mB,EAAUvnB,UAAUstB,aAAe,SAASzrB,EAAMc,EAAIyE,EAAMN,GAC1D,IAAIyQ,EAASjX,KAGb,QAFY,IAAPqC,IAAgBA,EAAKd,IAErBuF,EAAK2G,YAAe,MAAM,IAAInJ,WAAW,oDAC9C,IAAI0f,EAAUhkB,KAAKikB,MAAM9jB,OAYzB,OAXAH,KAAKyL,IAAIrJ,aAAab,EAAMc,GAAI,SAAUgB,EAAMb,GAC9C,GAAIa,EAAKoK,cAAgBpK,EAAKuK,UAAU9G,EAAMN,IAalD,SAAuBiF,EAAKjJ,EAAKsE,GAC/B,IAAI2d,EAAOhZ,EAAIoB,QAAQrK,GAAM0B,EAAQugB,EAAKvgB,QAC1C,OAAOugB,EAAKliB,OAAOwM,eAAe7K,EAAOA,EAAQ,EAAG4C,GAfM6uB,CAAc1e,EAAOxL,IAAKwL,EAAOiN,QAAQxjB,MAAMsjB,GAAS1iB,IAAIkB,GAAMsE,GAAO,CAE/HmQ,EAAOmV,kBAAkBnV,EAAOiN,QAAQxjB,MAAMsjB,GAAS1iB,IAAIkB,EAAK,GAAIsE,GACpE,IAAIod,EAAUjN,EAAOiN,QAAQxjB,MAAMsjB,GAC/B4R,EAAS1R,EAAQ5iB,IAAIkB,EAAK,GAAIqzB,EAAO3R,EAAQ5iB,IAAIkB,EAAMa,EAAKvB,SAAU,GAG1E,OAFAmV,EAAOyP,KAAK,IAAI+M,EAAkBmC,EAAQC,EAAMD,EAAS,EAAGC,EAAO,EACnC,IAAI,IAAM,IAASt0B,KAAKuF,EAAK1H,OAAOoH,EAAO,KAAMnD,EAAKyE,QAAS,EAAG,GAAI,GAAG,KAClG,MAGJ9H,MAWTinB,EAAUvnB,UAAUssB,cAAgB,SAASxpB,EAAKsE,EAAMN,EAAOsB,GAC7D,IAAIzE,EAAOrD,KAAKyL,IAAIuC,OAAOxL,GAC3B,IAAKa,EAAQ,MAAM,IAAIiB,WAAW,6BAC7BwC,IAAQA,EAAOzD,EAAKyD,MACzB,IAAIgvB,EAAUhvB,EAAK1H,OAAOoH,EAAO,KAAMsB,GAASzE,EAAKyE,OACrD,GAAIzE,EAAKE,OACL,OAAOvD,KAAKqkB,YAAY7hB,EAAKA,EAAMa,EAAKvB,SAAUg0B,GAEtD,IAAKhvB,EAAKuD,aAAahH,EAAKtD,SACxB,MAAM,IAAIuE,WAAW,iCAAmCwC,EAAKzI,MAEjE,OAAO2B,KAAK0mB,KAAK,IAAI+M,EAAkBjxB,EAAKA,EAAMa,EAAKvB,SAAUU,EAAM,EAAGA,EAAMa,EAAKvB,SAAW,EACzD,IAAI,IAAM,IAASP,KAAKu0B,GAAU,EAAG,GAAI,GAAG,KAkCrF7O,EAAUvnB,UAAU6T,MAAQ,SAAS/Q,EAAKkG,EAAO+rB,QAChC,IAAV/rB,IAAmBA,EAAQ,GAGhC,IADA,IAAI+b,EAAOzkB,KAAKyL,IAAIoB,QAAQrK,GAAMqJ,EAAS,IAAS7H,MAAO8H,EAAQ,IAAS9H,MACnE5F,EAAIqmB,EAAK/b,MAAO2qB,EAAI5O,EAAK/b,MAAQA,EAAO5K,EAAI4K,EAAQ,EAAGtK,EAAIi1B,EAAGj1B,IAAKN,IAAK,CAC/E+N,EAAS,IAAStK,KAAKkjB,EAAKphB,KAAKjF,GAAGgG,KAAKyH,IACzC,IAAIkqB,EAAYtB,GAAcA,EAAW32B,GACzCgO,EAAQ,IAASvK,KAAKw0B,EAAYA,EAAUjvB,KAAK1H,OAAO22B,EAAUvvB,MAAOsF,GAAS2Y,EAAKphB,KAAKjF,GAAGgG,KAAK0H,IAEtG,OAAO9L,KAAK0mB,KAAK,IAAI4M,EAAY9wB,EAAKA,EAAK,IAAI,IAAMqJ,EAAOnK,OAAOoK,GAAQpD,EAAOA,IAAQ,KA+C5Fue,EAAUvnB,UAAUmG,KAAO,SAASrD,EAAKkG,QACxB,IAAVA,IAAmBA,EAAQ,GAEhC,IAAIge,EAAO,IAAI4M,EAAY9wB,EAAMkG,EAAOlG,EAAMkG,EAAO,IAAM1E,OAAO,GAClE,OAAOhE,KAAK0mB,KAAKA,IA6DnB,IAAIsP,EAA4B,SAAUrD,GACxC,SAASqD,EAAYz0B,EAAMc,EAAIyL,GAC7B6kB,EAAK10B,KAAK+B,MACVA,KAAKuB,KAAOA,EACZvB,KAAKqC,GAAKA,EACVrC,KAAK8N,KAAOA,EAgDd,OA7CK6kB,IAAOqD,EAAY7uB,UAAYwrB,GACpCqD,EAAYt2B,UAAYlB,OAAOY,OAAQuzB,GAAQA,EAAKjzB,WACpDs2B,EAAYt2B,UAAUO,YAAc+1B,EAEpCA,EAAYt2B,UAAUopB,MAAQ,SAAgBrd,GAC5C,IAAIwL,EAASjX,KAETi2B,EAAWxqB,EAAI/K,MAAMV,KAAKuB,KAAMvB,KAAKqC,IAAKmG,EAAQiD,EAAIoB,QAAQ7M,KAAKuB,MACnEgB,EAASiG,EAAMnF,KAAKmF,EAAM8D,YAAYtM,KAAKqC,KAC3C3B,EAAQ,IAAI,IAAMy0B,EAAYc,EAASl2B,SAAS,SAAUsD,EAAMd,GAClE,OAAKc,EAAKqK,QAAWnL,EAAOuE,KAAK2O,eAAewB,EAAOnJ,KAAKhH,MACrDzD,EAAKyK,KAAKmJ,EAAOnJ,KAAK1G,SAAS/D,EAAKyE,QADiCzE,IAE3Ed,GAAS0zB,EAAS7tB,UAAW6tB,EAAS5tB,SACzC,OAAO6qB,EAAWE,YAAY3nB,EAAKzL,KAAKuB,KAAMvB,KAAKqC,GAAI3B,IAGzDs1B,EAAYt2B,UAAU2xB,OAAS,WAC7B,OAAO,IAAI6E,EAAel2B,KAAKuB,KAAMvB,KAAKqC,GAAIrC,KAAK8N,OAGrDkoB,EAAYt2B,UAAU4B,IAAM,SAAc4iB,GACxC,IAAI3iB,EAAO2iB,EAAQ6B,UAAU/lB,KAAKuB,KAAM,GAAIc,EAAK6hB,EAAQ6B,UAAU/lB,KAAKqC,IAAK,GAC7E,OAAId,EAAKykB,SAAW3jB,EAAG2jB,SAAWzkB,EAAKiB,KAAOH,EAAGG,IAAc,KACxD,IAAIwzB,EAAYz0B,EAAKiB,IAAKH,EAAGG,IAAKxC,KAAK8N,OAGhDkoB,EAAYt2B,UAAUozB,MAAQ,SAAgBrvB,GAC5C,GAAIA,aAAiBuyB,GACjBvyB,EAAMqK,KAAKzJ,GAAGrE,KAAK8N,OACnB9N,KAAKuB,MAAQkC,EAAMpB,IAAMrC,KAAKqC,IAAMoB,EAAMlC,KAC1C,OAAO,IAAIy0B,EAAYpzB,KAAKE,IAAI9C,KAAKuB,KAAMkC,EAAMlC,MAC5BqB,KAAKC,IAAI7C,KAAKqC,GAAIoB,EAAMpB,IAAKrC,KAAK8N,OAG7DkoB,EAAYt2B,UAAUoG,OAAS,WAC7B,MAAO,CAACktB,SAAU,UAAWllB,KAAM9N,KAAK8N,KAAKhI,SACrCvE,KAAMvB,KAAKuB,KAAMc,GAAIrC,KAAKqC,KAGpC2zB,EAAYjwB,SAAW,SAAmBC,EAAQ6B,GAChD,GAAwB,iBAAbA,EAAKtG,MAAsC,iBAAXsG,EAAKxF,GAC5C,MAAM,IAAIiC,WAAW,0CACzB,OAAO,IAAI0xB,EAAYnuB,EAAKtG,KAAMsG,EAAKxF,GAAI2D,EAAOmJ,aAAatH,EAAKiG,QAG/DkoB,EArDsB,CAsD7BrD,GAEFA,EAAKvN,OAAO,UAAW4Q,GAGvB,IAAIE,EAA+B,SAAUvD,GAC3C,SAASuD,EAAe30B,EAAMc,EAAIyL,GAChC6kB,EAAK10B,KAAK+B,MACVA,KAAKuB,KAAOA,EACZvB,KAAKqC,GAAKA,EACVrC,KAAK8N,KAAOA,EA8Cd,OA3CK6kB,IAAOuD,EAAe/uB,UAAYwrB,GACvCuD,EAAex2B,UAAYlB,OAAOY,OAAQuzB,GAAQA,EAAKjzB,WACvDw2B,EAAex2B,UAAUO,YAAci2B,EAEvCA,EAAex2B,UAAUopB,MAAQ,SAAgBrd,GAC/C,IAAIwL,EAASjX,KAETi2B,EAAWxqB,EAAI/K,MAAMV,KAAKuB,KAAMvB,KAAKqC,IACrC3B,EAAQ,IAAI,IAAMy0B,EAAYc,EAASl2B,SAAS,SAAUsD,GAC5D,OAAOA,EAAKyK,KAAKmJ,EAAOnJ,KAAKrG,cAAcpE,EAAKyE,WAC9CmuB,EAAS7tB,UAAW6tB,EAAS5tB,SACjC,OAAO6qB,EAAWE,YAAY3nB,EAAKzL,KAAKuB,KAAMvB,KAAKqC,GAAI3B,IAGzDw1B,EAAex2B,UAAU2xB,OAAS,WAChC,OAAO,IAAI2E,EAAYh2B,KAAKuB,KAAMvB,KAAKqC,GAAIrC,KAAK8N,OAGlDooB,EAAex2B,UAAU4B,IAAM,SAAc4iB,GAC3C,IAAI3iB,EAAO2iB,EAAQ6B,UAAU/lB,KAAKuB,KAAM,GAAIc,EAAK6hB,EAAQ6B,UAAU/lB,KAAKqC,IAAK,GAC7E,OAAId,EAAKykB,SAAW3jB,EAAG2jB,SAAWzkB,EAAKiB,KAAOH,EAAGG,IAAc,KACxD,IAAI0zB,EAAe30B,EAAKiB,IAAKH,EAAGG,IAAKxC,KAAK8N,OAGnDooB,EAAex2B,UAAUozB,MAAQ,SAAgBrvB,GAC/C,GAAIA,aAAiByyB,GACjBzyB,EAAMqK,KAAKzJ,GAAGrE,KAAK8N,OACnB9N,KAAKuB,MAAQkC,EAAMpB,IAAMrC,KAAKqC,IAAMoB,EAAMlC,KAC1C,OAAO,IAAI20B,EAAetzB,KAAKE,IAAI9C,KAAKuB,KAAMkC,EAAMlC,MAC5BqB,KAAKC,IAAI7C,KAAKqC,GAAIoB,EAAMpB,IAAKrC,KAAK8N,OAGhEooB,EAAex2B,UAAUoG,OAAS,WAChC,MAAO,CAACktB,SAAU,aAAcllB,KAAM9N,KAAK8N,KAAKhI,SACxCvE,KAAMvB,KAAKuB,KAAMc,GAAIrC,KAAKqC,KAGpC6zB,EAAenwB,SAAW,SAAmBC,EAAQ6B,GACnD,GAAwB,iBAAbA,EAAKtG,MAAsC,iBAAXsG,EAAKxF,GAC5C,MAAM,IAAIiC,WAAW,6CACzB,OAAO,IAAI4xB,EAAeruB,EAAKtG,KAAMsG,EAAKxF,GAAI2D,EAAOmJ,aAAatH,EAAKiG,QAGlEooB,EAnDyB,CAoDhCvD,GAkKF,SAASwD,EAAc3tB,EAAOC,EAAK/H,GACjC,OAAQA,EAAM0H,YAAc1H,EAAM2H,SAAWG,EAAM7F,SAAW8F,EAAI9F,SAChE6F,EAAMjG,OAAOoI,WAAWnC,EAAMtE,QAASuE,EAAIvE,QAASxD,EAAMX,SAlK9D4yB,EAAKvN,OAAO,aAAc8Q,GAI1BjP,EAAUvnB,UAAUiuB,QAAU,SAASpsB,EAAMc,EAAIyL,GAC/C,IAAImJ,EAASjX,KAETo2B,EAAU,GAAIC,EAAQ,GAAIC,EAAW,KAAMC,EAAS,KA0BxD,OAzBAv2B,KAAKyL,IAAIrJ,aAAab,EAAMc,GAAI,SAAUgB,EAAMb,EAAKD,GACnD,GAAKc,EAAK+I,SAAV,CACA,IAAItE,EAAQzE,EAAKyE,MACjB,IAAKgG,EAAKpG,QAAQI,IAAUvF,EAAOuE,KAAK2O,eAAe3H,EAAKhH,MAAO,CAIjE,IAHA,IAAInE,EAAQC,KAAKC,IAAIL,EAAKjB,GAAOmB,EAAME,KAAKE,IAAIN,EAAMa,EAAKvB,SAAUO,GACjEm0B,EAAS1oB,EAAK1G,SAASU,GAElBhK,EAAI,EAAGA,EAAIgK,EAAM3H,OAAQrC,IAC3BgK,EAAMhK,GAAG4J,QAAQ8uB,KAChBF,GAAYA,EAASj0B,IAAMM,GAAS2zB,EAASxoB,KAAKzJ,GAAGyD,EAAMhK,IAC3Dw4B,EAASj0B,GAAKK,EAEd0zB,EAAQz1B,KAAK21B,EAAW,IAAIJ,EAAevzB,EAAOD,EAAKoF,EAAMhK,MAIjEy4B,GAAUA,EAAOl0B,IAAMM,EACvB4zB,EAAOl0B,GAAKK,EAEZ2zB,EAAM11B,KAAK41B,EAAS,IAAIP,EAAYrzB,EAAOD,EAAKoL,SAIxDsoB,EAAQj1B,SAAQ,SAAUtB,GAAK,OAAOoX,EAAOyP,KAAK7mB,MAClDw2B,EAAMl1B,SAAQ,SAAUtB,GAAK,OAAOoX,EAAOyP,KAAK7mB,MACzCG,MAQTinB,EAAUvnB,UAAU8tB,WAAa,SAASjsB,EAAMc,EAAIyL,GAClD,IAAImJ,EAASjX,UACC,IAAT8N,IAAkBA,EAAO,MAE9B,IAAI2oB,EAAU,GAAI/P,EAAO,EAkCzB,OAjCA1mB,KAAKyL,IAAIrJ,aAAab,EAAMc,GAAI,SAAUgB,EAAMb,GAC9C,GAAKa,EAAK+I,SAAV,CACAsa,IACA,IAAIgQ,EAAW,KACf,GAAI5oB,aAAgB,IAElB,IADA,IAAsB1N,EAAlBiH,EAAMhE,EAAKyE,MACR1H,EAAQ0N,EAAKpG,QAAQL,KACjCqvB,IAAaA,EAAW,KAAK/1B,KAAKP,GAC3BiH,EAAMjH,EAAMqH,cAAcJ,QAEnByG,EACLA,EAAKpG,QAAQrE,EAAKyE,SAAU4uB,EAAW,CAAC5oB,IAE5C4oB,EAAWrzB,EAAKyE,MAElB,GAAI4uB,GAAYA,EAASv2B,OAEvB,IADA,IAAIuC,EAAME,KAAKE,IAAIN,EAAMa,EAAKvB,SAAUO,GAC/BvE,EAAI,EAAGA,EAAI44B,EAASv2B,OAAQrC,IAAK,CAExC,IADA,IAAIwZ,EAAQof,EAAS54B,GAAI64B,OAAU,EAC1B9xB,EAAI,EAAGA,EAAI4xB,EAAQt2B,OAAQ0E,IAAK,CACvC,IAAI3G,EAAIu4B,EAAQ5xB,GACZ3G,EAAEwoB,MAAQA,EAAO,GAAKpP,EAAMjT,GAAGoyB,EAAQ5xB,GAAGyS,SAAUqf,EAAUz4B,GAEhEy4B,GACFA,EAAQt0B,GAAKK,EACbi0B,EAAQjQ,KAAOA,GAEf+P,EAAQ91B,KAAK,CAAC2W,MAAOA,EAAO/V,KAAMqB,KAAKC,IAAIL,EAAKjB,GAAOc,GAAIK,EAAKgkB,KAAMA,SAK9E+P,EAAQt1B,SAAQ,SAAUjD,GAAK,OAAO+Y,EAAOyP,KAAK,IAAIwP,EAAeh4B,EAAEqD,KAAMrD,EAAEmE,GAAInE,EAAEoZ,WAC9EtX,MAQTinB,EAAUvnB,UAAU0sB,kBAAoB,SAAS5pB,EAAKo0B,EAAYroB,QACjD,IAAVA,IAAmBA,EAAQqoB,EAAWpoB,cAI3C,IAFA,IAAInL,EAAOrD,KAAKyL,IAAIuC,OAAOxL,GACvBq0B,EAAW,GAAIplB,EAAMjP,EAAM,EACtB1E,EAAI,EAAGA,EAAIuF,EAAKlB,WAAYrE,IAAK,CACxC,IAAI2E,EAAQY,EAAKZ,MAAM3E,GAAI4E,EAAM+O,EAAMhP,EAAMX,SACzCg1B,EAAUvoB,EAAMS,UAAUvM,EAAMqE,KAAMrE,EAAM+D,OAChD,GAAKswB,EAEE,CACLvoB,EAAQuoB,EACR,IAAK,IAAIjyB,EAAI,EAAGA,EAAIpC,EAAMqF,MAAM3H,OAAQ0E,IAAY+xB,EAAWnhB,eAAehT,EAAMqF,MAAMjD,GAAGiC,OACzF9G,KAAK0mB,KAAK,IAAIwP,EAAezkB,EAAK/O,EAAKD,EAAMqF,MAAMjD,UAJvDgyB,EAASl2B,KAAK,IAAI2yB,EAAY7hB,EAAK/O,EAAK,IAAMsB,QAMhDyN,EAAM/O,EAER,IAAK6L,EAAMM,SAAU,CACnB,IAAI6M,EAAOnN,EAAM8D,WAAW,IAASrO,OAAO,GAC5ChE,KAAKuI,QAAQkJ,EAAKA,EAAK,IAAI,IAAMiK,EAAM,EAAG,IAE5C,IAAK,IAAIhK,EAAMmlB,EAAS12B,OAAS,EAAGuR,GAAO,EAAGA,IAAS1R,KAAK0mB,KAAKmQ,EAASnlB,IAC1E,OAAO1R,MAuBTinB,EAAUvnB,UAAU6I,QAAU,SAAShH,EAAMc,EAAI3B,QACnC,IAAP2B,IAAgBA,EAAKd,QACX,IAAVb,IAAmBA,EAAQ,IAAMsD,OAEtC,IAAI0iB,EAnBN,SAAqBjb,EAAKlK,EAAMc,EAAI3B,GAIlC,QAHY,IAAP2B,IAAgBA,EAAKd,QACX,IAAVb,IAAmBA,EAAQ,IAAMsD,OAElCzC,GAAQc,IAAO3B,EAAMc,KAAQ,OAAO,KAExC,IAAIgH,EAAQiD,EAAIoB,QAAQtL,GAAOkH,EAAMgD,EAAIoB,QAAQxK,GAEjD,OAAI8zB,EAAc3tB,EAAOC,EAAK/H,GAAiB,IAAI4yB,EAAY/xB,EAAMc,EAAI3B,GAClE,IAAIq2B,EAAOvuB,EAAOC,EAAK/H,GAAOs2B,MAU1BC,CAAYj3B,KAAKyL,IAAKlK,EAAMc,EAAI3B,GAE3C,OADIgmB,GAAQ1mB,KAAK0mB,KAAKA,GACf1mB,MAMTinB,EAAUvnB,UAAU2kB,YAAc,SAAS9iB,EAAMc,EAAItC,GACnD,OAAOC,KAAKuI,QAAQhH,EAAMc,EAAI,IAAI,IAAM,IAASd,KAAKxB,GAAU,EAAG,KAKrEknB,EAAUvnB,UAAU0mB,OAAS,SAAS7kB,EAAMc,GAC1C,OAAOrC,KAAKuI,QAAQhH,EAAMc,EAAI,IAAM2B,QAKtCijB,EAAUvnB,UAAUgL,OAAS,SAASlI,EAAKzC,GACzC,OAAOC,KAAKqkB,YAAY7hB,EAAKA,EAAKzC,IA4BpC,IAAIg3B,EAAS,SAAgBvuB,EAAOC,EAAK/H,GACvCV,KAAKyI,IAAMA,EACXzI,KAAKwI,MAAQA,EACbxI,KAAKk3B,SAAWx2B,EAEhBV,KAAKm3B,SAAW,GAChB,IAAK,IAAIr5B,EAAI,EAAGA,GAAK0K,EAAME,MAAO5K,IAAK,CACrC,IAAIuF,EAAOmF,EAAMnF,KAAKvF,GACtBkC,KAAKm3B,SAASx2B,KAAK,CACjBmG,KAAMzD,EAAKyD,KACXyH,MAAOlL,EAAKiL,eAAe9F,EAAMoD,WAAW9N,MAIhDkC,KAAKsH,OAAS,IAAStD,MACvB,IAAK,IAAI0N,EAAMlJ,EAAME,MAAOgJ,EAAM,EAAGA,IACjC1R,KAAKsH,OAAS,IAAS/F,KAAKiH,EAAMnF,KAAKqO,GAAKtN,KAAKpE,KAAKsH,UAGxDgB,EAAuB,CAAEI,MAAO,CAAEzG,cAAc,IAqOpD,SAASm1B,EAAiB7sB,EAAU7B,EAAO2uB,GACzC,OAAa,GAAT3uB,EAAqB6B,EAASxG,WAAWszB,GACtC9sB,EAAStG,aAAa,EAAGsG,EAASvI,WAAWoC,KAAKgzB,EAAiB7sB,EAASvI,WAAWjC,QAAS2I,EAAQ,EAAG2uB,KAGpH,SAASC,EAAc/sB,EAAU7B,EAAO3I,GACtC,OAAa,GAAT2I,EAAqB6B,EAAS7I,OAAO3B,GAClCwK,EAAStG,aAAasG,EAASpI,WAAa,EACtBoI,EAASrI,UAAUkC,KAAKkzB,EAAc/sB,EAASrI,UAAUnC,QAAS2I,EAAQ,EAAG3I,KAG5G,SAASw3B,EAAUhtB,EAAU7B,GAC3B,IAAK,IAAI5K,EAAI,EAAGA,EAAI4K,EAAO5K,IAAOyM,EAAWA,EAASvI,WAAWjC,QACjE,OAAOwK,EAGT,SAASitB,EAAen0B,EAAM+E,EAAWC,GACvC,GAAID,GAAa,EAAK,OAAO/E,EAC7B,IAAI8O,EAAO9O,EAAKtD,QAOhB,OANIqI,EAAY,IACZ+J,EAAOA,EAAKlO,aAAa,EAAGuzB,EAAerlB,EAAKnQ,WAAYoG,EAAY,EAAsB,GAAnB+J,EAAKhQ,WAAkBkG,EAAU,EAAI,KAChHD,EAAY,IACd+J,EAAO9O,EAAKyD,KAAK0H,aAAa6D,WAAWF,GAAMzQ,OAAOyQ,GAClD9J,GAAW,IAAK8J,EAAOA,EAAKzQ,OAAO2B,EAAKyD,KAAK0H,aAAaC,cAAc0D,GAAME,WAAW,IAASrO,OAAO,MAExGX,EAAKe,KAAK+N,GAGnB,SAASslB,EAAiBhvB,EAAKC,EAAO5B,EAAMyH,EAAO4N,GACjD,IAAI9Y,EAAOoF,EAAIpF,KAAKqF,GAAQxE,EAAQiY,EAAO1T,EAAImD,WAAWlD,GAASD,EAAIvE,MAAMwE,GAC7E,GAAIxE,GAASb,EAAKlB,aAAe2E,EAAK8C,kBAAkBvG,EAAKyD,MAAS,OAAO,KAC7E,IAAIkwB,EAAMzoB,EAAM8D,WAAWhP,EAAKtD,SAAS,EAAMmE,GAC/C,OAAO8yB,IAGT,SAAsBlwB,EAAMyD,EAAU5H,GACpC,IAAK,IAAI7E,EAAI6E,EAAO7E,EAAIyM,EAASpI,WAAYrE,IACzC,IAAKgJ,EAAKgI,YAAYvE,EAAS9H,MAAM3E,GAAGgK,OAAU,OAAO,EAC7D,OAAO,EANQ4vB,CAAa5wB,EAAMzD,EAAKtD,QAASmE,GAAS8yB,EAAM,KAiGjE,SAASW,EAAcptB,EAAU7B,EAAOkvB,EAASC,EAASt1B,GACxD,GAAImG,EAAQkvB,EAAS,CACnB,IAAIj0B,EAAQ4G,EAASvI,WACrBuI,EAAWA,EAAStG,aAAa,EAAGN,EAAMS,KAAKuzB,EAAch0B,EAAM5D,QAAS2I,EAAQ,EAAGkvB,EAASC,EAASl0B,KAE3G,GAAI+E,EAAQmvB,EAAS,CACnB,IAAItpB,EAAQhM,EAAO+L,eAAe,GAC9B3L,EAAQ4L,EAAM8D,WAAW9H,GAAU7I,OAAO6I,GAC9CA,EAAW5H,EAAMjB,OAAO6M,EAAME,cAAc9L,GAAO0P,WAAW,IAASrO,OAAO,IAEhF,OAAOuG,EA0CT,SAASutB,EAActvB,EAAOC,GAE5B,IADA,IAAI9G,EAAS,GACJvD,EADmBwE,KAAKE,IAAI0F,EAAME,MAAOD,EAAIC,OAC/BtK,GAAK,EAAGA,IAAK,CAClC,IAAIuE,EAAQ6F,EAAM7F,MAAMvE,GACxB,GAAIuE,EAAQ6F,EAAMhG,KAAOgG,EAAME,MAAQtK,IACnCqK,EAAI/F,IAAItE,GAAKqK,EAAIjG,KAAOiG,EAAIC,MAAQtK,IACpCoK,EAAMnF,KAAKjF,GAAG0I,KAAKqE,KAAKC,WACxB3C,EAAIpF,KAAKjF,GAAG0I,KAAKqE,KAAKC,UAAa,MACnCzI,GAAS8F,EAAI9F,MAAMvE,IAAMuD,EAAOhB,KAAKvC,GAE3C,OAAOuD,EAlaT2G,EAAqBI,MAAM/J,IAAM,WAAc,OAAOqB,KAAKm3B,SAASh3B,OAAS,GAE7E42B,EAAOr3B,UAAUs3B,IAAM,WAIrB,KAAOh3B,KAAKk3B,SAAS11B,MAAM,CACzB,IAAIw1B,EAAMh3B,KAAK+3B,eACXf,EAAOh3B,KAAKg4B,WAAWhB,GACpBh3B,KAAKi4B,YAAcj4B,KAAKk4B,WAOjC,IAAIC,EAAan4B,KAAKo4B,iBAAkBC,EAAar4B,KAAKsH,OAAO9F,KAAOxB,KAAK0I,MAAQ1I,KAAKwI,MAAME,MAC5FF,EAAQxI,KAAKwI,MAAOC,EAAMzI,KAAKs4B,MAAMH,EAAa,EAAIn4B,KAAKyI,IAAMD,EAAMiD,IAAIoB,QAAQsrB,IACvF,IAAK1vB,EAAO,OAAO,KAInB,IADA,IAAI1I,EAAUC,KAAKsH,OAAQc,EAAYI,EAAME,MAAOL,EAAUI,EAAIC,MAC3DN,GAAaC,GAAiC,GAAtBtI,EAAQoC,YACrCpC,EAAUA,EAAQiC,WAAWjC,QAC7BqI,IAAaC,IAEf,IAAI3H,EAAQ,IAAI,IAAMX,EAASqI,EAAWC,GAC1C,OAAI8vB,GAAc,EACP,IAAI1E,EAAkBjrB,EAAMhG,IAAK21B,EAAYn4B,KAAKyI,IAAIjG,IAAKxC,KAAKyI,IAAI/F,MAAOhC,EAAO23B,GACzF33B,EAAMc,MAAQgH,EAAMhG,KAAOxC,KAAKyI,IAAIjG,IAC7B,IAAI8wB,EAAY9qB,EAAMhG,IAAKiG,EAAIjG,IAAK9B,QAD/C,GAOFq2B,EAAOr3B,UAAUq4B,aAAe,WAG9B,IAAK,IAAI9C,EAAO,EAAGA,GAAQ,EAAGA,IAC5B,IAAK,IAAIsD,EAAav4B,KAAKk3B,SAAS9uB,UAAWmwB,GAAc,EAAGA,IAS9D,IARA,IAAyBh2B,OAAS,EAO9BoB,GANA40B,GACFh2B,EAASg1B,EAAUv3B,KAAKk3B,SAASn3B,QAASw4B,EAAa,GAAGv2B,YACxCjC,QAEPC,KAAKk3B,SAASn3B,SAENiC,WACZw2B,EAAgBx4B,KAAK0I,MAAO8vB,GAAiB,EAAGA,IAAiB,CACxE,IAAI5vB,EAAM5I,KAAKm3B,SAASqB,GAClB1xB,EAAO8B,EAAI9B,KACXyH,EAAQ3F,EAAI2F,MACZoN,OAAO,EAAU8c,OAAS,EAIhC,GAAY,GAARxD,IAActxB,EAAQ4K,EAAMS,UAAUrL,EAAMmD,QAAU2xB,EAASlqB,EAAM8D,WAAW,IAAS9Q,KAAKoC,IAAQ,IACtFmD,EAAK8C,kBAAkBrH,EAAOuE,OAC9C,MAAO,CAACyxB,WAAYA,EAAYC,cAAeA,EAAej2B,OAAQA,EAAQk2B,OAAQA,GAGrF,GAAY,GAARxD,GAAatxB,IAAUgY,EAAOpN,EAAMsE,aAAalP,EAAMmD,OAC5D,MAAO,CAACyxB,WAAYA,EAAYC,cAAeA,EAAej2B,OAAQA,EAAQoZ,KAAMA,GAGxF,GAAIpZ,GAAUgM,EAAMS,UAAUzM,EAAOuE,MAAS,QAMtDiwB,EAAOr3B,UAAUu4B,SAAW,WAC1B,IAAIrvB,EAAM5I,KAAKk3B,SACTn3B,EAAU6I,EAAI7I,QACdqI,EAAYQ,EAAIR,UAChBC,EAAUO,EAAIP,QAChBvD,EAAQyyB,EAAUx3B,EAASqI,GAC/B,SAAKtD,EAAM3C,YAAc2C,EAAM9C,WAAWuB,UAC1CvD,KAAKk3B,SAAW,IAAI,IAAMn3B,EAASqI,EAAY,EACrBxF,KAAKC,IAAIwF,EAASvD,EAAMtD,KAAO4G,GAAarI,EAAQyB,KAAO6G,EAAUD,EAAY,EAAI,KACxG,IAGT2uB,EAAOr3B,UAAUw4B,SAAW,WAC1B,IAAItvB,EAAM5I,KAAKk3B,SACTn3B,EAAU6I,EAAI7I,QACdqI,EAAYQ,EAAIR,UAChBC,EAAUO,EAAIP,QAChBvD,EAAQyyB,EAAUx3B,EAASqI,GAC/B,GAAItD,EAAM3C,YAAc,GAAKiG,EAAY,EAAG,CAC1C,IAAIswB,EAAY34B,EAAQyB,KAAO4G,GAAaA,EAAYtD,EAAMtD,KAC9DxB,KAAKk3B,SAAW,IAAI,IAAME,EAAiBr3B,EAASqI,EAAY,EAAG,GAAIA,EAAY,EACzDswB,EAAYtwB,EAAY,EAAIC,QAEtDrI,KAAKk3B,SAAW,IAAI,IAAME,EAAiBr3B,EAASqI,EAAW,GAAIA,EAAWC,IAQlF0uB,EAAOr3B,UAAUs4B,WAAa,SAAqBpvB,GAOjD,IANE,IAAI2vB,EAAa3vB,EAAI2vB,WACjBC,EAAgB5vB,EAAI4vB,cACpBj2B,EAASqG,EAAIrG,OACbk2B,EAAS7vB,EAAI6vB,OACb9c,EAAO/S,EAAI+S,KAEV3b,KAAK0I,MAAQ8vB,GAAiBx4B,KAAK24B,oBAC1C,GAAIhd,EAAQ,IAAK,IAAI7d,EAAI,EAAGA,EAAI6d,EAAKxb,OAAQrC,IAAOkC,KAAK44B,iBAAiBjd,EAAK7d,IAE/E,IAAI4C,EAAQV,KAAKk3B,SAAU3sB,EAAWhI,EAASA,EAAOxC,QAAUW,EAAMX,QAClEqI,EAAY1H,EAAM0H,UAAYmwB,EAC9BM,EAAQ,EAAG3W,EAAM,GACjBpX,EAAQ9K,KAAKm3B,SAASqB,GACpBjqB,EAAQzD,EAAMyD,MACdzH,EAAOgE,EAAMhE,KACnB,GAAI2xB,EAAQ,CACV,IAAK,IAAI/mB,EAAM,EAAGA,EAAM+mB,EAAOt2B,WAAYuP,IAASwQ,EAAIvhB,KAAK83B,EAAOh2B,MAAMiP,IAC1EnD,EAAQA,EAAME,cAAcgqB,GAQ9B,IAHA,IAAIK,EAAgBvuB,EAAS/I,KAAO+2B,GAAe73B,EAAMX,QAAQyB,KAAOd,EAAM2H,SAGvEwwB,EAAQtuB,EAASpI,YAAY,CAClC,IAAIkK,EAAO9B,EAAS9H,MAAMo2B,GAAQ7gB,EAAUzJ,EAAMS,UAAU3C,EAAKvF,MACjE,IAAKkR,EAAW,SAChB6gB,EACY,GAAkB,GAAbzwB,GAAkBiE,EAAKtM,QAAQyB,QAC9C+M,EAAQyJ,EACRkK,EAAIvhB,KAAK62B,EAAenrB,EAAKyB,KAAKhH,EAAK6O,aAAatJ,EAAKvE,QAAkB,GAAT+wB,EAAazwB,EAAY,EACnEywB,GAAStuB,EAASpI,WAAa22B,GAAgB,KAG3E,IAAIxmB,EAAQumB,GAAStuB,EAASpI,WACzBmQ,IAASwmB,GAAgB,GAE9B94B,KAAKsH,OAASgwB,EAAct3B,KAAKsH,OAAQkxB,EAAe,IAASj3B,KAAK2gB,IACtEliB,KAAKm3B,SAASqB,GAAejqB,MAAQA,EAIjC+D,GAASwmB,EAAe,GAAKv2B,GAAUA,EAAOuE,MAAQ9G,KAAKm3B,SAASn3B,KAAK0I,OAAO5B,MAAQ9G,KAAKm3B,SAASh3B,OAAS,GAC/GH,KAAK24B,oBAGT,IAAK,IAAI/mB,EAAM,EAAGH,EAAMlH,EAAUqH,EAAMknB,EAAclnB,IAAO,CAC3D,IAAIvO,EAAOoO,EAAIvP,UACflC,KAAKm3B,SAASx2B,KAAK,CAACmG,KAAMzD,EAAKyD,KAAMyH,MAAOlL,EAAKiL,eAAejL,EAAKlB,cACrEsP,EAAMpO,EAAKtD,QAMbC,KAAKk3B,SAAY5kB,EACC,GAAdimB,EAAkB,IAAMv0B,MACxB,IAAI,IAAMozB,EAAiB12B,EAAMX,QAASw4B,EAAa,EAAG,GAChDA,EAAa,EAAGO,EAAe,EAAIp4B,EAAM2H,QAAUkwB,EAAa,GAHrD,IAAI,IAAMnB,EAAiB12B,EAAMX,QAASw4B,EAAYM,GAAQn4B,EAAM0H,UAAW1H,EAAM2H,UAMhH0uB,EAAOr3B,UAAU04B,eAAiB,WAChC,IAAKp4B,KAAKyI,IAAIlG,OAAOkL,aAAezN,KAAKyI,IAAI/F,OAAS1C,KAAKyI,IAAIjG,IAAO,OAAQ,EAC9E,IAAqC6e,EAAjC1E,EAAM3c,KAAKm3B,SAASn3B,KAAK0I,OAC7B,IAAKiU,EAAI7V,KAAK2G,cAAgBgqB,EAAiBz3B,KAAKyI,IAAKzI,KAAKyI,IAAIC,MAAOiU,EAAI7V,KAAM6V,EAAIpO,OAAO,IACzFvO,KAAKyI,IAAIC,OAAS1I,KAAK0I,QAAU2Y,EAAQrhB,KAAK+4B,eAAe/4B,KAAKyI,OAAS4Y,EAAM3Y,OAAS1I,KAAK0I,MAAU,OAAQ,EAKtH,IAHA,IACMA,EADI1I,KAAKyI,IACGC,MACZoD,EAAQ9L,KAAKyI,IAAIqD,MAAMpD,GACtBA,EAAQ,GAAKoD,GAAS9L,KAAKyI,IAAI/F,MAAMgG,MAAYoD,EACxD,OAAOA,GAGTirB,EAAOr3B,UAAUq5B,eAAiB,SAAyBtwB,GACzD2K,EAAM,IAAK,IAAItV,EAAI8E,KAAKE,IAAI9C,KAAK0I,MAAOD,EAAIC,OAAQ5K,GAAK,EAAGA,IAAK,CAC/D,IAAI8K,EAAM5I,KAAKm3B,SAASr5B,GAClByQ,EAAQ3F,EAAI2F,MACZzH,EAAO8B,EAAI9B,KACbkyB,EAAYl7B,EAAI2K,EAAIC,OAASD,EAAI/F,IAAI5E,EAAI,IAAM2K,EAAIjG,KAAOiG,EAAIC,OAAS5K,EAAI,IAC3Ek5B,EAAMS,EAAiBhvB,EAAK3K,EAAGgJ,EAAMyH,EAAOyqB,GAChD,GAAKhC,EAAL,CACA,IAAK,IAAI54B,EAAIN,EAAI,EAAGM,GAAK,EAAGA,IAAK,CAC/B,IAAI0M,EAAQ9K,KAAKm3B,SAAS/4B,GACpB66B,EAAUnuB,EAAMyD,MAElByJ,EAAUyf,EAAiBhvB,EAAKrK,EADrB0M,EAAMhE,KAC0BmyB,GAAS,GACxD,IAAKjhB,GAAWA,EAAQ7V,WAAc,SAASiR,EAEjD,MAAO,CAAC1K,MAAO5K,EAAGk5B,IAAKA,EAAKkC,KAAMF,EAAYvwB,EAAIgD,IAAIoB,QAAQpE,EAAIqD,MAAMhO,EAAI,IAAM2K,MAItFsuB,EAAOr3B,UAAU44B,MAAQ,SAAgB7vB,GACvC,IAAI6vB,EAAQt4B,KAAK+4B,eAAetwB,GAChC,IAAK6vB,EAAS,OAAO,KAErB,KAAOt4B,KAAK0I,MAAQ4vB,EAAM5vB,OAAS1I,KAAK24B,oBACpCL,EAAMtB,IAAI70B,aAAcnC,KAAKsH,OAASgwB,EAAct3B,KAAKsH,OAAQgxB,EAAM5vB,MAAO4vB,EAAMtB,MACxFvuB,EAAM6vB,EAAMY,KACZ,IAAK,IAAI96B,EAAIk6B,EAAM5vB,MAAQ,EAAGtK,GAAKqK,EAAIC,MAAOtK,IAAK,CACjD,IAAIiF,EAAOoF,EAAIpF,KAAKjF,GAAI8jB,EAAM7e,EAAKyD,KAAK0H,aAAa6D,WAAWhP,EAAKtD,SAAS,EAAM0I,EAAIvE,MAAM9F,IAC9F4B,KAAK44B,iBAAiBv1B,EAAKyD,KAAMzD,EAAKmD,MAAO0b,GAE/C,OAAOzZ,GAGTsuB,EAAOr3B,UAAUk5B,iBAAmB,SAA2B9xB,EAAMN,EAAOzG,GAC1E,IAAI4c,EAAM3c,KAAKm3B,SAASn3B,KAAK0I,OAC7BiU,EAAIpO,MAAQoO,EAAIpO,MAAMS,UAAUlI,GAChC9G,KAAKsH,OAASgwB,EAAct3B,KAAKsH,OAAQtH,KAAK0I,MAAO,IAASnH,KAAKuF,EAAK1H,OAAOoH,EAAOzG,KACtFC,KAAKm3B,SAASx2B,KAAK,CAACmG,KAAMA,EAAMyH,MAAOzH,EAAK0H,gBAG9CuoB,EAAOr3B,UAAUi5B,kBAAoB,WACnC,IACIzW,EADOliB,KAAKm3B,SAAS3jB,MACVjF,MAAM8D,WAAW,IAASrO,OAAO,GAC5Cke,EAAI/f,aAAcnC,KAAKsH,OAASgwB,EAAct3B,KAAKsH,OAAQtH,KAAKm3B,SAASh3B,OAAQ+hB,KAGvF1jB,OAAOiI,iBAAkBswB,EAAOr3B,UAAW4I,GA2D3C2e,EAAUvnB,UAAUykB,aAAe,SAAS5iB,EAAMc,EAAI3B,GACpD,IAAKA,EAAMc,KAAQ,OAAOxB,KAAKskB,YAAY/iB,EAAMc,GAEjD,IAAImG,EAAQxI,KAAKyL,IAAIoB,QAAQtL,GAAOkH,EAAMzI,KAAKyL,IAAIoB,QAAQxK,GAC3D,GAAI8zB,EAAc3tB,EAAOC,EAAK/H,GAC1B,OAAOV,KAAK0mB,KAAK,IAAI4M,EAAY/xB,EAAMc,EAAI3B,IAE/C,IAAIy4B,EAAerB,EAActvB,EAAOxI,KAAKyL,IAAIoB,QAAQxK,IAEZ,GAAzC82B,EAAaA,EAAah5B,OAAS,IAAWg5B,EAAa3lB,MAG/D,IAAI4lB,IAAoB5wB,EAAME,MAAQ,GACtCywB,EAAaE,QAAQD,GAKrB,IAAK,IAAIh7B,EAAIoK,EAAME,MAAOlG,EAAMgG,EAAMhG,IAAM,EAAGpE,EAAI,EAAGA,IAAKoE,IAAO,CAChE,IAAI2I,EAAO3C,EAAMnF,KAAKjF,GAAG0I,KAAKqE,KAC9B,GAAIA,EAAKmuB,UAAYnuB,EAAKC,UAAa,MACnC+tB,EAAavoB,QAAQxS,IAAM,EAAKg7B,EAAkBh7B,EAC7CoK,EAAMqD,OAAOzN,IAAMoE,GAAO22B,EAAav4B,OAAO,EAAG,GAAIxC,GAOhE,IAHA,IAAIm7B,EAAuBJ,EAAavoB,QAAQwoB,GAE5CI,EAAY,GAAIC,EAAiB/4B,EAAM0H,UAClCrI,EAAUW,EAAMX,QAASjC,EAAI,GAAIA,IAAK,CAC7C,IAAIuF,EAAOtD,EAAQiC,WAEnB,GADAw3B,EAAU74B,KAAK0C,GACXvF,GAAK4C,EAAM0H,UAAa,MAC5BrI,EAAUsD,EAAKtD,QAIb05B,EAAiB,GAAKD,EAAUC,EAAiB,GAAG3yB,KAAKqE,KAAKmuB,UAC9D9wB,EAAMnF,KAAKk2B,GAAsBzyB,MAAQ0yB,EAAUC,EAAiB,GAAG3yB,KACvE2yB,GAAkB,EACbA,GAAkB,GAAKD,EAAUC,EAAiB,GAAGhsB,aAAe+rB,EAAUC,EAAiB,GAAG3yB,KAAKqE,KAAKmuB,UAC5G9wB,EAAMnF,KAAKk2B,GAAsBzyB,MAAQ0yB,EAAUC,EAAiB,GAAG3yB,OAC5E2yB,GAAkB,GAEtB,IAAK,IAAI50B,EAAInE,EAAM0H,UAAWvD,GAAK,EAAGA,IAAK,CACzC,IAAI60B,GAAa70B,EAAI40B,EAAiB,IAAM/4B,EAAM0H,UAAY,GAC1DsC,EAAS8uB,EAAUE,GACvB,GAAKhvB,EACL,IAAK,IAAIgH,EAAM,EAAGA,EAAMynB,EAAah5B,OAAQuR,IAAO,CAGlD,IAAIioB,EAAcR,GAAcznB,EAAM6nB,GAAwBJ,EAAah5B,QAASy5B,GAAS,EACzFD,EAAc,IAAKC,GAAS,EAAOD,GAAeA,GACtD,IAAIp3B,EAASiG,EAAMnF,KAAKs2B,EAAc,GAAIz1B,EAAQsE,EAAMtE,MAAMy1B,EAAc,GAC5E,GAAIp3B,EAAOwM,eAAe7K,EAAOA,EAAOwG,EAAO5D,KAAM4D,EAAO5C,OACxD,OAAO9H,KAAKuI,QAAQC,EAAMqD,OAAO8tB,GAAcC,EAASnxB,EAAIqD,MAAM6tB,GAAet3B,EAC/D,IAAI,IAAMs1B,EAAcj3B,EAAMX,QAAS,EAAGW,EAAM0H,UAAWsxB,GACjDA,EAAWh5B,EAAM2H,WAKrD,IADA,IAAIwxB,EAAa75B,KAAKikB,MAAM9jB,OACnByR,EAAMunB,EAAah5B,OAAS,EAAGyR,GAAO,IAC7C5R,KAAKuI,QAAQhH,EAAMc,EAAI3B,KACnBV,KAAKikB,MAAM9jB,OAAS05B,IAFwBjoB,IAAO,CAGvD,IAAIlJ,EAAQywB,EAAavnB,GACrBA,EAAM,IACVrQ,EAAOiH,EAAMqD,OAAOnD,GAAQrG,EAAKoG,EAAIqD,MAAMpD,IAE7C,OAAO1I,MAwBTinB,EAAUvnB,UAAU6kB,iBAAmB,SAAShjB,EAAMc,EAAIgB,GACxD,IAAKA,EAAK+I,UAAY7K,GAAQc,GAAMrC,KAAKyL,IAAIoB,QAAQtL,GAAMgB,OAAOxC,QAAQyB,KAAM,CAC9E,IAAIs4B,EA/uBR,SAAqBruB,EAAKjJ,EAAK4M,GAC7B,IAAIqV,EAAOhZ,EAAIoB,QAAQrK,GACvB,GAAIiiB,EAAKliB,OAAOwM,eAAe0V,EAAKvgB,QAASugB,EAAKvgB,QAASkL,GAAa,OAAO5M,EAE/E,GAAyB,GAArBiiB,EAAKhb,aACL,IAAK,IAAIrL,EAAIqmB,EAAK/b,MAAQ,EAAGtK,GAAK,EAAGA,IAAK,CAC1C,IAAI8F,EAAQugB,EAAKvgB,MAAM9F,GACvB,GAAIqmB,EAAKphB,KAAKjF,GAAG2Q,eAAe7K,EAAOA,EAAOkL,GAAa,OAAOqV,EAAK5Y,OAAOzN,EAAI,GAClF,GAAI8F,EAAQ,EAAK,OAAO,KAE5B,GAAIugB,EAAKhb,cAAgBgb,EAAKliB,OAAOxC,QAAQyB,KACzC,IAAK,IAAIg0B,EAAM/Q,EAAK/b,MAAQ,EAAG8sB,GAAO,EAAGA,IAAO,CAChD,IAAIb,EAAUlQ,EAAK7Y,WAAW4pB,GAC9B,GAAI/Q,EAAKphB,KAAKmyB,GAAKzmB,eAAe4lB,EAASA,EAASvlB,GAAa,OAAOqV,EAAK3Y,MAAM0pB,EAAM,GACzF,GAAIb,EAAUlQ,EAAKphB,KAAKmyB,GAAKrzB,WAAc,OAAO,MAiuBxC43B,CAAY/5B,KAAKyL,IAAKlK,EAAM8B,EAAKyD,MAChC,MAATgzB,IAAiBv4B,EAAOc,EAAKy3B,GAEnC,OAAO95B,KAAKmkB,aAAa5iB,EAAMc,EAAI,IAAI,IAAM,IAASd,KAAK8B,GAAO,EAAG,KAMvE4jB,EAAUvnB,UAAU4kB,YAAc,SAAS/iB,EAAMc,GAG/C,IAFA,IAAImG,EAAQxI,KAAKyL,IAAIoB,QAAQtL,GAAOkH,EAAMzI,KAAKyL,IAAIoB,QAAQxK,GACvD23B,EAAUlC,EAActvB,EAAOC,GAC1B3K,EAAI,EAAGA,EAAIk8B,EAAQ75B,OAAQrC,IAAK,CACvC,IAAI4K,EAAQsxB,EAAQl8B,GAAI4F,EAAO5F,GAAKk8B,EAAQ75B,OAAS,EACrD,GAAKuD,GAAiB,GAATgF,GAAeF,EAAMnF,KAAKqF,GAAO5B,KAAK0H,aAAaK,SAC5D,OAAO7O,KAAKomB,OAAO5d,EAAM7F,MAAM+F,GAAQD,EAAI/F,IAAIgG,IACnD,GAAIA,EAAQ,IAAMhF,GAAQ8E,EAAMnF,KAAKqF,EAAQ,GAAGiC,WAAWnC,EAAMtE,MAAMwE,EAAQ,GAAID,EAAImD,WAAWlD,EAAQ,KACtG,OAAO1I,KAAKomB,OAAO5d,EAAMqD,OAAOnD,GAAQD,EAAIqD,MAAMpD,IAExD,IAAK,IAAItK,EAAI,EAAGA,GAAKoK,EAAME,OAAStK,GAAKqK,EAAIC,MAAOtK,IAClD,GAAImD,EAAOiH,EAAM7F,MAAMvE,IAAMoK,EAAME,MAAQtK,GAAKiE,EAAKmG,EAAM9F,IAAItE,IAAMqK,EAAI/F,IAAItE,GAAKiE,GAAMoG,EAAIC,MAAQtK,EAChG,OAAO4B,KAAKomB,OAAO5d,EAAMqD,OAAOzN,GAAIiE,GAE1C,OAAOrC,KAAKomB,OAAO7kB,EAAMc,K,6BCplD3B,IAAI43B,EAAkBz7B,OAAOkB,UAAUC,eAEvC,SAASytB,EAAI5tB,EAAQH,GACnB,OAAO46B,EAAgBh8B,KAAKuB,EAAQH,GA+BtC,SAAS66B,EAAkB/7B,GAGzB,QAAIA,GAAK,OAAUA,GAAK,WAEpBA,GAAK,OAAUA,GAAK,SACH,QAAZ,MAAJA,IAA2C,QAAZ,MAAJA,OAE5BA,GAAK,GAAQA,GAAK,KACZ,KAANA,MACAA,GAAK,IAAQA,GAAK,QAClBA,GAAK,KAAQA,GAAK,QAElBA,EAAI,eAIV,SAASg8B,EAAch8B,GAErB,GAAIA,EAAI,MAAQ,CAEd,IAAIi8B,EAAa,QADjBj8B,GAAK,QAC2B,IAC5Bk8B,EAAa,OAAc,KAAJl8B,GAE3B,OAAOm8B,OAAOC,aAAaH,EAAYC,GAEzC,OAAOC,OAAOC,aAAap8B,GAI7B,IAAIq8B,EAAkB,8CAElBC,EAAkB,IAAIC,OAAOF,EAAeG,OAAS,IADnC,6BACmDA,OAAQ,MAE7EC,EAAyB,qCAEzBC,EAAW,EAAQ,IA2CvB,IAAIC,EAAsB,SACtBC,EAAyB,UACzBC,EAAoB,CACtB,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,UAGP,SAASC,EAAkBC,GACzB,OAAOF,EAAkBE,GAY3B,IAAIC,EAAmB,uBAwCvB,IAAIC,EAAmB,EAAQ,IAiH/Bx9B,EAAQy9B,IAAsB,GAC9Bz9B,EAAQy9B,IAAIC,MAAkB,EAAQ,IACtC19B,EAAQy9B,IAAIE,QAAkB,EAAQ,IAEtC39B,EAAQ49B,OA5RR,SAAgB7zB,GACd,IAAI8zB,EAAUx1B,MAAMvG,UAAUgB,MAAMzC,KAAK8vB,UAAW,GAcpD,OAZA0N,EAAQt6B,SAAQ,SAAUw5B,GACxB,GAAKA,EAAL,CAEA,GAAsB,iBAAXA,EACT,MAAM,IAAIe,UAAUf,EAAS,kBAG/Bn8B,OAAO0sB,KAAKyP,GAAQx5B,SAAQ,SAAU9B,GACpCsI,EAAItI,GAAOs7B,EAAOt7B,UAIfsI,GA8QT/J,EAAQ+9B,SAvSR,SAAkBh0B,GAAO,MAAuB,oBAFhD,SAAgBA,GAAO,OAAOnJ,OAAOkB,UAAUiG,SAAS1H,KAAK0J,GAE7Bi0B,CAAOj0B,IAwSvC/J,EAAQwvB,IAAsBA,EAC9BxvB,EAAQi+B,WAtMR,SAAoBjvB,GAClB,OAAIA,EAAIgE,QAAQ,MAAQ,EAAYhE,EAC7BA,EAAIrE,QAAQiyB,EAAgB,OAqMrC58B,EAAQk+B,YAlMR,SAAqBlvB,GACnB,OAAIA,EAAIgE,QAAQ,MAAQ,GAAKhE,EAAIgE,QAAQ,KAAO,EAAYhE,EAErDA,EAAIrE,QAAQkyB,GAAiB,SAAUlsB,EAAOwtB,EAASC,GAC5D,OAAID,GAlCR,SAA8BxtB,EAAOlQ,GACnC,IAAIqtB,EAAO,EAEX,OAAI0B,EAAIyN,EAAUx8B,GACTw8B,EAASx8B,GAGS,KAAvBA,EAAKia,WAAW,IAAsBsiB,EAAuB/mB,KAAKxV,IAIhE67B,EAHJxO,EAAiC,MAA1BrtB,EAAK,GAAGigB,cACb2d,SAAS59B,EAAKqC,MAAM,GAAI,IAAMu7B,SAAS59B,EAAKqC,MAAM,GAAI,KAG/Cy5B,EAAczO,GAIlBnd,EAmBE2tB,CAAqB3tB,EAAOytB,OA8LvCp+B,EAAQs8B,kBAAsBA,EAC9Bt8B,EAAQu8B,cAAsBA,EAE9Bv8B,EAAQu+B,WA9KR,SAAoBvvB,GAClB,OAAIkuB,EAAoBjnB,KAAKjH,GACpBA,EAAIrE,QAAQwyB,EAAwBE,GAEtCruB,GA2KThP,EAAQw+B,eAjRR,SAAwBC,EAAK75B,EAAK85B,GAChC,MAAO,GAAGx7B,OAAOu7B,EAAI37B,MAAM,EAAG8B,GAAM85B,EAAaD,EAAI37B,MAAM8B,EAAM,KAiRnE5E,EAAQ2+B,QA/JR,SAAiB7Q,GACf,OAAQA,GACN,KAAK,EACL,KAAK,GACH,OAAO,EAEX,OAAO,GA0JT9tB,EAAQ4+B,aAtJR,SAAsB9Q,GACpB,GAAIA,GAAQ,MAAUA,GAAQ,KAAU,OAAO,EAC/C,OAAQA,GACN,KAAK,EACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,MACH,OAAO,EAEX,OAAO,GAuIT9tB,EAAQ6+B,eAlHR,SAAwBvB,GACtB,OAAQA,GACN,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACH,OAAO,EACT,QACE,OAAO,IA+Ebt9B,EAAQ8+B,YA/HR,SAAqBxB,GACnB,OAAOE,EAAiBvnB,KAAKqnB,IA+H/Bt9B,EAAQ++B,SAzKR,SAAkB/vB,GAChB,OAAOA,EAAIrE,QAAQ4yB,EAAkB,SAyKvCv9B,EAAQg/B,mBA3ER,SAA4BhwB,GA+C1B,OA5CAA,EAAMA,EAAI4Q,OAAOjV,QAAQ,OAAQ,KAQP,MAAtB,IAAI+V,gBACN1R,EAAMA,EAAIrE,QAAQ,KAAM,MAmCnBqE,EAAI0R,cAAcue,gB,6BChS3B,8NAOIC,EAAY,SAAmBvuB,EAAOwuB,GAK1C,IAAuBhtB,EAJrB/P,KAAKuO,MAAQA,EACbvO,KAAK+8B,QAA4B,iBAAXA,GAGDhtB,EAHqCgtB,EAInD,SAASjsB,EAAOvC,EAAO5L,EAAOD,GACnC,IAAIgI,EAASqF,EACb,GAAIxB,EAAM,GAAI,CACZ,IAAI7H,EAAS6H,EAAM,GAAG+S,YAAY/S,EAAM,IACxC7D,GAAU6D,EAAM,GAAG7N,MAAMgG,EAAS6H,EAAM,GAAGpO,QAE3C,IAAI68B,GADJr6B,GAAS+D,GACYhE,EACjBs6B,EAAS,IACXtyB,EAAS6D,EAAM,GAAG7N,MAAMgG,EAASs2B,EAAQt2B,GAAUgE,EACnD/H,EAAQD,GAGZ,OAAOoO,EAAM+S,GAAG0E,WAAW7d,EAAQ/H,EAAOD,KAhByBq6B,GA0BvE,SAASE,EAAWr0B,GAClB,IAAIoO,EAAQpO,EAAIoO,MAEZwS,EAAS,IAAI,IAAO,CACtB1Y,MAAO,CACL+X,KAAM,WAAkB,OAAO,MAC/BC,MAAO,SAAejF,EAAIsF,GACxB,IAAI+T,EAASrZ,EAAG4E,QAAQzoB,MACxB,OAAIk9B,IACGrZ,EAAG6D,cAAgB7D,EAAGwO,WAAa,KAAOlJ,KAIrD0B,MAAO,CACLsS,gBAAiB,SAAyBnP,EAAMzsB,EAAMc,EAAIc,GACxD,OAAOi6B,EAAIpP,EAAMzsB,EAAMc,EAAIc,EAAM6T,EAAOwS,IAE1C6T,gBAAiB,CACfC,eAAgB,SAAUtP,GACxBuP,YAAW,WACT,IACI7X,EADMsI,EAAKld,MAAMwV,UACHZ,QACdA,GAAW0X,EAAIpP,EAAMtI,EAAQljB,IAAKkjB,EAAQljB,IAAK,GAAIwU,EAAOwS,SAMtEgU,cAAc,IAEhB,OAAOhU,EAGT,SAAS4T,EAAIpP,EAAMzsB,EAAMc,EAAIc,EAAM6T,EAAOwS,GACxC,GAAIwE,EAAKyP,UAAa,OAAO,EAC7B,IAAI3sB,EAAQkd,EAAKld,MAAOtI,EAAQsI,EAAMrF,IAAIoB,QAAQtL,GAClD,GAAIiH,EAAMjG,OAAOuE,KAAKqE,KAAKugB,KAAQ,OAAO,EAG1C,IAFA,IAAIgS,EAAal1B,EAAMjG,OAAOS,YAAYJ,KAAKC,IAAI,EAAG2F,EAAMiB,aA3C9C,KA2CyEjB,EAAMiB,aACnD,KAAM,KAAYtG,EACnDrF,EAAI,EAAGA,EAAIkZ,EAAM7W,OAAQrC,IAAK,CACrC,IAAIyQ,EAAQyI,EAAMlZ,GAAGyQ,MAAMqN,KAAK8hB,GAC5B7Z,EAAKtV,GAASyI,EAAMlZ,GAAGi/B,QAAQjsB,EAAOvC,EAAOhN,GAAQgN,EAAM,GAAGpO,OAASgD,EAAKhD,QAASkC,GACzF,GAAKwhB,EAEL,OADAmK,EAAK5C,SAASvH,EAAG2E,QAAQgB,EAAQ,CAACmU,UAAW9Z,EAAItiB,KAAMA,EAAMc,GAAIA,EAAIc,KAAMA,MACpE,EAET,OAAO,EAMT,SAASy6B,EAAc9sB,EAAOsa,GAE5B,IADA,IAAI/B,EAAUvY,EAAMuY,QACXvrB,EAAI,EAAGA,EAAIurB,EAAQlpB,OAAQrC,IAAK,CACvC,IAAI0rB,EAASH,EAAQvrB,GAAI+/B,OAAW,EACpC,GAAIrU,EAAOre,KAAKqyB,eAAiBK,EAAWrU,EAAOyB,SAASna,IAAS,CACnE,GAAIsa,EAAU,CAEZ,IADA,IAAIvH,EAAK/S,EAAM+S,GAAIia,EAASD,EAASF,UAC5B94B,EAAIi5B,EAAO7Z,MAAM9jB,OAAS,EAAG0E,GAAK,EAAGA,IAC1Cgf,EAAG6C,KAAKoX,EAAO7Z,MAAMpf,GAAGwsB,OAAOyM,EAAO1L,KAAKvtB,KAC/C,GAAIg5B,EAAS16B,KAAM,CACjB,IAAI2E,EAAQ+b,EAAGpY,IAAIoB,QAAQgxB,EAASt8B,MAAMuG,QAC1C+b,EAAGQ,YAAYwZ,EAASt8B,KAAMs8B,EAASx7B,GAAIyO,EAAM9K,OAAO7C,KAAK06B,EAAS16B,KAAM2E,SAE5E+b,EAAGuC,OAAOyX,EAASt8B,KAAMs8B,EAASx7B,IAEpC+oB,EAASvH,GAEX,OAAO,GAGX,OAAO,EAII,IAAIiZ,EAAU,MAAO,KAAlC,IAEIiB,EAAW,IAAIjB,EAAU,UAAW,KAElB,IAAIA,EAAU,uCAAwC,KAErD,IAAIA,EAAU,KAAM,KAErB,IAAIA,EAAU,uCAAwC,KAErD,IAAIA,EAAU,KAAM,KAqB3C,SAASkB,EAAkBrP,EAAQvf,EAAUgJ,EAAU6lB,GACrD,OAAO,IAAInB,EAAUnO,GAAQ,SAAU7d,EAAOvC,EAAO5L,EAAOD,GAC1D,IAAI8D,EAAQ4R,aAAoB2S,SAAW3S,EAAS7J,GAAS6J,EACzDyL,EAAK/S,EAAM+S,GAAGuC,OAAOzjB,EAAOD,GACI+pB,EAAvB5I,EAAGpY,IAAIoB,QAAQlK,GAAuB4J,aAAcwgB,EAAWN,GAAS,YAAaA,EAAOrd,EAAU5I,GACnH,IAAKumB,EAAY,OAAO,KACxBlJ,EAAGlI,KAAK8Q,EAAOM,GACf,IAAIlhB,EAASgY,EAAGpY,IAAIoB,QAAQlK,EAAQ,GAAGyH,WAIvC,OAHIyB,GAAUA,EAAO/E,MAAQsI,GAAY,YAAQyU,EAAGpY,IAAK9I,EAAQ,MAC3Ds7B,GAAiBA,EAAc1vB,EAAO1C,KACxCgY,EAAGhe,KAAKlD,EAAQ,GACbkhB,KAWX,SAASqa,EAAuBvP,EAAQvf,EAAUgJ,GAChD,OAAO,IAAI0kB,EAAUnO,GAAQ,SAAU7d,EAAOvC,EAAO5L,EAAOD,GAC1D,IAAIwG,EAAS4H,EAAMrF,IAAIoB,QAAQlK,GAC3B6D,EAAQ4R,aAAoB2S,SAAW3S,EAAS7J,GAAS6J,EAC7D,OAAKlP,EAAO7F,MAAM,GAAG0L,eAAe7F,EAAOhF,OAAO,GAAIgF,EAAO0C,YAAY,GAAIwD,GACtE0B,EAAM+S,GACVuC,OAAOzjB,EAAOD,GACdsqB,aAAarqB,EAAOA,EAAOyM,EAAU5I,GAHyD,U,6BCxKtF,SAAS23B,EAAgB5/B,EAAGqB,GAMzC,OALAu+B,EAAkB3/B,OAAO4/B,gBAAkB,SAAyB7/B,EAAGqB,GAErE,OADArB,EAAE4I,UAAYvH,EACPrB,IAGcA,EAAGqB,GCLb,SAASy+B,EAAeC,EAAUC,GAC/CD,EAAS5+B,UAAYlB,OAAOY,OAAOm/B,EAAW7+B,WAC9C4+B,EAAS5+B,UAAUO,YAAcq+B,EACjC,EAAeA,EAAUC,G,gECJ3B,wOAIIv4B,EAAS,IAAI,IAAO,CACtBO,MAAO,CACLkF,IAAK,CACH1L,QAAS,UAGXy+B,UAAW,CACTz+B,QAAS,UACToV,MAAO,QACPsD,SAAU,CAAC,CAACpB,IAAK,MACjBqK,MAAO,WAAmB,MAAO,CAAC,IAAK,KAGzCxI,WAAY,CACVnZ,QAAS,SACToV,MAAO,QACPsD,SAAU,CAAC,CAACpB,IAAK,eACjBqK,MAAO,WAAmB,MAAO,CAAC,aAAc,KAGlD+c,gBAAiB,CACftpB,MAAO,QACPsD,SAAU,CAAC,CAACpB,IAAK,OACjBqK,MAAO,WAAmB,MAAO,CAAC,MAAO,CAAC,SAG5Cgd,QAAS,CACPl4B,MAAO,CAAC6a,MAAO,CAAC3M,QAAS,IACzB3U,QAAS,kBACToV,MAAO,QACPmkB,UAAU,EACV7gB,SAAU,CAAC,CAACpB,IAAK,KAAM7Q,MAAO,CAAC6a,MAAO,IAC3B,CAAChK,IAAK,KAAM7Q,MAAO,CAAC6a,MAAO,IAC3B,CAAChK,IAAK,KAAM7Q,MAAO,CAAC6a,MAAO,IAC3B,CAAChK,IAAK,KAAM7Q,MAAO,CAAC6a,MAAO,IAC3B,CAAChK,IAAK,KAAM7Q,MAAO,CAAC6a,MAAO,IAC3B,CAAChK,IAAK,KAAM7Q,MAAO,CAAC6a,MAAO,KACtCK,MAAO,SAAere,GAAQ,MAAO,CAAC,IAAMA,EAAKmD,MAAM6a,MAAO,KAGhEsd,WAAY,CACV5+B,QAAS,QACToV,MAAO,QACPuW,MAAM,EACN4N,UAAU,EACVxxB,MAAO,GACPtB,MAAO,CAACo4B,OAAQ,CAAClqB,QAAS,KAC1B+D,SAAU,CAAC,CAACpB,IAAK,MAAO+D,mBAAoB,OAAQhD,SAAU,SAAU/U,GAAQ,MAAO,CACpFu7B,OAAQv7B,EAAKga,aAAa,gBAAkB,OAE/CqE,MAAO,SAAere,GAAQ,MAAO,CAAC,MAAOA,EAAKmD,MAAMo4B,OAAS,CAAC,cAAev7B,EAAKmD,MAAMo4B,QAAU,GAAI,CAAC,OAAQ,MAGrHlP,aAAc,CACZ3vB,QAAS,aACToV,MAAO,QACP3O,MAAO,CAACq4B,MAAO,CAACnqB,QAAS,GAAIoqB,MAAO,CAACpqB,SAAS,IAC9C+D,SAAU,CAAC,CAACpB,IAAK,KAAMe,SAAU,SAAkBX,GACjD,MAAO,CAAConB,MAAOpnB,EAAIsnB,aAAa,UAAYtnB,EAAI4F,aAAa,SAAW,EAChEyhB,MAAOrnB,EAAIsnB,aAAa,kBAElCrd,MAAO,SAAere,GACpB,MAAO,CAAC,KAAM,CAACV,MAA2B,GAApBU,EAAKmD,MAAMq4B,MAAa,KAAOx7B,EAAKmD,MAAMq4B,MACjD,aAAcx7B,EAAKmD,MAAMs4B,MAAQ,OAAS,MAAO,KAIpErP,YAAa,CACX1vB,QAAS,aACToV,MAAO,QACP3O,MAAO,CAACs4B,MAAO,CAACpqB,SAAS,IACzB+D,SAAU,CAAC,CAACpB,IAAK,KAAMe,SAAU,SAAUX,GAAO,MAAO,CAAEqnB,MAAOrnB,EAAIsnB,aAAa,kBACnFrd,MAAO,SAAere,GAAQ,MAAO,CAAC,KAAM,CAAC,aAAcA,EAAKmD,MAAMs4B,MAAQ,OAAS,MAAO,KAGhGE,UAAW,CACTj/B,QAAS,mBACTu5B,UAAU,EACV7gB,SAAU,CAAC,CAACpB,IAAK,OACjBqK,MAAO,WAAmB,MAAO,CAAC,KAAM,KAG1Cve,KAAM,CACJgS,MAAO,UAGT8pB,MAAO,CACL5rB,QAAQ,EACR7M,MAAO,CACL61B,IAAK,GACL6C,IAAK,CAACxqB,QAAS,MACfuG,MAAO,CAACvG,QAAS,OAEnBS,MAAO,SACPgqB,WAAW,EACX1mB,SAAU,CAAC,CAACpB,IAAK,WAAYe,SAAU,SAAkBX,GACvD,MAAO,CACL4kB,IAAK5kB,EAAI4F,aAAa,OACtBpC,MAAOxD,EAAI4F,aAAa,SACxB6hB,IAAKznB,EAAI4F,aAAa,WAG1BqE,MAAO,SAAere,GAAQ,MAAO,CAAC,MAAOA,EAAKmD,SAGpD44B,WAAY,CACV/rB,QAAQ,EACR8B,MAAO,SACPgR,YAAY,EACZ1N,SAAU,CAAC,CAACpB,IAAK,OACjBqK,MAAO,WAAmB,MAAO,CAAC,SAItC5Z,MAAO,CACLu3B,GAAI,CACF5mB,SAAU,CAAC,CAACpB,IAAK,KAAM,CAACA,IAAK,MAClB,CAACC,MAAO,aAAcc,SAAU,SAAUrZ,GAAS,MAAgB,UAATA,GAAqB,QAC1F2iB,MAAO,WAAmB,MAAO,CAAC,QAGpC4d,OAAQ,CACN7mB,SAAU,CAAC,CAACpB,IAAK,KAAM,CAACA,IAAK,UAClB,CAACC,MAAO,cAAec,SAAU,SAAUrZ,GAAS,MAAO,4BAA4B8U,KAAK9U,IAAU,QACjH2iB,MAAO,WAAmB,MAAO,CAAC,YAGpC6d,KAAM,CACJ/4B,MAAO,CACLg5B,KAAM,GACNvkB,MAAO,CAACvG,QAAS,OAEnBxI,WAAW,EACXuM,SAAU,CAAC,CAACpB,IAAK,UAAWe,SAAU,SAAkBX,GACtD,MAAO,CAAC+nB,KAAM/nB,EAAI4F,aAAa,QAASpC,MAAOxD,EAAI4F,aAAa,aAElEqE,MAAO,SAAere,GAAQ,MAAO,CAAC,IAAKA,EAAKmD,SAGlDklB,KAAM,CACJjT,SAAU,CAAC,CAACpB,IAAK,SACjBqK,MAAO,WAAmB,MAAO,CAAC,aAWxC,IAAI+d,EAAqB,SAA4Bz5B,EAAQ05B,GAC3D1/B,KAAKgG,OAASA,EACdhG,KAAK2/B,MAAQ,CAAC,CAAC74B,KAAMd,EAAO0Q,YAAa3W,QAAS,KAClDC,KAAK8H,MAAQ,IAAKG,KAClBjI,KAAK0/B,cAAgBA,GAmEvB,SAASl5B,EAAM2E,EAAMy0B,EAAOtsB,EAAQxV,GAClC,OAAIqN,EAAKiN,SAAmBjN,EAAKiN,SAASwnB,EAAOtsB,EAAQxV,GAEhDqN,EAAK3E,iBAAiBukB,SAAmB5f,EAAK3E,MAAMo5B,GAC/Cz0B,EAAK3E,MAKrB,SAASq5B,EAAa10B,EAAMrE,GAC1B,OAAOqE,EAAK00B,cAAwB,eAAR/4B,GAAiC,cAARA,GAAgC,SAARA,EAG/E,SAASg5B,EAAuBlzB,GAC9B,MAA8B,MAAvBA,EAAIA,EAAIzM,OAAS,GAAayM,EAAIlM,MAAM,EAAGkM,EAAIzM,OAAS,GAAKyM,EAGtE,SAASmzB,KAjFTN,EAAmB//B,UAAUid,IAAM,WACjC,OAAO3c,KAAK2/B,MAAM3/B,KAAK2/B,MAAMx/B,OAAS,IAGxCs/B,EAAmB//B,UAAUiB,KAAO,SAAeq/B,GAC7ChgC,KAAK2/B,MAAMx/B,QAAUH,KAAK2c,MAAM5c,QAAQY,KAAKq/B,IAMnDP,EAAmB//B,UAAUugC,QAAU,SAAkB98B,GACvD,GAAKA,EAAL,CACA,IAC+C+8B,EAD3C35B,EAAQvG,KAAK2c,MAAM5c,QAAS2D,EAAO6C,EAAMA,EAAMpG,OAAS,GACxDkD,EAAOrD,KAAKgG,OAAO7C,KAAKA,EAAMnD,KAAK8H,OACnCpE,IAASw8B,EA5Bf,SAAoBz7B,EAAGC,GACrB,GAAID,EAAEnB,QAAUoB,EAAEpB,QAAU,IAAKyE,QAAQtD,EAAEqD,MAAOpD,EAAEoD,OAChD,OAAOrD,EAAEZ,SAASY,EAAEtB,KAAOuB,EAAEvB,MA0BXg9B,CAAWz8B,EAAML,IAAUkD,EAAMA,EAAMpG,OAAS,GAAK+/B,EACpE35B,EAAM5F,KAAK0C,KAKpBo8B,EAAmB//B,UAAU0gC,SAAW,SAAmBtyB,GACzD9N,KAAK8H,MAAQgG,EAAK1G,SAASpH,KAAK8H,QAKlC23B,EAAmB//B,UAAU2gC,UAAY,SAAoBvyB,GAC3D9N,KAAK8H,MAAQgG,EAAKrG,cAAczH,KAAK8H,QAGvC23B,EAAmB//B,UAAU4gC,YAAc,SAAsBC,GAC/D,IAAK,IAAIziC,EAAI,EAAGA,EAAIyiC,EAAKpgC,OAAQrC,IAAK,CACpC,IAAIkX,EAAMurB,EAAKziC,GACXi/B,EAAU/8B,KAAK0/B,cAAc1qB,EAAIlO,MACrC,IAAKi2B,EACD,MAAM,IAAI71B,MAAM,eAAiB8N,EAAIlO,KAAO,sCAChDi2B,EAAQ/8B,KAAMgV,EAAKurB,EAAMziC,KAM7B2hC,EAAmB//B,UAAU6J,QAAU,SAAkBzC,EAAMN,EAAOzG,GACpE,IAAIsD,EAAOyD,EAAK8L,cAAcpM,EAAOzG,EAASC,KAAK8H,OACnD,OAAKzE,GACLrD,KAAKW,KAAK0C,GACHA,GAFa,MAOtBo8B,EAAmB//B,UAAU8gC,SAAW,SAAmB15B,EAAMN,GAC/DxG,KAAK2/B,MAAMh/B,KAAK,CAACmG,KAAMA,EAAMN,MAAOA,EAAOzG,QAAS,MAKtD0/B,EAAmB//B,UAAU+gC,UAAY,WACnCzgC,KAAK8H,MAAM3H,SAAUH,KAAK8H,MAAQ,IAAKG,MAC3C,IAAIy4B,EAAO1gC,KAAK2/B,MAAMnsB,MACtB,OAAOxT,KAAKuJ,QAAQm3B,EAAK55B,KAAM45B,EAAKl6B,MAAOk6B,EAAK3gC,UA8ElD,IAAI4gC,EAAiB,SAAwB36B,EAAQ46B,EAAWttB,GAI9DtT,KAAKsT,OAASA,EACdtT,KAAKgG,OAASA,EACdhG,KAAK4gC,UAAYA,EACjB5gC,KAAK0/B,cA/DP,SAAuB15B,EAAQsN,GAC7B,IAAIutB,EAAWriC,OAAOY,OAAO,MACzBkS,EAAO,SAAWxK,GACpB,IAAIqE,EAAOmI,EAAOxM,GAClB,GAAIqE,EAAKiV,MAAO,CACd,IAAIhR,EAAWpJ,EAAOoJ,SAASjE,EAAKiV,OAChCyf,EAAa10B,EAAMrE,GACrB+5B,EAAS/5B,GAAQ,SAAUgK,EAAOkE,EAAK1B,EAAQxV,GAC7CgT,EAAM0vB,SAASpxB,EAAU5I,EAAM2E,EAAM6J,EAAK1B,EAAQxV,IAClDgT,EAAMmvB,QAAQH,EAAuB9qB,EAAIjV,UACzC+Q,EAAM2vB,cAGRI,EAAS/5B,EAAO,SAAW,SAAUgK,EAAOkE,EAAK1B,EAAQxV,GAAK,OAAOgT,EAAM0vB,SAASpxB,EAAU5I,EAAM2E,EAAM6J,EAAK1B,EAAQxV,KACvH+iC,EAAS/5B,EAAO,UAAY,SAAUgK,GAAS,OAAOA,EAAM2vB,mBAEzD,GAAIt1B,EAAK9H,KAAM,CACpB,IAAIy9B,EAAa96B,EAAOoJ,SAASjE,EAAK9H,MACtCw9B,EAAS/5B,GAAQ,SAAUgK,EAAOkE,EAAK1B,EAAQxV,GAAK,OAAOgT,EAAMvH,QAAQu3B,EAAYt6B,EAAM2E,EAAM6J,EAAK1B,EAAQxV,UACzG,GAAIqN,EAAK2C,KAAM,CACpB,IAAI4H,EAAW1P,EAAO8B,MAAMqD,EAAK2C,MAC7B+xB,EAAa10B,EAAMrE,GACrB+5B,EAAS/5B,GAAQ,SAAUgK,EAAOkE,EAAK1B,EAAQxV,GAC7CgT,EAAMsvB,SAAS1qB,EAAStW,OAAOoH,EAAM2E,EAAM6J,EAAK1B,EAAQxV,KACxDgT,EAAMmvB,QAAQH,EAAuB9qB,EAAIjV,UACzC+Q,EAAMuvB,UAAU3qB,KAGlBmrB,EAAS/5B,EAAO,SAAW,SAAUgK,EAAOkE,EAAK1B,EAAQxV,GAAK,OAAOgT,EAAMsvB,SAAS1qB,EAAStW,OAAOoH,EAAM2E,EAAM6J,EAAK1B,EAAQxV,MAC7H+iC,EAAS/5B,EAAO,UAAY,SAAUgK,GAAS,OAAOA,EAAMuvB,UAAU3qB,SAEnE,KAAIvK,EAAKyT,OAQd,MAAM,IAAIta,WAAW,6BAA+BgL,KAAKC,UAAUpE,IAP/D00B,EAAa10B,EAAMrE,GACrB+5B,EAAS/5B,GAAQi5B,GAEjBc,EAAS/5B,EAAO,SAAWi5B,EAC3Bc,EAAS/5B,EAAO,UAAYi5B,KAOlC,IAAK,IAAIj5B,KAAQwM,EAAQhC,EAAMxK,GAM/B,OAJA+5B,EAAS19B,KAAO,SAAU2N,EAAOkE,GAAO,OAAOlE,EAAMmvB,QAAQjrB,EAAIjV,UACjE8gC,EAASxtB,OAAS,SAAUvC,EAAOkE,GAAO,OAAOlE,EAAMwvB,YAAYtrB,EAAI+rB,WACvEF,EAASG,UAAYH,EAASG,WAAa,SAAWlwB,GAAS,OAAOA,EAAMmvB,QAAQ,OAE7EY,EAccnB,CAAc15B,EAAQsN,IAc7C,SAAS2tB,EAAY3tB,EAAQxV,GAC3B,OAASA,EAAIwV,EAAOnT,QAChB,GAAsB,kBAAlBmT,EAAOxV,GAAGgJ,KAA4B,OAAOwM,EAAOxV,GAAGojC,OAC/D,OAAO,EAVTP,EAAejhC,UAAUoQ,MAAQ,SAAgB3M,GAC/C,IAAqEsI,EAAjEqF,EAAQ,IAAI2uB,EAAmBz/B,KAAKgG,OAAQhG,KAAK0/B,eACrD5uB,EAAMwvB,YAAYtgC,KAAK4gC,UAAU9wB,MAAM3M,EAAM,KAC7C,GAAKsI,EAAMqF,EAAM2vB,kBAAsB3vB,EAAM6uB,MAAMx/B,QACnD,OAAOsL,GAYT,IAAI01B,EAAwB,IAAIR,EAAe36B,EAAQ,IAAW,aAAc,CAACo7B,MAAM,IAAS,CAC9FloB,WAAY,CAACkH,MAAO,cACpBoe,UAAW,CAACpe,MAAO,aACnB4e,UAAW,CAAC5e,MAAO,aACnBqP,YAAa,CAACrP,MAAO,cAAehI,SAAU,SAAUxQ,EAAG0L,EAAQxV,GAAK,MAAO,CAAEghC,MAAOmC,EAAY3tB,EAAQxV,MAC5G4xB,aAAc,CAACtP,MAAO,eAAgBhI,SAAU,SAAUpD,EAAK1B,EAAQxV,GAAK,MAAO,CACjF+gC,OAAQ7pB,EAAIqsB,QAAQ,UAAY,EAChCvC,MAAOmC,EAAY3tB,EAAQxV,MAE7B4gC,QAAS,CAACte,MAAO,UAAWhI,SAAU,SAAUpD,GAAO,MAAO,CAAEqM,OAAQrM,EAAIqC,IAAI3W,MAAM,MACtFi+B,WAAY,CAACve,MAAO,aAAcyf,cAAc,GAChDyB,MAAO,CAAClhB,MAAO,aAAchI,SAAU,SAAUpD,GAAO,MAAO,CAAE4pB,OAAQ5pB,EAAI0rB,MAAQ,KAASb,cAAc,GAC5GzlB,GAAI,CAAC/W,KAAM,mBACX47B,MAAO,CAAC57B,KAAM,QAAS+U,SAAU,SAAUpD,GAAO,MAAO,CACvDqnB,IAAKrnB,EAAIqsB,QAAQ,OACjBpmB,MAAOjG,EAAIqsB,QAAQ,UAAY,KAC/BnC,IAAKlqB,EAAI+rB,SAAS,IAAM/rB,EAAI+rB,SAAS,GAAGhhC,SAAW,QAErDwhC,UAAW,CAACl+B,KAAM,cAElBg8B,GAAI,CAACvxB,KAAM,MACXwxB,OAAQ,CAACxxB,KAAM,UACfyxB,KAAM,CAACzxB,KAAM,OAAQsK,SAAU,SAAUpD,GAAO,MAAO,CACrDwqB,KAAMxqB,EAAIqsB,QAAQ,QAClBpmB,MAAOjG,EAAIqsB,QAAQ,UAAY,QAEjCG,YAAa,CAAC1zB,KAAM,OAAQ+xB,cAAc,KAKxC4B,EAAqB,SAA4Bl7B,EAAOuB,GAG1D9H,KAAKuG,MAAQA,EAEbvG,KAAK8H,MAAQA,GAMf25B,EAAmB/hC,UAAUgiC,UAAY,SAAoB3hC,EAAS+V,GACpE,IAAIhF,EAAQ,IAAI6wB,EAAwB3hC,KAAKuG,MAAOvG,KAAK8H,MAAOgO,GAEhE,OADAhF,EAAM8wB,cAAc7hC,GACb+Q,EAAML,KAKf,IAAIoxB,EAA4B,IAAIJ,EAAmB,CACrDvoB,WAAY,SAAoBpI,EAAOzN,GACrCyN,EAAMgxB,UAAU,KAAM,KAAMz+B,GAAM,WAAc,OAAOyN,EAAM8wB,cAAcv+B,OAE7Es7B,WAAY,SAAoB7tB,EAAOzN,GACrCyN,EAAMixB,MAAM,OAAS1+B,EAAKmD,MAAMo4B,QAAU,IAAM,MAChD9tB,EAAM3N,KAAKE,EAAKmK,aAAa,GAC7BsD,EAAMkxB,gBACNlxB,EAAMixB,MAAM,OACZjxB,EAAMmxB,WAAW5+B,IAEnBq7B,QAAS,SAAiB5tB,EAAOzN,GAC/ByN,EAAMixB,MAAMjxB,EAAMoxB,OAAO,IAAK7+B,EAAKmD,MAAM6a,OAAS,KAClDvQ,EAAMqxB,aAAa9+B,GACnByN,EAAMmxB,WAAW5+B,IAEnBo7B,gBAAiB,SAAyB3tB,EAAOzN,GAC/CyN,EAAMixB,MAAM1+B,EAAKmD,MAAM47B,QAAU,OACjCtxB,EAAMmxB,WAAW5+B,IAEnBosB,YAAa,SAAqB3e,EAAOzN,GACvCyN,EAAMuxB,WAAWh/B,EAAM,MAAM,WAAc,OAAQA,EAAKmD,MAAM87B,QAAU,KAAO,QAEjF5S,aAAc,SAAsB5e,EAAOzN,GACzC,IAAIV,EAAQU,EAAKmD,MAAMq4B,OAAS,EAC5B0D,EAAOjI,OAAO33B,EAAQU,EAAKlB,WAAa,GAAGhC,OAC3CyiB,EAAQ9R,EAAMoxB,OAAO,IAAKK,EAAO,GACrCzxB,EAAMuxB,WAAWh/B,EAAMuf,GAAO,SAAU9kB,GACtC,IAAI0kC,EAAOlI,OAAO33B,EAAQ7E,GAC1B,OAAOgT,EAAMoxB,OAAO,IAAKK,EAAOC,EAAKriC,QAAUqiC,EAAO,SAG1DxD,UAAW,SAAmBluB,EAAOzN,GACnCyN,EAAM8wB,cAAcv+B,IAEtBm7B,UAAW,SAAmB1tB,EAAOzN,GACnCyN,EAAMqxB,aAAa9+B,GACnByN,EAAMmxB,WAAW5+B,IAGnB47B,MAAO,SAAenuB,EAAOzN,GAC3ByN,EAAMixB,MAAM,KAAOjxB,EAAM2xB,IAAIp/B,EAAKmD,MAAM04B,KAAO,IAAM,KAAOpuB,EAAM2xB,IAAIp/B,EAAKmD,MAAM61B,MACpEh5B,EAAKmD,MAAMyU,MAAQ,IAAMnK,EAAM4xB,MAAMr/B,EAAKmD,MAAMyU,OAAS,IAAM,MAE9EmkB,WAAY,SAAoBtuB,EAAOzN,EAAMd,EAAQ2B,GACnD,IAAK,IAAIpG,EAAIoG,EAAQ,EAAGpG,EAAIyE,EAAOJ,WAAYrE,IAC3C,GAAIyE,EAAOE,MAAM3E,GAAGgJ,MAAQzD,EAAKyD,KAEjC,YADAgK,EAAMixB,MAAM,SAIlB5+B,KAAM,SAAc2N,EAAOzN,GACzByN,EAAM3N,KAAKE,EAAKF,QAEjB,CACDk8B,GAAI,CAACljB,KAAM,IAAKmc,MAAO,IAAKqK,SAAS,EAAMC,0BAA0B,GACrEtD,OAAQ,CAACnjB,KAAM,KAAMmc,MAAO,KAAMqK,SAAS,EAAMC,0BAA0B,GAC3ErD,KAAM,CACJpjB,KAAM,SAAc0mB,EAAQ/0B,EAAMvL,EAAQ2B,GACxC,OAAO4+B,EAAWh1B,EAAMvL,EAAQ2B,EAAO,GAAK,IAAM,KAEpDo0B,MAAO,SAAexnB,EAAOhD,EAAMvL,EAAQ2B,GACzC,OAAO4+B,EAAWh1B,EAAMvL,EAAQ2B,GAAQ,GAAK,IACzC,KAAO4M,EAAM2xB,IAAI30B,EAAKtH,MAAMg5B,OAAS1xB,EAAKtH,MAAMyU,MAAQ,IAAMnK,EAAM4xB,MAAM50B,EAAKtH,MAAMyU,OAAS,IAAM,MAG5GyQ,KAAM,CAACvP,KAAM,SAAc0mB,EAAQE,EAAOxgC,EAAQ2B,GAAS,OAAO8+B,EAAazgC,EAAOE,MAAMyB,IAAS,IAC9Fo0B,MAAO,SAAeuK,EAAQE,EAAOxgC,EAAQ2B,GAAS,OAAO8+B,EAAazgC,EAAOE,MAAMyB,EAAQ,GAAI,IACnG++B,QAAQ,KAGjB,SAASD,EAAa3/B,EAAMioB,GAC1B,IAAmBptB,EAAfglC,EAAQ,MAAUpV,EAAM,EAC5B,GAAIzqB,EAAKC,OAAU,KAAOpF,EAAIglC,EAAMtnB,KAAKvY,EAAKF,OAAS2qB,EAAMlrB,KAAKC,IAAIirB,EAAK5vB,EAAE,GAAGiC,QAEhF,IADA,IAAIwB,EAASmsB,EAAM,GAAKxC,EAAO,EAAI,KAAO,IACjCxtB,EAAI,EAAGA,EAAIgwB,EAAKhwB,IAAO6D,GAAU,IAE1C,OADImsB,EAAM,GAAKxC,EAAO,IAAK3pB,GAAU,KAC9BA,EAGT,SAASmhC,EAAWvD,EAAMh9B,EAAQ2B,EAAOonB,GACvC,GAAIiU,EAAK/4B,MAAMyU,QAAU,QAAQpH,KAAK0rB,EAAK/4B,MAAMg5B,MAAS,OAAO,EACjE,IAAIz/B,EAAUwC,EAAOE,MAAMyB,GAASonB,EAAO,GAAK,EAAI,IACpD,IAAKvrB,EAAQuD,QAAUvD,EAAQoD,MAAQo8B,EAAK/4B,MAAMg5B,MAAQz/B,EAAQ+H,MAAM/H,EAAQ+H,MAAM3H,OAAS,IAAMo/B,EAAQ,OAAO,EACpH,GAAIr7B,IAAUonB,EAAO,EAAI,EAAI/oB,EAAOJ,WAAa,GAAM,OAAO,EAC9D,IAAIkK,EAAO9J,EAAOE,MAAMyB,GAASonB,EAAO,GAAK,EAAI,IACjD,OAAQiU,EAAK73B,QAAQ2E,EAAKvE,OAM5B,IAAI65B,EAA0B,SAAiCp7B,EAAOuB,EAAOgO,GAC3E9V,KAAKuG,MAAQA,EACbvG,KAAK8H,MAAQA,EACb9H,KAAKmjC,MAAQnjC,KAAKyQ,IAAM,GACxBzQ,KAAKojC,QAAS,EACdpjC,KAAKqjC,aAAc,EAOnBrjC,KAAK8V,QAAUA,GAAW,QACY,IAA3B9V,KAAK8V,QAAQwtB,aACpBtjC,KAAK8V,QAAQwtB,YAAa,IAGhC3B,EAAwBjiC,UAAU6jC,WAAa,SAAqB/hC,GAClE,GAAIxB,KAAKojC,OAAQ,CAGf,GAFKpjC,KAAKwjC,YAAaxjC,KAAKyQ,KAAO,MACvB,MAARjP,IAAgBA,EAAO,GACvBA,EAAO,EAAG,CACZ,IAAIiiC,EAAWzjC,KAAKmjC,MAChB3lB,EAAO,OAAO5B,KAAK6nB,GACnBjmB,IAAQimB,EAAWA,EAAS/iC,MAAM,EAAG+iC,EAAStjC,OAASqd,EAAK,GAAGrd,SACnE,IAAK,IAAIrC,EAAI,EAAGA,EAAI0D,EAAM1D,IACtBkC,KAAKyQ,KAAOgzB,EAAW,KAE7BzjC,KAAKojC,QAAS,IASlBzB,EAAwBjiC,UAAUoiC,UAAY,SAAoBqB,EAAOO,EAAYrgC,EAAMjC,GACzF,IAAIuiC,EAAM3jC,KAAKmjC,MACfnjC,KAAK+hC,MAAM2B,GAAcP,GACzBnjC,KAAKmjC,OAASA,EACd/hC,IACApB,KAAKmjC,MAAQQ,EACb3jC,KAAKiiC,WAAW5+B,IAGlBs+B,EAAwBjiC,UAAU8jC,QAAU,WAC1C,MAAO,UAAU3vB,KAAK7T,KAAKyQ,MAK7BkxB,EAAwBjiC,UAAUsiC,cAAgB,WAC3ChiC,KAAKwjC,YAAaxjC,KAAKyQ,KAAO,OAOrCkxB,EAAwBjiC,UAAUqiC,MAAQ,SAAgBhiC,GACxDC,KAAKujC,aACDvjC,KAAKmjC,OAASnjC,KAAKwjC,YACnBxjC,KAAKyQ,KAAOzQ,KAAKmjC,OACjBpjC,IAAWC,KAAKyQ,KAAO1Q,IAK7B4hC,EAAwBjiC,UAAUuiC,WAAa,SAAqB5+B,GAClErD,KAAKojC,OAAS//B,GAMhBs+B,EAAwBjiC,UAAUyD,KAAO,SAAe2T,EAAQmsB,GAE9D,IADA,IAAIW,EAAQ9sB,EAAOvD,MAAM,MAChBzV,EAAI,EAAGA,EAAI8lC,EAAMzjC,OAAQrC,IAAK,CACrC,IAAI+lC,EAAc7jC,KAAKwjC,WAAaxjC,KAAKojC,OACzCpjC,KAAK+hC,QACL/hC,KAAKyQ,MAAkB,IAAXwyB,EAAmBjjC,KAAKyiC,IAAImB,EAAM9lC,GAAI+lC,GAAeD,EAAM9lC,GACnEA,GAAK8lC,EAAMzjC,OAAS,IAAKH,KAAKyQ,KAAO,QAM7CkxB,EAAwBjiC,UAAUokC,OAAS,SAAiBzgC,EAAMd,EAAQ2B,GACxE,GAAqB,iBAAV3B,EAAsB,MAAM,IAAI2E,MAAM,KACjD,IAAKlH,KAAKuG,MAAMlD,EAAKyD,KAAKzI,MAAS,MAAM,IAAI6I,MAAM,eAAiB7D,EAAKyD,KAAKzI,KAAO,wCACrF2B,KAAKuG,MAAMlD,EAAKyD,KAAKzI,MAAM2B,KAAMqD,EAAMd,EAAQ2B,IAKjDy9B,EAAwBjiC,UAAUkiC,cAAgB,SAAwBr/B,GACtE,IAAI0U,EAASjX,KAEfuC,EAAOpB,SAAQ,SAAUkC,EAAMuE,EAAG9J,GAAK,OAAOmZ,EAAO6sB,OAAOzgC,EAAMd,EAAQzE,OAK5E6jC,EAAwBjiC,UAAUyiC,aAAe,SAAuB5/B,GACpE,IAAI0U,EAASjX,KAEXgT,EAAS,GAAI+wB,EAAW,GACxBC,EAAW,SAAU3gC,EAAMuE,EAAG1D,GAChC,IAAI4D,EAAQzE,EAAOA,EAAKyE,MAAQ,GAO5BzE,GAA2B,eAAnBA,EAAKyD,KAAKzI,OAClByJ,EAAQA,EAAMqnB,QAAO,SAAUjxB,GAC/B,GAAIgG,EAAQ,GAAK3B,EAAOJ,WAAc,OAAO,EAC7C,IAAIkK,EAAO9J,EAAOE,MAAMyB,EAAQ,GAChC,OAAOhG,EAAEwJ,QAAQ2E,EAAKvE,UAAYuE,EAAK/I,QAAU,KAAKuQ,KAAKxH,EAAKlJ,WAGpE,IAAI8gC,EAAUF,EAId,GAHAA,EAAW,GAGP1gC,GAAQA,EAAKC,QAAUwE,EAAM0P,MAAK,SAAU1J,GAC9C,IAAI4yB,EAAOzpB,EAAOnP,MAAMgG,EAAKhH,KAAKzI,MAClC,OAAOqiC,GAAQA,EAAKkC,4BAClB,CACF,IAAIh6B,EAAM,qBAAqBgT,KAAKvY,EAAKF,MAEnC+gC,GADMt7B,EAAI,GACHA,EAAI,IACXu7B,EAAUv7B,EAAI,GACdw7B,EAAQx7B,EAAI,GAClBq7B,GAAWC,EACXH,EAAWK,GACPF,GAAQE,MACV/gC,EAAO8gC,EAAU9gC,EAAKQ,SAASsgC,GAAW,QAC7Br8B,EAAQkL,IAIzB,IAAIlO,EAAQgD,EAAM3H,QAAU2H,EAAMA,EAAM3H,OAAS,GAAIkkC,EAAQv/B,IAAkD,IAAzCmS,EAAOnP,MAAMhD,EAAMgC,KAAKzI,MAAM4kC,OAChGnV,EAAMhmB,EAAM3H,QAAUkkC,EAAQ,EAAI,GAMtCnQ,EAAO,IAAK,IAAIp2B,EAAI,EAAGA,EAAIgwB,EAAKhwB,IAAK,CACnC,IAAIgQ,EAAOhG,EAAMhK,GACjB,IAAKmZ,EAAOnP,MAAMgG,EAAKhH,KAAKzI,MAAMskC,QAAW,MAC7C,IAAK,IAAI99B,EAAI,EAAGA,EAAImO,EAAO7S,OAAQ0E,IAAK,CACtC,IAAIpB,EAAQuP,EAAOnO,GACnB,IAAKoS,EAAOnP,MAAMrE,EAAMqD,KAAKzI,MAAMskC,QAAW,MAC9C,GAAI70B,EAAKzJ,GAAGZ,GAAQ,CACd3F,EAAI+G,EACJiD,EAAQA,EAAMpH,MAAM,EAAGmE,GAAG/D,OAAOgN,GAAMhN,OAAOgH,EAAMpH,MAAMmE,EAAG/G,IAAIgD,OAAOgH,EAAMpH,MAAM5C,EAAI,EAAGgwB,IACtFjpB,EAAI/G,IACTgK,EAAQA,EAAMpH,MAAM,EAAG5C,GAAGgD,OAAOgH,EAAMpH,MAAM5C,EAAI,EAAG+G,IAAI/D,OAAOgN,GAAMhN,OAAOgH,EAAMpH,MAAMmE,EAAGipB,KAC/F,SAASoG,IAOf,IADA,IAAInS,EAAO,EACJA,EAAOnf,KAAKE,IAAIkQ,EAAO7S,OAAQ2tB,IAAQhmB,EAAMia,GAAM1d,GAAG2O,EAAO+O,OAAYA,EAGhF,KAAOA,EAAO/O,EAAO7S,QACjB8W,EAAO9T,KAAK8T,EAAOqtB,WAAWtxB,EAAOQ,OAAO,EAAOjR,EAAQ2B,IAAQ,GAMvE,GAHI+/B,GAAWhtB,EAAO9T,KAAK8gC,GAGvB5gC,EAAM,CACR,KAAO2P,EAAO7S,OAAS2tB,GAAK,CAC1B,IAAI5L,EAAMpa,EAAMkL,EAAO7S,QACvB6S,EAAOrS,KAAKuhB,GACZjL,EAAO9T,KAAK8T,EAAOqtB,WAAWpiB,GAAK,EAAM3f,EAAQ2B,IAAQ,GAKvDmgC,GAAShhC,EAAKC,OACd2T,EAAO9T,KAAK8T,EAAOqtB,WAAWx/B,GAAO,EAAMvC,EAAQ2B,GAASb,EAAKF,KACzD8T,EAAOqtB,WAAWx/B,GAAO,EAAOvC,EAAQ2B,EAAQ,IAAI,GAE5D+S,EAAO6sB,OAAOzgC,EAAMd,EAAQ2B,KAGpC3B,EAAOpB,QAAQ6iC,GACfA,EAAS,KAAM,EAAMzhC,EAAOJ,aAQ9Bw/B,EAAwBjiC,UAAU2iC,WAAa,SAAqBh/B,EAAM8/B,EAAOO,GAC7E,IAAIzsB,EAASjX,KAEXA,KAAKojC,QAAUpjC,KAAKojC,OAAOt8B,MAAQzD,EAAKyD,KACxC9G,KAAKujC,WAAW,GACXvjC,KAAKqjC,aACVrjC,KAAKujC,WAAW,GAEpB,IAAIgB,OAAqC,IAApBlhC,EAAKmD,MAAMs4B,MAAuBz7B,EAAKmD,MAAMs4B,MAAQ9+B,KAAK8V,QAAQwtB,WACnFkB,EAAYxkC,KAAKqjC,YACrBrjC,KAAKqjC,YAAckB,EACnBlhC,EAAKlC,SAAQ,SAAUsB,EAAOmF,EAAG9J,GAC3BA,GAAKymC,GAAWttB,EAAOssB,WAAW,GACtCtsB,EAAO6qB,UAAUqB,EAAOO,EAAW5lC,GAAIuF,GAAM,WAAc,OAAO4T,EAAO6sB,OAAOrhC,EAAOY,EAAMvF,SAE/FkC,KAAKqjC,YAAcmB,GAOrB7C,EAAwBjiC,UAAU+iC,IAAM,SAAc71B,EAAKi3B,GAGzD,OAFAj3B,EAAMA,EAAIrE,QAAQ,eAAgB,QAC9Bs7B,IAAej3B,EAAMA,EAAIrE,QAAQ,YAAa,QAAQA,QAAQ,cAAe,UAC1EqE,GAGT+0B,EAAwBjiC,UAAUgjC,MAAQ,SAAgB91B,GACxD,IAAI+O,GAA4B,GAArB/O,EAAIgE,QAAQ,KAAa,MAA4B,GAArBhE,EAAIgE,QAAQ,KAAa,KAAO,KAC3E,OAAO+K,EAAK,GAAK/O,EAAM+O,EAAK,IAK9BgmB,EAAwBjiC,UAAUwiC,OAAS,SAAiBt1B,EAAKrN,GAE/D,IADA,IAAIkR,EAAM,GACD3S,EAAI,EAAGA,EAAIyB,EAAGzB,IAAO2S,GAAO7D,EACrC,OAAO6D,GAKTkxB,EAAwBjiC,UAAU4kC,WAAa,SAAqBx2B,EAAMqO,EAAM5Z,EAAQ2B,GACtF,IAAIw8B,EAAO1gC,KAAK8H,MAAMgG,EAAKhH,KAAKzI,MAC5BU,EAAQod,EAAOukB,EAAKvkB,KAAOukB,EAAKpI,MACpC,MAAuB,iBAATv5B,EAAoBA,EAAQA,EAAMiB,KAAM8N,EAAMvL,EAAQ2B,IAOtEy9B,EAAwBjiC,UAAU+kC,uBAAyB,SAAiCthC,GAC1F,MAAO,CACL8gC,SAAU9gC,EAAKoL,MAAM,WAAa,IAAI,GACtCw1B,UAAW5gC,EAAKoL,MAAM,WAAa,IAAI,M,6BC9tB3C,0JAoEA,SAASm2B,EAAW7U,EAAUrpB,GAC5B,OAAO,SAASsK,EAAOsa,GACrB,IAAIxiB,EAAMkI,EAAMwV,UACZ9d,EAAQI,EAAIJ,MACZC,EAAMG,EAAIH,IACVgkB,EAAQjkB,EAAM+D,WAAW9D,GAAMk8B,GAAS,EAAOC,EAAanY,EAChE,IAAKA,EAAS,OAAO,EAErB,GAAIA,EAAM/jB,OAAS,GAAKF,EAAMnF,KAAKopB,EAAM/jB,MAAQ,GAAG5B,KAAK8C,kBAAkBimB,IAAiC,GAApBpD,EAAMziB,WAAiB,CAE7G,GAAoC,GAAhCxB,EAAMtE,MAAMuoB,EAAM/jB,MAAQ,GAAW,OAAO,EAChD,IAAIm8B,EAAU/zB,EAAMrF,IAAIoB,QAAQ4f,EAAM9pB,MAAQ,GAC9CiiC,EAAa,IAAI,IAAUC,EAASA,EAASpY,EAAM/jB,OAC/C+jB,EAAMxiB,SAAWwiB,EAAMlqB,OAAOJ,aAC9BsqB,EAAQ,IAAI,IAAUjkB,EAAOsI,EAAMrF,IAAIoB,QAAQpE,EAAI/F,IAAI+pB,EAAM/jB,QAAS+jB,EAAM/jB,QAChFi8B,GAAS,EAEX,IAAIhpB,EAAO,YAAaipB,EAAY/U,EAAUrpB,EAAOimB,GACrD,QAAK9Q,IACDyP,GAAYA,EAKpB,SAAsBvH,EAAI4I,EAAOiJ,EAAUoP,EAAYjV,GAErD,IADA,IAAI9vB,EAAU,IAASiE,MACdlG,EAAI43B,EAASv1B,OAAS,EAAGrC,GAAK,EAAGA,IACtCiC,EAAU,IAASwB,KAAKm0B,EAAS53B,GAAGgJ,KAAK1H,OAAOs2B,EAAS53B,GAAG0I,MAAOzG,IAEvE8jB,EAAG6C,KAAK,IAAI,IAAkB+F,EAAM9pB,OAASmiC,EAAa,EAAI,GAAIrY,EAAM/pB,IAAK+pB,EAAM9pB,MAAO8pB,EAAM/pB,IAClE,IAAI,IAAM3C,EAAS,EAAG,GAAI21B,EAASv1B,QAAQ,IAGzE,IADA,IAAIC,EAAQ,EACHsR,EAAM,EAAGA,EAAMgkB,EAASv1B,OAAQuR,IAAagkB,EAAShkB,GAAK5K,MAAQ+oB,IAAYzvB,EAAQsR,EAAM,GAItG,IAHA,IAAIqzB,EAAarP,EAASv1B,OAASC,EAE/B4kC,EAAWvY,EAAM9pB,MAAQ+yB,EAASv1B,QAAU2kC,EAAa,EAAI,GAAIviC,EAASkqB,EAAMlqB,OAC3EqP,EAAM6a,EAAMziB,WAAYqpB,EAAI5G,EAAMxiB,SAAUtG,GAAQ,EAAMiO,EAAMyhB,EAAGzhB,IAAOjO,GAAQ,GACpFA,GAAS,YAASkgB,EAAGpY,IAAKu5B,EAAUD,KACvClhB,EAAGtQ,MAAMyxB,EAAUD,GACnBC,GAAY,EAAID,GAElBC,GAAYziC,EAAOE,MAAMmP,GAAK9P,SAEhC,OAAO+hB,EAzBoBohB,CAAan0B,EAAM+S,GAAI4I,EAAO9Q,EAAMgpB,EAAQ9U,GAAUnH,mBACxE,IA8BX,SAASwc,EAAcpV,GACrB,OAAO,SAAShf,EAAOsa,GACrB,IAAIxiB,EAAMkI,EAAMwV,UACZ9d,EAAQI,EAAIJ,MACZC,EAAMG,EAAIH,IACVpF,EAAOuF,EAAIvF,KACf,GAAKA,GAAQA,EAAKG,SAAYgF,EAAME,MAAQ,IAAMF,EAAMmE,WAAWlE,GAAQ,OAAO,EAClF,IAAI08B,EAAc38B,EAAMnF,MAAM,GAC9B,GAAI8hC,EAAYr+B,MAAQgpB,EAAY,OAAO,EAC3C,GAAiC,GAA7BtnB,EAAMjG,OAAOxC,QAAQyB,MAAagH,EAAMnF,MAAM,GAAGlB,YAAcqG,EAAMoD,YAAY,GAAI,CAIvF,GAAmB,GAAfpD,EAAME,OAAcF,EAAMnF,MAAM,GAAGyD,MAAQgpB,GAC3CtnB,EAAMtE,OAAO,IAAMsE,EAAMnF,MAAM,GAAGlB,WAAa,EAAK,OAAO,EAC/D,GAAIipB,EAAU,CAIZ,IAHA,IAAIzP,EAAO,IAAS3X,MAAOohC,EAAW58B,EAAMtE,OAAO,GAAK,EAG/C9F,EAAIoK,EAAME,OAAS08B,EAAW,EAAI,GAAIhnC,GAAKoK,EAAME,MAAQ,EAAGtK,IACjEud,EAAO,IAASpa,KAAKiH,EAAMnF,KAAKjF,GAAGgG,KAAKuX,IAE5CA,EAAOA,EAAKja,OAAO,IAASH,KAAKuuB,EAASld,kBAC1C,IAAIyyB,EAAOv0B,EAAM+S,GAAGtb,QAAQC,EAAMqD,OAAOu5B,EAAW,MAAQ,GAAI58B,EAAMsD,OAAO,GAAI,IAAI,IAAM6P,EAAMypB,EAAW,EAAI,EAAG,IACnHC,EAAK9e,aAAazV,EAAMwV,UAAUrmB,YAAY6kB,KAAKugB,EAAK55B,IAAIoB,QAAQrE,EAAMhG,KAAO4iC,EAAW,EAAI,MAChGha,EAASia,EAAK3c,kBAEhB,OAAO,EAET,IAAI3M,EAAWtT,EAAIjG,KAAOgG,EAAM9F,MAAQyiC,EAAY72B,eAAe,GAAGsB,YAAc,KAChFiU,EAAK/S,EAAM+S,GAAGuC,OAAO5d,EAAMhG,IAAKiG,EAAIjG,KACpCiQ,EAAQsJ,GAAY,CAAC,KAAM,CAACjV,KAAMiV,IACtC,QAAK,YAAS8H,EAAGpY,IAAKjD,EAAMhG,IAAK,EAAGiQ,KAChC2Y,GAAYA,EAASvH,EAAGtQ,MAAM/K,EAAMhG,IAAK,EAAGiQ,GAAOiW,mBAChD,IAOX,SAAS4c,EAAaxV,GACpB,OAAO,SAAShf,EAAOsa,GACrB,IAAIxiB,EAAMkI,EAAMwV,UACZ9d,EAAQI,EAAIJ,MACZC,EAAMG,EAAIH,IACVgkB,EAAQjkB,EAAM+D,WAAW9D,GAAK,SAAUpF,GAAQ,OAAOA,EAAKlB,YAAckB,EAAKrB,WAAW8E,MAAQgpB,KACtG,QAAKrD,KACArB,IACD5iB,EAAMnF,KAAKopB,EAAM/jB,MAAQ,GAAG5B,MAAQgpB,EAO5C,SAAyBhf,EAAOsa,EAAU0E,EAAUrD,GAClD,IAAI5I,EAAK/S,EAAM+S,GAAInhB,EAAM+pB,EAAM/pB,IAAK6iC,EAAY9Y,EAAMhkB,IAAI/F,IAAI+pB,EAAM/jB,OAChEhG,EAAM6iC,IAGR1hB,EAAG6C,KAAK,IAAI,IAAkBhkB,EAAM,EAAG6iC,EAAW7iC,EAAK6iC,EACzB,IAAI,IAAM,IAAShkC,KAAKuuB,EAAS1wB,OAAO,KAAMqtB,EAAMlqB,OAAO6B,SAAU,EAAG,GAAI,GAAG,IAC7GqoB,EAAQ,IAAI,IAAU5I,EAAGpY,IAAIoB,QAAQ4f,EAAMjkB,MAAMhG,KAAMqhB,EAAGpY,IAAIoB,QAAQ04B,GAAY9Y,EAAM/jB,QAG1F,OADA0iB,EAASvH,EAAG6I,KAAKD,EAAO,YAAWA,IAAQ/D,mBACpC,EAhBM8c,CAAgB10B,EAAOsa,EAAU0E,EAAUrD,GAmB1D,SAAuB3b,EAAOsa,EAAUqB,GAGtC,IAFA,IAAI5I,EAAK/S,EAAM+S,GAAI4hB,EAAOhZ,EAAMlqB,OAEvBC,EAAMiqB,EAAM/pB,IAAK5E,EAAI2uB,EAAMxiB,SAAW,EAAGopB,EAAI5G,EAAMziB,WAAYlM,EAAIu1B,EAAGv1B,IAC7E0E,GAAOijC,EAAKhjC,MAAM3E,GAAGgE,SACrB+hB,EAAGuC,OAAO5jB,EAAM,EAAGA,EAAM,GAE3B,IAAI0G,EAAS2a,EAAGpY,IAAIoB,QAAQ4f,EAAM9pB,OAAQysB,EAAOlmB,EAAOiB,UACpD8a,EAA8B,GAApBwH,EAAMziB,WAAiBkb,EAAQuH,EAAMxiB,UAAYw7B,EAAKtjC,WAChEI,EAAS2G,EAAO7F,MAAM,GAAIqiC,EAAcx8B,EAAOhF,OAAO,GAC1D,IAAK3B,EAAOoI,WAAW+6B,GAAezgB,EAAU,EAAI,GAAIygB,EAAc,EAC/CtW,EAAKrvB,QAAQ2B,OAAOwjB,EAAQ,IAASlhB,MAAQ,IAASzC,KAAKkkC,KAC9E,OAAO,EACX,IAAI9iC,EAAQuG,EAAO1G,IAAKE,EAAMC,EAAQysB,EAAKttB,SAS3C,OALA+hB,EAAG6C,KAAK,IAAI,IAAkB/jB,GAASsiB,EAAU,EAAI,GAAIviB,GAAOwiB,EAAQ,EAAI,GAAIviB,EAAQ,EAAGD,EAAM,EACnE,IAAI,KAAOuiB,EAAU,IAASjhB,MAAQ,IAASzC,KAAKkkC,EAAKrhC,KAAK,IAASJ,SAC5DtC,OAAOwjB,EAAQ,IAASlhB,MAAQ,IAASzC,KAAKkkC,EAAKrhC,KAAK,IAASJ,SAClEihB,EAAU,EAAI,EAAGC,EAAQ,EAAI,GAAID,EAAU,EAAI,IACvFmG,EAASvH,EAAG6E,mBACL,EAvCMid,CAAc70B,EAAOsa,EAAUqB,MA6C9C,SAASmZ,EAAa9V,GACpB,OAAO,SAAShf,EAAOsa,GACrB,IAAIxiB,EAAMkI,EAAMwV,UACZ9d,EAAQI,EAAIJ,MACZC,EAAMG,EAAIH,IACVgkB,EAAQjkB,EAAM+D,WAAW9D,GAAK,SAAUpF,GAAQ,OAAOA,EAAKlB,YAAckB,EAAKrB,WAAW8E,MAAQgpB,KACtG,IAAKrD,EAAS,OAAO,EACrB,IAAIziB,EAAayiB,EAAMziB,WACvB,GAAkB,GAAdA,EAAmB,OAAO,EAC9B,IAAIzH,EAASkqB,EAAMlqB,OAAQ6H,EAAa7H,EAAOE,MAAMuH,EAAa,GAClE,GAAII,EAAWtD,MAAQgpB,EAAY,OAAO,EAE1C,GAAI1E,EAAU,CACZ,IAAIya,EAAez7B,EAAWlI,WAAakI,EAAWlI,UAAU4E,MAAQvE,EAAOuE,KAC3EhC,EAAQ,IAASvD,KAAKskC,EAAe/V,EAAS1wB,SAAW,MACzDsB,EAAQ,IAAI,IAAM,IAASa,KAAKuuB,EAAS1wB,OAAO,KAAM,IAASmC,KAAKgB,EAAOuE,KAAK1H,OAAO,KAAM0F,MAC3E+gC,EAAe,EAAI,EAAG,GACxCh6B,EAAS4gB,EAAM9pB,MAAOmJ,EAAQ2gB,EAAM/pB,IACxC0oB,EAASta,EAAM+S,GAAG6C,KAAK,IAAI,IAAkB7a,GAAUg6B,EAAe,EAAI,GAAI/5B,EACjCD,EAAQC,EAAOpL,EAAO,GAAG,IAC5DgoB,kBAEZ,OAAO,K,cC7OX7qB,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,8B,6ICKfC,E,0GACnBC,OAAA,SAAOC,GACL,YAAMD,OAAN,UAAaC,GAEbnmC,KAAK8Q,MAAQ9Q,KAAKwG,MAAMsK,MACxB9Q,KAAK8Q,MAAMs1B,QAAQpmC,KAAKwG,MAAMM,KAAM9G,KAAKwG,MAAM6/B,QAASrmC,KAAKsmC,eAAehnC,KAAKU,Q,EAGnFguB,KAAA,WACE,OACE,EAAC,IAAD,CAAS7qB,KAAMojC,IAAYvmC,KAAKwG,MAAMggC,UACpC,YAAQC,UAAU,iDAAiDC,QAAS1mC,KAAK2mC,MAAMrnC,KAAKU,MAAO4mC,UAAW5mC,KAAK6mC,QAAQvnC,KAAKU,OAC7H8mC,IAAK9mC,KAAKwG,MAAMsgC,S,EAMzBD,QAAA,SAAQxT,GACQ,MAAVA,EAAEh0B,KAAyB,UAAVg0B,EAAEh0B,KACrBW,KAAK2mC,MAAMtT,I,EAIfsT,MAAA,SAAMtT,GAEJ,OADAA,EAAE0T,iBACK/mC,KAAK8Q,MAAMssB,IAAIp9B,KAAKwG,MAAMM,O,EAGnCmU,MAAA,WAGE,OAFc+rB,IAAIC,WAAWC,MAAf,qCAA0DlnC,KAAKwG,MAAMM,KAArE,a,EAKhBw/B,eAAA,a,GAnCyCa,M,cCL3CtpC,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,6B,6BCArB,SAASoB,IAetB,OAdAA,EAAW5oC,OAAOg9B,QAAU,SAAUzxB,GACpC,IAAK,IAAIjM,EAAI,EAAGA,EAAIiwB,UAAU5tB,OAAQrC,IAAK,CACzC,IAAI68B,EAAS5M,UAAUjwB,GAEvB,IAAK,IAAIuB,KAAOs7B,EACVn8B,OAAOkB,UAAUC,eAAe1B,KAAK08B,EAAQt7B,KAC/C0K,EAAO1K,GAAOs7B,EAAOt7B,IAK3B,OAAO0K,IAGO+e,MAAM9oB,KAAM+tB,WAf9B,mC;;;;;MC0HA,SAASsZ,EAAeC,GACtB,OAAOhhB,GAhBT,SAAoC7B,EAAM6iB,GACxC,IAAK,IAAIxpC,EAAI2mB,EAAK/b,MAAO5K,EAAI,EAAGA,GAAK,EAAG,CACtC,MAAMuF,EAAOohB,EAAKphB,KAAKvF,GAEvB,GAAIwpC,EAAUjkC,GACZ,MAAO,CACLb,IAAK1E,EAAI,EAAI2mB,EAAK5Y,OAAO/N,GAAK,EAC9B6E,MAAO8hB,EAAK9hB,MAAM7E,GAClB4K,MAAO5K,EACPuF,SAOckkC,CAA2BjhB,EAAU9d,MAAO8+B,GAOlE,SAASE,EAAuBp4B,GAE9B,OAAO,SAAUkX,GACf,GAPJ,SAAyBA,GACvB,OAAOA,aAAqB,IAMtBmhB,CAAgBnhB,GAAY,CAC9B,MAAM,KACJjjB,GACEijB,GACE,MACJ9d,GACE8d,EAEJ,GA5EN,SAAuBlX,EAAU/L,GAC/B,OAAO4C,MAAMC,QAAQkJ,IAAaA,EAASwB,QAAQvN,EAAKyD,OAAS,GAAKzD,EAAKyD,OAASsI,EA2E5Es4B,CAAct4B,EAAU/L,GAC1B,MAAO,CACLA,OACAb,IAAKgG,EAAMhG,IACXkG,MAAOF,EAAME,SAOvB,SAASi/B,EAAa72B,EAAOhK,GAC3B,MAAM,KACJvF,EAAI,GACJc,GACEyO,EAAMwV,UACV,IAAIxe,EAAQ,GACZgJ,EAAMrF,IAAIrJ,aAAab,EAAMc,EAAIgB,IAC/ByE,EAAQ,IAAIA,KAAUzE,EAAKyE,SAE7B,MAAMgG,EAAOhG,EAAM5H,KAAK0nC,GAAYA,EAAS9gC,KAAKzI,OAASyI,EAAKzI,MAEhE,OAAIyP,EACKA,EAAKtH,MAGP,GAGT,SAASqhC,EAAapjB,EAAO,KAAM3d,EAAO,MACxC,IAAK2d,IAAS3d,EACZ,OAAO,EAGT,MAAMnE,EAAQ8hB,EAAKliB,OAAO0L,WAAWwW,EAAKhb,cAE1C,IAAK9G,EAAMU,KACT,OAAO,EAGT,MAAMk8B,EAAO58B,EAAMU,KAAKyE,MAAM5H,KAAK4N,GAAQA,EAAKhH,OAASA,GAEzD,IAAKy4B,EACH,OAAO,EAGT,IAAIv1B,EAAaya,EAAKvgB,QAClByJ,EAAW8W,EAAK9hB,QAAUA,EAAM+D,OAChCuD,EAAWD,EAAa,EACxB89B,EAASn6B,EAAWhL,EAAMU,KAAKvB,SAEnC,KAAOkI,EAAa,GAAKu1B,EAAK73B,QAAQ+c,EAAKliB,OAAOE,MAAMuH,EAAa,GAAGlC,QACtEkC,GAAc,EACd2D,GAAY8W,EAAKliB,OAAOE,MAAMuH,GAAYlI,SAG5C,KAAOmI,EAAWwa,EAAKliB,OAAOJ,YAAco9B,EAAK73B,QAAQ+c,EAAKliB,OAAOE,MAAMwH,GAAUnC,QACnFggC,GAAUrjB,EAAKliB,OAAOE,MAAMwH,GAAUnI,SACtCmI,GAAY,EAGd,MAAO,CACL1I,KAAMoM,EACNtL,GAAIylC,GAsBR,SAASC,EAAaj3B,EAAOhK,GAC3B,MAAM,KACJvF,EAAI,MACJiH,EAAK,GACLnG,EAAE,MACF2B,GACE8M,EAAMwV,UAEV,OAAItiB,IACO8C,EAAKY,QAAQoJ,EAAMyW,aAAe/e,EAAMV,WAG1CgJ,EAAMrF,IAAI0C,aAAa5M,EAAMc,EAAIyE,GAU5C,SAASkhC,EAAal3B,EAAOhK,EAAMN,EAAQ,IACzC,MAEMnD,EAAOmkC,EAAuB1gC,EAAvB0gC,CAA6B12B,EAAMwV,YAAc+gB,EAF5ChkC,GAAQA,EAAKyD,OAASA,EAEsBugC,CAA0Bv2B,EAAMwV,WAE9F,OAAK9nB,OAAO0sB,KAAK1kB,GAAOrG,QAAWkD,EAI5BA,EAAKA,KAAKuK,UAAU9G,EAAM,IAAKzD,EAAKA,KAAKmD,SAC3CA,MAJMnD,I,iFC3PQ4kC,E,wFACZnzB,UAAP,SAAiBtO,GACfA,EAAM6/B,QAAUnZ,YAAW1mB,EAAMsH,O,YAGnCw4B,eAAA,WACEtmC,KAAKkoC,IAAIC,YAAY,WAAYnoC,KAAK8Q,MAAMs3B,WAAWpoC,KAAKwG,MAAMsH,Q,SAN9Bm4B,I,iGCyFxC,IA5FO,IAAIz2B,EAAO,CAChB64B,EAAG,YACHC,EAAG,MACHC,GAAI,QACJC,GAAI,UACJC,GAAI,QACJC,GAAI,QACJC,GAAI,UACJC,GAAI,MACJC,GAAI,WACJC,GAAI,SACJC,GAAI,IACJC,GAAI,SACJC,GAAI,WACJC,GAAI,MACJC,GAAI,OACJC,GAAI,YACJC,GAAI,UACJC,GAAI,aACJC,GAAI,YACJC,GAAI,cACJC,GAAI,SACJC,GAAI,SACJC,GAAI,IACJC,GAAI,IACJC,GAAI,OACJC,GAAI,OACJC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,UACLC,IAAK,aACLC,IAAK,QACLC,IAAK,QACLC,IAAK,UACLC,IAAK,UACLC,IAAK,MACLC,IAAK,MACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,KACLC,IAAK,IACLC,IAAK,IACLC,IAAK,KAGIv4B,EAAQ,CACjBw4B,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJC,GAAI,IACJxC,GAAI,IACJC,GAAI,IACJiB,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,KAGHW,EAA6B,oBAAb7d,WAA4B,gBAAgB3S,KAAK2S,UAAU8d,WAC3EC,EAA6B,oBAAb/d,WAA4B,iBAAiB1a,KAAK0a,UAAUge,QAC5EC,EAA4B,oBAAbje,WAA4B,aAAa1a,KAAK0a,UAAU8d,WACvEI,EAA0B,oBAAble,WAA4B,MAAM1a,KAAK0a,UAAUC,UAC9Dke,EAAyB,oBAAbne,WAA4B,gDAAgD3S,KAAK2S,UAAU8d,WACvGM,EAAsBP,IAAWK,IAAQL,EAAO,GAAK,KAAOI,GAASC,EAGhE3uC,EAAI,EAAGA,EAAI,GAAIA,IAAK0R,EAAK,GAAK1R,GAAK0R,EAAK,GAAK1R,GAAKw8B,OAAOx8B,GAGlE,IAASA,EAAI,EAAGA,GAAK,GAAIA,IAAK0R,EAAK1R,EAAI,KAAO,IAAMA,EAGpD,IAASA,EAAI,GAAIA,GAAK,GAAIA,IACxB0R,EAAK1R,GAAKw8B,OAAOC,aAAaz8B,EAAI,IAClCoV,EAAMpV,GAAKw8B,OAAOC,aAAaz8B,GAIjC,IAAK,IAAI4tB,KAAQlc,EAAW0D,EAAMvT,eAAe+rB,KAAOxY,EAAMwY,GAAQlc,EAAKkc,I,WCnGvE,EAA0B,oBAAb6C,WAA2B,MAAM1a,KAAK0a,UAAUC,UAEjE,SAASoe,EAAiBvuC,GACxB,IAEI6gC,EAAK2N,EAAM35B,EAAOuU,EAFlB7G,EAAQviB,EAAKkV,MAAM,UAAW5R,EAASif,EAAMA,EAAMzgB,OAAS,GAClD,SAAVwB,IAAqBA,EAAS,KAElC,IAAK,IAAI7D,EAAI,EAAGA,EAAI8iB,EAAMzgB,OAAS,EAAGrC,IAAK,CACzC,IAAIgvC,EAAMlsB,EAAM9iB,GAChB,GAAI,kBAAkB+V,KAAKi5B,GAAQrlB,GAAO,OACrC,GAAI,YAAY5T,KAAKi5B,GAAQ5N,GAAM,OACnC,GAAI,sBAAsBrrB,KAAKi5B,GAAQD,GAAO,OAC9C,GAAI,cAAch5B,KAAKi5B,GAAQ55B,GAAQ,MACvC,KAAI,SAASW,KAAKi5B,GAChB,MAAM,IAAI5lC,MAAM,+BAAiC4lC,GADrB,EAAOrlB,GAAO,EAAeolB,GAAO,GAOzE,OAJI3N,IAAOv9B,EAAS,OAASA,GACzBkrC,IAAQlrC,EAAS,QAAUA,GAC3B8lB,IAAQ9lB,EAAS,QAAUA,GAC3BuR,IAASvR,EAAS,SAAWA,GAC1BA,EAST,SAASorC,EAAU1uC,EAAM2uC,EAAO95B,GAK9B,OAJI85B,EAAMC,SAAU5uC,EAAO,OAASA,GAChC2uC,EAAME,UAAW7uC,EAAO,QAAUA,GAClC2uC,EAAMG,UAAW9uC,EAAO,QAAUA,IACxB,IAAV6U,GAAmB85B,EAAMI,WAAY/uC,EAAO,SAAWA,GACpDA,EAiCT,SAASgvC,EAAOC,GACd,OAAO,IAAI,IAAO,CAACziB,MAAO,CAAC0iB,cAAeC,EAAeF,MAO3D,SAASE,EAAeF,GACtB,IAAIhsC,EArDN,SAAmBA,GACjB,IAAI8C,EAAO5F,OAAOY,OAAO,MACzB,IAAK,IAAIwC,KAAQN,EAAO8C,EAAKwoC,EAAiBhrC,IAASN,EAAIM,GAC3D,OAAOwC,EAkDGqpC,CAAUH,GACpB,OAAO,SAAStf,EAAMgf,GACpB,IAAqEU,EAAjErvC,EDwBD,SAAiB2uC,GAGtB,IAEI3uC,IAFYsuC,IAAwBK,EAAME,SAAWF,EAAMC,QAAUD,EAAMG,WAC5Eb,GAAUI,IAAOM,EAAMI,UAAYJ,EAAM3tC,KAA2B,GAApB2tC,EAAM3tC,IAAIc,SACnC6sC,EAAM3tC,MAC7B2tC,EAAMI,SAAWl6B,EAAQ1D,GAAMw9B,EAAMW,UACtCX,EAAM3tC,KAAO,eASf,MAPY,OAARhB,IAAeA,EAAO,UACd,OAARA,IAAeA,EAAO,UAEd,QAARA,IAAgBA,EAAO,aACf,MAARA,IAAcA,EAAO,WACb,SAARA,IAAiBA,EAAO,cAChB,QAARA,IAAgBA,EAAO,aACpBA,ECxCMuvC,CAAQZ,GAAQa,EAAwB,GAAfxvC,EAAK8B,QAAuB,KAAR9B,EACpDyvC,EAASxsC,EAAIyrC,EAAU1uC,EAAM2uC,GAAQa,IACzC,GAAIC,GAAUA,EAAO9f,EAAKld,MAAOkd,EAAK5C,SAAU4C,GAAS,OAAO,EAChE,GAAI6f,IAAWb,EAAMI,UAAYJ,EAAMC,QAAUD,EAAMG,SAAW9uC,EAAKia,WAAW,GAAK,OAClFo1B,EAAWl+B,EAAKw9B,EAAMW,WAAaD,GAAYrvC,EAAM,CAKxD,IAAI0vC,EAAWzsC,EAAIyrC,EAAUW,EAAUV,GAAO,IAC9C,GAAIe,GAAYA,EAAS/f,EAAKld,MAAOkd,EAAK5C,SAAU4C,GAAS,OAAO,OAC/D,GAAI6f,GAAUb,EAAMI,SAAU,CAGnC,IAAIY,EAAY1sC,EAAIyrC,EAAU1uC,EAAM2uC,GAAO,IAC3C,GAAIgB,GAAaA,EAAUhgB,EAAKld,MAAOkd,EAAK5C,SAAU4C,GAAS,OAAO,EAExE,OAAO,K,cCnGXnwB,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,0B,cCApCnoC,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,wB,cCApCnoC,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,6B,cCApCnoC,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,wB,cCApCnoC,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,+B,kFCEfiI,E,0GACnBxH,UAAA,WACE,MAAO,6B,EAGTxrB,MAAA,WACE,OAAOjb,KAAKwG,MAAMyU,O,EAGpBizB,SAAA,SAAS/H,GACP,YAAM+H,SAAN,UAAe/H,GAEfnmC,KAAKkoC,EAAE,kBAAkBiG,GAAG,SAAS,WACnCnH,IAAIoH,MAAM9V,Y,EAIdv4B,QAAA,WACE,IAAMsuC,EAAWruC,KAAKwG,MAAM6nC,SAAWruC,KAAKwG,MAAM6nC,SAAS/uC,KAAKU,MAAQ,aACxE,OACE,SAAKymC,UAAU,cACb,UAAMA,UAAU,OAAO4H,SAAUA,GAC9BruC,KAAKwG,MAAM8nC,gB,UAtBuBC,I,sKCKxBC,E,iFACZ15B,UAAP,SAAiBtO,GACfA,EAAMioC,gBAAkB,yD,2BAG1BvI,OAAA,SAAOC,GACL,YAAMD,OAAN,UAAaC,GAEbnmC,KAAK8Q,MAAQ9Q,KAAKwG,MAAMsK,O,EAG1Bo9B,SAAA,SAAS/H,GAAO,WACd,YAAM+H,SAAN,UAAe/H,GAEfnmC,KAAKkoC,IAAIiG,GAAG,SAAS,SAAC9a,GAChB6U,EAAE,QAAQwG,GAAG,oBAGf1H,IAAIoH,MAAMO,KAAKV,IAAiB,CAC9BhzB,MAAO,EAAKzU,MAAMggC,QAClB8H,aAAc,EAAKhlB,SAASslB,UAC5BP,SAAU,EAAKA,SAAS/uC,KAAK,KAE/B+zB,EAAEwb,sBAIN7uC,KAAKkoC,IAAIiG,GAAG,qBAAqB,WAC/B,EAAKjG,EAAE,kBAAkBhoC,KAAK,2BAA2ByD,QAAQmrC,QAAQC,a,EAI7EC,iBAAA,SAAiBjO,GACf,OACE,EAAC,IAAD,CAAS59B,KAAMnD,KAAKwG,MAAMggC,SACxB,cAAOM,IAAK9mC,KAAKwG,MAAMsgC,S,EAK7BmI,QAAA,SAAQC,GACN,OACE,QAAIzI,UAAW,4CACb,UAAMA,UAAU,OAAO4H,SAAUruC,KAAKquC,SAAS/uC,KAAKU,OACjDA,KAAKspB,SAASslB,a,EAMvBtlB,OAAA,WACE,IAAM4lB,EAAQ,IAAIC,IASlB,OAPAD,EAAMhtB,IACJ,SACA,EAAC,IAAD,CAAQpb,KAAK,SAAS2/B,UAAU,0BAC7BO,IAAIC,WAAWC,MAAM,qDAInBgI,G,EAGTb,SAAA,SAAShb,GAEP2T,IAAIoH,MAAM9V,QACVjF,EAAE0T,iBACFmB,EAAE,QAAQkH,QAAQ,SAClBpvC,KAAK0K,OAAO2oB,GACZ2T,IAAIqI,SAASC,OAAOR,S,EAGtBpkC,OAAA,SAAO2oB,K,GAxEiCkc,M,cCP1C1xC,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,kB,yFCGfwJ,E,0GACnBtJ,OAAA,SAAOC,GAAO,WACZA,EAAM3/B,MAAM6/B,QAAU,SAACv1B,EAAOsa,GAC5B,OAAOwE,YAAWuW,EAAM3/B,MAAMqpB,SAAU,EAAK7c,OAASlC,EAAM9K,OAAOO,MAAMy4B,eAAY3+B,EAA9EuvB,CAAyF9e,EAAOsa,IAGzG,YAAM8a,OAAN,UAAaC,I,EAGfG,eAAA,WACEtmC,KAAKgT,SAAWhT,KAAK8Q,MAAM2+B,WAAWzvC,KAAKwG,MAAMqpB,UACjD7vB,KAAKkoC,IAAIC,YAAY,SAAUnoC,KAAKgT,S,GAXAizB,M,cCHxCpoC,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,iC,kFCUpC,SAAS0J,EAAyB1mB,GAEhC,OAAIA,EAAO7M,gBAAgB4O,UAAY/B,EAAOsP,iBAAiBvN,UAE7D4kB,MAAM,6CAA8C,4DAA6D3mB,GAC1GA,GAGT,eACKA,EADL,CAEE7M,KAFF,SAEOvU,EAAGkG,GAEN,OADeA,EAAKtH,MAAM47B,QACTpZ,EAAO7M,MAE1Bmc,MANF,SAMQ1wB,EAAGkG,GACP,IAAIs0B,EAASt0B,EAAKtH,MAAM47B,OAGxB,OADAA,EAAS,cAAcvuB,KAAKuuB,GAAUA,EAAO75B,QAAQ,KAAM,MAAQ65B,IAClDpZ,EAAOsP,SAK9BqJ,IAAwBjiC,UAAU+iC,IAAM,SAAU71B,EAAKi3B,GAGrD,OAFAj3B,EAAMA,EAAIrE,QAAQ,WAAY,QAC1Bs7B,IAAaj3B,EAAMA,EAAIrE,QAAQ,YAAa,QAAQA,QAAQ,cAAe,UACxEqE,G,IAGYgjC,E,WACnB,WAAY5pC,GACVhG,KAAKgG,OAASA,E,2BAGhB6pC,WAAA,WACE,sBACKhO,IAA0Bt7B,MAD/B,CAGEupC,QAHF,SAGUh/B,EAAOzN,GACbyN,EAAMgxB,UAAU,MAAO,KAAMz+B,GAAM,kBAAMyN,EAAM8wB,cAAcv+B,OAG/D0sC,WAPF,SAOaj/B,EAAOzN,GAChByN,EAAMixB,MAAM,QACZjxB,EAAM3N,KAAKE,EAAKmK,aAAa,GAC7BsD,EAAMkxB,gBACNlxB,EAAMixB,MAAM,MACZjxB,EAAMmxB,WAAW5+B,IAInBm7B,UAhBF,SAgBY1tB,EAAOzN,GACW,IAAtBA,EAAKtD,QAAQyB,KACfsP,EAAMixB,MAAM,MAEZF,IAA0Bt7B,MAAMi4B,UAAU1tB,EAAOzN,IAKrD+7B,WAzBF,SAyBatuB,EAAOzN,EAAMd,EAAQ2B,GAC9B,IAAK,IAAIpG,EAAIoG,EAAQ,EAAGpG,EAAIyE,EAAOJ,WAAYrE,IAC7C,GAAIyE,EAAOE,MAAM3E,GAAGgJ,MAAQzD,EAAKyD,KAE/B,YADAgK,EAAMixB,MAAM,U,EAOtBiO,WAAA,WACE,sBACKnO,IAA0B/5B,MAD/B,CAGEmoC,eAAgBP,EAAyB,CACvCvzB,KAAM,KACNmc,MAAO,KACPqK,SAAS,EACTC,0BAA0B,IAG5BsN,OAAQR,EAAyB,CAC/BvzB,KAAM,KACNmc,MAAO,KACPqK,SAAS,EACTC,0BAA0B,IAG5Bj5B,IAAK+lC,EAAyB,CAC5BvzB,KAAM,IACNmc,MAAO,IACPqK,SAAS,EACTC,0BAA0B,IAG5BuN,IAAKT,EAAyB,CAC5BvzB,KAAM,IACNmc,MAAO,IACPqK,SAAS,EACTC,0BAA0B,IAG5BwN,YAAa,eACRV,EAAyB,CAC1BvzB,KAAM,IACNmc,MAAO,IACPqK,SAAS,EACTC,0BAA0B,IALnB,CAOTK,QAAQ,O,EAKdoN,MAAA,WACE,OAAO,IAAI5O,IAAmBzhC,KAAK6vC,aAAc7vC,KAAKgwC,e,mCC1H1DnyC,EAAOD,QAAU,EAAQ,K,yFCMzB,SAAS0yC,IAA+B,2BAANp5B,EAAM,yBAANA,EAAM,gBACtC,MAAO,CACLwK,MADK,WAEH,MAAO,CAACxK,EAAK,GAAI,IAEnBuB,SAAUvB,EAAK5V,KAAI,SAAC+V,GAAD,MAAU,CAAEA,IAAKA,OAIxC,IAAMk5B,EAAkB,CACtBxwC,QAAS,SACToV,MAAO,QACP3O,MAAO,CAAE2V,KAAM,CAAEzH,SAAS,IAC1B+D,SAAU,CACR,CACEpB,IAAK,YAGTqK,MATsB,SAShBre,GACJ,IAAMmD,EAAQ,CAAEgqC,MAAO,WAIvB,OAFIntC,EAAKmD,MAAM2V,OAAM3V,EAAM2V,MAAO,GAE3B,CAAC,UAAW3V,EAAO,KAIxBiqC,EAAoB,CACxB1wC,QAAS,QACT2rB,MAAM,EACNvW,MAAO,QACPsD,SAAU,CACR,CACEpB,IAAK,QAGTqK,MATwB,SASlBre,GACJ,MAAO,CAAC,MAAO,CAAEmtC,MAAO,QAAU,CAAC,OAAQ,MAI1BE,E,oDACnBb,WAAA,WACE,OACE7pC,IAAOmF,KAAK5E,MAETjG,OACC,eACA9B,OAAA,IAAAA,CAAc,GAAIwH,IAAOmF,KAAK5E,MAAM5H,IAAI,gBAAiB,CAAE6H,MAAO,CAAEq4B,MAAO,CAAEnqB,QAAS,GAAKoqB,MAAO,CAAEpqB,SAAS,OAE9GpU,OAAO,cAAe9B,OAAA,IAAAA,CAAc,GAAIwH,IAAOmF,KAAK5E,MAAM5H,IAAI,eAAgB,CAAE6H,MAAO,CAAEs4B,MAAO,CAAEpqB,SAAS,OAC3G1T,UAAU,aAAc,UAAWuvC,GACnCvvC,UAAU,aAAc,aAAcyvC,I,EAI7CT,WAAA,WACE,OAAOhqC,IAAOmF,KAAKrD,MAChB9G,UAAU,SAAU,SAAUsvC,EAAsB,MAAO,IAAK,WAChEtvC,UAAU,SAAU,MAAOsvC,EAAsB,QACjDtvC,UAAU,SAAU,MAAOsvC,EAAsB,QACjDtvC,UAAU,SAAU,iBAAkB,CACrCwF,MAAO,CAAE2V,KAAM,CAAEzH,SAAS,IAC1B+D,SAAU,CACR,CACEpB,IAAK,YAGTqK,MAPqC,SAO/Bre,GACJ,MAAO,CAAC,UAAW,MAGtBrC,UAAU,SAAU,cAAe,CAClCyX,SAAU,CACR,CACEpB,IAAK,SAGTqK,MANkC,SAM5Bre,GACJ,MAAO,CAAC,OAAQ,IAElBkE,SAAU,O,EAIhB8oC,MAAA,WACE,OAAO,IAAIM,IAAO,CAChBpqC,MAAOvG,KAAK6vC,aACZ/nC,MAAO9H,KAAKgwC,gB,oBCjGlBnyC,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,qB,2ICMf4K,E,0GACnB1K,OAAA,SAAOC,GAAO,WACZ,YAAMD,OAAN,UAAaC,GAEbnmC,KAAK8Q,MAAQ9Q,KAAKwG,MAAMsK,MACxB9Q,KAAK8Q,MAAMs1B,QACTpmC,KAAKwG,MAAMM,MACX,SAACgK,EAAOsa,GACN,OAAO,EAAKib,QAAQv1B,EAAOsa,KAE7BprB,KAAKsmC,eAAehnC,KAAKU,Q,EAI7BkuC,SAAA,SAAS/H,GAAO,WACd,YAAM+H,SAAN,UAAe/H,GAEfnmC,KAAKkoC,IAAIiG,GAAG,SAAS,SAAC9a,GAChB6U,EAAE,QAAQwG,GAAG,oBAGf1H,IAAIoH,MAAMO,KAAKV,IAAiB,CAC9BhzB,MAAO,EAAKzU,MAAMggC,QAClB8H,aAAc,EAAKuC,uBAErBxd,EAAEwb,sBAIN7uC,KAAKsmC,kB,EAGPwK,UAAA,SAAU/P,GACR,OACE,YAAQ0F,UAAU,uFAAuFsK,cAAY,YACnH,EAAC,IAAD,CAAS5tC,KAAMnD,KAAKwG,MAAMggC,SACxB,kB,EAMRqK,mBAAA,WAAqB,WACnB,OAAO7wC,KAAKwG,MAAMsP,QACfqZ,QAAO,SAACvnB,EAAG9J,GAAJ,OAAUA,IAAM,EAAKkzC,eAC5B1vC,KAAI,SAACuf,GAAD,OACH,EAAC,IAAD,CAAS1d,KAAMojC,IAAY1lB,EAAO2lB,SAAUnnC,IAAKwhB,EAAO5F,OACtD,YACEwrB,UAAU,kDACVC,QAAS,EAAKC,MAAMrnC,KAAK,EAAMuhB,EAAO/Z,KAAM+Z,EAAOra,OACnDogC,UAAW,EAAKC,QAAQvnC,KAAK,EAAMuhB,EAAO/Z,KAAM+Z,EAAOra,QAEtDqa,EAAO5F,Y,EAMlBg0B,QAAA,SAAQC,GACN,OAAO,QAAIzI,UAAW,oDAAqDzmC,KAAK6wC,uB,EAGlFhK,QAAA,SAAQ//B,EAAMN,EAAO6sB,GACL,MAAVA,EAAEh0B,KAAyB,UAAVg0B,EAAEh0B,KACrBW,KAAK2mC,MAAM7/B,EAAMN,EAAO6sB,I,EAI5BsT,MAAA,SAAM7/B,EAAMN,EAAO6sB,GAKjB,OAHA2T,IAAIoH,MAAM9V,QACVjF,EAAE0T,iBACF/mC,KAAKqmC,QAAUrZ,YAAalmB,EAAMN,GAC3BxG,KAAK8Q,MAAMssB,IAAIp9B,KAAKwG,MAAMM,O,EAGnCw/B,eAAA,WAAiB,WACVtmC,KAAKixC,SAEVjxC,KAAKwG,MAAMsP,QAAQ3U,SAAQ,SAAC0f,EAAQ/iB,GAC9B,EAAKgT,MAAM2+B,WAAW5uB,EAAO/Z,KAAM+Z,EAAOra,SAC5C,EAAKyqC,QAAQlQ,SAAS,GAAGA,SAAS,GAAGmQ,UAAYrwB,EAAO5F,MACxD,EAAK+1B,YAAclzC,O,GAlFmByxC,M,4GCFzB4B,E,0GACnBjL,OAAA,SAAOC,GACL,YAAMD,OAAN,UAAaC,GAEbnmC,KAAKq8B,IAAM+U,IAAO,IAClBpxC,KAAKib,MAAQm2B,IAAO,K,EAGtB9nB,OAAA,WACE,IAAM4lB,EAAQ,EAAH,UAAS5lB,OAAT,WA8BX,OA5BA4lB,EAAMhtB,IACJ,MACA,SAAKukB,UAAU,cACb,WACEA,UAAU,cACVpoC,KAAK,MACLyI,KAAK,MACLuqC,YAAa9K,IAAYS,IAAIC,WAAWC,MAAM,mEAC9CoK,KAAMtxC,KAAKq8B,IACXkV,UAAQ,KAGZ,IAGFrC,EAAMhtB,IACJ,QACA,SAAKukB,UAAU,cACb,WACEA,UAAU,cACVpoC,KAAK,QACLgzC,YAAa9K,IAAYS,IAAIC,WAAWC,MAAM,qEAC9CoK,KAAMtxC,KAAKib,SAGf,IAGKi0B,G,EAGTxkC,OAAA,SAAO2oB,GACLrzB,KAAK8Q,MAAMmN,WAAWje,KAAKwG,MAAMnD,KAAM,CACrCg5B,IAAKr8B,KAAKq8B,MACVphB,MAAOjb,KAAKib,UAGdjb,KAAKq8B,IAAI,IACTr8B,KAAKib,MAAM,K,SAjDkCuzB,I,6BCJjD,8CAEqBgD,E,WACnB,aACExxC,KAAKkvC,MAAQ,G,2BAGfuC,iBAAA,SAAiBC,GACf1xC,KAAK0xC,WAAaA,G,EAGpBtL,QAAA,SAAQ/mC,EAAKgnC,EAASC,GACpBtmC,KAAKkvC,MAAM7vC,GAAO,CAAEgnC,UAASC,mB,EAG/BqL,UAAA,WACE,OAAO3xC,KAAK0xC,WAAW5gC,MAAM9K,Q,EAG/B1F,OAAA,WAAS,WACP0mC,IAAIsI,OAAStvC,KAAK0xC,WAClBlzC,OAAO0sB,KAAKlrB,KAAKkvC,OAAO/tC,SAAQ,SAAC9B,GAC/B,EAAK6vC,MAAM7vC,GAAKinC,qB,EAIpBsL,QAAA,a,EAIAxJ,WAAA,SAAW1yB,GACT,OAAOqyB,YAAa/nC,KAAK0xC,WAAW5gC,MAAO4E,I,EAG7Cm8B,UAAA,SAAUn8B,GACR,OAAOiyB,YAAa3nC,KAAK0xC,WAAW5gC,MAAO4E,I,EAG7C+5B,WAAA,SAAWrgC,EAAU5I,GACnB,OAAOwhC,YAAahoC,KAAK0xC,WAAW5gC,MAAO1B,EAAU5I,I,EAGvDsrC,eAAA,WACE,OAAO9xC,KAAK0xC,WAAW5gC,MAAMwV,UAAUtiB,O,EAGzCia,WAAA,SAAW7O,EAAU5I,GACnB,IAEIurC,EAFE1uC,EAAO+L,EAASwD,cAAcpM,GAIlCurC,EADE/xC,KAAK0xC,WAAW5gC,MAAMwV,UAAUtiB,MACpBhE,KAAK0xC,WAAW5gC,MAAM+S,GAAGnZ,OAAO1K,KAAK0xC,WAAW5gC,MAAMwV,UAAU/kB,KAAM8B,GAEtErD,KAAK0xC,WAAW5gC,MAAM+S,GAAGsE,iBAAiB9kB,GAE1DrD,KAAK0xC,WAAWtmB,SAAS2mB,GACzB/xC,KAAK0xC,WAAW5C,S,EAGlB1R,IAAA,SAAI/9B,GACEW,KAAKkvC,MAAM7vC,KACbW,KAAK0xC,WAAW5C,QAChB9uC,KAAKkvC,MAAM7vC,GAAKgnC,QAAQrmC,KAAK0xC,WAAW5gC,MAAO9Q,KAAK0xC,WAAWtmB,SAAUprB,KAAK0xC,c,iFCzDhFM,EAAe,aAEnBA,EAAatyC,UAAUgC,OAAS,SAAiB+B,GAC/C,OAAKA,EAAMtD,QACXsD,EAAQuuC,EAAazwC,KAAKkC,IAEjBzD,KAAKG,QAAUsD,GACrBA,EAAMtD,OAZU,KAYiBH,KAAKiyC,WAAWxuC,IACjDzD,KAAKG,OAbW,KAagBsD,EAAMyuC,YAAYlyC,OACnDA,KAAKmyC,YAAY1uC,IANSzD,MAW9BgyC,EAAatyC,UAAU2B,QAAU,SAAkBoC,GACjD,OAAKA,EAAMtD,OACJ6xC,EAAazwC,KAAKkC,GAAO/B,OAAO1B,MADXA,MAI9BgyC,EAAatyC,UAAUyyC,YAAc,SAAsB1uC,GACzD,OAAO,IAAI2uC,EAAOpyC,KAAMyD,IAK1BuuC,EAAatyC,UAAUgB,MAAQ,SAAgBa,EAAMc,GAInD,YAHgB,IAATd,IAAkBA,EAAO,QAClB,IAAPc,IAAgBA,EAAKrC,KAAKG,QAE7BoB,GAAQc,EAAa2vC,EAAahuC,MAC/BhE,KAAKqyC,WAAWzvC,KAAKC,IAAI,EAAGtB,GAAOqB,KAAKE,IAAI9C,KAAKG,OAAQkC,KAKlE2vC,EAAatyC,UAAUf,IAAM,SAAcb,GACzC,KAAIA,EAAI,GAAKA,GAAKkC,KAAKG,QACvB,OAAOH,KAAKsyC,SAASx0C,IAQvBk0C,EAAatyC,UAAUyB,QAAU,SAAkBC,EAAGG,EAAMc,QAC1C,IAATd,IAAkBA,EAAO,QAClB,IAAPc,IAAgBA,EAAKrC,KAAKG,QAE7BoB,GAAQc,EACRrC,KAAKuyC,aAAanxC,EAAGG,EAAMc,EAAI,GAE/BrC,KAAKwyC,qBAAqBpxC,EAAGG,EAAMc,EAAI,IAM7C2vC,EAAatyC,UAAU4B,IAAM,SAAcF,EAAGG,EAAMc,QAClC,IAATd,IAAkBA,EAAO,QAClB,IAAPc,IAAgBA,EAAKrC,KAAKG,QAEjC,IAAIwB,EAAS,GAEb,OADA3B,KAAKmB,SAAQ,SAAU6+B,EAAKliC,GAAK,OAAO6D,EAAOhB,KAAKS,EAAE4+B,EAAKliC,MAAQyD,EAAMc,GAClEV,GAMTqwC,EAAazwC,KAAO,SAAekxC,GACjC,OAAIA,aAAkBT,EAAuBS,EACtCA,GAAUA,EAAOtyC,OAAS,IAAIuyC,EAAKD,GAAUT,EAAahuC,OAGnE,IAAI0uC,EAAqB,SAAUV,GACjC,SAASU,EAAKD,GACZT,EAAa/zC,KAAK+B,MAClBA,KAAKyyC,OAASA,EAGXT,IAAeU,EAAKvrC,UAAY6qC,GACrCU,EAAKhzC,UAAYlB,OAAOY,OAAQ4yC,GAAgBA,EAAatyC,WAC7DgzC,EAAKhzC,UAAUO,YAAcyyC,EAE7B,IAAI3wC,EAAqB,CAAE5B,OAAQ,CAAE8B,cAAc,GAAOyG,MAAO,CAAEzG,cAAc,IAyCjF,OAvCAywC,EAAKhzC,UAAUizC,QAAU,WACvB,OAAO3yC,KAAKyyC,QAGdC,EAAKhzC,UAAU2yC,WAAa,SAAqB9wC,EAAMc,GACrD,OAAY,GAARd,GAAac,GAAMrC,KAAKG,OAAiBH,KACtC,IAAI0yC,EAAK1yC,KAAKyyC,OAAO/xC,MAAMa,EAAMc,KAG1CqwC,EAAKhzC,UAAU4yC,SAAW,SAAmBx0C,GAC3C,OAAOkC,KAAKyyC,OAAO30C,IAGrB40C,EAAKhzC,UAAU6yC,aAAe,SAAuBnxC,EAAGG,EAAMc,EAAIM,GAChE,IAAK,IAAI7E,EAAIyD,EAAMzD,EAAIuE,EAAIvE,IACvB,IAAqC,IAAjCsD,EAAEpB,KAAKyyC,OAAO30C,GAAI6E,EAAQ7E,GAAgB,OAAO,GAG3D40C,EAAKhzC,UAAU8yC,qBAAuB,SAA+BpxC,EAAGG,EAAMc,EAAIM,GAChF,IAAK,IAAI7E,EAAIyD,EAAO,EAAGzD,GAAKuE,EAAIvE,IAC5B,IAAqC,IAAjCsD,EAAEpB,KAAKyyC,OAAO30C,GAAI6E,EAAQ7E,GAAgB,OAAO,GAG3D40C,EAAKhzC,UAAUuyC,WAAa,SAAqBxuC,GAC/C,GAAIzD,KAAKG,OAASsD,EAAMtD,QApHP,IAqHb,OAAO,IAAIuyC,EAAK1yC,KAAKyyC,OAAO3xC,OAAO2C,EAAMkvC,aAG/CD,EAAKhzC,UAAUwyC,YAAc,SAAsBzuC,GACjD,GAAIzD,KAAKG,OAASsD,EAAMtD,QAzHP,IA0Hb,OAAO,IAAIuyC,EAAKjvC,EAAMkvC,UAAU7xC,OAAOd,KAAKyyC,UAGlD1wC,EAAmB5B,OAAOxB,IAAM,WAAc,OAAOqB,KAAKyyC,OAAOtyC,QAEjE4B,EAAmB2G,MAAM/J,IAAM,WAAc,OAAO,GAEpDH,OAAOiI,iBAAkBisC,EAAKhzC,UAAWqC,GAElC2wC,EAnDe,CAoDtBV,GAIFA,EAAahuC,MAAQ,IAAI0uC,EAAK,IAE9B,IAAIN,EAAuB,SAAUJ,GACnC,SAASI,EAAOQ,EAAMC,GACpBb,EAAa/zC,KAAK+B,MAClBA,KAAK4yC,KAAOA,EACZ5yC,KAAK6yC,MAAQA,EACb7yC,KAAKG,OAASyyC,EAAKzyC,OAAS0yC,EAAM1yC,OAClCH,KAAK0I,MAAQ9F,KAAKC,IAAI+vC,EAAKlqC,MAAOmqC,EAAMnqC,OAAS,EA2DnD,OAxDKspC,IAAeI,EAAOjrC,UAAY6qC,GACvCI,EAAO1yC,UAAYlB,OAAOY,OAAQ4yC,GAAgBA,EAAatyC,WAC/D0yC,EAAO1yC,UAAUO,YAAcmyC,EAE/BA,EAAO1yC,UAAUizC,QAAU,WACzB,OAAO3yC,KAAK4yC,KAAKD,UAAU7xC,OAAOd,KAAK6yC,MAAMF,YAG/CP,EAAO1yC,UAAU4yC,SAAW,SAAmBx0C,GAC7C,OAAOA,EAAIkC,KAAK4yC,KAAKzyC,OAASH,KAAK4yC,KAAKj0C,IAAIb,GAAKkC,KAAK6yC,MAAMl0C,IAAIb,EAAIkC,KAAK4yC,KAAKzyC,SAGhFiyC,EAAO1yC,UAAU6yC,aAAe,SAAuBnxC,EAAGG,EAAMc,EAAIM,GAClE,IAAImwC,EAAU9yC,KAAK4yC,KAAKzyC,OACxB,QAAIoB,EAAOuxC,IAC2D,IAAlE9yC,KAAK4yC,KAAKL,aAAanxC,EAAGG,EAAMqB,KAAKE,IAAIT,EAAIywC,GAAUnwC,QAEvDN,EAAKywC,IAC6G,IAAlH9yC,KAAK6yC,MAAMN,aAAanxC,EAAGwB,KAAKC,IAAItB,EAAOuxC,EAAS,GAAIlwC,KAAKE,IAAI9C,KAAKG,OAAQkC,GAAMywC,EAASnwC,EAAQmwC,UADzG,IAKFV,EAAO1yC,UAAU8yC,qBAAuB,SAA+BpxC,EAAGG,EAAMc,EAAIM,GAClF,IAAImwC,EAAU9yC,KAAK4yC,KAAKzyC,OACxB,QAAIoB,EAAOuxC,IACkG,IAAzG9yC,KAAK6yC,MAAML,qBAAqBpxC,EAAGG,EAAOuxC,EAASlwC,KAAKC,IAAIR,EAAIywC,GAAWA,EAASnwC,EAAQmwC,QAE5FzwC,EAAKywC,IACqE,IAA1E9yC,KAAK4yC,KAAKJ,qBAAqBpxC,EAAGwB,KAAKE,IAAIvB,EAAMuxC,GAAUzwC,EAAIM,UADnE,IAKFyvC,EAAO1yC,UAAU2yC,WAAa,SAAqB9wC,EAAMc,GACvD,GAAY,GAARd,GAAac,GAAMrC,KAAKG,OAAU,OAAOH,KAC7C,IAAI8yC,EAAU9yC,KAAK4yC,KAAKzyC,OACxB,OAAIkC,GAAMywC,EAAkB9yC,KAAK4yC,KAAKlyC,MAAMa,EAAMc,GAC9Cd,GAAQuxC,EAAkB9yC,KAAK6yC,MAAMnyC,MAAMa,EAAOuxC,EAASzwC,EAAKywC,GAC7D9yC,KAAK4yC,KAAKlyC,MAAMa,EAAMuxC,GAASpxC,OAAO1B,KAAK6yC,MAAMnyC,MAAM,EAAG2B,EAAKywC,KAGxEV,EAAO1yC,UAAUuyC,WAAa,SAAqBxuC,GACjD,IAAIqB,EAAQ9E,KAAK6yC,MAAMZ,WAAWxuC,GAClC,GAAIqB,EAAS,OAAO,IAAIstC,EAAOpyC,KAAK4yC,KAAM9tC,IAG5CstC,EAAO1yC,UAAUwyC,YAAc,SAAsBzuC,GACnD,IAAIqB,EAAQ9E,KAAK4yC,KAAKV,YAAYzuC,GAClC,GAAIqB,EAAS,OAAO,IAAIstC,EAAOttC,EAAO9E,KAAK6yC,QAG7CT,EAAO1yC,UAAUyyC,YAAc,SAAsB1uC,GACnD,OAAIzD,KAAK4yC,KAAKlqC,OAAS9F,KAAKC,IAAI7C,KAAK6yC,MAAMnqC,MAAOjF,EAAMiF,OAAS,EACtD,IAAI0pC,EAAOpyC,KAAK4yC,KAAM,IAAIR,EAAOpyC,KAAK6yC,MAAOpvC,IACjD,IAAI2uC,EAAOpyC,KAAMyD,IAGnB2uC,EAjEiB,CAkExBJ,GAIa,EAFIA,E,cCvLfe,EAAS,SAAgB7D,EAAO8D,GAClChzC,KAAKkvC,MAAQA,EACblvC,KAAKgzC,WAAaA,GAMpBD,EAAOrzC,UAAUuzC,SAAW,SAAmBniC,EAAOoiC,GAClD,IAAIj8B,EAASjX,KAEf,GAAuB,GAAnBA,KAAKgzC,WAAmB,OAAO,KAGnC,IADA,IAMIG,EAAOnvB,EANPthB,EAAM1C,KAAKkvC,MAAM/uC,QACbuC,IAAO,CAEb,GADW1C,KAAKkvC,MAAMvwC,IAAI+D,EAAM,GACvB4jB,UAAW,GAAI5jB,EAAK,OAI3BwwC,IACFC,EAAQnzC,KAAKozC,UAAU1wC,EAAK1C,KAAKkvC,MAAM/uC,QACvC6jB,EAAUmvB,EAAMxsB,KAAKxmB,QAEvB,IACImmB,EAAW+sB,EADX1V,EAAY7sB,EAAM+S,GAElByvB,EAAW,GAAItyC,EAAY,GAkC/B,OAhCAhB,KAAKkvC,MAAM/tC,SAAQ,SAAUiuB,EAAMtxB,GACjC,IAAKsxB,EAAK1I,KAOR,OANKysB,IACHA,EAAQl8B,EAAOm8B,UAAU1wC,EAAK5E,EAAI,GAClCkmB,EAAUmvB,EAAMxsB,KAAKxmB,QAEvB6jB,SACAhjB,EAAUL,KAAKyuB,GAIjB,GAAI+jB,EAAO,CACTnyC,EAAUL,KAAK,IAAI4yC,EAAKnkB,EAAK9tB,MAC7B,IAAgDA,EAA5ColB,EAAO0I,EAAK1I,KAAKplB,IAAI6xC,EAAMzyC,MAAMsjB,IAEjC0C,GAAQiX,EAAUpL,UAAU7L,GAAMjb,MACpCnK,EAAMq8B,EAAUzZ,QAAQyC,KAAKgX,EAAUzZ,QAAQyC,KAAKxmB,OAAS,GAC7DmzC,EAAS3yC,KAAK,IAAI4yC,EAAKjyC,EAAK,KAAM,KAAMgyC,EAASnzC,OAASa,EAAUb,UAEtE6jB,IACI1iB,GAAO6xC,EAAM1hB,UAAUnwB,EAAK0iB,QAEhC2Z,EAAUpL,UAAUnD,EAAK1I,MAG3B,OAAI0I,EAAK9I,WACPA,EAAY6sB,EAAQ/jB,EAAK9I,UAAUhlB,IAAI6xC,EAAMzyC,MAAMsjB,IAAYoL,EAAK9I,UACpE+sB,EAAY,IAAIN,EAAO97B,EAAOi4B,MAAMxuC,MAAM,EAAGgC,GAAKhB,OAAOV,EAAUmS,UAAUrS,OAAOwyC,IAAYr8B,EAAO+7B,WAAa,IAC7G,QAHT,IAKChzC,KAAKkvC,MAAM/uC,OAAQ,GAEf,CAACkzC,UAAWA,EAAW1V,UAAWA,EAAWrX,UAAWA,IAKjEysB,EAAOrzC,UAAU8zC,aAAe,SAAuB7V,EAAWrX,EAAWmtB,EAAaP,GAIxF,IAHA,IAAIQ,EAAW,GAAIV,EAAahzC,KAAKgzC,WACjCW,EAAW3zC,KAAKkvC,MAAO0E,GAAYV,GAAiBS,EAASxzC,OAASwzC,EAASh1C,IAAIg1C,EAASxzC,OAAS,GAAK,KAErGrC,EAAI,EAAGA,EAAI6/B,EAAU1Z,MAAM9jB,OAAQrC,IAAK,CAC/C,IACiEoiC,EAD7DxZ,EAAOiX,EAAU1Z,MAAMnmB,GAAGuzB,OAAOsM,EAAUvL,KAAKt0B,IAChDsxB,EAAO,IAAImkB,EAAK5V,EAAUzZ,QAAQyC,KAAK7oB,GAAI4oB,EAAMJ,IACjD4Z,EAAS0T,GAAYA,EAAS9gB,MAAM1D,MACtCA,EAAO8Q,EACHpiC,EAAK41C,EAASlgC,MACXmgC,EAAWA,EAASjzC,MAAM,EAAGizC,EAASxzC,OAAS,IAExDuzC,EAAS/yC,KAAKyuB,GACV9I,IACF0sB,IACA1sB,EAAY,MAET4sB,IAAiBU,EAAWxkB,GAEnC,IA4GoB8f,EAAO3vC,EACvBs0C,EA7GAC,EAAWd,EAAaS,EAAY/qC,MAKxC,OAJIorC,EAAWC,IA2GYx0C,EA1GSu0C,GA0GhB5E,EA1GMyE,GA4GpBxyC,SAAQ,SAAUiuB,EAAMtxB,GAC5B,GAAIsxB,EAAK9I,WAAqB,GAAP/mB,IAErB,OADAs0C,EAAW/1C,GACJ,KA/GT61C,EAkHKzE,EAAMxuC,MAAMmzC,GAjHjBb,GAAcc,GAET,IAAIf,EAAOY,EAASjyC,OAAOgyC,GAAWV,IAG/CD,EAAOrzC,UAAU0zC,UAAY,SAAoB7xC,EAAMc,GACrD,IAAIskB,EAAO,IAAI,IAMf,OALA3mB,KAAKkvC,MAAM/tC,SAAQ,SAAUiuB,EAAMtxB,GACjC,IAAIk2C,EAAiC,MAArB5kB,EAAK6kB,cAAwBn2C,EAAIsxB,EAAK6kB,cAAgB1yC,EAChEolB,EAAKA,KAAKxmB,OAASivB,EAAK6kB,aAAe,KAC7CttB,EAAK8K,UAAUrC,EAAK9tB,IAAK0yC,KACxBzyC,EAAMc,GACFskB,GAGTosB,EAAOrzC,UAAUw0C,QAAU,SAAkB7tC,GAC3C,OAAuB,GAAnBrG,KAAKgzC,WAA0BhzC,KAC5B,IAAI+yC,EAAO/yC,KAAKkvC,MAAMxtC,OAAO2E,EAAM/E,KAAI,SAAUA,GAAO,OAAO,IAAIiyC,EAAKjyC,OAAWtB,KAAKgzC,aAQjGD,EAAOrzC,UAAUy0C,QAAU,SAAkBC,EAAkBC,GAC7D,IAAKr0C,KAAKgzC,WAAc,OAAOhzC,KAE/B,IAAIs0C,EAAe,GAAI3xC,EAAQC,KAAKC,IAAI,EAAG7C,KAAKkvC,MAAM/uC,OAASk0C,GAE3DnwB,EAAUkwB,EAAiBlwB,QAC3BqwB,EAAWH,EAAiBnwB,MAAM9jB,OAClC6yC,EAAahzC,KAAKgzC,WACtBhzC,KAAKkvC,MAAM/tC,SAAQ,SAAUiuB,GAAYA,EAAK9I,WAAa0sB,MAAmBrwC,GAE9E,IAAI6xC,EAAWH,EACfr0C,KAAKkvC,MAAM/tC,SAAQ,SAAUiuB,GAC3B,IAAI5sB,EAAM0hB,EAAQ6N,YAAYyiB,GAC9B,GAAW,MAAPhyC,EAAJ,CACA+xC,EAAW3xC,KAAKE,IAAIyxC,EAAU/xC,GAC9B,IAAIlB,EAAM4iB,EAAQyC,KAAKnkB,GACvB,GAAI4sB,EAAK1I,KAAM,CACb,IAAIA,EAAO0tB,EAAiBnwB,MAAMzhB,GAAK6uB,OAAO+iB,EAAiBhiB,KAAK5vB,IAChE8jB,EAAY8I,EAAK9I,WAAa8I,EAAK9I,UAAUhlB,IAAI4iB,EAAQxjB,MAAM8zC,EAAW,EAAGhyC,IAC7E8jB,GAAa0sB,IACjBsB,EAAa3zC,KAAK,IAAI4yC,EAAKjyC,EAAKolB,EAAMJ,SAEtCguB,EAAa3zC,KAAK,IAAI4yC,EAAKjyC,OAE5BqB,GAGH,IADA,IAAI8xC,EAAU,GACL32C,EAAIu2C,EAAcv2C,EAAIy2C,EAAUz2C,IACrC22C,EAAQ9zC,KAAK,IAAI4yC,EAAKrvB,EAAQyC,KAAK7oB,KACvC,IAAIoxC,EAAQlvC,KAAKkvC,MAAMxuC,MAAM,EAAGiC,GAAOjB,OAAO+yC,GAAS/yC,OAAO4yC,GAC1DI,EAAS,IAAI3B,EAAO7D,EAAO8D,GAI/B,OAFI0B,EAAOC,iBAlJS,MAmJhBD,EAASA,EAAOE,SAAS50C,KAAKkvC,MAAM/uC,OAASm0C,EAAan0C,SACvDu0C,GAGT3B,EAAOrzC,UAAUi1C,eAAiB,WAChC,IAAItd,EAAQ,EAEZ,OADAr3B,KAAKkvC,MAAM/tC,SAAQ,SAAUiuB,GAAaA,EAAK1I,MAAQ2Q,OAChDA,GAST0b,EAAOrzC,UAAUk1C,SAAW,SAAmBxzB,QAC7B,IAATA,IAAkBA,EAAOphB,KAAKkvC,MAAM/uC,QAE3C,IAAIgzC,EAAQnzC,KAAKozC,UAAU,EAAGhyB,GAAO4C,EAAUmvB,EAAMxsB,KAAKxmB,OACtD+uC,EAAQ,GAAI2F,EAAS,EAsBzB,OArBA70C,KAAKkvC,MAAM/tC,SAAQ,SAAUiuB,EAAMtxB,GACjC,GAAIA,GAAKsjB,EACP8tB,EAAMvuC,KAAKyuB,GACPA,EAAK9I,WAAauuB,SACjB,GAAIzlB,EAAK1I,KAAM,CACpB,IAAIA,EAAO0I,EAAK1I,KAAKplB,IAAI6xC,EAAMzyC,MAAMsjB,IAAW1iB,EAAMolB,GAAQA,EAAK+L,SAGnE,GAFAzO,IACI1iB,GAAO6xC,EAAM1hB,UAAUnwB,EAAK0iB,GAC5B0C,EAAM,CACR,IAAIJ,EAAY8I,EAAK9I,WAAa8I,EAAK9I,UAAUhlB,IAAI6xC,EAAMzyC,MAAMsjB,IAC7DsC,GAAauuB,IACjB,IAAuD3U,EAAnD4U,EAAU,IAAIvB,EAAKjyC,EAAI+vB,SAAU3K,EAAMJ,GAAoB5iB,EAAOwrC,EAAM/uC,OAAS,GACjF+/B,EAASgP,EAAM/uC,QAAU+uC,EAAMxrC,GAAMovB,MAAMgiB,IAC3C5F,EAAMxrC,GAAQw8B,EAEdgP,EAAMvuC,KAAKm0C,SAER1lB,EAAK9tB,KACd0iB,MAEDhkB,KAAKkvC,MAAM/uC,OAAQ,GACf,IAAI4yC,EAAO,EAAaxxC,KAAK2tC,EAAM/7B,WAAY0hC,IAGxD9B,EAAO/uC,MAAQ,IAAI+uC,EAAO,EAAa/uC,MAAO,GAa9C,IAAIuvC,EAAO,SAAcjyC,EAAKolB,EAAMJ,EAAW2tB,GAE7Cj0C,KAAKsB,IAAMA,EAEXtB,KAAK0mB,KAAOA,EAIZ1mB,KAAKsmB,UAAYA,EAGjBtmB,KAAKi0C,aAAeA,GAGtBV,EAAK7zC,UAAUozB,MAAQ,SAAgBrvB,GACrC,GAAIzD,KAAK0mB,MAAQjjB,EAAMijB,OAASjjB,EAAM6iB,UAAW,CAC/C,IAAII,EAAOjjB,EAAMijB,KAAKoM,MAAM9yB,KAAK0mB,MACjC,GAAIA,EAAQ,OAAO,IAAI6sB,EAAK7sB,EAAK+L,SAASpB,SAAU3K,EAAM1mB,KAAKsmB,aAOnE,IAAIyuB,EAAe,SAAsBC,EAAMC,EAAQC,EAAYC,GACjEn1C,KAAKg1C,KAAOA,EACZh1C,KAAKi1C,OAASA,EACdj1C,KAAKk1C,WAAaA,EAClBl1C,KAAKm1C,SAAWA,GAGdpB,EAAiB,GAsDrB,SAASqB,EAAU9zC,GACjB,IAAIK,EAAS,GAEb,OADAL,EAAIH,SAAQ,SAAUylB,EAAOC,EAAKtlB,EAAMc,GAAM,OAAOV,EAAOhB,KAAKY,EAAMc,MAChEV,EAGT,SAAS0zC,EAAU3xB,EAAQQ,GACzB,IAAKR,EAAU,OAAO,KAEtB,IADA,IAAI/hB,EAAS,GACJ7D,EAAI,EAAGA,EAAI4lB,EAAOvjB,OAAQrC,GAAK,EAAG,CACzC,IAAIyD,EAAO2iB,EAAQ5iB,IAAIoiB,EAAO5lB,GAAI,GAAIuE,EAAK6hB,EAAQ5iB,IAAIoiB,EAAO5lB,EAAI,IAAK,GACnEyD,GAAQc,GAAMV,EAAOhB,KAAKY,EAAMc,GAEtC,OAAOV,EAMT,SAAS2zC,EAAgBC,EAASzkC,EAAOsa,EAAUoqB,GACjD,IAAItC,EAAgBuC,EAAkB3kC,GAAQ2iC,EAAciC,EAAW/2C,IAAImS,GAAO3F,KAAK6d,OACnFxV,GAAOgiC,EAAOD,EAAQN,OAASM,EAAQP,MAAM/B,SAASniC,EAAOoiC,GACjE,GAAK1/B,EAAL,CAEA,IAAI8S,EAAY9S,EAAI8S,UAAUzZ,QAAQ2G,EAAImqB,UAAUlyB,KAChD4qB,GAASmf,EAAOD,EAAQP,KAAOO,EAAQN,QAAQzB,aAAahgC,EAAImqB,UAAW7sB,EAAMwV,UAAUf,cAC/BkuB,EAAaP,GAEzEyC,EAAU,IAAIZ,EAAaS,EAAOnf,EAAQ7iB,EAAI6/B,UAAWmC,EAAOhiC,EAAI6/B,UAAYhd,EAAO,KAAM,GACjGjL,EAAS5X,EAAImqB,UAAUpX,aAAaD,GAAWkC,QAAQktB,EAAY,CAACF,KAAMA,EAAMI,aAAcD,IAAUjtB,mBAG1G,IAAImtB,GAAsB,EAAOC,EAA6B,KAK9D,SAASL,EAAkB3kC,GACzB,IAAIuY,EAAUvY,EAAMuY,QACpB,GAAIysB,GAA8BzsB,EAAS,CACzCwsB,GAAsB,EACtBC,EAA6BzsB,EAC7B,IAAK,IAAIvrB,EAAI,EAAGA,EAAIurB,EAAQlpB,OAAQrC,IAAO,GAAIurB,EAAQvrB,GAAGqN,KAAK4qC,qBAAsB,CACnFF,GAAsB,EACtB,OAGJ,OAAOA,EAWT,IAAIH,EAAa,IAAI,IAAU,WAC3BM,EAAkB,IAAI,IAAU,gBAsBpC,SAAS,EAAQhtB,GAGf,OAFAA,EAAS,CAACtgB,MAAOsgB,GAAUA,EAAOtgB,OAAS,IACjCutC,cAAejtB,GAAUA,EAAOitB,eAAiB,KACpD,IAAI,IAAO,CAChB52C,IAAKq2C,EAEL5kC,MAAO,CACL+X,KAAM,WACJ,OAAO,IAAIksB,EAAahC,EAAO/uC,MAAO+uC,EAAO/uC,MAAO,KAAM,IAE5D8kB,MAAO,SAAejF,EAAIqyB,EAAMplC,GAC9B,OA9IR,SAA0BykC,EAASzkC,EAAO+S,EAAI/N,GAC5C,IAAwCq+B,EAApCgC,EAAYtyB,EAAG4E,QAAQitB,GAC3B,GAAIS,EAAa,OAAOA,EAAUP,aAE9B/xB,EAAG4E,QAAQutB,KAAoBT,EAAU,IAAIR,EAAaQ,EAAQP,KAAMO,EAAQN,OAAQ,KAAM,IAElG,IAAImB,EAAWvyB,EAAG4E,QAAQ,uBAE1B,GAAuB,GAAnB5E,EAAGI,MAAM9jB,OACX,OAAOo1C,EACF,GAAIa,GAAYA,EAAS3tB,QAAQitB,GACtC,OAAIU,EAAS3tB,QAAQitB,GAAYF,KACtB,IAAIT,EAAaQ,EAAQP,KAAKxB,aAAa3vB,EAAI,KAAM/N,EAAS2/B,EAAkB3kC,IACjEykC,EAAQN,OAAQG,EAAUvxB,EAAGK,QAAQyC,KAAK9C,EAAGI,MAAM9jB,OAAS,IAAKo1C,EAAQJ,UAExF,IAAIJ,EAAaQ,EAAQP,KAAMO,EAAQN,OAAOzB,aAAa3vB,EAAI,KAAM/N,EAAS2/B,EAAkB3kC,IACjF,KAAMykC,EAAQJ,UACnC,IAAmC,IAA/BtxB,EAAG4E,QAAQ,iBAA+B2tB,IAAiD,IAArCA,EAAS3tB,QAAQ,gBAQ3E,OAAI0rB,EAAUtwB,EAAG4E,QAAQ,YAGvB,IAAIssB,EAAaQ,EAAQP,KAAKb,QAAQtwB,EAAIswB,GACzBoB,EAAQN,OAAOd,QAAQtwB,EAAIswB,GAC3BkB,EAAUE,EAAQL,WAAYrxB,EAAGK,SAAUqxB,EAAQJ,UAEpE,IAAIJ,EAAaQ,EAAQP,KAAKd,QAAQrwB,EAAGK,QAAQyC,MAChC4uB,EAAQN,OAAOf,QAAQrwB,EAAGK,QAAQyC,MAClC0uB,EAAUE,EAAQL,WAAYrxB,EAAGK,SAAUqxB,EAAQJ,UAf3E,IAAIkB,EAA+B,GAApBd,EAAQJ,WAAkBiB,IAAab,EAAQJ,UAAYtxB,EAAGqD,MAAQ,GAAKpR,EAAQmgC,gBAmBtG,SAAsBtY,EAAWuX,GAC/B,IAAKA,EAAc,OAAO,EAC1B,IAAKvX,EAAUtL,WAAc,OAAO,EACpC,IAAIikB,GAAW,EAMf,OALA3Y,EAAUzZ,QAAQyC,KAAK,GAAGxlB,SAAQ,SAAUwB,EAAOD,GACjD,IAAK,IAAI5E,EAAI,EAAGA,EAAIo3C,EAAW/0C,OAAQrC,GAAK,EACpC6E,GAASuyC,EAAWp3C,EAAI,IAAM4E,GAAOwyC,EAAWp3C,KAClDw4C,GAAW,MAEZA,EA3BkDC,CAAa1yB,EAAI0xB,EAAQL,aAC5EA,EAAakB,EAAWf,EAAUE,EAAQL,WAAYrxB,EAAGK,SAAWkxB,EAAUvxB,EAAGK,QAAQyC,KAAK9C,EAAGI,MAAM9jB,OAAS,IACpH,OAAO,IAAI40C,EAAaQ,EAAQP,KAAKxB,aAAa3vB,EAAIwyB,EAAWvlC,EAAMwV,UAAUf,cAAgB,KAC/CzP,EAAS2/B,EAAkB3kC,IACrDiiC,EAAO/uC,MAAOkxC,EAAYrxB,EAAGqD,MAsH1CwC,CAAiBwsB,EAAMplC,EAAO+S,EAAImF,KAI7CA,OAAQA,IAMZ,SAASwtB,EAAK1lC,EAAOsa,GACnB,IAAI8qB,EAAOR,EAAWzqB,SAASna,GAC/B,SAAKolC,GAAgC,GAAxBA,EAAKlB,KAAKhC,cACnB5nB,GAAYkqB,EAAgBY,EAAMplC,EAAOsa,GAAU,IAChD,GAKT,SAASoqB,EAAK1kC,EAAOsa,GACnB,IAAI8qB,EAAOR,EAAWzqB,SAASna,GAC/B,SAAKolC,GAAkC,GAA1BA,EAAKjB,OAAOjC,cACrB5nB,GAAYkqB,EAAgBY,EAAMplC,EAAOsa,GAAU,IAChD,G,mBCtaL,EAAS,GAEb,GAAwB,oBAAbmD,WAA+C,oBAAZ5M,SAAyB,CACrE,IAAI80B,EAAU,cAAc76B,KAAK2S,UAAU8d,WACvCqK,EAAY,UAAU7iC,KAAK0a,UAAU8d,WACrCsK,EAAU,wCAAwC/6B,KAAK2S,UAAU8d,WAErE,EAAOI,IAAM,MAAM54B,KAAK0a,UAAUC,UAClC,IAAIke,EAAK,EAAOA,MAAQgK,GAAaC,GAAWF,GAChD,EAAOG,WAAaF,EAAY/0B,SAASk1B,cAAgB,EAAIF,GAAWA,EAAQ,GAAKF,GAAWA,EAAQ,GAAK,KAC7G,EAAOjK,OAASE,GAAM,gBAAgB74B,KAAK0a,UAAU8d,WACrD,EAAOyK,cAAgB,EAAOtK,SAAW,iBAAiB5wB,KAAK2S,UAAU8d,YAAc,CAAC,EAAG,IAAI,GAC/F,IAAID,GAAUM,GAAM,gBAAgB9wB,KAAK2S,UAAU8d,WACnD,EAAOD,SAAWA,EAClB,EAAO2K,eAAiB3K,IAAWA,EAAO,GAE1C,EAAOE,QAAUI,GAAM,iBAAiB74B,KAAK0a,UAAUge,QACvD,EAAOyK,IAAM,EAAO1K,SAAW,cAAcz4B,KAAK0a,UAAU8d,YAAc9d,UAAU0oB,eAAiB,GACrG,EAAOC,QAAU,aAAarjC,KAAK0a,UAAU8d,WAC7C,EAAO8K,OAAS,wBAAyBx1B,SAASy1B,gBAAgB9/B,MAClE,EAAO+/B,eAAiB,EAAOF,UAAY,uBAAuBv7B,KAAK2S,UAAU8d,YAAc,CAAC,EAAG,IAAI,GAGzG,IAAIiL,EAAW,SAASj0C,GACtB,IAAK,IAAIa,EAAQ,GAAIA,IAEnB,KADAb,EAAOA,EAAK0a,iBACC,OAAO7Z,GAIpBqzC,EAAa,SAASl0C,GACxB,IAAId,EAASc,EAAKk0C,WAClB,OAAOh1C,GAA6B,IAAnBA,EAAO6M,SAAiB7M,EAAOi1C,KAAOj1C,GAGrDk1C,EAAc,KAKdC,EAAY,SAASr0C,EAAM9B,EAAMc,GACnC,IAAIoqB,EAAQgrB,IAAgBA,EAAc91B,SAASg2B,eAGnD,OAFAlrB,EAAMmrB,OAAOv0C,EAAY,MAANhB,EAAagB,EAAKwa,UAAU1d,OAASkC,GACxDoqB,EAAMorB,SAASx0C,EAAM9B,GAAQ,GACtBkrB,GAMLqrB,EAAuB,SAASz0C,EAAM00C,EAAKC,EAAYC,GACzD,OAAOD,IAAeE,EAAQ70C,EAAM00C,EAAKC,EAAYC,GAAY,IAC3CC,EAAQ70C,EAAM00C,EAAKC,EAAYC,EAAW,KAG9DE,EAAe,gCAEnB,SAASD,EAAQ70C,EAAM00C,EAAKC,EAAYC,EAAWvzB,GACjD,OAAS,CACP,GAAIrhB,GAAQ20C,GAAcD,GAAOE,EAAa,OAAO,EACrD,GAAIF,IAAQrzB,EAAM,EAAI,EAAI5iB,EAASuB,IAAQ,CACzC,IAAId,EAASc,EAAKk0C,WAClB,GAAuB,GAAnBh1C,EAAO6M,UAAiBgpC,EAAa/0C,IAAS80C,EAAatkC,KAAKxQ,EAAK2a,WAAqC,SAAxB3a,EAAKg1C,gBACvF,OAAO,EACXN,EAAMT,EAASj0C,IAASqhB,EAAM,EAAI,EAAI,GACtCrhB,EAAOd,MACF,IAAqB,GAAjBc,EAAK+L,SAKd,OAAO,EAHP,GAA4B,UAD5B/L,EAAOA,EAAKyc,WAAWi4B,GAAOrzB,EAAM,GAAK,EAAI,KACpC2zB,gBAA8B,OAAO,EAC9CN,EAAMrzB,EAAM,EAAI5iB,EAASuB,GAAQ,IAOvC,SAASvB,EAASuB,GAChB,OAAwB,GAAjBA,EAAK+L,SAAgB/L,EAAKwa,UAAU1d,OAASkD,EAAKyc,WAAW3f,OActE,SAASi4C,EAAa3gC,GAEpB,IADA,IAAImR,EACKnX,EAAMgG,EAAKhG,KAAiCmX,EAAOnX,EAAI6mC,YAAvC7mC,EAAMA,EAAI8lC,YACnC,OAAO3uB,GAAQA,EAAKvlB,MAAQulB,EAAKvlB,KAAKG,UAAYolB,EAAKnR,KAAOA,GAAOmR,EAAKlJ,YAAcjI,GAK1F,IAAI8gC,EAAqB,SAASC,GAChC,IAAIC,EAAYD,EAAOE,YAGvB,OAFID,GAAa,EAAOrM,QAAUoM,EAAOG,aAAeH,EAAOI,WAAW,GAAGH,YACzEA,GAAY,GACTA,GAGT,SAASI,EAASlL,EAAStuC,GACzB,IAAI2tC,EAAQrrB,SAASm3B,YAAY,SAIjC,OAHA9L,EAAM+L,UAAU,WAAW,GAAM,GACjC/L,EAAMW,QAAUA,EAChBX,EAAM3tC,IAAM2tC,EAAMthB,KAAOrsB,EAClB2tC,EAGT,SAASgM,EAAWvtC,GAClB,MAAO,CAACmnC,KAAM,EAAGC,MAAOpnC,EAAI2rC,gBAAgB6B,YACpCt8B,IAAK,EAAGu8B,OAAQztC,EAAI2rC,gBAAgB+B,cAG9C,SAASC,EAAQr6C,EAAOusB,GACtB,MAAuB,iBAATvsB,EAAoBA,EAAQA,EAAMusB,GAGlD,SAAS+tB,EAAWh2C,GAClB,IAAIi2C,EAAOj2C,EAAKk2C,wBAEhB,MAAO,CAAC3G,KAAM0G,EAAK1G,KAAMC,MAAOyG,EAAK1G,KAAOvvC,EAAK41C,YACzCt8B,IAAK28B,EAAK38B,IAAKu8B,OAAQI,EAAK38B,IAAMtZ,EAAK81C,cAGjD,SAASK,EAAmBxrB,EAAMsrB,EAAMG,GAGtC,IAFA,IAAIC,EAAkB1rB,EAAK2rB,SAAS,oBAAsB,EAAGC,EAAe5rB,EAAK2rB,SAAS,iBAAmB,EACzGluC,EAAMuiB,EAAKvW,IAAI2H,cACV7c,EAASk3C,GAAYzrB,EAAKvW,IAC5BlV,EADkCA,EAASg1C,EAAWh1C,GAE3D,GAAuB,GAAnBA,EAAO6M,SAAX,CACA,IAAIyqC,EAAQt3C,GAAUkJ,EAAIquC,MAA2B,GAAnBv3C,EAAO6M,SACrC2qC,EAAWF,EAAQb,EAAWvtC,GAAO4tC,EAAW92C,GAChDy3C,EAAQ,EAAGC,EAAQ,EASvB,GARIX,EAAK38B,IAAMo9B,EAASp9B,IAAMy8B,EAAQM,EAAiB,OACnDO,IAAUF,EAASp9B,IAAM28B,EAAK38B,IAAMy8B,EAAQQ,EAAc,QACrDN,EAAKJ,OAASa,EAASb,OAASE,EAAQM,EAAiB,YAC9DO,EAAQX,EAAKJ,OAASa,EAASb,OAASE,EAAQQ,EAAc,WAC9DN,EAAK1G,KAAOmH,EAASnH,KAAOwG,EAAQM,EAAiB,QACrDM,IAAUD,EAASnH,KAAO0G,EAAK1G,KAAOwG,EAAQQ,EAAc,SACvDN,EAAKzG,MAAQkH,EAASlH,MAAQuG,EAAQM,EAAiB,WAC5DM,EAAQV,EAAKzG,MAAQkH,EAASlH,MAAQuG,EAAQQ,EAAc,UAC5DI,GAASC,EACX,GAAIJ,EACFpuC,EAAIyuC,YAAYC,SAASH,EAAOC,OAC3B,CACL,IAAIG,EAAS73C,EAAO83C,WAAYC,EAAS/3C,EAAOg4C,UAC5CN,IAAS13C,EAAOg4C,WAAaN,GAC7BD,IAASz3C,EAAO83C,YAAcL,GAClC,IAAIQ,EAAKj4C,EAAO83C,WAAaD,EAAQK,EAAKl4C,EAAOg4C,UAAYD,EAC7DhB,EAAO,CAAC1G,KAAM0G,EAAK1G,KAAO4H,EAAI79B,IAAK28B,EAAK38B,IAAM89B,EAAI5H,MAAOyG,EAAKzG,MAAQ2H,EAAItB,OAAQI,EAAKJ,OAASuB,GAGpG,GAAIZ,EAAS,OAyBjB,SAASa,EAAYjjC,GAEnB,IADA,IAAIkoB,EAAQ,GAAIl0B,EAAMgM,EAAI2H,cACnB3H,IACLkoB,EAAMh/B,KAAK,CAAC8W,IAAKA,EAAKkF,IAAKlF,EAAI8iC,UAAW3H,KAAMn7B,EAAI4iC,aAChD5iC,GAAOhM,GAFDgM,EAAM8/B,EAAW9/B,IAI7B,OAAOkoB,EAcT,SAASgb,EAAmBhb,EAAOib,GACjC,IAAK,IAAI98C,EAAI,EAAGA,EAAI6hC,EAAMx/B,OAAQrC,IAAK,CACrC,IAAI8K,EAAM+2B,EAAM7hC,GACZ2Z,EAAM7O,EAAI6O,IACVkF,EAAM/T,EAAI+T,IACVi2B,EAAOhqC,EAAIgqC,KACXn7B,EAAI8iC,WAAa59B,EAAMi+B,IAAQnjC,EAAI8iC,UAAY59B,EAAMi+B,GACrDnjC,EAAI4iC,YAAczH,IAAQn7B,EAAI4iC,WAAazH,IAInD,IAAIiI,EAAyB,KAoB7B,SAASC,EAAiBz3C,EAAM03C,GAG9B,IAFA,IAAIC,EAA0BC,EAAjBC,EAAY,IAAoBx0C,EAAS,EAClDy0C,EAASJ,EAAOp+B,IAAKy+B,EAASL,EAAOp+B,IAChCla,EAAQY,EAAKrB,WAAYq5C,EAAa,EAAG54C,EAAOA,EAAQA,EAAM+b,YAAa68B,IAAc,CAChG,IAAIC,OAAQ,EACZ,GAAsB,GAAlB74C,EAAM2M,SAAiBksC,EAAQ74C,EAAM84C,qBACpC,IAAsB,GAAlB94C,EAAM2M,SACR,SADyBksC,EAAQ5D,EAAUj1C,GAAO84C,iBAGzD,IAAK,IAAIz9C,EAAI,EAAGA,EAAIw9C,EAAMn7C,OAAQrC,IAAK,CACrC,IAAIw7C,EAAOgC,EAAMx9C,GACjB,GAAIw7C,EAAK38B,KAAOw+B,GAAU7B,EAAKJ,QAAUkC,EAAQ,CAC/CD,EAASv4C,KAAKC,IAAIy2C,EAAKJ,OAAQiC,GAC/BC,EAASx4C,KAAKE,IAAIw2C,EAAK38B,IAAKy+B,GAC5B,IAAII,EAAKlC,EAAK1G,KAAOmI,EAAOnI,KAAO0G,EAAK1G,KAAOmI,EAAOnI,KAChD0G,EAAKzG,MAAQkI,EAAOnI,KAAOmI,EAAOnI,KAAO0G,EAAKzG,MAAQ,EAC5D,GAAI2I,EAAKN,EAAW,CAClBF,EAAUv4C,EACVy4C,EAAYM,EACZP,EAAgBO,GAA0B,GAApBR,EAAQ5rC,SAAgB,CAACwjC,KAAM0G,EAAKzG,MAAQkI,EAAOnI,KAAO0G,EAAKzG,MAAQyG,EAAK1G,KAAMj2B,IAAKo+B,EAAOp+B,KAAOo+B,EACrG,GAAlBt4C,EAAM2M,UAAiBosC,IACvB90C,EAAS20C,GAAcN,EAAOnI,OAAS0G,EAAK1G,KAAO0G,EAAKzG,OAAS,EAAI,EAAI,IAC7E,WAGCmI,IAAYD,EAAOnI,MAAQ0G,EAAKzG,OAASkI,EAAOp+B,KAAO28B,EAAK38B,KAChDo+B,EAAOnI,MAAQ0G,EAAK1G,MAAQmI,EAAOp+B,KAAO28B,EAAKJ,UAC5DxyC,EAAS20C,EAAa,IAG9B,OAAIL,GAA+B,GAApBA,EAAQ5rC,SAKzB,SAA0B/L,EAAM03C,GAG9B,IAFA,IAAIjtB,EAAMzqB,EAAKwa,UAAU1d,OACrBssB,EAAQ9K,SAASg2B,cACZ75C,EAAI,EAAGA,EAAIgwB,EAAKhwB,IAAK,CAC5B2uB,EAAMmrB,OAAOv0C,EAAMvF,EAAI,GACvB2uB,EAAMorB,SAASx0C,EAAMvF,GACrB,IAAIw7C,EAAOmC,GAAWhvB,EAAO,GAC7B,GAAI6sB,EAAK38B,KAAO28B,EAAKJ,QACjBwC,GAAOX,EAAQzB,GACf,MAAO,CAACj2C,KAAMA,EAAMqD,OAAQ5I,GAAKi9C,EAAOnI,OAAS0G,EAAK1G,KAAO0G,EAAKzG,OAAS,EAAI,EAAI,IAEzF,MAAO,CAACxvC,KAAMA,EAAMqD,OAAQ,GAhBmBi1C,CAAiBX,EAASC,IACpED,GAAYE,GAAiC,GAApBF,EAAQ5rC,SAAyB,CAAC/L,KAAMA,EAAMqD,OAAQA,GAC7Eo0C,EAAiBE,EAASC,GAiBnC,SAASS,GAAOX,EAAQzB,GACtB,OAAOyB,EAAOnI,MAAQ0G,EAAK1G,KAAO,GAAKmI,EAAOnI,MAAQ0G,EAAKzG,MAAQ,GACjEkI,EAAOp+B,KAAO28B,EAAK38B,IAAM,GAAKo+B,EAAOp+B,KAAO28B,EAAKJ,OAAS,EAgE9D,SAAS0C,GAAY5tB,EAAM+sB,GACzB,IAAIvf,EAAQqgB,EAEUx4C,EAAMqD,EAAxBo1C,EAAO9tB,EAAK8tB,KAChB,GAAIA,EAAKC,uBACP,IACE,IAAIC,EAAQF,EAAKC,uBAAuBhB,EAAOnI,KAAMmI,EAAOp+B,KACxDq/B,IAA2B34C,GAAhBm4B,EAASwgB,GAAqBC,WAAYv1C,EAAS80B,EAAO90B,QACzE,MAAOkB,IAEX,IAAKvE,GAAQy4C,EAAKI,oBAAqB,CACrC,IAAIzvB,EAAQqvB,EAAKI,oBAAoBnB,EAAOnI,KAAMmI,EAAOp+B,KACrD8P,IAA6BppB,GAAlBw4C,EAAWpvB,GAAuB0vB,eAAgBz1C,EAASm1C,EAASO,aAGrF,IAA8D55C,EAA1Dw9B,EAAM8b,EAAKO,iBAAiBtB,EAAOnI,KAAMmI,EAAOp+B,IAAM,GAC1D,IAAKqjB,IAAQhS,EAAKvW,IAAIgJ,SAAyB,GAAhBuf,EAAI5wB,SAAgB4wB,EAAIuX,WAAavX,GAAM,CACxE,IAAIsc,EAAMtuB,EAAKvW,IAAI8hC,wBACnB,IAAKmC,GAAOX,EAAQuB,GAAQ,OAAO,KAEnC,KADAtc,EAtCJ,SAASqc,EAAiBpL,EAAS8J,EAAQuB,GACzC,IAAIxuB,EAAMmjB,EAAQnxB,WAAW3f,OAC7B,GAAI2tB,GAAOwuB,EAAI3/B,IAAM2/B,EAAIpD,OACvB,IAAK,IAAIqD,EAAS35C,KAAKC,IAAI,EAAGD,KAAKE,IAAIgrB,EAAM,EAAGlrB,KAAK45C,MAAM1uB,GAAOitB,EAAOp+B,IAAM2/B,EAAI3/B,MAAQ2/B,EAAIpD,OAASoD,EAAI3/B,MAAQ,IAAK7e,EAAIy+C,IAAU,CACrI,IAAI95C,EAAQwuC,EAAQnxB,WAAWhiB,GAC/B,GAAsB,GAAlB2E,EAAM2M,SAER,IADA,IAAIksC,EAAQ74C,EAAM84C,iBACT12C,EAAI,EAAGA,EAAIy2C,EAAMn7C,OAAQ0E,IAAK,CACrC,IAAIy0C,EAAOgC,EAAMz2C,GACjB,GAAI62C,GAAOX,EAAQzB,GAAS,OAAO+C,EAAiB55C,EAAOs4C,EAAQzB,GAGvE,IAAKx7C,GAAKA,EAAI,GAAKgwB,IAAQyuB,EAAU,MAGzC,OAAOtL,EAuBCoL,CAAiBruB,EAAKvW,IAAKsjC,EAAQuB,IAC7B,OAAO,KAKrB,GAFI,EAAOhQ,QAAUtM,EAAIb,YAAa97B,EAAOqD,EAAS,MACtDs5B,EArFF,SAAsBvoB,EAAKsjC,GACzB,IAAIx4C,EAASkV,EAAI8/B,WACjB,OAAIh1C,GAAU,QAAQsR,KAAKtR,EAAOyb,WAAa+8B,EAAOnI,KAAOn7B,EAAI8hC,wBAAwB3G,KAC9ErwC,EACJkV,EAiFDglC,CAAazc,EAAK+a,GACpB13C,EAAM,CACR,GAAI,EAAOmpC,OAA0B,GAAjBnpC,EAAK+L,WAGvB1I,EAAS9D,KAAKE,IAAI4D,EAAQrD,EAAKyc,WAAW3f,SAG7BkD,EAAKyc,WAAW3f,OAAQ,CACnC,IAAoCu8C,EAAhCrwC,EAAOhJ,EAAKyc,WAAWpZ,GACN,OAAjB2F,EAAK2R,WAAsB0+B,EAAQrwC,EAAKktC,yBAAyB1G,OAASkI,EAAOnI,MACjF8J,EAAMxD,OAAS6B,EAAOp+B,KACtBjW,IAKJrD,GAAQ2qB,EAAKvW,KAAO/Q,GAAUrD,EAAKyc,WAAW3f,OAAS,GAAgC,GAA3BkD,EAAKnB,UAAUkN,UAC3E2rC,EAAOp+B,IAAMtZ,EAAKnB,UAAUq3C,wBAAwBL,OACpD12C,EAAMwrB,EAAKld,MAAMrF,IAAI1L,QAAQyB,KAId,GAAVkF,GAAgC,GAAjBrD,EAAK+L,UAAyD,MAAxC/L,EAAKyc,WAAWpZ,EAAS,GAAGsX,WACtExb,EA1FR,SAAsBwrB,EAAM3qB,EAAMqD,EAAQq0C,GAQxC,IADA,IAAI4B,GAAW,EACNlrC,EAAMpO,EACToO,GAAOuc,EAAKvW,KADK,CAErB,IAAImR,EAAOoF,EAAK4uB,QAAQC,YAAYprC,GAAK,GACzC,IAAKmX,EAAQ,OAAO,KACpB,GAAIA,EAAKvlB,KAAKG,SAAWolB,EAAKrmB,OAAQ,CACpC,IAAI+2C,EAAO1wB,EAAKnR,IAAI8hC,wBACpB,GAAID,EAAK1G,KAAOmI,EAAOnI,MAAQ0G,EAAK38B,IAAMo+B,EAAOp+B,IAAOggC,EAAU/zB,EAAKk0B,cAClE,MAAIxD,EAAKzG,MAAQkI,EAAOnI,MAAQ0G,EAAKJ,OAAS6B,EAAOp+B,KACnD,MAD0DggC,EAAU/zB,EAAKm0B,UAGlFtrC,EAAMmX,EAAKnR,IAAI8/B,WAEjB,OAAOoF,GAAW,EAAIA,EAAU3uB,EAAK4uB,QAAQI,WAAW35C,EAAMqD,GAsElDu2C,CAAajvB,EAAM3qB,EAAMqD,EAAQq0C,IAElC,MAAPv4C,IAAeA,EAxGrB,SAAwBwrB,EAAMgS,EAAK+a,GACjC,IAAInyC,EAAMkyC,EAAiB9a,EAAK+a,GAC5B13C,EAAOuF,EAAIvF,KACXqD,EAASkC,EAAIlC,OACbqe,GAAQ,EACZ,GAAqB,GAAjB1hB,EAAK+L,WAAkB/L,EAAKrB,WAAY,CAC1C,IAAIs3C,EAAOj2C,EAAKk2C,wBAChBx0B,EAAOu0B,EAAK1G,MAAQ0G,EAAKzG,OAASkI,EAAOnI,MAAQ0G,EAAK1G,KAAO0G,EAAKzG,OAAS,EAAI,GAAK,EAEtF,OAAO7kB,EAAK4uB,QAAQI,WAAW35C,EAAMqD,EAAQqe,GA+FpBm4B,CAAelvB,EAAMgS,EAAK+a,IAEnD,IAAInyB,EAAOoF,EAAK4uB,QAAQC,YAAY7c,GAAK,GACzC,MAAO,CAACx9B,IAAKA,EAAK4xB,OAAQxL,EAAOA,EAAKu0B,WAAav0B,EAAKw0B,QAAU,GAGpE,SAAS3B,GAAWj8C,EAAQulB,GAC1B,IAAIu2B,EAAQ97C,EAAO+7C,iBACnB,OAAQD,EAAMn7C,OAA0Cm7C,EAAMv2B,EAAO,EAAI,EAAIu2B,EAAMn7C,OAAS,GAArEX,EAAO+5C,wBAGhC,IAAI8D,GAAO,4CAKX,SAASC,GAAYtvB,EAAMxrB,EAAK8oB,GAC9B,IAAI1iB,EAAMolB,EAAK4uB,QAAQW,WAAW/6C,EAAK8oB,EAAO,GAAK,EAAI,GACnDjoB,EAAOuF,EAAIvF,KACXqD,EAASkC,EAAIlC,OAEb82C,EAAoB,EAAOrG,QAAU,EAAO3K,MAChD,GAAqB,GAAjBnpC,EAAK+L,SAAe,CAGtB,IAAIouC,IAAsBH,GAAKxpC,KAAKxQ,EAAKwa,aAAeyN,EAAO,EAAK5kB,EAASA,GAAUrD,EAAKwa,UAAU1d,QAc/F,CACL,IAAIoB,EAAOmF,EAAQrE,EAAKqE,EAAQ+2C,EAAWnyB,EAAO,EAAI,GAAK,EAK3D,OAJIA,EAAO,IAAM5kB,GAAUrE,IAAMo7C,GAAY,GACpCnyB,GAAQ,GAAK5kB,GAAUrD,EAAKwa,UAAU1d,QAAUoB,IAAQk8C,EAAW,GACnEnyB,EAAO,EAAK/pB,IACdc,IACAq7C,GAASjC,GAAW/D,EAAUr0C,EAAM9B,EAAMc,GAAKo7C,GAAWA,EAAW,GAnB5E,IAAInE,EAAOmC,GAAW/D,EAAUr0C,EAAMqD,EAAQA,GAAS4kB,GAIvD,GAAI,EAAOkhB,OAAS9lC,GAAU,KAAKmN,KAAKxQ,EAAKwa,UAAUnX,EAAS,KAAOA,EAASrD,EAAKwa,UAAU1d,OAAQ,CACrG,IAAIw9C,EAAalC,GAAW/D,EAAUr0C,EAAMqD,EAAS,EAAGA,EAAS,IAAK,GACtE,GAAIi3C,EAAWhhC,KAAO28B,EAAK38B,IAAK,CAC9B,IAAIihC,EAAYnC,GAAW/D,EAAUr0C,EAAMqD,EAAQA,EAAS,IAAK,GACjE,GAAIk3C,EAAUjhC,KAAO28B,EAAK38B,IACtB,OAAO+gC,GAASE,EAAWA,EAAUhL,KAAO+K,EAAW/K,OAG/D,OAAO0G,EAYX,IAAKtrB,EAAKld,MAAMrF,IAAIoB,QAAQrK,GAAKD,OAAOkK,cAAe,CACrD,GAAI/F,IAAW4kB,EAAO,GAAK5kB,GAAU5E,EAASuB,IAAQ,CACpD,IAAIwI,EAASxI,EAAKyc,WAAWpZ,EAAS,GACtC,GAAuB,GAAnBmF,EAAOuD,SAAiB,OAAOyuC,GAAShyC,EAAO0tC,yBAAyB,GAE9E,GAAI7yC,EAAS5E,EAASuB,GAAO,CAC3B,IAAIyI,EAAQzI,EAAKyc,WAAWpZ,GAC5B,GAAsB,GAAlBoF,EAAMsD,SAAiB,OAAOyuC,GAAS/xC,EAAMytC,yBAAyB,GAE5E,OAAOsE,GAASx6C,EAAKk2C,wBAAyBjuB,GAAQ,GAIxD,GAAI5kB,IAAW4kB,EAAO,GAAK5kB,GAAU5E,EAASuB,IAAQ,CACpD,IAAIy6C,EAAWz6C,EAAKyc,WAAWpZ,EAAS,GACpCqD,EAA8B,GAArB+zC,EAAS1uC,SAAgBsoC,EAAUoG,EAAUh8C,EAASg8C,IAAaN,EAAoB,EAAI,IAG7E,GAArBM,EAAS1uC,UAAuC,MAArB0uC,EAAS9/B,UAAqB8/B,EAASt/B,YAA0B,KAAXs/B,EACvF,GAAI/zC,EAAU,OAAO2zC,GAASjC,GAAW1xC,EAAQ,IAAI,GAEvD,GAAIrD,EAAS5E,EAASuB,GAAO,CAC3B,IAAI06C,EAAU16C,EAAKyc,WAAWpZ,GAC1Bs3C,EAA+B,GAApBD,EAAQ3uC,SAAgBsoC,EAAUqG,EAAS,EAAIP,EAAoB,EAAI,GAC5D,GAApBO,EAAQ3uC,SAAgB2uC,EAAU,KACxC,GAAIC,EAAY,OAAON,GAASjC,GAAWuC,GAAW,IAAI,GAG5D,OAAON,GAASjC,GAA4B,GAAjBp4C,EAAK+L,SAAgBsoC,EAAUr0C,GAAQA,GAAOioB,GAAOA,GAAQ,GAG1F,SAASoyB,GAASpE,EAAM1G,GACtB,GAAkB,GAAd0G,EAAK2E,MAAc,OAAO3E,EAC9B,IAAI4E,EAAItL,EAAO0G,EAAK1G,KAAO0G,EAAKzG,MAChC,MAAO,CAACl2B,IAAK28B,EAAK38B,IAAKu8B,OAAQI,EAAKJ,OAAQtG,KAAMsL,EAAGrL,MAAOqL,GAG9D,SAASL,GAASvE,EAAM38B,GACtB,GAAmB,GAAf28B,EAAK6E,OAAe,OAAO7E,EAC/B,IAAI8E,EAAIzhC,EAAM28B,EAAK38B,IAAM28B,EAAKJ,OAC9B,MAAO,CAACv8B,IAAKyhC,EAAGlF,OAAQkF,EAAGxL,KAAM0G,EAAK1G,KAAMC,MAAOyG,EAAKzG,OAG1D,SAASwL,GAAiBrwB,EAAMld,EAAO1P,GACrC,IAAIk9C,EAAYtwB,EAAKld,MAAOkC,EAASgb,EAAK8tB,KAAKyC,cAC3CD,GAAaxtC,GAASkd,EAAKwwB,YAAY1tC,GACvCkC,GAAUgb,EAAKvW,KAAOuW,EAAK8gB,QAC/B,IACE,OAAO1tC,IACP,QACIk9C,GAAaxtC,GAASkd,EAAKwwB,YAAYF,GACvCtrC,GAAUgb,EAAKvW,KAAOzE,GAAUA,EAAO87B,SAmC/C,IAAI2P,GAAW,kBAiCf,IAAIC,GAAc,KAAMC,GAAY,KAAMC,IAAe,EACzD,SAAS1wB,GAAeF,EAAMld,EAAO4T,GACnC,OAAIg6B,IAAe5tC,GAAS6tC,IAAaj6B,EAAck6B,IACvDF,GAAc5tC,EAAO6tC,GAAYj6B,EAC1Bk6B,GAAsB,MAAPl6B,GAAsB,QAAPA,EAjEvC,SAAgCsJ,EAAMld,EAAO4T,GAC3C,IAAI2B,EAAMvV,EAAMwV,UACZ7B,EAAc,MAAPC,EAAc2B,EAAI7d,MAAQ6d,EAAI5d,IACzC,OAAO41C,GAAiBrwB,EAAMld,GAAO,WAGnC,IAFA,IACI2G,EADMuW,EAAK4uB,QAAQW,WAAW94B,EAAKjiB,IAAY,MAAPkiB,GAAe,EAAI,GACjDrhB,OACL,CACP,IAAIw7C,EAAU7wB,EAAK4uB,QAAQC,YAAYplC,GAAK,GAC5C,IAAKonC,EAAW,MAChB,GAAIA,EAAQx7C,KAAKG,QAAS,CAAEiU,EAAMonC,EAAQpnC,IAAK,MAC/CA,EAAMonC,EAAQpnC,IAAI8/B,WAGpB,IADA,IAAIwD,EAASuC,GAAYtvB,EAAMvJ,EAAKjiB,IAAK,GAChCC,EAAQgV,EAAIzV,WAAYS,EAAOA,EAAQA,EAAM+b,YAAa,CACjE,IAAIsgC,OAAQ,EACZ,GAAsB,GAAlBr8C,EAAM2M,SAAiB0vC,EAAQr8C,EAAM84C,qBACpC,IAAsB,GAAlB94C,EAAM2M,SACR,SADyB0vC,EAAQpH,EAAUj1C,EAAO,EAAGA,EAAMob,UAAU1d,QAAQo7C,iBAEpF,IAAK,IAAIz9C,EAAI,EAAGA,EAAIghD,EAAM3+C,OAAQrC,IAAK,CACrC,IAAIw+C,EAAMwC,EAAMhhD,GAChB,GAAIw+C,EAAIpD,OAASoD,EAAI3/B,MAAe,MAAP+H,EAAc43B,EAAIpD,OAAS6B,EAAOp+B,IAAM,EAAI2/B,EAAI3/B,IAAMo+B,EAAO7B,OAAS,GAC/F,OAAO,GAGf,OAAO,KA0CL6F,CAAuB/wB,EAAMld,EAAO4T,GApC1C,SAAkCsJ,EAAMld,EAAO4T,GAC7C,IACIjB,EADM3S,EAAMwV,UACA7C,MAChB,IAAKA,EAAMlhB,OAAOkL,YAAe,OAAO,EACxC,IAAI/G,EAAS+c,EAAMha,aAAcwb,GAAWve,EAAQwe,EAAQxe,GAAU+c,EAAMlhB,OAAOxC,QAAQyB,KACvF6kB,EAAM24B,eAGV,OAAKP,GAAS5qC,KAAK4P,EAAMlhB,OAAOiL,cAAiB6Y,EAAI44B,OAG9CZ,GAAiBrwB,EAAMld,GAAO,WAMnC,IAAIouC,EAAW74B,EAAIuyB,WAAW,GAAIuG,EAAU94B,EAAI+4B,UAAWC,EAASh5B,EAAIi5B,YACpEC,EAAel5B,EAAIm5B,eACvBn5B,EAAI44B,OAAO,OAAQv6B,EAAK,aACxB,IACI/iB,IADY8hB,EAAM/a,MAAQslB,EAAK4uB,QAAQ6C,YAAYh8B,EAAM5X,UAAYmiB,EAAKvW,KACtDgJ,SAAmC,GAA1B4F,EAAI+4B,UAAUhwC,SAAgBiX,EAAI+4B,UAAY/4B,EAAI+4B,UAAU7H,aACxF4H,GAAW94B,EAAI+4B,WAAaC,GAAUh5B,EAAIi5B,YAK/C,OAHAj5B,EAAIq5B,kBACJr5B,EAAIhd,SAAS61C,GACO,MAAhBK,IAAwBl5B,EAAIm5B,eAAiBD,GAC1C59C,KAlBS,QAAP+iB,GAAwB,YAAPA,EAAoBO,EAAUC,EA4BtDy6B,CAAyB3xB,EAAMld,EAAO4T,IAsF5C,IAII,GAAW,SAAkBniB,EAAQw+B,EAAUtpB,EAAKiI,GACtD1f,KAAKuC,OAASA,EACdvC,KAAK+gC,SAAWA,EAChB/gC,KAAKyX,IAAMA,EAGXA,EAAI6gC,WAAat4C,KAGjBA,KAAK0f,WAAaA,EAClB1f,KAAK4/C,MAdS,GAiBZ79C,GAAqB,CAAE89C,eAAgB,CAAE59C,cAAc,GAAOT,KAAM,CAAES,cAAc,GAAOm7C,OAAQ,CAAEn7C,cAAc,GAAO66C,UAAW,CAAE76C,cAAc,GAAOk7C,WAAY,CAAEl7C,cAAc,GAAO86C,SAAU,CAAE96C,cAAc,GAAO69C,SAAU,CAAE79C,cAAc,GAAO89C,YAAa,CAAE99C,cAAc,GAAO+9C,QAAS,CAAE/9C,cAAc,IAIlU,GAASvC,UAAUugD,cAAgB,WAA4B,OAAO,GACtE,GAASvgD,UAAUwgD,YAAc,WAA0B,OAAO,GAClE,GAASxgD,UAAUygD,YAAc,WAA0B,OAAO,GAClE,GAASzgD,UAAU0gD,YAAc,WAA0B,OAAO,GAElEr+C,GAAmB89C,eAAelhD,IAAM,WAAc,OAAO,GAM7D,GAASe,UAAU2gD,UAAY,WAAwB,OAAO,MAK9D,GAAS3gD,UAAU4gD,UAAY,WAAwB,OAAO,GAG9Dv+C,GAAmBP,KAAK7C,IAAM,WAE5B,IADA,IAAI6C,EAAO,EACF1D,EAAI,EAAGA,EAAIkC,KAAK+gC,SAAS5gC,OAAQrC,IAAO0D,GAAQxB,KAAK+gC,SAASjjC,GAAG0D,KAC1E,OAAOA,GAKTO,GAAmBq7C,OAAOz+C,IAAM,WAAc,OAAO,GAErD,GAASe,UAAUkyC,QAAU,WAC3B5xC,KAAKuC,OAAS,KACVvC,KAAKyX,IAAI6gC,YAAct4C,OAAQA,KAAKyX,IAAI6gC,WAAa,MACzD,IAAK,IAAIx6C,EAAI,EAAGA,EAAIkC,KAAK+gC,SAAS5gC,OAAQrC,IACtCkC,KAAK+gC,SAASjjC,GAAG8zC,WAGvB,GAASlyC,UAAU6gD,eAAiB,SAAyB99C,GAC3D,IAAK,IAAI3E,EAAI,EAAG0E,EAAMxC,KAAKm9C,WAAYr/C,EAAIkC,KAAK+gC,SAAS5gC,OAAQrC,IAAK,CACpE,IAAI2T,EAAMzR,KAAK+gC,SAASjjC,GACxB,GAAI2T,GAAOhP,EAAS,OAAOD,EAC3BA,GAAOiP,EAAIjQ,OAIfO,GAAmB+6C,UAAUn+C,IAAM,WACjC,OAAOqB,KAAKuC,OAAOg+C,eAAevgD,OAGpC+B,GAAmBo7C,WAAWx+C,IAAM,WAClC,OAAOqB,KAAKuC,OAASvC,KAAKuC,OAAOg+C,eAAevgD,MAAQA,KAAKo9C,OAAS,GAGxEr7C,GAAmBg7C,SAASp+C,IAAM,WAChC,OAAOqB,KAAK88C,UAAY98C,KAAKwB,MAG/BO,GAAmB+9C,SAASnhD,IAAM,WAChC,OAAOqB,KAAKm9C,WAAan9C,KAAKwB,KAAO,EAAIxB,KAAKo9C,QAIhD,GAAS19C,UAAU8gD,gBAAkB,SAA0B/oC,EAAK/Q,EAAQqe,GAG1E,GAAI/kB,KAAK0f,YAAc1f,KAAK0f,WAAWe,SAAyB,GAAhBhJ,EAAIrI,SAAgBqI,EAAMA,EAAI8/B,YAAa,CACzF,GAAIxyB,EAAO,EAAG,CACZ,IAAI07B,EAAW73B,EACf,GAAInR,GAAOzX,KAAK0f,WACd+gC,EAAYhpC,EAAIqI,WAAWpZ,EAAS,OAC/B,CACL,KAAO+Q,EAAI8/B,YAAcv3C,KAAK0f,YAAcjI,EAAMA,EAAI8/B,WACtDkJ,EAAYhpC,EAAIsG,gBAElB,KAAO0iC,MAAgB73B,EAAO63B,EAAUnI,aAAe1vB,EAAKrmB,QAAUvC,OAASygD,EAAYA,EAAU1iC,gBACrG,OAAO0iC,EAAYzgD,KAAKugD,eAAe33B,GAAQA,EAAKpnB,KAAOxB,KAAKm9C,WAEhE,IAAIuD,EAAUC,EACd,GAAIlpC,GAAOzX,KAAK0f,WACdghC,EAAWjpC,EAAIqI,WAAWpZ,OACrB,CACL,KAAO+Q,EAAI8/B,YAAcv3C,KAAK0f,YAAcjI,EAAMA,EAAI8/B,WACtDmJ,EAAWjpC,EAAI+G,YAEjB,KAAOkiC,MAAeC,EAASD,EAASpI,aAAeqI,EAAOp+C,QAAUvC,OAAS0gD,EAAWA,EAASliC,YACrG,OAAOkiC,EAAW1gD,KAAKugD,eAAeI,GAAU3gD,KAAK8/C,SAMzD,IAAI56B,EACJ,GAAIllB,KAAK0f,YAAc1f,KAAK0f,YAAc1f,KAAKyX,KAAOzX,KAAKyX,IAAIgJ,SAASzgB,KAAK0f,YAC3EwF,EAAuD,EAA/CzN,EAAIiJ,wBAAwB1gB,KAAK0f,iBACpC,GAAI1f,KAAKyX,IAAIzV,WAAY,CAC9B,GAAc,GAAV0E,EAAe,IAAK,IAAI8L,EAASiF,GAAMjF,EAASA,EAAO+kC,WAAY,CACrE,GAAI/kC,GAAUxS,KAAKyX,IAAK,CAAEyN,GAAQ,EAAO,MACzC,GAAI1S,EAAO+kC,WAAWv1C,YAAcwQ,EAAU,MAEhD,GAAa,MAAT0S,GAAiBxe,GAAU+Q,EAAIqI,WAAW3f,OAAU,IAAK,IAAIygD,EAAWnpC,GAAMmpC,EAAWA,EAASrJ,WAAY,CAChH,GAAIqJ,GAAY5gD,KAAKyX,IAAK,CAAEyN,GAAQ,EAAM,MAC1C,GAAI07B,EAASrJ,WAAWr1C,WAAa0+C,EAAY,OAGrD,OAAiB,MAAT17B,EAAgBH,EAAO,EAAIG,GAASllB,KAAK8/C,SAAW9/C,KAAKm9C,YAKnE,GAASz9C,UAAUm9C,YAAc,SAAsBplC,EAAKopC,GAC1D,IAAK,IAAIl9C,GAAQ,EAAM8N,EAAMgG,EAAKhG,EAAKA,EAAMA,EAAI8lC,WAAY,CAC3D,IAAI3uB,EAAO5oB,KAAK8gD,QAAQrvC,GACxB,GAAImX,KAAUi4B,GAAaj4B,EAAKvlB,MAAO,CAErC,IAAIM,IAASilB,EAAKm4B,UACa,GAAzBn4B,EAAKm4B,QAAQ3xC,SAAgBwZ,EAAKm4B,QAAQtgC,SAAyB,GAAhBhJ,EAAIrI,SAAgBqI,EAAMA,EAAI8/B,YAAc3uB,EAAKm4B,SAAWtpC,GAGjH,OAAOmR,EAFPjlB,GAAQ,KAOlB,GAASjE,UAAUohD,QAAU,SAAkBrpC,GAE7C,IADA,IAAImR,EAAOnR,EAAI6gC,WACN7mC,EAAMmX,EAAMnX,EAAKA,EAAMA,EAAIlP,OAAU,GAAIkP,GAAOzR,KAAQ,OAAO4oB,GAG1E,GAASlpB,UAAUs9C,WAAa,SAAqBvlC,EAAK/Q,EAAQqe,GAChE,IAAK,IAAI3R,EAAOqE,EAAKrE,EAAMA,EAAOA,EAAKmkC,WAAY,CACjD,IAAI3uB,EAAO5oB,KAAK8gD,QAAQ1tC,GACxB,GAAIwV,EAAQ,OAAOA,EAAK43B,gBAAgB/oC,EAAK/Q,EAAQqe,GAEvD,OAAQ,GAMV,GAASrlB,UAAUshD,OAAS,SAAiBx+C,GAC3C,IAAK,IAAI1E,EAAI,EAAG4I,EAAS,EAAG5I,EAAIkC,KAAK+gC,SAAS5gC,OAAQrC,IAAK,CACzD,IAAI2E,EAAQzC,KAAK+gC,SAASjjC,GAAI4E,EAAMgE,EAASjE,EAAMjB,KACnD,GAAIkF,GAAUlE,GAAOE,GAAOgE,EAAQ,CAClC,MAAQjE,EAAM26C,QAAU36C,EAAMs+B,SAAS5gC,QAAUsC,EAAQA,EAAMs+B,SAAS,GACxE,OAAOt+B,EAET,GAAID,EAAME,EAAO,OAAOD,EAAMu+C,OAAOx+C,EAAMkE,EAASjE,EAAM26C,QAC1D12C,EAAShE,IAKb,GAAShD,UAAU69C,WAAa,SAAqB/6C,EAAK8oB,GACxD,IAAKtrB,KAAK0f,WAAc,MAAO,CAACrc,KAAMrD,KAAKyX,IAAK/Q,OAAQ,GACxD,IAAK,IAAIA,EAAS,EAAG5I,EAAI,EAAG6F,GAAQ,GAAO7F,IAAK6F,GAAQ,EAAO,CAE7D,KAAO7F,EAAIkC,KAAK+gC,SAAS5gC,SAAWH,KAAK+gC,SAASjjC,GAAG+hD,gBACjB7/C,KAAK+gC,SAASjjC,GAAG2Z,IAAI8/B,YAAcv3C,KAAK0f,aACxEhZ,GAAU1G,KAAK+gC,SAASjjC,KAAK0D,KACjC,IAAIiB,EAAQ3E,GAAKkC,KAAK+gC,SAAS5gC,OAAS,KAAOH,KAAK+gC,SAASjjC,GAC7D,GAAI4I,GAAUlE,IAAgB,GAAR8oB,IAAc7oB,IAAUA,EAAMjB,MAAQiB,EAAM26C,QAAW9xB,EAAO,GAAK3nB,IACrFlB,GAASA,EAAMu9C,SAAWx9C,EAAMkE,EAASjE,EAAMjB,KAAQ,MAAO,CAChE6B,KAAMrD,KAAK0f,WACXhZ,OAAQjE,EAAQ60C,EAAS70C,EAAMgV,KAAOzX,KAAK0f,WAAWI,WAAW3f,QAEnE,IAAKsC,EAAS,MAAM,IAAIyE,MAAM,oBAAsB1E,GACpD,IAAIE,EAAMgE,EAASjE,EAAMjB,KACzB,IAAKiB,EAAMu9C,UAAY10B,EAAO,IAAM7oB,EAAM26C,OAAS16C,GAAOF,EAAME,EAAMF,GAClE,OAAOC,EAAM86C,WAAW/6C,EAAMkE,EAASjE,EAAM26C,OAAQ9xB,GACzD5kB,EAAShE,IAMb,GAAShD,UAAUuhD,WAAa,SAAqB1/C,EAAMc,EAAImN,GAG7D,QAFgB,IAATA,IAAkBA,EAAO,GAEJ,GAAxBxP,KAAK+gC,SAAS5gC,OACd,MAAO,CAACkD,KAAMrD,KAAK0f,WAAYne,KAAMA,EAAMc,GAAIA,EAAI6+C,WAAY,EAAGC,SAAUnhD,KAAK0f,WAAWI,WAAW3f,QAG3G,IADA,IAAI+gD,GAAc,EAAGC,GAAY,EACxBz6C,EAAS8I,EAAM1R,EAAI,GAAIA,IAAK,CACnC,IAAI2E,EAAQzC,KAAK+gC,SAASjjC,GAAI4E,EAAMgE,EAASjE,EAAMjB,KACnD,IAAmB,GAAf0/C,GAAoB3/C,GAAQmB,EAAK,CACnC,IAAI0+C,EAAY16C,EAASjE,EAAM26C,OAE/B,GAAI77C,GAAQ6/C,GAAa/+C,GAAMK,EAAMD,EAAM26C,QAAU36C,EAAMY,MACvDZ,EAAMid,YAAc1f,KAAK0f,WAAWe,SAAShe,EAAMid,YACnD,OAAOjd,EAAMw+C,WAAW1/C,EAAMc,EAAI++C,GAEtC7/C,EAAOmF,EACP,IAAK,IAAI7B,EAAI/G,EAAG+G,EAAI,EAAGA,IAAK,CAC1B,IAAIskB,EAAOnpB,KAAK+gC,SAASl8B,EAAI,GAC7B,GAAIskB,EAAK3nB,MAAQ2nB,EAAK1R,IAAI8/B,YAAcv3C,KAAK0f,aAAeyJ,EAAKk4B,aAAa,GAAI,CAChFH,EAAa5J,EAASnuB,EAAK1R,KAAO,EAClC,MAEFlW,GAAQ4nB,EAAK3nB,MAEI,GAAf0/C,IAAoBA,EAAa,GAEvC,GAAIA,GAAc,IAAMx+C,EAAML,GAAMvE,GAAKkC,KAAK+gC,SAAS5gC,OAAS,GAAI,CAClEkC,EAAKK,EACL,IAAK,IAAI4+C,EAAMxjD,EAAI,EAAGwjD,EAAMthD,KAAK+gC,SAAS5gC,OAAQmhD,IAAO,CACvD,IAAIj1C,EAAOrM,KAAK+gC,SAASugB,GACzB,GAAIj1C,EAAK7K,MAAQ6K,EAAKoL,IAAI8/B,YAAcv3C,KAAK0f,aAAerT,EAAKg1C,cAAc,GAAI,CACjFF,EAAW7J,EAASjrC,EAAKoL,KACzB,MAEFpV,GAAMgK,EAAK7K,MAEI,GAAb2/C,IAAkBA,EAAWnhD,KAAK0f,WAAWI,WAAW3f,QAC5D,MAEFuG,EAAShE,EAEX,MAAO,CAACW,KAAMrD,KAAK0f,WAAYne,KAAMA,EAAMc,GAAIA,EAAI6+C,WAAYA,EAAYC,SAAUA,IAGvF,GAASzhD,UAAU2hD,aAAe,SAAuB/1B,GACvD,GAAItrB,KAAKo9C,SAAWp9C,KAAK0f,aAAe1f,KAAK+gC,SAAS5gC,OAAU,OAAO,EACvE,IAAIsC,EAAQzC,KAAK+gC,SAASzV,EAAO,EAAI,EAAItrB,KAAK+gC,SAAS5gC,OAAS,GAChE,OAAqB,GAAdsC,EAAMjB,MAAaiB,EAAM4+C,aAAa/1B,IAI/C,GAAS5rB,UAAU+/C,YAAc,SAAsBj9C,GACrD,IAAIoG,EAAM5I,KAAKu9C,WAAW/6C,EAAK,GACzBa,EAAOuF,EAAIvF,KACXqD,EAASkC,EAAIlC,OACnB,GAAqB,GAAjBrD,EAAK+L,UAAiB1I,GAAUrD,EAAKyc,WAAW3f,OAChD,MAAM,IAAImE,WAAW,qBAAuB9B,GAChD,OAAOa,EAAKyc,WAAWpZ,IASzB,GAAShH,UAAU6mB,aAAe,SAAuB3C,EAAQ7I,EAAM+gC,EAAMyF,GAG3E,IADA,IAAIhgD,EAAOqB,KAAKE,IAAI8gB,EAAQ7I,GAAO1Y,EAAKO,KAAKC,IAAI+gB,EAAQ7I,GAChDjd,EAAI,EAAG4I,EAAS,EAAG5I,EAAIkC,KAAK+gC,SAAS5gC,OAAQrC,IAAK,CACzD,IAAI2E,EAAQzC,KAAK+gC,SAASjjC,GAAI4E,EAAMgE,EAASjE,EAAMjB,KACnD,GAAID,EAAOmF,GAAUrE,EAAKK,EACtB,OAAOD,EAAM8jB,aAAa3C,EAASld,EAASjE,EAAM26C,OAAQriC,EAAOrU,EAASjE,EAAM26C,OAAQtB,EAAMyF,GAClG76C,EAAShE,EAGX,IAAI8+C,EAAYxhD,KAAKu9C,WAAW35B,EAAQA,GAAU,EAAI,GAClD69B,EAAU1mC,GAAQ6I,EAAS49B,EAAYxhD,KAAKu9C,WAAWxiC,EAAMA,GAAQ,EAAI,GACzEy9B,EAASsD,EAAKkD,eAEd0C,GAAW,EAKf,IAAK,EAAOlV,OAAS,EAAOF,SAAW1oB,GAAU7I,EAAM,CACrD,IAAI1X,EAAOm+C,EAAUn+C,KACfs+C,EAAWH,EAAU96C,OAC3B,GAAqB,GAAjBrD,EAAK+L,UACPsyC,EAAWC,GAA4C,MAAhCt+C,EAAKwa,UAAU8jC,EAAW,KAEjCA,GAAYt+C,EAAKwa,UAAU1d,QACvCkD,EAAKmb,aAA4C,MAA7Bnb,EAAKmb,YAAYR,WACrCwjC,EAAYC,EAAU,CAACp+C,KAAMA,EAAKk0C,WAAY7wC,OAAQ4wC,EAASj0C,GAAQ,QACtE,CACL,IAAI8lB,EAAO9lB,EAAKyc,WAAW6hC,EAAW,GACtCD,EAAWv4B,IAA0B,MAAjBA,EAAKnL,UAA4C,SAAxBmL,EAAKkvB,kBAItD,GAAMkJ,GAASG,GAAY,EAAOpV,SAC9BwL,EAAqB0J,EAAUn+C,KAAMm+C,EAAU96C,OAAQ8xC,EAAOoJ,WAAYpJ,EAAOqJ,gBACjF/J,EAAqB2J,EAAQp+C,KAAMo+C,EAAQ/6C,OAAQ8xC,EAAO4G,UAAW5G,EAAO8G,aAFhF,CAQA,IAAIwC,GAAiB,EACrB,IAAKtJ,EAAOuJ,QAAUn+B,GAAU7I,KAAU2mC,EAAU,CAClDlJ,EAAOwJ,SAASR,EAAUn+C,KAAMm+C,EAAU96C,QAC1C,IACMkd,GAAU7I,GAAQy9B,EAAOuJ,OAAON,EAAQp+C,KAAMo+C,EAAQ/6C,QAC1Do7C,GAAiB,EACjB,MAAO76C,GAKP,KAAMA,aAAeg7C,cAAiB,MAAMh7C,GAIhD,IAAK66C,EAAgB,CACnB,GAAIl+B,EAAS7I,EAAM,CAAE,IAAI9O,EAAMu1C,EAAWA,EAAYC,EAASA,EAAUx1C,EACzE,IAAIwgB,EAAQ9K,SAASg2B,cACrBlrB,EAAMmrB,OAAO6J,EAAQp+C,KAAMo+C,EAAQ/6C,QACnC+lB,EAAMorB,SAAS2J,EAAUn+C,KAAMm+C,EAAU96C,QACzC8xC,EAAOkH,kBACPlH,EAAOnvC,SAASojB,MAKpB,GAAS/sB,UAAUwiD,eAAiB,SAAyBC,GAC3D,OAAQniD,KAAK0f,YAA+B,aAAjByiC,EAASr7C,MAGtC/E,GAAmBg+C,YAAYphD,IAAM,WACnC,OAAOqB,KAAK0f,YAAc1f,KAAK0f,YAAc1f,KAAKyX,MAAQzX,KAAKyX,IAAIgJ,SAASzgB,KAAK0f,aAKnF,GAAShgB,UAAU0iD,UAAY,SAAoB7gD,EAAMc,GACvD,IAAK,IAAIqE,EAAS,EAAG5I,EAAI,EAAGA,EAAIkC,KAAK+gC,SAAS5gC,OAAQrC,IAAK,CACzD,IAAI2E,EAAQzC,KAAK+gC,SAASjjC,GAAI4E,EAAMgE,EAASjE,EAAMjB,KACnD,GAAIkF,GAAUhE,EAAMnB,GAAQmB,GAAOL,GAAMqE,EAASnF,EAAOmB,GAAOL,EAAKqE,EAAQ,CAC3E,IAAI27C,EAAc37C,EAASjE,EAAM26C,OAAQkF,EAAY5/C,EAAMD,EAAM26C,OACjE,GAAI77C,GAAQ8gD,GAAehgD,GAAMigD,EAK/B,OAJAtiD,KAAK4/C,MAAQr+C,GAAQmF,GAAUrE,GAAMK,EA1VO,EAAnB,OA2VrBnB,GAAQ8gD,GAAehgD,GAAMigD,IAC5B7/C,EAAMs9C,aAAet9C,EAAMgV,IAAI8/B,YAAcv3C,KAAK0f,WAChDjd,EAAM2/C,UAAU7gD,EAAO8gD,EAAahgD,EAAKggD,GADsB5/C,EAAMm9C,MA5VhB,GAgW5Dn9C,EAAMm9C,MAhWsD,EAmWhEl5C,EAAShE,EAEX1C,KAAK4/C,MArW6C,GAwWpD,GAASlgD,UAAU6iD,iBAAmB,WAEpC,IADA,IAAIlhC,EAAQ,EACHhe,EAAOrD,KAAKuC,OAAQc,EAAMA,EAAOA,EAAKd,OAAQ8e,IAAS,CAC9D,IAAIu+B,EAAiB,GAATv+B,EA3WoC,EAAnB,EA4WzBhe,EAAKu8C,MAAQA,IAASv8C,EAAKu8C,MAAQA,KAI3C79C,GAAmBi+C,QAAQrhD,IAAM,WAAc,OAAO,GAEtDH,OAAOiI,iBAAkB,GAAS/G,UAAWqC,IAI7C,IAAIygD,GAAU,GAIVC,GAA+B,SAAUC,GAC3C,SAASD,EAAelgD,EAAQogD,EAAQ30B,EAAMxrB,GAC5C,IAAIhC,EAAMiX,EAAMkrC,EAAO77C,KAAK4a,MAK5B,GAJkB,mBAAPjK,IAAqBA,EAAMA,EAAIuW,GAAM,WAC9C,OAAKxtB,EACDA,EAAK+B,OAAiB/B,EAAK+B,OAAOg+C,eAAe//C,QAArD,EADoBgC,OAGjBmgD,EAAO77C,KAAKqE,KAAKy3C,IAAK,CACzB,GAAoB,GAAhBnrC,EAAIrI,SAAe,CACrB,IAAIuM,EAAOgG,SAASmB,cAAc,QAClCnH,EAAK8C,YAAYhH,GACjBA,EAAMkE,EAERlE,EAAI4gC,iBAAkB,EACtB5gC,EAAIorC,UAAU3gC,IAAI,sBAEpBwgC,EAASzkD,KAAK+B,KAAMuC,EAAQigD,GAAS/qC,EAAK,MAC1CzX,KAAK2iD,OAASA,EACdniD,EAAOR,KAGJ0iD,IAAWD,EAAet7C,UAAYu7C,GAC3CD,EAAe/iD,UAAYlB,OAAOY,OAAQsjD,GAAYA,EAAShjD,WAC/D+iD,EAAe/iD,UAAUO,YAAcwiD,EAEvC,IAAIn6C,EAAuB,CAAEu3C,eAAgB,CAAE59C,cAAc,GAAO+9C,QAAS,CAAE/9C,cAAc,IAyB7F,OAvBAqG,EAAqBu3C,eAAelhD,IAAM,WACxC,OAAOqB,KAAK2iD,OAAO77C,KAAKwkB,KAAO,GAGjCm3B,EAAe/iD,UAAUugD,cAAgB,SAAwB0C,GAC/D,OA1ZY,GA0ZL3iD,KAAK4/C,OAAsB+C,EAAO77C,KAAKzC,GAAGrE,KAAK2iD,OAAO77C,OAG/D27C,EAAe/iD,UAAU2gD,UAAY,WAAwB,MAAO,CAACzhC,QAAQ,IAE7E6jC,EAAe/iD,UAAU4gD,UAAY,SAAoBtT,GACvD,IAAI8V,EAAO9iD,KAAK2iD,OAAOx3C,KAAKm1C,UAC5B,QAAOwC,GAAOA,EAAK9V,IAGrByV,EAAe/iD,UAAUwiD,eAAiB,SAAyBC,GACjE,MAAwB,aAAjBA,EAASr7C,MAAuB9G,KAAK2iD,OAAOx3C,KAAK43C,iBAG1Dz6C,EAAqB03C,QAAQrhD,IAAM,WAAc,OAAO,GAExDH,OAAOiI,iBAAkBg8C,EAAe/iD,UAAW4I,GAE5Cm6C,EAlDyB,CAmDhC,IAEEO,GAAoC,SAAUN,GAChD,SAASM,EAAoBzgD,EAAQkV,EAAKwrC,EAAS9/C,GACjDu/C,EAASzkD,KAAK+B,KAAMuC,EAAQigD,GAAS/qC,EAAK,MAC1CzX,KAAKijD,QAAUA,EACfjjD,KAAKmD,KAAOA,EAGTu/C,IAAWM,EAAoB77C,UAAYu7C,GAChDM,EAAoBtjD,UAAYlB,OAAOY,OAAQsjD,GAAYA,EAAShjD,WACpEsjD,EAAoBtjD,UAAUO,YAAc+iD,EAE5C,IAAIx3C,EAAuB,CAAEhK,KAAM,CAAES,cAAc,IAmBnD,OAjBAuJ,EAAqBhK,KAAK7C,IAAM,WAAc,OAAOqB,KAAKmD,KAAKhD,QAE/D6iD,EAAoBtjD,UAAU8gD,gBAAkB,SAA0B/oC,EAAK/Q,GAC7E,OAAI+Q,GAAOzX,KAAKijD,QAAkBjjD,KAAKm9C,YAAcz2C,EAAS1G,KAAKwB,KAAO,GACnExB,KAAKm9C,WAAaz2C,GAG3Bs8C,EAAoBtjD,UAAU69C,WAAa,SAAqB/6C,GAC9D,MAAO,CAACa,KAAMrD,KAAKijD,QAASv8C,OAAQlE,IAGtCwgD,EAAoBtjD,UAAUwiD,eAAiB,SAAyBgB,GACtE,MAAoB,kBAAbA,EAAIp8C,MAA4Bo8C,EAAIn5C,OAAO8T,WAAaqlC,EAAIC,UAGrE3kD,OAAOiI,iBAAkBu8C,EAAoBtjD,UAAW8L,GAEjDw3C,EA9B8B,CA+BrC,IAOE,GAA6B,SAAUN,GACzC,SAASU,EAAa7gD,EAAQuL,EAAM2J,EAAKiI,GACvCgjC,EAASzkD,KAAK+B,KAAMuC,EAAQ,GAAIkV,EAAKiI,GACrC1f,KAAK8N,KAAOA,EAwCd,OArCK40C,IAAWU,EAAaj8C,UAAYu7C,GACzCU,EAAa1jD,UAAYlB,OAAOY,OAAQsjD,GAAYA,EAAShjD,WAC7D0jD,EAAa1jD,UAAUO,YAAcmjD,EAErCA,EAAahkD,OAAS,SAAiBmD,EAAQuL,EAAMuF,EAAQ2a,GAC3D,IAAIq1B,EAASr1B,EAAKs1B,UAAUx1C,EAAKhH,KAAKzI,MAClC8M,EAAOk4C,GAAUA,EAAOv1C,EAAMkgB,EAAM3a,GAGxC,OAFKlI,GAASA,EAAKsM,MACftM,EAAO,IAAcmX,WAAWX,SAAU7T,EAAKhH,KAAKqE,KAAKuW,MAAM5T,EAAMuF,KAClE,IAAI+vC,EAAa7gD,EAAQuL,EAAM3C,EAAKsM,IAAKtM,EAAKuU,YAAcvU,EAAKsM,MAG1E2rC,EAAa1jD,UAAU2gD,UAAY,WAAwB,MAAO,CAACvyC,KAAM9N,KAAK8N,KAAKhH,KAAKzI,KAAMmI,MAAOxG,KAAK8N,KAAKtH,MAAOmZ,eAAgB3f,KAAK0f,aAE3I0jC,EAAa1jD,UAAUwgD,YAAc,SAAsBpyC,GAAQ,OAzeD,GAyeQ9N,KAAK4/C,OAAuB5/C,KAAK8N,KAAKzJ,GAAGyJ,IAEnHs1C,EAAa1jD,UAAU0iD,UAAY,SAAoB7gD,EAAMc,GAG3D,GAFAqgD,EAAShjD,UAAU0iD,UAAUnkD,KAAK+B,KAAMuB,EAAMc,GA5elC,GA8eRrC,KAAK4/C,MAAoB,CAE3B,IADA,IAAIr9C,EAASvC,KAAKuC,QACVA,EAAOc,MAAQd,EAASA,EAAOA,OACnCA,EAAOq9C,MAAQ5/C,KAAK4/C,QAASr9C,EAAOq9C,MAAQ5/C,KAAK4/C,OACrD5/C,KAAK4/C,MAlfK,IAsfdwD,EAAa1jD,UAAUgB,MAAQ,SAAgBa,EAAMc,EAAI2rB,GACvD,IAAI5pB,EAAOg/C,EAAahkD,OAAOY,KAAKuC,OAAQvC,KAAK8N,MAAM,EAAMkgB,GACzDznB,EAAQvG,KAAK+gC,SAAUv/B,EAAOxB,KAAKwB,KACnCa,EAAKb,IAAQ+E,EAAQg9C,GAAah9C,EAAOlE,EAAIb,EAAMwsB,IACnDzsB,EAAO,IAAKgF,EAAQg9C,GAAah9C,EAAO,EAAGhF,EAAMysB,IACrD,IAAK,IAAIlwB,EAAI,EAAGA,EAAIyI,EAAMpG,OAAQrC,IAAOyI,EAAMzI,GAAGyE,OAAS6B,EAE3D,OADAA,EAAK28B,SAAWx6B,EACTnC,GAGFg/C,EA3CuB,CA4C9B,IAKE,GAA6B,SAAUV,GACzC,SAASc,EAAajhD,EAAQc,EAAMogD,EAAWC,EAAWjsC,EAAKiI,EAAYqhC,EAAS/yB,EAAMxrB,GACxFkgD,EAASzkD,KAAK+B,KAAMuC,EAAQc,EAAKE,OAASi/C,GAAU,GAAI/qC,EAAKiI,GAC7D1f,KAAK+gD,QAAUA,EACf/gD,KAAKqD,KAAOA,EACZrD,KAAKyjD,UAAYA,EACjBzjD,KAAK0jD,UAAYA,EACbhkC,GAAc1f,KAAK2jD,eAAe31B,EAAMxrB,GAGzCkgD,IAAWc,EAAar8C,UAAYu7C,GACzCc,EAAa9jD,UAAYlB,OAAOY,OAAQsjD,GAAYA,EAAShjD,WAC7D8jD,EAAa9jD,UAAUO,YAAcujD,EAErC,IAAIj2C,EAAuB,CAAE/L,KAAM,CAAES,cAAc,GAAOm7C,OAAQ,CAAEn7C,cAAc,GAAO+9C,QAAS,CAAE/9C,cAAc,IA+MlH,OApMAuhD,EAAapkD,OAAS,SAAiBmD,EAAQc,EAAMogD,EAAWC,EAAW11B,EAAMxrB,GAC/E,IAAIg5B,EAEyCooB,EAAzCP,EAASr1B,EAAKs1B,UAAUjgD,EAAKyD,KAAKzI,MAClC8M,EAAOk4C,GAAUA,EAAOhgD,EAAM2qB,GAAM,WAGtC,OAAK41B,EACDA,EAAQrhD,OAAiBqhD,EAAQrhD,OAAOg+C,eAAeqD,QAA3D,EADuBphD,IAEtBihD,GAEChsC,EAAMtM,GAAQA,EAAKsM,IAAKiI,EAAavU,GAAQA,EAAKuU,WACtD,GAAIrc,EAAKC,OACP,GAAKmU,GACA,GAAoB,GAAhBA,EAAIrI,SAAiB,MAAM,IAAI9K,WAAW,iDADvCmT,EAAMkK,SAAStC,eAAehc,EAAKF,WAErCsU,IAC2DA,GAAzE+jB,EAAS,IAAclZ,WAAWX,SAAUte,EAAKyD,KAAKqE,KAAKuW,MAAMre,KAAqBoU,IAAKiI,EAAa8b,EAAO9b,YAExGA,GAAerc,EAAKC,QAA0B,MAAhBmU,EAAIuG,WAChCvG,EAAIsnB,aAAa,qBAAsBtnB,EAAI4gC,iBAAkB,GAC9Dh1C,EAAKyD,KAAKqE,KAAKg0B,YAAa1nB,EAAI0nB,WAAY,IAGlD,IAAI4hB,EAAUtpC,EAGd,OAFAA,EAAMosC,GAAepsC,EAAKgsC,EAAWpgD,GAEjC8H,EACOy4C,EAAU,IAAIE,GAAmBvhD,EAAQc,EAAMogD,EAAWC,EAAWjsC,EAAKiI,EAAYqhC,EACvD51C,EAAM6iB,EAAMxrB,EAAM,GACnDa,EAAKC,OACH,IAAIygD,GAAaxhD,EAAQc,EAAMogD,EAAWC,EAAWjsC,EAAKspC,EAAS/yB,GAEnE,IAAIw1B,EAAajhD,EAAQc,EAAMogD,EAAWC,EAAWjsC,EAAKiI,EAAYqhC,EAAS/yB,EAAMxrB,EAAM,IAGxGghD,EAAa9jD,UAAU2gD,UAAY,WACjC,IAAIppC,EAASjX,KAGb,GAAIA,KAAKqD,KAAKyD,KAAKqE,KAAK64C,cAAiB,OAAO,KAKhD,IAAI5sC,EAAO,CAAC/T,KAAMrD,KAAKqD,KAAKyD,KAAKzI,KAAMmI,MAAOxG,KAAKqD,KAAKmD,OAIxD,OAHIxG,KAAKqD,KAAKyD,KAAKqE,KAAKugB,OAAQtU,EAAKgE,mBAAqB,QACtDpb,KAAK0f,aAAe1f,KAAK+/C,YAAe3oC,EAAKuI,eAAiB3f,KAAK0f,WAChEtI,EAAKqI,WAAa,WAAc,OAAOxI,EAAOyI,WAAa,IAAS1b,MAAQiT,EAAO5T,KAAKtD,SACxFqX,GAGTosC,EAAa9jD,UAAUygD,YAAc,SAAsB98C,EAAMogD,EAAWC,GAC1E,OAnlBY,GAmlBL1jD,KAAK4/C,OAAsBv8C,EAAKgB,GAAGrE,KAAKqD,OAC7C4gD,GAAcR,EAAWzjD,KAAKyjD,YAAcC,EAAUr/C,GAAGrE,KAAK0jD,YAGlEn2C,EAAqB/L,KAAK7C,IAAM,WAAc,OAAOqB,KAAKqD,KAAKvB,UAE/DyL,EAAqB6vC,OAAOz+C,IAAM,WAAc,OAAOqB,KAAKqD,KAAKE,OAAS,EAAI,GAM9EigD,EAAa9jD,UAAUikD,eAAiB,SAAyB31B,EAAMxrB,GACrE,IAAIyU,EAASjX,KAETqT,EAASrT,KAAKqD,KAAKoJ,cAAesrC,EAAMv1C,EACxC0hD,EAAc7wC,GAAU2a,EAAKyP,WAAaz9B,KAAKmkD,qBAAqBn2B,EAAMxrB,GAC1E4hD,EAAU,IAAIC,GAAgBrkD,KAAMkkD,GAAeA,EAAY7gD,OAklBvE,SAAkBd,EAAQ+hD,EAAMC,EAAUC,GACxC,IAAIC,EAASH,EAAKG,OAAOliD,GAASmE,EAAS,EAE3C,GAAqB,GAAjB+9C,EAAOtkD,OAAa,CACtB,IAAK,IAAIrC,EAAI,EAAGA,EAAIyE,EAAOJ,WAAYrE,IAAK,CAC1C,IAAI2E,EAAQF,EAAOE,MAAM3E,GACzB0mD,EAAO/hD,EAAOgiD,EAAQH,EAAKI,SAASh+C,EAAQjE,GAAQ3E,GACpD4I,GAAUjE,EAAMX,SAElB,OAIF,IADA,IAAI6iD,EAAY,EAAG3xC,EAAS,GAAI4xC,EAAW,KAClCC,EAAc,IAAK,CAC1B,GAAIF,EAAYF,EAAOtkD,QAAUskD,EAAOE,GAAWtiD,IAAMqE,EAAQ,CAE/D,IADA,IAAIi8C,EAAS8B,EAAOE,KAAcG,OAAU,EACrCH,EAAYF,EAAOtkD,QAAUskD,EAAOE,GAAWtiD,IAAMqE,IACvDo+C,IAAYA,EAAU,CAACnC,KAAUhiD,KAAK8jD,EAAOE,MAClD,GAAIG,EAAS,CACXA,EAAQ58C,KAAK68C,IACb,IAAK,IAAIrzC,EAAM,EAAGA,EAAMozC,EAAQ3kD,OAAQuR,IAAS6yC,EAASO,EAAQpzC,GAAMmzC,IAAeD,QAEvFL,EAAS5B,EAAQkC,IAAeD,GAIpC,IAAII,OAAU,EAAU9gD,OAAQ,EAChC,GAAI0gD,EACF1gD,GAAS,EACT8gD,EAAUJ,EACVA,EAAW,SACN,MAAIC,EAActiD,EAAOJ,YAI9B,MAHA+B,EAAQ2gD,EACRG,EAAUziD,EAAOE,MAAMoiD,KAKzB,IAAK,IAAIjzC,EAAM,EAAGA,EAAMoB,EAAO7S,OAAQyR,IAAaoB,EAAOpB,GAAKvP,IAAMqE,GAAUsM,EAAOpS,OAAOgR,IAAO,GACrG,KAAO+yC,EAAYF,EAAOtkD,QAAUskD,EAAOE,GAAWpjD,MAAQmF,GAAU+9C,EAAOE,GAAWtiD,GAAKqE,GAC3FsM,EAAOrS,KAAK8jD,EAAOE,MAEvB,IAAIjiD,EAAMgE,EAASs+C,EAAQljD,SAC3B,GAAIkjD,EAAQ1hD,OAAQ,CAClB,IAAI2hD,EAAQviD,EACRiiD,EAAYF,EAAOtkD,QAAUskD,EAAOE,GAAWpjD,KAAO0jD,IAASA,EAAQR,EAAOE,GAAWpjD,MAC7F,IAAK,IAAI2jD,EAAM,EAAGA,EAAMlyC,EAAO7S,OAAQ+kD,IAAalyC,EAAOkyC,GAAK7iD,GAAK4iD,IAASA,EAAQjyC,EAAOkyC,GAAK7iD,IAC9F4iD,EAAQviD,IACVkiD,EAAWI,EAAQlhD,IAAImhD,EAAQv+C,GAC/Bs+C,EAAUA,EAAQlhD,IAAI,EAAGmhD,EAAQv+C,GACjChE,EAAMuiD,EACN/gD,GAAS,GAIb,IAAIu/C,EAAazwC,EAAO7S,OAClB6kD,EAAQ54C,WAAa44C,EAAQzhD,OAASyP,EAAOmc,QAAO,SAAU/wB,GAAK,OAAQA,EAAEiV,UAC7EL,EAAOtS,QAFoB8hD,GAGjCgC,EAAOQ,EAASvB,EAAWa,EAAKI,SAASh+C,EAAQs+C,GAAU9gD,GAC3DwC,EAAShE,GA5oBTyiD,CAASnlD,KAAKqD,KAAMrD,KAAK0jD,WAAW,SAAUf,EAAQ7kD,EAAGsnD,GACnDzC,EAAOx3C,KAAKrD,MACZs8C,EAAQiB,YAAY1C,EAAOx3C,KAAKrD,MAAOuL,EAAQ2a,GAC1C20B,EAAO77C,KAAKwkB,MAAQ,IAAM85B,GAC/BhB,EAAQiB,YAAYvnD,GAAKmZ,EAAO5T,KAAKlB,WAAa,IAAK8F,KAAOgP,EAAO5T,KAAKZ,MAAM3E,GAAGgK,MAAOuL,EAAQ2a,GAGtGo2B,EAAQkB,YAAY3C,EAAQ30B,EAAM+pB,MACjC,SAAUt1C,EAAOghD,EAAWC,EAAW5lD,GAExCsmD,EAAQiB,YAAY5iD,EAAMqF,MAAOuL,EAAQ2a,GAGzCo2B,EAAQmB,cAAc9iD,EAAOghD,EAAWC,EAAW5lD,IAEjDsmD,EAAQoB,eAAe/iD,EAAOghD,EAAWC,EAAW11B,EAAMlwB,IAE1DsmD,EAAQ76C,QAAQ9G,EAAOghD,EAAWC,EAAW11B,EAAM+pB,GACrDA,GAAOt1C,EAAMX,YAGfsiD,EAAQiB,YAAY7C,GAASnvC,EAAQ2a,GACjChuB,KAAKqD,KAAKoK,aAAe22C,EAAQqB,oBACrCrB,EAAQsB,eAGJtB,EAAQuB,SA/nBoC,GA+nBzB3lD,KAAK4/C,SAEtBsE,GAAelkD,KAAK4lD,wBAAwB53B,EAAMk2B,GA6P5D,SAAS2B,EAAYC,EAAWC,EAAO/3B,GAErC,IADA,IAAIvW,EAAMquC,EAAU9jD,WAAYgkD,GAAU,EACjCloD,EAAI,EAAGA,EAAIioD,EAAM5lD,OAAQrC,IAAK,CACrC,IAAI8qB,EAAOm9B,EAAMjoD,GAAImoD,EAAWr9B,EAAKnR,IACrC,GAAIwuC,EAAS1O,YAAcuO,EAAW,CACpC,KAAOG,GAAYxuC,GAAOA,EAAMyuC,GAAGzuC,GAAMuuC,GAAU,EACnDvuC,EAAMA,EAAI+G,iBAEVwnC,GAAU,EACVF,EAAUK,aAAaF,EAAUxuC,GAEnC,GAAImR,aAAgB,GAAc,CAChC,IAAIpmB,EAAMiV,EAAMA,EAAIsG,gBAAkB+nC,EAAU5jD,UAChD2jD,EAAYj9B,EAAKlJ,WAAYkJ,EAAKmY,SAAU/S,GAC5CvW,EAAMjV,EAAMA,EAAIgc,YAAcsnC,EAAU9jD,YAG5C,KAAOyV,GAAOA,EAAMyuC,GAAGzuC,GAAMuuC,GAAU,EACnCA,GAAWh4B,EAAKo4B,aAAeN,IAAa93B,EAAKo4B,YAAc,MA9Q/DP,CAAY7lD,KAAK0f,WAAY1f,KAAK+gC,SAAU/S,GACxC,EAAOgpB,KAonBjB,SAAkBv/B,GAChB,GAAoB,MAAhBA,EAAIuG,UAAoC,MAAhBvG,EAAIuG,SAAkB,CAChD,IAAIqoC,EAAS5uC,EAAIH,MAAMgvC,QACvB7uC,EAAIH,MAAMgvC,QAAUD,EAAS,kCAC7BzkC,OAAO2kC,iBAAiB9uC,GAAK+uC,UAC7B/uC,EAAIH,MAAMgvC,QAAUD,GAznBAI,CAASzmD,KAAKyX,OAIpC+rC,EAAa9jD,UAAUykD,qBAAuB,SAA+Bn2B,EAAMxrB,GAIjF,IAAIoG,EAAMolB,EAAKld,MAAMwV,UACjB/kB,EAAOqH,EAAIrH,KACXc,EAAKuG,EAAIvG,GACb,OAAM2rB,EAAKld,MAAMwV,qBAAqB,MAAkB/kB,EAAOiB,GAAOH,EAAKG,EAAMxC,KAAKqD,KAAKtD,QAAQyB,MAAnG,CACA,IAAI6kB,EAAM2H,EAAK8tB,KAAKkD,eAChBr+B,EAgnBR,SAAwBtd,EAAMqD,GAC5B,OAAS,CACP,GAAqB,GAAjBrD,EAAK+L,SAAiB,OAAO/L,EACjC,GAAqB,GAAjBA,EAAK+L,UAAiB1I,EAAS,EAAG,CACpC,GAAIrD,EAAKyc,WAAW3f,OAASuG,GAA8C,GAApCrD,EAAKyc,WAAWpZ,GAAQ0I,SAC3D,OAAO/L,EAAKyc,WAAWpZ,GAC3BrD,EAAOA,EAAKyc,WAAWpZ,EAAS,GAChCA,EAAS5E,EAASuB,OACb,MAAqB,GAAjBA,EAAK+L,UAAiB1I,EAASrD,EAAKyc,WAAW3f,QAIxD,OAAO,KAHPkD,EAAOA,EAAKyc,WAAWpZ,GACvBA,EAAS,IA1nBIggD,CAAergC,EAAI+4B,UAAW/4B,EAAIi5B,aACjD,GAAK3+B,GAAa3gB,KAAKyX,IAAIgJ,SAASE,EAAS42B,YAA7C,CAKA,IAAIp0C,EAAOwd,EAAS9C,UAChB8oC,EA2nBR,SAA4Bx0C,EAAMhP,EAAM5B,EAAMc,GAC5C,IAAK,IAAIvE,EAAI,EAAG0E,EAAM,EAAG1E,EAAIqU,EAAKhQ,YAAcK,GAAOH,GAAK,CAC1D,IAAII,EAAQ0P,EAAK1P,MAAM3E,KAAM8oD,EAAapkD,EAE1C,GADAA,GAAOC,EAAMX,SACRW,EAAMa,OAAX,CAEA,IADA,IAAIsJ,EAAMnK,EAAMU,KACTrF,EAAIqU,EAAKhQ,YAAY,CAC1B,IAAIkK,EAAO8F,EAAK1P,MAAM3E,KAEtB,GADA0E,GAAO6J,EAAKvK,UACPuK,EAAK/I,OAAU,MACpBsJ,GAAOP,EAAKlJ,KAEd,GAAIX,GAAOjB,EAAM,CACf,IAAInB,EAAQwM,EAAI0U,YAAYne,EAAMd,EAAKukD,GACvC,GAAIxmD,GAAS,GAAKA,EAAQ+C,EAAKhD,OAASymD,GAAcrlD,EAClD,OAAOqlD,EAAaxmD,IAG5B,OAAQ,EA7oBQymD,CAAmB7mD,KAAKqD,KAAKtD,QAASoD,EAAM5B,EAAOiB,EAAKH,EAAKG,GAE3E,OAAOmkD,EAAU,EAAI,KAAO,CAACtjD,KAAMsd,EAAUne,IAAKmkD,EAASxjD,KAAMA,MAGnEqgD,EAAa9jD,UAAUkmD,wBAA0B,SAAkC53B,EAAMplB,GACvF,IAAIvF,EAAOuF,EAAIvF,KACXb,EAAMoG,EAAIpG,IACVW,EAAOyF,EAAIzF,KAGf,IAAInD,KAAK8gD,QAAQz9C,GAAjB,CAIA,IADA,IAAIwS,EAAUxS,EAERwS,EAAQ0hC,YAAcv3C,KAAK0f,WADzB7J,EAAUA,EAAQ0hC,WAAY,CAEpC,KAAO1hC,EAAQkI,iBAAmBlI,EAAQ0hC,WAAWuP,YAAYjxC,EAAQkI,iBACzE,KAAOlI,EAAQ2I,aAAe3I,EAAQ0hC,WAAWuP,YAAYjxC,EAAQ2I,aACjE3I,EAAQyiC,aAAcziC,EAAQyiC,WAAa,MAEjD,IAAI1vB,EAAO,IAAIo6B,GAAoBhjD,KAAM6V,EAASxS,EAAMF,GACxD6qB,EAAK+4B,iBAAiBpmD,KAAKioB,GAG3B5oB,KAAK+gC,SAAWwiB,GAAavjD,KAAK+gC,SAAUv+B,EAAKA,EAAMW,EAAKhD,OAAQ6tB,EAAMpF,KAM5E46B,EAAa9jD,UAAUY,OAAS,SAAiB+C,EAAMogD,EAAWC,EAAW11B,GAC3E,QAvrBgE,GAurB5DhuB,KAAK4/C,QACJv8C,EAAKO,WAAW5D,KAAKqD,SAC1BrD,KAAKgnD,YAAY3jD,EAAMogD,EAAWC,EAAW11B,IACtC,IAGTw1B,EAAa9jD,UAAUsnD,YAAc,SAAsB3jD,EAAMogD,EAAWC,EAAW11B,GACrFhuB,KAAKinD,gBAAgBxD,GACrBzjD,KAAKqD,KAAOA,EACZrD,KAAK0jD,UAAYA,EACb1jD,KAAK0f,YAAc1f,KAAK2jD,eAAe31B,EAAMhuB,KAAKm9C,YACtDn9C,KAAK4/C,MAlsBO,GAqsBd4D,EAAa9jD,UAAUunD,gBAAkB,SAA0BxD,GACjE,IAAIQ,GAAcR,EAAWzjD,KAAKyjD,WAAlC,CACA,IAAIyD,EAAqC,GAAzBlnD,KAAK+gD,QAAQ3xC,SACzB+3C,EAASnnD,KAAKyX,IAClBzX,KAAKyX,IAAM2vC,GAAepnD,KAAKyX,IAAKzX,KAAK+gD,QACfsG,GAAiBrnD,KAAKyjD,UAAWzjD,KAAKqD,KAAM6jD,GAC5CG,GAAiB5D,EAAWzjD,KAAKqD,KAAM6jD,IAC7DlnD,KAAKyX,KAAO0vC,IACdA,EAAO7O,WAAa,KACpBt4C,KAAKyX,IAAI6gC,WAAat4C,MAExBA,KAAKyjD,UAAYA,IAInBD,EAAa9jD,UAAU4nD,WAAa,WAClCtnD,KAAK+gD,QAAQ8B,UAAU3gC,IAAI,6BACvBliB,KAAK0f,YAAe1f,KAAKqD,KAAKyD,KAAKqE,KAAKg0B,YAAan/B,KAAKyX,IAAI0nB,WAAY,IAIhFqkB,EAAa9jD,UAAU6nD,aAAe,WACpCvnD,KAAK+gD,QAAQ8B,UAAUpiD,OAAO,6BAC1BT,KAAK0f,YAAe1f,KAAKqD,KAAKyD,KAAKqE,KAAKg0B,WAAan/B,KAAKyX,IAAI+vC,gBAAgB,cAGpFj6C,EAAqByyC,QAAQrhD,IAAM,WAAc,OAAOqB,KAAKqD,KAAKqK,QAElElP,OAAOiI,iBAAkB+8C,EAAa9jD,UAAW6N,GAE1Ci2C,EA7NuB,CA8N9B,IAIF,SAASiE,GAAYh8C,EAAKg4C,EAAWC,EAAWjsC,EAAKuW,GAEnD,OADA61B,GAAepsC,EAAKgsC,EAAWh4C,GACxB,IAAI,GAAa,KAAMA,EAAKg4C,EAAWC,EAAWjsC,EAAKA,EAAKA,EAAKuW,EAAM,GAGhF,IAAI+1B,GAA6B,SAAUP,GACzC,SAASO,EAAaxhD,EAAQc,EAAMogD,EAAWC,EAAWjsC,EAAKspC,EAAS/yB,GACtEw1B,EAAavlD,KAAK+B,KAAMuC,EAAQc,EAAMogD,EAAWC,EAAWjsC,EAAK,KAAMspC,EAAS/yB,GAG7Ew1B,IAAeO,EAAa58C,UAAYq8C,GAC7CO,EAAarkD,UAAYlB,OAAOY,OAAQokD,GAAgBA,EAAa9jD,WACrEqkD,EAAarkD,UAAUO,YAAc8jD,EAErC,IAAIp0C,EAAuB,CAAEqwC,QAAS,CAAE/9C,cAAc,IAiDtD,OA/CA8hD,EAAarkD,UAAU2gD,UAAY,WAEjC,IADA,IAAIxhC,EAAO7e,KAAK+gD,QAAQxJ,WACjB14B,GAAQA,GAAQ7e,KAAKyX,MAAQoH,EAAK6oC,UAAY7oC,EAAOA,EAAK04B,WACjE,MAAO,CAAC14B,KAAMA,IAAQ,IAGxBklC,EAAarkD,UAAUY,OAAS,SAAiB+C,EAAMogD,EAAW77C,EAAGomB,GACnE,QA/vBgE,GA+vB5DhuB,KAAK4/C,OA/vBG,GA+vBqB5/C,KAAK4/C,QAAuB5/C,KAAK2nD,aAC7DtkD,EAAKO,WAAW5D,KAAKqD,SAC1BrD,KAAKinD,gBAAgBxD,GAjwBT,GAkwBPzjD,KAAK4/C,OAAsBv8C,EAAKF,MAAQnD,KAAKqD,KAAKF,MAASE,EAAKF,MAAQnD,KAAK+gD,QAAQljC,YACxF7d,KAAK+gD,QAAQljC,UAAYxa,EAAKF,KAC1B6qB,EAAKo4B,aAAepmD,KAAK+gD,UAAW/yB,EAAKo4B,YAAc,OAE7DpmD,KAAKqD,KAAOA,EACZrD,KAAK4/C,MAvwBO,GAwwBL,IAGTmE,EAAarkD,UAAUioD,SAAW,WAEhC,IADA,IAAI7B,EAAY9lD,KAAKuC,OAAOmd,WACnBngB,EAAIS,KAAK+gD,QAASxhD,EAAGA,EAAIA,EAAEg4C,WAAc,GAAIh4C,GAAKumD,EAAa,OAAO,EAC/E,OAAO,GAGT/B,EAAarkD,UAAU69C,WAAa,SAAqB/6C,GACvD,MAAO,CAACa,KAAMrD,KAAK+gD,QAASr6C,OAAQlE,IAGtCuhD,EAAarkD,UAAU8gD,gBAAkB,SAA0B/oC,EAAK/Q,EAAQqe,GAC9E,OAAItN,GAAOzX,KAAK+gD,QAAkB/gD,KAAKm9C,WAAav6C,KAAKE,IAAI4D,EAAQ1G,KAAKqD,KAAKF,KAAKhD,QAC7EqjD,EAAa9jD,UAAU8gD,gBAAgBviD,KAAK+B,KAAMyX,EAAK/Q,EAAQqe,IAGxEg/B,EAAarkD,UAAUwiD,eAAiB,SAAyBC,GAC/D,MAAwB,iBAAjBA,EAASr7C,MAA4C,aAAjBq7C,EAASr7C,MAGtDi9C,EAAarkD,UAAUgB,MAAQ,SAAgBa,EAAMc,EAAI2rB,GACvD,IAAI3qB,EAAOrD,KAAKqD,KAAKS,IAAIvC,EAAMc,GAAKoV,EAAMkK,SAAStC,eAAehc,EAAKF,MACvE,OAAO,IAAI4gD,EAAa/jD,KAAKuC,OAAQc,EAAMrD,KAAKyjD,UAAWzjD,KAAK0jD,UAAWjsC,EAAKA,EAAKuW,IAGvFre,EAAqBqwC,QAAQrhD,IAAM,WAAc,OAAO,GAExDH,OAAOiI,iBAAkBs9C,EAAarkD,UAAWiQ,GAE1Co0C,EA1DuB,CA2D9B,IAIE6D,GAA+B,SAAUlF,GAC3C,SAASkF,IACPlF,EAAS55B,MAAM9oB,KAAM+tB,WAGlB20B,IAAWkF,EAAezgD,UAAYu7C,GAC3CkF,EAAeloD,UAAYlB,OAAOY,OAAQsjD,GAAYA,EAAShjD,WAC/DkoD,EAAeloD,UAAUO,YAAc2nD,EAEvC,IAAIvyC,EAAuB,CAAE2qC,QAAS,CAAE/9C,cAAc,IAQtD,OANA2lD,EAAeloD,UAAU2gD,UAAY,WAAwB,MAAO,CAACzhC,QAAQ,IAC7EgpC,EAAeloD,UAAU0gD,YAAc,WAA0B,OAxzBnD,GAwzB0DpgD,KAAK4/C,OAC7EvqC,EAAqB2qC,QAAQrhD,IAAM,WAAc,OAAO,GAExDH,OAAOiI,iBAAkBmhD,EAAeloD,UAAW2V,GAE5CuyC,EAjByB,CAkBhC,IAKE9D,GAAmC,SAAUN,GAC/C,SAASM,EAAmBvhD,EAAQc,EAAMogD,EAAWC,EAAWjsC,EAAKiI,EAAYqhC,EAAS51C,EAAM6iB,EAAMxrB,GACpGghD,EAAavlD,KAAK+B,KAAMuC,EAAQc,EAAMogD,EAAWC,EAAWjsC,EAAKiI,EAAYqhC,EAAS/yB,EAAMxrB,GAC5FxC,KAAKmL,KAAOA,EAiDd,OA9CKq4C,IAAeM,EAAmB38C,UAAYq8C,GACnDM,EAAmBpkD,UAAYlB,OAAOY,OAAQokD,GAAgBA,EAAa9jD,WAC3EokD,EAAmBpkD,UAAUO,YAAc6jD,EAK3CA,EAAmBpkD,UAAUY,OAAS,SAAiB+C,EAAMogD,EAAWC,EAAW11B,GACjF,GAj1BgE,GAi1B5DhuB,KAAK4/C,MAAuB,OAAO,EACvC,GAAI5/C,KAAKmL,KAAK7K,OAAQ,CACpB,IAAIqB,EAAS3B,KAAKmL,KAAK7K,OAAO+C,EAAMogD,GAEpC,OADI9hD,GAAU3B,KAAKgnD,YAAY3jD,EAAMogD,EAAWC,EAAW11B,GACpDrsB,EACF,SAAK3B,KAAK0f,aAAerc,EAAKE,SAG5BigD,EAAa9jD,UAAUY,OAAOrC,KAAK+B,KAAMqD,EAAMogD,EAAWC,EAAW11B,IAIhF81B,EAAmBpkD,UAAU4nD,WAAa,WACxCtnD,KAAKmL,KAAKm8C,WAAatnD,KAAKmL,KAAKm8C,aAAe9D,EAAa9jD,UAAU4nD,WAAWrpD,KAAK+B,OAGzF8jD,EAAmBpkD,UAAU6nD,aAAe,WAC1CvnD,KAAKmL,KAAKo8C,aAAevnD,KAAKmL,KAAKo8C,eAAiB/D,EAAa9jD,UAAU6nD,aAAatpD,KAAK+B,OAG/F8jD,EAAmBpkD,UAAU6mB,aAAe,SAAuB3C,EAAQ7I,EAAM+gC,EAAMyF,GACrFvhD,KAAKmL,KAAKob,aAAevmB,KAAKmL,KAAKob,aAAa3C,EAAQ7I,EAAM+gC,GAC1D0H,EAAa9jD,UAAU6mB,aAAatoB,KAAK+B,KAAM4jB,EAAQ7I,EAAM+gC,EAAMyF,IAGzEuC,EAAmBpkD,UAAUkyC,QAAU,WACjC5xC,KAAKmL,KAAKymC,SAAW5xC,KAAKmL,KAAKymC,UACnC4R,EAAa9jD,UAAUkyC,QAAQ3zC,KAAK+B,OAGtC8jD,EAAmBpkD,UAAU4gD,UAAY,SAAoBtT,GAC3D,QAAOhtC,KAAKmL,KAAKm1C,WAAYtgD,KAAKmL,KAAKm1C,UAAUtT,IAGnD8W,EAAmBpkD,UAAUwiD,eAAiB,SAAyBC,GACrE,OAAOniD,KAAKmL,KAAK+2C,eAAiBliD,KAAKmL,KAAK+2C,eAAeC,GAAYqB,EAAa9jD,UAAUwiD,eAAejkD,KAAK+B,KAAMmiD,IAGnH2B,EApD6B,CAqDpC,IA2BF,SAAS+D,GAAe7pC,GAClBA,IAAYhe,KAAKge,SAAWA,GAElC6pC,GAAenoD,UAAYlB,OAAOY,OAAO,MAEzC,IAAI0oD,GAAS,CAAC,IAAID,IAElB,SAASR,GAAiB5D,EAAWpgD,EAAM6jD,GACzC,GAAwB,GAApBzD,EAAUtjD,OAAe,OAAO2nD,GAIpC,IAFA,IAAInrC,EAAMuqC,EAAYY,GAAO,GAAK,IAAID,GAAgBlmD,EAAS,CAACgb,GAEvD7e,EAAI,EAAGA,EAAI2lD,EAAUtjD,OAAQrC,IAAK,CACzC,IAAI0I,EAAQi9C,EAAU3lD,GAAGgJ,KAAKN,MAC9B,GAAKA,EAIL,IAAK,IAAInI,KAHLmI,EAAMwX,UACNrc,EAAOhB,KAAKgc,EAAM,IAAIkrC,GAAerhD,EAAMwX,WAE9BxX,EAAO,CACtB,IAAImF,EAAMnF,EAAMnI,GACL,MAAPsN,IACAu7C,GAA8B,GAAjBvlD,EAAOxB,QACpBwB,EAAOhB,KAAKgc,EAAM,IAAIkrC,GAAexkD,EAAK+I,SAAW,OAAS,QACtD,SAAR/N,EAAmBse,EAAI6zB,OAAS7zB,EAAI6zB,MAAQ7zB,EAAI6zB,MAAQ,IAAM,IAAM7kC,EACvD,SAARtN,EAAmBse,EAAIrF,OAASqF,EAAIrF,MAAQqF,EAAIrF,MAAQ,IAAM,IAAM3L,EAC5D,YAARtN,IAAsBse,EAAIte,GAAQsN,KAI/C,OAAOhK,EAGT,SAASylD,GAAeW,EAAUhH,EAASiH,EAAcC,GAEvD,GAAID,GAAgBF,IAAUG,GAAeH,GAAU,OAAO/G,EAG9D,IADA,IAAImH,EAASnH,EACJjjD,EAAI,EAAGA,EAAImqD,EAAY9nD,OAAQrC,IAAK,CAC3C,IAAIwmD,EAAO2D,EAAYnqD,GAAIqrB,EAAO6+B,EAAalqD,GAC/C,GAAIA,EAAG,CACL,IAAIyE,OAAS,EACT4mB,GAAQA,EAAKnL,UAAYsmC,EAAKtmC,UAAYkqC,GAAUH,IACnDxlD,EAAS2lD,EAAO3Q,aAAeh1C,EAAOogB,QAAQrE,eAAiBgmC,EAAKtmC,YAGvEzb,EAASof,SAASmB,cAAcwhC,EAAKtmC,WAC9B0pC,UAAW,EAClBnlD,EAAOkc,YAAYypC,GACnB/+B,EAAO2+B,GAAO,IALdI,EAAS3lD,EASb4lD,GAAgBD,EAAQ/+B,GAAQ2+B,GAAO,GAAIxD,GAE7C,OAAO4D,EAGT,SAASC,GAAgB1wC,EAAK0R,EAAM1X,GAClC,IAAK,IAAIpT,KAAQ8qB,EACD,SAAR9qB,GAA2B,SAARA,GAA2B,YAARA,GAAwBA,KAAQoT,GACxEgG,EAAI+vC,gBAAgBnpD,GAC1B,IAAK,IAAIsa,KAAUlH,EACD,SAAVkH,GAA+B,SAAVA,GAA+B,YAAVA,GAAwBlH,EAAIkH,IAAWwQ,EAAKxQ,IACxFlB,EAAIwL,aAAatK,EAAQlH,EAAIkH,IACnC,GAAIwQ,EAAKqnB,OAAS/+B,EAAI++B,MAAO,CAG3B,IAFA,IAAI4X,EAAWj/B,EAAKqnB,MAAQrnB,EAAKqnB,MAAMj9B,MAAM,KAAOivC,GAChD6F,EAAU52C,EAAI++B,MAAQ/+B,EAAI++B,MAAMj9B,MAAM,KAAOivC,GACxC1kD,EAAI,EAAGA,EAAIsqD,EAASjoD,OAAQrC,KAA4C,GAAjCuqD,EAAQz3C,QAAQw3C,EAAStqD,KACrE2Z,EAAIorC,UAAUpiD,OAAO2nD,EAAStqD,IAClC,IAAK,IAAI4T,EAAM,EAAGA,EAAM22C,EAAQloD,OAAQuR,KAAgD,GAAnC02C,EAASx3C,QAAQy3C,EAAQ32C,KAC1E+F,EAAIorC,UAAU3gC,IAAImmC,EAAQ32C,IAEhC,GAAIyX,EAAK7R,OAAS7F,EAAI6F,MAAO,CAC3B,GAAI6R,EAAK7R,MAEP,IADA,IAA4FpZ,EAAxF0D,EAAO,gFACJ1D,EAAI0D,EAAKga,KAAKuN,EAAK7R,QACtBG,EAAIH,MAAMgxC,eAAepqD,EAAE,IAE7BuT,EAAI6F,QACJG,EAAIH,MAAMgvC,SAAW70C,EAAI6F,QAIjC,SAASusC,GAAepsC,EAAK6sC,EAAMjhD,GACjC,OAAO+jD,GAAe3vC,EAAKA,EAAKqwC,GAAQT,GAAiB/C,EAAMjhD,EAAsB,GAAhBoU,EAAIrI,WAI3E,SAAS60C,GAAcx/C,EAAGC,GACxB,GAAID,EAAEtE,QAAUuE,EAAEvE,OAAU,OAAO,EACnC,IAAK,IAAIrC,EAAI,EAAGA,EAAI2G,EAAEtE,OAAQrC,IAAO,IAAK2G,EAAE3G,GAAGgJ,KAAKzC,GAAGK,EAAE5G,GAAGgJ,MAAS,OAAO,EAC5E,OAAO,EAIT,SAASo/C,GAAGzuC,GACV,IAAIpL,EAAOoL,EAAI+G,YAEf,OADA/G,EAAI8/B,WAAWuP,YAAYrvC,GACpBpL,EAKT,IAAIg4C,GAAkB,SAAyB1nC,EAAK4rC,GAClDvoD,KAAK2c,IAAMA,EACX3c,KAAKwoD,KAAOD,EAGZvoD,KAAKkE,MAAQ,EAGblE,KAAK2/B,MAAQ,GAEb3/B,KAAK2lD,SAAU,EAEf,IAAIlrC,EA6JN,SAAkBtI,EAAM4zC,GAEtB,IADA,IAAIpkD,EAAS,GAAIe,EAAMyP,EAAKhQ,WACnBrE,EAAIioD,EAAM5lD,OAAS,EAAGuC,EAAM,GAAK5E,GAAK,EAAGA,IAAK,CACrD,IAAI8qB,EAAOm9B,EAAMjoD,GAAIuF,EAAOulB,EAAKvlB,KACjC,GAAKA,EAAL,CACA,GAAIA,GAAQ8O,EAAK1P,MAAMC,EAAM,GAAM,MACnCf,EAAOhB,KAAKioB,KACVlmB,GAEJ,MAAO,CAAC6D,MAAO5E,EAAOwR,UAAWzM,OAAQhE,GAtK/B+lD,CAAS9rC,EAAItZ,KAAKtD,QAAS4c,EAAIokB,UACzC/gC,KAAK0oD,WAAajuC,EAAIlU,MACtBvG,KAAK2oD,eAAiBluC,EAAI/T,QAuK5B,SAASq+C,GAAYtgD,EAAGC,GAAK,OAAOD,EAAEqC,KAAKwkB,KAAO5mB,EAAEoC,KAAKwkB,KA6HzD,SAASi4B,GAAah9C,EAAOhF,EAAMc,EAAI2rB,EAAMtf,GAE3C,IADA,IAAI/M,EAAS,GACJ7D,EAAI,EAAGi6C,EAAM,EAAGj6C,EAAIyI,EAAMpG,OAAQrC,IAAK,CAC9C,IAAI2E,EAAQ8D,EAAMzI,GAAI6E,EAAQo1C,EAAKr1C,EAAMq1C,GAAOt1C,EAAMjB,KAClDmB,GAASN,GAAMK,GAAOnB,EACxBI,EAAOhB,KAAK8B,IAERE,EAAQpB,GAAQI,EAAOhB,KAAK8B,EAAM/B,MAAM,EAAGa,EAAOoB,EAAOqrB,IACzDtf,IACF/M,EAAOhB,KAAK+N,GACZA,EAAc,MAEZhM,EAAML,GAAMV,EAAOhB,KAAK8B,EAAM/B,MAAM2B,EAAKM,EAAOF,EAAMjB,KAAMwsB,KAGpE,OAAOrsB,EAGT,SAASinD,GAAiB56B,EAAM66B,GAC9B,IAAIrQ,EAASxqB,EAAK8tB,KAAKkD,eAAgBvzC,EAAMuiB,EAAKld,MAAMrF,IACxD,IAAK+sC,EAAO4G,UAAa,OAAO,KAChC,IAAIvC,EAAc7uB,EAAK4uB,QAAQC,YAAYrE,EAAO4G,WAAY0J,EAAWjM,GAAmC,GAApBA,EAAYr7C,KAChGuZ,EAAOiT,EAAK4uB,QAAQI,WAAWxE,EAAO4G,UAAW5G,EAAO8G,aAC5D,GAAIvkC,EAAO,EAAK,OAAO,KACvB,IAA+ByI,EAAS8C,EAApC7C,EAAQhY,EAAIoB,QAAQkO,GACxB,GAAIw9B,EAAmBC,GAAS,CAE9B,IADAh1B,EAAUC,EACHo5B,IAAgBA,EAAYx5C,MAAQw5C,EAAcA,EAAYt6C,OACrE,GAAIs6C,GAAeA,EAAYx5C,KAAKqK,QAAU,IAAcwY,aAAa22B,EAAYx5C,OAASw5C,EAAYt6C,UACjGs6C,EAAYx5C,KAAK+I,WA74D9B,SAAkB/I,EAAMqD,EAAQnE,GAC9B,IAAK,IAAI0iB,EAAoB,GAAVve,EAAawe,EAAQxe,GAAU5E,EAASuB,GAAO4hB,GAAWC,GAAQ,CACnF,GAAI7hB,GAAQd,EAAU,OAAO,EAC7B,IAAI2B,EAAQozC,EAASj0C,GAErB,KADAA,EAAOA,EAAKk0C,YACC,OAAO,EACpBtyB,EAAUA,GAAoB,GAAT/gB,EACrBghB,EAAQA,GAAShhB,GAASpC,EAASuB,IAs4DG0lD,CAASvQ,EAAO4G,UAAW5G,EAAO8G,YAAazC,EAAYplC,MAAO,CACtG,IAAIjV,EAAMq6C,EAAYC,UACtBx2B,EAAY,IAAI,IAAcvL,GAAQvY,EAAMihB,EAAQhY,EAAIoB,QAAQrK,SAE7D,CACL,IAAIohB,EAASoK,EAAK4uB,QAAQI,WAAWxE,EAAOoJ,WAAYpJ,EAAOqJ,cAC/D,GAAIj+B,EAAS,EAAK,OAAO,KACzBJ,EAAU/X,EAAIoB,QAAQ+W,GAGnB0C,IAEHA,EAAY0iC,GAAiBh7B,EAAMxK,EAASC,EADvB,WAAVolC,GAAwB76B,EAAKld,MAAMwV,UAAUvL,KAAO0I,EAAMjhB,MAAQsmD,EAAY,GAAK,IAGhG,OAAOxiC,EAGT,SAAS2iC,GAAej7B,EAAMuzB,GAC5B,IAAIl7B,EAAM2H,EAAKld,MAAMwV,UAGrB,GAFA4iC,GAAkBl7B,EAAM3H,GAEpB2H,EAAKm7B,SAAYn7B,EAAKo7B,WACpBC,GAAar7B,IAASrM,SAAS48B,eAAiB58B,SAAS48B,cAAc99B,SAASuN,EAAKvW,KAD3F,CAKA,GAFAuW,EAAKs7B,YAAYC,sBAEbv7B,EAAKw7B,eAwEX,SAA6Bx7B,GAC3B,IAAIwqB,EAASxqB,EAAK8tB,KAAKkD,eAAgBvyB,EAAQ9K,SAASg2B,cACpDt0C,EAAO2qB,EAAKw7B,cAAc/xC,IAAKgyC,EAAuB,OAAjBpmD,EAAK2a,SAC1CyrC,EAAOh9B,EAAMmrB,OAAOv0C,EAAKk0C,WAAYD,EAASj0C,GAAQ,GACnDopB,EAAMmrB,OAAOv0C,EAAM,GAC1BopB,EAAMu1B,UAAS,GACfxJ,EAAOkH,kBACPlH,EAAOnvC,SAASojB,IAMXg9B,IAAQz7B,EAAKld,MAAMwV,UAAUb,SAAW,EAAOinB,IAAM,EAAOkK,YAAc,KAC7EvzC,EAAKqmD,UAAW,EAChBrmD,EAAKqmD,UAAW,GAtFhBC,CAAoB37B,OACf,CACL,IAEI47B,EAAmBC,EAFnBjmC,EAASyC,EAAIzC,OACb7I,EAAOsL,EAAItL,MAEX+uC,IAAmCzjC,aAAe,MAC/CA,EAAI7d,MAAMjG,OAAOkK,gBAClBm9C,EAAoBG,GAAwB/7B,EAAM3H,EAAI9kB,OACrD8kB,EAAIriB,OAAUqiB,EAAI7d,MAAMjG,OAAOkK,gBAChCo9C,EAAkBE,GAAwB/7B,EAAM3H,EAAIhkB,MAE1D2rB,EAAK4uB,QAAQr2B,aAAa3C,EAAQ7I,EAAMiT,EAAK8tB,KAAMyF,GAC/CuI,KACEF,GAAqBI,GAAcJ,GACnCC,GAAmBG,GAAcH,IAEnCxjC,EAAIZ,QACNuI,EAAKvW,IAAIorC,UAAUpiD,OAAO,8BAE1ButB,EAAKvW,IAAIorC,UAAU3gC,IAAI,6BACnB,sBAAuBP,UAsCjC,SAAsCqM,GACpC,IAAIviB,EAAMuiB,EAAKvW,IAAI2H,cACnB3T,EAAIw+C,oBAAoB,kBAAmBj8B,EAAKk8B,oBAChD,IAAI1R,EAASxqB,EAAK8tB,KAAKkD,eACnB37C,EAAOm1C,EAAOoJ,WAAYl7C,EAAS8xC,EAAOqJ,aAC9Cp2C,EAAI0+C,iBAAiB,kBAAmBn8B,EAAKk8B,mBAAqB,WAC5D1R,EAAOoJ,YAAcv+C,GAAQm1C,EAAOqJ,cAAgBn7C,IACtD+E,EAAIw+C,oBAAoB,kBAAmBj8B,EAAKk8B,oBAChDl8B,EAAKvW,IAAIorC,UAAUpiD,OAAO,gCA9Ca2pD,CAA6Bp8B,IAIxEA,EAAKs7B,YAAYe,kBACjBr8B,EAAKs7B,YAAYgB,oBAlXnBjG,GAAgB3kD,UAAU6qD,YAAc,SAAsBrmD,GAC5D,OAAOA,GAASlE,KAAK2oD,eAAiB3oD,KAAK0oD,WAAWxkD,EAAQlE,KAAK2oD,gBAAkB,MAKvFtE,GAAgB3kD,UAAU8qD,eAAiB,SAAyB7nD,EAAOD,GACzE,GAAIC,GAASD,EAAb,CACA,IAAK,IAAI5E,EAAI6E,EAAO7E,EAAI4E,EAAK5E,IAAOkC,KAAK2c,IAAIokB,SAASjjC,GAAG8zC,UACzD5xC,KAAK2c,IAAIokB,SAASngC,OAAO+B,EAAOD,EAAMC,GACtC3C,KAAK2lD,SAAU,IAIjBtB,GAAgB3kD,UAAUgmD,YAAc,WACtC1lD,KAAKwqD,eAAexqD,KAAKkE,MAAOlE,KAAK2c,IAAIokB,SAAS5gC,SAMpDkkD,GAAgB3kD,UAAU2lD,YAAc,SAAsBv9C,EAAOuL,EAAQ2a,GAG3E,IAFA,IAAIjM,EAAO,EAAGrZ,EAAQ1I,KAAK2/B,MAAMx/B,QAAU,EACvCsqD,EAAU7nD,KAAKE,IAAI4F,EAAOZ,EAAM3H,QAC7B4hB,EAAO0oC,IACN1oC,GAAQrZ,EAAQ,EAAI1I,KAAK2c,IAAM3c,KAAK2/B,MAAO5d,EAAO,GAAM,IAAIm+B,YAAYp4C,EAAMia,MAA6C,IAAnCja,EAAMia,GAAMjb,KAAKqE,KAAK8W,UAClHF,IAEJ,KAAOA,EAAOrZ,GACZ1I,KAAK0lD,cACL1lD,KAAK2c,IAAIijC,MAziCG,EA0iCZ5/C,KAAKkE,MAAQlE,KAAK2/B,MAAMnsB,MACxBxT,KAAK2c,IAAM3c,KAAK2/B,MAAMnsB,MACtB9K,IAEF,KAAOA,EAAQZ,EAAM3H,QAAQ,CAC3BH,KAAK2/B,MAAMh/B,KAAKX,KAAK2c,IAAK3c,KAAKkE,MAAQ,GAEvC,IADA,IAAI9D,GAAS,EACJtC,EAAIkC,KAAKkE,MAAOpG,EAAI8E,KAAKE,IAAI9C,KAAKkE,MAAQ,EAAGlE,KAAK2c,IAAIokB,SAAS5gC,QAASrC,IAC/E,GAAIkC,KAAK2c,IAAIokB,SAASjjC,GAAGoiD,YAAYp4C,EAAMY,IAAS,CAAEtI,EAAQtC,EAAG,MAEnE,GAAIsC,GAAS,EACPA,EAAQJ,KAAKkE,QACflE,KAAK2lD,SAAU,EACf3lD,KAAKwqD,eAAexqD,KAAKkE,MAAO9D,IAElCJ,KAAK2c,IAAM3c,KAAK2c,IAAIokB,SAAS/gC,KAAKkE,WAC7B,CACL,IAAIwmD,EAAW,GAAatrD,OAAOY,KAAK2c,IAAK7U,EAAMY,GAAQ2K,EAAQ2a,GACnEhuB,KAAK2c,IAAIokB,SAASngC,OAAOZ,KAAKkE,MAAO,EAAGwmD,GACxC1qD,KAAK2c,IAAM+tC,EACX1qD,KAAK2lD,SAAU,EAEjB3lD,KAAKkE,MAAQ,EACbwE,MAOJ27C,GAAgB3kD,UAAU6lD,cAAgB,SAAwBliD,EAAMogD,EAAWC,EAAWx/C,GAC5F,IAAI9D,GAAS,EAAGqoD,EAAWvkD,EAAQ,OAAI7D,EAAYL,KAAKuqD,YAAYrmD,GAAQ68B,EAAW/gC,KAAK2c,IAAIokB,SAChG,GAAI0nB,GAAYA,EAAStI,YAAY98C,EAAMogD,EAAWC,GACpDtjD,EAAQ2gC,EAASnwB,QAAQ63C,QAEzB,IAAK,IAAI3qD,EAAIkC,KAAKkE,MAAOmvB,EAAIzwB,KAAKE,IAAIi+B,EAAS5gC,OAAQrC,EAAI,GAAIA,EAAIu1B,EAAGv1B,IAAK,CACzE,IAAI2E,EAAQs+B,EAASjjC,GACrB,GAAI2E,EAAM09C,YAAY98C,EAAMogD,EAAWC,IAAc1jD,KAAK0oD,WAAW93C,QAAQnO,GAAS,EAAG,CACvFrC,EAAQtC,EACR,OAIN,QAAIsC,EAAQ,KACZJ,KAAKwqD,eAAexqD,KAAKkE,MAAO9D,GAChCJ,KAAKkE,SACE,IAMTmgD,GAAgB3kD,UAAU8lD,eAAiB,SAAyBniD,EAAMogD,EAAWC,EAAW11B,EAAM9pB,GACpG,IAAK,IAAIpG,EAAIkC,KAAKkE,MAAOpG,EAAIkC,KAAK2c,IAAIokB,SAAS5gC,OAAQrC,IAAK,CAC1D,IAAIuO,EAAOrM,KAAK2c,IAAIokB,SAASjjC,GAC7B,GAAIuO,aAAgB,GAAc,CAChC,IAAIo8C,EAAWzoD,KAAK0oD,WAAW93C,QAAQvE,GACvC,GAAIo8C,GAAY,GAAKA,EAAWzoD,KAAK2oD,gBAAkBzkD,EAAS,OAAO,EACvE,IAAIymD,EAAUt+C,EAAKoL,IAQnB,KAHazX,KAAKwoD,OAASmC,GAAW3qD,KAAKwoD,MAA4B,GAApBmC,EAAQv7C,UAAiBu7C,EAAQlqC,SAASzgB,KAAKwoD,KAAKjR,gBACjGl0C,EAAKC,QAAU+I,EAAKhJ,MAAQgJ,EAAKhJ,KAAKC,QAAU+I,EAAK00C,QAAQljC,WAAaxa,EAAKF,MA1mCvB,GA2mCxDkJ,EAAKuzC,OAAuBqE,GAAcR,EAAWp3C,EAAKo3C,cACjDp3C,EAAK/L,OAAO+C,EAAMogD,EAAWC,EAAW11B,GAIrD,OAHAhuB,KAAKwqD,eAAexqD,KAAKkE,MAAOpG,GAC5BuO,EAAKoL,KAAOkzC,IAAW3qD,KAAK2lD,SAAU,GAC1C3lD,KAAKkE,SACE,EAET,OAGJ,OAAO,GAKTmgD,GAAgB3kD,UAAU6J,QAAU,SAAkBlG,EAAMogD,EAAWC,EAAW11B,EAAMxrB,GACtFxC,KAAK2c,IAAIokB,SAASngC,OAAOZ,KAAKkE,QAAS,EAAG,GAAa9E,OAAOY,KAAK2c,IAAKtZ,EAAMogD,EAAWC,EAAW11B,EAAMxrB,IAC1GxC,KAAK2lD,SAAU,GAGjBtB,GAAgB3kD,UAAU4lD,YAAc,SAAsB3C,EAAQ30B,EAAMxrB,GAC1E,IAAI6J,EAAOrM,KAAKkE,MAAQlE,KAAK2c,IAAIokB,SAAS5gC,OAASH,KAAK2c,IAAIokB,SAAS/gC,KAAKkE,OAAS,KACnF,IAAImI,IAAQA,EAAK4zC,cAAc0C,IAAYA,GAAUt2C,EAAKs2C,QAAWt2C,EAAKs2C,OAAO77C,KAAK4a,MAAM61B,WAErF,CACL,IAAI3uB,EAAO,IAAI65B,GAAeziD,KAAK2c,IAAKgmC,EAAQ30B,EAAMxrB,GACtDxC,KAAK2c,IAAIokB,SAASngC,OAAOZ,KAAKkE,QAAS,EAAG0kB,GAC1C5oB,KAAK2lD,SAAU,OAJf3lD,KAAKkE,SAUTmgD,GAAgB3kD,UAAU+lD,kBAAoB,WAE5C,IADA,IAAIvjD,EAAYlC,KAAK2c,IAAIokB,SAAS/gC,KAAKkE,MAAQ,GACxChC,aAAqB,IAAgBA,EAAYA,EAAU6+B,SAAS7+B,EAAU6+B,SAAS5gC,OAAS,GAEvG,IAAK+B,KACCA,aAAqB6hD,KACvB,MAAMlwC,KAAK3R,EAAUmB,KAAKF,MAC5B,GAAInD,KAAKkE,MAAQlE,KAAK2c,IAAIokB,SAAS5gC,QAAUH,KAAK2c,IAAIokB,SAAS/gC,KAAKkE,OAAOk8C,cACzEpgD,KAAKkE,YACA,CACL,IAAIuT,EAAMkK,SAASmB,cAAc,MACjC9iB,KAAK2c,IAAIokB,SAASngC,OAAOZ,KAAKkE,QAAS,EAAG,IAAI0jD,GAAe5nD,KAAK2c,IAAK6lC,GAAS/qC,EAAK,OACrFzX,KAAK2lD,SAAU,IA4OrB,IAAImE,GAAgC,EAAOxd,QAAU,EAAOF,QAAU,EAAO2K,eAAiB,GAE9F,SAASgT,GAAwB/7B,EAAMxrB,GACrC,IAAIoG,EAAMolB,EAAK4uB,QAAQW,WAAW/6C,EAAK,GACnCa,EAAOuF,EAAIvF,KACXqD,EAASkC,EAAIlC,OACboF,EAAQpF,EAASrD,EAAKyc,WAAW3f,OAASkD,EAAKyc,WAAWpZ,GAAU,KACpEmF,EAASnF,EAASrD,EAAKyc,WAAWpZ,EAAS,GAAK,KACpD,GAAI,EAAO4lC,QAAUxgC,GAAkC,SAAzBA,EAAMusC,gBAA8B,OAAOuS,GAAY9+C,GACrF,KAAMA,GAAkC,SAAzBA,EAAMusC,iBAAiCxsC,GAAoC,SAA1BA,EAAOwsC,iBAA6B,CAClG,GAAIvsC,EAAS,OAAO8+C,GAAY9+C,GAC3B,GAAID,EAAU,OAAO++C,GAAY/+C,IAI1C,SAAS++C,GAAY3Z,GAGnB,OAFAA,EAAQoH,gBAAkB,OACtB,EAAO/L,QAAU2E,EAAQ9R,YAAa8R,EAAQ9R,WAAY,EAAO8R,EAAQ4Z,cAAe,GACrF5Z,EAGT,SAAS+Y,GAAc/Y,GACrBA,EAAQoH,gBAAkB,QACtBpH,EAAQ4Z,eAAgB5Z,EAAQ9R,WAAY,EAAM8R,EAAQ4Z,aAAe,MAmC/E,SAAS3B,GAAkBl7B,EAAM3H,GAC/B,GAAIA,aAAe,IAAe,CAChC,IAAIuC,EAAOoF,EAAK4uB,QAAQoE,OAAO36B,EAAI9kB,MAC/BqnB,GAAQoF,EAAK88B,uBACfC,GAAmB/8B,GACfpF,GAAQA,EAAK0+B,aACjBt5B,EAAK88B,qBAAuBliC,QAG9BmiC,GAAmB/8B,GAKvB,SAAS+8B,GAAmB/8B,GACtBA,EAAK88B,uBACH98B,EAAK88B,qBAAqBvoD,QAC1ByrB,EAAK88B,qBAAqBvD,eAC9Bv5B,EAAK88B,qBAAuB,MAIhC,SAAS9B,GAAiBh7B,EAAMxK,EAASC,EAAOsB,GAC9C,OAAOiJ,EAAK2rB,SAAS,0BAA0B,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAMxK,EAASC,OACjF,IAAc+B,QAAQhC,EAASC,EAAOsB,GAQ7C,SAASskC,GAAar7B,GACpB,IAAI3H,EAAM2H,EAAK8tB,KAAKkD,eACpB,IAAK34B,EAAIu7B,WAAc,OAAO,EAC9B,IAIE,OAAO5zB,EAAKvW,IAAIgJ,SAAoC,GAA3B4F,EAAIu7B,WAAWxyC,SAAgBiX,EAAIu7B,WAAWrK,WAAalxB,EAAIu7B,cACrF5zB,EAAKm7B,UAAYn7B,EAAKvW,IAAIgJ,SAAmC,GAA1B4F,EAAI+4B,UAAUhwC,SAAgBiX,EAAI+4B,UAAU7H,WAAalxB,EAAI+4B,YACnG,MAAMx3C,GACN,OAAO,GAUX,SAASojD,GAAmBl6C,EAAO4T,GACjC,IAAI9b,EAAMkI,EAAMwV,UACZ9C,EAAU5a,EAAI4a,QACdC,EAAQ7a,EAAI6a,MACZwnC,EAAQvmC,EAAM,EAAIlB,EAAQ3gB,IAAI4gB,GAASD,EAAQ1gB,IAAI2gB,GACnDva,EAAU+hD,EAAM1oD,OAAOkK,cAAwBw+C,EAAMviD,MAAQoI,EAAMrF,IAAIoB,QAAQ6X,EAAM,EAAIumC,EAAMn/C,QAAUm/C,EAAMp/C,UAAY,KAApFo/C,EAC3C,OAAO/hD,GAAU,IAAUsb,SAAStb,EAAQwb,GAG9C,SAASoE,GAAMkF,EAAM3H,GAEnB,OADA2H,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAG0C,aAAaF,GAAKqC,mBACvC,EAGT,SAASwiC,GAAmBl9B,EAAMtJ,EAAKymC,GACrC,IAAI9kC,EAAM2H,EAAKld,MAAMwV,UACrB,KAAID,aAAe,KAuBZ,IAAIA,aAAe,KAAiBA,EAAIhjB,KAAK+I,SAClD,OAAO0c,GAAMkF,EAAM,IAAI,IAActJ,EAAM,EAAI2B,EAAI5d,IAAM4d,EAAI7d,QAE7D,IAAImJ,EAASq5C,GAAmBh9B,EAAKld,MAAO4T,GAC5C,QAAI/S,GAAiBmX,GAAMkF,EAAMrc,GA1BjC,IAAK0U,EAAIriB,OAASmnD,EAAKv6C,QAAQ,MAAQ,EACrC,OAAO,EACF,GAAIod,EAAKE,eAAexJ,EAAM,EAAI,QAAU,QAAS,CAC1D,IAAIrY,EAAO2+C,GAAmBh9B,EAAKld,MAAO4T,GAC1C,SAAIrY,GAASA,aAAgB,MAAyByc,GAAMkF,EAAM3hB,GAE7D,KAAM,EAAOogC,KAAO0e,EAAKv6C,QAAQ,MAAQ,GAAI,CAClD,IAAsGgY,EAAlGnF,EAAQ4C,EAAI5C,MAAOpgB,EAAOogB,EAAMvZ,WAAa,KAAOwa,EAAM,EAAIjB,EAAMrZ,WAAaqZ,EAAMtZ,UAC3F,IAAK9G,GAAQA,EAAKC,OAAU,OAAO,EACnC,IAAI8nD,EAAU1mC,EAAM,EAAIjB,EAAMjhB,IAAMa,EAAKvB,SAAW2hB,EAAMjhB,IAC1D,SAAMa,EAAKqK,SAAWkb,EAAOoF,EAAK4uB,QAAQoE,OAAOoK,MAAcxiC,EAAKlJ,cAChE,IAAcwG,aAAa7iB,GACtBylB,GAAMkF,EAAM,IAAI,IAActJ,EAAM,EAAIsJ,EAAKld,MAAMrF,IAAIoB,QAAQ4W,EAAMjhB,IAAMa,EAAKvB,UAAY2hB,MAC1F,EAAO0zB,QAITruB,GAAMkF,EAAM,IAAI,IAAcA,EAAKld,MAAMrF,IAAIoB,QAAQ6X,EAAM,EAAI0mC,EAAUA,EAAU/nD,EAAKvB,cAcvG,SAASupD,GAAQhoD,GACf,OAAwB,GAAjBA,EAAK+L,SAAgB/L,EAAKwa,UAAU1d,OAASkD,EAAKyc,WAAW3f,OAGtE,SAASmrD,GAAY7zC,GACnB,IAAImR,EAAOnR,EAAI6gC,WACf,OAAO1vB,GAAqB,GAAbA,EAAKpnB,OAAciW,EAAI+G,aAA+B,MAAhB/G,EAAIuG,UAK3D,SAASutC,GAAqBv9B,GAC5B,IAAI3H,EAAM2H,EAAK8tB,KAAKkD,eAChB37C,EAAOgjB,EAAI+4B,UAAW14C,EAAS2f,EAAIi5B,YACvC,GAAKj8C,EAAL,CACA,IAAImoD,EAAUC,EAAYlK,GAAQ,EAKlC,IADI,EAAO/U,OAA0B,GAAjBnpC,EAAK+L,UAAiB1I,EAAS2kD,GAAQhoD,IAASioD,GAAYjoD,EAAKyc,WAAWpZ,MAAY66C,GAAQ,KAElH,GAAI76C,EAAS,EAAG,CACd,GAAqB,GAAjBrD,EAAK+L,SACP,MAEA,IAAIvD,EAASxI,EAAKyc,WAAWpZ,EAAS,GACtC,GAAI4kD,GAAYz/C,GACd2/C,EAAWnoD,EACXooD,IAAe/kD,MACV,IAAuB,GAAnBmF,EAAOuD,SAGT,MADP1I,GADArD,EAAOwI,GACOgS,UAAU1d,YAGvB,IAAIurD,GAAYroD,GACrB,MAGA,IADA,IAAI8lB,EAAO9lB,EAAK0a,gBACToL,GAAQmiC,GAAYniC,IACzBqiC,EAAWnoD,EAAKk0C,WAChBkU,EAAanU,EAASnuB,GACtBA,EAAOA,EAAKpL,gBAEd,GAAKoL,EAMHziB,EAAS2kD,GADThoD,EAAO8lB,OALE,CAET,IADA9lB,EAAOA,EAAKk0C,aACAvpB,EAAKvW,IAAO,MACxB/Q,EAAS,GAOX66C,EAASoK,GAAY39B,EAAM3H,EAAKhjB,EAAMqD,GACjC8kD,GAAYG,GAAY39B,EAAM3H,EAAKmlC,EAAUC,IAKxD,SAASG,GAAsB59B,GAC7B,IAAI3H,EAAM2H,EAAK8tB,KAAKkD,eAChB37C,EAAOgjB,EAAI+4B,UAAW14C,EAAS2f,EAAIi5B,YACvC,GAAKj8C,EAAL,CAGA,IAFA,IACImoD,EAAUC,EADV39B,EAAMu9B,GAAQhoD,KAGhB,GAAIqD,EAASonB,EAAK,CAChB,GAAqB,GAAjBzqB,EAAK+L,SAAiB,MAE1B,IAAIk8C,GADQjoD,EAAKyc,WAAWpZ,IAKrB,MAHL8kD,EAAWnoD,EACXooD,IAAe/kD,MAGZ,IAAIglD,GAAYroD,GACrB,MAGA,IADA,IAAIgJ,EAAOhJ,EAAKmb,YACTnS,GAAQi/C,GAAYj/C,IACzBm/C,EAAWn/C,EAAKkrC,WAChBkU,EAAanU,EAASjrC,GAAQ,EAC9BA,EAAOA,EAAKmS,YAEd,GAAKnS,EAMH3F,EAAS,EACTonB,EAAMu9B,GAFNhoD,EAAOgJ,OALE,CAET,IADAhJ,EAAOA,EAAKk0C,aACAvpB,EAAKvW,IAAO,MACxB/Q,EAASonB,EAAM,GAQjB09B,GAAYG,GAAY39B,EAAM3H,EAAKmlC,EAAUC,IAGnD,SAASC,GAAYj0C,GACnB,IAAImR,EAAOnR,EAAI6gC,WACf,OAAO1vB,GAAQA,EAAKvlB,MAAQulB,EAAKvlB,KAAKG,QAGxC,SAASmoD,GAAY39B,EAAM3H,EAAKhjB,EAAMqD,GACpC,GAAI6xC,EAAmBlyB,GAAM,CAC3B,IAAIoG,EAAQ9K,SAASg2B,cACrBlrB,EAAMmrB,OAAOv0C,EAAMqD,GACnB+lB,EAAMorB,SAASx0C,EAAMqD,GACrB2f,EAAIq5B,kBACJr5B,EAAIhd,SAASojB,QACJpG,EAAI07B,QACb17B,EAAI07B,OAAO1+C,EAAMqD,GAEnBsnB,EAAKs7B,YAAYe,kBACjB,IAAIv5C,EAAQkd,EAAKld,MAEjBysB,YAAW,WACLvP,EAAKld,OAASA,GAASm4C,GAAej7B,KACzC,IAOL,SAAS69B,GAAiB79B,EAAMtJ,EAAKymC,GACnC,IAAI9kC,EAAM2H,EAAKld,MAAMwV,UACrB,GAAID,aAAe,MAAkBA,EAAIriB,OAASmnD,EAAKv6C,QAAQ,MAAQ,EAAK,OAAO,EACnF,GAAI,EAAO67B,KAAO0e,EAAKv6C,QAAQ,MAAQ,EAAK,OAAO,EACnD,IAAIpI,EAAQ6d,EAAI7d,MACZC,EAAM4d,EAAI5d,IAEd,IAAKD,EAAMjG,OAAOkK,eAAiBuhB,EAAKE,eAAexJ,EAAM,EAAI,KAAO,QAAS,CAC/E,IAAIrY,EAAO2+C,GAAmBh9B,EAAKld,MAAO4T,GAC1C,GAAIrY,GAASA,aAAgB,IACzB,OAAOyc,GAAMkF,EAAM3hB,GAEzB,IAAK7D,EAAMjG,OAAOkK,cAAe,CAC/B,IAAIq/C,EAAS,IAAUtnC,SAASE,EAAM,EAAIlc,EAAQC,EAAKic,GACvD,OAAOonC,GAAShjC,GAAMkF,EAAM89B,GAE9B,OAAO,EAGT,SAASC,GAA2B/9B,EAAMtJ,GACxC,KAAMsJ,EAAKld,MAAMwV,qBAAqB,KAAkB,OAAO,EAC/D,IAAI1d,EAAMolB,EAAKld,MAAMwV,UACjB7C,EAAQ7a,EAAI6a,MACZD,EAAU5a,EAAI4a,QACdxf,EAAQ4E,EAAI5E,MAChB,IAAKyf,EAAM9W,WAAW6W,GAAY,OAAO,EACzC,IAAKxf,EAAS,OAAO,EACrB,GAAIgqB,EAAKE,eAAexJ,EAAM,EAAI,UAAY,YAAe,OAAO,EACpE,IAAIsnC,GAAYvoC,EAAMvZ,aAAewa,EAAM,EAAIjB,EAAMrZ,WAAaqZ,EAAMtZ,WACxE,GAAI6hD,IAAaA,EAAS1oD,OAAQ,CAChC,IAAIugB,EAAKmK,EAAKld,MAAM+S,GAIpB,OAHIa,EAAM,EAAKb,EAAGuC,OAAO3C,EAAMjhB,IAAMwpD,EAASlqD,SAAU2hB,EAAMjhB,KACvDqhB,EAAGuC,OAAO3C,EAAMjhB,IAAKihB,EAAMjhB,IAAMwpD,EAASlqD,UACjDksB,EAAK5C,SAASvH,IACP,EAET,OAAO,EAGT,SAASooC,GAAej+B,EAAM3qB,EAAMyN,GAClCkd,EAAKs7B,YAAYxG,OACjBz/C,EAAKg1C,gBAAkBvnC,EACvBkd,EAAKs7B,YAAY3mD,QAqCnB,SAASupD,GAAel+B,EAAMgf,GAC5B,IAAIthB,EAAOshB,EAAMW,QAASwd,EAV5B,SAAiBne,GACf,IAAIrrC,EAAS,GAKb,OAJIqrC,EAAME,UAAWvrC,GAAU,KAC3BqrC,EAAMG,UAAWxrC,GAAU,KAC3BqrC,EAAMC,SAAUtrC,GAAU,KAC1BqrC,EAAMI,WAAYzrC,GAAU,KACzBA,EAI0BwqD,CAAQnf,GACzC,OAAY,GAARthB,GAAc,EAAO+gB,KAAe,IAAR/gB,GAAsB,KAARy/B,EACrCY,GAA2B/9B,GAAO,IAAMu9B,GAAqBv9B,GACnD,IAARtC,GAAe,EAAO+gB,KAAe,IAAR/gB,GAAsB,KAARy/B,EAC7CY,GAA2B/9B,EAAM,IAAM49B,GAAsB59B,GACnD,IAARtC,GAAsB,IAARA,IAEN,IAARA,EACFw/B,GAAmBl9B,GAAO,EAAGm9B,IAASI,GAAqBv9B,GACjD,IAARtC,EACFw/B,GAAmBl9B,EAAM,EAAGm9B,IAASS,GAAsB59B,GACjD,IAARtC,EACFmgC,GAAiB79B,GAAO,EAAGm9B,IAASI,GAAqBv9B,GAC/C,IAARtC,EA3Cb,SAA4BsC,GAC1B,GAAK,EAAOse,UAAUte,EAAKld,MAAMwV,UAAU7C,MAAMha,aAAe,GAAhE,CACA,IAAIb,EAAMolB,EAAK8tB,KAAKkD,eAChBI,EAAYx2C,EAAIw2C,UAChBE,EAAc12C,EAAI02C,YACtB,GAAIF,GAAmC,GAAtBA,EAAUhwC,UAAgC,GAAfkwC,GACxCF,EAAUp9C,YAAsD,SAAxCo9C,EAAUp9C,WAAWq2C,gBAA4B,CAC3E,IAAI51C,EAAQ28C,EAAUp9C,WACtBiqD,GAAej+B,EAAMvrB,GAAO,GAC5B86B,YAAW,WAAc,OAAO0uB,GAAej+B,EAAMvrB,GAAO,KAAW,MAmChE2pD,CAAmBp+B,IAAS69B,GAAiB79B,EAAM,EAAGm9B,IAASS,GAAsB59B,GACnFm9B,IAAS,EAAO1e,IAAM,IAAM,OACnB,IAAR/gB,GAAsB,IAARA,GAAsB,IAARA,GAAsB,IAARA,IA2DxD,SAAS/M,GAAalH,GACpB,IAAImR,EAAOnR,EAAI6gC,WACf,GAAI1vB,EACF,OAAOA,EAAKy3B,YACP,GAAoB,MAAhB5oC,EAAIuG,UAAoBvG,EAAI8/B,WAAY,CAIjD,GAAI,EAAOjL,QAAU,aAAaz4B,KAAK4D,EAAI8/B,WAAWv5B,UAAW,CAC/D,IAAIa,EAAO8C,SAASmB,cAAc,OAElC,OADAjE,EAAKJ,YAAYkD,SAASmB,cAAc,OACjC,CAACjE,KAAMA,GACT,GAAIpH,EAAI8/B,WAAWr1C,WAAauV,GAAO,EAAO60B,QAAU,gBAAgBz4B,KAAK4D,EAAI8/B,WAAWv5B,UACjG,MAAO,CAACY,QAAQ,QAEb,GAAoB,OAAhBnH,EAAIuG,UAAqBvG,EAAI4F,aAAa,oBACnD,MAAO,CAACuB,QAAQ,GAIpB,SAASytC,GAAcr+B,EAAMzsB,EAAMc,EAAIiqD,EAAUC,GAC/C,GAAIhrD,EAAO,EAAX,CACE,IAAIsnD,EAAS76B,EAAKw+B,kBAAoBrlC,KAAKC,MAAQ,GAAK4G,EAAKy+B,oBAAsB,KAC/EC,EAAS9D,GAAiB56B,EAAM66B,GACpC,GAAI6D,IAAW1+B,EAAKld,MAAMwV,UAAUjiB,GAAGqoD,GAAS,CAC9C,IAAIrnB,EAAOrX,EAAKld,MAAM+S,GAAG0C,aAAammC,GACxB,WAAV7D,EAAuBxjB,EAAK7c,QAAQ,WAAW,GAChC,OAAVqgC,GAAmBxjB,EAAK3c,iBACjCsF,EAAK5C,SAASia,QAPlB,CAYA,IAAIx7B,EAAUmkB,EAAKld,MAAMrF,IAAIoB,QAAQtL,GACjCorD,EAAS9iD,EAAQyC,YAAYjK,GACjCd,EAAOsI,EAAQgC,OAAO8gD,EAAS,GAC/BtqD,EAAK2rB,EAAKld,MAAMrF,IAAIoB,QAAQxK,GAAIyJ,MAAM6gD,EAAS,GAE/C,IAAItmC,EAAM2H,EAAKld,MAAMwV,UACjBxW,EAtFN,SAAsBke,EAAM4+B,EAAOC,GACjC,IAAIjkD,EAAMolB,EAAK4uB,QAAQqE,WAAW2L,EAAOC,GACrCtqD,EAASqG,EAAIvF,KACb69C,EAAat4C,EAAIs4C,WACjBC,EAAWv4C,EAAIu4C,SACf5/C,EAAOqH,EAAIrH,KACXc,EAAKuG,EAAIvG,GAETm2C,EAASxqB,EAAK8tB,KAAKkD,eAAgB9+C,EAAO,KAAM0jB,EAAS40B,EAAOoJ,WAQpE,GAPIh+B,GAAUoK,EAAKvW,IAAIgJ,SAA4B,GAAnBmD,EAAOxU,SAAgBwU,EAASA,EAAO2zB,cACrEr3C,EAAO,CAAC,CAACmD,KAAMugB,EAAQld,OAAQ8xC,EAAOqJ,eACjCtJ,EAAmBC,IACpBt4C,EAAKS,KAAK,CAAC0C,KAAMm1C,EAAO4G,UAAW14C,OAAQ8xC,EAAO8G,eAIpD,EAAOlT,QAA+B,IAArBpe,EAAK8+B,YACxB,IAAK,IAAI/U,EAAMoJ,EAAUpJ,EAAMmJ,EAAYnJ,IAAO,CAChD,IAAI10C,EAAOd,EAAOud,WAAWi4B,EAAM,GAAInvB,EAAOvlB,EAAKi1C,WACnD,GAAqB,MAAjBj1C,EAAK+L,WAAqBwZ,EAAM,CAAEu4B,EAAWpJ,EAAK,MACtD,IAAKnvB,GAAQA,EAAKpnB,KAAQ,MAG9B,IAAIurD,EAAW/+B,EAAKld,MAAMrF,IACtByQ,EAAS8R,EAAK2rB,SAAS,cAAgB,IAAU/gC,WAAWoV,EAAKld,MAAM9K,QACvEwC,EAAQukD,EAASlgD,QAAQtL,GAEzB8kB,EAAM,KAAM5a,EAAMyQ,EAAOpM,MAAMvN,EAAQ,CACzCsT,QAASrN,EAAMjG,OACfga,SAAU/T,EAAMjG,OAAO+L,eAAe9F,EAAMtE,SAC5Csc,SAAS,EACTjf,KAAM2/C,EACN7+C,GAAI8+C,EACJ/lC,oBAAoB5S,EAAMjG,OAAOuE,KAAKqE,KAAKugB,MAAO,OAClDshC,iBAAiB,EACjBxwC,cAAetc,EACfye,aAAcA,GACdjH,QAASlP,IAEX,GAAItI,GAAuB,MAAfA,EAAK,GAAGsC,IAAa,CAC/B,IAAIyqD,EAAW/sD,EAAK,GAAGsC,IAAKuY,EAAO7a,EAAK,IAAMA,EAAK,GAAGsC,IAC1C,MAARuY,IAAgBA,EAAOkyC,GAC3B5mC,EAAM,CAACzC,OAAQqpC,EAAW1rD,EAAMwZ,KAAMA,EAAOxZ,GAE/C,MAAO,CAACkK,IAAKA,EAAK4a,IAAKA,EAAK9kB,KAAMA,EAAMc,GAAIA,GA0ChC6qD,CAAal/B,EAAMzsB,EAAMc,GAGrC,GAAI,EAAO+pC,QAAUpe,EAAKw7B,eAAiB15C,EAAMuW,KAAOvW,EAAMuW,IAAIzC,QAAUoK,EAAKw7B,cAAclF,KAAK/iD,KAAM,CACxG,IAAI4B,EAAO6qB,EAAKw7B,cAAclF,KAAKx9C,KAAK4a,MAAMlD,YAC1Chd,EAAO2B,GAAQA,EAAK0a,UAAY1a,EAAK0a,UAAU1d,OAAS,EAC5D2P,EAAMuW,IAAM,CAACzC,OAAQ9T,EAAMuW,IAAIzC,OAASpiB,EAAMuZ,KAAMjL,EAAMuW,IAAIzC,OAASpiB,GAGzE,IACI2rD,EAAcC,EADd3hD,EAAMuiB,EAAKld,MAAMrF,IAAK4hD,EAAU5hD,EAAI/K,MAAMoP,EAAMvO,KAAMuO,EAAMzN,IAGvC,IAArB2rB,EAAK8+B,aAAqB3lC,KAAKC,MAAQ,IAAM4G,EAAKs/B,iBACpDH,EAAen/B,EAAKld,MAAMwV,UAAUjkB,GACpC+qD,EAAgB,QAEhBD,EAAen/B,EAAKld,MAAMwV,UAAU/kB,KACpC6rD,EAAgB,SAElBp/B,EAAK8+B,YAAc,KAEnB,IAAIS,EAwMN,SAAkB9oD,EAAGC,EAAGlC,EAAK2qD,EAAcC,GACzC,IAAIzqD,EAAQ8B,EAAED,cAAcE,EAAGlC,GAC/B,GAAa,MAATG,EAAiB,OAAO,KAC5B,IAAIiG,EAAMnE,EAAEM,YAAYL,EAAGlC,EAAMiC,EAAEjD,KAAMgB,EAAMkC,EAAElD,MAC7CgsD,EAAO5kD,EAAInE,EACXgpD,EAAO7kD,EAAIlE,EACf,GAAqB,OAAjB0oD,EAAwB,CAC1B,IAAIM,EAAS9qD,KAAKC,IAAI,EAAGF,EAAQC,KAAKE,IAAI0qD,EAAMC,IAChDN,GAAgBK,EAAOE,EAAS/qD,EAElC,GAAI6qD,EAAO7qD,GAAS8B,EAAEjD,KAAOkD,EAAElD,KAAM,CAGnCisD,GADA9qD,GADWwqD,GAAgBxqD,GAASwqD,GAAgBK,EAAO7qD,EAAQwqD,EAAe,IAElEM,EAAOD,GACvBA,EAAO7qD,OACF,GAAI8qD,EAAO9qD,EAAO,CAGvB6qD,GADA7qD,GADawqD,GAAgBxqD,GAASwqD,GAAgBM,EAAO9qD,EAAQwqD,EAAe,IAEpEK,EAAOC,GACvBA,EAAO9qD,EAET,MAAO,CAACA,MAAOA,EAAO6qD,KAAMA,EAAMC,KAAMA,GA7N3BE,CAASN,EAAQttD,QAAS+P,EAAMrE,IAAI1L,QAAS+P,EAAMvO,KAAM4rD,EAAcC,GACpF,IAAKG,EAAQ,CACX,KAAIjB,GAAYjmC,aAAe,MAAkBA,EAAIriB,OAASqiB,EAAI5C,MAAM9W,WAAW0Z,EAAI7C,WAClFwK,EAAKyP,WAAe3tB,EAAMuW,KAAOvW,EAAMuW,IAAIzC,QAAU9T,EAAMuW,IAAItL,KAE7D,IAAI,EAAOi8B,KAAOhpB,EAAK4/B,aAAezmC,KAAKC,MAAQ,KAC/CmlC,EAAW/0C,MAAK,SAAUjY,GAAK,MAAqB,OAAdA,EAAEye,UAAmC,KAAdze,EAAEye,aAC/DgQ,EAAK2rB,SAAS,iBAAiB,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAM6qB,EAAS,GAAI,aAEnF,YADA7qB,EAAK4/B,aAAe,GAGpB,GAAI99C,EAAMuW,IAAK,CACb,IAAIwnC,EAAQC,GAAiB9/B,EAAMA,EAAKld,MAAMrF,IAAKqE,EAAMuW,KACrDwnC,IAAUA,EAAMxpD,GAAG2pB,EAAKld,MAAMwV,YAAc0H,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAG0C,aAAasnC,IAE3F,OAXAN,EAAS,CAAC5qD,MAAO0jB,EAAI9kB,KAAMisD,KAAMnnC,EAAIhkB,GAAIorD,KAAMpnC,EAAIhkB,IAcvD2rB,EAAK+/B,iBAID//B,EAAKld,MAAMwV,UAAU/kB,KAAOysB,EAAKld,MAAMwV,UAAUjkB,IACjDkrD,EAAO5qD,OAAS4qD,EAAOE,MACvBz/B,EAAKld,MAAMwV,qBAAqB,MAC9BinC,EAAO5qD,MAAQqrB,EAAKld,MAAMwV,UAAU/kB,MAAQgsD,EAAO5qD,OAASqrB,EAAKld,MAAMwV,UAAU/kB,KAAO,EAC1FgsD,EAAO5qD,MAAQqrB,EAAKld,MAAMwV,UAAU/kB,KAC3BgsD,EAAOC,KAAOx/B,EAAKld,MAAMwV,UAAUjkB,IAAMkrD,EAAOC,MAAQx/B,EAAKld,MAAMwV,UAAUjkB,GAAK,IAC3FkrD,EAAOE,MAASz/B,EAAKld,MAAMwV,UAAUjkB,GAAKkrD,EAAOC,KACjDD,EAAOC,KAAOx/B,EAAKld,MAAMwV,UAAUjkB,KAOnC,EAAOqqC,IAAM,EAAOkK,YAAc,IAAM2W,EAAOE,MAAQF,EAAO5qD,MAAQ,GACtE4qD,EAAOC,MAAQD,EAAO5qD,OAAS4qD,EAAO5qD,MAAQmN,EAAMvO,MACmC,MAAvFuO,EAAMrE,IAAIzI,YAAYuqD,EAAO5qD,MAAQmN,EAAMvO,KAAO,EAAGgsD,EAAO5qD,MAAQmN,EAAMvO,KAAO,KACnFgsD,EAAO5qD,QACP4qD,EAAOC,OACPD,EAAOE,QAGT,IAGIO,EAHAxlD,EAAQsH,EAAMrE,IAAI1C,eAAewkD,EAAO5qD,MAAQmN,EAAMvO,MACtDkH,EAAMqH,EAAMrE,IAAI1C,eAAewkD,EAAOE,KAAO39C,EAAMvO,MACnD0sD,EAAezlD,EAAMmE,WAAWlE,IAAQD,EAAMjG,OAAOkK,cAIzD,IAAM,EAAOuqC,KAAOhpB,EAAK4/B,aAAezmC,KAAKC,MAAQ,OAC7C6mC,GAAgB1B,EAAW/0C,MAAK,SAAUjY,GAAK,MAAqB,OAAdA,EAAEye,UAAmC,KAAdze,EAAEye,eAChFiwC,GAAgBzlD,EAAMhG,IAAMsN,EAAMrE,IAAI1L,QAAQyB,OAC9CwsD,EAAU,IAAUxpC,SAAS1U,EAAMrE,IAAIoB,QAAQrE,EAAMhG,IAAM,GAAI,GAAG,KACnEwrD,EAAQjzC,MAAQtS,EAAIjG,MACtBwrB,EAAK2rB,SAAS,iBAAiB,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAM6qB,EAAS,GAAI,aAC5E7qB,EAAK4/B,aAAe,OAItB,GAAI5/B,EAAKld,MAAMwV,UAAU1C,OAAS2pC,EAAO5qD,OAqG3C,SAAuBghC,EAAKhhC,EAAOD,EAAKwrD,EAAWC,GACjD,IAAKD,EAAU3rD,OAAOkL,aAElB/K,EAAMC,GAASwrD,EAAQ3rD,IAAM0rD,EAAU1rD,KAEvC4rD,GAAsBF,GAAW,GAAM,GAASC,EAAQ3rD,IACxD,OAAO,EAEX,IAAI0G,EAASy6B,EAAI92B,QAAQlK,GAEzB,GAAIuG,EAAOO,aAAeP,EAAO3G,OAAOxC,QAAQyB,OAAS0H,EAAO3G,OAAOkL,YACnE,OAAO,EACX,IAAI4gD,EAAQ1qB,EAAI92B,QAAQuhD,GAAsBllD,GAAQ,GAAM,IAE5D,IAAKmlD,EAAM9rD,OAAOkL,aAAe4gD,EAAM7rD,IAAME,GACzC0rD,GAAsBC,GAAO,GAAM,GAAS3rD,EAC5C,OAAO,EAGX,OAAOwrD,EAAU3rD,OAAOxC,QAAQ+D,IAAIoqD,EAAUzkD,cAAcpF,GAAGgqD,EAAM9rD,OAAOxC,SAvHxEuuD,CAAc7iD,EAAK8hD,EAAO5qD,MAAO4qD,EAAOC,KAAMhlD,EAAOC,IACrDulB,EAAK2rB,SAAS,iBAAiB,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAM6qB,EAAS,EAAG,iBACvE,EAAO3B,SAAW,EAAO9K,QAAUpe,EAAKs7B,YAAYiF,+BAH1D,CAeI,EAAOrX,UAAY+W,GAAgBzlD,EAAM7F,SAAW8F,EAAI9F,SAA+B,GAApB8F,EAAIgB,cAAqBjB,EAAME,OAASD,EAAIC,OAC/GoH,EAAMuW,KAAOvW,EAAMuW,IAAIzC,QAAU9T,EAAMuW,IAAItL,MAAQjL,EAAMuW,IAAItL,MAAQwyC,EAAOC,OAC9ED,EAAOE,MAAQ,EACfhlD,EAAMqH,EAAMrE,IAAI1C,eAAewkD,EAAOE,KAAO39C,EAAMvO,MACnDg8B,YAAW,WACTvP,EAAK2rB,SAAS,iBAAiB,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAM6qB,EAAS,GAAI,eACzE,KAGL,IAEIh1B,EAAI0D,EAAainC,EAAYC,EAF7BC,EAASnB,EAAO5qD,MAAOgsD,EAAOpB,EAAOC,KAGzC,GAAIS,EACF,GAAIzlD,EAAMhG,KAAOiG,EAAIjG,IAGf,EAAOkqC,IAAM,EAAOkK,YAAc,IAA4B,GAAtBpuC,EAAMiB,eAChDukB,EAAKs7B,YAAYiF,2BACjBhxB,YAAW,WAAc,OAAO0rB,GAAej7B,KAAU,KAE3DnK,EAAKmK,EAAKld,MAAM+S,GAAGuC,OAAOsoC,EAAQC,GAClCpnC,EAAc9b,EAAIoB,QAAQ0gD,EAAO5qD,OAAOwJ,YAAYV,EAAIoB,QAAQ0gD,EAAOC,YAClE,GACLD,EAAOC,MAAQD,EAAOE,OAASgB,EAAShjD,EAAIoB,QAAQ0gD,EAAO5qD,UAC1D6rD,EAyCP,SAAsB/8C,EAAK0X,GAGzB,IAFA,IAC2CriB,EAAMgH,EAAMxN,EADnDsuD,EAAWn9C,EAAIzP,WAAW8F,MAAO+mD,EAAY1lC,EAAKnnB,WAAW8F,MAC7DuuB,EAAQu4B,EAAUx4B,EAAUy4B,EACvB/wD,EAAI,EAAGA,EAAI+wD,EAAU1uD,OAAQrC,IAAOu4B,EAAQw4B,EAAU/wD,GAAG2J,cAAc4uB,GAChF,IAAK,IAAI3kB,EAAM,EAAGA,EAAMk9C,EAASzuD,OAAQuR,IAAS0kB,EAAUw4B,EAASl9C,GAAKjK,cAAc2uB,GACxF,GAAoB,GAAhBC,EAAMl2B,QAAiC,GAAlBi2B,EAAQj2B,OAC/B2N,EAAOuoB,EAAM,GACbvvB,EAAO,MACPxG,EAAS,SAAU+C,GAAQ,OAAOA,EAAKyK,KAAKA,EAAK1G,SAAS/D,EAAKyE,aAC1D,IAAoB,GAAhBuuB,EAAMl2B,QAAiC,GAAlBi2B,EAAQj2B,OAKtC,OAAO,KAJP2N,EAAOsoB,EAAQ,GACftvB,EAAO,SACPxG,EAAS,SAAU+C,GAAQ,OAAOA,EAAKyK,KAAKA,EAAKrG,cAAcpE,EAAKyE,SAKtE,IADA,IAAI0f,EAAU,GACL5V,EAAM,EAAGA,EAAMuX,EAAKhnB,WAAYyP,IAAS4V,EAAQ7mB,KAAKL,EAAO6oB,EAAK1mB,MAAMmP,KACjF,GAAI,IAASrQ,KAAKimB,GAASnjB,GAAGoN,GAAQ,MAAO,CAAC3D,KAAMA,EAAMhH,KAAMA,GA3D9CgoD,CAAatmD,EAAMjG,OAAOxC,QAAQ+D,IAAI0E,EAAMiB,aAAchB,EAAIgB,cACjDglD,EAAOlsD,OAAOxC,QAAQ+D,IAAI2qD,EAAOhlD,aAAc8jD,EAAOC,KAAOiB,EAAO9rD,WAE/FkhB,EAAKmK,EAAKld,MAAM+S,GACO,OAAnB2qC,EAAW1nD,KAAiB+c,EAAG8J,QAAQ+gC,EAAQC,EAAMH,EAAW1gD,MAC7D+V,EAAG2J,WAAWkhC,EAAQC,EAAMH,EAAW1gD,WACzC,GAAItF,EAAMjG,OAAOE,MAAM+F,EAAMtE,SAASZ,QAAUkF,EAAMtE,SAAWuE,EAAIvE,SAAWuE,EAAIyB,WAAa,EAAI,GAAI,CAE9G,IAAI4M,EAAStO,EAAMjG,OAAOS,YAAYwF,EAAMiB,aAAchB,EAAIgB,cAC9D,GAAIukB,EAAK2rB,SAAS,mBAAmB,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAM0gC,EAAQC,EAAM73C,MAAe,OAChG+M,EAAKmK,EAAKld,MAAM+S,GAAG0E,WAAWzR,EAAQ43C,EAAQC,GAMlD,GAFK9qC,IACDA,EAAKmK,EAAKld,MAAM+S,GAAGtb,QAAQmmD,EAAQC,EAAM7+C,EAAMrE,IAAI/K,MAAM6sD,EAAO5qD,MAAQmN,EAAMvO,KAAMgsD,EAAOE,KAAO39C,EAAMvO,QACxGuO,EAAMuW,IAAK,CACb,IAAI0oC,EAAQjB,GAAiB9/B,EAAMnK,EAAGpY,IAAKqE,EAAMuW,KAM7C0oC,KAAW,EAAO3iB,QAAU,EAAO8K,SAAWlpB,EAAKyP,WAAasxB,EAAM/qD,QAC1D+qD,EAAMh0C,MAAQ2zC,GAAUK,EAAMh0C,MAAQ8I,EAAGK,QAAQ5iB,IAAIqtD,GAAQ,IAChE,EAAOjiB,IAAMqiB,EAAM/qD,OAAS+qD,EAAMh0C,MAAQ2zC,IACnD7qC,EAAG0C,aAAawoC,GAElBxnC,GAAe1D,EAAG8B,YAAY4B,GAClCyG,EAAK5C,SAASvH,EAAG6E,oBAGnB,SAASolC,GAAiB9/B,EAAMviB,EAAKujD,GACnC,OAAIpsD,KAAKC,IAAImsD,EAAUprC,OAAQorC,EAAUj0C,MAAQtP,EAAI1L,QAAQyB,KAAe,KACrEwnD,GAAiBh7B,EAAMviB,EAAIoB,QAAQmiD,EAAUprC,QAASnY,EAAIoB,QAAQmiD,EAAUj0C,OAkDrF,SAASqzC,GAAsB3pC,EAAMwqC,EAASC,GAE5C,IADA,IAAIxmD,EAAQ+b,EAAK/b,MAAOhG,EAAMusD,EAAUxqC,EAAK/hB,MAAQ+hB,EAAKjiB,IACnDkG,EAAQ,IAAMumD,GAAWxqC,EAAK7Y,WAAWlD,IAAU+b,EAAKphB,KAAKqF,GAAOvG,aACzEuG,IACAhG,IACAusD,GAAU,EAEZ,GAAIC,EAEF,IADA,IAAI7iD,EAAOoY,EAAKphB,KAAKqF,GAAOnE,WAAWkgB,EAAK7Y,WAAWlD,IAChD2D,IAASA,EAAK9I,QACnB8I,EAAOA,EAAKrK,WACZU,IAGJ,OAAOA,EA2BT,SAASysD,GAAsBnhC,EAAMttB,GAKnC,IAJA,IAAIgX,EAAU,GACV3X,EAAUW,EAAMX,QAChBqI,EAAY1H,EAAM0H,UAClBC,EAAU3H,EAAM2H,QACbD,EAAY,GAAKC,EAAU,GAA2B,GAAtBtI,EAAQoC,YAAoD,GAAjCpC,EAAQiC,WAAWG,YAAiB,CACpGiG,IACAC,IACA,IAAIhF,EAAOtD,EAAQiC,WACnB0V,EAAQ/W,KAAK0C,EAAKyD,KAAKzI,KAAMgF,EAAKmD,OAASnD,EAAKyD,KAAK+G,aAAexK,EAAKmD,MAAQ,MACjFzG,EAAUsD,EAAKtD,QAGjB,IAAIqvD,EAAaphC,EAAK2rB,SAAS,wBAA0B,IAAc/gC,WAAWoV,EAAKld,MAAM9K,QACzFyF,EAAM4jD,KAAe1zC,EAAOlQ,EAAIqX,cAAc,OAClDnH,EAAK8C,YAAY2wC,EAAWvtC,kBAAkB9hB,EAAS,CAAC4hB,SAAUlW,KAGlE,IADA,IAAkCy7C,EAA9BllD,EAAa2Z,EAAK3Z,WACfA,GAAqC,GAAvBA,EAAWoN,WAAkB83C,EAAYoI,GAAQttD,EAAWgc,SAASM,iBAAiB,CACzG,IAAK,IAAIxgB,EAAIopD,EAAU/mD,OAAS,EAAGrC,GAAK,EAAGA,IAAK,CAE9C,IADA,IAAIyxD,EAAU9jD,EAAIqX,cAAcokC,EAAUppD,IACnC6d,EAAK3Z,YAAcutD,EAAQ9wC,YAAY9C,EAAK3Z,YACnD2Z,EAAK8C,YAAY8wC,GAEnBvtD,EAAa2Z,EAAK3Z,WASpB,OANIA,GAAqC,GAAvBA,EAAWoN,UACzBpN,EAAWihB,aAAa,gBAAkB7a,EAAY,IAAMC,EAAU,IAAOiH,KAAKC,UAAUmI,IAKzF,CAACD,IAAKkE,EAAMxY,KAHR6qB,EAAK2rB,SAAS,2BAA2B,SAAUv4C,GAAK,OAAOA,EAAEV,OACxEA,EAAMX,QAAQiD,YAAY,EAAGtC,EAAMX,QAAQyB,KAAM,SAOvD,SAASguD,GAAmBxhC,EAAM7qB,EAAMi+B,EAAMquB,EAAWxuC,GACvD,IAAIxJ,EAA8C/W,EAAzCgvD,EAASzuC,EAAS1e,OAAOuE,KAAKqE,KAAKugB,KAC5C,IAAK0V,IAASj+B,EAAQ,OAAO,KAC7B,IAAIwsD,EAASxsD,IAASssD,GAAaC,IAAWtuB,GAC9C,GAAIuuB,EAAQ,CAEV,GADA3hC,EAAK2rB,SAAS,uBAAuB,SAAUv4C,GAAK+B,EAAO/B,EAAE+B,EAAMusD,GAAUD,MACzEC,EAAU,OAAO,IAAI,IAAM,IAASnuD,KAAKysB,EAAKld,MAAM9K,OAAO7C,KAAKA,IAAQ,EAAG,GAC/E,IAAIysD,EAAS5hC,EAAK2rB,SAAS,uBAAuB,SAAUv4C,GAAK,OAAOA,EAAE+B,EAAM8d,EAAUwuC,MACtFG,EACFlvD,EAAQkvD,GAERn4C,EAAMkK,SAASmB,cAAc,OAC7B3f,EAAKqa,OAAOjK,MAAM,iBAAiBpS,SAAQ,SAAUif,GACnD3I,EAAIgH,YAAYkD,SAASmB,cAAc,MAAMtV,YAAc4S,WAI/D4N,EAAK2rB,SAAS,uBAAuB,SAAUv4C,GAAKggC,EAAOhgC,EAAEggC,MAC7D3pB,EAyHJ,SAAkB2pB,GAChB,IAAIyuB,EAAQ,qBAAqBj0C,KAAKwlB,GAClCyuB,IAASzuB,EAAOA,EAAK1gC,MAAMmvD,EAAM,GAAG1vD,SACxC,IAC+Dwb,EAD3DqkB,EAAMqvB,KAAcvsC,cAAc,OAClCgtC,EAAW,oCAAoCl0C,KAAKwlB,GAAa14B,EAAQ,GACzEiT,EAAOm0C,GAAYR,GAAQQ,EAAS,GAAGxxC,kBACzC8iB,EAAOzlB,EAAKra,KAAI,SAAU/B,GAAK,MAAO,IAAMA,EAAI,OAAQsG,KAAK,IAAMu7B,EAAOzlB,EAAKra,KAAI,SAAU/B,GAAK,MAAO,KAAOA,EAAI,OAAQ4T,UAAUtN,KAAK,IAC3I6C,EAAQiT,EAAKxb,QAEf6/B,EAAI+vB,UAAY3uB,EAChB,IAAK,IAAItjC,EAAI,EAAGA,EAAI4K,EAAO5K,IAAOkiC,EAAMA,EAAIh+B,WAC5C,OAAOg+B,EApICgwB,CAAS5uB,GAGjB,IAAI6uB,EAAcx4C,GAAOA,EAAImI,cAAc,mBACvCswC,EAAYD,GAAe,oBAAoBr0C,KAAKq0C,EAAY5yC,aAAa,kBACjF,IAAK3c,EAAO,CACV,IAAIwb,EAAS8R,EAAK2rB,SAAS,oBAAsB3rB,EAAK2rB,SAAS,cAAgB,IAAU/gC,WAAWoV,EAAKld,MAAM9K,QAC/GtF,EAAQwb,EAAOpE,WAAWL,EAAK,CAAC2D,sBAAuBu0C,IAAUO,GAAYx4C,QAASuJ,IAQxF,OALIvgB,EADAwvD,EA8HN,SAAoBxvD,EAAOgX,GACzB,IAAKhX,EAAMc,KAAQ,OAAOd,EAC1B,IAAmD2F,EAA/CL,EAAStF,EAAMX,QAAQiC,WAAW8E,KAAKd,OAC3C,IAAMK,EAAQiJ,KAAKQ,MAAM4H,GACzB,MAAM2b,GAAK,OAAO3yB,EAIlB,IAHA,IAAIX,EAAUW,EAAMX,QAChBqI,EAAY1H,EAAM0H,UAClBC,EAAU3H,EAAM2H,QACXvK,EAAIuI,EAAMlG,OAAS,EAAGrC,GAAK,EAAGA,GAAK,EAAG,CAC7C,IAAIgJ,EAAOd,EAAOO,MAAMF,EAAMvI,IAC9B,IAAKgJ,GAAQA,EAAKmL,mBAAsB,MACxClS,EAAU,IAASwB,KAAKuF,EAAK1H,OAAOiH,EAAMvI,EAAI,GAAIiC,IAClDqI,IAAaC,IAEf,OAAO,IAAI,IAAMtI,EAASqI,EAAWC,GA3IzB8nD,CAmFd,SAAoBzvD,EAAO0H,EAAWC,GAChCD,EAAY1H,EAAM0H,YAClB1H,EAAQ,IAAI,IAAM0vD,GAAW1vD,EAAMX,SAAU,EAAGqI,EAAW1H,EAAM0H,UAAW,EAAG1H,EAAM2H,SAAUD,EAAW1H,EAAM2H,UAChHA,EAAU3H,EAAM2H,UAChB3H,EAAQ,IAAI,IAAM0vD,GAAW1vD,EAAMX,QAAS,EAAGsI,EAAS3H,EAAM2H,QAAS,EAAG,GAAI3H,EAAM0H,UAAWC,IACnG,OAAO3H,EAxFgB2vD,CAAW3vD,GAAQwvD,EAAU,IAAKA,EAAU,IAAKA,EAAU,IAEtE,IAAMjlD,QAcpB,SAA2BV,EAAU0W,GACnC,GAAI1W,EAASpI,WAAa,EAAK,OAAOoI,EAsBtC,IArBA,IAAI+G,EAAO,SAAWlT,GACpB,IACImQ,EADS0S,EAAS5d,KAAKjF,GACRkQ,eAAe2S,EAAS/c,MAAM9F,IAC7CkyD,OAAW,EAAU3uD,EAAS,GAelC,GAdA4I,EAASpJ,SAAQ,SAAUkC,GACzB,GAAK1B,EAAL,CACA,IAA0C4uD,EAAtC50C,EAAOpN,EAAMsE,aAAaxP,EAAKyD,MACnC,IAAK6U,EAAQ,OAAOha,EAAS,KAC7B,GAAI4uD,EAAS5uD,EAAOxB,QAAUmwD,EAASnwD,QA+B7C,SAASqwD,EAAa70C,EAAM20C,EAAUjtD,EAAMotD,EAAS/nD,GACnD,GAAIA,EAAQiT,EAAKxb,QAAUuI,EAAQ4nD,EAASnwD,QAAUwb,EAAKjT,IAAU4nD,EAAS5nD,GAAQ,CACpF,IAAI5D,EAAQ0rD,EAAa70C,EAAM20C,EAAUjtD,EAAMotD,EAAQvuD,UAAWwG,EAAQ,GAC1E,GAAI5D,EAAS,OAAO2rD,EAAQrsD,KAAKqsD,EAAQ1wD,QAAQkE,aAAawsD,EAAQtuD,WAAa,EAAG2C,IAEtF,GADY2rD,EAAQniD,eAAemiD,EAAQtuD,YACjC6M,UAAUtG,GAASiT,EAAKxb,OAAS,EAAIkD,EAAKyD,KAAO6U,EAAKjT,EAAQ,IACpE,OAAO+nD,EAAQrsD,KAAKqsD,EAAQ1wD,QAAQ2B,OAAO,IAASH,KAAKmvD,GAAartD,EAAMsY,EAAMjT,EAAQ,OArC3C8nD,CAAa70C,EAAM20C,EAAUjtD,EAAM1B,EAAOA,EAAOxB,OAAS,GAAI,GAC7GwB,EAAOA,EAAOxB,OAAS,GAAKowD,MACvB,CACD5uD,EAAOxB,SAAUwB,EAAOA,EAAOxB,OAAS,GAsCpD,SAASwwD,EAAWttD,EAAMqF,GACxB,GAAa,GAATA,EAAc,OAAOrF,EACzB,IAAIkH,EAAWlH,EAAKtD,QAAQkE,aAAaZ,EAAKlB,WAAa,EAAGwuD,EAAWttD,EAAKnB,UAAWwG,EAAQ,IAC7FgT,EAAOrY,EAAKiL,eAAejL,EAAKlB,YAAYkQ,WAAW,IAASrO,OAAO,GAC3E,OAAOX,EAAKe,KAAKmG,EAAS7I,OAAOga,IA1CsBi1C,CAAWhvD,EAAOA,EAAOxB,OAAS,GAAImwD,EAASnwD,SAChG,IAAIywD,EAAUF,GAAartD,EAAMsY,GACjCha,EAAOhB,KAAKiwD,GACZriD,EAAQA,EAAMS,UAAU4hD,EAAQ9pD,KAAM8pD,EAAQpqD,OAC9C8pD,EAAW30C,OAGXha,EAAU,MAAO,CAAEsb,EAAG,IAAS1b,KAAKI,KAGjCvD,EAAI6iB,EAASvY,MAAOtK,GAAK,EAAGA,IAAK,CACxC,IAAI8e,EAAW5L,EAAMlT,GAErB,GAAK8e,EAAW,OAAOA,EAASD,EAElC,OAAO1S,EA1CmBsmD,CAAkBnwD,EAAMX,QAASkhB,IAAW,GAEtE+M,EAAK2rB,SAAS,mBAAmB,SAAUv4C,GAAKV,EAAQU,EAAEV,MACnDA,EA0CT,SAASgwD,GAAartD,EAAMsY,EAAMpa,QAClB,IAATA,IAAkBA,EAAO,GAE9B,IAAK,IAAIzD,EAAI6d,EAAKxb,OAAS,EAAGrC,GAAKyD,EAAMzD,IACrCuF,EAAOsY,EAAK7d,GAAGsB,OAAO,KAAM,IAASmC,KAAK8B,IAC9C,OAAOA,EAsBT,SAAS+sD,GAAW7lD,EAAU+gB,EAAM/pB,EAAMc,EAAIqG,EAAOL,GACnD,IAAIhF,EAAOioB,EAAO,EAAI/gB,EAASvI,WAAauI,EAASrI,UAAW4C,EAAQzB,EAAKtD,QAK7E,OAJI2I,EAAQrG,EAAK,IAAKyC,EAAQsrD,GAAWtrD,EAAOwmB,EAAM/pB,EAAMc,EAAIqG,EAAQ,EAAGL,IACvEK,GAASnH,IACTuD,EAAQwmB,EAAO,EAAIjoB,EAAKiL,eAAe,GAAG+D,WAAWvN,EAAOyF,EAASpI,WAAa,GAAKkG,GAAWK,GAAOhH,OAAOoD,GAC9GA,EAAMpD,OAAO2B,EAAKiL,eAAejL,EAAKlB,YAAYkQ,WAAW,IAASrO,OAAO,KAC5EuG,EAAStG,aAAaqnB,EAAO,EAAI,EAAI/gB,EAASpI,WAAa,EAAGkB,EAAKe,KAAKU,IAcjF,IAAIwqD,GAAU,CACZwB,MAAO,CAAC,SACRC,MAAO,CAAC,SACRn2C,MAAO,CAAC,SACRo2C,QAAS,CAAC,SACVC,SAAU,CAAC,SACXC,IAAK,CAAC,QAAS,YACfrtC,GAAI,CAAC,QAAS,SACdstC,GAAI,CAAC,QAAS,QAAS,MACvBC,GAAI,CAAC,QAAS,QAAS,OAGrBC,GAAe,KACnB,SAAShC,KACP,OAAOgC,KAAiBA,GAAe1vC,SAAS2vC,eAAeC,mBAAmB,UAkCpF,IAAIC,GAAiB,CACnBC,WAAW,EACXC,eAAe,EACfC,uBAAuB,EACvBC,YAAY,EACZC,mBAAmB,EACnBC,SAAS,GAGPC,GAAc,EAAOrlB,IAAM,EAAOkK,YAAc,GAEhDob,GAAiB,WACnBhyD,KAAK4hD,WAAa5hD,KAAK6hD,aAAe7hD,KAAKo/C,UAAYp/C,KAAKs/C,YAAc,MAG5E0S,GAAetyD,UAAU2H,IAAM,SAAcgf,GAC3CrmB,KAAK4hD,WAAav7B,EAAIu7B,WAAY5hD,KAAK6hD,aAAex7B,EAAIw7B,aAC1D7hD,KAAKo/C,UAAY/4B,EAAI+4B,UAAWp/C,KAAKs/C,YAAcj5B,EAAIi5B,aAGzD0S,GAAetyD,UAAU2E,GAAK,SAAagiB,GACzC,OAAOA,EAAIu7B,YAAc5hD,KAAK4hD,YAAcv7B,EAAIw7B,cAAgB7hD,KAAK6hD,cACnEx7B,EAAI+4B,WAAap/C,KAAKo/C,WAAa/4B,EAAIi5B,aAAet/C,KAAKs/C,aAG/D,IAAI2S,GAAc,SAAqBjkC,EAAMkkC,GAC3C,IAAIj7C,EAASjX,KAEbA,KAAKguB,KAAOA,EACZhuB,KAAKkyD,gBAAkBA,EACvBlyD,KAAKmyD,MAAQ,GACbnyD,KAAKoyD,cAAgB,EACrBpyD,KAAKqyD,SAAWzwC,OAAO0wC,kBACrB,IAAI1wC,OAAO0wC,kBAAiB,SAAUC,GACpC,IAAK,IAAIz0D,EAAI,EAAGA,EAAIy0D,EAAUpyD,OAAQrC,IAAOmZ,EAAOk7C,MAAMxxD,KAAK4xD,EAAUz0D,IAKrE,EAAO4uC,IAAM,EAAOkK,YAAc,IAAM2b,EAAU/6C,MACpD,SAAUtZ,GAAK,MAAiB,aAAVA,EAAE4I,MAAuB5I,EAAEs0D,aAAaryD,QAC/C,iBAAVjC,EAAE4I,MAA2B5I,EAAEilD,SAAShjD,OAASjC,EAAE6L,OAAO8T,UAAU1d,UACvE8W,EAAOw7C,YAEPx7C,EAAOy7C,WAEf1yD,KAAK2yD,iBAAmB,IAAIX,GACxBD,KACF/xD,KAAK4yD,WAAa,SAAUv/B,GAC1Bpc,EAAOk7C,MAAMxxD,KAAK,CAACoJ,OAAQspB,EAAEtpB,OAAQjD,KAAM,gBAAiBq8C,SAAU9vB,EAAEw/B,YACxE57C,EAAOw7C,cAGXzyD,KAAK8yD,kBAAoB9yD,KAAK8yD,kBAAkBxzD,KAAKU,MACrDA,KAAK+yD,6BAA8B,GAGrCd,GAAYvyD,UAAU+yD,UAAY,WAC9B,IAAIx7C,EAASjX,KAEXA,KAAKoyD,aAAe,IACpBpyD,KAAKoyD,aAAexwC,OAAO2b,YAAW,WAActmB,EAAOm7C,cAAgB,EAAGn7C,EAAOy7C,UAAY,MAGvGT,GAAYvyD,UAAUszD,WAAa,WAC7BhzD,KAAKoyD,cAAgB,IACvBxwC,OAAOqxC,aAAajzD,KAAKoyD,cACzBpyD,KAAKoyD,cAAgB,EACrBpyD,KAAK0yD,UAITT,GAAYvyD,UAAUiD,MAAQ,WACxB3C,KAAKqyD,UACLryD,KAAKqyD,SAASa,QAAQlzD,KAAKguB,KAAKvW,IAAK+5C,IACrCO,IACA/xD,KAAKguB,KAAKvW,IAAI0yC,iBAAiB,2BAA4BnqD,KAAK4yD,YACpE5yD,KAAKsqD,oBAGP2H,GAAYvyD,UAAUojD,KAAO,WACzB,IAAI7rC,EAASjX,KAEf,GAAIA,KAAKqyD,SAAU,CACjB,IAAIc,EAAOnzD,KAAKqyD,SAASe,cACzB,GAAID,EAAKhzD,OAAQ,CACf,IAAK,IAAIrC,EAAI,EAAGA,EAAIq1D,EAAKhzD,OAAQrC,IAAOkC,KAAKmyD,MAAMxxD,KAAKwyD,EAAKr1D,IAC7D8jB,OAAO2b,YAAW,WAAc,OAAOtmB,EAAOy7C,UAAY,IAE5D1yD,KAAKqyD,SAASgB,aAEZtB,IAAe/xD,KAAKguB,KAAKvW,IAAIwyC,oBAAoB,2BAA4BjqD,KAAK4yD,YACtF5yD,KAAKupD,uBAGP0I,GAAYvyD,UAAU4qD,iBAAmB,WACvCtqD,KAAKguB,KAAKvW,IAAI2H,cAAc+qC,iBAAiB,kBAAmBnqD,KAAK8yD,oBAGvEb,GAAYvyD,UAAU6pD,oBAAsB,WAC1CvpD,KAAKguB,KAAKvW,IAAI2H,cAAc6qC,oBAAoB,kBAAmBjqD,KAAK8yD,oBAG1Eb,GAAYvyD,UAAU6uD,yBAA2B,WAC7C,IAAIt3C,EAASjX,KAEfA,KAAK+yD,6BAA8B,EACnCx1B,YAAW,WAAc,OAAOtmB,EAAO87C,6BAA8B,IAAU,KAGjFd,GAAYvyD,UAAUozD,kBAAoB,WACxC,MA37B4B9kC,EA27BFhuB,KAAKguB,MA17BtBm7B,UAAYn7B,EAAK8tB,KAAKyC,eAAiBvwB,EAAKvW,MAC9C4xC,GAAar7B,GAy7BpB,CA37BF,IAA8BA,EA47B5B,GAAIhuB,KAAK+yD,4BAA+B,OAAO9J,GAAejpD,KAAKguB,MAInE,GAAI,EAAO0e,IAAM,EAAOkK,YAAc,KAAO52C,KAAKguB,KAAKld,MAAMwV,UAAUtiB,MAAO,CAC5E,IAAIqiB,EAAMrmB,KAAKguB,KAAK8tB,KAAKkD,eAEzB,GAAI34B,EAAI+4B,WAAatH,EAAqBzxB,EAAI+4B,UAAW/4B,EAAIi5B,YAAaj5B,EAAIu7B,WAAYv7B,EAAIw7B,cAC1F,OAAO7hD,KAAKyyD,YAElBzyD,KAAK0yD,UAGPT,GAAYvyD,UAAU2qD,gBAAkB,WACtCrqD,KAAK2yD,iBAAiBtrD,IAAIrH,KAAKguB,KAAK8tB,KAAKkD,iBAG3CiT,GAAYvyD,UAAU4zD,sBAAwB,SAAgCjtC,GAC5E,GAAsB,GAAlBA,EAAIsyB,WAAmB,OAAO,EAClC,IAAI4a,EAAYltC,EAAIuyB,WAAW,GAAG4a,wBAC9B5qC,EAAO5oB,KAAKguB,KAAK4uB,QAAQC,YAAY0W,GACzC,OAAI3qC,GAAQA,EAAKs5B,eAAe,CAACp7C,KAAM,YAAaiD,OAA8B,GAAtBwpD,EAAUnkD,SAAgBmkD,EAAUhc,WAAagc,KAC3GvzD,KAAKqqD,mBACE,QAFT,GAMF4H,GAAYvyD,UAAUgzD,MAAQ,WAC5B,GAAK1yD,KAAKguB,KAAK4uB,WAAW58C,KAAKoyD,cAAgB,GAA/C,CACA,IAAIG,EAAYvyD,KAAKqyD,SAAWryD,KAAKqyD,SAASe,cAAgB,GAC1DpzD,KAAKmyD,MAAMhyD,SACboyD,EAAYvyD,KAAKmyD,MAAMrxD,OAAOyxD,GAC9BvyD,KAAKmyD,MAAMhyD,OAAS,GAGtB,IAAIkmB,EAAMrmB,KAAKguB,KAAK8tB,KAAKkD,eACrB0N,GAAU1sD,KAAK+yD,8BAAgC/yD,KAAK2yD,iBAAiBtuD,GAAGgiB,IAAQgjC,GAAarpD,KAAKguB,QAAUhuB,KAAKszD,sBAAsBjtC,GAEvI9kB,GAAQ,EAAGc,GAAM,EAAGiqD,GAAW,EAAOj2B,EAAQ,GAClD,GAAIr2B,KAAKguB,KAAKm7B,SACZ,IAAK,IAAIrrD,EAAI,EAAGA,EAAIy0D,EAAUpyD,OAAQrC,IAAK,CACzC,IAAI21D,EAAWzzD,KAAK0zD,iBAAiBnB,EAAUz0D,GAAIu4B,GAC/Co9B,IACFlyD,EAAOA,EAAO,EAAIkyD,EAASlyD,KAAOqB,KAAKE,IAAI2wD,EAASlyD,KAAMA,GAC1Dc,EAAKA,EAAK,EAAIoxD,EAASpxD,GAAKO,KAAKC,IAAI4wD,EAASpxD,GAAIA,GAC9CoxD,EAASnH,WAAYA,GAAW,IAK1C,GAAI,EAAO9f,OAASnW,EAAMl2B,OAAS,EAAG,CACpC,IAAIwzD,EAAMt9B,EAAMlH,QAAO,SAAU5vB,GAAK,MAAqB,MAAdA,EAAEye,YAC/C,GAAkB,GAAd21C,EAAIxzD,OAAa,CACnB,IAAIsE,EAAIkvD,EAAI,GACNjvD,EAAIivD,EAAI,GACVlvD,EAAE8yC,YAAc9yC,EAAE8yC,WAAWA,YAAc7yC,EAAE6yC,WAAc7yC,EAAEjE,SAC1DgE,EAAEhE,WAITc,GAAQ,GAAKmrD,KACXnrD,GAAQ,IACVvB,KAAKguB,KAAK4uB,QAAQwF,UAAU7gD,EAAMc,GA2DxC,SAAkB2rB,GAChB,GAAI4lC,GAAc,OAClBA,IAAa,EACgC,UAAzCrN,iBAAiBv4B,EAAKvW,KAAKo8C,YAC3BC,QAAc,KAAE,4KA9DhBC,CAAS/zD,KAAKguB,OAEhBhuB,KAAKkyD,gBAAgB3wD,EAAMc,EAAIiqD,EAAUj2B,GACrCr2B,KAAKguB,KAAK4uB,QAAQgD,MAAS5/C,KAAKguB,KAAKwwB,YAAYx+C,KAAKguB,KAAKld,OACrD9Q,KAAK2yD,iBAAiBtuD,GAAGgiB,IAAQ4iC,GAAejpD,KAAKguB,MAC/DhuB,KAAK2yD,iBAAiBtrD,IAAIgf,MAI9B4rC,GAAYvyD,UAAUg0D,iBAAmB,SAA2BxQ,EAAK7sB,GAEvE,GAAIA,EAAMzlB,QAAQsyC,EAAIn5C,SAAW,EAAK,OAAO,KAC7C,IAAI6e,EAAO5oB,KAAKguB,KAAK4uB,QAAQC,YAAYqG,EAAIn5C,QAC7C,GAAgB,cAAZm5C,EAAIp8C,OACH8hB,GAAQ5oB,KAAKguB,KAAK4uB,SAAgC,mBAArBsG,EAAI8Q,eAEX,SAArB9Q,EAAI8Q,gBAA6B9Q,EAAIC,WAAaD,EAAIn5C,OAAOsT,aAAa,UAC5E,OAAO,KACX,IAAKuL,GAAQA,EAAKs5B,eAAegB,GAAQ,OAAO,KAEhD,GAAgB,aAAZA,EAAIp8C,KAAqB,CAC3B,IAAIqiB,EAAO+5B,EAAInlC,gBAAiB1R,EAAO62C,EAAI1kC,YAC3C,GAAI,EAAOkuB,IAAM,EAAOkK,YAAc,IAAMsM,EAAIqJ,WAAWpsD,OAGzD,IAAK,IAAIrC,EAAI,EAAGA,EAAIolD,EAAIqJ,WAAWpsD,OAAQrC,IAAK,CAC9C,IAAI8K,EAAMs6C,EAAIqJ,WAAWzuD,GACnBigB,EAAkBnV,EAAImV,gBACtBS,EAAc5V,EAAI4V,cACnBT,GAAmB9X,MAAMvG,UAAUkR,QAAQ3S,KAAKilD,EAAIqJ,WAAYxuC,GAAmB,KAAKoL,EAAOpL,KAC/FS,GAAevY,MAAMvG,UAAUkR,QAAQ3S,KAAKilD,EAAIqJ,WAAY/tC,GAAe,KAAKnS,EAAOmS,GAQhG,IALA,IAAI0iC,EAAa/3B,GAAQA,EAAKouB,YAAc2L,EAAIn5C,OAC1CutC,EAASnuB,GAAQ,EAAI,EACvB5nB,EAAOqnB,EAAK43B,gBAAgB0C,EAAIn5C,OAAQm3C,GAAa,GACrDC,EAAW90C,GAAQA,EAAKkrC,YAAc2L,EAAIn5C,OACxCutC,EAASjrC,GAAQ62C,EAAIn5C,OAAO+V,WAAW3f,OACpCuR,EAAM,EAAGA,EAAMwxC,EAAIqJ,WAAWpsD,OAAQuR,IAAS2kB,EAAM11B,KAAKuiD,EAAIqJ,WAAW76C,IAElF,MAAO,CAACnQ,KAAMA,EAAMc,GADXumB,EAAK43B,gBAAgB0C,EAAIn5C,OAAQo3C,EAAU,IAE/C,MAAgB,cAAZ+B,EAAIp8C,KACN,CAACvF,KAAMqnB,EAAKu0B,WAAav0B,EAAKw0B,OAAQ/6C,GAAIumB,EAAKk3B,SAAWl3B,EAAKw0B,QAE/D,CACL77C,KAAMqnB,EAAKu0B,WACX96C,GAAIumB,EAAKk3B,SAKTwM,SAAUpJ,EAAIn5C,OAAO8T,WAAaqlC,EAAIC,WAK5C,IAAIyQ,IAAa,EAWjB,IAAI/yB,GAAW,GAAIozB,GAAe,GA2ClC,SAASC,GAAmBlmC,EAAM66B,GAChC76B,EAAKy+B,oBAAsB5D,EAC3B76B,EAAKw+B,kBAAoBrlC,KAAKC,MAWhC,SAAS+sC,GAAgBnmC,GACvBA,EAAK2rB,SAAS,mBAAmB,SAAUya,GACzC,IAAK,IAAIttD,KAAQstD,EAAwBpmC,EAAKqmC,cAAcvtD,IACxDknB,EAAKvW,IAAI0yC,iBAAiBrjD,EAAMknB,EAAKqmC,cAAcvtD,GAAQ,SAAUkmC,GAAS,OAAOsnB,GAAiBtmC,EAAMgf,QAIpH,SAASsnB,GAAiBtmC,EAAMgf,GAC9B,OAAOhf,EAAK2rB,SAAS,mBAAmB,SAAU9Y,GAChD,IAAI9D,EAAU8D,EAASmM,EAAMlmC,MAC7B,QAAOi2B,IAAUA,EAAQ/O,EAAMgf,IAAUA,EAAMunB,qBAoEnD,SAASC,GAAYxnB,GAAS,MAAO,CAAC4F,KAAM5F,EAAMynB,QAAS93C,IAAKqwB,EAAM0nB,SAOtE,SAASC,GAAoB3mC,EAAM4mC,EAAUpyD,EAAK4xB,EAAQ4Y,GACxD,IAAe,GAAX5Y,EAAgB,OAAO,EAQ3B,IAPA,IAAI3P,EAAOuJ,EAAKld,MAAMrF,IAAIoB,QAAQunB,GAC9B9iB,EAAO,SAAWxT,GACpB,GAAIkwB,EAAK2rB,SAASib,GAAU,SAAUxzD,GAAK,OAAOtD,EAAI2mB,EAAK/b,MAAQtH,EAAE4sB,EAAMxrB,EAAKiiB,EAAKta,UAAWsa,EAAK5Y,OAAO/N,GAAIkvC,GAAO,GACrE5rC,EAAE4sB,EAAMxrB,EAAKiiB,EAAKphB,KAAKvF,GAAI2mB,EAAK5Y,OAAO/N,GAAIkvC,GAAO,MAChG,MAAO,CAAE/vB,GAAG,IAGTnf,EAAI2mB,EAAK/b,MAAQ,EAAG5K,EAAI,EAAGA,IAAK,CACvC,IAAIof,EAAW5L,EAAMxT,GAErB,GAAKof,EAAW,OAAOA,EAASD,EAElC,OAAO,EAGT,SAAS43C,GAAgB7mC,EAAM1H,EAAWuiC,GACnC76B,EAAK8mC,SAAW9mC,EAAK8gB,QAC1B,IAAIjrB,EAAKmK,EAAKld,MAAM+S,GAAG0C,aAAaD,GACtB,WAAVuiC,GAAuBhlC,EAAG2E,QAAQ,WAAW,GACjDwF,EAAK5C,SAASvH,GAuChB,SAASkxC,GAAkB/mC,EAAMxrB,EAAK4xB,EAAQ4Y,EAAOsa,GACnD,OAAOqN,GAAoB3mC,EAAM,gBAAiBxrB,EAAK4xB,EAAQ4Y,IAC7Dhf,EAAK2rB,SAAS,eAAe,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAMxrB,EAAKwqC,QAC/Dsa,EA7BL,SAA2Bt5B,EAAMoG,GAC/B,IAAe,GAAXA,EAAgB,OAAO,EAC3B,IAAgC4gC,EAAcC,EAA1C5uC,EAAM2H,EAAKld,MAAMwV,UACjBD,aAAe,MAAiB2uC,EAAe3uC,EAAIhjB,MAGvD,IADA,IAAIohB,EAAOuJ,EAAKld,MAAMrF,IAAIoB,QAAQunB,GACzBt2B,EAAI2mB,EAAK/b,MAAQ,EAAG5K,EAAI,EAAGA,IAAK,CACvC,IAAIuF,EAAOvF,EAAI2mB,EAAK/b,MAAQ+b,EAAKta,UAAYsa,EAAKphB,KAAKvF,GACvD,GAAI,IAAcooB,aAAa7iB,GAAO,CAGhC4xD,EAFAD,GAAgB3uC,EAAI7d,MAAME,MAAQ,GAClC5K,GAAKuoB,EAAI7d,MAAME,OAAS+b,EAAK5Y,OAAOwa,EAAI7d,MAAME,MAAQ,IAAM2d,EAAI7d,MAAMhG,IAC3DiiB,EAAK5Y,OAAOwa,EAAI7d,MAAME,OAEtB+b,EAAK5Y,OAAO/N,GAC3B,OAIJ,OAAgB,MAAZm3D,IACFJ,GAAgB7mC,EAAM,IAAc5uB,OAAO4uB,EAAKld,MAAMrF,IAAKwpD,GAAW,YAC/D,GASOC,CAAkBlnC,EAAMoG,GAvC1C,SAA2BpG,EAAMoG,GAC/B,IAAe,GAAXA,EAAgB,OAAO,EAC3B,IAAI3P,EAAOuJ,EAAKld,MAAMrF,IAAIoB,QAAQunB,GAAS/wB,EAAOohB,EAAKta,UACvD,SAAI9G,GAAQA,EAAKqK,QAAU,IAAcwY,aAAa7iB,MACpDwxD,GAAgB7mC,EAAM,IAAI,IAAcvJ,GAAO,YACxC,GAkCyC0wC,CAAkBnnC,EAAMoG,IAG5E,SAASghC,GAAkBpnC,EAAMxrB,EAAK4xB,EAAQ4Y,GAC5C,OAAO2nB,GAAoB3mC,EAAM,sBAAuBxrB,EAAK4xB,EAAQ4Y,IACnEhf,EAAK2rB,SAAS,qBAAqB,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAMxrB,EAAKwqC,MAG1E,SAASqoB,GAAkBrnC,EAAMxrB,EAAK4xB,EAAQ4Y,GAC5C,OAAO2nB,GAAoB3mC,EAAM,sBAAuBxrB,EAAK4xB,EAAQ4Y,IACnEhf,EAAK2rB,SAAS,qBAAqB,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAMxrB,EAAKwqC,OAI1E,SAA4Bhf,EAAMoG,GAChC,IAAI3oB,EAAMuiB,EAAKld,MAAMrF,IACrB,IAAe,GAAX2oB,EACF,QAAI3oB,EAAIgB,gBACNooD,GAAgB7mC,EAAM,IAAc5uB,OAAOqM,EAAK,EAAGA,EAAI1L,QAAQyB,MAAO,YAC/D,GAMX,IADA,IAAIijB,EAAOhZ,EAAIoB,QAAQunB,GACdt2B,EAAI2mB,EAAK/b,MAAQ,EAAG5K,EAAI,EAAGA,IAAK,CACvC,IAAIuF,EAAOvF,EAAI2mB,EAAK/b,MAAQ+b,EAAKta,UAAYsa,EAAKphB,KAAKvF,GACnDstD,EAAU3mC,EAAK5Y,OAAO/N,GAC1B,GAAIuF,EAAKoJ,cACLooD,GAAgB7mC,EAAM,IAAc5uB,OAAOqM,EAAK2/C,EAAU,EAAGA,EAAU,EAAI/nD,EAAKtD,QAAQyB,MAAO,eAC9F,KAAI,IAAc0kB,aAAa7iB,GAGhC,SAFAwxD,GAAgB7mC,EAAM,IAAc5uB,OAAOqM,EAAK2/C,GAAU,WAG9D,OAAO,GAvBPkK,CAAmBtnC,EAAMoG,GA2B7B,SAASmhC,GAAcvnC,GACrB,OAAOwnC,GAAexnC,GA7JxBimC,GAAaptB,QAAU,SAAU7Y,EAAMgf,GAErC,GADAhf,EAAKof,SAA4B,IAAjBJ,EAAMW,SAAiBX,EAAMI,UACzCqoB,GAAoBznC,EAAMgf,GAQ9B,GAPAhf,EAAKs7B,YAAY0J,aACjBhlC,EAAK8+B,YAAc9f,EAAMW,QACzB3f,EAAKs/B,gBAAkBnmC,KAAKC,OAKxB,EAAO4vB,KAAwB,IAAjBhK,EAAMW,SAAkBX,EAAME,SAAYF,EAAMC,QAAWD,EAAMG,QASxEnf,EAAK2rB,SAAS,iBAAiB,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAMgf,OAAckf,GAAel+B,EAAMgf,GACzGA,EAAMjG,iBAENmtB,GAAmBlmC,EAAM,WAZiE,CAC1F,IAAI5G,EAAMD,KAAKC,MACf4G,EAAK4/B,aAAexmC,EACpB4G,EAAK0nC,4BAA8Bn4B,YAAW,WACxCvP,EAAK4/B,cAAgBxmC,IACvB4G,EAAK2rB,SAAS,iBAAiB,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAM6qB,EAAS,GAAI,aAC1E7qB,EAAK4/B,aAAe,KAErB,OAQPqG,GAAa0B,MAAQ,SAAU3nC,EAAMqF,GAClB,IAAbA,EAAEsa,UAAiB3f,EAAKof,UAAW,IAGzC6mB,GAAa2B,SAAW,SAAU5nC,EAAMgf,GACtC,KAAIyoB,GAAoBznC,EAAMgf,KAAWA,EAAM6oB,UAC3C7oB,EAAME,UAAYF,EAAMC,QAAU,EAAOR,KAAOO,EAAMG,SAE1D,GAAInf,EAAK2rB,SAAS,kBAAkB,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAMgf,MAChEA,EAAMjG,qBADR,CAKA,IAAI1gB,EAAM2H,EAAKld,MAAMwV,UACrB,KAAMD,aAAe,KAAmBA,EAAI7d,MAAMmE,WAAW0Z,EAAI5d,MAAM,CACrE,IAAItF,EAAOm3B,OAAOC,aAAayS,EAAM6oB,UAChC7nC,EAAK2rB,SAAS,mBAAmB,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAM3H,EAAI7d,MAAMhG,IAAK6jB,EAAI5d,IAAIjG,IAAKW,OAC5F6qB,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAG0E,WAAWplB,GAAMulB,kBACjDskB,EAAMjG,oBAoHV,IAAI+uB,GAAqB,EAAOrpB,IAAM,UAAY,UAElD5L,GAASk1B,UAAY,SAAU/nC,EAAMgf,GACnChf,EAAKof,SAAWJ,EAAMI,SACtB,IAAI4oB,EAAUT,GAAcvnC,GACxB5G,EAAMD,KAAKC,MAAOtgB,EAAO,cACzBsgB,EAAM4G,EAAKioC,UAAU/uC,KAAO,KApHlC,SAAgB8lB,EAAOrG,GACrB,IAAI6U,EAAK7U,EAAMuX,EAAIlR,EAAMynB,QAASyB,EAAKvvB,EAAMyX,EAAIpR,EAAM0nB,QACvD,OAAOlZ,EAAKA,EAAK0a,EAAKA,EAAK,IAkHYC,CAAOnpB,EAAOhf,EAAKioC,aAAejpB,EAAM8oB,MAClD,eAAvB9nC,EAAKioC,UAAUnvD,KAAyBA,EAAO,cACnB,eAAvBknB,EAAKioC,UAAUnvD,OAAyBA,EAAO,gBAE1DknB,EAAKioC,UAAY,CAAC/uC,KAAME,EAAK82B,EAAGlR,EAAMynB,QAASrW,EAAGpR,EAAM0nB,QAAS5tD,KAAMA,GAEvE,IAAItE,EAAMwrB,EAAK4tB,YAAY4Y,GAAYxnB,IAClCxqC,IAEO,eAARsE,EACAknB,EAAKooC,UAAY,IAAI,GAAUpoC,EAAMxrB,EAAKwqC,EAAOgpB,IACnC,eAARlvD,EAAwBsuD,GAAoBC,IAAmBrnC,EAAMxrB,EAAIA,IAAKA,EAAI4xB,OAAQ4Y,GAChGA,EAAMjG,iBAENmtB,GAAmBlmC,EAAM,aAG/B,IAAI,GAAY,SAAmBA,EAAMxrB,EAAKwqC,EAAOgpB,GACnD,IAUIhe,EAAYqe,EAVZp/C,EAASjX,KAWb,GATAA,KAAKguB,KAAOA,EACZhuB,KAAK+sD,SAAW/+B,EAAKld,MAAMrF,IAC3BzL,KAAKwC,IAAMA,EACXxC,KAAKgtC,MAAQA,EACbhtC,KAAKg2D,QAAUA,EACfh2D,KAAKsnD,WAAata,EAAM8oB,IACxB91D,KAAKs2D,aAAetpB,EAAMI,SAGtB5qC,EAAI4xB,QAAU,EAChB4jB,EAAahqB,EAAKld,MAAMrF,IAAIuC,OAAOxL,EAAI4xB,QACvCiiC,EAAY7zD,EAAI4xB,WACX,CACL,IAAI3P,EAAOuJ,EAAKld,MAAMrF,IAAIoB,QAAQrK,EAAIA,KACtCw1C,EAAavzB,EAAKliB,OAClB8zD,EAAY5xC,EAAK/b,MAAQ+b,EAAK5Y,SAAW,EAG3C7L,KAAKu2D,UAAY,KAEjB,IAAIxsD,EAASisD,EAAU,KAAOhpB,EAAMjjC,OAChCysD,EAAazsD,EAASikB,EAAK4uB,QAAQC,YAAY9yC,GAAQ,GAAQ,KACnE/J,KAAK+J,OAASysD,EAAaA,EAAW/+C,IAAM,MAExCugC,EAAWlxC,KAAKqE,KAAKg0B,YAAiD,IAApC6Y,EAAWlxC,KAAKqE,KAAKgb,YACvD6H,EAAKld,MAAMwV,qBAAqB,KAAiB+vC,GAAaroC,EAAKld,MAAMwV,UAAU/kB,QACnFvB,KAAKu2D,UAAY,CAAClzD,KAAM20C,EACRx1C,IAAK6zD,EACLI,QAASz2D,KAAK+J,SAAW/J,KAAK+J,OAAOo1B,UACrCu3B,cAAe12D,KAAK+J,QAAU,EAAOyiC,QAAUxsC,KAAK+J,OAAOg1B,aAAa,qBAExF/+B,KAAK+J,QAAU/J,KAAKu2D,YAAcv2D,KAAKu2D,UAAUE,SAAWz2D,KAAKu2D,UAAUG,iBAC7E12D,KAAKguB,KAAKs7B,YAAYxG,OAClB9iD,KAAKu2D,UAAUE,UAAWz2D,KAAK+J,OAAOo1B,WAAY,GAClDn/B,KAAKu2D,UAAUG,eACfn5B,YAAW,WAAc,OAAOtmB,EAAOlN,OAAOkZ,aAAa,kBAAmB,WAAa,IAC/FjjB,KAAKguB,KAAKs7B,YAAY3mD,SAGxBqrB,EAAK8tB,KAAKqO,iBAAiB,UAAWnqD,KAAK22D,GAAK32D,KAAK22D,GAAGr3D,KAAKU,OAC7DguB,EAAK8tB,KAAKqO,iBAAiB,YAAanqD,KAAKk5B,KAAOl5B,KAAKk5B,KAAK55B,KAAKU,OACnEk0D,GAAmBlmC,EAAM,YA6D3B,SAASynC,GAAoBznC,EAAMgf,GACjC,QAAIhf,EAAKyP,cAWL,EAAO6O,QAAU1pC,KAAKg0D,IAAI5pB,EAAM6pB,UAAY7oC,EAAK8oC,oBAAsB,OACzE9oC,EAAK8oC,oBAAsB,KACpB,GAxEX,GAAUp3D,UAAUs1C,KAAO,WACzBh1C,KAAKguB,KAAK8tB,KAAKmO,oBAAoB,UAAWjqD,KAAK22D,IACnD32D,KAAKguB,KAAK8tB,KAAKmO,oBAAoB,YAAajqD,KAAKk5B,MACjDl5B,KAAKu2D,WAAav2D,KAAK+J,SACzB/J,KAAKguB,KAAKs7B,YAAYxG,OAClB9iD,KAAKu2D,UAAUE,SAAWz2D,KAAK+J,OAAOy9C,gBAAgB,aACtDxnD,KAAKu2D,UAAUG,eAAiB12D,KAAK+J,OAAOy9C,gBAAgB,mBAChExnD,KAAKguB,KAAKs7B,YAAY3mD,SAExB3C,KAAKguB,KAAKooC,UAAY,MAGxB,GAAU12D,UAAUi3D,GAAK,SAAa3pB,GAGpC,GAFAhtC,KAAKg1C,OAEAh1C,KAAKguB,KAAKvW,IAAIgJ,SAAkC,GAAzBusB,EAAMjjC,OAAOqF,SAAgB49B,EAAMjjC,OAAOwtC,WAAavK,EAAMjjC,QAAzF,CAGA,IAAIvH,EAAMxC,KAAKwC,IACXxC,KAAKguB,KAAKld,MAAMrF,KAAOzL,KAAK+sD,WAAYvqD,EAAMxC,KAAKguB,KAAK4tB,YAAY4Y,GAAYxnB,KAEhFhtC,KAAKs2D,eAAiB9zD,EACxB0xD,GAAmBl0D,KAAKguB,KAAM,WACrB+mC,GAAkB/0D,KAAKguB,KAAMxrB,EAAIA,IAAKA,EAAI4xB,OAAQ4Y,EAAOhtC,KAAKsnD,YACvEta,EAAMjG,iBACG/mC,KAAKg2D,SAEJ,EAAO1pB,QAAUtsC,KAAKu2D,YAAcv2D,KAAKu2D,UAAUlzD,KAAKqK,QAQxD,EAAO0+B,UAAYpsC,KAAKguB,KAAKld,MAAMwV,qBAAqB,OACvD9jB,EAAIA,KAAOxC,KAAKguB,KAAKld,MAAMwV,UAAU/kB,MAAQiB,EAAIA,KAAOxC,KAAKguB,KAAKld,MAAMwV,UAAUjkB,KAC7FwyD,GAAgB70D,KAAKguB,KAAM,IAAUlJ,KAAK9kB,KAAKguB,KAAKld,MAAMrF,IAAIoB,QAAQrK,EAAIA,MAAO,WACjFwqC,EAAMjG,kBAENmtB,GAAmBl0D,KAAKguB,KAAM,aAIlC,GAAUtuB,UAAUw5B,KAAO,SAAe8T,IACnChtC,KAAKs2D,eAAiB1zD,KAAKg0D,IAAI52D,KAAKgtC,MAAMkR,EAAIlR,EAAMynB,SAAW,GACzC7xD,KAAKg0D,IAAI52D,KAAKgtC,MAAMoR,EAAIpR,EAAM0nB,SAAW,KAChE10D,KAAKs2D,cAAe,GACxBpC,GAAmBl0D,KAAKguB,KAAM,YAGhC6S,GAASk2B,UAAY,SAAU/oC,GAC7BunC,GAAcvnC,GACdkmC,GAAmBlmC,EAAM,YAG3B6S,GAASm2B,YAAc,SAAUhpC,GAAQ,OAAOunC,GAAcvnC,IAsB9D,IAAIipC,GAAqB,EAAO/f,QAAU,KAAQ,EA+ClD,SAASggB,GAAmBlpC,EAAMmpC,GAChClE,aAAajlC,EAAKopC,kBACdD,GAAS,IAAKnpC,EAAKopC,iBAAmB75B,YAAW,WAAc,OAAOi4B,GAAexnC,KAAUmpC,IAGrG,SAASE,GAAiBrpC,GAExB,IADAA,EAAKyP,WAAY,EACVzP,EAAK+4B,iBAAiB5mD,OAAS,GAAK6tB,EAAK+4B,iBAAiBvzC,MAAM+uC,mBAGzE,SAASiT,GAAexnC,EAAMspC,GAG5B,GAFAtpC,EAAKs7B,YAAY0J,aACjBqE,GAAiBrpC,GACbspC,GAAetpC,EAAK4uB,QAAQgD,MAAO,CACrC,IAAIv5B,EAAMuiC,GAAiB56B,GAG3B,OAFI3H,IAAQA,EAAIhiB,GAAG2pB,EAAKld,MAAMwV,WAAc0H,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAG0C,aAAaF,IAC9E2H,EAAKwwB,YAAYxwB,EAAKld,QACtB,EAET,OAAO,EAhETmjD,GAAasD,iBAAmBtD,GAAauD,kBAAoB,SAAUxpC,GACzE,IAAKA,EAAKyP,UAAW,CACnBzP,EAAKs7B,YAAYoJ,QACjB,IAAI5hD,EAAQkd,EAAKld,MACb2T,EAAO3T,EAAMwV,UAAU9d,MAC3B,GAAIsI,EAAMwV,UAAUtiB,QACf8M,EAAMyW,cACJ9C,EAAKva,YAAcua,EAAKhb,cAAgBgb,EAAKra,WAAWtC,MAAM0P,MAAK,SAAUtZ,GAAK,OAAiC,IAA1BA,EAAE4I,KAAKqE,KAAKe,cAE1G8hB,EAAKypC,WAAazpC,EAAKld,MAAMyW,aAAe9C,EAAK3c,QACjD0tD,GAAexnC,GAAM,GACrBA,EAAKypC,WAAa,UAMlB,GAJAjC,GAAexnC,GAIX,EAAOwe,OAAS17B,EAAMwV,UAAUtiB,OAASygB,EAAKhb,eAAiBgb,EAAKva,YAAcua,EAAKra,WAAWtC,MAAM3H,OAE1G,IADA,IAAIkmB,EAAM2H,EAAK8tB,KAAKkD,eACX37C,EAAOgjB,EAAI+4B,UAAW14C,EAAS2f,EAAIi5B,YAAaj8C,GAAyB,GAAjBA,EAAK+L,UAA2B,GAAV1I,GAAc,CACnG,IAAImF,EAASnF,EAAS,EAAIrD,EAAKnB,UAAYmB,EAAKyc,WAAWpZ,EAAS,GACpE,IAAKmF,EAAU,MACf,GAAuB,GAAnBA,EAAOuD,SAAe,CACxBiX,EAAI27B,SAASn2C,EAAQA,EAAOgS,UAAU1d,QACtC,MAEAkD,EAAOwI,EACPnF,GAAU,EAKlBsnB,EAAKyP,WAAY,EAEnBy5B,GAAmBlpC,EAAMipC,KAG3BhD,GAAa32B,eAAiB,SAAUtP,EAAMgf,GACxChf,EAAKyP,YACPzP,EAAKyP,WAAY,EACjBzP,EAAK8oC,mBAAqB9pB,EAAM6pB,UAChCK,GAAmBlpC,EAAM,MAkD7B,IAAI0pC,GAAsB,EAAOhrB,IAAM,EAAOkK,WAAa,IACpD,EAAOI,KAAO,EAAOK,eAAiB,IA0C7C,SAASsgB,GAAQ3pC,EAAM7qB,EAAMi+B,EAAM/N,GACjC,IAAI3yB,EAAQ8uD,GAAmBxhC,EAAM7qB,EAAMi+B,EAAMpT,EAAKof,SAAUpf,EAAKld,MAAMwV,UAAU9d,OACrF,GAAIwlB,EAAK2rB,SAAS,eAAe,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAMqF,EAAG3yB,GAAS,IAAMsD,UAAc,OAAO,EACtG,IAAKtD,EAAS,OAAO,EAErB,IAAIk3D,EAxBN,SAAyBl3D,GACvB,OAA0B,GAAnBA,EAAM0H,WAAmC,GAAjB1H,EAAM2H,SAA4C,GAA5B3H,EAAMX,QAAQoC,WAAkBzB,EAAMX,QAAQiC,WAAa,KAuB/F61D,CAAgBn3D,GAC7BmjB,EAAK+zC,EAAa5pC,EAAKld,MAAM+S,GAAGuE,qBAAqBwvC,EAAY5pC,EAAKof,UAAYpf,EAAKld,MAAM+S,GAAGsE,iBAAiBznB,GAErH,OADAstB,EAAK5C,SAASvH,EAAG6E,iBAAiBF,QAAQ,SAAS,GAAMA,QAAQ,UAAW,WACrE,EAhDTqY,GAASz8B,KAAO6vD,GAAanwD,IAAM,SAAUkqB,EAAMqF,GACjD,IAAIhN,EAAM2H,EAAKld,MAAMwV,UAAWxiB,EAAgB,OAAVuvB,EAAEvsB,KACxC,IAAIuf,EAAIriB,MAAR,CAGA,IAAI8zD,EAAOJ,GAAqB,KAAOrkC,EAAE0kC,cAErCnvD,EAAMumD,GAAsBnhC,EADpB3H,EAAItmB,WAEZ0X,EAAM7O,EAAI6O,IACVtU,EAAOyF,EAAIzF,KACX20D,GACFzkC,EAAE0T,iBACF+wB,EAAKE,YACLF,EAAKG,QAAQ,YAAaxgD,EAAIs4C,WAC9B+H,EAAKG,QAAQ,aAAc90D,IAzC/B,SAAqB6qB,EAAMvW,GAGzB,GAAKuW,EAAKvW,IAAI8/B,WAAd,CACA,IAAI57B,EAAOqS,EAAKvW,IAAI8/B,WAAW94B,YAAYkD,SAASmB,cAAc,QAClEnH,EAAK8C,YAAYhH,GACjBkE,EAAKrE,MAAMgvC,QAAU,6CACrB,IAAIjgC,EAAM24B,eAAgBvyB,EAAQ9K,SAASg2B,cAC3ClrB,EAAMyrC,mBAAmBzgD,GAIzBuW,EAAKvW,IAAI0gD,OACT9xC,EAAIq5B,kBACJr5B,EAAIhd,SAASojB,GACb8Q,YAAW,WACL5hB,EAAK47B,YAAc57B,EAAK47B,WAAWuP,YAAYnrC,GACnDqS,EAAK8gB,UACJ,KAyBDspB,CAAYpqC,EAAMvW,GAEhB3T,GAAOkqB,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAGyE,kBAAkBI,iBAAiBF,QAAQ,UAAW,UAiC/FyrC,GAAaoE,MAAQ,SAAUrqC,EAAMqF,GACnC,IAAIykC,EAAOJ,GAAqB,KAAOrkC,EAAE0kC,cACrCD,GAAQH,GAAQ3pC,EAAM8pC,EAAKQ,QAAQ,cAAeR,EAAKQ,QAAQ,aAAcjlC,GAAMA,EAAE0T,iBA5B3F,SAAsB/Y,EAAMqF,GAC1B,GAAKrF,EAAKvW,IAAI8/B,WAAd,CACA,IAAIkY,EAAYzhC,EAAKof,UAAYpf,EAAKld,MAAMwV,UAAU9d,MAAMjG,OAAOuE,KAAKqE,KAAKugB,KACzE3hB,EAASikB,EAAKvW,IAAI8/B,WAAW94B,YAAYkD,SAASmB,cAAc2sC,EAAY,WAAa,QACxFA,IAAa1lD,EAAOsuC,gBAAkB,QAC3CtuC,EAAOuN,MAAMgvC,QAAU,6CACvBv8C,EAAO+kC,QACPvR,YAAW,WACTvP,EAAK8gB,QACD/kC,EAAOwtC,YAAcxtC,EAAOwtC,WAAWuP,YAAY/8C,GACnD0lD,EAAakI,GAAQ3pC,EAAMjkB,EAAOhL,MAAO,KAAMs0B,GAC5CskC,GAAQ3pC,EAAMjkB,EAAOyD,YAAazD,EAAOgmD,UAAW18B,KAC1D,KAiBIklC,CAAavqC,EAAMqF,IAG5B,IAAImlC,GAAW,SAAkB93D,EAAOw4B,GACtCl5B,KAAKU,MAAQA,EACbV,KAAKk5B,KAAOA,GAGVu/B,GAAmB,EAAOhsB,IAAM,SAAW,UAkI/C,IAAK,IAAI7qC,MAhITi/B,GAAS63B,UAAY,SAAU1qC,EAAMqF,GACnC,IAAI+iC,EAAYpoC,EAAKooC,UAErB,GADIA,GAAaA,EAAUphB,OACtB3hB,EAAEslC,aAAP,CAEA,IAAItyC,EAAM2H,EAAKld,MAAMwV,UACjB9jB,EAAM6jB,EAAIriB,MAAQ,KAAOgqB,EAAK4tB,YAAY4Y,GAAYnhC,IAC1D,GAAI7wB,GAAOA,EAAIA,KAAO6jB,EAAI9kB,MAAQiB,EAAIA,MAAQ6jB,aAAe,IAAgBA,EAAIhkB,GAAK,EAAGgkB,EAAIhkB,UAAY,GAAI+zD,GAAaA,EAAUG,UAClIvoC,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAG0C,aAAa,IAAcnnB,OAAO4uB,EAAKld,MAAMrF,IAAK2qD,EAAUG,UAAU/zD,YAC7F,GAAI6wB,EAAEtpB,QAA+B,GAArBspB,EAAEtpB,OAAOqF,SAAe,CAC7C,IAAIwZ,EAAOoF,EAAK4uB,QAAQC,YAAYxpB,EAAEtpB,QAAQ,GAC9C,IAAK6e,IAASA,EAAKvlB,KAAKyD,KAAKqE,KAAKg0B,WAAavW,GAAQoF,EAAK4uB,QAAW,OACvE5uB,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAG0C,aAAa,IAAcnnB,OAAO4uB,EAAKld,MAAMrF,IAAKmd,EAAKk0B,aAErF,IAAIp8C,EAAQstB,EAAKld,MAAMwV,UAAUvmB,UAC7B6I,EAAMumD,GAAsBnhC,EAAMttB,GAClC+W,EAAM7O,EAAI6O,IACVtU,EAAOyF,EAAIzF,KACfkwB,EAAEslC,aAAaX,YACf3kC,EAAEslC,aAAaV,QAAQP,GAAqB,OAAS,YAAajgD,EAAIs4C,WACjE2H,IAAsBrkC,EAAEslC,aAAaV,QAAQ,aAAc90D,GAChE6qB,EAAK4qC,SAAW,IAAIJ,GAAS93D,GAAQ2yB,EAAEolC,OAGzC53B,GAASg4B,QAAU,SAAU7qC,GAC3B,IAAI4qC,EAAW5qC,EAAK4qC,SACpBh3C,OAAO2b,YAAW,WACZvP,EAAK4qC,UAAYA,IAAa5qC,EAAK4qC,SAAW,QACjD,KAGL3E,GAAa6E,SAAW7E,GAAa8E,UAAY,SAAUnxD,EAAGyrB,GAAK,OAAOA,EAAE0T,kBAE5EktB,GAAa+E,KAAO,SAAUhrC,EAAMqF,GAClC,IAAIulC,EAAW5qC,EAAK4qC,SAGpB,GAFA5qC,EAAK4qC,SAAW,KAEXvlC,EAAEslC,aAAP,CAEA,IAAIM,EAAWjrC,EAAK4tB,YAAY4Y,GAAYnhC,IAC5C,GAAK4lC,EAAL,CACA,IAAIC,EAASlrC,EAAKld,MAAMrF,IAAIoB,QAAQosD,EAASz2D,KAC7C,GAAK02D,EAAL,CACA,IAAIx4D,EAAQk4D,GAAYA,EAASl4D,OAC7B8uD,GAAmBxhC,EAAMqF,EAAEslC,aAAaL,QAAQZ,GAAqB,OAAS,cAC3DA,GAAqB,KAAOrkC,EAAEslC,aAAaL,QAAQ,cAAc,EAAOY,GAC3FhgC,EAAO0/B,IAAavlC,EAAEolC,IAC1B,GAAIzqC,EAAK2rB,SAAS,cAAc,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAMqF,EAAG3yB,GAAS,IAAMsD,MAAOk1B,MACrF7F,EAAE0T,sBAGJ,GAAKrmC,EAAL,CAEA2yB,EAAE0T,iBACF,IAAI7R,EAAYx0B,EAAQ,YAAUstB,EAAKld,MAAMrF,IAAKytD,EAAO12D,IAAK9B,GAASw4D,EAAO12D,IAC7D,MAAb0yB,IAAqBA,EAAYgkC,EAAO12D,KAE5C,IAAIqhB,EAAKmK,EAAKld,MAAM+S,GAChBqV,GAAQrV,EAAGyE,kBAEf,IAAI9lB,EAAMqhB,EAAGK,QAAQ5iB,IAAI4zB,GACrBikC,EAA4B,GAAnBz4D,EAAM0H,WAAmC,GAAjB1H,EAAM2H,SAA4C,GAA5B3H,EAAMX,QAAQoC,WACrEi3D,EAAev1C,EAAGpY,IAKtB,GAJI0tD,EACAt1C,EAAGU,iBAAiB/hB,EAAKA,EAAK9B,EAAMX,QAAQiC,YAE5C6hB,EAAGM,aAAa3hB,EAAKA,EAAK9B,IAC1BmjB,EAAGpY,IAAIpH,GAAG+0D,GAAd,CAEA,IAAI30C,EAAOZ,EAAGpY,IAAIoB,QAAQrK,GAC1B,GAAI22D,GAAU,IAAcjzC,aAAaxlB,EAAMX,QAAQiC,aACnDyiB,EAAKta,WAAasa,EAAKta,UAAUvG,WAAWlD,EAAMX,QAAQiC,YAC5D6hB,EAAG0C,aAAa,IAAI,IAAc9B,QAC7B,CACL,IAAI/hB,EAAMmhB,EAAGK,QAAQ5iB,IAAI4zB,GACzBrR,EAAGK,QAAQyC,KAAK9C,EAAGK,QAAQyC,KAAKxmB,OAAS,GAAGgB,SAAQ,SAAUylB,EAAOC,EAAKC,EAAUC,GAAS,OAAOrkB,EAAMqkB,KAC1GlD,EAAG0C,aAAayiC,GAAiBh7B,EAAMvJ,EAAMZ,EAAGpY,IAAIoB,QAAQnK,KAE9DsrB,EAAK8gB,QACL9gB,EAAK5C,SAASvH,EAAG2E,QAAQ,UAAW,eAGtCqY,GAASiO,MAAQ,SAAU9gB,GACpBA,EAAK8mC,UACR9mC,EAAKs7B,YAAYxG,OACjB90B,EAAKvW,IAAIorC,UAAU3gC,IAAI,uBACvB8L,EAAKs7B,YAAY3mD,QACjBqrB,EAAK8mC,SAAU,EACfv3B,YAAW,WACLvP,EAAK4uB,SAAW5uB,EAAKo7B,aAAep7B,EAAKs7B,YAAYqJ,iBAAiBtuD,GAAG2pB,EAAK8tB,KAAKkD,iBACnFiK,GAAej7B,KAClB,MAIP6S,GAASs3B,KAAO,SAAUnqC,GACpBA,EAAK8mC,UACP9mC,EAAKs7B,YAAYxG,OACjB90B,EAAKvW,IAAIorC,UAAUpiD,OAAO,uBAC1ButB,EAAKs7B,YAAY3mD,QACjBqrB,EAAKs7B,YAAYqJ,iBAAiBtrD,IAAI,IACtC2mB,EAAK8mC,SAAU,IAInBj0B,GAASw4B,YAAc,SAAUrrC,EAAMgf,GAMrC,GAAI,EAAOZ,QAAU,EAAO8K,SAA8B,yBAAnBlK,EAAMssB,UAAsC,CACjF,IAAIvL,EAAiB//B,EAAK+/B,eAC1BxwB,YAAW,WACT,GAAIvP,EAAK+/B,gBAAkBA,IAE3B//B,EAAKvW,IAAI0gD,OACTnqC,EAAK8gB,SACD9gB,EAAK2rB,SAAS,iBAAiB,SAAUv4C,GAAK,OAAOA,EAAE4sB,EAAM6qB,EAAS,EAAG,kBAA7E,CACA,IACInzB,EADMsI,EAAKld,MAAMwV,UACHZ,QAEdA,GAAWA,EAAQljB,IAAM,GAAKwrB,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAGuC,OAAOV,EAAQljB,IAAM,EAAGkjB,EAAQljB,KAAKkmB,qBAClG,MAKUurC,GAAgBpzB,GAASj/B,IAAQqyD,GAAaryD,IAE/D,SAAS23D,GAAY90D,EAAGC,GACtB,GAAID,GAAKC,EAAK,OAAO,EACrB,IAAK,IAAI9E,KAAK6E,EAAK,GAAIA,EAAE7E,KAAO8E,EAAE9E,GAAM,OAAO,EAC/C,IAAK,IAAIgH,KAAOlC,EAAK,KAAMkC,KAAOnC,GAAM,OAAO,EAC/C,OAAO,EAGT,IAAI+0D,GAAa,SAAoB93C,EAAOvW,GAC1CnL,KAAKmL,KAAOA,GAAQsuD,GACpBz5D,KAAKsrB,KAAOtrB,KAAKmL,KAAKmgB,MAAQ,EAC9BtrB,KAAK0hB,MAAQA,GAGf83C,GAAW95D,UAAU4B,IAAM,SAAc4iB,EAASw1C,EAAMhzD,EAAQizD,GAC9D,IAAI/wD,EAAMsb,EAAQ6B,UAAU2zC,EAAKn4D,KAAOo4D,EAAW35D,KAAKsrB,KAAO,GAAK,EAAI,GAClE9oB,EAAMoG,EAAIpG,IAEhB,OADgBoG,EAAIod,QACH,KAAO,IAAI4zC,GAAWp3D,EAAMkE,EAAQlE,EAAMkE,EAAQ1G,OAGrEw5D,GAAW95D,UAAUm6D,MAAQ,WAAoB,OAAO,GAExDL,GAAW95D,UAAU2E,GAAK,SAAaZ,GACrC,OAAOzD,MAAQyD,GACZA,aAAiB+1D,KAChBx5D,KAAKmL,KAAK9L,KAAOW,KAAKmL,KAAK9L,KAAOoE,EAAM0H,KAAK9L,KAC7CW,KAAK0hB,OAASje,EAAMie,OAAS63C,GAAYv5D,KAAKmL,KAAM1H,EAAM0H,QAGhE,IAAI2uD,GAAa,SAAoBtzD,EAAO2E,GAC1CnL,KAAKmL,KAAOA,GAAQsuD,GACpBz5D,KAAKwG,MAAQA,GAGfszD,GAAWp6D,UAAU4B,IAAM,SAAc4iB,EAASw1C,EAAMhzD,EAAQizD,GAC9D,IAAIp4D,EAAO2iB,EAAQ5iB,IAAIo4D,EAAKn4D,KAAOo4D,EAAW35D,KAAKmL,KAAK4uD,gBAAkB,EAAI,GAAKrzD,EAC/ErE,EAAK6hB,EAAQ5iB,IAAIo4D,EAAKr3D,GAAKs3D,EAAW35D,KAAKmL,KAAK6uD,aAAe,GAAK,GAAKtzD,EAC7E,OAAOnF,GAAQc,EAAK,KAAO,IAAIu3D,GAAWr4D,EAAMc,EAAIrC,OAGtD85D,GAAWp6D,UAAUm6D,MAAQ,SAAgBjyD,EAAG8xD,GAAQ,OAAOA,EAAKn4D,KAAOm4D,EAAKr3D,IAEhFy3D,GAAWp6D,UAAU2E,GAAK,SAAaZ,GACrC,OAAOzD,MAAQyD,GACZA,aAAiBq2D,IAAcP,GAAYv5D,KAAKwG,MAAO/C,EAAM+C,QAC7D+yD,GAAYv5D,KAAKmL,KAAM1H,EAAM0H,OAGlC2uD,GAAWprB,GAAK,SAAagrB,GAAQ,OAAOA,EAAK5yD,gBAAgBgzD,IAEjE,IAAI5kD,GAAW,SAAkB1O,EAAO2E,GACtCnL,KAAKmL,KAAOA,GAAQsuD,GACpBz5D,KAAKwG,MAAQA,GAGf0O,GAASxV,UAAU4B,IAAM,SAAc4iB,EAASw1C,EAAMhzD,EAAQizD,GAC5D,IAAIp4D,EAAO2iB,EAAQ6B,UAAU2zC,EAAKn4D,KAAOo4D,EAAW,GACpD,GAAIp4D,EAAKykB,QAAW,OAAO,KAC3B,IAAI3jB,EAAK6hB,EAAQ6B,UAAU2zC,EAAKr3D,GAAKs3D,GAAY,GACjD,OAAIt3D,EAAG2jB,SAAW3jB,EAAGG,KAAOjB,EAAKiB,IAAc,KACxC,IAAIo3D,GAAWr4D,EAAKiB,IAAMkE,EAAQrE,EAAGG,IAAMkE,EAAQ1G,OAG5DkV,GAASxV,UAAUm6D,MAAQ,SAAgBx2D,EAAMq2D,GAC/C,IAAI9wD,EAAMvF,EAAKtD,QAAQwF,UAAUm0D,EAAKn4D,MAChC2C,EAAQ0E,EAAI1E,MACZwC,EAASkC,EAAIlC,OACnB,OAAOA,GAAUgzD,EAAKn4D,MAAQmF,EAASrD,EAAKZ,MAAMyB,GAAOpC,UAAY43D,EAAKr3D,IAG5E6S,GAASxV,UAAU2E,GAAK,SAAaZ,GACnC,OAAOzD,MAAQyD,GACZA,aAAiByR,IAAYqkD,GAAYv5D,KAAKwG,MAAO/C,EAAM+C,QAC3D+yD,GAAYv5D,KAAKmL,KAAM1H,EAAM0H,OAMlC,IAAIyuD,GAAa,SAAoBr4D,EAAMc,EAAIyE,GAG7C9G,KAAKuB,KAAOA,EAIZvB,KAAKqC,GAAKA,EACVrC,KAAK8G,KAAOA,GAGVwB,GAAuB,CAAE6C,KAAM,CAAElJ,cAAc,GAAOoR,OAAQ,CAAEpR,cAAc,IAElF23D,GAAWl6D,UAAU0E,KAAO,SAAe7C,EAAMc,GAC/C,OAAO,IAAIu3D,GAAWr4D,EAAMc,EAAIrC,KAAK8G,OAGvC8yD,GAAWl6D,UAAU2E,GAAK,SAAaZ,EAAOiD,GAG5C,YAFkB,IAAXA,IAAoBA,EAAS,GAE7B1G,KAAK8G,KAAKzC,GAAGZ,EAAMqD,OAAS9G,KAAKuB,KAAOmF,GAAUjD,EAAMlC,MAAQvB,KAAKqC,GAAKqE,GAAUjD,EAAMpB,IAGnGu3D,GAAWl6D,UAAU4B,IAAM,SAAc4iB,EAASxd,EAAQizD,GACxD,OAAO35D,KAAK8G,KAAKxF,IAAI4iB,EAASlkB,KAAM0G,EAAQizD,IAoD9CC,GAAWjX,OAAS,SAAiBngD,EAAKkf,EAAOvW,GAC/C,OAAO,IAAIyuD,GAAWp3D,EAAKA,EAAK,IAAIg3D,GAAW93C,EAAOvW,KAoBxDyuD,GAAWvmD,OAAS,SAAiB9R,EAAMc,EAAImE,EAAO2E,GACpD,OAAO,IAAIyuD,GAAWr4D,EAAMc,EAAI,IAAIy3D,GAAWtzD,EAAO2E,KAYxDyuD,GAAWv2D,KAAO,SAAe9B,EAAMc,EAAImE,EAAO2E,GAChD,OAAO,IAAIyuD,GAAWr4D,EAAMc,EAAI,IAAI6S,GAAS1O,EAAO2E,KAMtD7C,GAAqB6C,KAAKxM,IAAM,WAAc,OAAOqB,KAAK8G,KAAKqE,MAE/D7C,GAAqB+K,OAAO1U,IAAM,WAAc,OAAOqB,KAAK8G,gBAAgBgzD,IAE5Et7D,OAAOiI,iBAAkBmzD,GAAWl6D,UAAW4I,IAkB/C,IAAIL,GAAO,GAAIwxD,GAAS,GAMpBQ,GAAgB,SAAuBC,EAAOn5B,GAChD/gC,KAAKk6D,MAAQA,GAASA,EAAM/5D,OAAS+5D,EAAQjyD,GAC7CjI,KAAK+gC,SAAWA,GAAYA,EAAS5gC,OAAS4gC,EAAW94B,IAM3DgyD,GAAc76D,OAAS,SAAiBqM,EAAK0uD,GAC3C,OAAOA,EAAYh6D,OAASi6D,GAAUD,EAAa1uD,EAAK,EAAGguD,IAAU,IAUvEQ,GAAcv6D,UAAUQ,KAAO,SAAeyC,EAAOD,EAAK4kC,GACxD,IAAI3lC,EAAS,GAEb,OADA3B,KAAKq6D,UAAmB,MAAT13D,EAAgB,EAAIA,EAAc,MAAPD,EAAc,IAAMA,EAAKf,EAAQ,EAAG2lC,GACvE3lC,GAGTs4D,GAAcv6D,UAAU26D,UAAY,SAAoB13D,EAAOD,EAAKf,EAAQ+E,EAAQ4gC,GAClF,IAAK,IAAIxpC,EAAI,EAAGA,EAAIkC,KAAKk6D,MAAM/5D,OAAQrC,IAAK,CAC1C,IAAI47D,EAAO15D,KAAKk6D,MAAMp8D,GAClB47D,EAAKn4D,MAAQmB,GAAOg3D,EAAKr3D,IAAMM,KAAW2kC,GAAaA,EAAUoyB,EAAKvuD,QACtExJ,EAAOhB,KAAK+4D,EAAKt1D,KAAKs1D,EAAKn4D,KAAOmF,EAAQgzD,EAAKr3D,GAAKqE,IAE1D,IAAK,IAAIgL,EAAM,EAAGA,EAAM1R,KAAK+gC,SAAS5gC,OAAQuR,GAAO,EACnD,GAAI1R,KAAK+gC,SAASrvB,GAAOhP,GAAO1C,KAAK+gC,SAASrvB,EAAM,GAAK/O,EAAO,CAC9D,IAAI23D,EAAWt6D,KAAK+gC,SAASrvB,GAAO,EACpC1R,KAAK+gC,SAASrvB,EAAM,GAAG2oD,UAAU13D,EAAQ23D,EAAU53D,EAAM43D,EAAU34D,EAAQ+E,EAAS4zD,EAAUhzB,KAepG2yB,GAAcv6D,UAAU4B,IAAM,SAAc4iB,EAASzY,EAAKqK,GACxD,OAAI9V,MAAQ,IAAgC,GAAvBkkB,EAAQyC,KAAKxmB,OAAsBH,KACjDA,KAAKu6D,SAASr2C,EAASzY,EAAK,EAAG,EAAGqK,GAAW2jD,KAGtDQ,GAAcv6D,UAAU66D,SAAW,SAAmBr2C,EAAS7gB,EAAMqD,EAAQizD,EAAW7jD,GAEtF,IADA,IAAI0kD,EACK18D,EAAI,EAAGA,EAAIkC,KAAKk6D,MAAM/5D,OAAQrC,IAAK,CAC1C,IAAIs3B,EAASp1B,KAAKk6D,MAAMp8D,GAAGwD,IAAI4iB,EAASxd,EAAQizD,GAC5CvkC,GAAUA,EAAOtuB,KAAK+yD,MAAMx2D,EAAM+xB,IAAYolC,IAAaA,EAAW,KAAK75D,KAAKy0B,GAC3Etf,EAAQ2kD,UAAY3kD,EAAQ2kD,SAASz6D,KAAKk6D,MAAMp8D,GAAGqN,MAG9D,OAAInL,KAAK+gC,SAAS5gC,OAmMpB,SAAqBu6D,EAAaF,EAAUt2C,EAAS7gB,EAAMqD,EAAQizD,EAAW7jD,GAiB5E,IAhBA,IAAIirB,EAAW25B,EAAYh6D,QAIvBwS,EAAQ,SAAUie,EAAUwpC,EAAQvpC,EAAUwpC,GAChD,IAAK,IAAI98D,EAAI,EAAGA,EAAIijC,EAAS5gC,OAAQrC,GAAK,EAAG,CAC3C,IAAI4E,EAAMq+B,EAASjjC,EAAI,GAAI+8D,OAAQ,GACvB,GAARn4D,GAAayuB,EAAWzuB,EAAMi3D,IAC9BgB,GAAU55B,EAASjjC,GAAK67D,EAC1B54B,EAASjjC,EAAI,IAAM,EACVszB,GAAY1qB,IAAWm0D,EAASD,EAASxpC,GAAaupC,EAASxpC,MACxE4P,EAASjjC,IAAM+8D,EACf95B,EAASjjC,EAAI,IAAM+8D,MAIhB/8D,EAAI,EAAGA,EAAIomB,EAAQyC,KAAKxmB,OAAQrC,IAAOomB,EAAQyC,KAAK7oB,GAAGqD,QAAQ+R,GAKxE,IADA,IAAI4nD,GAAc,EACTppD,EAAM,EAAGA,EAAMqvB,EAAS5gC,OAAQuR,GAAO,EAAK,IAA0B,GAAtBqvB,EAASrvB,EAAM,GAAU,CAChF,IAAInQ,EAAO2iB,EAAQ5iB,IAAIo5D,EAAYhpD,GAAOioD,GAAYoB,EAAYx5D,EAAOmF,EACzE,GAAIq0D,EAAY,GAAKA,GAAa13D,EAAKtD,QAAQyB,KAAM,CACnDs5D,GAAc,EACd,SAGF,IAA4DE,EAAnD92C,EAAQ5iB,IAAIo5D,EAAYhpD,EAAM,GAAKioD,GAAY,GAAmBjzD,EACvEkC,EAAMvF,EAAKtD,QAAQwF,UAAUw1D,GAC7B72D,EAAQ0E,EAAI1E,MACZ+2D,EAAcryD,EAAIlC,OAClBw0D,EAAY73D,EAAKkB,WAAWL,GAChC,GAAIg3D,GAAaD,GAAeF,GAAaE,EAAcC,EAAUp5D,UAAYk5D,EAAS,CACxF,IAAI5lC,EAAS2L,EAASrvB,EAAM,GAAG6oD,SAASr2C,EAASg3C,EAAW35D,EAAO,EAAGm5D,EAAYhpD,GAAOioD,EAAY,EAAG7jD,GACpGsf,GAAU,IACZ2L,EAASrvB,GAAOqpD,EAChBh6B,EAASrvB,EAAM,GAAKspD,EACpBj6B,EAASrvB,EAAM,GAAK0jB,IAEpB2L,EAASrvB,EAAM,IAAM,EACrBopD,GAAc,QAGhBA,GAAc,EAKlB,GAAIA,EAAa,CACf,IAEIlmD,EAAQwlD,GA0BhB,SAA0Cr5B,EAAU25B,EAAaP,EAAaj2C,EAASxd,EAAQizD,EAAW7jD,GAExG,SAASqlD,EAAO9zD,EAAKsyD,GACnB,IAAK,IAAI77D,EAAI,EAAGA,EAAIuJ,EAAI6yD,MAAM/5D,OAAQrC,IAAK,CACzC,IAAIs3B,EAAS/tB,EAAI6yD,MAAMp8D,GAAGwD,IAAI4iB,EAASxd,EAAQizD,GAC3CvkC,EAAU+kC,EAAYx5D,KAAKy0B,GACtBtf,EAAQ2kD,UAAY3kD,EAAQ2kD,SAASpzD,EAAI6yD,MAAMp8D,GAAGqN,MAE7D,IAAK,IAAIuG,EAAM,EAAGA,EAAMrK,EAAI05B,SAAS5gC,OAAQuR,GAAO,EAChDypD,EAAO9zD,EAAI05B,SAASrvB,EAAM,GAAIrK,EAAI05B,SAASrvB,GAAOioD,EAAY,GAEpE,IAAK,IAAI77D,EAAI,EAAGA,EAAIijC,EAAS5gC,OAAQrC,GAAK,GAA6B,GAApBijC,EAASjjC,EAAI,IAC5Dq9D,EAAOp6B,EAASjjC,EAAI,GAAI48D,EAAY58D,GAAK67D,EAAY,GAEzD,OAAOQ,EA1CaiB,CAAiCr6B,EAAU25B,EAAaF,GAAY,GAAIt2C,EACvCxd,EAAQizD,EAAW7jD,GACnCzS,EAAM,EAAGyS,GAC5C0kD,EAAW5lD,EAAMslD,MACjB,IAAK,IAAItoD,EAAM,EAAGA,EAAMmvB,EAAS5gC,OAAQyR,GAAO,EAASmvB,EAASnvB,EAAM,GAAK,IAC3EmvB,EAASngC,OAAOgR,EAAK,GACrBA,GAAO,GAET,IAAK,IAAIszC,EAAM,EAAGrgD,EAAI,EAAGqgD,EAAMtwC,EAAMmsB,SAAS5gC,OAAQ+kD,GAAO,EAAG,CAE9D,IADA,IAAImW,EAASzmD,EAAMmsB,SAASmkB,GACrBrgD,EAAIk8B,EAAS5gC,QAAU4gC,EAASl8B,GAAKw2D,GAAUx2D,GAAK,EAC3Dk8B,EAASngC,OAAOiE,EAAG,EAAG+P,EAAMmsB,SAASmkB,GAAMtwC,EAAMmsB,SAASmkB,EAAM,GAAItwC,EAAMmsB,SAASmkB,EAAM,KAI7F,OAAO,IAAI+U,GAAcO,GAAYA,EAAStyD,KAAKozD,IAAQv6B,GApQhDw6B,CAAYv7D,KAAK+gC,SAAUy5B,EAAUt2C,EAAS7gB,EAAMqD,EAAQizD,EAAW7jD,GAEvE0kD,EAAW,IAAIP,GAAcO,EAAStyD,KAAKozD,KAAU,IAOlErB,GAAcv6D,UAAUwiB,IAAM,SAAczW,EAAK0uD,GAC/C,OAAKA,EAAYh6D,OACbH,MAAQ,GAAgBi6D,GAAc76D,OAAOqM,EAAK0uD,GAC/Cn6D,KAAKw7D,SAAS/vD,EAAK0uD,EAAa,GAFLn6D,MAKpCi6D,GAAcv6D,UAAU87D,SAAW,SAAmB/vD,EAAK0uD,EAAazzD,GACpE,IAEEq6B,EAFE9pB,EAASjX,KAEDq7C,EAAa,EAC3B5vC,EAAItK,SAAQ,SAAU+5D,EAAWD,GAC/B,IAAuC76D,EAAnCq7D,EAAaR,EAAcv0D,EAC/B,GAAMtG,EAAQs7D,GAAiBvB,EAAae,EAAWO,GAAvD,CAGA,IADK16B,IAAYA,EAAW9pB,EAAO8pB,SAASrgC,SACrC26C,EAAata,EAAS5gC,QAAU4gC,EAASsa,GAAc4f,GAAe5f,GAAc,EACvFta,EAASsa,IAAe4f,EACxBl6B,EAASsa,EAAa,GAAKta,EAASsa,EAAa,GAAGmgB,SAASN,EAAW96D,EAAOq7D,EAAa,GAE5F16B,EAASngC,OAAOy6C,EAAY,EAAG4f,EAAaA,EAAcC,EAAUp5D,SAAUs4D,GAAUh6D,EAAO86D,EAAWO,EAAa,EAAGhC,KAC9Hpe,GAAc,MAIhB,IADA,IAAI6e,EAAQyB,GAAUtgB,EAAaugB,GAAazB,GAAeA,GAAczzD,GACpE5I,EAAI,EAAGA,EAAIo8D,EAAM/5D,OAAQrC,IAAYo8D,EAAMp8D,GAAGgJ,KAAK+yD,MAAMpuD,EAAKyuD,EAAMp8D,KAAOo8D,EAAMt5D,OAAO9C,IAAK,GAEtG,OAAO,IAAIm8D,GAAcC,EAAM/5D,OAASH,KAAKk6D,MAAMp5D,OAAOo5D,GAAOhyD,KAAKozD,IAASt7D,KAAKk6D,MAC3Dn5B,GAAY/gC,KAAK+gC,WAM5Ck5B,GAAcv6D,UAAUe,OAAS,SAAiB05D,GAChD,OAA0B,GAAtBA,EAAYh6D,QAAeH,MAAQ,GAAgBA,KAChDA,KAAK67D,YAAY1B,EAAa,IAGvCF,GAAcv6D,UAAUm8D,YAAc,SAAsB1B,EAAazzD,GAEvE,IADA,IAAIq6B,EAAW/gC,KAAK+gC,SAAUm5B,EAAQl6D,KAAKk6D,MAClCp8D,EAAI,EAAGA,EAAIijC,EAAS5gC,OAAQrC,GAAK,EAAG,CAE3C,IADA,IAAIsC,OAAQ,EAAUmB,EAAOw/B,EAASjjC,GAAK4I,EAAQrE,EAAK0+B,EAASjjC,EAAI,GAAK4I,EACjE7B,EAAI,EAAG60D,OAAO,EAAU70D,EAAIs1D,EAAYh6D,OAAQ0E,KAAW60D,EAAOS,EAAYt1D,KACjF60D,EAAKn4D,KAAOA,GAAQm4D,EAAKr3D,GAAKA,IAChC83D,EAAYt1D,GAAK,MACfzE,IAAUA,EAAQ,KAAKO,KAAK+4D,IAGlC,GAAKt5D,EAAL,CACI2gC,GAAY/gC,KAAK+gC,WAAYA,EAAW/gC,KAAK+gC,SAASrgC,SAC1D,IAAI01B,EAAU2K,EAASjjC,EAAI,GAAG+9D,YAAYz7D,EAAOmB,EAAO,GACpD60B,GAAW,GACb2K,EAASjjC,EAAI,GAAKs4B,GAElB2K,EAASngC,OAAO9C,EAAG,GACnBA,GAAK,IAGT,GAAIo8D,EAAM/5D,OAAU,IAAK,IAAIuR,EAAM,EAAGoqD,OAAS,EAAUpqD,EAAMyoD,EAAYh6D,OAAQuR,IAAS,GAAIoqD,EAAS3B,EAAYzoD,GACnH,IAAK,IAAI4vC,EAAM,EAAGA,EAAM4Y,EAAM/5D,OAAQmhD,IAAa4Y,EAAM5Y,GAAKj9C,GAAGy3D,EAAQp1D,KACnEwzD,GAASl6D,KAAKk6D,QAASA,EAAQl6D,KAAKk6D,MAAMx5D,SAC9Cw5D,EAAMt5D,OAAO0gD,IAAO,IAGxB,OAAIvgB,GAAY/gC,KAAK+gC,UAAYm5B,GAASl6D,KAAKk6D,MAAgBl6D,KACxDk6D,EAAM/5D,QAAU4gC,EAAS5gC,OAAS,IAAI85D,GAAcC,EAAOn5B,GAAY,IAGhFk5B,GAAcv6D,UAAUglD,SAAW,SAAmBh+C,EAAQrD,GAC5D,GAAIrD,MAAQ,GAAS,OAAOA,KAC5B,GAAIqD,EAAKE,OAAU,OAAO02D,GAAcj2D,MAGxC,IADA,IAAIvB,EAAOy3D,EACFp8D,EAAI,EAAGA,EAAIkC,KAAK+gC,SAAS5gC,OAAQrC,GAAK,EAAK,GAAIkC,KAAK+gC,SAASjjC,IAAM4I,EAAQ,CAC9E1G,KAAK+gC,SAASjjC,IAAM4I,IAAUjE,EAAQzC,KAAK+gC,SAASjjC,EAAI,IAC5D,MAGF,IADA,IAAI6E,EAAQ+D,EAAS,EAAGhE,EAAMC,EAAQU,EAAKtD,QAAQyB,KAC1CkQ,EAAM,EAAGA,EAAM1R,KAAKk6D,MAAM/5D,OAAQuR,IAAO,CAChD,IAAIqqD,EAAM/7D,KAAKk6D,MAAMxoD,GACrB,GAAIqqD,EAAIx6D,KAAOmB,GAAOq5D,EAAI15D,GAAKM,GAAUo5D,EAAIj1D,gBAAgBgzD,GAAa,CACxE,IAAIv4D,EAAOqB,KAAKC,IAAIF,EAAOo5D,EAAIx6D,MAAQoB,EAAON,EAAKO,KAAKE,IAAIJ,EAAKq5D,EAAI15D,IAAMM,EACvEpB,EAAOc,IAAO63D,IAAUA,EAAQ,KAAKv5D,KAAKo7D,EAAI33D,KAAK7C,EAAMc,KAGjE,GAAI63D,EAAO,CACT,IAAI8B,EAAW,IAAI/B,GAAcC,EAAMhyD,KAAKozD,KAC5C,OAAO74D,EAAQ,IAAIw5D,GAAgB,CAACD,EAAUv5D,IAAUu5D,EAE1D,OAAOv5D,GAAS,IAGlBw3D,GAAcv6D,UAAU2E,GAAK,SAAaZ,GACxC,GAAIzD,MAAQyD,EAAS,OAAO,EAC5B,KAAMA,aAAiBw2D,KACnBj6D,KAAKk6D,MAAM/5D,QAAUsD,EAAMy2D,MAAM/5D,QACjCH,KAAK+gC,SAAS5gC,QAAUsD,EAAMs9B,SAAS5gC,OAAU,OAAO,EAC5D,IAAK,IAAIrC,EAAI,EAAGA,EAAIkC,KAAKk6D,MAAM/5D,OAAQrC,IACnC,IAAKkC,KAAKk6D,MAAMp8D,GAAGuG,GAAGZ,EAAMy2D,MAAMp8D,IAAO,OAAO,EACpD,IAAK,IAAI4T,EAAM,EAAGA,EAAM1R,KAAK+gC,SAAS5gC,OAAQuR,GAAO,EACjD,GAAI1R,KAAK+gC,SAASrvB,IAAQjO,EAAMs9B,SAASrvB,IACvC1R,KAAK+gC,SAASrvB,EAAM,IAAMjO,EAAMs9B,SAASrvB,EAAM,KAC9C1R,KAAK+gC,SAASrvB,EAAM,GAAGrN,GAAGZ,EAAMs9B,SAASrvB,EAAM,IAAO,OAAO,EACpE,OAAO,GAGTuoD,GAAcv6D,UAAU+kD,OAAS,SAAiBphD,GAChD,OAAO64D,GAAcl8D,KAAKm8D,YAAY94D,KAGxC42D,GAAcv6D,UAAUy8D,YAAc,SAAsB94D,GAC1D,GAAIrD,MAAQ,GAAS,OAAOiI,GAC5B,GAAI5E,EAAKoJ,gBAAkBzM,KAAKk6D,MAAM1iD,KAAKsiD,GAAWprB,IAAO,OAAO1uC,KAAKk6D,MAEzE,IADA,IAAIv4D,EAAS,GACJ7D,EAAI,EAAGA,EAAIkC,KAAKk6D,MAAM/5D,OAAQrC,IAC/BkC,KAAKk6D,MAAMp8D,GAAGgJ,gBAAgBgzD,IAChCn4D,EAAOhB,KAAKX,KAAKk6D,MAAMp8D,IAE7B,OAAO6D,GAGT,IAAI,GAAQ,IAAIs4D,GAIhBA,GAAcj2D,MAAQ,GAEtBi2D,GAAciC,cAAgBA,GAK9B,IAAID,GAAkB,SAAyBG,GAC7Cp8D,KAAKo8D,QAAUA,GAyHjB,SAAST,GAAUU,EAAO31D,GACxB,IAAKA,IAAW21D,EAAMl8D,OAAU,OAAOk8D,EAEvC,IADA,IAAI16D,EAAS,GACJ7D,EAAI,EAAGA,EAAIu+D,EAAMl8D,OAAQrC,IAAK,CACrC,IAAI47D,EAAO2C,EAAMv+D,GACjB6D,EAAOhB,KAAK,IAAIi5D,GAAWF,EAAKn4D,KAAOmF,EAAQgzD,EAAKr3D,GAAKqE,EAAQgzD,EAAK5yD,OAExE,OAAOnF,EAoBT,SAAS+5D,GAAiBW,EAAOh5D,EAAMqD,GACrC,GAAIrD,EAAKE,OAAU,OAAO,KAE1B,IADA,IAAIb,EAAMgE,EAASrD,EAAKvB,SAAU1B,EAAQ,KACjCtC,EAAI,EAAG47D,OAAO,EAAU57D,EAAIu+D,EAAMl8D,OAAQrC,KAC5C47D,EAAO2C,EAAMv+D,KAAO47D,EAAKn4D,KAAOmF,GAAUgzD,EAAKr3D,GAAKK,KAC5DtC,IAAUA,EAAQ,KAAKO,KAAK+4D,GACvB2C,EAAMv+D,GAAK,MAGf,OAAOsC,EAGT,SAASw7D,GAAav1D,GAEpB,IADA,IAAI1E,EAAS,GACJ7D,EAAI,EAAGA,EAAIuI,EAAMlG,OAAQrC,IACd,MAAZuI,EAAMvI,IAAc6D,EAAOhB,KAAK0F,EAAMvI,IAC9C,OAAO6D,EAQT,SAASy4D,GAAUiC,EAAOh5D,EAAMqD,EAAQoP,GACtC,IAAIirB,EAAW,GAAIu7B,GAAW,EAC9Bj5D,EAAKlC,SAAQ,SAAU+5D,EAAWqB,GAChC,IAAIn8D,EAAQs7D,GAAiBW,EAAOnB,EAAWqB,EAAa71D,GAC5D,GAAItG,EAAO,CACTk8D,GAAW,EACX,IAAIxK,EAAUsI,GAAUh6D,EAAO86D,EAAWx0D,EAAS61D,EAAa,EAAGzmD,GAC/Dg8C,GAAW,IACX/wB,EAASpgC,KAAK47D,EAAYA,EAAarB,EAAUp5D,SAAUgwD,OAInE,IADA,IAAIrN,EAASkX,GAAUW,EAAWV,GAAaS,GAASA,GAAQ31D,GAAQwB,KAAKozD,IACpEx9D,EAAI,EAAGA,EAAI2mD,EAAOtkD,OAAQrC,IAAY2mD,EAAO3mD,GAAGgJ,KAAK+yD,MAAMx2D,EAAMohD,EAAO3mD,MAC3EgY,EAAQ2kD,UAAY3kD,EAAQ2kD,SAAShW,EAAO3mD,GAAGqN,MACnDs5C,EAAO7jD,OAAO9C,IAAK,IAErB,OAAO2mD,EAAOtkD,QAAU4gC,EAAS5gC,OAAS,IAAI85D,GAAcxV,EAAQ1jB,GAAY,GAOlF,SAASu6B,GAAM72D,EAAGC,GAChB,OAAOD,EAAElD,KAAOmD,EAAEnD,MAAQkD,EAAEpC,GAAKqC,EAAErC,GAQrC,SAAS65D,GAAcG,GAErB,IADA,IAAIG,EAAUH,EACLv+D,EAAI,EAAGA,EAAI0+D,EAAQr8D,OAAS,EAAGrC,IAAK,CAC3C,IAAI47D,EAAO8C,EAAQ1+D,GACnB,GAAI47D,EAAKn4D,MAAQm4D,EAAKr3D,GAAM,IAAK,IAAIwC,EAAI/G,EAAI,EAAG+G,EAAI23D,EAAQr8D,OAAQ0E,IAAK,CACvE,IAAIwH,EAAOmwD,EAAQ33D,GACnB,GAAIwH,EAAK9K,MAAQm4D,EAAKn4D,KAAtB,CAUM8K,EAAK9K,KAAOm4D,EAAKr3D,KACfm6D,GAAWH,IAASG,EAAUH,EAAM37D,SAGxC87D,EAAQ1+D,GAAK47D,EAAKt1D,KAAKs1D,EAAKn4D,KAAM8K,EAAK9K,MACvCk7D,GAAYD,EAAS33D,EAAG60D,EAAKt1D,KAAKiI,EAAK9K,KAAMm4D,EAAKr3D,MAEpD,MAhBIgK,EAAKhK,IAAMq3D,EAAKr3D,KACdm6D,GAAWH,IAASG,EAAUH,EAAM37D,SAGxC87D,EAAQ33D,GAAKwH,EAAKjI,KAAKiI,EAAK9K,KAAMm4D,EAAKr3D,IACvCo6D,GAAYD,EAAS33D,EAAI,EAAGwH,EAAKjI,KAAKs1D,EAAKr3D,GAAIgK,EAAKhK,OAe5D,OAAOm6D,EAGT,SAASC,GAAYp2D,EAAOvI,EAAGwmD,GAC7B,KAAOxmD,EAAIuI,EAAMlG,QAAUm7D,GAAMhX,EAAMj+C,EAAMvI,IAAM,GAAKA,IACxDuI,EAAMzF,OAAO9C,EAAG,EAAGwmD,GAKrB,SAASoY,GAAgB1uC,GACvB,IAAI5tB,EAAQ,GAOZ,OANA4tB,EAAK2rB,SAAS,eAAe,SAAUv4C,GACrC,IAAIO,EAASP,EAAE4sB,EAAKld,OAChBnP,GAAUA,GAAU,IAASvB,EAAMO,KAAKgB,MAE1CqsB,EAAKw7B,eACLppD,EAAMO,KAAKs5D,GAAc76D,OAAO4uB,EAAKld,MAAMrF,IAAK,CAACuiB,EAAKw7B,cAAclF,QACjE2X,GAAgB16D,KAAKnB,GAtP9B67D,GAAgBv8D,UAAUglD,SAAW,SAAmBh+C,EAAQjE,GAC9D,GAAIA,EAAMc,OAAU,OAAO02D,GAAcj2D,MAEzC,IADA,IAAI5D,EAAQ,GACHtC,EAAI,EAAGA,EAAIkC,KAAKo8D,QAAQj8D,OAAQrC,IAAK,CAC5C,IAAI6D,EAAS3B,KAAKo8D,QAAQt+D,GAAG4mD,SAASh+C,EAAQjE,GAC1Cd,GAAU,KACVA,aAAkBs6D,GAAmB77D,EAAQA,EAAMU,OAAOa,EAAOy6D,SAC9Dh8D,EAAMO,KAAKgB,IAEpB,OAAOs6D,GAAgB16D,KAAKnB,IAG9B67D,GAAgBv8D,UAAU2E,GAAK,SAAaZ,GAC1C,KAAMA,aAAiBw4D,KACnBx4D,EAAM24D,QAAQj8D,QAAUH,KAAKo8D,QAAQj8D,OAAU,OAAO,EAC1D,IAAK,IAAIrC,EAAI,EAAGA,EAAIkC,KAAKo8D,QAAQj8D,OAAQrC,IACrC,IAAKkC,KAAKo8D,QAAQt+D,GAAGuG,GAAGZ,EAAM24D,QAAQt+D,IAAO,OAAO,EACxD,OAAO,GAGTm+D,GAAgBv8D,UAAU+kD,OAAS,SAAiBphD,GAElD,IADA,IAAI1B,EAAQg7D,GAAS,EACZ7+D,EAAI,EAAGA,EAAIkC,KAAKo8D,QAAQj8D,OAAQrC,IAAK,CAC5C,IAAI2mD,EAASzkD,KAAKo8D,QAAQt+D,GAAGq+D,YAAY94D,GACzC,GAAKohD,EAAOtkD,OACZ,GAAKwB,EAEE,CACDg7D,IACFh7D,EAASA,EAAOjB,QAChBi8D,GAAS,GAEX,IAAK,IAAI93D,EAAI,EAAGA,EAAI4/C,EAAOtkD,OAAQ0E,IAAOlD,EAAOhB,KAAK8jD,EAAO5/C,SAN7DlD,EAAS8iD,EASb,OAAO9iD,EAASu6D,GAAcS,EAASh7D,EAASA,EAAOuG,KAAKozD,KAAUrzD,IAMxEg0D,GAAgB16D,KAAO,SAAe66D,GACpC,OAAQA,EAAQj8D,QACd,KAAK,EAAG,OAAO,GACf,KAAK,EAAG,OAAOi8D,EAAQ,GACvB,QAAS,OAAO,IAAIH,GAAgBG,KA+MxC,IAAIQ,GAAa,SAAoB37D,EAAO4pB,GAC1C7qB,KAAK68D,OAAShyC,EAGd7qB,KAAK8Q,MAAQ+Z,EAAM/Z,MAEnB9Q,KAAKorB,SAAWprB,KAAKorB,SAAS9rB,KAAKU,MAEnCA,KAAK88D,MAAQ,KACb98D,KAAK80D,SAAU,EAEf90D,KAAKomD,YAAc,KAKnBpmD,KAAKyX,IAAOxW,GAASA,EAAM87D,OAAUp7C,SAASmB,cAAc,OACxD7hB,IACEA,EAAMwd,YAAexd,EAAMwd,YAAYze,KAAKyX,KACvCxW,EAAM6nB,MAAS7nB,EAAMjB,KAAKyX,KAC1BxW,EAAM87D,QAAS/8D,KAAKg9D,SAAU,IAKzCh9D,KAAKmpD,SAAW8T,GAAYj9D,MAC5BA,KAAKy3D,WAAa,KAClBz3D,KAAKwpD,cAAgB,KACrB0T,GAAoBl9D,MACpBA,KAAKsjD,UAAY6Z,GAAen9D,MAChCA,KAAK48C,QAAU6K,GAAYznD,KAAK8Q,MAAMrF,IAAK2xD,GAAep9D,MAAO08D,GAAgB18D,MAAOA,KAAKyX,IAAKzX,MAElGA,KAAK8qD,qBAAuB,KAK5B9qD,KAAK44D,SAAW,KA33ClB,SAAmB5qC,GACjBA,EAAKof,UAAW,EAChBpf,EAAKooC,UAAY,KACjBpoC,EAAK8+B,YAAc,KACnB9+B,EAAKs/B,gBAAkB,EACvBt/B,EAAKioC,UAAY,CAAC/uC,KAAM,EAAGg3B,EAAG,EAAGE,EAAG,EAAGt3C,KAAM,IAC7CknB,EAAKy+B,oBAAsB,KAC3Bz+B,EAAKw+B,kBAAoB,EAEzBx+B,EAAK4/B,aAAe,EACpB5/B,EAAK0nC,4BAA8B,KAEnC1nC,EAAKyP,WAAY,EACjBzP,EAAKopC,iBAAmB,KACxBppC,EAAK+4B,iBAAmB,GACxB/4B,EAAK8oC,oBAAsB,IAE3B9oC,EAAKs7B,YAAc,IAAI2I,GAAYjkC,GAAM,SAAUzsB,EAAMc,EAAIiqD,EAAUj2B,GAAS,OAAOg2B,GAAcr+B,EAAMzsB,EAAMc,EAAIiqD,EAAUj2B,MAC/HrI,EAAKs7B,YAAY3mD,QAEjBqrB,EAAK+/B,eAAiB,EAEtB//B,EAAKqmC,cAAgB71D,OAAOY,OAAO,MACnC,IAAIkS,EAAO,SAAW07B,GACpB,IAAIjQ,EAAU8D,GAASmM,GACvBhf,EAAKvW,IAAI0yC,iBAAiBnd,EAAOhf,EAAKqmC,cAAcrnB,GAAS,SAAUA,IA2C3E,SAA4Bhf,EAAMgf,GAChC,IAAKA,EAAMqwB,QAAW,OAAO,EAC7B,GAAIrwB,EAAMunB,iBAAoB,OAAO,EACrC,IAAK,IAAIlxD,EAAO2pC,EAAMjjC,OAAQ1G,GAAQ2qB,EAAKvW,IAAKpU,EAAOA,EAAKk0C,WACxD,IAAKl0C,GAAyB,IAAjBA,EAAK+L,UACf/L,EAAKi1C,YAAcj1C,EAAKi1C,WAAWgI,UAAUtT,GAC9C,OAAO,EACb,OAAO,EAjDCswB,CAAmBtvC,EAAMgf,IAAWsnB,GAAiBtmC,EAAMgf,KAC1Dhf,EAAKm7B,UAAcnc,EAAMlmC,QAAQmtD,IAClCl3B,EAAQ/O,EAAMgf,MAItB,IAAK,IAAIA,KAASnM,GAAUvvB,EAAM07B,GAI9B,EAAOV,QAAUte,EAAKvW,IAAI0yC,iBAAiB,SAAS,WAAc,OAAO,QAE7EgK,GAAgBnmC,GAu1ChBuvC,CAAUv9D,MAEVA,KAAKw9D,YAAc,GACnBx9D,KAAKy9D,qBAGHjyD,GAAuB,CAAEqf,MAAO,CAAE5oB,cAAc,GAAO65C,KAAM,CAAE75C,cAAc,IA8TjF,SAASm7D,GAAepvC,GACtB,IAAIxnB,EAAQhI,OAAOY,OAAO,MAc1B,OAbAoH,EAAMgqC,MAAQ,cACdhqC,EAAMk3D,gBAAkBpjC,OAAOtM,EAAKm7B,UAEpCn7B,EAAK2rB,SAAS,cAAc,SAAU56C,GAEpC,GADoB,mBAATA,IAAuBA,EAAQA,EAAMivB,EAAKld,QACjD/R,EAAS,IAAK,IAAIyV,KAAQzV,EAChB,SAARyV,EACAhO,EAAMgqC,OAAS,IAAMzxC,EAAMyV,GACrBhO,EAAMgO,IAAiB,mBAARA,GAAqC,YAARA,IAClDhO,EAAMgO,GAAQ8lB,OAAOv7B,EAAMyV,QAI5B,CAAColD,GAAWv2D,KAAK,EAAG2qB,EAAKld,MAAMrF,IAAI1L,QAAQyB,KAAMgF,IAG1D,SAAS02D,GAAoBlvC,GAC3B,GAAIA,EAAKypC,WAAY,CACnB,IAAIhgD,EAAMkK,SAASmB,cAAc,OACjCrL,EAAIwL,aAAa,mBAAoB,QACrC+K,EAAKw7B,cAAgB,CAAC/xC,IAAKA,EAAK6sC,KAAMsV,GAAWjX,OAAO30B,EAAKld,MAAMwV,UAAUvL,KAAMtD,EAAK,CAACmrC,KAAK,EAAM96C,MAAOkmB,EAAKypC,mBAEhHzpC,EAAKw7B,cAAgB,KAIzB,SAASyT,GAAYjvC,GACnB,OAAQA,EAAK2rB,SAAS,YAAY,SAAU56C,GAAS,OAA6B,IAAtBA,EAAMivB,EAAKld,UAQzE,SAASqsD,GAAenvC,GACtB,IAAIrsB,EAAS,GAKb,OAJAqsB,EAAK2rB,SAAS,aAAa,SAAUhyC,GACnC,IAAK,IAAI/F,KAAQ+F,EAAYnJ,OAAOkB,UAAUC,eAAe1B,KAAK0D,EAAQC,KACtED,EAAOC,GAAQ+F,EAAI/F,OAElBD,EAhWT6J,GAAqBqf,MAAMlsB,IAAM,WAC/B,GAAIqB,KAAK68D,OAAO/rD,OAAS9Q,KAAK8Q,MAAO,CACnC,IAAIqY,EAAOnpB,KAAK68D,OAEhB,IAAK,IAAIx+D,KADT2B,KAAK68D,OAAS,GACG1zC,EAAQnpB,KAAK68D,OAAOx+D,GAAQ8qB,EAAK9qB,GAClD2B,KAAK68D,OAAO/rD,MAAQ9Q,KAAK8Q,MAE3B,OAAO9Q,KAAK68D,QAMdD,GAAWl9D,UAAUY,OAAS,SAAiBuqB,GACzCA,EAAMwS,iBAAmBr9B,KAAK68D,OAAOx/B,iBAAmB82B,GAAgBn0D,MAC5EA,KAAK68D,OAAShyC,EACd7qB,KAAK29D,iBAAiB9yC,EAAM/Z,OAAO,IAOrC8rD,GAAWl9D,UAAUk+D,SAAW,SAAmB/yC,GACjD,IAAIrD,EAAU,GACd,IAAK,IAAInpB,KAAQ2B,KAAK68D,OAAUr1C,EAAQnpB,GAAQ2B,KAAK68D,OAAOx+D,GAE5D,IAAK,IAAIsa,KADT6O,EAAQ1W,MAAQ9Q,KAAK8Q,MACF+Z,EAASrD,EAAQ7O,GAAUkS,EAAMlS,GACpD3Y,KAAKM,OAAOknB,IAMdo1C,GAAWl9D,UAAU8+C,YAAc,SAAsB1tC,GACvD9Q,KAAK29D,iBAAiB7sD,EAAO9Q,KAAK8Q,MAAMuY,SAAWvY,EAAMuY,UAG3DuzC,GAAWl9D,UAAUi+D,iBAAmB,SAA2B7sD,EAAO+sD,GACtE,IAAI5mD,EAASjX,KAEXmpB,EAAOnpB,KAAK8Q,MAAOgtD,GAAS,EAAOC,GAAY,EAQnD,GALIjtD,EAAMyW,aAAevnB,KAAKy9B,YAC5B45B,GAAiBr3D,MACjB+9D,GAAY,GAEd/9D,KAAK8Q,MAAQA,EACT+sD,EAAc,CAChB,IAAIva,EAAY6Z,GAAen9D,OAiTnC,SAA0ByE,EAAGC,GAC3B,IAAIs5D,EAAK,EAAGC,EAAK,EACjB,IAAK,IAAIr8D,KAAQ6C,EAAG,CAClB,GAAIA,EAAE7C,IAAS8C,EAAE9C,GAAS,OAAO,EACjCo8D,IAEF,IAAK,IAAIp2D,KAAKlD,EAAKu5D,IACnB,OAAOD,GAAMC,GAvTPC,CAAiB5a,EAAWtjD,KAAKsjD,aACnCtjD,KAAKsjD,UAAYA,EACjBwa,GAAS,GAEX3J,GAAgBn0D,MAGlBA,KAAKmpD,SAAW8T,GAAYj9D,MAC5Bk9D,GAAoBl9D,MACpB,IAAI0jD,EAAYgZ,GAAgB18D,MAAOyjD,EAAY2Z,GAAep9D,MAE9Dm+D,EAASN,EAAe,QACtB/sD,EAAMstD,kBAAoBj1C,EAAKi1C,kBAAoB,eAAiB,WACtEC,EAAYP,IAAW99D,KAAK48C,QAAQuD,YAAYrvC,EAAMrF,IAAKg4C,EAAWC,IACtE2a,GAAcvtD,EAAMwV,UAAUjiB,GAAG8kB,EAAK7C,aAAcy3C,GAAY,GACpE,IA3/E0B/vC,EACtBwzB,EACAhJ,EA4wF2B8lB,EAAMC,EACjC71D,EA7sJkBE,EAClB41D,EACAC,EACA9+B,EAEA++B,EAo7IAC,EAAyB,YAAVR,GAAwBJ,GAA8C,MAAjC/9D,KAAKyX,IAAIH,MAAMsnD,gBAr9IzE,SAAwB5wC,GAGtB,IAFA,IACIwwC,EAAQC,EADRnlB,EAAOtrB,EAAKvW,IAAI8hC,wBAAyBe,EAAS13C,KAAKC,IAAI,EAAGy2C,EAAK38B,KAE9DuhC,GAAK5E,EAAK1G,KAAO0G,EAAKzG,OAAS,EAAGuL,EAAI9D,EAAS,EACnD8D,EAAIx7C,KAAKE,IAAI+7D,YAAavlB,EAAKJ,QAASkF,GAAK,EAAG,CACnD,IAAI3mC,EAAMuW,EAAK8tB,KAAKO,iBAAiB6B,EAAGE,GACxC,GAAI3mC,GAAOuW,EAAKvW,KAAQuW,EAAKvW,IAAIgJ,SAAShJ,GAA1C,CACA,IAAIqnD,EAAYrnD,EAAI8hC,wBACpB,GAAIulB,EAAUniD,KAAO29B,EAAS,GAAI,CAChCkkB,EAAS/mD,EACTgnD,EAASK,EAAUniD,IACnB,QAGJ,MAAO,CAAC6hD,OAAQA,EAAQC,OAAQA,EAAQ9+B,MAAO+a,EAAY1sB,EAAKvW,MAu8IiCsnD,CAAe/+D,MAEhH,GAAI+9D,EAAW,CACb/9D,KAAKspD,YAAYxG,OAMjB,IAAIkc,EAAiBX,IAAc,EAAO3xB,IAAM,EAAON,UAAYpsC,KAAKy9B,YACnEtU,EAAK7C,UAAUtiB,QAAU8M,EAAMwV,UAAUtiB,QAyQjBs6D,EAzQkDn1C,EAAK7C,UAyQjDi4C,EAzQ4DztD,EAAMwV,UA0QnG5d,EAAQ9F,KAAKE,IAAIw7D,EAAK96C,QAAQlX,YAAYgyD,EAAKvjD,MAAOwjD,EAAK/6C,QAAQlX,YAAYiyD,EAAKxjD,OACjFujD,EAAK96C,QAAQ7gB,MAAM+F,IAAU61D,EAAK/6C,QAAQ7gB,MAAM+F,IA1QrD,GAAI21D,EAAW,CAKb,IAAIY,EAAe,EAAO7yB,OAAUpsC,KAAKomD,YAAcpmD,KAAK87C,KAAKkD,eAAeI,UAAa,MACzF0e,GAAW99D,KAAK48C,QAAQt8C,OAAOwQ,EAAMrF,IAAKg4C,EAAWC,EAAW1jD,QAClEA,KAAK48C,QAAQqK,gBAAgB,IAC7BjnD,KAAK48C,QAAQhL,UACb5xC,KAAK48C,QAAU6K,GAAY32C,EAAMrF,IAAKg4C,EAAWC,EAAW1jD,KAAKyX,IAAKzX,OAEpEi/D,IAAiBj/D,KAAKomD,cAAe4Y,GAAiB,GAMxDA,KACEh/D,KAAKo2D,WAAap2D,KAAKspD,YAAYqJ,iBAAiBtuD,GAAGrE,KAAK87C,KAAKkD,kBAxhF/ChxB,EAwhFqFhuB,KAvhF3GwhD,EAAYxzB,EAAK4uB,QAAQW,WAAWvvB,EAAKld,MAAMwV,UAAU1C,OAAQ,GACjE40B,EAASxqB,EAAK8tB,KAAKkD,eAChBlH,EAAqB0J,EAAUn+C,KAAMm+C,EAAU96C,OAAQ8xC,EAAOoJ,WAAYpJ,EAAOqJ,gBAshFpFoH,GAAejpD,KAAMg/D,IAErB9V,GAAkBlpD,KAAM8Q,EAAMwV,WAC9BtmB,KAAKspD,YAAYe,mBAEnBrqD,KAAKspD,YAAY3mD,QAKnB,GAFA3C,KAAKy9D,kBAAkBt0C,GAET,SAAVg1C,EACFn+D,KAAKyX,IAAI8iC,UAAY,OAChB,GAAc,gBAAV4jB,EAA0B,CACnC,IAAI1kB,EAAWz5C,KAAK87C,KAAKkD,eAAeI,UACpCp/C,KAAK25C,SAAS,2BAA2B,SAAUv4C,GAAK,OAAOA,EAAE6V,QAE5DnG,EAAMwV,qBAAqB,IAChCkzB,EAAmBx5C,KAAMA,KAAK48C,QAAQ6C,YAAY3uC,EAAMwV,UAAU/kB,MAAMg4C,wBAAyBE,GAEjGD,EAAmBx5C,KAAMA,KAAKs9C,YAAYxsC,EAAMwV,UAAUvL,KAAM,GAAI0+B,SAC/DklB,IA1+IPH,GADkB51D,EA4+IL+1D,GA3+IAH,OACbC,EAAS71D,EAAI61D,OACb9+B,EAAQ/2B,EAAI+2B,MAEZ++B,EAAYF,EAASA,EAAOjlB,wBAAwB58B,IAAM,EAC9Dg+B,EAAmBhb,EAAoB,GAAb++B,EAAiB,EAAIA,EAAYD,KA0+I7D7B,GAAWl9D,UAAUw/D,mBAAqB,WAExC,IADA,IAAIlxC,EACGA,EAAOhuB,KAAKw9D,YAAYhqD,OAAawa,EAAK4jB,SAAW5jB,EAAK4jB,WAGnEgrB,GAAWl9D,UAAU+9D,kBAAoB,SAA4B0B,GACnE,GAAKA,GAAaA,EAAU91C,SAAWrpB,KAAK8Q,MAAMuY,QAOhD,IAAK,IAAI3X,EAAM,EAAGA,EAAM1R,KAAKw9D,YAAYr9D,OAAQuR,IAAO,CACtD,IAAI0tD,EAAap/D,KAAKw9D,YAAY9rD,GAC9B0tD,EAAW9+D,QAAU8+D,EAAW9+D,OAAON,KAAMm/D,OATM,CACzDn/D,KAAKk/D,qBACL,IAAK,IAAIphE,EAAI,EAAGA,EAAIkC,KAAK8Q,MAAMuY,QAAQlpB,OAAQrC,IAAK,CAClD,IAAI0rB,EAASxpB,KAAK8Q,MAAMuY,QAAQvrB,GAC5B0rB,EAAOre,KAAK6iB,MAAQhuB,KAAKw9D,YAAY78D,KAAK6oB,EAAOre,KAAK6iB,KAAKhuB,UAiBrE48D,GAAWl9D,UAAUi6C,SAAW,SAAmBib,EAAUxzD,GAC3D,IAAiDrC,EAA7C6C,EAAO5B,KAAK68D,QAAU78D,KAAK68D,OAAOjI,GACtC,GAAY,MAARhzD,IAAiB7C,EAAQqC,EAAIA,EAAEQ,GAAQA,GAAS,OAAO7C,EAC3D,IAAIsqB,EAAUrpB,KAAK8Q,MAAMuY,QACzB,GAAIA,EAAW,IAAK,IAAIvrB,EAAI,EAAGA,EAAIurB,EAAQlpB,OAAQrC,IAAK,CACtD,IAAIsY,EAASiT,EAAQvrB,GAAG+sB,MAAM+pC,GAC9B,GAAc,MAAVx+C,IAAmBrX,EAAQqC,EAAIA,EAAEgV,GAAUA,GAAW,OAAOrX,IAMrE69D,GAAWl9D,UAAU0pD,SAAW,WAC9B,OAAOppD,KAAK87C,KAAKyC,eAAiBv+C,KAAKyX,KAKzCmlD,GAAWl9D,UAAUovC,MAAQ,WAC3B9uC,KAAKspD,YAAYxG,OACb9iD,KAAKmpD,UAxgJX,SAA4B1xC,GAC1B,GAAIA,EAAI4nD,UAAa,OAAO5nD,EAAI4nD,YAChC,GAAIxkB,EAA0B,OAAOpjC,EAAIq3B,MAAM+L,GAE/C,IAAI3d,EAASwd,EAAYjjC,GACzBA,EAAIq3B,MAAgC,MAA1B+L,EAAiC,CACzC,oBAEE,OADAA,EAAyB,CAACykB,eAAe,IAClC,SAEPj/D,GACCw6C,IACHA,GAAyB,EACzBF,EAAmBzd,EAAQ,IA2/IRqiC,CAAmBv/D,KAAKyX,KAC7CwxC,GAAejpD,MACfA,KAAKspD,YAAY3mD,SAQnB6I,GAAqBswC,KAAKn9C,IAAM,WAC9B,IAAIsO,EAASjN,KAAK88D,MAClB,GAAc,MAAV7vD,EAAkB,IAAK,IAAIuF,EAASxS,KAAKyX,IAAI8/B,WAAY/kC,EAAQA,EAASA,EAAO+kC,WACnF,GAAuB,GAAnB/kC,EAAOpD,UAAqC,IAAnBoD,EAAOpD,UAAkBoD,EAAOglC,KAE3D,OADKhlC,EAAOwsC,eAAgBxgD,OAAOghE,eAAehtD,GAAQwsC,aAAe,WAAc,OAAOr9B,SAASq9B,iBAChGh/C,KAAK88D,MAAQtqD,EAGxB,OAAOvF,GAAU0U,UAWnBi7C,GAAWl9D,UAAUk8C,YAAc,SAAwBb,GACzD,OAAOa,GAAY57C,KAAM+6C,IAU3B6hB,GAAWl9D,UAAU49C,YAAc,SAAwB96C,EAAK8oB,GAG9D,YAFgB,IAATA,IAAkBA,EAAO,GAEzBgyB,GAAYt9C,KAAMwC,EAAK8oB,IAYhCsxC,GAAWl9D,UAAU+/D,SAAW,SAAmBj9D,EAAK8oB,GAGtD,YAFgB,IAATA,IAAkBA,EAAO,GAEzBtrB,KAAK48C,QAAQW,WAAW/6C,EAAK8oB,IAYtCsxC,GAAWl9D,UAAUqhD,QAAU,SAAkBv+C,GAC/C,IAAIomB,EAAO5oB,KAAK48C,QAAQoE,OAAOx+C,GAC/B,OAAOomB,EAAOA,EAAKm4B,QAAU,MAY/B6b,GAAWl9D,UAAUggE,SAAW,SAAmBr8D,EAAMqD,EAAQqe,QAC/C,IAATA,IAAkBA,GAAQ,GAEjC,IAAIviB,EAAMxC,KAAK48C,QAAQI,WAAW35C,EAAMqD,EAAQqe,GAChD,GAAW,MAAPviB,EAAe,MAAM,IAAI8B,WAAW,sCACxC,OAAO9B,GAUTo6D,GAAWl9D,UAAUwuB,eAAiB,SAA2BxJ,EAAK5T,GACpE,OAAOod,GAAeluB,KAAM8Q,GAAS9Q,KAAK8Q,MAAO4T,IAMnDk4C,GAAWl9D,UAAUkyC,QAAU,WACxB5xC,KAAK48C,WAjnDZ,SAAsB5uB,GAEpB,IAAK,IAAIlnB,KADTknB,EAAKs7B,YAAYxG,OACA90B,EAAKqmC,cAClBrmC,EAAKvW,IAAIwyC,oBAAoBnjD,EAAMknB,EAAKqmC,cAAcvtD,IAC1DmsD,aAAajlC,EAAKopC,kBAClBnE,aAAajlC,EAAK0nC,6BA6mDlBiK,CAAa3/D,MACbA,KAAKk/D,qBACDl/D,KAAKg9D,SACPh9D,KAAK48C,QAAQt8C,OAAON,KAAK8Q,MAAMrF,IAAK,GAAIixD,GAAgB18D,MAAOA,MAC/DA,KAAKyX,IAAIjK,YAAc,IACdxN,KAAKyX,IAAI8/B,YAClBv3C,KAAKyX,IAAI8/B,WAAWuP,YAAY9mD,KAAKyX,KAEvCzX,KAAK48C,QAAQhL,UACb5xC,KAAK48C,QAAU,OAIjBggB,GAAWl9D,UAAUkgE,cAAgB,SAA0B5yB,GAC7D,OAhmDF,SAAuBhf,EAAMgf,GACtBsnB,GAAiBtmC,EAAMgf,KAAUnM,GAASmM,EAAMlmC,QAChDknB,EAAKm7B,UAAcnc,EAAMlmC,QAAQmtD,IAClCpzB,GAASmM,EAAMlmC,MAAMknB,EAAMgf,GA6lDxB4yB,CAAc5/D,KAAMgtC,IAW7B4vB,GAAWl9D,UAAU0rB,SAAW,SAAmBvH,GACjD,IAAIg8C,EAAsB7/D,KAAK68D,OAAOgD,oBAClCA,EAAuBA,EAAoB5hE,KAAK+B,KAAM6jB,GACnD7jB,KAAKw+C,YAAYx+C,KAAK8Q,MAAMgY,MAAMjF,KAG3CrlB,OAAOiI,iBAAkBm2D,GAAWl9D,UAAW8L,ICt1J/C,IAAIs0D,GAAiB,SAAwBpuB,EAAY57B,GACvD,IAAImB,EAASjX,KAEbA,KAAK0xC,WAAaA,EAClB1xC,KAAKi+C,MAAQnoC,EAAQmoC,OAAS,EAC9Bj+C,KAAK+/D,MAAQjqD,EAAQiqD,OAAS,QAC9B//D,KAAKwwC,MAAQ16B,EAAQ06B,MACrBxwC,KAAKggE,UAAY,KACjBhgE,KAAKixC,QAAU,KACfjxC,KAAKigE,QAAU,KAEfjgE,KAAK6gC,SAAW,CAAC,WAAY,UAAW,OAAQ,aAAav/B,KAAI,SAAUjD,GACzE,IAAI0+B,EAAU,SAAU1J,GAAK,OAAOpc,EAAO5Y,GAAMg1B,IAEjD,OADAqe,EAAWj6B,IAAI0yC,iBAAiB9rD,EAAM0+B,GAC/B,CAAC1+B,KAAMA,EAAM0+B,QAASA,OAIjC+iC,GAAepgE,UAAUkyC,QAAU,WAC/B,IAAI36B,EAASjX,KAEfA,KAAK6gC,SAAS1/B,SAAQ,SAAUyH,GAC5B,IAAIvK,EAAOuK,EAAIvK,KACX0+B,EAAUn0B,EAAIm0B,QAElB,OAAO9lB,EAAOy6B,WAAWj6B,IAAIwyC,oBAAoB5rD,EAAM0+B,OAI7D+iC,GAAepgE,UAAUY,OAAS,SAAiBoxC,EAAYytB,GACvC,MAAlBn/D,KAAKggE,WAAqBb,EAAU1zD,KAAOimC,EAAW5gC,MAAMrF,KAAOzL,KAAKkgE,iBAG9EJ,GAAepgE,UAAUygE,UAAY,SAAoB39D,GACnDA,GAAOxC,KAAKggE,YAChBhgE,KAAKggE,UAAYx9D,EACN,MAAPA,GACFxC,KAAKixC,QAAQsG,WAAWuP,YAAY9mD,KAAKixC,SACzCjxC,KAAKixC,QAAU,MAEfjxC,KAAKkgE,kBAITJ,GAAepgE,UAAUwgE,cAAgB,WACvC,IAA8D5mB,EAA1D70B,EAAOzkB,KAAK0xC,WAAW5gC,MAAMrF,IAAIoB,QAAQ7M,KAAKggE,WAClD,IAAKv7C,EAAKliB,OAAOkK,cAAe,CAC9B,IAAIZ,EAAS4Y,EAAKra,WAAY0B,EAAQ2Y,EAAKta,UAC3C,GAAI0B,GAAUC,EAAO,CACnB,IAAIs0D,EAAWpgE,KAAK0xC,WAAWqP,QAAQ/gD,KAAKggE,WAAan0D,EAAQA,EAAO/J,SAAW,IAAIy3C,wBACnF58B,EAAM9Q,EAASu0D,EAASlnB,OAASknB,EAASzjD,IAC1C9Q,GAAUC,IACV6Q,GAAOA,EAAM3c,KAAK0xC,WAAWqP,QAAQ/gD,KAAKggE,WAAWzmB,wBAAwB58B,KAAO,GACxF28B,EAAO,CAAC1G,KAAMwtB,EAASxtB,KAAMC,MAAOutB,EAASvtB,MAAOl2B,IAAKA,EAAM3c,KAAKi+C,MAAQ,EAAG/E,OAAQv8B,EAAM3c,KAAKi+C,MAAQ,IAG9G,IAAK3E,EAAM,CACT,IAAIyB,EAAS/6C,KAAK0xC,WAAW4L,YAAYt9C,KAAKggE,WAC9C1mB,EAAO,CAAC1G,KAAMmI,EAAOnI,KAAO5yC,KAAKi+C,MAAQ,EAAGpL,MAAOkI,EAAOnI,KAAO5yC,KAAKi+C,MAAQ,EAAGthC,IAAKo+B,EAAOp+B,IAAKu8B,OAAQ6B,EAAO7B,QAGnH,IAMImnB,EAAYC,EANZ/9D,EAASvC,KAAK0xC,WAAWj6B,IAAI8oD,aAOjC,GANKvgE,KAAKixC,UACRjxC,KAAKixC,QAAU1uC,EAAOkc,YAAYkD,SAASmB,cAAc,QACrD9iB,KAAKwwC,QAASxwC,KAAKixC,QAAQxK,UAAYzmC,KAAKwwC,OAChDxwC,KAAKixC,QAAQ35B,MAAMgvC,QAAU,4EAA8EtmD,KAAK+/D,QAG7Gx9D,GAAUA,GAAUof,SAASm4B,MAA6C,UAArCyM,iBAAiBhkD,GAAQi+D,SACjEH,GAAcI,YACdH,GAAaI,gBACR,CACL,IAAIC,EAASp+D,EAAOg3C,wBACpB8mB,EAAaM,EAAO/tB,KAAOrwC,EAAO83C,WAClCimB,EAAYK,EAAOhkD,IAAMpa,EAAOg4C,UAElCv6C,KAAKixC,QAAQ35B,MAAMs7B,KAAQ0G,EAAK1G,KAAOytB,EAAc,KACrDrgE,KAAKixC,QAAQ35B,MAAMqF,IAAO28B,EAAK38B,IAAM2jD,EAAa,KAClDtgE,KAAKixC,QAAQ35B,MAAM2mC,MAAS3E,EAAKzG,MAAQyG,EAAK1G,KAAQ,KACtD5yC,KAAKixC,QAAQ35B,MAAM6mC,OAAU7E,EAAKJ,OAASI,EAAK38B,IAAO,MAGzDmjD,GAAepgE,UAAUkhE,gBAAkB,SAA0BX,GACjE,IAAIhpD,EAASjX,KAEfizD,aAAajzD,KAAKigE,SAClBjgE,KAAKigE,QAAU1iC,YAAW,WAAc,OAAOtmB,EAAOkpD,UAAU,QAAUF,IAG5EH,GAAepgE,UAAUo5D,SAAW,SAAmB9rB,GACrD,GAAKhtC,KAAK0xC,WAAWyX,SAArB,CACA,IAAI3mD,EAAMxC,KAAK0xC,WAAWkK,YAAY,CAAChJ,KAAM5F,EAAMynB,QAAS93C,IAAKqwB,EAAM0nB,UACvE,GAAIlyD,EAAK,CACP,IAAIuH,EAASvH,EAAIA,IACbxC,KAAK0xC,WAAWknB,UAAY54D,KAAK0xC,WAAWknB,SAASl4D,OAEzC,OADdqJ,EAAS,YAAU/J,KAAK0xC,WAAW5gC,MAAMrF,IAAK1B,EAAQ/J,KAAK0xC,WAAWknB,SAASl4D,UACzDqJ,EAASvH,EAAIA,KAErCxC,KAAKmgE,UAAUp2D,GACf/J,KAAK4gE,gBAAgB,QAIzBd,GAAepgE,UAAUm5D,QAAU,WACjC74D,KAAK4gE,gBAAgB,KAGvBd,GAAepgE,UAAUs5D,KAAO,WAC9Bh5D,KAAK4gE,gBAAgB,KAGvBd,GAAepgE,UAAUmhE,UAAY,SAAoB7zB,GACnDA,EAAMjjC,QAAU/J,KAAK0xC,WAAWj6B,KAAQzX,KAAK0xC,WAAWj6B,IAAIgJ,SAASusB,EAAM8zB,gBAC3E9gE,KAAKmgE,UAAU,OCpIrB,IAAI,GAA0B,SAAU58C,GACtC,SAASw9C,EAAUt8C,GACjBlB,EAAUtlB,KAAK+B,KAAMykB,EAAMA,GA6E7B,OA1EKlB,IAAYw9C,EAAU55D,UAAYoc,GACvCw9C,EAAUrhE,UAAYlB,OAAOY,OAAQmkB,GAAaA,EAAU7jB,WAC5DqhE,EAAUrhE,UAAUO,YAAc8gE,EAElCA,EAAUrhE,UAAU4B,IAAM,SAAcmK,EAAKyY,GAC3C,IAAIO,EAAOhZ,EAAIoB,QAAQqX,EAAQ5iB,IAAItB,KAAK+a,OACxC,OAAOgmD,EAAUlH,MAAMp1C,GAAQ,IAAIs8C,EAAUt8C,GAAQlB,EAAUuB,KAAKL,IAGtEs8C,EAAUrhE,UAAUK,QAAU,WAAsB,OAAO,IAAMiE,OAEjE+8D,EAAUrhE,UAAU2E,GAAK,SAAaZ,GACpC,OAAOA,aAAiBs9D,GAAat9D,EAAMsX,MAAQ/a,KAAK+a,MAG1DgmD,EAAUrhE,UAAUoG,OAAS,WAC3B,MAAO,CAACgB,KAAM,YAAatE,IAAKxC,KAAK+a,OAGvCgmD,EAAUh7D,SAAW,SAAmB0F,EAAK5D,GAC3C,GAAuB,iBAAZA,EAAKrF,IAAmB,MAAM,IAAI8B,WAAW,wCACxD,OAAO,IAAIy8D,EAAUt1D,EAAIoB,QAAQhF,EAAKrF,OAGxCu+D,EAAUrhE,UAAU6lB,YAAc,WAA0B,OAAO,IAAIy7C,GAAYhhE,KAAK4jB,SAExFm9C,EAAUlH,MAAQ,SAAgBp1C,GAChC,IAAIliB,EAASkiB,EAAKliB,OAClB,GAAIA,EAAOkL,cAgEf,SAAsBgX,GACpB,IAAK,IAAIrmB,EAAIqmB,EAAK/b,MAAOtK,GAAK,EAAGA,IAAK,CACpC,IAAI8F,EAAQugB,EAAKvgB,MAAM9F,GAEvB,GAAa,GAAT8F,EAEJ,IAAK,IAAI2H,EAAS4Y,EAAKphB,KAAKjF,GAAGqE,MAAMyB,EAAQ,IAAK2H,EAASA,EAAO3J,UAAW,CAC3E,GAA0B,GAArB2J,EAAO1J,aAAoB0J,EAAOY,eAAkBZ,EAAO6B,QAAU7B,EAAO/E,KAAKqE,KAAKC,UAAa,OAAO,EAC/G,GAAIS,EAAOY,cAAiB,OAAO,GAIvC,OAAO,EA5EsBw0D,CAAax8C,KA+E5C,SAAqBA,GACnB,IAAK,IAAIrmB,EAAIqmB,EAAK/b,MAAOtK,GAAK,EAAGA,IAAK,CACpC,IAAI8F,EAAQugB,EAAK7Y,WAAWxN,GAAImE,EAASkiB,EAAKphB,KAAKjF,GACnD,GAAI8F,GAAS3B,EAAOJ,WACpB,IAAK,IAAI2J,EAAQvJ,EAAOE,MAAMyB,IAAS4H,EAAQA,EAAM9J,WAAY,CAC/D,GAAyB,GAApB8J,EAAM3J,aAAoB2J,EAAMW,eAAkBX,EAAM4B,QAAU5B,EAAMhF,KAAKqE,KAAKC,UAAa,OAAO,EAC3G,GAAIU,EAAMW,cAAiB,OAAO,GAGtC,OAAO,EAxF6Cy0D,CAAYz8C,GAAS,OAAO,EAC9E,IAAI08C,EAAW5+D,EAAOuE,KAAKqE,KAAKi2D,eAChC,GAAgB,MAAZD,EAAoB,OAAOA,EAC/B,IAAIjgD,EAAQ3e,EAAO+L,eAAemW,EAAKvgB,SAAS0L,YAChD,OAAOsR,GAASA,EAAMzT,aAGxBszD,EAAUv8C,SAAW,SAAmBC,EAAMC,EAAK28C,GACjD7uD,EAAQ,OAAS,CACf,IAAK6uD,GAAYN,EAAUlH,MAAMp1C,GAAS,OAAOA,EAGjD,IAFA,IAAIjiB,EAAMiiB,EAAKjiB,IAAK6J,EAAO,KAElBjO,EAAIqmB,EAAK/b,OAAQtK,IAAK,CAC7B,IAAImE,EAASkiB,EAAKphB,KAAKjF,GACvB,GAAIsmB,EAAM,EAAID,EAAK7Y,WAAWxN,GAAKmE,EAAOJ,WAAasiB,EAAKvgB,MAAM9F,GAAK,EAAG,CACxEiO,EAAO9J,EAAOE,MAAMiiB,EAAM,EAAID,EAAK7Y,WAAWxN,GAAKqmB,EAAKvgB,MAAM9F,GAAK,GACnE,MACK,GAAS,GAALA,EACT,OAAO,KAEToE,GAAOkiB,EACP,IAAI48C,EAAO78C,EAAKhZ,IAAIoB,QAAQrK,GAC5B,GAAIu+D,EAAUlH,MAAMyH,GAAS,OAAOA,EAItC,OAAS,CACP,IAAIltC,EAAS1P,EAAM,EAAIrY,EAAKrK,WAAaqK,EAAKnK,UAC9C,IAAKkyB,EAAQ,CACX,GAAI/nB,EAAKqB,SAAWrB,EAAK/I,SAAW,IAAc4iB,aAAa7Z,GAAO,CACpEoY,EAAOA,EAAKhZ,IAAIoB,QAAQrK,EAAM6J,EAAKvK,SAAW4iB,GAC9C28C,GAAW,EACX,SAAS7uD,EAEX,MAEFnG,EAAO+nB,EACP5xB,GAAOkiB,EACP,IAAI68C,EAAS98C,EAAKhZ,IAAIoB,QAAQrK,GAC9B,GAAIu+D,EAAUlH,MAAM0H,GAAW,OAAOA,EAGxC,OAAO,OAIJR,EA/EoB,CAgF3B,KAEF,GAAUrhE,UAAU+lB,SAAU,EAE9B,IAAUL,OAAO,YAAa,IAE9B,IAAI47C,GAAc,SAAqBx+D,GACrCxC,KAAKwC,IAAMA,GAEbw+D,GAAYthE,UAAU4B,IAAM,SAAc4iB,GACxC,OAAO,IAAI88C,GAAY98C,EAAQ5iB,IAAItB,KAAKwC,OAE1Cw+D,GAAYthE,UAAUmN,QAAU,SAAkBpB,GAChD,IAAIgZ,EAAOhZ,EAAIoB,QAAQ7M,KAAKwC,KAC5B,OAAO,GAAUq3D,MAAMp1C,GAAQ,IAAI,GAAUA,GAAQ,IAAUK,KAAKL,IAsCtE,IAeI8oB,GAAgB,YAAe,CACjC,UAAai0B,GAAM,SAAU,GAC7B,WAAcA,GAAM,QAAS,GAC7B,QAAWA,GAAM,QAAS,GAC1B,UAAaA,GAAM,OAAQ,KAG7B,SAASA,GAAMC,EAAM/8C,GACnB,IAAIg9C,EAAiB,QAARD,EAAkB/8C,EAAM,EAAI,OAAS,KAASA,EAAM,EAAI,QAAU,OAC/E,OAAO,SAAS5T,EAAOsa,EAAU4C,GAC/B,IAAI3H,EAAMvV,EAAMwV,UACZpd,EAASwb,EAAM,EAAI2B,EAAI5d,IAAM4d,EAAI7d,MAAO64D,EAAWh7C,EAAIriB,MAC3D,GAAIqiB,aAAe,IAAe,CAChC,IAAK2H,EAAKE,eAAewzC,IAA2B,GAAhBx4D,EAAOR,MAAc,OAAO,EAChE24D,GAAW,EACXn4D,EAAS4H,EAAMrF,IAAIoB,QAAQ6X,EAAM,EAAIxb,EAAO4C,QAAU5C,EAAO2C,UAE/D,IAAI81D,EAAS,GAAUn9C,SAAStb,EAAQwb,EAAK28C,GAC7C,QAAKM,IACDv2C,GAAYA,EAASta,EAAM+S,GAAG0C,aAAa,IAAI,GAAUo7C,MACtD,IAIX,SAASC,GAAY5zC,EAAMxrB,EAAKwqC,GAC9B,IAAKhf,EAAKm7B,SAAY,OAAO,EAC7B,IAAI1kC,EAAOuJ,EAAKld,MAAMrF,IAAIoB,QAAQrK,GAClC,IAAK,GAAUq3D,MAAMp1C,GAAS,OAAO,EACrC,IACI2P,EADMpG,EAAK4tB,YAAY,CAAChJ,KAAM5F,EAAMynB,QAAS93C,IAAKqwB,EAAM0nB,UAC3CtgC,OACjB,QAAIA,GAAU,GAAK,IAAclO,aAAa8H,EAAKld,MAAMrF,IAAIuC,OAAOomB,OACpEpG,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAG0C,aAAa,IAAI,GAAU9B,MAChD,GAGT,SAASo9C,GAAc/wD,GACrB,KAAMA,EAAMwV,qBAAqB,IAAc,OAAO,KACtD,IAAIjjB,EAAOse,SAASmB,cAAc,OAElC,OADAzf,EAAKojC,UAAY,wBACVwzB,GAAc76D,OAAO0R,EAAMrF,IAAK,CAACmuD,GAAWjX,OAAO7xC,EAAMwV,UAAUvL,KAAM1X,EAAM,CAAChE,IAAK,gB,wBC9L9F,IAAMyiE,GAAiB,0DAEnB5lD,GAAS,IAAInF,UCHjB,SAASgrD,GAAQ/7D,GACf,OAAO,SAACgoB,EAAMxrB,EAAKa,EAAM+nD,EAASpe,EAAOc,GACvC,GAAIA,GAAUzqC,EAAKyD,OAASd,EAAOO,MAAMupC,SAAoC,MAAzB9C,EAAMjjC,OAAO4Y,QAU/D,OAJAtf,EAAKmD,MAAM2V,MAAQ9Y,EAAKmD,MAAM2V,KAC9B6R,EAAK8gB,QACL9B,EAAM6B,kBACN7B,EAAMjG,kBACC,G,YCLb,SAASi7B,GAAgB5yD,GACvB,OAAO4uB,aACL,mBACA5uB,GACA,SAACb,GAAD,MAAY,CAAEswB,OAAQtwB,EAAM,OAC5B,SAACA,EAAOlL,GAAR,OAAiBA,EAAKlB,WAAakB,EAAKmD,MAAMq4B,QAAUtwB,EAAM,MAIlE,SAAS0zD,GAAe7yD,GACtB,OAAO4uB,aAAkB,iBAAkB5uB,GAG7C,SAAS8yD,GAAc9yD,GACrB,OAAO8uB,aAAuB,QAAS9uB,GAGzC,SAAS+yD,GAAY/yD,EAAUgzD,GAC7B,OAAOlkC,aAAuB,IAAIxD,OAAO,SAAW0nC,EAAW,UAAWhzD,GAAU,SAACb,GAAD,MAAY,CAAE8S,MAAO9S,EAAM,GAAGpO,WAGpH,SAASkiE,GAAiBjzD,GACxB,OAAO4uB,aAAkB,YAAa5uB,G,+BCVnBkzD,G,WACnB,WAAYv4D,EAAQvD,GAClBxG,KAAKqwC,MAAMtmC,EAAQvD,G,2BAGrB6pC,MAAA,SAAMtmC,EAAQvD,GAAO,WACnBxG,KAAKwG,MAAQA,EACbxG,KAAKgG,QAAS,IAAI0qC,MAAgBL,QAElCrwC,KAAKkc,OAAS,IAAIqmD,KAAsBviE,KAAKgG,QAAQqqC,QACrDrwC,KAAKovD,WAAa,IAAIxf,KAA0B5vC,KAAKgG,QAAQqqC,QAE7DrwC,KAAK8Q,MAAQ2Y,IAAYrqB,OAAOY,KAAKwiE,0BACrCxiE,KAAKguB,KAAO,IAAI4uC,GAAW7yD,EAAQ/J,KAAKyiE,qBAErBj8D,EAAMk8D,YAAc,IAC5BvhE,SAAQ,SAACslC,GAAD,OAAe,EAAKzY,KAAKvW,IAAIorC,UAAU3gC,IAAIukB,MAE9D,IAAMk8B,EAAqB,SAACtvC,GAC1B,EAAK7sB,MAAMo8D,eAAezhE,SAAQ,SAAC0hE,GACjCA,EAAS5kE,KAAK8L,MAGhBspB,EAAEyqC,QAAS,GAGb/zD,EAAO+4D,QAAUH,EACjB54D,EAAO28B,QAAUi8B,EACjB54D,EAAOg5D,QAAUJ,G,EAGnBH,uBAAA,WACE,MAAO,CACL/2D,IAAKzL,KAAKgjE,kBAAkBhjE,KAAKwG,MAAMzH,OACvC2qD,SAAU1pD,KAAKwG,MAAMkjD,SACrB1jD,OAAQhG,KAAKgG,OACbqjB,QAASrpB,KAAKijE,mBAAmBr0B,Y,EAIrCq0B,iBAAA,WACE,IC3DsC9/D,ENetB2S,EOhBeotD,EJiBGl9D,EE2C5BkpC,EAAQ,IAAIC,KA4BlB,OA1BAD,EAAMhtB,IAAI,qBAAsB+a,aAAW,CAAEjmB,MAAOhX,KAAKmjE,gBAAgBnjE,KAAKgG,WAE9EkpC,EAAMhtB,IAAI,SAAUmrB,YAAO,CAAE,YAAartC,KAAKwG,MAAM6nC,YAErDa,EAAMhtB,IAAI,SAAUmrB,YAAO,CAAE+1B,OAAQpjE,KAAKwG,MAAMy8B,UAEhDiM,EAAMhtB,IAAI,iBAAkBmrB,YGtDjB,SAAwBrnC,GACrC,IAsBMq9D,EAAkB,SAACvyD,EAAOsa,GAE9B,OADAA,EAASta,EAAM+S,GAAGuE,qBAAqBpiB,EAAOO,MAAM64B,WAAWhgC,UAAUspB,mBAClE,GAkBH46C,EAAgB,CA1CG,SAACxyD,EAAOsa,GAC/B,IAAMm4C,EAAgBr7B,EAAE,0BAClBs7B,EAAmBt7B,EAAE,6BAE3B,GAAIq7B,EAAc,IAAMC,EAAiB,GAAI,OAAO,GAsCbt+B,YAAcl/B,EAAOO,MAAMy4B,WAnC9C,SAACluB,EAAOsa,EAAU4C,GAAS,MACtBld,EAAMwV,UAAzB7C,EADyC,EACzCA,MAAOD,EADkC,EAClCA,QACb,IAAKC,EAAMlhB,OAAOuE,KAAKqE,KAAKugB,OAASjI,EAAM9W,WAAW6W,GAAU,OAAO,EAEvE,IAAMpZ,EAAa0G,EAAMwV,UAAU9d,MAAM4B,WACnCD,EAAY2G,EAAMwV,UAAU9d,MAAM2B,UACxC,OAAMC,GAA4C,OAA9BA,EAAWjH,KAAKzC,OAAO,IAAiByJ,EAKnDshB,YAAc3a,EAAOsa,IAJ5B4C,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAX,OAAqB/S,EAAMwV,UAAU/kB,KAAO,EAAGuP,EAAMwV,UAAU/kB,OAC7EysB,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAG0C,aAAa3B,IAAcE,KAAKkJ,EAAKld,MAAMrF,IAAIoB,QAAQmhB,EAAKld,MAAMwV,UAAU/kB,SACjGqqB,YAASoC,EAAKld,MAAOkd,EAAK5C,aA4BjC4b,IAAIy8B,QAAQC,KAAKC,cAAcC,2BACjCN,EAAc3iE,MAlBa,SAACmQ,EAAOsa,EAAU4C,GAAS,MAC7Bld,EAAMwV,UAAzB7C,EADgD,EAChDA,MAAOD,EADyC,EACzCA,QACb,GAA+B,cAA3BC,EAAMlhB,OAAOuE,KAAKzI,OAAyBolB,EAAM9W,WAAW6W,GAAU,OAAO,EAEjF,IAAMpZ,EAAa0G,EAAMwV,UAAU9d,MAAM4B,WACnCD,EAAY2G,EAAMwV,UAAU9d,MAAM2B,UAExC,GAAIC,GAAcA,EAAWjH,MAAsC,OAA9BiH,EAAWjH,KAAKzC,OAAO,GAC1D,OAAO2iE,EAAgBr1C,EAAKld,MAAOkd,EAAK5C,WAC/BhhB,GAAeA,EAAWjH,MAASgH,IAC5C6jB,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAX,OAAqB/S,EAAMwV,UAAU/kB,KAAO,EAAGuP,EAAMwV,UAAU/kB,OAC7EysB,EAAK5C,SAAS4C,EAAKld,MAAM+S,GAAG0C,aAAa3B,IAAcE,KAAKkJ,EAAKld,MAAMrF,IAAIoB,QAAQmhB,EAAKld,MAAMwV,UAAU/kB,aAU5G,IAAMsiE,EAAcj2C,IAAa,WAAb,EAAiB01C,GAErC,MAAO,CAEL,QAAS9sB,EACT,QAAShB,EACT,cAAeA,EACfsuB,UAAWlmC,KAEX,QAAS1Q,YAAWlnB,EAAO8B,MAAMw3B,QACjC,QAASpS,YAAWlnB,EAAO8B,MAAMu3B,IACjC,QAASnS,YAAWlnB,EAAO8B,MAAM4jB,MACjC,cAAewB,YAAWlnB,EAAO8B,MAAMooC,QACvC,QAAShjB,YAAWlnB,EAAO8B,MAAM6B,KACjC,QAASujB,YAAWlnB,EAAO8B,MAAMqoC,KACjC,QAASjjB,YAAWlnB,EAAO8B,MAAMmoC,gBAEjC,cAAergB,YAAW5pB,EAAOO,MAAMkpB,aACvC,cAAeG,YAAW5pB,EAAOO,MAAMmpB,cACvC,QAAS5C,YAAO9mB,EAAOO,MAAM2S,YAE7B,eAAgB8T,YAAahnB,EAAOO,MAAMi4B,WAC1C,eAAgBxR,YAAahnB,EAAOO,MAAMm4B,QAAS,CAAErd,MAAO,IAC5D,eAAgB2L,YAAahnB,EAAOO,MAAMm4B,QAAS,CAAErd,MAAO,IAC5D,eAAgB2L,YAAahnB,EAAOO,MAAMm4B,QAAS,CAAErd,MAAO,IAC5D,eAAgB2L,YAAahnB,EAAOO,MAAMm4B,QAAS,CAAErd,MAAO,IAC5D,eAAgB2L,YAAahnB,EAAOO,MAAMm4B,QAAS,CAAErd,MAAO,IAC5D,eAAgB2L,YAAahnB,EAAOO,MAAMm4B,QAAS,CAAErd,MAAO,IAC5D,gBAAiB2L,YAAahnB,EAAOO,MAAMo4B,YAE3C,QAASiH,YAAa5/B,EAAOO,MAAMy4B,WACnC,QAAS4G,YAAa5/B,EAAOO,MAAMy4B,WACnC,QAASsG,YAAat/B,EAAOO,MAAMy4B,WACnC,cAAesG,YAAat/B,EAAOO,MAAMy4B,WACzC+kC,MAAOF,EACP,cAAej2C,YAAcnC,IAAe43C,IH9BTW,CAAehkE,KAAKgG,UAEvDkpC,EAAMhtB,IAAI,aAAcmrB,YAAO/e,MAE/B4gB,EAAMhtB,IAAI,eCvE4B/e,EDuEKnD,KAAKwG,MAAM6qC,YCtEjD,IAAIzmB,IAAO,CAChBC,MAAO,CACLsvC,YAAa,SAACrpD,GACZ,IAAMqpD,EAAc,GAEpB,GAA6B,IAAzBrpD,EAAMrF,IAAItJ,WAAkB,CAC9B,IAAMkB,EAAOyN,EAAMrF,IAAIhJ,MAAM,GACzBY,EAAKyD,KAAKtD,SAA+B,IAApBH,EAAKlB,YAAoBkB,EAAKyD,MAAQgK,EAAM9K,OAAOO,MAAMi4B,WAChF27B,EAAYx5D,KACVi5D,GAAWv2D,KAAK,EAAGA,EAAKvB,SAAU,CAChC0uC,MAAO,cACP,cAAertC,KAMvB,OAAO82D,GAAc76D,OAAO0R,EAAMrF,IAAK0uD,SDuD3CjrB,EAAMhtB,IAAI,UAAWqzB,KAErBrG,EAAMhtB,IAAI,WI3EL,IAAI0I,IAAO,CAChBvrB,IAAK,IAAI8rB,IAAU,YAEnBN,MAAO,CACLs+B,SAAU,SAACr4C,GACT,OAAQA,EAAMmzD,YAIlBnzD,MAAO,CACL+X,KADK,SACAG,GACH,OAAOA,EAAO0gC,UAGhB5gC,MALK,SAKCjF,EAAIqgD,GACR,IAAMxa,EAAW7lC,EAAG4E,QAAQ,YAE5B,YAAiBpoB,IAAbqpD,EACKA,EAGFwa,OJwDXh1B,EAAMhtB,IAAI,qBHxEL,IAAI0I,IAAO,CAChBC,MAAO,CACLs5C,oBADK,SACe/iC,GAClB,IAAM31B,EAAMyQ,GAAOkoD,gBAAgBhjC,EAAM,aAOzC,OANA31B,EAAI44D,iBAAiB,OAAOljE,SAAQ,SAACkC,GAC/By+D,GAAejuD,KAAKxQ,EAAKg5B,MAC3Bh5B,EAAK5C,YAIFgL,EAAI2rC,gBAAgBktB,eGgE/Bp1B,EAAMhtB,IAAI,mBL/DK,IAAZpM,IAAqBA,EAAU,IAE7B,IAAI,IAAO,CAChBkY,KAAM,SAAc0jB,GAAc,OAAO,IAAIouB,GAAepuB,EAAY57B,QK8DxEo5B,EAAMhtB,IAAI,YJwDL,IAAI,IAAO,CAChB2I,MAAO,CACLsvC,YAAa0H,GAEb0C,uBAAwB,SAAgCC,EAAOhhD,EAASC,GACtE,GAAID,EAAQhhB,KAAOihB,EAAMjhB,KAAO,GAAUq3D,MAAMp2C,GAAU,OAAO,IAAI,GAAUA,IAGjFm+C,YAAaA,GACbr0B,cAAeA,OI/DjB2B,EAAMhtB,IAAI,QEpFqBghD,EFoFFljE,KAAKwG,MAAM08D,UEnFnC,IAAIt4C,IAAO,CAChBoD,KADgB,SACX0jB,GAEH,OADAwxB,EAAUzxB,iBAAiBC,GACpBwxB,OFkFTh0B,EAAMhtB,IAAI,iBFrEwBlc,EEqEOhG,KAAKgG,OFpEzC,IAAI4kB,IAAO,CAChBC,MAAO,CACL45C,cAAe1C,GAAQ/7D,GACvB0+D,oBAAqB3C,GAAQ/7D,QEmExBkpC,G,EAGTuzB,iBAAA,WACE,IAAMjiE,EAAOR,KAEb,MAAO,CACL8Q,MAAO9Q,KAAK8Q,MACZ+uD,oBAFK,SAEe9tB,GAClB,IAAIhoB,EAAW/pB,KAAK8Q,MAAMgY,MAAMipB,GAChC/xC,KAAKw+C,YAAYz0B,GAEjB,IAAM46C,EAAS3kE,KAAK8Q,MAAMrF,IACpBm5D,EAAkBpkE,EAAKqkE,iBAAiBF,EAAQnkE,EAAKwF,QAC3DxF,EAAKgG,MAAMs8D,QAAQ8B,M,EAKzBzB,gBAAA,SAAgBn9D,GACd,OD5EW,SAAyBA,GACtC,IA9BsBoJ,EAoDtB,MAtBc,CACZ2uB,MA/BoB3uB,EAgCLpJ,EAAOO,MAAM2S,WA/BvB8kB,aAAkB,WAAY5uB,IAgCnC4yD,GAAgBh8D,EAAOO,MAAMmpB,cAC7BuyC,GAAej8D,EAAOO,MAAMkpB,aAC5ByyC,GAAcl8D,EAAOO,MAAMo4B,YAC3BwjC,GAAYn8D,EAAOO,MAAMm4B,QAAS,GAClC2jC,GAAiBr8D,EAAOO,MAAMupC,SAC9BzgB,YAAc,0BAA2BrpB,EAAOO,MAAMk4B,iBACtDP,aAAuB,cAAel4B,EAAOO,MAAMwpC,YACnDrhB,YAAc,mCAAoC1oB,EAAO8B,MAAMw3B,QAC/D5Q,YAAc,yBAA0B1oB,EAAO8B,MAAMu3B,IACrD3Q,YAAc,2BAA4B1oB,EAAO8B,MAAMu3B,IACvD3Q,YAAc,qBAAsB1oB,EAAO8B,MAAM4jB,MACjDgD,YAAc,uBAAwB1oB,EAAO8B,MAAMooC,QACnDxhB,YAAc,yBAA0B1oB,EAAO8B,MAAM6B,KACrD+kB,YAAc,uBAAwB1oB,EAAO8B,MAAMqoC,KACnDzhB,YAAc,4BAA6B1oB,EAAO8B,MAAMmoC,gBACxDvhB,YAAc,oBAAqB1oB,EAAO8B,MAAMmoC,gBAChDvhB,YAAc,uBAAwB1oB,EAAO8B,MAAMsoC,cCwD5C+yB,CAAgBn9D,I,EAGzBg9D,kBAAA,SAAkB7/D,GAChB,OAAOnD,KAAKkc,OAAOpM,MAAM3M,I,EAG3B0hE,iBAAA,SAAiBp5D,GACf,OAAOzL,KAAKovD,WAAW1tB,UAAUj2B,EAAK,CAAE63B,YAAY,K,EAUtDwhC,aAAA,SAAatE,GACXxgE,KAAK+kE,kBAAkBvE,EAAUA,I,EAQnCwE,kBAAA,WACE,MAAO,CAAChlE,KAAKguB,KAAKld,MAAMwV,UAAU/kB,KAAMvB,KAAKguB,KAAKld,MAAMwV,UAAUjkB,K,EAMpE4iE,cAAA,SAAc1lE,GACZ,IAAMukB,EAAW9jB,KAAKguB,KAAKld,MAAMwV,UAAU9d,MAAM4B,WAEjD,OAAK0Z,GAAaA,EAAS3gB,KAEpB2gB,EAAS3gB,KAAKzC,MAAMkC,KAAKC,IAAI,EAAGihB,EAAS3gB,KAAKhD,OAASZ,IAFtB,I,EAU1C2lE,eAAA,SAAe/hE,EAAM8/B,GACnBjjC,KAAKsK,SAAStK,KAAKglE,oBAAoB,GAAI7hE,EAAM8/B,GACjDiF,EAAEloC,KAAKguB,KAAKvW,KAAK23B,QAAQ,U,EAS3B9kC,SAAA,SAAS9H,EAAKW,EAAM8/B,GAClBjjC,KAAKmlE,cAAc3iE,EAAKA,EAAKW,EAAM8/B,I,EAcrCkiC,cAAA,SAAcxiE,EAAOD,EAAKS,EAAM8/B,GAAe,oBAAfA,OAAS,GACvC,IAAImiC,EAAmB,EAEnBniC,EACFjjC,KAAKguB,KAAK5C,SAASprB,KAAKguB,KAAKld,MAAM+S,GAAG0E,WAAWplB,EAAMR,EAAOD,KAE9DC,GAAS,EACT3C,KAAKguB,KAAK5C,SAASprB,KAAKguB,KAAKld,MAAM+S,GAAGU,iBAAiB5hB,EAAOD,EAAK1C,KAAKgjE,kBAAkB7/D,KAE1FiiE,EAAmBjiE,EAAKoL,MAAM,QAAQ,GAAGgF,MAAM,MAAMpT,OAAS,GAIhEH,KAAK8kE,aAAaliE,KAAKE,IAAIH,EAAQQ,EAAKhD,OAAQojB,IAAU2B,MAAMllB,KAAKguB,KAAKld,MAAMrF,KAAKpJ,KACrFnE,EAAE4/D,SAGE36D,EAAKkiE,SAAS,OAASpiC,GACzBjjC,KAAKklE,eAAe,KAGtBj/D,MAAMm/D,GACH1pD,KAAK,GACLva,SAAQ,WACPmtB,IAAU,MAAU,EAAKN,KAAKld,MAAO,EAAKkd,KAAK5C,c,EAUrDk6C,oBAAA,SAAoB3iE,EAAOQ,EAAM8/B,GAC/BjjC,KAAKmlE,cAAcxiE,EAAO3C,KAAKglE,oBAAoB,GAAI7hE,EAAM8/B,I,EAU/D8hC,kBAAA,SAAkBpiE,EAAOD,GACvB,IAAMwG,EAASlJ,KAAKguB,KAAKld,MAAM+S,GAAGpY,IAAIoB,QAAQlK,GACxCwG,EAAOnJ,KAAKguB,KAAKld,MAAM+S,GAAGpY,IAAIoB,QAAQnK,GAE5C1C,KAAKguB,KAAK5C,SAASprB,KAAKguB,KAAKld,MAAM+S,GAAG0C,aAAa,IAAI3B,IAAc1b,EAAQC,KAC7EnJ,KAAK8uC,S,EAGPy2B,oBAAA,SAAoB/E,GAClB,IAAMgF,EAAiBxlE,KAAKguB,KAAKsvB,YAAYkjB,GACvCiF,EAAuBzlE,KAAKguB,KAAKvW,IAAI8hC,wBAC3C,MAAO,CACL3G,KAAM4yB,EAAe5yB,KAAO6yB,EAAqB7yB,KACjDj2B,IAAK6oD,EAAe7oD,IAAM8oD,EAAqB9oD,M,EAInDmyB,MAAA,WACE9uC,KAAKguB,KAAK8gB,S,EAEZ8C,QAAA,WACE5xC,KAAKguB,KAAK4jB,W,EAGZ8X,SAAA,SAASA,GACP1pD,KAAKguB,KAAK5C,SAASprB,KAAKguB,KAAKld,MAAM+S,GAAG2E,QAAQ,WAAYkhC,K,4JK9O9D,SAASgc,EAAiBxqC,GACxB,OAAQA,GACN,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACH,OAAO,EACT,QACE,OAAO,GAIb,IAAMyqC,EAAW,SAAC70D,EAAO80D,GAGvB,IAFA,IAAIpjE,EAAMsO,EAAMtO,IAETA,EAAMsO,EAAM+0D,SAAWH,EAAiB50D,EAAMurB,IAAI/jB,WAAW9V,KAClEA,IAGF,OAAIA,IAAQsO,EAAMtO,MAIbojE,IACH90D,EAAMkL,SAAWlL,EAAMurB,IAAI37B,MAAMoQ,EAAMtO,IAAKA,IAG9CsO,EAAMtO,IAAMA,GAEL,IAGM,WAAUsjE,GACvBA,EAAGzyD,OAAO0yD,MAAMl6D,OAAO,OAAQ,UAAW85D,GAC1CG,EAAGzyD,OAAO0yD,MAAMC,QAAQ,S,OC5D1B,SAASC,EAAcnwD,EAAShF,EAAOo1D,EAAWC,EAASP,GAGzD,IAAIQ,EACFlrC,EACAp9B,EACAuoE,EACAtoE,EACAuoE,EACA1iC,EACA2iC,EACA7/D,EACA8/D,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACApnC,EACAqnC,EACAC,EAAap2D,EAAMq2D,QACnB3kE,EAAMsO,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,GAC7CrjE,EAAMiO,EAAMw2D,OAAOpB,GAGrB,GAAIp1D,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,WAAa,EAC/C,OAAO,EAIT,GAAkC,KAA9B12D,EAAMurB,IAAI/jB,WAAW9V,KAA0BsT,EAAQ2xD,mBAAmB5zD,KAAK/C,EAAMurB,IAAI75B,EAAM,IACjG,OAAO,EAOT,GAJAA,GAAOsT,EAAQssB,OAAOjiC,OAIlBylE,EACF,OAAO,EAITS,EAAU3/D,EAASoK,EAAMy2D,OAAOrB,GAAa1jE,GAAOsO,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,IAGzD,KAA9Bp1D,EAAMurB,IAAI/jB,WAAW9V,IAGvBA,IACA6jE,IACA3/D,IACA0/D,GAAY,EACZU,GAAmB,GACoB,IAA9Bh2D,EAAMurB,IAAI/jB,WAAW9V,IAC9BskE,GAAmB,GAEdh2D,EAAM42D,QAAQxB,GAAax/D,GAAU,GAAM,GAG9ClE,IACA6jE,IACA3/D,IACA0/D,GAAY,GAKZA,GAAY,GAGdU,GAAmB,EAOrB,IACIa,GAAmB,EACnBC,GAAY,EACZC,EAASrlE,EACb,GAJmC,OAAnBsT,EAAQssB,OAKtB,KAAO5/B,EAAMK,GAAK,CAGhB,GAFAq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,GAEtBmlE,GAA2B,KAAPzsC,EACtB,OAAO,EACF,GAAW,KAAPA,EACT0sC,GAAY,MACP,IAAIA,GAAoB,KAAP1sC,EACtB,MACK,GAAW,KAAPA,EACTysC,GAAmB,MACd,IAAW,KAAPzsC,EACT,MAEAysC,GAAmB,EACnBC,GAAY,GAGdplE,IASJ,IANAA,EAAMqlE,EAGNrB,EAAY,CAAC11D,EAAMs2D,OAAOlB,IAC1Bp1D,EAAMs2D,OAAOlB,GAAa1jE,EAEnBA,EAAMK,IACXq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,GAEtB+5B,kBAAQrB,KACC,IAAPA,EACFx0B,GAAU,GAAMA,EAASoK,EAAM42D,QAAQxB,IAAcE,EAAY,EAAI,IAAM,EAE3E1/D,IAMJlE,IAwCF,IArCAikE,EAAa,CAAC31D,EAAM42D,QAAQxB,IAC5Bp1D,EAAM42D,QAAQxB,GAAap1D,EAAMy2D,OAAOrB,GAAa,GAAKY,EAAmB,EAAI,GAEjFR,EAAgB9jE,GAAOK,EAEvB+jE,EAAY,CAAC91D,EAAMy2D,OAAOrB,IAC1Bp1D,EAAMy2D,OAAOrB,GAAax/D,EAAS2/D,EAEnCQ,EAAY,CAAC/1D,EAAMu2D,OAAOnB,IAC1Bp1D,EAAMu2D,OAAOnB,GAAa1jE,EAAMsO,EAAMs2D,OAAOlB,GAE7Cc,EAAkBl2D,EAAMg1D,GAAG1lD,MAAM2lD,MAAM+B,SAAS,WAEhDnB,EAAgB71D,EAAM8lB,WAGtB9lB,EAAM8lB,WAAa,UACnBqwC,GAAe,EAoBVV,EAAWL,EAAY,EAAGK,EAAWJ,IASpCr1D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,YAAWP,GAAe,MAE7DzkE,EAAMsO,EAAMs2D,OAAOb,GAAYz1D,EAAMu2D,OAAOd,MAC5C1jE,EAAMiO,EAAMw2D,OAAOf,MAZ8BA,IAqBjD,GAFA/jE,GAAOsT,EAAQssB,OAAOjiC,OAGkC,KAAtD2Q,EAAMurB,IAAI/jB,WAAW9V,EAAMsT,EAAQssB,OAAOjiC,UAC1C2V,EAAQ2xD,mBAAmB5zD,KAAK/C,EAAMurB,IAAI75B,EAAMsT,EAAQssB,OAAOjiC,OAAS,KACvE8mE,EAHH,CAwEA,GAAIX,EACF,MAKF,IADAS,GAAY,EACPjpE,EAAI,EAAGC,EAAIipE,EAAgB7mE,OAAQrC,EAAIC,EAAGD,IAC7C,GAAIkpE,EAAgBlpE,GAAGgT,EAAOy1D,EAAUJ,GAAS,GAAO,CACtDY,GAAY,EACZ,MAIJ,GAAIA,EAAW,CAKbj2D,EAAMq2D,QAAUZ,EAEQ,IAApBz1D,EAAM02D,YAIRhB,EAAU7lE,KAAKmQ,EAAMs2D,OAAOb,IAC5BE,EAAW9lE,KAAKmQ,EAAM42D,QAAQnB,IAC9BM,EAAUlmE,KAAKmQ,EAAMu2D,OAAOd,IAC5BK,EAAUjmE,KAAKmQ,EAAMy2D,OAAOhB,IAC5Bz1D,EAAMy2D,OAAOhB,IAAaz1D,EAAM02D,WAGlC,MAGFhB,EAAU7lE,KAAKmQ,EAAMs2D,OAAOb,IAC5BE,EAAW9lE,KAAKmQ,EAAM42D,QAAQnB,IAC9BM,EAAUlmE,KAAKmQ,EAAMu2D,OAAOd,IAC5BK,EAAUjmE,KAAKmQ,EAAMy2D,OAAOhB,IAI5Bz1D,EAAMy2D,OAAOhB,IAAa,MAjH1B,CA0CE,IAlCAF,EAAU3/D,EAASoK,EAAMy2D,OAAOhB,GAAY/jE,GAAOsO,EAAMs2D,OAAOb,GAAYz1D,EAAMu2D,OAAOd,IAGvD,KAA9Bz1D,EAAMurB,IAAI/jB,WAAW9V,IAGvBA,IACA6jE,IACA3/D,IACA0/D,GAAY,EACZU,GAAmB,GACoB,IAA9Bh2D,EAAMurB,IAAI/jB,WAAW9V,IAC9BskE,GAAmB,GAEdh2D,EAAM42D,QAAQnB,GAAY7/D,GAAU,GAAM,GAG7ClE,IACA6jE,IACA3/D,IACA0/D,GAAY,GAKZA,GAAY,GAGdU,GAAmB,EAGrBN,EAAU7lE,KAAKmQ,EAAMs2D,OAAOb,IAC5Bz1D,EAAMs2D,OAAOb,GAAY/jE,EAElBA,EAAMK,IACXq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,GAEtB+5B,kBAAQrB,KACC,IAAPA,EACFx0B,GAAU,GAAMA,EAASoK,EAAM42D,QAAQnB,IAAaH,EAAY,EAAI,IAAM,EAE1E1/D,IAMJlE,IAGF8jE,EAAgB9jE,GAAOK,EAEvB4jE,EAAW9lE,KAAKmQ,EAAM42D,QAAQnB,IAC9Bz1D,EAAM42D,QAAQnB,GAAYz1D,EAAMy2D,OAAOhB,GAAY,GAAKO,EAAmB,EAAI,GAE/EF,EAAUjmE,KAAKmQ,EAAMy2D,OAAOhB,IAC5Bz1D,EAAMy2D,OAAOhB,GAAY7/D,EAAS2/D,EAElCQ,EAAUlmE,KAAKmQ,EAAMu2D,OAAOd,IAC5Bz1D,EAAMu2D,OAAOd,GAAY/jE,EAAMsO,EAAMs2D,OAAOb,GAmEhD,IAlBAG,EAAY51D,EAAM02D,UAClB12D,EAAM02D,UAAY,GAElB5nC,EAAQ9uB,EAAMnQ,KAAKmV,EAAQzX,KAAO,QAASyX,EAAQzX,KAAM,IACnD+jC,OAAStsB,EAAQssB,OACvBxC,EAAMt+B,IAAMsiC,EAAQ,CAACsiC,EAAW,GAEhCp1D,EAAMg1D,GAAG1lD,MAAMulD,SAAS70D,EAAOo1D,EAAWK,IAE1C3mC,EAAQ9uB,EAAMnQ,KAAKmV,EAAQzX,KAAO,SAAUyX,EAAQzX,MAAO,IACrD+jC,OAAStsB,EAAQssB,OAEvBtxB,EAAMq2D,QAAUD,EAChBp2D,EAAM8lB,WAAa+vC,EACnB/iC,EAAM,GAAK9yB,EAAMi3D,KAIZjqE,EAAI,EAAGA,EAAI+oE,EAAU1mE,OAAQrC,IAChCgT,EAAMs2D,OAAOtpE,EAAIooE,GAAaM,EAAU1oE,GACxCgT,EAAMu2D,OAAOvpE,EAAIooE,GAAaW,EAAU/oE,GACxCgT,EAAMy2D,OAAOzpE,EAAIooE,GAAaU,EAAU9oE,GACxCgT,EAAM42D,QAAQ5pE,EAAIooE,GAAaO,EAAW3oE,GAI5C,OAFAgT,EAAM02D,UAAYd,GAEX,EAGT,SAASsB,EAAUl3D,EAAOo1D,EAAWC,EAASP,GAC5C,OAAOK,EACL,CACEwB,mBAAoB,IACpBrlC,OAAQ,KACR/jC,KAAM,WAERyS,EACAo1D,EACAC,EACAP,GAIJ,SAASqC,EAAan3D,EAAOo1D,EAAWC,EAASP,GAC/C,OAAOK,EACL,CACEwB,mBAAoB,OACpBrlC,OAAQ,IACR/jC,KAAM,cAERyS,EACAo1D,EACAC,EACAP,GAQW,SAASsC,EAAapC,GAKnCA,EAAG1lD,MAAM2lD,MAAMoC,UAAUhnE,SAAQ,SAACvC,GAChC,IAAMwpE,EAAUxpE,EAAEsgC,IAAItuB,QAAQ,cAC1Bw3D,GAAW,GAEbxpE,EAAEsgC,IAAIt+B,OAAOwnE,EAAS,EAAG,cAG7BtC,EAAG1lD,MAAM2lD,MAAMl6D,OAAO,aAAc,UAAWm8D,EAAW,CAExD9oC,IAAK,CAAC,YAAa,YAAa,UAAW,aAAc,UAG3D4mC,EAAG1lD,MAAM2lD,MAAMp5C,GAAG,aAAcs7C,EAAc,CAC5C/oC,IAAK,CAAC,YAAa,YAAa,UAAW,aAAc;;;;;;;;;;;;;;;;;;;;;;;;;q0BC7W7D,IAiDMmpC,EAAc,SAACv3D,EAAOw3D,GAG1B,IAFA,IAEA,EAFMC,EAAc,GAEpB,IAAyBD,KAAzB,aAAqC,KAA1BE,EAA0B,QACnC,GArDW,MAqDPA,EAAWC,SACS,IAApBD,EAAW9lE,IAAf,CAEA,IAAMgmE,EAAWJ,EAAWE,EAAW9lE,KAEjCimE,EAAS73D,EAAMwC,OAAOk1D,EAAW5oC,OACvC+oC,EAAO7hE,KAAO,sBACd6hE,EAAOtxD,IAAM,OACbsxD,EAAOniE,MAAQ,CAAC,CAAC,QAAS,mBAC1BmiE,EAAOC,QAAU,EACjBD,EAAOvmC,OAAS,KAChBumC,EAAO5oE,QAAU,GAEjB,IAAM8oE,EAAS/3D,EAAMwC,OAAOo1D,EAAS9oC,OACrCipC,EAAO/hE,KAAO,uBACd+hE,EAAOxxD,IAAM,OACbwxD,EAAOD,SAAW,EAClBC,EAAOzmC,OAAS,KAChBymC,EAAO9oE,QAAU,GAE6B,SAA1C+Q,EAAMwC,OAAOo1D,EAAS9oC,MAAQ,GAAG94B,MAAgE,MAA7CgK,EAAMwC,OAAOo1D,EAAS9oC,MAAQ,GAAG7/B,SACvFwoE,EAAY5nE,KAAK+nE,EAAS9oC,MAAQ,IAUtC,KAAO2oC,EAAYpoE,QAAQ,CAIzB,IAHA,IAAMrC,EAAIyqE,EAAY/0D,MAClB3O,EAAI/G,EAAI,EAEL+G,EAAIiM,EAAMwC,OAAOnT,QAAmC,yBAAzB2Q,EAAMwC,OAAOzO,GAAGiC,MAChDjC,IAKF,GAAI/G,MAFJ+G,EAEa,CACX,IAAM+6B,EAAQ9uB,EAAMwC,OAAOzO,GAC3BiM,EAAMwC,OAAOzO,GAAKiM,EAAMwC,OAAOxV,GAC/BgT,EAAMwC,OAAOxV,GAAK8hC,KAKT,WAAUkmC,EAAIgD,QAAwB,IAAxBA,OAAiB,GAC5ChD,EAAGzyD,OAAO0yD,MAAMl6D,OAAO,WAAY,sBArGpB,SAACi9D,GAAD,OAAoB,SAACh4D,EAAO80D,GAC3C,GAAIA,EAAQ,OAAO,EAEnB,IAAMjjE,EAAQmO,EAAMtO,IACdimE,EAAS33D,EAAMurB,IAAI/jB,WAAW3V,GAEpC,GARa,MAQT8lE,EAAmB,OAAO,EAE9B,IAAMM,EAAUj4D,EAAMk4D,WAAWl4D,EAAMtO,KAAK,GACxCsrB,EAAMi7C,EAAQ5oE,OACZ+6B,EAAKZ,OAAOC,aAAakuC,GAE/B,GAAI36C,EAAM,EAAG,OAAO,EAEpB,IAAIm7C,GAAQ,EACZ,GAAIn7C,EAAM,EAAG,CAEX,GADAm7C,GAAQ,GACHH,EACWh4D,EAAMnQ,KAAK,OAAQ,GAAI,GAC/BZ,QAAUm7B,EAElBpN,IAGF,IAAK,IAAIhwB,EAAI,EAAGA,EAAIgwB,EAAKhwB,GAAK,EAAG,CACjBgT,EAAMnQ,KAAK,OAAQ,GAAI,GAC/BZ,QAAUm7B,EAAKA,EAErBpqB,EAAMw3D,WAAW3nE,KAAK,CACpB8nE,SACAtoE,OAAQ,EACR+oE,KAAMprE,EAAI,EACV8hC,MAAO9uB,EAAMwC,OAAOnT,OAAS,EAC7BuC,KAAM,EACNyZ,KAAM4sD,EAAQI,SACd7wC,MAAOywC,EAAQK,YASnB,OALAt4D,EAAMtO,KAAOumE,EAAQ5oE,OACjB8oE,GAASH,GACXh4D,EAAMtO,OAGD,GAyDmDmjE,CAASmD,IACnEhD,EAAGzyD,OAAOg2D,OAAOx9D,OAAO,WAAY,uBAAuB,SAACiF,GAG1D,GAFAu3D,EAAYv3D,EAAOA,EAAMw3D,YAEpBx3D,EAAMw4D,YACX,cAAmBx4D,EAAMw4D,eAAzB,aAAsC,KAA3B7hD,EAA2B,QAChCA,GAAQA,EAAK6gD,YACfD,EAAYv3D,EAAO2W,EAAK6gD,iB,k0BC7FhC,SAASD,EAAYv3D,EAAOw3D,GAC1B,IAAIxqE,EACF0qE,EACAE,EACA9oC,EAGF,IAAK9hC,EAFGwqE,EAAWnoE,OAEJ,EAAGrC,GAAK,EAAGA,IAGE,SAF1B0qE,EAAaF,EAAWxqE,IAET2qE,SAKS,IAApBD,EAAW9lE,MAIfgmE,EAAWJ,EAAWE,EAAW9lE,MAEjCk9B,EAAQ9uB,EAAMwC,OAAOk1D,EAAW5oC,QAC1B94B,KAAO,sBAEb84B,EAAMgpC,QAAU,EAChBhpC,EAAMwC,OAAS,KACfxC,EAAM7/B,QAAU,IAEhB6/B,EAAQ9uB,EAAMwC,OAAOo1D,EAAS9oC,QACxB94B,KAAO,uBAEb84B,EAAMgpC,SAAW,EACjBhpC,EAAMwC,OAAS,KACfxC,EAAM7/B,QAAU,IAIL,eAAU+lE,EAAIgD,QAAwB,IAAxBA,OAAiB,GAC5ChD,EAAGzyD,OAAO0yD,MAAMl6D,OAAO,WAAY,uBA/EA,SAACiF,EAAO80D,GAC3C,GAAIA,EAAQ,OAAO,EAEnB,IACE/iE,EAAMiO,EAAM+0D,OACZljE,EAAQmO,EAAMtO,IAEhB,OAAoC,KAAhCsO,EAAMurB,IAAI/jB,WAAW3V,IAA2BA,EAAQ,GAAKE,GAA2C,KAApCiO,EAAMurB,IAAI/jB,WAAW3V,EAAQ,IACzFmO,EAAMk4D,WAAWl4D,EAAMtO,KAAK,GACtCsO,EAAMnQ,KAAK,OAAQ,GAAI,GACvBmQ,EAAMw3D,WAAW3nE,KAAK,CACpB8nE,OAAQ,MACRtoE,OAAQ,EACR+oE,KAAM,EACNtpC,MAAO9uB,EAAMwC,OAAOnT,OAAS,EAC7BuC,KAAM,EACNyZ,MAAM,EACNmc,OAAO,IAETxnB,EAAMtO,KAAO,GACN,GAG2B,KAAhCsO,EAAMurB,IAAI/jB,WAAW3V,IAA2BA,EAAQ,GAAKE,GAA2C,KAApCiO,EAAMurB,IAAI/jB,WAAW3V,EAAQ,KACnGmO,EAAMnQ,KAAK,OAAQ,GAAI,GACvBmQ,EAAMw3D,WAAW3nE,KAAK,CACpB8nE,OAAQ,MACRtoE,OAAQ,EACR+oE,KAAM,EACNtpC,MAAO9uB,EAAMwC,OAAOnT,OAAS,EAC7BuC,KAAM,EACNyZ,MAAM,EACNmc,OAAO,IAETxnB,EAAMtO,KAAO,GACN,MA6CTsjE,EAAGzyD,OAAOg2D,OAAOx9D,OAAO,WAAY,uBAAuB,SAACiF,GAG1D,GAFAu3D,EAAYv3D,EAAOA,EAAMw3D,YAEpBx3D,EAAMw4D,YACX,cAAmBx4D,EAAMw4D,eAAzB,aAAsC,KAA3B7hD,EAA2B,QAChCA,GAAQA,EAAK6gD,YACfD,EAAYv3D,EAAO2W,EAAK6gD,iBC9EX/F,E,WACnB,WAAYv8D,GACVhG,KAAKgG,OAASA,E,2BAGhBujE,gBAAA,WACE,MAAO,CAAEnoC,MAAM,I,EAGjBooC,eAAA,WACE,OAAOC,IAAW,aAAczpE,KAAKupE,mBAClCG,OAAO,iBACPC,IAAIC,GACJD,IAAIzB,GACJyB,IAAIE,KACJF,IAAIG,KACJH,IAAII,KACJJ,IAAIK,GACJL,IAAIM,I,EAGTC,YAAA,WACE,sBACK/oC,IAAsB7tB,OAD3B,CAIEzT,EAAG,CACDiO,KAAM,UAIRkzB,UAAW,CAAE39B,KAAM,cAEnBysC,QAAS,CACP1vB,MAAO,WAGT6vB,eAAgB,CACdniC,KAAM,kBAGRnE,IAAK,CACHmE,KAAM,OAGRqiC,IAAK,CACHriC,KAAM,OAGRiiC,WAAY,CACV3vB,MAAO,aACPyf,cAAc,GAGhBuQ,YAAa,CACXtiC,KAAM,cACN+xB,cAAc,M,EAKpBwQ,MAAA,WACE,OAAO,IAAI1P,IAAe3gC,KAAKgG,OAAQhG,KAAKwpE,iBAAkBxpE,KAAKkqE,gB,uOCnElDC,E,iFACZr1D,UAAP,SAAiBtO,GACfA,EAAMioC,gBAAkB,yD,2BAG1BvI,OAAA,SAAOC,GACL,YAAMD,OAAN,UAAaC,GAEbnmC,KAAK8Q,MAAQ9Q,KAAKwG,MAAMsK,O,EAG1Bo9B,SAAA,SAAS/H,GAAO,WACd,YAAM+H,SAAN,UAAe/H,GAEfnmC,KAAKkoC,IAAIiG,GAAG,SAAS,SAAC9a,GAChB6U,EAAE,QAAQwG,GAAG,oBAGf1H,IAAIoH,MAAMO,KAAKV,IAAiB,CAC9BhzB,MAAO,EAAKzU,MAAMggC,QAClB8H,aAAc,EAAK9nC,MAAM4jE,QAAQ9oE,KAAI,SAAC+oE,GACpC,OAAOA,OAGXh3C,EAAEwb,uB,EAKRG,iBAAA,SAAiBjO,GACf,OACE,EAAC,IAAD,CAAS59B,KAAMnD,KAAKwG,MAAMggC,SACxB,cAAOM,IAAK9mC,KAAKwG,MAAMsgC,S,EAK7BmI,QAAA,SAAQC,GACN,OAAO,QAAIzI,UAAW,uDAAwDzmC,KAAKwG,MAAM4jE,U,GAtC5C76B,KCS5B+6B,E,0GACnBpkC,OAAA,SAAOC,GACL,YAAMD,OAAN,UAAaC,GAEbnmC,KAAKuqE,YAAch8C,UAAU8d,UAAU99B,MAAM,aAAe,IAAM,Q,EAEpEyf,KAAA,SAAKmY,GACH,OAAKnmC,KAAKwG,MAAMsK,MAET,SAAK0/B,MAAM,mBAAmBxwC,KAAKkvC,QAAQN,WAFpB,I,EAKhCM,MAAA,WACE,IAAMA,EAAQ,IAAIC,IACZr+B,EAAQ9Q,KAAKwG,MAAMsK,MACnBy5D,EAAcvqE,KAAKuqE,YAkKzB,OAhKAr7B,EAAMhtB,IACJ,YACA0uB,IAAiB45B,UAAU,CACzB1jE,KAAM,YACN0/B,QAASQ,IAAIC,WAAWC,MAAM,uDAC9Bp2B,MAAOA,EACPgF,QAAS,CACP,CACEmF,MAAO,KACPnU,KAAMgK,EAAM6gC,YAAYprC,MAAMm4B,QAC9Bl4B,MAAO,CAAE6a,MAAO,GAChBmlB,QAASQ,IAAIC,WAAWC,MAAM,mDAAoD,CAAEqjC,cAAalpD,MAAO,KAE1G,CACEpG,MAAO,KACPnU,KAAMgK,EAAM6gC,YAAYprC,MAAMm4B,QAC9Bl4B,MAAO,CAAE6a,MAAO,GAChBmlB,QAASQ,IAAIC,WAAWC,MAAM,mDAAoD,CAAEqjC,cAAalpD,MAAO,KAE1G,CACEpG,MAAO,KACPnU,KAAMgK,EAAM6gC,YAAYprC,MAAMm4B,QAC9Bl4B,MAAO,CAAE6a,MAAO,GAChBmlB,QAASQ,IAAIC,WAAWC,MAAM,mDAAoD,CAAEqjC,cAAalpD,MAAO,KAE1G,CACEpG,MAAO,KACPnU,KAAMgK,EAAM6gC,YAAYprC,MAAMm4B,QAC9Bl4B,MAAO,CAAE6a,MAAO,GAChBmlB,QAASQ,IAAIC,WAAWC,MAAM,mDAAoD,CAAEqjC,cAAalpD,MAAO,KAE1G,CACEpG,MAAO,KACPnU,KAAMgK,EAAM6gC,YAAYprC,MAAMm4B,QAC9Bl4B,MAAO,CAAE6a,MAAO,GAChBmlB,QAASQ,IAAIC,WAAWC,MAAM,mDAAoD,CAAEqjC,cAAalpD,MAAO,KAE1G,CACEpG,MAAO,KACPnU,KAAMgK,EAAM6gC,YAAYprC,MAAMm4B,QAC9Bl4B,MAAO,CAAE6a,MAAO,GAChBmlB,QAASQ,IAAIC,WAAWC,MAAM,mDAAoD,CAAEqjC,cAAalpD,MAAO,KAE1G,CACEpG,MAAO,IACPnU,KAAMgK,EAAM6gC,YAAYprC,MAAMi4B,UAC9BgI,QAASQ,IAAIC,WAAWC,MAAM,sDAAuD,CAAEqjC,oBAI7F,KAGFr7B,EAAMhtB,IACJ,OACA+lB,IAAWuiC,UAAU,CACnB1jE,KAAM,OACNggC,KAAM,cACNN,QAASQ,IAAIC,WAAWC,MAAM,iDAAkD,CAAEqjC,gBAClFz5D,MAAOA,EACPhD,KAAMgD,EAAM6gC,YAAY7pC,MAAMw3B,SAEhC,IAGF4P,EAAMhtB,IACJ,SACA+lB,IAAWuiC,UAAU,CACnB1jE,KAAM,SACNggC,KAAM,gBACNN,QAASQ,IAAIC,WAAWC,MAAM,mDAAoD,CAAEqjC,gBACpFz5D,MAAOA,EACPhD,KAAMgD,EAAM6gC,YAAY7pC,MAAMu3B,KAEhC,IAGF6P,EAAMhtB,IACJ,OACA+lB,IAAWuiC,UAAU,CACnB1jE,KAAM,OACNggC,KAAM,cACNN,QAASQ,IAAIC,WAAWC,MAAM,iDAAkD,CAAEqjC,gBAClFz5D,MAAOA,EACPhD,KAAMgD,EAAM6gC,YAAY7pC,MAAM4jB,OAEhC,IAGFwjB,EAAMhtB,IACJ,QACA+jB,IAAcukC,UAAU,CACtB1jE,KAAM,QACNggC,KAAM,oBACNN,QAASQ,IAAIC,WAAWC,MAAM,kDAAmD,CAAEqjC,gBACnFz5D,MAAOA,EACPu1B,QAASvZ,YAAOhc,EAAM6gC,YAAYprC,MAAM2S,cAE1C,IAGFg2B,EAAMhtB,IACJ,OACAuoD,IAAmBD,UAAU,CAC3B1jE,KAAM,OACNggC,KAAM,cACNN,QAASQ,IAAIC,WAAWC,MAAM,kDAC9Bp2B,MAAOA,EACPhD,KAAMgD,EAAM6gC,YAAY7pC,MAAMy3B,OAEhC,IAGF2P,EAAMhtB,IACJ,QACAivB,IAAoBq5B,UAAU,CAC5B1jE,KAAM,QACNggC,KAAM,eACNN,QAASQ,IAAIC,WAAWC,MAAM,mDAC9Bp2B,MAAOA,EACPzN,KAAMyN,EAAM6gC,YAAYprC,MAAM04B,QAEhC,IAGFiQ,EAAMhtB,IACJ,iBACAstB,IAAWg7B,UAAU,CACnB1jE,KAAM,iBACNggC,KAAM,iBACNN,QAASQ,IAAIC,WAAWC,MAAM,2DAA4D,CAAEqjC,gBAC5Fz5D,MAAOA,EACP+e,SAAU/e,EAAM6gC,YAAYprC,MAAMkpB,cAEpC,IAGFyf,EAAMhtB,IACJ,eACAstB,IAAWg7B,UAAU,CACnB1jE,KAAM,eACNggC,KAAM,iBACNN,QAASQ,IAAIC,WAAWC,MAAM,yDAA0D,CAAEqjC,gBAC1Fz5D,MAAOA,EACP+e,SAAU/e,EAAM6gC,YAAYprC,MAAMmpB,eAEpC,IAGFwf,EAAMhtB,IACJ,mBACAioD,EAAoBK,UAAU,CAC5B1jE,KAAM,mBACNggC,KAAM,cACNN,QAASQ,IAAIC,WAAWC,MAAM,8DAC9Bp2B,MAAOA,EACPs5D,QAASpqE,KAAK0qE,cAAc97B,aAIzBM,G,EAGTw7B,YAAA,WACE,ICnM6Bt7D,EAAU5I,EDmMjC0oC,EAAQ,IAAIC,IACZr+B,EAAQ9Q,KAAKwG,MAAMsK,MACnBy5D,EAAcvqE,KAAKuqE,YA+EzB,OA7EAr7B,EAAMhtB,IACJ,SACA+lB,IAAWuiC,UAAU,CACnB1jE,KAAM,SACNggC,KAAM,uBACNN,QAASQ,IAAIC,WAAWC,MAAM,oDAC9Bp2B,MAAOA,EACPhD,KAAMgD,EAAM6gC,YAAY7pC,MAAMooC,UAIlChB,EAAMhtB,IACJ,MACA+lB,IAAWuiC,UAAU,CACnB1jE,KAAM,MACNggC,KAAM,mBACNN,QAASQ,IAAIC,WAAWC,MAAM,gDAAiD,CAAEqjC,gBACjFz5D,MAAOA,EACPhD,KAAMgD,EAAM6gC,YAAY7pC,MAAM6B,OAIlCulC,EAAMhtB,IACJ,MACA+lB,IAAWuiC,UAAU,CACnB1jE,KAAM,MACNggC,KAAM,qBACNN,QAASQ,IAAIC,WAAWC,MAAM,gDAAiD,CAAEqjC,gBACjFz5D,MAAOA,EACPhD,KAAMgD,EAAM6gC,YAAY7pC,MAAMqoC,OAIlCjB,EAAMhtB,IACJ,iBACA+lB,IAAWuiC,UAAU,CACnB1jE,KAAM,iBACNggC,KAAM,mBACNN,QAASQ,IAAIC,WAAWC,MAAM,2DAA4D,CAAEqjC,gBAC5Fz5D,MAAOA,EACPhD,KAAMgD,EAAM6gC,YAAY7pC,MAAMmoC,kBAIlCf,EAAMhtB,IACJ,aACA+jB,IAAcukC,UAAU,CACtB1jE,KAAM,aACNggC,KAAM,kBACNN,QAASQ,IAAIC,WAAWC,MAAM,uDAAwD,CAAEqjC,gBACxFz5D,MAAOA,EACPu1B,QAAS/W,YAAgBxe,EAAM6gC,YAAYprC,MAAMo4B,WAAY7tB,EAAM6gC,YAAYprC,MAAMi4B,cAIzF0Q,EAAMhtB,IACJ,gBACA+jB,IAAcukC,UAAU,CACtB1jE,KAAM,gBACNggC,KAAM,4BACNN,QAASQ,IAAIC,WAAWC,MAAM,0DAA2D,CAAEqjC,gBAC3Fz5D,MAAOA,EACPu1B,QAASrW,YAAWlf,EAAM6gC,YAAYprC,MAAMupC,YAIhDZ,EAAMhtB,IACJ,kBACA+jB,IAAcukC,UAAU,CACtB1jE,KAAM,kBACNggC,KAAM,eACNN,QAASQ,IAAIC,WAAWC,MAAM,6DAC9Bp2B,MAAOA,EACPu1B,SChRyBj3B,EDgRP0B,EAAM6gC,YAAYprC,MAAMk4B,gBC/QzC,SAAU3tB,EAAOsa,GAEtB,OADAA,EAASta,EAAM+S,GAAGuE,qBAAqBhZ,EAAShQ,OAAOoH,MAChD,ODiRA0oC,G,GAtQkC/H,M,gJENxBsjC,E,0GACnBvkC,OAAA,SAAOC,GAAO,WACZ,YAAMD,OAAN,UAAaC,GAEbnmC,KAAKmD,KAAOiuC,IAAO,IAEnBpxC,KAAKw/B,KAAO4R,IAAO,IACnBpxC,KAAKib,MAAQm2B,IAAO,IAEpBpxC,KAAK8Q,MAAMs1B,QACTpmC,KAAKwG,MAAMM,MACX,SAACgK,EAAOsa,GACN,EAAKib,QAAQv1B,EAAOsa,KAEtBprB,KAAKsmC,eAAehnC,KAAKU,OAG3BA,KAAK8xC,gBAAiB,G,EAGxBxoB,OAAA,WACE,IAAM4lB,EAAQ,EAAH,UAAS5lB,OAAT,WAwDX,OAtDItpB,KAAK8xC,iBAAmB9xC,KAAKgT,QAC/Bk8B,EAAMhtB,IACJ,OACA,SAAKukB,UAAU,cACb,WACEA,UAAU,cACVpoC,KAAK,OACLgzC,YAAa9K,IAAYS,IAAIC,WAAWC,MAAM,mEAC9CoK,KAAMtxC,KAAKmD,KACXouC,UAAQ,KAGZ,IAIJrC,EAAMhtB,IACJ,OACA,SAAKukB,UAAU,cACb,WACEA,UAAU,cACVpoC,KAAK,OACLyI,KAAK,MACLuqC,YAAa9K,IAAYS,IAAIC,WAAWC,MAAM,mEAC9CoK,KAAMtxC,KAAKw/B,KACX+R,UAAQ,KAGZ,IAGFrC,EAAMhtB,IACJ,QACA,SAAKukB,UAAU,cACb,WACEA,UAAU,cACVpoC,KAAK,QACLgzC,YAAa9K,IAAYS,IAAIC,WAAWC,MAAM,oEAC9CoK,KAAMtxC,KAAKib,SAGf,IAGEjb,KAAKgT,QACPk8B,EAAMhtB,IACJ,SACA,EAAC,IAAD,CAAQwkB,QAAS1mC,KAAKS,OAAOnB,KAAKU,MAAOymC,UAAU,yBAChDO,IAAIC,WAAWC,MAAM,iEAEvB,IAIEgI,G,EAGTxkC,OAAA,SAAO2oB,GACL,ICzF+BlwB,EAAMuS,EAAUlP,EDyFzCmkE,EAAY,CAAEnrC,KAAMx/B,KAAKw/B,OAAQvkB,MAAOjb,KAAKib,SAE/Cjb,KAAK8xC,iBAAmB9xC,KAAKgT,QAC/BhT,KAAKqmC,SC5FwBljC,ED4FHnD,KAAKmD,OC5FIuS,ED4FI1V,KAAKwG,MAAMsH,KC5FLtH,ED4FWmkE,EC3FrD,SAAU75D,EAAOsa,GACtBA,EAASta,EAAM+S,GAAGuE,qBAAqBtX,EAAM9K,OAAO7C,KAAKA,EAAM,CAACuS,EAAStW,OAAOoH,MAAU,MD4FxFxG,KAAKmD,KAAK,KAEVnD,KAAKqmC,QAAUpW,YAAWjwB,KAAKwG,MAAMsH,KAAM68D,GAG7C3qE,KAAK8Q,MAAMssB,IAAIp9B,KAAKwG,MAAMM,O,EAG5BrG,OAAA,SAAO4yB,GACL6U,EAAE,QAAQkH,QAAQ,SAClBpvC,KAAKqmC,QAAU7Y,YAAWxtB,KAAKwG,MAAMsH,MACrC9N,KAAK8Q,MAAMssB,IAAIp9B,KAAKwG,MAAMM,MAC1BkgC,IAAIqI,SAASC,OAAOR,S,EAGtBxI,eAAA,WACEtmC,KAAKgT,SAAWhT,KAAK8Q,MAAMs3B,WAAWpoC,KAAKwG,MAAMsH,MACjD9N,KAAKkoC,EAAE,oBAAoBC,YAAY,SAAUnoC,KAAKgT,QAEtD,IAAMxM,EAAQxG,KAAK8Q,MAAM+gC,UAAU7xC,KAAKwG,MAAMsH,MAE9C9N,KAAKw/B,KAAKh5B,EAAMg5B,MAChBx/B,KAAKib,MAAMzU,EAAMyU,OAEjBjb,KAAK8xC,eAAiB9xC,KAAK8Q,MAAMghC,kB,GA9GWtD,M,cERhD3wC,EAAOD,QAAQ,s2D,6BCuBf,SAASgtE,IAUP5qE,KAAKmoE,UAAY,GAOjBnoE,KAAK6qE,UAAY,KASnBD,EAAMlrE,UAAUorE,SAAW,SAAUzsE,GACnC,IAAK,IAAIP,EAAI,EAAGA,EAAIkC,KAAKmoE,UAAUhoE,OAAQrC,IACzC,GAAIkC,KAAKmoE,UAAUrqE,GAAGO,OAASA,EAC7B,OAAOP,EAGX,OAAQ,GAMV8sE,EAAMlrE,UAAUqrE,YAAc,WAC5B,IAAIvqE,EAAOR,KACPgrE,EAAS,CAAE,IAGfxqE,EAAK2nE,UAAUhnE,SAAQ,SAAUiW,GAC1BA,EAAK6zD,SAEV7zD,EAAK8nB,IAAI/9B,SAAQ,SAAU+pE,GACrBF,EAAOp6D,QAAQs6D,GAAW,GAC5BF,EAAOrqE,KAAKuqE,SAKlB1qE,EAAKqqE,UAAY,GAEjBG,EAAO7pE,SAAQ,SAAUgqE,GACvB3qE,EAAKqqE,UAAUM,GAAS,GACxB3qE,EAAK2nE,UAAUhnE,SAAQ,SAAUiW,GAC1BA,EAAK6zD,UAENE,GAAS/zD,EAAK8nB,IAAItuB,QAAQu6D,GAAS,GAEvC3qE,EAAKqqE,UAAUM,GAAOxqE,KAAKyW,EAAKg0D,YA+BtCR,EAAMlrE,UAAUitB,GAAK,SAAUtuB,EAAM+sE,EAAIt1D,GACvC,IAAI5R,EAAQlE,KAAK8qE,SAASzsE,GACtBgtE,EAAMv1D,GAAW,GAErB,IAAe,IAAX5R,EAAgB,MAAM,IAAIgD,MAAM,0BAA4B7I,GAEhE2B,KAAKmoE,UAAUjkE,GAAOknE,GAAKA,EAC3BprE,KAAKmoE,UAAUjkE,GAAOg7B,IAAMmsC,EAAInsC,KAAO,GACvCl/B,KAAK6qE,UAAY,MA4BnBD,EAAMlrE,UAAUmM,OAAS,SAAUy/D,EAAYC,EAAUH,EAAIt1D,GAC3D,IAAI5R,EAAQlE,KAAK8qE,SAASQ,GACtBD,EAAMv1D,GAAW,GAErB,IAAe,IAAX5R,EAAgB,MAAM,IAAIgD,MAAM,0BAA4BokE,GAEhEtrE,KAAKmoE,UAAUvnE,OAAOsD,EAAO,EAAG,CAC9B7F,KAAMktE,EACNN,SAAS,EACTG,GAAIA,EACJlsC,IAAKmsC,EAAInsC,KAAO,KAGlBl/B,KAAK6qE,UAAY,MA4BnBD,EAAMlrE,UAAUoM,MAAQ,SAAU0/D,EAAWD,EAAUH,EAAIt1D,GACzD,IAAI5R,EAAQlE,KAAK8qE,SAASU,GACtBH,EAAMv1D,GAAW,GAErB,IAAe,IAAX5R,EAAgB,MAAM,IAAIgD,MAAM,0BAA4BskE,GAEhExrE,KAAKmoE,UAAUvnE,OAAOsD,EAAQ,EAAG,EAAG,CAClC7F,KAAMktE,EACNN,SAAS,EACTG,GAAIA,EACJlsC,IAAKmsC,EAAInsC,KAAO,KAGlBl/B,KAAK6qE,UAAY,MA0BnBD,EAAMlrE,UAAUiB,KAAO,SAAU4qE,EAAUH,EAAIt1D,GAC7C,IAAIu1D,EAAMv1D,GAAW,GAErB9V,KAAKmoE,UAAUxnE,KAAK,CAClBtC,KAAMktE,EACNN,SAAS,EACTG,GAAIA,EACJlsC,IAAKmsC,EAAInsC,KAAO,KAGlBl/B,KAAK6qE,UAAY,MAgBnBD,EAAMlrE,UAAUgqE,OAAS,SAAUjkC,EAAMgmC,GAClCxlE,MAAMC,QAAQu/B,KAASA,EAAO,CAAEA,IAErC,IAAI9jC,EAAS,GAeb,OAZA8jC,EAAKtkC,SAAQ,SAAU9C,GACrB,IAAIqtE,EAAM1rE,KAAK8qE,SAASzsE,GAExB,GAAIqtE,EAAM,EAAG,CACX,GAAID,EAAiB,OACrB,MAAM,IAAIvkE,MAAM,oCAAsC7I,GAExD2B,KAAKmoE,UAAUuD,GAAKT,SAAU,EAC9BtpE,EAAOhB,KAAKtC,KACX2B,MAEHA,KAAK6qE,UAAY,KACVlpE,GAcTipE,EAAMlrE,UAAUisE,WAAa,SAAUlmC,EAAMgmC,GACtCxlE,MAAMC,QAAQu/B,KAASA,EAAO,CAAEA,IAErCzlC,KAAKmoE,UAAUhnE,SAAQ,SAAUiW,GAAQA,EAAK6zD,SAAU,KAExDjrE,KAAK0pE,OAAOjkC,EAAMgmC,IAgBpBb,EAAMlrE,UAAUsmE,QAAU,SAAUvgC,EAAMgmC,GACnCxlE,MAAMC,QAAQu/B,KAASA,EAAO,CAAEA,IAErC,IAAI9jC,EAAS,GAeb,OAZA8jC,EAAKtkC,SAAQ,SAAU9C,GACrB,IAAIqtE,EAAM1rE,KAAK8qE,SAASzsE,GAExB,GAAIqtE,EAAM,EAAG,CACX,GAAID,EAAiB,OACrB,MAAM,IAAIvkE,MAAM,oCAAsC7I,GAExD2B,KAAKmoE,UAAUuD,GAAKT,SAAU,EAC9BtpE,EAAOhB,KAAKtC,KACX2B,MAEHA,KAAK6qE,UAAY,KACVlpE,GAaTipE,EAAMlrE,UAAUooE,SAAW,SAAU8D,GAMnC,OALuB,OAAnB5rE,KAAK6qE,WACP7qE,KAAK+qE,cAIA/qE,KAAK6qE,UAAUe,IAAc,IAGtC/tE,EAAOD,QAAUgtE,G,6BCjVjB,SAASiB,EAAM/kE,EAAMuQ,EAAKuxD,GAMxB5oE,KAAK8G,KAAWA,EAOhB9G,KAAKqX,IAAWA,EAOhBrX,KAAKwG,MAAW,KAOhBxG,KAAKsB,IAAW,KAWhBtB,KAAK4oE,QAAWA,EAOhB5oE,KAAKqhB,MAAW,EAOhBrhB,KAAK+gC,SAAW,KAQhB/gC,KAAKD,QAAW,GAOhBC,KAAKoiC,OAAW,GAOhBpiC,KAAK0gC,KAAW,GAOhB1gC,KAAKynB,KAAW,KAQhBznB,KAAKogB,OAAW,EAQhBpgB,KAAKkhC,QAAW,EASlB2qC,EAAMnsE,UAAUosE,UAAY,SAAmBztE,GAC7C,IAAImI,EAAO1I,EAAGgwB,EAEd,IAAK9tB,KAAKwG,MAAS,OAAQ,EAI3B,IAAK1I,EAAI,EAAGgwB,GAFZtnB,EAAQxG,KAAKwG,OAEWrG,OAAQrC,EAAIgwB,EAAKhwB,IACvC,GAAI0I,EAAM1I,GAAG,KAAOO,EAAQ,OAAOP,EAErC,OAAQ,GASV+tE,EAAMnsE,UAAUqsE,SAAW,SAAkBC,GACvChsE,KAAKwG,MACPxG,KAAKwG,MAAM7F,KAAKqrE,GAEhBhsE,KAAKwG,MAAQ,CAAEwlE,IAUnBH,EAAMnsE,UAAUusE,QAAU,SAAiB5tE,EAAMU,GAC/C,IAAI2sE,EAAM1rE,KAAK8rE,UAAUztE,GACrB2tE,EAAW,CAAE3tE,EAAMU,GAEnB2sE,EAAM,EACR1rE,KAAK+rE,SAASC,GAEdhsE,KAAKwG,MAAMklE,GAAOM,GAUtBH,EAAMnsE,UAAU2hC,QAAU,SAAiBhjC,GACzC,IAAIqtE,EAAM1rE,KAAK8rE,UAAUztE,GAAOU,EAAQ,KAIxC,OAHI2sE,GAAO,IACT3sE,EAAQiB,KAAKwG,MAAMklE,GAAK,IAEnB3sE,GAUT8sE,EAAMnsE,UAAUwsE,SAAW,SAAkB7tE,EAAMU,GACjD,IAAI2sE,EAAM1rE,KAAK8rE,UAAUztE,GAErBqtE,EAAM,EACR1rE,KAAK+rE,SAAS,CAAE1tE,EAAMU,IAEtBiB,KAAKwG,MAAMklE,GAAK,GAAK1rE,KAAKwG,MAAMklE,GAAK,GAAK,IAAM3sE,GAKpDlB,EAAOD,QAAUiuE,G,6BC/LjBhuE,EAAOD,QAAU,EAAQ,K,6BCFzBC,EAAOD,QAAQuuE,OAAS,EAAQ,IAChCtuE,EAAOD,QAAQwuE,OAAS,EAAQ,IAChCvuE,EAAOD,QAAQyuE,OAAS,EAAQ,IAChCxuE,EAAOD,QAAQkS,MAAS,EAAQ,K,cCNhCjS,EAAOD,QAAQ,oI,cCAfC,EAAOD,QAAQ,sB,cCAfC,EAAOD,QAAQ,4D,6BCIf,IAUI0uE,EAAc,kIAEdC,EAAc,mCAMdC,EAAc,IAAI9xC,OAAO,OAAS4xC,EAAW,IAAMC,EAA1B,qHAEzBE,EAAyB,IAAI/xC,OAAO,OAAS4xC,EAAW,IAAMC,EAAY,KAE9E1uE,EAAOD,QAAQ4uE,YAAcA,EAC7B3uE,EAAOD,QAAQ6uE,uBAAyBA,G,6BCsBxC,SAASpE,EAAYv3D,EAAOw3D,GAC1B,IAAIxqE,EAAG+G,EACH2jE,EACAE,EACA9oC,EACA2oC,EAAc,GACd1lE,EAAMylE,EAAWnoE,OAErB,IAAKrC,EAAI,EAAGA,EAAI+E,EAAK/E,IAGO,OAF1B0qE,EAAaF,EAAWxqE,IAET2qE,SAIS,IAApBD,EAAW9lE,MAIfgmE,EAAWJ,EAAWE,EAAW9lE,MAEjCk9B,EAAgB9uB,EAAMwC,OAAOk1D,EAAW5oC,QAClC94B,KAAU,SAChB84B,EAAMvoB,IAAU,IAChBuoB,EAAMgpC,QAAU,EAChBhpC,EAAMwC,OAAU,KAChBxC,EAAM7/B,QAAU,IAEhB6/B,EAAgB9uB,EAAMwC,OAAOo1D,EAAS9oC,QAChC94B,KAAU,UAChB84B,EAAMvoB,IAAU,IAChBuoB,EAAMgpC,SAAW,EACjBhpC,EAAMwC,OAAU,KAChBxC,EAAM7/B,QAAU,GAE8B,SAA1C+Q,EAAMwC,OAAOo1D,EAAS9oC,MAAQ,GAAG94B,MACY,MAA7CgK,EAAMwC,OAAOo1D,EAAS9oC,MAAQ,GAAG7/B,SAEnCwoE,EAAY5nE,KAAK+nE,EAAS9oC,MAAQ,IAUtC,KAAO2oC,EAAYpoE,QAAQ,CAIzB,IAFA0E,GADA/G,EAAIyqE,EAAY/0D,OACR,EAED3O,EAAIiM,EAAMwC,OAAOnT,QAAmC,YAAzB2Q,EAAMwC,OAAOzO,GAAGiC,MAChDjC,IAKE/G,MAFJ+G,IAGE+6B,EAAQ9uB,EAAMwC,OAAOzO,GACrBiM,EAAMwC,OAAOzO,GAAKiM,EAAMwC,OAAOxV,GAC/BgT,EAAMwC,OAAOxV,GAAK8hC,IAvGxB/hC,EAAOD,QAAQ+nE,SAAW,SAAuB70D,EAAO80D,GACtD,IAAI9nE,EAAGirE,EAAgBj7C,EAAKoN,EACxBv4B,EAAQmO,EAAMtO,IACdimE,EAAS33D,EAAMurB,IAAI/jB,WAAW3V,GAElC,GAAIijE,EAAU,OAAO,EAErB,GAAe,MAAX6C,EAA0B,OAAO,EAMrC,GAHA36C,GADAi7C,EAAUj4D,EAAMk4D,WAAWl4D,EAAMtO,KAAK,IACxBrC,OACd+6B,EAAKZ,OAAOC,aAAakuC,GAErB36C,EAAM,EAAK,OAAO,EAQtB,IANIA,EAAM,IACQhd,EAAMnQ,KAAK,OAAQ,GAAI,GACjCZ,QAAUm7B,EAChBpN,KAGGhwB,EAAI,EAAGA,EAAIgwB,EAAKhwB,GAAK,EACRgT,EAAMnQ,KAAK,OAAQ,GAAI,GACjCZ,QAAUm7B,EAAKA,EAErBpqB,EAAMw3D,WAAW3nE,KAAK,CACpB8nE,OAAQA,EACRtoE,OAAQ,EACR+oE,KAAQprE,EACR8hC,MAAQ9uB,EAAMwC,OAAOnT,OAAS,EAC9BuC,KAAS,EACTyZ,KAAQ4sD,EAAQI,SAChB7wC,MAAQywC,EAAQK,YAMpB,OAFAt4D,EAAMtO,KAAOumE,EAAQ5oE,QAEd,GAyETtC,EAAOD,QAAQyqE,YAAc,SAAuBv3D,GAClD,IAAIozD,EACAoF,EAAcx4D,EAAMw4D,YACpBzmE,EAAMiO,EAAMw4D,YAAYnpE,OAI5B,IAFAkoE,EAAYv3D,EAAOA,EAAMw3D,YAEpBpE,EAAO,EAAGA,EAAOrhE,EAAKqhE,IACrBoF,EAAYpF,IAASoF,EAAYpF,GAAMoE,YACzCD,EAAYv3D,EAAOw4D,EAAYpF,GAAMoE,c,6BChE3C,SAASD,EAAYv3D,EAAOw3D,GAC1B,IAAIxqE,EACA0qE,EACAE,EACA9oC,EACA1E,EACAwxC,EAGJ,IAAK5uE,EAFKwqE,EAAWnoE,OAEN,EAAGrC,GAAK,EAAGA,IAGE,MAF1B0qE,EAAaF,EAAWxqE,IAET2qE,QAAgD,KAAtBD,EAAWC,SAK5B,IAApBD,EAAW9lE,MAIfgmE,EAAWJ,EAAWE,EAAW9lE,KAOjCgqE,EAAW5uE,EAAI,GACJwqE,EAAWxqE,EAAI,GAAG4E,MAAQ8lE,EAAW9lE,IAAM,GAC3C4lE,EAAWxqE,EAAI,GAAG8hC,QAAU4oC,EAAW5oC,MAAQ,GAC/C0oC,EAAWE,EAAW9lE,IAAM,GAAGk9B,QAAU8oC,EAAS9oC,MAAQ,GAC1D0oC,EAAWxqE,EAAI,GAAG2qE,SAAWD,EAAWC,OAEnDvtC,EAAKZ,OAAOC,aAAaiuC,EAAWC,SAEpC7oC,EAAgB9uB,EAAMwC,OAAOk1D,EAAW5oC,QAClC94B,KAAU4lE,EAAW,cAAgB,UAC3C9sC,EAAMvoB,IAAUq1D,EAAW,SAAW,KACtC9sC,EAAMgpC,QAAU,EAChBhpC,EAAMwC,OAAUsqC,EAAWxxC,EAAKA,EAAKA,EACrC0E,EAAM7/B,QAAU,IAEhB6/B,EAAgB9uB,EAAMwC,OAAOo1D,EAAS9oC,QAChC94B,KAAU4lE,EAAW,eAAiB,WAC5C9sC,EAAMvoB,IAAUq1D,EAAW,SAAW,KACtC9sC,EAAMgpC,SAAW,EACjBhpC,EAAMwC,OAAUsqC,EAAWxxC,EAAKA,EAAKA,EACrC0E,EAAM7/B,QAAU,GAEZ2sE,IACF57D,EAAMwC,OAAOg1D,EAAWxqE,EAAI,GAAG8hC,OAAO7/B,QAAU,GAChD+Q,EAAMwC,OAAOg1D,EAAWE,EAAW9lE,IAAM,GAAGk9B,OAAO7/B,QAAU,GAC7DjC,MA7GND,EAAOD,QAAQ+nE,SAAW,SAAkB70D,EAAO80D,GACjD,IAAI9nE,EAAGirE,EACHpmE,EAAQmO,EAAMtO,IACdimE,EAAS33D,EAAMurB,IAAI/jB,WAAW3V,GAElC,GAAIijE,EAAU,OAAO,EAErB,GAAe,KAAX6C,GAAsC,KAAXA,EAA2B,OAAO,EAIjE,IAFAM,EAAUj4D,EAAMk4D,WAAWl4D,EAAMtO,IAAgB,KAAXimE,GAEjC3qE,EAAI,EAAGA,EAAIirE,EAAQ5oE,OAAQrC,IACdgT,EAAMnQ,KAAK,OAAQ,GAAI,GACjCZ,QAAUu6B,OAAOC,aAAakuC,GAEpC33D,EAAMw3D,WAAW3nE,KAAK,CAGpB8nE,OAAQA,EAIRtoE,OAAQ4oE,EAAQ5oE,OAShB+oE,KAAQprE,EAIR8hC,MAAQ9uB,EAAMwC,OAAOnT,OAAS,EAK9BuC,KAAS,EAKTyZ,KAAQ4sD,EAAQI,SAChB7wC,MAAQywC,EAAQK,YAMpB,OAFAt4D,EAAMtO,KAAOumE,EAAQ5oE,QAEd,GAiETtC,EAAOD,QAAQyqE,YAAc,SAAkBv3D,GAC7C,IAAIozD,EACAoF,EAAcx4D,EAAMw4D,YACpBzmE,EAAMiO,EAAMw4D,YAAYnpE,OAI5B,IAFAkoE,EAAYv3D,EAAOA,EAAMw3D,YAEpBpE,EAAO,EAAGA,EAAOrhE,EAAKqhE,IACrBoF,EAAYpF,IAASoF,EAAYpF,GAAMoE,YACzCD,EAAYv3D,EAAOw4D,EAAYpF,GAAMoE,c,mcC5H9BqE,EAAa,CACxB1mC,cAAeA,IACfuI,aAAcA,IACd2C,oBAAqBA,IACrBs5B,mBAAoBA,IACpBj7B,WAAYA,IACZvH,WAAYA,IACZ2I,iBAAkBA,IAClB05B,gBAAiBA,K,OCfZ,IAAMz8C,EAAW,CACtB++C,iBCDa,SAA0B9lE,EAAMN,GAC7C,OAAO,SAAUsK,EAAOsa,GACtB,OAAIta,EAAMwV,UAAUtiB,MACXkpB,YAAWpmB,EAAMN,EAAjB0mB,CAAwBpc,EAAOsa,GAEjC6E,YAAWnpB,EAAMN,EAAjBypB,CAAwBnf,EAAOsa,M,wBCH7ByhD,EAAc,CACzBh/C,SAAUA,EACVi/C,SCFsB,CACtBvK,sBAAuBA,IACvB3yB,0BAA2BA,IAC3Bc,cAAeA,KDAf4xB,wB,MAAyBA,GELd9xD,EAAS,CACpBghC,U,MAAWA,G,2DCHb,yIAWe,SAASu7B,IACtBhrB,iBAAOirB,IAAWttE,UAAW,gBAAgB,SAAUwvC,GAAO,WAC5D,GAAKlI,IAAIimC,MAAMC,UAAU,8BAAzB,CAWAh+B,EAAMhtB,IACJ,YACA,EAAC,IAAD,CAAS/e,KAAM6jC,IAAIC,WAAWC,MAAM,oDAClC,EAAC,IAAD,CACEJ,KAAK,mBACLL,UAAWoc,IAAU,CAAEsqB,QAAQ,EAAM,gBAAgB,EAAMn6D,OAAQg0B,IAAIy8B,QAAQC,KAAKC,cAAcyJ,oBAClG1mC,QAfgB,WACpBM,IAAIy8B,QAAQC,KAAK2J,gBAAgB,CAAED,mBAAoBpmC,IAAIy8B,QAAQC,KAAKC,cAAcyJ,oBAAqBE,MAAK,WAC9GtmC,IAAIqI,SAASC,OAAOsC,UACpB,EAAKprC,MAAM6oC,SAASC,OAAS,EAAKi+B,YAAY,EAAKrlC,EAAE,+BAA+B,IACpFhqC,EAAE4/D,OAAO/+C,OACTioB,IAAIqI,SAASC,OAAOR,gBAarB,QAILiT,iBAAOirB,IAAWttE,UAAW,gBAAgB,SAAUwvC,GAChDlI,IAAIy8B,QAAQC,KAAKC,cAAcyJ,oBAEpCl+B,EAAMzuC,OAAO,YAEbyuC,EAAMhtB,IAAI,mBAAoB,EAAC,IAAD,CAAiBpR,MAAO9Q,KAAKkjE,YAAe,SAG5EnhB,iBAAOirB,IAAWttE,UAAW,qBAAqB,SAAUwvC,GACrDlI,IAAIy8B,QAAQC,KAAKC,cAAcyJ,oBAEpCl+B,EAAMg0B,UAAYljE,KAAKkjE,UAAY,IAAI1xB,IACvCtC,EAAMwzB,WAAW/hE,KAAK,aACtBuuC,EAAMjM,OAAS,kBAAM+D,IAAIqI,SAAS/W,aAGpC6oC,mBAAS6L,IAAWttE,UAAW,eAAe,SAAU8tE,EAAU/1D,GAChE,OAAIuvB,IAAIy8B,QAAQC,KAAKC,cAAcyJ,kBAC1B,IAAI9K,IAAwB7qD,EAAKzX,KAAKytE,qBAGxCD,EAAS/1D,Q,cC1DpB5Z,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,2B,6BCKpC,IAAI0nC,EAAc,8CAGlB,SAASC,EAAU78D,EAAO80D,GACxB,IAAIxlE,EACAL,EAEA8C,EAAMiO,EAAM+0D,OACZljE,EAAQmO,EAAMtO,IAElB,GAAoC,MAAhCsO,EAAMurB,IAAI/jB,WAAW3V,GAA0B,OAAO,EAC1D,GAAIijE,EAAU,OAAO,EACrB,GAAIjjE,EAAQ,GAAKE,EAAO,OAAO,EAI/B,IAFAiO,EAAMtO,IAAMG,EAAQ,EAEbmO,EAAMtO,IAAMK,GAAK,CACtB,GAAwC,MAApCiO,EAAMurB,IAAI/jB,WAAWxH,EAAMtO,KAAsB,CACnDpC,GAAQ,EACR,MAGF0Q,EAAMg1D,GAAGzyD,OAAOu6D,UAAU98D,GAG5B,OAAK1Q,GAASuC,EAAQ,IAAMmO,EAAMtO,KAKlCzC,EAAU+Q,EAAMurB,IAAI37B,MAAMiC,EAAQ,EAAGmO,EAAMtO,MAG/B+L,MAAM,uBAChBuC,EAAMtO,IAAMG,GACL,IAITmO,EAAM+0D,OAAS/0D,EAAMtO,IACrBsO,EAAMtO,IAAMG,EAAQ,EAGJmO,EAAMnQ,KAAK,WAAY,MAAO,GACxCyhC,OAAU,IAEAtxB,EAAMnQ,KAAK,OAAQ,GAAI,GACjCZ,QAAUA,EAAQwI,QAAQmlE,EAAa,MAE7B58D,EAAMnQ,KAAK,YAAa,OAAQ,GAC1CyhC,OAAU,IAEhBtxB,EAAMtO,IAAMsO,EAAM+0D,OAAS,EAC3B/0D,EAAM+0D,OAAShjE,GACR,IA5BLiO,EAAMtO,IAAMG,GACL,GA+BX9E,EAAOD,QAAU,SAAoBkoE,GACnCA,EAAGzyD,OAAO0yD,MAAMj6D,MAAM,WAAY,MAAO6hE,K,6BC3D3C,IAAID,EAAc,8CAElB,SAASG,EAAY/8D,EAAO80D,GAC1B,IAAIxlE,EACAL,EAEA8C,EAAMiO,EAAM+0D,OACZljE,EAAQmO,EAAMtO,IAElB,GAAoC,KAAhCsO,EAAMurB,IAAI/jB,WAAW3V,GAA0B,OAAO,EAC1D,GAAIijE,EAAU,OAAO,EACrB,GAAIjjE,EAAQ,GAAKE,EAAO,OAAO,EAI/B,IAFAiO,EAAMtO,IAAMG,EAAQ,EAEbmO,EAAMtO,IAAMK,GAAK,CACtB,GAAwC,KAApCiO,EAAMurB,IAAI/jB,WAAWxH,EAAMtO,KAAsB,CACnDpC,GAAQ,EACR,MAGF0Q,EAAMg1D,GAAGzyD,OAAOu6D,UAAU98D,GAG5B,OAAK1Q,GAASuC,EAAQ,IAAMmO,EAAMtO,KAKlCzC,EAAU+Q,EAAMurB,IAAI37B,MAAMiC,EAAQ,EAAGmO,EAAMtO,MAG/B+L,MAAM,uBAChBuC,EAAMtO,IAAMG,GACL,IAITmO,EAAM+0D,OAAS/0D,EAAMtO,IACrBsO,EAAMtO,IAAMG,EAAQ,EAGJmO,EAAMnQ,KAAK,WAAY,MAAO,GACxCyhC,OAAU,IAEAtxB,EAAMnQ,KAAK,OAAQ,GAAI,GACjCZ,QAAUA,EAAQwI,QAAQmlE,EAAa,MAE7B58D,EAAMnQ,KAAK,YAAa,OAAQ,GAC1CyhC,OAAU,IAEhBtxB,EAAMtO,IAAMsO,EAAM+0D,OAAS,EAC3B/0D,EAAM+0D,OAAShjE,GACR,IA5BLiO,EAAMtO,IAAMG,GACL,GA+BX9E,EAAOD,QAAU,SAAoBkoE,GACnCA,EAAGzyD,OAAO0yD,MAAMj6D,MAAM,WAAY,MAAO+hE,K,6BC3D3C,SAASC,EAAah9D,EAAOtO,GAC3B,IAAIurE,EACFC,EACAnrE,EAAMiO,EAAM+0D,OACZsD,GAAW,EACXC,GAAY,EAkBd,OAhBA2E,EAAWvrE,EAAM,EAAIsO,EAAMurB,IAAI/jB,WAAW9V,EAAM,IAAM,EACtDwrE,EAAWxrE,EAAM,GAAKK,EAAMiO,EAAMurB,IAAI/jB,WAAW9V,EAAM,IAAM,GAK9C,KAAburE,GACa,IAAbA,GACCC,GAAY,IAAkBA,GAAY,MAE3C5E,GAAY,GAEG,KAAb4E,GAA4C,IAAbA,IACjC7E,GAAW,GAGN,CACLA,SAAUA,EACVC,UAAWA,GAIf,SAASh5B,EAAYt/B,EAAO80D,GAC1B,IAAIjjE,EAAO4L,EAAOqxB,EAAOquC,EAAKzrE,EAE9B,GAA6B,MAAzBsO,EAAMurB,IAAIvrB,EAAMtO,KAClB,OAAO,EAIT,GADAyrE,EAAMH,EAAah9D,EAAOA,EAAMtO,MAC3ByrE,EAAI9E,SAKP,OAJKvD,IACH90D,EAAMkL,SAAW,KAEnBlL,EAAMtO,KAAO,GACN,EAST,IAFAG,EAAQmO,EAAMtO,IAAM,EACpB+L,EAAQ5L,GAC4C,KAA5C4L,EAAQuC,EAAMurB,IAAIzrB,QAAQ,IAAKrC,KAAgB,CAIrD,IADA/L,EAAM+L,EAAQ,EACY,OAAnBuC,EAAMurB,IAAI75B,IACfA,GAAO,EAIT,IAAK+L,EAAQ/L,GAAO,GAAK,EACvB,MAEF+L,GAAS,EAIX,OAAe,IAAXA,GACGq3D,IACH90D,EAAMkL,SAAW,KAEnBlL,EAAMtO,IAAMG,GACL,GAIL4L,EAAQ5L,GAAU,GACfijE,IACH90D,EAAMkL,SAAW,MAEnBlL,EAAMtO,IAAMG,EAAQ,GACb,IAITsrE,EAAMH,EAAah9D,EAAOvC,GACrB0/D,EAAI7E,WAQJxD,IACHhmC,EAAQ9uB,EAAMnQ,KAAK,cAAe,OAAQ,GAC1Ci/B,EAAMwC,OAAS,IACfxC,EAAM7/B,QAAU+Q,EAAMurB,IAAI37B,MAAMiC,EAAO4L,IAGzCuC,EAAMtO,IAAM+L,EAAQ,GACb,IAdAq3D,IACH90D,EAAMkL,SAAW,KAEnBlL,EAAMtO,IAAMG,GACL,IAaX,SAASotC,EAAWj/B,EAAOnO,EAAOD,EAAKkjE,GACrC,IAAIsI,EACFC,EACA9hE,EACA+hE,EAEAxuC,EADAx/B,GAAQ,EAERoC,EAAMsO,EAAMs2D,OAAOzkE,GAASmO,EAAMu2D,OAAO1kE,GACzCE,EAAMiO,EAAMw2D,OAAO3kE,GAErB,GAAIH,EAAM,EAAIK,EACZ,OAAO,EAET,GAAsC,OAAlCiO,EAAMurB,IAAI37B,MAAM8B,EAAKA,EAAM,GAC7B,OAAO,EAMT,GAHAA,GAAO,EACP0rE,EAAYp9D,EAAMurB,IAAI37B,MAAM8B,EAAKK,GAE7B+iE,EACF,OAAO,EAQT,IANmC,OAA/BsI,EAAU1wD,OAAO9c,OAAO,KAE1BwtE,EAAYA,EAAU1wD,OAAO9c,MAAM,GAAI,GACvCN,GAAQ,GAGLiM,EAAO1J,GAAQvC,IAClBiM,MAEIA,GAAQ3J,MAIZF,EAAMsO,EAAMs2D,OAAO/6D,GAAQyE,EAAMu2D,OAAOh7D,GACxCxJ,EAAMiO,EAAMw2D,OAAOj7D,KAEf7J,EAAMK,GAAOiO,EAAMu2D,OAAOh7D,GAAQyE,EAAM02D,aAKO,OAA/C12D,EAAMurB,IAAI37B,MAAM8B,EAAKK,GAAK2a,OAAO9c,OAAO,KAC1C0tE,EAAUt9D,EAAMurB,IAAI37B,MAAM,EAAGmC,GAAKye,YAAY,MAC9C6sD,EAAWr9D,EAAMurB,IAAI37B,MAAM8B,EAAK4rE,GAChChuE,GAAQ,GAcZ,OAVA0Q,EAAMi3D,KAAO17D,EAAO,EAEpBuzB,EAAQ9uB,EAAMnQ,KAAK,aAAc,OAAQ,GACzCi/B,EAAMxf,OAAQ,EACdwf,EAAM7/B,SACHmuE,GAAaA,EAAU1wD,OAAS0wD,EAAY,KAAO,IACpDp9D,EAAMu9D,SAAS1rE,EAAQ,EAAG0J,EAAMyE,EAAMu2D,OAAO1kE,IAAQ,IACpDwrE,GAAYA,EAAS3wD,OAAS2wD,EAAW,IAC5CvuC,EAAMt+B,IAAM,CAACqB,EAAOmO,EAAMi3D,MAC1BnoC,EAAMwC,OAAS,MACR,EAGTvkC,EAAOD,QAAU,CAACkoE,EAAIhwD,MACpBA,EAAUA,GAAW,IACbw4D,OAASx4D,EAAQw4D,QAAU,sBACnCx4D,EAAQwB,MAAQxB,EAAQwB,OAAS,GACjC,MAAMi3D,EAAeC,GACZC,mBAAmBD,GAAOjmE,QAAQ,IAAK,OAAOA,QAAQ,IAAK,OAuBpEu9D,EAAGzyD,OAAO0yD,MAAMj6D,MAAM,SAAU,cAAeskC,GAC/C01B,EAAG1lD,MAAM2lD,MAAMj6D,MAAM,aAAc,aAAcikC,EAAY,CAC3D7Q,IAAK,CAAC,YAAa,YAAa,aAAc,UAEhD4mC,EAAG4I,SAAS13D,MAAMo5B,YAAc,CAAC98B,EAAQo4D,IAxB5B,CAAC8C,IACZ,IACE,MAAO,aAAa14D,EAAQw4D,iBAAiBC,EAAYC,cAAkB14D,EAAQwB,0CACnF,MAAOq4B,GAEP,OADAmkB,QAAQnkB,MAAMA,GACP6+B,IAoBFG,CAAOr7D,EAAOo4D,GAAK3rE,SAE5B+lE,EAAG4I,SAAS13D,MAAM+4B,WAAa,CAACz8B,EAAQo4D,IAlB5B,CAAC8C,IACX,IACE,MAAO,aAAa14D,EAAQwB,oBAAoBxB,EAAQw4D,eAAeC,EACrEC,aAEF,MAAO7+B,GAEP,OADAmkB,QAAQnkB,MAAMA,GACP6+B,IAYFI,CAAMt7D,EAAOo4D,GAAK3rE,W,cChN7BlC,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,4B,6BCKpC,IAAI6oC,EAAe,EAAQ,GACvBC,EAAe,EAAQ,IACvBC,EAAe,EAAQ,IACvBC,EAAe,EAAQ,IACvBC,EAAe,EAAQ,IACvBC,EAAe,EAAQ,IACvBC,EAAe,EAAQ,KACvB7zC,EAAe,EAAQ,IACvB8zC,EAAe,EAAQ,KAGvBpmD,EAAS,CACX,QAAW,EAAQ,KACnBqmD,KAAM,EAAQ,KACdC,WAAY,EAAQ,MAYlBC,EAAe,oCACfC,EAAe,oCAEnB,SAASC,EAAaC,GAEpB,IAAI9iE,EAAM8iE,EAAIlyD,OAAOc,cAErB,OAAOixD,EAAa17D,KAAKjH,MAAQ4iE,EAAa37D,KAAKjH,GAMrD,IAAI+iE,EAAsB,CAAE,QAAS,SAAU,WAE/C,SAASC,EAAcF,GACrB,IAAI9f,EAASt0B,EAAMxrB,MAAM4/D,GAAK,GAE9B,GAAI9f,EAAOigB,YAOJjgB,EAAOkgB,UAAYH,EAAoB/+D,QAAQg/C,EAAOkgB,WAAa,GACtE,IACElgB,EAAOigB,SAAWT,EAASW,QAAQngB,EAAOigB,UAC1C,MAAOG,IAIb,OAAO10C,EAAM6wC,OAAO7wC,EAAM+wC,OAAOzc,IAGnC,SAASqgB,EAAkBP,GACzB,IAAI9f,EAASt0B,EAAMxrB,MAAM4/D,GAAK,GAE9B,GAAI9f,EAAOigB,YAOJjgB,EAAOkgB,UAAYH,EAAoB/+D,QAAQg/C,EAAOkgB,WAAa,GACtE,IACElgB,EAAOigB,SAAWT,EAASc,UAAUtgB,EAAOigB,UAC5C,MAAOG,IAIb,OAAO10C,EAAM8wC,OAAO9wC,EAAM+wC,OAAOzc,IAyInC,SAASugB,EAAWC,EAAYt6D,GAC9B,KAAM9V,gBAAgBmwE,GACpB,OAAO,IAAIA,EAAWC,EAAYt6D,GAG/BA,GACE+4D,EAAMlzC,SAASy0C,KAClBt6D,EAAUs6D,GAAc,GACxBA,EAAa,WAWjBpwE,KAAKqT,OAAS,IAAI67D,EASlBlvE,KAAKogB,MAAQ,IAAI6uD,EASjBjvE,KAAK+lC,KAAO,IAAIipC,EAuBhBhvE,KAAK0uE,SAAW,IAAIK,EASpB/uE,KAAKqwE,QAAU,IAAIlB,EAiBnBnvE,KAAKyvE,aAAeA,EAQpBzvE,KAAK4vE,cAAgBA,EAOrB5vE,KAAKiwE,kBAAoBA,EAWzBjwE,KAAK6uE,MAAQA,EAQb7uE,KAAK8uE,QAAUD,EAAMrzC,OAAO,GAAIszC,GAGhC9uE,KAAK8V,QAAU,GACf9V,KAAKswE,UAAUF,GAEXt6D,GAAW9V,KAAKqH,IAAIyO,GAuB1Bq6D,EAAWzwE,UAAU2H,IAAM,SAAUyO,GAEnC,OADA+4D,EAAMrzC,OAAOx7B,KAAK8V,QAASA,GACpB9V,MAcTmwE,EAAWzwE,UAAU4wE,UAAY,SAAUC,GACzC,IAAiBH,EAAb5vE,EAAOR,KAEX,GAAI6uE,EAAMlzC,SAAS40C,MAEjBA,EAAUvnD,EADVonD,EAAaG,IAEG,MAAM,IAAIrpE,MAAM,+BAAiCkpE,EAAa,iBAGhF,IAAKG,EAAW,MAAM,IAAIrpE,MAAM,8CAchC,OAZIqpE,EAAQz6D,SAAWtV,EAAK6G,IAAIkpE,EAAQz6D,SAEpCy6D,EAAQ5D,YACVnuE,OAAO0sB,KAAKqlD,EAAQ5D,YAAYxrE,SAAQ,SAAU9C,GAC5CkyE,EAAQ5D,WAAWtuE,GAAM2Y,OAC3BxW,EAAKnC,GAAM0nE,MAAM4F,WAAW4E,EAAQ5D,WAAWtuE,GAAM2Y,OAEnDu5D,EAAQ5D,WAAWtuE,GAAMmyE,QAC3BhwE,EAAKnC,GAAMgrE,OAAOsC,WAAW4E,EAAQ5D,WAAWtuE,GAAMmyE,WAIrDxwE,MAqBTmwE,EAAWzwE,UAAUgqE,OAAS,SAAUjkC,EAAMgmC,GAC5C,IAAI9pE,EAAS,GAERsE,MAAMC,QAAQu/B,KAASA,EAAO,CAAEA,IAErC,CAAE,OAAQ,QAAS,UAAWtkC,SAAQ,SAAUgqE,GAC9CxpE,EAASA,EAAOb,OAAOd,KAAKmrE,GAAOpF,MAAM2D,OAAOjkC,GAAM,MACrDzlC,MAEH2B,EAASA,EAAOb,OAAOd,KAAKqT,OAAOg2D,OAAOK,OAAOjkC,GAAM,IAEvD,IAAIgrC,EAAShrC,EAAKtW,QAAO,SAAU9wB,GAAQ,OAAOsD,EAAOiP,QAAQvS,GAAQ,KAEzE,GAAIoyE,EAAOtwE,SAAWsrE,EACpB,MAAM,IAAIvkE,MAAM,iDAAmDupE,GAGrE,OAAOzwE,MAWTmwE,EAAWzwE,UAAUsmE,QAAU,SAAUvgC,EAAMgmC,GAC7C,IAAI9pE,EAAS,GAERsE,MAAMC,QAAQu/B,KAASA,EAAO,CAAEA,IAErC,CAAE,OAAQ,QAAS,UAAWtkC,SAAQ,SAAUgqE,GAC9CxpE,EAASA,EAAOb,OAAOd,KAAKmrE,GAAOpF,MAAMC,QAAQvgC,GAAM,MACtDzlC,MAEH2B,EAASA,EAAOb,OAAOd,KAAKqT,OAAOg2D,OAAOrD,QAAQvgC,GAAM,IAExD,IAAIgrC,EAAShrC,EAAKtW,QAAO,SAAU9wB,GAAQ,OAAOsD,EAAOiP,QAAQvS,GAAQ,KAEzE,GAAIoyE,EAAOtwE,SAAWsrE,EACpB,MAAM,IAAIvkE,MAAM,kDAAoDupE,GAEtE,OAAOzwE,MAoBTmwE,EAAWzwE,UAAUiqE,IAAM,SAAUngD,GACnC,IAAIknD,EAAO,CAAE1wE,MAAOc,OAAOmF,MAAMvG,UAAUgB,MAAMzC,KAAK8vB,UAAW,IAEjE,OADAvE,EAAOV,MAAMU,EAAQknD,GACd1wE,MAmBTmwE,EAAWzwE,UAAUoQ,MAAQ,SAAUusB,EAAKs0C,GAC1C,GAAmB,iBAARt0C,EACT,MAAM,IAAIn1B,MAAM,iCAGlB,IAAI4J,EAAQ,IAAI9Q,KAAK+lC,KAAK6qC,MAAMv0C,EAAKr8B,KAAM2wE,GAI3C,OAFA3wE,KAAK+lC,KAAK8qC,QAAQ//D,GAEXA,EAAMwC,QAef68D,EAAWzwE,UAAUokC,OAAS,SAAUzH,EAAKs0C,GAG3C,OAFAA,EAAMA,GAAO,GAEN3wE,KAAK0uE,SAAS5qC,OAAO9jC,KAAK8P,MAAMusB,EAAKs0C,GAAM3wE,KAAK8V,QAAS66D,IAalER,EAAWzwE,UAAUoxE,YAAc,SAAUz0C,EAAKs0C,GAChD,IAAI7/D,EAAQ,IAAI9Q,KAAK+lC,KAAK6qC,MAAMv0C,EAAKr8B,KAAM2wE,GAK3C,OAHA7/D,EAAMigE,YAAa,EACnB/wE,KAAK+lC,KAAK8qC,QAAQ//D,GAEXA,EAAMwC,QAYf68D,EAAWzwE,UAAUyiC,aAAe,SAAU9F,EAAKs0C,GAGjD,OAFAA,EAAMA,GAAO,GAEN3wE,KAAK0uE,SAAS5qC,OAAO9jC,KAAK8wE,YAAYz0C,EAAKs0C,GAAM3wE,KAAK8V,QAAS66D,IAIxE9yE,EAAOD,QAAUuyE,G,ig5BChkBjB,IAAIa,EAAc,GAsClB,SAAS7E,EAAOp8D,EAAQkhE,EAASC,GAC/B,IAAIpzE,EAAGC,EAAG2tB,EAAMylD,EAAUC,EACtBzvE,EAAS,GAcb,IAZuB,iBAAZsvE,IAETC,EAAeD,EACfA,EAAU9E,EAAOkF,mBAGQ,IAAhBH,IACTA,GAAc,GAGhBE,EA9CF,SAAwBH,GACtB,IAAInzE,EAAGo9B,EAAIk2C,EAAQJ,EAAYC,GAC/B,GAAIG,EAAS,OAAOA,EAIpB,IAFAA,EAAQJ,EAAYC,GAAW,GAE1BnzE,EAAI,EAAGA,EAAI,IAAKA,IACnBo9B,EAAKZ,OAAOC,aAAaz8B,GAErB,cAAc+V,KAAKqnB,GAErBk2C,EAAMzwE,KAAKu6B,GAEXk2C,EAAMzwE,KAAK,KAAO,IAAM7C,EAAE6H,SAAS,IAAIk3B,eAAen8B,OAAO,IAIjE,IAAK5C,EAAI,EAAGA,EAAImzE,EAAQ9wE,OAAQrC,IAC9BszE,EAAMH,EAAQ34D,WAAWxa,IAAMmzE,EAAQnzE,GAGzC,OAAOszE,EAyBCE,CAAeL,GAElBnzE,EAAI,EAAGC,EAAIgS,EAAO5P,OAAQrC,EAAIC,EAAGD,IAGpC,GAFA4tB,EAAO3b,EAAOuI,WAAWxa,GAErBozE,GAAwB,KAATxlD,GAAyB5tB,EAAI,EAAIC,GAC9C,iBAAiB8V,KAAK9D,EAAOrP,MAAM5C,EAAI,EAAGA,EAAI,IAChD6D,GAAUoO,EAAOrP,MAAM5C,EAAGA,EAAI,GAC9BA,GAAK,OAKT,GAAI4tB,EAAO,IACT/pB,GAAUyvE,EAAM1lD,QAIlB,GAAIA,GAAQ,OAAUA,GAAQ,MAA9B,CACE,GAAIA,GAAQ,OAAUA,GAAQ,OAAU5tB,EAAI,EAAIC,IAC9CozE,EAAWphE,EAAOuI,WAAWxa,EAAI,KACjB,OAAUqzE,GAAY,MAAQ,CAC5CxvE,GAAU8sE,mBAAmB1+D,EAAOjS,GAAKiS,EAAOjS,EAAI,IACpDA,IACA,SAGJ6D,GAAU,iBAIZA,GAAU8sE,mBAAmB1+D,EAAOjS,IAGtC,OAAO6D,EAGTwqE,EAAOkF,aAAiB,uBACxBlF,EAAOoF,eAAiB,YAGxB1zE,EAAOD,QAAUuuE,G,6BC3FjB,IAAIqF,EAAc,GAwBlB,SAASpF,EAAOr8D,EAAQkhE,GACtB,IAAIG,EAQJ,MANuB,iBAAZH,IACTA,EAAU7E,EAAOiF,cAGnBD,EA7BF,SAAwBH,GACtB,IAAInzE,EAAGo9B,EAAIk2C,EAAQI,EAAYP,GAC/B,GAAIG,EAAS,OAAOA,EAIpB,IAFAA,EAAQI,EAAYP,GAAW,GAE1BnzE,EAAI,EAAGA,EAAI,IAAKA,IACnBo9B,EAAKZ,OAAOC,aAAaz8B,GACzBszE,EAAMzwE,KAAKu6B,GAGb,IAAKp9B,EAAI,EAAGA,EAAImzE,EAAQ9wE,OAAQrC,IAE9BszE,EADAl2C,EAAK+1C,EAAQ34D,WAAWxa,IACZ,KAAO,IAAMo9B,EAAGv1B,SAAS,IAAIk3B,eAAen8B,OAAO,GAGjE,OAAO0wE,EAaCK,CAAeR,GAEhBlhE,EAAOxH,QAAQ,qBAAqB,SAASmpE,GAClD,IAAI5zE,EAAGC,EAAG4zE,EAAIC,EAAIC,EAAIC,EAAIC,EACtBpwE,EAAS,GAEb,IAAK7D,EAAI,EAAGC,EAAI2zE,EAAIvxE,OAAQrC,EAAIC,EAAGD,GAAK,GACtC6zE,EAAK11C,SAASy1C,EAAIhxE,MAAM5C,EAAI,EAAGA,EAAI,GAAI,KAE9B,IACP6D,GAAUyvE,EAAMO,GAIE,MAAV,IAALA,IAAwB7zE,EAAI,EAAIC,GAIf,MAAV,KAFV6zE,EAAK31C,SAASy1C,EAAIhxE,MAAM5C,EAAI,EAAGA,EAAI,GAAI,OAMnC6D,IAHFowE,EAAQJ,GAAM,EAAK,KAAe,GAALC,GAEnB,IACE,KAEAt3C,OAAOC,aAAaw3C,GAGhCj0E,GAAK,GAKW,MAAV,IAAL6zE,IAAwB7zE,EAAI,EAAIC,IAEnC6zE,EAAK31C,SAASy1C,EAAIhxE,MAAM5C,EAAI,EAAGA,EAAI,GAAI,IACvC+zE,EAAK51C,SAASy1C,EAAIhxE,MAAM5C,EAAI,EAAGA,EAAI,GAAI,IAEnB,MAAV,IAAL8zE,IAAuC,MAAV,IAALC,KAIzBlwE,IAHFowE,EAAQJ,GAAM,GAAM,MAAYC,GAAM,EAAK,KAAe,GAALC,GAE3C,MAAUE,GAAO,OAAUA,GAAO,MAChC,MAEAz3C,OAAOC,aAAaw3C,GAGhCj0E,GAAK,GAKW,MAAV,IAAL6zE,IAAwB7zE,EAAI,EAAIC,IAEnC6zE,EAAK31C,SAASy1C,EAAIhxE,MAAM5C,EAAI,EAAGA,EAAI,GAAI,IACvC+zE,EAAK51C,SAASy1C,EAAIhxE,MAAM5C,EAAI,EAAGA,EAAI,GAAI,IACvCg0E,EAAK71C,SAASy1C,EAAIhxE,MAAM5C,EAAI,GAAIA,EAAI,IAAK,IAErB,MAAV,IAAL8zE,IAAuC,MAAV,IAALC,IAAuC,MAAV,IAALC,MACnDC,EAAQJ,GAAM,GAAM,QAAcC,GAAM,GAAM,OAAaC,GAAM,EAAK,KAAe,GAALC,GAEtE,OAAWC,EAAM,QACzBpwE,GAAU,QAEVowE,GAAO,MACPpwE,GAAU24B,OAAOC,aAAa,OAAUw3C,GAAO,IAAK,OAAgB,KAANA,KAGhEj0E,GAAK,GAKT6D,GAAU,IAGZ,OAAOA,KAKXyqE,EAAOiF,aAAiB,cACxBjF,EAAOmF,eAAiB,GAGxB1zE,EAAOD,QAAUwuE,G,6BCrHjBvuE,EAAOD,QAAU,SAAgB8xE,GAC/B,IAAI/tE,EAAS,GAkBb,OAhBAA,GAAU+tE,EAAII,UAAY,GAC1BnuE,GAAU+tE,EAAIsC,QAAU,KAAO,GAC/BrwE,GAAU+tE,EAAIuC,KAAOvC,EAAIuC,KAAO,IAAM,GAElCvC,EAAIG,WAA2C,IAA/BH,EAAIG,SAASj/D,QAAQ,KAEvCjP,GAAU,IAAM+tE,EAAIG,SAAW,IAE/BluE,GAAU+tE,EAAIG,UAAY,GAG5BluE,GAAU+tE,EAAIwC,KAAO,IAAMxC,EAAIwC,KAAO,GACtCvwE,GAAU+tE,EAAIyC,UAAY,GAC1BxwE,GAAU+tE,EAAIl9D,QAAU,GACxB7Q,GAAU+tE,EAAI0C,MAAQ,K,6BCwBxB,SAASC,IACPryE,KAAK8vE,SAAW,KAChB9vE,KAAKgyE,QAAU,KACfhyE,KAAKiyE,KAAO,KACZjyE,KAAKkyE,KAAO,KACZlyE,KAAK6vE,SAAW,KAChB7vE,KAAKoyE,KAAO,KACZpyE,KAAKwS,OAAS,KACdxS,KAAKmyE,SAAW,KAOlB,IAAIG,EAAkB,oBAClBC,EAAc,WAGdC,EAAoB,qCAOpBC,EAAS,CAAE,IAAK,IAAK,IAAK,KAAM,IAAK,KAAM3xE,OAHlC,CAAE,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,KAAM,OAMhD4xE,EAAa,CAAE,KAAO5xE,OAAO2xE,GAK7BE,EAAe,CAAE,IAAK,IAAK,IAAK,IAAK,KAAM7xE,OAAO4xE,GAClDE,EAAkB,CAAE,IAAK,IAAK,KAE9BC,EAAsB,yBACtBC,EAAoB,+BAIpBC,EAAmB,CACjB,YAAc,EACd,eAAe,GAGjBC,EAAkB,CAChB,MAAQ,EACR,OAAS,EACT,KAAO,EACP,QAAU,EACV,MAAQ,EACR,SAAS,EACT,UAAU,EACV,QAAQ,EACR,WAAW,EACX,SAAS,GAYfX,EAAI3yE,UAAUoQ,MAAQ,SAAS4/D,EAAKuD,GAClC,IAAIn1E,EAAGC,EAAGm1E,EAAYC,EAAKnB,EACvBp9C,EAAO86C,EAMX,GAFA96C,EAAOA,EAAKpX,QAEPy1D,GAA+C,IAA1BvD,EAAIn8D,MAAM,KAAKpT,OAAc,CAErD,IAAIizE,EAAaZ,EAAkB52D,KAAKgZ,GACxC,GAAIw+C,EAKF,OAJApzE,KAAKmyE,SAAWiB,EAAW,GACvBA,EAAW,KACbpzE,KAAKwS,OAAS4gE,EAAW,IAEpBpzE,KAIX,IAAIqzE,EAAQf,EAAgB12D,KAAKgZ,GAoBjC,GAnBIy+C,IAEFH,GADAG,EAAQA,EAAM,IACK/0D,cACnBte,KAAK8vE,SAAWuD,EAChBz+C,EAAOA,EAAK0+C,OAAOD,EAAMlzE,UAOvB8yE,GAAqBI,GAASz+C,EAAKrmB,MAAM,6BAC3CyjE,EAAgC,OAAtBp9C,EAAK0+C,OAAO,EAAG,KACRD,GAASN,EAAiBM,KACzCz+C,EAAOA,EAAK0+C,OAAO,GACnBtzE,KAAKgyE,SAAU,KAIde,EAAiBM,KACjBrB,GAAYqB,IAAUL,EAAgBK,IAAU,CAkBnD,IAUIpB,EAAMsB,EAVNC,GAAW,EACf,IAAK11E,EAAI,EAAGA,EAAI80E,EAAgBzyE,OAAQrC,KAEzB,KADbq1E,EAAMv+C,EAAKhkB,QAAQgiE,EAAgB90E,QACH,IAAb01E,GAAkBL,EAAMK,KACzCA,EAAUL,GA0Bd,KARgB,KATdI,GAFe,IAAbC,EAEO5+C,EAAKtT,YAAY,KAIjBsT,EAAKtT,YAAY,IAAKkyD,MAM/BvB,EAAOr9C,EAAKl0B,MAAM,EAAG6yE,GACrB3+C,EAAOA,EAAKl0B,MAAM6yE,EAAS,GAC3BvzE,KAAKiyE,KAAOA,GAIduB,GAAW,EACN11E,EAAI,EAAGA,EAAI60E,EAAaxyE,OAAQrC,KAEtB,KADbq1E,EAAMv+C,EAAKhkB,QAAQ+hE,EAAa70E,QACA,IAAb01E,GAAkBL,EAAMK,KACzCA,EAAUL,IAIG,IAAbK,IACFA,EAAU5+C,EAAKz0B,QAGS,MAAtBy0B,EAAK4+C,EAAU,IAAcA,IACjC,IAAIh8B,EAAO5iB,EAAKl0B,MAAM,EAAG8yE,GACzB5+C,EAAOA,EAAKl0B,MAAM8yE,GAGlBxzE,KAAKyzE,UAAUj8B,GAIfx3C,KAAK6vE,SAAW7vE,KAAK6vE,UAAY,GAIjC,IAAI6D,EAAoC,MAArB1zE,KAAK6vE,SAAS,IACe,MAA5C7vE,KAAK6vE,SAAS7vE,KAAK6vE,SAAS1vE,OAAS,GAGzC,IAAKuzE,EAAc,CACjB,IAAIC,EAAY3zE,KAAK6vE,SAASt8D,MAAM,MACpC,IAAKzV,EAAI,EAAGC,EAAI41E,EAAUxzE,OAAQrC,EAAIC,EAAGD,IAAK,CAC5C,IAAIkjB,EAAO2yD,EAAU71E,GACrB,GAAKkjB,IACAA,EAAKzS,MAAMskE,GAAsB,CAEpC,IADA,IAAIe,EAAU,GACL/uE,EAAI,EAAGgvE,EAAI7yD,EAAK7gB,OAAQ0E,EAAIgvE,EAAGhvE,IAClCmc,EAAK1I,WAAWzT,GAAK,IAIvB+uE,GAAW,IAEXA,GAAW5yD,EAAKnc,GAIpB,IAAK+uE,EAAQrlE,MAAMskE,GAAsB,CACvC,IAAIiB,EAAaH,EAAUjzE,MAAM,EAAG5C,GAChCi2E,EAAUJ,EAAUjzE,MAAM5C,EAAI,GAC9Bk2E,EAAMhzD,EAAKzS,MAAMukE,GACjBkB,IACFF,EAAWnzE,KAAKqzE,EAAI,IACpBD,EAAQ16C,QAAQ26C,EAAI,KAElBD,EAAQ5zE,SACVy0B,EAAOm/C,EAAQluE,KAAK,KAAO+uB,GAE7B50B,KAAK6vE,SAAWiE,EAAWjuE,KAAK,KAChC,SAMJ7F,KAAK6vE,SAAS1vE,OA1LD,MA2LfH,KAAK6vE,SAAW,IAKd6D,IACF1zE,KAAK6vE,SAAW7vE,KAAK6vE,SAASyD,OAAO,EAAGtzE,KAAK6vE,SAAS1vE,OAAS,IAKnE,IAAIiyE,EAAOx9C,EAAKhkB,QAAQ,MACV,IAAVwhE,IAEFpyE,KAAKoyE,KAAOx9C,EAAK0+C,OAAOlB,GACxBx9C,EAAOA,EAAKl0B,MAAM,EAAG0xE,IAEvB,IAAI6B,EAAKr/C,EAAKhkB,QAAQ,KAWtB,OAVY,IAARqjE,IACFj0E,KAAKwS,OAASoiB,EAAK0+C,OAAOW,GAC1Br/C,EAAOA,EAAKl0B,MAAM,EAAGuzE,IAEnBr/C,IAAQ50B,KAAKmyE,SAAWv9C,GACxBo+C,EAAgBE,IAChBlzE,KAAK6vE,WAAa7vE,KAAKmyE,WACzBnyE,KAAKmyE,SAAW,IAGXnyE,MAGTqyE,EAAI3yE,UAAU+zE,UAAY,SAASj8B,GACjC,IAAI06B,EAAOK,EAAY32D,KAAK47B,GACxB06B,IAEW,OADbA,EAAOA,EAAK,MAEVlyE,KAAKkyE,KAAOA,EAAKoB,OAAO,IAE1B97B,EAAOA,EAAK87B,OAAO,EAAG97B,EAAKr3C,OAAS+xE,EAAK/xE,SAEvCq3C,IAAQx3C,KAAK6vE,SAAWr4B,IAG9B35C,EAAOD,QA7MP,SAAkB8xE,EAAKuD,GACrB,GAAIvD,GAAOA,aAAe2C,EAAO,OAAO3C,EAExC,IAAIwE,EAAI,IAAI7B,EAEZ,OADA6B,EAAEpkE,MAAM4/D,EAAKuD,GACNiB,I,6BC7GTt2E,EAAQu2E,IAAM,EAAQ,IACtBv2E,EAAQw2E,GAAM,EAAQ,IACtBx2E,EAAQy2E,GAAM,EAAQ,IACtBz2E,EAAQ02E,EAAM,EAAQ,IACtB12E,EAAQ22E,EAAM,EAAQ,K,cCNtB12E,EAAOD,QAAQ,yN,6BCIfA,EAAQ42E,eAAuB,EAAQ,IACvC52E,EAAQ62E,qBAAuB,EAAQ,IACvC72E,EAAQ82E,eAAuB,EAAQ,K,6BCCvC72E,EAAOD,QAAU,SAAwBkT,EAAOnO,EAAOgyE,GACrD,IAAItzD,EAAOjhB,EAAOqoE,EAAQmM,EACtBC,GAAY,EACZhyE,EAAMiO,EAAM+0D,OACZgC,EAAS/2D,EAAMtO,IAKnB,IAHAsO,EAAMtO,IAAMG,EAAQ,EACpB0e,EAAQ,EAEDvQ,EAAMtO,IAAMK,GAAK,CAEtB,GAAe,MADf4lE,EAAS33D,EAAMurB,IAAI/jB,WAAWxH,EAAMtO,OAGpB,MADd6e,EACiB,CACfjhB,GAAQ,EACR,MAMJ,GAFAw0E,EAAU9jE,EAAMtO,IAChBsO,EAAMg1D,GAAGzyD,OAAOu6D,UAAU98D,GACX,KAAX23D,EACF,GAAImM,IAAY9jE,EAAMtO,IAAM,EAE1B6e,SACK,GAAIszD,EAET,OADA7jE,EAAMtO,IAAMqlE,GACJ,EAYd,OAPIznE,IACFy0E,EAAW/jE,EAAMtO,KAInBsO,EAAMtO,IAAMqlE,EAELgN,I,6BCzCT,IAAI/4C,EAAc,EAAQ,GAAmBA,YAG7Cj+B,EAAOD,QAAU,SAA8BgP,EAAKpK,EAAKK,GACvD,IAAI6oB,EAAMrK,EAEN1e,EAAQH,EACRb,EAAS,CACPiV,IAAI,EACJpU,IAAK,EACLohC,MAAO,EACPh3B,IAAK,IAGX,GAA4B,KAAxBA,EAAI0L,WAAW9V,GAAuB,CAExC,IADAA,IACOA,EAAMK,GAAK,CAEhB,GAAa,MADb6oB,EAAO9e,EAAI0L,WAAW9V,IACQ,OAAOb,EACrC,GAAa,KAAT+pB,EAIF,OAHA/pB,EAAOa,IAAMA,EAAM,EACnBb,EAAOiL,IAAMkvB,EAAYlvB,EAAIlM,MAAMiC,EAAQ,EAAGH,IAC9Cb,EAAOiV,IAAK,EACLjV,EAEI,KAAT+pB,GAAyBlpB,EAAM,EAAIK,EACrCL,GAAO,EAITA,IAIF,OAAOb,EAMT,IADA0f,EAAQ,EACD7e,EAAMK,GAGE,MAFb6oB,EAAO9e,EAAI0L,WAAW9V,OAKlBkpB,EAAO,IAAiB,MAATA,IAEnB,GAAa,KAATA,GAAyBlpB,EAAM,EAAIK,EACrCL,GAAO,MADT,CASA,GAJa,KAATkpB,GACFrK,IAGW,KAATqK,EAAuB,CACzB,GAAc,IAAVrK,EAAe,MACnBA,IAGF7e,IAGF,OAAIG,IAAUH,GACA,IAAV6e,IAEJ1f,EAAOiL,IAAMkvB,EAAYlvB,EAAIlM,MAAMiC,EAAOH,IAC1Cb,EAAOiiC,MAhEK,EAiEZjiC,EAAOa,IAAMA,EACbb,EAAOiV,IAAK,GANgBjV,I,6BCjE9B,IAAIm6B,EAAc,EAAQ,GAAmBA,YAG7Cj+B,EAAOD,QAAU,SAAwBgP,EAAKpK,EAAKK,GACjD,IAAI6oB,EACA+8C,EACA7kC,EAAQ,EACRjhC,EAAQH,EACRb,EAAS,CACPiV,IAAI,EACJpU,IAAK,EACLohC,MAAO,EACPh3B,IAAK,IAGX,GAAIpK,GAAOK,EAAO,OAAOlB,EAIzB,GAAe,MAFf8mE,EAAS77D,EAAI0L,WAAW9V,KAEkB,KAAXimE,GAAsC,KAAXA,EAA2B,OAAO9mE,EAO5F,IALAa,IAGe,KAAXimE,IAAmBA,EAAS,IAEzBjmE,EAAMK,GAAK,CAEhB,IADA6oB,EAAO9e,EAAI0L,WAAW9V,MACTimE,EAKX,OAJA9mE,EAAOa,IAAMA,EAAM,EACnBb,EAAOiiC,MAAQA,EACfjiC,EAAOiL,IAAMkvB,EAAYlvB,EAAIlM,MAAMiC,EAAQ,EAAGH,IAC9Cb,EAAOiV,IAAK,EACLjV,EACW,KAAT+pB,EACTkY,IACkB,KAATlY,GAAyBlpB,EAAM,EAAIK,IAC5CL,IAC4B,KAAxBoK,EAAI0L,WAAW9V,IACjBohC,KAIJphC,IAGF,OAAOb,I,6BCzCT,IAAI65B,EAAkB,EAAQ,GAAkBA,OAC5CM,EAAkB,EAAQ,GAAkBA,YAC5CK,EAAkB,EAAQ,GAAkBA,WAK5C24C,EAAgB,GAgHpB,SAAS/F,IA8BP/uE,KAAKgX,MAAQwkB,EAAO,GAAIs5C,GA3I1BA,EAActzC,YAAc,SAAUluB,EAAQo4D,EAAK51D,EAAS66D,EAAKoE,GAC/D,IAAIn1C,EAAQtsB,EAAOo4D,GAEnB,MAAQ,QAAUqJ,EAAIC,YAAYp1C,GAAS,IACnCzD,EAAW7oB,EAAOo4D,GAAK3rE,SACvB,WAIV+0E,EAAcn2C,WAAa,SAAUrrB,EAAQo4D,EAAK51D,EAAS66D,EAAKoE,GAC9D,IAAIn1C,EAAQtsB,EAAOo4D,GAEnB,MAAQ,OAASqJ,EAAIC,YAAYp1C,GAAS,UAClCzD,EAAW7oB,EAAOo4D,GAAK3rE,SACvB,mBAIV+0E,EAAcxzC,MAAQ,SAAUhuB,EAAQo4D,EAAK51D,EAAS66D,EAAKoE,GACzD,IAGIE,EAAan3E,EAAGo3E,EAAUC,EAH1Bv1C,EAAQtsB,EAAOo4D,GACfhrC,EAAOd,EAAMc,KAAO5E,EAAY8D,EAAMc,MAAMljB,OAAS,GACrD43D,EAAW,GAaf,OAVI10C,IACF00C,EAAW10C,EAAKntB,MAAM,QAAQ,IASI,KALlC0hE,EADEn/D,EAAQu/D,WACIv/D,EAAQu/D,UAAUz1C,EAAM7/B,QAASq1E,IAEjCj5C,EAAWyD,EAAM7/B,UAGjB6Q,QAAQ,QACfqkE,EAAc,KAMnBv0C,GACF5iC,EAAW8hC,EAAMksC,UAAU,SAC3BoJ,EAAWt1C,EAAMp5B,MAAQo5B,EAAMp5B,MAAM9F,QAAU,GAE3C5C,EAAI,EACNo3E,EAASv0E,KAAK,CAAE,QAASmV,EAAQw/D,WAAaF,IAE9CF,EAASp3E,GAAG,IAAM,IAAMgY,EAAQw/D,WAAaF,EAI/CD,EAAW,CACT3uE,MAAO0uE,GAGD,aAAeH,EAAIC,YAAYG,GAAY,IAC3CF,EACA,mBAIF,aAAeF,EAAIC,YAAYp1C,GAAS,IACxCq1C,EACA,mBAIVH,EAAc71C,MAAQ,SAAU3rB,EAAQo4D,EAAK51D,EAAS66D,EAAKoE,GACzD,IAAIn1C,EAAQtsB,EAAOo4D,GAUnB,OAHA9rC,EAAMp5B,MAAMo5B,EAAMksC,UAAU,QAAQ,GAClCiJ,EAAIQ,mBAAmB31C,EAAMmB,SAAUjrB,EAAS66D,GAE3CoE,EAAIS,YAAYliE,EAAQo4D,EAAK51D,IAItCg/D,EAAcvzC,UAAY,SAAUjuB,EAAQo4D,EAAK51D,GAC/C,OAAOA,EAAQ2/D,SAAW,WAAa,UAEzCX,EAAc9zC,UAAY,SAAU1tB,EAAQo4D,EAAK51D,GAC/C,OAAOA,EAAQ4/D,OAAU5/D,EAAQ2/D,SAAW,WAAa,SAAY,MAIvEX,EAAc3xE,KAAO,SAAUmQ,EAAQo4D,GACrC,OAAOvvC,EAAW7oB,EAAOo4D,GAAK3rE,UAIhC+0E,EAAca,WAAa,SAAUriE,EAAQo4D,GAC3C,OAAOp4D,EAAOo4D,GAAK3rE,SAErB+0E,EAAcc,YAAc,SAAUtiE,EAAQo4D,GAC5C,OAAOp4D,EAAOo4D,GAAK3rE,SAgDrBgvE,EAASrvE,UAAUs1E,YAAc,SAAqBp1C,GACpD,IAAI9hC,EAAGC,EAAG4D,EAEV,IAAKi+B,EAAMp5B,MAAS,MAAO,GAI3B,IAFA7E,EAAS,GAEJ7D,EAAI,EAAGC,EAAI6hC,EAAMp5B,MAAMrG,OAAQrC,EAAIC,EAAGD,IACzC6D,GAAU,IAAMw6B,EAAWyD,EAAMp5B,MAAM1I,GAAG,IAAM,KAAOq+B,EAAWyD,EAAMp5B,MAAM1I,GAAG,IAAM,IAGzF,OAAO6D,GAaTotE,EAASrvE,UAAU81E,YAAc,SAAqBliE,EAAQo4D,EAAK51D,GACjE,IAAI+/D,EACAl0E,EAAS,GACTm0E,GAAS,EACTl2C,EAAQtsB,EAAOo4D,GAGnB,OAAI9rC,EAAMsB,OACD,IAULtB,EAAMxf,QAA4B,IAAnBwf,EAAMgpC,SAAkB8C,GAAOp4D,EAAOo4D,EAAM,GAAGxqC,SAChEv/B,GAAU,MAIZA,KAA8B,IAAnBi+B,EAAMgpC,QAAiB,KAAO,KAAOhpC,EAAMvoB,IAGtD1V,GAAU3B,KAAKg1E,YAAYp1C,GAGL,IAAlBA,EAAMgpC,SAAiB9yD,EAAQ2/D,WACjC9zE,GAAU,MAIRi+B,EAAMxf,QACR01D,GAAS,EAEa,IAAlBl2C,EAAMgpC,SACJ8C,EAAM,EAAIp4D,EAAOnT,SAGI,YAFvB01E,EAAYviE,EAAOo4D,EAAM,IAEX5kE,MAAqB+uE,EAAU30C,SAKX,IAAvB20C,EAAUjN,SAAkBiN,EAAUx+D,MAAQuoB,EAAMvoB,OAF7Dy+D,GAAS,IAWjBn0E,GAAUm0E,EAAS,MAAQ,MAc7B/G,EAASrvE,UAAUyiC,aAAe,SAAU7uB,EAAQwC,EAAS66D,GAK3D,IAJA,IAAI7pE,EACAnF,EAAS,GACTqV,EAAQhX,KAAKgX,MAERlZ,EAAI,EAAGgwB,EAAMxa,EAAOnT,OAAQrC,EAAIgwB,EAAKhwB,SAGjB,IAAhBkZ,EAFXlQ,EAAOwM,EAAOxV,GAAGgJ,MAGfnF,GAAUqV,EAAMlQ,GAAMwM,EAAQxV,EAAGgY,EAAS66D,EAAK3wE,MAE/C2B,GAAU3B,KAAKw1E,YAAYliE,EAAQxV,EAAGgY,GAI1C,OAAOnU,GAcTotE,EAASrvE,UAAU61E,mBAAqB,SAAUjiE,EAAQwC,EAAS66D,GAGjE,IAFA,IAAIhvE,EAAS,GAEJ7D,EAAI,EAAGgwB,EAAMxa,EAAOnT,OAAQrC,EAAIgwB,EAAKhwB,IACrB,SAAnBwV,EAAOxV,GAAGgJ,KACZnF,GAAU2R,EAAOxV,GAAGiC,QACQ,UAAnBuT,EAAOxV,GAAGgJ,OACnBnF,GAAU3B,KAAKu1E,mBAAmBjiE,EAAOxV,GAAGijC,SAAUjrB,EAAS66D,IAInE,OAAOhvE,GAaTotE,EAASrvE,UAAUokC,OAAS,SAAUxwB,EAAQwC,EAAS66D,GACrD,IAAI7yE,EAAGgwB,EAAKhnB,EACRnF,EAAS,GACTqV,EAAQhX,KAAKgX,MAEjB,IAAKlZ,EAAI,EAAGgwB,EAAMxa,EAAOnT,OAAQrC,EAAIgwB,EAAKhwB,IAG3B,YAFbgJ,EAAOwM,EAAOxV,GAAGgJ,MAGfnF,GAAU3B,KAAKmiC,aAAa7uB,EAAOxV,GAAGijC,SAAUjrB,EAAS66D,QACzB,IAAhB35D,EAAMlQ,GACtBnF,GAAUqV,EAAM1D,EAAOxV,GAAGgJ,MAAMwM,EAAQxV,EAAGgY,EAAS66D,EAAK3wE,MAEzD2B,GAAU3B,KAAKw1E,YAAYliE,EAAQxV,EAAGgY,EAAS66D,GAInD,OAAOhvE,GAGT9D,EAAOD,QAAUmxE,G,6BCrUjB,IAAInE,EAAS,EAAQ,IAGjBmL,EAAS,CACX,CAAE,YAAkB,EAAQ,KAC5B,CAAE,QAAkB,EAAQ,KAC5B,CAAE,SAAkB,EAAQ,KAC5B,CAAE,UAAkB,EAAQ,KAC5B,CAAE,eAAkB,EAAQ,KAC5B,CAAE,cAAkB,EAAQ,MAO9B,SAASC,IAMPh2E,KAAK+lE,MAAQ,IAAI6E,EAEjB,IAAK,IAAI9sE,EAAI,EAAGA,EAAIi4E,EAAO51E,OAAQrC,IACjCkC,KAAK+lE,MAAMplE,KAAKo1E,EAAOj4E,GAAG,GAAIi4E,EAAOj4E,GAAG,IAU5Ck4E,EAAKt2E,UAAUmxE,QAAU,SAAU//D,GACjC,IAAIhT,EAAGC,EAAGiZ,EAIV,IAAKlZ,EAAI,EAAGC,GAFZiZ,EAAQhX,KAAK+lE,MAAM+B,SAAS,KAEN3nE,OAAQrC,EAAIC,EAAGD,IACnCkZ,EAAMlZ,GAAGgT,IAIbklE,EAAKt2E,UAAUkxE,MAAQ,EAAQ,IAG/B/yE,EAAOD,QAAUo4E,G,6BCnDjB,IAAIC,EAAe,YACfC,EAAe,MAGnBr4E,EAAOD,QAAU,SAAmBkT,GAClC,IAAIlE,EAMJA,GAHAA,EAAMkE,EAAMurB,IAAI9zB,QAAQ0tE,EAAa,OAG3B1tE,QAAQ2tE,EAAS,KAE3BplE,EAAMurB,IAAMzvB,I,6BChBd/O,EAAOD,QAAU,SAAekT,GAC9B,IAAI8uB,EAEA9uB,EAAMigE,aACRnxC,EAAiB,IAAI9uB,EAAM+6D,MAAM,SAAU,GAAI,IACzC9rE,QAAW+Q,EAAMurB,IACvBuD,EAAMt+B,IAAW,CAAE,EAAG,GACtBs+B,EAAMmB,SAAW,GACjBjwB,EAAMwC,OAAO3S,KAAKi/B,IAElB9uB,EAAMg1D,GAAG1lD,MAAMtQ,MAAMgB,EAAMurB,IAAKvrB,EAAMg1D,GAAIh1D,EAAM6/D,IAAK7/D,EAAMwC,U,6BCX/DzV,EAAOD,QAAU,SAAgBkT,GAC/B,IAA2BkE,EAAKlX,EAAGC,EAA/BuV,EAASxC,EAAMwC,OAGnB,IAAKxV,EAAI,EAAGC,EAAIuV,EAAOnT,OAAQrC,EAAIC,EAAGD,IAEnB,YADjBkX,EAAM1B,EAAOxV,IACLgJ,MACNgK,EAAMg1D,GAAGzyD,OAAOvD,MAAMkF,EAAIjV,QAAS+Q,EAAMg1D,GAAIh1D,EAAM6/D,IAAK37D,EAAI+rB,Y,6BCFlE,IAAI3E,EAAiB,EAAQ,GAAmBA,eAMhD,SAAS+5C,EAAYvpE,GACnB,MAAO,aAAaiH,KAAKjH,GAI3B/O,EAAOD,QAAU,SAAiBkT,GAChC,IAAIhT,EAAG+G,EAAG9G,EAAGuV,EAAQssB,EAAOw2C,EAAc7vE,EAAO8vE,EAAIlzE,EAAMX,EAAK4rE,EAC5D/sD,EAAOi1D,EAAe5G,EAAK6G,EAASC,EAEpCC,EAZc7pE,EAWd8pE,EAAc5lE,EAAMwC,OAGxB,GAAKxC,EAAMg1D,GAAGhwD,QAAQu6D,QAEtB,IAAKxrE,EAAI,EAAG9G,EAAI24E,EAAYv2E,OAAQ0E,EAAI9G,EAAG8G,IACzC,GAA4B,WAAxB6xE,EAAY7xE,GAAGiC,MACdgK,EAAMg1D,GAAGuK,QAAQsG,QAAQD,EAAY7xE,GAAG9E,SAU7C,IAJAu2E,EAAgB,EAIXx4E,GANLwV,EAASojE,EAAY7xE,GAAGk8B,UAMR5gC,OAAS,EAAGrC,GAAK,EAAGA,IAIlC,GAA0B,gBAH1Bs4E,EAAe9iE,EAAOxV,IAGLgJ,MAiBjB,GAR0B,gBAAtBsvE,EAAatvE,OAzCH8F,EA0CGwpE,EAAar2E,QAzC3B,YAAY8T,KAAKjH,IAyCsB0pE,EAAgB,GACtDA,IAEEH,EAAYC,EAAar2E,UAC3Bu2E,OAGAA,EAAgB,IAEM,SAAtBF,EAAatvE,MAAmBgK,EAAMg1D,GAAGuK,QAAQx8D,KAAKuiE,EAAar2E,SAAU,CAU/E,IARAoD,EAAOizE,EAAar2E,QACpB02E,EAAQ3lE,EAAMg1D,GAAGuK,QAAQ9hE,MAAMpL,GAG/BoD,EAAQ,GACR8a,EAAQ+0D,EAAa/0D,MACrB+sD,EAAU,EAELiI,EAAK,EAAGA,EAAKI,EAAMt2E,OAAQk2E,IAE9B3G,EAAM+G,EAAMJ,GAAI3G,IAChB6G,EAAUzlE,EAAMg1D,GAAG8J,cAAcF,GAC5B5+D,EAAMg1D,GAAG2J,aAAa8G,KAE3BC,EAAUC,EAAMJ,GAAIlzE,KAWlBqzE,EALGC,EAAMJ,GAAIrwE,OAEiB,YAArBywE,EAAMJ,GAAIrwE,QAAyB,YAAY6N,KAAK2iE,GAGnD1lE,EAAMg1D,GAAGmK,kBAAkBuG,GAF3B1lE,EAAMg1D,GAAGmK,kBAAkB,UAAYuG,GAASjuE,QAAQ,WAAY,IAFpEuI,EAAMg1D,GAAGmK,kBAAkB,UAAYuG,GAASjuE,QAAQ,aAAc,KAOlF/F,EAAMi0E,EAAMJ,GAAInyE,OAENkqE,KACRxuC,EAAgB,IAAI9uB,EAAM+6D,MAAM,OAAQ,GAAI,IACtC9rE,QAAUoD,EAAKzC,MAAM0tE,EAAS5rE,GACpCo9B,EAAMve,MAAUA,EAChB9a,EAAM5F,KAAKi/B,KAGbA,EAAgB,IAAI9uB,EAAM+6D,MAAM,YAAa,IAAK,IAC5CrlE,MAAU,CAAE,CAAE,OAAQ+vE,IAC5B32C,EAAMve,MAAUA,IAChBue,EAAMwC,OAAU,UAChBxC,EAAMc,KAAU,OAChBn6B,EAAM5F,KAAKi/B,IAEXA,EAAgB,IAAI9uB,EAAM+6D,MAAM,OAAQ,GAAI,IACtC9rE,QAAUy2E,EAChB52C,EAAMve,MAAUA,EAChB9a,EAAM5F,KAAKi/B,IAEXA,EAAgB,IAAI9uB,EAAM+6D,MAAM,aAAc,KAAM,IAC9CxqD,QAAYA,EAClBue,EAAMwC,OAAU,UAChBxC,EAAMc,KAAU,OAChBn6B,EAAM5F,KAAKi/B,GAEXwuC,EAAUqI,EAAMJ,GAAIO,WAElBxI,EAAUjrE,EAAKhD,UACjBy/B,EAAgB,IAAI9uB,EAAM+6D,MAAM,OAAQ,GAAI,IACtC9rE,QAAUoD,EAAKzC,MAAM0tE,GAC3BxuC,EAAMve,MAAUA,EAChB9a,EAAM5F,KAAKi/B,IAIb82C,EAAY7xE,GAAGk8B,SAAWztB,EAAS8oB,EAAe9oB,EAAQxV,EAAGyI,SApF7D,IADAzI,IACOwV,EAAOxV,GAAGujB,QAAU+0D,EAAa/0D,OAA4B,cAAnB/N,EAAOxV,GAAGgJ,MACzDhJ,M,6BC5BV,IAAI+4E,EAAU,+BAIVC,EAAsB,kBAEtBC,EAAiB,mBACjBC,EAAc,CAChB74E,EAAG,IACHS,EAAG,IACHgB,EAAG,IACHq3E,GAAI,KAGN,SAASC,EAAU3oE,EAAOlQ,GACxB,OAAO24E,EAAY34E,EAAKigB,eAG1B,SAAS64D,EAAeC,GACtB,IAAIt5E,EAAG8hC,EAAOy3C,EAAkB,EAEhC,IAAKv5E,EAAIs5E,EAAaj3E,OAAS,EAAGrC,GAAK,EAAGA,IAGrB,UAFnB8hC,EAAQw3C,EAAat5E,IAEXgJ,MAAoBuwE,IAC5Bz3C,EAAM7/B,QAAU6/B,EAAM7/B,QAAQwI,QAAQwuE,EAAgBG,IAGrC,cAAft3C,EAAM94B,MAAuC,SAAf84B,EAAMc,MACtC22C,IAGiB,eAAfz3C,EAAM94B,MAAwC,SAAf84B,EAAMc,MACvC22C,IAKN,SAASC,EAAaF,GACpB,IAAIt5E,EAAG8hC,EAAOy3C,EAAkB,EAEhC,IAAKv5E,EAAIs5E,EAAaj3E,OAAS,EAAGrC,GAAK,EAAGA,IAGrB,UAFnB8hC,EAAQw3C,EAAat5E,IAEXgJ,MAAoBuwE,GACxBR,EAAQhjE,KAAK+rB,EAAM7/B,WACrB6/B,EAAM7/B,QAAU6/B,EAAM7/B,QACnBwI,QAAQ,OAAQ,KAGhBA,QAAQ,UAAW,KAAKA,QAAQ,WAAY,QAC5CA,QAAQ,cAAe,UAAUA,QAAQ,SAAU,KAEnDA,QAAQ,wBAAyB,SAEjCA,QAAQ,mBAAoB,SAC5BA,QAAQ,2BAA4B,UAIxB,cAAfq3B,EAAM94B,MAAuC,SAAf84B,EAAMc,MACtC22C,IAGiB,eAAfz3C,EAAM94B,MAAwC,SAAf84B,EAAMc,MACvC22C,IAMNx5E,EAAOD,QAAU,SAAiBkT,GAChC,IAAIymE,EAEJ,GAAKzmE,EAAMg1D,GAAGhwD,QAAQ0hE,YAEtB,IAAKD,EAASzmE,EAAMwC,OAAOnT,OAAS,EAAGo3E,GAAU,EAAGA,IAEhB,WAA9BzmE,EAAMwC,OAAOikE,GAAQzwE,OAErBgwE,EAAoBjjE,KAAK/C,EAAMwC,OAAOikE,GAAQx3E,UAChDo3E,EAAermE,EAAMwC,OAAOikE,GAAQx2C,UAGlC81C,EAAQhjE,KAAK/C,EAAMwC,OAAOikE,GAAQx3E,UACpCu3E,EAAaxmE,EAAMwC,OAAOikE,GAAQx2C,a,6BCjGxC,IAAIvE,EAAiB,EAAQ,GAAmBA,aAC5CE,EAAiB,EAAQ,GAAmBA,YAC5CD,EAAiB,EAAQ,GAAmBA,eAE5Cg7C,EAAgB,OAChBC,EAAW,QAIf,SAASC,EAAU/qE,EAAK1I,EAAOg3B,GAC7B,OAAOtuB,EAAI0mE,OAAO,EAAGpvE,GAASg3B,EAAKtuB,EAAI0mE,OAAOpvE,EAAQ,GAGxD,SAAS0zE,EAAgBtkE,EAAQxC,GAC/B,IAAIhT,EAAG8hC,EAAOz8B,EAAMnE,EAAGwD,EAAKK,EAAKg1E,EAAWzoD,EAAM0oD,EAAU9J,EACxD+J,EAAiBC,EAAiBC,EAAkBC,EACpDC,EAASC,EAAUvzE,EAAGwzE,EAAU14C,EAAO24C,EAAWC,EAItD,IAFA54C,EAAQ,GAEH7hC,EAAI,EAAGA,EAAIwV,EAAOnT,OAAQrC,IAAK,CAKlC,IAJA8hC,EAAQtsB,EAAOxV,GAEf+5E,EAAYvkE,EAAOxV,GAAGujB,MAEjBxc,EAAI86B,EAAMx/B,OAAS,EAAG0E,GAAK,KAC1B86B,EAAM96B,GAAGwc,OAASw2D,GADWhzE,KAKnC,GAFA86B,EAAMx/B,OAAS0E,EAAI,EAEA,SAAf+6B,EAAM94B,KAAV,CAGAtE,EAAM,EACNK,GAFAM,EAAOy8B,EAAM7/B,SAEFI,OAGXq4E,EACA,KAAOh2E,EAAMK,IACX60E,EAASd,UAAYp0E,EACrBxD,EAAI04E,EAAS97D,KAAKzY,KAFF,CAchB,GATAg1E,EAAUC,GAAW,EACrB51E,EAAMxD,EAAEkF,MAAQ,EAChBm0E,EAAqB,MAATr5E,EAAE,GAKd84E,EAAW,GAEP94E,EAAEkF,MAAQ,GAAK,EACjB4zE,EAAW30E,EAAKmV,WAAWtZ,EAAEkF,MAAQ,QAErC,IAAKW,EAAI/G,EAAI,EAAG+G,GAAK,IACI,cAAnByO,EAAOzO,GAAGiC,MAA2C,cAAnBwM,EAAOzO,GAAGiC,MAD1BjC,IAEtB,GAAuB,SAAnByO,EAAOzO,GAAGiC,KAAd,CAEAgxE,EAAWxkE,EAAOzO,GAAG9E,QAAQuY,WAAWhF,EAAOzO,GAAG9E,QAAQI,OAAS,GACnE,MASJ,GAFA6tE,EAAW,GAEPxrE,EAAMK,EACRmrE,EAAW7qE,EAAKmV,WAAW9V,QAE3B,IAAKqC,EAAI/G,EAAI,EAAG+G,EAAIyO,EAAOnT,SACF,cAAnBmT,EAAOzO,GAAGiC,MAA2C,cAAnBwM,EAAOzO,GAAGiC,MADfjC,IAEjC,GAAuB,SAAnByO,EAAOzO,GAAGiC,KAAd,CAEAknE,EAAW16D,EAAOzO,GAAG9E,QAAQuY,WAAW,GACxC,MAuCJ,GAnCAy/D,EAAkBt7C,EAAeq7C,IAAap7C,EAAYpC,OAAOC,aAAau9C,IAC9EE,EAAkBv7C,EAAeuxC,IAAatxC,EAAYpC,OAAOC,aAAayzC,IAE9EiK,EAAmBz7C,EAAas7C,IAChCI,EAAmB17C,EAAawxC,IAG9BmK,GAAU,EACDH,IACHC,GAAoBF,IACxBI,GAAU,IAIVF,EACFG,GAAW,EACFL,IACHG,GAAoBF,IACxBI,GAAW,IAIE,KAAbpK,GAAsC,MAAThvE,EAAE,IAC7B84E,GAAY,IAAgBA,GAAY,KAE1CM,EAAWD,GAAU,GAIrBA,GAAWC,IAEbD,GAAU,EACVC,EAAWJ,GAGRG,GAAYC,EAAjB,CAQA,GAAIA,EAEF,IAAKvzE,EAAI86B,EAAMx/B,OAAS,EAAG0E,GAAK,IAC9BuqB,EAAOuQ,EAAM96B,KACT86B,EAAM96B,GAAGwc,MAAQw2D,IAFYhzE,IAGjC,GAAIuqB,EAAKqpD,SAAWJ,GAAY14C,EAAM96B,GAAGwc,QAAUw2D,EAAW,CAC5DzoD,EAAOuQ,EAAM96B,GAETwzE,GACFC,EAAYxnE,EAAMg1D,GAAGhwD,QAAQ4iE,OAAO,GACpCH,EAAaznE,EAAMg1D,GAAGhwD,QAAQ4iE,OAAO,KAErCJ,EAAYxnE,EAAMg1D,GAAGhwD,QAAQ4iE,OAAO,GACpCH,EAAaznE,EAAMg1D,GAAGhwD,QAAQ4iE,OAAO,IAMvC94C,EAAM7/B,QAAU43E,EAAU/3C,EAAM7/B,QAASf,EAAEkF,MAAOq0E,GAClDjlE,EAAO8b,EAAKwQ,OAAO7/B,QAAU43E,EAC3BrkE,EAAO8b,EAAKwQ,OAAO7/B,QAASqvB,EAAK5sB,IAAK81E,GAExC91E,GAAO+1E,EAAWp4E,OAAS,EACvBivB,EAAKwQ,QAAU9hC,IAAK0E,GAAO81E,EAAUn4E,OAAS,GAGlD0C,GADAM,EAAOy8B,EAAM7/B,SACFI,OAEXw/B,EAAMx/B,OAAS0E,EACf,SAAS2zE,EAKXL,EACFx4C,EAAMh/B,KAAK,CACTi/B,MAAO9hC,EACP0E,IAAKxD,EAAEkF,MACPu0E,OAAQJ,EACRh3D,MAAOw2D,IAEAO,GAAYC,IACrBz4C,EAAM7/B,QAAU43E,EAAU/3C,EAAM7/B,QAASf,EAAEkF,MAjKlC,WAgHLm0E,IACFz4C,EAAM7/B,QAAU43E,EAAU/3C,EAAM7/B,QAASf,EAAEkF,MAjHpC,SAwKjBrG,EAAOD,QAAU,SAAqBkT,GAEpC,IAAIymE,EAEJ,GAAKzmE,EAAMg1D,GAAGhwD,QAAQ0hE,YAEtB,IAAKD,EAASzmE,EAAMwC,OAAOnT,OAAS,EAAGo3E,GAAU,EAAGA,IAEhB,WAA9BzmE,EAAMwC,OAAOikE,GAAQzwE,MACpB2wE,EAAc5jE,KAAK/C,EAAMwC,OAAOikE,GAAQx3E,UAI7C63E,EAAgB9mE,EAAMwC,OAAOikE,GAAQx2C,SAAUjwB,K,6BC5LnD,IAAI+6D,EAAQ,EAAQ,IAGpB,SAAS8M,EAAUt8C,EAAKypC,EAAI6K,GAC1B3wE,KAAKq8B,IAAMA,EACXr8B,KAAK2wE,IAAMA,EACX3wE,KAAKsT,OAAS,GACdtT,KAAK+wE,YAAa,EAClB/wE,KAAK8lE,GAAKA,EAIZ6S,EAAUj5E,UAAUmsE,MAAQA,EAG5BhuE,EAAOD,QAAU+6E,G,6BCXjB,IAAI/N,EAAkB,EAAQ,IAG1BmL,EAAS,CAGX,CAAE,QAAc,EAAQ,IAA6B,CAAE,YAAa,cACpE,CAAE,OAAc,EAAQ,KACxB,CAAE,QAAc,EAAQ,IAA6B,CAAE,YAAa,YAAa,aAAc,SAC/F,CAAE,aAAc,EAAQ,IAA6B,CAAE,YAAa,YAAa,aAAc,SAC/F,CAAE,KAAc,EAAQ,IAA6B,CAAE,YAAa,YAAa,aAAc,SAC/F,CAAE,OAAc,EAAQ,IAA6B,CAAE,YAAa,YAAa,eACjF,CAAE,YAAc,EAAQ,KACxB,CAAE,UAAc,EAAQ,IAA6B,CAAE,YAAa,YAAa,eACjF,CAAE,WAAc,EAAQ,KACxB,CAAE,aAAc,EAAQ,IAA6B,CAAE,YAAa,YAAa,eACjF,CAAE,YAAc,EAAQ,MAO1B,SAAS9G,IAMPjvE,KAAK+lE,MAAQ,IAAI6E,EAEjB,IAAK,IAAI9sE,EAAI,EAAGA,EAAIi4E,EAAO51E,OAAQrC,IACjCkC,KAAK+lE,MAAMplE,KAAKo1E,EAAOj4E,GAAG,GAAIi4E,EAAOj4E,GAAG,GAAI,CAAEohC,KAAM62C,EAAOj4E,GAAG,IAAM,IAAI4C,UAO5EuuE,EAAYvvE,UAAUimE,SAAW,SAAU70D,EAAOo1D,EAAWC,GAQ3D,IAPA,IAAQroE,EACJkZ,EAAQhX,KAAK+lE,MAAM+B,SAAS,IAC5Bh6C,EAAM9W,EAAM7W,OACZ4nE,EAAO7B,EACP0S,GAAgB,EAChBC,EAAa/nE,EAAMg1D,GAAGhwD,QAAQ+iE,WAE3B9Q,EAAO5B,IACZr1D,EAAMi3D,KAAOA,EAAOj3D,EAAMgoE,eAAe/Q,KACrCA,GAAQ5B,OAIRr1D,EAAMy2D,OAAOQ,GAAQj3D,EAAM02D,YANV,CAUrB,GAAI12D,EAAMuQ,OAASw3D,EAAY,CAC7B/nE,EAAMi3D,KAAO5B,EACb,MAUF,IAAKroE,EAAI,EAAGA,EAAIgwB,IACT9W,EAAMlZ,GAAGgT,EAAOi3D,EAAM5B,GAAS,GADjBroE,KAOrBgT,EAAMguB,OAAS85C,EAGX9nE,EAAMioE,QAAQjoE,EAAMi3D,KAAO,KAC7B6Q,GAAgB,IAGlB7Q,EAAOj3D,EAAMi3D,MAEF5B,GAAWr1D,EAAMioE,QAAQhR,KAClC6Q,GAAgB,EAChB7Q,IACAj3D,EAAMi3D,KAAOA,KAWnBkH,EAAYvvE,UAAUoQ,MAAQ,SAAUusB,EAAKypC,EAAI6K,EAAKqI,GACpD,IAAIloE,EAECurB,IAELvrB,EAAQ,IAAI9Q,KAAK4wE,MAAMv0C,EAAKypC,EAAI6K,EAAKqI,GAErCh5E,KAAK2lE,SAAS70D,EAAOA,EAAMi3D,KAAMj3D,EAAMq2D,WAIzC8H,EAAYvvE,UAAUkxE,MAAQ,EAAQ,IAGtC/yE,EAAOD,QAAUqxE,G,6BCrHjB,IAAI1yC,EAAU,EAAQ,GAAmBA,QAGzC,SAAS08C,EAAQnoE,EAAOi3D,GACtB,IAAIvlE,EAAMsO,EAAMs2D,OAAOW,GAAQj3D,EAAM02D,UACjC3kE,EAAMiO,EAAMw2D,OAAOS,GAEvB,OAAOj3D,EAAMurB,IAAIi3C,OAAO9wE,EAAKK,EAAML,GAGrC,SAAS02E,EAAatsE,GACpB,IAGIsuB,EAHAv5B,EAAS,GACTa,EAAM,EACNK,EAAM+J,EAAIzM,OAEVg5E,EAAU,EACV/K,EAAU,EACVgL,GAAa,EACbC,EAAe,EAInB,IAFAn+C,EAAMtuB,EAAI0L,WAAW9V,GAEdA,EAAMK,GACA,KAAPq4B,EACEk+C,GAGFA,GAAa,EACbC,EAAe72E,GACN22E,EAAU,GAAM,IACzBC,GAAa,EACbC,EAAe72E,GAED,MAAP04B,GAAuBi+C,EAAU,GAAM,GAAOC,IACvDz3E,EAAOhB,KAAKiM,EAAI0sE,UAAUlL,EAAS5rE,IACnC4rE,EAAU5rE,EAAM,GAGP,KAAP04B,EACFi+C,IAEAA,EAAU,IAGZ32E,IAIYK,GAAOu2E,IACjBA,GAAa,EACb52E,EAAM62E,EAAe,GAGvBn+C,EAAKtuB,EAAI0L,WAAW9V,GAKtB,OAFAb,EAAOhB,KAAKiM,EAAI0sE,UAAUlL,IAEnBzsE,EAIT9D,EAAOD,QAAU,SAAekT,EAAOo1D,EAAWC,EAASP,GACzD,IAAI1qC,EAAIq+C,EAAU/2E,EAAK1E,EAAGyoE,EAAUiT,EAASC,EAAa75C,EACtD85C,EAAQ16E,EAAG26E,EAAYC,EAG3B,GAAI1T,EAAY,EAAIC,EAAW,OAAO,EAItC,GAFAI,EAAWL,EAAY,EAEnBp1D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,UAAa,OAAO,EAGvD,GAAI12D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,WAAa,EAAK,OAAO,EAO5D,IADAhlE,EAAMsO,EAAMs2D,OAAOb,GAAYz1D,EAAMu2D,OAAOd,KACjCz1D,EAAMw2D,OAAOf,GAAa,OAAO,EAG5C,GAAW,OADXrrC,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,OACO,KAAP04B,GAA6B,KAAPA,EAAsB,OAAO,EAE7E,KAAO14B,EAAMsO,EAAMw2D,OAAOf,IAAW,CAGnC,GAAW,OAFXrrC,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,KAEO,KAAP04B,GAA6B,KAAPA,IAAuBqB,EAAQrB,GAAO,OAAO,EAE7F14B,IAOF,IAFAg3E,GAFAD,EAAWN,EAAQnoE,EAAOo1D,EAAY,IAEnB3yD,MAAM,KACzBmmE,EAAS,GACJ57E,EAAI,EAAGA,EAAI07E,EAAQr5E,OAAQrC,IAAK,CAEnC,KADAkB,EAAIw6E,EAAQ17E,GAAG0f,QACP,CAGN,GAAU,IAAN1f,GAAWA,IAAM07E,EAAQr5E,OAAS,EACpC,SAEA,OAAO,EAIX,IAAK,WAAW0T,KAAK7U,GAAM,OAAO,EACC,KAA/BA,EAAEsZ,WAAWtZ,EAAEmB,OAAS,GAC1Bu5E,EAAO/4E,KAAyB,KAApB3B,EAAEsZ,WAAW,GAAqB,SAAW,SAC5B,KAApBtZ,EAAEsZ,WAAW,GACtBohE,EAAO/4E,KAAK,QAEZ+4E,EAAO/4E,KAAK,IAKhB,IAA+B,KAD/B44E,EAAWN,EAAQnoE,EAAOo1D,GAAW1oD,QACxB5M,QAAQ,KAAe,OAAO,EAC3C,GAAIE,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,WAAa,EAAK,OAAO,EAM7D,IADAiS,GAJAD,EAAUN,EAAaK,EAAShxE,QAAQ,WAAY,MAI9BpI,QACJu5E,EAAOv5E,OAAU,OAAO,EAE1C,GAAIylE,EAAU,OAAO,EAWrB,KATAhmC,EAAY9uB,EAAMnQ,KAAK,aAAc,QAAS,IACxCW,IAAMq4E,EAAa,CAAEzT,EAAW,IAEtCtmC,EAAY9uB,EAAMnQ,KAAK,aAAc,QAAS,IACxCW,IAAM,CAAE4kE,EAAWA,EAAY,IAErCtmC,EAAY9uB,EAAMnQ,KAAK,UAAW,KAAM,IAClCW,IAAM,CAAE4kE,EAAWA,EAAY,GAEhCpoE,EAAI,EAAGA,EAAI07E,EAAQr5E,OAAQrC,KAC9B8hC,EAAiB9uB,EAAMnQ,KAAK,UAAW,KAAM,IACvCW,IAAW,CAAE4kE,EAAWA,EAAY,GACtCwT,EAAO57E,KACT8hC,EAAMp5B,MAAS,CAAE,CAAE,QAAS,cAAgBkzE,EAAO57E,OAGrD8hC,EAAiB9uB,EAAMnQ,KAAK,SAAU,GAAI,IACpCZ,QAAWy5E,EAAQ17E,GAAG0f,OAC5BoiB,EAAMt+B,IAAW,CAAE4kE,EAAWA,EAAY,GAC1CtmC,EAAMmB,SAAW,GAEjBnB,EAAiB9uB,EAAMnQ,KAAK,WAAY,MAAO,GASjD,IANAi/B,EAAY9uB,EAAMnQ,KAAK,WAAY,MAAO,GAC1Ci/B,EAAY9uB,EAAMnQ,KAAK,cAAe,SAAU,IAEhDi/B,EAAY9uB,EAAMnQ,KAAK,aAAc,QAAS,IACxCW,IAAMs4E,EAAa,CAAE1T,EAAY,EAAG,GAErCK,EAAWL,EAAY,EAAGK,EAAWJ,KACpCr1D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,aAGJ,KAD/B+R,EAAWN,EAAQnoE,EAAOy1D,GAAU/oD,QACvB5M,QAAQ,QACjBE,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,WAAa,GALCjB,IAAY,CAS7D,IAHAiT,EAAUN,EAAaK,EAAShxE,QAAQ,WAAY,KAEpDq3B,EAAQ9uB,EAAMnQ,KAAK,UAAW,KAAM,GAC/B7C,EAAI,EAAGA,EAAI27E,EAAa37E,IAC3B8hC,EAAiB9uB,EAAMnQ,KAAK,UAAW,KAAM,GACzC+4E,EAAO57E,KACT8hC,EAAMp5B,MAAS,CAAE,CAAE,QAAS,cAAgBkzE,EAAO57E,OAGrD8hC,EAAiB9uB,EAAMnQ,KAAK,SAAU,GAAI,IACpCZ,QAAWy5E,EAAQ17E,GAAK07E,EAAQ17E,GAAG0f,OAAS,GAClDoiB,EAAMmB,SAAW,GAEjBnB,EAAiB9uB,EAAMnQ,KAAK,WAAY,MAAO,GAEjDi/B,EAAQ9uB,EAAMnQ,KAAK,WAAY,MAAO,GAOxC,OALAi/B,EAAQ9uB,EAAMnQ,KAAK,cAAe,SAAU,GAC5Ci/B,EAAQ9uB,EAAMnQ,KAAK,cAAe,SAAU,GAE5Cg5E,EAAW,GAAKC,EAAW,GAAKrT,EAChCz1D,EAAMi3D,KAAOxB,GACN,I,6BC7LT1oE,EAAOD,QAAU,SAAckT,EAAOo1D,EAAWC,GAC/C,IAAII,EAAU7iE,EAAMk8B,EAEpB,GAAI9uB,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,UAAY,EAAK,OAAO,EAI5D,IAFA9jE,EAAO6iE,EAAWL,EAAY,EAEvBK,EAAWJ,GAChB,GAAIr1D,EAAMioE,QAAQxS,GAChBA,QADF,CAKA,KAAIz1D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,WAAa,GAKhD,MAHE9jE,IADA6iE,EAaJ,OANAz1D,EAAMi3D,KAAOrkE,GAEbk8B,EAAgB9uB,EAAMnQ,KAAK,aAAc,OAAQ,IAC3CZ,QAAU+Q,EAAMu9D,SAASnI,EAAWxiE,EAAM,EAAIoN,EAAM02D,WAAW,GACrE5nC,EAAMt+B,IAAU,CAAE4kE,EAAWp1D,EAAMi3D,OAE5B,I,6BC3BTlqE,EAAOD,QAAU,SAAekT,EAAOo1D,EAAWC,EAASP,GACzD,IAAI6C,EAAQ36C,EAAK8Q,EAAQ2nC,EAAUsT,EAAKj6C,EAAOwC,EAC3C03C,GAAgB,EAChBt3E,EAAMsO,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,GAC7CrjE,EAAMiO,EAAMw2D,OAAOpB,GAGvB,GAAIp1D,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,WAAa,EAAK,OAAO,EAE7D,GAAIhlE,EAAM,EAAIK,EAAO,OAAO,EAI5B,GAAe,OAFf4lE,EAAS33D,EAAMurB,IAAI/jB,WAAW9V,KAEW,KAAXimE,EAC5B,OAAO,EAST,GALAoR,EAAMr3E,GAGNsrB,GAFAtrB,EAAMsO,EAAMipE,UAAUv3E,EAAKimE,IAEfoR,GAEF,EAAK,OAAO,EAKtB,GAHAz3C,EAAStxB,EAAMurB,IAAI37B,MAAMm5E,EAAKr3E,GAC9Bo8B,EAAS9tB,EAAMurB,IAAI37B,MAAM8B,EAAKK,GAEf,KAAX4lE,GACE7pC,EAAOhuB,QAAQ0pB,OAAOC,aAAakuC,KAAY,EACjD,OAAO,EAKX,GAAI7C,EAAU,OAAO,EAKrB,IAFAW,EAAWL,MAGTK,GACgBJ,OAMhB3jE,EAAMq3E,EAAM/oE,EAAMs2D,OAAOb,GAAYz1D,EAAMu2D,OAAOd,KAClD1jE,EAAMiO,EAAMw2D,OAAOf,KAEFz1D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,YAOhD,GAAI12D,EAAMurB,IAAI/jB,WAAW9V,KAASimE,KAE9B33D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,WAAa,IAKhDhlE,EAAMsO,EAAMipE,UAAUv3E,EAAKimE,IAGjBoR,EAAM/rD,IAGhBtrB,EAAMsO,EAAMkpE,WAAWx3E,IAEbK,GAAV,CAEAi3E,GAAgB,EAEhB,MAcF,OAVAhsD,EAAMhd,EAAMy2D,OAAOrB,GAEnBp1D,EAAMi3D,KAAOxB,GAAYuT,EAAgB,EAAI,IAE7Cl6C,EAAgB9uB,EAAMnQ,KAAK,QAAS,OAAQ,IACtC+/B,KAAU9B,EAChBgB,EAAM7/B,QAAU+Q,EAAMu9D,SAASnI,EAAY,EAAGK,EAAUz4C,GAAK,GAC7D8R,EAAMwC,OAAUA,EAChBxC,EAAMt+B,IAAU,CAAE4kE,EAAWp1D,EAAMi3D,OAE5B,I,6BC5FT,IAAIxrC,EAAU,EAAQ,GAAmBA,QAGzC1+B,EAAOD,QAAU,SAAoBkT,EAAOo1D,EAAWC,EAASP,GAC9D,IAAIQ,EACAlrC,EACAp9B,EACAuoE,EACAtoE,EACAuoE,EACA1iC,EACA2iC,EACA7/D,EACA8/D,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACApnC,EACAqnC,EACAC,EAAap2D,EAAMq2D,QACnB3kE,EAAMsO,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,GAC7CrjE,EAAMiO,EAAMw2D,OAAOpB,GAGvB,GAAIp1D,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,WAAa,EAAK,OAAO,EAG7D,GAAoC,KAAhC12D,EAAMurB,IAAI/jB,WAAW9V,KAA0B,OAAO,EAI1D,GAAIojE,EAAU,OAAO,EAqCrB,IAlCAS,EAAU3/D,EAASoK,EAAMy2D,OAAOrB,GAAa1jE,GAAOsO,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,IAGzD,KAA9Bp1D,EAAMurB,IAAI/jB,WAAW9V,IAGvBA,IACA6jE,IACA3/D,IACA0/D,GAAY,EACZU,GAAmB,GACoB,IAA9Bh2D,EAAMurB,IAAI/jB,WAAW9V,IAC9BskE,GAAmB,GAEdh2D,EAAM42D,QAAQxB,GAAax/D,GAAU,GAAM,GAG9ClE,IACA6jE,IACA3/D,IACA0/D,GAAY,GAKZA,GAAY,GAGdU,GAAmB,EAGrBN,EAAY,CAAE11D,EAAMs2D,OAAOlB,IAC3Bp1D,EAAMs2D,OAAOlB,GAAa1jE,EAEnBA,EAAMK,IACXq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,GAEtB+5B,EAAQrB,KACC,IAAPA,EACFx0B,GAAU,GAAKA,EAASoK,EAAM42D,QAAQxB,IAAcE,EAAY,EAAI,IAAM,EAE1E1/D,IAMJlE,IAsCF,IAnCAikE,EAAa,CAAE31D,EAAM42D,QAAQxB,IAC7Bp1D,EAAM42D,QAAQxB,GAAap1D,EAAMy2D,OAAOrB,GAAa,GAAKY,EAAmB,EAAI,GAEjFR,EAAgB9jE,GAAOK,EAEvB+jE,EAAY,CAAE91D,EAAMy2D,OAAOrB,IAC3Bp1D,EAAMy2D,OAAOrB,GAAax/D,EAAS2/D,EAEnCQ,EAAY,CAAE/1D,EAAMu2D,OAAOnB,IAC3Bp1D,EAAMu2D,OAAOnB,GAAa1jE,EAAMsO,EAAMs2D,OAAOlB,GAE7Cc,EAAkBl2D,EAAMg1D,GAAG1lD,MAAM2lD,MAAM+B,SAAS,cAEhDnB,EAAgB71D,EAAM8lB,WACtB9lB,EAAM8lB,WAAa,aACnBqwC,GAAe,EAoBVV,EAAWL,EAAY,EAAGK,EAAWJ,IASpCr1D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,YAAWP,GAAe,MAE7DzkE,EAAMsO,EAAMs2D,OAAOb,GAAYz1D,EAAMu2D,OAAOd,MAC5C1jE,EAAMiO,EAAMw2D,OAAOf,MAZ8BA,IAmBjD,GAAoC,KAAhCz1D,EAAMurB,IAAI/jB,WAAW9V,MAA2BykE,EAApD,CAoEA,GAAIX,EAAiB,MAIrB,IADAS,GAAY,EACPjpE,EAAI,EAAGC,EAAIipE,EAAgB7mE,OAAQrC,EAAIC,EAAGD,IAC7C,GAAIkpE,EAAgBlpE,GAAGgT,EAAOy1D,EAAUJ,GAAS,GAAO,CACtDY,GAAY,EACZ,MAIJ,GAAIA,EAAW,CAKbj2D,EAAMq2D,QAAUZ,EAEQ,IAApBz1D,EAAM02D,YAIRhB,EAAU7lE,KAAKmQ,EAAMs2D,OAAOb,IAC5BE,EAAW9lE,KAAKmQ,EAAM42D,QAAQnB,IAC9BM,EAAUlmE,KAAKmQ,EAAMu2D,OAAOd,IAC5BK,EAAUjmE,KAAKmQ,EAAMy2D,OAAOhB,IAC5Bz1D,EAAMy2D,OAAOhB,IAAaz1D,EAAM02D,WAGlC,MAGFhB,EAAU7lE,KAAKmQ,EAAMs2D,OAAOb,IAC5BE,EAAW9lE,KAAKmQ,EAAM42D,QAAQnB,IAC9BM,EAAUlmE,KAAKmQ,EAAMu2D,OAAOd,IAC5BK,EAAUjmE,KAAKmQ,EAAMy2D,OAAOhB,IAI5Bz1D,EAAMy2D,OAAOhB,IAAa,MA3G1B,CAsCE,IAlCAF,EAAU3/D,EAASoK,EAAMy2D,OAAOhB,GAAY/jE,GAAOsO,EAAMs2D,OAAOb,GAAYz1D,EAAMu2D,OAAOd,IAGvD,KAA9Bz1D,EAAMurB,IAAI/jB,WAAW9V,IAGvBA,IACA6jE,IACA3/D,IACA0/D,GAAY,EACZU,GAAmB,GACoB,IAA9Bh2D,EAAMurB,IAAI/jB,WAAW9V,IAC9BskE,GAAmB,GAEdh2D,EAAM42D,QAAQnB,GAAY7/D,GAAU,GAAM,GAG7ClE,IACA6jE,IACA3/D,IACA0/D,GAAY,GAKZA,GAAY,GAGdU,GAAmB,EAGrBN,EAAU7lE,KAAKmQ,EAAMs2D,OAAOb,IAC5Bz1D,EAAMs2D,OAAOb,GAAY/jE,EAElBA,EAAMK,IACXq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,GAEtB+5B,EAAQrB,KACC,IAAPA,EACFx0B,GAAU,GAAKA,EAASoK,EAAM42D,QAAQnB,IAAaH,EAAY,EAAI,IAAM,EAEzE1/D,IAMJlE,IAGF8jE,EAAgB9jE,GAAOK,EAEvB4jE,EAAW9lE,KAAKmQ,EAAM42D,QAAQnB,IAC9Bz1D,EAAM42D,QAAQnB,GAAYz1D,EAAMy2D,OAAOhB,GAAY,GAAKO,EAAmB,EAAI,GAE/EF,EAAUjmE,KAAKmQ,EAAMy2D,OAAOhB,IAC5Bz1D,EAAMy2D,OAAOhB,GAAY7/D,EAAS2/D,EAElCQ,EAAUlmE,KAAKmQ,EAAMu2D,OAAOd,IAC5Bz1D,EAAMu2D,OAAOd,GAAY/jE,EAAMsO,EAAMs2D,OAAOb,GAiEhD,IAlBAG,EAAY51D,EAAM02D,UAClB12D,EAAM02D,UAAY,GAElB5nC,EAAe9uB,EAAMnQ,KAAK,kBAAmB,aAAc,IACrDyhC,OAAS,IACfxC,EAAMt+B,IAASsiC,EAAQ,CAAEsiC,EAAW,GAEpCp1D,EAAMg1D,GAAG1lD,MAAMulD,SAAS70D,EAAOo1D,EAAWK,IAE1C3mC,EAAe9uB,EAAMnQ,KAAK,mBAAoB,cAAe,IACvDyhC,OAAS,IAEftxB,EAAMq2D,QAAUD,EAChBp2D,EAAM8lB,WAAa+vC,EACnB/iC,EAAM,GAAK9yB,EAAMi3D,KAIZjqE,EAAI,EAAGA,EAAI+oE,EAAU1mE,OAAQrC,IAChCgT,EAAMs2D,OAAOtpE,EAAIooE,GAAaM,EAAU1oE,GACxCgT,EAAMu2D,OAAOvpE,EAAIooE,GAAaW,EAAU/oE,GACxCgT,EAAMy2D,OAAOzpE,EAAIooE,GAAaU,EAAU9oE,GACxCgT,EAAM42D,QAAQ5pE,EAAIooE,GAAaO,EAAW3oE,GAI5C,OAFAgT,EAAM02D,UAAYd,GAEX,I,6BCvRT,IAAInqC,EAAU,EAAQ,GAAmBA,QAGzC1+B,EAAOD,QAAU,SAAYkT,EAAOo1D,EAAWC,EAASP,GACtD,IAAI6C,EAAQwR,EAAK/+C,EAAI0E,EACjBp9B,EAAMsO,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,GAC7CrjE,EAAMiO,EAAMw2D,OAAOpB,GAGvB,GAAIp1D,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,WAAa,EAAK,OAAO,EAK7D,GAAe,MAHfiB,EAAS33D,EAAMurB,IAAI/jB,WAAW9V,OAIf,KAAXimE,GACW,KAAXA,EACF,OAAO,EAMT,IADAwR,EAAM,EACCz3E,EAAMK,GAAK,CAEhB,IADAq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,QACfimE,IAAWlsC,EAAQrB,GAAO,OAAO,EACxCA,IAAOutC,GAAUwR,IAGvB,QAAIA,EAAM,KAENrU,IAEJ90D,EAAMi3D,KAAO7B,EAAY,GAEzBtmC,EAAe9uB,EAAMnQ,KAAK,KAAM,KAAM,IAChCW,IAAS,CAAE4kE,EAAWp1D,EAAMi3D,MAClCnoC,EAAMwC,OAASn8B,MAAMg0E,EAAM,GAAGp0E,KAAKy0B,OAAOC,aAAakuC,MANlC,K,6BC/BvB,IAAIlsC,EAAU,EAAQ,GAAmBA,QAKzC,SAAS29C,EAAqBppE,EAAOo1D,GACnC,IAAIuC,EAAQjmE,EAAKK,EAAKq4B,EAOtB,OALA14B,EAAMsO,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,GAC7CrjE,EAAMiO,EAAMw2D,OAAOpB,GAIJ,MAFfuC,EAAS33D,EAAMurB,IAAI/jB,WAAW9V,OAGf,KAAXimE,GACW,KAAXA,GAIAjmE,EAAMK,IACRq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,IAErB+5B,EAAQrB,KANL,EAYH14B,EAKT,SAAS23E,EAAsBrpE,EAAOo1D,GACpC,IAAIhrC,EACAv4B,EAAQmO,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,GAC/C1jE,EAAMG,EACNE,EAAMiO,EAAMw2D,OAAOpB,GAGvB,GAAI1jE,EAAM,GAAKK,EAAO,OAAQ,EAI9B,IAFAq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,MAEjB,IAAe04B,EAAK,GAAe,OAAQ,EAEpD,OAAS,CAEP,GAAI14B,GAAOK,EAAO,OAAQ,EAI1B,MAFAq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,OAEhB,IAAe04B,GAAM,IAA/B,CAUA,GAAW,KAAPA,GAA6B,KAAPA,EACxB,MAGF,OAAQ,EAVN,GAAI14B,EAAMG,GAAS,GAAM,OAAQ,EAcrC,OAAIH,EAAMK,IACRq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,IAErB+5B,EAAQrB,KAEH,EAGL14B,EAiBT3E,EAAOD,QAAU,SAAckT,EAAOo1D,EAAWC,EAASP,GACxD,IAAI1qC,EACAk/C,EACAt8E,EACAu8E,EACAC,EACAjU,EACAkU,EACAC,EACAz8E,EACA08E,EACAC,EACAC,EACAC,EACA/3E,EACA0jE,EACA7/D,EACAm0E,EACAlU,EACAC,EACAC,EACAiU,EACAt4E,EACAu4E,EACAC,EACAr4E,EACAokE,EACAC,EACApnC,EACAq7C,GAAyB,EACzBn8C,GAAQ,EAGZ,GAAIhuB,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,WAAa,EAAK,OAAO,EAQ7D,GAAI12D,EAAMoqE,YAAc,GACpBpqE,EAAMy2D,OAAOrB,GAAap1D,EAAMoqE,YAAc,GAC9CpqE,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,UAClC,OAAO,EAiBT,GAZI5B,GAA+B,cAArB90D,EAAM8lB,YAMd9lB,EAAMu2D,OAAOnB,IAAcp1D,EAAM02D,YACnCyT,GAAyB,IAKxBF,EAAiBZ,EAAsBrpE,EAAOo1D,KAAe,GAOhE,GANAqU,GAAY,EACZ53E,EAAQmO,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,GAC/C0U,EAAcvmE,OAAOvD,EAAMurB,IAAIi3C,OAAO3wE,EAAOo4E,EAAiBp4E,EAAQ,IAIlEs4E,GAA0C,IAAhBL,EAAmB,OAAO,MAEnD,OAAKG,EAAiBb,EAAqBppE,EAAOo1D,KAAe,GAItE,OAAO,EAHPqU,GAAY,EAQd,GAAIU,GACEnqE,EAAMkpE,WAAWe,IAAmBjqE,EAAMw2D,OAAOpB,GAAY,OAAO,EAO1E,GAHAyU,EAAiB7pE,EAAMurB,IAAI/jB,WAAWyiE,EAAiB,GAGnDnV,EAAU,OAAO,EA6BrB,IA1BA8U,EAAa5pE,EAAMwC,OAAOnT,OAEtBo6E,GACF36C,EAAc9uB,EAAMnQ,KAAK,oBAAqB,KAAM,GAChC,IAAhBi6E,IACFh7C,EAAMp5B,MAAQ,CAAE,CAAE,QAASo0E,MAI7Bh7C,EAAc9uB,EAAMnQ,KAAK,mBAAoB,KAAM,GAGrDi/B,EAAMt+B,IAASm5E,EAAY,CAAEvU,EAAW,GACxCtmC,EAAMwC,OAAS9H,OAAOC,aAAaogD,GAMnCpU,EAAWL,EACX8U,GAAe,EACfhU,EAAkBl2D,EAAMg1D,GAAG1lD,MAAM2lD,MAAM+B,SAAS,QAEhDnB,EAAgB71D,EAAM8lB,WACtB9lB,EAAM8lB,WAAa,OAEZ2vC,EAAWJ,GAAS,CAMzB,IALA3jE,EAAMu4E,EACNl4E,EAAMiO,EAAMw2D,OAAOf,GAEnBF,EAAU3/D,EAASoK,EAAMy2D,OAAOhB,GAAYwU,GAAkBjqE,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,IAE9F1jE,EAAMK,GAAK,CAGhB,GAAW,KAFXq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,IAGxBkE,GAAU,GAAKA,EAASoK,EAAM42D,QAAQnB,IAAa,MAC9C,IAAW,KAAPrrC,EAGT,MAFAx0B,IAKFlE,IA4EF,IArEE83E,GAJFF,EAAe53E,IAEKK,EAEE,EAEA6D,EAAS2/D,GAKP,IAAKiU,EAAoB,GAIjDD,EAAShU,EAAUiU,GAGnB16C,EAAe9uB,EAAMnQ,KAAK,iBAAkB,KAAM,IAC5CyhC,OAAS9H,OAAOC,aAAaogD,GACnC/6C,EAAMt+B,IAASk5E,EAAY,CAAEtU,EAAW,GAGxC4U,EAAWhqE,EAAMguB,MACjB+nC,EAAY/1D,EAAMu2D,OAAOnB,GACzBU,EAAY91D,EAAMy2D,OAAOrB,GAMzB2U,EAAgB/pE,EAAMoqE,WACtBpqE,EAAMoqE,WAAapqE,EAAM02D,UACzB12D,EAAM02D,UAAY6S,EAElBvpE,EAAMguB,OAAQ,EACdhuB,EAAMu2D,OAAOnB,GAAakU,EAAetpE,EAAMs2D,OAAOlB,GACtDp1D,EAAMy2D,OAAOrB,GAAax/D,EAEtB0zE,GAAgBv3E,GAAOiO,EAAMioE,QAAQ7S,EAAY,GAQnDp1D,EAAMi3D,KAAOnlE,KAAKE,IAAIgO,EAAMi3D,KAAO,EAAG5B,GAEtCr1D,EAAMg1D,GAAG1lD,MAAMulD,SAAS70D,EAAOo1D,EAAWC,GAAS,GAIhDr1D,EAAMguB,QAASk8C,IAClBl8C,GAAQ,GAIVk8C,EAAgBlqE,EAAMi3D,KAAO7B,EAAa,GAAKp1D,EAAMioE,QAAQjoE,EAAMi3D,KAAO,GAE1Ej3D,EAAM02D,UAAY12D,EAAMoqE,WACxBpqE,EAAMoqE,WAAaL,EACnB/pE,EAAMu2D,OAAOnB,GAAaW,EAC1B/1D,EAAMy2D,OAAOrB,GAAaU,EAC1B91D,EAAMguB,MAAQg8C,GAEdl7C,EAAe9uB,EAAMnQ,KAAK,kBAAmB,MAAO,IAC9CyhC,OAAS9H,OAAOC,aAAaogD,GAEnCpU,EAAWL,EAAYp1D,EAAMi3D,KAC7ByS,EAAU,GAAKjU,EACf6T,EAAetpE,EAAMs2D,OAAOlB,GAExBK,GAAYJ,EAAW,MAK3B,GAAIr1D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,UAAa,MAGhD,GAAI12D,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,WAAa,EAAK,MAItD,IADAT,GAAY,EACPjpE,EAAI,EAAGC,EAAIipE,EAAgB7mE,OAAQrC,EAAIC,EAAGD,IAC7C,GAAIkpE,EAAgBlpE,GAAGgT,EAAOy1D,EAAUJ,GAAS,GAAO,CACtDY,GAAY,EACZ,MAGJ,GAAIA,EAAa,MAGjB,GAAIwT,GAEF,IADAQ,EAAiBZ,EAAsBrpE,EAAOy1D,IACzB,EAAK,WAG1B,IADAwU,EAAiBb,EAAqBppE,EAAOy1D,IACxB,EAAK,MAG5B,GAAIoU,IAAmB7pE,EAAMurB,IAAI/jB,WAAWyiE,EAAiB,GAAM,MAqBrE,OAhBEn7C,EADE26C,EACMzpE,EAAMnQ,KAAK,qBAAsB,MAAO,GAExCmQ,EAAMnQ,KAAK,oBAAqB,MAAO,IAE3CyhC,OAAS9H,OAAOC,aAAaogD,GAEnCF,EAAU,GAAKlU,EACfz1D,EAAMi3D,KAAOxB,EAEbz1D,EAAM8lB,WAAa+vC,EAGf7nC,GA7QN,SAA6BhuB,EAAO46D,GAClC,IAAI5tE,EAAGC,EACHsjB,EAAQvQ,EAAMuQ,MAAQ,EAE1B,IAAKvjB,EAAI4tE,EAAM,EAAG3tE,EAAI+S,EAAMwC,OAAOnT,OAAS,EAAGrC,EAAIC,EAAGD,IAChDgT,EAAMwC,OAAOxV,GAAGujB,QAAUA,GAAkC,mBAAzBvQ,EAAMwC,OAAOxV,GAAGgJ,OACrDgK,EAAMwC,OAAOxV,EAAI,GAAGojC,QAAS,EAC7BpwB,EAAMwC,OAAOxV,GAAGojC,QAAS,EACzBpjC,GAAK,GAsQPq9E,CAAoBrqE,EAAO4pE,IAGtB,I,6BCnWT,IAAI99C,EAAuB,EAAQ,GAAmBA,mBAClDL,EAAuB,EAAQ,GAAmBA,QAGtD1+B,EAAOD,QAAU,SAAmBkT,EAAOo1D,EAAWkV,EAAUxV,GAC9D,IAAI1qC,EACAmgD,EACAC,EACAnV,EACA3mC,EACA1hC,EACAC,EACAw9E,EACA1G,EACAlO,EACAsH,EACAtrE,EACAiK,EACAm6D,EACAC,EACA/rD,EACA2oB,EAAQ,EACRphC,EAAMsO,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,GAC7CrjE,EAAMiO,EAAMw2D,OAAOpB,GACnBK,EAAWL,EAAY,EAG3B,GAAIp1D,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,WAAa,EAAK,OAAO,EAE7D,GAAkC,KAA9B12D,EAAMurB,IAAI/jB,WAAW9V,GAAwB,OAAO,EAIxD,OAASA,EAAMK,GACb,GAAkC,KAA9BiO,EAAMurB,IAAI/jB,WAAW9V,IACa,KAAlCsO,EAAMurB,IAAI/jB,WAAW9V,EAAM,GAAoB,CACjD,GAAIA,EAAM,IAAMK,EAAO,OAAO,EAC9B,GAAsC,KAAlCiO,EAAMurB,IAAI/jB,WAAW9V,EAAM,GAAsB,OAAO,EAC5D,MAYJ,IARA2jE,EAAUr1D,EAAMq2D,QAGhBH,EAAkBl2D,EAAMg1D,GAAG1lD,MAAM2lD,MAAM+B,SAAS,aAEhDnB,EAAgB71D,EAAM8lB,WACtB9lB,EAAM8lB,WAAa,YAEZ2vC,EAAWJ,IAAYr1D,EAAMioE,QAAQxS,GAAWA,IAGrD,KAAIz1D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,UAAY,GAG3C12D,EAAMy2D,OAAOhB,GAAY,GAA7B,CAIA,IADAQ,GAAY,EACPjpE,EAAI,EAAGC,EAAIipE,EAAgB7mE,OAAQrC,EAAIC,EAAGD,IAC7C,GAAIkpE,EAAgBlpE,GAAGgT,EAAOy1D,EAAUJ,GAAS,GAAO,CACtDY,GAAY,EACZ,MAGJ,GAAIA,EAAa,MAMnB,IAFAlkE,GADA+J,EAAMkE,EAAMu9D,SAASnI,EAAWK,EAAUz1D,EAAM02D,WAAW,GAAOhqD,QACxDrd,OAELqC,EAAM,EAAGA,EAAMK,EAAKL,IAAO,CAE9B,GAAW,MADX04B,EAAKtuB,EAAI0L,WAAW9V,IAElB,OAAO,EACF,GAAW,KAAP04B,EAAqB,CAC9B25C,EAAWryE,EACX,OACgB,KAAP04B,GAEO,KAAPA,KACT14B,EACUK,GAA+B,KAAxB+J,EAAI0L,WAAW9V,KAHhCohC,IASJ,GAAIixC,EAAW,GAAsC,KAAjCjoE,EAAI0L,WAAWu8D,EAAW,GAAsB,OAAO,EAI3E,IAAKryE,EAAMqyE,EAAW,EAAGryE,EAAMK,EAAKL,IAElC,GAAW,MADX04B,EAAKtuB,EAAI0L,WAAW9V,IAElBohC,SACK,IAAIrH,EAAQrB,GAGjB,MAOJ,KADA+yC,EAAMn9D,EAAMg1D,GAAGgJ,QAAQ2F,qBAAqB7nE,EAAKpK,EAAKK,IAC7C+T,GAAM,OAAO,EAGtB,GADA4oB,EAAO1uB,EAAMg1D,GAAG8J,cAAc3B,EAAIrhE,MAC7BkE,EAAMg1D,GAAG2J,aAAajwC,GAAS,OAAO,EAY3C,IANA67C,EAJA74E,EAAMyrE,EAAIzrE,IAKV84E,EAJA13C,GAASqqC,EAAIrqC,MAQbjhC,EAAQH,EACDA,EAAMK,EAAKL,IAEhB,GAAW,MADX04B,EAAKtuB,EAAI0L,WAAW9V,IAElBohC,SACK,IAAIrH,EAAQrB,GAGjB,MAkBJ,IAZA+yC,EAAMn9D,EAAMg1D,GAAGgJ,QAAQ4F,eAAe9nE,EAAKpK,EAAKK,GAC5CL,EAAMK,GAAOF,IAAUH,GAAOyrE,EAAIr3D,IACpCqE,EAAQgzD,EAAIrhE,IACZpK,EAAMyrE,EAAIzrE,IACVohC,GAASqqC,EAAIrqC,QAEb3oB,EAAQ,GACRzY,EAAM64E,EACNz3C,EAAQ03C,GAIH94E,EAAMK,IACXq4B,EAAKtuB,EAAI0L,WAAW9V,GACf+5B,EAAQrB,KACb14B,IAGF,GAAIA,EAAMK,GAA+B,KAAxB+J,EAAI0L,WAAW9V,IAC1ByY,EAMF,IAHAA,EAAQ,GACRzY,EAAM64E,EACNz3C,EAAQ03C,EACD94E,EAAMK,IACXq4B,EAAKtuB,EAAI0L,WAAW9V,GACf+5B,EAAQrB,KACb14B,IAKN,QAAIA,EAAMK,GAA+B,KAAxB+J,EAAI0L,WAAW9V,SAKhC+4E,EAAQ3+C,EAAmBhwB,EAAIlM,MAAM,EAAGm0E,OAQpCjP,SAEgC,IAAzB90D,EAAM6/D,IAAI6K,aACnB1qE,EAAM6/D,IAAI6K,WAAa,SAEkB,IAAhC1qE,EAAM6/D,IAAI6K,WAAWD,KAC9BzqE,EAAM6/D,IAAI6K,WAAWD,GAAS,CAAEtgE,MAAOA,EAAOukB,KAAMA,IAGtD1uB,EAAM8lB,WAAa+vC,EAEnB71D,EAAMi3D,KAAO7B,EAAYtiC,EAAQ,IAXZ,M,6BCpLvB,IAAIrH,EAAU,EAAQ,GAAmBA,QAGzC1+B,EAAOD,QAAU,SAAiBkT,EAAOo1D,EAAWC,EAASP,GAC3D,IAAI1qC,EAAI7Z,EAAOpV,EAAK2zB,EAChBp9B,EAAMsO,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,GAC7CrjE,EAAMiO,EAAMw2D,OAAOpB,GAGvB,GAAIp1D,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,WAAa,EAAK,OAAO,EAI7D,GAAW,MAFXtsC,EAAMpqB,EAAMurB,IAAI/jB,WAAW9V,KAEDA,GAAOK,EAAO,OAAO,EAK/C,IAFAwe,EAAQ,EACR6Z,EAAKpqB,EAAMurB,IAAI/jB,aAAa9V,GACd,KAAP04B,GAAsB14B,EAAMK,GAAOwe,GAAS,GACjDA,IACA6Z,EAAKpqB,EAAMurB,IAAI/jB,aAAa9V,GAG9B,QAAI6e,EAAQ,GAAM7e,EAAMK,IAAQ05B,EAAQrB,MAEpC0qC,IAIJ/iE,EAAMiO,EAAM2qE,eAAe54E,EAAKL,IAChCyJ,EAAM6E,EAAM4qE,cAAc74E,EAAK,GAAML,IAC3BA,GAAO+5B,EAAQzrB,EAAMurB,IAAI/jB,WAAWrM,EAAM,MAClDpJ,EAAMoJ,GAGR6E,EAAMi3D,KAAO7B,EAAY,GAEzBtmC,EAAe9uB,EAAMnQ,KAAK,eAAgB,IAAM25B,OAAOjZ,GAAQ,IACzD+gB,OAAS,WAAW1hC,MAAM,EAAG2gB,GACnCue,EAAMt+B,IAAS,CAAE4kE,EAAWp1D,EAAMi3D,OAElCnoC,EAAiB9uB,EAAMnQ,KAAK,SAAU,GAAI,IACpCZ,QAAW+Q,EAAMurB,IAAI37B,MAAM8B,EAAKK,GAAK2a,OAC3CoiB,EAAMt+B,IAAW,CAAE4kE,EAAWp1D,EAAMi3D,MACpCnoC,EAAMmB,SAAW,IAEjBnB,EAAe9uB,EAAMnQ,KAAK,gBAAiB,IAAM25B,OAAOjZ,IAAS,IAC3D+gB,OAAS,WAAW1hC,MAAM,EAAG2gB,KAtBd,K,6BCxBvBxjB,EAAOD,QAAU,SAAkBkT,EAAOo1D,EAAWC,GACnD,IAAIpmE,EAASgnE,EAAWjpE,EAAGC,EAAG6hC,EAAOp9B,EAAKK,EAAKwe,EAAOonD,EACxB9B,EAA1BJ,EAAWL,EAAY,EACvBc,EAAkBl2D,EAAMg1D,GAAG1lD,MAAM2lD,MAAM+B,SAAS,aAGpD,GAAIh3D,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,WAAa,EAAK,OAAO,EAM7D,IAJAb,EAAgB71D,EAAM8lB,WACtB9lB,EAAM8lB,WAAa,YAGZ2vC,EAAWJ,IAAYr1D,EAAMioE,QAAQxS,GAAWA,IAGrD,KAAIz1D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,UAAY,GAA/C,CAKA,GAAI12D,EAAMy2D,OAAOhB,IAAaz1D,EAAM02D,YAClChlE,EAAMsO,EAAMs2D,OAAOb,GAAYz1D,EAAMu2D,OAAOd,KAC5C1jE,EAAMiO,EAAMw2D,OAAOf,MAKF,MAFfkC,EAAS33D,EAAMurB,IAAI/jB,WAAW9V,KAEW,KAAXimE,KAC5BjmE,EAAMsO,EAAMipE,UAAUv3E,EAAKimE,IAC3BjmE,EAAMsO,EAAMkpE,WAAWx3E,KAEZK,GAAK,CACdwe,EAAoB,KAAXonD,EAAyB,EAAI,EACtC,MAOR,KAAI33D,EAAMy2D,OAAOhB,GAAY,GAA7B,CAIA,IADAQ,GAAY,EACPjpE,EAAI,EAAGC,EAAIipE,EAAgB7mE,OAAQrC,EAAIC,EAAGD,IAC7C,GAAIkpE,EAAgBlpE,GAAGgT,EAAOy1D,EAAUJ,GAAS,GAAO,CACtDY,GAAY,EACZ,MAGJ,GAAIA,EAAa,OAGnB,QAAK1lD,IAKLthB,EAAU+Q,EAAMu9D,SAASnI,EAAWK,EAAUz1D,EAAM02D,WAAW,GAAOhqD,OAEtE1M,EAAMi3D,KAAOxB,EAAW,GAExB3mC,EAAiB9uB,EAAMnQ,KAAK,eAAgB,IAAM25B,OAAOjZ,GAAQ,IAC3D+gB,OAAW9H,OAAOC,aAAakuC,GACrC7oC,EAAMt+B,IAAW,CAAE4kE,EAAWp1D,EAAMi3D,OAEpCnoC,EAAiB9uB,EAAMnQ,KAAK,SAAU,GAAI,IACpCZ,QAAWA,EACjB6/B,EAAMt+B,IAAW,CAAE4kE,EAAWp1D,EAAMi3D,KAAO,GAC3CnoC,EAAMmB,SAAW,IAEjBnB,EAAiB9uB,EAAMnQ,KAAK,gBAAiB,IAAM25B,OAAOjZ,IAAS,IAC7D+gB,OAAW9H,OAAOC,aAAakuC,GAErC33D,EAAM8lB,WAAa+vC,GAEZ,K,6BC5ET,IAAIgV,EAAc,EAAQ,IACtBlP,EAAyB,EAAQ,IAAqBA,uBAKtDmP,EAAiB,CACnB,CAAE,oCAAqC,2BAA2B,GAClE,CAAE,QAAgB,OAAS,GAC3B,CAAE,OAAgB,OAAS,GAC3B,CAAE,WAAgB,KAAS,GAC3B,CAAE,eAAgB,SAAS,GAC3B,CAAE,IAAIlhD,OAAO,QAAUihD,EAAY91E,KAAK,KAAO,mBAAoB,KAAM,MAAM,GAC/E,CAAE,IAAI60B,OAAO+xC,EAAuB9xC,OAAS,SAAW,MAAM,IAIhE98B,EAAOD,QAAU,SAAoBkT,EAAOo1D,EAAWC,EAASP,GAC9D,IAAI9nE,EAAGyoE,EAAU3mC,EAAO25C,EACpB/2E,EAAMsO,EAAMs2D,OAAOlB,GAAap1D,EAAMu2D,OAAOnB,GAC7CrjE,EAAMiO,EAAMw2D,OAAOpB,GAGvB,GAAIp1D,EAAMy2D,OAAOrB,GAAap1D,EAAM02D,WAAa,EAAK,OAAO,EAE7D,IAAK12D,EAAMg1D,GAAGhwD,QAAQsrB,KAAQ,OAAO,EAErC,GAAkC,KAA9BtwB,EAAMurB,IAAI/jB,WAAW9V,GAAwB,OAAO,EAIxD,IAFA+2E,EAAWzoE,EAAMurB,IAAI37B,MAAM8B,EAAKK,GAE3B/E,EAAI,EAAGA,EAAI89E,EAAez7E,SACzBy7E,EAAe99E,GAAG,GAAG+V,KAAK0lE,GADOz7E,KAIvC,GAAIA,IAAM89E,EAAez7E,OAAU,OAAO,EAE1C,GAAIylE,EAEF,OAAOgW,EAAe99E,GAAG,GAO3B,GAJAyoE,EAAWL,EAAY,GAIlB0V,EAAe99E,GAAG,GAAG+V,KAAK0lE,GAC7B,KAAOhT,EAAWJ,KACZr1D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,WADVjB,IAOzB,GAJA/jE,EAAMsO,EAAMs2D,OAAOb,GAAYz1D,EAAMu2D,OAAOd,GAC5C1jE,EAAMiO,EAAMw2D,OAAOf,GACnBgT,EAAWzoE,EAAMurB,IAAI37B,MAAM8B,EAAKK,GAE5B+4E,EAAe99E,GAAG,GAAG+V,KAAK0lE,GAAW,CACf,IAApBA,EAASp5E,QAAgBomE,IAC7B,MAWN,OANAz1D,EAAMi3D,KAAOxB,GAEb3mC,EAAgB9uB,EAAMnQ,KAAK,aAAc,GAAI,IACvCW,IAAU,CAAE4kE,EAAWK,GAC7B3mC,EAAM7/B,QAAU+Q,EAAMu9D,SAASnI,EAAWK,EAAUz1D,EAAM02D,WAAW,IAE9D,I,6BClET3pE,EAAOD,QAAU,CACf,UACA,UACA,QACA,OACA,WACA,aACA,OACA,UACA,SACA,MACA,WACA,KACA,UACA,SACA,MACA,MACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,QACA,WACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,KACA,OACA,SACA,SACA,KACA,OACA,OACA,OACA,WACA,OACA,MACA,WACA,KACA,WACA,SACA,IACA,QACA,UACA,SACA,UACA,QACA,QACA,KACA,QACA,KACA,QACA,QACA,KACA,QACA,O,6BChEFC,EAAOD,QAAU,SAAmBkT,EAAOo1D,GACzC,IAAInmE,EAASgnE,EAAWjpE,EAAGC,EAAG6hC,EAAO+mC,EACjCJ,EAAWL,EAAY,EACvBc,EAAkBl2D,EAAMg1D,GAAG1lD,MAAM2lD,MAAM+B,SAAS,aAChD3B,EAAUr1D,EAAMq2D,QAMpB,IAJAR,EAAgB71D,EAAM8lB,WACtB9lB,EAAM8lB,WAAa,YAGZ2vC,EAAWJ,IAAYr1D,EAAMioE,QAAQxS,GAAWA,IAGrD,KAAIz1D,EAAMy2D,OAAOhB,GAAYz1D,EAAM02D,UAAY,GAG3C12D,EAAMy2D,OAAOhB,GAAY,GAA7B,CAIA,IADAQ,GAAY,EACPjpE,EAAI,EAAGC,EAAIipE,EAAgB7mE,OAAQrC,EAAIC,EAAGD,IAC7C,GAAIkpE,EAAgBlpE,GAAGgT,EAAOy1D,EAAUJ,GAAS,GAAO,CACtDY,GAAY,EACZ,MAGJ,GAAIA,EAAa,MAmBnB,OAhBAhnE,EAAU+Q,EAAMu9D,SAASnI,EAAWK,EAAUz1D,EAAM02D,WAAW,GAAOhqD,OAEtE1M,EAAMi3D,KAAOxB,GAEb3mC,EAAiB9uB,EAAMnQ,KAAK,iBAAkB,IAAK,IAC7CW,IAAW,CAAE4kE,EAAWp1D,EAAMi3D,OAEpCnoC,EAAiB9uB,EAAMnQ,KAAK,SAAU,GAAI,IACpCZ,QAAWA,EACjB6/B,EAAMt+B,IAAW,CAAE4kE,EAAWp1D,EAAMi3D,MACpCnoC,EAAMmB,SAAW,GAEjBnB,EAAiB9uB,EAAMnQ,KAAK,kBAAmB,KAAM,GAErDmQ,EAAM8lB,WAAa+vC,GAEZ,I,6BC9CT,IAAIkF,EAAQ,EAAQ,IAChBtvC,EAAU,EAAQ,GAAmBA,QAGzC,SAASs/C,EAAWx/C,EAAKypC,EAAI6K,EAAKr9D,GAChC,IAAI4nB,EAAIr7B,EAAG8C,EAAOH,EAAKsrB,EAAKusD,EAAQ3zE,EAAQo1E,EAuD5C,IArDA97E,KAAKq8B,IAAMA,EAGXr8B,KAAK8lE,GAASA,EAEd9lE,KAAK2wE,IAAMA,EAMX3wE,KAAKsT,OAASA,EAEdtT,KAAKonE,OAAS,GACdpnE,KAAKsnE,OAAS,GACdtnE,KAAKqnE,OAAS,GACdrnE,KAAKunE,OAAS,GAYdvnE,KAAK0nE,QAAU,GAGf1nE,KAAKwnE,UAAa,EAElBxnE,KAAK+nE,KAAa,EAClB/nE,KAAKmnE,QAAa,EAClBnnE,KAAK8+B,OAAa,EAClB9+B,KAAK+7E,UAAc,EACnB/7E,KAAKk7E,YAAc,EAInBl7E,KAAK42B,WAAa,OAElB52B,KAAKqhB,MAAQ,EAGbrhB,KAAK2B,OAAS,GAKdm6E,GAAe,EAEVn5E,EAAQH,EAAM63E,EAAS3zE,EAAS,EAAGonB,GAHxCjuB,EAAIG,KAAKq8B,KAGuCl8B,OAAQqC,EAAMsrB,EAAKtrB,IAAO,CAGxE,GAFA04B,EAAKr7B,EAAEyY,WAAW9V,IAEbs5E,EAAc,CACjB,GAAIv/C,EAAQrB,GAAK,CACfm/C,IAEW,IAAPn/C,EACFx0B,GAAU,EAAIA,EAAS,EAEvBA,IAEF,SAEAo1E,GAAe,EAIR,KAAP5gD,GAAe14B,IAAQsrB,EAAM,IACpB,KAAPoN,GAAe14B,IACnBxC,KAAKonE,OAAOzmE,KAAKgC,GACjB3C,KAAKsnE,OAAO3mE,KAAK6B,GACjBxC,KAAKqnE,OAAO1mE,KAAK05E,GACjBr6E,KAAKunE,OAAO5mE,KAAK+F,GACjB1G,KAAK0nE,QAAQ/mE,KAAK,GAElBm7E,GAAe,EACfzB,EAAS,EACT3zE,EAAS,EACT/D,EAAQH,EAAM,GAKlBxC,KAAKonE,OAAOzmE,KAAKd,EAAEM,QACnBH,KAAKsnE,OAAO3mE,KAAKd,EAAEM,QACnBH,KAAKqnE,OAAO1mE,KAAK,GACjBX,KAAKunE,OAAO5mE,KAAK,GACjBX,KAAK0nE,QAAQ/mE,KAAK,GAElBX,KAAKmnE,QAAUnnE,KAAKonE,OAAOjnE,OAAS,EAKtC07E,EAAWn8E,UAAUiB,KAAO,SAAUmG,EAAMuQ,EAAKuxD,GAC/C,IAAIhpC,EAAQ,IAAIisC,EAAM/kE,EAAMuQ,EAAKuxD,GAQjC,OAPAhpC,EAAMxf,OAAQ,EAEVwoD,EAAU,GAAG5oE,KAAKqhB,QACtBue,EAAMve,MAAQrhB,KAAKqhB,MACfunD,EAAU,GAAG5oE,KAAKqhB,QAEtBrhB,KAAKsT,OAAO3S,KAAKi/B,GACVA,GAGTi8C,EAAWn8E,UAAUq5E,QAAU,SAAiBhR,GAC9C,OAAO/nE,KAAKonE,OAAOW,GAAQ/nE,KAAKqnE,OAAOU,IAAS/nE,KAAKsnE,OAAOS,IAG9D8T,EAAWn8E,UAAUo5E,eAAiB,SAAwBv3E,GAC5D,IAAK,IAAIsB,EAAM7C,KAAKmnE,QAAS5lE,EAAOsB,KAC9B7C,KAAKonE,OAAO7lE,GAAQvB,KAAKqnE,OAAO9lE,GAAQvB,KAAKsnE,OAAO/lE,IADjBA,KAKzC,OAAOA,GAITs6E,EAAWn8E,UAAUs6E,WAAa,SAAoBx3E,GAGpD,IAFA,IAAI04B,EAEKr4B,EAAM7C,KAAKq8B,IAAIl8B,OAAQqC,EAAMK,IACpCq4B,EAAKl7B,KAAKq8B,IAAI/jB,WAAW9V,GACpB+5B,EAAQrB,IAF4B14B,KAI3C,OAAOA,GAITq5E,EAAWn8E,UAAU+7E,eAAiB,SAAwBj5E,EAAKM,GACjE,GAAIN,GAAOM,EAAO,OAAON,EAEzB,KAAOA,EAAMM,GACX,IAAKy5B,EAAQv8B,KAAKq8B,IAAI/jB,aAAa9V,IAAS,OAAOA,EAAM,EAE3D,OAAOA,GAITq5E,EAAWn8E,UAAUq6E,UAAY,SAAmBv3E,EAAKkpB,GACvD,IAAK,IAAI7oB,EAAM7C,KAAKq8B,IAAIl8B,OAAQqC,EAAMK,GAChC7C,KAAKq8B,IAAI/jB,WAAW9V,KAASkpB,EADQlpB,KAG3C,OAAOA,GAITq5E,EAAWn8E,UAAUg8E,cAAgB,SAAuBl5E,EAAKkpB,EAAM5oB,GACrE,GAAIN,GAAOM,EAAO,OAAON,EAEzB,KAAOA,EAAMM,GACX,GAAI4oB,IAAS1rB,KAAKq8B,IAAI/jB,aAAa9V,GAAQ,OAAOA,EAAM,EAE1D,OAAOA,GAITq5E,EAAWn8E,UAAU2uE,SAAW,SAAkB2N,EAAOt5E,EAAK23E,EAAQ4B,GACpE,IAAIn+E,EAAGo+E,EAAYhhD,EAAIv3B,EAAOD,EAAMyuD,EAAOgqB,EACvCpU,EAAOiU,EAEX,GAAIA,GAASt5E,EACX,MAAO,GAKT,IAFAyvD,EAAQ,IAAIlsD,MAAMvD,EAAMs5E,GAEnBl+E,EAAI,EAAGiqE,EAAOrlE,EAAKqlE,IAAQjqE,IAAK,CAWnC,IAVAo+E,EAAa,EACbC,EAAYx4E,EAAQ3D,KAAKonE,OAAOW,GAI9BrkE,EAFEqkE,EAAO,EAAIrlE,GAAOu5E,EAEbj8E,KAAKsnE,OAAOS,GAAQ,EAEpB/nE,KAAKsnE,OAAOS,GAGdpkE,EAAQD,GAAQw4E,EAAa7B,GAAQ,CAG1C,GAFAn/C,EAAKl7B,KAAKq8B,IAAI/jB,WAAW3U,GAErB44B,EAAQrB,GACC,IAAPA,EACFghD,GAAc,GAAKA,EAAal8E,KAAK0nE,QAAQK,IAAS,EAEtDmU,QAEG,MAAIv4E,EAAQw4E,EAAYn8E,KAAKqnE,OAAOU,IAIzC,MAFAmU,IAKFv4E,IAMAwuD,EAAMr0D,GAHJo+E,EAAa7B,EAGJ,IAAIp0E,MAAMi2E,EAAa7B,EAAS,GAAGx0E,KAAK,KAAO7F,KAAKq8B,IAAI37B,MAAMiD,EAAOD,GAErE1D,KAAKq8B,IAAI37B,MAAMiD,EAAOD,GAIrC,OAAOyuD,EAAMtsD,KAAK,KAIpBg2E,EAAWn8E,UAAUmsE,MAAQA,EAG7BhuE,EAAOD,QAAUi+E,G,6BC9NjB,IAAIjR,EAAkB,EAAQ,IAM1BmL,EAAS,CACX,CAAE,OAAmB,EAAQ,KAC7B,CAAE,UAAmB,EAAQ,KAC7B,CAAE,SAAmB,EAAQ,KAC7B,CAAE,YAAmB,EAAQ,KAC7B,CAAE,gBAAmB,EAAQ,IAAgCpQ,UAC7D,CAAE,WAAmB,EAAQ,IAA2BA,UACxD,CAAE,OAAmB,EAAQ,KAC7B,CAAE,QAAmB,EAAQ,KAC7B,CAAE,WAAmB,EAAQ,KAC7B,CAAE,cAAmB,EAAQ,KAC7B,CAAE,SAAmB,EAAQ,MAG3ByW,EAAU,CACZ,CAAE,gBAAmB,EAAQ,MAC7B,CAAE,gBAAmB,EAAQ,IAAgC/T,aAC7D,CAAE,WAAmB,EAAQ,IAA2BA,aACxD,CAAE,gBAAmB,EAAQ,OAO/B,SAAS6G,IACP,IAAIpxE,EASJ,IAFAkC,KAAK+lE,MAAQ,IAAI6E,EAEZ9sE,EAAI,EAAGA,EAAIi4E,EAAO51E,OAAQrC,IAC7BkC,KAAK+lE,MAAMplE,KAAKo1E,EAAOj4E,GAAG,GAAIi4E,EAAOj4E,GAAG,IAW1C,IAFAkC,KAAKqpE,OAAS,IAAIuB,EAEb9sE,EAAI,EAAGA,EAAIs+E,EAAQj8E,OAAQrC,IAC9BkC,KAAKqpE,OAAO1oE,KAAKy7E,EAAQt+E,GAAG,GAAIs+E,EAAQt+E,GAAG,IAQ/CoxE,EAAaxvE,UAAUkuE,UAAY,SAAU98D,GAC3C,IAAI8F,EAAI9Y,EAAG0E,EAAMsO,EAAMtO,IACnBwU,EAAQhX,KAAK+lE,MAAM+B,SAAS,IAC5Bh6C,EAAM9W,EAAM7W,OACZ04E,EAAa/nE,EAAMg1D,GAAGhwD,QAAQ+iE,WAC9BzH,EAAQtgE,EAAMsgE,MAGlB,QAA0B,IAAfA,EAAM5uE,GAAjB,CAKA,GAAIsO,EAAMuQ,MAAQw3D,EAChB,IAAK/6E,EAAI,EAAGA,EAAIgwB,IAKdhd,EAAMuQ,QACNzK,EAAKI,EAAMlZ,GAAGgT,GAAO,GACrBA,EAAMuQ,SAEFzK,GATe9Y,UAuBrBgT,EAAMtO,IAAMsO,EAAM+0D,OAGfjvD,GAAM9F,EAAMtO,MACjB4uE,EAAM5uE,GAAOsO,EAAMtO,SAhCjBsO,EAAMtO,IAAM4uE,EAAM5uE,IAsCtB0sE,EAAaxvE,UAAUimE,SAAW,SAAU70D,GAO1C,IANA,IAAI8F,EAAI9Y,EACJkZ,EAAQhX,KAAK+lE,MAAM+B,SAAS,IAC5Bh6C,EAAM9W,EAAM7W,OACZuC,EAAMoO,EAAM+0D,OACZgT,EAAa/nE,EAAMg1D,GAAGhwD,QAAQ+iE,WAE3B/nE,EAAMtO,IAAME,GAAK,CAQtB,GAAIoO,EAAMuQ,MAAQw3D,EAChB,IAAK/6E,EAAI,EAAGA,EAAIgwB,KACdlX,EAAKI,EAAMlZ,GAAGgT,GAAO,IADFhT,KAMvB,GAAI8Y,GACF,GAAI9F,EAAMtO,KAAOE,EAAO,WAI1BoO,EAAMkL,SAAWlL,EAAMurB,IAAIvrB,EAAMtO,OAG/BsO,EAAMkL,SACRlL,EAAMurE,eAUVnN,EAAaxvE,UAAUoQ,MAAQ,SAAUlD,EAAKk5D,EAAI6K,EAAKqI,GACrD,IAAIl7E,EAAGkZ,EAAO8W,EACVhd,EAAQ,IAAI9Q,KAAK4wE,MAAMhkE,EAAKk5D,EAAI6K,EAAKqI,GAOzC,IALAh5E,KAAK2lE,SAAS70D,GAGdgd,GADA9W,EAAQhX,KAAKqpE,OAAOvB,SAAS,KACjB3nE,OAEPrC,EAAI,EAAGA,EAAIgwB,EAAKhwB,IACnBkZ,EAAMlZ,GAAGgT,IAKbo+D,EAAaxvE,UAAUkxE,MAAQ,EAAQ,KAGvC/yE,EAAOD,QAAUsxE,G,6BCnKjB,SAASxJ,EAAiBxqC,GACxB,OAAQA,GACN,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,IACL,KAAK,IACL,KAAK,IACH,OAAO,EACT,QACE,OAAO,GAIbr9B,EAAOD,QAAU,SAAckT,EAAO80D,GAGpC,IAFA,IAAIpjE,EAAMsO,EAAMtO,IAETA,EAAMsO,EAAM+0D,SAAWH,EAAiB50D,EAAMurB,IAAI/jB,WAAW9V,KAClEA,IAGF,OAAIA,IAAQsO,EAAMtO,MAEbojE,IAAU90D,EAAMkL,SAAWlL,EAAMurB,IAAI37B,MAAMoQ,EAAMtO,IAAKA,IAE3DsO,EAAMtO,IAAMA,GAEL,K,6BCrDT,IAAI+5B,EAAU,EAAQ,GAAmBA,QAGzC1+B,EAAOD,QAAU,SAAiBkT,EAAO80D,GACvC,IAAI0W,EAAMz5E,EAAKL,EAAMsO,EAAMtO,IAE3B,GAAkC,KAA9BsO,EAAMurB,IAAI/jB,WAAW9V,GAAyB,OAAO,EA2BzD,IAzBA85E,EAAOxrE,EAAMkL,QAAQ7b,OAAS,EAC9B0C,EAAMiO,EAAM+0D,OAMPD,IACC0W,GAAQ,GAAwC,KAAnCxrE,EAAMkL,QAAQ1D,WAAWgkE,GACpCA,GAAQ,GAA4C,KAAvCxrE,EAAMkL,QAAQ1D,WAAWgkE,EAAO,IAC/CxrE,EAAMkL,QAAUlL,EAAMkL,QAAQzT,QAAQ,MAAO,IAC7CuI,EAAMnQ,KAAK,YAAa,KAAM,KAE9BmQ,EAAMkL,QAAUlL,EAAMkL,QAAQtb,MAAM,GAAI,GACxCoQ,EAAMnQ,KAAK,YAAa,KAAM,IAIhCmQ,EAAMnQ,KAAK,YAAa,KAAM,IAIlC6B,IAGOA,EAAMK,GAAO05B,EAAQzrB,EAAMurB,IAAI/jB,WAAW9V,KAASA,IAG1D,OADAsO,EAAMtO,IAAMA,GACL,I,6BChCT,IAJA,IAAI+5B,EAAU,EAAQ,GAAmBA,QAErCggD,EAAU,GAELz+E,EAAI,EAAGA,EAAI,IAAKA,IAAOy+E,EAAQ57E,KAAK,GAE7C,qCACG4S,MAAM,IAAIpS,SAAQ,SAAU+5B,GAAMqhD,EAAQrhD,EAAG5iB,WAAW,IAAM,KAGjEza,EAAOD,QAAU,SAAgBkT,EAAO80D,GACtC,IAAI1qC,EAAI14B,EAAMsO,EAAMtO,IAAKK,EAAMiO,EAAM+0D,OAErC,GAAkC,KAA9B/0D,EAAMurB,IAAI/jB,WAAW9V,GAAwB,OAAO,EAIxD,KAFAA,EAEUK,EAAK,CAGb,IAFAq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,IAEjB,KAAuB,IAAhB+5E,EAAQrhD,GAGtB,OAFK0qC,IAAU90D,EAAMkL,SAAWlL,EAAMurB,IAAI75B,IAC1CsO,EAAMtO,KAAO,GACN,EAGT,GAAW,KAAP04B,EAAa,CAOf,IANK0qC,GACH90D,EAAMnQ,KAAK,YAAa,KAAM,GAGhC6B,IAEOA,EAAMK,IACXq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,GACrB+5B,EAAQrB,KACb14B,IAIF,OADAsO,EAAMtO,IAAMA,GACL,GAMX,OAFKojE,IAAU90D,EAAMkL,SAAW,MAChClL,EAAMtO,OACC,I,6BC9CT3E,EAAOD,QAAU,SAAkBkT,EAAO80D,GACxC,IAAIjjE,EAAOE,EAAK4lE,EAAQ35C,EAAYC,EAAU6Q,EAC1Cp9B,EAAMsO,EAAMtO,IAGhB,GAAW,KAFFsO,EAAMurB,IAAI/jB,WAAW9V,GAEJ,OAAO,EAMjC,IAJAG,EAAQH,EACRA,IACAK,EAAMiO,EAAM+0D,OAELrjE,EAAMK,GAAqC,KAA9BiO,EAAMurB,IAAI/jB,WAAW9V,IAAwBA,IAMjE,IAJAimE,EAAS33D,EAAMurB,IAAI37B,MAAMiC,EAAOH,GAEhCssB,EAAaC,EAAWvsB,GAEoC,KAApDssB,EAAahe,EAAMurB,IAAIzrB,QAAQ,IAAKme,KAAmB,CAG7D,IAFAA,EAAWD,EAAa,EAEjBC,EAAWlsB,GAA0C,KAAnCiO,EAAMurB,IAAI/jB,WAAWyW,IAA6BA,IAE3E,GAAIA,EAAWD,IAAe25C,EAAOtoE,OASnC,OARKylE,KACHhmC,EAAgB9uB,EAAMnQ,KAAK,cAAe,OAAQ,IAC5CyhC,OAAUqmC,EAChB7oC,EAAM7/B,QAAU+Q,EAAMurB,IAAI37B,MAAM8B,EAAKssB,GAClCvmB,QAAQ,MAAO,KACfA,QAAQ,WAAY,OAEzBuI,EAAMtO,IAAMusB,GACL,EAMX,OAFK62C,IAAU90D,EAAMkL,SAAWysD,GAChC33D,EAAMtO,KAAOimE,EAAOtoE,QACb,I,6BCrCT,IAAIy8B,EAAuB,EAAQ,GAAmBA,mBAClDL,EAAuB,EAAQ,GAAmBA,QAGtD1+B,EAAOD,QAAU,SAAckT,EAAO80D,GACpC,IAAIp/D,EACAklB,EACA6vD,EACA1G,EACA2H,EACAh6E,EACAyrE,EACArlE,EACAqS,EAEAukB,EAAO,GACPqoC,EAAS/2D,EAAMtO,IACfK,EAAMiO,EAAM+0D,OACZljE,EAAQmO,EAAMtO,IACdi6E,GAAiB,EAErB,GAAwC,KAApC3rE,EAAMurB,IAAI/jB,WAAWxH,EAAMtO,KAAwB,OAAO,EAM9D,GAJAg6E,EAAa1rE,EAAMtO,IAAM,GACzBqyE,EAAW/jE,EAAMg1D,GAAGgJ,QAAQ0F,eAAe1jE,EAAOA,EAAMtO,KAAK,IAG9C,EAAK,OAAO,EAG3B,IADAA,EAAMqyE,EAAW,GACPhyE,GAAqC,KAA9BiO,EAAMurB,IAAI/jB,WAAW9V,GAAsB,CAW1D,IALAi6E,GAAiB,EAIjBj6E,IACOA,EAAMK,IACX6oB,EAAO5a,EAAMurB,IAAI/jB,WAAW9V,GACvB+5B,EAAQ7Q,IAAkB,KAATA,GAFNlpB,KAIlB,GAAIA,GAAOK,EAAO,OAAO,EAkBzB,IAdAF,EAAQH,GACRyrE,EAAMn9D,EAAMg1D,GAAGgJ,QAAQ2F,qBAAqB3jE,EAAMurB,IAAK75B,EAAKsO,EAAM+0D,SAC1DjvD,KACN4oB,EAAO1uB,EAAMg1D,GAAG8J,cAAc3B,EAAIrhE,KAC9BkE,EAAMg1D,GAAG2J,aAAajwC,GACxBh9B,EAAMyrE,EAAIzrE,IAEVg9B,EAAO,IAMX78B,EAAQH,EACDA,EAAMK,IACX6oB,EAAO5a,EAAMurB,IAAI/jB,WAAW9V,GACvB+5B,EAAQ7Q,IAAkB,KAATA,GAFNlpB,KAQlB,GADAyrE,EAAMn9D,EAAMg1D,GAAGgJ,QAAQ4F,eAAe5jE,EAAMurB,IAAK75B,EAAKsO,EAAM+0D,QACxDrjE,EAAMK,GAAOF,IAAUH,GAAOyrE,EAAIr3D,GAMpC,IALAqE,EAAQgzD,EAAIrhE,IACZpK,EAAMyrE,EAAIzrE,IAIHA,EAAMK,IACX6oB,EAAO5a,EAAMurB,IAAI/jB,WAAW9V,GACvB+5B,EAAQ7Q,IAAkB,KAATA,GAFNlpB,UAKlByY,EAAQ,IAGNzY,GAAOK,GAAqC,KAA9BiO,EAAMurB,IAAI/jB,WAAW9V,MAErCi6E,GAAiB,GAEnBj6E,IAGF,GAAIi6E,EAAgB,CAIlB,QAAoC,IAAzB3rE,EAAM6/D,IAAI6K,WAA8B,OAAO,EAmB1D,GAjBIh5E,EAAMK,GAAqC,KAA9BiO,EAAMurB,IAAI/jB,WAAW9V,IACpCG,EAAQH,EAAM,GACdA,EAAMsO,EAAMg1D,GAAGgJ,QAAQ0F,eAAe1jE,EAAOtO,KAClC,EACT+4E,EAAQzqE,EAAMurB,IAAI37B,MAAMiC,EAAOH,KAE/BA,EAAMqyE,EAAW,GAGnBryE,EAAMqyE,EAAW,EAKd0G,IAASA,EAAQzqE,EAAMurB,IAAI37B,MAAM87E,EAAY3H,MAElDjsE,EAAMkI,EAAM6/D,IAAI6K,WAAW5+C,EAAmB2+C,KAG5C,OADAzqE,EAAMtO,IAAMqlE,GACL,EAETroC,EAAO52B,EAAI42B,KACXvkB,EAAQrS,EAAIqS,MAwBd,OAjBK2qD,IACH90D,EAAMtO,IAAMg6E,EACZ1rE,EAAM+0D,OAASgP,EAEA/jE,EAAMnQ,KAAK,YAAa,IAAK,GACtC6F,MAASA,EAAQ,CAAE,CAAE,OAAQg5B,IAC/BvkB,GACFzU,EAAM7F,KAAK,CAAE,QAASsa,IAGxBnK,EAAMg1D,GAAGzyD,OAAOsyD,SAAS70D,GAEVA,EAAMnQ,KAAK,aAAc,KAAM,IAGhDmQ,EAAMtO,IAAMA,EACZsO,EAAM+0D,OAAShjE,GACR,I,6BChJT,IAAI+5B,EAAuB,EAAQ,GAAmBA,mBAClDL,EAAuB,EAAQ,GAAmBA,QAGtD1+B,EAAOD,QAAU,SAAekT,EAAO80D,GACrC,IAAIp/D,EACAklB,EACA3rB,EACAw7E,EACA1G,EACA2H,EACAh6E,EACAoG,EACAqlE,EACAhzD,EACA2kB,EACAtsB,EACA3Q,EACA68B,EAAO,GACPqoC,EAAS/2D,EAAMtO,IACfK,EAAMiO,EAAM+0D,OAEhB,GAAwC,KAApC/0D,EAAMurB,IAAI/jB,WAAWxH,EAAMtO,KAAwB,OAAO,EAC9D,GAA4C,KAAxCsO,EAAMurB,IAAI/jB,WAAWxH,EAAMtO,IAAM,GAAsB,OAAO,EAMlE,GAJAg6E,EAAa1rE,EAAMtO,IAAM,GACzBqyE,EAAW/jE,EAAMg1D,GAAGgJ,QAAQ0F,eAAe1jE,EAAOA,EAAMtO,IAAM,GAAG,IAGlD,EAAK,OAAO,EAG3B,IADAA,EAAMqyE,EAAW,GACPhyE,GAAqC,KAA9BiO,EAAMurB,IAAI/jB,WAAW9V,GAAsB,CAQ1D,IADAA,IACOA,EAAMK,IACX6oB,EAAO5a,EAAMurB,IAAI/jB,WAAW9V,GACvB+5B,EAAQ7Q,IAAkB,KAATA,GAFNlpB,KAIlB,GAAIA,GAAOK,EAAO,OAAO,EAkBzB,IAdAF,EAAQH,GACRyrE,EAAMn9D,EAAMg1D,GAAGgJ,QAAQ2F,qBAAqB3jE,EAAMurB,IAAK75B,EAAKsO,EAAM+0D,SAC1DjvD,KACN4oB,EAAO1uB,EAAMg1D,GAAG8J,cAAc3B,EAAIrhE,KAC9BkE,EAAMg1D,GAAG2J,aAAajwC,GACxBh9B,EAAMyrE,EAAIzrE,IAEVg9B,EAAO,IAMX78B,EAAQH,EACDA,EAAMK,IACX6oB,EAAO5a,EAAMurB,IAAI/jB,WAAW9V,GACvB+5B,EAAQ7Q,IAAkB,KAATA,GAFNlpB,KAQlB,GADAyrE,EAAMn9D,EAAMg1D,GAAGgJ,QAAQ4F,eAAe5jE,EAAMurB,IAAK75B,EAAKsO,EAAM+0D,QACxDrjE,EAAMK,GAAOF,IAAUH,GAAOyrE,EAAIr3D,GAMpC,IALAqE,EAAQgzD,EAAIrhE,IACZpK,EAAMyrE,EAAIzrE,IAIHA,EAAMK,IACX6oB,EAAO5a,EAAMurB,IAAI/jB,WAAW9V,GACvB+5B,EAAQ7Q,IAAkB,KAATA,GAFNlpB,UAKlByY,EAAQ,GAGV,GAAIzY,GAAOK,GAAqC,KAA9BiO,EAAMurB,IAAI/jB,WAAW9V,GAErC,OADAsO,EAAMtO,IAAMqlE,GACL,EAETrlE,QACK,CAIL,QAAoC,IAAzBsO,EAAM6/D,IAAI6K,WAA8B,OAAO,EAmB1D,GAjBIh5E,EAAMK,GAAqC,KAA9BiO,EAAMurB,IAAI/jB,WAAW9V,IACpCG,EAAQH,EAAM,GACdA,EAAMsO,EAAMg1D,GAAGgJ,QAAQ0F,eAAe1jE,EAAOtO,KAClC,EACT+4E,EAAQzqE,EAAMurB,IAAI37B,MAAMiC,EAAOH,KAE/BA,EAAMqyE,EAAW,GAGnBryE,EAAMqyE,EAAW,EAKd0G,IAASA,EAAQzqE,EAAMurB,IAAI37B,MAAM87E,EAAY3H,MAElDjsE,EAAMkI,EAAM6/D,IAAI6K,WAAW5+C,EAAmB2+C,KAG5C,OADAzqE,EAAMtO,IAAMqlE,GACL,EAETroC,EAAO52B,EAAI42B,KACXvkB,EAAQrS,EAAIqS,MA6Bd,OAtBK2qD,IACH7lE,EAAU+Q,EAAMurB,IAAI37B,MAAM87E,EAAY3H,GAEtC/jE,EAAMg1D,GAAGzyD,OAAOvD,MACd/P,EACA+Q,EAAMg1D,GACNh1D,EAAM6/D,IACNr9D,EAAS,KAGXssB,EAAiB9uB,EAAMnQ,KAAK,QAAS,MAAO,IACtC6F,MAAWA,EAAQ,CAAE,CAAE,MAAOg5B,GAAQ,CAAE,MAAO,KACrDI,EAAMmB,SAAWztB,EACjBssB,EAAM7/B,QAAWA,EAEbkb,GACFzU,EAAM7F,KAAK,CAAE,QAASsa,KAI1BnK,EAAMtO,IAAMA,EACZsO,EAAM+0D,OAAShjE,GACR,I,6BChJT,IAAI65E,EAAc,2IACdC,EAAc,uDAGlB9+E,EAAOD,QAAU,SAAkBkT,EAAO80D,GACxC,IAAIgX,EAAMC,EAAWC,EAAYpN,EAAK6G,EAAS32C,EAC3Cp9B,EAAMsO,EAAMtO,IAEhB,OAAkC,KAA9BsO,EAAMurB,IAAI/jB,WAAW9V,QAEzBo6E,EAAO9rE,EAAMurB,IAAI37B,MAAM8B,IAEdoO,QAAQ,KAAO,KAEpB+rE,EAAY9oE,KAAK+oE,IAGnBlN,GAFAmN,EAAYD,EAAKruE,MAAMouE,IAEP,GAAGj8E,MAAM,GAAI,GAC7B61E,EAAUzlE,EAAMg1D,GAAG8J,cAAcF,KAC5B5+D,EAAMg1D,GAAG2J,aAAa8G,KAEtB3Q,KACHhmC,EAAgB9uB,EAAMnQ,KAAK,YAAa,IAAK,IACvC6F,MAAU,CAAE,CAAE,OAAQ+vE,IAC5B32C,EAAMwC,OAAU,WAChBxC,EAAMc,KAAU,QAEhBd,EAAgB9uB,EAAMnQ,KAAK,OAAQ,GAAI,IACjCZ,QAAU+Q,EAAMg1D,GAAGmK,kBAAkBP,IAE3C9vC,EAAgB9uB,EAAMnQ,KAAK,aAAc,KAAM,IACzCyhC,OAAU,WAChBxC,EAAMc,KAAU,QAGlB5vB,EAAMtO,KAAOq6E,EAAU,GAAG18E,QACnB,MAGLu8E,EAAS7oE,KAAK+oE,KAGhBlN,GAFAoN,EAAaF,EAAKruE,MAAMmuE,IAEP,GAAGh8E,MAAM,GAAI,GAC9B61E,EAAUzlE,EAAMg1D,GAAG8J,cAAc,UAAYF,KACxC5+D,EAAMg1D,GAAG2J,aAAa8G,KAEtB3Q,KACHhmC,EAAgB9uB,EAAMnQ,KAAK,YAAa,IAAK,IACvC6F,MAAU,CAAE,CAAE,OAAQ+vE,IAC5B32C,EAAMwC,OAAU,WAChBxC,EAAMc,KAAU,QAEhBd,EAAgB9uB,EAAMnQ,KAAK,OAAQ,GAAI,IACjCZ,QAAU+Q,EAAMg1D,GAAGmK,kBAAkBP,IAE3C9vC,EAAgB9uB,EAAMnQ,KAAK,aAAc,KAAM,IACzCyhC,OAAU,WAChBxC,EAAMc,KAAU,QAGlB5vB,EAAMtO,KAAOs6E,EAAW,GAAG38E,QACpB,Q,6BC9DX,IAAIqsE,EAAc,EAAQ,IAAqBA,YAU/C3uE,EAAOD,QAAU,SAAqBkT,EAAO80D,GAC3C,IAAI1qC,EAAI3sB,EAAO1L,EACXL,EAAMsO,EAAMtO,IAEhB,QAAKsO,EAAMg1D,GAAGhwD,QAAQsrB,OAGtBv+B,EAAMiO,EAAM+0D,SACsB,KAA9B/0D,EAAMurB,IAAI/jB,WAAW9V,IACrBA,EAAM,GAAKK,OAMJ,MADXq4B,EAAKpqB,EAAMurB,IAAI/jB,WAAW9V,EAAM,KAErB,KAAP04B,GACO,KAAPA,IAxBN,SAAkBA,GAEhB,IAAI6hD,EAAU,GAAL7hD,EACT,OAAQ6hD,GAAM,IAAiBA,GAAM,IAsBhCC,CAAS9hD,SAId3sB,EAAQuC,EAAMurB,IAAI37B,MAAM8B,GAAK+L,MAAMi+D,MAG9B5G,IACa90D,EAAMnQ,KAAK,cAAe,GAAI,GACxCZ,QAAU+Q,EAAMurB,IAAI37B,MAAM8B,EAAKA,EAAM+L,EAAM,GAAGpO,SAEtD2Q,EAAMtO,KAAO+L,EAAM,GAAGpO,QACf,Q,6BCzCT,IAAI06B,EAAoB,EAAQ,IAC5BzN,EAAoB,EAAQ,GAAmBA,IAC/C8M,EAAoB,EAAQ,GAAmBA,kBAC/CC,EAAoB,EAAQ,GAAmBA,cAG/C8iD,EAAa,uCACbC,EAAa,4BAGjBr/E,EAAOD,QAAU,SAAgBkT,EAAO80D,GACtC,IAAQl6C,EAAMnd,EAAO/L,EAAMsO,EAAMtO,IAAKK,EAAMiO,EAAM+0D,OAElD,GAAkC,KAA9B/0D,EAAMurB,IAAI/jB,WAAW9V,GAAwB,OAAO,EAExD,GAAIA,EAAM,EAAIK,EAGZ,GAAW,KAFNiO,EAAMurB,IAAI/jB,WAAW9V,EAAM,IAI9B,GADA+L,EAAQuC,EAAMurB,IAAI37B,MAAM8B,GAAK+L,MAAM0uE,GAOjC,OALKrX,IACHl6C,EAAqC,MAA9Bnd,EAAM,GAAG,GAAG+P,cAAwB2d,SAAS1tB,EAAM,GAAG7N,MAAM,GAAI,IAAMu7B,SAAS1tB,EAAM,GAAI,IAChGuC,EAAMkL,SAAWke,EAAkBxO,GAAQyO,EAAczO,GAAQyO,EAAc,QAEjFrpB,EAAMtO,KAAO+L,EAAM,GAAGpO,QACf,OAIT,IADAoO,EAAQuC,EAAMurB,IAAI37B,MAAM8B,GAAK+L,MAAM2uE,KAE7B9vD,EAAIyN,EAAUtsB,EAAM,IAGtB,OAFKq3D,IAAU90D,EAAMkL,SAAW6e,EAAStsB,EAAM,KAC/CuC,EAAMtO,KAAO+L,EAAM,GAAGpO,QACf,EAQf,OAFKylE,IAAU90D,EAAMkL,SAAW,KAChClL,EAAMtO,OACC,I,6BCzCT,SAAS26E,EAAkBrsE,EAAOw3D,GAChC,IAAI8U,EAAWC,EAAWC,EAAQC,EAAQC,EAAcC,EACpDC,EAAYC,EACZC,EAAgB,GAChB/6E,EAAMylE,EAAWnoE,OAErB,IAAKi9E,EAAY,EAAGA,EAAYv6E,EAAKu6E,IASnC,IARAE,EAAShV,EAAW8U,IAMbj9E,OAASm9E,EAAOn9E,QAAU,EAE5Bm9E,EAAOhlD,MAAZ,CAaA,IATKslD,EAAcj+E,eAAe29E,EAAO7U,UACvCmV,EAAcN,EAAO7U,QAAU,EAAG,GAAI,GAAI,IAG5C+U,EAAeI,EAAcN,EAAO7U,QAAQ6U,EAAOn9E,OAAS,GAC5Ds9E,GAAmB,EAEnBJ,EAAYD,EAAYE,EAAOpU,KAAO,EAE/BmU,EAAYG,EAAcH,GAAaE,EAAOrU,KAAO,EAG1D,IAFAqU,EAASjV,EAAW+U,IAET5U,SAAW6U,EAAO7U,UAEJ,IAArBgV,IAAwBA,EAAkBJ,GAE1CE,EAAOphE,MACPohE,EAAO76E,IAAM,GACb66E,EAAOl8D,QAAUi8D,EAAOj8D,QAE1Bq8D,GAAa,GASTH,EAAOjlD,OAASglD,EAAOnhE,QACpBohE,EAAOp9E,OAASm9E,EAAOn9E,QAAU,GAAM,IACtCo9E,EAAOp9E,OAAS,GAAM,GAAKm9E,EAAOn9E,OAAS,GAAM,IACnDu9E,GAAa,KAKdA,IAAY,CAKfC,EAAWN,EAAY,IAAM/U,EAAW+U,EAAY,GAAGlhE,KACrDmsD,EAAW+U,EAAY,GAAGnU,KAAO,EACjC,EAEFoU,EAAOpU,KAAQkU,EAAYC,EAAYM,EACvCL,EAAOnhE,MAAQ,EACfohE,EAAO76E,IAAQ06E,EACfG,EAAOrU,KAAQyU,EACfJ,EAAOjlD,OAAQ,EACfmlD,GAAmB,EACnB,OAKmB,IAArBA,IAQFG,EAAcN,EAAO7U,SAAS6U,EAAOn9E,QAAU,GAAK,GAAKs9E,IAM/D5/E,EAAOD,QAAU,SAAoBkT,GACnC,IAAIozD,EACAoF,EAAcx4D,EAAMw4D,YACpBzmE,EAAMiO,EAAMw4D,YAAYnpE,OAI5B,IAFAg9E,EAAkBrsE,EAAOA,EAAMw3D,YAE1BpE,EAAO,EAAGA,EAAOrhE,EAAKqhE,IACrBoF,EAAYpF,IAASoF,EAAYpF,GAAMoE,YACzC6U,EAAkBrsE,EAAOw4D,EAAYpF,GAAMoE,c,6BC7FjDzqE,EAAOD,QAAU,SAAuBkT,GACtC,IAAIozD,EAAMxgE,EACN2d,EAAQ,EACR/N,EAASxC,EAAMwC,OACfzQ,EAAMiO,EAAMwC,OAAOnT,OAEvB,IAAK+jE,EAAOxgE,EAAO,EAAGwgE,EAAOrhE,EAAKqhE,IAG5B5wD,EAAO4wD,GAAM0E,QAAU,GAAGvnD,IAC9B/N,EAAO4wD,GAAM7iD,MAAQA,EACjB/N,EAAO4wD,GAAM0E,QAAU,GAAGvnD,IAEJ,SAAtB/N,EAAO4wD,GAAMp9D,MACbo9D,EAAO,EAAIrhE,GACe,SAA1ByQ,EAAO4wD,EAAO,GAAGp9D,KAGnBwM,EAAO4wD,EAAO,GAAGnkE,QAAUuT,EAAO4wD,GAAMnkE,QAAUuT,EAAO4wD,EAAO,GAAGnkE,SAE/DmkE,IAASxgE,IAAQ4P,EAAO5P,GAAQ4P,EAAO4wD,IAE3CxgE,KAIAwgE,IAASxgE,IACX4P,EAAOnT,OAASuD,K,6BCjCpB,IAAImoE,EAAiB,EAAQ,IACzBrvC,EAAiB,EAAQ,GAAmBA,aAC5CE,EAAiB,EAAQ,GAAmBA,YAC5CD,EAAiB,EAAQ,GAAmBA,eAGhD,SAASohD,EAAYxhD,EAAKypC,EAAI6K,EAAKqI,GACjCh5E,KAAKq8B,IAAMA,EACXr8B,KAAK2wE,IAAMA,EACX3wE,KAAK8lE,GAAKA,EACV9lE,KAAKsT,OAAS0lE,EACdh5E,KAAKspE,YAAcrjE,MAAM+yE,EAAU74E,QAEnCH,KAAKwC,IAAM,EACXxC,KAAK6lE,OAAS7lE,KAAKq8B,IAAIl8B,OACvBH,KAAKqhB,MAAQ,EACbrhB,KAAKgc,QAAU,GACfhc,KAAK89E,aAAe,EAIpB99E,KAAKoxE,MAAQ,GAGbpxE,KAAKsoE,WAAa,GAGlBtoE,KAAK+9E,iBAAmB,GAM1BF,EAAYn+E,UAAU28E,YAAc,WAClC,IAAIz8C,EAAQ,IAAIisC,EAAM,OAAQ,GAAI,GAKlC,OAJAjsC,EAAM7/B,QAAUC,KAAKgc,QACrB4jB,EAAMve,MAAQrhB,KAAK89E,aACnB99E,KAAKsT,OAAO3S,KAAKi/B,GACjB5/B,KAAKgc,QAAU,GACR4jB,GAOTi+C,EAAYn+E,UAAUiB,KAAO,SAAUmG,EAAMuQ,EAAKuxD,GAC5C5oE,KAAKgc,SACPhc,KAAKq8E,cAGP,IAAIz8C,EAAQ,IAAIisC,EAAM/kE,EAAMuQ,EAAKuxD,GAC7BoV,EAAa,KAqBjB,OAnBIpV,EAAU,IAEZ5oE,KAAKqhB,QACLrhB,KAAKsoE,WAAatoE,KAAK+9E,iBAAiBvqE,OAG1CosB,EAAMve,MAAQrhB,KAAKqhB,MAEfunD,EAAU,IAEZ5oE,KAAKqhB,QACLrhB,KAAK+9E,iBAAiBp9E,KAAKX,KAAKsoE,YAChCtoE,KAAKsoE,WAAa,GAClB0V,EAAa,CAAE1V,WAAYtoE,KAAKsoE,aAGlCtoE,KAAK89E,aAAe99E,KAAKqhB,MACzBrhB,KAAKsT,OAAO3S,KAAKi/B,GACjB5/B,KAAKspE,YAAY3oE,KAAKq9E,GACfp+C,GAUTi+C,EAAYn+E,UAAUspE,WAAa,SAAUrmE,EAAOs7E,GAClD,IAAiBnG,EAAU9J,EAAU32C,EAAO8xC,EAAUC,EAClD6O,EAAkBF,EAClBG,EAAkBF,EAFlBx1E,EAAMG,EAGNu7E,GAAgB,EAChBC,GAAiB,EACjBt7E,EAAM7C,KAAK6lE,OACX4C,EAASzoE,KAAKq8B,IAAI/jB,WAAW3V,GAKjC,IAFAm1E,EAAWn1E,EAAQ,EAAI3C,KAAKq8B,IAAI/jB,WAAW3V,EAAQ,GAAK,GAEjDH,EAAMK,GAAO7C,KAAKq8B,IAAI/jB,WAAW9V,KAASimE,GAAUjmE,IAqC3D,OAnCA60B,EAAQ70B,EAAMG,EAGdqrE,EAAWxrE,EAAMK,EAAM7C,KAAKq8B,IAAI/jB,WAAW9V,GAAO,GAElDu1E,EAAkBt7C,EAAeq7C,IAAap7C,EAAYpC,OAAOC,aAAau9C,IAC9EE,EAAkBv7C,EAAeuxC,IAAatxC,EAAYpC,OAAOC,aAAayzC,IAE9EiK,EAAmBz7C,EAAas7C,IAChCI,EAAmB17C,EAAawxC,IAG9BkQ,GAAgB,EACPlG,IACHC,GAAoBF,IACxBmG,GAAgB,IAIhBjG,EACFkG,GAAiB,EACRpG,IACHG,GAAoBF,IACxBmG,GAAiB,IAIhBF,GAIH9U,EAAY+U,EACZ9U,EAAY+U,IAJZhV,EAAY+U,KAAoBC,GAAkBpG,GAClD3O,EAAY+U,KAAoBD,GAAkBlG,IAM7C,CACL7O,SAAWA,EACXC,UAAWA,EACXjpE,OAAWk3B,IAMfwmD,EAAYn+E,UAAUmsE,MAAQA,EAG9BhuE,EAAOD,QAAUigF,G,6BC7IjB,SAASriD,EAAO7zB,GACd,IAAI8zB,EAAUx1B,MAAMvG,UAAUgB,MAAMzC,KAAK8vB,UAAW,GAUpD,OARA0N,EAAQt6B,SAAQ,SAAUw5B,GACnBA,GAELn8B,OAAO0sB,KAAKyP,GAAQx5B,SAAQ,SAAU9B,GACpCsI,EAAItI,GAAOs7B,EAAOt7B,SAIfsI,EAGT,SAASi0B,EAAOj0B,GAAO,OAAOnJ,OAAOkB,UAAUiG,SAAS1H,KAAK0J,GAI7D,SAASy2E,EAAWz2E,GAAO,MAAuB,sBAAhBi0B,EAAOj0B,GAGzC,SAASg1B,EAAS/vB,GAAO,OAAOA,EAAIrE,QAAQ,uBAAwB,QAKpE,IAAI81E,EAAiB,CACnBC,WAAW,EACXC,YAAY,EACZC,SAAS,GAWX,IAAIC,EAAiB,CACnB,QAAS,CACPC,SAAU,SAAUv7E,EAAMX,EAAKhC,GAC7B,IAAIo8E,EAAOz5E,EAAKzC,MAAM8B,GAQtB,OANKhC,EAAK+c,GAAGohE,OAEXn+E,EAAK+c,GAAGohE,KAAQ,IAAIjkD,OAClB,UAAYl6B,EAAK+c,GAAGqhE,SAAWp+E,EAAK+c,GAAGshE,qBAAuBr+E,EAAK+c,GAAGuhE,SAAU,MAGhFt+E,EAAK+c,GAAGohE,KAAK9qE,KAAK+oE,GACbA,EAAKruE,MAAM/N,EAAK+c,GAAGohE,MAAM,GAAGx+E,OAE9B,IAGX,SAAW,QACX,OAAW,QACX,KAAW,CACTu+E,SAAU,SAAUv7E,EAAMX,EAAKhC,GAC7B,IAAIo8E,EAAOz5E,EAAKzC,MAAM8B,GAkBtB,OAhBKhC,EAAK+c,GAAGwhE,UAEXv+E,EAAK+c,GAAGwhE,QAAW,IAAIrkD,OACrB,IACAl6B,EAAK+c,GAAGqhE,SAGR,sBAAwBp+E,EAAK+c,GAAGyhE,WAAa,SAAWx+E,EAAK+c,GAAG0hE,gBAAkB,IAClFz+E,EAAK+c,GAAG2hE,SACR1+E,EAAK+c,GAAG4hE,oBACR3+E,EAAK+c,GAAGuhE,SAER,MAIAt+E,EAAK+c,GAAGwhE,QAAQlrE,KAAK+oE,GAEnBp6E,GAAO,GAAuB,MAAlBW,EAAKX,EAAM,IACvBA,GAAO,GAAuB,MAAlBW,EAAKX,EAAM,GADqB,EAEzCo6E,EAAKruE,MAAM/N,EAAK+c,GAAGwhE,SAAS,GAAG5+E,OAEjC,IAGX,UAAW,CACTu+E,SAAU,SAAUv7E,EAAMX,EAAKhC,GAC7B,IAAIo8E,EAAOz5E,EAAKzC,MAAM8B,GAOtB,OALKhC,EAAK+c,GAAG6hE,SACX5+E,EAAK+c,GAAG6hE,OAAU,IAAI1kD,OACpB,IAAMl6B,EAAK+c,GAAG8hE,eAAiB,IAAM7+E,EAAK+c,GAAG+hE,gBAAiB,MAG9D9+E,EAAK+c,GAAG6hE,OAAOvrE,KAAK+oE,GACfA,EAAKruE,MAAM/N,EAAK+c,GAAG6hE,QAAQ,GAAGj/E,OAEhC,KAWTo/E,EAAe,8EAA8EhsE,MAAM,KA8BvG,SAASpC,EAAQ3Q,GAGf,IAAI+c,EAAK/c,EAAK+c,GAAK,EAAQ,IAAR,CAAoB/c,EAAKg/E,UAGxCC,EAAOj/E,EAAKk/E,SAASh/E,QAWzB,SAASi/E,EAAMC,GAAO,OAAOA,EAAIr3E,QAAQ,SAAUgV,EAAGsiE,UATtDr/E,EAAKs/E,YAEAt/E,EAAKu/E,mBACRN,EAAK9+E,KA5Ca,2VA8CpB8+E,EAAK9+E,KAAK4c,EAAGyiE,QAEbziE,EAAGsiE,SAAWJ,EAAK55E,KAAK,KAIxB0X,EAAG0iE,YAAmBvlD,OAAOilD,EAAMpiE,EAAG2iE,iBAAkB,KACxD3iE,EAAG4iE,WAAmBzlD,OAAOilD,EAAMpiE,EAAG6iE,gBAAiB,KACvD7iE,EAAG8iE,iBAAmB3lD,OAAOilD,EAAMpiE,EAAG+iE,sBAAuB,KAC7D/iE,EAAGgjE,gBAAmB7lD,OAAOilD,EAAMpiE,EAAGijE,qBAAsB,KAM5D,IAAIC,EAAU,GAId,SAASC,EAAYriF,EAAMsN,GACzB,MAAM,IAAIzE,MAAM,+BAAiC7I,EAAO,MAAQsN,GAHlEnL,EAAKmgF,aAAe,GAMpBniF,OAAO0sB,KAAK1qB,EAAKogF,aAAaz/E,SAAQ,SAAU9C,GAC9C,IAAIsN,EAAMnL,EAAKogF,YAAYviF,GAG3B,GAAY,OAARsN,EAAJ,CAEA,IAAIk1E,EAAW,CAAEnC,SAAU,KAAMn/C,KAAM,MAIvC,GAFA/+B,EAAKmgF,aAAatiF,GAAQwiF,EAzKkB,oBAAhBjlD,EA2KfjwB,GAiBX,OA3LN,SAAkBhE,GAAO,MAAuB,oBAAhBi0B,EAAOj0B,GA2K7Bm5E,CAASn1E,EAAI+yE,UAENN,EAAWzyE,EAAI+yE,UACxBmC,EAASnC,SAAW/yE,EAAI+yE,SAExBgC,EAAYriF,EAAMsN,GAJlBk1E,EAASnC,SAnEjB,SAAyBnhE,GACvB,OAAO,SAAUpa,EAAMX,GACrB,IAAIo6E,EAAOz5E,EAAKzC,MAAM8B,GAEtB,OAAI+a,EAAG1J,KAAK+oE,GACHA,EAAKruE,MAAMgP,GAAI,GAAGpd,OAEpB,GA4DiB4gF,CAAgBp1E,EAAI+yE,eAOtCN,EAAWzyE,EAAI8hC,WACjBozC,EAASpzC,UAAY9hC,EAAI8hC,UACf9hC,EAAI8hC,UAGdizC,EAAYriF,EAAMsN,GAFlBk1E,EAASpzC,UAjER,SAAUl/B,EAAO/N,GACtBA,EAAKitC,UAAUl/B,MAxHnB,SAAkB5G,GAAO,MAAuB,oBAAhBi0B,EAAOj0B,GAgM/Bg0B,CAAShwB,GAKb+0E,EAAYriF,EAAMsN,GAJhB80E,EAAQ9/E,KAAKtC,OAWjBoiF,EAAQt/E,SAAQ,SAAU6/E,GACnBxgF,EAAKmgF,aAAangF,EAAKogF,YAAYI,MAMxCxgF,EAAKmgF,aAAaK,GAAOtC,SACvBl+E,EAAKmgF,aAAangF,EAAKogF,YAAYI,IAAQtC,SAC7Cl+E,EAAKmgF,aAAaK,GAAOvzC,UACvBjtC,EAAKmgF,aAAangF,EAAKogF,YAAYI,IAAQvzC,cAM/CjtC,EAAKmgF,aAAa,IAAM,CAAEjC,SAAU,KAAMjxC,UArGnC,SAAUl/B,EAAO/N,GACtBA,EAAKitC,UAAUl/B,KAyGjB,IAAI0yE,EAAQziF,OAAO0sB,KAAK1qB,EAAKmgF,cACRxxD,QAAO,SAAU9wB,GAEhB,OAAOA,EAAK8B,OAAS,GAAKK,EAAKmgF,aAAatiF,MAE7CiD,IAAIq7B,GACJ92B,KAAK,KAE1BrF,EAAK+c,GAAG2jE,YAAgBxmD,OAAO,oBAA2Bnd,EAAG4jE,SAAW,MAAQF,EAAQ,IAAK,KAC7FzgF,EAAK+c,GAAG6jE,cAAgB1mD,OAAO,oBAA2Bnd,EAAG4jE,SAAW,MAAQF,EAAQ,IAAK,MAE7FzgF,EAAK+c,GAAGo5D,QAAUj8C,OAChB,IAAMl6B,EAAK+c,GAAG2jE,YAAYvmD,OAAS,MAAQn6B,EAAK+c,GAAGgjE,gBAAgB5lD,OAAS,MAC5E,KAxIJ,SAAwBn6B,GACtBA,EAAK6gF,WAAa,EAClB7gF,EAAK8gF,eAAmB,GA6IxBC,CAAe/gF,GAQjB,SAASghF,EAAMhhF,EAAM0S,GACnB,IAAIvQ,EAAQnC,EAAK6gF,UACb3+E,EAAQlC,EAAKihF,eACbt+E,EAAQ3C,EAAK8gF,eAAe5gF,MAAMiC,EAAOD,GAO7C1C,KAAKgG,OAAYxF,EAAKkhF,WAAWpjE,cAMjCte,KAAKkE,MAAYvB,EAAQuQ,EAMzBlT,KAAK42E,UAAYl0E,EAAMwQ,EAMvBlT,KAAK4iD,IAAYz/C,EAMjBnD,KAAKmD,KAAYA,EAMjBnD,KAAK0vE,IAAYvsE,EAGnB,SAASw+E,EAAYnhF,EAAM0S,GACzB,IAAI3E,EAAQ,IAAIizE,EAAMhhF,EAAM0S,GAI5B,OAFA1S,EAAKmgF,aAAapyE,EAAMvI,QAAQynC,UAAUl/B,EAAO/N,GAE1C+N,EA0CT,SAAS4gE,EAAUyS,EAAS9rE,GAC1B,KAAM9V,gBAAgBmvE,GACpB,OAAO,IAAIA,EAAUyS,EAAS9rE,GAvUlC,IAAsBnO,EA0UfmO,IA1UenO,EA2UDi6E,EA1UZpjF,OAAO0sB,KAAKvjB,GAAO,IAAI0J,QAAO,SAAUwwE,EAAKhO,GAClD,OAAOgO,GAAOxD,EAAe1+E,eAAek0E,MAC3C,KAyUC/9D,EAAU8rE,EACVA,EAAU,KAId5hF,KAAKw/E,SAAqBhkD,EAAO,GAAI6iD,EAAgBvoE,GAGrD9V,KAAKqhF,WAAsB,EAC3BrhF,KAAKyhF,gBAAsB,EAC3BzhF,KAAK0hF,WAAqB,GAC1B1hF,KAAKshF,eAAqB,GAE1BthF,KAAK4gF,YAAqBplD,EAAO,GAAIijD,EAAgBmD,GACrD5hF,KAAK2gF,aAAqB,GAE1B3gF,KAAK0/E,SAAqBH,EAC1Bv/E,KAAK+/E,mBAAqB,EAE1B//E,KAAKud,GAAK,GAEVpM,EAAQnR,MAWVmvE,EAAUzvE,UAAUwiB,IAAM,SAAalc,EAAQ87E,GAG7C,OAFA9hF,KAAK4gF,YAAY56E,GAAU87E,EAC3B3wE,EAAQnR,MACDA,MAUTmvE,EAAUzvE,UAAU2H,IAAM,SAAayO,GAErC,OADA9V,KAAKw/E,SAAWhkD,EAAOx7B,KAAKw/E,SAAU1pE,GAC/B9V,MASTmvE,EAAUzvE,UAAUmU,KAAO,SAAc1Q,GAKvC,GAHAnD,KAAKshF,eAAiBn+E,EACtBnD,KAAKqhF,WAAkB,GAElBl+E,EAAKhD,OAAU,OAAO,EAE3B,IAAIjC,EAAG6jF,EAAIC,EAAIl0D,EAAK5a,EAAO7G,EAAMkR,EAAI0kE,EAGrC,GAAIjiF,KAAKud,GAAG2jE,YAAYrtE,KAAK1Q,GAG3B,KAFAoa,EAAKvd,KAAKud,GAAG6jE,eACVxK,UAAY,EACgB,QAAvB14E,EAAIqf,EAAG3B,KAAKzY,KAElB,GADA2qB,EAAM9tB,KAAKkiF,aAAa/+E,EAAMjF,EAAE,GAAIqf,EAAGq5D,WAC9B,CACP52E,KAAK0hF,WAAiBxjF,EAAE,GACxB8B,KAAKqhF,UAAiBnjF,EAAEgG,MAAQhG,EAAE,GAAGiC,OACrCH,KAAKyhF,eAAiBvjF,EAAEgG,MAAQhG,EAAE,GAAGiC,OAAS2tB,EAC9C,MA8CN,OAzCI9tB,KAAKw/E,SAASlB,WAAat+E,KAAK2gF,aAAa,WAE/CsB,EAAU9+E,EAAKqP,OAAOxS,KAAKud,GAAGgjE,mBACf,IAETvgF,KAAKqhF,UAAY,GAAKY,EAAUjiF,KAAKqhF,YAC0D,QAA5FU,EAAK5+E,EAAKoL,MAAMvO,KAAKw/E,SAAShB,QAAUx+E,KAAKud,GAAG4iE,WAAangF,KAAKud,GAAG8iE,qBAExEntE,EAAQ6uE,EAAG79E,MAAQ69E,EAAG,GAAG5hF,QAErBH,KAAKqhF,UAAY,GAAKnuE,EAAQlT,KAAKqhF,aACrCrhF,KAAK0hF,WAAiB,GACtB1hF,KAAKqhF,UAAiBnuE,EACtBlT,KAAKyhF,eAAiBM,EAAG79E,MAAQ69E,EAAG,GAAG5hF,SAO7CH,KAAKw/E,SAASjB,YAAcv+E,KAAK2gF,aAAa,YAEvCx9E,EAAKyN,QAAQ,MACR,GAGmC,QAA1CoxE,EAAK7+E,EAAKoL,MAAMvO,KAAKud,GAAG0iE,gBAE3B/sE,EAAQ8uE,EAAG99E,MAAQ89E,EAAG,GAAG7hF,OACzBkM,EAAQ21E,EAAG99E,MAAQ89E,EAAG,GAAG7hF,QAErBH,KAAKqhF,UAAY,GAAKnuE,EAAQlT,KAAKqhF,WAClCnuE,IAAUlT,KAAKqhF,WAAah1E,EAAOrM,KAAKyhF,kBAC3CzhF,KAAK0hF,WAAiB,UACtB1hF,KAAKqhF,UAAiBnuE,EACtBlT,KAAKyhF,eAAiBp1E,IAMvBrM,KAAKqhF,WAAa,GAW3BlS,EAAUzvE,UAAUi3E,QAAU,SAAiBxzE,GAC7C,OAAOnD,KAAKud,GAAGo5D,QAAQ9iE,KAAK1Q,IAa9BgsE,EAAUzvE,UAAUwiF,aAAe,SAAsB/+E,EAAM6C,EAAQxD,GAErE,OAAKxC,KAAK2gF,aAAa36E,EAAOsY,eAGvBte,KAAK2gF,aAAa36E,EAAOsY,eAAeogE,SAASv7E,EAAMX,EAAKxC,MAF1D,GAsBXmvE,EAAUzvE,UAAU6O,MAAQ,SAAepL,GACzC,IAAI+P,EAAQ,EAAGvR,EAAS,GAGpB3B,KAAKqhF,WAAa,GAAKrhF,KAAKshF,iBAAmBn+E,IACjDxB,EAAOhB,KAAKghF,EAAY3hF,KAAMkT,IAC9BA,EAAQlT,KAAKyhF,gBAOf,IAHA,IAAI7E,EAAO1pE,EAAQ/P,EAAKzC,MAAMwS,GAAS/P,EAGhCnD,KAAK6T,KAAK+oE,IACfj7E,EAAOhB,KAAKghF,EAAY3hF,KAAMkT,IAE9B0pE,EAAOA,EAAKl8E,MAAMV,KAAKyhF,gBACvBvuE,GAASlT,KAAKyhF,eAGhB,OAAI9/E,EAAOxB,OACFwB,EAGF,MAmBTwtE,EAAUzvE,UAAU+/E,KAAO,SAAch6C,EAAM08C,GAG7C,OAFA18C,EAAOx/B,MAAMC,QAAQu/B,GAAQA,EAAO,CAAEA,GAEjC08C,GAOLniF,KAAK0/E,SAAW1/E,KAAK0/E,SAAS5+E,OAAO2kC,GACJv9B,OACAinB,QAAO,SAAUizD,EAAI1W,EAAK2W,GACzB,OAAOD,IAAOC,EAAI3W,EAAM,MAEzBv4D,UAEjChC,EAAQnR,MACDA,OAdLA,KAAK0/E,SAAWj6C,EAAK/kC,QACrBV,KAAK+/E,mBAAoB,EACzB5uE,EAAQnR,MACDA,OAmBXmvE,EAAUzvE,UAAU+tC,UAAY,SAAmBl/B,GAK5CA,EAAMvI,SAAUuI,EAAMmhE,IAAM,UAAYnhE,EAAMmhE,KAE9B,YAAjBnhE,EAAMvI,QAAyB,YAAY6N,KAAKtF,EAAMmhE,OACxDnhE,EAAMmhE,IAAM,UAAYnhE,EAAMmhE,MAUlCP,EAAUzvE,UAAUogF,UAAY,aAIhCjiF,EAAOD,QAAUuxE,G,6BCxnBjBtxE,EAAOD,QAAU,SAAU0kF,GACzB,IAAI/kE,EAAK,GAGTA,EAAGglE,QAAU,EAAQ,IAAiC5nD,OACtDpd,EAAGilE,OAAU,EAAQ,IAAgC7nD,OACrDpd,EAAGklE,MAAU,EAAQ,IAA+B9nD,OACpDpd,EAAGmlE,MAAU,EAAQ,IAA+B/nD,OAGpDpd,EAAG4jE,SAAW,CAAE5jE,EAAGklE,MAAOllE,EAAGmlE,MAAOnlE,EAAGilE,QAAS38E,KAAK,KAGrD0X,EAAGolE,QAAU,CAAEplE,EAAGklE,MAAOllE,EAAGilE,QAAS38E,KAAK,KAiK1C,OAxJA0X,EAAGqlE,kBAA0B,eAAmCrlE,EAAG4jE,SAAW,IAAM5jE,EAAGglE,QAAU,IAMjGhlE,EAAGslE,QAED,yFAGFtlE,EAAGqhE,SAAc,YAAcrhE,EAAGolE,QAAU,uBAE5CplE,EAAG2hE,SAED,kFAEF3hE,EAAG4hE,oBAED,cAAkC5hE,EAAG4jE,SAAW,6BAA+B5jE,EAAG4jE,SAAW,KAE/F5jE,EAAGuhE,SAED,iBAGcvhE,EAAGolE,QAHjB,0CAIoBplE,EAAGolE,QAJvB,wBAKoBplE,EAAGolE,QALvB,wBAMoBplE,EAAGolE,QANvB,wBAOoBplE,EAAGolE,QAPvB,yBAQoBplE,EAAGolE,QARvB,qBASiBplE,EAAGqlE,kBATpB,sCAiBiBrlE,EAAGolE,QAAU,WACvBL,GAAQA,EAAK,OACZ,6BAEA,SAEF,SAAW/kE,EAAGolE,QAvBpB,YAwBiBplE,EAAGolE,QAxBpB,gBAyBiBplE,EAAGolE,QAzBpB,iBAgCFplE,EAAG8hE,eAED,iEAEF9hE,EAAGyiE,OAED,wBAKFziE,EAAG0hE,gBAGD,MACE1hE,EAAGyiE,OACH,IACAziE,EAAGqlE,kBAHL,UAMFrlE,EAAGyhE,WAED,MACEzhE,EAAGyiE,OADL,OAGUziE,EAAGqlE,kBAHb,QAKUrlE,EAAGqlE,kBAAoB,QAAUrlE,EAAGqlE,kBAAoB,UAAYrlE,EAAGqlE,kBALjF,KAQFrlE,EAAGulE,SAED,eAIgBvlE,EAAGyhE,WAAa,SAAWzhE,EAAGyhE,WAJ9C,KAOFzhE,EAAGwlE,eAED,MACExlE,EAAGslE,QADL,aAGgBtlE,EAAGyhE,WAHnB,qBAMFzhE,EAAGylE,qBAED,YAAczlE,EAAGyhE,WAAa,oBAEhCzhE,EAAG+hE,gBAED/hE,EAAGulE,SAAWvlE,EAAG4hE,oBAEnB5hE,EAAG0lE,sBAED1lE,EAAGwlE,eAAiBxlE,EAAG4hE,oBAEzB5hE,EAAGshE,qBAEDthE,EAAGulE,SAAWvlE,EAAG2hE,SAAW3hE,EAAG4hE,oBAEjC5hE,EAAG2lE,2BAED3lE,EAAGwlE,eAAiBxlE,EAAG2hE,SAAW3hE,EAAG4hE,oBAEvC5hE,EAAG4lE,iCAED5lE,EAAGylE,qBAAuBzlE,EAAG2hE,SAAW3hE,EAAG4hE,oBAO7C5hE,EAAGijE,oBAED,sDAAwDjjE,EAAG4jE,SAAW,SAExE5jE,EAAG2iE,gBAEC,kBAAsC3iE,EAAGolE,QAAzC,KACMplE,EAAG8hE,eAAiB,IAAM9hE,EAAG0lE,sBAAwB,IAE/D1lE,EAAG6iE,eAGC,mCAA0C7iE,EAAG4jE,SAA7C,qBAC0B5jE,EAAG2lE,2BAA6B3lE,EAAGuhE,SAAW,IAE5EvhE,EAAG+iE,qBAGC,mCAA0C/iE,EAAG4jE,SAA7C,qBAC0B5jE,EAAG4lE,iCAAmC5lE,EAAGuhE,SAAW,IAE3EvhE,I,iBCjLT,uEACE,SAASu+B,GAGsCl+C,GAC9CA,EAAQwR,SACoCvR,GAC5CA,EAAOuR,SAHT,IAIIg0E,EAA8B,iBAAVC,GAAsBA,EAE7CD,EAAWC,SAAWD,GACtBA,EAAWxhE,SAAWwhE,GACtBA,EAAW5iF,KAUZ,IAAI4uE,EAGJkU,EAAS,WAaTC,EAAgB,QAChBC,EAAgB,eAChBC,EAAkB,4BAGlBC,EAAS,CACR,SAAY,kDACZ,YAAa,iDACb,gBAAiB,iBAKlBlnC,EAAQ55C,KAAK45C,MACbmnC,EAAqBrpD,OAAOC,aAa5B,SAASoV,EAAM7oC,GACd,MAAM,IAAIxC,WAAWo/E,EAAO58E,IAW7B,SAASxF,EAAI+E,EAAO+kE,GAGnB,IAFA,IAAIjrE,EAASkG,EAAMlG,OACfwB,EAAS,GACNxB,KACNwB,EAAOxB,GAAUirE,EAAG/kE,EAAMlG,IAE3B,OAAOwB,EAaR,SAASiiF,EAAU7zE,EAAQq7D,GAC1B,IAAIxqD,EAAQ7Q,EAAOwD,MAAM,KACrB5R,EAAS,GAWb,OAVIif,EAAMzgB,OAAS,IAGlBwB,EAASif,EAAM,GAAK,IACpB7Q,EAAS6Q,EAAM,IAMTjf,EADOL,GAFdyO,EAASA,EAAOxH,QAAQk7E,EAAiB,MACrBlwE,MAAM,KACA63D,GAAIvlE,KAAK,KAiBpC,SAASg+E,EAAW9zE,GAMnB,IALA,IAGIhR,EACA+J,EAJA0R,EAAS,GACTspE,EAAU,EACV3jF,EAAS4P,EAAO5P,OAGb2jF,EAAU3jF,IAChBpB,EAAQgR,EAAOuI,WAAWwrE,OACb,OAAU/kF,GAAS,OAAU+kF,EAAU3jF,EAG3B,QAAX,OADb2I,EAAQiH,EAAOuI,WAAWwrE,OAEzBtpE,EAAO7Z,OAAe,KAAR5B,IAAkB,KAAe,KAAR+J,GAAiB,QAIxD0R,EAAO7Z,KAAK5B,GACZ+kF,KAGDtpE,EAAO7Z,KAAK5B,GAGd,OAAOyb,EAWR,SAASupE,EAAW19E,GACnB,OAAO/E,EAAI+E,GAAO,SAAStH,GAC1B,IAAIyb,EAAS,GAOb,OANIzb,EAAQ,QAEXyb,GAAUmpE,GADV5kF,GAAS,SAC8B,GAAK,KAAQ,OACpDA,EAAQ,MAAiB,KAARA,GAElByb,GAAUmpE,EAAmB5kF,MAE3B8G,KAAK,IAoCT,SAASm+E,EAAaC,EAAOC,GAG5B,OAAOD,EAAQ,GAAK,IAAMA,EAAQ,MAAgB,GAARC,IAAc,GAQzD,SAASC,EAAMC,EAAOC,EAAWC,GAChC,IAAIzQ,EAAI,EAGR,IAFAuQ,EAAQE,EAAY9nC,EAAM4nC,EA1LpB,KA0LoCA,GAAS,EACnDA,GAAS5nC,EAAM4nC,EAAQC,GACOD,EAAQG,IAA2B1Q,GAhM3D,GAiMLuQ,EAAQ5nC,EAAM4nC,EA3KA50E,IA6Kf,OAAOgtC,EAAMq3B,EAAI,GAAsBuQ,GAASA,EAhM1C,KA0MP,SAAShY,EAAOoY,GAEf,IAEI/zE,EAIAg0E,EACA5/E,EACAX,EACAwgF,EACAC,EACA9Q,EACAoQ,EACAjlF,EAEA4lF,EArEiBC,EAsDjBrqE,EAAS,GACTsqE,EAAcN,EAAMrkF,OAEpBrC,EAAI,EACJyB,EA7MM,IA8MNwlB,EA/MS,GAoOb,KALA0/D,EAAQD,EAAMljE,YA7NH,MA8NC,IACXmjE,EAAQ,GAGJ5/E,EAAI,EAAGA,EAAI4/E,IAAS5/E,EAEpB2/E,EAAMlsE,WAAWzT,IAAM,KAC1B8qC,EAAM,aAEPn1B,EAAO7Z,KAAK6jF,EAAMlsE,WAAWzT,IAM9B,IAAKX,EAAQugF,EAAQ,EAAIA,EAAQ,EAAI,EAAGvgF,EAAQ4gF,GAAwC,CAOvF,IAAKJ,EAAO5mF,EAAG6mF,EAAI,EAAG9Q,EA3PjB,GA6PA3vE,GAAS4gF,GACZn1C,EAAM,mBAGPs0C,GAxGmBY,EAwGEL,EAAMlsE,WAAWpU,MAvGxB,GAAK,GACb2gF,EAAY,GAEhBA,EAAY,GAAK,GACbA,EAAY,GAEhBA,EAAY,GAAK,GACbA,EAAY,GAjKd,SAmQiBZ,EAAQznC,GAAO8mC,EAASxlF,GAAK6mF,KACjDh1C,EAAM,YAGP7xC,GAAKmmF,EAAQU,IAGTV,GAFJjlF,EAAI60E,GAAK9uD,EAvQL,EAuQoB8uD,GAAK9uD,EAtQzB,MAsQ8C8uD,EAAI9uD,IAbH8uD,GA3P/C,GA+QA8Q,EAAInoC,EAAM8mC,GADdsB,EA9QI,GA8QgB5lF,KAEnB2wC,EAAM,YAGPg1C,GAAKC,EAKN7/D,EAAOo/D,EAAMrmF,EAAI4mF,EADjBj0E,EAAM+J,EAAOra,OAAS,EACc,GAARukF,GAIxBloC,EAAM1+C,EAAI2S,GAAO6yE,EAAS/jF,GAC7BowC,EAAM,YAGPpwC,GAAKi9C,EAAM1+C,EAAI2S,GACf3S,GAAK2S,EAGL+J,EAAO5Z,OAAO9C,IAAK,EAAGyB,GAIvB,OAAOwkF,EAAWvpE,GAUnB,SAAS2xD,EAAOqY,GACf,IAAIjlF,EACA6kF,EACAW,EACAC,EACAjgE,EACAlgB,EACA3G,EACA+mF,EACApR,EACA70E,EACAkmF,EAGAJ,EAEAK,EACAP,EACAQ,EANA5qE,EAAS,GAoBb,IARAsqE,GAHAN,EAAQX,EAAWW,IAGCrkF,OAGpBZ,EAvUU,IAwUV6kF,EAAQ,EACRr/D,EA1Ua,GA6URlgB,EAAI,EAAGA,EAAIigF,IAAejgF,GAC9BqgF,EAAeV,EAAM3/E,IACF,KAClB2V,EAAO7Z,KAAKgjF,EAAmBuB,IAejC,IAXAH,EAAiBC,EAAcxqE,EAAOra,OAMlC6kF,GACHxqE,EAAO7Z,KAzVG,KA6VJokF,EAAiBD,GAAa,CAIpC,IAAK5mF,EAAIolF,EAAQz+E,EAAI,EAAGA,EAAIigF,IAAejgF,GAC1CqgF,EAAeV,EAAM3/E,KACDtF,GAAK2lF,EAAehnF,IACvCA,EAAIgnF,GAcN,IAPIhnF,EAAIqB,EAAIi9C,GAAO8mC,EAASc,IAD5Be,EAAwBJ,EAAiB,KAExCp1C,EAAM,YAGPy0C,IAAUlmF,EAAIqB,GAAK4lF,EACnB5lF,EAAIrB,EAEC2G,EAAI,EAAGA,EAAIigF,IAAejgF,EAO9B,IANAqgF,EAAeV,EAAM3/E,IAEFtF,KAAO6kF,EAAQd,GACjC3zC,EAAM,YAGHu1C,GAAgB3lF,EAAG,CAEtB,IAAK0lF,EAAIb,EAAOvQ,EAlYb,KAoYEoR,GADJjmF,EAAI60E,GAAK9uD,EAlYP,EAkYsB8uD,GAAK9uD,EAjY3B,MAiYgD8uD,EAAI9uD,IADT8uD,GAlY3C,GAuYFuR,EAAUH,EAAIjmF,EACd4lF,EAxYE,GAwYkB5lF,EACpBwb,EAAO7Z,KACNgjF,EAAmBK,EAAahlF,EAAIomF,EAAUR,EAAY,KAE3DK,EAAIzoC,EAAM4oC,EAAUR,GAGrBpqE,EAAO7Z,KAAKgjF,EAAmBK,EAAaiB,EAAG,KAC/ClgE,EAAOo/D,EAAMC,EAAOe,EAAuBJ,GAAkBC,GAC7DZ,EAAQ,IACNW,IAIFX,IACA7kF,EAGH,OAAOib,EAAO3U,KAAK,IA4CpBupE,EAAW,CAMV,QAAW,QAQX,KAAQ,CACP,OAAUyU,EACV,OAAUE,GAEX,OAAU3X,EACV,OAAUD,EACV,QA/BD,SAAiBqY,GAChB,OAAOZ,EAAUY,GAAO,SAASz0E,GAChC,OAAOyzE,EAAc3vE,KAAK9D,GACvB,OAASo8D,EAAOp8D,GAChBA,MA4BJ,UAnDD,SAAmBy0E,GAClB,OAAOZ,EAAUY,GAAO,SAASz0E,GAChC,OAAOwzE,EAAc1vE,KAAK9D,GACvBq8D,EAAOr8D,EAAOrP,MAAM,GAAG4d,eACvBvO,YA4DH,KAFD,aACC,OAAOq/D,GACP,8BAngBF,K,2CCDDvxE,EAAOD,QAAU,SAASC,GAoBzB,OAnBKA,EAAOwnF,kBACXxnF,EAAOynF,UAAY,aACnBznF,EAAO0nF,MAAQ,GAEV1nF,EAAOkjC,WAAUljC,EAAOkjC,SAAW,IACxCviC,OAAOC,eAAeZ,EAAQ,SAAU,CACvCa,YAAY,EACZC,IAAK,WACJ,OAAOd,EAAOE,KAGhBS,OAAOC,eAAeZ,EAAQ,KAAM,CACnCa,YAAY,EACZC,IAAK,WACJ,OAAOd,EAAOC,KAGhBD,EAAOwnF,gBAAkB,GAEnBxnF,I,cCpBR,IAAI2nF,EAGJA,EAAI,WACH,OAAOxlF,KADJ,GAIJ,IAECwlF,EAAIA,GAAK,IAAIz6D,SAAS,cAAb,GACR,MAAOsI,GAEc,iBAAXzR,SAAqB4jE,EAAI5jE,QAOrC/jB,EAAOD,QAAU4nF,G,6BCdjB3nF,EAAOD,QAAU,CACfkY,QAAS,CACPsrB,MAAc,EACdq0C,UAAc,EACdC,QAAc,EACdJ,WAAc,YACdjF,SAAc,EAGdmH,aAAc,EAOdkB,OAAQ,OAQRrD,UAAW,KAEXwD,WAAc,KAGhBlM,WAAY,CAEV5mC,KAAM,GACN3lB,MAAO,GACP/M,OAAQ,M,6BChCZxV,EAAOD,QAAU,CACfkY,QAAS,CACPsrB,MAAc,EACdq0C,UAAc,EACdC,QAAc,EACdJ,WAAc,YACdjF,SAAc,EAGdmH,aAAc,EAOdkB,OAAQ,OAQRrD,UAAW,KAEXwD,WAAc,IAGhBlM,WAAY,CAEV5mC,KAAM,CACJ/uB,MAAO,CACL,YACA,QACA,WAIJoJ,MAAO,CACLpJ,MAAO,CACL,cAIJ3D,OAAQ,CACN2D,MAAO,CACL,QAEFw5D,OAAQ,CACN,gBACA,qB,6BCpDR3yE,EAAOD,QAAU,CACfkY,QAAS,CACPsrB,MAAc,EACdq0C,UAAc,EACdC,QAAc,EACdJ,WAAc,YACdjF,SAAc,EAGdmH,aAAc,EAOdkB,OAAQ,OAQRrD,UAAW,KAEXwD,WAAc,IAGhBlM,WAAY,CAEV5mC,KAAM,CACJ/uB,MAAO,CACL,YACA,QACA,WAIJoJ,MAAO,CACLpJ,MAAO,CACL,aACA,OACA,QACA,UACA,KACA,aACA,WACA,OACA,YACA,cAIJ3D,OAAQ,CACN2D,MAAO,CACL,WACA,YACA,WACA,SACA,SACA,cACA,QACA,OACA,UACA,QAEFw5D,OAAQ,CACN,gBACA,WACA,qB,cC3ER3yE,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,6B,cCApCnoC,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,kC,cCApCnoC,EAAOD,QAAUkoC,OAAOC,KAAKC,OAAO,+B,qkBCGpCgB,IAAIy+C,aAAavjE,IAAI,+BAA+B,WCIlD6/B,iBAAO2jC,IAAahmF,UAAW,iBAAiB,SAAUwvC,GACxDA,EAAMhtB,IACJ,WACAyjE,IAASnb,UACP,CACE+Q,MAAOv0C,IAAIC,WAAWC,MAAM,wDAC5BT,UAAW,qBAEbzmC,KAAK4lF,gBAAgBh3C,eAK3B82C,IAAahmF,UAAb,cAA0C,WAAY,WAC9CwvC,EAAQ,IAAIC,IAwClB,OAtCAD,EAAMhtB,IACJ,oBACA2jE,IAAOrb,UACL,CACE15D,MAAO9Q,KAAK0jE,KAAKC,cAAcyJ,kBAC/B0Y,SAAU,SAAC/mF,GACT,EAAKgnF,0BAA2B,EAEhC,EAAKriB,KAAK2J,gBAAgB,CAAED,kBAAmBruE,IAASuuE,MAAK,WAC3D,EAAKyY,0BAA2B,EAChC7nF,EAAE4/D,aAGNkoB,QAAShmF,KAAK+lF,0BAEhB/+C,IAAIC,WAAWC,MAAM,oEAIzBgI,EAAMhtB,IACJ,4BACA2jE,IAAOrb,UACL,CACE15D,MAAO9Q,KAAK0jE,KAAKC,cAAcC,0BAC/BkiB,SAAU,SAAC/mF,GACT,EAAKknF,kCAAmC,EAExC,EAAKviB,KAAK2J,gBAAgB,CAAEzJ,0BAA2B7kE,IAASuuE,MAAK,WACnE,EAAK2Y,kCAAmC,EACxC/nF,EAAE4/D,aAGNkoB,QAAShmF,KAAKimF,kCAEhBj/C,IAAIC,WAAWC,MAAM,4EAIlBgI,GDxDT69B","file":"forum.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 114);\n","// ::- Persistent data structure representing an ordered mapping from\n// strings to values, with some convenient update methods.\nfunction OrderedMap(content) {\n this.content = content;\n}\n\nOrderedMap.prototype = {\n constructor: OrderedMap,\n\n find: function(key) {\n for (var i = 0; i < this.content.length; i += 2)\n if (this.content[i] === key) return i\n return -1\n },\n\n // :: (string) → ?any\n // Retrieve the value stored under `key`, or return undefined when\n // no such key exists.\n get: function(key) {\n var found = this.find(key);\n return found == -1 ? undefined : this.content[found + 1]\n },\n\n // :: (string, any, ?string) → OrderedMap\n // Create a new map by replacing the value of `key` with a new\n // value, or adding a binding to the end of the map. If `newKey` is\n // given, the key of the binding will be replaced with that key.\n update: function(key, value, newKey) {\n var self = newKey && newKey != key ? this.remove(newKey) : this;\n var found = self.find(key), content = self.content.slice();\n if (found == -1) {\n content.push(newKey || key, value);\n } else {\n content[found + 1] = value;\n if (newKey) content[found] = newKey;\n }\n return new OrderedMap(content)\n },\n\n // :: (string) → OrderedMap\n // Return a map with the given key removed, if it existed.\n remove: function(key) {\n var found = this.find(key);\n if (found == -1) return this\n var content = this.content.slice();\n content.splice(found, 2);\n return new OrderedMap(content)\n },\n\n // :: (string, any) → OrderedMap\n // Add a new key to the start of the map.\n addToStart: function(key, value) {\n return new OrderedMap([key, value].concat(this.remove(key).content))\n },\n\n // :: (string, any) → OrderedMap\n // Add a new key to the end of the map.\n addToEnd: function(key, value) {\n var content = this.remove(key).content.slice();\n content.push(key, value);\n return new OrderedMap(content)\n },\n\n // :: (string, string, any) → OrderedMap\n // Add a key after the given key. If `place` is not found, the new\n // key is added to the end.\n addBefore: function(place, key, value) {\n var without = this.remove(key), content = without.content.slice();\n var found = without.find(place);\n content.splice(found == -1 ? content.length : found, 0, key, value);\n return new OrderedMap(content)\n },\n\n // :: ((key: string, value: any))\n // Call the given function for each key/value pair in the map, in\n // order.\n forEach: function(f) {\n for (var i = 0; i < this.content.length; i += 2)\n f(this.content[i], this.content[i + 1]);\n },\n\n // :: (union) → OrderedMap\n // Create a new map by prepending the keys in this map that don't\n // appear in `map` before the keys in `map`.\n prepend: function(map) {\n map = OrderedMap.from(map);\n if (!map.size) return this\n return new OrderedMap(map.content.concat(this.subtract(map).content))\n },\n\n // :: (union) → OrderedMap\n // Create a new map by appending the keys in this map that don't\n // appear in `map` after the keys in `map`.\n append: function(map) {\n map = OrderedMap.from(map);\n if (!map.size) return this\n return new OrderedMap(this.subtract(map).content.concat(map.content))\n },\n\n // :: (union) → OrderedMap\n // Create a map containing all the keys in this map that don't\n // appear in `map`.\n subtract: function(map) {\n var result = this;\n map = OrderedMap.from(map);\n for (var i = 0; i < map.content.length; i += 2)\n result = result.remove(map.content[i]);\n return result\n },\n\n // :: number\n // The amount of keys in this map.\n get size() {\n return this.content.length >> 1\n }\n};\n\n// :: (?union) → OrderedMap\n// Return a map with the given content. If null, create an empty\n// map. If given an ordered map, return that map itself. If given an\n// object, create a map from the object's properties.\nOrderedMap.from = function(value) {\n if (value instanceof OrderedMap) return value\n var content = [];\n if (value) for (var prop in value) content.push(prop, value[prop]);\n return new OrderedMap(content)\n};\n\nvar orderedmap = OrderedMap;\n\nexport default orderedmap;\n","import OrderedMap from 'orderedmap';\n\nfunction findDiffStart(a, b, pos) {\n for (var i = 0;; i++) {\n if (i == a.childCount || i == b.childCount)\n { return a.childCount == b.childCount ? null : pos }\n\n var childA = a.child(i), childB = b.child(i);\n if (childA == childB) { pos += childA.nodeSize; continue }\n\n if (!childA.sameMarkup(childB)) { return pos }\n\n if (childA.isText && childA.text != childB.text) {\n for (var j = 0; childA.text[j] == childB.text[j]; j++)\n { pos++; }\n return pos\n }\n if (childA.content.size || childB.content.size) {\n var inner = findDiffStart(childA.content, childB.content, pos + 1);\n if (inner != null) { return inner }\n }\n pos += childA.nodeSize;\n }\n}\n\nfunction findDiffEnd(a, b, posA, posB) {\n for (var iA = a.childCount, iB = b.childCount;;) {\n if (iA == 0 || iB == 0)\n { return iA == iB ? null : {a: posA, b: posB} }\n\n var childA = a.child(--iA), childB = b.child(--iB), size = childA.nodeSize;\n if (childA == childB) {\n posA -= size; posB -= size;\n continue\n }\n\n if (!childA.sameMarkup(childB)) { return {a: posA, b: posB} }\n\n if (childA.isText && childA.text != childB.text) {\n var same = 0, minSize = Math.min(childA.text.length, childB.text.length);\n while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) {\n same++; posA--; posB--;\n }\n return {a: posA, b: posB}\n }\n if (childA.content.size || childB.content.size) {\n var inner = findDiffEnd(childA.content, childB.content, posA - 1, posB - 1);\n if (inner) { return inner }\n }\n posA -= size; posB -= size;\n }\n}\n\n// ::- A fragment represents a node's collection of child nodes.\n//\n// Like nodes, fragments are persistent data structures, and you\n// should not mutate them or their content. Rather, you create new\n// instances whenever needed. The API tries to make this easy.\nvar Fragment = function Fragment(content, size) {\n this.content = content;\n // :: number\n // The size of the fragment, which is the total of the size of its\n // content nodes.\n this.size = size || 0;\n if (size == null) { for (var i = 0; i < content.length; i++)\n { this.size += content[i].nodeSize; } }\n};\n\nvar prototypeAccessors = { firstChild: { configurable: true },lastChild: { configurable: true },childCount: { configurable: true } };\n\n// :: (number, number, (node: Node, start: number, parent: Node, index: number) → ?bool, ?number)\n// Invoke a callback for all descendant nodes between the given two\n// positions (relative to start of this fragment). Doesn't descend\n// into a node when the callback returns `false`.\nFragment.prototype.nodesBetween = function nodesBetween (from, to, f, nodeStart, parent) {\n if ( nodeStart === void 0 ) nodeStart = 0;\n\n for (var i = 0, pos = 0; pos < to; i++) {\n var child = this.content[i], end = pos + child.nodeSize;\n if (end > from && f(child, nodeStart + pos, parent, i) !== false && child.content.size) {\n var start = pos + 1;\n child.nodesBetween(Math.max(0, from - start),\n Math.min(child.content.size, to - start),\n f, nodeStart + start);\n }\n pos = end;\n }\n};\n\n// :: ((node: Node, pos: number, parent: Node) → ?bool)\n// Call the given callback for every descendant node. The callback\n// may return `false` to prevent traversal of a given node's children.\nFragment.prototype.descendants = function descendants (f) {\n this.nodesBetween(0, this.size, f);\n};\n\n// : (number, number, ?string, ?string) → string\nFragment.prototype.textBetween = function textBetween (from, to, blockSeparator, leafText) {\n var text = \"\", separated = true;\n this.nodesBetween(from, to, function (node, pos) {\n if (node.isText) {\n text += node.text.slice(Math.max(from, pos) - pos, to - pos);\n separated = !blockSeparator;\n } else if (node.isLeaf && leafText) {\n text += leafText;\n separated = !blockSeparator;\n } else if (!separated && node.isBlock) {\n text += blockSeparator;\n separated = true;\n }\n }, 0);\n return text\n};\n\n// :: (Fragment) → Fragment\n// Create a new fragment containing the combined content of this\n// fragment and the other.\nFragment.prototype.append = function append (other) {\n if (!other.size) { return this }\n if (!this.size) { return other }\n var last = this.lastChild, first = other.firstChild, content = this.content.slice(), i = 0;\n if (last.isText && last.sameMarkup(first)) {\n content[content.length - 1] = last.withText(last.text + first.text);\n i = 1;\n }\n for (; i < other.content.length; i++) { content.push(other.content[i]); }\n return new Fragment(content, this.size + other.size)\n};\n\n// :: (number, ?number) → Fragment\n// Cut out the sub-fragment between the two given positions.\nFragment.prototype.cut = function cut (from, to) {\n if (to == null) { to = this.size; }\n if (from == 0 && to == this.size) { return this }\n var result = [], size = 0;\n if (to > from) { for (var i = 0, pos = 0; pos < to; i++) {\n var child = this.content[i], end = pos + child.nodeSize;\n if (end > from) {\n if (pos < from || end > to) {\n if (child.isText)\n { child = child.cut(Math.max(0, from - pos), Math.min(child.text.length, to - pos)); }\n else\n { child = child.cut(Math.max(0, from - pos - 1), Math.min(child.content.size, to - pos - 1)); }\n }\n result.push(child);\n size += child.nodeSize;\n }\n pos = end;\n } }\n return new Fragment(result, size)\n};\n\nFragment.prototype.cutByIndex = function cutByIndex (from, to) {\n if (from == to) { return Fragment.empty }\n if (from == 0 && to == this.content.length) { return this }\n return new Fragment(this.content.slice(from, to))\n};\n\n// :: (number, Node) → Fragment\n// Create a new fragment in which the node at the given index is\n// replaced by the given node.\nFragment.prototype.replaceChild = function replaceChild (index, node) {\n var current = this.content[index];\n if (current == node) { return this }\n var copy = this.content.slice();\n var size = this.size + node.nodeSize - current.nodeSize;\n copy[index] = node;\n return new Fragment(copy, size)\n};\n\n// : (Node) → Fragment\n// Create a new fragment by prepending the given node to this\n// fragment.\nFragment.prototype.addToStart = function addToStart (node) {\n return new Fragment([node].concat(this.content), this.size + node.nodeSize)\n};\n\n// : (Node) → Fragment\n// Create a new fragment by appending the given node to this\n// fragment.\nFragment.prototype.addToEnd = function addToEnd (node) {\n return new Fragment(this.content.concat(node), this.size + node.nodeSize)\n};\n\n// :: (Fragment) → bool\n// Compare this fragment to another one.\nFragment.prototype.eq = function eq (other) {\n if (this.content.length != other.content.length) { return false }\n for (var i = 0; i < this.content.length; i++)\n { if (!this.content[i].eq(other.content[i])) { return false } }\n return true\n};\n\n// :: ?Node\n// The first child of the fragment, or `null` if it is empty.\nprototypeAccessors.firstChild.get = function () { return this.content.length ? this.content[0] : null };\n\n// :: ?Node\n// The last child of the fragment, or `null` if it is empty.\nprototypeAccessors.lastChild.get = function () { return this.content.length ? this.content[this.content.length - 1] : null };\n\n// :: number\n// The number of child nodes in this fragment.\nprototypeAccessors.childCount.get = function () { return this.content.length };\n\n// :: (number) → Node\n// Get the child node at the given index. Raise an error when the\n// index is out of range.\nFragment.prototype.child = function child (index) {\n var found = this.content[index];\n if (!found) { throw new RangeError(\"Index \" + index + \" out of range for \" + this) }\n return found\n};\n\n// :: (number) → ?Node\n// Get the child node at the given index, if it exists.\nFragment.prototype.maybeChild = function maybeChild (index) {\n return this.content[index]\n};\n\n// :: ((node: Node, offset: number, index: number))\n// Call `f` for every child node, passing the node, its offset\n// into this parent node, and its index.\nFragment.prototype.forEach = function forEach (f) {\n for (var i = 0, p = 0; i < this.content.length; i++) {\n var child = this.content[i];\n f(child, p, i);\n p += child.nodeSize;\n }\n};\n\n// :: (Fragment) → ?number\n// Find the first position at which this fragment and another\n// fragment differ, or `null` if they are the same.\nFragment.prototype.findDiffStart = function findDiffStart$1 (other, pos) {\n if ( pos === void 0 ) pos = 0;\n\n return findDiffStart(this, other, pos)\n};\n\n// :: (Fragment) → ?{a: number, b: number}\n// Find the first position, searching from the end, at which this\n// fragment and the given fragment differ, or `null` if they are the\n// same. Since this position will not be the same in both nodes, an\n// object with two separate positions is returned.\nFragment.prototype.findDiffEnd = function findDiffEnd$1 (other, pos, otherPos) {\n if ( pos === void 0 ) pos = this.size;\n if ( otherPos === void 0 ) otherPos = other.size;\n\n return findDiffEnd(this, other, pos, otherPos)\n};\n\n// : (number, ?number) → {index: number, offset: number}\n// Find the index and inner offset corresponding to a given relative\n// position in this fragment. The result object will be reused\n// (overwritten) the next time the function is called. (Not public.)\nFragment.prototype.findIndex = function findIndex (pos, round) {\n if ( round === void 0 ) round = -1;\n\n if (pos == 0) { return retIndex(0, pos) }\n if (pos == this.size) { return retIndex(this.content.length, pos) }\n if (pos > this.size || pos < 0) { throw new RangeError((\"Position \" + pos + \" outside of fragment (\" + (this) + \")\")) }\n for (var i = 0, curPos = 0;; i++) {\n var cur = this.child(i), end = curPos + cur.nodeSize;\n if (end >= pos) {\n if (end == pos || round > 0) { return retIndex(i + 1, end) }\n return retIndex(i, curPos)\n }\n curPos = end;\n }\n};\n\n// :: () → string\n// Return a debugging string that describes this fragment.\nFragment.prototype.toString = function toString () { return \"<\" + this.toStringInner() + \">\" };\n\nFragment.prototype.toStringInner = function toStringInner () { return this.content.join(\", \") };\n\n// :: () → ?Object\n// Create a JSON-serializeable representation of this fragment.\nFragment.prototype.toJSON = function toJSON () {\n return this.content.length ? this.content.map(function (n) { return n.toJSON(); }) : null\n};\n\n// :: (Schema, ?Object) → Fragment\n// Deserialize a fragment from its JSON representation.\nFragment.fromJSON = function fromJSON (schema, value) {\n if (!value) { return Fragment.empty }\n if (!Array.isArray(value)) { throw new RangeError(\"Invalid input for Fragment.fromJSON\") }\n return new Fragment(value.map(schema.nodeFromJSON))\n};\n\n// :: ([Node]) → Fragment\n// Build a fragment from an array of nodes. Ensures that adjacent\n// text nodes with the same marks are joined together.\nFragment.fromArray = function fromArray (array) {\n if (!array.length) { return Fragment.empty }\n var joined, size = 0;\n for (var i = 0; i < array.length; i++) {\n var node = array[i];\n size += node.nodeSize;\n if (i && node.isText && array[i - 1].sameMarkup(node)) {\n if (!joined) { joined = array.slice(0, i); }\n joined[joined.length - 1] = node.withText(joined[joined.length - 1].text + node.text);\n } else if (joined) {\n joined.push(node);\n }\n }\n return new Fragment(joined || array, size)\n};\n\n// :: (?union) → Fragment\n// Create a fragment from something that can be interpreted as a set\n// of nodes. For `null`, it returns the empty fragment. For a\n// fragment, the fragment itself. For a node or array of nodes, a\n// fragment containing those nodes.\nFragment.from = function from (nodes) {\n if (!nodes) { return Fragment.empty }\n if (nodes instanceof Fragment) { return nodes }\n if (Array.isArray(nodes)) { return this.fromArray(nodes) }\n if (nodes.attrs) { return new Fragment([nodes], nodes.nodeSize) }\n throw new RangeError(\"Can not convert \" + nodes + \" to a Fragment\" +\n (nodes.nodesBetween ? \" (looks like multiple versions of prosemirror-model were loaded)\" : \"\"))\n};\n\nObject.defineProperties( Fragment.prototype, prototypeAccessors );\n\nvar found = {index: 0, offset: 0};\nfunction retIndex(index, offset) {\n found.index = index;\n found.offset = offset;\n return found\n}\n\n// :: Fragment\n// An empty fragment. Intended to be reused whenever a node doesn't\n// contain anything (rather than allocating a new empty fragment for\n// each leaf node).\nFragment.empty = new Fragment([], 0);\n\nfunction compareDeep(a, b) {\n if (a === b) { return true }\n if (!(a && typeof a == \"object\") ||\n !(b && typeof b == \"object\")) { return false }\n var array = Array.isArray(a);\n if (Array.isArray(b) != array) { return false }\n if (array) {\n if (a.length != b.length) { return false }\n for (var i = 0; i < a.length; i++) { if (!compareDeep(a[i], b[i])) { return false } }\n } else {\n for (var p in a) { if (!(p in b) || !compareDeep(a[p], b[p])) { return false } }\n for (var p$1 in b) { if (!(p$1 in a)) { return false } }\n }\n return true\n}\n\n// ::- A mark is a piece of information that can be attached to a node,\n// such as it being emphasized, in code font, or a link. It has a type\n// and optionally a set of attributes that provide further information\n// (such as the target of the link). Marks are created through a\n// `Schema`, which controls which types exist and which\n// attributes they have.\nvar Mark = function Mark(type, attrs) {\n // :: MarkType\n // The type of this mark.\n this.type = type;\n // :: Object\n // The attributes associated with this mark.\n this.attrs = attrs;\n};\n\n// :: ([Mark]) → [Mark]\n// Given a set of marks, create a new set which contains this one as\n// well, in the right position. If this mark is already in the set,\n// the set itself is returned. If any marks that are set to be\n// [exclusive](#model.MarkSpec.excludes) with this mark are present,\n// those are replaced by this one.\nMark.prototype.addToSet = function addToSet (set) {\n var copy, placed = false;\n for (var i = 0; i < set.length; i++) {\n var other = set[i];\n if (this.eq(other)) { return set }\n if (this.type.excludes(other.type)) {\n if (!copy) { copy = set.slice(0, i); }\n } else if (other.type.excludes(this.type)) {\n return set\n } else {\n if (!placed && other.type.rank > this.type.rank) {\n if (!copy) { copy = set.slice(0, i); }\n copy.push(this);\n placed = true;\n }\n if (copy) { copy.push(other); }\n }\n }\n if (!copy) { copy = set.slice(); }\n if (!placed) { copy.push(this); }\n return copy\n};\n\n// :: ([Mark]) → [Mark]\n// Remove this mark from the given set, returning a new set. If this\n// mark is not in the set, the set itself is returned.\nMark.prototype.removeFromSet = function removeFromSet (set) {\n for (var i = 0; i < set.length; i++)\n { if (this.eq(set[i]))\n { return set.slice(0, i).concat(set.slice(i + 1)) } }\n return set\n};\n\n// :: ([Mark]) → bool\n// Test whether this mark is in the given set of marks.\nMark.prototype.isInSet = function isInSet (set) {\n for (var i = 0; i < set.length; i++)\n { if (this.eq(set[i])) { return true } }\n return false\n};\n\n// :: (Mark) → bool\n// Test whether this mark has the same type and attributes as\n// another mark.\nMark.prototype.eq = function eq (other) {\n return this == other ||\n (this.type == other.type && compareDeep(this.attrs, other.attrs))\n};\n\n// :: () → Object\n// Convert this mark to a JSON-serializeable representation.\nMark.prototype.toJSON = function toJSON () {\n var obj = {type: this.type.name};\n for (var _ in this.attrs) {\n obj.attrs = this.attrs;\n break\n }\n return obj\n};\n\n// :: (Schema, Object) → Mark\nMark.fromJSON = function fromJSON (schema, json) {\n if (!json) { throw new RangeError(\"Invalid input for Mark.fromJSON\") }\n var type = schema.marks[json.type];\n if (!type) { throw new RangeError((\"There is no mark type \" + (json.type) + \" in this schema\")) }\n return type.create(json.attrs)\n};\n\n// :: ([Mark], [Mark]) → bool\n// Test whether two sets of marks are identical.\nMark.sameSet = function sameSet (a, b) {\n if (a == b) { return true }\n if (a.length != b.length) { return false }\n for (var i = 0; i < a.length; i++)\n { if (!a[i].eq(b[i])) { return false } }\n return true\n};\n\n// :: (?union) → [Mark]\n// Create a properly sorted mark set from null, a single mark, or an\n// unsorted array of marks.\nMark.setFrom = function setFrom (marks) {\n if (!marks || marks.length == 0) { return Mark.none }\n if (marks instanceof Mark) { return [marks] }\n var copy = marks.slice();\n copy.sort(function (a, b) { return a.type.rank - b.type.rank; });\n return copy\n};\n\n// :: [Mark] The empty set of marks.\nMark.none = [];\n\n// ReplaceError:: class extends Error\n// Error type raised by [`Node.replace`](#model.Node.replace) when\n// given an invalid replacement.\n\nfunction ReplaceError(message) {\n var err = Error.call(this, message);\n err.__proto__ = ReplaceError.prototype;\n return err\n}\n\nReplaceError.prototype = Object.create(Error.prototype);\nReplaceError.prototype.constructor = ReplaceError;\nReplaceError.prototype.name = \"ReplaceError\";\n\n// ::- A slice represents a piece cut out of a larger document. It\n// stores not only a fragment, but also the depth up to which nodes on\n// both side are ‘open’ (cut through).\nvar Slice = function Slice(content, openStart, openEnd) {\n // :: Fragment The slice's content.\n this.content = content;\n // :: number The open depth at the start.\n this.openStart = openStart;\n // :: number The open depth at the end.\n this.openEnd = openEnd;\n};\n\nvar prototypeAccessors$1 = { size: { configurable: true } };\n\n// :: number\n// The size this slice would add when inserted into a document.\nprototypeAccessors$1.size.get = function () {\n return this.content.size - this.openStart - this.openEnd\n};\n\nSlice.prototype.insertAt = function insertAt (pos, fragment) {\n var content = insertInto(this.content, pos + this.openStart, fragment, null);\n return content && new Slice(content, this.openStart, this.openEnd)\n};\n\nSlice.prototype.removeBetween = function removeBetween (from, to) {\n return new Slice(removeRange(this.content, from + this.openStart, to + this.openStart), this.openStart, this.openEnd)\n};\n\n// :: (Slice) → bool\n// Tests whether this slice is equal to another slice.\nSlice.prototype.eq = function eq (other) {\n return this.content.eq(other.content) && this.openStart == other.openStart && this.openEnd == other.openEnd\n};\n\nSlice.prototype.toString = function toString () {\n return this.content + \"(\" + this.openStart + \",\" + this.openEnd + \")\"\n};\n\n// :: () → ?Object\n// Convert a slice to a JSON-serializable representation.\nSlice.prototype.toJSON = function toJSON () {\n if (!this.content.size) { return null }\n var json = {content: this.content.toJSON()};\n if (this.openStart > 0) { json.openStart = this.openStart; }\n if (this.openEnd > 0) { json.openEnd = this.openEnd; }\n return json\n};\n\n// :: (Schema, ?Object) → Slice\n// Deserialize a slice from its JSON representation.\nSlice.fromJSON = function fromJSON (schema, json) {\n if (!json) { return Slice.empty }\n var openStart = json.openStart || 0, openEnd = json.openEnd || 0;\n if (typeof openStart != \"number\" || typeof openEnd != \"number\")\n { throw new RangeError(\"Invalid input for Slice.fromJSON\") }\n return new Slice(Fragment.fromJSON(schema, json.content), openStart, openEnd)\n};\n\n// :: (Fragment, ?bool) → Slice\n// Create a slice from a fragment by taking the maximum possible\n// open value on both side of the fragment.\nSlice.maxOpen = function maxOpen (fragment, openIsolating) {\n if ( openIsolating === void 0 ) openIsolating=true;\n\n var openStart = 0, openEnd = 0;\n for (var n = fragment.firstChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.firstChild) { openStart++; }\n for (var n$1 = fragment.lastChild; n$1 && !n$1.isLeaf && (openIsolating || !n$1.type.spec.isolating); n$1 = n$1.lastChild) { openEnd++; }\n return new Slice(fragment, openStart, openEnd)\n};\n\nObject.defineProperties( Slice.prototype, prototypeAccessors$1 );\n\nfunction removeRange(content, from, to) {\n var ref = content.findIndex(from);\n var index = ref.index;\n var offset = ref.offset;\n var child = content.maybeChild(index);\n var ref$1 = content.findIndex(to);\n var indexTo = ref$1.index;\n var offsetTo = ref$1.offset;\n if (offset == from || child.isText) {\n if (offsetTo != to && !content.child(indexTo).isText) { throw new RangeError(\"Removing non-flat range\") }\n return content.cut(0, from).append(content.cut(to))\n }\n if (index != indexTo) { throw new RangeError(\"Removing non-flat range\") }\n return content.replaceChild(index, child.copy(removeRange(child.content, from - offset - 1, to - offset - 1)))\n}\n\nfunction insertInto(content, dist, insert, parent) {\n var ref = content.findIndex(dist);\n var index = ref.index;\n var offset = ref.offset;\n var child = content.maybeChild(index);\n if (offset == dist || child.isText) {\n if (parent && !parent.canReplace(index, index, insert)) { return null }\n return content.cut(0, dist).append(insert).append(content.cut(dist))\n }\n var inner = insertInto(child.content, dist - offset - 1, insert);\n return inner && content.replaceChild(index, child.copy(inner))\n}\n\n// :: Slice\n// The empty slice.\nSlice.empty = new Slice(Fragment.empty, 0, 0);\n\nfunction replace($from, $to, slice) {\n if (slice.openStart > $from.depth)\n { throw new ReplaceError(\"Inserted content deeper than insertion position\") }\n if ($from.depth - slice.openStart != $to.depth - slice.openEnd)\n { throw new ReplaceError(\"Inconsistent open depths\") }\n return replaceOuter($from, $to, slice, 0)\n}\n\nfunction replaceOuter($from, $to, slice, depth) {\n var index = $from.index(depth), node = $from.node(depth);\n if (index == $to.index(depth) && depth < $from.depth - slice.openStart) {\n var inner = replaceOuter($from, $to, slice, depth + 1);\n return node.copy(node.content.replaceChild(index, inner))\n } else if (!slice.content.size) {\n return close(node, replaceTwoWay($from, $to, depth))\n } else if (!slice.openStart && !slice.openEnd && $from.depth == depth && $to.depth == depth) { // Simple, flat case\n var parent = $from.parent, content = parent.content;\n return close(parent, content.cut(0, $from.parentOffset).append(slice.content).append(content.cut($to.parentOffset)))\n } else {\n var ref = prepareSliceForReplace(slice, $from);\n var start = ref.start;\n var end = ref.end;\n return close(node, replaceThreeWay($from, start, end, $to, depth))\n }\n}\n\nfunction checkJoin(main, sub) {\n if (!sub.type.compatibleContent(main.type))\n { throw new ReplaceError(\"Cannot join \" + sub.type.name + \" onto \" + main.type.name) }\n}\n\nfunction joinable($before, $after, depth) {\n var node = $before.node(depth);\n checkJoin(node, $after.node(depth));\n return node\n}\n\nfunction addNode(child, target) {\n var last = target.length - 1;\n if (last >= 0 && child.isText && child.sameMarkup(target[last]))\n { target[last] = child.withText(target[last].text + child.text); }\n else\n { target.push(child); }\n}\n\nfunction addRange($start, $end, depth, target) {\n var node = ($end || $start).node(depth);\n var startIndex = 0, endIndex = $end ? $end.index(depth) : node.childCount;\n if ($start) {\n startIndex = $start.index(depth);\n if ($start.depth > depth) {\n startIndex++;\n } else if ($start.textOffset) {\n addNode($start.nodeAfter, target);\n startIndex++;\n }\n }\n for (var i = startIndex; i < endIndex; i++) { addNode(node.child(i), target); }\n if ($end && $end.depth == depth && $end.textOffset)\n { addNode($end.nodeBefore, target); }\n}\n\nfunction close(node, content) {\n if (!node.type.validContent(content))\n { throw new ReplaceError(\"Invalid content for node \" + node.type.name) }\n return node.copy(content)\n}\n\nfunction replaceThreeWay($from, $start, $end, $to, depth) {\n var openStart = $from.depth > depth && joinable($from, $start, depth + 1);\n var openEnd = $to.depth > depth && joinable($end, $to, depth + 1);\n\n var content = [];\n addRange(null, $from, depth, content);\n if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {\n checkJoin(openStart, openEnd);\n addNode(close(openStart, replaceThreeWay($from, $start, $end, $to, depth + 1)), content);\n } else {\n if (openStart)\n { addNode(close(openStart, replaceTwoWay($from, $start, depth + 1)), content); }\n addRange($start, $end, depth, content);\n if (openEnd)\n { addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content); }\n }\n addRange($to, null, depth, content);\n return new Fragment(content)\n}\n\nfunction replaceTwoWay($from, $to, depth) {\n var content = [];\n addRange(null, $from, depth, content);\n if ($from.depth > depth) {\n var type = joinable($from, $to, depth + 1);\n addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content);\n }\n addRange($to, null, depth, content);\n return new Fragment(content)\n}\n\nfunction prepareSliceForReplace(slice, $along) {\n var extra = $along.depth - slice.openStart, parent = $along.node(extra);\n var node = parent.copy(slice.content);\n for (var i = extra - 1; i >= 0; i--)\n { node = $along.node(i).copy(Fragment.from(node)); }\n return {start: node.resolveNoCache(slice.openStart + extra),\n end: node.resolveNoCache(node.content.size - slice.openEnd - extra)}\n}\n\n// ::- You can [_resolve_](#model.Node.resolve) a position to get more\n// information about it. Objects of this class represent such a\n// resolved position, providing various pieces of context information,\n// and some helper methods.\n//\n// Throughout this interface, methods that take an optional `depth`\n// parameter will interpret undefined as `this.depth` and negative\n// numbers as `this.depth + value`.\nvar ResolvedPos = function ResolvedPos(pos, path, parentOffset) {\n // :: number The position that was resolved.\n this.pos = pos;\n this.path = path;\n // :: number\n // The number of levels the parent node is from the root. If this\n // position points directly into the root node, it is 0. If it\n // points into a top-level paragraph, 1, and so on.\n this.depth = path.length / 3 - 1;\n // :: number The offset this position has into its parent node.\n this.parentOffset = parentOffset;\n};\n\nvar prototypeAccessors$2 = { parent: { configurable: true },doc: { configurable: true },textOffset: { configurable: true },nodeAfter: { configurable: true },nodeBefore: { configurable: true } };\n\nResolvedPos.prototype.resolveDepth = function resolveDepth (val) {\n if (val == null) { return this.depth }\n if (val < 0) { return this.depth + val }\n return val\n};\n\n// :: Node\n// The parent node that the position points into. Note that even if\n// a position points into a text node, that node is not considered\n// the parent—text nodes are ‘flat’ in this model, and have no content.\nprototypeAccessors$2.parent.get = function () { return this.node(this.depth) };\n\n// :: Node\n// The root node in which the position was resolved.\nprototypeAccessors$2.doc.get = function () { return this.node(0) };\n\n// :: (?number) → Node\n// The ancestor node at the given level. `p.node(p.depth)` is the\n// same as `p.parent`.\nResolvedPos.prototype.node = function node (depth) { return this.path[this.resolveDepth(depth) * 3] };\n\n// :: (?number) → number\n// The index into the ancestor at the given level. If this points at\n// the 3rd node in the 2nd paragraph on the top level, for example,\n// `p.index(0)` is 1 and `p.index(1)` is 2.\nResolvedPos.prototype.index = function index (depth) { return this.path[this.resolveDepth(depth) * 3 + 1] };\n\n// :: (?number) → number\n// The index pointing after this position into the ancestor at the\n// given level.\nResolvedPos.prototype.indexAfter = function indexAfter (depth) {\n depth = this.resolveDepth(depth);\n return this.index(depth) + (depth == this.depth && !this.textOffset ? 0 : 1)\n};\n\n// :: (?number) → number\n// The (absolute) position at the start of the node at the given\n// level.\nResolvedPos.prototype.start = function start (depth) {\n depth = this.resolveDepth(depth);\n return depth == 0 ? 0 : this.path[depth * 3 - 1] + 1\n};\n\n// :: (?number) → number\n// The (absolute) position at the end of the node at the given\n// level.\nResolvedPos.prototype.end = function end (depth) {\n depth = this.resolveDepth(depth);\n return this.start(depth) + this.node(depth).content.size\n};\n\n// :: (?number) → number\n// The (absolute) position directly before the wrapping node at the\n// given level, or, when `depth` is `this.depth + 1`, the original\n// position.\nResolvedPos.prototype.before = function before (depth) {\n depth = this.resolveDepth(depth);\n if (!depth) { throw new RangeError(\"There is no position before the top-level node\") }\n return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1]\n};\n\n// :: (?number) → number\n// The (absolute) position directly after the wrapping node at the\n// given level, or the original position when `depth` is `this.depth + 1`.\nResolvedPos.prototype.after = function after (depth) {\n depth = this.resolveDepth(depth);\n if (!depth) { throw new RangeError(\"There is no position after the top-level node\") }\n return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1] + this.path[depth * 3].nodeSize\n};\n\n// :: number\n// When this position points into a text node, this returns the\n// distance between the position and the start of the text node.\n// Will be zero for positions that point between nodes.\nprototypeAccessors$2.textOffset.get = function () { return this.pos - this.path[this.path.length - 1] };\n\n// :: ?Node\n// Get the node directly after the position, if any. If the position\n// points into a text node, only the part of that node after the\n// position is returned.\nprototypeAccessors$2.nodeAfter.get = function () {\n var parent = this.parent, index = this.index(this.depth);\n if (index == parent.childCount) { return null }\n var dOff = this.pos - this.path[this.path.length - 1], child = parent.child(index);\n return dOff ? parent.child(index).cut(dOff) : child\n};\n\n// :: ?Node\n// Get the node directly before the position, if any. If the\n// position points into a text node, only the part of that node\n// before the position is returned.\nprototypeAccessors$2.nodeBefore.get = function () {\n var index = this.index(this.depth);\n var dOff = this.pos - this.path[this.path.length - 1];\n if (dOff) { return this.parent.child(index).cut(0, dOff) }\n return index == 0 ? null : this.parent.child(index - 1)\n};\n\n// :: (number, ?number) → number\n// Get the position at the given index in the parent node at the\n// given depth (which defaults to `this.depth`).\nResolvedPos.prototype.posAtIndex = function posAtIndex (index, depth) {\n depth = this.resolveDepth(depth);\n var node = this.path[depth * 3], pos = depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n for (var i = 0; i < index; i++) { pos += node.child(i).nodeSize; }\n return pos\n};\n\n// :: () → [Mark]\n// Get the marks at this position, factoring in the surrounding\n// marks' [`inclusive`](#model.MarkSpec.inclusive) property. If the\n// position is at the start of a non-empty node, the marks of the\n// node after it (if any) are returned.\nResolvedPos.prototype.marks = function marks () {\n var parent = this.parent, index = this.index();\n\n // In an empty parent, return the empty array\n if (parent.content.size == 0) { return Mark.none }\n\n // When inside a text node, just return the text node's marks\n if (this.textOffset) { return parent.child(index).marks }\n\n var main = parent.maybeChild(index - 1), other = parent.maybeChild(index);\n // If the `after` flag is true of there is no node before, make\n // the node after this position the main reference.\n if (!main) { var tmp = main; main = other; other = tmp; }\n\n // Use all marks in the main node, except those that have\n // `inclusive` set to false and are not present in the other node.\n var marks = main.marks;\n for (var i = 0; i < marks.length; i++)\n { if (marks[i].type.spec.inclusive === false && (!other || !marks[i].isInSet(other.marks)))\n { marks = marks[i--].removeFromSet(marks); } }\n\n return marks\n};\n\n// :: (ResolvedPos) → ?[Mark]\n// Get the marks after the current position, if any, except those\n// that are non-inclusive and not present at position `$end`. This\n// is mostly useful for getting the set of marks to preserve after a\n// deletion. Will return `null` if this position is at the end of\n// its parent node or its parent node isn't a textblock (in which\n// case no marks should be preserved).\nResolvedPos.prototype.marksAcross = function marksAcross ($end) {\n var after = this.parent.maybeChild(this.index());\n if (!after || !after.isInline) { return null }\n\n var marks = after.marks, next = $end.parent.maybeChild($end.index());\n for (var i = 0; i < marks.length; i++)\n { if (marks[i].type.spec.inclusive === false && (!next || !marks[i].isInSet(next.marks)))\n { marks = marks[i--].removeFromSet(marks); } }\n return marks\n};\n\n// :: (number) → number\n// The depth up to which this position and the given (non-resolved)\n// position share the same parent nodes.\nResolvedPos.prototype.sharedDepth = function sharedDepth (pos) {\n for (var depth = this.depth; depth > 0; depth--)\n { if (this.start(depth) <= pos && this.end(depth) >= pos) { return depth } }\n return 0\n};\n\n// :: (?ResolvedPos, ?(Node) → bool) → ?NodeRange\n// Returns a range based on the place where this position and the\n// given position diverge around block content. If both point into\n// the same textblock, for example, a range around that textblock\n// will be returned. If they point into different blocks, the range\n// around those blocks in their shared ancestor is returned. You can\n// pass in an optional predicate that will be called with a parent\n// node to see if a range into that parent is acceptable.\nResolvedPos.prototype.blockRange = function blockRange (other, pred) {\n if ( other === void 0 ) other = this;\n\n if (other.pos < this.pos) { return other.blockRange(this) }\n for (var d = this.depth - (this.parent.inlineContent || this.pos == other.pos ? 1 : 0); d >= 0; d--)\n { if (other.pos <= this.end(d) && (!pred || pred(this.node(d))))\n { return new NodeRange(this, other, d) } }\n};\n\n// :: (ResolvedPos) → bool\n// Query whether the given position shares the same parent node.\nResolvedPos.prototype.sameParent = function sameParent (other) {\n return this.pos - this.parentOffset == other.pos - other.parentOffset\n};\n\n// :: (ResolvedPos) → ResolvedPos\n// Return the greater of this and the given position.\nResolvedPos.prototype.max = function max (other) {\n return other.pos > this.pos ? other : this\n};\n\n// :: (ResolvedPos) → ResolvedPos\n// Return the smaller of this and the given position.\nResolvedPos.prototype.min = function min (other) {\n return other.pos < this.pos ? other : this\n};\n\nResolvedPos.prototype.toString = function toString () {\n var str = \"\";\n for (var i = 1; i <= this.depth; i++)\n { str += (str ? \"/\" : \"\") + this.node(i).type.name + \"_\" + this.index(i - 1); }\n return str + \":\" + this.parentOffset\n};\n\nResolvedPos.resolve = function resolve (doc, pos) {\n if (!(pos >= 0 && pos <= doc.content.size)) { throw new RangeError(\"Position \" + pos + \" out of range\") }\n var path = [];\n var start = 0, parentOffset = pos;\n for (var node = doc;;) {\n var ref = node.content.findIndex(parentOffset);\n var index = ref.index;\n var offset = ref.offset;\n var rem = parentOffset - offset;\n path.push(node, index, start + offset);\n if (!rem) { break }\n node = node.child(index);\n if (node.isText) { break }\n parentOffset = rem - 1;\n start += offset + 1;\n }\n return new ResolvedPos(pos, path, parentOffset)\n};\n\nResolvedPos.resolveCached = function resolveCached (doc, pos) {\n for (var i = 0; i < resolveCache.length; i++) {\n var cached = resolveCache[i];\n if (cached.pos == pos && cached.doc == doc) { return cached }\n }\n var result = resolveCache[resolveCachePos] = ResolvedPos.resolve(doc, pos);\n resolveCachePos = (resolveCachePos + 1) % resolveCacheSize;\n return result\n};\n\nObject.defineProperties( ResolvedPos.prototype, prototypeAccessors$2 );\n\nvar resolveCache = [], resolveCachePos = 0, resolveCacheSize = 12;\n\n// ::- Represents a flat range of content, i.e. one that starts and\n// ends in the same node.\nvar NodeRange = function NodeRange($from, $to, depth) {\n // :: ResolvedPos A resolved position along the start of the\n // content. May have a `depth` greater than this object's `depth`\n // property, since these are the positions that were used to\n // compute the range, not re-resolved positions directly at its\n // boundaries.\n this.$from = $from;\n // :: ResolvedPos A position along the end of the content. See\n // caveat for [`$from`](#model.NodeRange.$from).\n this.$to = $to;\n // :: number The depth of the node that this range points into.\n this.depth = depth;\n};\n\nvar prototypeAccessors$1$1 = { start: { configurable: true },end: { configurable: true },parent: { configurable: true },startIndex: { configurable: true },endIndex: { configurable: true } };\n\n// :: number The position at the start of the range.\nprototypeAccessors$1$1.start.get = function () { return this.$from.before(this.depth + 1) };\n// :: number The position at the end of the range.\nprototypeAccessors$1$1.end.get = function () { return this.$to.after(this.depth + 1) };\n\n// :: Node The parent node that the range points into.\nprototypeAccessors$1$1.parent.get = function () { return this.$from.node(this.depth) };\n// :: number The start index of the range in the parent node.\nprototypeAccessors$1$1.startIndex.get = function () { return this.$from.index(this.depth) };\n// :: number The end index of the range in the parent node.\nprototypeAccessors$1$1.endIndex.get = function () { return this.$to.indexAfter(this.depth) };\n\nObject.defineProperties( NodeRange.prototype, prototypeAccessors$1$1 );\n\nvar emptyAttrs = Object.create(null);\n\n// ::- This class represents a node in the tree that makes up a\n// ProseMirror document. So a document is an instance of `Node`, with\n// children that are also instances of `Node`.\n//\n// Nodes are persistent data structures. Instead of changing them, you\n// create new ones with the content you want. Old ones keep pointing\n// at the old document shape. This is made cheaper by sharing\n// structure between the old and new data as much as possible, which a\n// tree shape like this (without back pointers) makes easy.\n//\n// **Do not** directly mutate the properties of a `Node` object. See\n// [the guide](/docs/guide/#doc) for more information.\nvar Node = function Node(type, attrs, content, marks) {\n // :: NodeType\n // The type of node that this is.\n this.type = type;\n\n // :: Object\n // An object mapping attribute names to values. The kind of\n // attributes allowed and required are\n // [determined](#model.NodeSpec.attrs) by the node type.\n this.attrs = attrs;\n\n // :: Fragment\n // A container holding the node's children.\n this.content = content || Fragment.empty;\n\n // :: [Mark]\n // The marks (things like whether it is emphasized or part of a\n // link) applied to this node.\n this.marks = marks || Mark.none;\n};\n\nvar prototypeAccessors$3 = { nodeSize: { configurable: true },childCount: { configurable: true },textContent: { configurable: true },firstChild: { configurable: true },lastChild: { configurable: true },isBlock: { configurable: true },isTextblock: { configurable: true },inlineContent: { configurable: true },isInline: { configurable: true },isText: { configurable: true },isLeaf: { configurable: true },isAtom: { configurable: true } };\n\n// text:: ?string\n// For text nodes, this contains the node's text content.\n\n// :: number\n// The size of this node, as defined by the integer-based [indexing\n// scheme](/docs/guide/#doc.indexing). For text nodes, this is the\n// amount of characters. For other leaf nodes, it is one. For\n// non-leaf nodes, it is the size of the content plus two (the start\n// and end token).\nprototypeAccessors$3.nodeSize.get = function () { return this.isLeaf ? 1 : 2 + this.content.size };\n\n// :: number\n// The number of children that the node has.\nprototypeAccessors$3.childCount.get = function () { return this.content.childCount };\n\n// :: (number) → Node\n// Get the child node at the given index. Raises an error when the\n// index is out of range.\nNode.prototype.child = function child (index) { return this.content.child(index) };\n\n// :: (number) → ?Node\n// Get the child node at the given index, if it exists.\nNode.prototype.maybeChild = function maybeChild (index) { return this.content.maybeChild(index) };\n\n// :: ((node: Node, offset: number, index: number))\n// Call `f` for every child node, passing the node, its offset\n// into this parent node, and its index.\nNode.prototype.forEach = function forEach (f) { this.content.forEach(f); };\n\n// :: (number, number, (node: Node, pos: number, parent: Node, index: number) → ?bool, ?number)\n// Invoke a callback for all descendant nodes recursively between\n// the given two positions that are relative to start of this node's\n// content. The callback is invoked with the node, its\n// parent-relative position, its parent node, and its child index.\n// When the callback returns false for a given node, that node's\n// children will not be recursed over. The last parameter can be\n// used to specify a starting position to count from.\nNode.prototype.nodesBetween = function nodesBetween (from, to, f, startPos) {\n if ( startPos === void 0 ) startPos = 0;\n\n this.content.nodesBetween(from, to, f, startPos, this);\n};\n\n// :: ((node: Node, pos: number, parent: Node) → ?bool)\n// Call the given callback for every descendant node. Doesn't\n// descend into a node when the callback returns `false`.\nNode.prototype.descendants = function descendants (f) {\n this.nodesBetween(0, this.content.size, f);\n};\n\n// :: string\n// Concatenates all the text nodes found in this fragment and its\n// children.\nprototypeAccessors$3.textContent.get = function () { return this.textBetween(0, this.content.size, \"\") };\n\n// :: (number, number, ?string, ?string) → string\n// Get all text between positions `from` and `to`. When\n// `blockSeparator` is given, it will be inserted whenever a new\n// block node is started. When `leafText` is given, it'll be\n// inserted for every non-text leaf node encountered.\nNode.prototype.textBetween = function textBetween (from, to, blockSeparator, leafText) {\n return this.content.textBetween(from, to, blockSeparator, leafText)\n};\n\n// :: ?Node\n// Returns this node's first child, or `null` if there are no\n// children.\nprototypeAccessors$3.firstChild.get = function () { return this.content.firstChild };\n\n// :: ?Node\n// Returns this node's last child, or `null` if there are no\n// children.\nprototypeAccessors$3.lastChild.get = function () { return this.content.lastChild };\n\n// :: (Node) → bool\n// Test whether two nodes represent the same piece of document.\nNode.prototype.eq = function eq (other) {\n return this == other || (this.sameMarkup(other) && this.content.eq(other.content))\n};\n\n// :: (Node) → bool\n// Compare the markup (type, attributes, and marks) of this node to\n// those of another. Returns `true` if both have the same markup.\nNode.prototype.sameMarkup = function sameMarkup (other) {\n return this.hasMarkup(other.type, other.attrs, other.marks)\n};\n\n// :: (NodeType, ?Object, ?[Mark]) → bool\n// Check whether this node's markup correspond to the given type,\n// attributes, and marks.\nNode.prototype.hasMarkup = function hasMarkup (type, attrs, marks) {\n return this.type == type &&\n compareDeep(this.attrs, attrs || type.defaultAttrs || emptyAttrs) &&\n Mark.sameSet(this.marks, marks || Mark.none)\n};\n\n// :: (?Fragment) → Node\n// Create a new node with the same markup as this node, containing\n// the given content (or empty, if no content is given).\nNode.prototype.copy = function copy (content) {\n if ( content === void 0 ) content = null;\n\n if (content == this.content) { return this }\n return new this.constructor(this.type, this.attrs, content, this.marks)\n};\n\n// :: ([Mark]) → Node\n// Create a copy of this node, with the given set of marks instead\n// of the node's own marks.\nNode.prototype.mark = function mark (marks) {\n return marks == this.marks ? this : new this.constructor(this.type, this.attrs, this.content, marks)\n};\n\n// :: (number, ?number) → Node\n// Create a copy of this node with only the content between the\n// given positions. If `to` is not given, it defaults to the end of\n// the node.\nNode.prototype.cut = function cut (from, to) {\n if (from == 0 && to == this.content.size) { return this }\n return this.copy(this.content.cut(from, to))\n};\n\n// :: (number, ?number) → Slice\n// Cut out the part of the document between the given positions, and\n// return it as a `Slice` object.\nNode.prototype.slice = function slice (from, to, includeParents) {\n if ( to === void 0 ) to = this.content.size;\n if ( includeParents === void 0 ) includeParents = false;\n\n if (from == to) { return Slice.empty }\n\n var $from = this.resolve(from), $to = this.resolve(to);\n var depth = includeParents ? 0 : $from.sharedDepth(to);\n var start = $from.start(depth), node = $from.node(depth);\n var content = node.content.cut($from.pos - start, $to.pos - start);\n return new Slice(content, $from.depth - depth, $to.depth - depth)\n};\n\n// :: (number, number, Slice) → Node\n// Replace the part of the document between the given positions with\n// the given slice. The slice must 'fit', meaning its open sides\n// must be able to connect to the surrounding content, and its\n// content nodes must be valid children for the node they are placed\n// into. If any of this is violated, an error of type\n// [`ReplaceError`](#model.ReplaceError) is thrown.\nNode.prototype.replace = function replace$1 (from, to, slice) {\n return replace(this.resolve(from), this.resolve(to), slice)\n};\n\n// :: (number) → ?Node\n// Find the node directly after the given position.\nNode.prototype.nodeAt = function nodeAt (pos) {\n for (var node = this;;) {\n var ref = node.content.findIndex(pos);\n var index = ref.index;\n var offset = ref.offset;\n node = node.maybeChild(index);\n if (!node) { return null }\n if (offset == pos || node.isText) { return node }\n pos -= offset + 1;\n }\n};\n\n// :: (number) → {node: ?Node, index: number, offset: number}\n// Find the (direct) child node after the given offset, if any,\n// and return it along with its index and offset relative to this\n// node.\nNode.prototype.childAfter = function childAfter (pos) {\n var ref = this.content.findIndex(pos);\n var index = ref.index;\n var offset = ref.offset;\n return {node: this.content.maybeChild(index), index: index, offset: offset}\n};\n\n// :: (number) → {node: ?Node, index: number, offset: number}\n// Find the (direct) child node before the given offset, if any,\n// and return it along with its index and offset relative to this\n// node.\nNode.prototype.childBefore = function childBefore (pos) {\n if (pos == 0) { return {node: null, index: 0, offset: 0} }\n var ref = this.content.findIndex(pos);\n var index = ref.index;\n var offset = ref.offset;\n if (offset < pos) { return {node: this.content.child(index), index: index, offset: offset} }\n var node = this.content.child(index - 1);\n return {node: node, index: index - 1, offset: offset - node.nodeSize}\n};\n\n// :: (number) → ResolvedPos\n// Resolve the given position in the document, returning an\n// [object](#model.ResolvedPos) with information about its context.\nNode.prototype.resolve = function resolve (pos) { return ResolvedPos.resolveCached(this, pos) };\n\nNode.prototype.resolveNoCache = function resolveNoCache (pos) { return ResolvedPos.resolve(this, pos) };\n\n// :: (number, number, union) → bool\n// Test whether a given mark or mark type occurs in this document\n// between the two given positions.\nNode.prototype.rangeHasMark = function rangeHasMark (from, to, type) {\n var found = false;\n if (to > from) { this.nodesBetween(from, to, function (node) {\n if (type.isInSet(node.marks)) { found = true; }\n return !found\n }); }\n return found\n};\n\n// :: bool\n// True when this is a block (non-inline node)\nprototypeAccessors$3.isBlock.get = function () { return this.type.isBlock };\n\n// :: bool\n// True when this is a textblock node, a block node with inline\n// content.\nprototypeAccessors$3.isTextblock.get = function () { return this.type.isTextblock };\n\n// :: bool\n// True when this node allows inline content.\nprototypeAccessors$3.inlineContent.get = function () { return this.type.inlineContent };\n\n// :: bool\n// True when this is an inline node (a text node or a node that can\n// appear among text).\nprototypeAccessors$3.isInline.get = function () { return this.type.isInline };\n\n// :: bool\n// True when this is a text node.\nprototypeAccessors$3.isText.get = function () { return this.type.isText };\n\n// :: bool\n// True when this is a leaf node.\nprototypeAccessors$3.isLeaf.get = function () { return this.type.isLeaf };\n\n// :: bool\n// True when this is an atom, i.e. when it does not have directly\n// editable content. This is usually the same as `isLeaf`, but can\n// be configured with the [`atom` property](#model.NodeSpec.atom) on\n// a node's spec (typically used when the node is displayed as an\n// uneditable [node view](#view.NodeView)).\nprototypeAccessors$3.isAtom.get = function () { return this.type.isAtom };\n\n// :: () → string\n// Return a string representation of this node for debugging\n// purposes.\nNode.prototype.toString = function toString () {\n if (this.type.spec.toDebugString) { return this.type.spec.toDebugString(this) }\n var name = this.type.name;\n if (this.content.size)\n { name += \"(\" + this.content.toStringInner() + \")\"; }\n return wrapMarks(this.marks, name)\n};\n\n// :: (number) → ContentMatch\n// Get the content match in this node at the given index.\nNode.prototype.contentMatchAt = function contentMatchAt (index) {\n var match = this.type.contentMatch.matchFragment(this.content, 0, index);\n if (!match) { throw new Error(\"Called contentMatchAt on a node with invalid content\") }\n return match\n};\n\n// :: (number, number, ?Fragment, ?number, ?number) → bool\n// Test whether replacing the range between `from` and `to` (by\n// child index) with the given replacement fragment (which defaults\n// to the empty fragment) would leave the node's content valid. You\n// can optionally pass `start` and `end` indices into the\n// replacement fragment.\nNode.prototype.canReplace = function canReplace (from, to, replacement, start, end) {\n if ( replacement === void 0 ) replacement = Fragment.empty;\n if ( start === void 0 ) start = 0;\n if ( end === void 0 ) end = replacement.childCount;\n\n var one = this.contentMatchAt(from).matchFragment(replacement, start, end);\n var two = one && one.matchFragment(this.content, to);\n if (!two || !two.validEnd) { return false }\n for (var i = start; i < end; i++) { if (!this.type.allowsMarks(replacement.child(i).marks)) { return false } }\n return true\n};\n\n// :: (number, number, NodeType, ?[Mark]) → bool\n// Test whether replacing the range `from` to `to` (by index) with a\n// node of the given type would leave the node's content valid.\nNode.prototype.canReplaceWith = function canReplaceWith (from, to, type, marks) {\n if (marks && !this.type.allowsMarks(marks)) { return false }\n var start = this.contentMatchAt(from).matchType(type);\n var end = start && start.matchFragment(this.content, to);\n return end ? end.validEnd : false\n};\n\n// :: (Node) → bool\n// Test whether the given node's content could be appended to this\n// node. If that node is empty, this will only return true if there\n// is at least one node type that can appear in both nodes (to avoid\n// merging completely incompatible nodes).\nNode.prototype.canAppend = function canAppend (other) {\n if (other.content.size) { return this.canReplace(this.childCount, this.childCount, other.content) }\n else { return this.type.compatibleContent(other.type) }\n};\n\n// :: ()\n// Check whether this node and its descendants conform to the\n// schema, and raise error when they do not.\nNode.prototype.check = function check () {\n if (!this.type.validContent(this.content))\n { throw new RangeError((\"Invalid content for node \" + (this.type.name) + \": \" + (this.content.toString().slice(0, 50)))) }\n this.content.forEach(function (node) { return node.check(); });\n};\n\n// :: () → Object\n// Return a JSON-serializeable representation of this node.\nNode.prototype.toJSON = function toJSON () {\n var obj = {type: this.type.name};\n for (var _ in this.attrs) {\n obj.attrs = this.attrs;\n break\n }\n if (this.content.size)\n { obj.content = this.content.toJSON(); }\n if (this.marks.length)\n { obj.marks = this.marks.map(function (n) { return n.toJSON(); }); }\n return obj\n};\n\n// :: (Schema, Object) → Node\n// Deserialize a node from its JSON representation.\nNode.fromJSON = function fromJSON (schema, json) {\n if (!json) { throw new RangeError(\"Invalid input for Node.fromJSON\") }\n var marks = null;\n if (json.marks) {\n if (!Array.isArray(json.marks)) { throw new RangeError(\"Invalid mark data for Node.fromJSON\") }\n marks = json.marks.map(schema.markFromJSON);\n }\n if (json.type == \"text\") {\n if (typeof json.text != \"string\") { throw new RangeError(\"Invalid text node in JSON\") }\n return schema.text(json.text, marks)\n }\n var content = Fragment.fromJSON(schema, json.content);\n return schema.nodeType(json.type).create(json.attrs, content, marks)\n};\n\nObject.defineProperties( Node.prototype, prototypeAccessors$3 );\n\nvar TextNode = /*@__PURE__*/(function (Node) {\n function TextNode(type, attrs, content, marks) {\n Node.call(this, type, attrs, null, marks);\n\n if (!content) { throw new RangeError(\"Empty text nodes are not allowed\") }\n\n this.text = content;\n }\n\n if ( Node ) TextNode.__proto__ = Node;\n TextNode.prototype = Object.create( Node && Node.prototype );\n TextNode.prototype.constructor = TextNode;\n\n var prototypeAccessors$1 = { textContent: { configurable: true },nodeSize: { configurable: true } };\n\n TextNode.prototype.toString = function toString () {\n if (this.type.spec.toDebugString) { return this.type.spec.toDebugString(this) }\n return wrapMarks(this.marks, JSON.stringify(this.text))\n };\n\n prototypeAccessors$1.textContent.get = function () { return this.text };\n\n TextNode.prototype.textBetween = function textBetween (from, to) { return this.text.slice(from, to) };\n\n prototypeAccessors$1.nodeSize.get = function () { return this.text.length };\n\n TextNode.prototype.mark = function mark (marks) {\n return marks == this.marks ? this : new TextNode(this.type, this.attrs, this.text, marks)\n };\n\n TextNode.prototype.withText = function withText (text) {\n if (text == this.text) { return this }\n return new TextNode(this.type, this.attrs, text, this.marks)\n };\n\n TextNode.prototype.cut = function cut (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.text.length;\n\n if (from == 0 && to == this.text.length) { return this }\n return this.withText(this.text.slice(from, to))\n };\n\n TextNode.prototype.eq = function eq (other) {\n return this.sameMarkup(other) && this.text == other.text\n };\n\n TextNode.prototype.toJSON = function toJSON () {\n var base = Node.prototype.toJSON.call(this);\n base.text = this.text;\n return base\n };\n\n Object.defineProperties( TextNode.prototype, prototypeAccessors$1 );\n\n return TextNode;\n}(Node));\n\nfunction wrapMarks(marks, str) {\n for (var i = marks.length - 1; i >= 0; i--)\n { str = marks[i].type.name + \"(\" + str + \")\"; }\n return str\n}\n\n// ::- Instances of this class represent a match state of a node\n// type's [content expression](#model.NodeSpec.content), and can be\n// used to find out whether further content matches here, and whether\n// a given position is a valid end of the node.\nvar ContentMatch = function ContentMatch(validEnd) {\n // :: bool\n // True when this match state represents a valid end of the node.\n this.validEnd = validEnd;\n this.next = [];\n this.wrapCache = [];\n};\n\nvar prototypeAccessors$4 = { inlineContent: { configurable: true },defaultType: { configurable: true },edgeCount: { configurable: true } };\n\nContentMatch.parse = function parse (string, nodeTypes) {\n var stream = new TokenStream(string, nodeTypes);\n if (stream.next == null) { return ContentMatch.empty }\n var expr = parseExpr(stream);\n if (stream.next) { stream.err(\"Unexpected trailing text\"); }\n var match = dfa(nfa(expr));\n checkForDeadEnds(match, stream);\n return match\n};\n\n// :: (NodeType) → ?ContentMatch\n// Match a node type, returning a match after that node if\n// successful.\nContentMatch.prototype.matchType = function matchType (type) {\n for (var i = 0; i < this.next.length; i += 2)\n { if (this.next[i] == type) { return this.next[i + 1] } }\n return null\n};\n\n// :: (Fragment, ?number, ?number) → ?ContentMatch\n// Try to match a fragment. Returns the resulting match when\n// successful.\nContentMatch.prototype.matchFragment = function matchFragment (frag, start, end) {\n if ( start === void 0 ) start = 0;\n if ( end === void 0 ) end = frag.childCount;\n\n var cur = this;\n for (var i = start; cur && i < end; i++)\n { cur = cur.matchType(frag.child(i).type); }\n return cur\n};\n\nprototypeAccessors$4.inlineContent.get = function () {\n var first = this.next[0];\n return first ? first.isInline : false\n};\n\n// :: ?NodeType\n// Get the first matching node type at this match position that can\n// be generated.\nprototypeAccessors$4.defaultType.get = function () {\n for (var i = 0; i < this.next.length; i += 2) {\n var type = this.next[i];\n if (!(type.isText || type.hasRequiredAttrs())) { return type }\n }\n};\n\nContentMatch.prototype.compatible = function compatible (other) {\n for (var i = 0; i < this.next.length; i += 2)\n { for (var j = 0; j < other.next.length; j += 2)\n { if (this.next[i] == other.next[j]) { return true } } }\n return false\n};\n\n// :: (Fragment, bool, ?number) → ?Fragment\n// Try to match the given fragment, and if that fails, see if it can\n// be made to match by inserting nodes in front of it. When\n// successful, return a fragment of inserted nodes (which may be\n// empty if nothing had to be inserted). When `toEnd` is true, only\n// return a fragment if the resulting match goes to the end of the\n// content expression.\nContentMatch.prototype.fillBefore = function fillBefore (after, toEnd, startIndex) {\n if ( toEnd === void 0 ) toEnd = false;\n if ( startIndex === void 0 ) startIndex = 0;\n\n var seen = [this];\n function search(match, types) {\n var finished = match.matchFragment(after, startIndex);\n if (finished && (!toEnd || finished.validEnd))\n { return Fragment.from(types.map(function (tp) { return tp.createAndFill(); })) }\n\n for (var i = 0; i < match.next.length; i += 2) {\n var type = match.next[i], next = match.next[i + 1];\n if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) {\n seen.push(next);\n var found = search(next, types.concat(type));\n if (found) { return found }\n }\n }\n }\n\n return search(this, [])\n};\n\n// :: (NodeType) → ?[NodeType]\n// Find a set of wrapping node types that would allow a node of the\n// given type to appear at this position. The result may be empty\n// (when it fits directly) and will be null when no such wrapping\n// exists.\nContentMatch.prototype.findWrapping = function findWrapping (target) {\n for (var i = 0; i < this.wrapCache.length; i += 2)\n { if (this.wrapCache[i] == target) { return this.wrapCache[i + 1] } }\n var computed = this.computeWrapping(target);\n this.wrapCache.push(target, computed);\n return computed\n};\n\nContentMatch.prototype.computeWrapping = function computeWrapping (target) {\n var seen = Object.create(null), active = [{match: this, type: null, via: null}];\n while (active.length) {\n var current = active.shift(), match = current.match;\n if (match.matchType(target)) {\n var result = [];\n for (var obj = current; obj.type; obj = obj.via)\n { result.push(obj.type); }\n return result.reverse()\n }\n for (var i = 0; i < match.next.length; i += 2) {\n var type = match.next[i];\n if (!type.isLeaf && !type.hasRequiredAttrs() && !(type.name in seen) && (!current.type || match.next[i + 1].validEnd)) {\n active.push({match: type.contentMatch, type: type, via: current});\n seen[type.name] = true;\n }\n }\n }\n};\n\n// :: number\n// The number of outgoing edges this node has in the finite\n// automaton that describes the content expression.\nprototypeAccessors$4.edgeCount.get = function () {\n return this.next.length >> 1\n};\n\n// :: (number) → {type: NodeType, next: ContentMatch}\n// Get the _n_​th outgoing edge from this node in the finite\n// automaton that describes the content expression.\nContentMatch.prototype.edge = function edge (n) {\n var i = n << 1;\n if (i >= this.next.length) { throw new RangeError((\"There's no \" + n + \"th edge in this content match\")) }\n return {type: this.next[i], next: this.next[i + 1]}\n};\n\nContentMatch.prototype.toString = function toString () {\n var seen = [];\n function scan(m) {\n seen.push(m);\n for (var i = 1; i < m.next.length; i += 2)\n { if (seen.indexOf(m.next[i]) == -1) { scan(m.next[i]); } }\n }\n scan(this);\n return seen.map(function (m, i) {\n var out = i + (m.validEnd ? \"*\" : \" \") + \" \";\n for (var i$1 = 0; i$1 < m.next.length; i$1 += 2)\n { out += (i$1 ? \", \" : \"\") + m.next[i$1].name + \"->\" + seen.indexOf(m.next[i$1 + 1]); }\n return out\n }).join(\"\\n\")\n};\n\nObject.defineProperties( ContentMatch.prototype, prototypeAccessors$4 );\n\nContentMatch.empty = new ContentMatch(true);\n\nvar TokenStream = function TokenStream(string, nodeTypes) {\n this.string = string;\n this.nodeTypes = nodeTypes;\n this.inline = null;\n this.pos = 0;\n this.tokens = string.split(/\\s*(?=\\b|\\W|$)/);\n if (this.tokens[this.tokens.length - 1] == \"\") { this.tokens.pop(); }\n if (this.tokens[0] == \"\") { this.tokens.shift(); }\n};\n\nvar prototypeAccessors$1$2 = { next: { configurable: true } };\n\nprototypeAccessors$1$2.next.get = function () { return this.tokens[this.pos] };\n\nTokenStream.prototype.eat = function eat (tok) { return this.next == tok && (this.pos++ || true) };\n\nTokenStream.prototype.err = function err (str) { throw new SyntaxError(str + \" (in content expression '\" + this.string + \"')\") };\n\nObject.defineProperties( TokenStream.prototype, prototypeAccessors$1$2 );\n\nfunction parseExpr(stream) {\n var exprs = [];\n do { exprs.push(parseExprSeq(stream)); }\n while (stream.eat(\"|\"))\n return exprs.length == 1 ? exprs[0] : {type: \"choice\", exprs: exprs}\n}\n\nfunction parseExprSeq(stream) {\n var exprs = [];\n do { exprs.push(parseExprSubscript(stream)); }\n while (stream.next && stream.next != \")\" && stream.next != \"|\")\n return exprs.length == 1 ? exprs[0] : {type: \"seq\", exprs: exprs}\n}\n\nfunction parseExprSubscript(stream) {\n var expr = parseExprAtom(stream);\n for (;;) {\n if (stream.eat(\"+\"))\n { expr = {type: \"plus\", expr: expr}; }\n else if (stream.eat(\"*\"))\n { expr = {type: \"star\", expr: expr}; }\n else if (stream.eat(\"?\"))\n { expr = {type: \"opt\", expr: expr}; }\n else if (stream.eat(\"{\"))\n { expr = parseExprRange(stream, expr); }\n else { break }\n }\n return expr\n}\n\nfunction parseNum(stream) {\n if (/\\D/.test(stream.next)) { stream.err(\"Expected number, got '\" + stream.next + \"'\"); }\n var result = Number(stream.next);\n stream.pos++;\n return result\n}\n\nfunction parseExprRange(stream, expr) {\n var min = parseNum(stream), max = min;\n if (stream.eat(\",\")) {\n if (stream.next != \"}\") { max = parseNum(stream); }\n else { max = -1; }\n }\n if (!stream.eat(\"}\")) { stream.err(\"Unclosed braced range\"); }\n return {type: \"range\", min: min, max: max, expr: expr}\n}\n\nfunction resolveName(stream, name) {\n var types = stream.nodeTypes, type = types[name];\n if (type) { return [type] }\n var result = [];\n for (var typeName in types) {\n var type$1 = types[typeName];\n if (type$1.groups.indexOf(name) > -1) { result.push(type$1); }\n }\n if (result.length == 0) { stream.err(\"No node type or group '\" + name + \"' found\"); }\n return result\n}\n\nfunction parseExprAtom(stream) {\n if (stream.eat(\"(\")) {\n var expr = parseExpr(stream);\n if (!stream.eat(\")\")) { stream.err(\"Missing closing paren\"); }\n return expr\n } else if (!/\\W/.test(stream.next)) {\n var exprs = resolveName(stream, stream.next).map(function (type) {\n if (stream.inline == null) { stream.inline = type.isInline; }\n else if (stream.inline != type.isInline) { stream.err(\"Mixing inline and block content\"); }\n return {type: \"name\", value: type}\n });\n stream.pos++;\n return exprs.length == 1 ? exprs[0] : {type: \"choice\", exprs: exprs}\n } else {\n stream.err(\"Unexpected token '\" + stream.next + \"'\");\n }\n}\n\n// The code below helps compile a regular-expression-like language\n// into a deterministic finite automaton. For a good introduction to\n// these concepts, see https://swtch.com/~rsc/regexp/regexp1.html\n\n// : (Object) → [[{term: ?any, to: number}]]\n// Construct an NFA from an expression as returned by the parser. The\n// NFA is represented as an array of states, which are themselves\n// arrays of edges, which are `{term, to}` objects. The first state is\n// the entry state and the last node is the success state.\n//\n// Note that unlike typical NFAs, the edge ordering in this one is\n// significant, in that it is used to contruct filler content when\n// necessary.\nfunction nfa(expr) {\n var nfa = [[]];\n connect(compile(expr, 0), node());\n return nfa\n\n function node() { return nfa.push([]) - 1 }\n function edge(from, to, term) {\n var edge = {term: term, to: to};\n nfa[from].push(edge);\n return edge\n }\n function connect(edges, to) { edges.forEach(function (edge) { return edge.to = to; }); }\n\n function compile(expr, from) {\n if (expr.type == \"choice\") {\n return expr.exprs.reduce(function (out, expr) { return out.concat(compile(expr, from)); }, [])\n } else if (expr.type == \"seq\") {\n for (var i = 0;; i++) {\n var next = compile(expr.exprs[i], from);\n if (i == expr.exprs.length - 1) { return next }\n connect(next, from = node());\n }\n } else if (expr.type == \"star\") {\n var loop = node();\n edge(from, loop);\n connect(compile(expr.expr, loop), loop);\n return [edge(loop)]\n } else if (expr.type == \"plus\") {\n var loop$1 = node();\n connect(compile(expr.expr, from), loop$1);\n connect(compile(expr.expr, loop$1), loop$1);\n return [edge(loop$1)]\n } else if (expr.type == \"opt\") {\n return [edge(from)].concat(compile(expr.expr, from))\n } else if (expr.type == \"range\") {\n var cur = from;\n for (var i$1 = 0; i$1 < expr.min; i$1++) {\n var next$1 = node();\n connect(compile(expr.expr, cur), next$1);\n cur = next$1;\n }\n if (expr.max == -1) {\n connect(compile(expr.expr, cur), cur);\n } else {\n for (var i$2 = expr.min; i$2 < expr.max; i$2++) {\n var next$2 = node();\n edge(cur, next$2);\n connect(compile(expr.expr, cur), next$2);\n cur = next$2;\n }\n }\n return [edge(cur)]\n } else if (expr.type == \"name\") {\n return [edge(from, null, expr.value)]\n }\n }\n}\n\nfunction cmp(a, b) { return b - a }\n\n// Get the set of nodes reachable by null edges from `node`. Omit\n// nodes with only a single null-out-edge, since they may lead to\n// needless duplicated nodes.\nfunction nullFrom(nfa, node) {\n var result = [];\n scan(node);\n return result.sort(cmp)\n\n function scan(node) {\n var edges = nfa[node];\n if (edges.length == 1 && !edges[0].term) { return scan(edges[0].to) }\n result.push(node);\n for (var i = 0; i < edges.length; i++) {\n var ref = edges[i];\n var term = ref.term;\n var to = ref.to;\n if (!term && result.indexOf(to) == -1) { scan(to); }\n }\n }\n}\n\n// : ([[{term: ?any, to: number}]]) → ContentMatch\n// Compiles an NFA as produced by `nfa` into a DFA, modeled as a set\n// of state objects (`ContentMatch` instances) with transitions\n// between them.\nfunction dfa(nfa) {\n var labeled = Object.create(null);\n return explore(nullFrom(nfa, 0))\n\n function explore(states) {\n var out = [];\n states.forEach(function (node) {\n nfa[node].forEach(function (ref) {\n var term = ref.term;\n var to = ref.to;\n\n if (!term) { return }\n var known = out.indexOf(term), set = known > -1 && out[known + 1];\n nullFrom(nfa, to).forEach(function (node) {\n if (!set) { out.push(term, set = []); }\n if (set.indexOf(node) == -1) { set.push(node); }\n });\n });\n });\n var state = labeled[states.join(\",\")] = new ContentMatch(states.indexOf(nfa.length - 1) > -1);\n for (var i = 0; i < out.length; i += 2) {\n var states$1 = out[i + 1].sort(cmp);\n state.next.push(out[i], labeled[states$1.join(\",\")] || explore(states$1));\n }\n return state\n }\n}\n\nfunction checkForDeadEnds(match, stream) {\n for (var i = 0, work = [match]; i < work.length; i++) {\n var state = work[i], dead = !state.validEnd, nodes = [];\n for (var j = 0; j < state.next.length; j += 2) {\n var node = state.next[j], next = state.next[j + 1];\n nodes.push(node.name);\n if (dead && !(node.isText || node.hasRequiredAttrs())) { dead = false; }\n if (work.indexOf(next) == -1) { work.push(next); }\n }\n if (dead) { stream.err(\"Only non-generatable nodes (\" + nodes.join(\", \") + \") in a required position (see https://prosemirror.net/docs/guide/#generatable)\"); }\n }\n}\n\n// For node types where all attrs have a default value (or which don't\n// have any attributes), build up a single reusable default attribute\n// object, and use it for all nodes that don't specify specific\n// attributes.\nfunction defaultAttrs(attrs) {\n var defaults = Object.create(null);\n for (var attrName in attrs) {\n var attr = attrs[attrName];\n if (!attr.hasDefault) { return null }\n defaults[attrName] = attr.default;\n }\n return defaults\n}\n\nfunction computeAttrs(attrs, value) {\n var built = Object.create(null);\n for (var name in attrs) {\n var given = value && value[name];\n if (given === undefined) {\n var attr = attrs[name];\n if (attr.hasDefault) { given = attr.default; }\n else { throw new RangeError(\"No value supplied for attribute \" + name) }\n }\n built[name] = given;\n }\n return built\n}\n\nfunction initAttrs(attrs) {\n var result = Object.create(null);\n if (attrs) { for (var name in attrs) { result[name] = new Attribute(attrs[name]); } }\n return result\n}\n\n// ::- Node types are objects allocated once per `Schema` and used to\n// [tag](#model.Node.type) `Node` instances. They contain information\n// about the node type, such as its name and what kind of node it\n// represents.\nvar NodeType = function NodeType(name, schema, spec) {\n // :: string\n // The name the node type has in this schema.\n this.name = name;\n\n // :: Schema\n // A link back to the `Schema` the node type belongs to.\n this.schema = schema;\n\n // :: NodeSpec\n // The spec that this type is based on\n this.spec = spec;\n\n this.groups = spec.group ? spec.group.split(\" \") : [];\n this.attrs = initAttrs(spec.attrs);\n\n this.defaultAttrs = defaultAttrs(this.attrs);\n\n // :: ContentMatch\n // The starting match of the node type's content expression.\n this.contentMatch = null;\n\n // : ?[MarkType]\n // The set of marks allowed in this node. `null` means all marks\n // are allowed.\n this.markSet = null;\n\n // :: bool\n // True if this node type has inline content.\n this.inlineContent = null;\n\n // :: bool\n // True if this is a block type\n this.isBlock = !(spec.inline || name == \"text\");\n\n // :: bool\n // True if this is the text node type.\n this.isText = name == \"text\";\n};\n\nvar prototypeAccessors$5 = { isInline: { configurable: true },isTextblock: { configurable: true },isLeaf: { configurable: true },isAtom: { configurable: true } };\n\n// :: bool\n// True if this is an inline type.\nprototypeAccessors$5.isInline.get = function () { return !this.isBlock };\n\n// :: bool\n// True if this is a textblock type, a block that contains inline\n// content.\nprototypeAccessors$5.isTextblock.get = function () { return this.isBlock && this.inlineContent };\n\n// :: bool\n// True for node types that allow no content.\nprototypeAccessors$5.isLeaf.get = function () { return this.contentMatch == ContentMatch.empty };\n\n// :: bool\n// True when this node is an atom, i.e. when it does not have\n// directly editable content.\nprototypeAccessors$5.isAtom.get = function () { return this.isLeaf || this.spec.atom };\n\n// :: () → bool\n// Tells you whether this node type has any required attributes.\nNodeType.prototype.hasRequiredAttrs = function hasRequiredAttrs () {\n for (var n in this.attrs) { if (this.attrs[n].isRequired) { return true } }\n return false\n};\n\nNodeType.prototype.compatibleContent = function compatibleContent (other) {\n return this == other || this.contentMatch.compatible(other.contentMatch)\n};\n\nNodeType.prototype.computeAttrs = function computeAttrs$1 (attrs) {\n if (!attrs && this.defaultAttrs) { return this.defaultAttrs }\n else { return computeAttrs(this.attrs, attrs) }\n};\n\n// :: (?Object, ?union, ?[Mark]) → Node\n// Create a `Node` of this type. The given attributes are\n// checked and defaulted (you can pass `null` to use the type's\n// defaults entirely, if no required attributes exist). `content`\n// may be a `Fragment`, a node, an array of nodes, or\n// `null`. Similarly `marks` may be `null` to default to the empty\n// set of marks.\nNodeType.prototype.create = function create (attrs, content, marks) {\n if (this.isText) { throw new Error(\"NodeType.create can't construct text nodes\") }\n return new Node(this, this.computeAttrs(attrs), Fragment.from(content), Mark.setFrom(marks))\n};\n\n// :: (?Object, ?union, ?[Mark]) → Node\n// Like [`create`](#model.NodeType.create), but check the given content\n// against the node type's content restrictions, and throw an error\n// if it doesn't match.\nNodeType.prototype.createChecked = function createChecked (attrs, content, marks) {\n content = Fragment.from(content);\n if (!this.validContent(content))\n { throw new RangeError(\"Invalid content for node \" + this.name) }\n return new Node(this, this.computeAttrs(attrs), content, Mark.setFrom(marks))\n};\n\n// :: (?Object, ?union, ?[Mark]) → ?Node\n// Like [`create`](#model.NodeType.create), but see if it is necessary to\n// add nodes to the start or end of the given fragment to make it\n// fit the node. If no fitting wrapping can be found, return null.\n// Note that, due to the fact that required nodes can always be\n// created, this will always succeed if you pass null or\n// `Fragment.empty` as content.\nNodeType.prototype.createAndFill = function createAndFill (attrs, content, marks) {\n attrs = this.computeAttrs(attrs);\n content = Fragment.from(content);\n if (content.size) {\n var before = this.contentMatch.fillBefore(content);\n if (!before) { return null }\n content = before.append(content);\n }\n var after = this.contentMatch.matchFragment(content).fillBefore(Fragment.empty, true);\n if (!after) { return null }\n return new Node(this, attrs, content.append(after), Mark.setFrom(marks))\n};\n\n// :: (Fragment) → bool\n// Returns true if the given fragment is valid content for this node\n// type with the given attributes.\nNodeType.prototype.validContent = function validContent (content) {\n var result = this.contentMatch.matchFragment(content);\n if (!result || !result.validEnd) { return false }\n for (var i = 0; i < content.childCount; i++)\n { if (!this.allowsMarks(content.child(i).marks)) { return false } }\n return true\n};\n\n// :: (MarkType) → bool\n// Check whether the given mark type is allowed in this node.\nNodeType.prototype.allowsMarkType = function allowsMarkType (markType) {\n return this.markSet == null || this.markSet.indexOf(markType) > -1\n};\n\n// :: ([Mark]) → bool\n// Test whether the given set of marks are allowed in this node.\nNodeType.prototype.allowsMarks = function allowsMarks (marks) {\n if (this.markSet == null) { return true }\n for (var i = 0; i < marks.length; i++) { if (!this.allowsMarkType(marks[i].type)) { return false } }\n return true\n};\n\n// :: ([Mark]) → [Mark]\n// Removes the marks that are not allowed in this node from the given set.\nNodeType.prototype.allowedMarks = function allowedMarks (marks) {\n if (this.markSet == null) { return marks }\n var copy;\n for (var i = 0; i < marks.length; i++) {\n if (!this.allowsMarkType(marks[i].type)) {\n if (!copy) { copy = marks.slice(0, i); }\n } else if (copy) {\n copy.push(marks[i]);\n }\n }\n return !copy ? marks : copy.length ? copy : Mark.empty\n};\n\nNodeType.compile = function compile (nodes, schema) {\n var result = Object.create(null);\n nodes.forEach(function (name, spec) { return result[name] = new NodeType(name, schema, spec); });\n\n var topType = schema.spec.topNode || \"doc\";\n if (!result[topType]) { throw new RangeError(\"Schema is missing its top node type ('\" + topType + \"')\") }\n if (!result.text) { throw new RangeError(\"Every schema needs a 'text' type\") }\n for (var _ in result.text.attrs) { throw new RangeError(\"The text node type should not have attributes\") }\n\n return result\n};\n\nObject.defineProperties( NodeType.prototype, prototypeAccessors$5 );\n\n// Attribute descriptors\n\nvar Attribute = function Attribute(options) {\n this.hasDefault = Object.prototype.hasOwnProperty.call(options, \"default\");\n this.default = options.default;\n};\n\nvar prototypeAccessors$1$3 = { isRequired: { configurable: true } };\n\nprototypeAccessors$1$3.isRequired.get = function () {\n return !this.hasDefault\n};\n\nObject.defineProperties( Attribute.prototype, prototypeAccessors$1$3 );\n\n// Marks\n\n// ::- Like nodes, marks (which are associated with nodes to signify\n// things like emphasis or being part of a link) are\n// [tagged](#model.Mark.type) with type objects, which are\n// instantiated once per `Schema`.\nvar MarkType = function MarkType(name, rank, schema, spec) {\n // :: string\n // The name of the mark type.\n this.name = name;\n\n // :: Schema\n // The schema that this mark type instance is part of.\n this.schema = schema;\n\n // :: MarkSpec\n // The spec on which the type is based.\n this.spec = spec;\n\n this.attrs = initAttrs(spec.attrs);\n\n this.rank = rank;\n this.excluded = null;\n var defaults = defaultAttrs(this.attrs);\n this.instance = defaults && new Mark(this, defaults);\n};\n\n// :: (?Object) → Mark\n// Create a mark of this type. `attrs` may be `null` or an object\n// containing only some of the mark's attributes. The others, if\n// they have defaults, will be added.\nMarkType.prototype.create = function create (attrs) {\n if (!attrs && this.instance) { return this.instance }\n return new Mark(this, computeAttrs(this.attrs, attrs))\n};\n\nMarkType.compile = function compile (marks, schema) {\n var result = Object.create(null), rank = 0;\n marks.forEach(function (name, spec) { return result[name] = new MarkType(name, rank++, schema, spec); });\n return result\n};\n\n// :: ([Mark]) → [Mark]\n// When there is a mark of this type in the given set, a new set\n// without it is returned. Otherwise, the input set is returned.\nMarkType.prototype.removeFromSet = function removeFromSet (set) {\n for (var i = 0; i < set.length; i++) { if (set[i].type == this) {\n set = set.slice(0, i).concat(set.slice(i + 1));\n i--;\n } }\n return set\n};\n\n// :: ([Mark]) → ?Mark\n// Tests whether there is a mark of this type in the given set.\nMarkType.prototype.isInSet = function isInSet (set) {\n for (var i = 0; i < set.length; i++)\n { if (set[i].type == this) { return set[i] } }\n};\n\n// :: (MarkType) → bool\n// Queries whether a given mark type is\n// [excluded](#model.MarkSpec.excludes) by this one.\nMarkType.prototype.excludes = function excludes (other) {\n return this.excluded.indexOf(other) > -1\n};\n\n// SchemaSpec:: interface\n// An object describing a schema, as passed to the [`Schema`](#model.Schema)\n// constructor.\n//\n// nodes:: union, OrderedMap>\n// The node types in this schema. Maps names to\n// [`NodeSpec`](#model.NodeSpec) objects that describe the node type\n// associated with that name. Their order is significant—it\n// determines which [parse rules](#model.NodeSpec.parseDOM) take\n// precedence by default, and which nodes come first in a given\n// [group](#model.NodeSpec.group).\n//\n// marks:: ?union, OrderedMap>\n// The mark types that exist in this schema. The order in which they\n// are provided determines the order in which [mark\n// sets](#model.Mark.addToSet) are sorted and in which [parse\n// rules](#model.MarkSpec.parseDOM) are tried.\n//\n// topNode:: ?string\n// The name of the default top-level node for the schema. Defaults\n// to `\"doc\"`.\n\n// NodeSpec:: interface\n//\n// content:: ?string\n// The content expression for this node, as described in the [schema\n// guide](/docs/guide/#schema.content_expressions). When not given,\n// the node does not allow any content.\n//\n// marks:: ?string\n// The marks that are allowed inside of this node. May be a\n// space-separated string referring to mark names or groups, `\"_\"`\n// to explicitly allow all marks, or `\"\"` to disallow marks. When\n// not given, nodes with inline content default to allowing all\n// marks, other nodes default to not allowing marks.\n//\n// group:: ?string\n// The group or space-separated groups to which this node belongs,\n// which can be referred to in the content expressions for the\n// schema.\n//\n// inline:: ?bool\n// Should be set to true for inline nodes. (Implied for text nodes.)\n//\n// atom:: ?bool\n// Can be set to true to indicate that, though this isn't a [leaf\n// node](#model.NodeType.isLeaf), it doesn't have directly editable\n// content and should be treated as a single unit in the view.\n//\n// attrs:: ?Object\n// The attributes that nodes of this type get.\n//\n// selectable:: ?bool\n// Controls whether nodes of this type can be selected as a [node\n// selection](#state.NodeSelection). Defaults to true for non-text\n// nodes.\n//\n// draggable:: ?bool\n// Determines whether nodes of this type can be dragged without\n// being selected. Defaults to false.\n//\n// code:: ?bool\n// Can be used to indicate that this node contains code, which\n// causes some commands to behave differently.\n//\n// defining:: ?bool\n// Determines whether this node is considered an important parent\n// node during replace operations (such as paste). Non-defining (the\n// default) nodes get dropped when their entire content is replaced,\n// whereas defining nodes persist and wrap the inserted content.\n// Likewise, in _inserted_ content the defining parents of the\n// content are preserved when possible. Typically,\n// non-default-paragraph textblock types, and possibly list items,\n// are marked as defining.\n//\n// isolating:: ?bool\n// When enabled (default is false), the sides of nodes of this type\n// count as boundaries that regular editing operations, like\n// backspacing or lifting, won't cross. An example of a node that\n// should probably have this enabled is a table cell.\n//\n// toDOM:: ?(node: Node) → DOMOutputSpec\n// Defines the default way a node of this type should be serialized\n// to DOM/HTML (as used by\n// [`DOMSerializer.fromSchema`](#model.DOMSerializer^fromSchema)).\n// Should return a DOM node or an [array\n// structure](#model.DOMOutputSpec) that describes one, with an\n// optional number zero (“hole”) in it to indicate where the node's\n// content should be inserted.\n//\n// For text nodes, the default is to create a text DOM node. Though\n// it is possible to create a serializer where text is rendered\n// differently, this is not supported inside the editor, so you\n// shouldn't override that in your text node spec.\n//\n// parseDOM:: ?[ParseRule]\n// Associates DOM parser information with this node, which can be\n// used by [`DOMParser.fromSchema`](#model.DOMParser^fromSchema) to\n// automatically derive a parser. The `node` field in the rules is\n// implied (the name of this node will be filled in automatically).\n// If you supply your own parser, you do not need to also specify\n// parsing rules in your schema.\n//\n// toDebugString:: ?(node: Node) -> string\n// Defines the default way a node of this type should be serialized\n// to a string representation for debugging (e.g. in error messages).\n\n// MarkSpec:: interface\n//\n// attrs:: ?Object\n// The attributes that marks of this type get.\n//\n// inclusive:: ?bool\n// Whether this mark should be active when the cursor is positioned\n// at its end (or at its start when that is also the start of the\n// parent node). Defaults to true.\n//\n// excludes:: ?string\n// Determines which other marks this mark can coexist with. Should\n// be a space-separated strings naming other marks or groups of marks.\n// When a mark is [added](#model.Mark.addToSet) to a set, all marks\n// that it excludes are removed in the process. If the set contains\n// any mark that excludes the new mark but is not, itself, excluded\n// by the new mark, the mark can not be added an the set. You can\n// use the value `\"_\"` to indicate that the mark excludes all\n// marks in the schema.\n//\n// Defaults to only being exclusive with marks of the same type. You\n// can set it to an empty string (or any string not containing the\n// mark's own name) to allow multiple marks of a given type to\n// coexist (as long as they have different attributes).\n//\n// group:: ?string\n// The group or space-separated groups to which this mark belongs.\n//\n// spanning:: ?bool\n// Determines whether marks of this type can span multiple adjacent\n// nodes when serialized to DOM/HTML. Defaults to true.\n//\n// toDOM:: ?(mark: Mark, inline: bool) → DOMOutputSpec\n// Defines the default way marks of this type should be serialized\n// to DOM/HTML. When the resulting spec contains a hole, that is\n// where the marked content is placed. Otherwise, it is appended to\n// the top node.\n//\n// parseDOM:: ?[ParseRule]\n// Associates DOM parser information with this mark (see the\n// corresponding [node spec field](#model.NodeSpec.parseDOM)). The\n// `mark` field in the rules is implied.\n\n// AttributeSpec:: interface\n//\n// Used to [define](#model.NodeSpec.attrs) attributes on nodes or\n// marks.\n//\n// default:: ?any\n// The default value for this attribute, to use when no explicit\n// value is provided. Attributes that have no default must be\n// provided whenever a node or mark of a type that has them is\n// created.\n\n// ::- A document schema. Holds [node](#model.NodeType) and [mark\n// type](#model.MarkType) objects for the nodes and marks that may\n// occur in conforming documents, and provides functionality for\n// creating and deserializing such documents.\nvar Schema = function Schema(spec) {\n // :: SchemaSpec\n // The [spec](#model.SchemaSpec) on which the schema is based,\n // with the added guarantee that its `nodes` and `marks`\n // properties are\n // [`OrderedMap`](https://github.com/marijnh/orderedmap) instances\n // (not raw objects).\n this.spec = {};\n for (var prop in spec) { this.spec[prop] = spec[prop]; }\n this.spec.nodes = OrderedMap.from(spec.nodes);\n this.spec.marks = OrderedMap.from(spec.marks);\n\n // :: Object\n // An object mapping the schema's node names to node type objects.\n this.nodes = NodeType.compile(this.spec.nodes, this);\n\n // :: Object\n // A map from mark names to mark type objects.\n this.marks = MarkType.compile(this.spec.marks, this);\n\n var contentExprCache = Object.create(null);\n for (var prop$1 in this.nodes) {\n if (prop$1 in this.marks)\n { throw new RangeError(prop$1 + \" can not be both a node and a mark\") }\n var type = this.nodes[prop$1], contentExpr = type.spec.content || \"\", markExpr = type.spec.marks;\n type.contentMatch = contentExprCache[contentExpr] ||\n (contentExprCache[contentExpr] = ContentMatch.parse(contentExpr, this.nodes));\n type.inlineContent = type.contentMatch.inlineContent;\n type.markSet = markExpr == \"_\" ? null :\n markExpr ? gatherMarks(this, markExpr.split(\" \")) :\n markExpr == \"\" || !type.inlineContent ? [] : null;\n }\n for (var prop$2 in this.marks) {\n var type$1 = this.marks[prop$2], excl = type$1.spec.excludes;\n type$1.excluded = excl == null ? [type$1] : excl == \"\" ? [] : gatherMarks(this, excl.split(\" \"));\n }\n\n this.nodeFromJSON = this.nodeFromJSON.bind(this);\n this.markFromJSON = this.markFromJSON.bind(this);\n\n // :: NodeType\n // The type of the [default top node](#model.SchemaSpec.topNode)\n // for this schema.\n this.topNodeType = this.nodes[this.spec.topNode || \"doc\"];\n\n // :: Object\n // An object for storing whatever values modules may want to\n // compute and cache per schema. (If you want to store something\n // in it, try to use property names unlikely to clash.)\n this.cached = Object.create(null);\n this.cached.wrappings = Object.create(null);\n};\n\n// :: (union, ?Object, ?union, ?[Mark]) → Node\n// Create a node in this schema. The `type` may be a string or a\n// `NodeType` instance. Attributes will be extended\n// with defaults, `content` may be a `Fragment`,\n// `null`, a `Node`, or an array of nodes.\nSchema.prototype.node = function node (type, attrs, content, marks) {\n if (typeof type == \"string\")\n { type = this.nodeType(type); }\n else if (!(type instanceof NodeType))\n { throw new RangeError(\"Invalid node type: \" + type) }\n else if (type.schema != this)\n { throw new RangeError(\"Node type from different schema used (\" + type.name + \")\") }\n\n return type.createChecked(attrs, content, marks)\n};\n\n// :: (string, ?[Mark]) → Node\n// Create a text node in the schema. Empty text nodes are not\n// allowed.\nSchema.prototype.text = function text (text$1, marks) {\n var type = this.nodes.text;\n return new TextNode(type, type.defaultAttrs, text$1, Mark.setFrom(marks))\n};\n\n// :: (union, ?Object) → Mark\n// Create a mark with the given type and attributes.\nSchema.prototype.mark = function mark (type, attrs) {\n if (typeof type == \"string\") { type = this.marks[type]; }\n return type.create(attrs)\n};\n\n// :: (Object) → Node\n// Deserialize a node from its JSON representation. This method is\n// bound.\nSchema.prototype.nodeFromJSON = function nodeFromJSON (json) {\n return Node.fromJSON(this, json)\n};\n\n// :: (Object) → Mark\n// Deserialize a mark from its JSON representation. This method is\n// bound.\nSchema.prototype.markFromJSON = function markFromJSON (json) {\n return Mark.fromJSON(this, json)\n};\n\nSchema.prototype.nodeType = function nodeType (name) {\n var found = this.nodes[name];\n if (!found) { throw new RangeError(\"Unknown node type: \" + name) }\n return found\n};\n\nfunction gatherMarks(schema, marks) {\n var found = [];\n for (var i = 0; i < marks.length; i++) {\n var name = marks[i], mark = schema.marks[name], ok = mark;\n if (mark) {\n found.push(mark);\n } else {\n for (var prop in schema.marks) {\n var mark$1 = schema.marks[prop];\n if (name == \"_\" || (mark$1.spec.group && mark$1.spec.group.split(\" \").indexOf(name) > -1))\n { found.push(ok = mark$1); }\n }\n }\n if (!ok) { throw new SyntaxError(\"Unknown mark type: '\" + marks[i] + \"'\") }\n }\n return found\n}\n\n// ParseOptions:: interface\n// These are the options recognized by the\n// [`parse`](#model.DOMParser.parse) and\n// [`parseSlice`](#model.DOMParser.parseSlice) methods.\n//\n// preserveWhitespace:: ?union\n// By default, whitespace is collapsed as per HTML's rules. Pass\n// `true` to preserve whitespace, but normalize newlines to\n// spaces, and `\"full\"` to preserve whitespace entirely.\n//\n// findPositions:: ?[{node: dom.Node, offset: number}]\n// When given, the parser will, beside parsing the content,\n// record the document positions of the given DOM positions. It\n// will do so by writing to the objects, adding a `pos` property\n// that holds the document position. DOM positions that are not\n// in the parsed content will not be written to.\n//\n// from:: ?number\n// The child node index to start parsing from.\n//\n// to:: ?number\n// The child node index to stop parsing at.\n//\n// topNode:: ?Node\n// By default, the content is parsed into the schema's default\n// [top node type](#model.Schema.topNodeType). You can pass this\n// option to use the type and attributes from a different node\n// as the top container.\n//\n// topMatch:: ?ContentMatch\n// Provide the starting content match that content parsed into the\n// top node is matched against.\n//\n// context:: ?ResolvedPos\n// A set of additional nodes to count as\n// [context](#model.ParseRule.context) when parsing, above the\n// given [top node](#model.ParseOptions.topNode).\n\n// ParseRule:: interface\n// A value that describes how to parse a given DOM node or inline\n// style as a ProseMirror node or mark.\n//\n// tag:: ?string\n// A CSS selector describing the kind of DOM elements to match. A\n// single rule should have _either_ a `tag` or a `style` property.\n//\n// namespace:: ?string\n// The namespace to match. This should be used with `tag`.\n// Nodes are only matched when the namespace matches or this property\n// is null.\n//\n// style:: ?string\n// A CSS property name to match. When given, this rule matches\n// inline styles that list that property. May also have the form\n// `\"property=value\"`, in which case the rule only matches if the\n// property's value exactly matches the given value. (For more\n// complicated filters, use [`getAttrs`](#model.ParseRule.getAttrs)\n// and return false to indicate that the match failed.) Rules\n// matching styles may only produce [marks](#model.ParseRule.mark),\n// not nodes.\n//\n// priority:: ?number\n// Can be used to change the order in which the parse rules in a\n// schema are tried. Those with higher priority come first. Rules\n// without a priority are counted as having priority 50. This\n// property is only meaningful in a schema—when directly\n// constructing a parser, the order of the rule array is used.\n//\n// consuming:: ?boolean\n// By default, when a rule matches an element or style, no further\n// rules get a chance to match it. By setting this to `false`, you\n// indicate that even when this rule matches, other rules that come\n// after it should also run.\n//\n// context:: ?string\n// When given, restricts this rule to only match when the current\n// context—the parent nodes into which the content is being\n// parsed—matches this expression. Should contain one or more node\n// names or node group names followed by single or double slashes.\n// For example `\"paragraph/\"` means the rule only matches when the\n// parent node is a paragraph, `\"blockquote/paragraph/\"` restricts\n// it to be in a paragraph that is inside a blockquote, and\n// `\"section//\"` matches any position inside a section—a double\n// slash matches any sequence of ancestor nodes. To allow multiple\n// different contexts, they can be separated by a pipe (`|`)\n// character, as in `\"blockquote/|list_item/\"`.\n//\n// node:: ?string\n// The name of the node type to create when this rule matches. Only\n// valid for rules with a `tag` property, not for style rules. Each\n// rule should have one of a `node`, `mark`, or `ignore` property\n// (except when it appears in a [node](#model.NodeSpec.parseDOM) or\n// [mark spec](#model.MarkSpec.parseDOM), in which case the `node`\n// or `mark` property will be derived from its position).\n//\n// mark:: ?string\n// The name of the mark type to wrap the matched content in.\n//\n// ignore:: ?bool\n// When true, ignore content that matches this rule.\n//\n// closeParent:: ?bool\n// When true, finding an element that matches this rule will close\n// the current node.\n//\n// skip:: ?bool\n// When true, ignore the node that matches this rule, but do parse\n// its content.\n//\n// attrs:: ?Object\n// Attributes for the node or mark created by this rule. When\n// `getAttrs` is provided, it takes precedence.\n//\n// getAttrs:: ?(union) → ?union\n// A function used to compute the attributes for the node or mark\n// created by this rule. Can also be used to describe further\n// conditions the DOM element or style must match. When it returns\n// `false`, the rule won't match. When it returns null or undefined,\n// that is interpreted as an empty/default set of attributes.\n//\n// Called with a DOM Element for `tag` rules, and with a string (the\n// style's value) for `style` rules.\n//\n// contentElement:: ?union\n// For `tag` rules that produce non-leaf nodes or marks, by default\n// the content of the DOM element is parsed as content of the mark\n// or node. If the child nodes are in a descendent node, this may be\n// a CSS selector string that the parser must use to find the actual\n// content element, or a function that returns the actual content\n// element to the parser.\n//\n// getContent:: ?(dom.Node, schema: Schema) → Fragment\n// Can be used to override the content of a matched node. When\n// present, instead of parsing the node's child nodes, the result of\n// this function is used.\n//\n// preserveWhitespace:: ?union\n// Controls whether whitespace should be preserved when parsing the\n// content inside the matched element. `false` means whitespace may\n// be collapsed, `true` means that whitespace should be preserved\n// but newlines normalized to spaces, and `\"full\"` means that\n// newlines should also be preserved.\n\n// ::- A DOM parser represents a strategy for parsing DOM content into\n// a ProseMirror document conforming to a given schema. Its behavior\n// is defined by an array of [rules](#model.ParseRule).\nvar DOMParser = function DOMParser(schema, rules) {\n var this$1 = this;\n\n // :: Schema\n // The schema into which the parser parses.\n this.schema = schema;\n // :: [ParseRule]\n // The set of [parse rules](#model.ParseRule) that the parser\n // uses, in order of precedence.\n this.rules = rules;\n this.tags = [];\n this.styles = [];\n\n rules.forEach(function (rule) {\n if (rule.tag) { this$1.tags.push(rule); }\n else if (rule.style) { this$1.styles.push(rule); }\n });\n\n // Only normalize list elements when lists in the schema can't directly contain themselves\n this.normalizeLists = !this.tags.some(function (r) {\n if (!/^(ul|ol)\\b/.test(r.tag) || !r.node) { return false }\n var node = schema.nodes[r.node];\n return node.contentMatch.matchType(node)\n });\n};\n\n// :: (dom.Node, ?ParseOptions) → Node\n// Parse a document from the content of a DOM node.\nDOMParser.prototype.parse = function parse (dom, options) {\n if ( options === void 0 ) options = {};\n\n var context = new ParseContext(this, options, false);\n context.addAll(dom, null, options.from, options.to);\n return context.finish()\n};\n\n// :: (dom.Node, ?ParseOptions) → Slice\n// Parses the content of the given DOM node, like\n// [`parse`](#model.DOMParser.parse), and takes the same set of\n// options. But unlike that method, which produces a whole node,\n// this one returns a slice that is open at the sides, meaning that\n// the schema constraints aren't applied to the start of nodes to\n// the left of the input and the end of nodes at the end.\nDOMParser.prototype.parseSlice = function parseSlice (dom, options) {\n if ( options === void 0 ) options = {};\n\n var context = new ParseContext(this, options, true);\n context.addAll(dom, null, options.from, options.to);\n return Slice.maxOpen(context.finish())\n};\n\nDOMParser.prototype.matchTag = function matchTag (dom, context, after) {\n for (var i = after ? this.tags.indexOf(after) + 1 : 0; i < this.tags.length; i++) {\n var rule = this.tags[i];\n if (matches(dom, rule.tag) &&\n (rule.namespace === undefined || dom.namespaceURI == rule.namespace) &&\n (!rule.context || context.matchesContext(rule.context))) {\n if (rule.getAttrs) {\n var result = rule.getAttrs(dom);\n if (result === false) { continue }\n rule.attrs = result;\n }\n return rule\n }\n }\n};\n\nDOMParser.prototype.matchStyle = function matchStyle (prop, value, context, after) {\n for (var i = after ? this.styles.indexOf(after) + 1 : 0; i < this.styles.length; i++) {\n var rule = this.styles[i];\n if (rule.style.indexOf(prop) != 0 ||\n rule.context && !context.matchesContext(rule.context) ||\n // Test that the style string either precisely matches the prop,\n // or has an '=' sign after the prop, followed by the given\n // value.\n rule.style.length > prop.length &&\n (rule.style.charCodeAt(prop.length) != 61 || rule.style.slice(prop.length + 1) != value))\n { continue }\n if (rule.getAttrs) {\n var result = rule.getAttrs(value);\n if (result === false) { continue }\n rule.attrs = result;\n }\n return rule\n }\n};\n\n// : (Schema) → [ParseRule]\nDOMParser.schemaRules = function schemaRules (schema) {\n var result = [];\n function insert(rule) {\n var priority = rule.priority == null ? 50 : rule.priority, i = 0;\n for (; i < result.length; i++) {\n var next = result[i], nextPriority = next.priority == null ? 50 : next.priority;\n if (nextPriority < priority) { break }\n }\n result.splice(i, 0, rule);\n }\n\n var loop = function ( name ) {\n var rules = schema.marks[name].spec.parseDOM;\n if (rules) { rules.forEach(function (rule) {\n insert(rule = copy(rule));\n rule.mark = name;\n }); }\n };\n\n for (var name in schema.marks) loop( name );\n var loop$1 = function ( name ) {\n var rules$1 = schema.nodes[name$1].spec.parseDOM;\n if (rules$1) { rules$1.forEach(function (rule) {\n insert(rule = copy(rule));\n rule.node = name$1;\n }); }\n };\n\n for (var name$1 in schema.nodes) loop$1();\n return result\n};\n\n// :: (Schema) → DOMParser\n// Construct a DOM parser using the parsing rules listed in a\n// schema's [node specs](#model.NodeSpec.parseDOM), reordered by\n// [priority](#model.ParseRule.priority).\nDOMParser.fromSchema = function fromSchema (schema) {\n return schema.cached.domParser ||\n (schema.cached.domParser = new DOMParser(schema, DOMParser.schemaRules(schema)))\n};\n\n// : Object The block-level tags in HTML5\nvar blockTags = {\n address: true, article: true, aside: true, blockquote: true, canvas: true,\n dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true,\n footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true,\n h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true,\n output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true\n};\n\n// : Object The tags that we normally ignore.\nvar ignoreTags = {\n head: true, noscript: true, object: true, script: true, style: true, title: true\n};\n\n// : Object List tags.\nvar listTags = {ol: true, ul: true};\n\n// Using a bitfield for node context options\nvar OPT_PRESERVE_WS = 1, OPT_PRESERVE_WS_FULL = 2, OPT_OPEN_LEFT = 4;\n\nfunction wsOptionsFor(preserveWhitespace) {\n return (preserveWhitespace ? OPT_PRESERVE_WS : 0) | (preserveWhitespace === \"full\" ? OPT_PRESERVE_WS_FULL : 0)\n}\n\nvar NodeContext = function NodeContext(type, attrs, marks, pendingMarks, solid, match, options) {\n this.type = type;\n this.attrs = attrs;\n this.solid = solid;\n this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch);\n this.options = options;\n this.content = [];\n // Marks applied to this node itself\n this.marks = marks;\n // Marks applied to its children\n this.activeMarks = Mark.none;\n // Marks that can't apply here, but will be used in children if possible\n this.pendingMarks = pendingMarks;\n // Nested Marks with same type\n this.stashMarks = [];\n};\n\nNodeContext.prototype.findWrapping = function findWrapping (node) {\n if (!this.match) {\n if (!this.type) { return [] }\n var fill = this.type.contentMatch.fillBefore(Fragment.from(node));\n if (fill) {\n this.match = this.type.contentMatch.matchFragment(fill);\n } else {\n var start = this.type.contentMatch, wrap;\n if (wrap = start.findWrapping(node.type)) {\n this.match = start;\n return wrap\n } else {\n return null\n }\n }\n }\n return this.match.findWrapping(node.type)\n};\n\nNodeContext.prototype.finish = function finish (openEnd) {\n if (!(this.options & OPT_PRESERVE_WS)) { // Strip trailing whitespace\n var last = this.content[this.content.length - 1], m;\n if (last && last.isText && (m = /[ \\t\\r\\n\\u000c]+$/.exec(last.text))) {\n if (last.text.length == m[0].length) { this.content.pop(); }\n else { this.content[this.content.length - 1] = last.withText(last.text.slice(0, last.text.length - m[0].length)); }\n }\n }\n var content = Fragment.from(this.content);\n if (!openEnd && this.match)\n { content = content.append(this.match.fillBefore(Fragment.empty, true)); }\n return this.type ? this.type.create(this.attrs, content, this.marks) : content\n};\n\nNodeContext.prototype.popFromStashMark = function popFromStashMark (mark) {\n for (var i = this.stashMarks.length - 1; i >= 0; i--)\n { if (mark.eq(this.stashMarks[i])) { return this.stashMarks.splice(i, 1)[0] } }\n};\n\nNodeContext.prototype.applyPending = function applyPending (nextType) {\n for (var i = 0, pending = this.pendingMarks; i < pending.length; i++) {\n var mark = pending[i];\n if ((this.type ? this.type.allowsMarkType(mark.type) : markMayApply(mark.type, nextType)) &&\n !mark.isInSet(this.activeMarks)) {\n this.activeMarks = mark.addToSet(this.activeMarks);\n this.pendingMarks = mark.removeFromSet(this.pendingMarks);\n }\n }\n};\n\nvar ParseContext = function ParseContext(parser, options, open) {\n // : DOMParser The parser we are using.\n this.parser = parser;\n // : Object The options passed to this parse.\n this.options = options;\n this.isOpen = open;\n var topNode = options.topNode, topContext;\n var topOptions = wsOptionsFor(options.preserveWhitespace) | (open ? OPT_OPEN_LEFT : 0);\n if (topNode)\n { topContext = new NodeContext(topNode.type, topNode.attrs, Mark.none, Mark.none, true,\n options.topMatch || topNode.type.contentMatch, topOptions); }\n else if (open)\n { topContext = new NodeContext(null, null, Mark.none, Mark.none, true, null, topOptions); }\n else\n { topContext = new NodeContext(parser.schema.topNodeType, null, Mark.none, Mark.none, true, null, topOptions); }\n this.nodes = [topContext];\n // : [Mark] The current set of marks\n this.open = 0;\n this.find = options.findPositions;\n this.needsBlock = false;\n};\n\nvar prototypeAccessors$6 = { top: { configurable: true },currentPos: { configurable: true } };\n\nprototypeAccessors$6.top.get = function () {\n return this.nodes[this.open]\n};\n\n// : (dom.Node)\n// Add a DOM node to the content. Text is inserted as text node,\n// otherwise, the node is passed to `addElement` or, if it has a\n// `style` attribute, `addElementWithStyles`.\nParseContext.prototype.addDOM = function addDOM (dom) {\n if (dom.nodeType == 3) {\n this.addTextNode(dom);\n } else if (dom.nodeType == 1) {\n var style = dom.getAttribute(\"style\");\n var marks = style ? this.readStyles(parseStyles(style)) : null, top = this.top;\n if (marks != null) { for (var i = 0; i < marks.length; i++) { this.addPendingMark(marks[i]); } }\n this.addElement(dom);\n if (marks != null) { for (var i$1 = 0; i$1 < marks.length; i$1++) { this.removePendingMark(marks[i$1], top); } }\n }\n};\n\nParseContext.prototype.addTextNode = function addTextNode (dom) {\n var value = dom.nodeValue;\n var top = this.top;\n if ((top.type ? top.type.inlineContent : top.content.length && top.content[0].isInline) || /[^ \\t\\r\\n\\u000c]/.test(value)) {\n if (!(top.options & OPT_PRESERVE_WS)) {\n value = value.replace(/[ \\t\\r\\n\\u000c]+/g, \" \");\n // If this starts with whitespace, and there is no node before it, or\n // a hard break, or a text node that ends with whitespace, strip the\n // leading space.\n if (/^[ \\t\\r\\n\\u000c]/.test(value) && this.open == this.nodes.length - 1) {\n var nodeBefore = top.content[top.content.length - 1];\n var domNodeBefore = dom.previousSibling;\n if (!nodeBefore ||\n (domNodeBefore && domNodeBefore.nodeName == 'BR') ||\n (nodeBefore.isText && /[ \\t\\r\\n\\u000c]$/.test(nodeBefore.text)))\n { value = value.slice(1); }\n }\n } else if (!(top.options & OPT_PRESERVE_WS_FULL)) {\n value = value.replace(/\\r?\\n|\\r/g, \" \");\n }\n if (value) { this.insertNode(this.parser.schema.text(value)); }\n this.findInText(dom);\n } else {\n this.findInside(dom);\n }\n};\n\n// : (dom.Element, ?ParseRule)\n// Try to find a handler for the given tag and use that to parse. If\n// none is found, the element's content nodes are added directly.\nParseContext.prototype.addElement = function addElement (dom, matchAfter) {\n var name = dom.nodeName.toLowerCase(), ruleID;\n if (listTags.hasOwnProperty(name) && this.parser.normalizeLists) { normalizeList(dom); }\n var rule = (this.options.ruleFromNode && this.options.ruleFromNode(dom)) ||\n (ruleID = this.parser.matchTag(dom, this, matchAfter));\n if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) {\n this.findInside(dom);\n } else if (!rule || rule.skip || rule.closeParent) {\n if (rule && rule.closeParent) { this.open = Math.max(0, this.open - 1); }\n else if (rule && rule.skip.nodeType) { dom = rule.skip; }\n var sync, top = this.top, oldNeedsBlock = this.needsBlock;\n if (blockTags.hasOwnProperty(name)) {\n sync = true;\n if (!top.type) { this.needsBlock = true; }\n } else if (!dom.firstChild) {\n this.leafFallback(dom);\n return\n }\n this.addAll(dom);\n if (sync) { this.sync(top); }\n this.needsBlock = oldNeedsBlock;\n } else {\n this.addElementByRule(dom, rule, rule.consuming === false ? ruleID : null);\n }\n};\n\n// Called for leaf DOM nodes that would otherwise be ignored\nParseContext.prototype.leafFallback = function leafFallback (dom) {\n if (dom.nodeName == \"BR\" && this.top.type && this.top.type.inlineContent)\n { this.addTextNode(dom.ownerDocument.createTextNode(\"\\n\")); }\n};\n\n// Run any style parser associated with the node's styles. Either\n// return an array of marks, or null to indicate some of the styles\n// had a rule with `ignore` set.\nParseContext.prototype.readStyles = function readStyles (styles) {\n var marks = Mark.none;\n style: for (var i = 0; i < styles.length; i += 2) {\n for (var after = null;;) {\n var rule = this.parser.matchStyle(styles[i], styles[i + 1], this, after);\n if (!rule) { continue style }\n if (rule.ignore) { return null }\n marks = this.parser.schema.marks[rule.mark].create(rule.attrs).addToSet(marks);\n if (rule.consuming === false) { after = rule; }\n else { break }\n }\n }\n return marks\n};\n\n// : (dom.Element, ParseRule) → bool\n// Look up a handler for the given node. If none are found, return\n// false. Otherwise, apply it, use its return value to drive the way\n// the node's content is wrapped, and return true.\nParseContext.prototype.addElementByRule = function addElementByRule (dom, rule, continueAfter) {\n var this$1 = this;\n\n var sync, nodeType, markType, mark;\n if (rule.node) {\n nodeType = this.parser.schema.nodes[rule.node];\n if (!nodeType.isLeaf) {\n sync = this.enter(nodeType, rule.attrs, rule.preserveWhitespace);\n } else if (!this.insertNode(nodeType.create(rule.attrs))) {\n this.leafFallback(dom);\n }\n } else {\n markType = this.parser.schema.marks[rule.mark];\n mark = markType.create(rule.attrs);\n this.addPendingMark(mark);\n }\n var startIn = this.top;\n\n if (nodeType && nodeType.isLeaf) {\n this.findInside(dom);\n } else if (continueAfter) {\n this.addElement(dom, continueAfter);\n } else if (rule.getContent) {\n this.findInside(dom);\n rule.getContent(dom, this.parser.schema).forEach(function (node) { return this$1.insertNode(node); });\n } else {\n var contentDOM = rule.contentElement;\n if (typeof contentDOM == \"string\") { contentDOM = dom.querySelector(contentDOM); }\n else if (typeof contentDOM == \"function\") { contentDOM = contentDOM(dom); }\n if (!contentDOM) { contentDOM = dom; }\n this.findAround(dom, contentDOM, true);\n this.addAll(contentDOM, sync);\n }\n if (sync) { this.sync(startIn); this.open--; }\n if (mark) { this.removePendingMark(mark, startIn); }\n};\n\n// : (dom.Node, ?NodeBuilder, ?number, ?number)\n// Add all child nodes between `startIndex` and `endIndex` (or the\n// whole node, if not given). If `sync` is passed, use it to\n// synchronize after every block element.\nParseContext.prototype.addAll = function addAll (parent, sync, startIndex, endIndex) {\n var index = startIndex || 0;\n for (var dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild,\n end = endIndex == null ? null : parent.childNodes[endIndex];\n dom != end; dom = dom.nextSibling, ++index) {\n this.findAtPoint(parent, index);\n this.addDOM(dom);\n if (sync && blockTags.hasOwnProperty(dom.nodeName.toLowerCase()))\n { this.sync(sync); }\n }\n this.findAtPoint(parent, index);\n};\n\n// Try to find a way to fit the given node type into the current\n// context. May add intermediate wrappers and/or leave non-solid\n// nodes that we're in.\nParseContext.prototype.findPlace = function findPlace (node) {\n var route, sync;\n for (var depth = this.open; depth >= 0; depth--) {\n var cx = this.nodes[depth];\n var found = cx.findWrapping(node);\n if (found && (!route || route.length > found.length)) {\n route = found;\n sync = cx;\n if (!found.length) { break }\n }\n if (cx.solid) { break }\n }\n if (!route) { return false }\n this.sync(sync);\n for (var i = 0; i < route.length; i++)\n { this.enterInner(route[i], null, false); }\n return true\n};\n\n// : (Node) → ?Node\n// Try to insert the given node, adjusting the context when needed.\nParseContext.prototype.insertNode = function insertNode (node) {\n if (node.isInline && this.needsBlock && !this.top.type) {\n var block = this.textblockFromContext();\n if (block) { this.enterInner(block); }\n }\n if (this.findPlace(node)) {\n this.closeExtra();\n var top = this.top;\n top.applyPending(node.type);\n if (top.match) { top.match = top.match.matchType(node.type); }\n var marks = top.activeMarks;\n for (var i = 0; i < node.marks.length; i++)\n { if (!top.type || top.type.allowsMarkType(node.marks[i].type))\n { marks = node.marks[i].addToSet(marks); } }\n top.content.push(node.mark(marks));\n return true\n }\n return false\n};\n\n// : (NodeType, ?Object) → bool\n// Try to start a node of the given type, adjusting the context when\n// necessary.\nParseContext.prototype.enter = function enter (type, attrs, preserveWS) {\n var ok = this.findPlace(type.create(attrs));\n if (ok) { this.enterInner(type, attrs, true, preserveWS); }\n return ok\n};\n\n// Open a node of the given type\nParseContext.prototype.enterInner = function enterInner (type, attrs, solid, preserveWS) {\n this.closeExtra();\n var top = this.top;\n top.applyPending(type);\n top.match = top.match && top.match.matchType(type, attrs);\n var options = preserveWS == null ? top.options & ~OPT_OPEN_LEFT : wsOptionsFor(preserveWS);\n if ((top.options & OPT_OPEN_LEFT) && top.content.length == 0) { options |= OPT_OPEN_LEFT; }\n this.nodes.push(new NodeContext(type, attrs, top.activeMarks, top.pendingMarks, solid, null, options));\n this.open++;\n};\n\n// Make sure all nodes above this.open are finished and added to\n// their parents\nParseContext.prototype.closeExtra = function closeExtra (openEnd) {\n var i = this.nodes.length - 1;\n if (i > this.open) {\n for (; i > this.open; i--) { this.nodes[i - 1].content.push(this.nodes[i].finish(openEnd)); }\n this.nodes.length = this.open + 1;\n }\n};\n\nParseContext.prototype.finish = function finish () {\n this.open = 0;\n this.closeExtra(this.isOpen);\n return this.nodes[0].finish(this.isOpen || this.options.topOpen)\n};\n\nParseContext.prototype.sync = function sync (to) {\n for (var i = this.open; i >= 0; i--) { if (this.nodes[i] == to) {\n this.open = i;\n return\n } }\n};\n\nprototypeAccessors$6.currentPos.get = function () {\n this.closeExtra();\n var pos = 0;\n for (var i = this.open; i >= 0; i--) {\n var content = this.nodes[i].content;\n for (var j = content.length - 1; j >= 0; j--)\n { pos += content[j].nodeSize; }\n if (i) { pos++; }\n }\n return pos\n};\n\nParseContext.prototype.findAtPoint = function findAtPoint (parent, offset) {\n if (this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].node == parent && this.find[i].offset == offset)\n { this.find[i].pos = this.currentPos; }\n } }\n};\n\nParseContext.prototype.findInside = function findInside (parent) {\n if (this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node))\n { this.find[i].pos = this.currentPos; }\n } }\n};\n\nParseContext.prototype.findAround = function findAround (parent, content, before) {\n if (parent != content && this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) {\n var pos = content.compareDocumentPosition(this.find[i].node);\n if (pos & (before ? 2 : 4))\n { this.find[i].pos = this.currentPos; }\n }\n } }\n};\n\nParseContext.prototype.findInText = function findInText (textNode) {\n if (this.find) { for (var i = 0; i < this.find.length; i++) {\n if (this.find[i].node == textNode)\n { this.find[i].pos = this.currentPos - (textNode.nodeValue.length - this.find[i].offset); }\n } }\n};\n\n// : (string) → bool\n// Determines whether the given [context\n// string](#ParseRule.context) matches this context.\nParseContext.prototype.matchesContext = function matchesContext (context) {\n var this$1 = this;\n\n if (context.indexOf(\"|\") > -1)\n { return context.split(/\\s*\\|\\s*/).some(this.matchesContext, this) }\n\n var parts = context.split(\"/\");\n var option = this.options.context;\n var useRoot = !this.isOpen && (!option || option.parent.type == this.nodes[0].type);\n var minDepth = -(option ? option.depth + 1 : 0) + (useRoot ? 0 : 1);\n var match = function (i, depth) {\n for (; i >= 0; i--) {\n var part = parts[i];\n if (part == \"\") {\n if (i == parts.length - 1 || i == 0) { continue }\n for (; depth >= minDepth; depth--)\n { if (match(i - 1, depth)) { return true } }\n return false\n } else {\n var next = depth > 0 || (depth == 0 && useRoot) ? this$1.nodes[depth].type\n : option && depth >= minDepth ? option.node(depth - minDepth).type\n : null;\n if (!next || (next.name != part && next.groups.indexOf(part) == -1))\n { return false }\n depth--;\n }\n }\n return true\n };\n return match(parts.length - 1, this.open)\n};\n\nParseContext.prototype.textblockFromContext = function textblockFromContext () {\n var $context = this.options.context;\n if ($context) { for (var d = $context.depth; d >= 0; d--) {\n var deflt = $context.node(d).contentMatchAt($context.indexAfter(d)).defaultType;\n if (deflt && deflt.isTextblock && deflt.defaultAttrs) { return deflt }\n } }\n for (var name in this.parser.schema.nodes) {\n var type = this.parser.schema.nodes[name];\n if (type.isTextblock && type.defaultAttrs) { return type }\n }\n};\n\nParseContext.prototype.addPendingMark = function addPendingMark (mark) {\n var found = findSameMarkInSet(mark, this.top.pendingMarks);\n if (found) { this.top.stashMarks.push(found); }\n this.top.pendingMarks = mark.addToSet(this.top.pendingMarks);\n};\n\nParseContext.prototype.removePendingMark = function removePendingMark (mark, upto) {\n for (var depth = this.open; depth >= 0; depth--) {\n var level = this.nodes[depth];\n var found = level.pendingMarks.lastIndexOf(mark);\n if (found > -1) {\n level.pendingMarks = mark.removeFromSet(level.pendingMarks);\n } else {\n level.activeMarks = mark.removeFromSet(level.activeMarks);\n var stashMark = level.popFromStashMark(mark);\n if (stashMark && level.type && level.type.allowsMarkType(stashMark.type))\n { level.activeMarks = stashMark.addToSet(level.activeMarks); }\n }\n if (level == upto) { break }\n }\n};\n\nObject.defineProperties( ParseContext.prototype, prototypeAccessors$6 );\n\n// Kludge to work around directly nested list nodes produced by some\n// tools and allowed by browsers to mean that the nested list is\n// actually part of the list item above it.\nfunction normalizeList(dom) {\n for (var child = dom.firstChild, prevItem = null; child; child = child.nextSibling) {\n var name = child.nodeType == 1 ? child.nodeName.toLowerCase() : null;\n if (name && listTags.hasOwnProperty(name) && prevItem) {\n prevItem.appendChild(child);\n child = prevItem;\n } else if (name == \"li\") {\n prevItem = child;\n } else if (name) {\n prevItem = null;\n }\n }\n}\n\n// Apply a CSS selector.\nfunction matches(dom, selector) {\n return (dom.matches || dom.msMatchesSelector || dom.webkitMatchesSelector || dom.mozMatchesSelector).call(dom, selector)\n}\n\n// : (string) → [string]\n// Tokenize a style attribute into property/value pairs.\nfunction parseStyles(style) {\n var re = /\\s*([\\w-]+)\\s*:\\s*([^;]+)/g, m, result = [];\n while (m = re.exec(style)) { result.push(m[1], m[2].trim()); }\n return result\n}\n\nfunction copy(obj) {\n var copy = {};\n for (var prop in obj) { copy[prop] = obj[prop]; }\n return copy\n}\n\n// Used when finding a mark at the top level of a fragment parse.\n// Checks whether it would be reasonable to apply a given mark type to\n// a given node, by looking at the way the mark occurs in the schema.\nfunction markMayApply(markType, nodeType) {\n var nodes = nodeType.schema.nodes;\n var loop = function ( name ) {\n var parent = nodes[name];\n if (!parent.allowsMarkType(markType)) { return }\n var seen = [], scan = function (match) {\n seen.push(match);\n for (var i = 0; i < match.edgeCount; i++) {\n var ref = match.edge(i);\n var type = ref.type;\n var next = ref.next;\n if (type == nodeType) { return true }\n if (seen.indexOf(next) < 0 && scan(next)) { return true }\n }\n };\n if (scan(parent.contentMatch)) { return { v: true } }\n };\n\n for (var name in nodes) {\n var returned = loop( name );\n\n if ( returned ) return returned.v;\n }\n}\n\nfunction findSameMarkInSet(mark, set) {\n for (var i = 0; i < set.length; i++) {\n if (mark.eq(set[i])) { return set[i] }\n }\n}\n\n// DOMOutputSpec:: interface\n// A description of a DOM structure. Can be either a string, which is\n// interpreted as a text node, a DOM node, which is interpreted as\n// itself, a `{dom: Node, contentDOM: ?Node}` object, or an array.\n//\n// An array describes a DOM element. The first value in the array\n// should be a string—the name of the DOM element, optionally prefixed\n// by a namespace URL and a space. If the second element is plain\n// object, it is interpreted as a set of attributes for the element.\n// Any elements after that (including the 2nd if it's not an attribute\n// object) are interpreted as children of the DOM elements, and must\n// either be valid `DOMOutputSpec` values, or the number zero.\n//\n// The number zero (pronounced “hole”) is used to indicate the place\n// where a node's child nodes should be inserted. If it occurs in an\n// output spec, it should be the only child element in its parent\n// node.\n\n// ::- A DOM serializer knows how to convert ProseMirror nodes and\n// marks of various types to DOM nodes.\nvar DOMSerializer = function DOMSerializer(nodes, marks) {\n // :: Object<(node: Node) → DOMOutputSpec>\n // The node serialization functions.\n this.nodes = nodes || {};\n // :: Object\n // The mark serialization functions.\n this.marks = marks || {};\n};\n\n// :: (Fragment, ?Object) → dom.DocumentFragment\n// Serialize the content of this fragment to a DOM fragment. When\n// not in the browser, the `document` option, containing a DOM\n// document, should be passed so that the serializer can create\n// nodes.\nDOMSerializer.prototype.serializeFragment = function serializeFragment (fragment, options, target) {\n var this$1 = this;\n if ( options === void 0 ) options = {};\n\n if (!target) { target = doc(options).createDocumentFragment(); }\n\n var top = target, active = null;\n fragment.forEach(function (node) {\n if (active || node.marks.length) {\n if (!active) { active = []; }\n var keep = 0, rendered = 0;\n while (keep < active.length && rendered < node.marks.length) {\n var next = node.marks[rendered];\n if (!this$1.marks[next.type.name]) { rendered++; continue }\n if (!next.eq(active[keep]) || next.type.spec.spanning === false) { break }\n keep += 2; rendered++;\n }\n while (keep < active.length) {\n top = active.pop();\n active.pop();\n }\n while (rendered < node.marks.length) {\n var add = node.marks[rendered++];\n var markDOM = this$1.serializeMark(add, node.isInline, options);\n if (markDOM) {\n active.push(add, top);\n top.appendChild(markDOM.dom);\n top = markDOM.contentDOM || markDOM.dom;\n }\n }\n }\n top.appendChild(this$1.serializeNode(node, options));\n });\n\n return target\n};\n\n// :: (Node, ?Object) → dom.Node\n// Serialize this node to a DOM node. This can be useful when you\n// need to serialize a part of a document, as opposed to the whole\n// document. To serialize a whole document, use\n// [`serializeFragment`](#model.DOMSerializer.serializeFragment) on\n// its [content](#model.Node.content).\nDOMSerializer.prototype.serializeNode = function serializeNode (node, options) {\n if ( options === void 0 ) options = {};\n\n var ref =\n DOMSerializer.renderSpec(doc(options), this.nodes[node.type.name](node));\n var dom = ref.dom;\n var contentDOM = ref.contentDOM;\n if (contentDOM) {\n if (node.isLeaf)\n { throw new RangeError(\"Content hole not allowed in a leaf node spec\") }\n if (options.onContent)\n { options.onContent(node, contentDOM, options); }\n else\n { this.serializeFragment(node.content, options, contentDOM); }\n }\n return dom\n};\n\nDOMSerializer.prototype.serializeNodeAndMarks = function serializeNodeAndMarks (node, options) {\n if ( options === void 0 ) options = {};\n\n var dom = this.serializeNode(node, options);\n for (var i = node.marks.length - 1; i >= 0; i--) {\n var wrap = this.serializeMark(node.marks[i], node.isInline, options);\n if (wrap) {\n(wrap.contentDOM || wrap.dom).appendChild(dom);\n dom = wrap.dom;\n }\n }\n return dom\n};\n\nDOMSerializer.prototype.serializeMark = function serializeMark (mark, inline, options) {\n if ( options === void 0 ) options = {};\n\n var toDOM = this.marks[mark.type.name];\n return toDOM && DOMSerializer.renderSpec(doc(options), toDOM(mark, inline))\n};\n\n// :: (dom.Document, DOMOutputSpec) → {dom: dom.Node, contentDOM: ?dom.Node}\n// Render an [output spec](#model.DOMOutputSpec) to a DOM node. If\n// the spec has a hole (zero) in it, `contentDOM` will point at the\n// node with the hole.\nDOMSerializer.renderSpec = function renderSpec (doc, structure, xmlNS) {\n if ( xmlNS === void 0 ) xmlNS = null;\n\n if (typeof structure == \"string\")\n { return {dom: doc.createTextNode(structure)} }\n if (structure.nodeType != null)\n { return {dom: structure} }\n if (structure.dom && structure.dom.nodeType != null)\n { return structure }\n var tagName = structure[0], space = tagName.indexOf(\" \");\n if (space > 0) {\n xmlNS = tagName.slice(0, space);\n tagName = tagName.slice(space + 1);\n }\n var contentDOM = null, dom = xmlNS ? doc.createElementNS(xmlNS, tagName) : doc.createElement(tagName);\n var attrs = structure[1], start = 1;\n if (attrs && typeof attrs == \"object\" && attrs.nodeType == null && !Array.isArray(attrs)) {\n start = 2;\n for (var name in attrs) { if (attrs[name] != null) {\n var space$1 = name.indexOf(\" \");\n if (space$1 > 0) { dom.setAttributeNS(name.slice(0, space$1), name.slice(space$1 + 1), attrs[name]); }\n else { dom.setAttribute(name, attrs[name]); }\n } }\n }\n for (var i = start; i < structure.length; i++) {\n var child = structure[i];\n if (child === 0) {\n if (i < structure.length - 1 || i > start)\n { throw new RangeError(\"Content hole must be the only child of its parent node\") }\n return {dom: dom, contentDOM: dom}\n } else {\n var ref = DOMSerializer.renderSpec(doc, child, xmlNS);\n var inner = ref.dom;\n var innerContent = ref.contentDOM;\n dom.appendChild(inner);\n if (innerContent) {\n if (contentDOM) { throw new RangeError(\"Multiple content holes\") }\n contentDOM = innerContent;\n }\n }\n }\n return {dom: dom, contentDOM: contentDOM}\n};\n\n// :: (Schema) → DOMSerializer\n// Build a serializer using the [`toDOM`](#model.NodeSpec.toDOM)\n// properties in a schema's node and mark specs.\nDOMSerializer.fromSchema = function fromSchema (schema) {\n return schema.cached.domSerializer ||\n (schema.cached.domSerializer = new DOMSerializer(this.nodesFromSchema(schema), this.marksFromSchema(schema)))\n};\n\n// : (Schema) → Object<(node: Node) → DOMOutputSpec>\n// Gather the serializers in a schema's node specs into an object.\n// This can be useful as a base to build a custom serializer from.\nDOMSerializer.nodesFromSchema = function nodesFromSchema (schema) {\n var result = gatherToDOM(schema.nodes);\n if (!result.text) { result.text = function (node) { return node.text; }; }\n return result\n};\n\n// : (Schema) → Object<(mark: Mark) → DOMOutputSpec>\n// Gather the serializers in a schema's mark specs into an object.\nDOMSerializer.marksFromSchema = function marksFromSchema (schema) {\n return gatherToDOM(schema.marks)\n};\n\nfunction gatherToDOM(obj) {\n var result = {};\n for (var name in obj) {\n var toDOM = obj[name].spec.toDOM;\n if (toDOM) { result[name] = toDOM; }\n }\n return result\n}\n\nfunction doc(options) {\n // declare global: window\n return options.document || window.document\n}\n\nexport { ContentMatch, DOMParser, DOMSerializer, Fragment, Mark, MarkType, Node, NodeRange, NodeType, ReplaceError, ResolvedPos, Schema, Slice };\n//# sourceMappingURL=index.es.js.map\n","import { Slice, Fragment, Mark, Node } from 'prosemirror-model';\nimport { ReplaceStep, ReplaceAroundStep, Transform } from 'prosemirror-transform';\n\nvar classesById = Object.create(null);\n\n// ::- Superclass for editor selections. Every selection type should\n// extend this. Should not be instantiated directly.\nvar Selection = function Selection($anchor, $head, ranges) {\n // :: [SelectionRange]\n // The ranges covered by the selection.\n this.ranges = ranges || [new SelectionRange($anchor.min($head), $anchor.max($head))];\n // :: ResolvedPos\n // The resolved anchor of the selection (the side that stays in\n // place when the selection is modified).\n this.$anchor = $anchor;\n // :: ResolvedPos\n // The resolved head of the selection (the side that moves when\n // the selection is modified).\n this.$head = $head;\n};\n\nvar prototypeAccessors = { anchor: { configurable: true },head: { configurable: true },from: { configurable: true },to: { configurable: true },$from: { configurable: true },$to: { configurable: true },empty: { configurable: true } };\n\n// :: number\n// The selection's anchor, as an unresolved position.\nprototypeAccessors.anchor.get = function () { return this.$anchor.pos };\n\n// :: number\n// The selection's head.\nprototypeAccessors.head.get = function () { return this.$head.pos };\n\n// :: number\n// The lower bound of the selection's main range.\nprototypeAccessors.from.get = function () { return this.$from.pos };\n\n// :: number\n// The upper bound of the selection's main range.\nprototypeAccessors.to.get = function () { return this.$to.pos };\n\n// :: ResolvedPos\n// The resolved lowerbound of the selection's main range.\nprototypeAccessors.$from.get = function () {\n return this.ranges[0].$from\n};\n\n// :: ResolvedPos\n// The resolved upper bound of the selection's main range.\nprototypeAccessors.$to.get = function () {\n return this.ranges[0].$to\n};\n\n// :: bool\n// Indicates whether the selection contains any content.\nprototypeAccessors.empty.get = function () {\n var ranges = this.ranges;\n for (var i = 0; i < ranges.length; i++)\n { if (ranges[i].$from.pos != ranges[i].$to.pos) { return false } }\n return true\n};\n\n// eq:: (Selection) → bool\n// Test whether the selection is the same as another selection.\n\n// map:: (doc: Node, mapping: Mappable) → Selection\n// Map this selection through a [mappable](#transform.Mappable) thing. `doc`\n// should be the new document to which we are mapping.\n\n// :: () → Slice\n// Get the content of this selection as a slice.\nSelection.prototype.content = function content () {\n return this.$from.node(0).slice(this.from, this.to, true)\n};\n\n// :: (Transaction, ?Slice)\n// Replace the selection with a slice or, if no slice is given,\n// delete the selection. Will append to the given transaction.\nSelection.prototype.replace = function replace (tr, content) {\n if ( content === void 0 ) content = Slice.empty;\n\n // Put the new selection at the position after the inserted\n // content. When that ended in an inline node, search backwards,\n // to get the position after that node. If not, search forward.\n var lastNode = content.content.lastChild, lastParent = null;\n for (var i = 0; i < content.openEnd; i++) {\n lastParent = lastNode;\n lastNode = lastNode.lastChild;\n }\n\n var mapFrom = tr.steps.length, ranges = this.ranges;\n for (var i$1 = 0; i$1 < ranges.length; i$1++) {\n var ref = ranges[i$1];\n var $from = ref.$from;\n var $to = ref.$to;\n var mapping = tr.mapping.slice(mapFrom);\n tr.replaceRange(mapping.map($from.pos), mapping.map($to.pos), i$1 ? Slice.empty : content);\n if (i$1 == 0)\n { selectionToInsertionEnd(tr, mapFrom, (lastNode ? lastNode.isInline : lastParent && lastParent.isTextblock) ? -1 : 1); }\n }\n};\n\n// :: (Transaction, Node)\n// Replace the selection with the given node, appending the changes\n// to the given transaction.\nSelection.prototype.replaceWith = function replaceWith (tr, node) {\n var mapFrom = tr.steps.length, ranges = this.ranges;\n for (var i = 0; i < ranges.length; i++) {\n var ref = ranges[i];\n var $from = ref.$from;\n var $to = ref.$to;\n var mapping = tr.mapping.slice(mapFrom);\n var from = mapping.map($from.pos), to = mapping.map($to.pos);\n if (i) {\n tr.deleteRange(from, to);\n } else {\n tr.replaceRangeWith(from, to, node);\n selectionToInsertionEnd(tr, mapFrom, node.isInline ? -1 : 1);\n }\n }\n};\n\n// toJSON:: () → Object\n// Convert the selection to a JSON representation. When implementing\n// this for a custom selection class, make sure to give the object a\n// `type` property whose value matches the ID under which you\n// [registered](#state.Selection^jsonID) your class.\n\n// :: (ResolvedPos, number, ?bool) → ?Selection\n// Find a valid cursor or leaf node selection starting at the given\n// position and searching back if `dir` is negative, and forward if\n// positive. When `textOnly` is true, only consider cursor\n// selections. Will return null when no valid selection position is\n// found.\nSelection.findFrom = function findFrom ($pos, dir, textOnly) {\n var inner = $pos.parent.inlineContent ? new TextSelection($pos)\n : findSelectionIn($pos.node(0), $pos.parent, $pos.pos, $pos.index(), dir, textOnly);\n if (inner) { return inner }\n\n for (var depth = $pos.depth - 1; depth >= 0; depth--) {\n var found = dir < 0\n ? findSelectionIn($pos.node(0), $pos.node(depth), $pos.before(depth + 1), $pos.index(depth), dir, textOnly)\n : findSelectionIn($pos.node(0), $pos.node(depth), $pos.after(depth + 1), $pos.index(depth) + 1, dir, textOnly);\n if (found) { return found }\n }\n};\n\n// :: (ResolvedPos, ?number) → Selection\n// Find a valid cursor or leaf node selection near the given\n// position. Searches forward first by default, but if `bias` is\n// negative, it will search backwards first.\nSelection.near = function near ($pos, bias) {\n if ( bias === void 0 ) bias = 1;\n\n return this.findFrom($pos, bias) || this.findFrom($pos, -bias) || new AllSelection($pos.node(0))\n};\n\n// :: (Node) → Selection\n// Find the cursor or leaf node selection closest to the start of\n// the given document. Will return an\n// [`AllSelection`](#state.AllSelection) if no valid position\n// exists.\nSelection.atStart = function atStart (doc) {\n return findSelectionIn(doc, doc, 0, 0, 1) || new AllSelection(doc)\n};\n\n// :: (Node) → Selection\n// Find the cursor or leaf node selection closest to the end of the\n// given document.\nSelection.atEnd = function atEnd (doc) {\n return findSelectionIn(doc, doc, doc.content.size, doc.childCount, -1) || new AllSelection(doc)\n};\n\n// :: (Node, Object) → Selection\n// Deserialize the JSON representation of a selection. Must be\n// implemented for custom classes (as a static class method).\nSelection.fromJSON = function fromJSON (doc, json) {\n if (!json || !json.type) { throw new RangeError(\"Invalid input for Selection.fromJSON\") }\n var cls = classesById[json.type];\n if (!cls) { throw new RangeError((\"No selection type \" + (json.type) + \" defined\")) }\n return cls.fromJSON(doc, json)\n};\n\n// :: (string, constructor)\n// To be able to deserialize selections from JSON, custom selection\n// classes must register themselves with an ID string, so that they\n// can be disambiguated. Try to pick something that's unlikely to\n// clash with classes from other modules.\nSelection.jsonID = function jsonID (id, selectionClass) {\n if (id in classesById) { throw new RangeError(\"Duplicate use of selection JSON ID \" + id) }\n classesById[id] = selectionClass;\n selectionClass.prototype.jsonID = id;\n return selectionClass\n};\n\n// :: () → SelectionBookmark\n// Get a [bookmark](#state.SelectionBookmark) for this selection,\n// which is a value that can be mapped without having access to a\n// current document, and later resolved to a real selection for a\n// given document again. (This is used mostly by the history to\n// track and restore old selections.) The default implementation of\n// this method just converts the selection to a text selection and\n// returns the bookmark for that.\nSelection.prototype.getBookmark = function getBookmark () {\n return TextSelection.between(this.$anchor, this.$head).getBookmark()\n};\n\nObject.defineProperties( Selection.prototype, prototypeAccessors );\n\n// :: bool\n// Controls whether, when a selection of this type is active in the\n// browser, the selected range should be visible to the user. Defaults\n// to `true`.\nSelection.prototype.visible = true;\n\n// SelectionBookmark:: interface\n// A lightweight, document-independent representation of a selection.\n// You can define a custom bookmark type for a custom selection class\n// to make the history handle it well.\n//\n// map:: (mapping: Mapping) → SelectionBookmark\n// Map the bookmark through a set of changes.\n//\n// resolve:: (doc: Node) → Selection\n// Resolve the bookmark to a real selection again. This may need to\n// do some error checking and may fall back to a default (usually\n// [`TextSelection.between`](#state.TextSelection^between)) if\n// mapping made the bookmark invalid.\n\n// ::- Represents a selected range in a document.\nvar SelectionRange = function SelectionRange($from, $to) {\n // :: ResolvedPos\n // The lower bound of the range.\n this.$from = $from;\n // :: ResolvedPos\n // The upper bound of the range.\n this.$to = $to;\n};\n\n// ::- A text selection represents a classical editor selection, with\n// a head (the moving side) and anchor (immobile side), both of which\n// point into textblock nodes. It can be empty (a regular cursor\n// position).\nvar TextSelection = /*@__PURE__*/(function (Selection) {\n function TextSelection($anchor, $head) {\n if ( $head === void 0 ) $head = $anchor;\n\n Selection.call(this, $anchor, $head);\n }\n\n if ( Selection ) TextSelection.__proto__ = Selection;\n TextSelection.prototype = Object.create( Selection && Selection.prototype );\n TextSelection.prototype.constructor = TextSelection;\n\n var prototypeAccessors$1 = { $cursor: { configurable: true } };\n\n // :: ?ResolvedPos\n // Returns a resolved position if this is a cursor selection (an\n // empty text selection), and null otherwise.\n prototypeAccessors$1.$cursor.get = function () { return this.$anchor.pos == this.$head.pos ? this.$head : null };\n\n TextSelection.prototype.map = function map (doc, mapping) {\n var $head = doc.resolve(mapping.map(this.head));\n if (!$head.parent.inlineContent) { return Selection.near($head) }\n var $anchor = doc.resolve(mapping.map(this.anchor));\n return new TextSelection($anchor.parent.inlineContent ? $anchor : $head, $head)\n };\n\n TextSelection.prototype.replace = function replace (tr, content) {\n if ( content === void 0 ) content = Slice.empty;\n\n Selection.prototype.replace.call(this, tr, content);\n if (content == Slice.empty) {\n var marks = this.$from.marksAcross(this.$to);\n if (marks) { tr.ensureMarks(marks); }\n }\n };\n\n TextSelection.prototype.eq = function eq (other) {\n return other instanceof TextSelection && other.anchor == this.anchor && other.head == this.head\n };\n\n TextSelection.prototype.getBookmark = function getBookmark () {\n return new TextBookmark(this.anchor, this.head)\n };\n\n TextSelection.prototype.toJSON = function toJSON () {\n return {type: \"text\", anchor: this.anchor, head: this.head}\n };\n\n TextSelection.fromJSON = function fromJSON (doc, json) {\n if (typeof json.anchor != \"number\" || typeof json.head != \"number\")\n { throw new RangeError(\"Invalid input for TextSelection.fromJSON\") }\n return new TextSelection(doc.resolve(json.anchor), doc.resolve(json.head))\n };\n\n // :: (Node, number, ?number) → TextSelection\n // Create a text selection from non-resolved positions.\n TextSelection.create = function create (doc, anchor, head) {\n if ( head === void 0 ) head = anchor;\n\n var $anchor = doc.resolve(anchor);\n return new this($anchor, head == anchor ? $anchor : doc.resolve(head))\n };\n\n // :: (ResolvedPos, ResolvedPos, ?number) → Selection\n // Return a text selection that spans the given positions or, if\n // they aren't text positions, find a text selection near them.\n // `bias` determines whether the method searches forward (default)\n // or backwards (negative number) first. Will fall back to calling\n // [`Selection.near`](#state.Selection^near) when the document\n // doesn't contain a valid text position.\n TextSelection.between = function between ($anchor, $head, bias) {\n var dPos = $anchor.pos - $head.pos;\n if (!bias || dPos) { bias = dPos >= 0 ? 1 : -1; }\n if (!$head.parent.inlineContent) {\n var found = Selection.findFrom($head, bias, true) || Selection.findFrom($head, -bias, true);\n if (found) { $head = found.$head; }\n else { return Selection.near($head, bias) }\n }\n if (!$anchor.parent.inlineContent) {\n if (dPos == 0) {\n $anchor = $head;\n } else {\n $anchor = (Selection.findFrom($anchor, -bias, true) || Selection.findFrom($anchor, bias, true)).$anchor;\n if (($anchor.pos < $head.pos) != (dPos < 0)) { $anchor = $head; }\n }\n }\n return new TextSelection($anchor, $head)\n };\n\n Object.defineProperties( TextSelection.prototype, prototypeAccessors$1 );\n\n return TextSelection;\n}(Selection));\n\nSelection.jsonID(\"text\", TextSelection);\n\nvar TextBookmark = function TextBookmark(anchor, head) {\n this.anchor = anchor;\n this.head = head;\n};\nTextBookmark.prototype.map = function map (mapping) {\n return new TextBookmark(mapping.map(this.anchor), mapping.map(this.head))\n};\nTextBookmark.prototype.resolve = function resolve (doc) {\n return TextSelection.between(doc.resolve(this.anchor), doc.resolve(this.head))\n};\n\n// ::- A node selection is a selection that points at a single node.\n// All nodes marked [selectable](#model.NodeSpec.selectable) can be\n// the target of a node selection. In such a selection, `from` and\n// `to` point directly before and after the selected node, `anchor`\n// equals `from`, and `head` equals `to`..\nvar NodeSelection = /*@__PURE__*/(function (Selection) {\n function NodeSelection($pos) {\n var node = $pos.nodeAfter;\n var $end = $pos.node(0).resolve($pos.pos + node.nodeSize);\n Selection.call(this, $pos, $end);\n // :: Node The selected node.\n this.node = node;\n }\n\n if ( Selection ) NodeSelection.__proto__ = Selection;\n NodeSelection.prototype = Object.create( Selection && Selection.prototype );\n NodeSelection.prototype.constructor = NodeSelection;\n\n NodeSelection.prototype.map = function map (doc, mapping) {\n var ref = mapping.mapResult(this.anchor);\n var deleted = ref.deleted;\n var pos = ref.pos;\n var $pos = doc.resolve(pos);\n if (deleted) { return Selection.near($pos) }\n return new NodeSelection($pos)\n };\n\n NodeSelection.prototype.content = function content () {\n return new Slice(Fragment.from(this.node), 0, 0)\n };\n\n NodeSelection.prototype.eq = function eq (other) {\n return other instanceof NodeSelection && other.anchor == this.anchor\n };\n\n NodeSelection.prototype.toJSON = function toJSON () {\n return {type: \"node\", anchor: this.anchor}\n };\n\n NodeSelection.prototype.getBookmark = function getBookmark () { return new NodeBookmark(this.anchor) };\n\n NodeSelection.fromJSON = function fromJSON (doc, json) {\n if (typeof json.anchor != \"number\")\n { throw new RangeError(\"Invalid input for NodeSelection.fromJSON\") }\n return new NodeSelection(doc.resolve(json.anchor))\n };\n\n // :: (Node, number) → NodeSelection\n // Create a node selection from non-resolved positions.\n NodeSelection.create = function create (doc, from) {\n return new this(doc.resolve(from))\n };\n\n // :: (Node) → bool\n // Determines whether the given node may be selected as a node\n // selection.\n NodeSelection.isSelectable = function isSelectable (node) {\n return !node.isText && node.type.spec.selectable !== false\n };\n\n return NodeSelection;\n}(Selection));\n\nNodeSelection.prototype.visible = false;\n\nSelection.jsonID(\"node\", NodeSelection);\n\nvar NodeBookmark = function NodeBookmark(anchor) {\n this.anchor = anchor;\n};\nNodeBookmark.prototype.map = function map (mapping) {\n var ref = mapping.mapResult(this.anchor);\n var deleted = ref.deleted;\n var pos = ref.pos;\n return deleted ? new TextBookmark(pos, pos) : new NodeBookmark(pos)\n};\nNodeBookmark.prototype.resolve = function resolve (doc) {\n var $pos = doc.resolve(this.anchor), node = $pos.nodeAfter;\n if (node && NodeSelection.isSelectable(node)) { return new NodeSelection($pos) }\n return Selection.near($pos)\n};\n\n// ::- A selection type that represents selecting the whole document\n// (which can not necessarily be expressed with a text selection, when\n// there are for example leaf block nodes at the start or end of the\n// document).\nvar AllSelection = /*@__PURE__*/(function (Selection) {\n function AllSelection(doc) {\n Selection.call(this, doc.resolve(0), doc.resolve(doc.content.size));\n }\n\n if ( Selection ) AllSelection.__proto__ = Selection;\n AllSelection.prototype = Object.create( Selection && Selection.prototype );\n AllSelection.prototype.constructor = AllSelection;\n\n AllSelection.prototype.replace = function replace (tr, content) {\n if ( content === void 0 ) content = Slice.empty;\n\n if (content == Slice.empty) {\n tr.delete(0, tr.doc.content.size);\n var sel = Selection.atStart(tr.doc);\n if (!sel.eq(tr.selection)) { tr.setSelection(sel); }\n } else {\n Selection.prototype.replace.call(this, tr, content);\n }\n };\n\n AllSelection.prototype.toJSON = function toJSON () { return {type: \"all\"} };\n\n AllSelection.fromJSON = function fromJSON (doc) { return new AllSelection(doc) };\n\n AllSelection.prototype.map = function map (doc) { return new AllSelection(doc) };\n\n AllSelection.prototype.eq = function eq (other) { return other instanceof AllSelection };\n\n AllSelection.prototype.getBookmark = function getBookmark () { return AllBookmark };\n\n return AllSelection;\n}(Selection));\n\nSelection.jsonID(\"all\", AllSelection);\n\nvar AllBookmark = {\n map: function map() { return this },\n resolve: function resolve(doc) { return new AllSelection(doc) }\n};\n\n// FIXME we'll need some awareness of text direction when scanning for selections\n\n// Try to find a selection inside the given node. `pos` points at the\n// position where the search starts. When `text` is true, only return\n// text selections.\nfunction findSelectionIn(doc, node, pos, index, dir, text) {\n if (node.inlineContent) { return TextSelection.create(doc, pos) }\n for (var i = index - (dir > 0 ? 0 : 1); dir > 0 ? i < node.childCount : i >= 0; i += dir) {\n var child = node.child(i);\n if (!child.isAtom) {\n var inner = findSelectionIn(doc, child, pos + dir, dir < 0 ? child.childCount : 0, dir, text);\n if (inner) { return inner }\n } else if (!text && NodeSelection.isSelectable(child)) {\n return NodeSelection.create(doc, pos - (dir < 0 ? child.nodeSize : 0))\n }\n pos += child.nodeSize * dir;\n }\n}\n\nfunction selectionToInsertionEnd(tr, startLen, bias) {\n var last = tr.steps.length - 1;\n if (last < startLen) { return }\n var step = tr.steps[last];\n if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) { return }\n var map = tr.mapping.maps[last], end;\n map.forEach(function (_from, _to, _newFrom, newTo) { if (end == null) { end = newTo; } });\n tr.setSelection(Selection.near(tr.doc.resolve(end), bias));\n}\n\nvar UPDATED_SEL = 1, UPDATED_MARKS = 2, UPDATED_SCROLL = 4;\n\n// ::- An editor state transaction, which can be applied to a state to\n// create an updated state. Use\n// [`EditorState.tr`](#state.EditorState.tr) to create an instance.\n//\n// Transactions track changes to the document (they are a subclass of\n// [`Transform`](#transform.Transform)), but also other state changes,\n// like selection updates and adjustments of the set of [stored\n// marks](#state.EditorState.storedMarks). In addition, you can store\n// metadata properties in a transaction, which are extra pieces of\n// information that client code or plugins can use to describe what a\n// transacion represents, so that they can update their [own\n// state](#state.StateField) accordingly.\n//\n// The [editor view](#view.EditorView) uses a few metadata properties:\n// it will attach a property `\"pointer\"` with the value `true` to\n// selection transactions directly caused by mouse or touch input, and\n// a `\"uiEvent\"` property of that may be `\"paste\"`, `\"cut\"`, or `\"drop\"`.\nvar Transaction = /*@__PURE__*/(function (Transform) {\n function Transaction(state) {\n Transform.call(this, state.doc);\n // :: number\n // The timestamp associated with this transaction, in the same\n // format as `Date.now()`.\n this.time = Date.now();\n this.curSelection = state.selection;\n // The step count for which the current selection is valid.\n this.curSelectionFor = 0;\n // :: ?[Mark]\n // The stored marks set by this transaction, if any.\n this.storedMarks = state.storedMarks;\n // Bitfield to track which aspects of the state were updated by\n // this transaction.\n this.updated = 0;\n // Object used to store metadata properties for the transaction.\n this.meta = Object.create(null);\n }\n\n if ( Transform ) Transaction.__proto__ = Transform;\n Transaction.prototype = Object.create( Transform && Transform.prototype );\n Transaction.prototype.constructor = Transaction;\n\n var prototypeAccessors = { selection: { configurable: true },selectionSet: { configurable: true },storedMarksSet: { configurable: true },isGeneric: { configurable: true },scrolledIntoView: { configurable: true } };\n\n // :: Selection\n // The transaction's current selection. This defaults to the editor\n // selection [mapped](#state.Selection.map) through the steps in the\n // transaction, but can be overwritten with\n // [`setSelection`](#state.Transaction.setSelection).\n prototypeAccessors.selection.get = function () {\n if (this.curSelectionFor < this.steps.length) {\n this.curSelection = this.curSelection.map(this.doc, this.mapping.slice(this.curSelectionFor));\n this.curSelectionFor = this.steps.length;\n }\n return this.curSelection\n };\n\n // :: (Selection) → Transaction\n // Update the transaction's current selection. Will determine the\n // selection that the editor gets when the transaction is applied.\n Transaction.prototype.setSelection = function setSelection (selection) {\n if (selection.$from.doc != this.doc)\n { throw new RangeError(\"Selection passed to setSelection must point at the current document\") }\n this.curSelection = selection;\n this.curSelectionFor = this.steps.length;\n this.updated = (this.updated | UPDATED_SEL) & ~UPDATED_MARKS;\n this.storedMarks = null;\n return this\n };\n\n // :: bool\n // Whether the selection was explicitly updated by this transaction.\n prototypeAccessors.selectionSet.get = function () {\n return (this.updated & UPDATED_SEL) > 0\n };\n\n // :: (?[Mark]) → Transaction\n // Set the current stored marks.\n Transaction.prototype.setStoredMarks = function setStoredMarks (marks) {\n this.storedMarks = marks;\n this.updated |= UPDATED_MARKS;\n return this\n };\n\n // :: ([Mark]) → Transaction\n // Make sure the current stored marks or, if that is null, the marks\n // at the selection, match the given set of marks. Does nothing if\n // this is already the case.\n Transaction.prototype.ensureMarks = function ensureMarks (marks) {\n if (!Mark.sameSet(this.storedMarks || this.selection.$from.marks(), marks))\n { this.setStoredMarks(marks); }\n return this\n };\n\n // :: (Mark) → Transaction\n // Add a mark to the set of stored marks.\n Transaction.prototype.addStoredMark = function addStoredMark (mark) {\n return this.ensureMarks(mark.addToSet(this.storedMarks || this.selection.$head.marks()))\n };\n\n // :: (union) → Transaction\n // Remove a mark or mark type from the set of stored marks.\n Transaction.prototype.removeStoredMark = function removeStoredMark (mark) {\n return this.ensureMarks(mark.removeFromSet(this.storedMarks || this.selection.$head.marks()))\n };\n\n // :: bool\n // Whether the stored marks were explicitly set for this transaction.\n prototypeAccessors.storedMarksSet.get = function () {\n return (this.updated & UPDATED_MARKS) > 0\n };\n\n Transaction.prototype.addStep = function addStep (step, doc) {\n Transform.prototype.addStep.call(this, step, doc);\n this.updated = this.updated & ~UPDATED_MARKS;\n this.storedMarks = null;\n };\n\n // :: (number) → Transaction\n // Update the timestamp for the transaction.\n Transaction.prototype.setTime = function setTime (time) {\n this.time = time;\n return this\n };\n\n // :: (Slice) → Transaction\n // Replace the current selection with the given slice.\n Transaction.prototype.replaceSelection = function replaceSelection (slice) {\n this.selection.replace(this, slice);\n return this\n };\n\n // :: (Node, ?bool) → Transaction\n // Replace the selection with the given node. When `inheritMarks` is\n // true and the content is inline, it inherits the marks from the\n // place where it is inserted.\n Transaction.prototype.replaceSelectionWith = function replaceSelectionWith (node, inheritMarks) {\n var selection = this.selection;\n if (inheritMarks !== false)\n { node = node.mark(this.storedMarks || (selection.empty ? selection.$from.marks() : (selection.$from.marksAcross(selection.$to) || Mark.none))); }\n selection.replaceWith(this, node);\n return this\n };\n\n // :: () → Transaction\n // Delete the selection.\n Transaction.prototype.deleteSelection = function deleteSelection () {\n this.selection.replace(this);\n return this\n };\n\n // :: (string, from: ?number, to: ?number) → Transaction\n // Replace the given range, or the selection if no range is given,\n // with a text node containing the given string.\n Transaction.prototype.insertText = function insertText (text, from, to) {\n if ( to === void 0 ) to = from;\n\n var schema = this.doc.type.schema;\n if (from == null) {\n if (!text) { return this.deleteSelection() }\n return this.replaceSelectionWith(schema.text(text), true)\n } else {\n if (!text) { return this.deleteRange(from, to) }\n var marks = this.storedMarks;\n if (!marks) {\n var $from = this.doc.resolve(from);\n marks = to == from ? $from.marks() : $from.marksAcross(this.doc.resolve(to));\n }\n this.replaceRangeWith(from, to, schema.text(text, marks));\n if (!this.selection.empty) { this.setSelection(Selection.near(this.selection.$to)); }\n return this\n }\n };\n\n // :: (union, any) → Transaction\n // Store a metadata property in this transaction, keyed either by\n // name or by plugin.\n Transaction.prototype.setMeta = function setMeta (key, value) {\n this.meta[typeof key == \"string\" ? key : key.key] = value;\n return this\n };\n\n // :: (union) → any\n // Retrieve a metadata property for a given name or plugin.\n Transaction.prototype.getMeta = function getMeta (key) {\n return this.meta[typeof key == \"string\" ? key : key.key]\n };\n\n // :: bool\n // Returns true if this transaction doesn't contain any metadata,\n // and can thus safely be extended.\n prototypeAccessors.isGeneric.get = function () {\n for (var _ in this.meta) { return false }\n return true\n };\n\n // :: () → Transaction\n // Indicate that the editor should scroll the selection into view\n // when updated to the state produced by this transaction.\n Transaction.prototype.scrollIntoView = function scrollIntoView () {\n this.updated |= UPDATED_SCROLL;\n return this\n };\n\n prototypeAccessors.scrolledIntoView.get = function () {\n return (this.updated & UPDATED_SCROLL) > 0\n };\n\n Object.defineProperties( Transaction.prototype, prototypeAccessors );\n\n return Transaction;\n}(Transform));\n\nfunction bind(f, self) {\n return !self || !f ? f : f.bind(self)\n}\n\nvar FieldDesc = function FieldDesc(name, desc, self) {\n this.name = name;\n this.init = bind(desc.init, self);\n this.apply = bind(desc.apply, self);\n};\n\nvar baseFields = [\n new FieldDesc(\"doc\", {\n init: function init(config) { return config.doc || config.schema.topNodeType.createAndFill() },\n apply: function apply(tr) { return tr.doc }\n }),\n\n new FieldDesc(\"selection\", {\n init: function init(config, instance) { return config.selection || Selection.atStart(instance.doc) },\n apply: function apply(tr) { return tr.selection }\n }),\n\n new FieldDesc(\"storedMarks\", {\n init: function init(config) { return config.storedMarks || null },\n apply: function apply(tr, _marks, _old, state) { return state.selection.$cursor ? tr.storedMarks : null }\n }),\n\n new FieldDesc(\"scrollToSelection\", {\n init: function init() { return 0 },\n apply: function apply(tr, prev) { return tr.scrolledIntoView ? prev + 1 : prev }\n })\n];\n\n// Object wrapping the part of a state object that stays the same\n// across transactions. Stored in the state's `config` property.\nvar Configuration = function Configuration(schema, plugins) {\n var this$1 = this;\n\n this.schema = schema;\n this.fields = baseFields.concat();\n this.plugins = [];\n this.pluginsByKey = Object.create(null);\n if (plugins) { plugins.forEach(function (plugin) {\n if (this$1.pluginsByKey[plugin.key])\n { throw new RangeError(\"Adding different instances of a keyed plugin (\" + plugin.key + \")\") }\n this$1.plugins.push(plugin);\n this$1.pluginsByKey[plugin.key] = plugin;\n if (plugin.spec.state)\n { this$1.fields.push(new FieldDesc(plugin.key, plugin.spec.state, plugin)); }\n }); }\n};\n\n// ::- The state of a ProseMirror editor is represented by an object\n// of this type. A state is a persistent data structure—it isn't\n// updated, but rather a new state value is computed from an old one\n// using the [`apply`](#state.EditorState.apply) method.\n//\n// A state holds a number of built-in fields, and plugins can\n// [define](#state.PluginSpec.state) additional fields.\nvar EditorState = function EditorState(config) {\n this.config = config;\n};\n\nvar prototypeAccessors$1 = { schema: { configurable: true },plugins: { configurable: true },tr: { configurable: true } };\n\n// doc:: Node\n// The current document.\n\n// selection:: Selection\n// The selection.\n\n// storedMarks:: ?[Mark]\n// A set of marks to apply to the next input. Will be null when\n// no explicit marks have been set.\n\n// :: Schema\n// The schema of the state's document.\nprototypeAccessors$1.schema.get = function () {\n return this.config.schema\n};\n\n// :: [Plugin]\n// The plugins that are active in this state.\nprototypeAccessors$1.plugins.get = function () {\n return this.config.plugins\n};\n\n// :: (Transaction) → EditorState\n// Apply the given transaction to produce a new state.\nEditorState.prototype.apply = function apply (tr) {\n return this.applyTransaction(tr).state\n};\n\n// : (Transaction) → bool\nEditorState.prototype.filterTransaction = function filterTransaction (tr, ignore) {\n if ( ignore === void 0 ) ignore = -1;\n\n for (var i = 0; i < this.config.plugins.length; i++) { if (i != ignore) {\n var plugin = this.config.plugins[i];\n if (plugin.spec.filterTransaction && !plugin.spec.filterTransaction.call(plugin, tr, this))\n { return false }\n } }\n return true\n};\n\n// :: (Transaction) → {state: EditorState, transactions: [Transaction]}\n// Verbose variant of [`apply`](#state.EditorState.apply) that\n// returns the precise transactions that were applied (which might\n// be influenced by the [transaction\n// hooks](#state.PluginSpec.filterTransaction) of\n// plugins) along with the new state.\nEditorState.prototype.applyTransaction = function applyTransaction (rootTr) {\n if (!this.filterTransaction(rootTr)) { return {state: this, transactions: []} }\n\n var trs = [rootTr], newState = this.applyInner(rootTr), seen = null;\n // This loop repeatedly gives plugins a chance to respond to\n // transactions as new transactions are added, making sure to only\n // pass the transactions the plugin did not see before.\n for (;;) {\n var haveNew = false;\n for (var i = 0; i < this.config.plugins.length; i++) {\n var plugin = this.config.plugins[i];\n if (plugin.spec.appendTransaction) {\n var n = seen ? seen[i].n : 0, oldState = seen ? seen[i].state : this;\n var tr = n < trs.length &&\n plugin.spec.appendTransaction.call(plugin, n ? trs.slice(n) : trs, oldState, newState);\n if (tr && newState.filterTransaction(tr, i)) {\n tr.setMeta(\"appendedTransaction\", rootTr);\n if (!seen) {\n seen = [];\n for (var j = 0; j < this.config.plugins.length; j++)\n { seen.push(j < i ? {state: newState, n: trs.length} : {state: this, n: 0}); }\n }\n trs.push(tr);\n newState = newState.applyInner(tr);\n haveNew = true;\n }\n if (seen) { seen[i] = {state: newState, n: trs.length}; }\n }\n }\n if (!haveNew) { return {state: newState, transactions: trs} }\n }\n};\n\n// : (Transaction) → EditorState\nEditorState.prototype.applyInner = function applyInner (tr) {\n if (!tr.before.eq(this.doc)) { throw new RangeError(\"Applying a mismatched transaction\") }\n var newInstance = new EditorState(this.config), fields = this.config.fields;\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n newInstance[field.name] = field.apply(tr, this[field.name], this, newInstance);\n }\n for (var i$1 = 0; i$1 < applyListeners.length; i$1++) { applyListeners[i$1](this, tr, newInstance); }\n return newInstance\n};\n\n// :: Transaction\n// Start a [transaction](#state.Transaction) from this state.\nprototypeAccessors$1.tr.get = function () { return new Transaction(this) };\n\n// :: (Object) → EditorState\n// Create a new state.\n//\n// config::- Configuration options. Must contain `schema` or `doc` (or both).\n//\n// schema:: ?Schema\n// The schema to use (only relevant if no `doc` is specified).\n//\n// doc:: ?Node\n// The starting document.\n//\n// selection:: ?Selection\n// A valid selection in the document.\n//\n// storedMarks:: ?[Mark]\n// The initial set of [stored marks](#state.EditorState.storedMarks).\n//\n// plugins:: ?[Plugin]\n// The plugins that should be active in this state.\nEditorState.create = function create (config) {\n var $config = new Configuration(config.doc ? config.doc.type.schema : config.schema, config.plugins);\n var instance = new EditorState($config);\n for (var i = 0; i < $config.fields.length; i++)\n { instance[$config.fields[i].name] = $config.fields[i].init(config, instance); }\n return instance\n};\n\n// :: (Object) → EditorState\n// Create a new state based on this one, but with an adjusted set of\n// active plugins. State fields that exist in both sets of plugins\n// are kept unchanged. Those that no longer exist are dropped, and\n// those that are new are initialized using their\n// [`init`](#state.StateField.init) method, passing in the new\n// configuration object..\n//\n// config::- configuration options\n//\n// plugins:: [Plugin]\n// New set of active plugins.\nEditorState.prototype.reconfigure = function reconfigure (config) {\n var $config = new Configuration(this.schema, config.plugins);\n var fields = $config.fields, instance = new EditorState($config);\n for (var i = 0; i < fields.length; i++) {\n var name = fields[i].name;\n instance[name] = this.hasOwnProperty(name) ? this[name] : fields[i].init(config, instance);\n }\n return instance\n};\n\n// :: (?union, string, number>) → Object\n// Serialize this state to JSON. If you want to serialize the state\n// of plugins, pass an object mapping property names to use in the\n// resulting JSON object to plugin objects. The argument may also be\n// a string or number, in which case it is ignored, to support the\n// way `JSON.stringify` calls `toString` methods.\nEditorState.prototype.toJSON = function toJSON (pluginFields) {\n var result = {doc: this.doc.toJSON(), selection: this.selection.toJSON()};\n if (this.storedMarks) { result.storedMarks = this.storedMarks.map(function (m) { return m.toJSON(); }); }\n if (pluginFields && typeof pluginFields == 'object') { for (var prop in pluginFields) {\n if (prop == \"doc\" || prop == \"selection\")\n { throw new RangeError(\"The JSON fields `doc` and `selection` are reserved\") }\n var plugin = pluginFields[prop], state = plugin.spec.state;\n if (state && state.toJSON) { result[prop] = state.toJSON.call(plugin, this[plugin.key]); }\n } }\n return result\n};\n\n// :: (Object, Object, ?Object) → EditorState\n// Deserialize a JSON representation of a state. `config` should\n// have at least a `schema` field, and should contain array of\n// plugins to initialize the state with. `pluginFields` can be used\n// to deserialize the state of plugins, by associating plugin\n// instances with the property names they use in the JSON object.\n//\n// config::- configuration options\n//\n// schema:: Schema\n// The schema to use.\n//\n// plugins:: ?[Plugin]\n// The set of active plugins.\nEditorState.fromJSON = function fromJSON (config, json, pluginFields) {\n if (!json) { throw new RangeError(\"Invalid input for EditorState.fromJSON\") }\n if (!config.schema) { throw new RangeError(\"Required config field 'schema' missing\") }\n var $config = new Configuration(config.schema, config.plugins);\n var instance = new EditorState($config);\n $config.fields.forEach(function (field) {\n if (field.name == \"doc\") {\n instance.doc = Node.fromJSON(config.schema, json.doc);\n } else if (field.name == \"selection\") {\n instance.selection = Selection.fromJSON(instance.doc, json.selection);\n } else if (field.name == \"storedMarks\") {\n if (json.storedMarks) { instance.storedMarks = json.storedMarks.map(config.schema.markFromJSON); }\n } else {\n if (pluginFields) { for (var prop in pluginFields) {\n var plugin = pluginFields[prop], state = plugin.spec.state;\n if (plugin.key == field.name && state && state.fromJSON &&\n Object.prototype.hasOwnProperty.call(json, prop)) {\n // This field belongs to a plugin mapped to a JSON field, read it from there.\n instance[field.name] = state.fromJSON.call(plugin, config, json[prop], instance);\n return\n }\n } }\n instance[field.name] = field.init(config, instance);\n }\n });\n return instance\n};\n\n// Kludge to allow the view to track mappings between different\n// instances of a state.\n//\n// FIXME this is no longer needed as of prosemirror-view 1.9.0,\n// though due to backwards-compat we should probably keep it around\n// for a while (if only as a no-op)\nEditorState.addApplyListener = function addApplyListener (f) {\n applyListeners.push(f);\n};\nEditorState.removeApplyListener = function removeApplyListener (f) {\n var found = applyListeners.indexOf(f);\n if (found > -1) { applyListeners.splice(found, 1); }\n};\n\nObject.defineProperties( EditorState.prototype, prototypeAccessors$1 );\n\nvar applyListeners = [];\n\n// PluginSpec:: interface\n//\n// This is the type passed to the [`Plugin`](#state.Plugin)\n// constructor. It provides a definition for a plugin.\n//\n// props:: ?EditorProps\n// The [view props](#view.EditorProps) added by this plugin. Props\n// that are functions will be bound to have the plugin instance as\n// their `this` binding.\n//\n// state:: ?StateField\n// Allows a plugin to define a [state field](#state.StateField), an\n// extra slot in the state object in which it can keep its own data.\n//\n// key:: ?PluginKey\n// Can be used to make this a keyed plugin. You can have only one\n// plugin with a given key in a given state, but it is possible to\n// access the plugin's configuration and state through the key,\n// without having access to the plugin instance object.\n//\n// view:: ?(EditorView) → Object\n// When the plugin needs to interact with the editor view, or\n// set something up in the DOM, use this field. The function\n// will be called when the plugin's state is associated with an\n// editor view.\n//\n// return::-\n// Should return an object with the following optional\n// properties:\n//\n// update:: ?(view: EditorView, prevState: EditorState)\n// Called whenever the view's state is updated.\n//\n// destroy:: ?()\n// Called when the view is destroyed or receives a state\n// with different plugins.\n//\n// filterTransaction:: ?(Transaction, EditorState) → bool\n// When present, this will be called before a transaction is\n// applied by the state, allowing the plugin to cancel it (by\n// returning false).\n//\n// appendTransaction:: ?(transactions: [Transaction], oldState: EditorState, newState: EditorState) → ?Transaction\n// Allows the plugin to append another transaction to be applied\n// after the given array of transactions. When another plugin\n// appends a transaction after this was called, it is called again\n// with the new state and new transactions—but only the new\n// transactions, i.e. it won't be passed transactions that it\n// already saw.\n\nfunction bindProps(obj, self, target) {\n for (var prop in obj) {\n var val = obj[prop];\n if (val instanceof Function) { val = val.bind(self); }\n else if (prop == \"handleDOMEvents\") { val = bindProps(val, self, {}); }\n target[prop] = val;\n }\n return target\n}\n\n// ::- Plugins bundle functionality that can be added to an editor.\n// They are part of the [editor state](#state.EditorState) and\n// may influence that state and the view that contains it.\nvar Plugin = function Plugin(spec) {\n // :: EditorProps\n // The [props](#view.EditorProps) exported by this plugin.\n this.props = {};\n if (spec.props) { bindProps(spec.props, this, this.props); }\n // :: Object\n // The plugin's [spec object](#state.PluginSpec).\n this.spec = spec;\n this.key = spec.key ? spec.key.key : createKey(\"plugin\");\n};\n\n// :: (EditorState) → any\n// Extract the plugin's state field from an editor state.\nPlugin.prototype.getState = function getState (state) { return state[this.key] };\n\n// StateField:: interface\n// A plugin spec may provide a state field (under its\n// [`state`](#state.PluginSpec.state) property) of this type, which\n// describes the state it wants to keep. Functions provided here are\n// always called with the plugin instance as their `this` binding.\n//\n// init:: (config: Object, instance: EditorState) → T\n// Initialize the value of the field. `config` will be the object\n// passed to [`EditorState.create`](#state.EditorState^create). Note\n// that `instance` is a half-initialized state instance, and will\n// not have values for plugin fields initialized after this one.\n//\n// apply:: (tr: Transaction, value: T, oldState: EditorState, newState: EditorState) → T\n// Apply the given transaction to this state field, producing a new\n// field value. Note that the `newState` argument is again a partially\n// constructed state does not yet contain the state from plugins\n// coming after this one.\n//\n// toJSON:: ?(value: T) → *\n// Convert this field to JSON. Optional, can be left off to disable\n// JSON serialization for the field.\n//\n// fromJSON:: ?(config: Object, value: *, state: EditorState) → T\n// Deserialize the JSON representation of this field. Note that the\n// `state` argument is again a half-initialized state.\n\nvar keys = Object.create(null);\n\nfunction createKey(name) {\n if (name in keys) { return name + \"$\" + ++keys[name] }\n keys[name] = 0;\n return name + \"$\"\n}\n\n// ::- A key is used to [tag](#state.PluginSpec.key)\n// plugins in a way that makes it possible to find them, given an\n// editor state. Assigning a key does mean only one plugin of that\n// type can be active in a state.\nvar PluginKey = function PluginKey(name) {\nif ( name === void 0 ) name = \"key\";\n this.key = createKey(name); };\n\n// :: (EditorState) → ?Plugin\n// Get the active plugin with this key, if any, from an editor\n// state.\nPluginKey.prototype.get = function get (state) { return state.config.pluginsByKey[this.key] };\n\n// :: (EditorState) → ?any\n// Get the plugin's state from an editor state.\nPluginKey.prototype.getState = function getState (state) { return state[this.key] };\n\nexport { AllSelection, EditorState, NodeSelection, Plugin, PluginKey, Selection, SelectionRange, TextSelection, Transaction };\n//# sourceMappingURL=index.es.js.map\n","import { liftTarget, canJoin, joinPoint, canSplit, ReplaceAroundStep, findWrapping } from 'prosemirror-transform';\nimport { Fragment, Slice } from 'prosemirror-model';\nimport { NodeSelection, Selection, TextSelection, AllSelection } from 'prosemirror-state';\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Delete the selection, if there is one.\nfunction deleteSelection(state, dispatch) {\n if (state.selection.empty) { return false }\n if (dispatch) { dispatch(state.tr.deleteSelection().scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// If the selection is empty and at the start of a textblock, try to\n// reduce the distance between that block and the one before it—if\n// there's a block directly before it that can be joined, join them.\n// If not, try to move the selected block closer to the next one in\n// the document structure by lifting it out of its parent or moving it\n// into a parent of the previous block. Will use the view for accurate\n// (bidi-aware) start-of-textblock detection if given.\nfunction joinBackward(state, dispatch, view) {\n var ref = state.selection;\n var $cursor = ref.$cursor;\n if (!$cursor || (view ? !view.endOfTextblock(\"backward\", state)\n : $cursor.parentOffset > 0))\n { return false }\n\n var $cut = findCutBefore($cursor);\n\n // If there is no node before this, try to lift\n if (!$cut) {\n var range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null) { return false }\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n }\n\n var before = $cut.nodeBefore;\n // Apply the joining algorithm\n if (!before.type.spec.isolating && deleteBarrier(state, $cut, dispatch))\n { return true }\n\n // If the node below has no content and the node above is\n // selectable, delete the node below and select the one above.\n if ($cursor.parent.content.size == 0 &&\n (textblockAt(before, \"end\") || NodeSelection.isSelectable(before))) {\n if (dispatch) {\n var tr = state.tr.deleteRange($cursor.before(), $cursor.after());\n tr.setSelection(textblockAt(before, \"end\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos, -1)), -1)\n : NodeSelection.create(tr.doc, $cut.pos - before.nodeSize));\n dispatch(tr.scrollIntoView());\n }\n return true\n }\n\n // If the node before is an atom, delete it\n if (before.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch) { dispatch(state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView()); }\n return true\n }\n\n return false\n}\n\nfunction textblockAt(node, side) {\n for (; node; node = (side == \"start\" ? node.firstChild : node.lastChild))\n { if (node.isTextblock) { return true } }\n return false\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// When the selection is empty and at the start of a textblock, select\n// the node before that textblock, if possible. This is intended to be\n// bound to keys like backspace, after\n// [`joinBackward`](#commands.joinBackward) or other deleting\n// commands, as a fall-back behavior when the schema doesn't allow\n// deletion at the selected point.\nfunction selectNodeBackward(state, dispatch, view) {\n var ref = state.selection;\n var $head = ref.$head;\n var empty = ref.empty;\n var $cut = $head;\n if (!empty) { return false }\n\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"backward\", state) : $head.parentOffset > 0) { return false }\n $cut = findCutBefore($head);\n }\n var node = $cut && $cut.nodeBefore;\n if (!node || !NodeSelection.isSelectable(node)) { return false }\n if (dispatch)\n { dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView()); }\n return true\n}\n\nfunction findCutBefore($pos) {\n if (!$pos.parent.type.spec.isolating) { for (var i = $pos.depth - 1; i >= 0; i--) {\n if ($pos.index(i) > 0) { return $pos.doc.resolve($pos.before(i + 1)) }\n if ($pos.node(i).type.spec.isolating) { break }\n } }\n return null\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// If the selection is empty and the cursor is at the end of a\n// textblock, try to reduce or remove the boundary between that block\n// and the one after it, either by joining them or by moving the other\n// block closer to this one in the tree structure. Will use the view\n// for accurate start-of-textblock detection if given.\nfunction joinForward(state, dispatch, view) {\n var ref = state.selection;\n var $cursor = ref.$cursor;\n if (!$cursor || (view ? !view.endOfTextblock(\"forward\", state)\n : $cursor.parentOffset < $cursor.parent.content.size))\n { return false }\n\n var $cut = findCutAfter($cursor);\n\n // If there is no node after this, there's nothing to do\n if (!$cut) { return false }\n\n var after = $cut.nodeAfter;\n // Try the joining algorithm\n if (deleteBarrier(state, $cut, dispatch)) { return true }\n\n // If the node above has no content and the node below is\n // selectable, delete the node above and select the one below.\n if ($cursor.parent.content.size == 0 &&\n (textblockAt(after, \"start\") || NodeSelection.isSelectable(after))) {\n if (dispatch) {\n var tr = state.tr.deleteRange($cursor.before(), $cursor.after());\n tr.setSelection(textblockAt(after, \"start\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos)), 1)\n : NodeSelection.create(tr.doc, tr.mapping.map($cut.pos)));\n dispatch(tr.scrollIntoView());\n }\n return true\n }\n\n // If the next node is an atom, delete it\n if (after.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch) { dispatch(state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView()); }\n return true\n }\n\n return false\n}\n\n// :: (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// When the selection is empty and at the end of a textblock, select\n// the node coming after that textblock, if possible. This is intended\n// to be bound to keys like delete, after\n// [`joinForward`](#commands.joinForward) and similar deleting\n// commands, to provide a fall-back behavior when the schema doesn't\n// allow deletion at the selected point.\nfunction selectNodeForward(state, dispatch, view) {\n var ref = state.selection;\n var $head = ref.$head;\n var empty = ref.empty;\n var $cut = $head;\n if (!empty) { return false }\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"forward\", state) : $head.parentOffset < $head.parent.content.size)\n { return false }\n $cut = findCutAfter($head);\n }\n var node = $cut && $cut.nodeAfter;\n if (!node || !NodeSelection.isSelectable(node)) { return false }\n if (dispatch)\n { dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos)).scrollIntoView()); }\n return true\n}\n\nfunction findCutAfter($pos) {\n if (!$pos.parent.type.spec.isolating) { for (var i = $pos.depth - 1; i >= 0; i--) {\n var parent = $pos.node(i);\n if ($pos.index(i) + 1 < parent.childCount) { return $pos.doc.resolve($pos.after(i + 1)) }\n if (parent.type.spec.isolating) { break }\n } }\n return null\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Join the selected block or, if there is a text selection, the\n// closest ancestor block of the selection that can be joined, with\n// the sibling above it.\nfunction joinUp(state, dispatch) {\n var sel = state.selection, nodeSel = sel instanceof NodeSelection, point;\n if (nodeSel) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.from)) { return false }\n point = sel.from;\n } else {\n point = joinPoint(state.doc, sel.from, -1);\n if (point == null) { return false }\n }\n if (dispatch) {\n var tr = state.tr.join(point);\n if (nodeSel) { tr.setSelection(NodeSelection.create(tr.doc, point - state.doc.resolve(point).nodeBefore.nodeSize)); }\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Join the selected block, or the closest ancestor of the selection\n// that can be joined, with the sibling after it.\nfunction joinDown(state, dispatch) {\n var sel = state.selection, point;\n if (sel instanceof NodeSelection) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.to)) { return false }\n point = sel.to;\n } else {\n point = joinPoint(state.doc, sel.to, 1);\n if (point == null) { return false }\n }\n if (dispatch)\n { dispatch(state.tr.join(point).scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Lift the selected block, or the closest ancestor block of the\n// selection that can be lifted, out of its parent node.\nfunction lift(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to), target = range && liftTarget(range);\n if (target == null) { return false }\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// If the selection is in a node whose type has a truthy\n// [`code`](#model.NodeSpec.code) property in its spec, replace the\n// selection with a newline character.\nfunction newlineInCode(state, dispatch) {\n var ref = state.selection;\n var $head = ref.$head;\n var $anchor = ref.$anchor;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) { return false }\n if (dispatch) { dispatch(state.tr.insertText(\"\\n\").scrollIntoView()); }\n return true\n}\n\nfunction defaultBlockAt(match) {\n for (var i = 0; i < match.edgeCount; i++) {\n var ref = match.edge(i);\n var type = ref.type;\n if (type.isTextblock && !type.hasRequiredAttrs()) { return type }\n }\n return null\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// When the selection is in a node with a truthy\n// [`code`](#model.NodeSpec.code) property in its spec, create a\n// default block after the code block, and move the cursor there.\nfunction exitCode(state, dispatch) {\n var ref = state.selection;\n var $head = ref.$head;\n var $anchor = ref.$anchor;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) { return false }\n var above = $head.node(-1), after = $head.indexAfter(-1), type = defaultBlockAt(above.contentMatchAt(after));\n if (!above.canReplaceWith(after, after, type)) { return false }\n if (dispatch) {\n var pos = $head.after(), tr = state.tr.replaceWith(pos, pos, type.createAndFill());\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// If a block node is selected, create an empty paragraph before (if\n// it is its parent's first child) or after it.\nfunction createParagraphNear(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n if ($from.parent.inlineContent || $to.parent.inlineContent) { return false }\n var type = defaultBlockAt($from.parent.contentMatchAt($to.indexAfter()));\n if (!type || !type.isTextblock) { return false }\n if (dispatch) {\n var side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos;\n var tr = state.tr.insert(side, type.createAndFill());\n tr.setSelection(TextSelection.create(tr.doc, side + 1));\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// If the cursor is in an empty textblock that can be lifted, lift the\n// block.\nfunction liftEmptyBlock(state, dispatch) {\n var ref = state.selection;\n var $cursor = ref.$cursor;\n if (!$cursor || $cursor.parent.content.size) { return false }\n if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) {\n var before = $cursor.before();\n if (canSplit(state.doc, before)) {\n if (dispatch) { dispatch(state.tr.split(before).scrollIntoView()); }\n return true\n }\n }\n var range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null) { return false }\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Split the parent block of the selection. If the selection is a text\n// selection, also delete its content.\nfunction splitBlock(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n if (state.selection instanceof NodeSelection && state.selection.node.isBlock) {\n if (!$from.parentOffset || !canSplit(state.doc, $from.pos)) { return false }\n if (dispatch) { dispatch(state.tr.split($from.pos).scrollIntoView()); }\n return true\n }\n\n if (!$from.parent.isBlock) { return false }\n\n if (dispatch) {\n var atEnd = $to.parentOffset == $to.parent.content.size;\n var tr = state.tr;\n if (state.selection instanceof TextSelection) { tr.deleteSelection(); }\n var deflt = $from.depth == 0 ? null : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)));\n var types = atEnd && deflt ? [{type: deflt}] : null;\n var can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types);\n if (!types && !can && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt && [{type: deflt}])) {\n types = [{type: deflt}];\n can = true;\n }\n if (can) {\n tr.split(tr.mapping.map($from.pos), 1, types);\n if (!atEnd && !$from.parentOffset && $from.parent.type != deflt &&\n $from.node(-1).canReplace($from.index(-1), $from.indexAfter(-1), Fragment.from([deflt.create(), $from.parent])))\n { tr.setNodeMarkup(tr.mapping.map($from.before()), deflt); }\n }\n dispatch(tr.scrollIntoView());\n }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Acts like [`splitBlock`](#commands.splitBlock), but without\n// resetting the set of active marks at the cursor.\nfunction splitBlockKeepMarks(state, dispatch) {\n return splitBlock(state, dispatch && (function (tr) {\n var marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n if (marks) { tr.ensureMarks(marks); }\n dispatch(tr);\n }))\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Move the selection to the node wrapping the current selection, if\n// any. (Will not select the document node.)\nfunction selectParentNode(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var to = ref.to;\n var pos;\n var same = $from.sharedDepth(to);\n if (same == 0) { return false }\n pos = $from.before(same);\n if (dispatch) { dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos))); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// Select the whole document.\nfunction selectAll(state, dispatch) {\n if (dispatch) { dispatch(state.tr.setSelection(new AllSelection(state.doc))); }\n return true\n}\n\nfunction joinMaybeClear(state, $pos, dispatch) {\n var before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index();\n if (!before || !after || !before.type.compatibleContent(after.type)) { return false }\n if (!before.content.size && $pos.parent.canReplace(index - 1, index)) {\n if (dispatch) { dispatch(state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView()); }\n return true\n }\n if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || canJoin(state.doc, $pos.pos)))\n { return false }\n if (dispatch)\n { dispatch(state.tr\n .clearIncompatible($pos.pos, before.type, before.contentMatchAt(before.childCount))\n .join($pos.pos)\n .scrollIntoView()); }\n return true\n}\n\nfunction deleteBarrier(state, $cut, dispatch) {\n var before = $cut.nodeBefore, after = $cut.nodeAfter, conn, match;\n if (before.type.spec.isolating || after.type.spec.isolating) { return false }\n if (joinMaybeClear(state, $cut, dispatch)) { return true }\n\n var canDelAfter = $cut.parent.canReplace($cut.index(), $cut.index() + 1);\n if (canDelAfter &&\n (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) &&\n match.matchType(conn[0] || after.type).validEnd) {\n if (dispatch) {\n var end = $cut.pos + after.nodeSize, wrap = Fragment.empty;\n for (var i = conn.length - 1; i >= 0; i--)\n { wrap = Fragment.from(conn[i].create(null, wrap)); }\n wrap = Fragment.from(before.copy(wrap));\n var tr = state.tr.step(new ReplaceAroundStep($cut.pos - 1, end, $cut.pos, end, new Slice(wrap, 1, 0), conn.length, true));\n var joinAt = end + 2 * conn.length;\n if (canJoin(tr.doc, joinAt)) { tr.join(joinAt); }\n dispatch(tr.scrollIntoView());\n }\n return true\n }\n\n var selAfter = Selection.findFrom($cut, 1);\n var range = selAfter && selAfter.$from.blockRange(selAfter.$to), target = range && liftTarget(range);\n if (target != null && target >= $cut.depth) {\n if (dispatch) { dispatch(state.tr.lift(range, target).scrollIntoView()); }\n return true\n }\n\n if (canDelAfter && after.isTextblock && textblockAt(before, \"end\")) {\n var at = before, wrap$1 = [];\n for (;;) {\n wrap$1.push(at);\n if (at.isTextblock) { break }\n at = at.lastChild;\n }\n if (at.canReplace(at.childCount, at.childCount, after.content)) {\n if (dispatch) {\n var end$1 = Fragment.empty;\n for (var i$1 = wrap$1.length - 1; i$1 >= 0; i$1--) { end$1 = Fragment.from(wrap$1[i$1].copy(end$1)); }\n var tr$1 = state.tr.step(new ReplaceAroundStep($cut.pos - wrap$1.length, $cut.pos + after.nodeSize,\n $cut.pos + 1, $cut.pos + after.nodeSize - 1,\n new Slice(end$1, wrap$1.length, 0), 0, true));\n dispatch(tr$1.scrollIntoView());\n }\n return true\n }\n }\n\n return false\n}\n\n// Parameterized commands\n\n// :: (NodeType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Wrap the selection in a node of the given type with the given\n// attributes.\nfunction wrapIn(nodeType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to), wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping) { return false }\n if (dispatch) { dispatch(state.tr.wrap(range, wrapping).scrollIntoView()); }\n return true\n }\n}\n\n// :: (NodeType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Returns a command that tries to set the selected textblocks to the\n// given node type with the given attributes.\nfunction setBlockType(nodeType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var from = ref.from;\n var to = ref.to;\n var applicable = false;\n state.doc.nodesBetween(from, to, function (node, pos) {\n if (applicable) { return false }\n if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) { return }\n if (node.type == nodeType) {\n applicable = true;\n } else {\n var $pos = state.doc.resolve(pos), index = $pos.index();\n applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n }\n });\n if (!applicable) { return false }\n if (dispatch) { dispatch(state.tr.setBlockType(from, to, nodeType, attrs).scrollIntoView()); }\n return true\n }\n}\n\nfunction markApplies(doc, ranges, type) {\n var loop = function ( i ) {\n var ref = ranges[i];\n var $from = ref.$from;\n var $to = ref.$to;\n var can = $from.depth == 0 ? doc.type.allowsMarkType(type) : false;\n doc.nodesBetween($from.pos, $to.pos, function (node) {\n if (can) { return false }\n can = node.inlineContent && node.type.allowsMarkType(type);\n });\n if (can) { return { v: true } }\n };\n\n for (var i = 0; i < ranges.length; i++) {\n var returned = loop( i );\n\n if ( returned ) return returned.v;\n }\n return false\n}\n\n// :: (MarkType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Create a command function that toggles the given mark with the\n// given attributes. Will return `false` when the current selection\n// doesn't support that mark. This will remove the mark if any marks\n// of that type exist in the selection, or add it otherwise. If the\n// selection is empty, this applies to the [stored\n// marks](#state.EditorState.storedMarks) instead of a range of the\n// document.\nfunction toggleMark(markType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var empty = ref.empty;\n var $cursor = ref.$cursor;\n var ranges = ref.ranges;\n if ((empty && !$cursor) || !markApplies(state.doc, ranges, markType)) { return false }\n if (dispatch) {\n if ($cursor) {\n if (markType.isInSet(state.storedMarks || $cursor.marks()))\n { dispatch(state.tr.removeStoredMark(markType)); }\n else\n { dispatch(state.tr.addStoredMark(markType.create(attrs))); }\n } else {\n var has = false, tr = state.tr;\n for (var i = 0; !has && i < ranges.length; i++) {\n var ref$1 = ranges[i];\n var $from = ref$1.$from;\n var $to = ref$1.$to;\n has = state.doc.rangeHasMark($from.pos, $to.pos, markType);\n }\n for (var i$1 = 0; i$1 < ranges.length; i$1++) {\n var ref$2 = ranges[i$1];\n var $from$1 = ref$2.$from;\n var $to$1 = ref$2.$to;\n if (has) {\n tr.removeMark($from$1.pos, $to$1.pos, markType);\n } else {\n var from = $from$1.pos, to = $to$1.pos, start = $from$1.nodeAfter, end = $to$1.nodeBefore;\n var spaceStart = start && start.isText ? /^\\s*/.exec(start.text)[0].length : 0;\n var spaceEnd = end && end.isText ? /\\s*$/.exec(end.text)[0].length : 0;\n if (from + spaceStart < to) { from += spaceStart; to -= spaceEnd; }\n tr.addMark(from, to, markType.create(attrs));\n }\n }\n dispatch(tr.scrollIntoView());\n }\n }\n return true\n }\n}\n\nfunction wrapDispatchForJoin(dispatch, isJoinable) {\n return function (tr) {\n if (!tr.isGeneric) { return dispatch(tr) }\n\n var ranges = [];\n for (var i = 0; i < tr.mapping.maps.length; i++) {\n var map = tr.mapping.maps[i];\n for (var j = 0; j < ranges.length; j++)\n { ranges[j] = map.map(ranges[j]); }\n map.forEach(function (_s, _e, from, to) { return ranges.push(from, to); });\n }\n\n // Figure out which joinable points exist inside those ranges,\n // by checking all node boundaries in their parent nodes.\n var joinable = [];\n for (var i$1 = 0; i$1 < ranges.length; i$1 += 2) {\n var from = ranges[i$1], to = ranges[i$1 + 1];\n var $from = tr.doc.resolve(from), depth = $from.sharedDepth(to), parent = $from.node(depth);\n for (var index = $from.indexAfter(depth), pos = $from.after(depth + 1); pos <= to; ++index) {\n var after = parent.maybeChild(index);\n if (!after) { break }\n if (index && joinable.indexOf(pos) == -1) {\n var before = parent.child(index - 1);\n if (before.type == after.type && isJoinable(before, after))\n { joinable.push(pos); }\n }\n pos += after.nodeSize;\n }\n }\n // Join the joinable points\n joinable.sort(function (a, b) { return a - b; });\n for (var i$2 = joinable.length - 1; i$2 >= 0; i$2--) {\n if (canJoin(tr.doc, joinable[i$2])) { tr.join(joinable[i$2]); }\n }\n dispatch(tr);\n }\n}\n\n// :: ((state: EditorState, ?(tr: Transaction)) → bool, union<(before: Node, after: Node) → bool, [string]>) → (state: EditorState, ?(tr: Transaction)) → bool\n// Wrap a command so that, when it produces a transform that causes\n// two joinable nodes to end up next to each other, those are joined.\n// Nodes are considered joinable when they are of the same type and\n// when the `isJoinable` predicate returns true for them or, if an\n// array of strings was passed, if their node type name is in that\n// array.\nfunction autoJoin(command, isJoinable) {\n if (Array.isArray(isJoinable)) {\n var types = isJoinable;\n isJoinable = function (node) { return types.indexOf(node.type.name) > -1; };\n }\n return function (state, dispatch) { return command(state, dispatch && wrapDispatchForJoin(dispatch, isJoinable)); }\n}\n\n// :: (...[(EditorState, ?(tr: Transaction), ?EditorView) → bool]) → (EditorState, ?(tr: Transaction), ?EditorView) → bool\n// Combine a number of command functions into a single function (which\n// calls them one by one until one returns true).\nfunction chainCommands() {\n var commands = [], len = arguments.length;\n while ( len-- ) commands[ len ] = arguments[ len ];\n\n return function(state, dispatch, view) {\n for (var i = 0; i < commands.length; i++)\n { if (commands[i](state, dispatch, view)) { return true } }\n return false\n }\n}\n\nvar backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward);\nvar del = chainCommands(deleteSelection, joinForward, selectNodeForward);\n\n// :: Object\n// A basic keymap containing bindings not specific to any schema.\n// Binds the following keys (when multiple commands are listed, they\n// are chained with [`chainCommands`](#commands.chainCommands)):\n//\n// * **Enter** to `newlineInCode`, `createParagraphNear`, `liftEmptyBlock`, `splitBlock`\n// * **Mod-Enter** to `exitCode`\n// * **Backspace** and **Mod-Backspace** to `deleteSelection`, `joinBackward`, `selectNodeBackward`\n// * **Delete** and **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n// * **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n// * **Mod-a** to `selectAll`\nvar pcBaseKeymap = {\n \"Enter\": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock),\n \"Mod-Enter\": exitCode,\n \"Backspace\": backspace,\n \"Mod-Backspace\": backspace,\n \"Delete\": del,\n \"Mod-Delete\": del,\n \"Mod-a\": selectAll\n};\n\n// :: Object\n// A copy of `pcBaseKeymap` that also binds **Ctrl-h** like Backspace,\n// **Ctrl-d** like Delete, **Alt-Backspace** like Ctrl-Backspace, and\n// **Ctrl-Alt-Backspace**, **Alt-Delete**, and **Alt-d** like\n// Ctrl-Delete.\nvar macBaseKeymap = {\n \"Ctrl-h\": pcBaseKeymap[\"Backspace\"],\n \"Alt-Backspace\": pcBaseKeymap[\"Mod-Backspace\"],\n \"Ctrl-d\": pcBaseKeymap[\"Delete\"],\n \"Ctrl-Alt-Backspace\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-Delete\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-d\": pcBaseKeymap[\"Mod-Delete\"]\n};\nfor (var key in pcBaseKeymap) { macBaseKeymap[key] = pcBaseKeymap[key]; }\n\n// declare global: os, navigator\nvar mac = typeof navigator != \"undefined\" ? /Mac/.test(navigator.platform)\n : typeof os != \"undefined\" ? os.platform() == \"darwin\" : false;\n\n// :: Object\n// Depending on the detected platform, this will hold\n// [`pcBasekeymap`](#commands.pcBaseKeymap) or\n// [`macBaseKeymap`](#commands.macBaseKeymap).\nvar baseKeymap = mac ? macBaseKeymap : pcBaseKeymap;\n\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, setBlockType, splitBlock, splitBlockKeepMarks, toggleMark, wrapIn };\n//# sourceMappingURL=index.es.js.map\n","\n /*!\n * tiptap-commands v1.17.0\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { setBlockType, lift, wrapIn } from 'prosemirror-commands';\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, setBlockType, splitBlock, splitBlockKeepMarks, toggleMark, wrapIn } from 'prosemirror-commands';\nimport { liftListItem, wrapInList } from 'prosemirror-schema-list';\nexport { addListNodes, liftListItem, sinkListItem, splitListItem, wrapInList } from 'prosemirror-schema-list';\nimport { InputRule } from 'prosemirror-inputrules';\nexport { textblockTypeInputRule, wrappingInputRule } from 'prosemirror-inputrules';\nimport { Plugin } from 'prosemirror-state';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { getMarkRange, nodeIsActive, findParentNode } from 'tiptap-utils';\n\nfunction insertText (text = '') {\n return (state, dispatch) => {\n const {\n $from\n } = state.selection;\n const {\n pos\n } = $from.pos;\n dispatch(state.tr.insertText(text, pos));\n return true;\n };\n}\n\nfunction getMarksBetween(start, end, state) {\n let marks = [];\n state.doc.nodesBetween(start, end, (node, pos) => {\n marks = [...marks, ...node.marks.map(mark => ({\n start: pos,\n end: pos + node.nodeSize,\n mark\n }))];\n });\n return marks;\n}\n\nfunction markInputRule (regexp, markType, getAttrs) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {\n tr\n } = state;\n const m = match.length - 1;\n let markEnd = end;\n let markStart = start;\n\n if (match[m]) {\n const matchStart = start + match[0].indexOf(match[m - 1]);\n const matchEnd = matchStart + match[m - 1].length - 1;\n const textStart = matchStart + match[m - 1].lastIndexOf(match[m]);\n const textEnd = textStart + match[m].length;\n const excludedMarks = getMarksBetween(start, end, state).filter(item => {\n const {\n excluded\n } = item.mark.type;\n return excluded.find(type => type.name === markType.name);\n }).filter(item => item.end > matchStart);\n\n if (excludedMarks.length) {\n return false;\n }\n\n if (textEnd < matchEnd) {\n tr.delete(textEnd, matchEnd);\n }\n\n if (textStart > matchStart) {\n tr.delete(matchStart, textStart);\n }\n\n markStart = matchStart;\n markEnd = markStart + match[m].length;\n }\n\n tr.addMark(markStart, markEnd, markType.create(attrs));\n tr.removeStoredMark(markType);\n return tr;\n });\n}\n\nfunction nodeInputRule (regexp, type, getAttrs) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {\n tr\n } = state;\n\n if (match[0]) {\n tr.replaceWith(start - 1, end, type.create(attrs));\n }\n\n return tr;\n });\n}\n\nfunction pasteRule (regexp, type, getAttrs) {\n const handler = fragment => {\n const nodes = [];\n fragment.forEach(child => {\n if (child.isText) {\n const {\n text\n } = child;\n let pos = 0;\n let match;\n\n do {\n match = regexp.exec(text);\n\n if (match) {\n const start = match.index;\n const end = start + match[0].length;\n const attrs = getAttrs instanceof Function ? getAttrs(match[0]) : getAttrs;\n\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n }\n\n nodes.push(child.cut(start, end).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } while (match);\n\n if (pos < text.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content)));\n }\n });\n return Fragment.fromArray(nodes);\n };\n\n return new Plugin({\n props: {\n transformPasted: slice => new Slice(handler(slice.content), slice.openStart, slice.openEnd)\n }\n });\n}\n\nfunction markPasteRule (regexp, type, getAttrs) {\n const handler = (fragment, parent) => {\n const nodes = [];\n fragment.forEach(child => {\n if (child.isText) {\n const {\n text,\n marks\n } = child;\n let pos = 0;\n let match;\n const isLink = !!marks.filter(x => x.type.name === 'link')[0]; // eslint-disable-next-line\n\n while (!isLink && (match = regexp.exec(text)) !== null) {\n if (parent && parent.type.allowsMarkType(type) && match[1]) {\n const start = match.index;\n const end = start + match[0].length;\n const textStart = start + match[0].indexOf(match[1]);\n const textEnd = textStart + match[1].length;\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs; // adding text before markdown to nodes\n\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n } // adding the markdown part to nodes\n\n\n nodes.push(child.cut(textStart, textEnd).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } // adding rest of text to nodes\n\n\n if (pos < text.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content, child)));\n }\n });\n return Fragment.fromArray(nodes);\n };\n\n return new Plugin({\n props: {\n transformPasted: slice => new Slice(handler(slice.content), slice.openStart, slice.openEnd)\n }\n });\n}\n\nfunction removeMark (type) {\n return (state, dispatch) => {\n const {\n tr,\n selection\n } = state;\n let {\n from,\n to\n } = selection;\n const {\n $from,\n empty\n } = selection;\n\n if (empty) {\n const range = getMarkRange($from, type);\n from = range.from;\n to = range.to;\n }\n\n tr.removeMark(from, to, type);\n return dispatch(tr);\n };\n}\n\nfunction replaceText (range = null, type, attrs = {}, fragment = Fragment.empty) {\n return (state, dispatch) => {\n const {\n $from,\n $to\n } = state.selection;\n const index = $from.index();\n const from = range ? range.from : $from.pos;\n const to = range ? range.to : $to.pos;\n\n if (!$from.parent.canReplaceWith(index, index, type)) {\n return false;\n }\n\n if (dispatch) {\n dispatch(state.tr.replaceWith(from, to, type.create(attrs, fragment)));\n }\n\n return true;\n };\n}\n\nfunction setInlineBlockType (type, attrs = {}) {\n return (state, dispatch) => {\n const {\n $from\n } = state.selection;\n const index = $from.index();\n\n if (!$from.parent.canReplaceWith(index, index, type)) {\n return false;\n }\n\n if (dispatch) {\n dispatch(state.tr.replaceSelectionWith(type.create(attrs)));\n }\n\n return true;\n };\n}\n\n// see https://github.com/ProseMirror/prosemirror-transform/blob/main/src/structure.js\n// Since this piece of code was \"borrowed\" from prosemirror, ESLint rules are ignored.\n\n/* eslint-disable max-len, no-plusplus, no-undef, eqeqeq */\n\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n const $pos = doc.resolve(pos);\n const base = $pos.depth - depth;\n const innerType = typesAfter && typesAfter[typesAfter.length - 1] || $pos.parent;\n if (base < 0 || $pos.parent.type.spec.isolating || !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) || !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount))) return false;\n\n for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n const node = $pos.node(d);\n const index = $pos.index(d);\n if (node.type.spec.isolating) return false;\n let rest = node.content.cutByIndex(index, node.childCount);\n const after = typesAfter && typesAfter[i] || node;\n if (after != node) rest = rest.replaceChild(0, after.type.create(after.attrs));\n /* Change starts from here */\n // if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n // return false\n\n if (!node.canReplace(index + 1, node.childCount)) return false;\n /* Change ends here */\n }\n\n const index = $pos.indexAfter(base);\n const baseType = typesAfter && typesAfter[0];\n return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n} // this is a copy of splitListItem\n// see https://github.com/ProseMirror/prosemirror-schema-list/blob/main/src/schema-list.js\n\n\nfunction splitToDefaultListItem(itemType) {\n return function (state, dispatch) {\n const {\n $from,\n $to,\n node\n } = state.selection;\n if (node && node.isBlock || $from.depth < 2 || !$from.sameParent($to)) return false;\n const grandParent = $from.node(-1);\n if (grandParent.type != itemType) return false;\n\n if ($from.parent.content.size == 0) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if ($from.depth == 2 || $from.node(-3).type != itemType || $from.index(-2) != $from.node(-2).childCount - 1) return false;\n\n if (dispatch) {\n let wrap = Fragment.empty;\n const keepItem = $from.index(-1) > 0; // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n\n for (let d = $from.depth - (keepItem ? 1 : 2); d >= $from.depth - 3; d--) wrap = Fragment.from($from.node(d).copy(wrap)); // Add a second list item with an empty default start node\n\n\n wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n const tr = state.tr.replace($from.before(keepItem ? null : -1), $from.after(-3), new Slice(wrap, keepItem ? 3 : 2, 2));\n tr.setSelection(state.selection.constructor.near(tr.doc.resolve($from.pos + (keepItem ? 3 : 2))));\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n }\n\n const nextType = $to.pos == $from.end() ? grandParent.contentMatchAt($from.indexAfter(-1)).defaultType : null;\n const tr = state.tr.delete($from.pos, $to.pos);\n /* Change starts from here */\n // let types = nextType && [null, {type: nextType}]\n\n let types = nextType && [{\n type: itemType\n }, {\n type: nextType\n }];\n if (!types) types = [{\n type: itemType\n }, null];\n /* Change ends here */\n\n if (!canSplit(tr.doc, $from.pos, 2, types)) return false;\n if (dispatch) dispatch(tr.split($from.pos, 2, types).scrollIntoView());\n return true;\n };\n}\n/* eslint-enable max-len, no-plusplus, no-undef, eqeqeq */\n\nfunction toggleBlockType (type, toggletype, attrs = {}) {\n return (state, dispatch, view) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return setBlockType(toggletype)(state, dispatch, view);\n }\n\n return setBlockType(type, attrs)(state, dispatch, view);\n };\n}\n\nfunction isList(node, schema) {\n return node.type === schema.nodes.bullet_list || node.type === schema.nodes.ordered_list || node.type === schema.nodes.todo_list;\n}\n\nfunction toggleList(listType, itemType) {\n return (state, dispatch, view) => {\n const {\n schema,\n selection\n } = state;\n const {\n $from,\n $to\n } = selection;\n const range = $from.blockRange($to);\n\n if (!range) {\n return false;\n }\n\n const parentList = findParentNode(node => isList(node, schema))(selection);\n\n if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n if (parentList.node.type === listType) {\n return liftListItem(itemType)(state, dispatch, view);\n }\n\n if (isList(parentList.node, schema) && listType.validContent(parentList.node.content)) {\n const {\n tr\n } = state;\n tr.setNodeMarkup(parentList.pos, listType);\n\n if (dispatch) {\n dispatch(tr);\n }\n\n return false;\n }\n }\n\n return wrapInList(listType)(state, dispatch, view);\n };\n}\n\nfunction toggleWrap (type, attrs = {}) {\n return (state, dispatch, view) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return lift(state, dispatch);\n }\n\n return wrapIn(type, attrs)(state, dispatch, view);\n };\n}\n\nfunction updateMark (type, attrs) {\n return (state, dispatch) => {\n const {\n tr,\n selection,\n doc\n } = state;\n const {\n ranges,\n empty\n } = selection;\n\n if (empty) {\n const {\n from,\n to\n } = getMarkRange(selection.$from, type);\n\n if (doc.rangeHasMark(from, to, type)) {\n tr.removeMark(from, to, type);\n }\n\n tr.addMark(from, to, type.create(attrs));\n } else {\n ranges.forEach(ref$1 => {\n const {\n $to,\n $from\n } = ref$1;\n\n if (doc.rangeHasMark($from.pos, $to.pos, type)) {\n tr.removeMark($from.pos, $to.pos, type);\n }\n\n tr.addMark($from.pos, $to.pos, type.create(attrs));\n });\n }\n\n return dispatch(tr);\n };\n}\n\nexport { insertText, markInputRule, markPasteRule, nodeInputRule, pasteRule, removeMark, replaceText, setInlineBlockType, splitToDefaultListItem, toggleBlockType, toggleList, toggleWrap, updateMark };\n","import { ReplaceError, Slice, Fragment, MarkType } from 'prosemirror-model';\n\n// Mappable:: interface\n// There are several things that positions can be mapped through.\n// Such objects conform to this interface.\n//\n// map:: (pos: number, assoc: ?number) → number\n// Map a position through this object. When given, `assoc` (should\n// be -1 or 1, defaults to 1) determines with which side the\n// position is associated, which determines in which direction to\n// move when a chunk of content is inserted at the mapped position.\n//\n// mapResult:: (pos: number, assoc: ?number) → MapResult\n// Map a position, and return an object containing additional\n// information about the mapping. The result's `deleted` field tells\n// you whether the position was deleted (completely enclosed in a\n// replaced range) during the mapping. When content on only one side\n// is deleted, the position itself is only considered deleted when\n// `assoc` points in the direction of the deleted content.\n\n// Recovery values encode a range index and an offset. They are\n// represented as numbers, because tons of them will be created when\n// mapping, for example, a large number of decorations. The number's\n// lower 16 bits provide the index, the remaining bits the offset.\n//\n// Note: We intentionally don't use bit shift operators to en- and\n// decode these, since those clip to 32 bits, which we might in rare\n// cases want to overflow. A 64-bit float can represent 48-bit\n// integers precisely.\n\nvar lower16 = 0xffff;\nvar factor16 = Math.pow(2, 16);\n\nfunction makeRecover(index, offset) { return index + offset * factor16 }\nfunction recoverIndex(value) { return value & lower16 }\nfunction recoverOffset(value) { return (value - (value & lower16)) / factor16 }\n\n// ::- An object representing a mapped position with extra\n// information.\nvar MapResult = function MapResult(pos, deleted, recover) {\n if ( deleted === void 0 ) deleted = false;\n if ( recover === void 0 ) recover = null;\n\n // :: number The mapped version of the position.\n this.pos = pos;\n // :: bool Tells you whether the position was deleted, that is,\n // whether the step removed its surroundings from the document.\n this.deleted = deleted;\n this.recover = recover;\n};\n\n// :: class extends Mappable\n// A map describing the deletions and insertions made by a step, which\n// can be used to find the correspondence between positions in the\n// pre-step version of a document and the same position in the\n// post-step version.\nvar StepMap = function StepMap(ranges, inverted) {\n if ( inverted === void 0 ) inverted = false;\n\n this.ranges = ranges;\n this.inverted = inverted;\n};\n\nStepMap.prototype.recover = function recover (value) {\n var diff = 0, index = recoverIndex(value);\n if (!this.inverted) { for (var i = 0; i < index; i++)\n { diff += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1]; } }\n return this.ranges[index * 3] + diff + recoverOffset(value)\n};\n\n// : (number, ?number) → MapResult\nStepMap.prototype.mapResult = function mapResult (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n return this._map(pos, assoc, false) };\n\n// : (number, ?number) → number\nStepMap.prototype.map = function map (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n return this._map(pos, assoc, true) };\n\nStepMap.prototype._map = function _map (pos, assoc, simple) {\n var diff = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (var i = 0; i < this.ranges.length; i += 3) {\n var start = this.ranges[i] - (this.inverted ? diff : 0);\n if (start > pos) { break }\n var oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end = start + oldSize;\n if (pos <= end) {\n var side = !oldSize ? assoc : pos == start ? -1 : pos == end ? 1 : assoc;\n var result = start + diff + (side < 0 ? 0 : newSize);\n if (simple) { return result }\n var recover = pos == (assoc < 0 ? start : end) ? null : makeRecover(i / 3, pos - start);\n return new MapResult(result, assoc < 0 ? pos != start : pos != end, recover)\n }\n diff += newSize - oldSize;\n }\n return simple ? pos + diff : new MapResult(pos + diff)\n};\n\nStepMap.prototype.touches = function touches (pos, recover) {\n var diff = 0, index = recoverIndex(recover);\n var oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (var i = 0; i < this.ranges.length; i += 3) {\n var start = this.ranges[i] - (this.inverted ? diff : 0);\n if (start > pos) { break }\n var oldSize = this.ranges[i + oldIndex], end = start + oldSize;\n if (pos <= end && i == index * 3) { return true }\n diff += this.ranges[i + newIndex] - oldSize;\n }\n return false\n};\n\n// :: ((oldStart: number, oldEnd: number, newStart: number, newEnd: number))\n// Calls the given function on each of the changed ranges included in\n// this map.\nStepMap.prototype.forEach = function forEach (f) {\n var oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (var i = 0, diff = 0; i < this.ranges.length; i += 3) {\n var start = this.ranges[i], oldStart = start - (this.inverted ? diff : 0), newStart = start + (this.inverted ? 0 : diff);\n var oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex];\n f(oldStart, oldStart + oldSize, newStart, newStart + newSize);\n diff += newSize - oldSize;\n }\n};\n\n// :: () → StepMap\n// Create an inverted version of this map. The result can be used to\n// map positions in the post-step document to the pre-step document.\nStepMap.prototype.invert = function invert () {\n return new StepMap(this.ranges, !this.inverted)\n};\n\nStepMap.prototype.toString = function toString () {\n return (this.inverted ? \"-\" : \"\") + JSON.stringify(this.ranges)\n};\n\n// :: (n: number) → StepMap\n// Create a map that moves all positions by offset `n` (which may be\n// negative). This can be useful when applying steps meant for a\n// sub-document to a larger document, or vice-versa.\nStepMap.offset = function offset (n) {\n return n == 0 ? StepMap.empty : new StepMap(n < 0 ? [0, -n, 0] : [0, 0, n])\n};\n\nStepMap.empty = new StepMap([]);\n\n// :: class extends Mappable\n// A mapping represents a pipeline of zero or more [step\n// maps](#transform.StepMap). It has special provisions for losslessly\n// handling mapping positions through a series of steps in which some\n// steps are inverted versions of earlier steps. (This comes up when\n// ‘[rebasing](/docs/guide/#transform.rebasing)’ steps for\n// collaboration or history management.)\nvar Mapping = function Mapping(maps, mirror, from, to) {\n // :: [StepMap]\n // The step maps in this mapping.\n this.maps = maps || [];\n // :: number\n // The starting position in the `maps` array, used when `map` or\n // `mapResult` is called.\n this.from = from || 0;\n // :: number\n // The end position in the `maps` array.\n this.to = to == null ? this.maps.length : to;\n this.mirror = mirror;\n};\n\n// :: (?number, ?number) → Mapping\n// Create a mapping that maps only through a part of this one.\nMapping.prototype.slice = function slice (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.maps.length;\n\n return new Mapping(this.maps, this.mirror, from, to)\n};\n\nMapping.prototype.copy = function copy () {\n return new Mapping(this.maps.slice(), this.mirror && this.mirror.slice(), this.from, this.to)\n};\n\n// :: (StepMap, ?number)\n// Add a step map to the end of this mapping. If `mirrors` is\n// given, it should be the index of the step map that is the mirror\n// image of this one.\nMapping.prototype.appendMap = function appendMap (map, mirrors) {\n this.to = this.maps.push(map);\n if (mirrors != null) { this.setMirror(this.maps.length - 1, mirrors); }\n};\n\n// :: (Mapping)\n// Add all the step maps in a given mapping to this one (preserving\n// mirroring information).\nMapping.prototype.appendMapping = function appendMapping (mapping) {\n for (var i = 0, startSize = this.maps.length; i < mapping.maps.length; i++) {\n var mirr = mapping.getMirror(i);\n this.appendMap(mapping.maps[i], mirr != null && mirr < i ? startSize + mirr : null);\n }\n};\n\n// :: (number) → ?number\n// Finds the offset of the step map that mirrors the map at the\n// given offset, in this mapping (as per the second argument to\n// `appendMap`).\nMapping.prototype.getMirror = function getMirror (n) {\n if (this.mirror) { for (var i = 0; i < this.mirror.length; i++)\n { if (this.mirror[i] == n) { return this.mirror[i + (i % 2 ? -1 : 1)] } } }\n};\n\nMapping.prototype.setMirror = function setMirror (n, m) {\n if (!this.mirror) { this.mirror = []; }\n this.mirror.push(n, m);\n};\n\n// :: (Mapping)\n// Append the inverse of the given mapping to this one.\nMapping.prototype.appendMappingInverted = function appendMappingInverted (mapping) {\n for (var i = mapping.maps.length - 1, totalSize = this.maps.length + mapping.maps.length; i >= 0; i--) {\n var mirr = mapping.getMirror(i);\n this.appendMap(mapping.maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : null);\n }\n};\n\n// :: () → Mapping\n// Create an inverted version of this mapping.\nMapping.prototype.invert = function invert () {\n var inverse = new Mapping;\n inverse.appendMappingInverted(this);\n return inverse\n};\n\n// : (number, ?number) → number\n// Map a position through this mapping.\nMapping.prototype.map = function map (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n\n if (this.mirror) { return this._map(pos, assoc, true) }\n for (var i = this.from; i < this.to; i++)\n { pos = this.maps[i].map(pos, assoc); }\n return pos\n};\n\n// : (number, ?number) → MapResult\n// Map a position through this mapping, returning a mapping\n// result.\nMapping.prototype.mapResult = function mapResult (pos, assoc) {\n if ( assoc === void 0 ) assoc = 1;\n return this._map(pos, assoc, false) };\n\nMapping.prototype._map = function _map (pos, assoc, simple) {\n var deleted = false;\n\n for (var i = this.from; i < this.to; i++) {\n var map = this.maps[i], result = map.mapResult(pos, assoc);\n if (result.recover != null) {\n var corr = this.getMirror(i);\n if (corr != null && corr > i && corr < this.to) {\n i = corr;\n pos = this.maps[corr].recover(result.recover);\n continue\n }\n }\n\n if (result.deleted) { deleted = true; }\n pos = result.pos;\n }\n\n return simple ? pos : new MapResult(pos, deleted)\n};\n\nfunction TransformError(message) {\n var err = Error.call(this, message);\n err.__proto__ = TransformError.prototype;\n return err\n}\n\nTransformError.prototype = Object.create(Error.prototype);\nTransformError.prototype.constructor = TransformError;\nTransformError.prototype.name = \"TransformError\";\n\n// ::- Abstraction to build up and track an array of\n// [steps](#transform.Step) representing a document transformation.\n//\n// Most transforming methods return the `Transform` object itself, so\n// that they can be chained.\nvar Transform = function Transform(doc) {\n // :: Node\n // The current document (the result of applying the steps in the\n // transform).\n this.doc = doc;\n // :: [Step]\n // The steps in this transform.\n this.steps = [];\n // :: [Node]\n // The documents before each of the steps.\n this.docs = [];\n // :: Mapping\n // A mapping with the maps for each of the steps in this transform.\n this.mapping = new Mapping;\n};\n\nvar prototypeAccessors = { before: { configurable: true },docChanged: { configurable: true } };\n\n// :: Node The starting document.\nprototypeAccessors.before.get = function () { return this.docs.length ? this.docs[0] : this.doc };\n\n// :: (step: Step) → this\n// Apply a new step in this transform, saving the result. Throws an\n// error when the step fails.\nTransform.prototype.step = function step (object) {\n var result = this.maybeStep(object);\n if (result.failed) { throw new TransformError(result.failed) }\n return this\n};\n\n// :: (Step) → StepResult\n// Try to apply a step in this transformation, ignoring it if it\n// fails. Returns the step result.\nTransform.prototype.maybeStep = function maybeStep (step) {\n var result = step.apply(this.doc);\n if (!result.failed) { this.addStep(step, result.doc); }\n return result\n};\n\n// :: bool\n// True when the document has been changed (when there are any\n// steps).\nprototypeAccessors.docChanged.get = function () {\n return this.steps.length > 0\n};\n\nTransform.prototype.addStep = function addStep (step, doc) {\n this.docs.push(this.doc);\n this.steps.push(step);\n this.mapping.appendMap(step.getMap());\n this.doc = doc;\n};\n\nObject.defineProperties( Transform.prototype, prototypeAccessors );\n\nfunction mustOverride() { throw new Error(\"Override me\") }\n\nvar stepsByID = Object.create(null);\n\n// ::- A step object represents an atomic change. It generally applies\n// only to the document it was created for, since the positions\n// stored in it will only make sense for that document.\n//\n// New steps are defined by creating classes that extend `Step`,\n// overriding the `apply`, `invert`, `map`, `getMap` and `fromJSON`\n// methods, and registering your class with a unique\n// JSON-serialization identifier using\n// [`Step.jsonID`](#transform.Step^jsonID).\nvar Step = function Step () {};\n\nStep.prototype.apply = function apply (_doc) { return mustOverride() };\n\n// :: () → StepMap\n// Get the step map that represents the changes made by this step,\n// and which can be used to transform between positions in the old\n// and the new document.\nStep.prototype.getMap = function getMap () { return StepMap.empty };\n\n// :: (doc: Node) → Step\n// Create an inverted version of this step. Needs the document as it\n// was before the step as argument.\nStep.prototype.invert = function invert (_doc) { return mustOverride() };\n\n// :: (mapping: Mappable) → ?Step\n// Map this step through a mappable thing, returning either a\n// version of that step with its positions adjusted, or `null` if\n// the step was entirely deleted by the mapping.\nStep.prototype.map = function map (_mapping) { return mustOverride() };\n\n// :: (other: Step) → ?Step\n// Try to merge this step with another one, to be applied directly\n// after it. Returns the merged step when possible, null if the\n// steps can't be merged.\nStep.prototype.merge = function merge (_other) { return null };\n\n// :: () → Object\n// Create a JSON-serializeable representation of this step. When\n// defining this for a custom subclass, make sure the result object\n// includes the step type's [JSON id](#transform.Step^jsonID) under\n// the `stepType` property.\nStep.prototype.toJSON = function toJSON () { return mustOverride() };\n\n// :: (Schema, Object) → Step\n// Deserialize a step from its JSON representation. Will call\n// through to the step class' own implementation of this method.\nStep.fromJSON = function fromJSON (schema, json) {\n if (!json || !json.stepType) { throw new RangeError(\"Invalid input for Step.fromJSON\") }\n var type = stepsByID[json.stepType];\n if (!type) { throw new RangeError((\"No step type \" + (json.stepType) + \" defined\")) }\n return type.fromJSON(schema, json)\n};\n\n// :: (string, constructor)\n// To be able to serialize steps to JSON, each step needs a string\n// ID to attach to its JSON representation. Use this method to\n// register an ID for your step classes. Try to pick something\n// that's unlikely to clash with steps from other modules.\nStep.jsonID = function jsonID (id, stepClass) {\n if (id in stepsByID) { throw new RangeError(\"Duplicate use of step JSON ID \" + id) }\n stepsByID[id] = stepClass;\n stepClass.prototype.jsonID = id;\n return stepClass\n};\n\n// ::- The result of [applying](#transform.Step.apply) a step. Contains either a\n// new document or a failure value.\nvar StepResult = function StepResult(doc, failed) {\n // :: ?Node The transformed document.\n this.doc = doc;\n // :: ?string Text providing information about a failed step.\n this.failed = failed;\n};\n\n// :: (Node) → StepResult\n// Create a successful step result.\nStepResult.ok = function ok (doc) { return new StepResult(doc, null) };\n\n// :: (string) → StepResult\n// Create a failed step result.\nStepResult.fail = function fail (message) { return new StepResult(null, message) };\n\n// :: (Node, number, number, Slice) → StepResult\n// Call [`Node.replace`](#model.Node.replace) with the given\n// arguments. Create a successful result if it succeeds, and a\n// failed one if it throws a `ReplaceError`.\nStepResult.fromReplace = function fromReplace (doc, from, to, slice) {\n try {\n return StepResult.ok(doc.replace(from, to, slice))\n } catch (e) {\n if (e instanceof ReplaceError) { return StepResult.fail(e.message) }\n throw e\n }\n};\n\n// ::- Replace a part of the document with a slice of new content.\nvar ReplaceStep = /*@__PURE__*/(function (Step) {\n function ReplaceStep(from, to, slice, structure) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.slice = slice;\n this.structure = !!structure;\n }\n\n if ( Step ) ReplaceStep.__proto__ = Step;\n ReplaceStep.prototype = Object.create( Step && Step.prototype );\n ReplaceStep.prototype.constructor = ReplaceStep;\n\n ReplaceStep.prototype.apply = function apply (doc) {\n if (this.structure && contentBetween(doc, this.from, this.to))\n { return StepResult.fail(\"Structure replace would overwrite content\") }\n return StepResult.fromReplace(doc, this.from, this.to, this.slice)\n };\n\n ReplaceStep.prototype.getMap = function getMap () {\n return new StepMap([this.from, this.to - this.from, this.slice.size])\n };\n\n ReplaceStep.prototype.invert = function invert (doc) {\n return new ReplaceStep(this.from, this.from + this.slice.size, doc.slice(this.from, this.to))\n };\n\n ReplaceStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted) { return null }\n return new ReplaceStep(from.pos, Math.max(from.pos, to.pos), this.slice)\n };\n\n ReplaceStep.prototype.merge = function merge (other) {\n if (!(other instanceof ReplaceStep) || other.structure != this.structure) { return null }\n\n if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) {\n var slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd);\n return new ReplaceStep(this.from, this.to + (other.to - other.from), slice, this.structure)\n } else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) {\n var slice$1 = this.slice.size + other.slice.size == 0 ? Slice.empty\n : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd);\n return new ReplaceStep(other.from, this.to, slice$1, this.structure)\n } else {\n return null\n }\n };\n\n ReplaceStep.prototype.toJSON = function toJSON () {\n var json = {stepType: \"replace\", from: this.from, to: this.to};\n if (this.slice.size) { json.slice = this.slice.toJSON(); }\n if (this.structure) { json.structure = true; }\n return json\n };\n\n ReplaceStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n { throw new RangeError(\"Invalid input for ReplaceStep.fromJSON\") }\n return new ReplaceStep(json.from, json.to, Slice.fromJSON(schema, json.slice), !!json.structure)\n };\n\n return ReplaceStep;\n}(Step));\n\nStep.jsonID(\"replace\", ReplaceStep);\n\n// ::- Replace a part of the document with a slice of content, but\n// preserve a range of the replaced content by moving it into the\n// slice.\nvar ReplaceAroundStep = /*@__PURE__*/(function (Step) {\n function ReplaceAroundStep(from, to, gapFrom, gapTo, slice, insert, structure) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.gapFrom = gapFrom;\n this.gapTo = gapTo;\n this.slice = slice;\n this.insert = insert;\n this.structure = !!structure;\n }\n\n if ( Step ) ReplaceAroundStep.__proto__ = Step;\n ReplaceAroundStep.prototype = Object.create( Step && Step.prototype );\n ReplaceAroundStep.prototype.constructor = ReplaceAroundStep;\n\n ReplaceAroundStep.prototype.apply = function apply (doc) {\n if (this.structure && (contentBetween(doc, this.from, this.gapFrom) ||\n contentBetween(doc, this.gapTo, this.to)))\n { return StepResult.fail(\"Structure gap-replace would overwrite content\") }\n\n var gap = doc.slice(this.gapFrom, this.gapTo);\n if (gap.openStart || gap.openEnd)\n { return StepResult.fail(\"Gap is not a flat range\") }\n var inserted = this.slice.insertAt(this.insert, gap.content);\n if (!inserted) { return StepResult.fail(\"Content does not fit in gap\") }\n return StepResult.fromReplace(doc, this.from, this.to, inserted)\n };\n\n ReplaceAroundStep.prototype.getMap = function getMap () {\n return new StepMap([this.from, this.gapFrom - this.from, this.insert,\n this.gapTo, this.to - this.gapTo, this.slice.size - this.insert])\n };\n\n ReplaceAroundStep.prototype.invert = function invert (doc) {\n var gap = this.gapTo - this.gapFrom;\n return new ReplaceAroundStep(this.from, this.from + this.slice.size + gap,\n this.from + this.insert, this.from + this.insert + gap,\n doc.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from),\n this.gapFrom - this.from, this.structure)\n };\n\n ReplaceAroundStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n var gapFrom = mapping.map(this.gapFrom, -1), gapTo = mapping.map(this.gapTo, 1);\n if ((from.deleted && to.deleted) || gapFrom < from.pos || gapTo > to.pos) { return null }\n return new ReplaceAroundStep(from.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure)\n };\n\n ReplaceAroundStep.prototype.toJSON = function toJSON () {\n var json = {stepType: \"replaceAround\", from: this.from, to: this.to,\n gapFrom: this.gapFrom, gapTo: this.gapTo, insert: this.insert};\n if (this.slice.size) { json.slice = this.slice.toJSON(); }\n if (this.structure) { json.structure = true; }\n return json\n };\n\n ReplaceAroundStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\" ||\n typeof json.gapFrom != \"number\" || typeof json.gapTo != \"number\" || typeof json.insert != \"number\")\n { throw new RangeError(\"Invalid input for ReplaceAroundStep.fromJSON\") }\n return new ReplaceAroundStep(json.from, json.to, json.gapFrom, json.gapTo,\n Slice.fromJSON(schema, json.slice), json.insert, !!json.structure)\n };\n\n return ReplaceAroundStep;\n}(Step));\n\nStep.jsonID(\"replaceAround\", ReplaceAroundStep);\n\nfunction contentBetween(doc, from, to) {\n var $from = doc.resolve(from), dist = to - from, depth = $from.depth;\n while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) {\n depth--;\n dist--;\n }\n if (dist > 0) {\n var next = $from.node(depth).maybeChild($from.indexAfter(depth));\n while (dist > 0) {\n if (!next || next.isLeaf) { return true }\n next = next.firstChild;\n dist--;\n }\n }\n return false\n}\n\nfunction canCut(node, start, end) {\n return (start == 0 || node.canReplace(start, node.childCount)) &&\n (end == node.childCount || node.canReplace(0, end))\n}\n\n// :: (NodeRange) → ?number\n// Try to find a target depth to which the content in the given range\n// can be lifted. Will not go across\n// [isolating](#model.NodeSpec.isolating) parent nodes.\nfunction liftTarget(range) {\n var parent = range.parent;\n var content = parent.content.cutByIndex(range.startIndex, range.endIndex);\n for (var depth = range.depth;; --depth) {\n var node = range.$from.node(depth);\n var index = range.$from.index(depth), endIndex = range.$to.indexAfter(depth);\n if (depth < range.depth && node.canReplace(index, endIndex, content))\n { return depth }\n if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex)) { break }\n }\n}\n\n// :: (NodeRange, number) → this\n// Split the content in the given range off from its parent, if there\n// is sibling content before or after it, and move it up the tree to\n// the depth specified by `target`. You'll probably want to use\n// [`liftTarget`](#transform.liftTarget) to compute `target`, to make\n// sure the lift is valid.\nTransform.prototype.lift = function(range, target) {\n var $from = range.$from;\n var $to = range.$to;\n var depth = range.depth;\n\n var gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1);\n var start = gapStart, end = gapEnd;\n\n var before = Fragment.empty, openStart = 0;\n for (var d = depth, splitting = false; d > target; d--)\n { if (splitting || $from.index(d) > 0) {\n splitting = true;\n before = Fragment.from($from.node(d).copy(before));\n openStart++;\n } else {\n start--;\n } }\n var after = Fragment.empty, openEnd = 0;\n for (var d$1 = depth, splitting$1 = false; d$1 > target; d$1--)\n { if (splitting$1 || $to.after(d$1 + 1) < $to.end(d$1)) {\n splitting$1 = true;\n after = Fragment.from($to.node(d$1).copy(after));\n openEnd++;\n } else {\n end++;\n } }\n\n return this.step(new ReplaceAroundStep(start, end, gapStart, gapEnd,\n new Slice(before.append(after), openStart, openEnd),\n before.size - openStart, true))\n};\n\n// :: (NodeRange, NodeType, ?Object, ?NodeRange) → ?[{type: NodeType, attrs: ?Object}]\n// Try to find a valid way to wrap the content in the given range in a\n// node of the given type. May introduce extra nodes around and inside\n// the wrapper node, if necessary. Returns null if no valid wrapping\n// could be found. When `innerRange` is given, that range's content is\n// used as the content to fit into the wrapping, instead of the\n// content of `range`.\nfunction findWrapping(range, nodeType, attrs, innerRange) {\n if ( innerRange === void 0 ) innerRange = range;\n\n var around = findWrappingOutside(range, nodeType);\n var inner = around && findWrappingInside(innerRange, nodeType);\n if (!inner) { return null }\n return around.map(withAttrs).concat({type: nodeType, attrs: attrs}).concat(inner.map(withAttrs))\n}\n\nfunction withAttrs(type) { return {type: type, attrs: null} }\n\nfunction findWrappingOutside(range, type) {\n var parent = range.parent;\n var startIndex = range.startIndex;\n var endIndex = range.endIndex;\n var around = parent.contentMatchAt(startIndex).findWrapping(type);\n if (!around) { return null }\n var outer = around.length ? around[0] : type;\n return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null\n}\n\nfunction findWrappingInside(range, type) {\n var parent = range.parent;\n var startIndex = range.startIndex;\n var endIndex = range.endIndex;\n var inner = parent.child(startIndex);\n var inside = type.contentMatch.findWrapping(inner.type);\n if (!inside) { return null }\n var lastType = inside.length ? inside[inside.length - 1] : type;\n var innerMatch = lastType.contentMatch;\n for (var i = startIndex; innerMatch && i < endIndex; i++)\n { innerMatch = innerMatch.matchType(parent.child(i).type); }\n if (!innerMatch || !innerMatch.validEnd) { return null }\n return inside\n}\n\n// :: (NodeRange, [{type: NodeType, attrs: ?Object}]) → this\n// Wrap the given [range](#model.NodeRange) in the given set of wrappers.\n// The wrappers are assumed to be valid in this position, and should\n// probably be computed with [`findWrapping`](#transform.findWrapping).\nTransform.prototype.wrap = function(range, wrappers) {\n var content = Fragment.empty;\n for (var i = wrappers.length - 1; i >= 0; i--)\n { content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content)); }\n\n var start = range.start, end = range.end;\n return this.step(new ReplaceAroundStep(start, end, start, end, new Slice(content, 0, 0), wrappers.length, true))\n};\n\n// :: (number, ?number, NodeType, ?Object) → this\n// Set the type of all textblocks (partly) between `from` and `to` to\n// the given node type with the given attributes.\nTransform.prototype.setBlockType = function(from, to, type, attrs) {\n var this$1 = this;\n if ( to === void 0 ) to = from;\n\n if (!type.isTextblock) { throw new RangeError(\"Type given to setBlockType should be a textblock\") }\n var mapFrom = this.steps.length;\n this.doc.nodesBetween(from, to, function (node, pos) {\n if (node.isTextblock && !node.hasMarkup(type, attrs) && canChangeType(this$1.doc, this$1.mapping.slice(mapFrom).map(pos), type)) {\n // Ensure all markup that isn't allowed in the new node type is cleared\n this$1.clearIncompatible(this$1.mapping.slice(mapFrom).map(pos, 1), type);\n var mapping = this$1.mapping.slice(mapFrom);\n var startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1);\n this$1.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1,\n new Slice(Fragment.from(type.create(attrs, null, node.marks)), 0, 0), 1, true));\n return false\n }\n });\n return this\n};\n\nfunction canChangeType(doc, pos, type) {\n var $pos = doc.resolve(pos), index = $pos.index();\n return $pos.parent.canReplaceWith(index, index + 1, type)\n}\n\n// :: (number, ?NodeType, ?Object, ?[Mark]) → this\n// Change the type, attributes, and/or marks of the node at `pos`.\n// When `type` isn't given, the existing node type is preserved,\nTransform.prototype.setNodeMarkup = function(pos, type, attrs, marks) {\n var node = this.doc.nodeAt(pos);\n if (!node) { throw new RangeError(\"No node at given position\") }\n if (!type) { type = node.type; }\n var newNode = type.create(attrs, null, marks || node.marks);\n if (node.isLeaf)\n { return this.replaceWith(pos, pos + node.nodeSize, newNode) }\n\n if (!type.validContent(node.content))\n { throw new RangeError(\"Invalid content for node type \" + type.name) }\n\n return this.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1,\n new Slice(Fragment.from(newNode), 0, 0), 1, true))\n};\n\n// :: (Node, number, number, ?[?{type: NodeType, attrs: ?Object}]) → bool\n// Check whether splitting at the given position is allowed.\nfunction canSplit(doc, pos, depth, typesAfter) {\n if ( depth === void 0 ) depth = 1;\n\n var $pos = doc.resolve(pos), base = $pos.depth - depth;\n var innerType = (typesAfter && typesAfter[typesAfter.length - 1]) || $pos.parent;\n if (base < 0 || $pos.parent.type.spec.isolating ||\n !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) ||\n !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount)))\n { return false }\n for (var d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n var node = $pos.node(d), index$1 = $pos.index(d);\n if (node.type.spec.isolating) { return false }\n var rest = node.content.cutByIndex(index$1, node.childCount);\n var after = (typesAfter && typesAfter[i]) || node;\n if (after != node) { rest = rest.replaceChild(0, after.type.create(after.attrs)); }\n if (!node.canReplace(index$1 + 1, node.childCount) || !after.type.validContent(rest))\n { return false }\n }\n var index = $pos.indexAfter(base);\n var baseType = typesAfter && typesAfter[0];\n return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type)\n}\n\n// :: (number, ?number, ?[?{type: NodeType, attrs: ?Object}]) → this\n// Split the node at the given position, and optionally, if `depth` is\n// greater than one, any number of nodes above that. By default, the\n// parts split off will inherit the node type of the original node.\n// This can be changed by passing an array of types and attributes to\n// use after the split.\nTransform.prototype.split = function(pos, depth, typesAfter) {\n if ( depth === void 0 ) depth = 1;\n\n var $pos = this.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty;\n for (var d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) {\n before = Fragment.from($pos.node(d).copy(before));\n var typeAfter = typesAfter && typesAfter[i];\n after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after));\n }\n return this.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true))\n};\n\n// :: (Node, number) → bool\n// Test whether the blocks before and after a given position can be\n// joined.\nfunction canJoin(doc, pos) {\n var $pos = doc.resolve(pos), index = $pos.index();\n return joinable($pos.nodeBefore, $pos.nodeAfter) &&\n $pos.parent.canReplace(index, index + 1)\n}\n\nfunction joinable(a, b) {\n return a && b && !a.isLeaf && a.canAppend(b)\n}\n\n// :: (Node, number, ?number) → ?number\n// Find an ancestor of the given position that can be joined to the\n// block before (or after if `dir` is positive). Returns the joinable\n// point, if any.\nfunction joinPoint(doc, pos, dir) {\n if ( dir === void 0 ) dir = -1;\n\n var $pos = doc.resolve(pos);\n for (var d = $pos.depth;; d--) {\n var before = (void 0), after = (void 0), index = $pos.index(d);\n if (d == $pos.depth) {\n before = $pos.nodeBefore;\n after = $pos.nodeAfter;\n } else if (dir > 0) {\n before = $pos.node(d + 1);\n index++;\n after = $pos.node(d).maybeChild(index);\n } else {\n before = $pos.node(d).maybeChild(index - 1);\n after = $pos.node(d + 1);\n }\n if (before && !before.isTextblock && joinable(before, after) &&\n $pos.node(d).canReplace(index, index + 1)) { return pos }\n if (d == 0) { break }\n pos = dir < 0 ? $pos.before(d) : $pos.after(d);\n }\n}\n\n// :: (number, ?number) → this\n// Join the blocks around the given position. If depth is 2, their\n// last and first siblings are also joined, and so on.\nTransform.prototype.join = function(pos, depth) {\n if ( depth === void 0 ) depth = 1;\n\n var step = new ReplaceStep(pos - depth, pos + depth, Slice.empty, true);\n return this.step(step)\n};\n\n// :: (Node, number, NodeType) → ?number\n// Try to find a point where a node of the given type can be inserted\n// near `pos`, by searching up the node hierarchy when `pos` itself\n// isn't a valid place but is at the start or end of a node. Return\n// null if no position was found.\nfunction insertPoint(doc, pos, nodeType) {\n var $pos = doc.resolve(pos);\n if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType)) { return pos }\n\n if ($pos.parentOffset == 0)\n { for (var d = $pos.depth - 1; d >= 0; d--) {\n var index = $pos.index(d);\n if ($pos.node(d).canReplaceWith(index, index, nodeType)) { return $pos.before(d + 1) }\n if (index > 0) { return null }\n } }\n if ($pos.parentOffset == $pos.parent.content.size)\n { for (var d$1 = $pos.depth - 1; d$1 >= 0; d$1--) {\n var index$1 = $pos.indexAfter(d$1);\n if ($pos.node(d$1).canReplaceWith(index$1, index$1, nodeType)) { return $pos.after(d$1 + 1) }\n if (index$1 < $pos.node(d$1).childCount) { return null }\n } }\n}\n\n// :: (Node, number, Slice) → ?number\n// Finds a position at or around the given position where the given\n// slice can be inserted. Will look at parent nodes' nearest boundary\n// and try there, even if the original position wasn't directly at the\n// start or end of that node. Returns null when no position was found.\nfunction dropPoint(doc, pos, slice) {\n var $pos = doc.resolve(pos);\n if (!slice.content.size) { return pos }\n var content = slice.content;\n for (var i = 0; i < slice.openStart; i++) { content = content.firstChild.content; }\n for (var pass = 1; pass <= (slice.openStart == 0 && slice.size ? 2 : 1); pass++) {\n for (var d = $pos.depth; d >= 0; d--) {\n var bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1;\n var insertPos = $pos.index(d) + (bias > 0 ? 1 : 0);\n if (pass == 1\n ? $pos.node(d).canReplace(insertPos, insertPos, content)\n : $pos.node(d).contentMatchAt(insertPos).findWrapping(content.firstChild.type))\n { return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1) }\n }\n }\n return null\n}\n\nfunction mapFragment(fragment, f, parent) {\n var mapped = [];\n for (var i = 0; i < fragment.childCount; i++) {\n var child = fragment.child(i);\n if (child.content.size) { child = child.copy(mapFragment(child.content, f, child)); }\n if (child.isInline) { child = f(child, parent, i); }\n mapped.push(child);\n }\n return Fragment.fromArray(mapped)\n}\n\n// ::- Add a mark to all inline content between two positions.\nvar AddMarkStep = /*@__PURE__*/(function (Step) {\n function AddMarkStep(from, to, mark) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.mark = mark;\n }\n\n if ( Step ) AddMarkStep.__proto__ = Step;\n AddMarkStep.prototype = Object.create( Step && Step.prototype );\n AddMarkStep.prototype.constructor = AddMarkStep;\n\n AddMarkStep.prototype.apply = function apply (doc) {\n var this$1 = this;\n\n var oldSlice = doc.slice(this.from, this.to), $from = doc.resolve(this.from);\n var parent = $from.node($from.sharedDepth(this.to));\n var slice = new Slice(mapFragment(oldSlice.content, function (node, parent) {\n if (!node.isAtom || !parent.type.allowsMarkType(this$1.mark.type)) { return node }\n return node.mark(this$1.mark.addToSet(node.marks))\n }, parent), oldSlice.openStart, oldSlice.openEnd);\n return StepResult.fromReplace(doc, this.from, this.to, slice)\n };\n\n AddMarkStep.prototype.invert = function invert () {\n return new RemoveMarkStep(this.from, this.to, this.mark)\n };\n\n AddMarkStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted || from.pos >= to.pos) { return null }\n return new AddMarkStep(from.pos, to.pos, this.mark)\n };\n\n AddMarkStep.prototype.merge = function merge (other) {\n if (other instanceof AddMarkStep &&\n other.mark.eq(this.mark) &&\n this.from <= other.to && this.to >= other.from)\n { return new AddMarkStep(Math.min(this.from, other.from),\n Math.max(this.to, other.to), this.mark) }\n };\n\n AddMarkStep.prototype.toJSON = function toJSON () {\n return {stepType: \"addMark\", mark: this.mark.toJSON(),\n from: this.from, to: this.to}\n };\n\n AddMarkStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n { throw new RangeError(\"Invalid input for AddMarkStep.fromJSON\") }\n return new AddMarkStep(json.from, json.to, schema.markFromJSON(json.mark))\n };\n\n return AddMarkStep;\n}(Step));\n\nStep.jsonID(\"addMark\", AddMarkStep);\n\n// ::- Remove a mark from all inline content between two positions.\nvar RemoveMarkStep = /*@__PURE__*/(function (Step) {\n function RemoveMarkStep(from, to, mark) {\n Step.call(this);\n this.from = from;\n this.to = to;\n this.mark = mark;\n }\n\n if ( Step ) RemoveMarkStep.__proto__ = Step;\n RemoveMarkStep.prototype = Object.create( Step && Step.prototype );\n RemoveMarkStep.prototype.constructor = RemoveMarkStep;\n\n RemoveMarkStep.prototype.apply = function apply (doc) {\n var this$1 = this;\n\n var oldSlice = doc.slice(this.from, this.to);\n var slice = new Slice(mapFragment(oldSlice.content, function (node) {\n return node.mark(this$1.mark.removeFromSet(node.marks))\n }), oldSlice.openStart, oldSlice.openEnd);\n return StepResult.fromReplace(doc, this.from, this.to, slice)\n };\n\n RemoveMarkStep.prototype.invert = function invert () {\n return new AddMarkStep(this.from, this.to, this.mark)\n };\n\n RemoveMarkStep.prototype.map = function map (mapping) {\n var from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted || from.pos >= to.pos) { return null }\n return new RemoveMarkStep(from.pos, to.pos, this.mark)\n };\n\n RemoveMarkStep.prototype.merge = function merge (other) {\n if (other instanceof RemoveMarkStep &&\n other.mark.eq(this.mark) &&\n this.from <= other.to && this.to >= other.from)\n { return new RemoveMarkStep(Math.min(this.from, other.from),\n Math.max(this.to, other.to), this.mark) }\n };\n\n RemoveMarkStep.prototype.toJSON = function toJSON () {\n return {stepType: \"removeMark\", mark: this.mark.toJSON(),\n from: this.from, to: this.to}\n };\n\n RemoveMarkStep.fromJSON = function fromJSON (schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n { throw new RangeError(\"Invalid input for RemoveMarkStep.fromJSON\") }\n return new RemoveMarkStep(json.from, json.to, schema.markFromJSON(json.mark))\n };\n\n return RemoveMarkStep;\n}(Step));\n\nStep.jsonID(\"removeMark\", RemoveMarkStep);\n\n// :: (number, number, Mark) → this\n// Add the given mark to the inline content between `from` and `to`.\nTransform.prototype.addMark = function(from, to, mark) {\n var this$1 = this;\n\n var removed = [], added = [], removing = null, adding = null;\n this.doc.nodesBetween(from, to, function (node, pos, parent) {\n if (!node.isInline) { return }\n var marks = node.marks;\n if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) {\n var start = Math.max(pos, from), end = Math.min(pos + node.nodeSize, to);\n var newSet = mark.addToSet(marks);\n\n for (var i = 0; i < marks.length; i++) {\n if (!marks[i].isInSet(newSet)) {\n if (removing && removing.to == start && removing.mark.eq(marks[i]))\n { removing.to = end; }\n else\n { removed.push(removing = new RemoveMarkStep(start, end, marks[i])); }\n }\n }\n\n if (adding && adding.to == start)\n { adding.to = end; }\n else\n { added.push(adding = new AddMarkStep(start, end, mark)); }\n }\n });\n\n removed.forEach(function (s) { return this$1.step(s); });\n added.forEach(function (s) { return this$1.step(s); });\n return this\n};\n\n// :: (number, number, ?union) → this\n// Remove marks from inline nodes between `from` and `to`. When `mark`\n// is a single mark, remove precisely that mark. When it is a mark type,\n// remove all marks of that type. When it is null, remove all marks of\n// any type.\nTransform.prototype.removeMark = function(from, to, mark) {\n var this$1 = this;\n if ( mark === void 0 ) mark = null;\n\n var matched = [], step = 0;\n this.doc.nodesBetween(from, to, function (node, pos) {\n if (!node.isInline) { return }\n step++;\n var toRemove = null;\n if (mark instanceof MarkType) {\n var set = node.marks, found;\n while (found = mark.isInSet(set)) {\n(toRemove || (toRemove = [])).push(found);\n set = found.removeFromSet(set);\n }\n } else if (mark) {\n if (mark.isInSet(node.marks)) { toRemove = [mark]; }\n } else {\n toRemove = node.marks;\n }\n if (toRemove && toRemove.length) {\n var end = Math.min(pos + node.nodeSize, to);\n for (var i = 0; i < toRemove.length; i++) {\n var style = toRemove[i], found$1 = (void 0);\n for (var j = 0; j < matched.length; j++) {\n var m = matched[j];\n if (m.step == step - 1 && style.eq(matched[j].style)) { found$1 = m; }\n }\n if (found$1) {\n found$1.to = end;\n found$1.step = step;\n } else {\n matched.push({style: style, from: Math.max(pos, from), to: end, step: step});\n }\n }\n }\n });\n matched.forEach(function (m) { return this$1.step(new RemoveMarkStep(m.from, m.to, m.style)); });\n return this\n};\n\n// :: (number, NodeType, ?ContentMatch) → this\n// Removes all marks and nodes from the content of the node at `pos`\n// that don't match the given new parent node type. Accepts an\n// optional starting [content match](#model.ContentMatch) as third\n// argument.\nTransform.prototype.clearIncompatible = function(pos, parentType, match) {\n if ( match === void 0 ) match = parentType.contentMatch;\n\n var node = this.doc.nodeAt(pos);\n var delSteps = [], cur = pos + 1;\n for (var i = 0; i < node.childCount; i++) {\n var child = node.child(i), end = cur + child.nodeSize;\n var allowed = match.matchType(child.type, child.attrs);\n if (!allowed) {\n delSteps.push(new ReplaceStep(cur, end, Slice.empty));\n } else {\n match = allowed;\n for (var j = 0; j < child.marks.length; j++) { if (!parentType.allowsMarkType(child.marks[j].type))\n { this.step(new RemoveMarkStep(cur, end, child.marks[j])); } }\n }\n cur = end;\n }\n if (!match.validEnd) {\n var fill = match.fillBefore(Fragment.empty, true);\n this.replace(cur, cur, new Slice(fill, 0, 0));\n }\n for (var i$1 = delSteps.length - 1; i$1 >= 0; i$1--) { this.step(delSteps[i$1]); }\n return this\n};\n\n// :: (Node, number, ?number, ?Slice) → ?Step\n// ‘Fit’ a slice into a given position in the document, producing a\n// [step](#transform.Step) that inserts it. Will return null if\n// there's no meaningful way to insert the slice here, or inserting it\n// would be a no-op (an empty slice over an empty range).\nfunction replaceStep(doc, from, to, slice) {\n if ( to === void 0 ) to = from;\n if ( slice === void 0 ) slice = Slice.empty;\n\n if (from == to && !slice.size) { return null }\n\n var $from = doc.resolve(from), $to = doc.resolve(to);\n // Optimization -- avoid work if it's obvious that it's not needed.\n if (fitsTrivially($from, $to, slice)) { return new ReplaceStep(from, to, slice) }\n return new Fitter($from, $to, slice).fit()\n}\n\n// :: (number, ?number, ?Slice) → this\n// Replace the part of the document between `from` and `to` with the\n// given `slice`.\nTransform.prototype.replace = function(from, to, slice) {\n if ( to === void 0 ) to = from;\n if ( slice === void 0 ) slice = Slice.empty;\n\n var step = replaceStep(this.doc, from, to, slice);\n if (step) { this.step(step); }\n return this\n};\n\n// :: (number, number, union) → this\n// Replace the given range with the given content, which may be a\n// fragment, node, or array of nodes.\nTransform.prototype.replaceWith = function(from, to, content) {\n return this.replace(from, to, new Slice(Fragment.from(content), 0, 0))\n};\n\n// :: (number, number) → this\n// Delete the content between the given positions.\nTransform.prototype.delete = function(from, to) {\n return this.replace(from, to, Slice.empty)\n};\n\n// :: (number, union) → this\n// Insert the given content at the given position.\nTransform.prototype.insert = function(pos, content) {\n return this.replaceWith(pos, pos, content)\n};\n\nfunction fitsTrivially($from, $to, slice) {\n return !slice.openStart && !slice.openEnd && $from.start() == $to.start() &&\n $from.parent.canReplace($from.index(), $to.index(), slice.content)\n}\n\n// Algorithm for 'placing' the elements of a slice into a gap:\n//\n// We consider the content of each node that is open to the left to be\n// independently placeable. I.e. in , when the\n// paragraph on the left is open, \"foo\" can be placed (somewhere on\n// the left side of the replacement gap) independently from p(\"bar\").\n//\n// This class tracks the state of the placement progress in the\n// following properties:\n//\n// - `frontier` holds a stack of `{type, match}` objects that\n// represent the open side of the replacement. It starts at\n// `$from`, then moves forward as content is placed, and is finally\n// reconciled with `$to`.\n//\n// - `unplaced` is a slice that represents the content that hasn't\n// been placed yet.\n//\n// - `placed` is a fragment of placed content. Its open-start value\n// is implicit in `$from`, and its open-end value in `frontier`.\nvar Fitter = function Fitter($from, $to, slice) {\n this.$to = $to;\n this.$from = $from;\n this.unplaced = slice;\n\n this.frontier = [];\n for (var i = 0; i <= $from.depth; i++) {\n var node = $from.node(i);\n this.frontier.push({\n type: node.type,\n match: node.contentMatchAt($from.indexAfter(i))\n });\n }\n\n this.placed = Fragment.empty;\n for (var i$1 = $from.depth; i$1 > 0; i$1--)\n { this.placed = Fragment.from($from.node(i$1).copy(this.placed)); }\n};\n\nvar prototypeAccessors$1 = { depth: { configurable: true } };\n\nprototypeAccessors$1.depth.get = function () { return this.frontier.length - 1 };\n\nFitter.prototype.fit = function fit () {\n // As long as there's unplaced content, try to place some of it.\n // If that fails, either increase the open score of the unplaced\n // slice, or drop nodes from it, and then try again.\n while (this.unplaced.size) {\n var fit = this.findFittable();\n if (fit) { this.placeNodes(fit); }\n else { this.openMore() || this.dropNode(); }\n }\n // When there's inline content directly after the frontier _and_\n // directly after `this.$to`, we must generate a `ReplaceAround`\n // step that pulls that content into the node after the frontier.\n // That means the fitting must be done to the end of the textblock\n // node after `this.$to`, not `this.$to` itself.\n var moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth;\n var $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline));\n if (!$to) { return null }\n\n // If closing to `$to` succeeded, create a step\n var content = this.placed, openStart = $from.depth, openEnd = $to.depth;\n while (openStart && openEnd && content.childCount == 1) { // Normalize by dropping open parent nodes\n content = content.firstChild.content;\n openStart--; openEnd--;\n }\n var slice = new Slice(content, openStart, openEnd);\n if (moveInline > -1)\n { return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice, placedSize) }\n if (slice.size || $from.pos != this.$to.pos) // Don't generate no-op steps\n { return new ReplaceStep($from.pos, $to.pos, slice) }\n};\n\n// Find a position on the start spine of `this.unplaced` that has\n// content that can be moved somewhere on the frontier. Returns two\n// depths, one for the slice and one for the frontier.\nFitter.prototype.findFittable = function findFittable () {\n // Only try wrapping nodes (pass 2) after finding a place without\n // wrapping failed.\n for (var pass = 1; pass <= 2; pass++) {\n for (var sliceDepth = this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) {\n var fragment = (void 0), parent = (void 0);\n if (sliceDepth) {\n parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild;\n fragment = parent.content;\n } else {\n fragment = this.unplaced.content;\n }\n var first = fragment.firstChild;\n for (var frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) {\n var ref = this.frontier[frontierDepth];\n var type = ref.type;\n var match = ref.match;\n var wrap = (void 0), inject = (void 0);\n // In pass 1, if the next node matches, or there is no next\n // node but the parents look compatible, we've found a\n // place.\n if (pass == 1 && (first ? match.matchType(first.type) || (inject = match.fillBefore(Fragment.from(first), false))\n : type.compatibleContent(parent.type)))\n { return {sliceDepth: sliceDepth, frontierDepth: frontierDepth, parent: parent, inject: inject} }\n // In pass 2, look for a set of wrapping nodes that make\n // `first` fit here.\n else if (pass == 2 && first && (wrap = match.findWrapping(first.type)))\n { return {sliceDepth: sliceDepth, frontierDepth: frontierDepth, parent: parent, wrap: wrap} }\n // Don't continue looking further up if the parent node\n // would fit here.\n if (parent && match.matchType(parent.type)) { break }\n }\n }\n }\n};\n\nFitter.prototype.openMore = function openMore () {\n var ref = this.unplaced;\n var content = ref.content;\n var openStart = ref.openStart;\n var openEnd = ref.openEnd;\n var inner = contentAt(content, openStart);\n if (!inner.childCount || inner.firstChild.isLeaf) { return false }\n this.unplaced = new Slice(content, openStart + 1,\n Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0));\n return true\n};\n\nFitter.prototype.dropNode = function dropNode () {\n var ref = this.unplaced;\n var content = ref.content;\n var openStart = ref.openStart;\n var openEnd = ref.openEnd;\n var inner = contentAt(content, openStart);\n if (inner.childCount <= 1 && openStart > 0) {\n var openAtEnd = content.size - openStart <= openStart + inner.size;\n this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1,\n openAtEnd ? openStart - 1 : openEnd);\n } else {\n this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd);\n }\n};\n\n// : ({sliceDepth: number, frontierDepth: number, parent: ?Node, wrap: ?[NodeType], inject: ?Fragment})\n// Move content from the unplaced slice at `sliceDepth` to the\n// frontier node at `frontierDepth`. Close that frontier node when\n// applicable.\nFitter.prototype.placeNodes = function placeNodes (ref) {\n var sliceDepth = ref.sliceDepth;\n var frontierDepth = ref.frontierDepth;\n var parent = ref.parent;\n var inject = ref.inject;\n var wrap = ref.wrap;\n\n while (this.depth > frontierDepth) { this.closeFrontierNode(); }\n if (wrap) { for (var i = 0; i < wrap.length; i++) { this.openFrontierNode(wrap[i]); } }\n\n var slice = this.unplaced, fragment = parent ? parent.content : slice.content;\n var openStart = slice.openStart - sliceDepth;\n var taken = 0, add = [];\n var ref$1 = this.frontier[frontierDepth];\n var match = ref$1.match;\n var type = ref$1.type;\n if (inject) {\n for (var i$1 = 0; i$1 < inject.childCount; i$1++) { add.push(inject.child(i$1)); }\n match = match.matchFragment(inject);\n }\n // Computes the amount of (end) open nodes at the end of the\n // fragment. When 0, the parent is open, but no more. When\n // negative, nothing is open.\n var openEndCount = (fragment.size + sliceDepth) - (slice.content.size - slice.openEnd);\n // Scan over the fragment, fitting as many child nodes as\n // possible.\n while (taken < fragment.childCount) {\n var next = fragment.child(taken), matches = match.matchType(next.type);\n if (!matches) { break }\n taken++;\n if (taken > 1 || openStart == 0 || next.content.size) { // Drop empty open nodes\n match = matches;\n add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0,\n taken == fragment.childCount ? openEndCount : -1));\n }\n }\n var toEnd = taken == fragment.childCount;\n if (!toEnd) { openEndCount = -1; }\n\n this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add));\n this.frontier[frontierDepth].match = match;\n\n // If the parent types match, and the entire node was moved, and\n // it's not open, close this frontier node right away.\n if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1)\n { this.closeFrontierNode(); }\n\n // Add new frontier nodes for any open nodes at the end.\n for (var i$2 = 0, cur = fragment; i$2 < openEndCount; i$2++) {\n var node = cur.lastChild;\n this.frontier.push({type: node.type, match: node.contentMatchAt(node.childCount)});\n cur = node.content;\n }\n\n // Update `this.unplaced`. Drop the entire node from which we\n // placed it we got to its end, otherwise just drop the placed\n // nodes.\n this.unplaced = !toEnd ? new Slice(dropFromFragment(slice.content, sliceDepth, taken), slice.openStart, slice.openEnd)\n : sliceDepth == 0 ? Slice.empty\n : new Slice(dropFromFragment(slice.content, sliceDepth - 1, 1),\n sliceDepth - 1, openEndCount < 0 ? slice.openEnd : sliceDepth - 1);\n};\n\nFitter.prototype.mustMoveInline = function mustMoveInline () {\n if (!this.$to.parent.isTextblock || this.$to.end() == this.$to.pos) { return -1 }\n var top = this.frontier[this.depth], level;\n if (!top.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top.type, top.match, false) ||\n (this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth)) { return -1 }\n\n var ref = this.$to;\n var depth = ref.depth;\n var after = this.$to.after(depth);\n while (depth > 1 && after == this.$to.end(--depth)) { ++after; }\n return after\n};\n\nFitter.prototype.findCloseLevel = function findCloseLevel ($to) {\n scan: for (var i = Math.min(this.depth, $to.depth); i >= 0; i--) {\n var ref = this.frontier[i];\n var match = ref.match;\n var type = ref.type;\n var dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1));\n var fit = contentAfterFits($to, i, type, match, dropInner);\n if (!fit) { continue }\n for (var d = i - 1; d >= 0; d--) {\n var ref$1 = this.frontier[d];\n var match$1 = ref$1.match;\n var type$1 = ref$1.type;\n var matches = contentAfterFits($to, d, type$1, match$1, true);\n if (!matches || matches.childCount) { continue scan }\n }\n return {depth: i, fit: fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to}\n }\n};\n\nFitter.prototype.close = function close ($to) {\n var close = this.findCloseLevel($to);\n if (!close) { return null }\n\n while (this.depth > close.depth) { this.closeFrontierNode(); }\n if (close.fit.childCount) { this.placed = addToFragment(this.placed, close.depth, close.fit); }\n $to = close.move;\n for (var d = close.depth + 1; d <= $to.depth; d++) {\n var node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d));\n this.openFrontierNode(node.type, node.attrs, add);\n }\n return $to\n};\n\nFitter.prototype.openFrontierNode = function openFrontierNode (type, attrs, content) {\n var top = this.frontier[this.depth];\n top.match = top.match.matchType(type);\n this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content)));\n this.frontier.push({type: type, match: type.contentMatch});\n};\n\nFitter.prototype.closeFrontierNode = function closeFrontierNode () {\n var open = this.frontier.pop();\n var add = open.match.fillBefore(Fragment.empty, true);\n if (add.childCount) { this.placed = addToFragment(this.placed, this.frontier.length, add); }\n};\n\nObject.defineProperties( Fitter.prototype, prototypeAccessors$1 );\n\nfunction dropFromFragment(fragment, depth, count) {\n if (depth == 0) { return fragment.cutByIndex(count) }\n return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count)))\n}\n\nfunction addToFragment(fragment, depth, content) {\n if (depth == 0) { return fragment.append(content) }\n return fragment.replaceChild(fragment.childCount - 1,\n fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content)))\n}\n\nfunction contentAt(fragment, depth) {\n for (var i = 0; i < depth; i++) { fragment = fragment.firstChild.content; }\n return fragment\n}\n\nfunction closeNodeStart(node, openStart, openEnd) {\n if (openStart <= 0) { return node }\n var frag = node.content;\n if (openStart > 1)\n { frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0)); }\n if (openStart > 0) {\n frag = node.type.contentMatch.fillBefore(frag).append(frag);\n if (openEnd <= 0) { frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true)); }\n }\n return node.copy(frag)\n}\n\nfunction contentAfterFits($to, depth, type, match, open) {\n var node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth);\n if (index == node.childCount && !type.compatibleContent(node.type)) { return null }\n var fit = match.fillBefore(node.content, true, index);\n return fit && !invalidMarks(type, node.content, index) ? fit : null\n}\n\nfunction invalidMarks(type, fragment, start) {\n for (var i = start; i < fragment.childCount; i++)\n { if (!type.allowsMarks(fragment.child(i).marks)) { return true } }\n return false\n}\n\n// :: (number, number, Slice) → this\n// Replace a range of the document with a given slice, using `from`,\n// `to`, and the slice's [`openStart`](#model.Slice.openStart) property\n// as hints, rather than fixed start and end points. This method may\n// grow the replaced area or close open nodes in the slice in order to\n// get a fit that is more in line with WYSIWYG expectations, by\n// dropping fully covered parent nodes of the replaced region when\n// they are marked [non-defining](#model.NodeSpec.defining), or\n// including an open parent node from the slice that _is_ marked as\n// [defining](#model.NodeSpec.defining).\n//\n// This is the method, for example, to handle paste. The similar\n// [`replace`](#transform.Transform.replace) method is a more\n// primitive tool which will _not_ move the start and end of its given\n// range, and is useful in situations where you need more precise\n// control over what happens.\nTransform.prototype.replaceRange = function(from, to, slice) {\n if (!slice.size) { return this.deleteRange(from, to) }\n\n var $from = this.doc.resolve(from), $to = this.doc.resolve(to);\n if (fitsTrivially($from, $to, slice))\n { return this.step(new ReplaceStep(from, to, slice)) }\n\n var targetDepths = coveredDepths($from, this.doc.resolve(to));\n // Can't replace the whole document, so remove 0 if it's present\n if (targetDepths[targetDepths.length - 1] == 0) { targetDepths.pop(); }\n // Negative numbers represent not expansion over the whole node at\n // that depth, but replacing from $from.before(-D) to $to.pos.\n var preferredTarget = -($from.depth + 1);\n targetDepths.unshift(preferredTarget);\n // This loop picks a preferred target depth, if one of the covering\n // depths is not outside of a defining node, and adds negative\n // depths for any depth that has $from at its start and does not\n // cross a defining node.\n for (var d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) {\n var spec = $from.node(d).type.spec;\n if (spec.defining || spec.isolating) { break }\n if (targetDepths.indexOf(d) > -1) { preferredTarget = d; }\n else if ($from.before(d) == pos) { targetDepths.splice(1, 0, -d); }\n }\n // Try to fit each possible depth of the slice into each possible\n // target depth, starting with the preferred depths.\n var preferredTargetIndex = targetDepths.indexOf(preferredTarget);\n\n var leftNodes = [], preferredDepth = slice.openStart;\n for (var content = slice.content, i = 0;; i++) {\n var node = content.firstChild;\n leftNodes.push(node);\n if (i == slice.openStart) { break }\n content = node.content;\n }\n // Back up if the node directly above openStart, or the node above\n // that separated only by a non-defining textblock node, is defining.\n if (preferredDepth > 0 && leftNodes[preferredDepth - 1].type.spec.defining &&\n $from.node(preferredTargetIndex).type != leftNodes[preferredDepth - 1].type)\n { preferredDepth -= 1; }\n else if (preferredDepth >= 2 && leftNodes[preferredDepth - 1].isTextblock && leftNodes[preferredDepth - 2].type.spec.defining &&\n $from.node(preferredTargetIndex).type != leftNodes[preferredDepth - 2].type)\n { preferredDepth -= 2; }\n\n for (var j = slice.openStart; j >= 0; j--) {\n var openDepth = (j + preferredDepth + 1) % (slice.openStart + 1);\n var insert = leftNodes[openDepth];\n if (!insert) { continue }\n for (var i$1 = 0; i$1 < targetDepths.length; i$1++) {\n // Loop over possible expansion levels, starting with the\n // preferred one\n var targetDepth = targetDepths[(i$1 + preferredTargetIndex) % targetDepths.length], expand = true;\n if (targetDepth < 0) { expand = false; targetDepth = -targetDepth; }\n var parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1);\n if (parent.canReplaceWith(index, index, insert.type, insert.marks))\n { return this.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to,\n new Slice(closeFragment(slice.content, 0, slice.openStart, openDepth),\n openDepth, slice.openEnd)) }\n }\n }\n\n var startSteps = this.steps.length;\n for (var i$2 = targetDepths.length - 1; i$2 >= 0; i$2--) {\n this.replace(from, to, slice);\n if (this.steps.length > startSteps) { break }\n var depth = targetDepths[i$2];\n if (i$2 < 0) { continue }\n from = $from.before(depth); to = $to.after(depth);\n }\n return this\n};\n\nfunction closeFragment(fragment, depth, oldOpen, newOpen, parent) {\n if (depth < oldOpen) {\n var first = fragment.firstChild;\n fragment = fragment.replaceChild(0, first.copy(closeFragment(first.content, depth + 1, oldOpen, newOpen, first)));\n }\n if (depth > newOpen) {\n var match = parent.contentMatchAt(0);\n var start = match.fillBefore(fragment).append(fragment);\n fragment = start.append(match.matchFragment(start).fillBefore(Fragment.empty, true));\n }\n return fragment\n}\n\n// :: (number, number, Node) → this\n// Replace the given range with a node, but use `from` and `to` as\n// hints, rather than precise positions. When from and to are the same\n// and are at the start or end of a parent node in which the given\n// node doesn't fit, this method may _move_ them out towards a parent\n// that does allow the given node to be placed. When the given range\n// completely covers a parent node, this method may completely replace\n// that parent node.\nTransform.prototype.replaceRangeWith = function(from, to, node) {\n if (!node.isInline && from == to && this.doc.resolve(from).parent.content.size) {\n var point = insertPoint(this.doc, from, node.type);\n if (point != null) { from = to = point; }\n }\n return this.replaceRange(from, to, new Slice(Fragment.from(node), 0, 0))\n};\n\n// :: (number, number) → this\n// Delete the given range, expanding it to cover fully covered\n// parent nodes until a valid replace is found.\nTransform.prototype.deleteRange = function(from, to) {\n var $from = this.doc.resolve(from), $to = this.doc.resolve(to);\n var covered = coveredDepths($from, $to);\n for (var i = 0; i < covered.length; i++) {\n var depth = covered[i], last = i == covered.length - 1;\n if ((last && depth == 0) || $from.node(depth).type.contentMatch.validEnd)\n { return this.delete($from.start(depth), $to.end(depth)) }\n if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1))))\n { return this.delete($from.before(depth), $to.after(depth)) }\n }\n for (var d = 1; d <= $from.depth && d <= $to.depth; d++) {\n if (from - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d)\n { return this.delete($from.before(d), to) }\n }\n return this.delete(from, to)\n};\n\n// : (ResolvedPos, ResolvedPos) → [number]\n// Returns an array of all depths for which $from - $to spans the\n// whole content of the nodes at that depth.\nfunction coveredDepths($from, $to) {\n var result = [], minDepth = Math.min($from.depth, $to.depth);\n for (var d = minDepth; d >= 0; d--) {\n var start = $from.start(d);\n if (start < $from.pos - ($from.depth - d) ||\n $to.end(d) > $to.pos + ($to.depth - d) ||\n $from.node(d).type.spec.isolating ||\n $to.node(d).type.spec.isolating) { break }\n if (start == $to.start(d)) { result.push(d); }\n }\n return result\n}\n\nexport { AddMarkStep, MapResult, Mapping, RemoveMarkStep, ReplaceAroundStep, ReplaceStep, Step, StepMap, StepResult, Transform, TransformError, canJoin, canSplit, dropPoint, findWrapping, insertPoint, joinPoint, liftTarget, replaceStep };\n//# sourceMappingURL=index.es.js.map\n","// Utilities\n//\n'use strict';\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction isString(obj) { return _class(obj) === '[object String]'; }\n\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction has(object, key) {\n return _hasOwnProperty.call(object, key);\n}\n\n// Merge objects\n//\nfunction assign(obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n\n sources.forEach(function (source) {\n if (!source) { return; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be object');\n }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key];\n });\n });\n\n return obj;\n}\n\n// Remove element from array and put another array at those position.\n// Useful for some operations with tokens\nfunction arrayReplaceAt(src, pos, newElements) {\n return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1));\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction isValidEntityCode(c) {\n /*eslint no-bitwise:0*/\n // broken sequence\n if (c >= 0xD800 && c <= 0xDFFF) { return false; }\n // never used\n if (c >= 0xFDD0 && c <= 0xFDEF) { return false; }\n if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false; }\n // control codes\n if (c >= 0x00 && c <= 0x08) { return false; }\n if (c === 0x0B) { return false; }\n if (c >= 0x0E && c <= 0x1F) { return false; }\n if (c >= 0x7F && c <= 0x9F) { return false; }\n // out of range\n if (c > 0x10FFFF) { return false; }\n return true;\n}\n\nfunction fromCodePoint(c) {\n /*eslint no-bitwise:0*/\n if (c > 0xffff) {\n c -= 0x10000;\n var surrogate1 = 0xd800 + (c >> 10),\n surrogate2 = 0xdc00 + (c & 0x3ff);\n\n return String.fromCharCode(surrogate1, surrogate2);\n }\n return String.fromCharCode(c);\n}\n\n\nvar UNESCAPE_MD_RE = /\\\\([!\"#$%&'()*+,\\-.\\/:;<=>?@[\\\\\\]^_`{|}~])/g;\nvar ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi;\nvar UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi');\n\nvar DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;\n\nvar entities = require('./entities');\n\nfunction replaceEntityPattern(match, name) {\n var code = 0;\n\n if (has(entities, name)) {\n return entities[name];\n }\n\n if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n code = name[1].toLowerCase() === 'x' ?\n parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10);\n\n if (isValidEntityCode(code)) {\n return fromCodePoint(code);\n }\n }\n\n return match;\n}\n\n/*function replaceEntities(str) {\n if (str.indexOf('&') < 0) { return str; }\n\n return str.replace(ENTITY_RE, replaceEntityPattern);\n}*/\n\nfunction unescapeMd(str) {\n if (str.indexOf('\\\\') < 0) { return str; }\n return str.replace(UNESCAPE_MD_RE, '$1');\n}\n\nfunction unescapeAll(str) {\n if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str; }\n\n return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n if (escaped) { return escaped; }\n return replaceEntityPattern(match, entity);\n });\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar HTML_ESCAPE_TEST_RE = /[&<>\"]/;\nvar HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g;\nvar HTML_REPLACEMENTS = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"'\n};\n\nfunction replaceUnsafeChar(ch) {\n return HTML_REPLACEMENTS[ch];\n}\n\nfunction escapeHtml(str) {\n if (HTML_ESCAPE_TEST_RE.test(str)) {\n return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar);\n }\n return str;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g;\n\nfunction escapeRE(str) {\n return str.replace(REGEXP_ESCAPE_RE, '\\\\$&');\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction isSpace(code) {\n switch (code) {\n case 0x09:\n case 0x20:\n return true;\n }\n return false;\n}\n\n// Zs (unicode class) || [\\t\\f\\v\\r\\n]\nfunction isWhiteSpace(code) {\n if (code >= 0x2000 && code <= 0x200A) { return true; }\n switch (code) {\n case 0x09: // \\t\n case 0x0A: // \\n\n case 0x0B: // \\v\n case 0x0C: // \\f\n case 0x0D: // \\r\n case 0x20:\n case 0xA0:\n case 0x1680:\n case 0x202F:\n case 0x205F:\n case 0x3000:\n return true;\n }\n return false;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/*eslint-disable max-len*/\nvar UNICODE_PUNCT_RE = require('uc.micro/categories/P/regex');\n\n// Currently without astral characters support.\nfunction isPunctChar(ch) {\n return UNICODE_PUNCT_RE.test(ch);\n}\n\n\n// Markdown ASCII punctuation characters.\n//\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\n//\n// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.\n//\nfunction isMdAsciiPunct(ch) {\n switch (ch) {\n case 0x21/* ! */:\n case 0x22/* \" */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x27/* ' */:\n case 0x28/* ( */:\n case 0x29/* ) */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2C/* , */:\n case 0x2D/* - */:\n case 0x2E/* . */:\n case 0x2F/* / */:\n case 0x3A/* : */:\n case 0x3B/* ; */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x3F/* ? */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7C/* | */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true;\n default:\n return false;\n }\n}\n\n// Hepler to unify [reference labels].\n//\nfunction normalizeReference(str) {\n // Trim and collapse whitespace\n //\n str = str.trim().replace(/\\s+/g, ' ');\n\n // In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug\n // fixed in v12 (couldn't find any details).\n //\n // So treat this one as a special case\n // (remove this when node v10 is no longer supported).\n //\n if ('ẞ'.toLowerCase() === 'Ṿ') {\n str = str.replace(/ẞ/g, 'ß');\n }\n\n // .toLowerCase().toUpperCase() should get rid of all differences\n // between letter variants.\n //\n // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently\n // uppercased versions).\n //\n // Here's an example showing how it happens. Lets take greek letter omega:\n // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)\n //\n // Unicode entries:\n // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n // 03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8;\n //\n // Case-insensitive comparison should treat all of them as equivalent.\n //\n // But .toLowerCase() doesn't change ϑ (it's already lowercase),\n // and .toUpperCase() doesn't change ϴ (already uppercase).\n //\n // Applying first lower then upper case normalizes any character:\n // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n //\n // Note: this is equivalent to unicode case folding; unicode normalization\n // is a different step that is not required here.\n //\n // Final result should be uppercased, because it's later stored in an object\n // (this avoid a conflict with Object.prototype members,\n // most notably, `__proto__`)\n //\n return str.toLowerCase().toUpperCase();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Re-export libraries commonly used in both markdown-it and its plugins,\n// so plugins won't have to depend on them explicitly, which reduces their\n// bundled size (e.g. a browser build).\n//\nexports.lib = {};\nexports.lib.mdurl = require('mdurl');\nexports.lib.ucmicro = require('uc.micro');\n\nexports.assign = assign;\nexports.isString = isString;\nexports.has = has;\nexports.unescapeMd = unescapeMd;\nexports.unescapeAll = unescapeAll;\nexports.isValidEntityCode = isValidEntityCode;\nexports.fromCodePoint = fromCodePoint;\n// exports.replaceEntities = replaceEntities;\nexports.escapeHtml = escapeHtml;\nexports.arrayReplaceAt = arrayReplaceAt;\nexports.isSpace = isSpace;\nexports.isWhiteSpace = isWhiteSpace;\nexports.isMdAsciiPunct = isMdAsciiPunct;\nexports.isPunctChar = isPunctChar;\nexports.escapeRE = escapeRE;\nexports.normalizeReference = normalizeReference;\n","import { Plugin } from 'prosemirror-state';\nimport { findWrapping, canJoin } from 'prosemirror-transform';\n\n// ::- Input rules are regular expressions describing a piece of text\n// that, when typed, causes something to happen. This might be\n// changing two dashes into an emdash, wrapping a paragraph starting\n// with `\"> \"` into a blockquote, or something entirely different.\nvar InputRule = function InputRule(match, handler) {\n this.match = match;\n this.handler = typeof handler == \"string\" ? stringHandler(handler) : handler;\n};\n\nfunction stringHandler(string) {\n return function(state, match, start, end) {\n var insert = string;\n if (match[1]) {\n var offset = match[0].lastIndexOf(match[1]);\n insert += match[0].slice(offset + match[1].length);\n start += offset;\n var cutOff = start - end;\n if (cutOff > 0) {\n insert = match[0].slice(offset - cutOff, offset) + insert;\n start = end;\n }\n }\n return state.tr.insertText(insert, start, end)\n }\n}\n\nvar MAX_MATCH = 500;\n\n// :: (config: {rules: [InputRule]}) → Plugin\n// Create an input rules plugin. When enabled, it will cause text\n// input that matches any of the given rules to trigger the rule's\n// action.\nfunction inputRules(ref) {\n var rules = ref.rules;\n\n var plugin = new Plugin({\n state: {\n init: function init() { return null },\n apply: function apply(tr, prev) {\n var stored = tr.getMeta(this);\n if (stored) { return stored }\n return tr.selectionSet || tr.docChanged ? null : prev\n }\n },\n\n props: {\n handleTextInput: function handleTextInput(view, from, to, text) {\n return run(view, from, to, text, rules, plugin)\n },\n handleDOMEvents: {\n compositionend: function (view) {\n setTimeout(function () {\n var ref = view.state.selection;\n var $cursor = ref.$cursor;\n if ($cursor) { run(view, $cursor.pos, $cursor.pos, \"\", rules, plugin); }\n });\n }\n }\n },\n\n isInputRules: true\n });\n return plugin\n}\n\nfunction run(view, from, to, text, rules, plugin) {\n if (view.composing) { return false }\n var state = view.state, $from = state.doc.resolve(from);\n if ($from.parent.type.spec.code) { return false }\n var textBefore = $from.parent.textBetween(Math.max(0, $from.parentOffset - MAX_MATCH), $from.parentOffset,\n null, \"\\ufffc\") + text;\n for (var i = 0; i < rules.length; i++) {\n var match = rules[i].match.exec(textBefore);\n var tr = match && rules[i].handler(state, match, from - (match[0].length - text.length), to);\n if (!tr) { continue }\n view.dispatch(tr.setMeta(plugin, {transform: tr, from: from, to: to, text: text}));\n return true\n }\n return false\n}\n\n// :: (EditorState, ?(Transaction)) → bool\n// This is a command that will undo an input rule, if applying such a\n// rule was the last thing that the user did.\nfunction undoInputRule(state, dispatch) {\n var plugins = state.plugins;\n for (var i = 0; i < plugins.length; i++) {\n var plugin = plugins[i], undoable = (void 0);\n if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) {\n if (dispatch) {\n var tr = state.tr, toUndo = undoable.transform;\n for (var j = toUndo.steps.length - 1; j >= 0; j--)\n { tr.step(toUndo.steps[j].invert(toUndo.docs[j])); }\n if (undoable.text) {\n var marks = tr.doc.resolve(undoable.from).marks();\n tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks));\n } else {\n tr.delete(undoable.from, undoable.to);\n }\n dispatch(tr);\n }\n return true\n }\n }\n return false\n}\n\n// :: InputRule Converts double dashes to an emdash.\nvar emDash = new InputRule(/--$/, \"—\");\n// :: InputRule Converts three dots to an ellipsis character.\nvar ellipsis = new InputRule(/\\.\\.\\.$/, \"…\");\n// :: InputRule “Smart” opening double quotes.\nvar openDoubleQuote = new InputRule(/(?:^|[\\s\\{\\[\\(\\<'\"\\u2018\\u201C])(\")$/, \"“\");\n// :: InputRule “Smart” closing double quotes.\nvar closeDoubleQuote = new InputRule(/\"$/, \"”\");\n// :: InputRule “Smart” opening single quotes.\nvar openSingleQuote = new InputRule(/(?:^|[\\s\\{\\[\\(\\<'\"\\u2018\\u201C])(')$/, \"‘\");\n// :: InputRule “Smart” closing single quotes.\nvar closeSingleQuote = new InputRule(/'$/, \"’\");\n\n// :: [InputRule] Smart-quote related input rules.\nvar smartQuotes = [openDoubleQuote, closeDoubleQuote, openSingleQuote, closeSingleQuote];\n\n// :: (RegExp, NodeType, ?union, ?([string], Node) → bool) → InputRule\n// Build an input rule for automatically wrapping a textblock when a\n// given string is typed. The `regexp` argument is\n// directly passed through to the `InputRule` constructor. You'll\n// probably want the regexp to start with `^`, so that the pattern can\n// only occur at the start of a textblock.\n//\n// `nodeType` is the type of node to wrap in. If it needs attributes,\n// you can either pass them directly, or pass a function that will\n// compute them from the regular expression match.\n//\n// By default, if there's a node with the same type above the newly\n// wrapped node, the rule will try to [join](#transform.Transform.join) those\n// two nodes. You can pass a join predicate, which takes a regular\n// expression match and the node before the wrapped node, and can\n// return a boolean to indicate whether a join should happen.\nfunction wrappingInputRule(regexp, nodeType, getAttrs, joinPredicate) {\n return new InputRule(regexp, function (state, match, start, end) {\n var attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n var tr = state.tr.delete(start, end);\n var $start = tr.doc.resolve(start), range = $start.blockRange(), wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping) { return null }\n tr.wrap(range, wrapping);\n var before = tr.doc.resolve(start - 1).nodeBefore;\n if (before && before.type == nodeType && canJoin(tr.doc, start - 1) &&\n (!joinPredicate || joinPredicate(match, before)))\n { tr.join(start - 1); }\n return tr\n })\n}\n\n// :: (RegExp, NodeType, ?union) → InputRule\n// Build an input rule that changes the type of a textblock when the\n// matched text is typed into it. You'll usually want to start your\n// regexp with `^` to that it is only matched at the start of a\n// textblock. The optional `getAttrs` parameter can be used to compute\n// the new node's attributes, and works the same as in the\n// `wrappingInputRule` function.\nfunction textblockTypeInputRule(regexp, nodeType, getAttrs) {\n return new InputRule(regexp, function (state, match, start, end) {\n var $start = state.doc.resolve(start);\n var attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), nodeType)) { return null }\n return state.tr\n .delete(start, end)\n .setBlockType(start, start, nodeType, attrs)\n })\n}\n\nexport { InputRule, closeDoubleQuote, closeSingleQuote, ellipsis, emDash, inputRules, openDoubleQuote, openSingleQuote, smartQuotes, textblockTypeInputRule, undoInputRule, wrappingInputRule };\n//# sourceMappingURL=index.es.js.map\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"@babel/runtime/helpers/esm/setPrototypeOf\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","import { Schema, Mark } from 'prosemirror-model';\nimport markdownit from 'markdown-it';\n\n// ::Schema Document schema for the data model used by CommonMark.\nvar schema = new Schema({\n nodes: {\n doc: {\n content: \"block+\"\n },\n\n paragraph: {\n content: \"inline*\",\n group: \"block\",\n parseDOM: [{tag: \"p\"}],\n toDOM: function toDOM() { return [\"p\", 0] }\n },\n\n blockquote: {\n content: \"block+\",\n group: \"block\",\n parseDOM: [{tag: \"blockquote\"}],\n toDOM: function toDOM() { return [\"blockquote\", 0] }\n },\n\n horizontal_rule: {\n group: \"block\",\n parseDOM: [{tag: \"hr\"}],\n toDOM: function toDOM() { return [\"div\", [\"hr\"]] }\n },\n\n heading: {\n attrs: {level: {default: 1}},\n content: \"(text | image)*\",\n group: \"block\",\n defining: true,\n parseDOM: [{tag: \"h1\", attrs: {level: 1}},\n {tag: \"h2\", attrs: {level: 2}},\n {tag: \"h3\", attrs: {level: 3}},\n {tag: \"h4\", attrs: {level: 4}},\n {tag: \"h5\", attrs: {level: 5}},\n {tag: \"h6\", attrs: {level: 6}}],\n toDOM: function toDOM(node) { return [\"h\" + node.attrs.level, 0] }\n },\n\n code_block: {\n content: \"text*\",\n group: \"block\",\n code: true,\n defining: true,\n marks: \"\",\n attrs: {params: {default: \"\"}},\n parseDOM: [{tag: \"pre\", preserveWhitespace: \"full\", getAttrs: function (node) { return (\n {params: node.getAttribute(\"data-params\") || \"\"}\n ); }}],\n toDOM: function toDOM(node) { return [\"pre\", node.attrs.params ? {\"data-params\": node.attrs.params} : {}, [\"code\", 0]] }\n },\n\n ordered_list: {\n content: \"list_item+\",\n group: \"block\",\n attrs: {order: {default: 1}, tight: {default: false}},\n parseDOM: [{tag: \"ol\", getAttrs: function getAttrs(dom) {\n return {order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\") : 1,\n tight: dom.hasAttribute(\"data-tight\")}\n }}],\n toDOM: function toDOM(node) {\n return [\"ol\", {start: node.attrs.order == 1 ? null : node.attrs.order,\n \"data-tight\": node.attrs.tight ? \"true\" : null}, 0]\n }\n },\n\n bullet_list: {\n content: \"list_item+\",\n group: \"block\",\n attrs: {tight: {default: false}},\n parseDOM: [{tag: \"ul\", getAttrs: function (dom) { return ({tight: dom.hasAttribute(\"data-tight\")}); }}],\n toDOM: function toDOM(node) { return [\"ul\", {\"data-tight\": node.attrs.tight ? \"true\" : null}, 0] }\n },\n\n list_item: {\n content: \"paragraph block*\",\n defining: true,\n parseDOM: [{tag: \"li\"}],\n toDOM: function toDOM() { return [\"li\", 0] }\n },\n\n text: {\n group: \"inline\"\n },\n\n image: {\n inline: true,\n attrs: {\n src: {},\n alt: {default: null},\n title: {default: null}\n },\n group: \"inline\",\n draggable: true,\n parseDOM: [{tag: \"img[src]\", getAttrs: function getAttrs(dom) {\n return {\n src: dom.getAttribute(\"src\"),\n title: dom.getAttribute(\"title\"),\n alt: dom.getAttribute(\"alt\")\n }\n }}],\n toDOM: function toDOM(node) { return [\"img\", node.attrs] }\n },\n\n hard_break: {\n inline: true,\n group: \"inline\",\n selectable: false,\n parseDOM: [{tag: \"br\"}],\n toDOM: function toDOM() { return [\"br\"] }\n }\n },\n\n marks: {\n em: {\n parseDOM: [{tag: \"i\"}, {tag: \"em\"},\n {style: \"font-style\", getAttrs: function (value) { return value == \"italic\" && null; }}],\n toDOM: function toDOM() { return [\"em\"] }\n },\n\n strong: {\n parseDOM: [{tag: \"b\"}, {tag: \"strong\"},\n {style: \"font-weight\", getAttrs: function (value) { return /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null; }}],\n toDOM: function toDOM() { return [\"strong\"] }\n },\n\n link: {\n attrs: {\n href: {},\n title: {default: null}\n },\n inclusive: false,\n parseDOM: [{tag: \"a[href]\", getAttrs: function getAttrs(dom) {\n return {href: dom.getAttribute(\"href\"), title: dom.getAttribute(\"title\")}\n }}],\n toDOM: function toDOM(node) { return [\"a\", node.attrs] }\n },\n\n code: {\n parseDOM: [{tag: \"code\"}],\n toDOM: function toDOM() { return [\"code\"] }\n }\n }\n});\n\nfunction maybeMerge(a, b) {\n if (a.isText && b.isText && Mark.sameSet(a.marks, b.marks))\n { return a.withText(a.text + b.text) }\n}\n\n// Object used to track the context of a running parse.\nvar MarkdownParseState = function MarkdownParseState(schema, tokenHandlers) {\n this.schema = schema;\n this.stack = [{type: schema.topNodeType, content: []}];\n this.marks = Mark.none;\n this.tokenHandlers = tokenHandlers;\n};\n\nMarkdownParseState.prototype.top = function top () {\n return this.stack[this.stack.length - 1]\n};\n\nMarkdownParseState.prototype.push = function push (elt) {\n if (this.stack.length) { this.top().content.push(elt); }\n};\n\n// : (string)\n// Adds the given text to the current position in the document,\n// using the current marks as styling.\nMarkdownParseState.prototype.addText = function addText (text) {\n if (!text) { return }\n var nodes = this.top().content, last = nodes[nodes.length - 1];\n var node = this.schema.text(text, this.marks), merged;\n if (last && (merged = maybeMerge(last, node))) { nodes[nodes.length - 1] = merged; }\n else { nodes.push(node); }\n};\n\n// : (Mark)\n// Adds the given mark to the set of active marks.\nMarkdownParseState.prototype.openMark = function openMark (mark) {\n this.marks = mark.addToSet(this.marks);\n};\n\n// : (Mark)\n// Removes the given mark from the set of active marks.\nMarkdownParseState.prototype.closeMark = function closeMark (mark) {\n this.marks = mark.removeFromSet(this.marks);\n};\n\nMarkdownParseState.prototype.parseTokens = function parseTokens (toks) {\n for (var i = 0; i < toks.length; i++) {\n var tok = toks[i];\n var handler = this.tokenHandlers[tok.type];\n if (!handler)\n { throw new Error(\"Token type `\" + tok.type + \"` not supported by Markdown parser\") }\n handler(this, tok, toks, i);\n }\n};\n\n// : (NodeType, ?Object, ?[Node]) → ?Node\n// Add a node at the current position.\nMarkdownParseState.prototype.addNode = function addNode (type, attrs, content) {\n var node = type.createAndFill(attrs, content, this.marks);\n if (!node) { return null }\n this.push(node);\n return node\n};\n\n// : (NodeType, ?Object)\n// Wrap subsequent content in a node of the given type.\nMarkdownParseState.prototype.openNode = function openNode (type, attrs) {\n this.stack.push({type: type, attrs: attrs, content: []});\n};\n\n// : () → ?Node\n// Close and return the node that is currently on top of the stack.\nMarkdownParseState.prototype.closeNode = function closeNode () {\n if (this.marks.length) { this.marks = Mark.none; }\n var info = this.stack.pop();\n return this.addNode(info.type, info.attrs, info.content)\n};\n\nfunction attrs(spec, token, tokens, i) {\n if (spec.getAttrs) { return spec.getAttrs(token, tokens, i) }\n // For backwards compatibility when `attrs` is a Function\n else if (spec.attrs instanceof Function) { return spec.attrs(token) }\n else { return spec.attrs }\n}\n\n// Code content is represented as a single token with a `content`\n// property in Markdown-it.\nfunction noCloseToken(spec, type) {\n return spec.noCloseToken || type == \"code_inline\" || type == \"code_block\" || type == \"fence\"\n}\n\nfunction withoutTrailingNewline(str) {\n return str[str.length - 1] == \"\\n\" ? str.slice(0, str.length - 1) : str\n}\n\nfunction noOp() {}\n\nfunction tokenHandlers(schema, tokens) {\n var handlers = Object.create(null);\n var loop = function ( type ) {\n var spec = tokens[type];\n if (spec.block) {\n var nodeType = schema.nodeType(spec.block);\n if (noCloseToken(spec, type)) {\n handlers[type] = function (state, tok, tokens, i) {\n state.openNode(nodeType, attrs(spec, tok, tokens, i));\n state.addText(withoutTrailingNewline(tok.content));\n state.closeNode();\n };\n } else {\n handlers[type + \"_open\"] = function (state, tok, tokens, i) { return state.openNode(nodeType, attrs(spec, tok, tokens, i)); };\n handlers[type + \"_close\"] = function (state) { return state.closeNode(); };\n }\n } else if (spec.node) {\n var nodeType$1 = schema.nodeType(spec.node);\n handlers[type] = function (state, tok, tokens, i) { return state.addNode(nodeType$1, attrs(spec, tok, tokens, i)); };\n } else if (spec.mark) {\n var markType = schema.marks[spec.mark];\n if (noCloseToken(spec, type)) {\n handlers[type] = function (state, tok, tokens, i) {\n state.openMark(markType.create(attrs(spec, tok, tokens, i)));\n state.addText(withoutTrailingNewline(tok.content));\n state.closeMark(markType);\n };\n } else {\n handlers[type + \"_open\"] = function (state, tok, tokens, i) { return state.openMark(markType.create(attrs(spec, tok, tokens, i))); };\n handlers[type + \"_close\"] = function (state) { return state.closeMark(markType); };\n }\n } else if (spec.ignore) {\n if (noCloseToken(spec, type)) {\n handlers[type] = noOp;\n } else {\n handlers[type + '_open'] = noOp;\n handlers[type + '_close'] = noOp;\n }\n } else {\n throw new RangeError(\"Unrecognized parsing spec \" + JSON.stringify(spec))\n }\n };\n\n for (var type in tokens) loop( type );\n\n handlers.text = function (state, tok) { return state.addText(tok.content); };\n handlers.inline = function (state, tok) { return state.parseTokens(tok.children); };\n handlers.softbreak = handlers.softbreak || (function (state) { return state.addText(\"\\n\"); });\n\n return handlers\n}\n\n// ::- A configuration of a Markdown parser. Such a parser uses\n// [markdown-it](https://github.com/markdown-it/markdown-it) to\n// tokenize a file, and then runs the custom rules it is given over\n// the tokens to create a ProseMirror document tree.\nvar MarkdownParser = function MarkdownParser(schema, tokenizer, tokens) {\n // :: Object The value of the `tokens` object used to construct\n // this parser. Can be useful to copy and modify to base other\n // parsers on.\n this.tokens = tokens;\n this.schema = schema;\n this.tokenizer = tokenizer;\n this.tokenHandlers = tokenHandlers(schema, tokens);\n};\n\n// :: (string) → Node\n// Parse a string as [CommonMark](http://commonmark.org/) markup,\n// and create a ProseMirror document as prescribed by this parser's\n// rules.\nMarkdownParser.prototype.parse = function parse (text) {\n var state = new MarkdownParseState(this.schema, this.tokenHandlers), doc;\n state.parseTokens(this.tokenizer.parse(text, {}));\n do { doc = state.closeNode(); } while (state.stack.length)\n return doc\n};\n\nfunction listIsTight(tokens, i) {\n while (++i < tokens.length)\n { if (tokens[i].type != \"list_item_open\") { return tokens[i].hidden } }\n return false\n}\n\n// :: MarkdownParser\n// A parser parsing unextended [CommonMark](http://commonmark.org/),\n// without inline HTML, and producing a document in the basic schema.\nvar defaultMarkdownParser = new MarkdownParser(schema, markdownit(\"commonmark\", {html: false}), {\n blockquote: {block: \"blockquote\"},\n paragraph: {block: \"paragraph\"},\n list_item: {block: \"list_item\"},\n bullet_list: {block: \"bullet_list\", getAttrs: function (_, tokens, i) { return ({tight: listIsTight(tokens, i)}); }},\n ordered_list: {block: \"ordered_list\", getAttrs: function (tok, tokens, i) { return ({\n order: +tok.attrGet(\"start\") || 1,\n tight: listIsTight(tokens, i)\n }); }},\n heading: {block: \"heading\", getAttrs: function (tok) { return ({level: +tok.tag.slice(1)}); }},\n code_block: {block: \"code_block\", noCloseToken: true},\n fence: {block: \"code_block\", getAttrs: function (tok) { return ({params: tok.info || \"\"}); }, noCloseToken: true},\n hr: {node: \"horizontal_rule\"},\n image: {node: \"image\", getAttrs: function (tok) { return ({\n src: tok.attrGet(\"src\"),\n title: tok.attrGet(\"title\") || null,\n alt: tok.children[0] && tok.children[0].content || null\n }); }},\n hardbreak: {node: \"hard_break\"},\n\n em: {mark: \"em\"},\n strong: {mark: \"strong\"},\n link: {mark: \"link\", getAttrs: function (tok) { return ({\n href: tok.attrGet(\"href\"),\n title: tok.attrGet(\"title\") || null\n }); }},\n code_inline: {mark: \"code\", noCloseToken: true}\n});\n\n// ::- A specification for serializing a ProseMirror document as\n// Markdown/CommonMark text.\nvar MarkdownSerializer = function MarkdownSerializer(nodes, marks) {\n // :: Object<(MarkdownSerializerState, Node)> The node serializer\n // functions for this serializer.\n this.nodes = nodes;\n // :: Object The mark serializer info.\n this.marks = marks;\n};\n\n// :: (Node, ?Object) → string\n// Serialize the content of the given node to\n// [CommonMark](http://commonmark.org/).\nMarkdownSerializer.prototype.serialize = function serialize (content, options) {\n var state = new MarkdownSerializerState(this.nodes, this.marks, options);\n state.renderContent(content);\n return state.out\n};\n\n// :: MarkdownSerializer\n// A serializer for the [basic schema](#schema).\nvar defaultMarkdownSerializer = new MarkdownSerializer({\n blockquote: function blockquote(state, node) {\n state.wrapBlock(\"> \", null, node, function () { return state.renderContent(node); });\n },\n code_block: function code_block(state, node) {\n state.write(\"```\" + (node.attrs.params || \"\") + \"\\n\");\n state.text(node.textContent, false);\n state.ensureNewLine();\n state.write(\"```\");\n state.closeBlock(node);\n },\n heading: function heading(state, node) {\n state.write(state.repeat(\"#\", node.attrs.level) + \" \");\n state.renderInline(node);\n state.closeBlock(node);\n },\n horizontal_rule: function horizontal_rule(state, node) {\n state.write(node.attrs.markup || \"---\");\n state.closeBlock(node);\n },\n bullet_list: function bullet_list(state, node) {\n state.renderList(node, \" \", function () { return (node.attrs.bullet || \"*\") + \" \"; });\n },\n ordered_list: function ordered_list(state, node) {\n var start = node.attrs.order || 1;\n var maxW = String(start + node.childCount - 1).length;\n var space = state.repeat(\" \", maxW + 2);\n state.renderList(node, space, function (i) {\n var nStr = String(start + i);\n return state.repeat(\" \", maxW - nStr.length) + nStr + \". \"\n });\n },\n list_item: function list_item(state, node) {\n state.renderContent(node);\n },\n paragraph: function paragraph(state, node) {\n state.renderInline(node);\n state.closeBlock(node);\n },\n\n image: function image(state, node) {\n state.write(\"![\" + state.esc(node.attrs.alt || \"\") + \"](\" + state.esc(node.attrs.src) +\n (node.attrs.title ? \" \" + state.quote(node.attrs.title) : \"\") + \")\");\n },\n hard_break: function hard_break(state, node, parent, index) {\n for (var i = index + 1; i < parent.childCount; i++)\n { if (parent.child(i).type != node.type) {\n state.write(\"\\\\\\n\");\n return\n } }\n },\n text: function text(state, node) {\n state.text(node.text);\n }\n}, {\n em: {open: \"*\", close: \"*\", mixable: true, expelEnclosingWhitespace: true},\n strong: {open: \"**\", close: \"**\", mixable: true, expelEnclosingWhitespace: true},\n link: {\n open: function open(_state, mark, parent, index) {\n return isPlainURL(mark, parent, index, 1) ? \"<\" : \"[\"\n },\n close: function close(state, mark, parent, index) {\n return isPlainURL(mark, parent, index, -1) ? \">\"\n : \"](\" + state.esc(mark.attrs.href) + (mark.attrs.title ? \" \" + state.quote(mark.attrs.title) : \"\") + \")\"\n }\n },\n code: {open: function open(_state, _mark, parent, index) { return backticksFor(parent.child(index), -1) },\n close: function close(_state, _mark, parent, index) { return backticksFor(parent.child(index - 1), 1) },\n escape: false}\n});\n\nfunction backticksFor(node, side) {\n var ticks = /`+/g, m, len = 0;\n if (node.isText) { while (m = ticks.exec(node.text)) { len = Math.max(len, m[0].length); } }\n var result = len > 0 && side > 0 ? \" `\" : \"`\";\n for (var i = 0; i < len; i++) { result += \"`\"; }\n if (len > 0 && side < 0) { result += \" \"; }\n return result\n}\n\nfunction isPlainURL(link, parent, index, side) {\n if (link.attrs.title || !/^\\w+:/.test(link.attrs.href)) { return false }\n var content = parent.child(index + (side < 0 ? -1 : 0));\n if (!content.isText || content.text != link.attrs.href || content.marks[content.marks.length - 1] != link) { return false }\n if (index == (side < 0 ? 1 : parent.childCount - 1)) { return true }\n var next = parent.child(index + (side < 0 ? -2 : 1));\n return !link.isInSet(next.marks)\n}\n\n// ::- This is an object used to track state and expose\n// methods related to markdown serialization. Instances are passed to\n// node and mark serialization methods (see `toMarkdown`).\nvar MarkdownSerializerState = function MarkdownSerializerState(nodes, marks, options) {\n this.nodes = nodes;\n this.marks = marks;\n this.delim = this.out = \"\";\n this.closed = false;\n this.inTightList = false;\n // :: Object\n // The options passed to the serializer.\n // tightLists:: ?bool\n // Whether to render lists in a tight style. This can be overridden\n // on a node level by specifying a tight attribute on the node.\n // Defaults to false.\n this.options = options || {};\n if (typeof this.options.tightLists == \"undefined\")\n { this.options.tightLists = false; }\n};\n\nMarkdownSerializerState.prototype.flushClose = function flushClose (size) {\n if (this.closed) {\n if (!this.atBlank()) { this.out += \"\\n\"; }\n if (size == null) { size = 2; }\n if (size > 1) {\n var delimMin = this.delim;\n var trim = /\\s+$/.exec(delimMin);\n if (trim) { delimMin = delimMin.slice(0, delimMin.length - trim[0].length); }\n for (var i = 1; i < size; i++)\n { this.out += delimMin + \"\\n\"; }\n }\n this.closed = false;\n }\n};\n\n// :: (string, ?string, Node, ())\n// Render a block, prefixing each line with `delim`, and the first\n// line in `firstDelim`. `node` should be the node that is closed at\n// the end of the block, and `f` is a function that renders the\n// content of the block.\nMarkdownSerializerState.prototype.wrapBlock = function wrapBlock (delim, firstDelim, node, f) {\n var old = this.delim;\n this.write(firstDelim || delim);\n this.delim += delim;\n f();\n this.delim = old;\n this.closeBlock(node);\n};\n\nMarkdownSerializerState.prototype.atBlank = function atBlank () {\n return /(^|\\n)$/.test(this.out)\n};\n\n// :: ()\n// Ensure the current content ends with a newline.\nMarkdownSerializerState.prototype.ensureNewLine = function ensureNewLine () {\n if (!this.atBlank()) { this.out += \"\\n\"; }\n};\n\n// :: (?string)\n// Prepare the state for writing output (closing closed paragraphs,\n// adding delimiters, and so on), and then optionally add content\n// (unescaped) to the output.\nMarkdownSerializerState.prototype.write = function write (content) {\n this.flushClose();\n if (this.delim && this.atBlank())\n { this.out += this.delim; }\n if (content) { this.out += content; }\n};\n\n// :: (Node)\n// Close the block for the given node.\nMarkdownSerializerState.prototype.closeBlock = function closeBlock (node) {\n this.closed = node;\n};\n\n// :: (string, ?bool)\n// Add the given text to the document. When escape is not `false`,\n// it will be escaped.\nMarkdownSerializerState.prototype.text = function text (text$1, escape) {\n var lines = text$1.split(\"\\n\");\n for (var i = 0; i < lines.length; i++) {\n var startOfLine = this.atBlank() || this.closed;\n this.write();\n this.out += escape !== false ? this.esc(lines[i], startOfLine) : lines[i];\n if (i != lines.length - 1) { this.out += \"\\n\"; }\n }\n};\n\n// :: (Node)\n// Render the given node as a block.\nMarkdownSerializerState.prototype.render = function render (node, parent, index) {\n if (typeof parent == \"number\") { throw new Error(\"!\") }\n if (!this.nodes[node.type.name]) { throw new Error(\"Token type `\" + node.type.name + \"` not supported by Markdown renderer\") }\n this.nodes[node.type.name](this, node, parent, index);\n};\n\n// :: (Node)\n// Render the contents of `parent` as block nodes.\nMarkdownSerializerState.prototype.renderContent = function renderContent (parent) {\n var this$1 = this;\n\n parent.forEach(function (node, _, i) { return this$1.render(node, parent, i); });\n};\n\n// :: (Node)\n// Render the contents of `parent` as inline content.\nMarkdownSerializerState.prototype.renderInline = function renderInline (parent) {\n var this$1 = this;\n\n var active = [], trailing = \"\";\n var progress = function (node, _, index) {\n var marks = node ? node.marks : [];\n\n // Remove marks from `hard_break` that are the last node inside\n // that mark to prevent parser edge cases with new lines just\n // before closing marks.\n // (FIXME it'd be nice if we had a schema-agnostic way to\n // identify nodes that serialize as hard breaks)\n if (node && node.type.name === \"hard_break\")\n { marks = marks.filter(function (m) {\n if (index + 1 == parent.childCount) { return false }\n var next = parent.child(index + 1);\n return m.isInSet(next.marks) && (!next.isText || /\\S/.test(next.text))\n }); }\n\n var leading = trailing;\n trailing = \"\";\n // If whitespace has to be expelled from the node, adjust\n // leading and trailing accordingly.\n if (node && node.isText && marks.some(function (mark) {\n var info = this$1.marks[mark.type.name];\n return info && info.expelEnclosingWhitespace\n })) {\n var ref = /^(\\s*)(.*?)(\\s*)$/m.exec(node.text);\n var _$1 = ref[0];\n var lead = ref[1];\n var inner$1 = ref[2];\n var trail = ref[3];\n leading += lead;\n trailing = trail;\n if (lead || trail) {\n node = inner$1 ? node.withText(inner$1) : null;\n if (!node) { marks = active; }\n }\n }\n\n var inner = marks.length && marks[marks.length - 1], noEsc = inner && this$1.marks[inner.type.name].escape === false;\n var len = marks.length - (noEsc ? 1 : 0);\n\n // Try to reorder 'mixable' marks, such as em and strong, which\n // in Markdown may be opened and closed in different order, so\n // that order of the marks for the token matches the order in\n // active.\n outer: for (var i = 0; i < len; i++) {\n var mark = marks[i];\n if (!this$1.marks[mark.type.name].mixable) { break }\n for (var j = 0; j < active.length; j++) {\n var other = active[j];\n if (!this$1.marks[other.type.name].mixable) { break }\n if (mark.eq(other)) {\n if (i > j)\n { marks = marks.slice(0, j).concat(mark).concat(marks.slice(j, i)).concat(marks.slice(i + 1, len)); }\n else if (j > i)\n { marks = marks.slice(0, i).concat(marks.slice(i + 1, j)).concat(mark).concat(marks.slice(j, len)); }\n continue outer\n }\n }\n }\n\n // Find the prefix of the mark set that didn't change\n var keep = 0;\n while (keep < Math.min(active.length, len) && marks[keep].eq(active[keep])) { ++keep; }\n\n // Close the marks that need to be closed\n while (keep < active.length)\n { this$1.text(this$1.markString(active.pop(), false, parent, index), false); }\n\n // Output any previously expelled trailing whitespace outside the marks\n if (leading) { this$1.text(leading); }\n\n // Open the marks that need to be opened\n if (node) {\n while (active.length < len) {\n var add = marks[active.length];\n active.push(add);\n this$1.text(this$1.markString(add, true, parent, index), false);\n }\n\n // Render the node. Special case code marks, since their content\n // may not be escaped.\n if (noEsc && node.isText)\n { this$1.text(this$1.markString(inner, true, parent, index) + node.text +\n this$1.markString(inner, false, parent, index + 1), false); }\n else\n { this$1.render(node, parent, index); }\n }\n };\n parent.forEach(progress);\n progress(null, null, parent.childCount);\n};\n\n// :: (Node, string, (number) → string)\n// Render a node's content as a list. `delim` should be the extra\n// indentation added to all lines except the first in an item,\n// `firstDelim` is a function going from an item index to a\n// delimiter for the first line of the item.\nMarkdownSerializerState.prototype.renderList = function renderList (node, delim, firstDelim) {\n var this$1 = this;\n\n if (this.closed && this.closed.type == node.type)\n { this.flushClose(3); }\n else if (this.inTightList)\n { this.flushClose(1); }\n\n var isTight = typeof node.attrs.tight != \"undefined\" ? node.attrs.tight : this.options.tightLists;\n var prevTight = this.inTightList;\n this.inTightList = isTight;\n node.forEach(function (child, _, i) {\n if (i && isTight) { this$1.flushClose(1); }\n this$1.wrapBlock(delim, firstDelim(i), node, function () { return this$1.render(child, node, i); });\n });\n this.inTightList = prevTight;\n};\n\n// :: (string, ?bool) → string\n// Escape the given string so that it can safely appear in Markdown\n// content. If `startOfLine` is true, also escape characters that\n// have special meaning only at the start of the line.\nMarkdownSerializerState.prototype.esc = function esc (str, startOfLine) {\n str = str.replace(/[`*\\\\~\\[\\]]/g, \"\\\\$&\");\n if (startOfLine) { str = str.replace(/^[:#\\-*+]/, \"\\\\$&\").replace(/^(\\s*\\d+)\\./, \"$1\\\\.\"); }\n return str\n};\n\nMarkdownSerializerState.prototype.quote = function quote (str) {\n var wrap = str.indexOf('\"') == -1 ? '\"\"' : str.indexOf(\"'\") == -1 ? \"''\" : \"()\";\n return wrap[0] + str + wrap[1]\n};\n\n// :: (string, number) → string\n// Repeat the given string `n` times.\nMarkdownSerializerState.prototype.repeat = function repeat (str, n) {\n var out = \"\";\n for (var i = 0; i < n; i++) { out += str; }\n return out\n};\n\n// : (Mark, bool, string?) → string\n// Get the markdown string for a given opening or closing mark.\nMarkdownSerializerState.prototype.markString = function markString (mark, open, parent, index) {\n var info = this.marks[mark.type.name];\n var value = open ? info.open : info.close;\n return typeof value == \"string\" ? value : value(this, mark, parent, index)\n};\n\n// :: (string) → { leading: ?string, trailing: ?string }\n// Get leading and trailing whitespace from a string. Values of\n// leading or trailing property of the return object will be undefined\n// if there is no match.\nMarkdownSerializerState.prototype.getEnclosingWhitespace = function getEnclosingWhitespace (text) {\n return {\n leading: (text.match(/^(\\s+)/) || [])[0],\n trailing: (text.match(/(\\s+)$/) || [])[0]\n }\n};\n\nexport { MarkdownParser, MarkdownSerializer, MarkdownSerializerState, defaultMarkdownParser, defaultMarkdownSerializer, schema };\n//# sourceMappingURL=index.es.js.map\n","import { findWrapping, ReplaceAroundStep, canSplit, liftTarget } from 'prosemirror-transform';\nimport { NodeRange, Fragment, Slice } from 'prosemirror-model';\n\nvar olDOM = [\"ol\", 0], ulDOM = [\"ul\", 0], liDOM = [\"li\", 0];\n\n// :: NodeSpec\n// An ordered list [node spec](#model.NodeSpec). Has a single\n// attribute, `order`, which determines the number at which the list\n// starts counting, and defaults to 1. Represented as an `
                `\n// element.\nvar orderedList = {\n attrs: {order: {default: 1}},\n parseDOM: [{tag: \"ol\", getAttrs: function getAttrs(dom) {\n return {order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\") : 1}\n }}],\n toDOM: function toDOM(node) {\n return node.attrs.order == 1 ? olDOM : [\"ol\", {start: node.attrs.order}, 0]\n }\n};\n\n// :: NodeSpec\n// A bullet list node spec, represented in the DOM as `
                  `.\nvar bulletList = {\n parseDOM: [{tag: \"ul\"}],\n toDOM: function toDOM() { return ulDOM }\n};\n\n// :: NodeSpec\n// A list item (`
                • `) spec.\nvar listItem = {\n parseDOM: [{tag: \"li\"}],\n toDOM: function toDOM() { return liDOM },\n defining: true\n};\n\nfunction add(obj, props) {\n var copy = {};\n for (var prop in obj) { copy[prop] = obj[prop]; }\n for (var prop$1 in props) { copy[prop$1] = props[prop$1]; }\n return copy\n}\n\n// :: (OrderedMap, string, ?string) → OrderedMap\n// Convenience function for adding list-related node types to a map\n// specifying the nodes for a schema. Adds\n// [`orderedList`](#schema-list.orderedList) as `\"ordered_list\"`,\n// [`bulletList`](#schema-list.bulletList) as `\"bullet_list\"`, and\n// [`listItem`](#schema-list.listItem) as `\"list_item\"`.\n//\n// `itemContent` determines the content expression for the list items.\n// If you want the commands defined in this module to apply to your\n// list structure, it should have a shape like `\"paragraph block*\"` or\n// `\"paragraph (ordered_list | bullet_list)*\"`. `listGroup` can be\n// given to assign a group name to the list node types, for example\n// `\"block\"`.\nfunction addListNodes(nodes, itemContent, listGroup) {\n return nodes.append({\n ordered_list: add(orderedList, {content: \"list_item+\", group: listGroup}),\n bullet_list: add(bulletList, {content: \"list_item+\", group: listGroup}),\n list_item: add(listItem, {content: itemContent})\n })\n}\n\n// :: (NodeType, ?Object) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Returns a command function that wraps the selection in a list with\n// the given type an attributes. If `dispatch` is null, only return a\n// value to indicate whether this is possible, but don't actually\n// perform the change.\nfunction wrapInList(listType, attrs) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to), doJoin = false, outerRange = range;\n if (!range) { return false }\n // This is at the top of an existing list item\n if (range.depth >= 2 && $from.node(range.depth - 1).type.compatibleContent(listType) && range.startIndex == 0) {\n // Don't do anything if this is the top of the list\n if ($from.index(range.depth - 1) == 0) { return false }\n var $insert = state.doc.resolve(range.start - 2);\n outerRange = new NodeRange($insert, $insert, range.depth);\n if (range.endIndex < range.parent.childCount)\n { range = new NodeRange($from, state.doc.resolve($to.end(range.depth)), range.depth); }\n doJoin = true;\n }\n var wrap = findWrapping(outerRange, listType, attrs, range);\n if (!wrap) { return false }\n if (dispatch) { dispatch(doWrapInList(state.tr, range, wrap, doJoin, listType).scrollIntoView()); }\n return true\n }\n}\n\nfunction doWrapInList(tr, range, wrappers, joinBefore, listType) {\n var content = Fragment.empty;\n for (var i = wrappers.length - 1; i >= 0; i--)\n { content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content)); }\n\n tr.step(new ReplaceAroundStep(range.start - (joinBefore ? 2 : 0), range.end, range.start, range.end,\n new Slice(content, 0, 0), wrappers.length, true));\n\n var found = 0;\n for (var i$1 = 0; i$1 < wrappers.length; i$1++) { if (wrappers[i$1].type == listType) { found = i$1 + 1; } }\n var splitDepth = wrappers.length - found;\n\n var splitPos = range.start + wrappers.length - (joinBefore ? 2 : 0), parent = range.parent;\n for (var i$2 = range.startIndex, e = range.endIndex, first = true; i$2 < e; i$2++, first = false) {\n if (!first && canSplit(tr.doc, splitPos, splitDepth)) {\n tr.split(splitPos, splitDepth);\n splitPos += 2 * splitDepth;\n }\n splitPos += parent.child(i$2).nodeSize;\n }\n return tr\n}\n\n// :: (NodeType) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Build a command that splits a non-empty textblock at the top level\n// of a list item by also splitting that list item.\nfunction splitListItem(itemType) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var node = ref.node;\n if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to)) { return false }\n var grandParent = $from.node(-1);\n if (grandParent.type != itemType) { return false }\n if ($from.parent.content.size == 0 && $from.node(-1).childCount == $from.indexAfter(-1)) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if ($from.depth == 2 || $from.node(-3).type != itemType ||\n $from.index(-2) != $from.node(-2).childCount - 1) { return false }\n if (dispatch) {\n var wrap = Fragment.empty, keepItem = $from.index(-1) > 0;\n // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n for (var d = $from.depth - (keepItem ? 1 : 2); d >= $from.depth - 3; d--)\n { wrap = Fragment.from($from.node(d).copy(wrap)); }\n // Add a second list item with an empty default start node\n wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n var tr$1 = state.tr.replace($from.before(keepItem ? null : -1), $from.after(-3), new Slice(wrap, keepItem ? 3 : 2, 2));\n tr$1.setSelection(state.selection.constructor.near(tr$1.doc.resolve($from.pos + (keepItem ? 3 : 2))));\n dispatch(tr$1.scrollIntoView());\n }\n return true\n }\n var nextType = $to.pos == $from.end() ? grandParent.contentMatchAt(0).defaultType : null;\n var tr = state.tr.delete($from.pos, $to.pos);\n var types = nextType && [null, {type: nextType}];\n if (!canSplit(tr.doc, $from.pos, 2, types)) { return false }\n if (dispatch) { dispatch(tr.split($from.pos, 2, types).scrollIntoView()); }\n return true\n }\n}\n\n// :: (NodeType) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Create a command to lift the list item around the selection up into\n// a wrapping list.\nfunction liftListItem(itemType) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to, function (node) { return node.childCount && node.firstChild.type == itemType; });\n if (!range) { return false }\n if (!dispatch) { return true }\n if ($from.node(range.depth - 1).type == itemType) // Inside a parent list\n { return liftToOuterList(state, dispatch, itemType, range) }\n else // Outer list node\n { return liftOutOfList(state, dispatch, range) }\n }\n}\n\nfunction liftToOuterList(state, dispatch, itemType, range) {\n var tr = state.tr, end = range.end, endOfList = range.$to.end(range.depth);\n if (end < endOfList) {\n // There are siblings after the lifted items, which must become\n // children of the last item\n tr.step(new ReplaceAroundStep(end - 1, endOfList, end, endOfList,\n new Slice(Fragment.from(itemType.create(null, range.parent.copy())), 1, 0), 1, true));\n range = new NodeRange(tr.doc.resolve(range.$from.pos), tr.doc.resolve(endOfList), range.depth);\n }\n dispatch(tr.lift(range, liftTarget(range)).scrollIntoView());\n return true\n}\n\nfunction liftOutOfList(state, dispatch, range) {\n var tr = state.tr, list = range.parent;\n // Merge the list items into a single big item\n for (var pos = range.end, i = range.endIndex - 1, e = range.startIndex; i > e; i--) {\n pos -= list.child(i).nodeSize;\n tr.delete(pos - 1, pos + 1);\n }\n var $start = tr.doc.resolve(range.start), item = $start.nodeAfter;\n var atStart = range.startIndex == 0, atEnd = range.endIndex == list.childCount;\n var parent = $start.node(-1), indexBefore = $start.index(-1);\n if (!parent.canReplace(indexBefore + (atStart ? 0 : 1), indexBefore + 1,\n item.content.append(atEnd ? Fragment.empty : Fragment.from(list))))\n { return false }\n var start = $start.pos, end = start + item.nodeSize;\n // Strip off the surrounding list. At the sides where we're not at\n // the end of the list, the existing list is closed. At sides where\n // this is the end, it is overwritten to its end.\n tr.step(new ReplaceAroundStep(start - (atStart ? 1 : 0), end + (atEnd ? 1 : 0), start + 1, end - 1,\n new Slice((atStart ? Fragment.empty : Fragment.from(list.copy(Fragment.empty)))\n .append(atEnd ? Fragment.empty : Fragment.from(list.copy(Fragment.empty))),\n atStart ? 0 : 1, atEnd ? 0 : 1), atStart ? 0 : 1));\n dispatch(tr.scrollIntoView());\n return true\n}\n\n// :: (NodeType) → (state: EditorState, dispatch: ?(tr: Transaction)) → bool\n// Create a command to sink the list item around the selection down\n// into an inner list.\nfunction sinkListItem(itemType) {\n return function(state, dispatch) {\n var ref = state.selection;\n var $from = ref.$from;\n var $to = ref.$to;\n var range = $from.blockRange($to, function (node) { return node.childCount && node.firstChild.type == itemType; });\n if (!range) { return false }\n var startIndex = range.startIndex;\n if (startIndex == 0) { return false }\n var parent = range.parent, nodeBefore = parent.child(startIndex - 1);\n if (nodeBefore.type != itemType) { return false }\n\n if (dispatch) {\n var nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type == parent.type;\n var inner = Fragment.from(nestedBefore ? itemType.create() : null);\n var slice = new Slice(Fragment.from(itemType.create(null, Fragment.from(parent.type.create(null, inner)))),\n nestedBefore ? 3 : 1, 0);\n var before = range.start, after = range.end;\n dispatch(state.tr.step(new ReplaceAroundStep(before - (nestedBefore ? 3 : 1), after,\n before, after, slice, 1, true))\n .scrollIntoView());\n }\n return true\n }\n}\n\nexport { addListNodes, bulletList, liftListItem, listItem, orderedList, sinkListItem, splitListItem, wrapInList };\n//# sourceMappingURL=index.es.js.map\n","module.exports = flarum.core.compat['common/components/Tooltip'];","import Component from 'flarum/common/Component';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport icon from 'flarum/common/helpers/icon';\nimport extractText from 'flarum/common/utils/extractText';\n\nexport default class CommandButton extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n this.state.addItem(this.attrs.type, this.attrs.command, this.onEditorUpdate.bind(this));\n }\n\n view() {\n return (\n \n \n \n );\n }\n\n keydown(e) {\n if (e.key === ' ' || e.key === 'Enter') {\n this.click(e);\n }\n }\n\n click(e) {\n e.preventDefault();\n return this.state.run(this.attrs.type);\n }\n\n title() {\n let tooltip = app.translator.trans(`askvortsov-rich-text.lib.composer.${this.attrs.type}_tooltip`);\n\n return tooltip;\n }\n\n onEditorUpdate() {}\n}\n","module.exports = flarum.core.compat['common/utils/extractText'];","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","\n /*!\n * tiptap-utils v1.13.0\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { NodeSelection } from 'prosemirror-state';\n\nfunction createCell(cellType, cellContent) {\n if (cellContent) {\n return cellType.createChecked(null, cellContent);\n }\n\n return cellType.createAndFill();\n}\n\nfunction getTableNodeTypes(schema) {\n if (schema.cached.tableNodeTypes) {\n return schema.cached.tableNodeTypes;\n }\n\n const roles = {};\n Object.keys(schema.nodes).forEach(type => {\n const nodeType = schema.nodes[type];\n\n if (nodeType.spec.tableRole) {\n roles[nodeType.spec.tableRole] = nodeType;\n }\n }); // eslint-disable-next-line\n\n schema.cached.tableNodeTypes = roles;\n return roles;\n}\n\nfunction createTable(schema, rowsCount, colsCount, withHeaderRow, cellContent) {\n const types = getTableNodeTypes(schema);\n const headerCells = [];\n const cells = [];\n\n for (let index = 0; index < colsCount; index += 1) {\n const cell = createCell(types.cell, cellContent);\n\n if (cell) {\n cells.push(cell);\n }\n\n if (withHeaderRow) {\n const headerCell = createCell(types.header_cell, cellContent);\n\n if (headerCell) {\n headerCells.push(headerCell);\n }\n }\n }\n\n const rows = [];\n\n for (let index = 0; index < rowsCount; index += 1) {\n rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells));\n }\n\n return types.table.createChecked(null, rows);\n}\n\nfunction equalNodeType(nodeType, node) {\n return Array.isArray(nodeType) && nodeType.indexOf(node.type) > -1 || node.type === nodeType;\n}\n\nfunction flatten(node) {\n // eslint-disable-next-line\n const descend = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!node) {\n throw new Error('Invalid \"node\" parameter');\n }\n\n const result = []; // eslint-disable-next-line\n\n node.descendants((child, pos) => {\n result.push({\n node: child,\n pos\n });\n\n if (!descend) {\n return false;\n }\n });\n return result;\n}\n\nfunction findChildren(node, predicate, descend) {\n if (!node) {\n throw new Error('Invalid \"node\" parameter');\n } else if (!predicate) {\n throw new Error('Invalid \"predicate\" parameter');\n }\n\n return flatten(node, descend).filter(child => predicate(child.node));\n}\n\nfunction findBlockNodes(node, descend) {\n return findChildren(node, child => child.isBlock, descend);\n}\n\n// eslint-disable-next-line\nfunction findParentNodeClosestToPos($pos, predicate) {\n for (let i = $pos.depth; i > 0; i -= 1) {\n const node = $pos.node(i);\n\n if (predicate(node)) {\n return {\n pos: i > 0 ? $pos.before(i) : 0,\n start: $pos.start(i),\n depth: i,\n node\n };\n }\n }\n}\n\nfunction findParentNode(predicate) {\n return selection => findParentNodeClosestToPos(selection.$from, predicate);\n}\n\nfunction isNodeSelection(selection) {\n return selection instanceof NodeSelection;\n}\n\nfunction findSelectedNodeOfType(nodeType) {\n // eslint-disable-next-line\n return function (selection) {\n if (isNodeSelection(selection)) {\n const {\n node\n } = selection;\n const {\n $from\n } = selection;\n\n if (equalNodeType(nodeType, node)) {\n return {\n node,\n pos: $from.pos,\n depth: $from.depth\n };\n }\n }\n };\n}\n\nfunction getMarkAttrs(state, type) {\n const {\n from,\n to\n } = state.selection;\n let marks = [];\n state.doc.nodesBetween(from, to, node => {\n marks = [...marks, ...node.marks];\n });\n const mark = marks.find(markItem => markItem.type.name === type.name);\n\n if (mark) {\n return mark.attrs;\n }\n\n return {};\n}\n\nfunction getMarkRange($pos = null, type = null) {\n if (!$pos || !type) {\n return false;\n }\n\n const start = $pos.parent.childAfter($pos.parentOffset);\n\n if (!start.node) {\n return false;\n }\n\n const link = start.node.marks.find(mark => mark.type === type);\n\n if (!link) {\n return false;\n }\n\n let startIndex = $pos.index();\n let startPos = $pos.start() + start.offset;\n let endIndex = startIndex + 1;\n let endPos = startPos + start.node.nodeSize;\n\n while (startIndex > 0 && link.isInSet($pos.parent.child(startIndex - 1).marks)) {\n startIndex -= 1;\n startPos -= $pos.parent.child(startIndex).nodeSize;\n }\n\n while (endIndex < $pos.parent.childCount && link.isInSet($pos.parent.child(endIndex).marks)) {\n endPos += $pos.parent.child(endIndex).nodeSize;\n endIndex += 1;\n }\n\n return {\n from: startPos,\n to: endPos\n };\n}\n\nfunction getNodeAttrs(state, type) {\n const {\n from,\n to\n } = state.selection;\n let nodes = [];\n state.doc.nodesBetween(from, to, node => {\n nodes = [...nodes, node];\n });\n const node = nodes.reverse().find(nodeItem => nodeItem.type.name === type.name);\n\n if (node) {\n return node.attrs;\n }\n\n return {};\n}\n\nfunction markIsActive(state, type) {\n const {\n from,\n $from,\n to,\n empty\n } = state.selection;\n\n if (empty) {\n return !!type.isInSet(state.storedMarks || $from.marks());\n }\n\n return !!state.doc.rangeHasMark(from, to, type);\n}\n\nfunction nodeEqualsType({\n types,\n node\n}) {\n return Array.isArray(types) && types.includes(node.type) || node.type === types;\n}\n\nfunction nodeIsActive(state, type, attrs = {}) {\n const predicate = node => node.type === type;\n\n const node = findSelectedNodeOfType(type)(state.selection) || findParentNode(predicate)(state.selection);\n\n if (!Object.keys(attrs).length || !node) {\n return !!node;\n }\n\n return node.node.hasMarkup(type, { ...node.node.attrs,\n ...attrs\n });\n}\n\nexport { createCell, createTable, equalNodeType, findBlockNodes, findChildren, findParentNode, findParentNodeClosestToPos, findSelectedNodeOfType, flatten, getMarkAttrs, getMarkRange, getNodeAttrs, getTableNodeTypes, isNodeSelection, markIsActive, nodeEqualsType, nodeIsActive };\n","import { toggleMark } from 'tiptap-commands';\nimport CommandButton from './CommandButton';\n\nexport default class MarkButton extends CommandButton {\n static initAttrs(attrs) {\n attrs.command = toggleMark(attrs.mark);\n }\n\n onEditorUpdate() {\n this.$().toggleClass('active', !!this.state.markActive(this.attrs.mark));\n }\n}\n","export var base = {\n 8: \"Backspace\",\n 9: \"Tab\",\n 10: \"Enter\",\n 12: \"NumLock\",\n 13: \"Enter\",\n 16: \"Shift\",\n 17: \"Control\",\n 18: \"Alt\",\n 20: \"CapsLock\",\n 27: \"Escape\",\n 32: \" \",\n 33: \"PageUp\",\n 34: \"PageDown\",\n 35: \"End\",\n 36: \"Home\",\n 37: \"ArrowLeft\",\n 38: \"ArrowUp\",\n 39: \"ArrowRight\",\n 40: \"ArrowDown\",\n 44: \"PrintScreen\",\n 45: \"Insert\",\n 46: \"Delete\",\n 59: \";\",\n 61: \"=\",\n 91: \"Meta\",\n 92: \"Meta\",\n 106: \"*\",\n 107: \"+\",\n 108: \",\",\n 109: \"-\",\n 110: \".\",\n 111: \"/\",\n 144: \"NumLock\",\n 145: \"ScrollLock\",\n 160: \"Shift\",\n 161: \"Shift\",\n 162: \"Control\",\n 163: \"Control\",\n 164: \"Alt\",\n 165: \"Alt\",\n 173: \"-\",\n 186: \";\",\n 187: \"=\",\n 188: \",\",\n 189: \"-\",\n 190: \".\",\n 191: \"/\",\n 192: \"`\",\n 219: \"[\",\n 220: \"\\\\\",\n 221: \"]\",\n 222: \"'\",\n 229: \"q\"\n}\n\nexport var shift = {\n 48: \")\",\n 49: \"!\",\n 50: \"@\",\n 51: \"#\",\n 52: \"$\",\n 53: \"%\",\n 54: \"^\",\n 55: \"&\",\n 56: \"*\",\n 57: \"(\",\n 59: \":\",\n 61: \"+\",\n 173: \"_\",\n 186: \":\",\n 187: \"+\",\n 188: \"<\",\n 189: \"_\",\n 190: \">\",\n 191: \"?\",\n 192: \"~\",\n 219: \"{\",\n 220: \"|\",\n 221: \"}\",\n 222: \"\\\"\",\n 229: \"Q\"\n}\n\nvar chrome = typeof navigator != \"undefined\" && /Chrome\\/(\\d+)/.exec(navigator.userAgent)\nvar safari = typeof navigator != \"undefined\" && /Apple Computer/.test(navigator.vendor)\nvar gecko = typeof navigator != \"undefined\" && /Gecko\\/\\d+/.test(navigator.userAgent)\nvar mac = typeof navigator != \"undefined\" && /Mac/.test(navigator.platform)\nvar ie = typeof navigator != \"undefined\" && /MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent)\nvar brokenModifierNames = chrome && (mac || +chrome[1] < 57) || gecko && mac\n\n// Fill in the digit keys\nfor (var i = 0; i < 10; i++) base[48 + i] = base[96 + i] = String(i)\n\n// The function keys\nfor (var i = 1; i <= 24; i++) base[i + 111] = \"F\" + i\n\n// And the alphabetic keys\nfor (var i = 65; i <= 90; i++) {\n base[i] = String.fromCharCode(i + 32)\n shift[i] = String.fromCharCode(i)\n}\n\n// For each code that doesn't have a shift-equivalent, copy the base name\nfor (var code in base) if (!shift.hasOwnProperty(code)) shift[code] = base[code]\n\nexport function keyName(event) {\n // Don't trust event.key in Chrome when there are modifiers until\n // they fix https://bugs.chromium.org/p/chromium/issues/detail?id=633838\n var ignoreKey = brokenModifierNames && (event.ctrlKey || event.altKey || event.metaKey) ||\n (safari || ie) && event.shiftKey && event.key && event.key.length == 1\n var name = (!ignoreKey && event.key) ||\n (event.shiftKey ? shift : base)[event.keyCode] ||\n event.key || \"Unidentified\"\n // Edge sometimes produces wrong names (Issue #3)\n if (name == \"Esc\") name = \"Escape\"\n if (name == \"Del\") name = \"Delete\"\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/\n if (name == \"Left\") name = \"ArrowLeft\"\n if (name == \"Up\") name = \"ArrowUp\"\n if (name == \"Right\") name = \"ArrowRight\"\n if (name == \"Down\") name = \"ArrowDown\"\n return name\n}\n","import { keyName, base } from 'w3c-keyname';\nimport { Plugin } from 'prosemirror-state';\n\n// declare global: navigator\n\nvar mac = typeof navigator != \"undefined\" ? /Mac/.test(navigator.platform) : false;\n\nfunction normalizeKeyName(name) {\n var parts = name.split(/-(?!$)/), result = parts[parts.length - 1];\n if (result == \"Space\") { result = \" \"; }\n var alt, ctrl, shift, meta;\n for (var i = 0; i < parts.length - 1; i++) {\n var mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod)) { meta = true; }\n else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n else if (/^mod$/i.test(mod)) { if (mac) { meta = true; } else { ctrl = true; } }\n else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n }\n if (alt) { result = \"Alt-\" + result; }\n if (ctrl) { result = \"Ctrl-\" + result; }\n if (meta) { result = \"Meta-\" + result; }\n if (shift) { result = \"Shift-\" + result; }\n return result\n}\n\nfunction normalize(map) {\n var copy = Object.create(null);\n for (var prop in map) { copy[normalizeKeyName(prop)] = map[prop]; }\n return copy\n}\n\nfunction modifiers(name, event, shift) {\n if (event.altKey) { name = \"Alt-\" + name; }\n if (event.ctrlKey) { name = \"Ctrl-\" + name; }\n if (event.metaKey) { name = \"Meta-\" + name; }\n if (shift !== false && event.shiftKey) { name = \"Shift-\" + name; }\n return name\n}\n\n// :: (Object) → Plugin\n// Create a keymap plugin for the given set of bindings.\n//\n// Bindings should map key names to [command](#commands)-style\n// functions, which will be called with `(EditorState, dispatch,\n// EditorView)` arguments, and should return true when they've handled\n// the key. Note that the view argument isn't part of the command\n// protocol, but can be used as an escape hatch if a binding needs to\n// directly interact with the UI.\n//\n// Key names may be strings like `\"Shift-Ctrl-Enter\"`—a key\n// identifier prefixed with zero or more modifiers. Key identifiers\n// are based on the strings that can appear in\n// [`KeyEvent.key`](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).\n// Use lowercase letters to refer to letter keys (or uppercase letters\n// if you want shift to be held). You may use `\"Space\"` as an alias\n// for the `\" \"` name.\n//\n// Modifiers can be given in any order. `Shift-` (or `s-`), `Alt-` (or\n// `a-`), `Ctrl-` (or `c-` or `Control-`) and `Cmd-` (or `m-` or\n// `Meta-`) are recognized. For characters that are created by holding\n// shift, the `Shift-` prefix is implied, and should not be added\n// explicitly.\n//\n// You can use `Mod-` as a shorthand for `Cmd-` on Mac and `Ctrl-` on\n// other platforms.\n//\n// You can add multiple keymap plugins to an editor. The order in\n// which they appear determines their precedence (the ones early in\n// the array get to dispatch first).\nfunction keymap(bindings) {\n return new Plugin({props: {handleKeyDown: keydownHandler(bindings)}})\n}\n\n// :: (Object) → (view: EditorView, event: dom.Event) → bool\n// Given a set of bindings (using the same format as\n// [`keymap`](#keymap.keymap), return a [keydown\n// handler](#view.EditorProps.handleKeyDown) that handles them.\nfunction keydownHandler(bindings) {\n var map = normalize(bindings);\n return function(view, event) {\n var name = keyName(event), isChar = name.length == 1 && name != \" \", baseName;\n var direct = map[modifiers(name, event, !isChar)];\n if (direct && direct(view.state, view.dispatch, view)) { return true }\n if (isChar && (event.shiftKey || event.altKey || event.metaKey || name.charCodeAt(0) > 127) &&\n (baseName = base[event.keyCode]) && baseName != name) {\n // Try falling back to the keyCode when there's a modifier\n // active or the character produced isn't ASCII, and our table\n // produces a different name from the the keyCode. See #668,\n // #1060\n var fromCode = map[modifiers(baseName, event, true)];\n if (fromCode && fromCode(view.state, view.dispatch, view)) { return true }\n } else if (isChar && event.shiftKey) {\n // Otherwise, if shift is active, also try the binding with the\n // Shift- prefix enabled. See #997\n var withShift = map[modifiers(name, event, true)];\n if (withShift && withShift(view.state, view.dispatch, view)) { return true }\n }\n return false\n }\n}\n\nexport { keydownHandler, keymap };\n//# sourceMappingURL=index.es.js.map\n","module.exports = flarum.core.compat['common/utils/ItemList'];","module.exports = flarum.core.compat['common/utils/Stream'];","module.exports = flarum.core.compat['common/components/Button'];","module.exports = flarum.core.compat['common/helpers/icon'];","module.exports = flarum.core.compat['common/components/Dropdown'];","import Modal from 'flarum/common/components/Modal';\n\nexport default class SafariModalHack extends Modal {\n className() {\n return 'LoadingModal Modal--small';\n }\n\n title() {\n return this.attrs.title;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$('.CommandButton').on('click', () => {\n app.modal.close();\n });\n }\n\n content() {\n const onsubmit = this.attrs.onsubmit ? this.attrs.onsubmit.bind(this) : () => {};\n return (\n
                  \n
                  \n {this.attrs.vnodeContent}\n
                  \n
                  \n );\n }\n}\n","import Button from 'flarum/common/components/Button';\nimport Dropdown from 'flarum/common/components/Dropdown';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport icon from 'flarum/common/helpers/icon';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport SafariModalHack from './SafariModalHack';\n\nexport default class FormDropdown extends Dropdown {\n static initAttrs(attrs) {\n attrs.buttonClassName = 'Button Button--icon Button--link Button--menuDropdown';\n }\n\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$().on('click', (e) => {\n if ($('.App').is('.mobile-safari')) {\n // Mobile Safari doesn't support fixed items\n // So, we wrap them in a modal.\n app.modal.show(SafariModalHack, {\n title: this.attrs.tooltip,\n vnodeContent: this.fields().toArray(),\n onsubmit: this.onsubmit.bind(this),\n });\n e.stopPropagation();\n }\n });\n\n this.$().on('shown.bs.dropdown', () => {\n this.$('.Dropdown-menu').find('input, select, textarea').first().focus().select();\n });\n }\n\n getButtonContent(children) {\n return (\n \n {icon(this.attrs.icon)}\n \n );\n }\n\n getMenu(items) {\n return (\n
                    \n
                    \n {this.fields().toArray()}\n
                    \n
                  \n );\n }\n\n fields() {\n const items = new ItemList();\n\n items.add(\n 'insert',\n \n );\n\n return items;\n }\n\n onsubmit(e) {\n // Here for the safari workaround\n app.modal.close();\n e.preventDefault();\n $('body').trigger('click');\n this.insert(e);\n app.composer.editor.focus();\n }\n\n insert(e) {}\n}\n","module.exports = flarum.core.compat['common/extend'];","import CommandButton from './CommandButton';\nimport { toggleList } from 'tiptap-commands';\n\nexport default class ListButton extends CommandButton {\n oninit(vnode) {\n vnode.attrs.command = (state, dispatch) => {\n return toggleList(vnode.attrs.listType, this.active ? state.schema.nodes.list_item : undefined)(state, dispatch);\n };\n\n super.oninit(vnode);\n }\n\n onEditorUpdate() {\n this.active = !!this.state.nodeActive(this.attrs.listType);\n this.$().toggleClass('active', this.active);\n }\n}\n","module.exports = flarum.core.compat['common/components/TextEditor'];","import { defaultMarkdownSerializer, MarkdownSerializer, MarkdownSerializerState } from 'prosemirror-markdown';\n\n/**\n * COPIED FROM https://github.com/StackExchange/Stacks-Editor/blob/main/src/rich-text/markdown-serializer.ts\n *\n * Generates a config from a base config that is aware of special \"markup\" added by the markdown tokenizer;\n * typically this will be differences in how markdown can be written (e.g. * vs _ for emphasis),\n * but could also be html tags from our extended html support plugin (e.g. * vs for emphasis)\n * @param config The base config to extend\n */\nfunction genMarkupAwareMarkConfig(config) {\n // we don't support function open/close since these could have fairly complicated logic in them\n if (config.open instanceof Function || config.close instanceof Function) {\n // log an error to the console and return the unmodified base config\n error('markdown-serializer genMarkupAwareMarkSpec', 'Unable to extend mark config with open/close as functions', config);\n return config;\n }\n\n return {\n ...config,\n open(_, mark) {\n const markup = mark.attrs.markup;\n return markup || config.open;\n },\n close(_, mark) {\n let markup = mark.attrs.markup;\n // insert the `/` on html closing tags\n markup = /^<[a-z]+>$/i.test(markup) ? markup.replace(/^! ', null, node, () => state.renderContent(node));\n },\n\n math_block(state, node) {\n state.write('$$\\n');\n state.text(node.textContent, false);\n state.ensureNewLine();\n state.write('$$');\n state.closeBlock(node);\n },\n\n // We still want to put a new line for empty paragraphs\n paragraph(state, node) {\n if (node.content.size === 0) {\n state.write('\\n');\n } else {\n defaultMarkdownSerializer.nodes.paragraph(state, node);\n }\n },\n\n // Override this to put in just a whiteline, since Litedown doesn't like line-ending slashes.\n hard_break(state, node, parent, index) {\n for (let i = index + 1; i < parent.childCount; i++)\n if (parent.child(i).type != node.type) {\n state.write('\\n');\n return;\n }\n },\n };\n }\n\n buildMarks() {\n return {\n ...defaultMarkdownSerializer.marks,\n\n spoiler_inline: genMarkupAwareMarkConfig({\n open: '>!',\n close: '!<',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n strike: genMarkupAwareMarkConfig({\n open: '~~',\n close: '~~',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n sub: genMarkupAwareMarkConfig({\n open: '~',\n close: '~',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n sup: genMarkupAwareMarkConfig({\n open: '^',\n close: '^',\n mixable: true,\n expelEnclosingWhitespace: true,\n }),\n\n math_inline: {\n ...genMarkupAwareMarkConfig({\n open: '$',\n close: '$',\n mixable: false,\n expelEnclosingWhitespace: true,\n }),\n escape: false,\n },\n };\n }\n\n build() {\n return new MarkdownSerializer(this.buildNodes(), this.buildMarks());\n }\n}\n","'use strict';\n\n\nmodule.exports = require('./lib/');\n","import { schema } from 'prosemirror-markdown';\nimport { Schema } from 'prosemirror-model';\n\n/**\n * COPIED FROM https://github.com/StackExchange/Stacks-Editor/blob/main/src/shared/schema.ts\n *\n * Creates a generic html MarkSpec for an inline html tag\n * @param tag The name of the tag to use in the Prosemirror dom\n */\nfunction genHtmlInlineMarkSpec(...tags) {\n return {\n toDOM() {\n return [tags[0], 0];\n },\n parseDOM: tags.map((tag) => ({ tag: tag })),\n };\n}\n\nconst spoilerNodeSpec = {\n content: 'block+',\n group: 'block',\n attrs: { open: { default: true } },\n parseDOM: [\n {\n tag: 'details',\n },\n ],\n toDOM(node) {\n const attrs = { class: 'spoiler' };\n\n if (node.attrs.open) attrs.open = true;\n\n return ['details', attrs, 0];\n },\n};\n\nconst mathBlockNodeSpec = {\n content: 'text*',\n code: true,\n group: 'block',\n parseDOM: [\n {\n tag: 'pre',\n },\n ],\n toDOM(node) {\n return ['pre', { class: 'math' }, ['code', 0]];\n },\n};\n\nexport default class SchemaBuilder {\n buildNodes() {\n return (\n schema.spec.nodes\n // Make lists tight by default\n .update(\n 'ordered_list',\n Object.assign({}, schema.spec.nodes.get('ordered_list'), { attrs: { order: { default: 1 }, tight: { default: true } } })\n )\n .update('bullet_list', Object.assign({}, schema.spec.nodes.get('bullet_list'), { attrs: { tight: { default: true } } }))\n .addBefore('blockquote', 'spoiler', spoilerNodeSpec)\n .addBefore('blockquote', 'math_block', mathBlockNodeSpec)\n );\n }\n\n buildMarks() {\n return schema.spec.marks\n .addBefore('strong', 'strike', genHtmlInlineMarkSpec('del', 's', 'strike'))\n .addBefore('strong', 'sub', genHtmlInlineMarkSpec('sub'))\n .addBefore('strong', 'sup', genHtmlInlineMarkSpec('sup'))\n .addBefore('strong', 'spoiler_inline', {\n attrs: { open: { default: true } },\n parseDOM: [\n {\n tag: 'spoiler',\n },\n ],\n toDOM(node) {\n return ['spoiler', 0];\n },\n })\n .addBefore('strong', 'math_inline', {\n parseDOM: [\n {\n tag: 'math',\n },\n ],\n toDOM(node) {\n return ['math', 0];\n },\n excludes: '_',\n });\n }\n\n build() {\n return new Schema({\n nodes: this.buildNodes(),\n marks: this.buildMarks(),\n });\n }\n}\n","module.exports = flarum.core.compat['common/Component'];","import Dropdown from 'flarum/common/components/Dropdown';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport extractText from 'flarum/common/utils/extractText';\nimport { setBlockType } from 'tiptap-commands';\nimport SafariModalHack from './SafariModalHack';\n\nexport default class NodeTypeDropdown extends Dropdown {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n this.state.addItem(\n this.attrs.type,\n (state, dispatch) => {\n return this.command(state, dispatch);\n },\n this.onEditorUpdate.bind(this)\n );\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$().on('click', (e) => {\n if ($('.App').is('.mobile-safari')) {\n // Mobile Safari doesn't support fixed items\n // So, we wrap them in a modal.\n app.modal.show(SafariModalHack, {\n title: this.attrs.tooltip,\n vnodeContent: this.getNodeTypeButtons(),\n });\n e.stopPropagation();\n }\n });\n\n this.onEditorUpdate();\n }\n\n getButton(children) {\n return (\n \n );\n }\n\n getNodeTypeButtons() {\n return this.attrs.options\n .filter((_, i) => i !== this.activeIndex)\n .map((option) => (\n \n \n {option.title}\n \n \n ));\n }\n\n getMenu(items) {\n return
                    {this.getNodeTypeButtons()}
                  ;\n }\n\n keydown(type, attrs, e) {\n if (e.key === ' ' || e.key === 'Enter') {\n this.click(type, attrs, e);\n }\n }\n\n click(type, attrs, e) {\n // Here for the safari workaround\n app.modal.close();\n e.preventDefault();\n this.command = setBlockType(type, attrs);\n return this.state.run(this.attrs.type);\n }\n\n onEditorUpdate() {\n if (!this.element) return;\n\n this.attrs.options.forEach((option, i) => {\n if (this.state.nodeActive(option.type, option.attrs)) {\n this.element.children[0].children[0].innerText = option.title;\n this.activeIndex = i;\n }\n });\n }\n}\n","import extractText from 'flarum/common/utils/extractText';\nimport Stream from 'flarum/common/utils/Stream';\nimport FormDropdown from './FormDropdown';\n\nexport default class InsertImageDropdown extends FormDropdown {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.src = Stream('');\n this.title = Stream('');\n }\n\n fields() {\n const items = super.fields();\n\n items.add(\n 'src',\n
                  \n \n
                  ,\n 10\n );\n\n items.add(\n 'title',\n
                  \n \n
                  ,\n 10\n );\n\n return items;\n }\n\n insert(e) {\n this.state.insertNode(this.attrs.node, {\n src: this.src(),\n title: this.title(),\n });\n\n this.src('');\n this.title('');\n }\n}\n","import { getMarkAttrs, markIsActive, nodeIsActive } from 'tiptap-utils';\n\nexport default class MenuState {\n constructor() {\n this.items = {};\n }\n\n attachEditorView(editorView) {\n this.editorView = editorView;\n }\n\n addItem(key, command, onEditorUpdate) {\n this.items[key] = { command, onEditorUpdate };\n }\n\n getSchema() {\n return this.editorView.state.schema;\n }\n\n update() {\n app.editor = this.editorView;\n Object.keys(this.items).forEach((key) => {\n this.items[key].onEditorUpdate();\n });\n }\n\n destroy() {\n // No need for this: Mithril will destroy the editor DOM when the composer closes.\n }\n\n markActive(markType) {\n return markIsActive(this.editorView.state, markType);\n }\n\n markAttrs(markType) {\n return getMarkAttrs(this.editorView.state, markType);\n }\n\n nodeActive(nodeType, attrs) {\n return nodeIsActive(this.editorView.state, nodeType, attrs);\n }\n\n selectionEmpty() {\n return this.editorView.state.selection.empty;\n }\n\n insertNode(nodeType, attrs) {\n const node = nodeType.createAndFill(attrs);\n\n let transaction;\n if (this.editorView.state.selection.empty) {\n transaction = this.editorView.state.tr.insert(this.editorView.state.selection.from, node);\n } else {\n transaction = this.editorView.state.tr.replaceSelection(node);\n }\n this.editorView.dispatch(transaction);\n this.editorView.focus();\n }\n\n run(key) {\n if (this.items[key]) {\n this.editorView.focus();\n this.items[key].command(this.editorView.state, this.editorView.dispatch, this.editorView);\n }\n }\n}\n","var GOOD_LEAF_SIZE = 200;\n\n// :: class A rope sequence is a persistent sequence data structure\n// that supports appending, prepending, and slicing without doing a\n// full copy. It is represented as a mostly-balanced tree.\nvar RopeSequence = function RopeSequence () {};\n\nRopeSequence.prototype.append = function append (other) {\n if (!other.length) { return this }\n other = RopeSequence.from(other);\n\n return (!this.length && other) ||\n (other.length < GOOD_LEAF_SIZE && this.leafAppend(other)) ||\n (this.length < GOOD_LEAF_SIZE && other.leafPrepend(this)) ||\n this.appendInner(other)\n};\n\n// :: (union<[T], RopeSequence>) → RopeSequence\n// Prepend an array or other rope to this one, returning a new rope.\nRopeSequence.prototype.prepend = function prepend (other) {\n if (!other.length) { return this }\n return RopeSequence.from(other).append(this)\n};\n\nRopeSequence.prototype.appendInner = function appendInner (other) {\n return new Append(this, other)\n};\n\n// :: (?number, ?number) → RopeSequence\n// Create a rope repesenting a sub-sequence of this rope.\nRopeSequence.prototype.slice = function slice (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n if (from >= to) { return RopeSequence.empty }\n return this.sliceInner(Math.max(0, from), Math.min(this.length, to))\n};\n\n// :: (number) → T\n// Retrieve the element at the given position from this rope.\nRopeSequence.prototype.get = function get (i) {\n if (i < 0 || i >= this.length) { return undefined }\n return this.getInner(i)\n};\n\n// :: ((element: T, index: number) → ?bool, ?number, ?number)\n// Call the given function for each element between the given\n// indices. This tends to be more efficient than looping over the\n// indices and calling `get`, because it doesn't have to descend the\n// tree for every element.\nRopeSequence.prototype.forEach = function forEach (f, from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n if (from <= to)\n { this.forEachInner(f, from, to, 0); }\n else\n { this.forEachInvertedInner(f, from, to, 0); }\n};\n\n// :: ((element: T, index: number) → U, ?number, ?number) → [U]\n// Map the given functions over the elements of the rope, producing\n// a flat array.\nRopeSequence.prototype.map = function map (f, from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n var result = [];\n this.forEach(function (elt, i) { return result.push(f(elt, i)); }, from, to);\n return result\n};\n\n// :: (?union<[T], RopeSequence>) → RopeSequence\n// Create a rope representing the given array, or return the rope\n// itself if a rope was given.\nRopeSequence.from = function from (values) {\n if (values instanceof RopeSequence) { return values }\n return values && values.length ? new Leaf(values) : RopeSequence.empty\n};\n\nvar Leaf = /*@__PURE__*/(function (RopeSequence) {\n function Leaf(values) {\n RopeSequence.call(this);\n this.values = values;\n }\n\n if ( RopeSequence ) Leaf.__proto__ = RopeSequence;\n Leaf.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n Leaf.prototype.constructor = Leaf;\n\n var prototypeAccessors = { length: { configurable: true },depth: { configurable: true } };\n\n Leaf.prototype.flatten = function flatten () {\n return this.values\n };\n\n Leaf.prototype.sliceInner = function sliceInner (from, to) {\n if (from == 0 && to == this.length) { return this }\n return new Leaf(this.values.slice(from, to))\n };\n\n Leaf.prototype.getInner = function getInner (i) {\n return this.values[i]\n };\n\n Leaf.prototype.forEachInner = function forEachInner (f, from, to, start) {\n for (var i = from; i < to; i++)\n { if (f(this.values[i], start + i) === false) { return false } }\n };\n\n Leaf.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n for (var i = from - 1; i >= to; i--)\n { if (f(this.values[i], start + i) === false) { return false } }\n };\n\n Leaf.prototype.leafAppend = function leafAppend (other) {\n if (this.length + other.length <= GOOD_LEAF_SIZE)\n { return new Leaf(this.values.concat(other.flatten())) }\n };\n\n Leaf.prototype.leafPrepend = function leafPrepend (other) {\n if (this.length + other.length <= GOOD_LEAF_SIZE)\n { return new Leaf(other.flatten().concat(this.values)) }\n };\n\n prototypeAccessors.length.get = function () { return this.values.length };\n\n prototypeAccessors.depth.get = function () { return 0 };\n\n Object.defineProperties( Leaf.prototype, prototypeAccessors );\n\n return Leaf;\n}(RopeSequence));\n\n// :: RopeSequence\n// The empty rope sequence.\nRopeSequence.empty = new Leaf([]);\n\nvar Append = /*@__PURE__*/(function (RopeSequence) {\n function Append(left, right) {\n RopeSequence.call(this);\n this.left = left;\n this.right = right;\n this.length = left.length + right.length;\n this.depth = Math.max(left.depth, right.depth) + 1;\n }\n\n if ( RopeSequence ) Append.__proto__ = RopeSequence;\n Append.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n Append.prototype.constructor = Append;\n\n Append.prototype.flatten = function flatten () {\n return this.left.flatten().concat(this.right.flatten())\n };\n\n Append.prototype.getInner = function getInner (i) {\n return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length)\n };\n\n Append.prototype.forEachInner = function forEachInner (f, from, to, start) {\n var leftLen = this.left.length;\n if (from < leftLen &&\n this.left.forEachInner(f, from, Math.min(to, leftLen), start) === false)\n { return false }\n if (to > leftLen &&\n this.right.forEachInner(f, Math.max(from - leftLen, 0), Math.min(this.length, to) - leftLen, start + leftLen) === false)\n { return false }\n };\n\n Append.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n var leftLen = this.left.length;\n if (from > leftLen &&\n this.right.forEachInvertedInner(f, from - leftLen, Math.max(to, leftLen) - leftLen, start + leftLen) === false)\n { return false }\n if (to < leftLen &&\n this.left.forEachInvertedInner(f, Math.min(from, leftLen), to, start) === false)\n { return false }\n };\n\n Append.prototype.sliceInner = function sliceInner (from, to) {\n if (from == 0 && to == this.length) { return this }\n var leftLen = this.left.length;\n if (to <= leftLen) { return this.left.slice(from, to) }\n if (from >= leftLen) { return this.right.slice(from - leftLen, to - leftLen) }\n return this.left.slice(from, leftLen).append(this.right.slice(0, to - leftLen))\n };\n\n Append.prototype.leafAppend = function leafAppend (other) {\n var inner = this.right.leafAppend(other);\n if (inner) { return new Append(this.left, inner) }\n };\n\n Append.prototype.leafPrepend = function leafPrepend (other) {\n var inner = this.left.leafPrepend(other);\n if (inner) { return new Append(inner, this.right) }\n };\n\n Append.prototype.appendInner = function appendInner (other) {\n if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1)\n { return new Append(this.left, new Append(this.right, other)) }\n return new Append(this, other)\n };\n\n return Append;\n}(RopeSequence));\n\nvar ropeSequence = RopeSequence;\n\nexport default ropeSequence;\n","import RopeSequence from 'rope-sequence';\nimport { Mapping } from 'prosemirror-transform';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\n// ProseMirror's history isn't simply a way to roll back to a previous\n// state, because ProseMirror supports applying changes without adding\n// them to the history (for example during collaboration).\n//\n// To this end, each 'Branch' (one for the undo history and one for\n// the redo history) keeps an array of 'Items', which can optionally\n// hold a step (an actual undoable change), and always hold a position\n// map (which is needed to move changes below them to apply to the\n// current document).\n//\n// An item that has both a step and a selection bookmark is the start\n// of an 'event' — a group of changes that will be undone or redone at\n// once. (It stores only the bookmark, since that way we don't have to\n// provide a document until the selection is actually applied, which\n// is useful when compressing.)\n\n// Used to schedule history compression\nvar max_empty_items = 500;\n\nvar Branch = function Branch(items, eventCount) {\n this.items = items;\n this.eventCount = eventCount;\n};\n\n// : (EditorState, bool) → ?{transform: Transform, selection: ?SelectionBookmark, remaining: Branch}\n// Pop the latest event off the branch's history and apply it\n// to a document transform.\nBranch.prototype.popEvent = function popEvent (state, preserveItems) {\n var this$1 = this;\n\n if (this.eventCount == 0) { return null }\n\n var end = this.items.length;\n for (;; end--) {\n var next = this.items.get(end - 1);\n if (next.selection) { --end; break }\n }\n\n var remap, mapFrom;\n if (preserveItems) {\n remap = this.remapping(end, this.items.length);\n mapFrom = remap.maps.length;\n }\n var transform = state.tr;\n var selection, remaining;\n var addAfter = [], addBefore = [];\n\n this.items.forEach(function (item, i) {\n if (!item.step) {\n if (!remap) {\n remap = this$1.remapping(end, i + 1);\n mapFrom = remap.maps.length;\n }\n mapFrom--;\n addBefore.push(item);\n return\n }\n\n if (remap) {\n addBefore.push(new Item(item.map));\n var step = item.step.map(remap.slice(mapFrom)), map;\n\n if (step && transform.maybeStep(step).doc) {\n map = transform.mapping.maps[transform.mapping.maps.length - 1];\n addAfter.push(new Item(map, null, null, addAfter.length + addBefore.length));\n }\n mapFrom--;\n if (map) { remap.appendMap(map, mapFrom); }\n } else {\n transform.maybeStep(item.step);\n }\n\n if (item.selection) {\n selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection;\n remaining = new Branch(this$1.items.slice(0, end).append(addBefore.reverse().concat(addAfter)), this$1.eventCount - 1);\n return false\n }\n }, this.items.length, 0);\n\n return {remaining: remaining, transform: transform, selection: selection}\n};\n\n// : (Transform, ?SelectionBookmark, Object) → Branch\n// Create a new branch with the given transform added.\nBranch.prototype.addTransform = function addTransform (transform, selection, histOptions, preserveItems) {\n var newItems = [], eventCount = this.eventCount;\n var oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null;\n\n for (var i = 0; i < transform.steps.length; i++) {\n var step = transform.steps[i].invert(transform.docs[i]);\n var item = new Item(transform.mapping.maps[i], step, selection), merged = (void 0);\n if (merged = lastItem && lastItem.merge(item)) {\n item = merged;\n if (i) { newItems.pop(); }\n else { oldItems = oldItems.slice(0, oldItems.length - 1); }\n }\n newItems.push(item);\n if (selection) {\n eventCount++;\n selection = null;\n }\n if (!preserveItems) { lastItem = item; }\n }\n var overflow = eventCount - histOptions.depth;\n if (overflow > DEPTH_OVERFLOW) {\n oldItems = cutOffEvents(oldItems, overflow);\n eventCount -= overflow;\n }\n return new Branch(oldItems.append(newItems), eventCount)\n};\n\nBranch.prototype.remapping = function remapping (from, to) {\n var maps = new Mapping;\n this.items.forEach(function (item, i) {\n var mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from\n ? maps.maps.length - item.mirrorOffset : null;\n maps.appendMap(item.map, mirrorPos);\n }, from, to);\n return maps\n};\n\nBranch.prototype.addMaps = function addMaps (array) {\n if (this.eventCount == 0) { return this }\n return new Branch(this.items.append(array.map(function (map) { return new Item(map); })), this.eventCount)\n};\n\n// : (Transform, number)\n// When the collab module receives remote changes, the history has\n// to know about those, so that it can adjust the steps that were\n// rebased on top of the remote changes, and include the position\n// maps for the remote changes in its array of items.\nBranch.prototype.rebased = function rebased (rebasedTransform, rebasedCount) {\n if (!this.eventCount) { return this }\n\n var rebasedItems = [], start = Math.max(0, this.items.length - rebasedCount);\n\n var mapping = rebasedTransform.mapping;\n var newUntil = rebasedTransform.steps.length;\n var eventCount = this.eventCount;\n this.items.forEach(function (item) { if (item.selection) { eventCount--; } }, start);\n\n var iRebased = rebasedCount;\n this.items.forEach(function (item) {\n var pos = mapping.getMirror(--iRebased);\n if (pos == null) { return }\n newUntil = Math.min(newUntil, pos);\n var map = mapping.maps[pos];\n if (item.step) {\n var step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]);\n var selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos));\n if (selection) { eventCount++; }\n rebasedItems.push(new Item(map, step, selection));\n } else {\n rebasedItems.push(new Item(map));\n }\n }, start);\n\n var newMaps = [];\n for (var i = rebasedCount; i < newUntil; i++)\n { newMaps.push(new Item(mapping.maps[i])); }\n var items = this.items.slice(0, start).append(newMaps).append(rebasedItems);\n var branch = new Branch(items, eventCount);\n\n if (branch.emptyItemCount() > max_empty_items)\n { branch = branch.compress(this.items.length - rebasedItems.length); }\n return branch\n};\n\nBranch.prototype.emptyItemCount = function emptyItemCount () {\n var count = 0;\n this.items.forEach(function (item) { if (!item.step) { count++; } });\n return count\n};\n\n// Compressing a branch means rewriting it to push the air (map-only\n// items) out. During collaboration, these naturally accumulate\n// because each remote change adds one. The `upto` argument is used\n// to ensure that only the items below a given level are compressed,\n// because `rebased` relies on a clean, untouched set of items in\n// order to associate old items with rebased steps.\nBranch.prototype.compress = function compress (upto) {\n if ( upto === void 0 ) upto = this.items.length;\n\n var remap = this.remapping(0, upto), mapFrom = remap.maps.length;\n var items = [], events = 0;\n this.items.forEach(function (item, i) {\n if (i >= upto) {\n items.push(item);\n if (item.selection) { events++; }\n } else if (item.step) {\n var step = item.step.map(remap.slice(mapFrom)), map = step && step.getMap();\n mapFrom--;\n if (map) { remap.appendMap(map, mapFrom); }\n if (step) {\n var selection = item.selection && item.selection.map(remap.slice(mapFrom));\n if (selection) { events++; }\n var newItem = new Item(map.invert(), step, selection), merged, last = items.length - 1;\n if (merged = items.length && items[last].merge(newItem))\n { items[last] = merged; }\n else\n { items.push(newItem); }\n }\n } else if (item.map) {\n mapFrom--;\n }\n }, this.items.length, 0);\n return new Branch(RopeSequence.from(items.reverse()), events)\n};\n\nBranch.empty = new Branch(RopeSequence.empty, 0);\n\nfunction cutOffEvents(items, n) {\n var cutPoint;\n items.forEach(function (item, i) {\n if (item.selection && (n-- == 0)) {\n cutPoint = i;\n return false\n }\n });\n return items.slice(cutPoint)\n}\n\nvar Item = function Item(map, step, selection, mirrorOffset) {\n // The (forward) step map for this item.\n this.map = map;\n // The inverted step\n this.step = step;\n // If this is non-null, this item is the start of a group, and\n // this selection is the starting selection for the group (the one\n // that was active before the first step was applied)\n this.selection = selection;\n // If this item is the inverse of a previous mapping on the stack,\n // this points at the inverse's offset\n this.mirrorOffset = mirrorOffset;\n};\n\nItem.prototype.merge = function merge (other) {\n if (this.step && other.step && !other.selection) {\n var step = other.step.merge(this.step);\n if (step) { return new Item(step.getMap().invert(), step, this.selection) }\n }\n};\n\n// The value of the state field that tracks undo/redo history for that\n// state. Will be stored in the plugin state when the history plugin\n// is active.\nvar HistoryState = function HistoryState(done, undone, prevRanges, prevTime) {\n this.done = done;\n this.undone = undone;\n this.prevRanges = prevRanges;\n this.prevTime = prevTime;\n};\n\nvar DEPTH_OVERFLOW = 20;\n\n// : (HistoryState, EditorState, Transaction, Object)\n// Record a transformation in undo history.\nfunction applyTransaction(history, state, tr, options) {\n var historyTr = tr.getMeta(historyKey), rebased;\n if (historyTr) { return historyTr.historyState }\n\n if (tr.getMeta(closeHistoryKey)) { history = new HistoryState(history.done, history.undone, null, 0); }\n\n var appended = tr.getMeta(\"appendedTransaction\");\n\n if (tr.steps.length == 0) {\n return history\n } else if (appended && appended.getMeta(historyKey)) {\n if (appended.getMeta(historyKey).redo)\n { return new HistoryState(history.done.addTransform(tr, null, options, mustPreserveItems(state)),\n history.undone, rangesFor(tr.mapping.maps[tr.steps.length - 1]), history.prevTime) }\n else\n { return new HistoryState(history.done, history.undone.addTransform(tr, null, options, mustPreserveItems(state)),\n null, history.prevTime) }\n } else if (tr.getMeta(\"addToHistory\") !== false && !(appended && appended.getMeta(\"addToHistory\") === false)) {\n // Group transforms that occur in quick succession into one event.\n var newGroup = history.prevTime == 0 || !appended && (history.prevTime < (tr.time || 0) - options.newGroupDelay ||\n !isAdjacentTo(tr, history.prevRanges));\n var prevRanges = appended ? mapRanges(history.prevRanges, tr.mapping) : rangesFor(tr.mapping.maps[tr.steps.length - 1]);\n return new HistoryState(history.done.addTransform(tr, newGroup ? state.selection.getBookmark() : null,\n options, mustPreserveItems(state)),\n Branch.empty, prevRanges, tr.time)\n } else if (rebased = tr.getMeta(\"rebased\")) {\n // Used by the collab module to tell the history that some of its\n // content has been rebased.\n return new HistoryState(history.done.rebased(tr, rebased),\n history.undone.rebased(tr, rebased),\n mapRanges(history.prevRanges, tr.mapping), history.prevTime)\n } else {\n return new HistoryState(history.done.addMaps(tr.mapping.maps),\n history.undone.addMaps(tr.mapping.maps),\n mapRanges(history.prevRanges, tr.mapping), history.prevTime)\n }\n}\n\nfunction isAdjacentTo(transform, prevRanges) {\n if (!prevRanges) { return false }\n if (!transform.docChanged) { return true }\n var adjacent = false;\n transform.mapping.maps[0].forEach(function (start, end) {\n for (var i = 0; i < prevRanges.length; i += 2)\n { if (start <= prevRanges[i + 1] && end >= prevRanges[i])\n { adjacent = true; } }\n });\n return adjacent\n}\n\nfunction rangesFor(map) {\n var result = [];\n map.forEach(function (_from, _to, from, to) { return result.push(from, to); });\n return result\n}\n\nfunction mapRanges(ranges, mapping) {\n if (!ranges) { return null }\n var result = [];\n for (var i = 0; i < ranges.length; i += 2) {\n var from = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1);\n if (from <= to) { result.push(from, to); }\n }\n return result\n}\n\n// : (HistoryState, EditorState, (tr: Transaction), bool)\n// Apply the latest event from one branch to the document and shift the event\n// onto the other branch.\nfunction histTransaction(history, state, dispatch, redo) {\n var preserveItems = mustPreserveItems(state), histOptions = historyKey.get(state).spec.config;\n var pop = (redo ? history.undone : history.done).popEvent(state, preserveItems);\n if (!pop) { return }\n\n var selection = pop.selection.resolve(pop.transform.doc);\n var added = (redo ? history.done : history.undone).addTransform(pop.transform, state.selection.getBookmark(),\n histOptions, preserveItems);\n\n var newHist = new HistoryState(redo ? added : pop.remaining, redo ? pop.remaining : added, null, 0);\n dispatch(pop.transform.setSelection(selection).setMeta(historyKey, {redo: redo, historyState: newHist}).scrollIntoView());\n}\n\nvar cachedPreserveItems = false, cachedPreserveItemsPlugins = null;\n// Check whether any plugin in the given state has a\n// `historyPreserveItems` property in its spec, in which case we must\n// preserve steps exactly as they came in, so that they can be\n// rebased.\nfunction mustPreserveItems(state) {\n var plugins = state.plugins;\n if (cachedPreserveItemsPlugins != plugins) {\n cachedPreserveItems = false;\n cachedPreserveItemsPlugins = plugins;\n for (var i = 0; i < plugins.length; i++) { if (plugins[i].spec.historyPreserveItems) {\n cachedPreserveItems = true;\n break\n } }\n }\n return cachedPreserveItems\n}\n\n// :: (Transaction) → Transaction\n// Set a flag on the given transaction that will prevent further steps\n// from being appended to an existing history event (so that they\n// require a separate undo command to undo).\nfunction closeHistory(tr) {\n return tr.setMeta(closeHistoryKey, true)\n}\n\nvar historyKey = new PluginKey(\"history\");\nvar closeHistoryKey = new PluginKey(\"closeHistory\");\n\n// :: (?Object) → Plugin\n// Returns a plugin that enables the undo history for an editor. The\n// plugin will track undo and redo stacks, which can be used with the\n// [`undo`](#history.undo) and [`redo`](#history.redo) commands.\n//\n// You can set an `\"addToHistory\"` [metadata\n// property](#state.Transaction.setMeta) of `false` on a transaction\n// to prevent it from being rolled back by undo.\n//\n// config::-\n// Supports the following configuration options:\n//\n// depth:: ?number\n// The amount of history events that are collected before the\n// oldest events are discarded. Defaults to 100.\n//\n// newGroupDelay:: ?number\n// The delay between changes after which a new group should be\n// started. Defaults to 500 (milliseconds). Note that when changes\n// aren't adjacent, a new group is always started.\nfunction history(config) {\n config = {depth: config && config.depth || 100,\n newGroupDelay: config && config.newGroupDelay || 500};\n return new Plugin({\n key: historyKey,\n\n state: {\n init: function init() {\n return new HistoryState(Branch.empty, Branch.empty, null, 0)\n },\n apply: function apply(tr, hist, state) {\n return applyTransaction(hist, state, tr, config)\n }\n },\n\n config: config\n })\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// A command function that undoes the last change, if any.\nfunction undo(state, dispatch) {\n var hist = historyKey.getState(state);\n if (!hist || hist.done.eventCount == 0) { return false }\n if (dispatch) { histTransaction(hist, state, dispatch, false); }\n return true\n}\n\n// :: (EditorState, ?(tr: Transaction)) → bool\n// A command function that redoes the last undone change, if any.\nfunction redo(state, dispatch) {\n var hist = historyKey.getState(state);\n if (!hist || hist.undone.eventCount == 0) { return false }\n if (dispatch) { histTransaction(hist, state, dispatch, true); }\n return true\n}\n\n// :: (EditorState) → number\n// The amount of undoable events available in a given state.\nfunction undoDepth(state) {\n var hist = historyKey.getState(state);\n return hist ? hist.done.eventCount : 0\n}\n\n// :: (EditorState) → number\n// The amount of redoable events available in a given editor state.\nfunction redoDepth(state) {\n var hist = historyKey.getState(state);\n return hist ? hist.undone.eventCount : 0\n}\n\nexport { HistoryState, closeHistory, history, redo, redoDepth, undo, undoDepth };\n//# sourceMappingURL=index.es.js.map\n","import { TextSelection, NodeSelection, Selection } from 'prosemirror-state';\nimport { DOMSerializer, Fragment, Mark, DOMParser, Slice } from 'prosemirror-model';\nimport { dropPoint } from 'prosemirror-transform';\n\nvar result = {};\n\nif (typeof navigator != \"undefined\" && typeof document != \"undefined\") {\n var ie_edge = /Edge\\/(\\d+)/.exec(navigator.userAgent);\n var ie_upto10 = /MSIE \\d/.test(navigator.userAgent);\n var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);\n\n result.mac = /Mac/.test(navigator.platform);\n var ie = result.ie = !!(ie_upto10 || ie_11up || ie_edge);\n result.ie_version = ie_upto10 ? document.documentMode || 6 : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : null;\n result.gecko = !ie && /gecko\\/(\\d+)/i.test(navigator.userAgent);\n result.gecko_version = result.gecko && +(/Firefox\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1];\n var chrome = !ie && /Chrome\\/(\\d+)/.exec(navigator.userAgent);\n result.chrome = !!chrome;\n result.chrome_version = chrome && +chrome[1];\n // Is true for both iOS and iPadOS for convenience\n result.safari = !ie && /Apple Computer/.test(navigator.vendor);\n result.ios = result.safari && (/Mobile\\/\\w+/.test(navigator.userAgent) || navigator.maxTouchPoints > 2);\n result.android = /Android \\d/.test(navigator.userAgent);\n result.webkit = \"webkitFontSmoothing\" in document.documentElement.style;\n result.webkit_version = result.webkit && +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1];\n}\n\nvar domIndex = function(node) {\n for (var index = 0;; index++) {\n node = node.previousSibling;\n if (!node) { return index }\n }\n};\n\nvar parentNode = function(node) {\n var parent = node.parentNode;\n return parent && parent.nodeType == 11 ? parent.host : parent\n};\n\nvar reusedRange = null;\n\n// Note that this will always return the same range, because DOM range\n// objects are every expensive, and keep slowing down subsequent DOM\n// updates, for some reason.\nvar textRange = function(node, from, to) {\n var range = reusedRange || (reusedRange = document.createRange());\n range.setEnd(node, to == null ? node.nodeValue.length : to);\n range.setStart(node, from || 0);\n return range\n};\n\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nvar isEquivalentPosition = function(node, off, targetNode, targetOff) {\n return targetNode && (scanFor(node, off, targetNode, targetOff, -1) ||\n scanFor(node, off, targetNode, targetOff, 1))\n};\n\nvar atomElements = /^(img|br|input|textarea|hr)$/i;\n\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n for (;;) {\n if (node == targetNode && off == targetOff) { return true }\n if (off == (dir < 0 ? 0 : nodeSize(node))) {\n var parent = node.parentNode;\n if (parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) || node.contentEditable == \"false\")\n { return false }\n off = domIndex(node) + (dir < 0 ? 0 : 1);\n node = parent;\n } else if (node.nodeType == 1) {\n node = node.childNodes[off + (dir < 0 ? -1 : 0)];\n if (node.contentEditable == \"false\") { return false }\n off = dir < 0 ? nodeSize(node) : 0;\n } else {\n return false\n }\n }\n}\n\nfunction nodeSize(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length\n}\n\nfunction isOnEdge(node, offset, parent) {\n for (var atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd;) {\n if (node == parent) { return true }\n var index = domIndex(node);\n node = node.parentNode;\n if (!node) { return false }\n atStart = atStart && index == 0;\n atEnd = atEnd && index == nodeSize(node);\n }\n}\n\nfunction hasBlockDesc(dom) {\n var desc;\n for (var cur = dom; cur; cur = cur.parentNode) { if (desc = cur.pmViewDesc) { break } }\n return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom)\n}\n\n// Work around Chrome issue https://bugs.chromium.org/p/chromium/issues/detail?id=447523\n// (isCollapsed inappropriately returns true in shadow dom)\nvar selectionCollapsed = function(domSel) {\n var collapsed = domSel.isCollapsed;\n if (collapsed && result.chrome && domSel.rangeCount && !domSel.getRangeAt(0).collapsed)\n { collapsed = false; }\n return collapsed\n};\n\nfunction keyEvent(keyCode, key) {\n var event = document.createEvent(\"Event\");\n event.initEvent(\"keydown\", true, true);\n event.keyCode = keyCode;\n event.key = event.code = key;\n return event\n}\n\nfunction windowRect(doc) {\n return {left: 0, right: doc.documentElement.clientWidth,\n top: 0, bottom: doc.documentElement.clientHeight}\n}\n\nfunction getSide(value, side) {\n return typeof value == \"number\" ? value : value[side]\n}\n\nfunction clientRect(node) {\n var rect = node.getBoundingClientRect();\n // Make sure scrollbar width isn't included in the rectangle\n return {left: rect.left, right: rect.left + node.clientWidth,\n top: rect.top, bottom: rect.top + node.clientHeight}\n}\n\nfunction scrollRectIntoView(view, rect, startDOM) {\n var scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n var doc = view.dom.ownerDocument;\n for (var parent = startDOM || view.dom;; parent = parentNode(parent)) {\n if (!parent) { break }\n if (parent.nodeType != 1) { continue }\n var atTop = parent == doc.body || parent.nodeType != 1;\n var bounding = atTop ? windowRect(doc) : clientRect(parent);\n var moveX = 0, moveY = 0;\n if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n { moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\")); }\n else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n { moveY = rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\"); }\n if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n { moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\")); }\n else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n { moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\"); }\n if (moveX || moveY) {\n if (atTop) {\n doc.defaultView.scrollBy(moveX, moveY);\n } else {\n var startX = parent.scrollLeft, startY = parent.scrollTop;\n if (moveY) { parent.scrollTop += moveY; }\n if (moveX) { parent.scrollLeft += moveX; }\n var dX = parent.scrollLeft - startX, dY = parent.scrollTop - startY;\n rect = {left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY};\n }\n }\n if (atTop) { break }\n }\n}\n\n// Store the scroll position of the editor's parent nodes, along with\n// the top position of an element near the top of the editor, which\n// will be used to make sure the visible viewport remains stable even\n// when the size of the content above changes.\nfunction storeScrollPos(view) {\n var rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n var refDOM, refTop;\n for (var x = (rect.left + rect.right) / 2, y = startY + 1;\n y < Math.min(innerHeight, rect.bottom); y += 5) {\n var dom = view.root.elementFromPoint(x, y);\n if (dom == view.dom || !view.dom.contains(dom)) { continue }\n var localRect = dom.getBoundingClientRect();\n if (localRect.top >= startY - 20) {\n refDOM = dom;\n refTop = localRect.top;\n break\n }\n }\n return {refDOM: refDOM, refTop: refTop, stack: scrollStack(view.dom)}\n}\n\nfunction scrollStack(dom) {\n var stack = [], doc = dom.ownerDocument;\n for (; dom; dom = parentNode(dom)) {\n stack.push({dom: dom, top: dom.scrollTop, left: dom.scrollLeft});\n if (dom == doc) { break }\n }\n return stack\n}\n\n// Reset the scroll position of the editor's parent nodes to that what\n// it was before, when storeScrollPos was called.\nfunction resetScrollPos(ref) {\n var refDOM = ref.refDOM;\n var refTop = ref.refTop;\n var stack = ref.stack;\n\n var newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\n\nfunction restoreScrollStack(stack, dTop) {\n for (var i = 0; i < stack.length; i++) {\n var ref = stack[i];\n var dom = ref.dom;\n var top = ref.top;\n var left = ref.left;\n if (dom.scrollTop != top + dTop) { dom.scrollTop = top + dTop; }\n if (dom.scrollLeft != left) { dom.scrollLeft = left; }\n }\n}\n\nvar preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n if (dom.setActive) { return dom.setActive() } // in IE\n if (preventScrollSupported) { return dom.focus(preventScrollSupported) }\n\n var stored = scrollStack(dom);\n dom.focus(preventScrollSupported == null ? {\n get preventScroll() {\n preventScrollSupported = {preventScroll: true};\n return true\n }\n } : undefined);\n if (!preventScrollSupported) {\n preventScrollSupported = false;\n restoreScrollStack(stored, 0);\n }\n}\n\nfunction findOffsetInNode(node, coords) {\n var closest, dxClosest = 2e8, coordsClosest, offset = 0;\n var rowBot = coords.top, rowTop = coords.top;\n for (var child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n var rects = (void 0);\n if (child.nodeType == 1) { rects = child.getClientRects(); }\n else if (child.nodeType == 3) { rects = textRange(child).getClientRects(); }\n else { continue }\n\n for (var i = 0; i < rects.length; i++) {\n var rect = rects[i];\n if (rect.top <= rowBot && rect.bottom >= rowTop) {\n rowBot = Math.max(rect.bottom, rowBot);\n rowTop = Math.min(rect.top, rowTop);\n var dx = rect.left > coords.left ? rect.left - coords.left\n : rect.right < coords.left ? coords.left - rect.right : 0;\n if (dx < dxClosest) {\n closest = child;\n dxClosest = dx;\n coordsClosest = dx && closest.nodeType == 3 ? {left: rect.right < coords.left ? rect.right : rect.left, top: coords.top} : coords;\n if (child.nodeType == 1 && dx)\n { offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0); }\n continue\n }\n }\n if (!closest && (coords.left >= rect.right && coords.top >= rect.top ||\n coords.left >= rect.left && coords.top >= rect.bottom))\n { offset = childIndex + 1; }\n }\n }\n if (closest && closest.nodeType == 3) { return findOffsetInText(closest, coordsClosest) }\n if (!closest || (dxClosest && closest.nodeType == 1)) { return {node: node, offset: offset} }\n return findOffsetInNode(closest, coordsClosest)\n}\n\nfunction findOffsetInText(node, coords) {\n var len = node.nodeValue.length;\n var range = document.createRange();\n for (var i = 0; i < len; i++) {\n range.setEnd(node, i + 1);\n range.setStart(node, i);\n var rect = singleRect(range, 1);\n if (rect.top == rect.bottom) { continue }\n if (inRect(coords, rect))\n { return {node: node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0)} }\n }\n return {node: node, offset: 0}\n}\n\nfunction inRect(coords, rect) {\n return coords.left >= rect.left - 1 && coords.left <= rect.right + 1&&\n coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1\n}\n\nfunction targetKludge(dom, coords) {\n var parent = dom.parentNode;\n if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n { return parent }\n return dom\n}\n\nfunction posFromElement(view, elt, coords) {\n var ref = findOffsetInNode(elt, coords);\n var node = ref.node;\n var offset = ref.offset;\n var bias = -1;\n if (node.nodeType == 1 && !node.firstChild) {\n var rect = node.getBoundingClientRect();\n bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n }\n return view.docView.posFromDOM(node, offset, bias)\n}\n\nfunction posFromCaret(view, node, offset, coords) {\n // Browser (in caretPosition/RangeFromPoint) will agressively\n // normalize towards nearby inline nodes. Since we are interested in\n // positions between block nodes too, we first walk up the hierarchy\n // of nodes to see if there are block nodes that the coordinates\n // fall outside of. If so, we take the position before/after that\n // block. If not, we call `posFromDOM` on the raw node/offset.\n var outside = -1;\n for (var cur = node;;) {\n if (cur == view.dom) { break }\n var desc = view.docView.nearestDesc(cur, true);\n if (!desc) { return null }\n if (desc.node.isBlock && desc.parent) {\n var rect = desc.dom.getBoundingClientRect();\n if (rect.left > coords.left || rect.top > coords.top) { outside = desc.posBefore; }\n else if (rect.right < coords.left || rect.bottom < coords.top) { outside = desc.posAfter; }\n else { break }\n }\n cur = desc.dom.parentNode;\n }\n return outside > -1 ? outside : view.docView.posFromDOM(node, offset)\n}\n\nfunction elementFromPoint(element, coords, box) {\n var len = element.childNodes.length;\n if (len && box.top < box.bottom) {\n for (var startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {\n var child = element.childNodes[i];\n if (child.nodeType == 1) {\n var rects = child.getClientRects();\n for (var j = 0; j < rects.length; j++) {\n var rect = rects[j];\n if (inRect(coords, rect)) { return elementFromPoint(child, coords, rect) }\n }\n }\n if ((i = (i + 1) % len) == startI) { break }\n }\n }\n return element\n}\n\n// Given an x,y position on the editor, get the position in the document.\nfunction posAtCoords(view, coords) {\n var assign, assign$1;\n\n var root = view.root, node, offset;\n if (root.caretPositionFromPoint) {\n try { // Firefox throws for this call in hard-to-predict circumstances (#994)\n var pos$1 = root.caretPositionFromPoint(coords.left, coords.top);\n if (pos$1) { ((assign = pos$1, node = assign.offsetNode, offset = assign.offset)); }\n } catch (_) {}\n }\n if (!node && root.caretRangeFromPoint) {\n var range = root.caretRangeFromPoint(coords.left, coords.top);\n if (range) { ((assign$1 = range, node = assign$1.startContainer, offset = assign$1.startOffset)); }\n }\n\n var elt = root.elementFromPoint(coords.left, coords.top + 1), pos;\n if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n var box = view.dom.getBoundingClientRect();\n if (!inRect(coords, box)) { return null }\n elt = elementFromPoint(view.dom, coords, box);\n if (!elt) { return null }\n }\n // Safari's caretRangeFromPoint returns nonsense when on a draggable element\n if (result.safari && elt.draggable) { node = offset = null; }\n elt = targetKludge(elt, coords);\n if (node) {\n if (result.gecko && node.nodeType == 1) {\n // Firefox will sometimes return offsets into nodes, which\n // have no actual children, from caretPositionFromPoint (#953)\n offset = Math.min(offset, node.childNodes.length);\n // It'll also move the returned position before image nodes,\n // even if those are behind it.\n if (offset < node.childNodes.length) {\n var next = node.childNodes[offset], box$1;\n if (next.nodeName == \"IMG\" && (box$1 = next.getBoundingClientRect()).right <= coords.left &&\n box$1.bottom > coords.top)\n { offset++; }\n }\n }\n // Suspiciously specific kludge to work around caret*FromPoint\n // never returning a position at the end of the document\n if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&\n coords.top > node.lastChild.getBoundingClientRect().bottom)\n { pos = view.state.doc.content.size; }\n // Ignore positions directly after a BR, since caret*FromPoint\n // 'round up' positions that would be more accurately placed\n // before the BR node.\n else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n { pos = posFromCaret(view, node, offset, coords); }\n }\n if (pos == null) { pos = posFromElement(view, elt, coords); }\n\n var desc = view.docView.nearestDesc(elt, true);\n return {pos: pos, inside: desc ? desc.posAtStart - desc.border : -1}\n}\n\nfunction singleRect(object, bias) {\n var rects = object.getClientRects();\n return !rects.length ? object.getBoundingClientRect() : rects[bias < 0 ? 0 : rects.length - 1]\n}\n\nvar BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n\n// : (EditorView, number, number) → {left: number, top: number, right: number, bottom: number}\n// Given a position in the document model, get a bounding box of the\n// character at that position, relative to the window.\nfunction coordsAtPos(view, pos, side) {\n var ref = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n var node = ref.node;\n var offset = ref.offset;\n\n var supportEmptyRange = result.webkit || result.gecko;\n if (node.nodeType == 3) {\n // These browsers support querying empty text ranges. Prefer that in\n // bidi context or when at the end of a node.\n if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n var rect = singleRect(textRange(node, offset, offset), side);\n // Firefox returns bad results (the position before the space)\n // when querying a position directly after line-broken\n // whitespace. Detect this situation and and kludge around it\n if (result.gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n var rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n if (rectBefore.top == rect.top) {\n var rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n if (rectAfter.top != rect.top)\n { return flattenV(rectAfter, rectAfter.left < rectBefore.left) }\n }\n }\n return rect\n } else {\n var from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n if (side < 0 && !offset) { to++; takeSide = -1; }\n else if (side >= 0 && offset == node.nodeValue.length) { from--; takeSide = 1; }\n else if (side < 0) { from--; }\n else { to ++; }\n return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0)\n }\n }\n\n // Return a horizontal line in block context\n if (!view.state.doc.resolve(pos).parent.inlineContent) {\n if (offset && (side < 0 || offset == nodeSize(node))) {\n var before = node.childNodes[offset - 1];\n if (before.nodeType == 1) { return flattenH(before.getBoundingClientRect(), false) }\n }\n if (offset < nodeSize(node)) {\n var after = node.childNodes[offset];\n if (after.nodeType == 1) { return flattenH(after.getBoundingClientRect(), true) }\n }\n return flattenH(node.getBoundingClientRect(), side >= 0)\n }\n\n // Inline, not in text node (this is not Bidi-safe)\n if (offset && (side < 0 || offset == nodeSize(node))) {\n var before$1 = node.childNodes[offset - 1];\n var target = before$1.nodeType == 3 ? textRange(before$1, nodeSize(before$1) - (supportEmptyRange ? 0 : 1))\n // BR nodes tend to only return the rectangle before them.\n // Only use them if they are the last element in their parent\n : before$1.nodeType == 1 && (before$1.nodeName != \"BR\" || !before$1.nextSibling) ? before$1 : null;\n if (target) { return flattenV(singleRect(target, 1), false) }\n }\n if (offset < nodeSize(node)) {\n var after$1 = node.childNodes[offset];\n var target$1 = after$1.nodeType == 3 ? textRange(after$1, 0, (supportEmptyRange ? 0 : 1))\n : after$1.nodeType == 1 ? after$1 : null;\n if (target$1) { return flattenV(singleRect(target$1, -1), true) }\n }\n // All else failed, just try to get a rectangle for the target node\n return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0)\n}\n\nfunction flattenV(rect, left) {\n if (rect.width == 0) { return rect }\n var x = left ? rect.left : rect.right;\n return {top: rect.top, bottom: rect.bottom, left: x, right: x}\n}\n\nfunction flattenH(rect, top) {\n if (rect.height == 0) { return rect }\n var y = top ? rect.top : rect.bottom;\n return {top: y, bottom: y, left: rect.left, right: rect.right}\n}\n\nfunction withFlushedState(view, state, f) {\n var viewState = view.state, active = view.root.activeElement;\n if (viewState != state) { view.updateState(state); }\n if (active != view.dom) { view.focus(); }\n try {\n return f()\n } finally {\n if (viewState != state) { view.updateState(viewState); }\n if (active != view.dom && active) { active.focus(); }\n }\n}\n\n// : (EditorView, number, number)\n// Whether vertical position motion in a given direction\n// from a position would leave a text block.\nfunction endOfTextblockVertical(view, state, dir) {\n var sel = state.selection;\n var $pos = dir == \"up\" ? sel.$from : sel.$to;\n return withFlushedState(view, state, function () {\n var ref = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n var dom = ref.node;\n for (;;) {\n var nearest = view.docView.nearestDesc(dom, true);\n if (!nearest) { break }\n if (nearest.node.isBlock) { dom = nearest.dom; break }\n dom = nearest.dom.parentNode;\n }\n var coords = coordsAtPos(view, $pos.pos, 1);\n for (var child = dom.firstChild; child; child = child.nextSibling) {\n var boxes = (void 0);\n if (child.nodeType == 1) { boxes = child.getClientRects(); }\n else if (child.nodeType == 3) { boxes = textRange(child, 0, child.nodeValue.length).getClientRects(); }\n else { continue }\n for (var i = 0; i < boxes.length; i++) {\n var box = boxes[i];\n if (box.bottom > box.top && (dir == \"up\" ? box.bottom < coords.top + 1 : box.top > coords.bottom - 1))\n { return false }\n }\n }\n return true\n })\n}\n\nvar maybeRTL = /[\\u0590-\\u08ac]/;\n\nfunction endOfTextblockHorizontal(view, state, dir) {\n var ref = state.selection;\n var $head = ref.$head;\n if (!$head.parent.isTextblock) { return false }\n var offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n var sel = getSelection();\n // If the textblock is all LTR, or the browser doesn't support\n // Selection.modify (Edge), fall back to a primitive approach\n if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n { return dir == \"left\" || dir == \"backward\" ? atStart : atEnd }\n\n return withFlushedState(view, state, function () {\n // This is a huge hack, but appears to be the best we can\n // currently do: use `Selection.modify` to move the selection by\n // one character, and see if that moves the cursor out of the\n // textblock (or doesn't move it at all, when at the start/end of\n // the document).\n var oldRange = sel.getRangeAt(0), oldNode = sel.focusNode, oldOff = sel.focusOffset;\n var oldBidiLevel = sel.caretBidiLevel; // Only for Firefox\n sel.modify(\"move\", dir, \"character\");\n var parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n var result = !parentDOM.contains(sel.focusNode.nodeType == 1 ? sel.focusNode : sel.focusNode.parentNode) ||\n (oldNode == sel.focusNode && oldOff == sel.focusOffset);\n // Restore the previous selection\n sel.removeAllRanges();\n sel.addRange(oldRange);\n if (oldBidiLevel != null) { sel.caretBidiLevel = oldBidiLevel; }\n return result\n })\n}\n\nvar cachedState = null, cachedDir = null, cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n if (cachedState == state && cachedDir == dir) { return cachedResult }\n cachedState = state; cachedDir = dir;\n return cachedResult = dir == \"up\" || dir == \"down\"\n ? endOfTextblockVertical(view, state, dir)\n : endOfTextblockHorizontal(view, state, dir)\n}\n\n// NodeView:: interface\n//\n// By default, document nodes are rendered using the result of the\n// [`toDOM`](#model.NodeSpec.toDOM) method of their spec, and managed\n// entirely by the editor. For some use cases, such as embedded\n// node-specific editing interfaces, you want more control over\n// the behavior of a node's in-editor representation, and need to\n// [define](#view.EditorProps.nodeViews) a custom node view.\n//\n// Mark views only support `dom` and `contentDOM`, and don't support\n// any of the node view methods.\n//\n// Objects returned as node views must conform to this interface.\n//\n// dom:: ?dom.Node\n// The outer DOM node that represents the document node. When not\n// given, the default strategy is used to create a DOM node.\n//\n// contentDOM:: ?dom.Node\n// The DOM node that should hold the node's content. Only meaningful\n// if the node view also defines a `dom` property and if its node\n// type is not a leaf node type. When this is present, ProseMirror\n// will take care of rendering the node's children into it. When it\n// is not present, the node view itself is responsible for rendering\n// (or deciding not to render) its child nodes.\n//\n// update:: ?(node: Node, decorations: [Decoration]) → bool\n// When given, this will be called when the view is updating itself.\n// It will be given a node (possibly of a different type), and an\n// array of active decorations (which are automatically drawn, and\n// the node view may ignore if it isn't interested in them), and\n// should return true if it was able to update to that node, and\n// false otherwise. If the node view has a `contentDOM` property (or\n// no `dom` property), updating its child nodes will be handled by\n// ProseMirror.\n//\n// selectNode:: ?()\n// Can be used to override the way the node's selected status (as a\n// node selection) is displayed.\n//\n// deselectNode:: ?()\n// When defining a `selectNode` method, you should also provide a\n// `deselectNode` method to remove the effect again.\n//\n// setSelection:: ?(anchor: number, head: number, root: dom.Document)\n// This will be called to handle setting the selection inside the\n// node. The `anchor` and `head` positions are relative to the start\n// of the node. By default, a DOM selection will be created between\n// the DOM positions corresponding to those positions, but if you\n// override it you can do something else.\n//\n// stopEvent:: ?(event: dom.Event) → bool\n// Can be used to prevent the editor view from trying to handle some\n// or all DOM events that bubble up from the node view. Events for\n// which this returns true are not handled by the editor.\n//\n// ignoreMutation:: ?(dom.MutationRecord) → bool\n// Called when a DOM\n// [mutation](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver)\n// or a selection change happens within the view. When the change is\n// a selection change, the record will have a `type` property of\n// `\"selection\"` (which doesn't occur for native mutation records).\n// Return false if the editor should re-read the selection or\n// re-parse the range around the mutation, true if it can safely be\n// ignored.\n//\n// destroy:: ?()\n// Called when the node view is removed from the editor or the whole\n// editor is destroyed. (Not available for marks.)\n\n// View descriptions are data structures that describe the DOM that is\n// used to represent the editor's content. They are used for:\n//\n// - Incremental redrawing when the document changes\n//\n// - Figuring out what part of the document a given DOM position\n// corresponds to\n//\n// - Wiring in custom implementations of the editing interface for a\n// given node\n//\n// They form a doubly-linked mutable tree, starting at `view.docView`.\n\nvar NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\n\n// Superclass for the various kinds of descriptions. Defines their\n// basic structure and shared methods.\nvar ViewDesc = function ViewDesc(parent, children, dom, contentDOM) {\n this.parent = parent;\n this.children = children;\n this.dom = dom;\n // An expando property on the DOM node provides a link back to its\n // description.\n dom.pmViewDesc = this;\n // This is the node that holds the child views. It may be null for\n // descs that don't have children.\n this.contentDOM = contentDOM;\n this.dirty = NOT_DIRTY;\n};\n\nvar prototypeAccessors = { beforePosition: { configurable: true },size: { configurable: true },border: { configurable: true },posBefore: { configurable: true },posAtStart: { configurable: true },posAfter: { configurable: true },posAtEnd: { configurable: true },contentLost: { configurable: true },domAtom: { configurable: true } };\n\n// Used to check whether a given description corresponds to a\n// widget/mark/node.\nViewDesc.prototype.matchesWidget = function matchesWidget () { return false };\nViewDesc.prototype.matchesMark = function matchesMark () { return false };\nViewDesc.prototype.matchesNode = function matchesNode () { return false };\nViewDesc.prototype.matchesHack = function matchesHack () { return false };\n\nprototypeAccessors.beforePosition.get = function () { return false };\n\n// : () → ?ParseRule\n// When parsing in-editor content (in domchange.js), we allow\n// descriptions to determine the parse rules that should be used to\n// parse them.\nViewDesc.prototype.parseRule = function parseRule () { return null };\n\n// : (dom.Event) → bool\n// Used by the editor's event handler to ignore events that come\n// from certain descs.\nViewDesc.prototype.stopEvent = function stopEvent () { return false };\n\n// The size of the content represented by this desc.\nprototypeAccessors.size.get = function () {\n var size = 0;\n for (var i = 0; i < this.children.length; i++) { size += this.children[i].size; }\n return size\n};\n\n// For block nodes, this represents the space taken up by their\n// start/end tokens.\nprototypeAccessors.border.get = function () { return 0 };\n\nViewDesc.prototype.destroy = function destroy () {\n this.parent = null;\n if (this.dom.pmViewDesc == this) { this.dom.pmViewDesc = null; }\n for (var i = 0; i < this.children.length; i++)\n { this.children[i].destroy(); }\n};\n\nViewDesc.prototype.posBeforeChild = function posBeforeChild (child) {\n for (var i = 0, pos = this.posAtStart; i < this.children.length; i++) {\n var cur = this.children[i];\n if (cur == child) { return pos }\n pos += cur.size;\n }\n};\n\nprototypeAccessors.posBefore.get = function () {\n return this.parent.posBeforeChild(this)\n};\n\nprototypeAccessors.posAtStart.get = function () {\n return this.parent ? this.parent.posBeforeChild(this) + this.border : 0\n};\n\nprototypeAccessors.posAfter.get = function () {\n return this.posBefore + this.size\n};\n\nprototypeAccessors.posAtEnd.get = function () {\n return this.posAtStart + this.size - 2 * this.border\n};\n\n// : (dom.Node, number, ?number) → number\nViewDesc.prototype.localPosFromDOM = function localPosFromDOM (dom, offset, bias) {\n // If the DOM position is in the content, use the child desc after\n // it to figure out a position.\n if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n if (bias < 0) {\n var domBefore, desc;\n if (dom == this.contentDOM) {\n domBefore = dom.childNodes[offset - 1];\n } else {\n while (dom.parentNode != this.contentDOM) { dom = dom.parentNode; }\n domBefore = dom.previousSibling;\n }\n while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this)) { domBefore = domBefore.previousSibling; }\n return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart\n } else {\n var domAfter, desc$1;\n if (dom == this.contentDOM) {\n domAfter = dom.childNodes[offset];\n } else {\n while (dom.parentNode != this.contentDOM) { dom = dom.parentNode; }\n domAfter = dom.nextSibling;\n }\n while (domAfter && !((desc$1 = domAfter.pmViewDesc) && desc$1.parent == this)) { domAfter = domAfter.nextSibling; }\n return domAfter ? this.posBeforeChild(desc$1) : this.posAtEnd\n }\n }\n // Otherwise, use various heuristics, falling back on the bias\n // parameter, to determine whether to return the position at the\n // start or at the end of this view desc.\n var atEnd;\n if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n } else if (this.dom.firstChild) {\n if (offset == 0) { for (var search = dom;; search = search.parentNode) {\n if (search == this.dom) { atEnd = false; break }\n if (search.parentNode.firstChild != search) { break }\n } }\n if (atEnd == null && offset == dom.childNodes.length) { for (var search$1 = dom;; search$1 = search$1.parentNode) {\n if (search$1 == this.dom) { atEnd = true; break }\n if (search$1.parentNode.lastChild != search$1) { break }\n } }\n }\n return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart\n};\n\n// Scan up the dom finding the first desc that is a descendant of\n// this one.\nViewDesc.prototype.nearestDesc = function nearestDesc (dom, onlyNodes) {\n for (var first = true, cur = dom; cur; cur = cur.parentNode) {\n var desc = this.getDesc(cur);\n if (desc && (!onlyNodes || desc.node)) {\n // If dom is outside of this desc's nodeDOM, don't count it.\n if (first && desc.nodeDOM &&\n !(desc.nodeDOM.nodeType == 1 ? desc.nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : desc.nodeDOM == dom))\n { first = false; }\n else\n { return desc }\n }\n }\n};\n\nViewDesc.prototype.getDesc = function getDesc (dom) {\n var desc = dom.pmViewDesc;\n for (var cur = desc; cur; cur = cur.parent) { if (cur == this) { return desc } }\n};\n\nViewDesc.prototype.posFromDOM = function posFromDOM (dom, offset, bias) {\n for (var scan = dom; scan; scan = scan.parentNode) {\n var desc = this.getDesc(scan);\n if (desc) { return desc.localPosFromDOM(dom, offset, bias) }\n }\n return -1\n};\n\n// : (number) → ?NodeViewDesc\n// Find the desc for the node after the given pos, if any. (When a\n// parent node overrode rendering, there might not be one.)\nViewDesc.prototype.descAt = function descAt (pos) {\n for (var i = 0, offset = 0; i < this.children.length; i++) {\n var child = this.children[i], end = offset + child.size;\n if (offset == pos && end != offset) {\n while (!child.border && child.children.length) { child = child.children[0]; }\n return child\n }\n if (pos < end) { return child.descAt(pos - offset - child.border) }\n offset = end;\n }\n};\n\n// : (number, number) → {node: dom.Node, offset: number}\nViewDesc.prototype.domFromPos = function domFromPos (pos, side) {\n if (!this.contentDOM) { return {node: this.dom, offset: 0} }\n for (var offset = 0, i = 0, first = true;; i++, first = false) {\n // Skip removed or always-before children\n while (i < this.children.length && (this.children[i].beforePosition ||\n this.children[i].dom.parentNode != this.contentDOM))\n { offset += this.children[i++].size; }\n var child = i == this.children.length ? null : this.children[i];\n if (offset == pos && (side == 0 || !child || !child.size || child.border || (side < 0 && first)) ||\n child && child.domAtom && pos < offset + child.size) { return {\n node: this.contentDOM,\n offset: child ? domIndex(child.dom) : this.contentDOM.childNodes.length\n } }\n if (!child) { throw new Error(\"Invalid position \" + pos) }\n var end = offset + child.size;\n if (!child.domAtom && (side < 0 && !child.border ? end >= pos : end > pos))\n { return child.domFromPos(pos - offset - child.border, side) }\n offset = end;\n }\n};\n\n// Used to find a DOM range in a single parent for a given changed\n// range.\nViewDesc.prototype.parseRange = function parseRange (from, to, base) {\n if ( base === void 0 ) base = 0;\n\n if (this.children.length == 0)\n { return {node: this.contentDOM, from: from, to: to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length} }\n\n var fromOffset = -1, toOffset = -1;\n for (var offset = base, i = 0;; i++) {\n var child = this.children[i], end = offset + child.size;\n if (fromOffset == -1 && from <= end) {\n var childBase = offset + child.border;\n // FIXME maybe descend mark views to parse a narrower range?\n if (from >= childBase && to <= end - child.border && child.node &&\n child.contentDOM && this.contentDOM.contains(child.contentDOM))\n { return child.parseRange(from, to, childBase) }\n\n from = offset;\n for (var j = i; j > 0; j--) {\n var prev = this.children[j - 1];\n if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n fromOffset = domIndex(prev.dom) + 1;\n break\n }\n from -= prev.size;\n }\n if (fromOffset == -1) { fromOffset = 0; }\n }\n if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n to = end;\n for (var j$1 = i + 1; j$1 < this.children.length; j$1++) {\n var next = this.children[j$1];\n if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n toOffset = domIndex(next.dom);\n break\n }\n to += next.size;\n }\n if (toOffset == -1) { toOffset = this.contentDOM.childNodes.length; }\n break\n }\n offset = end;\n }\n return {node: this.contentDOM, from: from, to: to, fromOffset: fromOffset, toOffset: toOffset}\n};\n\nViewDesc.prototype.emptyChildAt = function emptyChildAt (side) {\n if (this.border || !this.contentDOM || !this.children.length) { return false }\n var child = this.children[side < 0 ? 0 : this.children.length - 1];\n return child.size == 0 || child.emptyChildAt(side)\n};\n\n// : (number) → dom.Node\nViewDesc.prototype.domAfterPos = function domAfterPos (pos) {\n var ref = this.domFromPos(pos, 0);\n var node = ref.node;\n var offset = ref.offset;\n if (node.nodeType != 1 || offset == node.childNodes.length)\n { throw new RangeError(\"No node after pos \" + pos) }\n return node.childNodes[offset]\n};\n\n// : (number, number, dom.Document)\n// View descs are responsible for setting any selection that falls\n// entirely inside of them, so that custom implementations can do\n// custom things with the selection. Note that this falls apart when\n// a selection starts in such a node and ends in another, in which\n// case we just use whatever domFromPos produces as a best effort.\nViewDesc.prototype.setSelection = function setSelection (anchor, head, root, force) {\n // If the selection falls entirely in a child, give it to that child\n var from = Math.min(anchor, head), to = Math.max(anchor, head);\n for (var i = 0, offset = 0; i < this.children.length; i++) {\n var child = this.children[i], end = offset + child.size;\n if (from > offset && to < end)\n { return child.setSelection(anchor - offset - child.border, head - offset - child.border, root, force) }\n offset = end;\n }\n\n var anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n var headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n var domSel = root.getSelection();\n\n var brKludge = false;\n // On Firefox, using Selection.collapse to put the cursor after a\n // BR node for some reason doesn't always work (#1073). On Safari,\n // the cursor sometimes inexplicable visually lags behind its\n // reported position in such situations (#1092).\n if ((result.gecko || result.safari) && anchor == head) {\n var node = anchorDOM.node;\n var offset$1 = anchorDOM.offset;\n if (node.nodeType == 3) {\n brKludge = offset$1 && node.nodeValue[offset$1 - 1] == \"\\n\";\n // Issue #1128\n if (brKludge && offset$1 == node.nodeValue.length &&\n node.nextSibling && node.nextSibling.nodeName == \"BR\")\n { anchorDOM = headDOM = {node: node.parentNode, offset: domIndex(node) + 1}; }\n } else {\n var prev = node.childNodes[offset$1 - 1];\n brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n }\n }\n\n if (!(force || brKludge && result.safari) &&\n isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) &&\n isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset))\n { return }\n\n // Selection.extend can be used to create an 'inverted' selection\n // (one where the focus is before the anchor), but not all\n // browsers support it yet.\n var domSelExtended = false;\n if ((domSel.extend || anchor == head) && !brKludge) {\n domSel.collapse(anchorDOM.node, anchorDOM.offset);\n try {\n if (anchor != head) { domSel.extend(headDOM.node, headDOM.offset); }\n domSelExtended = true;\n } catch (err) {\n // In some cases with Chrome the selection is empty after calling\n // collapse, even when it should be valid. This appears to be a bug, but\n // it is difficult to isolate. If this happens fallback to the old path\n // without using extend.\n if (!(err instanceof DOMException)) { throw err }\n // declare global: DOMException\n }\n }\n if (!domSelExtended) {\n if (anchor > head) { var tmp = anchorDOM; anchorDOM = headDOM; headDOM = tmp; }\n var range = document.createRange();\n range.setEnd(headDOM.node, headDOM.offset);\n range.setStart(anchorDOM.node, anchorDOM.offset);\n domSel.removeAllRanges();\n domSel.addRange(range);\n }\n};\n\n// : (dom.MutationRecord) → bool\nViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return !this.contentDOM && mutation.type != \"selection\"\n};\n\nprototypeAccessors.contentLost.get = function () {\n return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM)\n};\n\n// Remove a subtree of the element tree that has been touched\n// by a DOM change, so that the next update will redraw it.\nViewDesc.prototype.markDirty = function markDirty (from, to) {\n for (var offset = 0, i = 0; i < this.children.length; i++) {\n var child = this.children[i], end = offset + child.size;\n if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n var startInside = offset + child.border, endInside = end - child.border;\n if (from >= startInside && to <= endInside) {\n this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n if (from == startInside && to == endInside &&\n (child.contentLost || child.dom.parentNode != this.contentDOM)) { child.dirty = NODE_DIRTY; }\n else { child.markDirty(from - startInside, to - startInside); }\n return\n } else {\n child.dirty = NODE_DIRTY;\n }\n }\n offset = end;\n }\n this.dirty = CONTENT_DIRTY;\n};\n\nViewDesc.prototype.markParentsDirty = function markParentsDirty () {\n var level = 1;\n for (var node = this.parent; node; node = node.parent, level++) {\n var dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n if (node.dirty < dirty) { node.dirty = dirty; }\n }\n};\n\nprototypeAccessors.domAtom.get = function () { return false };\n\nObject.defineProperties( ViewDesc.prototype, prototypeAccessors );\n\n// Reused array to avoid allocating fresh arrays for things that will\n// stay empty anyway.\nvar nothing = [];\n\n// A widget desc represents a widget decoration, which is a DOM node\n// drawn between the document nodes.\nvar WidgetViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function WidgetViewDesc(parent, widget, view, pos) {\n var self, dom = widget.type.toDOM;\n if (typeof dom == \"function\") { dom = dom(view, function () {\n if (!self) { return pos }\n if (self.parent) { return self.parent.posBeforeChild(self) }\n }); }\n if (!widget.type.spec.raw) {\n if (dom.nodeType != 1) {\n var wrap = document.createElement(\"span\");\n wrap.appendChild(dom);\n dom = wrap;\n }\n dom.contentEditable = false;\n dom.classList.add(\"ProseMirror-widget\");\n }\n ViewDesc.call(this, parent, nothing, dom, null);\n this.widget = widget;\n self = this;\n }\n\n if ( ViewDesc ) WidgetViewDesc.__proto__ = ViewDesc;\n WidgetViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n WidgetViewDesc.prototype.constructor = WidgetViewDesc;\n\n var prototypeAccessors$1 = { beforePosition: { configurable: true },domAtom: { configurable: true } };\n\n prototypeAccessors$1.beforePosition.get = function () {\n return this.widget.type.side < 0\n };\n\n WidgetViewDesc.prototype.matchesWidget = function matchesWidget (widget) {\n return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type)\n };\n\n WidgetViewDesc.prototype.parseRule = function parseRule () { return {ignore: true} };\n\n WidgetViewDesc.prototype.stopEvent = function stopEvent (event) {\n var stop = this.widget.spec.stopEvent;\n return stop ? stop(event) : false\n };\n\n WidgetViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return mutation.type != \"selection\" || this.widget.spec.ignoreSelection\n };\n\n prototypeAccessors$1.domAtom.get = function () { return true };\n\n Object.defineProperties( WidgetViewDesc.prototype, prototypeAccessors$1 );\n\n return WidgetViewDesc;\n}(ViewDesc));\n\nvar CompositionViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function CompositionViewDesc(parent, dom, textDOM, text) {\n ViewDesc.call(this, parent, nothing, dom, null);\n this.textDOM = textDOM;\n this.text = text;\n }\n\n if ( ViewDesc ) CompositionViewDesc.__proto__ = ViewDesc;\n CompositionViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n CompositionViewDesc.prototype.constructor = CompositionViewDesc;\n\n var prototypeAccessors$2 = { size: { configurable: true } };\n\n prototypeAccessors$2.size.get = function () { return this.text.length };\n\n CompositionViewDesc.prototype.localPosFromDOM = function localPosFromDOM (dom, offset) {\n if (dom != this.textDOM) { return this.posAtStart + (offset ? this.size : 0) }\n return this.posAtStart + offset\n };\n\n CompositionViewDesc.prototype.domFromPos = function domFromPos (pos) {\n return {node: this.textDOM, offset: pos}\n };\n\n CompositionViewDesc.prototype.ignoreMutation = function ignoreMutation (mut) {\n return mut.type === 'characterData' && mut.target.nodeValue == mut.oldValue\n };\n\n Object.defineProperties( CompositionViewDesc.prototype, prototypeAccessors$2 );\n\n return CompositionViewDesc;\n}(ViewDesc));\n\n// A mark desc represents a mark. May have multiple children,\n// depending on how the mark is split. Note that marks are drawn using\n// a fixed nesting order, for simplicity and predictability, so in\n// some cases they will be split more often than would appear\n// necessary.\nvar MarkViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function MarkViewDesc(parent, mark, dom, contentDOM) {\n ViewDesc.call(this, parent, [], dom, contentDOM);\n this.mark = mark;\n }\n\n if ( ViewDesc ) MarkViewDesc.__proto__ = ViewDesc;\n MarkViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n MarkViewDesc.prototype.constructor = MarkViewDesc;\n\n MarkViewDesc.create = function create (parent, mark, inline, view) {\n var custom = view.nodeViews[mark.type.name];\n var spec = custom && custom(mark, view, inline);\n if (!spec || !spec.dom)\n { spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline)); }\n return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom)\n };\n\n MarkViewDesc.prototype.parseRule = function parseRule () { return {mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM} };\n\n MarkViewDesc.prototype.matchesMark = function matchesMark (mark) { return this.dirty != NODE_DIRTY && this.mark.eq(mark) };\n\n MarkViewDesc.prototype.markDirty = function markDirty (from, to) {\n ViewDesc.prototype.markDirty.call(this, from, to);\n // Move dirty info to nearest node view\n if (this.dirty != NOT_DIRTY) {\n var parent = this.parent;\n while (!parent.node) { parent = parent.parent; }\n if (parent.dirty < this.dirty) { parent.dirty = this.dirty; }\n this.dirty = NOT_DIRTY;\n }\n };\n\n MarkViewDesc.prototype.slice = function slice (from, to, view) {\n var copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n var nodes = this.children, size = this.size;\n if (to < size) { nodes = replaceNodes(nodes, to, size, view); }\n if (from > 0) { nodes = replaceNodes(nodes, 0, from, view); }\n for (var i = 0; i < nodes.length; i++) { nodes[i].parent = copy; }\n copy.children = nodes;\n return copy\n };\n\n return MarkViewDesc;\n}(ViewDesc));\n\n// Node view descs are the main, most common type of view desc, and\n// correspond to an actual node in the document. Unlike mark descs,\n// they populate their child array themselves.\nvar NodeViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) {\n ViewDesc.call(this, parent, node.isLeaf ? nothing : [], dom, contentDOM);\n this.nodeDOM = nodeDOM;\n this.node = node;\n this.outerDeco = outerDeco;\n this.innerDeco = innerDeco;\n if (contentDOM) { this.updateChildren(view, pos); }\n }\n\n if ( ViewDesc ) NodeViewDesc.__proto__ = ViewDesc;\n NodeViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n NodeViewDesc.prototype.constructor = NodeViewDesc;\n\n var prototypeAccessors$3 = { size: { configurable: true },border: { configurable: true },domAtom: { configurable: true } };\n\n // By default, a node is rendered using the `toDOM` method from the\n // node type spec. But client code can use the `nodeViews` spec to\n // supply a custom node view, which can influence various aspects of\n // the way the node works.\n //\n // (Using subclassing for this was intentionally decided against,\n // since it'd require exposing a whole slew of finnicky\n // implementation details to the user code that they probably will\n // never need.)\n NodeViewDesc.create = function create (parent, node, outerDeco, innerDeco, view, pos) {\n var assign;\n\n var custom = view.nodeViews[node.type.name], descObj;\n var spec = custom && custom(node, view, function () {\n // (This is a function that allows the custom view to find its\n // own position)\n if (!descObj) { return pos }\n if (descObj.parent) { return descObj.parent.posBeforeChild(descObj) }\n }, outerDeco);\n\n var dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n if (node.isText) {\n if (!dom) { dom = document.createTextNode(node.text); }\n else if (dom.nodeType != 3) { throw new RangeError(\"Text must be rendered as a DOM text node\") }\n } else if (!dom) {\n((assign = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node)), dom = assign.dom, contentDOM = assign.contentDOM));\n }\n if (!contentDOM && !node.isText && dom.nodeName != \"BR\") { // Chrome gets confused by
                  \n if (!dom.hasAttribute(\"contenteditable\")) { dom.contentEditable = false; }\n if (node.type.spec.draggable) { dom.draggable = true; }\n }\n\n var nodeDOM = dom;\n dom = applyOuterDeco(dom, outerDeco, node);\n\n if (spec)\n { return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM,\n spec, view, pos + 1) }\n else if (node.isText)\n { return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) }\n else\n { return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos + 1) }\n };\n\n NodeViewDesc.prototype.parseRule = function parseRule () {\n var this$1 = this;\n\n // Experimental kludge to allow opt-in re-parsing of nodes\n if (this.node.type.spec.reparseInView) { return null }\n // FIXME the assumption that this can always return the current\n // attrs means that if the user somehow manages to change the\n // attrs in the dom, that won't be picked up. Not entirely sure\n // whether this is a problem\n var rule = {node: this.node.type.name, attrs: this.node.attrs};\n if (this.node.type.spec.code) { rule.preserveWhitespace = \"full\"; }\n if (this.contentDOM && !this.contentLost) { rule.contentElement = this.contentDOM; }\n else { rule.getContent = function () { return this$1.contentDOM ? Fragment.empty : this$1.node.content; }; }\n return rule\n };\n\n NodeViewDesc.prototype.matchesNode = function matchesNode (node, outerDeco, innerDeco) {\n return this.dirty == NOT_DIRTY && node.eq(this.node) &&\n sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco)\n };\n\n prototypeAccessors$3.size.get = function () { return this.node.nodeSize };\n\n prototypeAccessors$3.border.get = function () { return this.node.isLeaf ? 0 : 1 };\n\n // Syncs `this.children` to match `this.node.content` and the local\n // decorations, possibly introducing nesting for marks. Then, in a\n // separate step, syncs the DOM inside `this.contentDOM` to\n // `this.children`.\n NodeViewDesc.prototype.updateChildren = function updateChildren (view, pos) {\n var this$1 = this;\n\n var inline = this.node.inlineContent, off = pos;\n var composition = inline && view.composing && this.localCompositionNode(view, pos);\n var updater = new ViewTreeUpdater(this, composition && composition.node);\n iterDeco(this.node, this.innerDeco, function (widget, i, insideNode) {\n if (widget.spec.marks)\n { updater.syncToMarks(widget.spec.marks, inline, view); }\n else if (widget.type.side >= 0 && !insideNode)\n { updater.syncToMarks(i == this$1.node.childCount ? Mark.none : this$1.node.child(i).marks, inline, view); }\n // If the next node is a desc matching this widget, reuse it,\n // otherwise insert the widget as a new view desc.\n updater.placeWidget(widget, view, off);\n }, function (child, outerDeco, innerDeco, i) {\n // Make sure the wrapping mark descs match the node's marks.\n updater.syncToMarks(child.marks, inline, view);\n // Either find an existing desc that exactly matches this node,\n // and drop the descs before it.\n updater.findNodeMatch(child, outerDeco, innerDeco, i) ||\n // Or try updating the next desc to reflect this node.\n updater.updateNextNode(child, outerDeco, innerDeco, view, i) ||\n // Or just add it as a new desc.\n updater.addNode(child, outerDeco, innerDeco, view, off);\n off += child.nodeSize;\n });\n // Drop all remaining descs after the current position.\n updater.syncToMarks(nothing, inline, view);\n if (this.node.isTextblock) { updater.addTextblockHacks(); }\n updater.destroyRest();\n\n // Sync the DOM if anything changed\n if (updater.changed || this.dirty == CONTENT_DIRTY) {\n // May have to protect focused DOM from being changed if a composition is active\n if (composition) { this.protectLocalComposition(view, composition); }\n renderDescs(this.contentDOM, this.children, view);\n if (result.ios) { iosHacks(this.dom); }\n }\n };\n\n NodeViewDesc.prototype.localCompositionNode = function localCompositionNode (view, pos) {\n // Only do something if both the selection and a focused text node\n // are inside of this node, and the node isn't already part of a\n // view that's a child of this view\n var ref = view.state.selection;\n var from = ref.from;\n var to = ref.to;\n if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size) { return }\n var sel = view.root.getSelection();\n var textNode = nearbyTextNode(sel.focusNode, sel.focusOffset);\n if (!textNode || !this.dom.contains(textNode.parentNode)) { return }\n\n // Find the text in the focused node in the node, stop if it's not\n // there (may have been modified through other means, in which\n // case it should overwritten)\n var text = textNode.nodeValue;\n var textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n\n return textPos < 0 ? null : {node: textNode, pos: textPos, text: text}\n };\n\n NodeViewDesc.prototype.protectLocalComposition = function protectLocalComposition (view, ref) {\n var node = ref.node;\n var pos = ref.pos;\n var text = ref.text;\n\n // The node is already part of a local view desc, leave it there\n if (this.getDesc(node)) { return }\n\n // Create a composition view for the orphaned nodes\n var topNode = node;\n for (;; topNode = topNode.parentNode) {\n if (topNode.parentNode == this.contentDOM) { break }\n while (topNode.previousSibling) { topNode.parentNode.removeChild(topNode.previousSibling); }\n while (topNode.nextSibling) { topNode.parentNode.removeChild(topNode.nextSibling); }\n if (topNode.pmViewDesc) { topNode.pmViewDesc = null; }\n }\n var desc = new CompositionViewDesc(this, topNode, node, text);\n view.compositionNodes.push(desc);\n\n // Patch up this.children to contain the composition view\n this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n };\n\n // : (Node, [Decoration], DecorationSet, EditorView) → bool\n // If this desc be updated to match the given node decoration,\n // do so and return true.\n NodeViewDesc.prototype.update = function update (node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY ||\n !node.sameMarkup(this.node)) { return false }\n this.updateInner(node, outerDeco, innerDeco, view);\n return true\n };\n\n NodeViewDesc.prototype.updateInner = function updateInner (node, outerDeco, innerDeco, view) {\n this.updateOuterDeco(outerDeco);\n this.node = node;\n this.innerDeco = innerDeco;\n if (this.contentDOM) { this.updateChildren(view, this.posAtStart); }\n this.dirty = NOT_DIRTY;\n };\n\n NodeViewDesc.prototype.updateOuterDeco = function updateOuterDeco (outerDeco) {\n if (sameOuterDeco(outerDeco, this.outerDeco)) { return }\n var needsWrap = this.nodeDOM.nodeType != 1;\n var oldDOM = this.dom;\n this.dom = patchOuterDeco(this.dom, this.nodeDOM,\n computeOuterDeco(this.outerDeco, this.node, needsWrap),\n computeOuterDeco(outerDeco, this.node, needsWrap));\n if (this.dom != oldDOM) {\n oldDOM.pmViewDesc = null;\n this.dom.pmViewDesc = this;\n }\n this.outerDeco = outerDeco;\n };\n\n // Mark this node as being the selected node.\n NodeViewDesc.prototype.selectNode = function selectNode () {\n this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable) { this.dom.draggable = true; }\n };\n\n // Remove selected node marking from this node.\n NodeViewDesc.prototype.deselectNode = function deselectNode () {\n this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable) { this.dom.removeAttribute(\"draggable\"); }\n };\n\n prototypeAccessors$3.domAtom.get = function () { return this.node.isAtom };\n\n Object.defineProperties( NodeViewDesc.prototype, prototypeAccessors$3 );\n\n return NodeViewDesc;\n}(ViewDesc));\n\n// Create a view desc for the top-level document node, to be exported\n// and used by the view class.\nfunction docViewDesc(doc, outerDeco, innerDeco, dom, view) {\n applyOuterDeco(dom, outerDeco, doc);\n return new NodeViewDesc(null, doc, outerDeco, innerDeco, dom, dom, dom, view, 0)\n}\n\nvar TextViewDesc = /*@__PURE__*/(function (NodeViewDesc) {\n function TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) {\n NodeViewDesc.call(this, parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view);\n }\n\n if ( NodeViewDesc ) TextViewDesc.__proto__ = NodeViewDesc;\n TextViewDesc.prototype = Object.create( NodeViewDesc && NodeViewDesc.prototype );\n TextViewDesc.prototype.constructor = TextViewDesc;\n\n var prototypeAccessors$4 = { domAtom: { configurable: true } };\n\n TextViewDesc.prototype.parseRule = function parseRule () {\n var skip = this.nodeDOM.parentNode;\n while (skip && skip != this.dom && !skip.pmIsDeco) { skip = skip.parentNode; }\n return {skip: skip || true}\n };\n\n TextViewDesc.prototype.update = function update (node, outerDeco, _, view) {\n if (this.dirty == NODE_DIRTY || (this.dirty != NOT_DIRTY && !this.inParent()) ||\n !node.sameMarkup(this.node)) { return false }\n this.updateOuterDeco(outerDeco);\n if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n this.nodeDOM.nodeValue = node.text;\n if (view.trackWrites == this.nodeDOM) { view.trackWrites = null; }\n }\n this.node = node;\n this.dirty = NOT_DIRTY;\n return true\n };\n\n TextViewDesc.prototype.inParent = function inParent () {\n var parentDOM = this.parent.contentDOM;\n for (var n = this.nodeDOM; n; n = n.parentNode) { if (n == parentDOM) { return true } }\n return false\n };\n\n TextViewDesc.prototype.domFromPos = function domFromPos (pos) {\n return {node: this.nodeDOM, offset: pos}\n };\n\n TextViewDesc.prototype.localPosFromDOM = function localPosFromDOM (dom, offset, bias) {\n if (dom == this.nodeDOM) { return this.posAtStart + Math.min(offset, this.node.text.length) }\n return NodeViewDesc.prototype.localPosFromDOM.call(this, dom, offset, bias)\n };\n\n TextViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return mutation.type != \"characterData\" && mutation.type != \"selection\"\n };\n\n TextViewDesc.prototype.slice = function slice (from, to, view) {\n var node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view)\n };\n\n prototypeAccessors$4.domAtom.get = function () { return false };\n\n Object.defineProperties( TextViewDesc.prototype, prototypeAccessors$4 );\n\n return TextViewDesc;\n}(NodeViewDesc));\n\n// A dummy desc used to tag trailing BR or span nodes created to work\n// around contentEditable terribleness.\nvar BRHackViewDesc = /*@__PURE__*/(function (ViewDesc) {\n function BRHackViewDesc () {\n ViewDesc.apply(this, arguments);\n }\n\n if ( ViewDesc ) BRHackViewDesc.__proto__ = ViewDesc;\n BRHackViewDesc.prototype = Object.create( ViewDesc && ViewDesc.prototype );\n BRHackViewDesc.prototype.constructor = BRHackViewDesc;\n\n var prototypeAccessors$5 = { domAtom: { configurable: true } };\n\n BRHackViewDesc.prototype.parseRule = function parseRule () { return {ignore: true} };\n BRHackViewDesc.prototype.matchesHack = function matchesHack () { return this.dirty == NOT_DIRTY };\n prototypeAccessors$5.domAtom.get = function () { return true };\n\n Object.defineProperties( BRHackViewDesc.prototype, prototypeAccessors$5 );\n\n return BRHackViewDesc;\n}(ViewDesc));\n\n// A separate subclass is used for customized node views, so that the\n// extra checks only have to be made for nodes that are actually\n// customized.\nvar CustomNodeViewDesc = /*@__PURE__*/(function (NodeViewDesc) {\n function CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) {\n NodeViewDesc.call(this, parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos);\n this.spec = spec;\n }\n\n if ( NodeViewDesc ) CustomNodeViewDesc.__proto__ = NodeViewDesc;\n CustomNodeViewDesc.prototype = Object.create( NodeViewDesc && NodeViewDesc.prototype );\n CustomNodeViewDesc.prototype.constructor = CustomNodeViewDesc;\n\n // A custom `update` method gets to decide whether the update goes\n // through. If it does, and there's a `contentDOM` node, our logic\n // updates the children.\n CustomNodeViewDesc.prototype.update = function update (node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY) { return false }\n if (this.spec.update) {\n var result = this.spec.update(node, outerDeco);\n if (result) { this.updateInner(node, outerDeco, innerDeco, view); }\n return result\n } else if (!this.contentDOM && !node.isLeaf) {\n return false\n } else {\n return NodeViewDesc.prototype.update.call(this, node, outerDeco, innerDeco, view)\n }\n };\n\n CustomNodeViewDesc.prototype.selectNode = function selectNode () {\n this.spec.selectNode ? this.spec.selectNode() : NodeViewDesc.prototype.selectNode.call(this);\n };\n\n CustomNodeViewDesc.prototype.deselectNode = function deselectNode () {\n this.spec.deselectNode ? this.spec.deselectNode() : NodeViewDesc.prototype.deselectNode.call(this);\n };\n\n CustomNodeViewDesc.prototype.setSelection = function setSelection (anchor, head, root, force) {\n this.spec.setSelection ? this.spec.setSelection(anchor, head, root)\n : NodeViewDesc.prototype.setSelection.call(this, anchor, head, root, force);\n };\n\n CustomNodeViewDesc.prototype.destroy = function destroy () {\n if (this.spec.destroy) { this.spec.destroy(); }\n NodeViewDesc.prototype.destroy.call(this);\n };\n\n CustomNodeViewDesc.prototype.stopEvent = function stopEvent (event) {\n return this.spec.stopEvent ? this.spec.stopEvent(event) : false\n };\n\n CustomNodeViewDesc.prototype.ignoreMutation = function ignoreMutation (mutation) {\n return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : NodeViewDesc.prototype.ignoreMutation.call(this, mutation)\n };\n\n return CustomNodeViewDesc;\n}(NodeViewDesc));\n\n// : (dom.Node, [ViewDesc])\n// Sync the content of the given DOM node with the nodes associated\n// with the given array of view descs, recursing into mark descs\n// because this should sync the subtree for a whole node at a time.\nfunction renderDescs(parentDOM, descs, view) {\n var dom = parentDOM.firstChild, written = false;\n for (var i = 0; i < descs.length; i++) {\n var desc = descs[i], childDOM = desc.dom;\n if (childDOM.parentNode == parentDOM) {\n while (childDOM != dom) { dom = rm(dom); written = true; }\n dom = dom.nextSibling;\n } else {\n written = true;\n parentDOM.insertBefore(childDOM, dom);\n }\n if (desc instanceof MarkViewDesc) {\n var pos = dom ? dom.previousSibling : parentDOM.lastChild;\n renderDescs(desc.contentDOM, desc.children, view);\n dom = pos ? pos.nextSibling : parentDOM.firstChild;\n }\n }\n while (dom) { dom = rm(dom); written = true; }\n if (written && view.trackWrites == parentDOM) { view.trackWrites = null; }\n}\n\nfunction OuterDecoLevel(nodeName) {\n if (nodeName) { this.nodeName = nodeName; }\n}\nOuterDecoLevel.prototype = Object.create(null);\n\nvar noDeco = [new OuterDecoLevel];\n\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n if (outerDeco.length == 0) { return noDeco }\n\n var top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top];\n\n for (var i = 0; i < outerDeco.length; i++) {\n var attrs = outerDeco[i].type.attrs;\n if (!attrs) { continue }\n if (attrs.nodeName)\n { result.push(top = new OuterDecoLevel(attrs.nodeName)); }\n\n for (var name in attrs) {\n var val = attrs[name];\n if (val == null) { continue }\n if (needsWrap && result.length == 1)\n { result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\")); }\n if (name == \"class\") { top.class = (top.class ? top.class + \" \" : \"\") + val; }\n else if (name == \"style\") { top.style = (top.style ? top.style + \";\" : \"\") + val; }\n else if (name != \"nodeName\") { top[name] = val; }\n }\n }\n\n return result\n}\n\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n // Shortcut for trivial case\n if (prevComputed == noDeco && curComputed == noDeco) { return nodeDOM }\n\n var curDOM = nodeDOM;\n for (var i = 0; i < curComputed.length; i++) {\n var deco = curComputed[i], prev = prevComputed[i];\n if (i) {\n var parent = (void 0);\n if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM &&\n (parent = curDOM.parentNode) && parent.tagName.toLowerCase() == deco.nodeName) {\n curDOM = parent;\n } else {\n parent = document.createElement(deco.nodeName);\n parent.pmIsDeco = true;\n parent.appendChild(curDOM);\n prev = noDeco[0];\n curDOM = parent;\n }\n }\n patchAttributes(curDOM, prev || noDeco[0], deco);\n }\n return curDOM\n}\n\nfunction patchAttributes(dom, prev, cur) {\n for (var name in prev)\n { if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n { dom.removeAttribute(name); } }\n for (var name$1 in cur)\n { if (name$1 != \"class\" && name$1 != \"style\" && name$1 != \"nodeName\" && cur[name$1] != prev[name$1])\n { dom.setAttribute(name$1, cur[name$1]); } }\n if (prev.class != cur.class) {\n var prevList = prev.class ? prev.class.split(\" \") : nothing;\n var curList = cur.class ? cur.class.split(\" \") : nothing;\n for (var i = 0; i < prevList.length; i++) { if (curList.indexOf(prevList[i]) == -1)\n { dom.classList.remove(prevList[i]); } }\n for (var i$1 = 0; i$1 < curList.length; i$1++) { if (prevList.indexOf(curList[i$1]) == -1)\n { dom.classList.add(curList[i$1]); } }\n }\n if (prev.style != cur.style) {\n if (prev.style) {\n var prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n while (m = prop.exec(prev.style))\n { dom.style.removeProperty(m[1]); }\n }\n if (cur.style)\n { dom.style.cssText += cur.style; }\n }\n}\n\nfunction applyOuterDeco(dom, deco, node) {\n return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1))\n}\n\n// : ([Decoration], [Decoration]) → bool\nfunction sameOuterDeco(a, b) {\n if (a.length != b.length) { return false }\n for (var i = 0; i < a.length; i++) { if (!a[i].type.eq(b[i].type)) { return false } }\n return true\n}\n\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n var next = dom.nextSibling;\n dom.parentNode.removeChild(dom);\n return next\n}\n\n// Helper class for incrementally updating a tree of mark descs and\n// the widget and node descs inside of them.\nvar ViewTreeUpdater = function ViewTreeUpdater(top, lockedNode) {\n this.top = top;\n this.lock = lockedNode;\n // Index into `this.top`'s child array, represents the current\n // update position.\n this.index = 0;\n // When entering a mark, the current top and index are pushed\n // onto this.\n this.stack = [];\n // Tracks whether anything was changed\n this.changed = false;\n\n var pre = preMatch(top.node.content, top.children);\n this.preMatched = pre.nodes;\n this.preMatchOffset = pre.offset;\n};\n\nViewTreeUpdater.prototype.getPreMatch = function getPreMatch (index) {\n return index >= this.preMatchOffset ? this.preMatched[index - this.preMatchOffset] : null\n};\n\n// Destroy and remove the children between the given indices in\n// `this.top`.\nViewTreeUpdater.prototype.destroyBetween = function destroyBetween (start, end) {\n if (start == end) { return }\n for (var i = start; i < end; i++) { this.top.children[i].destroy(); }\n this.top.children.splice(start, end - start);\n this.changed = true;\n};\n\n// Destroy all remaining children in `this.top`.\nViewTreeUpdater.prototype.destroyRest = function destroyRest () {\n this.destroyBetween(this.index, this.top.children.length);\n};\n\n// : ([Mark], EditorView)\n// Sync the current stack of mark descs with the given array of\n// marks, reusing existing mark descs when possible.\nViewTreeUpdater.prototype.syncToMarks = function syncToMarks (marks, inline, view) {\n var keep = 0, depth = this.stack.length >> 1;\n var maxKeep = Math.min(depth, marks.length);\n while (keep < maxKeep &&\n (keep == depth - 1 ? this.top : this.stack[(keep + 1) << 1]).matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n { keep++; }\n\n while (keep < depth) {\n this.destroyRest();\n this.top.dirty = NOT_DIRTY;\n this.index = this.stack.pop();\n this.top = this.stack.pop();\n depth--;\n }\n while (depth < marks.length) {\n this.stack.push(this.top, this.index + 1);\n var found = -1;\n for (var i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) {\n if (this.top.children[i].matchesMark(marks[depth])) { found = i; break }\n }\n if (found > -1) {\n if (found > this.index) {\n this.changed = true;\n this.destroyBetween(this.index, found);\n }\n this.top = this.top.children[this.index];\n } else {\n var markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n this.top.children.splice(this.index, 0, markDesc);\n this.top = markDesc;\n this.changed = true;\n }\n this.index = 0;\n depth++;\n }\n};\n\n// : (Node, [Decoration], DecorationSet) → bool\n// Try to find a node desc matching the given data. Skip over it and\n// return true when successful.\nViewTreeUpdater.prototype.findNodeMatch = function findNodeMatch (node, outerDeco, innerDeco, index) {\n var found = -1, preMatch = index < 0 ? undefined : this.getPreMatch(index), children = this.top.children;\n if (preMatch && preMatch.matchesNode(node, outerDeco, innerDeco)) {\n found = children.indexOf(preMatch);\n } else {\n for (var i = this.index, e = Math.min(children.length, i + 5); i < e; i++) {\n var child = children[i];\n if (child.matchesNode(node, outerDeco, innerDeco) && this.preMatched.indexOf(child) < 0) {\n found = i;\n break\n }\n }\n }\n if (found < 0) { return false }\n this.destroyBetween(this.index, found);\n this.index++;\n return true\n};\n\n// : (Node, [Decoration], DecorationSet, EditorView, Fragment, number) → bool\n// Try to update the next node, if any, to the given data. Checks\n// pre-matches to avoid overwriting nodes that could still be used.\nViewTreeUpdater.prototype.updateNextNode = function updateNextNode (node, outerDeco, innerDeco, view, index) {\n for (var i = this.index; i < this.top.children.length; i++) {\n var next = this.top.children[i];\n if (next instanceof NodeViewDesc) {\n var preMatch = this.preMatched.indexOf(next);\n if (preMatch > -1 && preMatch + this.preMatchOffset != index) { return false }\n var nextDOM = next.dom;\n\n // Can't update if nextDOM is or contains this.lock, except if\n // it's a text node whose content already matches the new text\n // and whose decorations match the new ones.\n var locked = this.lock && (nextDOM == this.lock || nextDOM.nodeType == 1 && nextDOM.contains(this.lock.parentNode)) &&\n !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text &&\n next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n this.destroyBetween(this.index, i);\n if (next.dom != nextDOM) { this.changed = true; }\n this.index++;\n return true\n }\n break\n }\n }\n return false\n};\n\n// : (Node, [Decoration], DecorationSet, EditorView)\n// Insert the node as a newly created node desc.\nViewTreeUpdater.prototype.addNode = function addNode (node, outerDeco, innerDeco, view, pos) {\n this.top.children.splice(this.index++, 0, NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos));\n this.changed = true;\n};\n\nViewTreeUpdater.prototype.placeWidget = function placeWidget (widget, view, pos) {\n var next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n if (next && next.matchesWidget(widget) && (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n this.index++;\n } else {\n var desc = new WidgetViewDesc(this.top, widget, view, pos);\n this.top.children.splice(this.index++, 0, desc);\n this.changed = true;\n }\n};\n\n// Make sure a textblock looks and behaves correctly in\n// contentEditable.\nViewTreeUpdater.prototype.addTextblockHacks = function addTextblockHacks () {\n var lastChild = this.top.children[this.index - 1];\n while (lastChild instanceof MarkViewDesc) { lastChild = lastChild.children[lastChild.children.length - 1]; }\n\n if (!lastChild || // Empty textblock\n !(lastChild instanceof TextViewDesc) ||\n /\\n$/.test(lastChild.node.text)) {\n if (this.index < this.top.children.length && this.top.children[this.index].matchesHack()) {\n this.index++;\n } else {\n var dom = document.createElement(\"br\");\n this.top.children.splice(this.index++, 0, new BRHackViewDesc(this.top, nothing, dom, null));\n this.changed = true;\n }\n }\n};\n\n// : (Fragment, [ViewDesc]) → [ViewDesc]\n// Iterate from the end of the fragment and array of descs to find\n// directly matching ones, in order to avoid overeagerly reusing\n// those for other nodes. Returns an array whose positions correspond\n// to node positions in the fragment, and whose elements are either\n// descs matched to the child at that index, or empty.\nfunction preMatch(frag, descs) {\n var result = [], end = frag.childCount;\n for (var i = descs.length - 1; end > 0 && i >= 0; i--) {\n var desc = descs[i], node = desc.node;\n if (!node) { continue }\n if (node != frag.child(end - 1)) { break }\n result.push(desc);\n --end;\n }\n return {nodes: result.reverse(), offset: end}\n}\n\nfunction compareSide(a, b) { return a.type.side - b.type.side }\n\n// : (ViewDesc, DecorationSet, (Decoration, number), (Node, [Decoration], DecorationSet, number))\n// This function abstracts iterating over the nodes and decorations in\n// a fragment. Calls `onNode` for each node, with its local and child\n// decorations. Splits text nodes when there is a decoration starting\n// or ending inside of them. Calls `onWidget` for each widget.\nfunction iterDeco(parent, deco, onWidget, onNode) {\n var locals = deco.locals(parent), offset = 0;\n // Simple, cheap variant for when there are no local decorations\n if (locals.length == 0) {\n for (var i = 0; i < parent.childCount; i++) {\n var child = parent.child(i);\n onNode(child, locals, deco.forChild(offset, child), i);\n offset += child.nodeSize;\n }\n return\n }\n\n var decoIndex = 0, active = [], restNode = null;\n for (var parentIndex = 0;;) {\n if (decoIndex < locals.length && locals[decoIndex].to == offset) {\n var widget = locals[decoIndex++], widgets = (void 0);\n while (decoIndex < locals.length && locals[decoIndex].to == offset)\n { (widgets || (widgets = [widget])).push(locals[decoIndex++]); }\n if (widgets) {\n widgets.sort(compareSide);\n for (var i$1 = 0; i$1 < widgets.length; i$1++) { onWidget(widgets[i$1], parentIndex, !!restNode); }\n } else {\n onWidget(widget, parentIndex, !!restNode);\n }\n }\n\n var child$1 = (void 0), index = (void 0);\n if (restNode) {\n index = -1;\n child$1 = restNode;\n restNode = null;\n } else if (parentIndex < parent.childCount) {\n index = parentIndex;\n child$1 = parent.child(parentIndex++);\n } else {\n break\n }\n\n for (var i$2 = 0; i$2 < active.length; i$2++) { if (active[i$2].to <= offset) { active.splice(i$2--, 1); } }\n while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n { active.push(locals[decoIndex++]); }\n\n var end = offset + child$1.nodeSize;\n if (child$1.isText) {\n var cutAt = end;\n if (decoIndex < locals.length && locals[decoIndex].from < cutAt) { cutAt = locals[decoIndex].from; }\n for (var i$3 = 0; i$3 < active.length; i$3++) { if (active[i$3].to < cutAt) { cutAt = active[i$3].to; } }\n if (cutAt < end) {\n restNode = child$1.cut(cutAt - offset);\n child$1 = child$1.cut(0, cutAt - offset);\n end = cutAt;\n index = -1;\n }\n }\n\n var outerDeco = !active.length ? nothing\n : child$1.isInline && !child$1.isLeaf ? active.filter(function (d) { return !d.inline; })\n : active.slice();\n onNode(child$1, outerDeco, deco.forChild(offset, child$1), index);\n offset = end;\n }\n}\n\n// List markers in Mobile Safari will mysteriously disappear\n// sometimes. This works around that.\nfunction iosHacks(dom) {\n if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n var oldCSS = dom.style.cssText;\n dom.style.cssText = oldCSS + \"; list-style: square !important\";\n window.getComputedStyle(dom).listStyle;\n dom.style.cssText = oldCSS;\n }\n}\n\nfunction nearbyTextNode(node, offset) {\n for (;;) {\n if (node.nodeType == 3) { return node }\n if (node.nodeType == 1 && offset > 0) {\n if (node.childNodes.length > offset && node.childNodes[offset].nodeType == 3)\n { return node.childNodes[offset] }\n node = node.childNodes[offset - 1];\n offset = nodeSize(node);\n } else if (node.nodeType == 1 && offset < node.childNodes.length) {\n node = node.childNodes[offset];\n offset = 0;\n } else {\n return null\n }\n }\n}\n\n// Find a piece of text in an inline fragment, overlapping from-to\nfunction findTextInFragment(frag, text, from, to) {\n for (var i = 0, pos = 0; i < frag.childCount && pos <= to;) {\n var child = frag.child(i++), childStart = pos;\n pos += child.nodeSize;\n if (!child.isText) { continue }\n var str = child.text;\n while (i < frag.childCount) {\n var next = frag.child(i++);\n pos += next.nodeSize;\n if (!next.isText) { break }\n str += next.text;\n }\n if (pos >= from) {\n var found = str.lastIndexOf(text, to - childStart);\n if (found >= 0 && found + text.length + childStart >= from)\n { return childStart + found }\n }\n }\n return -1\n}\n\n// Replace range from-to in an array of view descs with replacement\n// (may be null to just delete). This goes very much against the grain\n// of the rest of this code, which tends to create nodes with the\n// right shape in one go, rather than messing with them after\n// creation, but is necessary in the composition hack.\nfunction replaceNodes(nodes, from, to, view, replacement) {\n var result = [];\n for (var i = 0, off = 0; i < nodes.length; i++) {\n var child = nodes[i], start = off, end = off += child.size;\n if (start >= to || end <= from) {\n result.push(child);\n } else {\n if (start < from) { result.push(child.slice(0, from - start, view)); }\n if (replacement) {\n result.push(replacement);\n replacement = null;\n }\n if (end > to) { result.push(child.slice(to - start, child.size, view)); }\n }\n }\n return result\n}\n\nfunction selectionFromDOM(view, origin) {\n var domSel = view.root.getSelection(), doc = view.state.doc;\n if (!domSel.focusNode) { return null }\n var nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n var head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset);\n if (head < 0) { return null }\n var $head = doc.resolve(head), $anchor, selection;\n if (selectionCollapsed(domSel)) {\n $anchor = $head;\n while (nearestDesc && !nearestDesc.node) { nearestDesc = nearestDesc.parent; }\n if (nearestDesc && nearestDesc.node.isAtom && NodeSelection.isSelectable(nearestDesc.node) && nearestDesc.parent\n && !(nearestDesc.node.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n var pos = nearestDesc.posBefore;\n selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));\n }\n } else {\n var anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset);\n if (anchor < 0) { return null }\n $anchor = doc.resolve(anchor);\n }\n\n if (!selection) {\n var bias = origin == \"pointer\" || (view.state.selection.head < $head.pos && !inWidget) ? 1 : -1;\n selection = selectionBetween(view, $anchor, $head, bias);\n }\n return selection\n}\n\nfunction selectionToDOM(view, force) {\n var sel = view.state.selection;\n syncNodeSelection(view, sel);\n\n if (view.editable ? !view.hasFocus() :\n !(hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom))) { return }\n\n view.domObserver.disconnectSelection();\n\n if (view.cursorWrapper) {\n selectCursorWrapper(view);\n } else {\n var anchor = sel.anchor;\n var head = sel.head;\n var resetEditableFrom, resetEditableTo;\n if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n if (!sel.$from.parent.inlineContent)\n { resetEditableFrom = temporarilyEditableNear(view, sel.from); }\n if (!sel.empty && !sel.$from.parent.inlineContent)\n { resetEditableTo = temporarilyEditableNear(view, sel.to); }\n }\n view.docView.setSelection(anchor, head, view.root, force);\n if (brokenSelectBetweenUneditable) {\n if (resetEditableFrom) { resetEditable(resetEditableFrom); }\n if (resetEditableTo) { resetEditable(resetEditableTo); }\n }\n if (sel.visible) {\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n } else {\n view.dom.classList.add(\"ProseMirror-hideselection\");\n if (\"onselectionchange\" in document) { removeClassOnSelectionChange(view); }\n }\n }\n\n view.domObserver.setCurSelection();\n view.domObserver.connectSelection();\n}\n\n// Kludge to work around Webkit not allowing a selection to start/end\n// between non-editable block nodes. We briefly make something\n// editable, set the selection, then set it uneditable again.\n\nvar brokenSelectBetweenUneditable = result.safari || result.chrome && result.chrome_version < 63;\n\nfunction temporarilyEditableNear(view, pos) {\n var ref = view.docView.domFromPos(pos, 0);\n var node = ref.node;\n var offset = ref.offset;\n var after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n var before = offset ? node.childNodes[offset - 1] : null;\n if (result.safari && after && after.contentEditable == \"false\") { return setEditable(after) }\n if ((!after || after.contentEditable == \"false\") && (!before || before.contentEditable == \"false\")) {\n if (after) { return setEditable(after) }\n else if (before) { return setEditable(before) }\n }\n}\n\nfunction setEditable(element) {\n element.contentEditable = \"true\";\n if (result.safari && element.draggable) { element.draggable = false; element.wasDraggable = true; }\n return element\n}\n\nfunction resetEditable(element) {\n element.contentEditable = \"false\";\n if (element.wasDraggable) { element.draggable = true; element.wasDraggable = null; }\n}\n\nfunction removeClassOnSelectionChange(view) {\n var doc = view.dom.ownerDocument;\n doc.removeEventListener(\"selectionchange\", view.hideSelectionGuard);\n var domSel = view.root.getSelection();\n var node = domSel.anchorNode, offset = domSel.anchorOffset;\n doc.addEventListener(\"selectionchange\", view.hideSelectionGuard = function () {\n if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n doc.removeEventListener(\"selectionchange\", view.hideSelectionGuard);\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n }\n });\n}\n\nfunction selectCursorWrapper(view) {\n var domSel = view.root.getSelection(), range = document.createRange();\n var node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n if (img) { range.setEnd(node.parentNode, domIndex(node) + 1); }\n else { range.setEnd(node, 0); }\n range.collapse(false);\n domSel.removeAllRanges();\n domSel.addRange(range);\n // Kludge to kill 'control selection' in IE11 when selecting an\n // invisible cursor wrapper, since that would result in those weird\n // resize handles and a selection that considers the absolutely\n // positioned wrapper, rather than the root editable node, the\n // focused element.\n if (!img && !view.state.selection.visible && result.ie && result.ie_version <= 11) {\n node.disabled = true;\n node.disabled = false;\n }\n}\n\nfunction syncNodeSelection(view, sel) {\n if (sel instanceof NodeSelection) {\n var desc = view.docView.descAt(sel.from);\n if (desc != view.lastSelectedViewDesc) {\n clearNodeSelection(view);\n if (desc) { desc.selectNode(); }\n view.lastSelectedViewDesc = desc;\n }\n } else {\n clearNodeSelection(view);\n }\n}\n\n// Clear all DOM statefulness of the last node selection.\nfunction clearNodeSelection(view) {\n if (view.lastSelectedViewDesc) {\n if (view.lastSelectedViewDesc.parent)\n { view.lastSelectedViewDesc.deselectNode(); }\n view.lastSelectedViewDesc = null;\n }\n}\n\nfunction selectionBetween(view, $anchor, $head, bias) {\n return view.someProp(\"createSelectionBetween\", function (f) { return f(view, $anchor, $head); })\n || TextSelection.between($anchor, $head, bias)\n}\n\nfunction hasFocusAndSelection(view) {\n if (view.editable && view.root.activeElement != view.dom) { return false }\n return hasSelection(view)\n}\n\nfunction hasSelection(view) {\n var sel = view.root.getSelection();\n if (!sel.anchorNode) { return false }\n try {\n // Firefox will raise 'permission denied' errors when accessing\n // properties of `sel.anchorNode` when it's in a generated CSS\n // element.\n return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&\n (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode))\n } catch(_) {\n return false\n }\n}\n\nfunction anchorInRightPlace(view) {\n var anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n var domSel = view.root.getSelection();\n return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset)\n}\n\nfunction moveSelectionBlock(state, dir) {\n var ref = state.selection;\n var $anchor = ref.$anchor;\n var $head = ref.$head;\n var $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n var $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n return $start && Selection.findFrom($start, dir)\n}\n\nfunction apply(view, sel) {\n view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n return true\n}\n\nfunction selectHorizontally(view, dir, mods) {\n var sel = view.state.selection;\n if (sel instanceof TextSelection) {\n if (!sel.empty || mods.indexOf(\"s\") > -1) {\n return false\n } else if (view.endOfTextblock(dir > 0 ? \"right\" : \"left\")) {\n var next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection)) { return apply(view, next) }\n return false\n } else if (!(result.mac && mods.indexOf(\"m\") > -1)) {\n var $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n if (!node || node.isText) { return false }\n var nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM)) { return false }\n if (NodeSelection.isSelectable(node)) {\n return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head))\n } else if (result.webkit) {\n // Chrome and Safari will introduce extra pointless cursor\n // positions around inline uneditable nodes, so we have to\n // take over and move the cursor past them (#937)\n return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)))\n } else {\n return false\n }\n }\n } else if (sel instanceof NodeSelection && sel.node.isInline) {\n return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from))\n } else {\n var next$1 = moveSelectionBlock(view.state, dir);\n if (next$1) { return apply(view, next$1) }\n return false\n }\n}\n\nfunction nodeLen(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length\n}\n\nfunction isIgnorable(dom) {\n var desc = dom.pmViewDesc;\n return desc && desc.size == 0 && (dom.nextSibling || dom.nodeName != \"BR\")\n}\n\n// Make sure the cursor isn't directly after one or more ignored\n// nodes, which will confuse the browser's cursor motion logic.\nfunction skipIgnoredNodesLeft(view) {\n var sel = view.root.getSelection();\n var node = sel.focusNode, offset = sel.focusOffset;\n if (!node) { return }\n var moveNode, moveOffset, force = false;\n // Gecko will do odd things when the selection is directly in front\n // of a non-editable node, so in that case, move it into the next\n // node if possible. Issue prosemirror/prosemirror#832.\n if (result.gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset])) { force = true; }\n for (;;) {\n if (offset > 0) {\n if (node.nodeType != 1) {\n break\n } else {\n var before = node.childNodes[offset - 1];\n if (isIgnorable(before)) {\n moveNode = node;\n moveOffset = --offset;\n } else if (before.nodeType == 3) {\n node = before;\n offset = node.nodeValue.length;\n } else { break }\n }\n } else if (isBlockNode(node)) {\n break\n } else {\n var prev = node.previousSibling;\n while (prev && isIgnorable(prev)) {\n moveNode = node.parentNode;\n moveOffset = domIndex(prev);\n prev = prev.previousSibling;\n }\n if (!prev) {\n node = node.parentNode;\n if (node == view.dom) { break }\n offset = 0;\n } else {\n node = prev;\n offset = nodeLen(node);\n }\n }\n }\n if (force) { setSelFocus(view, sel, node, offset); }\n else if (moveNode) { setSelFocus(view, sel, moveNode, moveOffset); }\n}\n\n// Make sure the cursor isn't directly before one or more ignored\n// nodes.\nfunction skipIgnoredNodesRight(view) {\n var sel = view.root.getSelection();\n var node = sel.focusNode, offset = sel.focusOffset;\n if (!node) { return }\n var len = nodeLen(node);\n var moveNode, moveOffset;\n for (;;) {\n if (offset < len) {\n if (node.nodeType != 1) { break }\n var after = node.childNodes[offset];\n if (isIgnorable(after)) {\n moveNode = node;\n moveOffset = ++offset;\n }\n else { break }\n } else if (isBlockNode(node)) {\n break\n } else {\n var next = node.nextSibling;\n while (next && isIgnorable(next)) {\n moveNode = next.parentNode;\n moveOffset = domIndex(next) + 1;\n next = next.nextSibling;\n }\n if (!next) {\n node = node.parentNode;\n if (node == view.dom) { break }\n offset = len = 0;\n } else {\n node = next;\n offset = 0;\n len = nodeLen(node);\n }\n }\n }\n if (moveNode) { setSelFocus(view, sel, moveNode, moveOffset); }\n}\n\nfunction isBlockNode(dom) {\n var desc = dom.pmViewDesc;\n return desc && desc.node && desc.node.isBlock\n}\n\nfunction setSelFocus(view, sel, node, offset) {\n if (selectionCollapsed(sel)) {\n var range = document.createRange();\n range.setEnd(node, offset);\n range.setStart(node, offset);\n sel.removeAllRanges();\n sel.addRange(range);\n } else if (sel.extend) {\n sel.extend(node, offset);\n }\n view.domObserver.setCurSelection();\n var state = view.state;\n // If no state update ends up happening, reset the selection.\n setTimeout(function () {\n if (view.state == state) { selectionToDOM(view); }\n }, 50);\n}\n\n// : (EditorState, number)\n// Check whether vertical selection motion would involve node\n// selections. If so, apply it (if not, the result is left to the\n// browser)\nfunction selectVertically(view, dir, mods) {\n var sel = view.state.selection;\n if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1) { return false }\n if (result.mac && mods.indexOf(\"m\") > -1) { return false }\n var $from = sel.$from;\n var $to = sel.$to;\n\n if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n var next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection))\n { return apply(view, next) }\n }\n if (!$from.parent.inlineContent) {\n var beyond = Selection.findFrom(dir < 0 ? $from : $to, dir);\n return beyond ? apply(view, beyond) : true\n }\n return false\n}\n\nfunction stopNativeHorizontalDelete(view, dir) {\n if (!(view.state.selection instanceof TextSelection)) { return true }\n var ref = view.state.selection;\n var $head = ref.$head;\n var $anchor = ref.$anchor;\n var empty = ref.empty;\n if (!$head.sameParent($anchor)) { return true }\n if (!empty) { return false }\n if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\")) { return true }\n var nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n if (nextNode && !nextNode.isText) {\n var tr = view.state.tr;\n if (dir < 0) { tr.delete($head.pos - nextNode.nodeSize, $head.pos); }\n else { tr.delete($head.pos, $head.pos + nextNode.nodeSize); }\n view.dispatch(tr);\n return true\n }\n return false\n}\n\nfunction switchEditable(view, node, state) {\n view.domObserver.stop();\n node.contentEditable = state;\n view.domObserver.start();\n}\n\n// Issue #867 / #1090 / https://bugs.chromium.org/p/chromium/issues/detail?id=903821\n// In which Safari (and at some point in the past, Chrome) does really\n// wrong things when the down arrow is pressed when the cursor is\n// directly at the start of a textblock and has an uneditable node\n// after it\nfunction safariDownArrowBug(view) {\n if (!result.safari || view.state.selection.$head.parentOffset > 0) { return }\n var ref = view.root.getSelection();\n var focusNode = ref.focusNode;\n var focusOffset = ref.focusOffset;\n if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&\n focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n var child = focusNode.firstChild;\n switchEditable(view, child, true);\n setTimeout(function () { return switchEditable(view, child, false); }, 20);\n }\n}\n\n// A backdrop key mapping used to make sure we always suppress keys\n// that have a dangerous default effect, even if the commands they are\n// bound to return false, and to make sure that cursor-motion keys\n// find a cursor (as opposed to a node selection) when pressed. For\n// cursor-motion keys, the code in the handlers also takes care of\n// block selections.\n\nfunction getMods(event) {\n var result = \"\";\n if (event.ctrlKey) { result += \"c\"; }\n if (event.metaKey) { result += \"m\"; }\n if (event.altKey) { result += \"a\"; }\n if (event.shiftKey) { result += \"s\"; }\n return result\n}\n\nfunction captureKeyDown(view, event) {\n var code = event.keyCode, mods = getMods(event);\n if (code == 8 || (result.mac && code == 72 && mods == \"c\")) { // Backspace, Ctrl-h on Mac\n return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodesLeft(view)\n } else if (code == 46 || (result.mac && code == 68 && mods == \"c\")) { // Delete, Ctrl-d on Mac\n return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodesRight(view)\n } else if (code == 13 || code == 27) { // Enter, Esc\n return true\n } else if (code == 37) { // Left arrow\n return selectHorizontally(view, -1, mods) || skipIgnoredNodesLeft(view)\n } else if (code == 39) { // Right arrow\n return selectHorizontally(view, 1, mods) || skipIgnoredNodesRight(view)\n } else if (code == 38) { // Up arrow\n return selectVertically(view, -1, mods) || skipIgnoredNodesLeft(view)\n } else if (code == 40) { // Down arrow\n return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodesRight(view)\n } else if (mods == (result.mac ? \"m\" : \"c\") &&\n (code == 66 || code == 73 || code == 89 || code == 90)) { // Mod-[biyz]\n return true\n }\n return false\n}\n\n// Note that all referencing and parsing is done with the\n// start-of-operation selection and document, since that's the one\n// that the DOM represents. If any changes came in in the meantime,\n// the modification is mapped over those before it is applied, in\n// readDOMChange.\n\nfunction parseBetween(view, from_, to_) {\n var ref = view.docView.parseRange(from_, to_);\n var parent = ref.node;\n var fromOffset = ref.fromOffset;\n var toOffset = ref.toOffset;\n var from = ref.from;\n var to = ref.to;\n\n var domSel = view.root.getSelection(), find = null, anchor = domSel.anchorNode;\n if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {\n find = [{node: anchor, offset: domSel.anchorOffset}];\n if (!selectionCollapsed(domSel))\n { find.push({node: domSel.focusNode, offset: domSel.focusOffset}); }\n }\n // Work around issue in Chrome where backspacing sometimes replaces\n // the deleted content with a random BR node (issues #799, #831)\n if (result.chrome && view.lastKeyCode === 8) {\n for (var off = toOffset; off > fromOffset; off--) {\n var node = parent.childNodes[off - 1], desc = node.pmViewDesc;\n if (node.nodeType == \"BR\" && !desc) { toOffset = off; break }\n if (!desc || desc.size) { break }\n }\n }\n var startDoc = view.state.doc;\n var parser = view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n var $from = startDoc.resolve(from);\n\n var sel = null, doc = parser.parse(parent, {\n topNode: $from.parent,\n topMatch: $from.parent.contentMatchAt($from.index()),\n topOpen: true,\n from: fromOffset,\n to: toOffset,\n preserveWhitespace: $from.parent.type.spec.code ? \"full\" : true,\n editableContent: true,\n findPositions: find,\n ruleFromNode: ruleFromNode,\n context: $from\n });\n if (find && find[0].pos != null) {\n var anchor$1 = find[0].pos, head = find[1] && find[1].pos;\n if (head == null) { head = anchor$1; }\n sel = {anchor: anchor$1 + from, head: head + from};\n }\n return {doc: doc, sel: sel, from: from, to: to}\n}\n\nfunction ruleFromNode(dom) {\n var desc = dom.pmViewDesc;\n if (desc) {\n return desc.parseRule()\n } else if (dom.nodeName == \"BR\" && dom.parentNode) {\n // Safari replaces the list item or table cell with a BR\n // directly in the list node (?!) if you delete the last\n // character in a list item or table cell (#708, #862)\n if (result.safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) {\n var skip = document.createElement(\"div\");\n skip.appendChild(document.createElement(\"li\"));\n return {skip: skip}\n } else if (dom.parentNode.lastChild == dom || result.safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) {\n return {ignore: true}\n }\n } else if (dom.nodeName == \"IMG\" && dom.getAttribute(\"mark-placeholder\")) {\n return {ignore: true}\n }\n}\n\nfunction readDOMChange(view, from, to, typeOver, addedNodes) {\n if (from < 0) {\n var origin = view.lastSelectionTime > Date.now() - 50 ? view.lastSelectionOrigin : null;\n var newSel = selectionFromDOM(view, origin);\n if (newSel && !view.state.selection.eq(newSel)) {\n var tr$1 = view.state.tr.setSelection(newSel);\n if (origin == \"pointer\") { tr$1.setMeta(\"pointer\", true); }\n else if (origin == \"key\") { tr$1.scrollIntoView(); }\n view.dispatch(tr$1);\n }\n return\n }\n\n var $before = view.state.doc.resolve(from);\n var shared = $before.sharedDepth(to);\n from = $before.before(shared + 1);\n to = view.state.doc.resolve(to).after(shared + 1);\n\n var sel = view.state.selection;\n var parse = parseBetween(view, from, to);\n // Chrome sometimes leaves the cursor before the inserted text when\n // composing after a cursor wrapper. This moves it forward.\n if (result.chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from) {\n var text = view.cursorWrapper.deco.type.toDOM.nextSibling;\n var size = text && text.nodeValue ? text.nodeValue.length : 1;\n parse.sel = {anchor: parse.sel.anchor + size, head: parse.sel.anchor + size};\n }\n\n var doc = view.state.doc, compare = doc.slice(parse.from, parse.to);\n var preferredPos, preferredSide;\n // Prefer anchoring to end when Backspace is pressed\n if (view.lastKeyCode === 8 && Date.now() - 100 < view.lastKeyCodeTime) {\n preferredPos = view.state.selection.to;\n preferredSide = \"end\";\n } else {\n preferredPos = view.state.selection.from;\n preferredSide = \"start\";\n }\n view.lastKeyCode = null;\n\n var change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);\n if (!change) {\n if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) &&\n !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) {\n change = {start: sel.from, endA: sel.to, endB: sel.to};\n } else if (result.ios && view.lastIOSEnter > Date.now() - 225 &&\n addedNodes.some(function (n) { return n.nodeName == \"DIV\" || n.nodeName == \"P\"; }) &&\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); })) {\n view.lastIOSEnter = 0;\n return\n } else {\n if (parse.sel) {\n var sel$1 = resolveSelection(view, view.state.doc, parse.sel);\n if (sel$1 && !sel$1.eq(view.state.selection)) { view.dispatch(view.state.tr.setSelection(sel$1)); }\n }\n return\n }\n }\n view.domChangeCount++;\n // Handle the case where overwriting a selection by typing matches\n // the start or end of the selected content, creating a change\n // that's smaller than what was actually overwritten.\n if (view.state.selection.from < view.state.selection.to &&\n change.start == change.endB &&\n view.state.selection instanceof TextSelection) {\n if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2) {\n change.start = view.state.selection.from;\n } else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2) {\n change.endB += (view.state.selection.to - change.endA);\n change.endA = view.state.selection.to;\n }\n }\n\n // IE11 will insert a non-breaking space _ahead_ of the space after\n // the cursor space when adding a space before another space. When\n // that happened, adjust the change to cover the space instead.\n if (result.ie && result.ie_version <= 11 && change.endB == change.start + 1 &&\n change.endA == change.start && change.start > parse.from &&\n parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == \" \\u00a0\") {\n change.start--;\n change.endA--;\n change.endB--;\n }\n\n var $from = parse.doc.resolveNoCache(change.start - parse.from);\n var $to = parse.doc.resolveNoCache(change.endB - parse.from);\n var inlineChange = $from.sameParent($to) && $from.parent.inlineContent;\n var nextSel;\n // If this looks like the effect of pressing Enter (or was recorded\n // as being an iOS enter press), just dispatch an Enter key instead.\n if (((result.ios && view.lastIOSEnter > Date.now() - 225 &&\n (!inlineChange || addedNodes.some(function (n) { return n.nodeName == \"DIV\" || n.nodeName == \"P\"; }))) ||\n (!inlineChange && $from.pos < parse.doc.content.size &&\n (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&\n nextSel.head == $to.pos)) &&\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); })) {\n view.lastIOSEnter = 0;\n return\n }\n // Same for backspace\n if (view.state.selection.anchor > change.start &&\n looksLikeJoin(doc, change.start, change.endA, $from, $to) &&\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(8, \"Backspace\")); })) {\n if (result.android && result.chrome) { view.domObserver.suppressSelectionUpdates(); } // #820\n return\n }\n\n // This tries to detect Android virtual keyboard\n // enter-and-pick-suggestion action. That sometimes (see issue\n // #1059) first fires a DOM mutation, before moving the selection to\n // the newly created block. And then, because ProseMirror cleans up\n // the DOM selection, it gives up moving the selection entirely,\n // leaving the cursor in the wrong place. When that happens, we drop\n // the new paragraph from the initial change, and fire a simulated\n // enter key afterwards.\n if (result.android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth &&\n parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) {\n change.endB -= 2;\n $to = parse.doc.resolveNoCache(change.endB - parse.from);\n setTimeout(function () {\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n }, 20);\n }\n\n var chFrom = change.start, chTo = change.endA;\n\n var tr, storedMarks, markChange, $from1;\n if (inlineChange) {\n if ($from.pos == $to.pos) { // Deletion\n // IE11 sometimes weirdly moves the DOM selection around after\n // backspacing out the first element in a textblock\n if (result.ie && result.ie_version <= 11 && $from.parentOffset == 0) {\n view.domObserver.suppressSelectionUpdates();\n setTimeout(function () { return selectionToDOM(view); }, 20);\n }\n tr = view.state.tr.delete(chFrom, chTo);\n storedMarks = doc.resolve(change.start).marksAcross(doc.resolve(change.endA));\n } else if ( // Adding or removing a mark\n change.endA == change.endB && ($from1 = doc.resolve(change.start)) &&\n (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset),\n $from1.parent.content.cut($from1.parentOffset, change.endA - $from1.start())))\n ) {\n tr = view.state.tr;\n if (markChange.type == \"add\") { tr.addMark(chFrom, chTo, markChange.mark); }\n else { tr.removeMark(chFrom, chTo, markChange.mark); }\n } else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {\n // Both positions in the same text node -- simply insert text\n var text$1 = $from.parent.textBetween($from.parentOffset, $to.parentOffset);\n if (view.someProp(\"handleTextInput\", function (f) { return f(view, chFrom, chTo, text$1); })) { return }\n tr = view.state.tr.insertText(text$1, chFrom, chTo);\n }\n }\n\n if (!tr)\n { tr = view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from)); }\n if (parse.sel) {\n var sel$2 = resolveSelection(view, tr.doc, parse.sel);\n // Chrome Android will sometimes, during composition, report the\n // selection in the wrong place. If it looks like that is\n // happening, don't update the selection.\n // Edge just doesn't move the cursor forward when you start typing\n // in an empty block or between br nodes.\n if (sel$2 && !(result.chrome && result.android && view.composing && sel$2.empty &&\n (sel$2.head == chFrom || sel$2.head == tr.mapping.map(chTo) - 1) ||\n result.ie && sel$2.empty && sel$2.head == chFrom))\n { tr.setSelection(sel$2); }\n }\n if (storedMarks) { tr.ensureMarks(storedMarks); }\n view.dispatch(tr.scrollIntoView());\n}\n\nfunction resolveSelection(view, doc, parsedSel) {\n if (Math.max(parsedSel.anchor, parsedSel.head) > doc.content.size) { return null }\n return selectionBetween(view, doc.resolve(parsedSel.anchor), doc.resolve(parsedSel.head))\n}\n\n// : (Fragment, Fragment) → ?{mark: Mark, type: string}\n// Given two same-length, non-empty fragments of inline content,\n// determine whether the first could be created from the second by\n// removing or adding a single mark type.\nfunction isMarkChange(cur, prev) {\n var curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks;\n var added = curMarks, removed = prevMarks, type, mark, update;\n for (var i = 0; i < prevMarks.length; i++) { added = prevMarks[i].removeFromSet(added); }\n for (var i$1 = 0; i$1 < curMarks.length; i$1++) { removed = curMarks[i$1].removeFromSet(removed); }\n if (added.length == 1 && removed.length == 0) {\n mark = added[0];\n type = \"add\";\n update = function (node) { return node.mark(mark.addToSet(node.marks)); };\n } else if (added.length == 0 && removed.length == 1) {\n mark = removed[0];\n type = \"remove\";\n update = function (node) { return node.mark(mark.removeFromSet(node.marks)); };\n } else {\n return null\n }\n var updated = [];\n for (var i$2 = 0; i$2 < prev.childCount; i$2++) { updated.push(update(prev.child(i$2))); }\n if (Fragment.from(updated).eq(cur)) { return {mark: mark, type: type} }\n}\n\nfunction looksLikeJoin(old, start, end, $newStart, $newEnd) {\n if (!$newStart.parent.isTextblock ||\n // The content must have shrunk\n end - start <= $newEnd.pos - $newStart.pos ||\n // newEnd must point directly at or after the end of the block that newStart points into\n skipClosingAndOpening($newStart, true, false) < $newEnd.pos)\n { return false }\n\n var $start = old.resolve(start);\n // Start must be at the end of a block\n if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock)\n { return false }\n var $next = old.resolve(skipClosingAndOpening($start, true, true));\n // The next textblock must start before end and end near it\n if (!$next.parent.isTextblock || $next.pos > end ||\n skipClosingAndOpening($next, true, false) < end)\n { return false }\n\n // The fragments after the join point must match\n return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content)\n}\n\nfunction skipClosingAndOpening($pos, fromEnd, mayOpen) {\n var depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;\n while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {\n depth--;\n end++;\n fromEnd = false;\n }\n if (mayOpen) {\n var next = $pos.node(depth).maybeChild($pos.indexAfter(depth));\n while (next && !next.isLeaf) {\n next = next.firstChild;\n end++;\n }\n }\n return end\n}\n\nfunction findDiff(a, b, pos, preferredPos, preferredSide) {\n var start = a.findDiffStart(b, pos);\n if (start == null) { return null }\n var ref = a.findDiffEnd(b, pos + a.size, pos + b.size);\n var endA = ref.a;\n var endB = ref.b;\n if (preferredSide == \"end\") {\n var adjust = Math.max(0, start - Math.min(endA, endB));\n preferredPos -= endA + adjust - start;\n }\n if (endA < start && a.size < b.size) {\n var move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;\n start -= move;\n endB = start + (endB - endA);\n endA = start;\n } else if (endB < start) {\n var move$1 = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;\n start -= move$1;\n endA = start + (endA - endB);\n endB = start;\n }\n return {start: start, endA: endA, endB: endB}\n}\n\nfunction serializeForClipboard(view, slice) {\n var context = [];\n var content = slice.content;\n var openStart = slice.openStart;\n var openEnd = slice.openEnd;\n while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n openStart--;\n openEnd--;\n var node = content.firstChild;\n context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n content = node.content;\n }\n\n var serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n var doc = detachedDoc(), wrap = doc.createElement(\"div\");\n wrap.appendChild(serializer.serializeFragment(content, {document: doc}));\n\n var firstChild = wrap.firstChild, needsWrap;\n while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n for (var i = needsWrap.length - 1; i >= 0; i--) {\n var wrapper = doc.createElement(needsWrap[i]);\n while (wrap.firstChild) { wrapper.appendChild(wrap.firstChild); }\n wrap.appendChild(wrapper);\n }\n firstChild = wrap.firstChild;\n }\n\n if (firstChild && firstChild.nodeType == 1)\n { firstChild.setAttribute(\"data-pm-slice\", (openStart + \" \" + openEnd + \" \" + (JSON.stringify(context)))); }\n\n var text = view.someProp(\"clipboardTextSerializer\", function (f) { return f(slice); }) ||\n slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n\n return {dom: wrap, text: text}\n}\n\n// : (EditorView, string, string, ?bool, ResolvedPos) → ?Slice\n// Read a slice of content from the clipboard (or drop data).\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n var dom, inCode = $context.parent.type.spec.code, slice;\n if (!html && !text) { return null }\n var asText = text && (plainText || inCode || !html);\n if (asText) {\n view.someProp(\"transformPastedText\", function (f) { text = f(text, inCode || plainText); });\n if (inCode) { return new Slice(Fragment.from(view.state.schema.text(text)), 0, 0) }\n var parsed = view.someProp(\"clipboardTextParser\", function (f) { return f(text, $context, plainText); });\n if (parsed) {\n slice = parsed;\n } else {\n dom = document.createElement(\"div\");\n text.trim().split(/(?:\\r\\n?|\\n)+/).forEach(function (block) {\n dom.appendChild(document.createElement(\"p\")).textContent = block;\n });\n }\n } else {\n view.someProp(\"transformPastedHTML\", function (f) { html = f(html); });\n dom = readHTML(html);\n }\n\n var contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n var sliceData = contextNode && /^(\\d+) (\\d+) (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\"));\n if (!slice) {\n var parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n slice = parser.parseSlice(dom, {preserveWhitespace: !!(asText || sliceData), context: $context});\n }\n if (sliceData)\n { slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[3]); }\n else // HTML wasn't created by ProseMirror. Make sure top-level siblings are coherent\n { slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), false); }\n\n view.someProp(\"transformPasted\", function (f) { slice = f(slice); });\n return slice\n}\n\n// Takes a slice parsed with parseSlice, which means there hasn't been\n// any content-expression checking done on the top nodes, tries to\n// find a parent node in the current context that might fit the nodes,\n// and if successful, rebuilds the slice so that it fits into that parent.\n//\n// This addresses the problem that Transform.replace expects a\n// coherent slice, and will fail to place a set of siblings that don't\n// fit anywhere in the schema.\nfunction normalizeSiblings(fragment, $context) {\n if (fragment.childCount < 2) { return fragment }\n var loop = function ( d ) {\n var parent = $context.node(d);\n var match = parent.contentMatchAt($context.index(d));\n var lastWrap = (void 0), result = [];\n fragment.forEach(function (node) {\n if (!result) { return }\n var wrap = match.findWrapping(node.type), inLast;\n if (!wrap) { return result = null }\n if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n result[result.length - 1] = inLast;\n } else {\n if (result.length) { result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length); }\n var wrapped = withWrappers(node, wrap);\n result.push(wrapped);\n match = match.matchType(wrapped.type, wrapped.attrs);\n lastWrap = wrap;\n }\n });\n if (result) { return { v: Fragment.from(result) } }\n };\n\n for (var d = $context.depth; d >= 0; d--) {\n var returned = loop( d );\n\n if ( returned ) return returned.v;\n }\n return fragment\n}\n\nfunction withWrappers(node, wrap, from) {\n if ( from === void 0 ) from = 0;\n\n for (var i = wrap.length - 1; i >= from; i--)\n { node = wrap[i].create(null, Fragment.from(node)); }\n return node\n}\n\n// Used to group adjacent nodes wrapped in similar parents by\n// normalizeSiblings into the same parent node\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n var inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n if (inner) { return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner)) }\n var match = sibling.contentMatchAt(sibling.childCount);\n if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n { return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1)))) }\n }\n}\n\nfunction closeRight(node, depth) {\n if (depth == 0) { return node }\n var fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n var fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n return node.copy(fragment.append(fill))\n}\n\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n var node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n if (depth < to - 1) { inner = closeRange(inner, side, from, to, depth + 1, openEnd); }\n if (depth >= from)\n { inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, fragment.childCount > 1 || openEnd <= depth).append(inner)\n : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true)); }\n return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner))\n}\n\nfunction closeSlice(slice, openStart, openEnd) {\n if (openStart < slice.openStart)\n { slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd); }\n if (openEnd < slice.openEnd)\n { slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd); }\n return slice\n}\n\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"..\"` the table cells are ignored.\nvar wrapMap = {\n thead: [\"table\"],\n tbody: [\"table\"],\n tfoot: [\"table\"],\n caption: [\"table\"],\n colgroup: [\"table\"],\n col: [\"table\", \"colgroup\"],\n tr: [\"table\", \"tbody\"],\n td: [\"table\", \"tbody\", \"tr\"],\n th: [\"table\", \"tbody\", \"tr\"]\n};\n\nvar _detachedDoc = null;\nfunction detachedDoc() {\n return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"))\n}\n\nfunction readHTML(html) {\n var metas = /(\\s*]*>)*/.exec(html);\n if (metas) { html = html.slice(metas[0].length); }\n var elt = detachedDoc().createElement(\"div\");\n var firstTag = /(?:]*>)*<([a-z][^>\\s]+)/i.exec(html), wrap, depth = 0;\n if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()]) {\n html = wrap.map(function (n) { return \"<\" + n + \">\"; }).join(\"\") + html + wrap.map(function (n) { return \"\"; }).reverse().join(\"\");\n depth = wrap.length;\n }\n elt.innerHTML = html;\n for (var i = 0; i < depth; i++) { elt = elt.firstChild; }\n return elt\n}\n\nfunction addContext(slice, context) {\n if (!slice.size) { return slice }\n var schema = slice.content.firstChild.type.schema, array;\n try { array = JSON.parse(context); }\n catch(e) { return slice }\n var content = slice.content;\n var openStart = slice.openStart;\n var openEnd = slice.openEnd;\n for (var i = array.length - 2; i >= 0; i -= 2) {\n var type = schema.nodes[array[i]];\n if (!type || type.hasRequiredAttrs()) { break }\n content = Fragment.from(type.create(array[i + 1], content));\n openStart++; openEnd++;\n }\n return new Slice(content, openStart, openEnd)\n}\n\nvar observeOptions = {\n childList: true,\n characterData: true,\n characterDataOldValue: true,\n attributes: true,\n attributeOldValue: true,\n subtree: true\n};\n// IE11 has very broken mutation observers, so we also listen to DOMCharacterDataModified\nvar useCharData = result.ie && result.ie_version <= 11;\n\nvar SelectionState = function SelectionState() {\n this.anchorNode = this.anchorOffset = this.focusNode = this.focusOffset = null;\n};\n\nSelectionState.prototype.set = function set (sel) {\n this.anchorNode = sel.anchorNode; this.anchorOffset = sel.anchorOffset;\n this.focusNode = sel.focusNode; this.focusOffset = sel.focusOffset;\n};\n\nSelectionState.prototype.eq = function eq (sel) {\n return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset &&\n sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset\n};\n\nvar DOMObserver = function DOMObserver(view, handleDOMChange) {\n var this$1 = this;\n\n this.view = view;\n this.handleDOMChange = handleDOMChange;\n this.queue = [];\n this.flushingSoon = -1;\n this.observer = window.MutationObserver &&\n new window.MutationObserver(function (mutations) {\n for (var i = 0; i < mutations.length; i++) { this$1.queue.push(mutations[i]); }\n // IE11 will sometimes (on backspacing out a single character\n // text node after a BR node) call the observer callback\n // before actually updating the DOM, which will cause\n // ProseMirror to miss the change (see #930)\n if (result.ie && result.ie_version <= 11 && mutations.some(\n function (m) { return m.type == \"childList\" && m.removedNodes.length ||\n m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length; }))\n { this$1.flushSoon(); }\n else\n { this$1.flush(); }\n });\n this.currentSelection = new SelectionState;\n if (useCharData) {\n this.onCharData = function (e) {\n this$1.queue.push({target: e.target, type: \"characterData\", oldValue: e.prevValue});\n this$1.flushSoon();\n };\n }\n this.onSelectionChange = this.onSelectionChange.bind(this);\n this.suppressingSelectionUpdates = false;\n};\n\nDOMObserver.prototype.flushSoon = function flushSoon () {\n var this$1 = this;\n\n if (this.flushingSoon < 0)\n { this.flushingSoon = window.setTimeout(function () { this$1.flushingSoon = -1; this$1.flush(); }, 20); }\n};\n\nDOMObserver.prototype.forceFlush = function forceFlush () {\n if (this.flushingSoon > -1) {\n window.clearTimeout(this.flushingSoon);\n this.flushingSoon = -1;\n this.flush();\n }\n};\n\nDOMObserver.prototype.start = function start () {\n if (this.observer)\n { this.observer.observe(this.view.dom, observeOptions); }\n if (useCharData)\n { this.view.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData); }\n this.connectSelection();\n};\n\nDOMObserver.prototype.stop = function stop () {\n var this$1 = this;\n\n if (this.observer) {\n var take = this.observer.takeRecords();\n if (take.length) {\n for (var i = 0; i < take.length; i++) { this.queue.push(take[i]); }\n window.setTimeout(function () { return this$1.flush(); }, 20);\n }\n this.observer.disconnect();\n }\n if (useCharData) { this.view.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData); }\n this.disconnectSelection();\n};\n\nDOMObserver.prototype.connectSelection = function connectSelection () {\n this.view.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n};\n\nDOMObserver.prototype.disconnectSelection = function disconnectSelection () {\n this.view.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n};\n\nDOMObserver.prototype.suppressSelectionUpdates = function suppressSelectionUpdates () {\n var this$1 = this;\n\n this.suppressingSelectionUpdates = true;\n setTimeout(function () { return this$1.suppressingSelectionUpdates = false; }, 50);\n};\n\nDOMObserver.prototype.onSelectionChange = function onSelectionChange () {\n if (!hasFocusAndSelection(this.view)) { return }\n if (this.suppressingSelectionUpdates) { return selectionToDOM(this.view) }\n // Deletions on IE11 fire their events in the wrong order, giving\n // us a selection change event before the DOM changes are\n // reported.\n if (result.ie && result.ie_version <= 11 && !this.view.state.selection.empty) {\n var sel = this.view.root.getSelection();\n // Selection.isCollapsed isn't reliable on IE\n if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n { return this.flushSoon() }\n }\n this.flush();\n};\n\nDOMObserver.prototype.setCurSelection = function setCurSelection () {\n this.currentSelection.set(this.view.root.getSelection());\n};\n\nDOMObserver.prototype.ignoreSelectionChange = function ignoreSelectionChange (sel) {\n if (sel.rangeCount == 0) { return true }\n var container = sel.getRangeAt(0).commonAncestorContainer;\n var desc = this.view.docView.nearestDesc(container);\n if (desc && desc.ignoreMutation({type: \"selection\", target: container.nodeType == 3 ? container.parentNode : container})) {\n this.setCurSelection();\n return true\n }\n};\n\nDOMObserver.prototype.flush = function flush () {\n if (!this.view.docView || this.flushingSoon > -1) { return }\n var mutations = this.observer ? this.observer.takeRecords() : [];\n if (this.queue.length) {\n mutations = this.queue.concat(mutations);\n this.queue.length = 0;\n }\n\n var sel = this.view.root.getSelection();\n var newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasSelection(this.view) && !this.ignoreSelectionChange(sel);\n\n var from = -1, to = -1, typeOver = false, added = [];\n if (this.view.editable) {\n for (var i = 0; i < mutations.length; i++) {\n var result$1 = this.registerMutation(mutations[i], added);\n if (result$1) {\n from = from < 0 ? result$1.from : Math.min(result$1.from, from);\n to = to < 0 ? result$1.to : Math.max(result$1.to, to);\n if (result$1.typeOver) { typeOver = true; }\n }\n }\n }\n\n if (result.gecko && added.length > 1) {\n var brs = added.filter(function (n) { return n.nodeName == \"BR\"; });\n if (brs.length == 2) {\n var a = brs[0];\n var b = brs[1];\n if (a.parentNode && a.parentNode.parentNode == b.parentNode) { b.remove(); }\n else { a.remove(); }\n }\n }\n\n if (from > -1 || newSel) {\n if (from > -1) {\n this.view.docView.markDirty(from, to);\n checkCSS(this.view);\n }\n this.handleDOMChange(from, to, typeOver, added);\n if (this.view.docView.dirty) { this.view.updateState(this.view.state); }\n else if (!this.currentSelection.eq(sel)) { selectionToDOM(this.view); }\n this.currentSelection.set(sel);\n }\n};\n\nDOMObserver.prototype.registerMutation = function registerMutation (mut, added) {\n // Ignore mutations inside nodes that were already noted as inserted\n if (added.indexOf(mut.target) > -1) { return null }\n var desc = this.view.docView.nearestDesc(mut.target);\n if (mut.type == \"attributes\" &&\n (desc == this.view.docView || mut.attributeName == \"contenteditable\" ||\n // Firefox sometimes fires spurious events for null/empty styles\n (mut.attributeName == \"style\" && !mut.oldValue && !mut.target.getAttribute(\"style\"))))\n { return null }\n if (!desc || desc.ignoreMutation(mut)) { return null }\n\n if (mut.type == \"childList\") {\n var prev = mut.previousSibling, next = mut.nextSibling;\n if (result.ie && result.ie_version <= 11 && mut.addedNodes.length) {\n // IE11 gives us incorrect next/prev siblings for some\n // insertions, so if there are added nodes, recompute those\n for (var i = 0; i < mut.addedNodes.length; i++) {\n var ref = mut.addedNodes[i];\n var previousSibling = ref.previousSibling;\n var nextSibling = ref.nextSibling;\n if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0) { prev = previousSibling; }\n if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0) { next = nextSibling; }\n }\n }\n var fromOffset = prev && prev.parentNode == mut.target\n ? domIndex(prev) + 1 : 0;\n var from = desc.localPosFromDOM(mut.target, fromOffset, -1);\n var toOffset = next && next.parentNode == mut.target\n ? domIndex(next) : mut.target.childNodes.length;\n for (var i$1 = 0; i$1 < mut.addedNodes.length; i$1++) { added.push(mut.addedNodes[i$1]); }\n var to = desc.localPosFromDOM(mut.target, toOffset, 1);\n return {from: from, to: to}\n } else if (mut.type == \"attributes\") {\n return {from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border}\n } else { // \"characterData\"\n return {\n from: desc.posAtStart,\n to: desc.posAtEnd,\n // An event was generated for a text change that didn't change\n // any text. Mark the dom change to fall back to assuming the\n // selection was typed over with an identical value if it can't\n // find another change.\n typeOver: mut.target.nodeValue == mut.oldValue\n }\n }\n};\n\nvar cssChecked = false;\n\nfunction checkCSS(view) {\n if (cssChecked) { return }\n cssChecked = true;\n if (getComputedStyle(view.dom).whiteSpace == \"normal\")\n { console[\"warn\"](\"ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.\"); }\n}\n\n// A collection of DOM events that occur within the editor, and callback functions\n// to invoke when the event fires.\nvar handlers = {}, editHandlers = {};\n\nfunction initInput(view) {\n view.shiftKey = false;\n view.mouseDown = null;\n view.lastKeyCode = null;\n view.lastKeyCodeTime = 0;\n view.lastClick = {time: 0, x: 0, y: 0, type: \"\"};\n view.lastSelectionOrigin = null;\n view.lastSelectionTime = 0;\n\n view.lastIOSEnter = 0;\n view.lastIOSEnterFallbackTimeout = null;\n\n view.composing = false;\n view.composingTimeout = null;\n view.compositionNodes = [];\n view.compositionEndedAt = -2e8;\n\n view.domObserver = new DOMObserver(view, function (from, to, typeOver, added) { return readDOMChange(view, from, to, typeOver, added); });\n view.domObserver.start();\n // Used by hacks like the beforeinput handler to check whether anything happened in the DOM\n view.domChangeCount = 0;\n\n view.eventHandlers = Object.create(null);\n var loop = function ( event ) {\n var handler = handlers[event];\n view.dom.addEventListener(event, view.eventHandlers[event] = function (event) {\n if (eventBelongsToView(view, event) && !runCustomHandler(view, event) &&\n (view.editable || !(event.type in editHandlers)))\n { handler(view, event); }\n });\n };\n\n for (var event in handlers) loop( event );\n // On Safari, for reasons beyond my understanding, adding an input\n // event handler makes an issue where the composition vanishes when\n // you press enter go away.\n if (result.safari) { view.dom.addEventListener(\"input\", function () { return null; }); }\n\n ensureListeners(view);\n}\n\nfunction setSelectionOrigin(view, origin) {\n view.lastSelectionOrigin = origin;\n view.lastSelectionTime = Date.now();\n}\n\nfunction destroyInput(view) {\n view.domObserver.stop();\n for (var type in view.eventHandlers)\n { view.dom.removeEventListener(type, view.eventHandlers[type]); }\n clearTimeout(view.composingTimeout);\n clearTimeout(view.lastIOSEnterFallbackTimeout);\n}\n\nfunction ensureListeners(view) {\n view.someProp(\"handleDOMEvents\", function (currentHandlers) {\n for (var type in currentHandlers) { if (!view.eventHandlers[type])\n { view.dom.addEventListener(type, view.eventHandlers[type] = function (event) { return runCustomHandler(view, event); }); } }\n });\n}\n\nfunction runCustomHandler(view, event) {\n return view.someProp(\"handleDOMEvents\", function (handlers) {\n var handler = handlers[event.type];\n return handler ? handler(view, event) || event.defaultPrevented : false\n })\n}\n\nfunction eventBelongsToView(view, event) {\n if (!event.bubbles) { return true }\n if (event.defaultPrevented) { return false }\n for (var node = event.target; node != view.dom; node = node.parentNode)\n { if (!node || node.nodeType == 11 ||\n (node.pmViewDesc && node.pmViewDesc.stopEvent(event)))\n { return false } }\n return true\n}\n\nfunction dispatchEvent(view, event) {\n if (!runCustomHandler(view, event) && handlers[event.type] &&\n (view.editable || !(event.type in editHandlers)))\n { handlers[event.type](view, event); }\n}\n\neditHandlers.keydown = function (view, event) {\n view.shiftKey = event.keyCode == 16 || event.shiftKey;\n if (inOrNearComposition(view, event)) { return }\n view.domObserver.forceFlush();\n view.lastKeyCode = event.keyCode;\n view.lastKeyCodeTime = Date.now();\n // On iOS, if we preventDefault enter key presses, the virtual\n // keyboard gets confused. So the hack here is to set a flag that\n // makes the DOM change code recognize that what just happens should\n // be replaced by whatever the Enter key handlers do.\n if (result.ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n var now = Date.now();\n view.lastIOSEnter = now;\n view.lastIOSEnterFallbackTimeout = setTimeout(function () {\n if (view.lastIOSEnter == now) {\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n view.lastIOSEnter = 0;\n }\n }, 200);\n } else if (view.someProp(\"handleKeyDown\", function (f) { return f(view, event); }) || captureKeyDown(view, event)) {\n event.preventDefault();\n } else {\n setSelectionOrigin(view, \"key\");\n }\n};\n\neditHandlers.keyup = function (view, e) {\n if (e.keyCode == 16) { view.shiftKey = false; }\n};\n\neditHandlers.keypress = function (view, event) {\n if (inOrNearComposition(view, event) || !event.charCode ||\n event.ctrlKey && !event.altKey || result.mac && event.metaKey) { return }\n\n if (view.someProp(\"handleKeyPress\", function (f) { return f(view, event); })) {\n event.preventDefault();\n return\n }\n\n var sel = view.state.selection;\n if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) {\n var text = String.fromCharCode(event.charCode);\n if (!view.someProp(\"handleTextInput\", function (f) { return f(view, sel.$from.pos, sel.$to.pos, text); }))\n { view.dispatch(view.state.tr.insertText(text).scrollIntoView()); }\n event.preventDefault();\n }\n};\n\nfunction eventCoords(event) { return {left: event.clientX, top: event.clientY} }\n\nfunction isNear(event, click) {\n var dx = click.x - event.clientX, dy = click.y - event.clientY;\n return dx * dx + dy * dy < 100\n}\n\nfunction runHandlerOnContext(view, propName, pos, inside, event) {\n if (inside == -1) { return false }\n var $pos = view.state.doc.resolve(inside);\n var loop = function ( i ) {\n if (view.someProp(propName, function (f) { return i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true)\n : f(view, pos, $pos.node(i), $pos.before(i), event, false); }))\n { return { v: true } }\n };\n\n for (var i = $pos.depth + 1; i > 0; i--) {\n var returned = loop( i );\n\n if ( returned ) return returned.v;\n }\n return false\n}\n\nfunction updateSelection(view, selection, origin) {\n if (!view.focused) { view.focus(); }\n var tr = view.state.tr.setSelection(selection);\n if (origin == \"pointer\") { tr.setMeta(\"pointer\", true); }\n view.dispatch(tr);\n}\n\nfunction selectClickedLeaf(view, inside) {\n if (inside == -1) { return false }\n var $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter;\n if (node && node.isAtom && NodeSelection.isSelectable(node)) {\n updateSelection(view, new NodeSelection($pos), \"pointer\");\n return true\n }\n return false\n}\n\nfunction selectClickedNode(view, inside) {\n if (inside == -1) { return false }\n var sel = view.state.selection, selectedNode, selectAt;\n if (sel instanceof NodeSelection) { selectedNode = sel.node; }\n\n var $pos = view.state.doc.resolve(inside);\n for (var i = $pos.depth + 1; i > 0; i--) {\n var node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n if (NodeSelection.isSelectable(node)) {\n if (selectedNode && sel.$from.depth > 0 &&\n i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos)\n { selectAt = $pos.before(sel.$from.depth); }\n else\n { selectAt = $pos.before(i); }\n break\n }\n }\n\n if (selectAt != null) {\n updateSelection(view, NodeSelection.create(view.state.doc, selectAt), \"pointer\");\n return true\n } else {\n return false\n }\n}\n\nfunction handleSingleClick(view, pos, inside, event, selectNode) {\n return runHandlerOnContext(view, \"handleClickOn\", pos, inside, event) ||\n view.someProp(\"handleClick\", function (f) { return f(view, pos, event); }) ||\n (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside))\n}\n\nfunction handleDoubleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleDoubleClickOn\", pos, inside, event) ||\n view.someProp(\"handleDoubleClick\", function (f) { return f(view, pos, event); })\n}\n\nfunction handleTripleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleTripleClickOn\", pos, inside, event) ||\n view.someProp(\"handleTripleClick\", function (f) { return f(view, pos, event); }) ||\n defaultTripleClick(view, inside)\n}\n\nfunction defaultTripleClick(view, inside) {\n var doc = view.state.doc;\n if (inside == -1) {\n if (doc.inlineContent) {\n updateSelection(view, TextSelection.create(doc, 0, doc.content.size), \"pointer\");\n return true\n }\n return false\n }\n\n var $pos = doc.resolve(inside);\n for (var i = $pos.depth + 1; i > 0; i--) {\n var node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n var nodePos = $pos.before(i);\n if (node.inlineContent)\n { updateSelection(view, TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size), \"pointer\"); }\n else if (NodeSelection.isSelectable(node))\n { updateSelection(view, NodeSelection.create(doc, nodePos), \"pointer\"); }\n else\n { continue }\n return true\n }\n}\n\nfunction forceDOMFlush(view) {\n return endComposition(view)\n}\n\nvar selectNodeModifier = result.mac ? \"metaKey\" : \"ctrlKey\";\n\nhandlers.mousedown = function (view, event) {\n view.shiftKey = event.shiftKey;\n var flushed = forceDOMFlush(view);\n var now = Date.now(), type = \"singleClick\";\n if (now - view.lastClick.time < 500 && isNear(event, view.lastClick) && !event[selectNodeModifier]) {\n if (view.lastClick.type == \"singleClick\") { type = \"doubleClick\"; }\n else if (view.lastClick.type == \"doubleClick\") { type = \"tripleClick\"; }\n }\n view.lastClick = {time: now, x: event.clientX, y: event.clientY, type: type};\n\n var pos = view.posAtCoords(eventCoords(event));\n if (!pos) { return }\n\n if (type == \"singleClick\")\n { view.mouseDown = new MouseDown(view, pos, event, flushed); }\n else if ((type == \"doubleClick\" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event))\n { event.preventDefault(); }\n else\n { setSelectionOrigin(view, \"pointer\"); }\n};\n\nvar MouseDown = function MouseDown(view, pos, event, flushed) {\n var this$1 = this;\n\n this.view = view;\n this.startDoc = view.state.doc;\n this.pos = pos;\n this.event = event;\n this.flushed = flushed;\n this.selectNode = event[selectNodeModifier];\n this.allowDefault = event.shiftKey;\n\n var targetNode, targetPos;\n if (pos.inside > -1) {\n targetNode = view.state.doc.nodeAt(pos.inside);\n targetPos = pos.inside;\n } else {\n var $pos = view.state.doc.resolve(pos.pos);\n targetNode = $pos.parent;\n targetPos = $pos.depth ? $pos.before() : 0;\n }\n\n this.mightDrag = null;\n\n var target = flushed ? null : event.target;\n var targetDesc = target ? view.docView.nearestDesc(target, true) : null;\n this.target = targetDesc ? targetDesc.dom : null;\n\n if (targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false ||\n view.state.selection instanceof NodeSelection && targetPos == view.state.selection.from)\n { this.mightDrag = {node: targetNode,\n pos: targetPos,\n addAttr: this.target && !this.target.draggable,\n setUneditable: this.target && result.gecko && !this.target.hasAttribute(\"contentEditable\")}; }\n\n if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr) { this.target.draggable = true; }\n if (this.mightDrag.setUneditable)\n { setTimeout(function () { return this$1.target.setAttribute(\"contentEditable\", \"false\"); }, 20); }\n this.view.domObserver.start();\n }\n\n view.root.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n view.root.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n setSelectionOrigin(view, \"pointer\");\n};\n\nMouseDown.prototype.done = function done () {\n this.view.root.removeEventListener(\"mouseup\", this.up);\n this.view.root.removeEventListener(\"mousemove\", this.move);\n if (this.mightDrag && this.target) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr) { this.target.removeAttribute(\"draggable\"); }\n if (this.mightDrag.setUneditable) { this.target.removeAttribute(\"contentEditable\"); }\n this.view.domObserver.start();\n }\n this.view.mouseDown = null;\n};\n\nMouseDown.prototype.up = function up (event) {\n this.done();\n\n if (!this.view.dom.contains(event.target.nodeType == 3 ? event.target.parentNode : event.target))\n { return }\n\n var pos = this.pos;\n if (this.view.state.doc != this.startDoc) { pos = this.view.posAtCoords(eventCoords(event)); }\n\n if (this.allowDefault || !pos) {\n setSelectionOrigin(this.view, \"pointer\");\n } else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {\n event.preventDefault();\n } else if (this.flushed ||\n // Safari ignores clicks on draggable elements\n (result.safari && this.mightDrag && !this.mightDrag.node.isAtom) ||\n // Chrome will sometimes treat a node selection as a\n // cursor, but still report that the node is selected\n // when asked through getSelection. You'll then get a\n // situation where clicking at the point where that\n // (hidden) cursor is doesn't change the selection, and\n // thus doesn't get a reaction from ProseMirror. This\n // works around that.\n (result.chrome && !(this.view.state.selection instanceof TextSelection) &&\n (pos.pos == this.view.state.selection.from || pos.pos == this.view.state.selection.to))) {\n updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), \"pointer\");\n event.preventDefault();\n } else {\n setSelectionOrigin(this.view, \"pointer\");\n }\n};\n\nMouseDown.prototype.move = function move (event) {\n if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||\n Math.abs(this.event.y - event.clientY) > 4))\n { this.allowDefault = true; }\n setSelectionOrigin(this.view, \"pointer\");\n};\n\nhandlers.touchdown = function (view) {\n forceDOMFlush(view);\n setSelectionOrigin(view, \"pointer\");\n};\n\nhandlers.contextmenu = function (view) { return forceDOMFlush(view); };\n\nfunction inOrNearComposition(view, event) {\n if (view.composing) { return true }\n // See https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/.\n // On Japanese input method editors (IMEs), the Enter key is used to confirm character\n // selection. On Safari, when Enter is pressed, compositionend and keydown events are\n // emitted. The keydown event triggers newline insertion, which we don't want.\n // This method returns true if the keydown event should be ignored.\n // We only ignore it once, as pressing Enter a second time *should* insert a newline.\n // Furthermore, the keydown event timestamp must be close to the compositionEndedAt timestamp.\n // This guards against the case where compositionend is triggered without the keyboard\n // (e.g. character confirmation may be done with the mouse), and keydown is triggered\n // afterwards- we wouldn't want to ignore the keydown event in this case.\n if (result.safari && Math.abs(event.timeStamp - view.compositionEndedAt) < 500) {\n view.compositionEndedAt = -2e8;\n return true\n }\n return false\n}\n\n// Drop active composition after 5 seconds of inactivity on Android\nvar timeoutComposition = result.android ? 5000 : -1;\n\neditHandlers.compositionstart = editHandlers.compositionupdate = function (view) {\n if (!view.composing) {\n view.domObserver.flush();\n var state = view.state;\n var $pos = state.selection.$from;\n if (state.selection.empty &&\n (state.storedMarks ||\n (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(function (m) { return m.type.spec.inclusive === false; })))) {\n // Need to wrap the cursor in mark nodes different from the ones in the DOM context\n view.markCursor = view.state.storedMarks || $pos.marks();\n endComposition(view, true);\n view.markCursor = null;\n } else {\n endComposition(view);\n // In firefox, if the cursor is after but outside a marked node,\n // the inserted text won't inherit the marks. So this moves it\n // inside if necessary.\n if (result.gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {\n var sel = view.root.getSelection();\n for (var node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0;) {\n var before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];\n if (!before) { break }\n if (before.nodeType == 3) {\n sel.collapse(before, before.nodeValue.length);\n break\n } else {\n node = before;\n offset = -1;\n }\n }\n }\n }\n view.composing = true;\n }\n scheduleComposeEnd(view, timeoutComposition);\n};\n\neditHandlers.compositionend = function (view, event) {\n if (view.composing) {\n view.composing = false;\n view.compositionEndedAt = event.timeStamp;\n scheduleComposeEnd(view, 20);\n }\n};\n\nfunction scheduleComposeEnd(view, delay) {\n clearTimeout(view.composingTimeout);\n if (delay > -1) { view.composingTimeout = setTimeout(function () { return endComposition(view); }, delay); }\n}\n\nfunction clearComposition(view) {\n view.composing = false;\n while (view.compositionNodes.length > 0) { view.compositionNodes.pop().markParentsDirty(); }\n}\n\nfunction endComposition(view, forceUpdate) {\n view.domObserver.forceFlush();\n clearComposition(view);\n if (forceUpdate || view.docView.dirty) {\n var sel = selectionFromDOM(view);\n if (sel && !sel.eq(view.state.selection)) { view.dispatch(view.state.tr.setSelection(sel)); }\n else { view.updateState(view.state); }\n return true\n }\n return false\n}\n\nfunction captureCopy(view, dom) {\n // The extra wrapper is somehow necessary on IE/Edge to prevent the\n // content from being mangled when it is put onto the clipboard\n if (!view.dom.parentNode) { return }\n var wrap = view.dom.parentNode.appendChild(document.createElement(\"div\"));\n wrap.appendChild(dom);\n wrap.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n var sel = getSelection(), range = document.createRange();\n range.selectNodeContents(dom);\n // Done because IE will fire a selectionchange moving the selection\n // to its start when removeAllRanges is called and the editor still\n // has focus (which will mess up the editor's selection state).\n view.dom.blur();\n sel.removeAllRanges();\n sel.addRange(range);\n setTimeout(function () {\n if (wrap.parentNode) { wrap.parentNode.removeChild(wrap); }\n view.focus();\n }, 50);\n}\n\n// This is very crude, but unfortunately both these browsers _pretend_\n// that they have a clipboard API—all the objects and methods are\n// there, they just don't work, and they are hard to test.\nvar brokenClipboardAPI = (result.ie && result.ie_version < 15) ||\n (result.ios && result.webkit_version < 604);\n\nhandlers.copy = editHandlers.cut = function (view, e) {\n var sel = view.state.selection, cut = e.type == \"cut\";\n if (sel.empty) { return }\n\n // IE and Edge's clipboard interface is completely broken\n var data = brokenClipboardAPI ? null : e.clipboardData;\n var slice = sel.content();\n var ref = serializeForClipboard(view, slice);\n var dom = ref.dom;\n var text = ref.text;\n if (data) {\n e.preventDefault();\n data.clearData();\n data.setData(\"text/html\", dom.innerHTML);\n data.setData(\"text/plain\", text);\n } else {\n captureCopy(view, dom);\n }\n if (cut) { view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\")); }\n};\n\nfunction sliceSingleNode(slice) {\n return slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1 ? slice.content.firstChild : null\n}\n\nfunction capturePaste(view, e) {\n if (!view.dom.parentNode) { return }\n var plainText = view.shiftKey || view.state.selection.$from.parent.type.spec.code;\n var target = view.dom.parentNode.appendChild(document.createElement(plainText ? \"textarea\" : \"div\"));\n if (!plainText) { target.contentEditable = \"true\"; }\n target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n target.focus();\n setTimeout(function () {\n view.focus();\n if (target.parentNode) { target.parentNode.removeChild(target); }\n if (plainText) { doPaste(view, target.value, null, e); }\n else { doPaste(view, target.textContent, target.innerHTML, e); }\n }, 50);\n}\n\nfunction doPaste(view, text, html, e) {\n var slice = parseFromClipboard(view, text, html, view.shiftKey, view.state.selection.$from);\n if (view.someProp(\"handlePaste\", function (f) { return f(view, e, slice || Slice.empty); })) { return true }\n if (!slice) { return false }\n\n var singleNode = sliceSingleNode(slice);\n var tr = singleNode ? view.state.tr.replaceSelectionWith(singleNode, view.shiftKey) : view.state.tr.replaceSelection(slice);\n view.dispatch(tr.scrollIntoView().setMeta(\"paste\", true).setMeta(\"uiEvent\", \"paste\"));\n return true\n}\n\neditHandlers.paste = function (view, e) {\n var data = brokenClipboardAPI ? null : e.clipboardData;\n if (data && doPaste(view, data.getData(\"text/plain\"), data.getData(\"text/html\"), e)) { e.preventDefault(); }\n else { capturePaste(view, e); }\n};\n\nvar Dragging = function Dragging(slice, move) {\n this.slice = slice;\n this.move = move;\n};\n\nvar dragCopyModifier = result.mac ? \"altKey\" : \"ctrlKey\";\n\nhandlers.dragstart = function (view, e) {\n var mouseDown = view.mouseDown;\n if (mouseDown) { mouseDown.done(); }\n if (!e.dataTransfer) { return }\n\n var sel = view.state.selection;\n var pos = sel.empty ? null : view.posAtCoords(eventCoords(e));\n if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1: sel.to)) ; else if (mouseDown && mouseDown.mightDrag) {\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos)));\n } else if (e.target && e.target.nodeType == 1) {\n var desc = view.docView.nearestDesc(e.target, true);\n if (!desc || !desc.node.type.spec.draggable || desc == view.docView) { return }\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, desc.posBefore)));\n }\n var slice = view.state.selection.content();\n var ref = serializeForClipboard(view, slice);\n var dom = ref.dom;\n var text = ref.text;\n e.dataTransfer.clearData();\n e.dataTransfer.setData(brokenClipboardAPI ? \"Text\" : \"text/html\", dom.innerHTML);\n if (!brokenClipboardAPI) { e.dataTransfer.setData(\"text/plain\", text); }\n view.dragging = new Dragging(slice, !e[dragCopyModifier]);\n};\n\nhandlers.dragend = function (view) {\n var dragging = view.dragging;\n window.setTimeout(function () {\n if (view.dragging == dragging) { view.dragging = null; }\n }, 50);\n};\n\neditHandlers.dragover = editHandlers.dragenter = function (_, e) { return e.preventDefault(); };\n\neditHandlers.drop = function (view, e) {\n var dragging = view.dragging;\n view.dragging = null;\n\n if (!e.dataTransfer) { return }\n\n var eventPos = view.posAtCoords(eventCoords(e));\n if (!eventPos) { return }\n var $mouse = view.state.doc.resolve(eventPos.pos);\n if (!$mouse) { return }\n var slice = dragging && dragging.slice ||\n parseFromClipboard(view, e.dataTransfer.getData(brokenClipboardAPI ? \"Text\" : \"text/plain\"),\n brokenClipboardAPI ? null : e.dataTransfer.getData(\"text/html\"), false, $mouse);\n var move = dragging && !e[dragCopyModifier];\n if (view.someProp(\"handleDrop\", function (f) { return f(view, e, slice || Slice.empty, move); })) {\n e.preventDefault();\n return\n }\n if (!slice) { return }\n\n e.preventDefault();\n var insertPos = slice ? dropPoint(view.state.doc, $mouse.pos, slice) : $mouse.pos;\n if (insertPos == null) { insertPos = $mouse.pos; }\n\n var tr = view.state.tr;\n if (move) { tr.deleteSelection(); }\n\n var pos = tr.mapping.map(insertPos);\n var isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1;\n var beforeInsert = tr.doc;\n if (isNode)\n { tr.replaceRangeWith(pos, pos, slice.content.firstChild); }\n else\n { tr.replaceRange(pos, pos, slice); }\n if (tr.doc.eq(beforeInsert)) { return }\n\n var $pos = tr.doc.resolve(pos);\n if (isNode && NodeSelection.isSelectable(slice.content.firstChild) &&\n $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild)) {\n tr.setSelection(new NodeSelection($pos));\n } else {\n var end = tr.mapping.map(insertPos);\n tr.mapping.maps[tr.mapping.maps.length - 1].forEach(function (_from, _to, _newFrom, newTo) { return end = newTo; });\n tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)));\n }\n view.focus();\n view.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n};\n\nhandlers.focus = function (view) {\n if (!view.focused) {\n view.domObserver.stop();\n view.dom.classList.add(\"ProseMirror-focused\");\n view.domObserver.start();\n view.focused = true;\n setTimeout(function () {\n if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.root.getSelection()))\n { selectionToDOM(view); }\n }, 20);\n }\n};\n\nhandlers.blur = function (view) {\n if (view.focused) {\n view.domObserver.stop();\n view.dom.classList.remove(\"ProseMirror-focused\");\n view.domObserver.start();\n view.domObserver.currentSelection.set({});\n view.focused = false;\n }\n};\n\nhandlers.beforeinput = function (view, event) {\n // We should probably do more with beforeinput events, but support\n // is so spotty that I'm still waiting to see where they are going.\n\n // Very specific hack to deal with backspace sometimes failing on\n // Chrome Android when after an uneditable node.\n if (result.chrome && result.android && event.inputType == \"deleteContentBackward\") {\n var domChangeCount = view.domChangeCount;\n setTimeout(function () {\n if (view.domChangeCount != domChangeCount) { return } // Event already had some effect\n // This bug tends to close the virtual keyboard, so we refocus\n view.dom.blur();\n view.focus();\n if (view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(8, \"Backspace\")); })) { return }\n var ref = view.state.selection;\n var $cursor = ref.$cursor;\n // Crude approximation of backspace behavior when no command handled it\n if ($cursor && $cursor.pos > 0) { view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView()); }\n }, 50);\n }\n};\n\n// Make sure all handlers get registered\nfor (var prop in editHandlers) { handlers[prop] = editHandlers[prop]; }\n\nfunction compareObjs(a, b) {\n if (a == b) { return true }\n for (var p in a) { if (a[p] !== b[p]) { return false } }\n for (var p$1 in b) { if (!(p$1 in a)) { return false } }\n return true\n}\n\nvar WidgetType = function WidgetType(toDOM, spec) {\n this.spec = spec || noSpec;\n this.side = this.spec.side || 0;\n this.toDOM = toDOM;\n};\n\nWidgetType.prototype.map = function map (mapping, span, offset, oldOffset) {\n var ref = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1);\n var pos = ref.pos;\n var deleted = ref.deleted;\n return deleted ? null : new Decoration(pos - offset, pos - offset, this)\n};\n\nWidgetType.prototype.valid = function valid () { return true };\n\nWidgetType.prototype.eq = function eq (other) {\n return this == other ||\n (other instanceof WidgetType &&\n (this.spec.key && this.spec.key == other.spec.key ||\n this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)))\n};\n\nvar InlineType = function InlineType(attrs, spec) {\n this.spec = spec || noSpec;\n this.attrs = attrs;\n};\n\nInlineType.prototype.map = function map (mapping, span, offset, oldOffset) {\n var from = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset;\n var to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset;\n return from >= to ? null : new Decoration(from, to, this)\n};\n\nInlineType.prototype.valid = function valid (_, span) { return span.from < span.to };\n\nInlineType.prototype.eq = function eq (other) {\n return this == other ||\n (other instanceof InlineType && compareObjs(this.attrs, other.attrs) &&\n compareObjs(this.spec, other.spec))\n};\n\nInlineType.is = function is (span) { return span.type instanceof InlineType };\n\nvar NodeType = function NodeType(attrs, spec) {\n this.spec = spec || noSpec;\n this.attrs = attrs;\n};\n\nNodeType.prototype.map = function map (mapping, span, offset, oldOffset) {\n var from = mapping.mapResult(span.from + oldOffset, 1);\n if (from.deleted) { return null }\n var to = mapping.mapResult(span.to + oldOffset, -1);\n if (to.deleted || to.pos <= from.pos) { return null }\n return new Decoration(from.pos - offset, to.pos - offset, this)\n};\n\nNodeType.prototype.valid = function valid (node, span) {\n var ref = node.content.findIndex(span.from);\n var index = ref.index;\n var offset = ref.offset;\n return offset == span.from && offset + node.child(index).nodeSize == span.to\n};\n\nNodeType.prototype.eq = function eq (other) {\n return this == other ||\n (other instanceof NodeType && compareObjs(this.attrs, other.attrs) &&\n compareObjs(this.spec, other.spec))\n};\n\n// ::- Decoration objects can be provided to the view through the\n// [`decorations` prop](#view.EditorProps.decorations). They come in\n// several variants—see the static members of this class for details.\nvar Decoration = function Decoration(from, to, type) {\n // :: number\n // The start position of the decoration.\n this.from = from;\n // :: number\n // The end position. Will be the same as `from` for [widget\n // decorations](#view.Decoration^widget).\n this.to = to;\n this.type = type;\n};\n\nvar prototypeAccessors$1 = { spec: { configurable: true },inline: { configurable: true } };\n\nDecoration.prototype.copy = function copy (from, to) {\n return new Decoration(from, to, this.type)\n};\n\nDecoration.prototype.eq = function eq (other, offset) {\n if ( offset === void 0 ) offset = 0;\n\n return this.type.eq(other.type) && this.from + offset == other.from && this.to + offset == other.to\n};\n\nDecoration.prototype.map = function map (mapping, offset, oldOffset) {\n return this.type.map(mapping, this, offset, oldOffset)\n};\n\n// :: (number, union<(view: EditorView, getPos: () → number) → dom.Node, dom.Node>, ?Object) → Decoration\n// Creates a widget decoration, which is a DOM node that's shown in\n// the document at the given position. It is recommended that you\n// delay rendering the widget by passing a function that will be\n// called when the widget is actually drawn in a view, but you can\n// also directly pass a DOM node. `getPos` can be used to find the\n// widget's current document position.\n//\n// spec::- These options are supported:\n//\n// side:: ?number\n// Controls which side of the document position this widget is\n// associated with. When negative, it is drawn before a cursor\n// at its position, and content inserted at that position ends\n// up after the widget. When zero (the default) or positive, the\n// widget is drawn after the cursor and content inserted there\n// ends up before the widget.\n//\n// When there are multiple widgets at a given position, their\n// `side` values determine the order in which they appear. Those\n// with lower values appear first. The ordering of widgets with\n// the same `side` value is unspecified.\n//\n// When `marks` is null, `side` also determines the marks that\n// the widget is wrapped in—those of the node before when\n// negative, those of the node after when positive.\n//\n// marks:: ?[Mark]\n// The precise set of marks to draw around the widget.\n//\n// stopEvent:: ?(event: dom.Event) → bool\n// Can be used to control which DOM events, when they bubble out\n// of this widget, the editor view should ignore.\n//\n// ignoreSelection:: ?bool\n// When set (defaults to false), selection changes inside the\n// widget are ignored, and don't cause ProseMirror to try and\n// re-sync the selection with its selection state.\n//\n// key:: ?string\n// When comparing decorations of this type (in order to decide\n// whether it needs to be redrawn), ProseMirror will by default\n// compare the widget DOM node by identity. If you pass a key,\n// that key will be compared instead, which can be useful when\n// you generate decorations on the fly and don't want to store\n// and reuse DOM nodes. Make sure that any widgets with the same\n// key are interchangeable—if widgets differ in, for example,\n// the behavior of some event handler, they should get\n// different keys.\nDecoration.widget = function widget (pos, toDOM, spec) {\n return new Decoration(pos, pos, new WidgetType(toDOM, spec))\n};\n\n// :: (number, number, DecorationAttrs, ?Object) → Decoration\n// Creates an inline decoration, which adds the given attributes to\n// each inline node between `from` and `to`.\n//\n// spec::- These options are recognized:\n//\n// inclusiveStart:: ?bool\n// Determines how the left side of the decoration is\n// [mapped](#transform.Position_Mapping) when content is\n// inserted directly at that position. By default, the decoration\n// won't include the new content, but you can set this to `true`\n// to make it inclusive.\n//\n// inclusiveEnd:: ?bool\n// Determines how the right side of the decoration is mapped.\n// See\n// [`inclusiveStart`](#view.Decoration^inline^spec.inclusiveStart).\nDecoration.inline = function inline (from, to, attrs, spec) {\n return new Decoration(from, to, new InlineType(attrs, spec))\n};\n\n// :: (number, number, DecorationAttrs, ?Object) → Decoration\n// Creates a node decoration. `from` and `to` should point precisely\n// before and after a node in the document. That node, and only that\n// node, will receive the given attributes.\n//\n// spec::-\n//\n// Optional information to store with the decoration. It\n// is also used when comparing decorators for equality.\nDecoration.node = function node (from, to, attrs, spec) {\n return new Decoration(from, to, new NodeType(attrs, spec))\n};\n\n// :: Object\n// The spec provided when creating this decoration. Can be useful\n// if you've stored extra information in that object.\nprototypeAccessors$1.spec.get = function () { return this.type.spec };\n\nprototypeAccessors$1.inline.get = function () { return this.type instanceof InlineType };\n\nObject.defineProperties( Decoration.prototype, prototypeAccessors$1 );\n\n// DecorationAttrs:: interface\n// A set of attributes to add to a decorated node. Most properties\n// simply directly correspond to DOM attributes of the same name,\n// which will be set to the property's value. These are exceptions:\n//\n// class:: ?string\n// A CSS class name or a space-separated set of class names to be\n// _added_ to the classes that the node already had.\n//\n// style:: ?string\n// A string of CSS to be _added_ to the node's existing `style` property.\n//\n// nodeName:: ?string\n// When non-null, the target node is wrapped in a DOM element of\n// this type (and the other attributes are applied to this element).\n\nvar none = [], noSpec = {};\n\n// ::- A collection of [decorations](#view.Decoration), organized in\n// such a way that the drawing algorithm can efficiently use and\n// compare them. This is a persistent data structure—it is not\n// modified, updates create a new value.\nvar DecorationSet = function DecorationSet(local, children) {\n this.local = local && local.length ? local : none;\n this.children = children && children.length ? children : none;\n};\n\n// :: (Node, [Decoration]) → DecorationSet\n// Create a set of decorations, using the structure of the given\n// document.\nDecorationSet.create = function create (doc, decorations) {\n return decorations.length ? buildTree(decorations, doc, 0, noSpec) : empty\n};\n\n// :: (?number, ?number, ?(spec: Object) → bool) → [Decoration]\n// Find all decorations in this set which touch the given range\n// (including decorations that start or end directly at the\n// boundaries) and match the given predicate on their spec. When\n// `start` and `end` are omitted, all decorations in the set are\n// considered. When `predicate` isn't given, all decorations are\n// assumed to match.\nDecorationSet.prototype.find = function find (start, end, predicate) {\n var result = [];\n this.findInner(start == null ? 0 : start, end == null ? 1e9 : end, result, 0, predicate);\n return result\n};\n\nDecorationSet.prototype.findInner = function findInner (start, end, result, offset, predicate) {\n for (var i = 0; i < this.local.length; i++) {\n var span = this.local[i];\n if (span.from <= end && span.to >= start && (!predicate || predicate(span.spec)))\n { result.push(span.copy(span.from + offset, span.to + offset)); }\n }\n for (var i$1 = 0; i$1 < this.children.length; i$1 += 3) {\n if (this.children[i$1] < end && this.children[i$1 + 1] > start) {\n var childOff = this.children[i$1] + 1;\n this.children[i$1 + 2].findInner(start - childOff, end - childOff, result, offset + childOff, predicate);\n }\n }\n};\n\n// :: (Mapping, Node, ?Object) → DecorationSet\n// Map the set of decorations in response to a change in the\n// document.\n//\n// options::- An optional set of options.\n//\n// onRemove:: ?(decorationSpec: Object)\n// When given, this function will be called for each decoration\n// that gets dropped as a result of the mapping, passing the\n// spec of that decoration.\nDecorationSet.prototype.map = function map (mapping, doc, options) {\n if (this == empty || mapping.maps.length == 0) { return this }\n return this.mapInner(mapping, doc, 0, 0, options || noSpec)\n};\n\nDecorationSet.prototype.mapInner = function mapInner (mapping, node, offset, oldOffset, options) {\n var newLocal;\n for (var i = 0; i < this.local.length; i++) {\n var mapped = this.local[i].map(mapping, offset, oldOffset);\n if (mapped && mapped.type.valid(node, mapped)) { (newLocal || (newLocal = [])).push(mapped); }\n else if (options.onRemove) { options.onRemove(this.local[i].spec); }\n }\n\n if (this.children.length)\n { return mapChildren(this.children, newLocal, mapping, node, offset, oldOffset, options) }\n else\n { return newLocal ? new DecorationSet(newLocal.sort(byPos)) : empty }\n};\n\n// :: (Node, [Decoration]) → DecorationSet\n// Add the given array of decorations to the ones in the set,\n// producing a new set. Needs access to the current document to\n// create the appropriate tree structure.\nDecorationSet.prototype.add = function add (doc, decorations) {\n if (!decorations.length) { return this }\n if (this == empty) { return DecorationSet.create(doc, decorations) }\n return this.addInner(doc, decorations, 0)\n};\n\nDecorationSet.prototype.addInner = function addInner (doc, decorations, offset) {\n var this$1 = this;\n\n var children, childIndex = 0;\n doc.forEach(function (childNode, childOffset) {\n var baseOffset = childOffset + offset, found;\n if (!(found = takeSpansForNode(decorations, childNode, baseOffset))) { return }\n\n if (!children) { children = this$1.children.slice(); }\n while (childIndex < children.length && children[childIndex] < childOffset) { childIndex += 3; }\n if (children[childIndex] == childOffset)\n { children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found, baseOffset + 1); }\n else\n { children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found, childNode, baseOffset + 1, noSpec)); }\n childIndex += 3;\n });\n\n var local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset);\n for (var i = 0; i < local.length; i++) { if (!local[i].type.valid(doc, local[i])) { local.splice(i--, 1); } }\n\n return new DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local,\n children || this.children)\n};\n\n// :: ([Decoration]) → DecorationSet\n// Create a new set that contains the decorations in this set, minus\n// the ones in the given array.\nDecorationSet.prototype.remove = function remove (decorations) {\n if (decorations.length == 0 || this == empty) { return this }\n return this.removeInner(decorations, 0)\n};\n\nDecorationSet.prototype.removeInner = function removeInner (decorations, offset) {\n var children = this.children, local = this.local;\n for (var i = 0; i < children.length; i += 3) {\n var found = (void 0), from = children[i] + offset, to = children[i + 1] + offset;\n for (var j = 0, span = (void 0); j < decorations.length; j++) { if (span = decorations[j]) {\n if (span.from > from && span.to < to) {\n decorations[j] = null\n ;(found || (found = [])).push(span);\n }\n } }\n if (!found) { continue }\n if (children == this.children) { children = this.children.slice(); }\n var removed = children[i + 2].removeInner(found, from + 1);\n if (removed != empty) {\n children[i + 2] = removed;\n } else {\n children.splice(i, 3);\n i -= 3;\n }\n }\n if (local.length) { for (var i$1 = 0, span$1 = (void 0); i$1 < decorations.length; i$1++) { if (span$1 = decorations[i$1]) {\n for (var j$1 = 0; j$1 < local.length; j$1++) { if (local[j$1].eq(span$1, offset)) {\n if (local == this.local) { local = this.local.slice(); }\n local.splice(j$1--, 1);\n } }\n } } }\n if (children == this.children && local == this.local) { return this }\n return local.length || children.length ? new DecorationSet(local, children) : empty\n};\n\nDecorationSet.prototype.forChild = function forChild (offset, node) {\n if (this == empty) { return this }\n if (node.isLeaf) { return DecorationSet.empty }\n\n var child, local;\n for (var i = 0; i < this.children.length; i += 3) { if (this.children[i] >= offset) {\n if (this.children[i] == offset) { child = this.children[i + 2]; }\n break\n } }\n var start = offset + 1, end = start + node.content.size;\n for (var i$1 = 0; i$1 < this.local.length; i$1++) {\n var dec = this.local[i$1];\n if (dec.from < end && dec.to > start && (dec.type instanceof InlineType)) {\n var from = Math.max(start, dec.from) - start, to = Math.min(end, dec.to) - start;\n if (from < to) { (local || (local = [])).push(dec.copy(from, to)); }\n }\n }\n if (local) {\n var localSet = new DecorationSet(local.sort(byPos));\n return child ? new DecorationGroup([localSet, child]) : localSet\n }\n return child || empty\n};\n\nDecorationSet.prototype.eq = function eq (other) {\n if (this == other) { return true }\n if (!(other instanceof DecorationSet) ||\n this.local.length != other.local.length ||\n this.children.length != other.children.length) { return false }\n for (var i = 0; i < this.local.length; i++)\n { if (!this.local[i].eq(other.local[i])) { return false } }\n for (var i$1 = 0; i$1 < this.children.length; i$1 += 3)\n { if (this.children[i$1] != other.children[i$1] ||\n this.children[i$1 + 1] != other.children[i$1 + 1] ||\n !this.children[i$1 + 2].eq(other.children[i$1 + 2])) { return false } }\n return true\n};\n\nDecorationSet.prototype.locals = function locals (node) {\n return removeOverlap(this.localsInner(node))\n};\n\nDecorationSet.prototype.localsInner = function localsInner (node) {\n if (this == empty) { return none }\n if (node.inlineContent || !this.local.some(InlineType.is)) { return this.local }\n var result = [];\n for (var i = 0; i < this.local.length; i++) {\n if (!(this.local[i].type instanceof InlineType))\n { result.push(this.local[i]); }\n }\n return result\n};\n\nvar empty = new DecorationSet();\n\n// :: DecorationSet\n// The empty set of decorations.\nDecorationSet.empty = empty;\n\nDecorationSet.removeOverlap = removeOverlap;\n\n// :- An abstraction that allows the code dealing with decorations to\n// treat multiple DecorationSet objects as if it were a single object\n// with (a subset of) the same interface.\nvar DecorationGroup = function DecorationGroup(members) {\n this.members = members;\n};\n\nDecorationGroup.prototype.forChild = function forChild (offset, child) {\n if (child.isLeaf) { return DecorationSet.empty }\n var found = [];\n for (var i = 0; i < this.members.length; i++) {\n var result = this.members[i].forChild(offset, child);\n if (result == empty) { continue }\n if (result instanceof DecorationGroup) { found = found.concat(result.members); }\n else { found.push(result); }\n }\n return DecorationGroup.from(found)\n};\n\nDecorationGroup.prototype.eq = function eq (other) {\n if (!(other instanceof DecorationGroup) ||\n other.members.length != this.members.length) { return false }\n for (var i = 0; i < this.members.length; i++)\n { if (!this.members[i].eq(other.members[i])) { return false } }\n return true\n};\n\nDecorationGroup.prototype.locals = function locals (node) {\n var result, sorted = true;\n for (var i = 0; i < this.members.length; i++) {\n var locals = this.members[i].localsInner(node);\n if (!locals.length) { continue }\n if (!result) {\n result = locals;\n } else {\n if (sorted) {\n result = result.slice();\n sorted = false;\n }\n for (var j = 0; j < locals.length; j++) { result.push(locals[j]); }\n }\n }\n return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none\n};\n\n// : ([DecorationSet]) → union\n// Create a group for the given array of decoration sets, or return\n// a single set when possible.\nDecorationGroup.from = function from (members) {\n switch (members.length) {\n case 0: return empty\n case 1: return members[0]\n default: return new DecorationGroup(members)\n }\n};\n\nfunction mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {\n var children = oldChildren.slice();\n\n // Mark the children that are directly touched by changes, and\n // move those that are after the changes.\n var shift = function (oldStart, oldEnd, newStart, newEnd) {\n for (var i = 0; i < children.length; i += 3) {\n var end = children[i + 1], dSize = (void 0);\n if (end == -1 || oldStart > end + oldOffset) { continue }\n if (oldEnd >= children[i] + oldOffset) {\n children[i + 1] = -1;\n } else if (newStart >= offset && (dSize = (newEnd - newStart) - (oldEnd - oldStart))) {\n children[i] += dSize;\n children[i + 1] += dSize;\n }\n }\n };\n for (var i = 0; i < mapping.maps.length; i++) { mapping.maps[i].forEach(shift); }\n\n // Find the child nodes that still correspond to a single node,\n // recursively call mapInner on them and update their positions.\n var mustRebuild = false;\n for (var i$1 = 0; i$1 < children.length; i$1 += 3) { if (children[i$1 + 1] == -1) { // Touched nodes\n var from = mapping.map(oldChildren[i$1] + oldOffset), fromLocal = from - offset;\n if (fromLocal < 0 || fromLocal >= node.content.size) {\n mustRebuild = true;\n continue\n }\n // Must read oldChildren because children was tagged with -1\n var to = mapping.map(oldChildren[i$1 + 1] + oldOffset, -1), toLocal = to - offset;\n var ref = node.content.findIndex(fromLocal);\n var index = ref.index;\n var childOffset = ref.offset;\n var childNode = node.maybeChild(index);\n if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) {\n var mapped = children[i$1 + 2].mapInner(mapping, childNode, from + 1, oldChildren[i$1] + oldOffset + 1, options);\n if (mapped != empty) {\n children[i$1] = fromLocal;\n children[i$1 + 1] = toLocal;\n children[i$1 + 2] = mapped;\n } else {\n children[i$1 + 1] = -2;\n mustRebuild = true;\n }\n } else {\n mustRebuild = true;\n }\n } }\n\n // Remaining children must be collected and rebuilt into the appropriate structure\n if (mustRebuild) {\n var decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal || [], mapping,\n offset, oldOffset, options);\n var built = buildTree(decorations, node, 0, options);\n newLocal = built.local;\n for (var i$2 = 0; i$2 < children.length; i$2 += 3) { if (children[i$2 + 1] < 0) {\n children.splice(i$2, 3);\n i$2 -= 3;\n } }\n for (var i$3 = 0, j = 0; i$3 < built.children.length; i$3 += 3) {\n var from$1 = built.children[i$3];\n while (j < children.length && children[j] < from$1) { j += 3; }\n children.splice(j, 0, built.children[i$3], built.children[i$3 + 1], built.children[i$3 + 2]);\n }\n }\n\n return new DecorationSet(newLocal && newLocal.sort(byPos), children)\n}\n\nfunction moveSpans(spans, offset) {\n if (!offset || !spans.length) { return spans }\n var result = [];\n for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n result.push(new Decoration(span.from + offset, span.to + offset, span.type));\n }\n return result\n}\n\nfunction mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset, oldOffset, options) {\n // Gather all decorations from the remaining marked children\n function gather(set, oldOffset) {\n for (var i = 0; i < set.local.length; i++) {\n var mapped = set.local[i].map(mapping, offset, oldOffset);\n if (mapped) { decorations.push(mapped); }\n else if (options.onRemove) { options.onRemove(set.local[i].spec); }\n }\n for (var i$1 = 0; i$1 < set.children.length; i$1 += 3)\n { gather(set.children[i$1 + 2], set.children[i$1] + oldOffset + 1); }\n }\n for (var i = 0; i < children.length; i += 3) { if (children[i + 1] == -1)\n { gather(children[i + 2], oldChildren[i] + oldOffset + 1); } }\n\n return decorations\n}\n\nfunction takeSpansForNode(spans, node, offset) {\n if (node.isLeaf) { return null }\n var end = offset + node.nodeSize, found = null;\n for (var i = 0, span = (void 0); i < spans.length; i++) {\n if ((span = spans[i]) && span.from > offset && span.to < end) {\n(found || (found = [])).push(span);\n spans[i] = null;\n }\n }\n return found\n}\n\nfunction withoutNulls(array) {\n var result = [];\n for (var i = 0; i < array.length; i++)\n { if (array[i] != null) { result.push(array[i]); } }\n return result\n}\n\n// : ([Decoration], Node, number) → DecorationSet\n// Build up a tree that corresponds to a set of decorations. `offset`\n// is a base offset that should be subtractet from the `from` and `to`\n// positions in the spans (so that we don't have to allocate new spans\n// for recursive calls).\nfunction buildTree(spans, node, offset, options) {\n var children = [], hasNulls = false;\n node.forEach(function (childNode, localStart) {\n var found = takeSpansForNode(spans, childNode, localStart + offset);\n if (found) {\n hasNulls = true;\n var subtree = buildTree(found, childNode, offset + localStart + 1, options);\n if (subtree != empty)\n { children.push(localStart, localStart + childNode.nodeSize, subtree); }\n }\n });\n var locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset).sort(byPos);\n for (var i = 0; i < locals.length; i++) { if (!locals[i].type.valid(node, locals[i])) {\n if (options.onRemove) { options.onRemove(locals[i].spec); }\n locals.splice(i--, 1);\n } }\n return locals.length || children.length ? new DecorationSet(locals, children) : empty\n}\n\n// : (Decoration, Decoration) → number\n// Used to sort decorations so that ones with a low start position\n// come first, and within a set with the same start position, those\n// with an smaller end position come first.\nfunction byPos(a, b) {\n return a.from - b.from || a.to - b.to\n}\n\n// : ([Decoration]) → [Decoration]\n// Scan a sorted array of decorations for partially overlapping spans,\n// and split those so that only fully overlapping spans are left (to\n// make subsequent rendering easier). Will return the input array if\n// no partially overlapping spans are found (the common case).\nfunction removeOverlap(spans) {\n var working = spans;\n for (var i = 0; i < working.length - 1; i++) {\n var span = working[i];\n if (span.from != span.to) { for (var j = i + 1; j < working.length; j++) {\n var next = working[j];\n if (next.from == span.from) {\n if (next.to != span.to) {\n if (working == spans) { working = spans.slice(); }\n // Followed by a partially overlapping larger span. Split that\n // span.\n working[j] = next.copy(next.from, span.to);\n insertAhead(working, j + 1, next.copy(span.to, next.to));\n }\n continue\n } else {\n if (next.from < span.to) {\n if (working == spans) { working = spans.slice(); }\n // The end of this one overlaps with a subsequent span. Split\n // this one.\n working[i] = span.copy(span.from, next.from);\n insertAhead(working, j, span.copy(next.from, span.to));\n }\n break\n }\n } }\n }\n return working\n}\n\nfunction insertAhead(array, i, deco) {\n while (i < array.length && byPos(deco, array[i]) > 0) { i++; }\n array.splice(i, 0, deco);\n}\n\n// : (EditorView) → union\n// Get the decorations associated with the current props of a view.\nfunction viewDecorations(view) {\n var found = [];\n view.someProp(\"decorations\", function (f) {\n var result = f(view.state);\n if (result && result != empty) { found.push(result); }\n });\n if (view.cursorWrapper)\n { found.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco])); }\n return DecorationGroup.from(found)\n}\n\n// ::- An editor view manages the DOM structure that represents an\n// editable document. Its state and behavior are determined by its\n// [props](#view.DirectEditorProps).\nvar EditorView = function EditorView(place, props) {\n this._props = props;\n // :: EditorState\n // The view's current [state](#state.EditorState).\n this.state = props.state;\n\n this.dispatch = this.dispatch.bind(this);\n\n this._root = null;\n this.focused = false;\n // Kludge used to work around a Chrome bug\n this.trackWrites = null;\n\n // :: dom.Element\n // An editable DOM node containing the document. (You probably\n // should not directly interfere with its content.)\n this.dom = (place && place.mount) || document.createElement(\"div\");\n if (place) {\n if (place.appendChild) { place.appendChild(this.dom); }\n else if (place.apply) { place(this.dom); }\n else if (place.mount) { this.mounted = true; }\n }\n\n // :: bool\n // Indicates whether the editor is currently [editable](#view.EditorProps.editable).\n this.editable = getEditable(this);\n this.markCursor = null;\n this.cursorWrapper = null;\n updateCursorWrapper(this);\n this.nodeViews = buildNodeViews(this);\n this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this);\n\n this.lastSelectedViewDesc = null;\n // :: ?{slice: Slice, move: bool}\n // When editor content is being dragged, this object contains\n // information about the dragged slice and whether it is being\n // copied or moved. At any other time, it is null.\n this.dragging = null;\n\n initInput(this);\n\n this.pluginViews = [];\n this.updatePluginViews();\n};\n\nvar prototypeAccessors$2 = { props: { configurable: true },root: { configurable: true } };\n\n// composing:: boolean\n// Holds `true` when a\n// [composition](https://developer.mozilla.org/en-US/docs/Mozilla/IME_handling_guide)\n// is active.\n\n// :: DirectEditorProps\n// The view's current [props](#view.EditorProps).\nprototypeAccessors$2.props.get = function () {\n if (this._props.state != this.state) {\n var prev = this._props;\n this._props = {};\n for (var name in prev) { this._props[name] = prev[name]; }\n this._props.state = this.state;\n }\n return this._props\n};\n\n// :: (DirectEditorProps)\n// Update the view's props. Will immediately cause an update to\n// the DOM.\nEditorView.prototype.update = function update (props) {\n if (props.handleDOMEvents != this._props.handleDOMEvents) { ensureListeners(this); }\n this._props = props;\n this.updateStateInner(props.state, true);\n};\n\n// :: (DirectEditorProps)\n// Update the view by updating existing props object with the object\n// given as argument. Equivalent to `view.update(Object.assign({},\n// view.props, props))`.\nEditorView.prototype.setProps = function setProps (props) {\n var updated = {};\n for (var name in this._props) { updated[name] = this._props[name]; }\n updated.state = this.state;\n for (var name$1 in props) { updated[name$1] = props[name$1]; }\n this.update(updated);\n};\n\n// :: (EditorState)\n// Update the editor's `state` prop, without touching any of the\n// other props.\nEditorView.prototype.updateState = function updateState (state) {\n this.updateStateInner(state, this.state.plugins != state.plugins);\n};\n\nEditorView.prototype.updateStateInner = function updateStateInner (state, reconfigured) {\n var this$1 = this;\n\n var prev = this.state, redraw = false, updateSel = false;\n // When stored marks are added, stop composition, so that they can\n // be displayed.\n if (state.storedMarks && this.composing) {\n clearComposition(this);\n updateSel = true;\n }\n this.state = state;\n if (reconfigured) {\n var nodeViews = buildNodeViews(this);\n if (changedNodeViews(nodeViews, this.nodeViews)) {\n this.nodeViews = nodeViews;\n redraw = true;\n }\n ensureListeners(this);\n }\n\n this.editable = getEditable(this);\n updateCursorWrapper(this);\n var innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this);\n\n var scroll = reconfigured ? \"reset\"\n : state.scrollToSelection > prev.scrollToSelection ? \"to selection\" : \"preserve\";\n var updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco);\n if (updateDoc || !state.selection.eq(prev.selection)) { updateSel = true; }\n var oldScrollPos = scroll == \"preserve\" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this);\n\n if (updateSel) {\n this.domObserver.stop();\n // Work around an issue in Chrome, IE, and Edge where changing\n // the DOM around an active selection puts it into a broken\n // state where the thing the user sees differs from the\n // selection reported by the Selection object (#710, #973,\n // #1011, #1013, #1035).\n var forceSelUpdate = updateDoc && (result.ie || result.chrome) && !this.composing &&\n !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection);\n if (updateDoc) {\n // If the node that the selection points into is written to,\n // Chrome sometimes starts misreporting the selection, so this\n // tracks that and forces a selection reset when our update\n // did write to the node.\n var chromeKludge = result.chrome ? (this.trackWrites = this.root.getSelection().focusNode) : null;\n if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) {\n this.docView.updateOuterDeco([]);\n this.docView.destroy();\n this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this);\n }\n if (chromeKludge && !this.trackWrites) { forceSelUpdate = true; }\n }\n // Work around for an issue where an update arriving right between\n // a DOM selection change and the \"selectionchange\" event for it\n // can cause a spurious DOM selection update, disrupting mouse\n // drag selection.\n if (forceSelUpdate ||\n !(this.mouseDown && this.domObserver.currentSelection.eq(this.root.getSelection()) && anchorInRightPlace(this))) {\n selectionToDOM(this, forceSelUpdate);\n } else {\n syncNodeSelection(this, state.selection);\n this.domObserver.setCurSelection();\n }\n this.domObserver.start();\n }\n\n this.updatePluginViews(prev);\n\n if (scroll == \"reset\") {\n this.dom.scrollTop = 0;\n } else if (scroll == \"to selection\") {\n var startDOM = this.root.getSelection().focusNode;\n if (this.someProp(\"handleScrollToSelection\", function (f) { return f(this$1); }))\n ; // Handled\n else if (state.selection instanceof NodeSelection)\n { scrollRectIntoView(this, this.docView.domAfterPos(state.selection.from).getBoundingClientRect(), startDOM); }\n else\n { scrollRectIntoView(this, this.coordsAtPos(state.selection.head, 1), startDOM); }\n } else if (oldScrollPos) {\n resetScrollPos(oldScrollPos);\n }\n};\n\nEditorView.prototype.destroyPluginViews = function destroyPluginViews () {\n var view;\n while (view = this.pluginViews.pop()) { if (view.destroy) { view.destroy(); } }\n};\n\nEditorView.prototype.updatePluginViews = function updatePluginViews (prevState) {\n if (!prevState || prevState.plugins != this.state.plugins) {\n this.destroyPluginViews();\n for (var i = 0; i < this.state.plugins.length; i++) {\n var plugin = this.state.plugins[i];\n if (plugin.spec.view) { this.pluginViews.push(plugin.spec.view(this)); }\n }\n } else {\n for (var i$1 = 0; i$1 < this.pluginViews.length; i$1++) {\n var pluginView = this.pluginViews[i$1];\n if (pluginView.update) { pluginView.update(this, prevState); }\n }\n }\n};\n\n// :: (string, ?(prop: *) → *) → *\n// Goes over the values of a prop, first those provided directly,\n// then those from plugins (in order), and calls `f` every time a\n// non-undefined value is found. When `f` returns a truthy value,\n// that is immediately returned. When `f` isn't provided, it is\n// treated as the identity function (the prop value is returned\n// directly).\nEditorView.prototype.someProp = function someProp (propName, f) {\n var prop = this._props && this._props[propName], value;\n if (prop != null && (value = f ? f(prop) : prop)) { return value }\n var plugins = this.state.plugins;\n if (plugins) { for (var i = 0; i < plugins.length; i++) {\n var prop$1 = plugins[i].props[propName];\n if (prop$1 != null && (value = f ? f(prop$1) : prop$1)) { return value }\n } }\n};\n\n// :: () → bool\n// Query whether the view has focus.\nEditorView.prototype.hasFocus = function hasFocus () {\n return this.root.activeElement == this.dom\n};\n\n// :: ()\n// Focus the editor.\nEditorView.prototype.focus = function focus () {\n this.domObserver.stop();\n if (this.editable) { focusPreventScroll(this.dom); }\n selectionToDOM(this);\n this.domObserver.start();\n};\n\n// :: union\n// Get the document root in which the editor exists. This will\n// usually be the top-level `document`, but might be a [shadow\n// DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM)\n// root if the editor is inside one.\nprototypeAccessors$2.root.get = function () {\n var cached = this._root;\n if (cached == null) { for (var search = this.dom.parentNode; search; search = search.parentNode) {\n if (search.nodeType == 9 || (search.nodeType == 11 && search.host)) {\n if (!search.getSelection) { Object.getPrototypeOf(search).getSelection = function () { return document.getSelection(); }; }\n return this._root = search\n }\n } }\n return cached || document\n};\n\n// :: ({left: number, top: number}) → ?{pos: number, inside: number}\n// Given a pair of viewport coordinates, return the document\n// position that corresponds to them. May return null if the given\n// coordinates aren't inside of the editor. When an object is\n// returned, its `pos` property is the position nearest to the\n// coordinates, and its `inside` property holds the position of the\n// inner node that the position falls inside of, or -1 if it is at\n// the top level, not in any node.\nEditorView.prototype.posAtCoords = function posAtCoords$1 (coords) {\n return posAtCoords(this, coords)\n};\n\n// :: (number, number) → {left: number, right: number, top: number, bottom: number}\n// Returns the viewport rectangle at a given document position.\n// `left` and `right` will be the same number, as this returns a\n// flat cursor-ish rectangle. If the position is between two things\n// that aren't directly adjacent, `side` determines which element is\n// used. When < 0, the element before the position is used,\n// otherwise the element after.\nEditorView.prototype.coordsAtPos = function coordsAtPos$1 (pos, side) {\n if ( side === void 0 ) side = 1;\n\n return coordsAtPos(this, pos, side)\n};\n\n// :: (number, number) → {node: dom.Node, offset: number}\n// Find the DOM position that corresponds to the given document\n// position. When `side` is negative, find the position as close as\n// possible to the content before the position. When positive,\n// prefer positions close to the content after the position. When\n// zero, prefer as shallow a position as possible.\n//\n// Note that you should **not** mutate the editor's internal DOM,\n// only inspect it (and even that is usually not necessary).\nEditorView.prototype.domAtPos = function domAtPos (pos, side) {\n if ( side === void 0 ) side = 0;\n\n return this.docView.domFromPos(pos, side)\n};\n\n// :: (number) → ?dom.Node\n// Find the DOM node that represents the document node after the\n// given position. May return `null` when the position doesn't point\n// in front of a node or if the node is inside an opaque node view.\n//\n// This is intended to be able to call things like\n// `getBoundingClientRect` on that DOM node. Do **not** mutate the\n// editor DOM directly, or add styling this way, since that will be\n// immediately overriden by the editor as it redraws the node.\nEditorView.prototype.nodeDOM = function nodeDOM (pos) {\n var desc = this.docView.descAt(pos);\n return desc ? desc.nodeDOM : null\n};\n\n// :: (dom.Node, number, ?number) → number\n// Find the document position that corresponds to a given DOM\n// position. (Whenever possible, it is preferable to inspect the\n// document structure directly, rather than poking around in the\n// DOM, but sometimes—for example when interpreting an event\n// target—you don't have a choice.)\n//\n// The `bias` parameter can be used to influence which side of a DOM\n// node to use when the position is inside a leaf node.\nEditorView.prototype.posAtDOM = function posAtDOM (node, offset, bias) {\n if ( bias === void 0 ) bias = -1;\n\n var pos = this.docView.posFromDOM(node, offset, bias);\n if (pos == null) { throw new RangeError(\"DOM position not inside the editor\") }\n return pos\n};\n\n// :: (union<\"up\", \"down\", \"left\", \"right\", \"forward\", \"backward\">, ?EditorState) → bool\n// Find out whether the selection is at the end of a textblock when\n// moving in a given direction. When, for example, given `\"left\"`,\n// it will return true if moving left from the current cursor\n// position would leave that position's parent textblock. Will apply\n// to the view's current state by default, but it is possible to\n// pass a different state.\nEditorView.prototype.endOfTextblock = function endOfTextblock$1 (dir, state) {\n return endOfTextblock(this, state || this.state, dir)\n};\n\n// :: ()\n// Removes the editor from the DOM and destroys all [node\n// views](#view.NodeView).\nEditorView.prototype.destroy = function destroy () {\n if (!this.docView) { return }\n destroyInput(this);\n this.destroyPluginViews();\n if (this.mounted) {\n this.docView.update(this.state.doc, [], viewDecorations(this), this);\n this.dom.textContent = \"\";\n } else if (this.dom.parentNode) {\n this.dom.parentNode.removeChild(this.dom);\n }\n this.docView.destroy();\n this.docView = null;\n};\n\n// Used for testing.\nEditorView.prototype.dispatchEvent = function dispatchEvent$1 (event) {\n return dispatchEvent(this, event)\n};\n\n// :: (Transaction)\n// Dispatch a transaction. Will call\n// [`dispatchTransaction`](#view.DirectEditorProps.dispatchTransaction)\n// when given, and otherwise defaults to applying the transaction to\n// the current state and calling\n// [`updateState`](#view.EditorView.updateState) with the result.\n// This method is bound to the view instance, so that it can be\n// easily passed around.\nEditorView.prototype.dispatch = function dispatch (tr) {\n var dispatchTransaction = this._props.dispatchTransaction;\n if (dispatchTransaction) { dispatchTransaction.call(this, tr); }\n else { this.updateState(this.state.apply(tr)); }\n};\n\nObject.defineProperties( EditorView.prototype, prototypeAccessors$2 );\n\nfunction computeDocDeco(view) {\n var attrs = Object.create(null);\n attrs.class = \"ProseMirror\";\n attrs.contenteditable = String(view.editable);\n\n view.someProp(\"attributes\", function (value) {\n if (typeof value == \"function\") { value = value(view.state); }\n if (value) { for (var attr in value) {\n if (attr == \"class\")\n { attrs.class += \" \" + value[attr]; }\n else if (!attrs[attr] && attr != \"contenteditable\" && attr != \"nodeName\")\n { attrs[attr] = String(value[attr]); }\n } }\n });\n\n return [Decoration.node(0, view.state.doc.content.size, attrs)]\n}\n\nfunction updateCursorWrapper(view) {\n if (view.markCursor) {\n var dom = document.createElement(\"img\");\n dom.setAttribute(\"mark-placeholder\", \"true\");\n view.cursorWrapper = {dom: dom, deco: Decoration.widget(view.state.selection.head, dom, {raw: true, marks: view.markCursor})};\n } else {\n view.cursorWrapper = null;\n }\n}\n\nfunction getEditable(view) {\n return !view.someProp(\"editable\", function (value) { return value(view.state) === false; })\n}\n\nfunction selectionContextChanged(sel1, sel2) {\n var depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head));\n return sel1.$anchor.start(depth) != sel2.$anchor.start(depth)\n}\n\nfunction buildNodeViews(view) {\n var result = {};\n view.someProp(\"nodeViews\", function (obj) {\n for (var prop in obj) { if (!Object.prototype.hasOwnProperty.call(result, prop))\n { result[prop] = obj[prop]; } }\n });\n return result\n}\n\nfunction changedNodeViews(a, b) {\n var nA = 0, nB = 0;\n for (var prop in a) {\n if (a[prop] != b[prop]) { return true }\n nA++;\n }\n for (var _ in b) { nB++; }\n return nA != nB\n}\n\n// EditorProps:: interface\n//\n// Props are configuration values that can be passed to an editor view\n// or included in a plugin. This interface lists the supported props.\n//\n// The various event-handling functions may all return `true` to\n// indicate that they handled the given event. The view will then take\n// care to call `preventDefault` on the event, except with\n// `handleDOMEvents`, where the handler itself is responsible for that.\n//\n// How a prop is resolved depends on the prop. Handler functions are\n// called one at a time, starting with the base props and then\n// searching through the plugins (in order of appearance) until one of\n// them returns true. For some props, the first plugin that yields a\n// value gets precedence.\n//\n// handleDOMEvents:: ?Object<(view: EditorView, event: dom.Event) → bool>\n// Can be an object mapping DOM event type names to functions that\n// handle them. Such functions will be called before any handling\n// ProseMirror does of events fired on the editable DOM element.\n// Contrary to the other event handling props, when returning true\n// from such a function, you are responsible for calling\n// `preventDefault` yourself (or not, if you want to allow the\n// default behavior).\n//\n// handleKeyDown:: ?(view: EditorView, event: dom.KeyboardEvent) → bool\n// Called when the editor receives a `keydown` event.\n//\n// handleKeyPress:: ?(view: EditorView, event: dom.KeyboardEvent) → bool\n// Handler for `keypress` events.\n//\n// handleTextInput:: ?(view: EditorView, from: number, to: number, text: string) → bool\n// Whenever the user directly input text, this handler is called\n// before the input is applied. If it returns `true`, the default\n// behavior of actually inserting the text is suppressed.\n//\n// handleClickOn:: ?(view: EditorView, pos: number, node: Node, nodePos: number, event: dom.MouseEvent, direct: bool) → bool\n// Called for each node around a click, from the inside out. The\n// `direct` flag will be true for the inner node.\n//\n// handleClick:: ?(view: EditorView, pos: number, event: dom.MouseEvent) → bool\n// Called when the editor is clicked, after `handleClickOn` handlers\n// have been called.\n//\n// handleDoubleClickOn:: ?(view: EditorView, pos: number, node: Node, nodePos: number, event: dom.MouseEvent, direct: bool) → bool\n// Called for each node around a double click.\n//\n// handleDoubleClick:: ?(view: EditorView, pos: number, event: dom.MouseEvent) → bool\n// Called when the editor is double-clicked, after `handleDoubleClickOn`.\n//\n// handleTripleClickOn:: ?(view: EditorView, pos: number, node: Node, nodePos: number, event: dom.MouseEvent, direct: bool) → bool\n// Called for each node around a triple click.\n//\n// handleTripleClick:: ?(view: EditorView, pos: number, event: dom.MouseEvent) → bool\n// Called when the editor is triple-clicked, after `handleTripleClickOn`.\n//\n// handlePaste:: ?(view: EditorView, event: dom.ClipboardEvent, slice: Slice) → bool\n// Can be used to override the behavior of pasting. `slice` is the\n// pasted content parsed by the editor, but you can directly access\n// the event to get at the raw content.\n//\n// handleDrop:: ?(view: EditorView, event: dom.Event, slice: Slice, moved: bool) → bool\n// Called when something is dropped on the editor. `moved` will be\n// true if this drop moves from the current selection (which should\n// thus be deleted).\n//\n// handleScrollToSelection:: ?(view: EditorView) → bool\n// Called when the view, after updating its state, tries to scroll\n// the selection into view. A handler function may return false to\n// indicate that it did not handle the scrolling and further\n// handlers or the default behavior should be tried.\n//\n// createSelectionBetween:: ?(view: EditorView, anchor: ResolvedPos, head: ResolvedPos) → ?Selection\n// Can be used to override the way a selection is created when\n// reading a DOM selection between the given anchor and head.\n//\n// domParser:: ?DOMParser\n// The [parser](#model.DOMParser) to use when reading editor changes\n// from the DOM. Defaults to calling\n// [`DOMParser.fromSchema`](#model.DOMParser^fromSchema) on the\n// editor's schema.\n//\n// transformPastedHTML:: ?(html: string) → string\n// Can be used to transform pasted HTML text, _before_ it is parsed,\n// for example to clean it up.\n//\n// clipboardParser:: ?DOMParser\n// The [parser](#model.DOMParser) to use when reading content from\n// the clipboard. When not given, the value of the\n// [`domParser`](#view.EditorProps.domParser) prop is used.\n//\n// transformPastedText:: ?(text: string, plain: bool) → string\n// Transform pasted plain text. The `plain` flag will be true when\n// the text is pasted as plain text.\n//\n// clipboardTextParser:: ?(text: string, $context: ResolvedPos, plain: bool) → Slice\n// A function to parse text from the clipboard into a document\n// slice. Called after\n// [`transformPastedText`](#view.EditorProps.transformPastedText).\n// The default behavior is to split the text into lines, wrap them\n// in `

                  ` tags, and call\n// [`clipboardParser`](#view.EditorProps.clipboardParser) on it.\n// The `plain` flag will be true when the text is pasted as plain text.\n//\n// transformPasted:: ?(Slice) → Slice\n// Can be used to transform pasted content before it is applied to\n// the document.\n//\n// nodeViews:: ?Object<(node: Node, view: EditorView, getPos: () → number, decorations: [Decoration]) → NodeView>\n// Allows you to pass custom rendering and behavior logic for nodes\n// and marks. Should map node and mark names to constructor\n// functions that produce a [`NodeView`](#view.NodeView) object\n// implementing the node's display behavior. For nodes, the third\n// argument `getPos` is a function that can be called to get the\n// node's current position, which can be useful when creating\n// transactions to update it. For marks, the third argument is a\n// boolean that indicates whether the mark's content is inline.\n//\n// `decorations` is an array of node or inline decorations that are\n// active around the node. They are automatically drawn in the\n// normal way, and you will usually just want to ignore this, but\n// they can also be used as a way to provide context information to\n// the node view without adding it to the document itself.\n//\n// clipboardSerializer:: ?DOMSerializer\n// The DOM serializer to use when putting content onto the\n// clipboard. If not given, the result of\n// [`DOMSerializer.fromSchema`](#model.DOMSerializer^fromSchema)\n// will be used.\n//\n// clipboardTextSerializer:: ?(Slice) → string\n// A function that will be called to get the text for the current\n// selection when copying text to the clipboard. By default, the\n// editor will use [`textBetween`](#model.Node.textBetween) on the\n// selected range.\n//\n// decorations:: ?(state: EditorState) → ?DecorationSet\n// A set of [document decorations](#view.Decoration) to show in the\n// view.\n//\n// editable:: ?(state: EditorState) → bool\n// When this returns false, the content of the view is not directly\n// editable.\n//\n// attributes:: ?union, (EditorState) → ?Object>\n// Control the DOM attributes of the editable element. May be either\n// an object or a function going from an editor state to an object.\n// By default, the element will get a class `\"ProseMirror\"`, and\n// will have its `contentEditable` attribute determined by the\n// [`editable` prop](#view.EditorProps.editable). Additional classes\n// provided here will be added to the class. For other attributes,\n// the value provided first (as in\n// [`someProp`](#view.EditorView.someProp)) will be used.\n//\n// scrollThreshold:: ?union\n// Determines the distance (in pixels) between the cursor and the\n// end of the visible viewport at which point, when scrolling the\n// cursor into view, scrolling takes place. Defaults to 0.\n//\n// scrollMargin:: ?union\n// Determines the extra space (in pixels) that is left above or\n// below the cursor when it is scrolled into view. Defaults to 5.\n\n// DirectEditorProps:: interface extends EditorProps\n//\n// The props object given directly to the editor view supports two\n// fields that can't be used in plugins:\n//\n// state:: EditorState\n// The current state of the editor.\n//\n// dispatchTransaction:: ?(tr: Transaction)\n// The callback over which to send transactions (state updates)\n// produced by the view. If you specify this, you probably want to\n// make sure this ends up calling the view's\n// [`updateState`](#view.EditorView.updateState) method with a new\n// state that has the transaction\n// [applied](#state.EditorState.apply). The callback will be bound to have\n// the view instance as its `this` binding.\n\nexport { Decoration, DecorationSet, EditorView, endComposition as __endComposition, parseFromClipboard as __parseFromClipboard, serializeForClipboard as __serializeForClipboard };\n//# sourceMappingURL=index.es.js.map\n","import { Plugin } from 'prosemirror-state';\nimport { dropPoint } from 'prosemirror-transform';\n\n// :: (options: ?Object) → Plugin\n// Create a plugin that, when added to a ProseMirror instance,\n// causes a decoration to show up at the drop position when something\n// is dragged over the editor.\n//\n// options::- These options are supported:\n//\n// color:: ?string\n// The color of the cursor. Defaults to `black`.\n//\n// width:: ?number\n// The precise width of the cursor in pixels. Defaults to 1.\n//\n// class:: ?string\n// A CSS class name to add to the cursor element.\nfunction dropCursor(options) {\n if ( options === void 0 ) options = {};\n\n return new Plugin({\n view: function view(editorView) { return new DropCursorView(editorView, options) }\n })\n}\n\nvar DropCursorView = function DropCursorView(editorView, options) {\n var this$1 = this;\n\n this.editorView = editorView;\n this.width = options.width || 1;\n this.color = options.color || \"black\";\n this.class = options.class;\n this.cursorPos = null;\n this.element = null;\n this.timeout = null;\n\n this.handlers = [\"dragover\", \"dragend\", \"drop\", \"dragleave\"].map(function (name) {\n var handler = function (e) { return this$1[name](e); };\n editorView.dom.addEventListener(name, handler);\n return {name: name, handler: handler}\n });\n};\n\nDropCursorView.prototype.destroy = function destroy () {\n var this$1 = this;\n\n this.handlers.forEach(function (ref) {\n var name = ref.name;\n var handler = ref.handler;\n\n return this$1.editorView.dom.removeEventListener(name, handler);\n });\n};\n\nDropCursorView.prototype.update = function update (editorView, prevState) {\n if (this.cursorPos != null && prevState.doc != editorView.state.doc) { this.updateOverlay(); }\n};\n\nDropCursorView.prototype.setCursor = function setCursor (pos) {\n if (pos == this.cursorPos) { return }\n this.cursorPos = pos;\n if (pos == null) {\n this.element.parentNode.removeChild(this.element);\n this.element = null;\n } else {\n this.updateOverlay();\n }\n};\n\nDropCursorView.prototype.updateOverlay = function updateOverlay () {\n var $pos = this.editorView.state.doc.resolve(this.cursorPos), rect;\n if (!$pos.parent.inlineContent) {\n var before = $pos.nodeBefore, after = $pos.nodeAfter;\n if (before || after) {\n var nodeRect = this.editorView.nodeDOM(this.cursorPos - (before ?before.nodeSize : 0)).getBoundingClientRect();\n var top = before ? nodeRect.bottom : nodeRect.top;\n if (before && after)\n { top = (top + this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top) / 2; }\n rect = {left: nodeRect.left, right: nodeRect.right, top: top - this.width / 2, bottom: top + this.width / 2};\n }\n }\n if (!rect) {\n var coords = this.editorView.coordsAtPos(this.cursorPos);\n rect = {left: coords.left - this.width / 2, right: coords.left + this.width / 2, top: coords.top, bottom: coords.bottom};\n }\n\n var parent = this.editorView.dom.offsetParent;\n if (!this.element) {\n this.element = parent.appendChild(document.createElement(\"div\"));\n if (this.class) { this.element.className = this.class; }\n this.element.style.cssText = \"position: absolute; z-index: 50; pointer-events: none; background-color: \" + this.color;\n }\n var parentLeft, parentTop;\n if (!parent || parent == document.body && getComputedStyle(parent).position == \"static\") {\n parentLeft = -pageXOffset;\n parentTop = -pageYOffset;\n } else {\n var rect$1 = parent.getBoundingClientRect();\n parentLeft = rect$1.left - parent.scrollLeft;\n parentTop = rect$1.top - parent.scrollTop;\n }\n this.element.style.left = (rect.left - parentLeft) + \"px\";\n this.element.style.top = (rect.top - parentTop) + \"px\";\n this.element.style.width = (rect.right - rect.left) + \"px\";\n this.element.style.height = (rect.bottom - rect.top) + \"px\";\n};\n\nDropCursorView.prototype.scheduleRemoval = function scheduleRemoval (timeout) {\n var this$1 = this;\n\n clearTimeout(this.timeout);\n this.timeout = setTimeout(function () { return this$1.setCursor(null); }, timeout);\n};\n\nDropCursorView.prototype.dragover = function dragover (event) {\n if (!this.editorView.editable) { return }\n var pos = this.editorView.posAtCoords({left: event.clientX, top: event.clientY});\n if (pos) {\n var target = pos.pos;\n if (this.editorView.dragging && this.editorView.dragging.slice) {\n target = dropPoint(this.editorView.state.doc, target, this.editorView.dragging.slice);\n if (target == null) { target = pos.pos; }\n }\n this.setCursor(target);\n this.scheduleRemoval(5000);\n }\n};\n\nDropCursorView.prototype.dragend = function dragend () {\n this.scheduleRemoval(20);\n};\n\nDropCursorView.prototype.drop = function drop () {\n this.scheduleRemoval(20);\n};\n\nDropCursorView.prototype.dragleave = function dragleave (event) {\n if (event.target == this.editorView.dom || !this.editorView.dom.contains(event.relatedTarget))\n { this.setCursor(null); }\n};\n\nexport { dropCursor };\n//# sourceMappingURL=index.es.js.map\n","import { keydownHandler } from 'prosemirror-keymap';\nimport { NodeSelection, Selection, Plugin, TextSelection } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Slice } from 'prosemirror-model';\n\n// ::- Gap cursor selections are represented using this class. Its\n// `$anchor` and `$head` properties both point at the cursor position.\nvar GapCursor = /*@__PURE__*/(function (Selection) {\n function GapCursor($pos) {\n Selection.call(this, $pos, $pos);\n }\n\n if ( Selection ) GapCursor.__proto__ = Selection;\n GapCursor.prototype = Object.create( Selection && Selection.prototype );\n GapCursor.prototype.constructor = GapCursor;\n\n GapCursor.prototype.map = function map (doc, mapping) {\n var $pos = doc.resolve(mapping.map(this.head));\n return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos)\n };\n\n GapCursor.prototype.content = function content () { return Slice.empty };\n\n GapCursor.prototype.eq = function eq (other) {\n return other instanceof GapCursor && other.head == this.head\n };\n\n GapCursor.prototype.toJSON = function toJSON () {\n return {type: \"gapcursor\", pos: this.head}\n };\n\n GapCursor.fromJSON = function fromJSON (doc, json) {\n if (typeof json.pos != \"number\") { throw new RangeError(\"Invalid input for GapCursor.fromJSON\") }\n return new GapCursor(doc.resolve(json.pos))\n };\n\n GapCursor.prototype.getBookmark = function getBookmark () { return new GapBookmark(this.anchor) };\n\n GapCursor.valid = function valid ($pos) {\n var parent = $pos.parent;\n if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos)) { return false }\n var override = parent.type.spec.allowGapCursor;\n if (override != null) { return override }\n var deflt = parent.contentMatchAt($pos.index()).defaultType;\n return deflt && deflt.isTextblock\n };\n\n GapCursor.findFrom = function findFrom ($pos, dir, mustMove) {\n search: for (;;) {\n if (!mustMove && GapCursor.valid($pos)) { return $pos }\n var pos = $pos.pos, next = null;\n // Scan up from this position\n for (var d = $pos.depth;; d--) {\n var parent = $pos.node(d);\n if (dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0) {\n next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1);\n break\n } else if (d == 0) {\n return null\n }\n pos += dir;\n var $cur = $pos.doc.resolve(pos);\n if (GapCursor.valid($cur)) { return $cur }\n }\n\n // And then down into the next node\n for (;;) {\n var inside = dir > 0 ? next.firstChild : next.lastChild;\n if (!inside) {\n if (next.isAtom && !next.isText && !NodeSelection.isSelectable(next)) {\n $pos = $pos.doc.resolve(pos + next.nodeSize * dir);\n mustMove = false;\n continue search\n }\n break\n }\n next = inside;\n pos += dir;\n var $cur$1 = $pos.doc.resolve(pos);\n if (GapCursor.valid($cur$1)) { return $cur$1 }\n }\n\n return null\n }\n };\n\n return GapCursor;\n}(Selection));\n\nGapCursor.prototype.visible = false;\n\nSelection.jsonID(\"gapcursor\", GapCursor);\n\nvar GapBookmark = function GapBookmark(pos) {\n this.pos = pos;\n};\nGapBookmark.prototype.map = function map (mapping) {\n return new GapBookmark(mapping.map(this.pos))\n};\nGapBookmark.prototype.resolve = function resolve (doc) {\n var $pos = doc.resolve(this.pos);\n return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos)\n};\n\nfunction closedBefore($pos) {\n for (var d = $pos.depth; d >= 0; d--) {\n var index = $pos.index(d);\n // At the start of this parent, look at next one\n if (index == 0) { continue }\n // See if the node before (or its first ancestor) is closed\n for (var before = $pos.node(d).child(index - 1);; before = before.lastChild) {\n if ((before.childCount == 0 && !before.inlineContent) || before.isAtom || before.type.spec.isolating) { return true }\n if (before.inlineContent) { return false }\n }\n }\n // Hit start of document\n return true\n}\n\nfunction closedAfter($pos) {\n for (var d = $pos.depth; d >= 0; d--) {\n var index = $pos.indexAfter(d), parent = $pos.node(d);\n if (index == parent.childCount) { continue }\n for (var after = parent.child(index);; after = after.firstChild) {\n if ((after.childCount == 0 && !after.inlineContent) || after.isAtom || after.type.spec.isolating) { return true }\n if (after.inlineContent) { return false }\n }\n }\n return true\n}\n\n// :: () → Plugin\n// Create a gap cursor plugin. When enabled, this will capture clicks\n// near and arrow-key-motion past places that don't have a normally\n// selectable position nearby, and create a gap cursor selection for\n// them. The cursor is drawn as an element with class\n// `ProseMirror-gapcursor`. You can either include\n// `style/gapcursor.css` from the package's directory or add your own\n// styles to make it visible.\nvar gapCursor = function() {\n return new Plugin({\n props: {\n decorations: drawGapCursor,\n\n createSelectionBetween: function createSelectionBetween(_view, $anchor, $head) {\n if ($anchor.pos == $head.pos && GapCursor.valid($head)) { return new GapCursor($head) }\n },\n\n handleClick: handleClick,\n handleKeyDown: handleKeyDown\n }\n })\n};\n\nvar handleKeyDown = keydownHandler({\n \"ArrowLeft\": arrow(\"horiz\", -1),\n \"ArrowRight\": arrow(\"horiz\", 1),\n \"ArrowUp\": arrow(\"vert\", -1),\n \"ArrowDown\": arrow(\"vert\", 1)\n});\n\nfunction arrow(axis, dir) {\n var dirStr = axis == \"vert\" ? (dir > 0 ? \"down\" : \"up\") : (dir > 0 ? \"right\" : \"left\");\n return function(state, dispatch, view) {\n var sel = state.selection;\n var $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty;\n if (sel instanceof TextSelection) {\n if (!view.endOfTextblock(dirStr) || $start.depth == 0) { return false }\n mustMove = false;\n $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before());\n }\n var $found = GapCursor.findFrom($start, dir, mustMove);\n if (!$found) { return false }\n if (dispatch) { dispatch(state.tr.setSelection(new GapCursor($found))); }\n return true\n }\n}\n\nfunction handleClick(view, pos, event) {\n if (!view.editable) { return false }\n var $pos = view.state.doc.resolve(pos);\n if (!GapCursor.valid($pos)) { return false }\n var ref = view.posAtCoords({left: event.clientX, top: event.clientY});\n var inside = ref.inside;\n if (inside > -1 && NodeSelection.isSelectable(view.state.doc.nodeAt(inside))) { return false }\n view.dispatch(view.state.tr.setSelection(new GapCursor($pos)));\n return true\n}\n\nfunction drawGapCursor(state) {\n if (!(state.selection instanceof GapCursor)) { return null }\n var node = document.createElement(\"div\");\n node.className = \"ProseMirror-gapcursor\";\n return DecorationSet.create(state.doc, [Decoration.widget(state.selection.head, node, {key: \"gapcursor\"})])\n}\n\nexport { GapCursor, gapCursor };\n//# sourceMappingURL=index.es.js.map\n","import { Plugin } from 'prosemirror-state';\n\n// From https://gist.github.com/khanzadimahdi/bab8a3416bdb764b9eda5b38b35735b8\nconst dataImageRegex = /^data:((?:\\w+\\/(?:(?!;).)+)?)((?:;[\\w\\W]*?[^;])*),(.+)$/;\n\nlet parser = new DOMParser();\n\nexport default function disableBase64PastePlugin() {\n return new Plugin({\n props: {\n transformPastedHTML(html) {\n const doc = parser.parseFromString(html, 'text/html');\n doc.querySelectorAll('img').forEach((node) => {\n if (dataImageRegex.test(node.src)) {\n node.remove();\n }\n });\n\n return doc.documentElement.outerHTML;\n },\n },\n });\n}\n","import { Plugin } from 'prosemirror-state';\n\nfunction onClick(schema) {\n return (view, pos, node, nodePos, event, direct) => {\n if (direct && node.type === schema.nodes.spoiler && event.target.tagName !== 'P') {\n // TODO: Figure out why this dispatch event isn't working.\n // Mutating the node directly isn't good practice.\n // view.dispatch(\n // view.state.tr.setNodeMarkup(pos, null, { open: false })\n // );\n node.attrs.open = !node.attrs.open;\n view.focus();\n event.stopPropagation();\n event.preventDefault();\n return false;\n }\n };\n}\n\nexport default function toggleSpoiler(schema) {\n return new Plugin({\n props: {\n handleClickOn: onClick(schema),\n handleDoubleClickOn: onClick(schema),\n },\n });\n}\n","import { inputRules, wrappingInputRule, textblockTypeInputRule, emDash, ellipsis } from 'prosemirror-inputrules';\nimport { markInputRule, nodeInputRule } from 'tiptap-commands';\n\n// Copied from https://github.com/ProseMirror/prosemirror-example-setup/blob/master/src/inputrules.js\n\nfunction blockQuoteRule(nodeType) {\n return wrappingInputRule(/^\\s*>\\s$/, nodeType);\n}\n\nfunction orderedListRule(nodeType) {\n return wrappingInputRule(\n /^(\\d+)(\\.|\\))\\s$/,\n nodeType,\n (match) => ({ order: +match[1] }),\n (match, node) => node.childCount + node.attrs.order == +match[1]\n );\n}\n\nfunction bulletListRule(nodeType) {\n return wrappingInputRule(/^\\s*([-+*])\\s$/, nodeType);\n}\n\nfunction codeBlockRule(nodeType) {\n return textblockTypeInputRule(/^```$/, nodeType);\n}\n\nfunction headingRule(nodeType, maxLevel) {\n return textblockTypeInputRule(new RegExp('^(#{1,' + maxLevel + '})\\\\s$'), nodeType, (match) => ({ level: match[1].length }));\n}\n\nfunction blockSpoilerRule(nodeType) {\n return wrappingInputRule(/^\\s*>!\\s$/, nodeType);\n}\n\nexport default function buildInputRules(schema) {\n const rules = [\n ellipsis,\n blockQuoteRule(schema.nodes.blockquote),\n orderedListRule(schema.nodes.ordered_list),\n bulletListRule(schema.nodes.bullet_list),\n codeBlockRule(schema.nodes.code_block),\n headingRule(schema.nodes.heading, 6),\n blockSpoilerRule(schema.nodes.spoiler),\n nodeInputRule(/(?:___\\s|\\*\\*\\*\\s|---)$/, schema.nodes.horizontal_rule),\n textblockTypeInputRule(/^\\s*\\$\\$\\s$/, schema.nodes.math_block),\n markInputRule(/(?:\\*\\*|__)([^\\*_]+)(?:\\*\\*|__)$/, schema.marks.strong),\n markInputRule(/(?:^|[^_])(_([^_]+)_)$/, schema.marks.em),\n markInputRule(/(?:^|[^*])(\\*([^*]+)\\*)$/, schema.marks.em),\n markInputRule(/(?:`)([^`]+)(?:`)$/, schema.marks.code),\n markInputRule(/(?:~~)([^~]+)(?:~~)$/, schema.marks.strike),\n markInputRule(/(?:[^~]~)([^~]+)(?:~)$/, schema.marks.sub),\n markInputRule(/(?:\\^)([^^]+)(?:\\^)$/, schema.marks.sup),\n markInputRule(/(?:\\|\\|)([^\\|]+)(?:\\|\\|)$/, schema.marks.spoiler_inline),\n markInputRule(/(?:>!)(.+)(?:!<)$/, schema.marks.spoiler_inline),\n markInputRule(/(?:\\$)([^$]+)(?:\\$)$/, schema.marks.math_inline),\n ];\n\n return rules;\n}\n","import { baseKeymap } from 'tiptap-commands';\nimport { history } from 'prosemirror-history';\nimport { keymap } from 'prosemirror-keymap';\nimport { EditorState, Selection, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { dropCursor } from 'prosemirror-dropcursor';\nimport { gapCursor } from 'prosemirror-gapcursor';\n\nimport ItemList from 'flarum/common/utils/ItemList';\nimport disabledPlugin from './plugins/disabledPlugin';\nimport disableBase64PastePlugin from './plugins/disableBase64PastePlugin';\nimport placeholderPlugin from './plugins/placeholderPlugin';\nimport menuPlugin from './plugins/menuPlugin';\nimport toggleSpoiler from './plugins/toggleSpoiler';\nimport richTextKeymap from './key-bindings';\nimport buildInputRules from './inputrules';\nimport MarkdownSerializerBuilder from './markdown/MarkdownSerializerBuilder';\nimport MarkdownParserBuilder from './markdown/MarkdownParserBuilder';\nimport SchemaBuilder from './markdown/SchemaBuilder';\nimport { inputRules } from 'prosemirror-inputrules';\n\nexport default class ProseMirrorEditorDriver {\n constructor(target, attrs) {\n this.build(target, attrs);\n }\n\n build(target, attrs) {\n this.attrs = attrs;\n this.schema = new SchemaBuilder().build();\n\n this.parser = new MarkdownParserBuilder(this.schema).build();\n this.serializer = new MarkdownSerializerBuilder(this.schema).build();\n\n this.state = EditorState.create(this.buildEditorStateConfig());\n this.view = new EditorView(target, this.buildEditorProps());\n\n const cssClasses = attrs.classNames || [];\n cssClasses.forEach((className) => this.view.dom.classList.add(className));\n\n const callInputListeners = (e) => {\n this.attrs.inputListeners.forEach((listener) => {\n listener.call(target);\n });\n\n e.redraw = false;\n };\n\n target.oninput = callInputListeners;\n target.onclick = callInputListeners;\n target.onkeyup = callInputListeners;\n }\n\n buildEditorStateConfig() {\n return {\n doc: this.parseInitialValue(this.attrs.value),\n disabled: this.attrs.disabled,\n schema: this.schema,\n plugins: this.buildPluginItems().toArray(),\n };\n }\n\n buildPluginItems() {\n const items = new ItemList();\n\n items.add('markdownInputrules', inputRules({ rules: this.buildInputRules(this.schema) }));\n\n items.add('submit', keymap({ 'Mod-Enter': this.attrs.onsubmit }));\n\n items.add('escape', keymap({ Escape: this.attrs.escape }));\n\n items.add('richTextKeymap', keymap(richTextKeymap(this.schema)));\n\n items.add('baseKeymap', keymap(baseKeymap));\n\n items.add('placeholder', placeholderPlugin(this.attrs.placeholder));\n\n items.add('history', history());\n\n items.add('disabled', disabledPlugin());\n\n items.add('disableBase64Paste', disableBase64PastePlugin());\n\n items.add('dropCursor', dropCursor());\n\n items.add('gapCursor', gapCursor());\n\n items.add('menu', menuPlugin(this.attrs.menuState));\n\n items.add('toggleSpoiler', toggleSpoiler(this.schema));\n\n return items;\n }\n\n buildEditorProps() {\n const self = this;\n\n return {\n state: this.state,\n dispatchTransaction(transaction) {\n let newState = this.state.apply(transaction);\n this.updateState(newState);\n\n const newDoc = this.state.doc;\n const newDocPlaintext = self.serializeContent(newDoc, self.schema);\n self.attrs.oninput(newDocPlaintext);\n },\n };\n }\n\n buildInputRules(schema) {\n return buildInputRules(schema);\n }\n\n parseInitialValue(text) {\n return this.parser.parse(text);\n }\n\n serializeContent(doc) {\n return this.serializer.serialize(doc, { tightLists: true });\n }\n\n // External Control Stuff\n\n /**\n * Focus the textarea and place the cursor at the given index.\n *\n * @param {number} position\n */\n moveCursorTo(position) {\n this.setSelectionRange(position, position);\n }\n\n /**\n * Get the selected range of the textarea.\n *\n * @return {Array}\n */\n getSelectionRange() {\n return [this.view.state.selection.from, this.view.state.selection.to];\n }\n\n /**\n * Get (at most) the last N characters from the current \"text block\".\n */\n getLastNChars(n) {\n const lastNode = this.view.state.selection.$from.nodeBefore;\n\n if (!lastNode || !lastNode.text) return '';\n\n return lastNode.text.slice(Math.max(0, lastNode.text.length - n));\n }\n\n /**\n * Insert content into the textarea at the position of the cursor.\n *\n * @param {String} text\n */\n insertAtCursor(text, escape) {\n this.insertAt(this.getSelectionRange()[0], text, escape);\n $(this.view.dom).trigger('click');\n }\n\n /**\n * Insert content into the textarea at the given position.\n *\n * @param {number} pos\n * @param {String} text\n */\n insertAt(pos, text, escape) {\n this.insertBetween(pos, pos, text, escape);\n }\n\n /**\n * Insert content into the textarea between the given positions.\n *\n * If the start and end positions are different, any text between them will be\n * overwritten.\n *\n * @param start\n * @param end\n * @param text\n * @param rawMarkdown\n */\n insertBetween(start, end, text, escape = true) {\n let trailingNewLines = 0;\n\n if (escape) {\n this.view.dispatch(this.view.state.tr.insertText(text, start, end));\n } else {\n start -= 1;\n this.view.dispatch(this.view.state.tr.replaceRangeWith(start, end, this.parseInitialValue(text)));\n\n trailingNewLines = text.match(/\\s+$/)[0].split('\\n').length - 1;\n }\n\n // Move the textarea cursor to the end of the content we just inserted.\n this.moveCursorTo(Math.min(start + text.length, Selection.atEnd(this.view.state.doc).to));\n m.redraw();\n\n // TODO: accomplish this in one step.\n if (text.endsWith(' ') && !escape) {\n this.insertAtCursor(' ');\n }\n\n Array(trailingNewLines)\n .fill(0)\n .forEach(() => {\n baseKeymap['Enter'](this.view.state, this.view.dispatch);\n });\n }\n\n /**\n * Replace existing content from the start to the current cursor position.\n *\n * @param start\n * @param text\n */\n replaceBeforeCursor(start, text, escape) {\n this.insertBetween(start, this.getSelectionRange()[0], text, escape);\n }\n\n /**\n * Set the selected range of the textarea.\n *\n * @param {number} start\n * @param {number} end\n * @private\n */\n setSelectionRange(start, end) {\n const $start = this.view.state.tr.doc.resolve(start);\n const $end = this.view.state.tr.doc.resolve(end);\n\n this.view.dispatch(this.view.state.tr.setSelection(new TextSelection($start, $end)));\n this.focus();\n }\n\n getCaretCoordinates(position) {\n const viewportCoords = this.view.coordsAtPos(position);\n const editorViewportOffset = this.view.dom.getBoundingClientRect();\n return {\n left: viewportCoords.left - editorViewportOffset.left,\n top: viewportCoords.top - editorViewportOffset.top,\n };\n }\n\n focus() {\n this.view.focus();\n }\n destroy() {\n this.view.destroy();\n }\n\n disabled(disabled) {\n this.view.dispatch(this.view.state.tr.setMeta('disabled', disabled));\n }\n}\n","import { Plugin } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\n\nexport default function placeholderPlugin(text) {\n return new Plugin({\n props: {\n decorations: (state) => {\n const decorations = [];\n\n if (state.doc.childCount === 1) {\n const node = state.doc.child(0);\n if (node.type.isBlock && node.childCount === 0 && node.type == state.schema.nodes.paragraph) {\n decorations.push(\n Decoration.node(0, node.nodeSize, {\n class: 'placeholder',\n 'data-before': text,\n })\n );\n }\n }\n\n return DecorationSet.create(state.doc, decorations);\n },\n },\n });\n}\n","import { Plugin } from 'prosemirror-state';\n\nexport default function menuPlugin(menuState) {\n return new Plugin({\n view(editorView) {\n menuState.attachEditorView(editorView);\n return menuState;\n },\n });\n}\n","import { redo, undo } from 'prosemirror-history';\nimport { undoInputRule } from 'prosemirror-inputrules';\nimport { TextSelection } from 'prosemirror-state';\nimport {\n chainCommands,\n exitCode,\n liftListItem,\n newlineInCode,\n setBlockType,\n sinkListItem,\n splitListItem,\n toggleList,\n toggleMark,\n wrapIn,\n} from 'tiptap-commands';\n\nexport default function richTextKeymap(schema) {\n const considerDropdown = (state, dispatch) => {\n const emojiDropdown = $('.EmojiDropdown:visible');\n const mentionsDropdown = $('.MentionsDropdown:visible');\n\n if (emojiDropdown[0] || mentionsDropdown[0]) return true;\n };\n\n const smartExitCode = (state, dispatch, view) => {\n let { $head, $anchor } = state.selection;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) return false;\n\n const nodeBefore = state.selection.$from.nodeBefore;\n const nodeAfter = state.selection.$from.nodeAfter;\n if ((!nodeBefore || nodeBefore.text.slice(-1) === '\\n') && !nodeAfter) {\n view.dispatch(view.state.tr.delete(state.selection.from - 1, state.selection.from));\n view.dispatch(view.state.tr.setSelection(TextSelection.near(view.state.doc.resolve(view.state.selection.from))));\n return exitCode(view.state, view.dispatch);\n } else {\n return newlineInCode(state, dispatch);\n }\n };\n\n const insertHardBreak = (state, dispatch) => {\n dispatch(state.tr.replaceSelectionWith(schema.nodes.hard_break.create()).scrollIntoView());\n return true;\n };\n\n const smartInsertHardBreak = (state, dispatch, view) => {\n let { $head, $anchor } = state.selection;\n if ($head.parent.type.name !== 'paragraph' || !$head.sameParent($anchor)) return false;\n\n const nodeBefore = state.selection.$from.nodeBefore;\n const nodeAfter = state.selection.$from.nodeAfter;\n\n if (nodeBefore && nodeBefore.text && nodeBefore.text.slice(-1) !== '\\n') {\n return insertHardBreak(view.state, view.dispatch);\n } else if (nodeBefore && !nodeBefore.text && !nodeAfter) {\n view.dispatch(view.state.tr.delete(state.selection.from - 1, state.selection.from));\n view.dispatch(view.state.tr.setSelection(TextSelection.near(view.state.doc.resolve(view.state.selection.from))));\n }\n };\n\n const enterCommands = [considerDropdown, splitListItem(schema.nodes.list_item), smartExitCode];\n\n if (app.session.user.preferences().richTextCompactParagraphs) {\n enterCommands.push(smartInsertHardBreak);\n }\n\n const handleEnter = chainCommands(...enterCommands);\n\n return {\n // History\n 'Mod-z': undo,\n 'Mod-y': redo,\n 'Mod-Shift-z': redo,\n Backspace: undoInputRule,\n // Formatting: Marks\n 'Mod-b': toggleMark(schema.marks.strong),\n 'Mod-i': toggleMark(schema.marks.em),\n 'Mod-`': toggleMark(schema.marks.code),\n 'Alt-Shift-5': toggleMark(schema.marks.strike),\n 'Mod-,': toggleMark(schema.marks.sub),\n 'Mod-.': toggleMark(schema.marks.sup),\n 'Mod-;': toggleMark(schema.marks.spoiler_inline),\n // Formatting: Wrap\n 'Shift-Mod-8': toggleList(schema.nodes.bullet_list),\n 'Shift-Mod-9': toggleList(schema.nodes.ordered_list),\n 'Mod-q': wrapIn(schema.nodes.blockquote),\n // Formatting: Type\n 'Shift-Ctrl-0': setBlockType(schema.nodes.paragraph),\n 'Shift-Ctrl-1': setBlockType(schema.nodes.heading, { level: 1 }),\n 'Shift-Ctrl-2': setBlockType(schema.nodes.heading, { level: 2 }),\n 'Shift-Ctrl-3': setBlockType(schema.nodes.heading, { level: 3 }),\n 'Shift-Ctrl-4': setBlockType(schema.nodes.heading, { level: 4 }),\n 'Shift-Ctrl-5': setBlockType(schema.nodes.heading, { level: 5 }),\n 'Shift-Ctrl-6': setBlockType(schema.nodes.heading, { level: 6 }),\n 'Shift-Ctrl-\\\\': setBlockType(schema.nodes.code_block),\n // Whitespace\n 'Mod-]': sinkListItem(schema.nodes.list_item),\n 'Mod-m': sinkListItem(schema.nodes.list_item),\n 'Mod-[': liftListItem(schema.nodes.list_item),\n 'Mod-Shift-m': liftListItem(schema.nodes.list_item),\n Enter: handleEnter,\n 'Shift-Enter': chainCommands(newlineInCode, insertHardBreak),\n };\n}\n","import { Plugin, PluginKey } from 'prosemirror-state';\n\nexport default function disabledPlugin(text) {\n return new Plugin({\n key: new PluginKey('disabled'),\n\n props: {\n editable: (state) => {\n return !state.disabled$;\n },\n },\n\n state: {\n init(config) {\n return config.disabled;\n },\n\n apply(tr, curr) {\n const disabled = tr.getMeta('disabled');\n\n if (disabled !== undefined) {\n return disabled;\n }\n\n return curr;\n },\n },\n });\n}\n","// COPIED FROM https://github.com/markdown-it/markdown-it/blob/master/lib/rules_inline/text.js\n// NEEDED TO ALLOW `|` as terminator character.\n\n// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\n'use strict';\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar(ch) {\n switch (ch) {\n case 0x0a /* \\n */:\n case 0x21 /* ! */:\n case 0x23 /* # */:\n case 0x24 /* $ */:\n case 0x25 /* % */:\n case 0x26 /* & */:\n case 0x2a /* * */:\n case 0x2b /* + */:\n case 0x2d /* - */:\n case 0x3a /* : */:\n case 0x3c /* < */:\n case 0x3d /* = */:\n case 0x3e /* > */:\n case 0x40 /* @ */:\n case 0x5b /* [ */:\n case 0x5c /* \\ */:\n case 0x5d /* ] */:\n case 0x5e /* ^ */:\n case 0x5f /* _ */:\n case 0x60 /* ` */:\n case 0x7b /* { */:\n case 0x7c /* | */:\n case 0x7d /* } */:\n case 0x7e /* ~ */:\n return true;\n default:\n return false;\n }\n}\n\nconst tokenize = (state, silent) => {\n var pos = state.pos;\n\n while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n pos++;\n }\n\n if (pos === state.pos) {\n return false;\n }\n\n if (!silent) {\n state.pending += state.src.slice(state.pos, pos);\n }\n\n state.pos = pos;\n\n return true;\n};\n\nexport default function (md) {\n md.inline.ruler.before('text', 'altText', tokenize);\n md.inline.ruler.disable('text');\n}\n","// COPIED FROM https://github.com/StackExchange/Stacks-Editor/blob/main/src/shared/markdown-it/spoiler.ts\n\nimport { isSpace } from 'markdown-it/lib/common/utils';\n\n// TODO unfortunately, we cannot reliably extend blockquote since it is hardcoded to search for `>` characters\n// In addition, we cannot just call \"blockquote\" inside spoiler, because it does a lookahead for `>` characters and leaves our `!`s behind, potentially causing parsing issues\n// The official advice is to just \"copy paste then edit\" \"extended\" rules...\n// see https://github.com/markdown-it/markdown-it/blob/master/docs/development.md#general-considerations-for-plugins\n// see also https://github.com/markdown-it/markdown-it/issues/46#issuecomment-73125248\nfunction blockquoteExt(options, state, startLine, endLine, silent) {\n // NOTE: we're keeping the source as close to upstream as possible, so ignore errors like this\n // eslint-disable-next-line no-var\n var adjustTab,\n ch,\n i,\n initial,\n l,\n lastLineEmpty,\n lines,\n nextLine,\n offset,\n oldBMarks,\n oldBSCount,\n oldIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n spaceAfterMarker,\n terminate,\n terminatorRules,\n token,\n wasOutdented,\n oldLineMax = state.lineMax,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) {\n return false;\n }\n\n // check the block quote marker\n if (state.src.charCodeAt(pos) !== 0x3e /* > */ || !options.followingCharRegex.test(state.src[pos + 1])) {\n return false;\n }\n\n pos += options.markup.length;\n\n // we know that it's going to be a valid blockquote,\n // so no point trying to find the end of it in silent mode\n if (silent) {\n return true;\n }\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[startLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n // ! INSERTED\n // We need to add this hack in so that inline spoilers\n // at the start of lines don't get classified\n // as block spoilers.\n const spoiler = options.markup === '>!';\n let foundExclamation = false;\n let foundOpen = false;\n let oldPos = pos;\n if (spoiler) {\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (foundExclamation && ch === 0x3c /* < */) {\n return false;\n } else if (ch === 0x3e /* > */) {\n foundOpen = true;\n } else if (foundOpen && ch === 0x21 /* ! */) {\n break; // Inline spoiler embedded in block spoiler, this is fine.\n } else if (ch === 0x21 /* ! */) {\n foundExclamation = true;\n } else if (ch === 0x0a /* \\n */) {\n break; // Not an inline comment\n } else {\n foundExclamation = false;\n foundOpen = false;\n }\n\n pos++;\n }\n }\n pos = oldPos;\n // ! END INSERTED\n\n oldBMarks = [state.bMarks[startLine]];\n state.bMarks[startLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - ((offset + state.bsCount[startLine] + (adjustTab ? 1 : 0)) % 4);\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n oldBSCount = [state.bsCount[startLine]];\n state.bsCount[startLine] = state.sCount[startLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n lastLineEmpty = pos >= max;\n\n oldSCount = [state.sCount[startLine]];\n state.sCount[startLine] = offset - initial;\n\n oldTShift = [state.tShift[startLine]];\n state.tShift[startLine] = pos - state.bMarks[startLine];\n\n terminatorRules = state.md.block.ruler.getRules('spoiler');\n\n oldParentType = state.parentType;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore TODO adding a new parent type here...\n state.parentType = 'spoiler';\n wasOutdented = false;\n\n // Search the end of the block\n //\n // Block ends with either:\n // 1. an empty line outside:\n // ```\n // > test\n //\n // ```\n // 2. an empty line inside:\n // ```\n // >\n // test\n // ```\n // 3. another tag:\n // ```\n // > test\n // - - -\n // ```\n for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {\n // check if it's outdented, i.e. it's inside list item and indented\n // less than said list item:\n //\n // ```\n // 1. anything\n // > current blockquote\n // 2. checking this line\n // ```\n if (state.sCount[nextLine] < state.blkIndent) wasOutdented = true;\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos >= max) {\n // Case 1: line is not inside the blockquote, and this line is empty.\n break;\n }\n\n pos += options.markup.length;\n\n if (\n state.src.charCodeAt(pos - options.markup.length) === 0x3e /* > */ &&\n options.followingCharRegex.test(state.src[pos - options.markup.length + 1]) &&\n !wasOutdented\n ) {\n // This line is inside the blockquote.\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[nextLine] + pos - (state.bMarks[nextLine] + state.tShift[nextLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[nextLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n state.bMarks[nextLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - ((offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4);\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n lastLineEmpty = pos >= max;\n\n oldBSCount.push(state.bsCount[nextLine]);\n state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] = offset - initial;\n\n oldTShift.push(state.tShift[nextLine]);\n state.tShift[nextLine] = pos - state.bMarks[nextLine];\n continue;\n }\n\n // Case 2: line is not inside the blockquote, and the last line was empty.\n if (lastLineEmpty) {\n break;\n }\n\n // Case 3: another tag found.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n\n if (terminate) {\n // Quirk to enforce \"hard termination mode\" for paragraphs;\n // normally if you call `tokenize(state, startLine, nextLine)`,\n // paragraphs will look below nextLine for paragraph continuation,\n // but if blockquote is terminated by another tag, they shouldn't\n state.lineMax = nextLine;\n\n if (state.blkIndent !== 0) {\n // state.blkIndent was non-zero, we now set it to zero,\n // so we need to re-calculate all offsets to appear as\n // if indent wasn't changed\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] -= state.blkIndent;\n }\n\n break;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n\n // A negative indentation means that this is a paragraph continuation\n //\n state.sCount[nextLine] = -1;\n }\n\n oldIndent = state.blkIndent;\n state.blkIndent = 0;\n\n token = state.push(options.name + '_open', options.name, 1);\n token.markup = options.markup;\n token.map = lines = [startLine, 0];\n\n state.md.block.tokenize(state, startLine, nextLine);\n\n token = state.push(options.name + '_close', options.name, -1);\n token.markup = options.markup;\n\n state.lineMax = oldLineMax;\n state.parentType = oldParentType;\n lines[1] = state.line;\n\n // Restore original tShift; this might not be necessary since the parser\n // has already been here, but just to make sure we can do that.\n for (i = 0; i < oldTShift.length; i++) {\n state.bMarks[i + startLine] = oldBMarks[i];\n state.tShift[i + startLine] = oldTShift[i];\n state.sCount[i + startLine] = oldSCount[i];\n state.bsCount[i + startLine] = oldBSCount[i];\n }\n state.blkIndent = oldIndent;\n\n return true;\n}\n\nfunction spoilerFn(state, startLine, endLine, silent) {\n return blockquoteExt(\n {\n followingCharRegex: /!/,\n markup: '>!',\n name: 'spoiler',\n },\n state,\n startLine,\n endLine,\n silent\n );\n}\n\nfunction blockquoteFn(state, startLine, endLine, silent) {\n return blockquoteExt(\n {\n followingCharRegex: /[^!]/,\n markup: '>',\n name: 'blockquote',\n },\n state,\n startLine,\n endLine,\n silent\n );\n}\n\n/**\n * Parses out spoiler `>!` blocks\n * @param md\n */\nexport default function blockSpoiler(md) {\n // TODO necessary?\n // find all blockquote chain rules and update to be part of the spoiler chain as well\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore TODO no public way to iterate over all rules; maybe there's a better way?\n md.block.ruler.__rules__.forEach((r) => {\n const bqIndex = r.alt.indexOf('blockquote');\n if (bqIndex > -1) {\n // add in \"spoiler\" right before the \"blockquote\" entry\n r.alt.splice(bqIndex, 0, 'spoiler');\n }\n });\n md.block.ruler.before('blockquote', 'spoiler', spoilerFn, {\n // TODO stole this from blockquote, dunno what it does...\n alt: ['paragraph', 'reference', 'spoiler', 'blockquote', 'list'],\n });\n\n md.block.ruler.at('blockquote', blockquoteFn, {\n alt: ['paragraph', 'reference', 'spoiler', 'blockquote', 'list'],\n });\n}\n","/**!\n * markdown-it-mark\n *\n * Copyright (c) 2014-2015 Vitaly Puzrin, Alex Kocharin.\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n'use strict';\nconst exMark = 0x7c; /* | */\n\nconst tokenize = (frontPriorMode) => (state, silent) => {\n if (silent) return false;\n\n const start = state.pos;\n const marker = state.src.charCodeAt(start);\n\n if (marker !== exMark) return false;\n\n const scanned = state.scanDelims(state.pos, true);\n let len = scanned.length;\n const ch = String.fromCharCode(marker);\n\n if (len < 2) return false;\n\n let isOdd = false;\n if (len % 2) {\n isOdd = true;\n if (!frontPriorMode) {\n const token = state.push('text', '', 0);\n token.content = ch;\n }\n len--;\n }\n\n for (let i = 0; i < len; i += 2) {\n const token = state.push('text', '', 0);\n token.content = ch + ch;\n\n state.delimiters.push({\n marker,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n jump: i / 2, // 1 delimiter = 2 characters\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close,\n });\n }\n\n state.pos += scanned.length;\n if (isOdd && frontPriorMode) {\n state.pos--;\n }\n\n return true;\n};\n\nconst postProcess = (state, delimiters) => {\n const loneMarkers = [];\n\n for (const startDelim of delimiters) {\n if (startDelim.marker !== exMark) continue;\n if (startDelim.end === -1) continue;\n\n const endDelim = delimiters[startDelim.end];\n\n const tokenO = state.tokens[startDelim.token];\n tokenO.type = 'spoiler_inline_open';\n tokenO.tag = 'span';\n tokenO.attrs = [['class', 'spoiler_inline']];\n tokenO.nesting = 1;\n tokenO.markup = '||';\n tokenO.content = '';\n\n const tokenC = state.tokens[endDelim.token];\n tokenC.type = 'spoiler_inline_close';\n tokenC.tag = 'span';\n tokenC.nesting = -1;\n tokenC.markup = '||';\n tokenC.content = '';\n\n if (state.tokens[endDelim.token - 1].type === 'text' && state.tokens[endDelim.token - 1].content === '|') {\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's splitted\n // like this: `|||||` -> `|` + `||` + `||`, leaving one marker at the\n // start of the sequence.\n //\n // So, we have to move all those markers after subsequent spoiler_inline_close tags.\n //\n while (loneMarkers.length) {\n const i = loneMarkers.pop();\n let j = i + 1;\n\n while (j < state.tokens.length && state.tokens[j].type === 'spoiler_inline_close') {\n j++;\n }\n\n j--;\n\n if (i !== j) {\n const token = state.tokens[j];\n state.tokens[j] = state.tokens[i];\n state.tokens[i] = token;\n }\n }\n};\n\nexport default function (md, frontPriorMode = false) {\n md.inline.ruler.before('emphasis', 'spoiler_inline_bars', tokenize(frontPriorMode));\n md.inline.ruler2.before('emphasis', 'spoiler_inline_bars', (state) => {\n postProcess(state, state.delimiters);\n\n if (!state.tokens_meta) return;\n for (const meta of state.tokens_meta) {\n if (meta && meta.delimiters) {\n postProcess(state, meta.delimiters);\n }\n }\n });\n}\n","// BASED ON https://github.com/markdown-it/markdown-it-sub/blob/master/index.js\n\nconst tokenize = (frontPriorMode) => (state, silent) => {\n if (silent) return false;\n\n var scanned,\n max = state.posMax,\n start = state.pos;\n\n if (state.src.charCodeAt(start) === 0x3e /* > */ && start + 3 <= max && state.src.charCodeAt(start + 1) === 0x21 /* ! */) {\n scanned = state.scanDelims(state.pos, true);\n state.push('text', '', 0);\n state.delimiters.push({\n marker: '>!<',\n length: 2,\n jump: 0,\n token: state.tokens.length - 1,\n end: -1,\n open: true,\n close: false,\n });\n state.pos += 2;\n return true;\n }\n\n if (state.src.charCodeAt(start) === 0x21 /* ! */ && start + 2 <= max && state.src.charCodeAt(start + 1) === 0x3c /* < */) {\n state.push('text', '', 0);\n state.delimiters.push({\n marker: '>!<',\n length: 2,\n jump: 0,\n token: state.tokens.length - 1,\n end: -1,\n open: false,\n close: true,\n });\n state.pos += 2;\n return true;\n }\n\n return false;\n};\n\nfunction postProcess(state, delimiters) {\n var i,\n startDelim,\n endDelim,\n token,\n max = delimiters.length;\n\n for (i = max - 1; i >= 0; i--) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== '>!<') {\n continue;\n }\n\n // Process only opening markers\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n token = state.tokens[startDelim.token];\n token.type = 'spoiler_inline_open';\n // token.tag = isStrong ? 'strong' : 'em';\n token.nesting = 1;\n token.markup = '>!';\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = 'spoiler_inline_close';\n // token.tag = isStrong ? 'strong' : 'em';\n token.nesting = -1;\n token.markup = '!<';\n token.content = '';\n }\n}\n\nexport default function (md, frontPriorMode = false) {\n md.inline.ruler.before('emphasis', 'spoiler_inline_tags', tokenize(frontPriorMode));\n md.inline.ruler2.before('emphasis', 'spoiler_inline_bars', (state) => {\n postProcess(state, state.delimiters);\n\n if (!state.tokens_meta) return;\n for (const meta of state.tokens_meta) {\n if (meta && meta.delimiters) {\n postProcess(state, meta.delimiters);\n }\n }\n });\n}\n","import markdownit from 'markdown-it';\nimport subPlugin from 'markdown-it-sub';\nimport supPlugin from 'markdown-it-sup';\nimport latexPlugin from 'markdown-it-latex2img';\nimport { defaultMarkdownParser, MarkdownParser } from 'prosemirror-markdown';\nimport altText from './markdown-it/altText';\nimport blockSpoiler from './markdown-it/blockSpoiler';\nimport inlineSpoilerBars from './markdown-it/inlineSpoilerBars';\nimport inlineSpoilerTags from './markdown-it/inlineSpoilerTags';\n\nexport default class MarkdownParserBuilder {\n constructor(schema) {\n this.schema = schema;\n }\n\n tokenizerParams() {\n return { html: false };\n }\n\n buildTokenizer() {\n return markdownit('commonmark', this.tokenizerParams())\n .enable('strikethrough')\n .use(altText)\n .use(blockSpoiler)\n .use(latexPlugin)\n .use(subPlugin)\n .use(supPlugin)\n .use(inlineSpoilerBars)\n .use(inlineSpoilerTags);\n }\n\n buildTokens() {\n return {\n ...defaultMarkdownParser.tokens,\n\n // add support for the strike mark\n s: {\n mark: 'strike',\n },\n\n // Litedown treaks softbreaks as hard breaks\n softbreak: { node: 'hard_break' },\n\n spoiler: {\n block: 'spoiler',\n },\n\n spoiler_inline: {\n mark: 'spoiler_inline',\n },\n\n sub: {\n mark: 'sub',\n },\n\n sup: {\n mark: 'sup',\n },\n\n math_block: {\n block: 'math_block',\n noCloseToken: true,\n },\n\n math_inline: {\n mark: 'math_inline',\n noCloseToken: true,\n },\n };\n }\n\n build() {\n return new MarkdownParser(this.schema, this.buildTokenizer(), this.buildTokens());\n }\n}\n","import Dropdown from 'flarum/common/components/Dropdown';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport icon from 'flarum/common/helpers/icon';\nimport SafariModalHack from './SafariModalHack';\n\nexport default class HiddenItemsDropdown extends Dropdown {\n static initAttrs(attrs) {\n attrs.buttonClassName = 'Button Button--icon Button--link Button--menuDropdown';\n }\n\n oninit(vnode) {\n super.oninit(vnode);\n\n this.state = this.attrs.state;\n }\n\n oncreate(vnode) {\n super.oncreate(vnode);\n\n this.$().on('click', (e) => {\n if ($('.App').is('.mobile-safari')) {\n // Mobile Safari doesn't support fixed items\n // So, we wrap them in a modal.\n app.modal.show(SafariModalHack, {\n title: this.attrs.tooltip,\n vnodeContent: this.attrs.buttons.map((button) => {\n return button;\n }),\n });\n e.stopPropagation();\n }\n });\n }\n\n getButtonContent(children) {\n return (\n \n {icon(this.attrs.icon)}\n \n );\n }\n\n getMenu(items) {\n return

                    {this.attrs.buttons}
                  ;\n }\n}\n","import { toggleBlockType, toggleWrap, wrapIn } from 'tiptap-commands';\n\nimport Component from 'flarum/common/Component';\nimport ItemList from 'flarum/common/utils/ItemList';\n\nimport CommandButton from './CommandButton';\nimport MarkButton from './MarkButton';\nimport NodeTypeDropdown from './NodeTypeDropdown';\nimport InsertImageDropdown from './InsertImageDropdown';\nimport InsertLinkDropdown from './InsertLinkDropdown';\nimport ListButton from './ListButton';\nimport insertHr from '../proseMirror/commands/insertHr';\nimport HiddenItemsDropdown from './HiddenItemsDropdown';\n\nexport default class ProseMirrorMenu extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.modifierKey = navigator.userAgent.match(/Macintosh/) ? '⌘' : 'ctrl';\n }\n view(vnode) {\n if (!this.attrs.state) return '';\n\n return
                  {this.items().toArray()}
                  ;\n }\n\n items() {\n const items = new ItemList();\n const state = this.attrs.state;\n const modifierKey = this.modifierKey;\n\n items.add(\n 'text_type',\n NodeTypeDropdown.component({\n type: 'text_type',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.text_type_tooltip'),\n state: state,\n options: [\n {\n title: 'H1',\n type: state.getSchema().nodes.heading,\n attrs: { level: 1 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 1 }),\n },\n {\n title: 'H2',\n type: state.getSchema().nodes.heading,\n attrs: { level: 2 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 2 }),\n },\n {\n title: 'H3',\n type: state.getSchema().nodes.heading,\n attrs: { level: 3 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 3 }),\n },\n {\n title: 'H4',\n type: state.getSchema().nodes.heading,\n attrs: { level: 4 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 4 }),\n },\n {\n title: 'H5',\n type: state.getSchema().nodes.heading,\n attrs: { level: 5 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 5 }),\n },\n {\n title: 'H6',\n type: state.getSchema().nodes.heading,\n attrs: { level: 6 },\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.header_tooltip', { modifierKey, level: 6 }),\n },\n {\n title: 'P',\n type: state.getSchema().nodes.paragraph,\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.paragraph_tooltip', { modifierKey }),\n },\n ],\n }),\n 100\n );\n\n items.add(\n 'bold',\n MarkButton.component({\n type: 'bold',\n icon: 'fas fa-bold',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.bold_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.strong,\n }),\n 90\n );\n\n items.add(\n 'italic',\n MarkButton.component({\n type: 'italic',\n icon: 'fas fa-italic',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.italic_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.em,\n }),\n 80\n );\n\n items.add(\n 'code',\n MarkButton.component({\n type: 'code',\n icon: 'fas fa-code',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.code_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.code,\n }),\n 70\n );\n\n items.add(\n 'quote',\n CommandButton.component({\n type: 'quote',\n icon: 'fas fa-quote-left',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.quote_tooltip', { modifierKey }),\n state: state,\n command: wrapIn(state.getSchema().nodes.blockquote),\n }),\n 60\n );\n\n items.add(\n 'link',\n InsertLinkDropdown.component({\n type: 'link',\n icon: 'fas fa-link',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.link_tooltip'),\n state: state,\n mark: state.getSchema().marks.link,\n }),\n 50\n );\n\n items.add(\n 'image',\n InsertImageDropdown.component({\n type: 'image',\n icon: 'fas fa-image',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.image_tooltip'),\n state: state,\n node: state.getSchema().nodes.image,\n }),\n 40\n );\n\n items.add(\n 'unordered_list',\n ListButton.component({\n type: 'unordered_list',\n icon: 'fas fa-list-ul',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.unordered_list_tooltip', { modifierKey }),\n state: state,\n listType: state.getSchema().nodes.bullet_list,\n }),\n 30\n );\n\n items.add(\n 'ordered_list',\n ListButton.component({\n type: 'ordered_list',\n icon: 'fas fa-list-ol',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.ordered_list_tooltip', { modifierKey }),\n state: state,\n listType: state.getSchema().nodes.ordered_list,\n }),\n 20\n );\n\n items.add(\n 'additional_items',\n HiddenItemsDropdown.component({\n type: 'additional_items',\n icon: 'fas fa-plus',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.additional_items_tooltip'),\n state: state,\n buttons: this.hiddenItems().toArray(),\n })\n );\n\n return items;\n }\n\n hiddenItems() {\n const items = new ItemList();\n const state = this.attrs.state;\n const modifierKey = this.modifierKey;\n\n items.add(\n 'strike',\n MarkButton.component({\n type: 'strike',\n icon: 'fas fa-strikethrough',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.strike_tooltip'),\n state: state,\n mark: state.getSchema().marks.strike,\n })\n );\n\n items.add(\n 'sub',\n MarkButton.component({\n type: 'sub',\n icon: 'fas fa-subscript',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.sub_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.sub,\n })\n );\n\n items.add(\n 'sup',\n MarkButton.component({\n type: 'sup',\n icon: 'fas fa-superscript',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.sup_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.sup,\n })\n );\n\n items.add(\n 'spoiler_inline',\n MarkButton.component({\n type: 'spoiler_inline',\n icon: 'fas fa-eye-slash',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.spoiler_inline_tooltip', { modifierKey }),\n state: state,\n mark: state.getSchema().marks.spoiler_inline,\n })\n );\n\n items.add(\n 'code_block',\n CommandButton.component({\n type: 'code_block',\n icon: 'fas fa-terminal',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.code_block_tooltip', { modifierKey }),\n state: state,\n command: toggleBlockType(state.getSchema().nodes.code_block, state.getSchema().nodes.paragraph),\n })\n );\n\n items.add(\n 'spoiler_block',\n CommandButton.component({\n type: 'spoiler_block',\n icon: 'fas fa-caret-square-right',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.spoiler_block_tooltip', { modifierKey }),\n state: state,\n command: toggleWrap(state.getSchema().nodes.spoiler),\n })\n );\n\n items.add(\n 'horizontal_rule',\n CommandButton.component({\n type: 'horizontal_rule',\n icon: 'fas fa-minus',\n tooltip: app.translator.trans('askvortsov-rich-text.lib.composer.horizontal_rule_tooltip'),\n state: state,\n command: insertHr(state.getSchema().nodes.horizontal_rule),\n })\n );\n\n return items;\n }\n}\n","export default function insertHr(nodeType, attrs) {\n return function (state, dispatch) {\n dispatch(state.tr.replaceSelectionWith(nodeType.create(attrs)));\n return true;\n };\n}\n","import Button from 'flarum/common/components/Button';\nimport extractText from 'flarum/common/utils/extractText';\nimport Stream from 'flarum/common/utils/Stream';\nimport FormDropdown from './FormDropdown';\n\nimport { removeMark, updateMark } from 'tiptap-commands';\nimport insertLink from '../proseMirror/commands/insertLink';\n\nexport default class InsertLinkDropdown extends FormDropdown {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.text = Stream('');\n\n this.href = Stream('');\n this.title = Stream('');\n\n this.state.addItem(\n this.attrs.type,\n (state, dispatch) => {\n this.command(state, dispatch);\n },\n this.onEditorUpdate.bind(this)\n );\n\n this.selectionEmpty = true;\n }\n\n fields() {\n const items = super.fields();\n\n if (this.selectionEmpty && !this.active) {\n items.add(\n 'text',\n
                  \n \n
                  ,\n 10\n );\n }\n\n items.add(\n 'href',\n
                  \n \n
                  ,\n 10\n );\n\n items.add(\n 'title',\n
                  \n \n
                  ,\n 10\n );\n\n if (this.active) {\n items.add(\n 'remove',\n ,\n -10\n );\n }\n\n return items;\n }\n\n insert(e) {\n const linkAttrs = { href: this.href(), title: this.title() };\n\n if (this.selectionEmpty && !this.active) {\n this.command = insertLink(this.text(), this.attrs.mark, linkAttrs);\n\n this.text('');\n } else {\n this.command = updateMark(this.attrs.mark, linkAttrs);\n }\n\n this.state.run(this.attrs.type);\n }\n\n remove(e) {\n $('body').trigger('click');\n this.command = removeMark(this.attrs.mark);\n this.state.run(this.attrs.type);\n app.composer.editor.focus();\n }\n\n onEditorUpdate() {\n this.active = !!this.state.markActive(this.attrs.mark);\n this.$('.Dropdown-toggle').toggleClass('active', this.active);\n\n const attrs = this.state.markAttrs(this.attrs.mark);\n\n this.href(attrs.href);\n this.title(attrs.title);\n\n this.selectionEmpty = this.state.selectionEmpty();\n }\n}\n","export default function insertLink(text, markType, attrs) {\n return function (state, dispatch) {\n dispatch(state.tr.replaceSelectionWith(state.schema.text(text, [markType.create(attrs)]), false));\n };\n}\n","module.exports=/[!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u09FD\\u0A76\\u0AF0\\u0C84\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E4E\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD803[\\uDF55-\\uDF59]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD806[\\uDC3B\\uDE3F-\\uDE46\\uDE9A-\\uDE9C\\uDE9E-\\uDEA2]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71\\uDEF7\\uDEF8]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD81B[\\uDE97-\\uDE9A]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]/","/**\n * class Ruler\n *\n * Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and\n * [[MarkdownIt#inline]] to manage sequences of functions (rules):\n *\n * - keep rules in defined order\n * - assign the name to each rule\n * - enable/disable rules\n * - add/replace rules\n * - allow assign rules to additional named chains (in the same)\n * - cacheing lists of active rules\n *\n * You will not need use this class directly until write plugins. For simple\n * rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and\n * [[MarkdownIt.use]].\n **/\n'use strict';\n\n\n/**\n * new Ruler()\n **/\nfunction Ruler() {\n // List of added rules. Each element is:\n //\n // {\n // name: XXX,\n // enabled: Boolean,\n // fn: Function(),\n // alt: [ name2, name3 ]\n // }\n //\n this.__rules__ = [];\n\n // Cached rule chains.\n //\n // First level - chain name, '' for default.\n // Second level - diginal anchor for fast filtering by charcodes.\n //\n this.__cache__ = null;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Helper methods, should not be used directly\n\n\n// Find rule index by name\n//\nRuler.prototype.__find__ = function (name) {\n for (var i = 0; i < this.__rules__.length; i++) {\n if (this.__rules__[i].name === name) {\n return i;\n }\n }\n return -1;\n};\n\n\n// Build rules lookup cache\n//\nRuler.prototype.__compile__ = function () {\n var self = this;\n var chains = [ '' ];\n\n // collect unique names\n self.__rules__.forEach(function (rule) {\n if (!rule.enabled) { return; }\n\n rule.alt.forEach(function (altName) {\n if (chains.indexOf(altName) < 0) {\n chains.push(altName);\n }\n });\n });\n\n self.__cache__ = {};\n\n chains.forEach(function (chain) {\n self.__cache__[chain] = [];\n self.__rules__.forEach(function (rule) {\n if (!rule.enabled) { return; }\n\n if (chain && rule.alt.indexOf(chain) < 0) { return; }\n\n self.__cache__[chain].push(rule.fn);\n });\n });\n};\n\n\n/**\n * Ruler.at(name, fn [, options])\n * - name (String): rule name to replace.\n * - fn (Function): new rule function.\n * - options (Object): new rule options (not mandatory).\n *\n * Replace rule by name with new function & options. Throws error if name not\n * found.\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * Replace existing typographer replacement rule with new one:\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.at('replacements', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.at = function (name, fn, options) {\n var index = this.__find__(name);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + name); }\n\n this.__rules__[index].fn = fn;\n this.__rules__[index].alt = opt.alt || [];\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.before(beforeName, ruleName, fn [, options])\n * - beforeName (String): new rule will be added before this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain before one with given name. See also\n * [[Ruler.after]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.block.ruler.before('paragraph', 'my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.before = function (beforeName, ruleName, fn, options) {\n var index = this.__find__(beforeName);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + beforeName); }\n\n this.__rules__.splice(index, 0, {\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.after(afterName, ruleName, fn [, options])\n * - afterName (String): new rule will be added after this one.\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Add new rule to chain after one with given name. See also\n * [[Ruler.before]], [[Ruler.push]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.inline.ruler.after('text', 'my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.after = function (afterName, ruleName, fn, options) {\n var index = this.__find__(afterName);\n var opt = options || {};\n\n if (index === -1) { throw new Error('Parser rule not found: ' + afterName); }\n\n this.__rules__.splice(index + 1, 0, {\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n/**\n * Ruler.push(ruleName, fn [, options])\n * - ruleName (String): name of added rule.\n * - fn (Function): rule function.\n * - options (Object): rule options (not mandatory).\n *\n * Push new rule to the end of chain. See also\n * [[Ruler.before]], [[Ruler.after]].\n *\n * ##### Options:\n *\n * - __alt__ - array with names of \"alternate\" chains.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.core.ruler.push('my_rule', function replace(state) {\n * //...\n * });\n * ```\n **/\nRuler.prototype.push = function (ruleName, fn, options) {\n var opt = options || {};\n\n this.__rules__.push({\n name: ruleName,\n enabled: true,\n fn: fn,\n alt: opt.alt || []\n });\n\n this.__cache__ = null;\n};\n\n\n/**\n * Ruler.enable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to enable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.disable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.enable = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n var result = [];\n\n // Search by name and enable\n list.forEach(function (name) {\n var idx = this.__find__(name);\n\n if (idx < 0) {\n if (ignoreInvalid) { return; }\n throw new Error('Rules manager: invalid rule name ' + name);\n }\n this.__rules__[idx].enabled = true;\n result.push(name);\n }, this);\n\n this.__cache__ = null;\n return result;\n};\n\n\n/**\n * Ruler.enableOnly(list [, ignoreInvalid])\n * - list (String|Array): list of rule names to enable (whitelist).\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable rules with given names, and disable everything else. If any rule name\n * not found - throw Error. Errors can be disabled by second param.\n *\n * See also [[Ruler.disable]], [[Ruler.enable]].\n **/\nRuler.prototype.enableOnly = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n this.__rules__.forEach(function (rule) { rule.enabled = false; });\n\n this.enable(list, ignoreInvalid);\n};\n\n\n/**\n * Ruler.disable(list [, ignoreInvalid]) -> Array\n * - list (String|Array): list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Disable rules with given names. If any rule name not found - throw Error.\n * Errors can be disabled by second param.\n *\n * Returns list of found rule names (if no exception happened).\n *\n * See also [[Ruler.enable]], [[Ruler.enableOnly]].\n **/\nRuler.prototype.disable = function (list, ignoreInvalid) {\n if (!Array.isArray(list)) { list = [ list ]; }\n\n var result = [];\n\n // Search by name and disable\n list.forEach(function (name) {\n var idx = this.__find__(name);\n\n if (idx < 0) {\n if (ignoreInvalid) { return; }\n throw new Error('Rules manager: invalid rule name ' + name);\n }\n this.__rules__[idx].enabled = false;\n result.push(name);\n }, this);\n\n this.__cache__ = null;\n return result;\n};\n\n\n/**\n * Ruler.getRules(chainName) -> Array\n *\n * Return array of active functions (rules) for given chain name. It analyzes\n * rules configuration, compiles caches if not exists and returns result.\n *\n * Default chain name is `''` (empty string). It can't be skipped. That's\n * done intentionally, to keep signature monomorphic for high speed.\n **/\nRuler.prototype.getRules = function (chainName) {\n if (this.__cache__ === null) {\n this.__compile__();\n }\n\n // Chain can be empty, if rules disabled. But we still have to return Array.\n return this.__cache__[chainName] || [];\n};\n\nmodule.exports = Ruler;\n","// Token class\n\n'use strict';\n\n\n/**\n * class Token\n **/\n\n/**\n * new Token(type, tag, nesting)\n *\n * Create new token and fill passed properties.\n **/\nfunction Token(type, tag, nesting) {\n /**\n * Token#type -> String\n *\n * Type of the token (string, e.g. \"paragraph_open\")\n **/\n this.type = type;\n\n /**\n * Token#tag -> String\n *\n * html tag name, e.g. \"p\"\n **/\n this.tag = tag;\n\n /**\n * Token#attrs -> Array\n *\n * Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]`\n **/\n this.attrs = null;\n\n /**\n * Token#map -> Array\n *\n * Source map info. Format: `[ line_begin, line_end ]`\n **/\n this.map = null;\n\n /**\n * Token#nesting -> Number\n *\n * Level change (number in {-1, 0, 1} set), where:\n *\n * - `1` means the tag is opening\n * - `0` means the tag is self-closing\n * - `-1` means the tag is closing\n **/\n this.nesting = nesting;\n\n /**\n * Token#level -> Number\n *\n * nesting level, the same as `state.level`\n **/\n this.level = 0;\n\n /**\n * Token#children -> Array\n *\n * An array of child nodes (inline and img tokens)\n **/\n this.children = null;\n\n /**\n * Token#content -> String\n *\n * In a case of self-closing tag (code, html, fence, etc.),\n * it has contents of this tag.\n **/\n this.content = '';\n\n /**\n * Token#markup -> String\n *\n * '*' or '_' for emphasis, fence string for fence, etc.\n **/\n this.markup = '';\n\n /**\n * Token#info -> String\n *\n * fence infostring\n **/\n this.info = '';\n\n /**\n * Token#meta -> Object\n *\n * A place for plugins to store an arbitrary data\n **/\n this.meta = null;\n\n /**\n * Token#block -> Boolean\n *\n * True for block-level tokens, false for inline tokens.\n * Used in renderer to calculate line breaks\n **/\n this.block = false;\n\n /**\n * Token#hidden -> Boolean\n *\n * If it's true, ignore this element when rendering. Used for tight lists\n * to hide paragraphs.\n **/\n this.hidden = false;\n}\n\n\n/**\n * Token.attrIndex(name) -> Number\n *\n * Search attribute index by name.\n **/\nToken.prototype.attrIndex = function attrIndex(name) {\n var attrs, i, len;\n\n if (!this.attrs) { return -1; }\n\n attrs = this.attrs;\n\n for (i = 0, len = attrs.length; i < len; i++) {\n if (attrs[i][0] === name) { return i; }\n }\n return -1;\n};\n\n\n/**\n * Token.attrPush(attrData)\n *\n * Add `[ name, value ]` attribute to list. Init attrs if necessary\n **/\nToken.prototype.attrPush = function attrPush(attrData) {\n if (this.attrs) {\n this.attrs.push(attrData);\n } else {\n this.attrs = [ attrData ];\n }\n};\n\n\n/**\n * Token.attrSet(name, value)\n *\n * Set `name` attribute to `value`. Override old value if exists.\n **/\nToken.prototype.attrSet = function attrSet(name, value) {\n var idx = this.attrIndex(name),\n attrData = [ name, value ];\n\n if (idx < 0) {\n this.attrPush(attrData);\n } else {\n this.attrs[idx] = attrData;\n }\n};\n\n\n/**\n * Token.attrGet(name)\n *\n * Get the value of attribute `name`, or null if it does not exist.\n **/\nToken.prototype.attrGet = function attrGet(name) {\n var idx = this.attrIndex(name), value = null;\n if (idx >= 0) {\n value = this.attrs[idx][1];\n }\n return value;\n};\n\n\n/**\n * Token.attrJoin(name, value)\n *\n * Join value to existing attribute via space. Or create new attribute if not\n * exists. Useful to operate with token classes.\n **/\nToken.prototype.attrJoin = function attrJoin(name, value) {\n var idx = this.attrIndex(name);\n\n if (idx < 0) {\n this.attrPush([ name, value ]);\n } else {\n this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value;\n }\n};\n\n\nmodule.exports = Token;\n","// HTML5 entities map: { name -> utf16string }\n//\n'use strict';\n\n/*eslint quotes:0*/\nmodule.exports = require('entities/lib/maps/entities.json');\n","'use strict';\n\n\nmodule.exports.encode = require('./encode');\nmodule.exports.decode = require('./decode');\nmodule.exports.format = require('./format');\nmodule.exports.parse = require('./parse');\n","module.exports=/[\\0-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/","module.exports=/[\\0-\\x1F\\x7F-\\x9F]/","module.exports=/[ \\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]/","// Regexps to match html elements\n\n'use strict';\n\nvar attr_name = '[a-zA-Z_:][a-zA-Z0-9:._-]*';\n\nvar unquoted = '[^\"\\'=<>`\\\\x00-\\\\x20]+';\nvar single_quoted = \"'[^']*'\";\nvar double_quoted = '\"[^\"]*\"';\n\nvar attr_value = '(?:' + unquoted + '|' + single_quoted + '|' + double_quoted + ')';\n\nvar attribute = '(?:\\\\s+' + attr_name + '(?:\\\\s*=\\\\s*' + attr_value + ')?)';\n\nvar open_tag = '<[A-Za-z][A-Za-z0-9\\\\-]*' + attribute + '*\\\\s*\\\\/?>';\n\nvar close_tag = '<\\\\/[A-Za-z][A-Za-z0-9\\\\-]*\\\\s*>';\nvar comment = '|';\nvar processing = '<[?].*?[?]>';\nvar declaration = ']*>';\nvar cdata = '';\n\nvar HTML_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + '|' + comment +\n '|' + processing + '|' + declaration + '|' + cdata + ')');\nvar HTML_OPEN_CLOSE_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + ')');\n\nmodule.exports.HTML_TAG_RE = HTML_TAG_RE;\nmodule.exports.HTML_OPEN_CLOSE_TAG_RE = HTML_OPEN_CLOSE_TAG_RE;\n","// ~~strike through~~\n//\n'use strict';\n\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nmodule.exports.tokenize = function strikethrough(state, silent) {\n var i, scanned, token, len, ch,\n start = state.pos,\n marker = state.src.charCodeAt(start);\n\n if (silent) { return false; }\n\n if (marker !== 0x7E/* ~ */) { return false; }\n\n scanned = state.scanDelims(state.pos, true);\n len = scanned.length;\n ch = String.fromCharCode(marker);\n\n if (len < 2) { return false; }\n\n if (len % 2) {\n token = state.push('text', '', 0);\n token.content = ch;\n len--;\n }\n\n for (i = 0; i < len; i += 2) {\n token = state.push('text', '', 0);\n token.content = ch + ch;\n\n state.delimiters.push({\n marker: marker,\n length: 0, // disable \"rule of 3\" length checks meant for emphasis\n jump: i,\n token: state.tokens.length - 1,\n end: -1,\n open: scanned.can_open,\n close: scanned.can_close\n });\n }\n\n state.pos += scanned.length;\n\n return true;\n};\n\n\nfunction postProcess(state, delimiters) {\n var i, j,\n startDelim,\n endDelim,\n token,\n loneMarkers = [],\n max = delimiters.length;\n\n for (i = 0; i < max; i++) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== 0x7E/* ~ */) {\n continue;\n }\n\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n token = state.tokens[startDelim.token];\n token.type = 's_open';\n token.tag = 's';\n token.nesting = 1;\n token.markup = '~~';\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = 's_close';\n token.tag = 's';\n token.nesting = -1;\n token.markup = '~~';\n token.content = '';\n\n if (state.tokens[endDelim.token - 1].type === 'text' &&\n state.tokens[endDelim.token - 1].content === '~') {\n\n loneMarkers.push(endDelim.token - 1);\n }\n }\n\n // If a marker sequence has an odd number of characters, it's splitted\n // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the\n // start of the sequence.\n //\n // So, we have to move all those markers after subsequent s_close tags.\n //\n while (loneMarkers.length) {\n i = loneMarkers.pop();\n j = i + 1;\n\n while (j < state.tokens.length && state.tokens[j].type === 's_close') {\n j++;\n }\n\n j--;\n\n if (i !== j) {\n token = state.tokens[j];\n state.tokens[j] = state.tokens[i];\n state.tokens[i] = token;\n }\n }\n}\n\n\n// Walk through delimiter list and replace text tokens with tags\n//\nmodule.exports.postProcess = function strikethrough(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n postProcess(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n postProcess(state, tokens_meta[curr].delimiters);\n }\n }\n};\n","// Process *this* and _that_\n//\n'use strict';\n\n\n// Insert each marker as a separate text token, and add it to delimiter list\n//\nmodule.exports.tokenize = function emphasis(state, silent) {\n var i, scanned, token,\n start = state.pos,\n marker = state.src.charCodeAt(start);\n\n if (silent) { return false; }\n\n if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { return false; }\n\n scanned = state.scanDelims(state.pos, marker === 0x2A);\n\n for (i = 0; i < scanned.length; i++) {\n token = state.push('text', '', 0);\n token.content = String.fromCharCode(marker);\n\n state.delimiters.push({\n // Char code of the starting marker (number).\n //\n marker: marker,\n\n // Total length of these series of delimiters.\n //\n length: scanned.length,\n\n // An amount of characters before this one that's equivalent to\n // current one. In plain English: if this delimiter does not open\n // an emphasis, neither do previous `jump` characters.\n //\n // Used to skip sequences like \"*****\" in one step, for 1st asterisk\n // value will be 0, for 2nd it's 1 and so on.\n //\n jump: i,\n\n // A position of the token this delimiter corresponds to.\n //\n token: state.tokens.length - 1,\n\n // If this delimiter is matched as a valid opener, `end` will be\n // equal to its position, otherwise it's `-1`.\n //\n end: -1,\n\n // Boolean flags that determine if this delimiter could open or close\n // an emphasis.\n //\n open: scanned.can_open,\n close: scanned.can_close\n });\n }\n\n state.pos += scanned.length;\n\n return true;\n};\n\n\nfunction postProcess(state, delimiters) {\n var i,\n startDelim,\n endDelim,\n token,\n ch,\n isStrong,\n max = delimiters.length;\n\n for (i = max - 1; i >= 0; i--) {\n startDelim = delimiters[i];\n\n if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) {\n continue;\n }\n\n // Process only opening markers\n if (startDelim.end === -1) {\n continue;\n }\n\n endDelim = delimiters[startDelim.end];\n\n // If the previous delimiter has the same marker and is adjacent to this one,\n // merge those into one strong delimiter.\n //\n // `whatever` -> `whatever`\n //\n isStrong = i > 0 &&\n delimiters[i - 1].end === startDelim.end + 1 &&\n delimiters[i - 1].token === startDelim.token - 1 &&\n delimiters[startDelim.end + 1].token === endDelim.token + 1 &&\n delimiters[i - 1].marker === startDelim.marker;\n\n ch = String.fromCharCode(startDelim.marker);\n\n token = state.tokens[startDelim.token];\n token.type = isStrong ? 'strong_open' : 'em_open';\n token.tag = isStrong ? 'strong' : 'em';\n token.nesting = 1;\n token.markup = isStrong ? ch + ch : ch;\n token.content = '';\n\n token = state.tokens[endDelim.token];\n token.type = isStrong ? 'strong_close' : 'em_close';\n token.tag = isStrong ? 'strong' : 'em';\n token.nesting = -1;\n token.markup = isStrong ? ch + ch : ch;\n token.content = '';\n\n if (isStrong) {\n state.tokens[delimiters[i - 1].token].content = '';\n state.tokens[delimiters[startDelim.end + 1].token].content = '';\n i--;\n }\n }\n}\n\n\n// Walk through delimiter list and replace text tokens with tags\n//\nmodule.exports.postProcess = function emphasis(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n postProcess(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n postProcess(state, tokens_meta[curr].delimiters);\n }\n }\n};\n","import CommandButton from './CommandButton';\nimport FormDropdown from './FormDropdown';\nimport InsertImageDropdown from './InsertImageDropdown';\nimport InsertLinkDropdown from './InsertLinkDropdown';\nimport ListButton from './ListButton';\nimport MarkButton from './MarkButton';\nimport NodeTypeDropdown from './NodeTypeDropdown';\nimport ProseMirrorMenu from './ProseMirrorMenu';\n\nexport const components = {\n CommandButton: CommandButton,\n FormDropdown: FormDropdown,\n InsertImageDropdown: InsertImageDropdown,\n InsertLinkDropdown: InsertLinkDropdown,\n ListButton: ListButton,\n MarkButton: MarkButton,\n NodeTypeDropdown: NodeTypeDropdown,\n ProseMirrorMenu: ProseMirrorMenu,\n};\n","import updateToggleMark from './updateToggleMark';\n\nexport const commands = {\n updateToggleMark: updateToggleMark,\n};\n","import { toggleMark, updateMark } from 'tiptap-commands';\n\nexport default function updateToggleMark(type, attrs) {\n return function (state, dispatch) {\n if (state.selection.empty) {\n return toggleMark(type, attrs)(state, dispatch);\n }\n return updateMark(type, attrs)(state, dispatch);\n };\n}\n","import { commands } from './commands';\nimport { markdown } from './markdown';\nimport ProseMirrorEditorDriver from './ProseMirrorEditorDriver';\n\nexport const proseMirror = {\n commands: commands,\n markdown: markdown,\n ProseMirrorEditorDriver: ProseMirrorEditorDriver,\n};\n","import MarkdownParserBuilder from './MarkdownParserBuilder';\nimport MarkdownSerializerBuilder from './MarkdownSerializerBuilder';\nimport SchemaBuilder from './SchemaBuilder';\n\nexport const markdown = {\n MarkdownParserBuilder: MarkdownParserBuilder,\n MarkdownSerializerBuilder: MarkdownSerializerBuilder,\n SchemaBuilder: SchemaBuilder,\n};\n","import MenuState from './MenuState';\n\nexport const states = {\n MenuState: MenuState,\n};\n","import { extend, override } from 'flarum/common/extend';\n\nimport Button from 'flarum/common/components/Button';\nimport TextEditor from 'flarum/common/components/TextEditor';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport classList from 'flarum/common/utils/classList';\n\nimport ProseMirrorEditorDriver from './proseMirror/ProseMirrorEditorDriver';\nimport ProseMirrorMenu from './components/ProseMirrorMenu';\nimport MenuState from './states/MenuState';\n\nexport default function applyEditor() {\n extend(TextEditor.prototype, 'controlItems', function (items) {\n if (!app.forum.attribute('toggleRichTextEditorButton')) return;\n\n const buttonOnClick = () => {\n app.session.user.savePreferences({ useRichTextEditor: !app.session.user.preferences().useRichTextEditor }).then(() => {\n app.composer.editor.destroy();\n this.attrs.composer.editor = this.buildEditor(this.$('.TextEditor-editorContainer')[0]);\n m.redraw.sync();\n app.composer.editor.focus();\n });\n };\n\n items.add(\n 'rich-text',\n \n \n ,\n -10\n );\n });\n\n extend(TextEditor.prototype, 'toolbarItems', function (items) {\n if (!app.session.user.preferences().useRichTextEditor) return;\n\n items.remove('markdown');\n\n items.add('prosemirror-menu', , 100);\n });\n\n extend(TextEditor.prototype, 'buildEditorParams', function (items) {\n if (!app.session.user.preferences().useRichTextEditor) return;\n\n items.menuState = this.menuState = new MenuState();\n items.classNames.push('Post-body');\n items.escape = () => app.composer.close();\n });\n\n override(TextEditor.prototype, 'buildEditor', function (original, dom) {\n if (app.session.user.preferences().useRichTextEditor) {\n return new ProseMirrorEditorDriver(dom, this.buildEditorParams());\n }\n\n return original(dom);\n });\n}\n","module.exports = flarum.core.compat['common/utils/classList'];","// Process ~subscript~\n\n'use strict';\n\n// same as UNESCAPE_MD_RE plus a space\nvar UNESCAPE_RE = /\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;\n\n\nfunction subscript(state, silent) {\n var found,\n content,\n token,\n max = state.posMax,\n start = state.pos;\n\n if (state.src.charCodeAt(start) !== 0x7E/* ~ */) { return false; }\n if (silent) { return false; } // don't run any pairs in validation mode\n if (start + 2 >= max) { return false; }\n\n state.pos = start + 1;\n\n while (state.pos < max) {\n if (state.src.charCodeAt(state.pos) === 0x7E/* ~ */) {\n found = true;\n break;\n }\n\n state.md.inline.skipToken(state);\n }\n\n if (!found || start + 1 === state.pos) {\n state.pos = start;\n return false;\n }\n\n content = state.src.slice(start + 1, state.pos);\n\n // don't allow unescaped spaces/newlines inside\n if (content.match(/(^|[^\\\\])(\\\\\\\\)*\\s/)) {\n state.pos = start;\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + 1;\n\n // Earlier we checked !silent, but this implementation does not need it\n token = state.push('sub_open', 'sub', 1);\n token.markup = '~';\n\n token = state.push('text', '', 0);\n token.content = content.replace(UNESCAPE_RE, '$1');\n\n token = state.push('sub_close', 'sub', -1);\n token.markup = '~';\n\n state.pos = state.posMax + 1;\n state.posMax = max;\n return true;\n}\n\n\nmodule.exports = function sub_plugin(md) {\n md.inline.ruler.after('emphasis', 'sub', subscript);\n};\n","// Process ^superscript^\n\n'use strict';\n\n// same as UNESCAPE_MD_RE plus a space\nvar UNESCAPE_RE = /\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;\n\nfunction superscript(state, silent) {\n var found,\n content,\n token,\n max = state.posMax,\n start = state.pos;\n\n if (state.src.charCodeAt(start) !== 0x5E/* ^ */) { return false; }\n if (silent) { return false; } // don't run any pairs in validation mode\n if (start + 2 >= max) { return false; }\n\n state.pos = start + 1;\n\n while (state.pos < max) {\n if (state.src.charCodeAt(state.pos) === 0x5E/* ^ */) {\n found = true;\n break;\n }\n\n state.md.inline.skipToken(state);\n }\n\n if (!found || start + 1 === state.pos) {\n state.pos = start;\n return false;\n }\n\n content = state.src.slice(start + 1, state.pos);\n\n // don't allow unescaped spaces/newlines inside\n if (content.match(/(^|[^\\\\])(\\\\\\\\)*\\s/)) {\n state.pos = start;\n return false;\n }\n\n // found!\n state.posMax = state.pos;\n state.pos = start + 1;\n\n // Earlier we checked !silent, but this implementation does not need it\n token = state.push('sup_open', 'sup', 1);\n token.markup = '^';\n\n token = state.push('text', '', 0);\n token.content = content.replace(UNESCAPE_RE, '$1');\n\n token = state.push('sup_close', 'sup', -1);\n token.markup = '^';\n\n state.pos = state.posMax + 1;\n state.posMax = max;\n return true;\n}\n\n\nmodule.exports = function sup_plugin(md) {\n md.inline.ruler.after('emphasis', 'sup', superscript);\n};\n","// Process latex\n//\n\"use strict\";\n\nfunction isValidDelim(state, pos) {\n let prevChar,\n nextChar,\n max = state.posMax,\n can_open = true,\n can_close = true;\n\n prevChar = pos > 0 ? state.src.charCodeAt(pos - 1) : -1;\n nextChar = pos + 1 <= max ? state.src.charCodeAt(pos + 1) : -1;\n\n // Check non-whitespace conditions for opening and closing, and\n // check that closing delimeter isn't followed by a number\n if (\n prevChar === 0x20 /* \" \" */ ||\n prevChar === 0x09 /* \\t */ ||\n (nextChar >= 0x30 /* \"0\" */ && nextChar <= 0x39) /* \"9\" */\n ) {\n can_close = false;\n }\n if (nextChar === 0x20 /* \" \" */ || nextChar === 0x09 /* \\t */) {\n can_open = false;\n }\n\n return {\n can_open: can_open,\n can_close: can_close,\n };\n}\n\nfunction math_inline(state, silent) {\n let start, match, token, res, pos;\n\n if (state.src[state.pos] !== \"$\") {\n return false;\n }\n\n res = isValidDelim(state, state.pos);\n if (!res.can_open) {\n if (!silent) {\n state.pending += \"$\";\n }\n state.pos += 1;\n return true;\n }\n\n // First check for and bypass all properly escaped delimieters\n // This loop will assume that the first leading backtick can not\n // be the first character in state.src, which is known since\n // we have found an opening delimieter already.\n start = state.pos + 1;\n match = start;\n while ((match = state.src.indexOf(\"$\", match)) !== -1) {\n // Found potential $, look for escapes, pos will point to\n // first non escape when complete\n pos = match - 1;\n while (state.src[pos] === \"\\\\\") {\n pos -= 1;\n }\n\n // Even number of escapes, potential closing delimiter found\n if ((match - pos) % 2 == 1) {\n break;\n }\n match += 1;\n }\n\n // No closing delimter found. Consume $ and continue.\n if (match === -1) {\n if (!silent) {\n state.pending += \"$\";\n }\n state.pos = start;\n return true;\n }\n\n // Check if we have empty content, ie: $$. Do not parse.\n if (match - start === 0) {\n if (!silent) {\n state.pending += \"$$\";\n }\n state.pos = start + 1;\n return true;\n }\n\n // Check for valid closing delimiter\n res = isValidDelim(state, match);\n if (!res.can_close) {\n if (!silent) {\n state.pending += \"$\";\n }\n state.pos = start;\n return true;\n }\n\n if (!silent) {\n token = state.push(\"math_inline\", \"math\", 0);\n token.markup = \"$\";\n token.content = state.src.slice(start, match);\n }\n\n state.pos = match + 1;\n return true;\n}\n\nfunction math_block(state, start, end, silent) {\n let firstLine,\n lastLine,\n next,\n lastPos,\n found = false,\n token,\n pos = state.bMarks[start] + state.tShift[start],\n max = state.eMarks[start];\n\n if (pos + 2 > max) {\n return false;\n }\n if (state.src.slice(pos, pos + 2) !== \"$$\") {\n return false;\n }\n\n pos += 2;\n firstLine = state.src.slice(pos, max);\n\n if (silent) {\n return true;\n }\n if (firstLine.trim().slice(-2) === \"$$\") {\n // Single line expression\n firstLine = firstLine.trim().slice(0, -2);\n found = true;\n }\n\n for (next = start; !found;) {\n next++;\n\n if (next >= end) {\n break;\n }\n\n pos = state.bMarks[next] + state.tShift[next];\n max = state.eMarks[next];\n\n if (pos < max && state.tShift[next] < state.blkIndent) {\n // non-empty line with negative indent should stop the list:\n break;\n }\n\n if (state.src.slice(pos, max).trim().slice(-2) === \"$$\") {\n lastPos = state.src.slice(0, max).lastIndexOf(\"$$\");\n lastLine = state.src.slice(pos, lastPos);\n found = true;\n }\n }\n\n state.line = next + 1;\n\n token = state.push(\"math_block\", \"math\", 0);\n token.block = true;\n token.content =\n (firstLine && firstLine.trim() ? firstLine + \"\\n\" : \"\") +\n state.getLines(start + 1, next, state.tShift[start], true) +\n (lastLine && lastLine.trim() ? lastLine : \"\");\n token.map = [start, state.line];\n token.markup = \"$$\";\n return true;\n}\n\nmodule.exports = (md, options) => {\n options = options || {};\n options.server = options.server || \"https://math.now.sh\";\n options.style = options.style || \"\";\n const purifiedURL = (latex) => {\n return encodeURIComponent(latex).replace(\"(\", \"%28\").replace(\")\", \"%29\");\n };\n\n let Inline = (latex) => {\n try {\n return ``;\n } catch (error) {\n console.error(error);\n return latex;\n }\n };\n\n let Block = (latex) => {\n try {\n return `

                  `;\n } catch (error) {\n console.error(error);\n return latex;\n }\n };\n\n md.inline.ruler.after(\"escape\", \"math_inline\", math_inline);\n md.block.ruler.after(\"blockquote\", \"math_block\", math_block, {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n md.renderer.rules.math_inline = (tokens, idx) => {\n return Inline(tokens[idx].content);\n };\n md.renderer.rules.math_block = (tokens, idx) => {\n return Block(tokens[idx].content);\n };\n};\n","module.exports = flarum.core.compat['common/components/Modal'];","// Main parser class\n\n'use strict';\n\n\nvar utils = require('./common/utils');\nvar helpers = require('./helpers');\nvar Renderer = require('./renderer');\nvar ParserCore = require('./parser_core');\nvar ParserBlock = require('./parser_block');\nvar ParserInline = require('./parser_inline');\nvar LinkifyIt = require('linkify-it');\nvar mdurl = require('mdurl');\nvar punycode = require('punycode');\n\n\nvar config = {\n 'default': require('./presets/default'),\n zero: require('./presets/zero'),\n commonmark: require('./presets/commonmark')\n};\n\n////////////////////////////////////////////////////////////////////////////////\n//\n// This validator can prohibit more than really needed to prevent XSS. It's a\n// tradeoff to keep code simple and to be secure by default.\n//\n// If you need different setup - override validator method as you wish. Or\n// replace it with dummy function and use external sanitizer.\n//\n\nvar BAD_PROTO_RE = /^(vbscript|javascript|file|data):/;\nvar GOOD_DATA_RE = /^data:image\\/(gif|png|jpeg|webp);/;\n\nfunction validateLink(url) {\n // url should be normalized at this point, and existing entities are decoded\n var str = url.trim().toLowerCase();\n\n return BAD_PROTO_RE.test(str) ? (GOOD_DATA_RE.test(str) ? true : false) : true;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nvar RECODE_HOSTNAME_FOR = [ 'http:', 'https:', 'mailto:' ];\n\nfunction normalizeLink(url) {\n var parsed = mdurl.parse(url, true);\n\n if (parsed.hostname) {\n // Encode hostnames in urls like:\n // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n //\n // We don't encode unknown schemas, because it's likely that we encode\n // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n //\n if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n try {\n parsed.hostname = punycode.toASCII(parsed.hostname);\n } catch (er) { /**/ }\n }\n }\n\n return mdurl.encode(mdurl.format(parsed));\n}\n\nfunction normalizeLinkText(url) {\n var parsed = mdurl.parse(url, true);\n\n if (parsed.hostname) {\n // Encode hostnames in urls like:\n // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`\n //\n // We don't encode unknown schemas, because it's likely that we encode\n // something we shouldn't (e.g. `skype:name` treated as `skype:host`)\n //\n if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {\n try {\n parsed.hostname = punycode.toUnicode(parsed.hostname);\n } catch (er) { /**/ }\n }\n }\n\n return mdurl.decode(mdurl.format(parsed));\n}\n\n\n/**\n * class MarkdownIt\n *\n * Main parser/renderer class.\n *\n * ##### Usage\n *\n * ```javascript\n * // node.js, \"classic\" way:\n * var MarkdownIt = require('markdown-it'),\n * md = new MarkdownIt();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // node.js, the same, but with sugar:\n * var md = require('markdown-it')();\n * var result = md.render('# markdown-it rulezz!');\n *\n * // browser without AMD, added to \"window\" on script load\n * // Note, there are no dash.\n * var md = window.markdownit();\n * var result = md.render('# markdown-it rulezz!');\n * ```\n *\n * Single line rendering, without paragraph wrap:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * var result = md.renderInline('__markdown-it__ rulezz!');\n * ```\n **/\n\n/**\n * new MarkdownIt([presetName, options])\n * - presetName (String): optional, `commonmark` / `zero`\n * - options (Object)\n *\n * Creates parser instanse with given config. Can be called without `new`.\n *\n * ##### presetName\n *\n * MarkdownIt provides named presets as a convenience to quickly\n * enable/disable active syntax rules and options for common use cases.\n *\n * - [\"commonmark\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.js) -\n * configures parser to strict [CommonMark](http://commonmark.org/) mode.\n * - [default](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/default.js) -\n * similar to GFM, used when no preset name given. Enables all available rules,\n * but still without html, typographer & autolinker.\n * - [\"zero\"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.js) -\n * all rules disabled. Useful to quickly setup your config via `.enable()`.\n * For example, when you need only `bold` and `italic` markup and nothing else.\n *\n * ##### options:\n *\n * - __html__ - `false`. Set `true` to enable HTML tags in source. Be careful!\n * That's not safe! You may need external sanitizer to protect output from XSS.\n * It's better to extend features via plugins, instead of enabling HTML.\n * - __xhtmlOut__ - `false`. Set `true` to add '/' when closing single tags\n * (`
                  `). This is needed only for full CommonMark compatibility. In real\n * world you will need HTML output.\n * - __breaks__ - `false`. Set `true` to convert `\\n` in paragraphs into `
                  `.\n * - __langPrefix__ - `language-`. CSS language class prefix for fenced blocks.\n * Can be useful for external highlighters.\n * - __linkify__ - `false`. Set `true` to autoconvert URL-like text to links.\n * - __typographer__ - `false`. Set `true` to enable [some language-neutral\n * replacement](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.js) +\n * quotes beautification (smartquotes).\n * - __quotes__ - `“”‘’`, String or Array. Double + single quotes replacement\n * pairs, when typographer enabled and smartquotes on. For example, you can\n * use `'«»„“'` for Russian, `'„“‚‘'` for German, and\n * `['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›']` for French (including nbsp).\n * - __highlight__ - `null`. Highlighter function for fenced code blocks.\n * Highlighter `function (str, lang)` should return escaped HTML. It can also\n * return empty string if the source was not changed and should be escaped\n * externaly. If result starts with `):\n *\n * ```javascript\n * var hljs = require('highlight.js') // https://highlightjs.org/\n *\n * // Actual default values\n * var md = require('markdown-it')({\n * highlight: function (str, lang) {\n * if (lang && hljs.getLanguage(lang)) {\n * try {\n * return '
                  ' +\n *                hljs.highlight(lang, str, true).value +\n *                '
                  ';\n * } catch (__) {}\n * }\n *\n * return '
                  ' + md.utils.escapeHtml(str) + '
                  ';\n * }\n * });\n * ```\n *\n **/\nfunction MarkdownIt(presetName, options) {\n if (!(this instanceof MarkdownIt)) {\n return new MarkdownIt(presetName, options);\n }\n\n if (!options) {\n if (!utils.isString(presetName)) {\n options = presetName || {};\n presetName = 'default';\n }\n }\n\n /**\n * MarkdownIt#inline -> ParserInline\n *\n * Instance of [[ParserInline]]. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.inline = new ParserInline();\n\n /**\n * MarkdownIt#block -> ParserBlock\n *\n * Instance of [[ParserBlock]]. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.block = new ParserBlock();\n\n /**\n * MarkdownIt#core -> Core\n *\n * Instance of [[Core]] chain executor. You may need it to add new rules when\n * writing plugins. For simple rules control use [[MarkdownIt.disable]] and\n * [[MarkdownIt.enable]].\n **/\n this.core = new ParserCore();\n\n /**\n * MarkdownIt#renderer -> Renderer\n *\n * Instance of [[Renderer]]. Use it to modify output look. Or to add rendering\n * rules for new token types, generated by plugins.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * function myToken(tokens, idx, options, env, self) {\n * //...\n * return result;\n * };\n *\n * md.renderer.rules['my_token'] = myToken\n * ```\n *\n * See [[Renderer]] docs and [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js).\n **/\n this.renderer = new Renderer();\n\n /**\n * MarkdownIt#linkify -> LinkifyIt\n *\n * [linkify-it](https://github.com/markdown-it/linkify-it) instance.\n * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/linkify.js)\n * rule.\n **/\n this.linkify = new LinkifyIt();\n\n /**\n * MarkdownIt#validateLink(url) -> Boolean\n *\n * Link validation function. CommonMark allows too much in links. By default\n * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas\n * except some embedded image types.\n *\n * You can change this behaviour:\n *\n * ```javascript\n * var md = require('markdown-it')();\n * // enable everything\n * md.validateLink = function () { return true; }\n * ```\n **/\n this.validateLink = validateLink;\n\n /**\n * MarkdownIt#normalizeLink(url) -> String\n *\n * Function used to encode link url to a machine-readable format,\n * which includes url-encoding, punycode, etc.\n **/\n this.normalizeLink = normalizeLink;\n\n /**\n * MarkdownIt#normalizeLinkText(url) -> String\n *\n * Function used to decode link url to a human-readable format`\n **/\n this.normalizeLinkText = normalizeLinkText;\n\n\n // Expose utils & helpers for easy acces from plugins\n\n /**\n * MarkdownIt#utils -> utils\n *\n * Assorted utility functions, useful to write plugins. See details\n * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.js).\n **/\n this.utils = utils;\n\n /**\n * MarkdownIt#helpers -> helpers\n *\n * Link components parser functions, useful to write plugins. See details\n * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers).\n **/\n this.helpers = utils.assign({}, helpers);\n\n\n this.options = {};\n this.configure(presetName);\n\n if (options) { this.set(options); }\n}\n\n\n/** chainable\n * MarkdownIt.set(options)\n *\n * Set parser options (in the same format as in constructor). Probably, you\n * will never need it, but you can change options after constructor call.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n * .set({ html: true, breaks: true })\n * .set({ typographer, true });\n * ```\n *\n * __Note:__ To achieve the best possible performance, don't modify a\n * `markdown-it` instance options on the fly. If you need multiple configurations\n * it's best to create multiple instances and initialize each with separate\n * config.\n **/\nMarkdownIt.prototype.set = function (options) {\n utils.assign(this.options, options);\n return this;\n};\n\n\n/** chainable, internal\n * MarkdownIt.configure(presets)\n *\n * Batch load of all options and compenent settings. This is internal method,\n * and you probably will not need it. But if you with - see available presets\n * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets)\n *\n * We strongly recommend to use presets instead of direct config loads. That\n * will give better compatibility with next versions.\n **/\nMarkdownIt.prototype.configure = function (presets) {\n var self = this, presetName;\n\n if (utils.isString(presets)) {\n presetName = presets;\n presets = config[presetName];\n if (!presets) { throw new Error('Wrong `markdown-it` preset \"' + presetName + '\", check name'); }\n }\n\n if (!presets) { throw new Error('Wrong `markdown-it` preset, can\\'t be empty'); }\n\n if (presets.options) { self.set(presets.options); }\n\n if (presets.components) {\n Object.keys(presets.components).forEach(function (name) {\n if (presets.components[name].rules) {\n self[name].ruler.enableOnly(presets.components[name].rules);\n }\n if (presets.components[name].rules2) {\n self[name].ruler2.enableOnly(presets.components[name].rules2);\n }\n });\n }\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.enable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to enable\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * Enable list or rules. It will automatically find appropriate components,\n * containing rules with given names. If rule not found, and `ignoreInvalid`\n * not set - throws exception.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')()\n * .enable(['sub', 'sup'])\n * .disable('smartquotes');\n * ```\n **/\nMarkdownIt.prototype.enable = function (list, ignoreInvalid) {\n var result = [];\n\n if (!Array.isArray(list)) { list = [ list ]; }\n\n [ 'core', 'block', 'inline' ].forEach(function (chain) {\n result = result.concat(this[chain].ruler.enable(list, true));\n }, this);\n\n result = result.concat(this.inline.ruler2.enable(list, true));\n\n var missed = list.filter(function (name) { return result.indexOf(name) < 0; });\n\n if (missed.length && !ignoreInvalid) {\n throw new Error('MarkdownIt. Failed to enable unknown rule(s): ' + missed);\n }\n\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.disable(list, ignoreInvalid)\n * - list (String|Array): rule name or list of rule names to disable.\n * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.\n *\n * The same as [[MarkdownIt.enable]], but turn specified rules off.\n **/\nMarkdownIt.prototype.disable = function (list, ignoreInvalid) {\n var result = [];\n\n if (!Array.isArray(list)) { list = [ list ]; }\n\n [ 'core', 'block', 'inline' ].forEach(function (chain) {\n result = result.concat(this[chain].ruler.disable(list, true));\n }, this);\n\n result = result.concat(this.inline.ruler2.disable(list, true));\n\n var missed = list.filter(function (name) { return result.indexOf(name) < 0; });\n\n if (missed.length && !ignoreInvalid) {\n throw new Error('MarkdownIt. Failed to disable unknown rule(s): ' + missed);\n }\n return this;\n};\n\n\n/** chainable\n * MarkdownIt.use(plugin, params)\n *\n * Load specified plugin with given params into current parser instance.\n * It's just a sugar to call `plugin(md, params)` with curring.\n *\n * ##### Example\n *\n * ```javascript\n * var iterator = require('markdown-it-for-inline');\n * var md = require('markdown-it')()\n * .use(iterator, 'foo_replace', 'text', function (tokens, idx) {\n * tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar');\n * });\n * ```\n **/\nMarkdownIt.prototype.use = function (plugin /*, params, ... */) {\n var args = [ this ].concat(Array.prototype.slice.call(arguments, 1));\n plugin.apply(plugin, args);\n return this;\n};\n\n\n/** internal\n * MarkdownIt.parse(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Parse input string and returns list of block tokens (special token type\n * \"inline\" will contain list of inline tokens). You should not call this\n * method directly, until you write custom renderer (for example, to produce\n * AST).\n *\n * `env` is used to pass data between \"distributed\" rules and return additional\n * metadata like reference info, needed for the renderer. It also can be used to\n * inject data in specific cases. Usually, you will be ok to pass `{}`,\n * and then pass updated object to renderer.\n **/\nMarkdownIt.prototype.parse = function (src, env) {\n if (typeof src !== 'string') {\n throw new Error('Input data should be a String');\n }\n\n var state = new this.core.State(src, this, env);\n\n this.core.process(state);\n\n return state.tokens;\n};\n\n\n/**\n * MarkdownIt.render(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Render markdown string into html. It does all magic for you :).\n *\n * `env` can be used to inject additional metadata (`{}` by default).\n * But you will not need it with high probability. See also comment\n * in [[MarkdownIt.parse]].\n **/\nMarkdownIt.prototype.render = function (src, env) {\n env = env || {};\n\n return this.renderer.render(this.parse(src, env), this.options, env);\n};\n\n\n/** internal\n * MarkdownIt.parseInline(src, env) -> Array\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * The same as [[MarkdownIt.parse]] but skip all block rules. It returns the\n * block tokens list with the single `inline` element, containing parsed inline\n * tokens in `children` property. Also updates `env` object.\n **/\nMarkdownIt.prototype.parseInline = function (src, env) {\n var state = new this.core.State(src, this, env);\n\n state.inlineMode = true;\n this.core.process(state);\n\n return state.tokens;\n};\n\n\n/**\n * MarkdownIt.renderInline(src [, env]) -> String\n * - src (String): source string\n * - env (Object): environment sandbox\n *\n * Similar to [[MarkdownIt.render]] but for single paragraph content. Result\n * will NOT be wrapped into `

                  ` tags.\n **/\nMarkdownIt.prototype.renderInline = function (src, env) {\n env = env || {};\n\n return this.renderer.render(this.parseInline(src, env), this.options, env);\n};\n\n\nmodule.exports = MarkdownIt;\n","\n'use strict';\n\n\nvar encodeCache = {};\n\n\n// Create a lookup array where anything but characters in `chars` string\n// and alphanumeric chars is percent-encoded.\n//\nfunction getEncodeCache(exclude) {\n var i, ch, cache = encodeCache[exclude];\n if (cache) { return cache; }\n\n cache = encodeCache[exclude] = [];\n\n for (i = 0; i < 128; i++) {\n ch = String.fromCharCode(i);\n\n if (/^[0-9a-z]$/i.test(ch)) {\n // always allow unencoded alphanumeric characters\n cache.push(ch);\n } else {\n cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2));\n }\n }\n\n for (i = 0; i < exclude.length; i++) {\n cache[exclude.charCodeAt(i)] = exclude[i];\n }\n\n return cache;\n}\n\n\n// Encode unsafe characters with percent-encoding, skipping already\n// encoded sequences.\n//\n// - string - string to encode\n// - exclude - list of characters to ignore (in addition to a-zA-Z0-9)\n// - keepEscaped - don't encode '%' in a correct escape sequence (default: true)\n//\nfunction encode(string, exclude, keepEscaped) {\n var i, l, code, nextCode, cache,\n result = '';\n\n if (typeof exclude !== 'string') {\n // encode(string, keepEscaped)\n keepEscaped = exclude;\n exclude = encode.defaultChars;\n }\n\n if (typeof keepEscaped === 'undefined') {\n keepEscaped = true;\n }\n\n cache = getEncodeCache(exclude);\n\n for (i = 0, l = string.length; i < l; i++) {\n code = string.charCodeAt(i);\n\n if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {\n if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {\n result += string.slice(i, i + 3);\n i += 2;\n continue;\n }\n }\n\n if (code < 128) {\n result += cache[code];\n continue;\n }\n\n if (code >= 0xD800 && code <= 0xDFFF) {\n if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {\n nextCode = string.charCodeAt(i + 1);\n if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {\n result += encodeURIComponent(string[i] + string[i + 1]);\n i++;\n continue;\n }\n }\n result += '%EF%BF%BD';\n continue;\n }\n\n result += encodeURIComponent(string[i]);\n }\n\n return result;\n}\n\nencode.defaultChars = \";/?:@&=+$,-_.!~*'()#\";\nencode.componentChars = \"-_.!~*'()\";\n\n\nmodule.exports = encode;\n","\n'use strict';\n\n\n/* eslint-disable no-bitwise */\n\nvar decodeCache = {};\n\nfunction getDecodeCache(exclude) {\n var i, ch, cache = decodeCache[exclude];\n if (cache) { return cache; }\n\n cache = decodeCache[exclude] = [];\n\n for (i = 0; i < 128; i++) {\n ch = String.fromCharCode(i);\n cache.push(ch);\n }\n\n for (i = 0; i < exclude.length; i++) {\n ch = exclude.charCodeAt(i);\n cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2);\n }\n\n return cache;\n}\n\n\n// Decode percent-encoded string.\n//\nfunction decode(string, exclude) {\n var cache;\n\n if (typeof exclude !== 'string') {\n exclude = decode.defaultChars;\n }\n\n cache = getDecodeCache(exclude);\n\n return string.replace(/(%[a-f0-9]{2})+/gi, function(seq) {\n var i, l, b1, b2, b3, b4, chr,\n result = '';\n\n for (i = 0, l = seq.length; i < l; i += 3) {\n b1 = parseInt(seq.slice(i + 1, i + 3), 16);\n\n if (b1 < 0x80) {\n result += cache[b1];\n continue;\n }\n\n if ((b1 & 0xE0) === 0xC0 && (i + 3 < l)) {\n // 110xxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n\n if ((b2 & 0xC0) === 0x80) {\n chr = ((b1 << 6) & 0x7C0) | (b2 & 0x3F);\n\n if (chr < 0x80) {\n result += '\\ufffd\\ufffd';\n } else {\n result += String.fromCharCode(chr);\n }\n\n i += 3;\n continue;\n }\n }\n\n if ((b1 & 0xF0) === 0xE0 && (i + 6 < l)) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n\n if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n chr = ((b1 << 12) & 0xF000) | ((b2 << 6) & 0xFC0) | (b3 & 0x3F);\n\n if (chr < 0x800 || (chr >= 0xD800 && chr <= 0xDFFF)) {\n result += '\\ufffd\\ufffd\\ufffd';\n } else {\n result += String.fromCharCode(chr);\n }\n\n i += 6;\n continue;\n }\n }\n\n if ((b1 & 0xF8) === 0xF0 && (i + 9 < l)) {\n // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx\n b2 = parseInt(seq.slice(i + 4, i + 6), 16);\n b3 = parseInt(seq.slice(i + 7, i + 9), 16);\n b4 = parseInt(seq.slice(i + 10, i + 12), 16);\n\n if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) {\n chr = ((b1 << 18) & 0x1C0000) | ((b2 << 12) & 0x3F000) | ((b3 << 6) & 0xFC0) | (b4 & 0x3F);\n\n if (chr < 0x10000 || chr > 0x10FFFF) {\n result += '\\ufffd\\ufffd\\ufffd\\ufffd';\n } else {\n chr -= 0x10000;\n result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF));\n }\n\n i += 9;\n continue;\n }\n }\n\n result += '\\ufffd';\n }\n\n return result;\n });\n}\n\n\ndecode.defaultChars = ';/?:@&=+$,#';\ndecode.componentChars = '';\n\n\nmodule.exports = decode;\n","\n'use strict';\n\n\nmodule.exports = function format(url) {\n var result = '';\n\n result += url.protocol || '';\n result += url.slashes ? '//' : '';\n result += url.auth ? url.auth + '@' : '';\n\n if (url.hostname && url.hostname.indexOf(':') !== -1) {\n // ipv6 address\n result += '[' + url.hostname + ']';\n } else {\n result += url.hostname || '';\n }\n\n result += url.port ? ':' + url.port : '';\n result += url.pathname || '';\n result += url.search || '';\n result += url.hash || '';\n\n return result;\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n//\n// Changes from joyent/node:\n//\n// 1. No leading slash in paths,\n// e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/`\n//\n// 2. Backslashes are not replaced with slashes,\n// so `http:\\\\example.org\\` is treated like a relative path\n//\n// 3. Trailing colon is treated like a part of the path,\n// i.e. in `http://example.org:foo` pathname is `:foo`\n//\n// 4. Nothing is URL-encoded in the resulting object,\n// (in joyent/node some chars in auth and paths are encoded)\n//\n// 5. `url.parse()` does not have `parseQueryString` argument\n//\n// 6. Removed extraneous result properties: `host`, `path`, `query`, etc.,\n// which can be constructed using other parts of the url.\n//\n\n\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.pathname = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = [ '<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t' ],\n\n // RFC 2396: characters not allowed for various reasons.\n unwise = [ '{', '}', '|', '\\\\', '^', '`' ].concat(delims),\n\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = [ '\\'' ].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = [ '%', '/', '?', ';', '#' ].concat(autoEscape),\n hostEndingChars = [ '/', '?', '#' ],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n /* eslint-disable no-script-url */\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n };\n /* eslint-enable no-script-url */\n\nfunction urlParse(url, slashesDenoteHost) {\n if (url && url instanceof Url) { return url; }\n\n var u = new Url();\n u.parse(url, slashesDenoteHost);\n return u;\n}\n\nUrl.prototype.parse = function(url, slashesDenoteHost) {\n var i, l, lowerProto, hec, slashes,\n rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n }\n return this;\n }\n }\n\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n lowerProto = proto.toLowerCase();\n this.protocol = proto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n\n if (!hostlessProtocol[proto] &&\n (slashes || (proto && !slashedProtocol[proto]))) {\n\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (i = 0; i < hostEndingChars.length; i++) {\n hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n hostEnd = hec;\n }\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = auth;\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (i = 0; i < nonHostChars.length; i++) {\n hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {\n hostEnd = hec;\n }\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1) {\n hostEnd = rest.length;\n }\n\n if (rest[hostEnd - 1] === ':') { hostEnd--; }\n var host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost(host);\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' &&\n this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) { continue; }\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n }\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n }\n }\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n rest = rest.slice(0, qm);\n }\n if (rest) { this.pathname = rest; }\n if (slashedProtocol[lowerProto] &&\n this.hostname && !this.pathname) {\n this.pathname = '';\n }\n\n return this;\n};\n\nUrl.prototype.parseHost = function(host) {\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) { this.hostname = host; }\n};\n\nmodule.exports = urlParse;\n","'use strict';\n\nexports.Any = require('./properties/Any/regex');\nexports.Cc = require('./categories/Cc/regex');\nexports.Cf = require('./categories/Cf/regex');\nexports.P = require('./categories/P/regex');\nexports.Z = require('./categories/Z/regex');\n","module.exports=/[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/","// Just a shortcut for bulk export\n'use strict';\n\n\nexports.parseLinkLabel = require('./parse_link_label');\nexports.parseLinkDestination = require('./parse_link_destination');\nexports.parseLinkTitle = require('./parse_link_title');\n","// Parse link label\n//\n// this function assumes that first character (\"[\") already matches;\n// returns the end of the label\n//\n'use strict';\n\nmodule.exports = function parseLinkLabel(state, start, disableNested) {\n var level, found, marker, prevPos,\n labelEnd = -1,\n max = state.posMax,\n oldPos = state.pos;\n\n state.pos = start + 1;\n level = 1;\n\n while (state.pos < max) {\n marker = state.src.charCodeAt(state.pos);\n if (marker === 0x5D /* ] */) {\n level--;\n if (level === 0) {\n found = true;\n break;\n }\n }\n\n prevPos = state.pos;\n state.md.inline.skipToken(state);\n if (marker === 0x5B /* [ */) {\n if (prevPos === state.pos - 1) {\n // increase level if we find text `[`, which is not a part of any token\n level++;\n } else if (disableNested) {\n state.pos = oldPos;\n return -1;\n }\n }\n }\n\n if (found) {\n labelEnd = state.pos;\n }\n\n // restore old state\n state.pos = oldPos;\n\n return labelEnd;\n};\n","// Parse link destination\n//\n'use strict';\n\n\nvar unescapeAll = require('../common/utils').unescapeAll;\n\n\nmodule.exports = function parseLinkDestination(str, pos, max) {\n var code, level,\n lines = 0,\n start = pos,\n result = {\n ok: false,\n pos: 0,\n lines: 0,\n str: ''\n };\n\n if (str.charCodeAt(pos) === 0x3C /* < */) {\n pos++;\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === 0x0A /* \\n */) { return result; }\n if (code === 0x3E /* > */) {\n result.pos = pos + 1;\n result.str = unescapeAll(str.slice(start + 1, pos));\n result.ok = true;\n return result;\n }\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n pos++;\n }\n\n // no closing '>'\n return result;\n }\n\n // this should be ... } else { ... branch\n\n level = 0;\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x20) { break; }\n\n // ascii control characters\n if (code < 0x20 || code === 0x7F) { break; }\n\n if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n if (code === 0x28 /* ( */) {\n level++;\n }\n\n if (code === 0x29 /* ) */) {\n if (level === 0) { break; }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos) { return result; }\n if (level !== 0) { return result; }\n\n result.str = unescapeAll(str.slice(start, pos));\n result.lines = lines;\n result.pos = pos;\n result.ok = true;\n return result;\n};\n","// Parse link title\n//\n'use strict';\n\n\nvar unescapeAll = require('../common/utils').unescapeAll;\n\n\nmodule.exports = function parseLinkTitle(str, pos, max) {\n var code,\n marker,\n lines = 0,\n start = pos,\n result = {\n ok: false,\n pos: 0,\n lines: 0,\n str: ''\n };\n\n if (pos >= max) { return result; }\n\n marker = str.charCodeAt(pos);\n\n if (marker !== 0x22 /* \" */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return result; }\n\n pos++;\n\n // if opening marker is \"(\", switch it to closing marker \")\"\n if (marker === 0x28) { marker = 0x29; }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === marker) {\n result.pos = pos + 1;\n result.lines = lines;\n result.str = unescapeAll(str.slice(start + 1, pos));\n result.ok = true;\n return result;\n } else if (code === 0x0A) {\n lines++;\n } else if (code === 0x5C /* \\ */ && pos + 1 < max) {\n pos++;\n if (str.charCodeAt(pos) === 0x0A) {\n lines++;\n }\n }\n\n pos++;\n }\n\n return result;\n};\n","/**\n * class Renderer\n *\n * Generates HTML from parsed token stream. Each instance has independent\n * copy of rules. Those can be rewritten with ease. Also, you can add new\n * rules if you create plugin and adds new token types.\n **/\n'use strict';\n\n\nvar assign = require('./common/utils').assign;\nvar unescapeAll = require('./common/utils').unescapeAll;\nvar escapeHtml = require('./common/utils').escapeHtml;\n\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar default_rules = {};\n\n\ndefault_rules.code_inline = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n return '' +\n escapeHtml(tokens[idx].content) +\n '';\n};\n\n\ndefault_rules.code_block = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n return '' +\n escapeHtml(tokens[idx].content) +\n '\\n';\n};\n\n\ndefault_rules.fence = function (tokens, idx, options, env, slf) {\n var token = tokens[idx],\n info = token.info ? unescapeAll(token.info).trim() : '',\n langName = '',\n highlighted, i, tmpAttrs, tmpToken;\n\n if (info) {\n langName = info.split(/\\s+/g)[0];\n }\n\n if (options.highlight) {\n highlighted = options.highlight(token.content, langName) || escapeHtml(token.content);\n } else {\n highlighted = escapeHtml(token.content);\n }\n\n if (highlighted.indexOf(''\n + highlighted\n + '\\n';\n }\n\n\n return '

                  '\n        + highlighted\n        + '
                  \\n';\n};\n\n\ndefault_rules.image = function (tokens, idx, options, env, slf) {\n var token = tokens[idx];\n\n // \"alt\" attr MUST be set, even if empty. Because it's mandatory and\n // should be placed on proper position for tests.\n //\n // Replace content with actual value\n\n token.attrs[token.attrIndex('alt')][1] =\n slf.renderInlineAsText(token.children, options, env);\n\n return slf.renderToken(tokens, idx, options);\n};\n\n\ndefault_rules.hardbreak = function (tokens, idx, options /*, env */) {\n return options.xhtmlOut ? '
                  \\n' : '
                  \\n';\n};\ndefault_rules.softbreak = function (tokens, idx, options /*, env */) {\n return options.breaks ? (options.xhtmlOut ? '
                  \\n' : '
                  \\n') : '\\n';\n};\n\n\ndefault_rules.text = function (tokens, idx /*, options, env */) {\n return escapeHtml(tokens[idx].content);\n};\n\n\ndefault_rules.html_block = function (tokens, idx /*, options, env */) {\n return tokens[idx].content;\n};\ndefault_rules.html_inline = function (tokens, idx /*, options, env */) {\n return tokens[idx].content;\n};\n\n\n/**\n * new Renderer()\n *\n * Creates new [[Renderer]] instance and fill [[Renderer#rules]] with defaults.\n **/\nfunction Renderer() {\n\n /**\n * Renderer#rules -> Object\n *\n * Contains render rules for tokens. Can be updated and extended.\n *\n * ##### Example\n *\n * ```javascript\n * var md = require('markdown-it')();\n *\n * md.renderer.rules.strong_open = function () { return ''; };\n * md.renderer.rules.strong_close = function () { return ''; };\n *\n * var result = md.renderInline(...);\n * ```\n *\n * Each rule is called as independent static function with fixed signature:\n *\n * ```javascript\n * function my_token_render(tokens, idx, options, env, renderer) {\n * // ...\n * return renderedHTML;\n * }\n * ```\n *\n * See [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js)\n * for more details and examples.\n **/\n this.rules = assign({}, default_rules);\n}\n\n\n/**\n * Renderer.renderAttrs(token) -> String\n *\n * Render token attributes to string.\n **/\nRenderer.prototype.renderAttrs = function renderAttrs(token) {\n var i, l, result;\n\n if (!token.attrs) { return ''; }\n\n result = '';\n\n for (i = 0, l = token.attrs.length; i < l; i++) {\n result += ' ' + escapeHtml(token.attrs[i][0]) + '=\"' + escapeHtml(token.attrs[i][1]) + '\"';\n }\n\n return result;\n};\n\n\n/**\n * Renderer.renderToken(tokens, idx, options) -> String\n * - tokens (Array): list of tokens\n * - idx (Numbed): token index to render\n * - options (Object): params of parser instance\n *\n * Default token renderer. Can be overriden by custom function\n * in [[Renderer#rules]].\n **/\nRenderer.prototype.renderToken = function renderToken(tokens, idx, options) {\n var nextToken,\n result = '',\n needLf = false,\n token = tokens[idx];\n\n // Tight list paragraphs\n if (token.hidden) {\n return '';\n }\n\n // Insert a newline between hidden paragraph and subsequent opening\n // block-level tag.\n //\n // For example, here we should insert a newline before blockquote:\n // - a\n // >\n //\n if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) {\n result += '\\n';\n }\n\n // Add token name, e.g. `
                • `.\n //\n needLf = false;\n }\n }\n }\n }\n\n result += needLf ? '>\\n' : '>';\n\n return result;\n};\n\n\n/**\n * Renderer.renderInline(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to renter\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * The same as [[Renderer.render]], but for single token of `inline` type.\n **/\nRenderer.prototype.renderInline = function (tokens, options, env) {\n var type,\n result = '',\n rules = this.rules;\n\n for (var i = 0, len = tokens.length; i < len; i++) {\n type = tokens[i].type;\n\n if (typeof rules[type] !== 'undefined') {\n result += rules[type](tokens, i, options, env, this);\n } else {\n result += this.renderToken(tokens, i, options);\n }\n }\n\n return result;\n};\n\n\n/** internal\n * Renderer.renderInlineAsText(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to renter\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Special kludge for image `alt` attributes to conform CommonMark spec.\n * Don't try to use it! Spec requires to show `alt` content with stripped markup,\n * instead of simple escaping.\n **/\nRenderer.prototype.renderInlineAsText = function (tokens, options, env) {\n var result = '';\n\n for (var i = 0, len = tokens.length; i < len; i++) {\n if (tokens[i].type === 'text') {\n result += tokens[i].content;\n } else if (tokens[i].type === 'image') {\n result += this.renderInlineAsText(tokens[i].children, options, env);\n }\n }\n\n return result;\n};\n\n\n/**\n * Renderer.render(tokens, options, env) -> String\n * - tokens (Array): list on block tokens to renter\n * - options (Object): params of parser instance\n * - env (Object): additional data from parsed input (references, for example)\n *\n * Takes token stream and generates HTML. Probably, you will never need to call\n * this method directly.\n **/\nRenderer.prototype.render = function (tokens, options, env) {\n var i, len, type,\n result = '',\n rules = this.rules;\n\n for (i = 0, len = tokens.length; i < len; i++) {\n type = tokens[i].type;\n\n if (type === 'inline') {\n result += this.renderInline(tokens[i].children, options, env);\n } else if (typeof rules[type] !== 'undefined') {\n result += rules[tokens[i].type](tokens, i, options, env, this);\n } else {\n result += this.renderToken(tokens, i, options, env);\n }\n }\n\n return result;\n};\n\nmodule.exports = Renderer;\n","/** internal\n * class Core\n *\n * Top-level rules executor. Glues block/inline parsers and does intermediate\n * transformations.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\nvar _rules = [\n [ 'normalize', require('./rules_core/normalize') ],\n [ 'block', require('./rules_core/block') ],\n [ 'inline', require('./rules_core/inline') ],\n [ 'linkify', require('./rules_core/linkify') ],\n [ 'replacements', require('./rules_core/replacements') ],\n [ 'smartquotes', require('./rules_core/smartquotes') ]\n];\n\n\n/**\n * new Core()\n **/\nfunction Core() {\n /**\n * Core#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of core rules.\n **/\n this.ruler = new Ruler();\n\n for (var i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1]);\n }\n}\n\n\n/**\n * Core.process(state)\n *\n * Executes core chain rules.\n **/\nCore.prototype.process = function (state) {\n var i, l, rules;\n\n rules = this.ruler.getRules('');\n\n for (i = 0, l = rules.length; i < l; i++) {\n rules[i](state);\n }\n};\n\nCore.prototype.State = require('./rules_core/state_core');\n\n\nmodule.exports = Core;\n","// Normalize input string\n\n'use strict';\n\n\n// https://spec.commonmark.org/0.29/#line-ending\nvar NEWLINES_RE = /\\r\\n?|\\n/g;\nvar NULL_RE = /\\0/g;\n\n\nmodule.exports = function normalize(state) {\n var str;\n\n // Normalize newlines\n str = state.src.replace(NEWLINES_RE, '\\n');\n\n // Replace NULL characters\n str = str.replace(NULL_RE, '\\uFFFD');\n\n state.src = str;\n};\n","'use strict';\n\n\nmodule.exports = function block(state) {\n var token;\n\n if (state.inlineMode) {\n token = new state.Token('inline', '', 0);\n token.content = state.src;\n token.map = [ 0, 1 ];\n token.children = [];\n state.tokens.push(token);\n } else {\n state.md.block.parse(state.src, state.md, state.env, state.tokens);\n }\n};\n","'use strict';\n\nmodule.exports = function inline(state) {\n var tokens = state.tokens, tok, i, l;\n\n // Parse inlines\n for (i = 0, l = tokens.length; i < l; i++) {\n tok = tokens[i];\n if (tok.type === 'inline') {\n state.md.inline.parse(tok.content, state.md, state.env, tok.children);\n }\n }\n};\n","// Replace link-like texts with link nodes.\n//\n// Currently restricted by `md.validateLink()` to http/https/ftp\n//\n'use strict';\n\n\nvar arrayReplaceAt = require('../common/utils').arrayReplaceAt;\n\n\nfunction isLinkOpen(str) {\n return /^\\s]/i.test(str);\n}\nfunction isLinkClose(str) {\n return /^<\\/a\\s*>/i.test(str);\n}\n\n\nmodule.exports = function linkify(state) {\n var i, j, l, tokens, token, currentToken, nodes, ln, text, pos, lastPos,\n level, htmlLinkLevel, url, fullUrl, urlText,\n blockTokens = state.tokens,\n links;\n\n if (!state.md.options.linkify) { return; }\n\n for (j = 0, l = blockTokens.length; j < l; j++) {\n if (blockTokens[j].type !== 'inline' ||\n !state.md.linkify.pretest(blockTokens[j].content)) {\n continue;\n }\n\n tokens = blockTokens[j].children;\n\n htmlLinkLevel = 0;\n\n // We scan from the end, to keep position when new tags added.\n // Use reversed logic in links start/end match\n for (i = tokens.length - 1; i >= 0; i--) {\n currentToken = tokens[i];\n\n // Skip content of markdown links\n if (currentToken.type === 'link_close') {\n i--;\n while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') {\n i--;\n }\n continue;\n }\n\n // Skip content of html tag links\n if (currentToken.type === 'html_inline') {\n if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) {\n htmlLinkLevel--;\n }\n if (isLinkClose(currentToken.content)) {\n htmlLinkLevel++;\n }\n }\n if (htmlLinkLevel > 0) { continue; }\n\n if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) {\n\n text = currentToken.content;\n links = state.md.linkify.match(text);\n\n // Now split string to nodes\n nodes = [];\n level = currentToken.level;\n lastPos = 0;\n\n for (ln = 0; ln < links.length; ln++) {\n\n url = links[ln].url;\n fullUrl = state.md.normalizeLink(url);\n if (!state.md.validateLink(fullUrl)) { continue; }\n\n urlText = links[ln].text;\n\n // Linkifier might send raw hostnames like \"example.com\", where url\n // starts with domain name. So we prepend http:// in those cases,\n // and remove it afterwards.\n //\n if (!links[ln].schema) {\n urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\\/\\//, '');\n } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) {\n urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, '');\n } else {\n urlText = state.md.normalizeLinkText(urlText);\n }\n\n pos = links[ln].index;\n\n if (pos > lastPos) {\n token = new state.Token('text', '', 0);\n token.content = text.slice(lastPos, pos);\n token.level = level;\n nodes.push(token);\n }\n\n token = new state.Token('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.level = level++;\n token.markup = 'linkify';\n token.info = 'auto';\n nodes.push(token);\n\n token = new state.Token('text', '', 0);\n token.content = urlText;\n token.level = level;\n nodes.push(token);\n\n token = new state.Token('link_close', 'a', -1);\n token.level = --level;\n token.markup = 'linkify';\n token.info = 'auto';\n nodes.push(token);\n\n lastPos = links[ln].lastIndex;\n }\n if (lastPos < text.length) {\n token = new state.Token('text', '', 0);\n token.content = text.slice(lastPos);\n token.level = level;\n nodes.push(token);\n }\n\n // replace current node\n blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes);\n }\n }\n }\n};\n","// Simple typographic replacements\n//\n// (c) (C) → ©\n// (tm) (TM) → ™\n// (r) (R) → ®\n// +- → ±\n// (p) (P) -> §\n// ... → … (also ?.... → ?.., !.... → !..)\n// ???????? → ???, !!!!! → !!!, `,,` → `,`\n// -- → –, --- → —\n//\n'use strict';\n\n// TODO:\n// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾\n// - miltiplication 2 x 4 -> 2 × 4\n\nvar RARE_RE = /\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/;\n\n// Workaround for phantomjs - need regex without /g flag,\n// or root check will fail every second time\nvar SCOPED_ABBR_TEST_RE = /\\((c|tm|r|p)\\)/i;\n\nvar SCOPED_ABBR_RE = /\\((c|tm|r|p)\\)/ig;\nvar SCOPED_ABBR = {\n c: '©',\n r: '®',\n p: '§',\n tm: '™'\n};\n\nfunction replaceFn(match, name) {\n return SCOPED_ABBR[name.toLowerCase()];\n}\n\nfunction replace_scoped(inlineTokens) {\n var i, token, inside_autolink = 0;\n\n for (i = inlineTokens.length - 1; i >= 0; i--) {\n token = inlineTokens[i];\n\n if (token.type === 'text' && !inside_autolink) {\n token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn);\n }\n\n if (token.type === 'link_open' && token.info === 'auto') {\n inside_autolink--;\n }\n\n if (token.type === 'link_close' && token.info === 'auto') {\n inside_autolink++;\n }\n }\n}\n\nfunction replace_rare(inlineTokens) {\n var i, token, inside_autolink = 0;\n\n for (i = inlineTokens.length - 1; i >= 0; i--) {\n token = inlineTokens[i];\n\n if (token.type === 'text' && !inside_autolink) {\n if (RARE_RE.test(token.content)) {\n token.content = token.content\n .replace(/\\+-/g, '±')\n // .., ..., ....... -> …\n // but ?..... & !..... -> ?.. & !..\n .replace(/\\.{2,}/g, '…').replace(/([?!])…/g, '$1..')\n .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',')\n // em-dash\n .replace(/(^|[^-])---([^-]|$)/mg, '$1\\u2014$2')\n // en-dash\n .replace(/(^|\\s)--(\\s|$)/mg, '$1\\u2013$2')\n .replace(/(^|[^-\\s])--([^-\\s]|$)/mg, '$1\\u2013$2');\n }\n }\n\n if (token.type === 'link_open' && token.info === 'auto') {\n inside_autolink--;\n }\n\n if (token.type === 'link_close' && token.info === 'auto') {\n inside_autolink++;\n }\n }\n}\n\n\nmodule.exports = function replace(state) {\n var blkIdx;\n\n if (!state.md.options.typographer) { return; }\n\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n\n if (state.tokens[blkIdx].type !== 'inline') { continue; }\n\n if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) {\n replace_scoped(state.tokens[blkIdx].children);\n }\n\n if (RARE_RE.test(state.tokens[blkIdx].content)) {\n replace_rare(state.tokens[blkIdx].children);\n }\n\n }\n};\n","// Convert straight quotation marks to typographic ones\n//\n'use strict';\n\n\nvar isWhiteSpace = require('../common/utils').isWhiteSpace;\nvar isPunctChar = require('../common/utils').isPunctChar;\nvar isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;\n\nvar QUOTE_TEST_RE = /['\"]/;\nvar QUOTE_RE = /['\"]/g;\nvar APOSTROPHE = '\\u2019'; /* ’ */\n\n\nfunction replaceAt(str, index, ch) {\n return str.substr(0, index) + ch + str.substr(index + 1);\n}\n\nfunction process_inlines(tokens, state) {\n var i, token, text, t, pos, max, thisLevel, item, lastChar, nextChar,\n isLastPunctChar, isNextPunctChar, isLastWhiteSpace, isNextWhiteSpace,\n canOpen, canClose, j, isSingle, stack, openQuote, closeQuote;\n\n stack = [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n\n thisLevel = tokens[i].level;\n\n for (j = stack.length - 1; j >= 0; j--) {\n if (stack[j].level <= thisLevel) { break; }\n }\n stack.length = j + 1;\n\n if (token.type !== 'text') { continue; }\n\n text = token.content;\n pos = 0;\n max = text.length;\n\n /*eslint no-labels:0,block-scoped-var:0*/\n OUTER:\n while (pos < max) {\n QUOTE_RE.lastIndex = pos;\n t = QUOTE_RE.exec(text);\n if (!t) { break; }\n\n canOpen = canClose = true;\n pos = t.index + 1;\n isSingle = (t[0] === \"'\");\n\n // Find previous character,\n // default to space if it's the beginning of the line\n //\n lastChar = 0x20;\n\n if (t.index - 1 >= 0) {\n lastChar = text.charCodeAt(t.index - 1);\n } else {\n for (j = i - 1; j >= 0; j--) {\n if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // lastChar defaults to 0x20\n if (tokens[j].type !== 'text') continue;\n\n lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1);\n break;\n }\n }\n\n // Find next character,\n // default to space if it's the end of the line\n //\n nextChar = 0x20;\n\n if (pos < max) {\n nextChar = text.charCodeAt(pos);\n } else {\n for (j = i + 1; j < tokens.length; j++) {\n if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // nextChar defaults to 0x20\n if (tokens[j].type !== 'text') continue;\n\n nextChar = tokens[j].content.charCodeAt(0);\n break;\n }\n }\n\n isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));\n isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));\n\n isLastWhiteSpace = isWhiteSpace(lastChar);\n isNextWhiteSpace = isWhiteSpace(nextChar);\n\n if (isNextWhiteSpace) {\n canOpen = false;\n } else if (isNextPunctChar) {\n if (!(isLastWhiteSpace || isLastPunctChar)) {\n canOpen = false;\n }\n }\n\n if (isLastWhiteSpace) {\n canClose = false;\n } else if (isLastPunctChar) {\n if (!(isNextWhiteSpace || isNextPunctChar)) {\n canClose = false;\n }\n }\n\n if (nextChar === 0x22 /* \" */ && t[0] === '\"') {\n if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) {\n // special case: 1\"\" - count first quote as an inch\n canClose = canOpen = false;\n }\n }\n\n if (canOpen && canClose) {\n // treat this as the middle of the word\n canOpen = false;\n canClose = isNextPunctChar;\n }\n\n if (!canOpen && !canClose) {\n // middle of word\n if (isSingle) {\n token.content = replaceAt(token.content, t.index, APOSTROPHE);\n }\n continue;\n }\n\n if (canClose) {\n // this could be a closing quote, rewind the stack to get a match\n for (j = stack.length - 1; j >= 0; j--) {\n item = stack[j];\n if (stack[j].level < thisLevel) { break; }\n if (item.single === isSingle && stack[j].level === thisLevel) {\n item = stack[j];\n\n if (isSingle) {\n openQuote = state.md.options.quotes[2];\n closeQuote = state.md.options.quotes[3];\n } else {\n openQuote = state.md.options.quotes[0];\n closeQuote = state.md.options.quotes[1];\n }\n\n // replace token.content *before* tokens[item.token].content,\n // because, if they are pointing at the same token, replaceAt\n // could mess up indices when quote length != 1\n token.content = replaceAt(token.content, t.index, closeQuote);\n tokens[item.token].content = replaceAt(\n tokens[item.token].content, item.pos, openQuote);\n\n pos += closeQuote.length - 1;\n if (item.token === i) { pos += openQuote.length - 1; }\n\n text = token.content;\n max = text.length;\n\n stack.length = j;\n continue OUTER;\n }\n }\n }\n\n if (canOpen) {\n stack.push({\n token: i,\n pos: t.index,\n single: isSingle,\n level: thisLevel\n });\n } else if (canClose && isSingle) {\n token.content = replaceAt(token.content, t.index, APOSTROPHE);\n }\n }\n }\n}\n\n\nmodule.exports = function smartquotes(state) {\n /*eslint max-depth:0*/\n var blkIdx;\n\n if (!state.md.options.typographer) { return; }\n\n for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {\n\n if (state.tokens[blkIdx].type !== 'inline' ||\n !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) {\n continue;\n }\n\n process_inlines(state.tokens[blkIdx].children, state);\n }\n};\n","// Core state object\n//\n'use strict';\n\nvar Token = require('../token');\n\n\nfunction StateCore(src, md, env) {\n this.src = src;\n this.env = env;\n this.tokens = [];\n this.inlineMode = false;\n this.md = md; // link to parser instance\n}\n\n// re-export Token class to use in core rules\nStateCore.prototype.Token = Token;\n\n\nmodule.exports = StateCore;\n","/** internal\n * class ParserBlock\n *\n * Block-level tokenizer.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\nvar _rules = [\n // First 2 params - rule name & source. Secondary array - list of rules,\n // which can be terminated by this one.\n [ 'table', require('./rules_block/table'), [ 'paragraph', 'reference' ] ],\n [ 'code', require('./rules_block/code') ],\n [ 'fence', require('./rules_block/fence'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'blockquote', require('./rules_block/blockquote'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'hr', require('./rules_block/hr'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],\n [ 'list', require('./rules_block/list'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'reference', require('./rules_block/reference') ],\n [ 'heading', require('./rules_block/heading'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'lheading', require('./rules_block/lheading') ],\n [ 'html_block', require('./rules_block/html_block'), [ 'paragraph', 'reference', 'blockquote' ] ],\n [ 'paragraph', require('./rules_block/paragraph') ]\n];\n\n\n/**\n * new ParserBlock()\n **/\nfunction ParserBlock() {\n /**\n * ParserBlock#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of block rules.\n **/\n this.ruler = new Ruler();\n\n for (var i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1], { alt: (_rules[i][2] || []).slice() });\n }\n}\n\n\n// Generate tokens for input range\n//\nParserBlock.prototype.tokenize = function (state, startLine, endLine) {\n var ok, i,\n rules = this.ruler.getRules(''),\n len = rules.length,\n line = startLine,\n hasEmptyLines = false,\n maxNesting = state.md.options.maxNesting;\n\n while (line < endLine) {\n state.line = line = state.skipEmptyLines(line);\n if (line >= endLine) { break; }\n\n // Termination condition for nested calls.\n // Nested calls currently used for blockquotes & lists\n if (state.sCount[line] < state.blkIndent) { break; }\n\n // If nesting level exceeded - skip tail to the end. That's not ordinary\n // situation and we should not care about content.\n if (state.level >= maxNesting) {\n state.line = endLine;\n break;\n }\n\n // Try all possible rules.\n // On success, rule should:\n //\n // - update `state.line`\n // - update `state.tokens`\n // - return true\n\n for (i = 0; i < len; i++) {\n ok = rules[i](state, line, endLine, false);\n if (ok) { break; }\n }\n\n // set state.tight if we had an empty line before current tag\n // i.e. latest empty line should not count\n state.tight = !hasEmptyLines;\n\n // paragraph might \"eat\" one newline after it in nested lists\n if (state.isEmpty(state.line - 1)) {\n hasEmptyLines = true;\n }\n\n line = state.line;\n\n if (line < endLine && state.isEmpty(line)) {\n hasEmptyLines = true;\n line++;\n state.line = line;\n }\n }\n};\n\n\n/**\n * ParserBlock.parse(str, md, env, outTokens)\n *\n * Process input string and push block tokens into `outTokens`\n **/\nParserBlock.prototype.parse = function (src, md, env, outTokens) {\n var state;\n\n if (!src) { return; }\n\n state = new this.State(src, md, env, outTokens);\n\n this.tokenize(state, state.line, state.lineMax);\n};\n\n\nParserBlock.prototype.State = require('./rules_block/state_block');\n\n\nmodule.exports = ParserBlock;\n","// GFM table, non-standard\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nfunction getLine(state, line) {\n var pos = state.bMarks[line] + state.blkIndent,\n max = state.eMarks[line];\n\n return state.src.substr(pos, max - pos);\n}\n\nfunction escapedSplit(str) {\n var result = [],\n pos = 0,\n max = str.length,\n ch,\n escapes = 0,\n lastPos = 0,\n backTicked = false,\n lastBackTick = 0;\n\n ch = str.charCodeAt(pos);\n\n while (pos < max) {\n if (ch === 0x60/* ` */) {\n if (backTicked) {\n // make \\` close code sequence, but not open it;\n // the reason is: `\\` is correct code block\n backTicked = false;\n lastBackTick = pos;\n } else if (escapes % 2 === 0) {\n backTicked = true;\n lastBackTick = pos;\n }\n } else if (ch === 0x7c/* | */ && (escapes % 2 === 0) && !backTicked) {\n result.push(str.substring(lastPos, pos));\n lastPos = pos + 1;\n }\n\n if (ch === 0x5c/* \\ */) {\n escapes++;\n } else {\n escapes = 0;\n }\n\n pos++;\n\n // If there was an un-closed backtick, go back to just after\n // the last backtick, but as if it was a normal character\n if (pos === max && backTicked) {\n backTicked = false;\n pos = lastBackTick + 1;\n }\n\n ch = str.charCodeAt(pos);\n }\n\n result.push(str.substring(lastPos));\n\n return result;\n}\n\n\nmodule.exports = function table(state, startLine, endLine, silent) {\n var ch, lineText, pos, i, nextLine, columns, columnCount, token,\n aligns, t, tableLines, tbodyLines;\n\n // should have at least two lines\n if (startLine + 2 > endLine) { return false; }\n\n nextLine = startLine + 1;\n\n if (state.sCount[nextLine] < state.blkIndent) { return false; }\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[nextLine] - state.blkIndent >= 4) { return false; }\n\n // first character of the second line should be '|', '-', ':',\n // and no other characters are allowed but spaces;\n // basically, this is the equivalent of /^[-:|][-:|\\s]*$/ regexp\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n if (pos >= state.eMarks[nextLine]) { return false; }\n\n ch = state.src.charCodeAt(pos++);\n if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */) { return false; }\n\n while (pos < state.eMarks[nextLine]) {\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */ && !isSpace(ch)) { return false; }\n\n pos++;\n }\n\n lineText = getLine(state, startLine + 1);\n\n columns = lineText.split('|');\n aligns = [];\n for (i = 0; i < columns.length; i++) {\n t = columns[i].trim();\n if (!t) {\n // allow empty columns before and after table, but not in between columns;\n // e.g. allow ` |---| `, disallow ` ---||--- `\n if (i === 0 || i === columns.length - 1) {\n continue;\n } else {\n return false;\n }\n }\n\n if (!/^:?-+:?$/.test(t)) { return false; }\n if (t.charCodeAt(t.length - 1) === 0x3A/* : */) {\n aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right');\n } else if (t.charCodeAt(0) === 0x3A/* : */) {\n aligns.push('left');\n } else {\n aligns.push('');\n }\n }\n\n lineText = getLine(state, startLine).trim();\n if (lineText.indexOf('|') === -1) { return false; }\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n columns = escapedSplit(lineText.replace(/^\\||\\|$/g, ''));\n\n // header row will define an amount of columns in the entire table,\n // and align row shouldn't be smaller than that (the rest of the rows can)\n columnCount = columns.length;\n if (columnCount > aligns.length) { return false; }\n\n if (silent) { return true; }\n\n token = state.push('table_open', 'table', 1);\n token.map = tableLines = [ startLine, 0 ];\n\n token = state.push('thead_open', 'thead', 1);\n token.map = [ startLine, startLine + 1 ];\n\n token = state.push('tr_open', 'tr', 1);\n token.map = [ startLine, startLine + 1 ];\n\n for (i = 0; i < columns.length; i++) {\n token = state.push('th_open', 'th', 1);\n token.map = [ startLine, startLine + 1 ];\n if (aligns[i]) {\n token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ];\n }\n\n token = state.push('inline', '', 0);\n token.content = columns[i].trim();\n token.map = [ startLine, startLine + 1 ];\n token.children = [];\n\n token = state.push('th_close', 'th', -1);\n }\n\n token = state.push('tr_close', 'tr', -1);\n token = state.push('thead_close', 'thead', -1);\n\n token = state.push('tbody_open', 'tbody', 1);\n token.map = tbodyLines = [ startLine + 2, 0 ];\n\n for (nextLine = startLine + 2; nextLine < endLine; nextLine++) {\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n lineText = getLine(state, nextLine).trim();\n if (lineText.indexOf('|') === -1) { break; }\n if (state.sCount[nextLine] - state.blkIndent >= 4) { break; }\n columns = escapedSplit(lineText.replace(/^\\||\\|$/g, ''));\n\n token = state.push('tr_open', 'tr', 1);\n for (i = 0; i < columnCount; i++) {\n token = state.push('td_open', 'td', 1);\n if (aligns[i]) {\n token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ];\n }\n\n token = state.push('inline', '', 0);\n token.content = columns[i] ? columns[i].trim() : '';\n token.children = [];\n\n token = state.push('td_close', 'td', -1);\n }\n token = state.push('tr_close', 'tr', -1);\n }\n token = state.push('tbody_close', 'tbody', -1);\n token = state.push('table_close', 'table', -1);\n\n tableLines[1] = tbodyLines[1] = nextLine;\n state.line = nextLine;\n return true;\n};\n","// Code block (4 spaces padded)\n\n'use strict';\n\n\nmodule.exports = function code(state, startLine, endLine/*, silent*/) {\n var nextLine, last, token;\n\n if (state.sCount[startLine] - state.blkIndent < 4) { return false; }\n\n last = nextLine = startLine + 1;\n\n while (nextLine < endLine) {\n if (state.isEmpty(nextLine)) {\n nextLine++;\n continue;\n }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n nextLine++;\n last = nextLine;\n continue;\n }\n break;\n }\n\n state.line = last;\n\n token = state.push('code_block', 'code', 0);\n token.content = state.getLines(startLine, last, 4 + state.blkIndent, true);\n token.map = [ startLine, state.line ];\n\n return true;\n};\n","// fences (``` lang, ~~~ lang)\n\n'use strict';\n\n\nmodule.exports = function fence(state, startLine, endLine, silent) {\n var marker, len, params, nextLine, mem, token, markup,\n haveEndMarker = false,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (pos + 3 > max) { return false; }\n\n marker = state.src.charCodeAt(pos);\n\n if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) {\n return false;\n }\n\n // scan marker length\n mem = pos;\n pos = state.skipChars(pos, marker);\n\n len = pos - mem;\n\n if (len < 3) { return false; }\n\n markup = state.src.slice(mem, pos);\n params = state.src.slice(pos, max);\n\n if (marker === 0x60 /* ` */) {\n if (params.indexOf(String.fromCharCode(marker)) >= 0) {\n return false;\n }\n }\n\n // Since start is found, we can report success here in validation mode\n if (silent) { return true; }\n\n // search end of block\n nextLine = startLine;\n\n for (;;) {\n nextLine++;\n if (nextLine >= endLine) {\n // unclosed block should be autoclosed by end of document.\n // also block seems to be autoclosed by end of parent\n break;\n }\n\n pos = mem = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos < max && state.sCount[nextLine] < state.blkIndent) {\n // non-empty line with negative indent should stop the list:\n // - ```\n // test\n break;\n }\n\n if (state.src.charCodeAt(pos) !== marker) { continue; }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n // closing fence should be indented less than 4 spaces\n continue;\n }\n\n pos = state.skipChars(pos, marker);\n\n // closing code fence must be at least as long as the opening one\n if (pos - mem < len) { continue; }\n\n // make sure tail has spaces only\n pos = state.skipSpaces(pos);\n\n if (pos < max) { continue; }\n\n haveEndMarker = true;\n // found!\n break;\n }\n\n // If a fence has heading spaces, they should be removed from its inner block\n len = state.sCount[startLine];\n\n state.line = nextLine + (haveEndMarker ? 1 : 0);\n\n token = state.push('fence', 'code', 0);\n token.info = params;\n token.content = state.getLines(startLine + 1, nextLine, len, true);\n token.markup = markup;\n token.map = [ startLine, state.line ];\n\n return true;\n};\n","// Block quotes\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function blockquote(state, startLine, endLine, silent) {\n var adjustTab,\n ch,\n i,\n initial,\n l,\n lastLineEmpty,\n lines,\n nextLine,\n offset,\n oldBMarks,\n oldBSCount,\n oldIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n spaceAfterMarker,\n terminate,\n terminatorRules,\n token,\n wasOutdented,\n oldLineMax = state.lineMax,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n // check the block quote marker\n if (state.src.charCodeAt(pos++) !== 0x3E/* > */) { return false; }\n\n // we know that it's going to be a valid blockquote,\n // so no point trying to find the end of it in silent mode\n if (silent) { return true; }\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[startLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks = [ state.bMarks[startLine] ];\n state.bMarks[startLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[startLine] + (adjustTab ? 1 : 0)) % 4;\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n oldBSCount = [ state.bsCount[startLine] ];\n state.bsCount[startLine] = state.sCount[startLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n lastLineEmpty = pos >= max;\n\n oldSCount = [ state.sCount[startLine] ];\n state.sCount[startLine] = offset - initial;\n\n oldTShift = [ state.tShift[startLine] ];\n state.tShift[startLine] = pos - state.bMarks[startLine];\n\n terminatorRules = state.md.block.ruler.getRules('blockquote');\n\n oldParentType = state.parentType;\n state.parentType = 'blockquote';\n wasOutdented = false;\n\n // Search the end of the block\n //\n // Block ends with either:\n // 1. an empty line outside:\n // ```\n // > test\n //\n // ```\n // 2. an empty line inside:\n // ```\n // >\n // test\n // ```\n // 3. another tag:\n // ```\n // > test\n // - - -\n // ```\n for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {\n // check if it's outdented, i.e. it's inside list item and indented\n // less than said list item:\n //\n // ```\n // 1. anything\n // > current blockquote\n // 2. checking this line\n // ```\n if (state.sCount[nextLine] < state.blkIndent) wasOutdented = true;\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos >= max) {\n // Case 1: line is not inside the blockquote, and this line is empty.\n break;\n }\n\n if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !wasOutdented) {\n // This line is inside the blockquote.\n\n // skip spaces after \">\" and re-calculate offset\n initial = offset = state.sCount[nextLine] + pos - (state.bMarks[nextLine] + state.tShift[nextLine]);\n\n // skip one optional space after '>'\n if (state.src.charCodeAt(pos) === 0x20 /* space */) {\n // ' > test '\n // ^ -- position start of line here:\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n spaceAfterMarker = true;\n } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {\n spaceAfterMarker = true;\n\n if ((state.bsCount[nextLine] + offset) % 4 === 3) {\n // ' >\\t test '\n // ^ -- position start of line here (tab has width===1)\n pos++;\n initial++;\n offset++;\n adjustTab = false;\n } else {\n // ' >\\t test '\n // ^ -- position start of line here + shift bsCount slightly\n // to make extra space appear\n adjustTab = true;\n }\n } else {\n spaceAfterMarker = false;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n state.bMarks[nextLine] = pos;\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4;\n } else {\n offset++;\n }\n } else {\n break;\n }\n\n pos++;\n }\n\n lastLineEmpty = pos >= max;\n\n oldBSCount.push(state.bsCount[nextLine]);\n state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0);\n\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] = offset - initial;\n\n oldTShift.push(state.tShift[nextLine]);\n state.tShift[nextLine] = pos - state.bMarks[nextLine];\n continue;\n }\n\n // Case 2: line is not inside the blockquote, and the last line was empty.\n if (lastLineEmpty) { break; }\n\n // Case 3: another tag found.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n\n if (terminate) {\n // Quirk to enforce \"hard termination mode\" for paragraphs;\n // normally if you call `tokenize(state, startLine, nextLine)`,\n // paragraphs will look below nextLine for paragraph continuation,\n // but if blockquote is terminated by another tag, they shouldn't\n state.lineMax = nextLine;\n\n if (state.blkIndent !== 0) {\n // state.blkIndent was non-zero, we now set it to zero,\n // so we need to re-calculate all offsets to appear as\n // if indent wasn't changed\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n state.sCount[nextLine] -= state.blkIndent;\n }\n\n break;\n }\n\n oldBMarks.push(state.bMarks[nextLine]);\n oldBSCount.push(state.bsCount[nextLine]);\n oldTShift.push(state.tShift[nextLine]);\n oldSCount.push(state.sCount[nextLine]);\n\n // A negative indentation means that this is a paragraph continuation\n //\n state.sCount[nextLine] = -1;\n }\n\n oldIndent = state.blkIndent;\n state.blkIndent = 0;\n\n token = state.push('blockquote_open', 'blockquote', 1);\n token.markup = '>';\n token.map = lines = [ startLine, 0 ];\n\n state.md.block.tokenize(state, startLine, nextLine);\n\n token = state.push('blockquote_close', 'blockquote', -1);\n token.markup = '>';\n\n state.lineMax = oldLineMax;\n state.parentType = oldParentType;\n lines[1] = state.line;\n\n // Restore original tShift; this might not be necessary since the parser\n // has already been here, but just to make sure we can do that.\n for (i = 0; i < oldTShift.length; i++) {\n state.bMarks[i + startLine] = oldBMarks[i];\n state.tShift[i + startLine] = oldTShift[i];\n state.sCount[i + startLine] = oldSCount[i];\n state.bsCount[i + startLine] = oldBSCount[i];\n }\n state.blkIndent = oldIndent;\n\n return true;\n};\n","// Horizontal rule\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function hr(state, startLine, endLine, silent) {\n var marker, cnt, ch, token,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n marker = state.src.charCodeAt(pos++);\n\n // Check hr marker\n if (marker !== 0x2A/* * */ &&\n marker !== 0x2D/* - */ &&\n marker !== 0x5F/* _ */) {\n return false;\n }\n\n // markers can be mixed with spaces, but there should be at least 3 of them\n\n cnt = 1;\n while (pos < max) {\n ch = state.src.charCodeAt(pos++);\n if (ch !== marker && !isSpace(ch)) { return false; }\n if (ch === marker) { cnt++; }\n }\n\n if (cnt < 3) { return false; }\n\n if (silent) { return true; }\n\n state.line = startLine + 1;\n\n token = state.push('hr', 'hr', 0);\n token.map = [ startLine, state.line ];\n token.markup = Array(cnt + 1).join(String.fromCharCode(marker));\n\n return true;\n};\n","// Lists\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\n// Search `[-+*][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipBulletListMarker(state, startLine) {\n var marker, pos, max, ch;\n\n pos = state.bMarks[startLine] + state.tShift[startLine];\n max = state.eMarks[startLine];\n\n marker = state.src.charCodeAt(pos++);\n // Check bullet\n if (marker !== 0x2A/* * */ &&\n marker !== 0x2D/* - */ &&\n marker !== 0x2B/* + */) {\n return -1;\n }\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (!isSpace(ch)) {\n // \" -test \" - is not a list item\n return -1;\n }\n }\n\n return pos;\n}\n\n// Search `\\d+[.)][\\n ]`, returns next pos after marker on success\n// or -1 on fail.\nfunction skipOrderedListMarker(state, startLine) {\n var ch,\n start = state.bMarks[startLine] + state.tShift[startLine],\n pos = start,\n max = state.eMarks[startLine];\n\n // List marker should have at least 2 chars (digit + dot)\n if (pos + 1 >= max) { return -1; }\n\n ch = state.src.charCodeAt(pos++);\n\n if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1; }\n\n for (;;) {\n // EOL -> fail\n if (pos >= max) { return -1; }\n\n ch = state.src.charCodeAt(pos++);\n\n if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) {\n\n // List marker should have no more than 9 digits\n // (prevents integer overflow in browsers)\n if (pos - start >= 10) { return -1; }\n\n continue;\n }\n\n // found valid marker\n if (ch === 0x29/* ) */ || ch === 0x2e/* . */) {\n break;\n }\n\n return -1;\n }\n\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (!isSpace(ch)) {\n // \" 1.test \" - is not a list item\n return -1;\n }\n }\n return pos;\n}\n\nfunction markTightParagraphs(state, idx) {\n var i, l,\n level = state.level + 2;\n\n for (i = idx + 2, l = state.tokens.length - 2; i < l; i++) {\n if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {\n state.tokens[i + 2].hidden = true;\n state.tokens[i].hidden = true;\n i += 2;\n }\n }\n}\n\n\nmodule.exports = function list(state, startLine, endLine, silent) {\n var ch,\n contentStart,\n i,\n indent,\n indentAfterMarker,\n initial,\n isOrdered,\n itemLines,\n l,\n listLines,\n listTokIdx,\n markerCharCode,\n markerValue,\n max,\n nextLine,\n offset,\n oldListIndent,\n oldParentType,\n oldSCount,\n oldTShift,\n oldTight,\n pos,\n posAfterMarker,\n prevEmptyEnd,\n start,\n terminate,\n terminatorRules,\n token,\n isTerminatingParagraph = false,\n tight = true;\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n // Special case:\n // - item 1\n // - item 2\n // - item 3\n // - item 4\n // - this one is a paragraph continuation\n if (state.listIndent >= 0 &&\n state.sCount[startLine] - state.listIndent >= 4 &&\n state.sCount[startLine] < state.blkIndent) {\n return false;\n }\n\n // limit conditions when list can interrupt\n // a paragraph (validation mode only)\n if (silent && state.parentType === 'paragraph') {\n // Next list item should still terminate previous list item;\n //\n // This code can fail if plugins use blkIndent as well as lists,\n // but I hope the spec gets fixed long before that happens.\n //\n if (state.tShift[startLine] >= state.blkIndent) {\n isTerminatingParagraph = true;\n }\n }\n\n // Detect list type and position after marker\n if ((posAfterMarker = skipOrderedListMarker(state, startLine)) >= 0) {\n isOrdered = true;\n start = state.bMarks[startLine] + state.tShift[startLine];\n markerValue = Number(state.src.substr(start, posAfterMarker - start - 1));\n\n // If we're starting a new ordered list right after\n // a paragraph, it should start with 1.\n if (isTerminatingParagraph && markerValue !== 1) return false;\n\n } else if ((posAfterMarker = skipBulletListMarker(state, startLine)) >= 0) {\n isOrdered = false;\n\n } else {\n return false;\n }\n\n // If we're starting a new unordered list right after\n // a paragraph, first line should not be empty.\n if (isTerminatingParagraph) {\n if (state.skipSpaces(posAfterMarker) >= state.eMarks[startLine]) return false;\n }\n\n // We should terminate list on style change. Remember first one to compare.\n markerCharCode = state.src.charCodeAt(posAfterMarker - 1);\n\n // For validation mode we can terminate immediately\n if (silent) { return true; }\n\n // Start list\n listTokIdx = state.tokens.length;\n\n if (isOrdered) {\n token = state.push('ordered_list_open', 'ol', 1);\n if (markerValue !== 1) {\n token.attrs = [ [ 'start', markerValue ] ];\n }\n\n } else {\n token = state.push('bullet_list_open', 'ul', 1);\n }\n\n token.map = listLines = [ startLine, 0 ];\n token.markup = String.fromCharCode(markerCharCode);\n\n //\n // Iterate list items\n //\n\n nextLine = startLine;\n prevEmptyEnd = false;\n terminatorRules = state.md.block.ruler.getRules('list');\n\n oldParentType = state.parentType;\n state.parentType = 'list';\n\n while (nextLine < endLine) {\n pos = posAfterMarker;\n max = state.eMarks[nextLine];\n\n initial = offset = state.sCount[nextLine] + posAfterMarker - (state.bMarks[startLine] + state.tShift[startLine]);\n\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (ch === 0x09) {\n offset += 4 - (offset + state.bsCount[nextLine]) % 4;\n } else if (ch === 0x20) {\n offset++;\n } else {\n break;\n }\n\n pos++;\n }\n\n contentStart = pos;\n\n if (contentStart >= max) {\n // trimming space in \"- \\n 3\" case, indent is 1 here\n indentAfterMarker = 1;\n } else {\n indentAfterMarker = offset - initial;\n }\n\n // If we have more than 4 spaces, the indent is 1\n // (the rest is just indented code block)\n if (indentAfterMarker > 4) { indentAfterMarker = 1; }\n\n // \" - test\"\n // ^^^^^ - calculating total length of this thing\n indent = initial + indentAfterMarker;\n\n // Run subparser & write tokens\n token = state.push('list_item_open', 'li', 1);\n token.markup = String.fromCharCode(markerCharCode);\n token.map = itemLines = [ startLine, 0 ];\n\n // change current state, then restore it after parser subcall\n oldTight = state.tight;\n oldTShift = state.tShift[startLine];\n oldSCount = state.sCount[startLine];\n\n // - example list\n // ^ listIndent position will be here\n // ^ blkIndent position will be here\n //\n oldListIndent = state.listIndent;\n state.listIndent = state.blkIndent;\n state.blkIndent = indent;\n\n state.tight = true;\n state.tShift[startLine] = contentStart - state.bMarks[startLine];\n state.sCount[startLine] = offset;\n\n if (contentStart >= max && state.isEmpty(startLine + 1)) {\n // workaround for this case\n // (list item is empty, list terminates before \"foo\"):\n // ~~~~~~~~\n // -\n //\n // foo\n // ~~~~~~~~\n state.line = Math.min(state.line + 2, endLine);\n } else {\n state.md.block.tokenize(state, startLine, endLine, true);\n }\n\n // If any of list item is tight, mark list as tight\n if (!state.tight || prevEmptyEnd) {\n tight = false;\n }\n // Item become loose if finish with empty line,\n // but we should filter last element, because it means list finish\n prevEmptyEnd = (state.line - startLine) > 1 && state.isEmpty(state.line - 1);\n\n state.blkIndent = state.listIndent;\n state.listIndent = oldListIndent;\n state.tShift[startLine] = oldTShift;\n state.sCount[startLine] = oldSCount;\n state.tight = oldTight;\n\n token = state.push('list_item_close', 'li', -1);\n token.markup = String.fromCharCode(markerCharCode);\n\n nextLine = startLine = state.line;\n itemLines[1] = nextLine;\n contentStart = state.bMarks[startLine];\n\n if (nextLine >= endLine) { break; }\n\n //\n // Try to check if list is terminated or continued.\n //\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { break; }\n\n // fail if terminating block found\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n\n // fail if list has another type\n if (isOrdered) {\n posAfterMarker = skipOrderedListMarker(state, nextLine);\n if (posAfterMarker < 0) { break; }\n } else {\n posAfterMarker = skipBulletListMarker(state, nextLine);\n if (posAfterMarker < 0) { break; }\n }\n\n if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break; }\n }\n\n // Finalize list\n if (isOrdered) {\n token = state.push('ordered_list_close', 'ol', -1);\n } else {\n token = state.push('bullet_list_close', 'ul', -1);\n }\n token.markup = String.fromCharCode(markerCharCode);\n\n listLines[1] = nextLine;\n state.line = nextLine;\n\n state.parentType = oldParentType;\n\n // mark paragraphs tight if needed\n if (tight) {\n markTightParagraphs(state, listTokIdx);\n }\n\n return true;\n};\n","'use strict';\n\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function reference(state, startLine, _endLine, silent) {\n var ch,\n destEndPos,\n destEndLineNo,\n endLine,\n href,\n i,\n l,\n label,\n labelEnd,\n oldParentType,\n res,\n start,\n str,\n terminate,\n terminatorRules,\n title,\n lines = 0,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine],\n nextLine = startLine + 1;\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (state.src.charCodeAt(pos) !== 0x5B/* [ */) { return false; }\n\n // Simple check to quickly interrupt scan on [link](url) at the start of line.\n // Can be useful on practice: https://github.com/markdown-it/markdown-it/issues/54\n while (++pos < max) {\n if (state.src.charCodeAt(pos) === 0x5D /* ] */ &&\n state.src.charCodeAt(pos - 1) !== 0x5C/* \\ */) {\n if (pos + 1 === max) { return false; }\n if (state.src.charCodeAt(pos + 1) !== 0x3A/* : */) { return false; }\n break;\n }\n }\n\n endLine = state.lineMax;\n\n // jump line-by-line until empty one or EOF\n terminatorRules = state.md.block.ruler.getRules('reference');\n\n oldParentType = state.parentType;\n state.parentType = 'reference';\n\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n str = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n max = str.length;\n\n for (pos = 1; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x5B /* [ */) {\n return false;\n } else if (ch === 0x5D /* ] */) {\n labelEnd = pos;\n break;\n } else if (ch === 0x0A /* \\n */) {\n lines++;\n } else if (ch === 0x5C /* \\ */) {\n pos++;\n if (pos < max && str.charCodeAt(pos) === 0x0A) {\n lines++;\n }\n }\n }\n\n if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return false; }\n\n // [label]: destination 'title'\n // ^^^ skip optional whitespace here\n for (pos = labelEnd + 2; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x0A) {\n lines++;\n } else if (isSpace(ch)) {\n /*eslint no-empty:0*/\n } else {\n break;\n }\n }\n\n // [label]: destination 'title'\n // ^^^^^^^^^^^ parse this\n res = state.md.helpers.parseLinkDestination(str, pos, max);\n if (!res.ok) { return false; }\n\n href = state.md.normalizeLink(res.str);\n if (!state.md.validateLink(href)) { return false; }\n\n pos = res.pos;\n lines += res.lines;\n\n // save cursor state, we could require to rollback later\n destEndPos = pos;\n destEndLineNo = lines;\n\n // [label]: destination 'title'\n // ^^^ skipping those spaces\n start = pos;\n for (; pos < max; pos++) {\n ch = str.charCodeAt(pos);\n if (ch === 0x0A) {\n lines++;\n } else if (isSpace(ch)) {\n /*eslint no-empty:0*/\n } else {\n break;\n }\n }\n\n // [label]: destination 'title'\n // ^^^^^^^ parse this\n res = state.md.helpers.parseLinkTitle(str, pos, max);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n lines += res.lines;\n } else {\n title = '';\n pos = destEndPos;\n lines = destEndLineNo;\n }\n\n // skip trailing spaces until the rest of the line\n while (pos < max) {\n ch = str.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n\n if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n if (title) {\n // garbage at the end of the line after title,\n // but it could still be a valid reference if we roll back\n title = '';\n pos = destEndPos;\n lines = destEndLineNo;\n while (pos < max) {\n ch = str.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n }\n }\n\n if (pos < max && str.charCodeAt(pos) !== 0x0A) {\n // garbage at the end of the line\n return false;\n }\n\n label = normalizeReference(str.slice(1, labelEnd));\n if (!label) {\n // CommonMark 0.20 disallows empty labels\n return false;\n }\n\n // Reference can not terminate anything. This check is for safety only.\n /*istanbul ignore if*/\n if (silent) { return true; }\n\n if (typeof state.env.references === 'undefined') {\n state.env.references = {};\n }\n if (typeof state.env.references[label] === 'undefined') {\n state.env.references[label] = { title: title, href: href };\n }\n\n state.parentType = oldParentType;\n\n state.line = startLine + lines + 1;\n return true;\n};\n","// heading (#, ##, ...)\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function heading(state, startLine, endLine, silent) {\n var ch, level, tmp, token,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x23/* # */ || pos >= max) { return false; }\n\n // count heading level\n level = 1;\n ch = state.src.charCodeAt(++pos);\n while (ch === 0x23/* # */ && pos < max && level <= 6) {\n level++;\n ch = state.src.charCodeAt(++pos);\n }\n\n if (level > 6 || (pos < max && !isSpace(ch))) { return false; }\n\n if (silent) { return true; }\n\n // Let's cut tails like ' ### ' from the end of string\n\n max = state.skipSpacesBack(max, pos);\n tmp = state.skipCharsBack(max, 0x23, pos); // #\n if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) {\n max = tmp;\n }\n\n state.line = startLine + 1;\n\n token = state.push('heading_open', 'h' + String(level), 1);\n token.markup = '########'.slice(0, level);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = state.src.slice(pos, max).trim();\n token.map = [ startLine, state.line ];\n token.children = [];\n\n token = state.push('heading_close', 'h' + String(level), -1);\n token.markup = '########'.slice(0, level);\n\n return true;\n};\n","// lheading (---, ===)\n\n'use strict';\n\n\nmodule.exports = function lheading(state, startLine, endLine/*, silent*/) {\n var content, terminate, i, l, token, pos, max, level, marker,\n nextLine = startLine + 1, oldParentType,\n terminatorRules = state.md.block.ruler.getRules('paragraph');\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n oldParentType = state.parentType;\n state.parentType = 'paragraph'; // use paragraph to match terminatorRules\n\n // jump line-by-line until empty one or EOF\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n //\n // Check for underline in setext header\n //\n if (state.sCount[nextLine] >= state.blkIndent) {\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos < max) {\n marker = state.src.charCodeAt(pos);\n\n if (marker === 0x2D/* - */ || marker === 0x3D/* = */) {\n pos = state.skipChars(pos, marker);\n pos = state.skipSpaces(pos);\n\n if (pos >= max) {\n level = (marker === 0x3D/* = */ ? 1 : 2);\n break;\n }\n }\n }\n }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n if (!level) {\n // Didn't find valid underline\n return false;\n }\n\n content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n\n state.line = nextLine + 1;\n\n token = state.push('heading_open', 'h' + String(level), 1);\n token.markup = String.fromCharCode(marker);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = content;\n token.map = [ startLine, state.line - 1 ];\n token.children = [];\n\n token = state.push('heading_close', 'h' + String(level), -1);\n token.markup = String.fromCharCode(marker);\n\n state.parentType = oldParentType;\n\n return true;\n};\n","// HTML block\n\n'use strict';\n\n\nvar block_names = require('../common/html_blocks');\nvar HTML_OPEN_CLOSE_TAG_RE = require('../common/html_re').HTML_OPEN_CLOSE_TAG_RE;\n\n// An array of opening and corresponding closing sequences for html tags,\n// last argument defines whether it can terminate a paragraph or not\n//\nvar HTML_SEQUENCES = [\n [ /^<(script|pre|style)(?=(\\s|>|$))/i, /<\\/(script|pre|style)>/i, true ],\n [ /^/, true ],\n [ /^<\\?/, /\\?>/, true ],\n [ /^/, true ],\n [ /^/, true ],\n [ new RegExp('^|$))', 'i'), /^$/, true ],\n [ new RegExp(HTML_OPEN_CLOSE_TAG_RE.source + '\\\\s*$'), /^$/, false ]\n];\n\n\nmodule.exports = function html_block(state, startLine, endLine, silent) {\n var i, nextLine, token, lineText,\n pos = state.bMarks[startLine] + state.tShift[startLine],\n max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }\n\n if (!state.md.options.html) { return false; }\n\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\n\n lineText = state.src.slice(pos, max);\n\n for (i = 0; i < HTML_SEQUENCES.length; i++) {\n if (HTML_SEQUENCES[i][0].test(lineText)) { break; }\n }\n\n if (i === HTML_SEQUENCES.length) { return false; }\n\n if (silent) {\n // true if this sequence can be a terminator, false otherwise\n return HTML_SEQUENCES[i][2];\n }\n\n nextLine = startLine + 1;\n\n // If we are here - we detected HTML block.\n // Let's roll down till block end.\n if (!HTML_SEQUENCES[i][1].test(lineText)) {\n for (; nextLine < endLine; nextLine++) {\n if (state.sCount[nextLine] < state.blkIndent) { break; }\n\n pos = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n lineText = state.src.slice(pos, max);\n\n if (HTML_SEQUENCES[i][1].test(lineText)) {\n if (lineText.length !== 0) { nextLine++; }\n break;\n }\n }\n }\n\n state.line = nextLine;\n\n token = state.push('html_block', '', 0);\n token.map = [ startLine, nextLine ];\n token.content = state.getLines(startLine, nextLine, state.blkIndent, true);\n\n return true;\n};\n","// List of valid html blocks names, accorting to commonmark spec\n// http://jgm.github.io/CommonMark/spec.html#html-blocks\n\n'use strict';\n\n\nmodule.exports = [\n 'address',\n 'article',\n 'aside',\n 'base',\n 'basefont',\n 'blockquote',\n 'body',\n 'caption',\n 'center',\n 'col',\n 'colgroup',\n 'dd',\n 'details',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'frame',\n 'frameset',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hr',\n 'html',\n 'iframe',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'menu',\n 'menuitem',\n 'meta',\n 'nav',\n 'noframes',\n 'ol',\n 'optgroup',\n 'option',\n 'p',\n 'param',\n 'section',\n 'source',\n 'summary',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'title',\n 'tr',\n 'track',\n 'ul'\n];\n","// Paragraph\n\n'use strict';\n\n\nmodule.exports = function paragraph(state, startLine/*, endLine*/) {\n var content, terminate, i, l, token, oldParentType,\n nextLine = startLine + 1,\n terminatorRules = state.md.block.ruler.getRules('paragraph'),\n endLine = state.lineMax;\n\n oldParentType = state.parentType;\n state.parentType = 'paragraph';\n\n // jump line-by-line until empty one or EOF\n for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {\n // this would be a code block normally, but after paragraph\n // it's considered a lazy continuation regardless of what's there\n if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }\n\n // quirk for blockquotes, this line should already be checked by that rule\n if (state.sCount[nextLine] < 0) { continue; }\n\n // Some tags can terminate paragraph without empty line.\n terminate = false;\n for (i = 0, l = terminatorRules.length; i < l; i++) {\n if (terminatorRules[i](state, nextLine, endLine, true)) {\n terminate = true;\n break;\n }\n }\n if (terminate) { break; }\n }\n\n content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();\n\n state.line = nextLine;\n\n token = state.push('paragraph_open', 'p', 1);\n token.map = [ startLine, state.line ];\n\n token = state.push('inline', '', 0);\n token.content = content;\n token.map = [ startLine, state.line ];\n token.children = [];\n\n token = state.push('paragraph_close', 'p', -1);\n\n state.parentType = oldParentType;\n\n return true;\n};\n","// Parser state class\n\n'use strict';\n\nvar Token = require('../token');\nvar isSpace = require('../common/utils').isSpace;\n\n\nfunction StateBlock(src, md, env, tokens) {\n var ch, s, start, pos, len, indent, offset, indent_found;\n\n this.src = src;\n\n // link to parser instance\n this.md = md;\n\n this.env = env;\n\n //\n // Internal state vartiables\n //\n\n this.tokens = tokens;\n\n this.bMarks = []; // line begin offsets for fast jumps\n this.eMarks = []; // line end offsets for fast jumps\n this.tShift = []; // offsets of the first non-space characters (tabs not expanded)\n this.sCount = []; // indents for each line (tabs expanded)\n\n // An amount of virtual spaces (tabs expanded) between beginning\n // of each line (bMarks) and real beginning of that line.\n //\n // It exists only as a hack because blockquotes override bMarks\n // losing information in the process.\n //\n // It's used only when expanding tabs, you can think about it as\n // an initial tab length, e.g. bsCount=21 applied to string `\\t123`\n // means first tab should be expanded to 4-21%4 === 3 spaces.\n //\n this.bsCount = [];\n\n // block parser variables\n this.blkIndent = 0; // required block content indent (for example, if we are\n // inside a list, it would be positioned after list marker)\n this.line = 0; // line index in src\n this.lineMax = 0; // lines count\n this.tight = false; // loose/tight mode for lists\n this.ddIndent = -1; // indent of the current dd block (-1 if there isn't any)\n this.listIndent = -1; // indent of the current list block (-1 if there isn't any)\n\n // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'\n // used in lists to determine if they interrupt a paragraph\n this.parentType = 'root';\n\n this.level = 0;\n\n // renderer\n this.result = '';\n\n // Create caches\n // Generate markers.\n s = this.src;\n indent_found = false;\n\n for (start = pos = indent = offset = 0, len = s.length; pos < len; pos++) {\n ch = s.charCodeAt(pos);\n\n if (!indent_found) {\n if (isSpace(ch)) {\n indent++;\n\n if (ch === 0x09) {\n offset += 4 - offset % 4;\n } else {\n offset++;\n }\n continue;\n } else {\n indent_found = true;\n }\n }\n\n if (ch === 0x0A || pos === len - 1) {\n if (ch !== 0x0A) { pos++; }\n this.bMarks.push(start);\n this.eMarks.push(pos);\n this.tShift.push(indent);\n this.sCount.push(offset);\n this.bsCount.push(0);\n\n indent_found = false;\n indent = 0;\n offset = 0;\n start = pos + 1;\n }\n }\n\n // Push fake entry to simplify cache bounds checks\n this.bMarks.push(s.length);\n this.eMarks.push(s.length);\n this.tShift.push(0);\n this.sCount.push(0);\n this.bsCount.push(0);\n\n this.lineMax = this.bMarks.length - 1; // don't count last fake line\n}\n\n// Push new token to \"stream\".\n//\nStateBlock.prototype.push = function (type, tag, nesting) {\n var token = new Token(type, tag, nesting);\n token.block = true;\n\n if (nesting < 0) this.level--; // closing tag\n token.level = this.level;\n if (nesting > 0) this.level++; // opening tag\n\n this.tokens.push(token);\n return token;\n};\n\nStateBlock.prototype.isEmpty = function isEmpty(line) {\n return this.bMarks[line] + this.tShift[line] >= this.eMarks[line];\n};\n\nStateBlock.prototype.skipEmptyLines = function skipEmptyLines(from) {\n for (var max = this.lineMax; from < max; from++) {\n if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) {\n break;\n }\n }\n return from;\n};\n\n// Skip spaces from given position.\nStateBlock.prototype.skipSpaces = function skipSpaces(pos) {\n var ch;\n\n for (var max = this.src.length; pos < max; pos++) {\n ch = this.src.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n }\n return pos;\n};\n\n// Skip spaces from given position in reverse.\nStateBlock.prototype.skipSpacesBack = function skipSpacesBack(pos, min) {\n if (pos <= min) { return pos; }\n\n while (pos > min) {\n if (!isSpace(this.src.charCodeAt(--pos))) { return pos + 1; }\n }\n return pos;\n};\n\n// Skip char codes from given position\nStateBlock.prototype.skipChars = function skipChars(pos, code) {\n for (var max = this.src.length; pos < max; pos++) {\n if (this.src.charCodeAt(pos) !== code) { break; }\n }\n return pos;\n};\n\n// Skip char codes reverse from given position - 1\nStateBlock.prototype.skipCharsBack = function skipCharsBack(pos, code, min) {\n if (pos <= min) { return pos; }\n\n while (pos > min) {\n if (code !== this.src.charCodeAt(--pos)) { return pos + 1; }\n }\n return pos;\n};\n\n// cut lines range from source.\nStateBlock.prototype.getLines = function getLines(begin, end, indent, keepLastLF) {\n var i, lineIndent, ch, first, last, queue, lineStart,\n line = begin;\n\n if (begin >= end) {\n return '';\n }\n\n queue = new Array(end - begin);\n\n for (i = 0; line < end; line++, i++) {\n lineIndent = 0;\n lineStart = first = this.bMarks[line];\n\n if (line + 1 < end || keepLastLF) {\n // No need for bounds check because we have fake entry on tail.\n last = this.eMarks[line] + 1;\n } else {\n last = this.eMarks[line];\n }\n\n while (first < last && lineIndent < indent) {\n ch = this.src.charCodeAt(first);\n\n if (isSpace(ch)) {\n if (ch === 0x09) {\n lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4;\n } else {\n lineIndent++;\n }\n } else if (first - lineStart < this.tShift[line]) {\n // patched tShift masked characters to look like spaces (blockquotes, list markers)\n lineIndent++;\n } else {\n break;\n }\n\n first++;\n }\n\n if (lineIndent > indent) {\n // partially expanding tabs in code blocks, e.g '\\t\\tfoobar'\n // with indent=2 becomes ' \\tfoobar'\n queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last);\n } else {\n queue[i] = this.src.slice(first, last);\n }\n }\n\n return queue.join('');\n};\n\n// re-export Token class to use in block rules\nStateBlock.prototype.Token = Token;\n\n\nmodule.exports = StateBlock;\n","/** internal\n * class ParserInline\n *\n * Tokenizes paragraph content.\n **/\n'use strict';\n\n\nvar Ruler = require('./ruler');\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Parser rules\n\nvar _rules = [\n [ 'text', require('./rules_inline/text') ],\n [ 'newline', require('./rules_inline/newline') ],\n [ 'escape', require('./rules_inline/escape') ],\n [ 'backticks', require('./rules_inline/backticks') ],\n [ 'strikethrough', require('./rules_inline/strikethrough').tokenize ],\n [ 'emphasis', require('./rules_inline/emphasis').tokenize ],\n [ 'link', require('./rules_inline/link') ],\n [ 'image', require('./rules_inline/image') ],\n [ 'autolink', require('./rules_inline/autolink') ],\n [ 'html_inline', require('./rules_inline/html_inline') ],\n [ 'entity', require('./rules_inline/entity') ]\n];\n\nvar _rules2 = [\n [ 'balance_pairs', require('./rules_inline/balance_pairs') ],\n [ 'strikethrough', require('./rules_inline/strikethrough').postProcess ],\n [ 'emphasis', require('./rules_inline/emphasis').postProcess ],\n [ 'text_collapse', require('./rules_inline/text_collapse') ]\n];\n\n\n/**\n * new ParserInline()\n **/\nfunction ParserInline() {\n var i;\n\n /**\n * ParserInline#ruler -> Ruler\n *\n * [[Ruler]] instance. Keep configuration of inline rules.\n **/\n this.ruler = new Ruler();\n\n for (i = 0; i < _rules.length; i++) {\n this.ruler.push(_rules[i][0], _rules[i][1]);\n }\n\n /**\n * ParserInline#ruler2 -> Ruler\n *\n * [[Ruler]] instance. Second ruler used for post-processing\n * (e.g. in emphasis-like rules).\n **/\n this.ruler2 = new Ruler();\n\n for (i = 0; i < _rules2.length; i++) {\n this.ruler2.push(_rules2[i][0], _rules2[i][1]);\n }\n}\n\n\n// Skip single token by running all rules in validation mode;\n// returns `true` if any rule reported success\n//\nParserInline.prototype.skipToken = function (state) {\n var ok, i, pos = state.pos,\n rules = this.ruler.getRules(''),\n len = rules.length,\n maxNesting = state.md.options.maxNesting,\n cache = state.cache;\n\n\n if (typeof cache[pos] !== 'undefined') {\n state.pos = cache[pos];\n return;\n }\n\n if (state.level < maxNesting) {\n for (i = 0; i < len; i++) {\n // Increment state.level and decrement it later to limit recursion.\n // It's harmless to do here, because no tokens are created. But ideally,\n // we'd need a separate private state variable for this purpose.\n //\n state.level++;\n ok = rules[i](state, true);\n state.level--;\n\n if (ok) { break; }\n }\n } else {\n // Too much nesting, just skip until the end of the paragraph.\n //\n // NOTE: this will cause links to behave incorrectly in the following case,\n // when an amount of `[` is exactly equal to `maxNesting + 1`:\n //\n // [[[[[[[[[[[[[[[[[[[[[foo]()\n //\n // TODO: remove this workaround when CM standard will allow nested links\n // (we can replace it by preventing links from being parsed in\n // validation mode)\n //\n state.pos = state.posMax;\n }\n\n if (!ok) { state.pos++; }\n cache[pos] = state.pos;\n};\n\n\n// Generate tokens for input range\n//\nParserInline.prototype.tokenize = function (state) {\n var ok, i,\n rules = this.ruler.getRules(''),\n len = rules.length,\n end = state.posMax,\n maxNesting = state.md.options.maxNesting;\n\n while (state.pos < end) {\n // Try all possible rules.\n // On success, rule should:\n //\n // - update `state.pos`\n // - update `state.tokens`\n // - return true\n\n if (state.level < maxNesting) {\n for (i = 0; i < len; i++) {\n ok = rules[i](state, false);\n if (ok) { break; }\n }\n }\n\n if (ok) {\n if (state.pos >= end) { break; }\n continue;\n }\n\n state.pending += state.src[state.pos++];\n }\n\n if (state.pending) {\n state.pushPending();\n }\n};\n\n\n/**\n * ParserInline.parse(str, md, env, outTokens)\n *\n * Process input string and push inline tokens into `outTokens`\n **/\nParserInline.prototype.parse = function (str, md, env, outTokens) {\n var i, rules, len;\n var state = new this.State(str, md, env, outTokens);\n\n this.tokenize(state);\n\n rules = this.ruler2.getRules('');\n len = rules.length;\n\n for (i = 0; i < len; i++) {\n rules[i](state);\n }\n};\n\n\nParserInline.prototype.State = require('./rules_inline/state_inline');\n\n\nmodule.exports = ParserInline;\n","// Skip text characters for text token, place those to pending buffer\n// and increment current pos\n\n'use strict';\n\n\n// Rule to skip pure text\n// '{}$%@~+=:' reserved for extentions\n\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n\n// !!!! Don't confuse with \"Markdown ASCII Punctuation\" chars\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\nfunction isTerminatorChar(ch) {\n switch (ch) {\n case 0x0A/* \\n */:\n case 0x21/* ! */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2D/* - */:\n case 0x3A/* : */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true;\n default:\n return false;\n }\n}\n\nmodule.exports = function text(state, silent) {\n var pos = state.pos;\n\n while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {\n pos++;\n }\n\n if (pos === state.pos) { return false; }\n\n if (!silent) { state.pending += state.src.slice(state.pos, pos); }\n\n state.pos = pos;\n\n return true;\n};\n\n// Alternative implementation, for memory.\n//\n// It costs 10% of performance, but allows extend terminators list, if place it\n// to `ParcerInline` property. Probably, will switch to it sometime, such\n// flexibility required.\n\n/*\nvar TERMINATOR_RE = /[\\n!#$%&*+\\-:<=>@[\\\\\\]^_`{}~]/;\n\nmodule.exports = function text(state, silent) {\n var pos = state.pos,\n idx = state.src.slice(pos).search(TERMINATOR_RE);\n\n // first char is terminator -> empty text\n if (idx === 0) { return false; }\n\n // no terminator -> text till end of string\n if (idx < 0) {\n if (!silent) { state.pending += state.src.slice(pos); }\n state.pos = state.src.length;\n return true;\n }\n\n if (!silent) { state.pending += state.src.slice(pos, pos + idx); }\n\n state.pos += idx;\n\n return true;\n};*/\n","// Proceess '\\n'\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function newline(state, silent) {\n var pmax, max, pos = state.pos;\n\n if (state.src.charCodeAt(pos) !== 0x0A/* \\n */) { return false; }\n\n pmax = state.pending.length - 1;\n max = state.posMax;\n\n // ' \\n' -> hardbreak\n // Lookup in pending chars is bad practice! Don't copy to other rules!\n // Pending string is stored in concat mode, indexed lookups will cause\n // convertion to flat mode.\n if (!silent) {\n if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {\n if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {\n state.pending = state.pending.replace(/ +$/, '');\n state.push('hardbreak', 'br', 0);\n } else {\n state.pending = state.pending.slice(0, -1);\n state.push('softbreak', 'br', 0);\n }\n\n } else {\n state.push('softbreak', 'br', 0);\n }\n }\n\n pos++;\n\n // skip heading spaces for next line\n while (pos < max && isSpace(state.src.charCodeAt(pos))) { pos++; }\n\n state.pos = pos;\n return true;\n};\n","// Process escaped chars and hardbreaks\n\n'use strict';\n\nvar isSpace = require('../common/utils').isSpace;\n\nvar ESCAPED = [];\n\nfor (var i = 0; i < 256; i++) { ESCAPED.push(0); }\n\n'\\\\!\"#$%&\\'()*+,./:;<=>?@[]^_`{|}~-'\n .split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1; });\n\n\nmodule.exports = function escape(state, silent) {\n var ch, pos = state.pos, max = state.posMax;\n\n if (state.src.charCodeAt(pos) !== 0x5C/* \\ */) { return false; }\n\n pos++;\n\n if (pos < max) {\n ch = state.src.charCodeAt(pos);\n\n if (ch < 256 && ESCAPED[ch] !== 0) {\n if (!silent) { state.pending += state.src[pos]; }\n state.pos += 2;\n return true;\n }\n\n if (ch === 0x0A) {\n if (!silent) {\n state.push('hardbreak', 'br', 0);\n }\n\n pos++;\n // skip leading whitespaces from next line\n while (pos < max) {\n ch = state.src.charCodeAt(pos);\n if (!isSpace(ch)) { break; }\n pos++;\n }\n\n state.pos = pos;\n return true;\n }\n }\n\n if (!silent) { state.pending += '\\\\'; }\n state.pos++;\n return true;\n};\n","// Parse backticks\n\n'use strict';\n\nmodule.exports = function backtick(state, silent) {\n var start, max, marker, matchStart, matchEnd, token,\n pos = state.pos,\n ch = state.src.charCodeAt(pos);\n\n if (ch !== 0x60/* ` */) { return false; }\n\n start = pos;\n pos++;\n max = state.posMax;\n\n while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++; }\n\n marker = state.src.slice(start, pos);\n\n matchStart = matchEnd = pos;\n\n while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) {\n matchEnd = matchStart + 1;\n\n while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++; }\n\n if (matchEnd - matchStart === marker.length) {\n if (!silent) {\n token = state.push('code_inline', 'code', 0);\n token.markup = marker;\n token.content = state.src.slice(pos, matchStart)\n .replace(/\\n/g, ' ')\n .replace(/^ (.+) $/, '$1');\n }\n state.pos = matchEnd;\n return true;\n }\n }\n\n if (!silent) { state.pending += marker; }\n state.pos += marker.length;\n return true;\n};\n","// Process [link]( \"stuff\")\n\n'use strict';\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function link(state, silent) {\n var attrs,\n code,\n label,\n labelEnd,\n labelStart,\n pos,\n res,\n ref,\n title,\n token,\n href = '',\n oldPos = state.pos,\n max = state.posMax,\n start = state.pos,\n parseReference = true;\n\n if (state.src.charCodeAt(state.pos) !== 0x5B/* [ */) { return false; }\n\n labelStart = state.pos + 1;\n labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true);\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) { return false; }\n\n pos = labelEnd + 1;\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n //\n // Inline link\n //\n\n // might have found a valid shortcut link, disable reference parsing\n parseReference = false;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n pos++;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n if (pos >= max) { return false; }\n\n // [link]( \"title\" )\n // ^^^^^^ parsing link destination\n start = pos;\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n if (res.ok) {\n href = state.md.normalizeLink(res.str);\n if (state.md.validateLink(href)) {\n pos = res.pos;\n } else {\n href = '';\n }\n }\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n start = pos;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n\n // [link]( \"title\" )\n // ^^^^^^^ parsing link title\n res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n } else {\n title = '';\n }\n\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n // parsing a valid shortcut link failed, fallback to reference\n parseReference = true;\n }\n pos++;\n }\n\n if (parseReference) {\n //\n // Link reference\n //\n if (typeof state.env.references === 'undefined') { return false; }\n\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n start = pos + 1;\n pos = state.md.helpers.parseLinkLabel(state, pos);\n if (pos >= 0) {\n label = state.src.slice(start, pos++);\n } else {\n pos = labelEnd + 1;\n }\n } else {\n pos = labelEnd + 1;\n }\n\n // covers label === '' and label === undefined\n // (collapsed reference link and shortcut reference link respectively)\n if (!label) { label = state.src.slice(labelStart, labelEnd); }\n\n ref = state.env.references[normalizeReference(label)];\n if (!ref) {\n state.pos = oldPos;\n return false;\n }\n href = ref.href;\n title = ref.title;\n }\n\n //\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n state.pos = labelStart;\n state.posMax = labelEnd;\n\n token = state.push('link_open', 'a', 1);\n token.attrs = attrs = [ [ 'href', href ] ];\n if (title) {\n attrs.push([ 'title', title ]);\n }\n\n state.md.inline.tokenize(state);\n\n token = state.push('link_close', 'a', -1);\n }\n\n state.pos = pos;\n state.posMax = max;\n return true;\n};\n","// Process ![image]( \"title\")\n\n'use strict';\n\nvar normalizeReference = require('../common/utils').normalizeReference;\nvar isSpace = require('../common/utils').isSpace;\n\n\nmodule.exports = function image(state, silent) {\n var attrs,\n code,\n content,\n label,\n labelEnd,\n labelStart,\n pos,\n ref,\n res,\n title,\n token,\n tokens,\n start,\n href = '',\n oldPos = state.pos,\n max = state.posMax;\n\n if (state.src.charCodeAt(state.pos) !== 0x21/* ! */) { return false; }\n if (state.src.charCodeAt(state.pos + 1) !== 0x5B/* [ */) { return false; }\n\n labelStart = state.pos + 2;\n labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false);\n\n // parser failed to find ']', so it's not a valid link\n if (labelEnd < 0) { return false; }\n\n pos = labelEnd + 1;\n if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {\n //\n // Inline link\n //\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n pos++;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n if (pos >= max) { return false; }\n\n // [link]( \"title\" )\n // ^^^^^^ parsing link destination\n start = pos;\n res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);\n if (res.ok) {\n href = state.md.normalizeLink(res.str);\n if (state.md.validateLink(href)) {\n pos = res.pos;\n } else {\n href = '';\n }\n }\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n start = pos;\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n\n // [link]( \"title\" )\n // ^^^^^^^ parsing link title\n res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);\n if (pos < max && start !== pos && res.ok) {\n title = res.str;\n pos = res.pos;\n\n // [link]( \"title\" )\n // ^^ skipping these spaces\n for (; pos < max; pos++) {\n code = state.src.charCodeAt(pos);\n if (!isSpace(code) && code !== 0x0A) { break; }\n }\n } else {\n title = '';\n }\n\n if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {\n state.pos = oldPos;\n return false;\n }\n pos++;\n } else {\n //\n // Link reference\n //\n if (typeof state.env.references === 'undefined') { return false; }\n\n if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {\n start = pos + 1;\n pos = state.md.helpers.parseLinkLabel(state, pos);\n if (pos >= 0) {\n label = state.src.slice(start, pos++);\n } else {\n pos = labelEnd + 1;\n }\n } else {\n pos = labelEnd + 1;\n }\n\n // covers label === '' and label === undefined\n // (collapsed reference link and shortcut reference link respectively)\n if (!label) { label = state.src.slice(labelStart, labelEnd); }\n\n ref = state.env.references[normalizeReference(label)];\n if (!ref) {\n state.pos = oldPos;\n return false;\n }\n href = ref.href;\n title = ref.title;\n }\n\n //\n // We found the end of the link, and know for a fact it's a valid link;\n // so all that's left to do is to call tokenizer.\n //\n if (!silent) {\n content = state.src.slice(labelStart, labelEnd);\n\n state.md.inline.parse(\n content,\n state.md,\n state.env,\n tokens = []\n );\n\n token = state.push('image', 'img', 0);\n token.attrs = attrs = [ [ 'src', href ], [ 'alt', '' ] ];\n token.children = tokens;\n token.content = content;\n\n if (title) {\n attrs.push([ 'title', title ]);\n }\n }\n\n state.pos = pos;\n state.posMax = max;\n return true;\n};\n","// Process autolinks ''\n\n'use strict';\n\n\n/*eslint max-len:0*/\nvar EMAIL_RE = /^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;\nvar AUTOLINK_RE = /^<([a-zA-Z][a-zA-Z0-9+.\\-]{1,31}):([^<>\\x00-\\x20]*)>/;\n\n\nmodule.exports = function autolink(state, silent) {\n var tail, linkMatch, emailMatch, url, fullUrl, token,\n pos = state.pos;\n\n if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }\n\n tail = state.src.slice(pos);\n\n if (tail.indexOf('>') < 0) { return false; }\n\n if (AUTOLINK_RE.test(tail)) {\n linkMatch = tail.match(AUTOLINK_RE);\n\n url = linkMatch[0].slice(1, -1);\n fullUrl = state.md.normalizeLink(url);\n if (!state.md.validateLink(fullUrl)) { return false; }\n\n if (!silent) {\n token = state.push('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.markup = 'autolink';\n token.info = 'auto';\n\n token = state.push('text', '', 0);\n token.content = state.md.normalizeLinkText(url);\n\n token = state.push('link_close', 'a', -1);\n token.markup = 'autolink';\n token.info = 'auto';\n }\n\n state.pos += linkMatch[0].length;\n return true;\n }\n\n if (EMAIL_RE.test(tail)) {\n emailMatch = tail.match(EMAIL_RE);\n\n url = emailMatch[0].slice(1, -1);\n fullUrl = state.md.normalizeLink('mailto:' + url);\n if (!state.md.validateLink(fullUrl)) { return false; }\n\n if (!silent) {\n token = state.push('link_open', 'a', 1);\n token.attrs = [ [ 'href', fullUrl ] ];\n token.markup = 'autolink';\n token.info = 'auto';\n\n token = state.push('text', '', 0);\n token.content = state.md.normalizeLinkText(url);\n\n token = state.push('link_close', 'a', -1);\n token.markup = 'autolink';\n token.info = 'auto';\n }\n\n state.pos += emailMatch[0].length;\n return true;\n }\n\n return false;\n};\n","// Process html tags\n\n'use strict';\n\n\nvar HTML_TAG_RE = require('../common/html_re').HTML_TAG_RE;\n\n\nfunction isLetter(ch) {\n /*eslint no-bitwise:0*/\n var lc = ch | 0x20; // to lower case\n return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */);\n}\n\n\nmodule.exports = function html_inline(state, silent) {\n var ch, match, max, token,\n pos = state.pos;\n\n if (!state.md.options.html) { return false; }\n\n // Check start\n max = state.posMax;\n if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||\n pos + 2 >= max) {\n return false;\n }\n\n // Quick fail on second char\n ch = state.src.charCodeAt(pos + 1);\n if (ch !== 0x21/* ! */ &&\n ch !== 0x3F/* ? */ &&\n ch !== 0x2F/* / */ &&\n !isLetter(ch)) {\n return false;\n }\n\n match = state.src.slice(pos).match(HTML_TAG_RE);\n if (!match) { return false; }\n\n if (!silent) {\n token = state.push('html_inline', '', 0);\n token.content = state.src.slice(pos, pos + match[0].length);\n }\n state.pos += match[0].length;\n return true;\n};\n","// Process html entity - {, ¯, ", ...\n\n'use strict';\n\nvar entities = require('../common/entities');\nvar has = require('../common/utils').has;\nvar isValidEntityCode = require('../common/utils').isValidEntityCode;\nvar fromCodePoint = require('../common/utils').fromCodePoint;\n\n\nvar DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i;\nvar NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i;\n\n\nmodule.exports = function entity(state, silent) {\n var ch, code, match, pos = state.pos, max = state.posMax;\n\n if (state.src.charCodeAt(pos) !== 0x26/* & */) { return false; }\n\n if (pos + 1 < max) {\n ch = state.src.charCodeAt(pos + 1);\n\n if (ch === 0x23 /* # */) {\n match = state.src.slice(pos).match(DIGITAL_RE);\n if (match) {\n if (!silent) {\n code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10);\n state.pending += isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD);\n }\n state.pos += match[0].length;\n return true;\n }\n } else {\n match = state.src.slice(pos).match(NAMED_RE);\n if (match) {\n if (has(entities, match[1])) {\n if (!silent) { state.pending += entities[match[1]]; }\n state.pos += match[0].length;\n return true;\n }\n }\n }\n }\n\n if (!silent) { state.pending += '&'; }\n state.pos++;\n return true;\n};\n","// For each opening emphasis-like marker find a matching closing one\n//\n'use strict';\n\n\nfunction processDelimiters(state, delimiters) {\n var closerIdx, openerIdx, closer, opener, minOpenerIdx, newMinOpenerIdx,\n isOddMatch, lastJump,\n openersBottom = {},\n max = delimiters.length;\n\n for (closerIdx = 0; closerIdx < max; closerIdx++) {\n closer = delimiters[closerIdx];\n\n // Length is only used for emphasis-specific \"rule of 3\",\n // if it's not defined (in strikethrough or 3rd party plugins),\n // we can default it to 0 to disable those checks.\n //\n closer.length = closer.length || 0;\n\n if (!closer.close) continue;\n\n // Previously calculated lower bounds (previous fails)\n // for each marker and each delimiter length modulo 3.\n if (!openersBottom.hasOwnProperty(closer.marker)) {\n openersBottom[closer.marker] = [ -1, -1, -1 ];\n }\n\n minOpenerIdx = openersBottom[closer.marker][closer.length % 3];\n newMinOpenerIdx = -1;\n\n openerIdx = closerIdx - closer.jump - 1;\n\n for (; openerIdx > minOpenerIdx; openerIdx -= opener.jump + 1) {\n opener = delimiters[openerIdx];\n\n if (opener.marker !== closer.marker) continue;\n\n if (newMinOpenerIdx === -1) newMinOpenerIdx = openerIdx;\n\n if (opener.open &&\n opener.end < 0 &&\n opener.level === closer.level) {\n\n isOddMatch = false;\n\n // from spec:\n //\n // If one of the delimiters can both open and close emphasis, then the\n // sum of the lengths of the delimiter runs containing the opening and\n // closing delimiters must not be a multiple of 3 unless both lengths\n // are multiples of 3.\n //\n if (opener.close || closer.open) {\n if ((opener.length + closer.length) % 3 === 0) {\n if (opener.length % 3 !== 0 || closer.length % 3 !== 0) {\n isOddMatch = true;\n }\n }\n }\n\n if (!isOddMatch) {\n // If previous delimiter cannot be an opener, we can safely skip\n // the entire sequence in future checks. This is required to make\n // sure algorithm has linear complexity (see *_*_*_*_*_... case).\n //\n lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open ?\n delimiters[openerIdx - 1].jump + 1 :\n 0;\n\n closer.jump = closerIdx - openerIdx + lastJump;\n closer.open = false;\n opener.end = closerIdx;\n opener.jump = lastJump;\n opener.close = false;\n newMinOpenerIdx = -1;\n break;\n }\n }\n }\n\n if (newMinOpenerIdx !== -1) {\n // If match for this delimiter run failed, we want to set lower bound for\n // future lookups. This is required to make sure algorithm has linear\n // complexity.\n //\n // See details here:\n // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442\n //\n openersBottom[closer.marker][(closer.length || 0) % 3] = newMinOpenerIdx;\n }\n }\n}\n\n\nmodule.exports = function link_pairs(state) {\n var curr,\n tokens_meta = state.tokens_meta,\n max = state.tokens_meta.length;\n\n processDelimiters(state, state.delimiters);\n\n for (curr = 0; curr < max; curr++) {\n if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n processDelimiters(state, tokens_meta[curr].delimiters);\n }\n }\n};\n","// Clean up tokens after emphasis and strikethrough postprocessing:\n// merge adjacent text nodes into one and re-calculate all token levels\n//\n// This is necessary because initially emphasis delimiter markers (*, _, ~)\n// are treated as their own separate text tokens. Then emphasis rule either\n// leaves them as text (needed to merge with adjacent text) or turns them\n// into opening/closing tags (which messes up levels inside).\n//\n'use strict';\n\n\nmodule.exports = function text_collapse(state) {\n var curr, last,\n level = 0,\n tokens = state.tokens,\n max = state.tokens.length;\n\n for (curr = last = 0; curr < max; curr++) {\n // re-calculate levels after emphasis/strikethrough turns some text nodes\n // into opening/closing tags\n if (tokens[curr].nesting < 0) level--; // closing tag\n tokens[curr].level = level;\n if (tokens[curr].nesting > 0) level++; // opening tag\n\n if (tokens[curr].type === 'text' &&\n curr + 1 < max &&\n tokens[curr + 1].type === 'text') {\n\n // collapse two adjacent text nodes\n tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content;\n } else {\n if (curr !== last) { tokens[last] = tokens[curr]; }\n\n last++;\n }\n }\n\n if (curr !== last) {\n tokens.length = last;\n }\n};\n","// Inline parser state\n\n'use strict';\n\n\nvar Token = require('../token');\nvar isWhiteSpace = require('../common/utils').isWhiteSpace;\nvar isPunctChar = require('../common/utils').isPunctChar;\nvar isMdAsciiPunct = require('../common/utils').isMdAsciiPunct;\n\n\nfunction StateInline(src, md, env, outTokens) {\n this.src = src;\n this.env = env;\n this.md = md;\n this.tokens = outTokens;\n this.tokens_meta = Array(outTokens.length);\n\n this.pos = 0;\n this.posMax = this.src.length;\n this.level = 0;\n this.pending = '';\n this.pendingLevel = 0;\n\n // Stores { start: end } pairs. Useful for backtrack\n // optimization of pairs parse (emphasis, strikes).\n this.cache = {};\n\n // List of emphasis-like delimiters for current tag\n this.delimiters = [];\n\n // Stack of delimiter lists for upper level tags\n this._prev_delimiters = [];\n}\n\n\n// Flush pending text\n//\nStateInline.prototype.pushPending = function () {\n var token = new Token('text', '', 0);\n token.content = this.pending;\n token.level = this.pendingLevel;\n this.tokens.push(token);\n this.pending = '';\n return token;\n};\n\n\n// Push new token to \"stream\".\n// If pending text exists - flush it as text token\n//\nStateInline.prototype.push = function (type, tag, nesting) {\n if (this.pending) {\n this.pushPending();\n }\n\n var token = new Token(type, tag, nesting);\n var token_meta = null;\n\n if (nesting < 0) {\n // closing tag\n this.level--;\n this.delimiters = this._prev_delimiters.pop();\n }\n\n token.level = this.level;\n\n if (nesting > 0) {\n // opening tag\n this.level++;\n this._prev_delimiters.push(this.delimiters);\n this.delimiters = [];\n token_meta = { delimiters: this.delimiters };\n }\n\n this.pendingLevel = this.level;\n this.tokens.push(token);\n this.tokens_meta.push(token_meta);\n return token;\n};\n\n\n// Scan a sequence of emphasis-like markers, and determine whether\n// it can start an emphasis sequence or end an emphasis sequence.\n//\n// - start - position to scan from (it should point at a valid marker);\n// - canSplitWord - determine if these markers can be found inside a word\n//\nStateInline.prototype.scanDelims = function (start, canSplitWord) {\n var pos = start, lastChar, nextChar, count, can_open, can_close,\n isLastWhiteSpace, isLastPunctChar,\n isNextWhiteSpace, isNextPunctChar,\n left_flanking = true,\n right_flanking = true,\n max = this.posMax,\n marker = this.src.charCodeAt(start);\n\n // treat beginning of the line as a whitespace\n lastChar = start > 0 ? this.src.charCodeAt(start - 1) : 0x20;\n\n while (pos < max && this.src.charCodeAt(pos) === marker) { pos++; }\n\n count = pos - start;\n\n // treat end of the line as a whitespace\n nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20;\n\n isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));\n isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));\n\n isLastWhiteSpace = isWhiteSpace(lastChar);\n isNextWhiteSpace = isWhiteSpace(nextChar);\n\n if (isNextWhiteSpace) {\n left_flanking = false;\n } else if (isNextPunctChar) {\n if (!(isLastWhiteSpace || isLastPunctChar)) {\n left_flanking = false;\n }\n }\n\n if (isLastWhiteSpace) {\n right_flanking = false;\n } else if (isLastPunctChar) {\n if (!(isNextWhiteSpace || isNextPunctChar)) {\n right_flanking = false;\n }\n }\n\n if (!canSplitWord) {\n can_open = left_flanking && (!right_flanking || isLastPunctChar);\n can_close = right_flanking && (!left_flanking || isNextPunctChar);\n } else {\n can_open = left_flanking;\n can_close = right_flanking;\n }\n\n return {\n can_open: can_open,\n can_close: can_close,\n length: count\n };\n};\n\n\n// re-export Token class to use in block rules\nStateInline.prototype.Token = Token;\n\n\nmodule.exports = StateInline;\n","'use strict';\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Helpers\n\n// Merge objects\n//\nfunction assign(obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n\n sources.forEach(function (source) {\n if (!source) { return; }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key];\n });\n });\n\n return obj;\n}\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\nfunction isString(obj) { return _class(obj) === '[object String]'; }\nfunction isObject(obj) { return _class(obj) === '[object Object]'; }\nfunction isRegExp(obj) { return _class(obj) === '[object RegExp]'; }\nfunction isFunction(obj) { return _class(obj) === '[object Function]'; }\n\n\nfunction escapeRE(str) { return str.replace(/[.?*+^$[\\]\\\\(){}|-]/g, '\\\\$&'); }\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nvar defaultOptions = {\n fuzzyLink: true,\n fuzzyEmail: true,\n fuzzyIP: false\n};\n\n\nfunction isOptionsObj(obj) {\n return Object.keys(obj || {}).reduce(function (acc, k) {\n return acc || defaultOptions.hasOwnProperty(k);\n }, false);\n}\n\n\nvar defaultSchemas = {\n 'http:': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.http) {\n // compile lazily, because \"host\"-containing variables can change on tlds update.\n self.re.http = new RegExp(\n '^\\\\/\\\\/' + self.re.src_auth + self.re.src_host_port_strict + self.re.src_path, 'i'\n );\n }\n if (self.re.http.test(tail)) {\n return tail.match(self.re.http)[0].length;\n }\n return 0;\n }\n },\n 'https:': 'http:',\n 'ftp:': 'http:',\n '//': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.no_http) {\n // compile lazily, because \"host\"-containing variables can change on tlds update.\n self.re.no_http = new RegExp(\n '^' +\n self.re.src_auth +\n // Don't allow single-level domains, because of false positives like '//test'\n // with code comments\n '(?:localhost|(?:(?:' + self.re.src_domain + ')\\\\.)+' + self.re.src_domain_root + ')' +\n self.re.src_port +\n self.re.src_host_terminator +\n self.re.src_path,\n\n 'i'\n );\n }\n\n if (self.re.no_http.test(tail)) {\n // should not be `://` & `///`, that protects from errors in protocol name\n if (pos >= 3 && text[pos - 3] === ':') { return 0; }\n if (pos >= 3 && text[pos - 3] === '/') { return 0; }\n return tail.match(self.re.no_http)[0].length;\n }\n return 0;\n }\n },\n 'mailto:': {\n validate: function (text, pos, self) {\n var tail = text.slice(pos);\n\n if (!self.re.mailto) {\n self.re.mailto = new RegExp(\n '^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i'\n );\n }\n if (self.re.mailto.test(tail)) {\n return tail.match(self.re.mailto)[0].length;\n }\n return 0;\n }\n }\n};\n\n/*eslint-disable max-len*/\n\n// RE pattern for 2-character tlds (autogenerated by ./support/tlds_2char_gen.js)\nvar tlds_2ch_src_re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]';\n\n// DON'T try to make PRs with changes. Extend TLDs with LinkifyIt.tlds() instead\nvar tlds_default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|');\n\n/*eslint-enable max-len*/\n\n////////////////////////////////////////////////////////////////////////////////\n\nfunction resetScanCache(self) {\n self.__index__ = -1;\n self.__text_cache__ = '';\n}\n\nfunction createValidator(re) {\n return function (text, pos) {\n var tail = text.slice(pos);\n\n if (re.test(tail)) {\n return tail.match(re)[0].length;\n }\n return 0;\n };\n}\n\nfunction createNormalizer() {\n return function (match, self) {\n self.normalize(match);\n };\n}\n\n// Schemas compiler. Build regexps.\n//\nfunction compile(self) {\n\n // Load & clone RE patterns.\n var re = self.re = require('./lib/re')(self.__opts__);\n\n // Define dynamic patterns\n var tlds = self.__tlds__.slice();\n\n self.onCompile();\n\n if (!self.__tlds_replaced__) {\n tlds.push(tlds_2ch_src_re);\n }\n tlds.push(re.src_xn);\n\n re.src_tlds = tlds.join('|');\n\n function untpl(tpl) { return tpl.replace('%TLDS%', re.src_tlds); }\n\n re.email_fuzzy = RegExp(untpl(re.tpl_email_fuzzy), 'i');\n re.link_fuzzy = RegExp(untpl(re.tpl_link_fuzzy), 'i');\n re.link_no_ip_fuzzy = RegExp(untpl(re.tpl_link_no_ip_fuzzy), 'i');\n re.host_fuzzy_test = RegExp(untpl(re.tpl_host_fuzzy_test), 'i');\n\n //\n // Compile each schema\n //\n\n var aliases = [];\n\n self.__compiled__ = {}; // Reset compiled data\n\n function schemaError(name, val) {\n throw new Error('(LinkifyIt) Invalid schema \"' + name + '\": ' + val);\n }\n\n Object.keys(self.__schemas__).forEach(function (name) {\n var val = self.__schemas__[name];\n\n // skip disabled methods\n if (val === null) { return; }\n\n var compiled = { validate: null, link: null };\n\n self.__compiled__[name] = compiled;\n\n if (isObject(val)) {\n if (isRegExp(val.validate)) {\n compiled.validate = createValidator(val.validate);\n } else if (isFunction(val.validate)) {\n compiled.validate = val.validate;\n } else {\n schemaError(name, val);\n }\n\n if (isFunction(val.normalize)) {\n compiled.normalize = val.normalize;\n } else if (!val.normalize) {\n compiled.normalize = createNormalizer();\n } else {\n schemaError(name, val);\n }\n\n return;\n }\n\n if (isString(val)) {\n aliases.push(name);\n return;\n }\n\n schemaError(name, val);\n });\n\n //\n // Compile postponed aliases\n //\n\n aliases.forEach(function (alias) {\n if (!self.__compiled__[self.__schemas__[alias]]) {\n // Silently fail on missed schemas to avoid errons on disable.\n // schemaError(alias, self.__schemas__[alias]);\n return;\n }\n\n self.__compiled__[alias].validate =\n self.__compiled__[self.__schemas__[alias]].validate;\n self.__compiled__[alias].normalize =\n self.__compiled__[self.__schemas__[alias]].normalize;\n });\n\n //\n // Fake record for guessed links\n //\n self.__compiled__[''] = { validate: null, normalize: createNormalizer() };\n\n //\n // Build schema condition\n //\n var slist = Object.keys(self.__compiled__)\n .filter(function (name) {\n // Filter disabled & fake schemas\n return name.length > 0 && self.__compiled__[name];\n })\n .map(escapeRE)\n .join('|');\n // (?!_) cause 1.5x slowdown\n self.re.schema_test = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'i');\n self.re.schema_search = RegExp('(^|(?!_)(?:[><\\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'ig');\n\n self.re.pretest = RegExp(\n '(' + self.re.schema_test.source + ')|(' + self.re.host_fuzzy_test.source + ')|@',\n 'i'\n );\n\n //\n // Cleanup\n //\n\n resetScanCache(self);\n}\n\n/**\n * class Match\n *\n * Match result. Single element of array, returned by [[LinkifyIt#match]]\n **/\nfunction Match(self, shift) {\n var start = self.__index__,\n end = self.__last_index__,\n text = self.__text_cache__.slice(start, end);\n\n /**\n * Match#schema -> String\n *\n * Prefix (protocol) for matched string.\n **/\n this.schema = self.__schema__.toLowerCase();\n /**\n * Match#index -> Number\n *\n * First position of matched string.\n **/\n this.index = start + shift;\n /**\n * Match#lastIndex -> Number\n *\n * Next position after matched string.\n **/\n this.lastIndex = end + shift;\n /**\n * Match#raw -> String\n *\n * Matched string.\n **/\n this.raw = text;\n /**\n * Match#text -> String\n *\n * Notmalized text of matched string.\n **/\n this.text = text;\n /**\n * Match#url -> String\n *\n * Normalized url of matched string.\n **/\n this.url = text;\n}\n\nfunction createMatch(self, shift) {\n var match = new Match(self, shift);\n\n self.__compiled__[match.schema].normalize(match, self);\n\n return match;\n}\n\n\n/**\n * class LinkifyIt\n **/\n\n/**\n * new LinkifyIt(schemas, options)\n * - schemas (Object): Optional. Additional schemas to validate (prefix/validator)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Creates new linkifier instance with optional additional schemas.\n * Can be called without `new` keyword for convenience.\n *\n * By default understands:\n *\n * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links\n * - \"fuzzy\" links and emails (example.com, foo@bar.com).\n *\n * `schemas` is an object, where each key/value describes protocol/rule:\n *\n * - __key__ - link prefix (usually, protocol name with `:` at the end, `skype:`\n * for example). `linkify-it` makes shure that prefix is not preceeded with\n * alphanumeric char and symbols. Only whitespaces and punctuation allowed.\n * - __value__ - rule to check tail after link prefix\n * - _String_ - just alias to existing rule\n * - _Object_\n * - _validate_ - validator function (should return matched length on success),\n * or `RegExp`.\n * - _normalize_ - optional function to normalize text & url of matched result\n * (for example, for @twitter mentions).\n *\n * `options`:\n *\n * - __fuzzyLink__ - recognige URL-s without `http(s):` prefix. Default `true`.\n * - __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts\n * like version numbers. Default `false`.\n * - __fuzzyEmail__ - recognize emails without `mailto:` prefix.\n *\n **/\nfunction LinkifyIt(schemas, options) {\n if (!(this instanceof LinkifyIt)) {\n return new LinkifyIt(schemas, options);\n }\n\n if (!options) {\n if (isOptionsObj(schemas)) {\n options = schemas;\n schemas = {};\n }\n }\n\n this.__opts__ = assign({}, defaultOptions, options);\n\n // Cache last tested result. Used to skip repeating steps on next `match` call.\n this.__index__ = -1;\n this.__last_index__ = -1; // Next scan position\n this.__schema__ = '';\n this.__text_cache__ = '';\n\n this.__schemas__ = assign({}, defaultSchemas, schemas);\n this.__compiled__ = {};\n\n this.__tlds__ = tlds_default;\n this.__tlds_replaced__ = false;\n\n this.re = {};\n\n compile(this);\n}\n\n\n/** chainable\n * LinkifyIt#add(schema, definition)\n * - schema (String): rule name (fixed pattern prefix)\n * - definition (String|RegExp|Object): schema definition\n *\n * Add new rule definition. See constructor description for details.\n **/\nLinkifyIt.prototype.add = function add(schema, definition) {\n this.__schemas__[schema] = definition;\n compile(this);\n return this;\n};\n\n\n/** chainable\n * LinkifyIt#set(options)\n * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }\n *\n * Set recognition options for links without schema.\n **/\nLinkifyIt.prototype.set = function set(options) {\n this.__opts__ = assign(this.__opts__, options);\n return this;\n};\n\n\n/**\n * LinkifyIt#test(text) -> Boolean\n *\n * Searches linkifiable pattern and returns `true` on success or `false` on fail.\n **/\nLinkifyIt.prototype.test = function test(text) {\n // Reset scan cache\n this.__text_cache__ = text;\n this.__index__ = -1;\n\n if (!text.length) { return false; }\n\n var m, ml, me, len, shift, next, re, tld_pos, at_pos;\n\n // try to scan for link with schema - that's the most simple rule\n if (this.re.schema_test.test(text)) {\n re = this.re.schema_search;\n re.lastIndex = 0;\n while ((m = re.exec(text)) !== null) {\n len = this.testSchemaAt(text, m[2], re.lastIndex);\n if (len) {\n this.__schema__ = m[2];\n this.__index__ = m.index + m[1].length;\n this.__last_index__ = m.index + m[0].length + len;\n break;\n }\n }\n }\n\n if (this.__opts__.fuzzyLink && this.__compiled__['http:']) {\n // guess schemaless links\n tld_pos = text.search(this.re.host_fuzzy_test);\n if (tld_pos >= 0) {\n // if tld is located after found link - no need to check fuzzy pattern\n if (this.__index__ < 0 || tld_pos < this.__index__) {\n if ((ml = text.match(this.__opts__.fuzzyIP ? this.re.link_fuzzy : this.re.link_no_ip_fuzzy)) !== null) {\n\n shift = ml.index + ml[1].length;\n\n if (this.__index__ < 0 || shift < this.__index__) {\n this.__schema__ = '';\n this.__index__ = shift;\n this.__last_index__ = ml.index + ml[0].length;\n }\n }\n }\n }\n }\n\n if (this.__opts__.fuzzyEmail && this.__compiled__['mailto:']) {\n // guess schemaless emails\n at_pos = text.indexOf('@');\n if (at_pos >= 0) {\n // We can't skip this check, because this cases are possible:\n // 192.168.1.1@gmail.com, my.in@example.com\n if ((me = text.match(this.re.email_fuzzy)) !== null) {\n\n shift = me.index + me[1].length;\n next = me.index + me[0].length;\n\n if (this.__index__ < 0 || shift < this.__index__ ||\n (shift === this.__index__ && next > this.__last_index__)) {\n this.__schema__ = 'mailto:';\n this.__index__ = shift;\n this.__last_index__ = next;\n }\n }\n }\n }\n\n return this.__index__ >= 0;\n};\n\n\n/**\n * LinkifyIt#pretest(text) -> Boolean\n *\n * Very quick check, that can give false positives. Returns true if link MAY BE\n * can exists. Can be used for speed optimization, when you need to check that\n * link NOT exists.\n **/\nLinkifyIt.prototype.pretest = function pretest(text) {\n return this.re.pretest.test(text);\n};\n\n\n/**\n * LinkifyIt#testSchemaAt(text, name, position) -> Number\n * - text (String): text to scan\n * - name (String): rule (schema) name\n * - position (Number): text offset to check from\n *\n * Similar to [[LinkifyIt#test]] but checks only specific protocol tail exactly\n * at given position. Returns length of found pattern (0 on fail).\n **/\nLinkifyIt.prototype.testSchemaAt = function testSchemaAt(text, schema, pos) {\n // If not supported schema check requested - terminate\n if (!this.__compiled__[schema.toLowerCase()]) {\n return 0;\n }\n return this.__compiled__[schema.toLowerCase()].validate(text, pos, this);\n};\n\n\n/**\n * LinkifyIt#match(text) -> Array|null\n *\n * Returns array of found link descriptions or `null` on fail. We strongly\n * recommend to use [[LinkifyIt#test]] first, for best speed.\n *\n * ##### Result match description\n *\n * - __schema__ - link schema, can be empty for fuzzy links, or `//` for\n * protocol-neutral links.\n * - __index__ - offset of matched text\n * - __lastIndex__ - index of next char after mathch end\n * - __raw__ - matched text\n * - __text__ - normalized text\n * - __url__ - link, generated from matched text\n **/\nLinkifyIt.prototype.match = function match(text) {\n var shift = 0, result = [];\n\n // Try to take previous element from cache, if .test() called before\n if (this.__index__ >= 0 && this.__text_cache__ === text) {\n result.push(createMatch(this, shift));\n shift = this.__last_index__;\n }\n\n // Cut head if cache was used\n var tail = shift ? text.slice(shift) : text;\n\n // Scan string until end reached\n while (this.test(tail)) {\n result.push(createMatch(this, shift));\n\n tail = tail.slice(this.__last_index__);\n shift += this.__last_index__;\n }\n\n if (result.length) {\n return result;\n }\n\n return null;\n};\n\n\n/** chainable\n * LinkifyIt#tlds(list [, keepOld]) -> this\n * - list (Array): list of tlds\n * - keepOld (Boolean): merge with current list if `true` (`false` by default)\n *\n * Load (or merge) new tlds list. Those are user for fuzzy links (without prefix)\n * to avoid false positives. By default this algorythm used:\n *\n * - hostname with any 2-letter root zones are ok.\n * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф\n * are ok.\n * - encoded (`xn--...`) root zones are ok.\n *\n * If list is replaced, then exact match for 2-chars root zones will be checked.\n **/\nLinkifyIt.prototype.tlds = function tlds(list, keepOld) {\n list = Array.isArray(list) ? list : [ list ];\n\n if (!keepOld) {\n this.__tlds__ = list.slice();\n this.__tlds_replaced__ = true;\n compile(this);\n return this;\n }\n\n this.__tlds__ = this.__tlds__.concat(list)\n .sort()\n .filter(function (el, idx, arr) {\n return el !== arr[idx - 1];\n })\n .reverse();\n\n compile(this);\n return this;\n};\n\n/**\n * LinkifyIt#normalize(match)\n *\n * Default normalizer (if schema does not define it's own).\n **/\nLinkifyIt.prototype.normalize = function normalize(match) {\n\n // Do minimal possible changes by default. Need to collect feedback prior\n // to move forward https://github.com/markdown-it/linkify-it/issues/1\n\n if (!match.schema) { match.url = 'http://' + match.url; }\n\n if (match.schema === 'mailto:' && !/^mailto:/i.test(match.url)) {\n match.url = 'mailto:' + match.url;\n }\n};\n\n\n/**\n * LinkifyIt#onCompile()\n *\n * Override to modify basic RegExp-s.\n **/\nLinkifyIt.prototype.onCompile = function onCompile() {\n};\n\n\nmodule.exports = LinkifyIt;\n","'use strict';\n\n\nmodule.exports = function (opts) {\n var re = {};\n\n // Use direct extract instead of `regenerate` to reduse browserified size\n re.src_Any = require('uc.micro/properties/Any/regex').source;\n re.src_Cc = require('uc.micro/categories/Cc/regex').source;\n re.src_Z = require('uc.micro/categories/Z/regex').source;\n re.src_P = require('uc.micro/categories/P/regex').source;\n\n // \\p{\\Z\\P\\Cc\\CF} (white spaces + control + format + punctuation)\n re.src_ZPCc = [ re.src_Z, re.src_P, re.src_Cc ].join('|');\n\n // \\p{\\Z\\Cc} (white spaces + control)\n re.src_ZCc = [ re.src_Z, re.src_Cc ].join('|');\n\n // Experimental. List of chars, completely prohibited in links\n // because can separate it from other part of text\n var text_separators = '[><\\uff5c]';\n\n // All possible word characters (everything without punctuation, spaces & controls)\n // Defined via punctuation & spaces to save space\n // Should be something like \\p{\\L\\N\\S\\M} (\\w but without `_`)\n re.src_pseudo_letter = '(?:(?!' + text_separators + '|' + re.src_ZPCc + ')' + re.src_Any + ')';\n // The same as abothe but without [0-9]\n // var src_pseudo_letter_non_d = '(?:(?![0-9]|' + src_ZPCc + ')' + src_Any + ')';\n\n ////////////////////////////////////////////////////////////////////////////////\n\n re.src_ip4 =\n\n '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)';\n\n // Prohibit any of \"@/[]()\" in user/pass to avoid wrong domain fetch.\n re.src_auth = '(?:(?:(?!' + re.src_ZCc + '|[@/\\\\[\\\\]()]).)+@)?';\n\n re.src_port =\n\n '(?::(?:6(?:[0-4]\\\\d{3}|5(?:[0-4]\\\\d{2}|5(?:[0-2]\\\\d|3[0-5])))|[1-5]?\\\\d{1,4}))?';\n\n re.src_host_terminator =\n\n '(?=$|' + text_separators + '|' + re.src_ZPCc + ')(?!-|_|:\\\\d|\\\\.-|\\\\.(?!$|' + re.src_ZPCc + '))';\n\n re.src_path =\n\n '(?:' +\n '[/?#]' +\n '(?:' +\n '(?!' + re.src_ZCc + '|' + text_separators + '|[()[\\\\]{}.,\"\\'?!\\\\-]).|' +\n '\\\\[(?:(?!' + re.src_ZCc + '|\\\\]).)*\\\\]|' +\n '\\\\((?:(?!' + re.src_ZCc + '|[)]).)*\\\\)|' +\n '\\\\{(?:(?!' + re.src_ZCc + '|[}]).)*\\\\}|' +\n '\\\\\"(?:(?!' + re.src_ZCc + '|[\"]).)+\\\\\"|' +\n \"\\\\'(?:(?!\" + re.src_ZCc + \"|[']).)+\\\\'|\" +\n \"\\\\'(?=\" + re.src_pseudo_letter + '|[-]).|' + // allow `I'm_king` if no pair found\n '\\\\.{2,4}[a-zA-Z0-9%/]|' + // github has ... in commit range links,\n // google has .... in links (issue #66)\n // Restrict to\n // - english\n // - percent-encoded\n // - parts of file path\n // until more examples found.\n '\\\\.(?!' + re.src_ZCc + '|[.]).|' +\n (opts && opts['---'] ?\n '\\\\-(?!--(?:[^-]|$))(?:-*)|' // `---` => long dash, terminate\n :\n '\\\\-+|'\n ) +\n '\\\\,(?!' + re.src_ZCc + ').|' + // allow `,,,` in paths\n '\\\\!(?!' + re.src_ZCc + '|[!]).|' +\n '\\\\?(?!' + re.src_ZCc + '|[?]).' +\n ')+' +\n '|\\\\/' +\n ')?';\n\n // Allow anything in markdown spec, forbid quote (\") at the first position\n // because emails enclosed in quotes are far more common\n re.src_email_name =\n\n '[\\\\-;:&=\\\\+\\\\$,\\\\.a-zA-Z0-9_][\\\\-;:&=\\\\+\\\\$,\\\\\"\\\\.a-zA-Z0-9_]*';\n\n re.src_xn =\n\n 'xn--[a-z0-9\\\\-]{1,59}';\n\n // More to read about domain names\n // http://serverfault.com/questions/638260/\n\n re.src_domain_root =\n\n // Allow letters & digits (http://test1)\n '(?:' +\n re.src_xn +\n '|' +\n re.src_pseudo_letter + '{1,63}' +\n ')';\n\n re.src_domain =\n\n '(?:' +\n re.src_xn +\n '|' +\n '(?:' + re.src_pseudo_letter + ')' +\n '|' +\n '(?:' + re.src_pseudo_letter + '(?:-|' + re.src_pseudo_letter + '){0,61}' + re.src_pseudo_letter + ')' +\n ')';\n\n re.src_host =\n\n '(?:' +\n // Don't need IP check, because digits are already allowed in normal domain names\n // src_ip4 +\n // '|' +\n '(?:(?:(?:' + re.src_domain + ')\\\\.)*' + re.src_domain/*_root*/ + ')' +\n ')';\n\n re.tpl_host_fuzzy =\n\n '(?:' +\n re.src_ip4 +\n '|' +\n '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))' +\n ')';\n\n re.tpl_host_no_ip_fuzzy =\n\n '(?:(?:(?:' + re.src_domain + ')\\\\.)+(?:%TLDS%))';\n\n re.src_host_strict =\n\n re.src_host + re.src_host_terminator;\n\n re.tpl_host_fuzzy_strict =\n\n re.tpl_host_fuzzy + re.src_host_terminator;\n\n re.src_host_port_strict =\n\n re.src_host + re.src_port + re.src_host_terminator;\n\n re.tpl_host_port_fuzzy_strict =\n\n re.tpl_host_fuzzy + re.src_port + re.src_host_terminator;\n\n re.tpl_host_port_no_ip_fuzzy_strict =\n\n re.tpl_host_no_ip_fuzzy + re.src_port + re.src_host_terminator;\n\n\n ////////////////////////////////////////////////////////////////////////////////\n // Main rules\n\n // Rude test fuzzy links by host, for quick deny\n re.tpl_host_fuzzy_test =\n\n 'localhost|www\\\\.|\\\\.\\\\d{1,3}\\\\.|(?:\\\\.(?:%TLDS%)(?:' + re.src_ZPCc + '|>|$))';\n\n re.tpl_email_fuzzy =\n\n '(^|' + text_separators + '|\"|\\\\(|' + re.src_ZCc + ')' +\n '(' + re.src_email_name + '@' + re.tpl_host_fuzzy_strict + ')';\n\n re.tpl_link_fuzzy =\n // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n // but can start with > (markdown blockquote)\n '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_fuzzy_strict + re.src_path + ')';\n\n re.tpl_link_no_ip_fuzzy =\n // Fuzzy link can't be prepended with .:/\\- and non punctuation.\n // but can start with > (markdown blockquote)\n '(^|(?![.:/\\\\-_@])(?:[$+<=>^`|\\uff5c]|' + re.src_ZPCc + '))' +\n '((?![$+<=>^`|\\uff5c])' + re.tpl_host_port_no_ip_fuzzy_strict + re.src_path + ')';\n\n return re;\n};\n","/*! https://mths.be/punycode v1.4.1 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see \n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t counter = 0,\n\t\t length = string.length,\n\t\t value,\n\t\t extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t// 0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t inputLength = input.length,\n\t\t out,\n\t\t i = 0,\n\t\t n = initialN,\n\t\t bias = initialBias,\n\t\t basic,\n\t\t j,\n\t\t index,\n\t\t oldi,\n\t\t w,\n\t\t k,\n\t\t digit,\n\t\t t,\n\t\t /** Cached calculation results */\n\t\t baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t delta,\n\t\t handledCPCount,\n\t\t basicLength,\n\t\t bias,\n\t\t j,\n\t\t m,\n\t\t q,\n\t\t k,\n\t\t t,\n\t\t currentValue,\n\t\t output = [],\n\t\t /** `inputLength` will hold the number of code points in `input`. */\n\t\t inputLength,\n\t\t /** Cached calculation results */\n\t\t handledCPCountPlusOne,\n\t\t baseMinusT,\n\t\t qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.4.1',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see \n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine('punycode', function() {\n\t\t\treturn punycode;\n\t\t});\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) {\n\t\t\t// in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else {\n\t\t\t// in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","// markdown-it default options\n\n'use strict';\n\n\nmodule.exports = {\n options: {\n html: false, // Enable HTML tags in source\n xhtmlOut: false, // Use '/' to close single tags (
                  )\n breaks: false, // Convert '\\n' in paragraphs into
                  \n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with )\n breaks: false, // Convert '\\n' in paragraphs into
                  \n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with )\n breaks: false, // Convert '\\n' in paragraphs into
                  \n langPrefix: 'language-', // CSS language prefix for fenced blocks\n linkify: false, // autoconvert URL-like texts to links\n\n // Enable some language-neutral replacements + quotes beautification\n typographer: false,\n\n // Double + single quotes replacement pairs, when typographer enabled,\n // and smartquotes on. Could be either a String or an Array.\n //\n // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n quotes: '\\u201c\\u201d\\u2018\\u2019', /* “”‘’ */\n\n // Highlighter function. Should return escaped HTML,\n // or '' if the source string is not changed and should be escaped externaly.\n // If result starts with {\n addPreferences();\n applyEditor();\n});\n\nexport * from '../common/index';\n","import { extend } from 'flarum/common/extend';\nimport FieldSet from 'flarum/common/components/FieldSet';\nimport Switch from 'flarum/common/components/Switch';\nimport SettingsPage from 'flarum/forum/components/SettingsPage';\nimport ItemList from 'flarum/common/utils/ItemList';\n\nexport default function addPreferences() {\n extend(SettingsPage.prototype, 'settingsItems', function (items) {\n items.add(\n 'composer',\n FieldSet.component(\n {\n label: app.translator.trans('askvortsov-rich-text.forum.settings.composer_heading'),\n className: 'Settings-composer',\n },\n this.composerItems().toArray()\n )\n );\n });\n\n SettingsPage.prototype['composerItems'] = function () {\n const items = new ItemList();\n\n items.add(\n 'useRichTextEditor',\n Switch.component(\n {\n state: this.user.preferences().useRichTextEditor,\n onchange: (value) => {\n this.useRichTextEditorLoading = true;\n\n this.user.savePreferences({ useRichTextEditor: value }).then(() => {\n this.useRichTextEditorLoading = false;\n m.redraw();\n });\n },\n loading: this.useRichTextEditorLoading,\n },\n app.translator.trans('askvortsov-rich-text.forum.settings.use_rich_text_editor_label')\n )\n );\n\n items.add(\n 'richTextCompactParagraphs',\n Switch.component(\n {\n state: this.user.preferences().richTextCompactParagraphs,\n onchange: (value) => {\n this.richTextCompactParagraphsLoading = true;\n\n this.user.savePreferences({ richTextCompactParagraphs: value }).then(() => {\n this.richTextCompactParagraphsLoading = false;\n m.redraw();\n });\n },\n loading: this.richTextCompactParagraphsLoading,\n },\n app.translator.trans('askvortsov-rich-text.forum.settings.rich_text_compact_paragraphs_label')\n )\n );\n\n return items;\n };\n}\n"],"sourceRoot":""} \ No newline at end of file