{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-event-sourcing/src/components/widgets/lively-code-mirror.js"],"names":["promisedEvent","through","generateUUID","uuid","debounce","isSet","loc","range","boundEval","Morph","diff","SyntaxChecker","Preferences","pt","Strings","letsScript","LivelyCodeMirrorWidgetImport","LivelyCodeMirrorCodeProvider","openMenu","spellCheck","fake","CodeMirror","indentationWidth","DependencyGraph","DebuggingCache","AExprRegistry","ContextMenu","_","posEq","stripErrorString","self","loadPromise","undefined","s","toString","replace","a","b","line","ch","LivelyCodeMirror","HTMLElement","args","editor","mode","getAttribute","val","setAttribute","codeMirrorPath","lively4url","loadModule","path","force","console","warn","code","fetch","then","r","text","eval","e","error","loadCSS","lively","loadCSSThroughDOM","loadModules","System","import","loadTernModules","ternIsLoaded","terndir","loadJavaScriptThroughDOM","astCapabilities","cm","m","myASTCapabilities","default","codeProvider","autoCompletion","ternWrapper","ternLoaded","TernCodeMirrorWrapper","initialize","_attrObserver","MutationObserver","mutations","forEach","mutation","type","attributeChangedCallback","attributeName","oldValue","target","observe","attributes","applyAttribute","attr","value","attachedCallback","isLoading","root","shadowRoot","textContent","decodeHTML","editView","event","CustomEvent","dispatchEvent","sleep","refresh","updateAExprDependencies","editorLoaded","container","querySelector","innerHTML","setEditor","lineNumbers","gutters","lint","setupEditor","setOption","setupEditorOptions","on","evt","detail","checkSyntax","ac","codeChanged","onCursorActivity","map","ea","name","keyEvent","classList","contains","repeat","unifiedKeyDescription","alt","altKey","ctrl","ctrlKey","shift","shiftKey","key","operations","Escape","remove","i","inlineLocalVariable","operation","preventDefault","codemirrorIgnore","notify","clearHistory","getDoc","addKeys","keymap","keys","ensureExtraKeys","extraKeys","Object","assign","split","c","upperCase","defaultASTHandlers","slurp","barf","braveNewWorld","livelyNotify","negateExpression","replaceParentWithSelection","newlineAndIndent","swapConditional","generateIf","insertMarkdownComment","isJavaScript","openContextMenu","toggleOverwrite","setTimeout","execCommand","focus","fixHintsPosition","getSelectionOrLine","tryBoundEval","inspectIt","searchField","lastSearch","oldSearch","addEventListener","select","somethingSelected","indentSelection","doSave","getValue","result","tw","showType","jumpToDefinition","jumpBack","showReferences","expandSelection","reduceSelection","selectNextASTNodeLikeThis","selectNextASTChild","selectNextReference","selectDeclaration","rename","toggle","extractExpressionIntoLocalVariable","singalEditorbackNavigation","showAExprDependencyTextMarkers","selection","getSelection","replaceSelection","complete","closeEditor","query","onCancel","bubbles","cancelable","registerExtraKeys","options","keyMap","sublime","normalizeKeyMap","showToken","annotateScrollbar","updateArgHints","widgetEnter","cursorHead","getCursor","cursorAnchor","codemirror","closeCharacters","oldVal","newVal","length","getLine","getDoitContext","doitContext","setDoitContext","context","getTargetModule","targetModule","setTargetModule","module","str","match","boundEvalPython","log","xterm","document","term","__socket","data","__sendData","printWidget","wrapWidget","from","to","widget","createElement","add","style","whiteSpace","promise","create","comp","display","minWidth","minHeight","marker","doc","markText","replacedWith","printResult","obj","isPromise","isAsync","setCursor","__asyncresult__","promisedWidget","objClass","constructor","call","Array","isMap","mapObj","sort","get","isArray","every","Node","String","table","setFromJSO","maxHeight","overflow","index","ensuredPrintString","inspector","inspect","hideWorkspace","span","parentElement","insertBefore","appendChild","border","resp","isError","window","LastError","handleError","catch","showElement","openInspector","detachedCallback","_attached","_value","setValue","setCustomStyle","source","getCustomStyle","encodeHTML","resize","enableAutocompletion","getOption","isMarkdown","isHTML","changeModeForFile","filename","lang","dict","loadDictLang","startSpellCheck","current","livelyPrepareSave","livelyPreMigrate","lastScrollInfo","getScrollInfo","isFocused","activeElement","livelyMigrate","other","composedPath","removeEventListener","scrollTo","left","top","setPosition","scrollingElement","scrollLeft","scrollTop","subPt","getGlobalPosition","addTernFile","url","ternServer","server","addFile","mergeView","originalText","originalLeftText","_mergeView","MergeView","origLeft","orig","scrollbarStyle","highlightDifferences","connect","lineWrapping","collapseIdentical","resizeMergeView","editorHeight","height","mergeViewHeight","Math","max","leftOriginal","rightOriginal","setSize","newHeight","wrap","hideDataURLs","regEx","RegExp","exec","posFromIndex","div","backgroundColor","img","src","title","slice","createTextNode","wrapImports","id","getImportDeclarationRegex","LiteralString","JavaScriptIdentifier","ImportSpecifierPartSimple","ImportSpecifierPartRename","ImportSpecifierPart","ImportSpecifier","ImportDefaultSpecifier","ImportNamespaceSpecifier","anySpecifier","ImportDeclaration","importWidgetForRange","wrapLinks","that","link","lastWidget","input","find","keyCode","replaceRange","selectionStart","setSelection","checkForSyntaxErrors","found","startPos","indexOf","scrollToLine","heightAtLine","unsavedChanges","navbar","onDetailsContentCursorActivity","livelyMinimizedTitle","dependencyGraph","_deps","showAExprDependencyGutter","registerFileForAEDebugging","fileURL","triplets","allDependenciesByLine","depToAE","AEToDep","clearGutter","showAExprDependencyGutterMarkers","showAExprTextMarkers","resetAExprTextMarkers","getAllActiveExpressions","node","asCM","mark","css","isAExprTextMarker","getAllMarks","clear","some","hideAExprDependencyGutter","filter","resetAExprDependencyTextMarkers","isAExprDependencyTextMarker","cursor","aexprPath","getAexprAtCursor","deps","resolveDependencies","dependencyMap","isAE","aExprs","entries","drawAExprGutter","depsMapInFile","Map","handleDepAEPairing","ae","dependencyLoc","dependencySource","dependencyLine","start","dependencyFile","file","AELocation","meta","AELine","valueChangedEvents","relatedEvents","trigger","includes","set","push","location","events","aes","Set","hook","dependency","locations","getLocations","identifier","getURL","pathname","valid","allParents","body","dependencies","setGutterMarker","drawAExprGutterMarker","faIcon","modifiers","join","sorted","aDep","bDep","column","accumulated","dep","isEqual","lastDep","end","callback","markerBounds","getBoundingClientRect","drawAExprDependencyList","menuItems","allAEs","union","navigateToTimeline","description","inThisFile","substring","lastIndexOf","openBrowser","menu","size","openIn","clientX","clientY","bottom","iterables","iterable","item","existingTimelines","querySelectorAll","timeline","filterToAEs","openComponentInWindow"],"mappings":";;;;;;;;;;;;;;;;;AASSA,mB,UAAAA,a;AAAeC,a,UAAAA,O;AAAiBC,kB,UAARC,I;AAKxBC,c,UAAAA,Q;AAUAC,W,UAAAA,K;AAKAC,S,UAAAA,G;AAAKC,W,UAAAA,K;;AAnBPC,e;;AACAC,W;;AACAC,U;;AACAC,mB;;AAEAC,iB;;AACEC,Q,wBAAAA,E;;AAEFC,a;;AACEC,gB,4BAAAA,U;;AACFC,kC;;AACAC,kC;;AACAC,c;;AACKC,gB;;AAELC,U;;AACAC,gB;;AAIAC,sB;;AACEC,qB,oCAAAA,e;;AACAC,oB,0EAAAA,c;;AACAC,mB,wDAAAA,a;;AACFC,iB;;AAEAC,O;;;;;;;;;;;AAMEC,gD;;;;;;;;;;;;;sCAJOC,iD;;;;;;;;;;;;;;AA7ByB3B,uD;;;;;;;;;;;;;AAAjBD,kD;;;;;;;;;;;;;AAAfD,wD;;;;;;;;;;;;;AACFQ,oD;;;;;;;;;;;;;AACAC,gD;;;;;;;;;;;;;AACAC,+C;;;;;;;;;;;;;AACAC,wD;;;;;;;;;;;;;AACEP,mD;;;;;;;;;;;;;AACFQ,sD;;;;;;;;;;;;;AACEC,6C;;;;;;;;;;;;;AAEFC,kD;;;;;;;;;;;;;AACEC,qD;;;;;;;;;;;;;AACFC,uE;;;;;;;;;;;;;AACAC,uE;;;;;;;;;;;;;AACAC,mD;;;;;;;;;;;;;AACKC,qD;;;;;;;;;;;;;AACHd,gD;;;;;;;;;;;;;AACFe,+C;;;;;;;;;;;;;AACAC,qD;;;;;;;;AACPS,WAAKT,UAAL,GAAkBA,UAAlB,C,CAA8B;AAC9B,UAAIU,cAAcC,SAAlB;;;;;;;AAAID,sD;;;;;;;;;;;;;AACUxB,gD;;;;;;;;;;;;;AAALD,8C;;;;;;;;;;;;;AACFgB,2D;;;;;;;;;;;;;AACEC,0D;;;;;;;;;;;;;AACAC,yD;;;;;;;;;;;;;AACAC,wD;;;;;;;;;;;;;AACFC,sD;;;;;;;;;;;;;AAEAC,4C;;;;;;;AAEA,eAASE,gBAAT,CAA0BI,CAA1B,EAA6B;AAClC,eAAOA,EAAEC,QAAF,GAAaC,OAAb,CAAqB,8BAArB,EAAqD,QAArD,EAA+DA,OAA/D,CAAuE,oCAAvE,EAA6G,EAA7G,EAAiHA,OAAjH,CAAyH,iCAAzH,EAA4J,EAA5J,EAAgKA,OAAhK,CAAwK,uCAAxK,EAAiN,EAAjN,CAAP;AACD;;;;AAED,eAASP,KAAT,CAAeQ,CAAf,EAAkBC,CAAlB,EAAqB;AACnB,eAAOD,EAAEE,IAAF,IAAUD,EAAEC,IAAZ,IAAoBF,EAAEG,EAAF,IAAQF,EAAEE,EAArC;AACD;;AAEc,YAAMC,gBAAN,SAA+BC,WAA/B,CAA2C;;AAExDrB,aAAK,GAAGsB,IAAR,EAAc;AACZtB,eAAK,KAAKuB,MAAV,EAAkB,GAAGD,IAArB;AACD;;AAED,YAAIE,IAAJ,GAAW;AACT,iBAAO,KAAKC,YAAL,CAAkB,MAAlB,CAAP;AACD;AACD,YAAID,IAAJ,CAASE,GAAT,EAAc;AACZ,iBAAO,KAAKC,YAAL,CAAkB,MAAlB,EAA0BD,GAA1B,CAAP;AACD;;AAED,mBAAWE,cAAX,GAA4B;AAC1B,iBAAOC,aAAa,4BAApB;AACD;;AAED,qBAAaC,UAAb,CAAwBC,IAAxB,EAA8BC,KAA9B,EAAqC;AACnC,cAAI,CAACtB,KAAKT,UAAV,EAAsB;AACpBgC,oBAAQC,IAAR,CAAa,iDAAiDH,IAA9D;AACA;AACD;AACD,cAAII,OAAO,MAAMC,MAAM,KAAKR,cAAL,GAAsBG,IAA5B,EAAkCM,IAAlC,CAAuCC,KAAKA,EAAEC,IAAF,EAA5C,CAAjB;AACA,cAAI;AACFC,iBAAKL,IAAL;AACD,WAFD,CAEE,OAAOM,CAAP,EAAU;AACVR,oBAAQS,KAAR,CAAc,sCAAsCX,IAApD,EAA0DU,CAA1D;AACD;AACD;AACA;AACD;;AAED,qBAAaE,OAAb,CAAqBZ,IAArB,EAA2B;AACzB,iBAAOa,OAAOC,iBAAP,CAAyB,gBAAgBd,KAAKhB,OAAL,CAAa,YAAb,EAA2B,EAA3B,CAAzC,EAAyE,KAAKa,cAAL,GAAsBG,IAA/F,CAAP;AACD;;AAED,qBAAae,WAAb,CAAyBd,KAAzB,EAAgC;AAC9B;AACA,cAAIrB,eAAe,CAACqB,KAApB,EAA2B,OAAOrB,WAAP;AAC3B,iFAAc,CAAC,YAAY;;AAEzB,kBAAM,KAAKmB,UAAL,CAAgB,wBAAhB,CAAN;;AAEA,kBAAM,KAAKA,UAAL,CAAgB,+BAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,iBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,iBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,mBAAhB,CAAN;;AAEA,kBAAM,KAAKA,UAAL,CAAgB,2BAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,6BAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,uBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,iBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,mBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,iBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,uBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,qBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,qBAAhB,CAAN;;AAEA,kBAAM,KAAKA,UAAL,CAAgB,6BAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,wBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,6BAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,4BAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,yBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,6BAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,yBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,+BAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,8BAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,wBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,8BAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,oCAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,mCAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,mCAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,0BAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,wBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB;;AAEtB;AACA;AACA;AAJM,aAAN,CAKE,MAAM,KAAKA,UAAL,CAAgB,oBAAhB,CAAN;AACF,kBAAM,KAAKA,UAAL,CAAgB,+BAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,qBAAhB,CAAN;AACA;AACA,kBAAMiB,OAAOC,MAAP,CAAcnB,aAAa,qCAA3B,CAAN;AACA,kBAAM,KAAKC,UAAL,CAAgB,sBAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,mCAAhB,CAAN;AACA,kBAAM,KAAKA,UAAL,CAAgB,mBAAhB,CAAN;AACA,kBAAMiB,OAAOC,MAAP,CAAcnB,aAAa,oDAA3B,CAAN;;AAEA,iBAAKc,OAAL,CAAa,0BAAb;AACA,iBAAKA,OAAL,CAAa,qBAAb;AACAC,mBAAOC,iBAAP,CAAyB,eAAzB,EAA0ChB,aAAa,gDAAvD;AACD,WArDa,GAAd;AAsDA,iBAAOlB,WAAP;AACD;;AAED;AACA,qBAAasC,eAAb,GAA+B;AAC7B,cAAI,KAAKC,YAAT,EAAuB;;AAEvB,gBAAM,KAAKpB,UAAL,CAAgB,oBAAhB,CAAN;;AAEA,cAAIqB,UAAUtB,aAAa,qBAA3B;AACA,gBAAMe,OAAOQ,wBAAP,CAAgC,YAAhC,EAA8CD,UAAU,UAAxD,CAAN;AACA,gBAAMP,OAAOQ,wBAAP,CAAgC,kBAAhC,EAAoDD,UAAU,gBAA9D,CAAN;AACA,gBAAMP,OAAOQ,wBAAP,CAAgC,WAAhC,EAA6CD,UAAU,SAAvD,CAAN;AACA,gBAAMP,OAAOQ,wBAAP,CAAgC,eAAhC,EAAiDD,UAAU,aAA3D,CAAN;AACA,gBAAMP,OAAOQ,wBAAP,CAAgC,aAAhC,EAA+CD,UAAU,WAAzD,CAAN;AACA,gBAAMP,OAAOQ,wBAAP,CAAgC,WAAhC,EAA6CD,UAAU,SAAvD,CAAN;AACA,gBAAMP,OAAOQ,wBAAP,CAAgC,UAAhC,EAA4CD,UAAU,QAAtD,CAAN;AACA,gBAAMP,OAAOQ,wBAAP,CAAgC,cAAhC,EAAgDD,UAAU,YAA1D,CAAN;AACA,gBAAMP,OAAOQ,wBAAP,CAAgC,YAAhC,EAA8CD,UAAU,UAAxD,CAAN;AACA,gBAAMP,OAAOQ,wBAAP,CAAgC,qBAAhC,EAAuDD,UAAU,YAAjE,CAAN;AACA,gBAAMP,OAAOQ,wBAAP,CAAgC,uBAAhC,EAAyDD,UAAU,eAAnE,CAAN;AACA,eAAKD,YAAL,GAAoB,IAApB;AACD;;AAEDG,wBAAgBC,EAAhB,EAAoB;AAClB,iBAAOP,OAAOC,MAAP,CAAc,4CAAd,EAA4DX,IAA5D,CAAiEkB,KAAK;AAC3E,gBAAI,CAAC,KAAKC,iBAAN,IAA2B,EAAE,KAAKA,iBAAL,YAAkCD,EAAEE,OAAtC,CAA/B,EAA+E;AAC7E,oBAAMC,eAAe,IAAI7D,4BAAJ,CAAiC,IAAjC,EAAuCyD,EAAvC,CAArB;AACA,mBAAKE,iBAAL,GAAyB,IAAID,EAAEE,OAAN,CAAcC,YAAd,CAAzB;AACD;;AAED,mBAAO,KAAKF,iBAAZ;AACD,WAPM,CAAP;AAQD;;AAEDG,uBAAeL,EAAf,EAAmB;AACjB,iBAAOP,OAAOC,MAAP,CAAc,2CAAd,EAA2DX,IAA3D,CAAgEkB,KAAK,IAAIA,EAAEE,OAAN,CAAc,IAAd,EAAoBH,EAApB,CAArE,CAAP;AACD;;AAED,YAAIM,WAAJ,GAAkB;AAChB,iBAAOb,OAAOC,MAAP,CAAc,wCAAd,EAAwDX,IAAxD,CAA6DkB,KAAK;AACvE,iBAAKM,UAAL,GAAkB,IAAlB;AACA,mBAAON,EAAEO,qBAAT;AACD,WAHM,CAAP;AAID;;AAEDC,qBAAa;AACX,eAAKC,aAAL,GAAqB,IAAIC,gBAAJ,CAAqBC,aAAa;AACrDA,sBAAUC,OAAV,CAAkBC,YAAY;AAC5B,kBAAIA,SAASC,IAAT,IAAiB,YAArB,EAAmC;AACjC;AACA,qBAAKC,wBAAL,CAA8BF,SAASG,aAAvC,EAAsDH,SAASI,QAA/D,EAAyEJ,SAASK,MAAT,CAAgBhD,YAAhB,CAA6B2C,SAASG,aAAtC,CAAzE;AACD;AACF,aALD;AAMD,WAPoB,CAArB;AAQA,eAAKP,aAAL,CAAmBU,OAAnB,CAA2B,IAA3B,EAAiC,EAAEC,YAAY,IAAd,EAAjC;AACD;;AAEDC,uBAAeC,IAAf,EAAqB;AACnB,cAAIC,QAAQ,KAAKrD,YAAL,CAAkBoD,IAAlB,CAAZ;AACA,cAAIC,UAAUlE,SAAd,EAAyB;AACvB,iBAAKe,YAAL,CAAkBkD,IAAlB,EAAwBC,KAAxB;AACD;AACF;;AAED,cAAMC,gBAAN,GAAyB;AACvB,cAAI,KAAKC,SAAL,IAAkB,KAAKzD,MAA3B,EAAmC;AACnC,eAAKyD,SAAL,GAAiB,IAAjB;AACA,eAAKC,IAAL,GAAY,KAAKC,UAAjB,CAHuB,CAGM;AAC7B,gBAAM9D,iBAAiB0B,WAAjB,EAAN,CAJuB,CAIe;;AAEtC,cAAI,KAAKqC,WAAT,EAAsB;AACpB,gBAAIL,QAAQ,KAAKM,UAAL,CAAgB,KAAKD,WAArB,CAAZ;AACD,WAFD,MAEO;AACLL,oBAAQ,KAAKA,KAAL,IAAc,EAAtB;AACD;AACD,eAAKO,QAAL,CAAcP,KAAd;AACA,eAAKE,SAAL,GAAiB,KAAjB;AACA;AACA,cAAIM,QAAQ,IAAIC,WAAJ,CAAgB,eAAhB,CAAZ;AACA;AACA,eAAKC,aAAL,CAAmBF,KAAnB;AACA,eAAK,eAAL,IAAwB,IAAxB,CAjBuB,CAiBO;;AAE9B,gBAAM1C,OAAO6C,KAAP,CAAa,CAAb,CAAN;AACA,eAAKlE,MAAL,CAAYmE,OAAZ;AACA,eAAKC,uBAAL;AACD;;AAED,cAAMC,YAAN,GAAqB;AACnB,cAAI,CAAC,KAAK,eAAL,CAAL,EAA4B;AAC1B,mBAAOhH,cAAc,IAAd,EAAoB,eAApB,CAAP;AACD;AACF;;AAEDyG,iBAASP,KAAT,EAAgB;AACd,cAAI,CAACA,KAAL,EAAYA,QAAQ,KAAKA,KAAL,IAAc,EAAtB;AACZ,cAAIe,YAAY,KAAKX,UAAL,CAAgBY,aAAhB,CAA8B,wBAA9B,CAAhB;AACAD,oBAAUE,SAAV,GAAsB,EAAtB;AACA,eAAKC,SAAL,CAAe/F,WAAW4F,SAAX,EAAsB;AACnCf,mBAAOA,KAD4B;AAEnCmB,yBAAa,IAFsB;AAGnCC,qBAAS,CAAC,YAAD,EAAe,wBAAf,EAAyC,aAAzC,EAAwD,yBAAxD,CAH0B;AAInCC,kBAAM;AAJ6B,WAAtB,CAAf;;AAOA;AACA,eAAK9C,eAAL,CAAqB,KAAK9B,MAA1B;AACD;;AAEDyE,kBAAUzE,MAAV,EAAkB;AAChB,eAAKA,MAAL,GAAcA,MAAd;AACA,eAAK6E,WAAL;AACD;;AAEDA,sBAAc;AACZ,cAAI7E,SAAS,KAAKA,MAAlB;AACA,cAAI,KAAKC,IAAT,EAAe;AACbD,mBAAO8E,SAAP,CAAiB,MAAjB,EAAyB,KAAK7E,IAA9B;AACD;AACD,eAAK8E,kBAAL,CAAwB/E;AACxB;AACA;AACA;;AAHA,YAKEA,OAAOgF,EAAP,CAAU,QAAV,EAAoBC,OAAO,KAAKhB,aAAL,CAAmB,IAAID,WAAJ,CAAgB,QAAhB,EAA0B,EAAEkB,QAAQD,GAAV,EAA1B,CAAnB,CAA3B;AACFjF,iBAAOgF,EAAP,CAAU,QAAV,EAAoB,CAAC,MAAM,KAAKG,WAAL,EAAP,EAA2B1H,QAA3B,CAAoC,GAApC,CAApB;AACAuC,iBAAOgF,EAAP,CAAU,QAAV,EAAoB,CAAC,MAAM,KAAKlD,eAAL,CAAqB9B,MAArB,EAA6Bc,IAA7B,CAAkCsE,MAAMA,GAAGC,WAAH,EAAxC,CAAP,EAAkE5H,QAAlE,CAA2E,GAA3E,CAApB;;AAEAuC,iBAAOgF,EAAP,CAAU,gBAAV,EAA4B,CAAC,MAAM,KAAKM,gBAAL,EAAP,EAAgC7H,QAAhC,CAAyC,GAAzC,CAA5B;;AAEA;AACAuB,YAAEuG,GAAF,CAAM,KAAKnC,UAAX,EAAuBoC,MAAMA,GAAGC,IAAhC,EAAsC7C,OAAtC,CAA8C4C,MAAM,KAAKnC,cAAL,CAAoBmC,EAApB,CAApD;;AAEA;AACA;AACA;AACAxF,iBAAOgF,EAAP,CAAU,SAAV,EAAqB,CAAC,GAAGjF,IAAJ,KAAa,KAAK2F,QAAL,CAAc,GAAG3F,IAAjB,CAAlC;AACD;;AAED2F,iBAAS3D,EAAT,EAAakD,GAAb,EAAkB;;AAEhB,cAAI,KAAKU,SAAL,CAAeC,QAAf,CAAwB,UAAxB,KAAuC,CAACX,IAAIY,MAAhD,EAAwD;AACtD,qBAASC,qBAAT,CAA+B5E,CAA/B,EAAkC;AAChC,oBAAM6E,MAAM7E,EAAE8E,MAAF,GAAW,MAAX,GAAoB,EAAhC;AACA,oBAAMC,OAAO/E,EAAEgF,OAAF,GAAY,OAAZ,GAAsB,EAAnC;AACA,oBAAMC,QAAQjF,EAAEkF,QAAF,GAAa,QAAb,GAAwB,EAAtC;AACA,qBAAOH,OAAOE,KAAP,GAAeJ,GAAf,GAAqB7E,EAAEmF,GAA9B;AACD;AACD,kBAAMC,aAAa;AACjBC,sBAAQ,MAAM;AACZ,qBAAKZ,SAAL,CAAea,MAAf,CAAsB,UAAtB;AACD,eAHgB;AAIjBC,iBAAG,MAAM;AACP,qBAAK3E,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGsB,mBAAH,EAApC;AACD;AANgB,aAAnB;;AASA,kBAAMC,YAAYL,WAAWR,sBAAsBb,GAAtB,CAAX,CAAlB;AACA,gBAAI0B,SAAJ,EAAe;AACb1B,kBAAI2B,cAAJ;AACA3B,kBAAI4B,gBAAJ,GAAuB,IAAvB;;AAEAF;AACD,aALD,MAKO;AACLtF,qBAAOyF,MAAP,CAAchB,sBAAsBb,GAAtB,CAAd,EAA0C,CAAC,IAAD,EAAOlD,EAAP,EAAWkD,GAAX,CAA1C;AACD;AACF;AACF;;AAED8B,uBAAe;AACb,cAAIhF,KAAK,KAAK/B,MAAd;AACA+B,aAAGiF,MAAH,GAAYD,YAAZ;AACD;;AAEDE,gBAAQC,MAAR,EAAgB;AACd,cAAIC,OAAO,KAAKC,eAAL,EAAX;AACA,eAAKC,SAAL,GAAiBC,OAAOC,MAAP,CAAcJ,IAAd,EAAoBD,MAApB,CAAjB;AACD;;AAEDE,0BAAkB;AAChB,cAAI,CAAC,KAAKC,SAAV,EAAqB;AACnB,kBAAMF,OAAO,uCAAuC3H,OAAvC,CAA+C,IAA/C,EAAqD,EAArD,EAAyDgI,KAAzD,CAA+D,EAA/D,EAAmEjC,GAAnE,CAAuEkC,KAAKA,EAAEC,SAAF,EAA5E,CAAb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAMC,qBAAqB,EAA3B;;AAEA,iBAAKN,SAAL,GAAiBC,OAAOC,MAAP,CAAcI,kBAAd,EAAkC;;AAEjD;AACA,uBAAS5F,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGwC,KAAH,CAAS,KAAT,CAApC,CAHkC;AAIjD;AACA,uBAAS7F,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGwC,KAAH,CAAS,IAAT,CAApC,CALkC;AAMjD;AACA,uBAAS7F,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGyC,IAAH,CAAQ,KAAR,CAApC,CAPkC;AAQjD;AACA,uBAAS9F,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGyC,IAAH,CAAQ,IAAR,CAApC,CATkC;;AAWjD;AACA,uBAAS9F,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG0C,aAAH,EAApC,CAZkC;AAajD;AACA,6BAAe/F,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG2C,YAAH,EAApC,CAd4B;AAejD;AACA,6BAAehG,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG9E,UAAH,EAApC,CAhB4B;AAiBjD;AACA,uBAASyB,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG4C,gBAAH,EAApC,CAlBkC;AAmBjD;AACA,uBAASjG,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG6C,0BAAH,EAApC,CApBkC;AAqBjD;AACA,uBAASlG,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG8C,gBAAH,CAAoB,IAApB,CAApC,CAtBkC;AAuBjD;AACA,6BAAenG,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG8C,gBAAH,CAAoB,KAApB,CAApC,CAxB4B;;AA0BjD;AACA,uBAASnG,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG+C,eAAH,EAApC,CA3BkC;AA4BjD;AACA,6BAAepG,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGgD,UAAH,CAAc,WAAd,CAApC,CA7B4B;AA8BjD,uCAAyBrG,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGgD,UAAH,CAAc,MAAd,CAApC,CA9BkB;AA+BjD,mCAAqBrG,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGgD,UAAH,CAAc,MAAd,CAApC,CA/BsB;;AAiCjD;AACA,uBAASrG,MAAM,KAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGiD,qBAAH,CAAyB,WAAzB,CAApC,CAlCkC;;AAoCjD;AACA,uBAAStG,MAAM;AACb,oBAAI,KAAKuG,YAAT,EAAuB;AACrB,uBAAKC,eAAL,CAAqBxG,EAArB;AACD,iBAFD,MAEO;AACLV,yBAAOV,IAAP,CAAY,wDAAZ;AACD;AACF,eA3CgD;;AA6CjD,wBAAUoB,MAAM;AACd;AACD,eA/CgD;AAgDjD,6BAAeA,MAAM;AACnB;AACAA,mBAAGyG,eAAH;AACD,eAnDgD;AAoDjD;AACA,wBAAUzG,MAAM;AACd0G,2BAAW,MAAM;AACf,uBAAKzI,MAAL,CAAY0I,WAAZ,CAAwB,SAAxB;AACA,uBAAK/E,UAAL,CAAgBY,aAAhB,CAA8B,0BAA9B,EAA0DoE,KAA1D;AACD,iBAHD,EAGG,EAHH;AAID,eA1DgD;AA2DjD;AACA,4BAAc5G,MAAM;AAClB,qBAAK6G,gBAAL;AACA7G,mBAAG2G,WAAH,CAAe,cAAf;AACD,eA/DgD;AAgEjD;AACA,gCAAkB3G,MAAM;AACtB,qBAAK6G,gBAAL;AACA7G,mBAAG2G,WAAH,CAAe,cAAf;AACD,eApEgD;AAqEjD;AACA,wBAAU3G,MAAM;AACd,oBAAIf,OAAO,KAAK6H,kBAAL,EAAX;AACA,qBAAKC,YAAL,CAAkB9H,IAAlB,EAAwB,IAAxB;AACD,eAzEgD;AA0EjD;AACA,wBAAUe,MAAM;AACd,oBAAIf,OAAO,KAAK6H,kBAAL,EAAX;AACA,qBAAKE,SAAL,CAAe/H,IAAf;AACD,eA9EgD;AA+EjD;AACA,wBAAU,CAACe,EAAD,EAAKrC,CAAL,EAAQ+H,CAAR,KAAc;AACtB,oBAAIzG,OAAO,KAAK6H,kBAAL,EAAX;AACA,qBAAKC,YAAL,CAAkB9H,IAAlB,EAAwB,KAAxB;AACA,uBAAO,IAAP;AACD,eApFgD;AAqFjD;AACA,wBAAUe,MAAM;AACd;AACA;AACA0G,2BAAW,MAAM;AACf,uBAAKzI,MAAL,CAAY0I,WAAZ,CAAwB,gBAAxB;AACA,sBAAIM,cAAc,KAAKrF,UAAL,CAAgBY,aAAhB,CAA8B,0BAA9B,CAAlB;AACA,sBAAIyE,WAAJ,EAAiB;AACf;AACA,wBAAI,CAACA,YAAYzF,KAAb,IAAsB,KAAK0F,UAA/B,EAA2C;AACzC,0BAAIC,YAAYF,YAAYzF,KAA5B;AACAyF,kCAAYzF,KAAZ,GAAqB,KAAK0F,UAA1B;AACD,qBAHD,MAGO;AACL,2BAAKA,UAAL,GAAkBD,YAAYzF,KAA9B,CADK,CAC+B;AACrC;AACDlC,2BAAO8H,gBAAP,CAAwB,SAAxB,EAAmCH,WAAnC,EAAgD,OAAhD,EAAyD,MAAM;AAC7D,2BAAKC,UAAL,GAAmBD,YAAYzF,KAA/B;AACD,qBAFD;AAGAyF,gCAAYL,KAAZ;AACAK,gCAAYI,MAAZ;AACD;AACF,iBAjBD,EAiBG;AACH;AAlBA;AAoBD,eA7GgD;;AA+GjD;AACA,gCAAkB,sBAhH+B;AAiHjD;AACA,+BAAiB,eAlHgC;;AAoHjD;AACA,wBAAU,uBArHuC;AAsHjD;AACA,wBAAU,uBAvHuC;AAwHjD;AACA,qBAAOrH,MAAM;AACX,oBAAIA,GAAGsH,iBAAH,EAAJ,EAA4B;AAC1BtH,qBAAGuH,eAAH,CAAmB,KAAnB;AACD,iBAFD,MAEO;AACLvH,qBAAG2G,WAAH,CAAe,eAAf;AACD;AACF,eA/HgD;AAgIjD;AACA,wBAAU3G,MAAM;AACd,qBAAKwH,MAAL,CAAYxH,GAAGyH,QAAH,EAAZ;AACD,eAnIgD;AAoIjD;AACA,4BAAc,MAAMzH,EAAN,IAAY;AACxB,oBAAIf,OAAO,KAAK6H,kBAAL,EAAX;AACA,oBAAIY,SAAS,MAAM,KAAKX,YAAL,CAAkB9H,IAAlB,EAAwB,KAAxB,CAAnB;AACA5C,2BAAWqL,MAAX;AACD,eAzIgD;AA0IjD;AACA,4BAAc1H,MAAM;AAClB,qBAAKM,WAAL,CAAiBvB,IAAjB,CAAsB4I,MAAMA,GAAGC,QAAH,CAAY5H,EAAZ,EAAgB,IAAhB,CAA5B;AACD,eA7IgD;AA8IjD;AACA,uBAASA,MAAM;AACbV,uBAAOyF,MAAP,CAAc,2BAAd;AACA,qBAAKzE,WAAL,CAAiBvB,IAAjB,CAAsB4I,MAAMA,GAAGE,gBAAH,CAAoB7H,EAApB,EAAwB,IAAxB,CAA5B;AACD,eAlJgD;AAmJjD;AACA,uBAASA,MAAM;AACb,qBAAKM,WAAL,CAAiBvB,IAAjB,CAAsB4I,MAAMA,GAAGG,QAAH,CAAY9H,EAAZ,EAAgB,IAAhB,CAA5B;AACD,eAtJgD;AAuJjD;AACA,6BAAeA,MAAM;AACnB,qBAAKM,WAAL,CAAiBvB,IAAjB,CAAsB4I,MAAMA,GAAGI,cAAH,CAAkB/H,EAAlB,EAAsB,IAAtB,CAA5B;AACD,eA1JgD;;AA4JjD;;AAEA;AACA,wBAAUA,MAAM;AACd,qBAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG2E,eAAH,CAAmBhI,EAAnB,CAApC;AACD,eAjKgD;AAkKjD;AACA,0BAAYA,MAAM;AAChB,qBAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG4E,eAAH,CAAmBjI,EAAnB,CAApC;AACD,eArKgD;AAsKjD;AACA,8BAAgBA,MAAM;AACpB,qBAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG6E,yBAAH,CAA6B,IAA7B,CAApC;AACD,eAzKgD;AA0KjD;AACA,gCAAkBlI,MAAM;AACtB,qBAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG6E,yBAAH,CAA6B,KAA7B,CAApC;AACD,eA7KgD;;AA+KjD;AACA,0BAAYlI,MAAM;AAChB,qBAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG8E,kBAAH,CAAsB,IAAtB,CAApC;AACD,eAlLgD;AAmLjD;AACA,2BAAanI,MAAM;AACjB,qBAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG8E,kBAAH,CAAsB,KAAtB,CAApC;AACD,eAtLgD;AAuLjD;AACA,gCAAkBnI,MAAM;AACtB,qBAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG+E,mBAAH,CAAuB,IAAvB,CAApC;AACD,eA1LgD;AA2LjD;AACA,iCAAmBpI,MAAM;AACvB,qBAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAG+E,mBAAH,CAAuB,KAAvB,CAApC;AACD,eA9LgD;;AAgMjD;AACA,uBAASpI,MAAM;AACb,qBAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGgF,iBAAH,EAApC;AACD,eAnMgD;AAoMjD;AACA,uBAASrI,MAAM;AACb,qBAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGiF,MAAH,EAApC;AACD,eAvMgD;AAwMjD;AACA,2BAAatI,MAAM;AACjB,qBAAK4D,SAAL,CAAe2E,MAAf,CAAsB,UAAtB;AACD,eA3MgD;AA4MjD;AACA,uBAASvI,MAAM;AACb,qBAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGsB,mBAAH,EAApC;AACD,eA/MgD;AAgNjD;AACA,uBAAS3E,MAAM;AACb,qBAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAMA,GAAGmF,kCAAH,EAApC;AACD,eAnNgD;;AAqNjD;AACA,+BAAiB,MAAMxI,EAAN,IAAY;AAC3B,qBAAKyI,0BAAL;AACD,eAxNgD;AAyNjD;AACA,qCAAuB,MAAMzI,EAAN,IAAY;AACjC,qBAAKyI,0BAAL,CAAgC,IAAhC;AACD,eA5NgD;AA6NjD;AACA,6BAAe,MAAMzI,EAAN,IAAY;AACzB,qBAAK0I,8BAAL;AACD,eAhOgD;AAiOjD;AACA,4BAAc1I,MAAM;AAClB,oBAAI2I,YAAY,KAAK1K,MAAL,CAAY2K;AAC5B;AADgB,kBAAhB,CAEG,KAAK3K,MAAL,CAAY4K,gBAAZ,CAA8B;;YAE/BF,SAAU;KAFT;AAIH,qBAAK1K,MAAL,CAAY0I,WAAZ,CAAyB,YAAzB;AACA,qBAAK1I,MAAL,CAAY0I,WAAZ,CAAyB,YAAzB;AACD,eA3OgD;AA4OjD;AACA,8BAAgB3G,MAAM;AACpB,qBAAKqC,uBAAL;AACD,eA/OgD;;AAiPjD;AACA,uBAASrC,MAAM;AACb,qBAAKK,cAAL,CAAoBL,EAApB,EAAwBjB,IAAxB,CAA6BsE,MAAMA,GAAGyF,QAAH,CAAY,IAAZ,EAAkB9I,EAAlB,CAAnC;AACD;;AApPgD,aAAlC,CAAjB;AAuPD;;AAED,iBAAO,KAAKsF,SAAZ;AACD;;AAEDkB,wBAAgBxG,EAAhB,EAAoB;AAClB,eAAKD,eAAL,CAAqBC,EAArB,EAAyBjB,IAAzB,CAA8BsE,MAAM;AAClC7G,qBAAS6G,EAAT,EAAarD,EAAb,EAAiB,IAAjB;AACD,WAFD;AAGD;;AAED,cAAMyI,0BAAN,CAAiCM,WAAjC,EAA8C;AAC5C,cAAIxG,YAAYjD,OAAO0J,KAAP,CAAa,IAAb,EAAmB,kBAAnB,CAAhB;AACA,cAAIzG,SAAJ,EAAe;AACb,gBAAIwG,WAAJ,EAAiB,MAAMxG,UAAU0G,QAAV,EAAN;AACjB,kBAAM3J,OAAO6C,KAAP,CAAa;AACnB;AACA;AAFM,aAAN,CAGEI,UAAUL,aAAV,CAAwB,IAAID,WAAJ,CAAgB,sBAAhB,EAAwC;AAChEiH,uBAAS,IADuD;AAEhEC,0BAAY;AAFoD,aAAxC,CAAxB;AAIH;AACF;;AAEDC,0BAAkBC,OAAlB,EAA2B;AACzB,cAAIA,OAAJ,EAAa,KAAKnE,OAAL,CAAamE,OAAb;AACb,cAAIjE,OAAO,EAAX;AACAA,iBAAOG,OAAOC,MAAP,CAAcJ,IAAd,EAAoBzI,WAAW2M,MAAX,CAAkBC,OAAtC,CAAP;AACAnE,iBAAOG,OAAOC,MAAP,CAAcJ,IAAd,EAAoB,KAAKC,eAAL,EAApB,CAAP;AACA,eAAKpH,MAAL,CAAY8E,SAAZ,CAAsB,WAAtB,EAAmCpG,WAAW6M,eAAX,CAA2BpE,IAA3B,CAAnC;AACD;;AAEDpC,2BAAmB/E,MAAnB,EAA2B;AACzBA,iBAAO8E,SAAP,CAAiB,eAAjB,EAAkC,IAAlC;AACA9E,iBAAO8E,SAAP,CAAiB,mBAAjB,EAAsC,IAAtC;AACA9E,iBAAO8E,SAAP,CAAiB,mBAAjB,EAAsC,IAAtC;AACA9E,iBAAO8E,SAAP,CAAiB,eAAjB,EAAkC,IAAlC;AACA9E,iBAAO8E,SAAP,CAAiB,gBAAjB,EAAmC,QAAnC;AACA9E,iBAAO8E,SAAP,CAAiB,gBAAjB,EAAmC,QAAnC;;AAEA9E,iBAAO8E,SAAP,CAAiB,SAAjB,EAA4BnG,kBAA5B;AACAqB,iBAAO8E,SAAP,CAAiB,gBAAjB,EAAmC,KAAnC;AACA9E,iBAAO8E,SAAP,CAAiB,YAAjB,EAA+BnG,kBAA/B;;AAEAqB,iBAAO8E,SAAP,CAAiB,2BAAjB,EAA8C,EAAE0G,WAAW,IAAb,EAAmBC,mBAAmB;;AAElF;;AAF4C,WAA9C,EAIGzL,OAAOgF,EAAP,CAAU,gBAAV,EAA4BjD,MAAM;AACnC,gBAAI,KAAKO,UAAT,EAAqB;AACnB,mBAAKD,WAAL,CAAiBvB,IAAjB,CAAsB4I,MAAMA,GAAGgC,cAAH,CAAkB3J,EAAlB,EAAsB,IAAtB,CAA5B;AACD;AACF,WAJE;;AAMH;AACA/B,iBAAOgF,EAAP,CAAU,gBAAV,EAA4BjD,MAAM;AAChC;AACA,kBAAM4J,cAAc5J,GAAG4J,WAAvB;AACA5J,eAAG4J,WAAH,GAAiBtM,SAAjB;AACA,gBAAIsM,WAAJ,EAAiB;AACf;AACA;AACA,kBAAIC,aAAa7J,GAAG8J,SAAH,CAAa,MAAb,CAAjB;AACA,kBAAIC,eAAe/J,GAAG8J,SAAH,CAAa,QAAb,CAAnB;AACA,kBAAI5M,MAAM2M,UAAN,EAAkBE,YAAlB,CAAJ,EAAqC;AACnCH;AACD;AACF;AACF,WAbD;AAcA3L,iBAAO8E,SAAP,CAAiB,aAAjB,EAAgC;AAC9BR,uBAAW,KAAKX,UAAL,CAAgBY,aAAhB,CAA8B,oBAA9B,CADmB;AAE9BwH,wBAAY,IAFkB;AAG9BC,6BAAiB,IAHa,CAGR;AAHQ,WAAhC;;AAMA,eAAKb,iBAAL;AACD;;AAED;AACApI,iCAAyBO,IAAzB,EAA+B2I,MAA/B,EAAuCC,MAAvC,EAA+C;AAC7C,cAAI,CAAC,KAAKlM,MAAV,EAAkB;AAChB,mBAAO,KAAP;AACD;AACD,kBAAQsD,IAAR;AACE;AACA;AACA;AACA,iBAAK,MAAL;AACE,mBAAKtD,MAAL,CAAY8E,SAAZ,CAAsB,MAAtB,EAA8BoH,MAA9B;AACA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAK,SAAL;AACE,mBAAKpH,SAAL,CAAe,SAAf,EAA0BoH,MAA1B;AACA;AACF;AACA;AACA;AACA,iBAAK,UAAL;AACE,mBAAKpH,SAAL,CAAe,cAAf,EAA+BoH,MAA/B;AACA;AA1BJ;AA4BD;;AAEDpH,kBAAUW,IAAV,EAAgBlC,KAAhB,EAAuB;AACrB,cAAI,CAAC,KAAKvD,MAAV,EAAkB,OADG,CACK;AAC1B,eAAKA,MAAL,CAAY8E,SAAZ,CAAsBW,IAAtB,EAA4BlC,KAA5B;AACD;;AAEDgG,eAAOvI,IAAP,EAAa;AACX,eAAK8H,YAAL,CAAkB9H,IAAlB,CAAuB;AAAvB;AAED;;AAED6H,6BAAqB;AACnB,cAAI7H,OAAO,KAAKhB,MAAL,CAAY2K,YAAZ,EAAX;AACA,cAAI3J,KAAKmL,MAAL,GAAc,CAAlB,EAAqB,OAAOnL,IAAP,CAArB,KAAsC,OAAO,KAAKhB,MAAL,CAAYoM,OAAZ,CAAoB,KAAKpM,MAAL,CAAY6L,SAAZ,CAAsB,KAAtB,EAA6BlM,IAAjD,CAAP;AACvC;;AAED0M,yBAAiB;AACf,iBAAO,KAAKC,WAAZ;AACD;;AAEDC,uBAAeC,OAAf,EAAwB;AACtB,iBAAO,KAAKF,WAAL,GAAmBE,OAA1B;AACD;;AAEDC,0BAAkB;AAChB;AACA,iBAAO,KAAKC,YAAL,KAAsB,KAAKA,YAAL,GAAoBpM,aAAa,kBAAb,GAAkC/C,eAAeiC,OAAf,CAAuB,IAAvB,EAA6B,GAA7B,CAA5E,CAAP,CAFgB,CAEuG;AACxH;;AAEDmN,wBAAgBC,MAAhB,EAAwB;AACtB,iBAAO,KAAKF,YAAL,GAAoBE,MAA3B;AACD;;AAED,cAAM/O,SAAN,CAAgBgP,GAAhB,EAAqB;AACnB;AACA,cAAIH,eAAe,KAAKD,eAAL,EAAnB;;AAEA,cAAIC,aAAaI,KAAb,CAAmB,MAAnB,CAAJ,EAAgC;AAC9B,mBAAO,KAAKC,eAAL,CAAqBF,GAArB,CAAP;AACD;AACD;AACA,cAAIH,aAAaI,KAAb,CAAmB,MAAnB,CAAJ,EAAgC;AAC9B,kBAAMtL,OAAOC,MAAP,CAAciL,YAAd,CAAN;AACD;AACDhM,kBAAQsM,GAAR,CAAY,WAAZ,EAAyBN,YAAzB;AACA;AACA,iBAAO7O,UAAUgP,GAAV,EAAe,KAAKR,cAAL,EAAf,EAAsCK,YAAtC,CAAP;AACD;;AAED,cAAMK,eAAN,CAAsBF,GAAtB,EAA2B;AACzB,cAAIpD,SAAS,EAAb;AACA,cAAIwD,QAAQC,SAAS3I,aAAT,CAAuB,qBAAvB,CAAZ;AACA,cAAI0I,KAAJ,EAAW;AACT,gBAAIE,OAAOF,MAAME,IAAjB;AACAA,iBAAKC,QAAL,CAAcjE,gBAAd,CAA+B,SAA/B,EAA0C,UAAUpF,KAAV,EAAiB;AACzD0F,wBAAU1F,MAAMsJ,IAAhB;AACD,aAFD;AAGA;;AAEAF,iBAAKG,UAAL,CAAgBT,MAAM,IAAtB;;AAEA,mBAAO,CAACpD,OAAOqD,KAAP,CAAa,KAAb,CAAR,EAA6B;AAC3B;AACA,oBAAMzL,OAAO6C,KAAP,CAAa,EAAb,CAAN;AACD;AACD;AACA,mBAAO,EAAEX,OAAOkG,OAAOjK,OAAP,CAAeqN,GAAf,EAAoB,EAApB,EAAwBrN,OAAxB,CAAgC,UAAhC,EAA4C,EAA5C,EAAgDA,OAAhD,CAAwD,OAAxD,EAAiE,EAAjE,CAAT,EAAP;AACD,WAfD,MAeO;AACL6B,mBAAOyF,MAAP,CAAc,uCAAd;AACD;AACD,iBAAO,EAAEvD,OAAO,EAAT,EAAP;AACD;;AAEDgK,oBAAY9H,IAAZ,EAAkB;AAChB,iBAAO,KAAK+H,UAAL,CAAgB/H,IAAhB,EAAsB,KAAKzF,MAAL,CAAY6L,SAAZ,CAAsB,IAAtB,CAAtB,EAAmD,KAAK7L,MAAL,CAAY6L,SAAZ,CAAsB,KAAtB,CAAnD,CAAP;AACD;;AAED2B,mBAAW/H,IAAX,EAAiBgI,IAAjB,EAAuBC,EAAvB,EAA2BtC,OAA3B,EAAoC;AAClC,cAAIuC,4BAAST,SAASU,aAAT,CAAuB,MAAvB,CAAT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAJ;AACAD,iBAAOhI,SAAP,CAAiBkI,GAAjB,CAAqB,eAArB;AACAF,iBAAOG,KAAP,CAAaC,UAAb,GAA0B,QAA1B;AACA,cAAIC,6BAAU3M,OAAO4M,MAAP,CAAcxI,IAAd,EAAoBkI,MAApB,CAAV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAJ;AACAK,kBAAQlN,IAAR,CAAaoN,QAAQ;AACnB5G,mBAAOC,MAAP,CAAc2G,KAAKJ,KAAnB,EAA0B;AACxBK,uBAAS,QADe;AAExB;AACAA,uBAAS,cAHe;AAIxBC,wBAAU,MAJc;AAKxBC,yBAAW;AALa,aAA1B;AAOD,WARD;AASA;AACA,cAAIC,SAAS,KAAKtO,MAAL,CAAYuO,GAAZ,CAAgBC,QAAhB,CAAyBf,IAAzB,EAA+BC,EAA/B,EAAmCpG,OAAOC,MAAP,CAAc;AAC5DkH,0BAAcd;AAD8C,WAAd,EAE7CvC,OAF6C,CAAnC,CAAb;AAGA4C,kBAAQlN,IAAR,CAAaoN,QAAQA,KAAKI,MAAL,GAAcA,MAAnC;;AAEA,iBAAON,OAAP;AACD;;AAED,cAAMU,WAAN,CAAkBjF,MAAlB,EAA0BkF,GAA1B,EAA+BC,SAA/B,EAA0C;AACxC,cAAI5O,SAAS,KAAKA,MAAlB;AACA,cAAIgB,OAAOyI,MAAX;AACA,cAAIoF,UAAU,KAAd;AACA,eAAK7O,MAAL,CAAY8O,SAAZ,CAAsB,KAAK9O,MAAL,CAAY6L,SAAZ,CAAsB;AAC5C;AADsB,WAAtB,EAEG,KAAK7L,MAAL,CAAY4K,gBAAZ,CAA6BnB,MAA7B,EAAqC,QAArC;AACH,cAAIkF,OAAOA,IAAII,eAAf,EAAgC;AAC9BJ,kBAAMA,IAAII,eAAV,CAD8B,CACH;AAC3BF,sBAAU,IAAV;AACD;AACD,cAAIG,cAAJ;AACA,cAAIC,WAAWN,OAAOA,IAAIO,WAAX,IAA0BP,IAAIO,WAAJ,CAAgBzJ,IAA1C,IAAkD,OAAOkJ,GAAxE;AACA,cAAIjR,MAAMyR,IAAN,CAAWR,GAAX,CAAJ,EAAqB;AACnBA,kBAAMS,MAAM3B,IAAN,CAAWkB,GAAX,CAAN;AACD;;AAED,cAAI3P,EAAEqQ,KAAF,CAAQV,GAAR,CAAJ,EAAkB;AAChB,gBAAIW,SAAS,EAAb;AACAF,kBAAM3B,IAAN,CAAWkB,IAAIxH,IAAJ,EAAX,EAAuBoI,IAAvB,GAA8B3M,OAA9B,CAAsCyD,OAAOiJ,OAAOjJ,GAAP,IAAcsI,IAAIa,GAAJ,CAAQnJ,GAAR,CAA3D;AACAsI,kBAAMW,MAAN;AACD;AACD,cAAIF,MAAMK,OAAN,CAAcd,GAAd,KAAsB,CAACA,IAAIe,KAAJ,CAAUlK,MAAMA,cAAcmK,IAA9B,CAA3B,EAAgE;AAC9D,gBAAIhB,IAAIe,KAAJ,CAAUlK,MAAM,OAAOA,EAAP,IAAa,QAAb,IAAyB,EAAEA,cAAcoK,MAAhB,CAAzC,CAAJ,EAAuE;AACrEZ,+BAAiB,KAAKzB,WAAL,CAAiB,cAAjB,EAAiCzM,IAAjC,CAAsC+O,SAAS;AAC9DA,sBAAMC,UAAN,CAAiBnB,GAAjB;AACAkB,sBAAM/B,KAAN,CAAYiC,SAAZ,GAAwB,OAAxB;AACAF,sBAAM/B,KAAN,CAAYkC,QAAZ,GAAuB,MAAvB;AACA,uBAAOH,KAAP;AACD,eALgB,CAAjB;AAMD,aAPD,MAOO;AACLb,+BAAiB,KAAKzB,WAAL,CAAiB,cAAjB,EAAiCzM,IAAjC,CAAsC+O,SAAS;AAC9DA,sBAAMC,UAAN,CAAiBnB,IAAIpJ,GAAJ,CAAQ,CAACC,EAAD,EAAKyK,KAAL,KAAe;AACtC,yBAAO;AACLA,2BAAOA,KADF;AAEL1M,2BAAO,KAAK2M,kBAAL,CAAwB1K,EAAxB;AAFF,mBAAP;AAID,iBALgB,CAAjB;AAMAqK,sBAAM/B,KAAN,CAAYiC,SAAZ,GAAwB,OAAxB;AACAF,sBAAM/B,KAAN,CAAYkC,QAAZ,GAAuB,MAAvB;AACA,uBAAOH,KAAP;AACD,eAVgB,CAAjB;AAWD;AACF,WArBD,MAqBO,IAAIZ,YAAY,QAAhB,EAA0B;AAC/B;AACA;AACD,WAHM,MAGA,IAAI,OAAON,GAAP,IAAc,QAAd,IAA0BA,QAAQ,IAAtC,EAA4C;AACjDK,6BAAiB,KAAKzB,WAAL,CAAiB,kBAAjB,EAAqCzM,IAArC,CAA0CqP,aAAa;AACtEA,wBAAUC,OAAV,CAAkBzB,GAAlB;AACAwB,wBAAUE,aAAV;AACA,qBAAOF,SAAP;AACD,aAJgB,CAAjB;AAKD;AACD,cAAInB,cAAJ,EAAoB;AAClB,gBAAIrB,SAAS,MAAMqB,cAAnB;AACA,gBAAIsB,qEAAmB,8CAAnB,2DACC1B,YAAY,UAAZ,GAAyB,EAD1B,2GACmCK,QADnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAJ;AAEAtB,mBAAO4C,aAAP,CAAqBC,YAArB,CAAkCF,IAAlC,EAAwC3C,MAAxC;AACA2C,iBAAKG,WAAL,CAAiB9C,MAAjB;AACA,gBAAIkB,WAAWG,cAAf,EAA+B;AAC7B,kBAAIrB,MAAJ,EAAYA,OAAOG,KAAP,CAAa4C,MAAb,GAAsB,iBAAtB;AACb;AACF;AACF;;AAEDR,2BAAmBvB,GAAnB,EAAwB;AACtB,cAAIrP,IAAI,EAAR;AACA,cAAI;AACFA,iBAAKqP,GAAL,CADE,CACQ;AACX,WAFD,CAEE,OAAOzN,CAAP,EAAU;AACV5B,iBAAM,4BAA2B4B,CAAE,GAAnC,CADU,CAC6B;AACxC;AACD,iBAAO5B,CAAP;AACD;;AAED,cAAMwJ,YAAN,CAAmB+D,GAAnB,EAAwB6B,WAAxB,EAAqC;AACnC,cAAIiC,OAAO,MAAM,KAAK9S,SAAL,CAAegP,GAAf,CAAjB;AACA,cAAI8D,KAAKC,OAAT,EAAkB;AAChB,gBAAI1P,IAAIyP,KAAKpN,KAAb;AACA7C,oBAAQS,KAAR,CAAcD,CAAd;AACA,gBAAIwN,WAAJ,EAAiB;AACfmC,qBAAOC,SAAP,GAAmB5P,CAAnB;AACA,mBAAKwN,WAAL,CAAiBxP,iBAAiB,KAAKgC,CAAtB,CAAjB;AACD,aAHD,MAGO;AACLG,qBAAO0P,WAAP,CAAmB7P,CAAnB;AACD;AACD,mBAAOA,CAAP;AACD;AACD,cAAIuI,SAASkH,KAAKpN,KAAlB;;AAEA,cAAImL,WAAJ,EAAiB;AACf;AACA,gBAAIjF,UAAUA,OAAO3I,IAArB,EAA2B;AACzB;AACA;AACA2I,qBAAO3I,IAAP,CAAY2I,UAAU;AACpB,qBAAKiF,WAAL,CAAiB,eAAe,KAAKwB,kBAAL,CAAwBzG,MAAxB,CAAhC,EAAiEA,MAAjE,EAAyE,IAAzE;AACD,eAFD,EAEGuH,KAFH,CAES7P,SAAS;AAChBT,wBAAQS,KAAR,CAAcA,KAAd;AACA;AACA,qBAAKuN,WAAL,CAAiBxP,iBAAiB,yBAAyBiC,KAA1C,CAAjB;AACD,eAND;AAOD,aAVD,MAUO;AACL,mBAAKuN,WAAL,CAAiB,MAAM,KAAKwB,kBAAL,CAAwBzG,MAAxB,CAAvB,EAAwDA,MAAxD;AACA,kBAAIA,kBAAkB3J,WAAtB,EAAmC;AACjC,oBAAI;AACFuB,yBAAO4P,WAAP,CAAmBxH,MAAnB;AACD,iBAFD,CAEE,OAAOvI,CAAP,EAAU;AACV;AACD;AACF;AACF;AACF;AACD,iBAAOuI,MAAP;AACD;;AAED,cAAMV,SAAN,CAAgB8D,GAAhB,EAAqB;AACnB,cAAIpD,SAAS,MAAM,KAAK5L,SAAL,CAAegP,GAAf,CAAnB;AACA,cAAI,CAACpD,OAAOmH,OAAZ,EAAqB;AACnBnH,qBAASA,OAAOlG,KAAhB;AACD;AACD,cAAIkG,OAAO3I,IAAX,EAAiB;AACf2I,qBAAS,MAAMA,MAAf,CADe,CACQ;AACxB;AACDpI,iBAAO6P,aAAP,CAAqBzH,MAArB,EAA6BpK,SAA7B,EAAwCwN,GAAxC;AACD;;AAEDtD,eAAOvI,IAAP,EAAa;AACX,eAAK8H,YAAL,CAAkB9H,IAAlB,CAAuB;AAAvB;AAED;;AAEDmQ,2BAAmB;AACjB,eAAKC,SAAL,GAAiB,KAAjB;AACD;;AAED,YAAI7N,KAAJ,GAAY;AACV,cAAI,KAAKvD,MAAT,EAAiB;AACf,mBAAO,KAAKA,MAAL,CAAYwJ,QAAZ,EAAP;AACD,WAFD,MAEO;AACL,mBAAO,KAAK6H,MAAZ;AACD;AACF;;AAED,YAAI9N,KAAJ,CAAUvC,IAAV,EAAgB;AACd,cAAIA,SAAS3B,SAAb,EAAwB2B,OAAO,EAAP;AACxB,cAAI,KAAKhB,MAAT,EAAiB;AACf,iBAAKA,MAAL,CAAYsR,QAAZ,CAAqBtQ,IAArB;AACD,WAFD,MAEO;AACL,iBAAKqQ,MAAL,GAAcrQ,IAAd;AACD;AACDK,iBAAO6C,KAAP,CAAa,CAAb,EAAgBpD,IAAhB,CAAqB,MAAM;AACzB,gBAAI,KAAKd,MAAT,EAAiB,KAAKA,MAAL,CAAYmE,OAAZ;AAClB,WAFD;AAGD;;AAEDoN,uBAAeC,MAAf,EAAuB;AACrB,eAAK7N,UAAL,CAAgBY,aAAhB,CAA8B,cAA9B,EAA8CX,WAA9C,GAA4D4N,MAA5D;AACD;;AAEDC,uBAAeD,MAAf,EAAuB;AACrB,iBAAO,KAAK7N,UAAL,CAAgBY,aAAhB,CAA8B,cAA9B,EAA8CX,WAArD;AACD;;AAED8N,mBAAWpS,CAAX,EAAc;AACZ,iBAAOA,EAAEE,OAAF,CAAU,GAAV,EAAe,OAAf,EAAwBA,OAAxB,CAAgC,GAAhC,EAAqC,MAArC,CAAP;AACD;;AAEDqE,mBAAWvE,CAAX,EAAc;AACZ,iBAAOA,EAAEE,OAAF,CAAU,MAAV,EAAkB,GAAlB,EAAuBA,OAAvB,CAA+B,OAA/B,EAAwC,GAAxC,CAAP;AACD;;AAEDmS,iBAAS;AACP;AACD;;AAEDC,+BAAuB;AACrB;AACD;;AAED,YAAItJ,YAAJ,GAAmB;AACjB,cAAI,CAAC,KAAKtI,MAAV,EAAkB,OAAO,KAAP;AAClB,cAAIC,OAAO,KAAKD,MAAL,CAAY6R,SAAZ,CAAsB,MAAtB,CAAX;AACA,iBAAO5R,SAAS,YAAT,IAAyBA,SAAS,UAAzC;AACD;;AAED,YAAI6R,UAAJ,GAAiB;AACf,cAAI,CAAC,KAAK9R,MAAV,EAAkB,OAAO,KAAP;AAClB,iBAAO,KAAKA,MAAL,CAAY6R,SAAZ,CAAsB,MAAtB,KAAiC,KAAxC;AACD;;AAED,YAAIE,MAAJ,GAAa;AACX,cAAI,CAAC,KAAK/R,MAAV,EAAkB,OAAO,KAAP;AAClB,iBAAO,KAAKA,MAAL,CAAY6R,SAAZ,CAAsB,MAAtB,KAAiC,WAAxC;AACD;;AAED,cAAMG,iBAAN,CAAwBC,QAAxB,EAAkC;AAChC,cAAI,CAAC,KAAKjS,MAAV,EAAkB;;AAElB,cAAIC,OAAO,MAAX;AACA;AACA,cAAIgS,SAASnF,KAAT,CAAe,SAAf,CAAJ,EAA+B;AAC7B7M,mBAAO,WAAP;AACD,WAFD,MAEO,IAAIgS,SAASnF,KAAT,CAAe,OAAf,CAAJ,EAA6B;AAClC7M,mBAAO,KAAP;AACD,WAFM,MAEA,IAAIgS,SAASnF,KAAT,CAAe,QAAf,CAAJ,EAA8B;AACnC7M,mBAAO,aAAP;AACD,WAFM,MAEA,IAAIgS,SAASnF,KAAT,CAAe,QAAf,CAAJ,EAA8B;AACnC7M,mBAAO,KAAP;AACD,WAFM,MAEA,IAAIgS,SAASnF,KAAT,CAAe,QAAf,CAAJ,EAA8B;AACnC7M,mBAAO,KAAP;AACD,WAFM,MAEA,IAAIgS,SAASnF,KAAT,CAAe,SAAf,CAAJ,EAA+B;AACpC7M,mBAAO,YAAP;AACD,WAFM,MAEA,IAAIgS,SAASnF,KAAT,CAAe,OAAf,CAAJ,EAA6B;AAClC7M,mBAAO,UAAP;AACD,WAFM,MAEA,IAAIgS,SAASnF,KAAT,CAAe,QAAf,CAAJ,EAA8B;AACnC7M,mBAAO,UAAP;AACD,WAFM,MAEA,IAAIgS,SAASnF,KAAT,CAAe,OAAf,CAAJ,EAA6B;AAClC7M,mBAAO,eAAP;AACD,WAFM,MAEA,IAAIgS,SAASnF,KAAT,CAAe,MAAf,CAAJ,EAA4B;AACjC7M,mBAAO,aAAP;AACD,WAFM,MAEA,IAAIgS,SAASnF,KAAT,CAAe,QAAf,CAAJ,EAA8B;AACnC7M,mBAAO,eAAP;AACD,WAFM,MAEA,IAAIgS,SAASnF,KAAT,CAAe,MAAf,CAAJ,EAA4B;AACjC7M,mBAAO,eAAP;AACD,WAFM,MAEA,IAAIgS,SAASnF,KAAT,CAAe,OAAf,CAAJ,EAA6B;AAClC7M,mBAAO,WAAP;AACD;;AAED,eAAKA,IAAL,GAAYA,IAAZ;AACA,eAAKD,MAAL,CAAY8E,SAAZ,CAAsB,MAAtB,EAA8B7E,IAA9B;AACA,cAAIA,QAAQ,KAAR,IAAiBA,QAAQ,aAA7B,EAA4C;AAC1C;AACA,gBAAI+B,IAAI,KAAKuB,KAAL,CAAWuJ,KAAX,CAAiB,kBAAjB,CAAR;AACA,gBAAI9K,CAAJ,EAAO;AACL,kBAAIkQ,OAAOlQ,EAAE,CAAF,CAAX;AACA,kBAAImQ,OAAO,MAAM3T,WAAW4T,YAAX,CAAwBF,IAAxB,CAAjB;AACA,kBAAIC,IAAJ,EAAU;AACR9Q,uBAAOyF,MAAP,CAAc,gCAAgCoL,IAA9C;AACA1T,2BAAW6T,eAAX,CAA2B,KAAKrS,MAAhC,EAAwCmS,IAAxC;AACD,eAHD,MAGO;AACLzR,wBAAQsM,GAAR,CAAY,uCAAuCkF,IAAnD;AACD;AACF,aATD,MASO;AACL1T,yBAAW6T,eAAX,CAA2B,KAAKrS,MAAhC,GAAyC,MAAMxB,WAAW8T,OAAX,EAA/C;AACD;AACF;AACF;;AAEDC,4BAAoB;AAClB,cAAI,CAAC,KAAKvS,MAAV,EAAkB;AAChB;AACD;AACD,eAAK4D,WAAL,GAAmB,KAAK8N,UAAL,CAAgB,KAAK1R,MAAL,CAAYwJ,QAAZ,EAAhB,CAAnB;AACD;;AAEDgJ,2BAAmB;AACjB,cAAI,KAAKxS,MAAT,EAAiB;AACf,iBAAKyS,cAAL,GAAsB,KAAKzS,MAAL,CAAY0S,aAAZ,EAAtB,CADe,CACoC;AACpD;AACF;;AAED/J,gBAAQ;AACN,cAAI,KAAK3I,MAAT,EAAiB,KAAKA,MAAL,CAAY2I,KAAZ;AAClB;;AAEDgK,kBAAUpE,GAAV,EAAe;AACbA,gBAAMA,OAAOrB,QAAb;AACA,cAAIqB,IAAIqE,aAAJ,KAAsB,IAA1B,EAAgC,OAAO,IAAP;AAChC;AACA,cAAIrE,IAAIqE,aAAJ,IAAqBrE,IAAIqE,aAAJ,CAAkBjP,UAA3C,EAAuD;AACrD,mBAAO,KAAKgP,SAAL,CAAepE,IAAIqE,aAAJ,CAAkBjP,UAAjC,CAAP;AACD;AACD,iBAAO,KAAP;AACD;;AAED,cAAMkP,aAAN,CAAoBC,KAApB,EAA2B;AACzBzR,iBAAO8H,gBAAP,CAAwB,SAAxB,EAAmC,IAAnC,EAAyC,eAAzC,EAA0DlE,OAAO;AAC/D,gBAAIA,IAAI8N,YAAJ,GAAmB,CAAnB,MAA0B,IAA9B,EAAoC,OAD2B,CACnB;AAC5C1R,mBAAO2R,mBAAP,CAA2B,SAA3B,EAAsC,IAAtC,EAA4C,eAA5C,CAA4D;AAA5D,cACE,KAAKzP,KAAL,GAAauP,MAAMvP,KAAnB;AACF,gBAAIuP,MAAML,cAAV,EAA0B;AACxB,mBAAKzS,MAAL,CAAYiT,QAAZ,CAAqBH,MAAML,cAAN,CAAqBS,IAA1C,EAAgDJ,MAAML,cAAN,CAAqBU,GAArE;AACD;AACF,WAPD;AAQD;;AAEDvK,2BAAmB;AACjBvH,iBAAO+R,WAAP,CAAmB,KAAKzP,UAAL,CAAgBY,aAAhB,CAA8B,oBAA9B,CAAnB,EAAwErG,GAAG,CAACgP,SAASmG,gBAAT,CAA0BC,UAA9B,EAA0C,CAACpG,SAASmG,gBAAT,CAA0BE,SAArE,EAAgFC,KAAhF,CAAsFnS,OAAOoS,iBAAP,CAAyB,IAAzB,CAAtF,CAAxE;AACD;;AAED;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA,cAAMC,WAAN,CAAkBjO,IAAlB,EAAwBkO,GAAxB,EAA6B3S,IAA7B,EAAmC;AACjC,cAAI,CAAC,KAAK4S,UAAV,EAAsB;AACtBD,gBAAMA,OAAOlO,IAAb;AACAzE,iBAAOA,SAAS,MAAMH,MAAM8S,GAAN,EAAW7S,IAAX,CAAgBC,KAAKA,EAAEC,IAAF,EAArB,CAAf,CAAP;AACA,eAAK4S,UAAL,CAAgBC,MAAhB,CAAuBC,OAAvB,CAA+BrO,IAA/B,EAAqCzE,IAArC;AACD;;AAED+S,kBAAUC,YAAV,EAAwBC,gBAAxB,EAA0C;AACxC,cAAI/Q,SAAS,KAAKS,UAAL,CAAgBY,aAAhB,CAA8B,wBAA9B,CAAb;AACArB,iBAAOsB,SAAP,GAAmB,EAAnB;AACA,eAAK0P,UAAL,GAAkBxV,WAAWyV,SAAX,CAAqBjR,MAArB,EAA6B;AAC7CK,mBAAO,KAAKA,KADiC;AAE7C6Q,sBAAUH,gBAFmC;AAG7CI,kBAAML,YAHuC;AAI7CtP,yBAAa,IAJgC;AAK7CzE,kBAAM,KAAKD,MAAL,CAAY6R,SAAZ,CAAsB,MAAtB,CALuC;AAM7CyC,4BAAgB,KAAKtU,MAAL,CAAY6R,SAAZ,CAAsB,gBAAtB,CAN6B;AAO7C0C,kCAAsB,IAPuB;AAQ7CC,qBAAS,OARoC;AAS7CC,0BAAc,IAT+B;AAU7CC,+BAAmB;AAV0B,WAA7B,CAAlB;AAYA;AACA;AACA;AACA,eAAKjQ,SAAL,CAAe,KAAKyP,UAAL,CAAgBlU;AAC/B;AADe,YAAf;AAGD;;AAED2U,wBAAgBZ,SAAhB,EAA2B;AACzB,mBAASa,YAAT,CAAsB5U,MAAtB,EAA8B;AAC5B,gBAAI,CAACA,MAAL,EAAa,OAAO,CAAP;AACb,mBAAOA,OAAO0S,aAAP,GAAuBmC,MAA9B;AACD;;AAED,mBAASC,eAAT,CAAyBf,SAAzB,EAAoC;AAClC,mBAAOgB,KAAKC,GAAL,CAASJ,aAAab,UAAUkB,YAAV,EAAb,CAAT,EAAiDL,aAAab,UAAU/T,MAAV,EAAb,CAAjD,EAAmF4U,aAAab,UAAUmB,aAAV,EAAb,CAAnF,CAAP;AACD;AACD,cAAIL,SAASC,gBAAgBf,SAAhB,CAAb;AACA,mBAAS;AACP,gBAAIA,UAAUkB,YAAV,EAAJ,EAA8BlB,UAAUkB,YAAV,GAAyBE,OAAzB,CAAiC,IAAjC,EAAuCN,MAAvC;AAC9Bd,sBAAU/T,MAAV,GAAmBmV,OAAnB,CAA2B,IAA3B,EAAiCN,MAAjC;AACA,gBAAId,UAAUmB,aAAV,EAAJ,EAA+BnB,UAAUmB,aAAV,GAA0BC,OAA1B,CAAkC,IAAlC,EAAwCN,MAAxC;;AAE/B,gBAAIO,YAAYN,gBAAgBf,SAAhB,CAAhB;AACA,gBAAIqB,aAAaP,MAAjB,EAAyB,MAAzB,KAAoCA,SAASO,SAAT;AACrC;AACDrB,oBAAUsB,IAAV,CAAevH,KAAf,CAAqB+G,MAArB,GAA8BA,SAAS,IAAvC;AACD;;AAED,cAAMS,YAAN,GAAqB;AACnB,cAAIC,QAAQ,IAAIC,MAAJ,CAAW,6BAAX,EAA0C,GAA1C,CAAZ;AACA,aAAG;AACD,gBAAIxT,IAAIuT,MAAME,IAAN,CAAW,KAAKlS,KAAhB,CAAR;AACA,gBAAIvB,CAAJ,EAAO;AACL,kBAAIyL,OAAOzL,EAAEiO,KAAb;AACA,kBAAIvC,KAAK1L,EAAEiO,KAAF,GAAUjO,EAAE,CAAF,EAAKmK,MAAxB;AACA,oBAAM,KAAKqB,UAAL,CAAgB,MAAhB,EAAwB,KAAKxN,MAAL,CAAY0V,YAAZ,CAAyBjI,IAAzB,CAAxB,EAAwD,KAAKzN,MAAL,CAAY0V,YAAZ,CAAyBhI,EAAzB,CAAxD,EAAsF5M,IAAtF,CAA2F6U,OAAO;AACtGA,oBAAI7H,KAAJ,CAAU8H,eAAV,GAA4B,kBAA5B;;AAEA,oBAAI5T,EAAE,CAAF,EAAK8K,KAAL,CAAW,aAAX,CAAJ,EAA+B;AAC7B,sBAAI+I,yBAAM3I,SAASU,aAAT,CAAuB,KAAvB,CAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAJ;AACAiI,sBAAIC,GAAJ,GAAU9T,EAAE,CAAF,CAAV;AACA6T,sBAAIE,KAAJ,GAAY/T,EAAE,CAAF,EAAKgU,KAAL,CAAW,CAAX,EAAc,EAAd,IAAoB,KAAhC;AACAH,sBAAI/H,KAAJ,CAAUiC,SAAV,GAAsB,OAAtB;;AAEA4F,sBAAIlF,WAAJ,CAAgBvD,SAAS+I,cAAT,CAAwB,IAAxB,CAAhB;AACAN,sBAAIlF,WAAJ,CAAgBoF,GAAhB;AACAF,sBAAIlF,WAAJ,CAAgBvD,SAAS+I,cAAT,CAAwB,IAAxB,CAAhB;AACD,iBATD,MASO;AACLN,sBAAInR,SAAJ,GAAgB,OAAOxC,EAAE,CAAF,EAAKgU,KAAL,CAAW,CAAX,EAAc,EAAd,CAAP,GAA2B,KAA3B,GAAmC,IAAnD;AACD;AACF,eAfK,CAAN;AAgBD;AACF,WAtBD,QAsBShU,CAtBT;AAuBD;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA,cAAMkU,WAAN,GAAoB;AAClB;AACA,cAAI,KAAKC,EAAL,KAAY,OAAhB,EAAyB;AACvB;AACA;AACD;AACD;;AAEA,gBAAMC,4BAA4B,MAAM;AACtC,kBAAMC,gBAAiB,uCAAvB;AACA,kBAAMC,uBAAuB,4BAA7B;;AAEA,kBAAMC,4BAA6B,IAAGD,oBAAqB,GAA3D;AACA,kBAAME,4BAA6B,IAAGF,oBAAqB,aAAYA,oBAAqB,GAA5F;AACA,kBAAMG,sBAAuB,IAAGF,yBAA0B,IAAGC,yBAA0B,GAAvF;AACA;AACA,kBAAME,kBAAmB,WAAUD,mBAAoB,gBAAeA,mBAAoB,cAA1F;AACA;AACA,kBAAME,yBAA0B,IAAGL,oBAAqB,GAAxD;AACA;AACA,kBAAMM,2BAA4B,iBAAgBN,oBAAqB,GAAvE;AACA,kBAAMO,eAAgB,IAAGH,eAAgB,IAAGC,sBAAuB,IAAGC,wBAAyB,GAA/F;AACA;AACA,kBAAME,oBAAqB,cAAaD,YAAa,gBAAeA,YAAa,eAAcR,aAAc,YAA7G;;AAEA,mBAAOS,iBAAP;AACD,WAlBD;;AAoBA,cAAIvB,QAAQ,IAAIC,MAAJ,CAAWY,2BAAX,EAAwC,GAAxC,CAAZ;;AAEA,aAAG;AACD,gBAAIpU,IAAIuT,MAAME,IAAN,CAAW,KAAKlS,KAAhB,CAAR;AACA,gBAAIvB,CAAJ,EAAO;AACL,oBAAM3D,6BAA6B0Y,oBAA7B,CAAkD,IAAlD,EAAwD/U,CAAxD,CAAN;AACD;AACF,WALD,QAKSA,CALT;AAMD;;AAED,cAAMgV,SAAN,GAAkB;AAChB;AACA,cAAI,SAASnG,OAAOoG,IAApB,EAA0B;AACxB;AACD;AACD,cAAI1B,QAAQ,IAAIC,MAAJ,CAAW,+BAAX,EAA4C,GAA5C,CAAZ;AACA,aAAG;AACD,gBAAIxT,IAAIuT,MAAME,IAAN,CAAW,KAAKlS,KAAhB,CAAR;AACA,gBAAIvB,CAAJ,EAAO;AACLX,qBAAOV,IAAP,CAAY,gBAAgBqB,EAAE,CAAF,CAA5B;AACA,kBAAIyL,OAAOzL,EAAEiO,KAAb;AACA,kBAAIvC,KAAK1L,EAAEiO,KAAF,GAAUjO,EAAE,CAAF,EAAKmK,MAAxB;AACA,kBAAI+K,OAAOlV,EAAE,CAAF,CAAX;AACA;AACA,oBAAM,KAAKwL,UAAL,CAAgB,MAAhB,EAAwB,KAAKxN,MAAL,CAAY0V,YAAZ,CAAyBjI,IAAzB,CAAxB,EAAwD,KAAKzN,MAAL,CAAY0V,YAAZ,CAAyBhI,EAAzB,CAAxD,EAAsF5M,IAAtF,CAA2F6M,UAAU;AACzGkD,uBAAOsG,UAAP,GAAoBxJ,MAApB;;AAEAA,uBAAOG,KAAP,CAAa8H,eAAb,GAA+B,mBAA/B;AACA,oBAAIwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAJ;AACAA,sBAAM7T,KAAN,GAAcvB,EAAE,CAAF,CAAd;;AAEAX,uBAAOV,IAAP,CAAY,eAAeyW,KAA3B;;AAEAA,sBAAMjO,gBAAN,CAAuB,SAAvB,EAAkClE,OAAO;AACvC,sBAAIrH,QAAQ+P,OAAOW,MAAP,CAAc+I,IAAd,EAAZ;AACA,sBAAIpS,IAAIqS,OAAJ,IAAe,EAAnB,EAAuB;AACrB;AACA;AACA,yBAAKtX,MAAL,CAAYuX,YAAZ,CAAyBH,MAAM7T,KAA/B,EAAsC3F,MAAM6P,IAA5C,EAAkD7P,MAAM8P,EAAxD,CAA2D;AAA3D,sBACE,KAAKsJ,SAAL,CAAe;AAAf;AAEH;AACD,sBAAI/R,IAAIqS,OAAJ,IAAe,EAAnB,EAAuB;AACrB;AACA,wBAAIF,MAAMI,cAAN,IAAwB,CAA5B,EAA+B;AAC7B,2BAAKxX,MAAL,CAAYyX,YAAZ,CAAyB7Z,MAAM6P,IAA/B,EAAqC7P,MAAM6P,IAA3C;AACA,2BAAK9E,KAAL;AACD;AACF;;AAED,sBAAI1D,IAAIqS,OAAJ,IAAe,EAAnB,EAAuB;AACrB;AACA,wBAAIF,MAAMI,cAAN,IAAwBJ,MAAM7T,KAAN,CAAY4I,MAAxC,EAAgD;AAC9C,2BAAKnM,MAAL,CAAYyX,YAAZ,CAAyB7Z,MAAM8P,EAA/B,EAAmC9P,MAAM8P,EAAzC;AACA,2BAAK/E,KAAL;AACD;AACF;AACF,iBAxBD;;AA0BAgF,uBAAO8C,WAAP,CAAmB2G;AACnB;AACA;AACA;AAHA;AAKD,eAxCK,CAAN;AAyCD;AACF,WAlDD,QAkDSpV,CAlDT;AAmDD;;AAEDmD,sBAAc;AACZ,cAAI,KAAKmD,YAAT,EAAuB;AACrBtK,0BAAc0Z,oBAAd,CAAmC,KAAK1X,MAAxC;AACA,iBAAKkW,WAAL;AACA,iBAAKc,SAAL;AACD;AACD,cAAI,KAAKlF,UAAL,IAAmB,KAAKC,MAA5B,EAAoC;AAClC,iBAAKuD,YAAL;AACD;AACF;;AAED+B,aAAKxK,GAAL,EAAU;AACR;AACA,cAAI,CAAC,KAAK7M,MAAV,EAAkB;AAClB,cAAI2X,QAAQ,KAAZ;AACA,eAAKpU,KAAL,CAAWiE,KAAX,CAAiB,IAAjB,EAAuB5E,OAAvB,CAA+B,CAAC4C,EAAD,EAAKyK,KAAL,KAAe;AAC5C,gBAAI2H,WAAWpS,GAAGqS,OAAH,CAAWhL,GAAX,CAAf;AACA,gBAAI,CAAC8K,KAAD,IAAUC,YAAY,CAAC,CAA3B,EAA8B;AAC5B,mBAAK5X,MAAL,CAAY8O,SAAZ,CAAsBmB,QAAQ,EAA9B,EAAkC,KAAlC,EAD4B,CACc;AAC1C,mBAAKjQ,MAAL,CAAY2I,KAAZ;AACA,mBAAK3I,MAAL,CAAYyX,YAAZ,CAAyB,EAAE9X,MAAMsQ,KAAR,EAAerQ,IAAIgY,QAAnB,EAAzB,EAAwD,EAAEjY,MAAMsQ,KAAR,EAAerQ,IAAIgY,WAAW/K,IAAIV,MAAlC,EAAxD;AACAwL,sBAAQnS,EAAR;AACD;AACF,WARD;AASD;;AAEDsS,qBAAanY,IAAb,EAAmB;AACjB,eAAKK,MAAL,CAAYiT,QAAZ,CAAqB,IAArB,EAA2B,KAAKjT,MAAL,CAAY+X,YAAZ,CAAyBpY,OAAO,CAAhC,EAAmC,OAAnC,CAA3B;AACD;;AAEDqY,yBAAiB;AACf,cAAI,KAAKhY,MAAL,CAAYwJ,QAAZ,OAA2B,EAA/B,EAAmC,OAAO,KAAP;AACnC,iBAAO,IAAP,CAFe,CAEF;AACd;;AAEDlE,2BAAmB;AACjB,cAAIhB,YAAYjD,OAAO0J,KAAP,CAAa,IAAb,EAAmB,kBAAnB,CAAhB;AACA,cAAI,CAACzG,SAAL,EAAgB;AAChB,cAAI2T,SAAS5W,OAAO0J,KAAP,CAAa,IAAb,EAAmB,yBAAnB,CAAb;AACA,cAAI,CAACkN,MAAL,EAAa;AACbA,iBAAOC,8BAAP,CAAsC,KAAKlY,MAA3C,EAAmD,KAAKA,MAAL,CAAY6L,SAAZ,CAAsB,OAAtB,CAAnD,EAAmF,KAAK7L,MAAL,CAAY6L,SAAZ,CAAsB,KAAtB,CAAnF;AACD;;AAEDsM,+BAAuB;AACrB,iBAAO,KAAK5U,KAAL,CAAWyS,KAAX,CAAiB,CAAjB,EAAoB,EAApB,CAAP;AACD;;AAED;;AAEA,cAAMoC,eAAN,GAAwB;AACtB,iBAAO,KAAKC,KAAL,KAAe,KAAKA,KAAL,GAAa,IAAIzZ,eAAJ,EAAqB,MAAM,KAAKkD,eAAL,CAAqB,KAAK9B,MAA1B,CAA3B,EAA5B,CAAP;AACD;;AAED,cAAMoE,uBAAN,GAAgC;AAC9B,cAAG,CAAC,KAAKkE,YAAN,IAAsB,CAACjH,OAAO0J,KAAP,CAAa,IAAb,EAAmB,kBAAnB,CAA1B,EAAkE;AAClE,gBAAM,KAAK/K,MAAX;AACA;;;;;;;AAOA;AACA,gBAAM,KAAKsY,yBAAL,EAAN;;AAEAzZ,yBAAe0Z,0BAAf,CAA0C,KAAKC,OAAL,EAA1C,EAA0D,IAA1D,EAAiEC,QAAD,IAAc;AAC5E,iBAAKC,qBAAL,CAA2BD,QAA3B,EAAqC3X,IAArC,CAA0C,CAAC,CAAC6X,OAAD,EAAUC,OAAV,CAAD,KAAwB;AAChE,mBAAK5Y,MAAL,CAAYuO,GAAZ,CAAgBsK,WAAhB,CAA4B,wBAA5B;AACA,mBAAKC,gCAAL,CAAsCH,OAAtC,EAA+C,KAA/C;AACA,mBAAKG,gCAAL,CAAsCF,OAAtC,EAA+C,IAA/C;AACD,aAJD;AAKD,WAND;AAOD;;AAED,cAAMG,oBAAN,GAA6B;AAC3B,gBAAM/Y,SAAS,MAAM,KAAKA,MAA1B;AACA,gBAAM,KAAKgZ,qBAAL,EAAN;AACA,gBAAMZ,kBAAkB,MAAM,KAAKA,eAAL,EAA9B;AACAA,0BAAgBa,uBAAhB,GAA0CrW,OAA1C,CAAkDpC,QAAQ;AACxD,kBAAMO,IAAInD,MAAM4C,KAAK0Y,IAAL,CAAUvb,GAAhB,EAAqBwb,IAArB,EAAV;AACA,kBAAMC,OAAO,KAAKpZ,MAAL,CAAYwO,QAAZ,CAAqBzN,EAAE,CAAF,CAArB,EAA2BA,EAAE,CAAF,CAA3B,EAAiC;AAC5CsY,mBAAK;AADuC,aAAjC,CAAb;AAGAD,iBAAKE,iBAAL,GAAyB,IAAzB;AACD,WAND;AAOD;;AAED,cAAMN,qBAAN,GAA8B;AAC5B,gBAAMhZ,SAAS,MAAM,KAAKA,MAA1B;AACAA,iBAAOuZ,WAAP,GAAqB3W,OAArB,CAA6BwW,QAAQ;AACnC,gBAAIA,KAAKE,iBAAT,EAA4B;AAC1BF,mBAAKI,KAAL;AACD;AACF,WAJD;AAKD;;AAED,cAAMlB,yBAAN,GAAkC;AAChC,gBAAMnC,KAAK,wBAAX;AACA,gBAAMnW,SAAS,MAAM,KAAKA,MAA1B;AACA,cAAI2E,UAAU3E,OAAO6R,SAAP,CAAiB,SAAjB,CAAd;AACA,cAAI,CAAClN,QAAQ8U,IAAR,CAAanL,UAAUA,WAAW6H,EAAlC,CAAL,EAA4C;AAC1CnW,mBAAO8E,SAAP,CAAiB,SAAjB,EAA4B,CAAC,GAAGH,OAAJ,EAAawR,EAAb,CAA5B;AACD;AACF;;AAED,cAAMuD,yBAAN,GAAkC;AAChC,gBAAMvD,KAAK,wBAAX;AACA,gBAAMnW,SAAS,MAAM,KAAKA,MAA1B;AACA,cAAI2E,UAAU3E,OAAO6R,SAAP,CAAiB,SAAjB,CAAd;AACAlN,oBAAUA,QAAQgV,MAAR,CAAerL,UAAUA,WAAW6H,EAApC,CAAV;AACAnW,iBAAO8E,SAAP,CAAiB,SAAjB,EAA4BH,OAA5B;AACD;;AAED,cAAMiV,+BAAN,GAAwC;AACtC,gBAAM5Z,SAAS,MAAM,KAAKA,MAA1B;AACAA,iBAAOuZ,WAAP,GAAqB3W,OAArB,CAA6BwW,QAAQ;AACnC,gBAAIA,KAAKS,2BAAT,EAAsC;AACpCT,mBAAKI,KAAL;AACD;AACF,WAJD;AAKD;;AAED,cAAM/O,8BAAN,GAAuC;AACrC,gBAAM,KAAKzK,MAAX;AACA,gBAAM,KAAK4Z,+BAAL,EAAN;AACA,gBAAME,SAAS,KAAK9Z,MAAL,CAAY6L,SAAZ,EAAf;AACA,gBAAMuM,kBAAkB,MAAM,KAAKA,eAAL,EAA9B;AACA,gBAAM2B,YAAY3B,gBAAgB4B,gBAAhB,CAAiCF,MAAjC,CAAlB;AACA,cAAI,CAACC,SAAL,EAAgB;AAChB,gBAAME,OAAO7B,gBAAgB8B,mBAAhB,CAAoCH,UAAUvK,GAAV,CAAc,WAAd,EAA2B,CAA3B,CAApC,CAAb;AACAyK,eAAKrX,OAAL,CAAapC,QAAQ;AACnB,kBAAMO,IAAInD,MAAM4C,KAAK0Y,IAAL,CAAUvb,GAAhB,EAAqBwb,IAArB,EAAV;AACA,kBAAMC,OAAO,KAAKpZ,MAAL,CAAYwO,QAAZ,CAAqBzN,EAAE,CAAF,CAArB,EAA2BA,EAAE,CAAF,CAA3B,EAAiC;AAC5CsY,mBAAK;AADuC,aAAjC,CAAb;AAGAD,iBAAKS,2BAAL,GAAmC,IAAnC;AACD,WAND;AAOD;;AAED,cAAMf,gCAAN,CAAuCqB,aAAvC,EAAsDC,IAAtD,EAA4D;AAC1D,gBAAM,KAAKpa,MAAX;;AAEA,eAAK,MAAM,CAACL,IAAD,EAAO0a,MAAP,CAAX,IAA6BF,cAAcG,OAAd,EAA7B,EAAsD;AACpD,iBAAKC,eAAL,CAAqB5a,IAArB,EAA2B0a,MAA3B,EAAmCD,IAAnC;AACD;AACF;;AAED,cAAM1B,qBAAN,CAA4B8B,aAA5B,EAA2C;AACzC,gBAAM7B,UAAU,IAAI8B,GAAJ,EAAhB;AACA,gBAAM7B,UAAU,IAAI6B,GAAJ,EAAhB;;AAEA,gBAAM,KAAKza,MAAX;AACA;;;;;;;;;;;;;;;;;AAkBA,gBAAM0a,qBAAqB,CAACC,EAAD,EAAKC,aAAL,EAAoBC,gBAApB,KAAyC;AAClE,kBAAMC,iBAAiBF,cAAcG,KAAd,CAAoBpb,IAApB,GAA2B,CAAlD;AACA,kBAAMqb,iBAAiBJ,cAAcK,IAArC;AACA,kBAAMC,aAAaP,GAAGQ,IAAH,GAAU3L,GAAV,CAAc,UAAd,CAAnB;AACA,kBAAM4L,SAASF,WAAWH,KAAX,CAAiBpb,IAAjB,GAAwB,CAAvC;;AAEA,gBAAI0b,qBAAqBV,GAAGQ,IAAH,GAAU3L,GAAV,CAAc,QAAd,EAAwBmK,MAAxB,CAA+B5V,SAASA,MAAMjB,IAAN,KAAe,eAAvD,CAAzB;AACA,kBAAMwY,gBAAgBD,mBAAmB1B,MAAnB,CAA0B5V,SAASA,MAAMR,KAAN,CAAYgY,OAAZ,IAAuBP,eAAeQ,QAAf,CAAwBzX,MAAMR,KAAN,CAAYgY,OAAZ,CAAoBN,IAA5C,CAAvB,IAA4ElX,MAAMR,KAAN,CAAYgY,OAAZ,CAAoBR,KAApB,CAA0Bpb,IAA1B,GAAiC,CAAjC,KAAuCmb,cAAtJ,CAAtB;;AAEA,gBAAIE,eAAeQ,QAAf,CAAwB,KAAKhD,OAAL,EAAxB,CAAJ,EAA6C;AAC3C;AACA,kBAAI,CAACG,QAAQnJ,GAAR,CAAYsL,cAAZ,CAAL,EAAkC;AAChCnC,wBAAQ8C,GAAR,CAAYX,cAAZ,EAA4B,EAA5B;AACD;AACD;AACAnC,sBAAQnJ,GAAR,CAAYsL,cAAZ,EAA4BY,IAA5B,CAAiC,EAAEC,UAAUT,UAAZ,EAAwB1J,QAAQmJ,GAAGQ,IAAH,GAAU3L,GAAV,CAAc,YAAd,CAAhC,EAA6DoM,QAAQN,cAAcnP,MAAnF,EAA2F0P,KAAK,IAAIC,GAAJ,CAAQ,CAACnB,EAAD,CAAR,CAAhG,EAAjC;AACD;;AAED,gBAAIO,WAAWD,IAAX,CAAgBO,QAAhB,CAAyB,KAAKhD,OAAL,EAAzB,CAAJ,EAA8C;AAC5C;AACA,kBAAI,CAACI,QAAQpJ,GAAR,CAAY4L,MAAZ,CAAL,EAA0B;AACxBxC,wBAAQ6C,GAAR,CAAYL,MAAZ,EAAoB,EAApB;AACD;AACDxC,sBAAQpJ,GAAR,CAAY4L,MAAZ,EAAoBM,IAApB,CAAyB,EAAEC,UAAUf,aAAZ,EAA2BpJ,QAAQqJ,gBAAnC,EAAqDe,QAAQN,cAAcnP,MAA3E,EAAmF0P,KAAK,IAAIC,GAAJ,CAAQ,CAACnB,EAAD,CAAR,CAAxF,EAAzB;AACD;AACF,WAzBD;;AA2BA,eAAK,MAAM,EAAEoB,IAAF,EAAQC,UAAR,EAAoBrB,EAApB,EAAX,IAAuCH,aAAvC,EAAsD;AACpD,kBAAMyB,YAAY,MAAMF,KAAKG,YAAL,EAAxB;AACA,iBAAK,MAAMP,QAAX,IAAuBM,SAAvB,EAAkC;AAChCvB,iCAAmBC,EAAnB,EAAuBgB,QAAvB,EAAiCK,WAAWG,UAA5C;AACD;AACD;;;;;;;AAOD;AACD;;;;;;4FA/DyC,CAqEyC;;;;AAIlF;;;;;;;;;;;;;;AAcA,iBAAO,CAACxD,OAAD,EAAUC,OAAV,CAAP;AACD;;AAEDJ,kBAAU;AACR,iBAAOnX,OAAO0J,KAAP,CAAa,IAAb,EAAmB,kBAAnB,EAAuCqR,MAAvC,GAAgDC,QAAvD;AACD;;AAEDC,gBAAQ;AACN,iBAAOjb,OAAOkb,UAAP,CAAkB,IAAlB,EAAwB,EAAxB,EAA4B,IAA5B,EAAkCf,QAAlC,CAA2CtO,SAASsP,IAApD,CAAP;AACD;;AAEDjC,wBAAgB5a,IAAhB,EAAsB8c,YAAtB,EAAoCrC,IAApC,EAA0C;AACxC,eAAKpa,MAAL,CAAYuO,GAAZ,CAAgBmO,eAAhB,CAAgC/c,IAAhC,EAAsC,wBAAtC,EAAgE,KAAKgd,qBAAL,CAA2BF,YAA3B,EAAyCrC,IAAzC,CAAhE;AACD;;AAEDwC,eAAOnX,IAAP,EAAa,GAAGoX,SAAhB,EAA2B;AACzB,iBAAQ,mBAAkBpX,IAAK,IAAGoX,UAAUtX,GAAV,CAAcvD,KAAK,QAAQA,CAA3B,EAA8B8a,IAA9B,CAAmC,GAAnC,CAAwC,QAA1E;AACD;;AAEDH,8BAAsBF,YAAtB,EAAoCrC,IAApC,EAA0C;AACxC;AACA,gBAAM2C,SAASN,aAAalN,IAAb,CAAkB,CAACyN,IAAD,EAAOC,IAAP,KAAgB;AAC/C,kBAAMxd,IAAIud,KAAKrB,QAAf;AACA,kBAAMjc,IAAIud,KAAKtB,QAAf;AACA,gBAAIlc,EAAEwb,IAAF,GAASvb,EAAEub,IAAf,EAAqB;AACnB,qBAAO,CAAC,CAAR;AACD,aAFD,MAEO,IAAIxb,EAAEwb,IAAF,GAASvb,EAAEub,IAAf,EAAqB;AAC1B,qBAAO,CAAP;AACD;AACD,gBAAIxb,EAAEsb,KAAF,CAAQpb,IAAR,GAAeD,EAAEqb,KAAF,CAAQpb,IAA3B,EAAiC;AAC/B,qBAAO,CAAC,CAAR;AACD,aAFD,MAEO,IAAIF,EAAEsb,KAAF,CAAQpb,IAAR,GAAeD,EAAEqb,KAAF,CAAQpb,IAA3B,EAAiC;AACtC,qBAAO,CAAP;AACD;AACD,mBAAOF,EAAEsb,KAAF,CAAQmC,MAAR,GAAiBxd,EAAEqb,KAAF,CAAQmC,MAAhC;AACD,WAdc,CAAf;;AAgBA,gBAAMC,cAAc,EAApB;;AAEAJ,iBAAOna,OAAP,CAAewa,OAAO;AACpB;AACA,gBAAID,YAAYhR,MAAZ,KAAuB,CAAvB,IAA4B,CAACnN,EAAEqe,OAAF,CAAUF,YAAYA,YAAYhR,MAAZ,GAAqB,CAAjC,EAAoCwP,QAApC,CAA6CZ,KAAvD,EAA8DqC,IAAIzB,QAAJ,CAAaZ,KAA3E,CAAjC,EAAoH;AAClHoC,0BAAYzB,IAAZ,CAAiB0B,GAAjB;AACD,aAFD,MAEO;AACL,oBAAME,UAAUH,YAAYA,YAAYhR,MAAZ,GAAqB,CAAjC,CAAhB;;AAEAmR,sBAAQ1B,MAAR,IAAkBwB,IAAIxB,MAAtB;AACA,kBAAGwB,IAAI5L,MAAJ,CAAWrF,MAAX,GAAoBmR,QAAQ9L,MAAR,CAAerF,MAAtC,EAA8C;AAC5CmR,wBAAQ9L,MAAR,GAAiB4L,IAAI5L,MAArB;AACD;AACD,kBAAG4L,IAAIzB,QAAJ,CAAa4B,GAAb,CAAiBL,MAAjB,GAA0BI,QAAQ3B,QAAR,CAAiB4B,GAAjB,CAAqBL,MAAlD,EAA0D;AACxDI,wBAAQ3B,QAAR,CAAiB4B,GAAjB,GAAuBH,IAAIzB,QAAJ,CAAa4B,GAApC;AACD;AACDD,sBAAQzB,GAAR,GAAc,IAAIC,GAAJ,CAAQ,CAAC,GAAGwB,QAAQzB,GAAZ,EAAiB,GAAGuB,IAAIvB,GAAxB,CAAR,CAAd;AACD;AACF,WAhBD;;AAkBA,gBAAM2B,WAAW,MAAMvY,GAAN,IAAa;AAC5B,kBAAMwY,eAAexY,IAAI/B,MAAJ,CAAWwa,qBAAX,EAArB;AACA,iBAAKC,uBAAL,CAA6BR,WAA7B,EAA0CM,YAA1C;AACD,WAHD;;AAKA,2EAAmB,mCAAmCrD,OAAO,KAAP,GAAe,MAAlD,CAAnB,iCAAqFoD,QAArF,uDACGpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0EAA4B,iBAA5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YADH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGD;;AAED,cAAMuD,uBAAN,CAA8BlB,YAA9B,EAA4CgB,YAA5C,EAA0D;;AAExD,gBAAMG,YAAY,EAAlB;AACA,gBAAMC,SAAS,KAAKC,KAAL,CAAW,GAAGrB,aAAalX,GAAb,CAAiB6X,OAAOA,IAAIvB,GAA5B,CAAd,CAAf;AACA+B,oBAAUlC,IAAV,CAAe,CAAC,eAAD,EAAkB,MAAM;AAAC,iBAAKqC,kBAAL,CAAwBF,MAAxB;AAAgC,WAAzD,EAA2D,EAA3D,EAA+D,GAA/D,CAAf;;AAEApB,uBAAa7Z,OAAb,CAAqBwa,OAAO;AAC1B,kBAAM5L,SAAS4L,IAAI5L,MAAnB;AACA,kBAAM7R,OAAOyd,IAAIzB,QAAJ,CAAaZ,KAAb,CAAmBpb,IAAhC;AACA,gBAAIqe,cAAe,GAAEre,IAAK,KAAI6R,MAAO,EAArC;AACA,gBAAIhR,OAAO4c,IAAIzB,QAAJ,CAAaV,IAAxB;AACA,kBAAMgD,aAAa,CAACzd,IAAD,IAASA,KAAKgb,QAAL,CAAc,KAAKhD,OAAL,EAAd,CAA5B;AACA,gBAAIyF,UAAJ,EAAgB;AACdD,4BAAc,UAAUA,WAAxB;AACD,aAFD,MAEO;AACLA,4BAAcxd,KAAK0d,SAAL,CAAe1d,KAAK2d,WAAL,CAAiB,GAAjB,IAAwB,CAAvC,IAA4C,GAA5C,GAAkDH,WAAhE;AACD;AACDJ,sBAAUlC,IAAV,CAAe,CAACsC,WAAD,EAAc,MAAM;AACjC,oBAAMjD,QAAQ,EAAEpb,MAAMyd,IAAIzB,QAAJ,CAAaZ,KAAb,CAAmBpb,IAAnB,GAA0B,CAAlC,EAAqCC,IAAIwd,IAAIzB,QAAJ,CAAaZ,KAAb,CAAmBmC,MAA5D,EAAd;AACA,oBAAMK,MAAM,EAAE5d,MAAMyd,IAAIzB,QAAJ,CAAa4B,GAAb,CAAiB5d,IAAjB,GAAwB,CAAhC,EAAmCC,IAAIwd,IAAIzB,QAAJ,CAAa4B,GAAb,CAAiBL,MAAxD,EAAZ;AACA,kBAAIe,UAAJ,EAAgB;AACd,qBAAKje,MAAL,CAAYyX,YAAZ,CAAyBsD,KAAzB,EAAgCwC,GAAhC;AACD,eAFD,MAEO;AACLlc,uBAAO+c,WAAP,CAAmB5d,IAAnB,EAAyB,IAAzB,EAA+B,EAACua,KAAD,EAAQwC,GAAR,EAA/B,EAA6C,KAA7C,EAAoDle,SAApD,EAA+D,IAA/D;AACD;AACDgf,mBAAK7X,MAAL;AACD,aATc,EASZ4W,IAAIxB,MAAJ,GAAa,QAAb,IAAyBwB,IAAIxB,MAAJ,KAAe,CAAf,GAAmB,EAAnB,GAAwB,GAAjD,IAAwD,IAAxD,GAA+DwB,IAAIvB,GAAJ,CAAQyC,IAAvE,GAA8E,WAA9E,IAA6FlB,IAAIvB,GAAJ,CAAQyC,IAAR,KAAiB,CAAjB,GAAqB,EAArB,GAA0B,GAAvH,CATY,EASiH,KAAK1B,MAAL,CAAYqB,aAAa,gBAAb,GAAgC,aAA5C,CATjH,CAAf;AAUD,WArBD;;AAuBA,gBAAMI,OAAO,MAAMtf,YAAYwf,MAAZ,CAAmBrR,SAASsP,IAA5B,EAAkC,EAAEgC,SAASf,aAAavK,IAAxB,EAA8BuL,SAAShB,aAAaiB,MAApD,EAAlC,EAAgGrf,SAAhG,EAA2G6N,SAASsP,IAApH,EAA0HoB,SAA1H,CAAnB;AACAS,eAAKlV,gBAAL,CAAsB,gBAAtB,EAAwC,MAAM;AAC5C,iBAAKR,KAAL;AACD,WAFD;AAGD;;AAEDmV,cAAM,GAAGa,SAAT,EAAoB;AAClB,gBAAMlD,MAAM,IAAIK,GAAJ,EAAZ;;AAEA,eAAK,MAAM8C,QAAX,IAAuBD,SAAvB,EAAkC;AAChC,iBAAK,MAAME,IAAX,IAAmBD,QAAnB,EAA6B;AAC3BnD,kBAAI5N,GAAJ,CAAQgR,IAAR;AACD;AACF;;AAED,iBAAOpD,GAAP;AACD;;AAED,cAAMsC,kBAAN,CAAyBlC,GAAzB,EAA8B;AAC5B,gBAAMiD,oBAAoB5R,SAASsP,IAAT,CAAcuC,gBAAd,CAA+B,gBAA/B,CAA1B;;AAEA,cAAGD,kBAAkB3S,MAAlB,GAA2B,CAA9B,EAAiC;AAC/B,kBAAM6S,WAAWF,kBAAkB,CAAlB,CAAjB;AACAE,qBAASC,WAAT,CAAqBpD,GAArB;AACAmD,qBAASzO,aAAT,CAAuB5H,KAAvB;AACAqW,qBAASrW,KAAT;AACA;AACD;;AAEDtH,iBAAO6d,qBAAP,CAA6B,gBAA7B,EAA+Cpe,IAA/C,CAAqDke,QAAD,IAAc;AAChEA,qBAASC,WAAT,CAAqBpD,GAArB;AACA;AACD,WAHD;AAID;AA1pDuD;;yBAArChc,gB;;;;;;;;6BAAAA,iD","file":"lively-code-mirror.js","sourcesContent":["/*MD \n# CodeMirror\n\nWorkspace / main source code editing component. \n\n![](lively-code-mirror.png){height=200}\n\nMD*/\n\nimport { promisedEvent, through, uuid as generateUUID } from 'utils';\nimport boundEval from 'src/client/bound-eval.js';\nimport Morph from \"src/components/widgets/lively-morph.js\";\nimport diff from 'src/external/diff-match-patch.js';\nimport SyntaxChecker from 'src/client/syntax.js';\nimport { debounce } from \"utils\";\nimport Preferences from 'src/client/preferences.js';\nimport { pt } from 'src/client/graphics.js';\nimport 'src/client/stablefocus.js';\nimport Strings from 'src/client/strings.js';\nimport { letsScript } from 'src/client/vivide/vivide.js';\nimport LivelyCodeMirrorWidgetImport from 'src/components/widgets/lively-code-mirror-widget-import.js';\nimport LivelyCodeMirrorCodeProvider from 'src/components/widgets/lively-code-mirror-code-provider.js';\nimport openMenu from 'src/components/widgets/lively-code-mirror-context-menu.js';\nimport * as spellCheck from \"src/external/codemirror-spellcheck.js\";\nimport { isSet } from 'utils';\nimport fake from \"./lively-code-mirror-fake.js\";\nimport CodeMirror from \"src/external/code-mirror/lib/codemirror.js\";\nself.CodeMirror = CodeMirror; // for modules\nlet loadPromise = undefined;\nimport { loc, range } from 'utils';\nimport indentationWidth from 'src/components/widgets/indent.js';\nimport { DependencyGraph } from 'src/client/dependency-graph/graph.js';\nimport { DebuggingCache } from 'src/client/reactive/active-expression-rewriting/active-expression-rewriting.js';\nimport { AExprRegistry } from 'src/client/reactive/active-expression/active-expression.js';\nimport ContextMenu from 'src/client/contextmenu.js';\n\nimport _ from 'src/external/lodash/lodash.js';\n\nexport function stripErrorString(s) {\n  return s.toString().replace(/Error: workspace(js)?:[^:]*:/, \"Error:\").replace(/\\n {2}Evaluating workspace(js)?:.*/, \"\").replace(/\\n {2}Loading workspace(js)?:.*/, \"\").replace(/\\n {2}Instantiating workspace(js)?:.*/, \"\");\n}\n\nfunction posEq(a, b) {\n  return a.line == b.line && a.ch == b.ch;\n}\n\nexport default class LivelyCodeMirror extends HTMLElement {\n\n  fake(...args) {\n    fake(this.editor, ...args);\n  }\n\n  get mode() {\n    return this.getAttribute('mode');\n  }\n  set mode(val) {\n    return this.setAttribute('mode', val);\n  }\n\n  static get codeMirrorPath() {\n    return lively4url + \"/src/external/code-mirror/\";\n  }\n\n  static async loadModule(path, force) {\n    if (!self.CodeMirror) {\n      console.warn(\"CodeMirror is missing, could not initialize \" + path);\n      return;\n    }\n    var code = await fetch(this.codeMirrorPath + path).then(r => r.text());\n    try {\n      eval(code);\n    } catch (e) {\n      console.error(\"Could not load CodeMirror module \" + path, e);\n    }\n    // return lively.loadJavaScriptThroughDOM(\"codemirror_\"+path.replace(/[^A-Za-z]/g,\"\"),\n    //   this.codeMirrorPath + path, force)\n  }\n\n  static async loadCSS(path) {\n    return lively.loadCSSThroughDOM(\"codemirror_\" + path.replace(/[^A-Za-z]/g, \"\"), this.codeMirrorPath + path);\n  }\n\n  static async loadModules(force) {\n    // console.log(\"loadModules\", loadPromise);\n    if (loadPromise && !force) return loadPromise;\n    loadPromise = (async () => {\n\n      await this.loadModule(\"addon/fold/foldcode.js\");\n\n      await this.loadModule(\"mode/javascript/javascript.js\");\n      await this.loadModule(\"mode/xml/xml.js\");\n      await this.loadModule(\"mode/css/css.js\");\n      await this.loadModule(\"mode/diff/diff.js\");\n\n      await this.loadModule(\"mode/markdown/markdown.js\");\n      await this.loadModule(\"mode/htmlmixed/htmlmixed.js\");\n      await this.loadModule(\"addon/mode/overlay.js\");\n      await this.loadModule(\"mode/gfm/gfm.js\");\n      await this.loadModule(\"mode/stex/stex.js\");\n      await this.loadModule(\"mode/jsx/jsx.js\");\n      await this.loadModule(\"mode/python/python.js\");\n      await this.loadModule(\"mode/clike/clike.js\");\n      await this.loadModule(\"mode/shell/shell.js\");\n\n      await this.loadModule(\"addon/edit/matchbrackets.js\");\n      await this.loadModule(\"addon/edit/closetag.js\");\n      await this.loadModule(\"addon/edit/closebrackets.js\");\n      await this.loadModule(\"addon/edit/continuelist.js\");\n      await this.loadModule(\"addon/edit/matchtags.js\");\n      await this.loadModule(\"addon/edit/trailingspace.js\");\n      await this.loadModule(\"addon/hint/show-hint.js\");\n      await this.loadModule(\"addon/hint/javascript-hint.js\");\n      await this.loadModule(\"addon/search/searchcursor.js\");\n      await this.loadModule(\"addon/search/search.js\");\n      await this.loadModule(\"addon/search/jump-to-line.js\");\n      await this.loadModule(\"addon/search/matchesonscrollbar.js\");\n      await this.loadModule(\"addon/search/match-highlighter.js\");\n      await this.loadModule(\"addon/scroll/annotatescrollbar.js\");\n      await this.loadModule(\"addon/comment/comment.js\");\n      await this.loadModule(\"addon/dialog/dialog.js\");\n      await this.loadModule(\"addon/scroll/simplescrollbars.js\"\n\n      //await System.import(\"https://raw.githubusercontent.com/jshint/jshint/master/dist/jshint.js\");\n      //await lively.loadJavaScriptThroughDOM(\"jshintAjax\", \"https://ajax.aspnetcdn.com/ajax/jshint/r07/jshint.js\");\n      //await lively.loadJavaScriptThroughDOM(\"eslint\", \"http://eslint.org/js/app/eslint.js\");\n      );await this.loadModule(\"addon/lint/lint.js\");\n      await this.loadModule(\"addon/lint/javascript-lint.js\");\n      await this.loadModule(\"../eslint/eslint.js\");\n      // await this.loadModule(\"../eslint/eslint-lint.js\", force);\n      await System.import(lively4url + '/src/external/eslint/eslint-lint.js');\n      await this.loadModule(\"addon/merge/merge.js\");\n      await this.loadModule(\"addon/selection/mark-selection.js\");\n      await this.loadModule(\"keymap/sublime.js\");\n      await System.import(lively4url + '/src/components/widgets/lively-code-mirror-hint.js');\n\n      this.loadCSS(\"addon/hint/show-hint.css\");\n      this.loadCSS(\"addon/lint/lint.css\");\n      lively.loadCSSThroughDOM(\"CodeMirrorCSS\", lively4url + \"/src/components/widgets/lively-code-mirror.css\");\n    })();\n    return loadPromise;\n  }\n\n  // #TODO #Refactor not needed anymore\n  static async loadTernModules() {\n    if (this.ternIsLoaded) return;\n\n    await this.loadModule(\"addon/tern/tern.js\");\n\n    var terndir = lively4url + '/src/external/tern/';\n    await lively.loadJavaScriptThroughDOM(\"tern_acorn\", terndir + 'acorn.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_acorn_loose\", terndir + 'acorn_loose.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_walk\", terndir + 'walk.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_polyfill\", terndir + 'polyfill.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_signal\", terndir + 'signal.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_tern\", terndir + 'tern.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_def\", terndir + 'def.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_comment\", terndir + 'comment.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_infer\", terndir + 'infer.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_plugin_modules\", terndir + 'modules.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_plugin_esmodules\", terndir + 'es_modules.js');\n    this.ternIsLoaded = true;\n  }\n\n  astCapabilities(cm) {\n    return System.import('src/components/widgets/ast-capabilities.js').then(m => {\n      if (!this.myASTCapabilities || !(this.myASTCapabilities instanceof m.default)) {\n        const codeProvider = new LivelyCodeMirrorCodeProvider(this, cm);\n        this.myASTCapabilities = new m.default(codeProvider);\n      }\n\n      return this.myASTCapabilities;\n    });\n  }\n\n  autoCompletion(cm) {\n    return System.import('src/components/widgets/auto-completion.js').then(m => new m.default(this, cm));\n  }\n\n  get ternWrapper() {\n    return System.import('src/components/widgets/tern-wrapper.js').then(m => {\n      this.ternLoaded = true;\n      return m.TernCodeMirrorWrapper;\n    });\n  }\n\n  initialize() {\n    this._attrObserver = new MutationObserver(mutations => {\n      mutations.forEach(mutation => {\n        if (mutation.type == \"attributes\") {\n          // console.log(\"observation\", mutation.attributeName,mutation.target.getAttribute(mutation.attributeName));\n          this.attributeChangedCallback(mutation.attributeName, mutation.oldValue, mutation.target.getAttribute(mutation.attributeName));\n        }\n      });\n    });\n    this._attrObserver.observe(this, { attributes: true });\n  }\n\n  applyAttribute(attr) {\n    var value = this.getAttribute(attr);\n    if (value !== undefined) {\n      this.setAttribute(attr, value);\n    }\n  }\n\n  async attachedCallback() {\n    if (this.isLoading || this.editor) return;\n    this.isLoading = true;\n    this.root = this.shadowRoot; // used in code mirror to find current element\n    await LivelyCodeMirror.loadModules(); // lazy load modules...\n\n    if (this.textContent) {\n      var value = this.decodeHTML(this.textContent);\n    } else {\n      value = this.value || \"\";\n    }\n    this.editView(value);\n    this.isLoading = false;\n    // console.log(\"[editor] #dispatch editor-loaded\")\n    var event = new CustomEvent(\"editor-loaded\");\n    // event.stopPropagation();\n    this.dispatchEvent(event);\n    this[\"editor-loaded\"] = true; // event can sometimes already be fired\n\n    await lively.sleep(0);\n    this.editor.refresh();\n    this.updateAExprDependencies();\n  }\n\n  async editorLoaded() {\n    if (!this[\"editor-loaded\"]) {\n      return promisedEvent(this, \"editor-loaded\");\n    }\n  }\n\n  editView(value) {\n    if (!value) value = this.value || \"\";\n    var container = this.shadowRoot.querySelector(\"#code-mirror-container\");\n    container.innerHTML = \"\";\n    this.setEditor(CodeMirror(container, {\n      value: value,\n      lineNumbers: true,\n      gutters: [\"leftgutter\", \"CodeMirror-linenumbers\", \"rightgutter\", \"CodeMirror-lint-markers\"],\n      lint: true\n    }));\n\n    //load astCapabilities\n    this.astCapabilities(this.editor);\n  }\n\n  setEditor(editor) {\n    this.editor = editor;\n    this.setupEditor();\n  }\n\n  setupEditor() {\n    var editor = this.editor;\n    if (this.mode) {\n      editor.setOption(\"mode\", this.mode);\n    }\n    this.setupEditorOptions(editor\n    // edit addons\n    // editor.setOption(\"showTrailingSpace\", true)\n    // editor.setOption(\"matchTags\", true)\n\n    );editor.on(\"change\", evt => this.dispatchEvent(new CustomEvent(\"change\", { detail: evt })));\n    editor.on(\"change\", (() => this.checkSyntax()).debounce(500));\n    editor.on(\"change\", (() => this.astCapabilities(editor).then(ac => ac.codeChanged())).debounce(200));\n\n    editor.on(\"cursorActivity\", (() => this.onCursorActivity()).debounce(500));\n\n    // apply attributes\n    _.map(this.attributes, ea => ea.name).forEach(ea => this.applyAttribute(ea));\n\n    // if(Preferences.get('UseTernInCodeMirror')) {\n    //   this.enableTern();\n    // }\n    editor.on(\"keydown\", (...args) => this.keyEvent(...args));\n  }\n\n  keyEvent(cm, evt) {\n\n    if (this.classList.contains('ast-mode') && !evt.repeat) {\n      function unifiedKeyDescription(e) {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      }\n      const operations = {\n        Escape: () => {\n          this.classList.remove('ast-mode');\n        },\n        i: () => {\n          this.astCapabilities(cm).then(ac => ac.inlineLocalVariable());\n        }\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        evt.preventDefault();\n        evt.codemirrorIgnore = true;\n\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this, cm, evt]);\n      }\n    }\n  }\n\n  clearHistory() {\n    var cm = this.editor;\n    cm.getDoc().clearHistory();\n  }\n\n  addKeys(keymap) {\n    var keys = this.ensureExtraKeys();\n    this.extraKeys = Object.assign(keys, keymap);\n  }\n\n  ensureExtraKeys() {\n    if (!this.extraKeys) {\n      const keys = '1234567890qwertyuiopasdf hjk zxcvbnm'.replace(/\\s/, '').split('').map(c => c.upperCase());\n      //       const defaultASTHandlers = _.fromPairs(keys.flatMap(c => {\n      //         return ['Alt-', 'Ctrl-Alt-', 'Shift-Alt-'].map(shortcut => {\n      //           const shortcutC = shortcut + c;\n      //           const prop = shortcutC.camelCase();\n\n      //           return [shortcutC, cm => {\n      //             this.astCapabilities(cm).then(ac => {\n      //               if (ac[prop]) {\n      //                 ac[prop]();\n      //               } else {\n      //                 lively.notify(shortcutC, 'No Shortcut defined yet.');\n      //               }\n      //             });\n      //           }];\n      //         });\n      //       }));\n      const defaultASTHandlers = {};\n\n      this.extraKeys = Object.assign(defaultASTHandlers, {\n\n        // #KeyboardShortcut Alt-9 slurp backward\n        \"Alt-9\": cm => this.astCapabilities(cm).then(ac => ac.slurp(false)),\n        // #KeyboardShortcut Alt-0 slurp forward\n        \"Alt-0\": cm => this.astCapabilities(cm).then(ac => ac.slurp(true)),\n        // #KeyboardShortcut Alt-[ barf backward\n        \"Alt-[\": cm => this.astCapabilities(cm).then(ac => ac.barf(false)),\n        // #KeyboardShortcut Alt-] barf forward\n        \"Alt-]\": cm => this.astCapabilities(cm).then(ac => ac.barf(true)),\n\n        // #KeyboardShortcut Alt-X shortcut for experimental features\n        \"Alt-X\": cm => this.astCapabilities(cm).then(ac => ac.braveNewWorld()),\n        // #KeyboardShortcut Alt-B Alt-N wrap selection in lively notify\n        \"Alt-B Alt-N\": cm => this.astCapabilities(cm).then(ac => ac.livelyNotify()),\n        // #KeyboardShortcut Alt-B Alt-U insert lively4url\n        \"Alt-B Alt-U\": cm => this.astCapabilities(cm).then(ac => ac.lively4url()),\n        // #KeyboardShortcut Alt-N negate an expression\n        \"Alt-N\": cm => this.astCapabilities(cm).then(ac => ac.negateExpression()),\n        // #KeyboardShortcut Alt-U Replace parent node with selection\n        \"Alt-U\": cm => this.astCapabilities(cm).then(ac => ac.replaceParentWithSelection()),\n        // #KeyboardShortcut Alt-O Insert new line below\n        \"Alt-O\": cm => this.astCapabilities(cm).then(ac => ac.newlineAndIndent(true)),\n        // #KeyboardShortcut Shift-Alt-O Insert new line above\n        \"Shift-Alt-O\": cm => this.astCapabilities(cm).then(ac => ac.newlineAndIndent(false)),\n\n        // #KeyboardShortcut Alt-S Swap then and else block of a conditional\n        \"Alt-S\": cm => this.astCapabilities(cm).then(ac => ac.swapConditional()),\n        // #TODO: generate code with Alt-G Alt-_\n        \"Alt-G Alt-I\": cm => this.astCapabilities(cm).then(ac => ac.generateIf('condition')),\n        \"Ctrl-Alt-G Ctrl-Alt-I\": cm => this.astCapabilities(cm).then(ac => ac.generateIf('then')),\n        \"Shift-Alt-G Alt-I\": cm => this.astCapabilities(cm).then(ac => ac.generateIf('else')),\n\n        // #KeyboardShortcut Alt-/ insert markdown comment\n        \"Alt-/\": cm => this.astCapabilities(cm).then(ac => ac.insertMarkdownComment('condition')),\n\n        // #KeyboardShortcut Alt-M ast refactoring/autocomplete menu\n        \"Alt-M\": cm => {\n          if (this.isJavaScript) {\n            this.openContextMenu(cm);\n          } else {\n            lively.warn(\"Context Menu doesn't work outside of js files for now!\");\n          }\n        },\n\n        \"Insert\": cm => {\n          // do nothing... the INSERT mode is so often activated by accident \n        },\n        \"Ctrl-Insert\": cm => {\n          // INSERT mode is so often activated by accident, require CTRL now \n          cm.toggleOverwrite();\n        },\n        // #KeyboardShortcut Ctrl-H search and replace\n        \"Ctrl-H\": cm => {\n          setTimeout(() => {\n            this.editor.execCommand(\"replace\");\n            this.shadowRoot.querySelector(\".CodeMirror-search-field\").focus();\n          }, 10);\n        },\n        // #KeyboardShortcut Ctrl-Space auto complete\n        \"Ctrl-Space\": cm => {\n          this.fixHintsPosition();\n          cm.execCommand(\"autocomplete\");\n        },\n        // #KeyboardShortcut Ctrl-Alt-Space auto complete\n        \"Ctrl-Alt-Space\": cm => {\n          this.fixHintsPosition();\n          cm.execCommand(\"autocomplete\");\n        },\n        // #KeyboardShortcut Ctrl-P eval and print selection or line\n        \"Ctrl-P\": cm => {\n          let text = this.getSelectionOrLine();\n          this.tryBoundEval(text, true);\n        },\n        // #KeyboardShortcut Ctrl-I eval and inspect selection or line\n        \"Ctrl-I\": cm => {\n          let text = this.getSelectionOrLine();\n          this.inspectIt(text);\n        },\n        // #KeyboardShortcut Ctrl-D eval selection or line (do it)\n        \"Ctrl-D\": (cm, b, c) => {\n          let text = this.getSelectionOrLine();\n          this.tryBoundEval(text, false);\n          return true;\n        },\n        // #KeyboardShortcut Ctrl-F search\n        \"Ctrl-F\": cm => {\n          // something immediately grabs the \"focus\" and we close the search dialog..\n          // #Hack...\n          setTimeout(() => {\n            this.editor.execCommand(\"findPersistent\");\n            var searchField = this.shadowRoot.querySelector(\".CodeMirror-search-field\");\n            if (searchField) {\n              // start with the last search..\n              if (!searchField.value && this.lastSearch) {\n                var oldSearch = searchField.value\n                searchField.value =  this.lastSearch\n              } else {\n                this.lastSearch = searchField.value // we got a new search\n              }\n              lively.addEventListener(\"lively4\", searchField, \"input\", () => {\n                this.lastSearch =  searchField.value\n              })\n              searchField.focus();\n              searchField.select();\n            }\n          }, 10\n          // editor.execCommand(\"find\")\n          );\n        },\n\n        // #KeyboardShortcut Ctrl-Alt-Right multiselect next\n        \"Ctrl-Alt-Right\": \"selectNextOccurrence\",\n        // #KeyboardShortcut Ctrl-Alt-Left undo multiselect\n        \"Ctrl-Alt-Left\": \"undoSelection\",\n\n        // #KeyboardShortcut Ctrl-/ indent selection\n        \"Ctrl-/\": \"toggleCommentIndented\",\n        // #KeyboardShortcut Ctrl-# indent selection\n        \"Ctrl-#\": \"toggleCommentIndented\",\n        // #KeyboardShortcut Tab insert tab or soft indent\n        'Tab': cm => {\n          if (cm.somethingSelected()) {\n            cm.indentSelection(\"add\");\n          } else {\n            cm.execCommand('insertSoftTab');\n          }\n        },\n        // #KeyboardShortcut Ctrl-S save content\n        \"Ctrl-S\": cm => {\n          this.doSave(cm.getValue());\n        },\n        // #KeyboardShortcut Ctrl-Alt-V eval and open in vivide\n        \"Ctrl-Alt-V\": async cm => {\n          let text = this.getSelectionOrLine();\n          let result = await this.tryBoundEval(text, false);\n          letsScript(result);\n        },\n        // #KeyboardShortcut Ctrl-Alt-I show type using tern\n        \"Ctrl-Alt-I\": cm => {\n          this.ternWrapper.then(tw => tw.showType(cm, this));\n        },\n        // #KeyboardShortcut Alt-. jump to definition using tern\n        \"Alt-.\": cm => {\n          lively.notify(\"try to JUMP TO DEFINITION\");\n          this.ternWrapper.then(tw => tw.jumpToDefinition(cm, this));\n        },\n        // #KeyboardShortcut Alt-, jump back from definition using tern\n        \"Alt-,\": cm => {\n          this.ternWrapper.then(tw => tw.jumpBack(cm, this));\n        },\n        // #KeyboardShortcut Shift-Alt-. show references using tern\n        \"Shift-Alt-.\": cm => {\n          this.ternWrapper.then(tw => tw.showReferences(cm, this));\n        },\n\n        /*MD #AST-Navigation MD*/\n\n        // #KeyboardShortcut Alt-Up Expand selection in ast-aware manner\n        \"Alt-Up\": cm => {\n          this.astCapabilities(cm).then(ac => ac.expandSelection(cm));\n        },\n        // #KeyboardShortcut Alt-Down Reduce selection in ast-aware manner\n        \"Alt-Down\": cm => {\n          this.astCapabilities(cm).then(ac => ac.reduceSelection(cm));\n        },\n        // #KeyboardShortcut Alt-Shift-Up Select previous like this\n        \"Shift-Alt-Up\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextASTNodeLikeThis(true));\n        },\n        // #KeyboardShortcut Alt-Shift-Down Select next like this\n        \"Shift-Alt-Down\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextASTNodeLikeThis(false));\n        },\n\n        // #KeyboardShortcut Alt-Left Select previous element in ast-aware manner\n        \"Alt-Left\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextASTChild(true));\n        },\n        // #KeyboardShortcut Alt-Right Select next element in ast-aware manner\n        \"Alt-Right\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextASTChild(false));\n        },\n        // #KeyboardShortcut Alt-Shift-Left Select previous reference\n        \"Shift-Alt-Left\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextReference(true));\n        },\n        // #KeyboardShortcut Alt-Shift-Right Select next reference\n        \"Shift-Alt-Right\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextReference(false));\n        },\n\n        // #KeyboardShortcut Alt-J Jump to declaration of this identifier\n        \"Alt-J\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectDeclaration());\n        },\n        // #KeyboardShortcut Alt-R Rename this identifier\n        \"Alt-R\": cm => {\n          this.astCapabilities(cm).then(ac => ac.rename());\n        },\n        // #KeyboardShortcut Alt-Enter Toggle AST Mode\n        \"Alt-Enter\": cm => {\n          this.classList.toggle('ast-mode');\n        },\n        // #KeyboardShortcut Alt-I Inline variable\n        \"Alt-I\": cm => {\n          this.astCapabilities(cm).then(ac => ac.inlineLocalVariable());\n        },\n        // #KeyboardShortcut Alt-E Extract Expression into a local variable\n        \"Alt-E\": cm => {\n          this.astCapabilities(cm).then(ac => ac.extractExpressionIntoLocalVariable());\n        },\n\n        // #KeyboardShortcut Alt-Backspace Leave Editor and go to Navigation\n        \"alt-Backspace\": async cm => {\n          this.singalEditorbackNavigation();\n        },\n        // #KeyboardShortcut Shift-Alt-Backspace Leave and Close Editor and go to Navigation\n        \"shift-alt-Backspace\": async cm => {\n          this.singalEditorbackNavigation(true);\n        },\n        // #KeyboardShortcut Shift-Alt-A show additional info of this Active Expression\n        \"Shift-Alt-A\": async cm => {\n          this.showAExprDependencyTextMarkers();\n        },\n        // #Async #Workspace #Snippet #Workaround missing global async/await support in JavaScript / our Workspaces\n        \"Ctrl-Alt-A\": cm => {\n          var selection = this.editor.getSelection\n          // #TODO how can we have custom snippets?\n          ();this.editor.replaceSelection(`var value;\n(async () => {\n  value = ${selection}\n})()`);\n          this.editor.execCommand(`goWordLeft`);\n          this.editor.execCommand(`goCharLeft`);\n        },\n        // #KeyboardShortcut Ctrl-Shift-A Update Active Expression Dependencies\n        \"Ctrl-Shift-A\": cm => {\n          this.updateAExprDependencies();\n        },\n\n        // #KeyboardShortcut Alt-Q sample shortcut for auto-completion\n        \"Alt-Q\": cm => {\n          this.autoCompletion(cm).then(ac => ac.complete(this, cm));\n        }\n\n      });\n    }\n\n    return this.extraKeys;\n  }\n\n  openContextMenu(cm) {\n    this.astCapabilities(cm).then(ac => {\n      openMenu(ac, cm, this);\n    });\n  }\n\n  async singalEditorbackNavigation(closeEditor) {\n    var container = lively.query(this, \"lively-container\");\n    if (container) {\n      if (closeEditor) await container.onCancel();\n      await lively.sleep(10\n      // it seems not to bubble across shadow root boundaries #Bug ?\n      // so we do it manually, but keep it an event\n      );container.dispatchEvent(new CustomEvent(\"editorbacknavigation\", {\n        bubbles: true,\n        cancelable: true\n      }));\n    }\n  }\n\n  registerExtraKeys(options) {\n    if (options) this.addKeys(options);\n    var keys = {};\n    keys = Object.assign(keys, CodeMirror.keyMap.sublime);\n    keys = Object.assign(keys, this.ensureExtraKeys());\n    this.editor.setOption(\"extraKeys\", CodeMirror.normalizeKeyMap(keys));\n  }\n\n  setupEditorOptions(editor) {\n    editor.setOption(\"matchBrackets\", true);\n    editor.setOption(\"styleSelectedText\", true);\n    editor.setOption(\"autoCloseBrackets\", true);\n    editor.setOption(\"autoCloseTags\", true);\n    editor.setOption(\"scrollbarStyle\", \"simple\");\n    editor.setOption(\"scrollbarStyle\", \"simple\");\n\n    editor.setOption(\"tabSize\", indentationWidth());\n    editor.setOption(\"indentWithTabs\", false);\n    editor.setOption(\"indentUnit\", indentationWidth());\n\n    editor.setOption(\"highlightSelectionMatches\", { showToken: /\\w/, annotateScrollbar: true\n\n      // editor.setOption(\"keyMap\",  \"sublime\")\n\n    });editor.on(\"cursorActivity\", cm => {\n      if (this.ternLoaded) {\n        this.ternWrapper.then(tw => tw.updateArgHints(cm, this));\n      }\n    });\n\n    // http://bl.ocks.org/jasongrout/5378313#fiddle.js\n    editor.on(\"cursorActivity\", cm => {\n      // this.ternWrapper.then(tw => tw.updateArgHints(cm, this));\n      const widgetEnter = cm.widgetEnter;\n      cm.widgetEnter = undefined;\n      if (widgetEnter) {\n        // check to see if movement is purely navigational, or if it\n        // doing something like extending selection\n        var cursorHead = cm.getCursor('head');\n        var cursorAnchor = cm.getCursor('anchor');\n        if (posEq(cursorHead, cursorAnchor)) {\n          widgetEnter();\n        }\n      }\n    });\n    editor.setOption(\"hintOptions\", {\n      container: this.shadowRoot.querySelector(\"#code-mirror-hints\"),\n      codemirror: this,\n      closeCharacters: /\\;/ // we want to keep the hint open when typing spaces and \"{\" in imports...\n    });\n\n    this.registerExtraKeys();\n  }\n\n  // Fires when an attribute was added, removed, or updated\n  attributeChangedCallback(attr, oldVal, newVal) {\n    if (!this.editor) {\n      return false;\n    }\n    switch (attr) {\n      // case \"theme\":\n      //     this.editor.setTheme( newVal );\n      //     break;\n      case \"mode\":\n        this.editor.setOption('mode', newVal);\n        break;\n      // case \"fontsize\":\n      //     this.editor.setFontSize( newVal );\n      //     break;\n      // case \"softtabs\":\n      //     this.editor.getSession().setUseSoftTabs( newVal );\n      //     break;\n      // case \"tern\":\n      //   if (newVal)\n      // this.enableTern()\n      //   break;\n\n      case \"tabsize\":\n        this.setOption(\"tabSize\", newVal);\n        break;\n      // case \"readonly\":\n      //     this.editor.setReadOnly( newVal );\n      //     break;\n      case \"wrapmode\":\n        this.setOption(\"lineWrapping\", newVal);\n        break;\n    }\n  }\n\n  setOption(name, value) {\n    if (!this.editor) return; // we loose...\n    this.editor.setOption(name, value);\n  }\n\n  doSave(text) {\n    this.tryBoundEval(text // just a default implementation...\n    );\n  }\n\n  getSelectionOrLine() {\n    var text = this.editor.getSelection();\n    if (text.length > 0) return text;else return this.editor.getLine(this.editor.getCursor(\"end\").line);\n  }\n\n  getDoitContext() {\n    return this.doitContext;\n  }\n\n  setDoitContext(context) {\n    return this.doitContext = context;\n  }\n\n  getTargetModule() {\n    // lazily initialize a target module name as fallback\n    return this.targetModule || (this.targetModule = lively4url + '/unnamed_module_' + generateUUID().replace(/-/g, '_')); // make it relative to a real path so that relative modules work\n  }\n\n  setTargetModule(module) {\n    return this.targetModule = module;\n  }\n\n  async boundEval(str) {\n    // console.log(\"bound eval \" + str)\n    var targetModule = this.getTargetModule();\n\n    if (targetModule.match(/.py$/)) {\n      return this.boundEvalPython(str);\n    }\n    // Ensure target module loaded (for .js files only)\n    if (targetModule.match(/.js$/)) {\n      await System.import(targetModule);\n    }\n    console.log(\"EVAL (CM)\", targetModule);\n    // src, topLevelVariables, thisReference, <- finalStatement\n    return boundEval(str, this.getDoitContext(), targetModule);\n  }\n\n  async boundEvalPython(str) {\n    var result = \"\";\n    var xterm = document.querySelector(\"lively-xterm.python\");\n    if (xterm) {\n      var term = xterm.term;\n      term.__socket.addEventListener('message', function (event) {\n        result += event.data;\n      });\n      // how long do we want to wait?\n\n      term.__sendData(str + \"\\n\");\n\n      while (!result.match(\">>>\")) {\n        // busy wait for the prompt\n        await lively.sleep(50);\n      }\n      // strip input and prompt.... oh what a hack\n      return { value: result.replace(str, \"\").replace(/^[\\r\\n]+/, \"\").replace(/>>> $/, \"\") };\n    } else {\n      lively.notify(\"no open python terminal session found\");\n    }\n    return { value: \"\" };\n  }\n\n  printWidget(name) {\n    return this.wrapWidget(name, this.editor.getCursor(true), this.editor.getCursor(false));\n  }\n\n  wrapWidget(name, from, to, options) {\n    var widget = document.createElement(\"span\");\n    widget.classList.add(\"lively-widget\");\n    widget.style.whiteSpace = \"normal\";\n    var promise = lively.create(name, widget);\n    promise.then(comp => {\n      Object.assign(comp.style, {\n        display: \"inline\",\n        // backgroundColor: \"rgb(250,250,250)\",\n        display: \"inline-block\",\n        minWidth: \"20px\",\n        minHeight: \"20px\"\n      });\n    });\n    // #TODO, we assume that it will keep the first widget, and further replacements do not work.... and get therefore thrown away\n    var marker = this.editor.doc.markText(from, to, Object.assign({\n      replacedWith: widget\n    }, options));\n    promise.then(comp => comp.marker = marker);\n\n    return promise;\n  }\n\n  async printResult(result, obj, isPromise) {\n    var editor = this.editor;\n    var text = result;\n    var isAsync = false;\n    this.editor.setCursor(this.editor.getCursor(\"end\"\n    // don't replace existing selection\n    ));this.editor.replaceSelection(result, \"around\");\n    if (obj && obj.__asyncresult__) {\n      obj = obj.__asyncresult__; // should be handled in bound-eval.js #TODO\n      isAsync = true;\n    }\n    var promisedWidget;\n    var objClass = obj && obj.constructor && obj.constructor.name || typeof obj;\n    if (isSet.call(obj)) {\n      obj = Array.from(obj);\n    }\n\n    if (_.isMap(obj)) {\n      var mapObj = {};\n      Array.from(obj.keys()).sort().forEach(key => mapObj[key] = obj.get(key));\n      obj = mapObj;\n    }\n    if (Array.isArray(obj) && !obj.every(ea => ea instanceof Node)) {\n      if (obj.every(ea => typeof ea == 'object' && !(ea instanceof String))) {\n        promisedWidget = this.printWidget(\"lively-table\").then(table => {\n          table.setFromJSO(obj);\n          table.style.maxHeight = \"300px\";\n          table.style.overflow = \"auto\";\n          return table;\n        });\n      } else {\n        promisedWidget = this.printWidget(\"lively-table\").then(table => {\n          table.setFromJSO(obj.map((ea, index) => {\n            return {\n              index: index,\n              value: this.ensuredPrintString(ea)\n            };\n          }));\n          table.style.maxHeight = \"300px\";\n          table.style.overflow = \"auto\";\n          return table;\n        });\n      }\n    } else if (objClass == \"Matrix\") {\n      // obj = obj.toString()\n      debugger;\n    } else if (typeof obj == 'object' && obj !== null) {\n      promisedWidget = this.printWidget(\"lively-inspector\").then(inspector => {\n        inspector.inspect(obj);\n        inspector.hideWorkspace();\n        return inspector;\n      });\n    }\n    if (promisedWidget) {\n      var widget = await promisedWidget;\n      var span = <span style=\"border-top:2px solid darkgray;color:darkblue\">\n          {isPromise ? \"PROMISED\" : \"\"} <u>:{objClass}</u> </span>;\n      widget.parentElement.insertBefore(span, widget);\n      span.appendChild(widget);\n      if (isAsync && promisedWidget) {\n        if (widget) widget.style.border = \"2px dashed blue\";\n      }\n    }\n  }\n\n  ensuredPrintString(obj) {\n    var s = \"\";\n    try {\n      s += obj; // #HACK some objects cannot be printed any more\n    } catch (e) {\n      s += `UnprintableObject[Error: ${e}]`; // so we print something else\n    }\n    return s;\n  }\n\n  async tryBoundEval(str, printResult) {\n    var resp = await this.boundEval(str);\n    if (resp.isError) {\n      var e = resp.value;\n      console.error(e);\n      if (printResult) {\n        window.LastError = e;\n        this.printResult(stripErrorString(\"\" + e));\n      } else {\n        lively.handleError(e);\n      }\n      return e;\n    }\n    var result = resp.value;\n\n    if (printResult) {\n      // alaways wait on promises.. when interactively working...\n      if (result && result.then) {\n        //  && result instanceof Promise\n        // we will definitly return a promise on which we can wait here\n        result.then(result => {\n          this.printResult(\"RESOLVED: \" + this.ensuredPrintString(result), result, true);\n        }).catch(error => {\n          console.error(error);\n          // window.LastError = error;\n          this.printResult(stripErrorString(\"Error in Promise: \\n\" + error));\n        });\n      } else {\n        this.printResult(\" \" + this.ensuredPrintString(result), result);\n        if (result instanceof HTMLElement) {\n          try {\n            lively.showElement(result);\n          } catch (e) {\n            // silent fail... not everything can be shown...\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  async inspectIt(str) {\n    var result = await this.boundEval(str);\n    if (!result.isError) {\n      result = result.value;\n    }\n    if (result.then) {\n      result = await result; // wait on any promise\n    }\n    lively.openInspector(result, undefined, str);\n  }\n\n  doSave(text) {\n    this.tryBoundEval(text // just a default implementation...\n    );\n  }\n\n  detachedCallback() {\n    this._attached = false;\n  }\n\n  get value() {\n    if (this.editor) {\n      return this.editor.getValue();\n    } else {\n      return this._value;\n    }\n  }\n\n  set value(text) {\n    if (text === undefined) text = \"\";\n    if (this.editor) {\n      this.editor.setValue(text);\n    } else {\n      this._value = text;\n    }\n    lively.sleep(0).then(() => {\n      if (this.editor) this.editor.refresh();\n    });\n  }\n\n  setCustomStyle(source) {\n    this.shadowRoot.querySelector(\"#customStyle\").textContent = source;\n  }\n\n  getCustomStyle(source) {\n    return this.shadowRoot.querySelector(\"#customStyle\").textContent;\n  }\n\n  encodeHTML(s) {\n    return s.replace(\"&\", \"&amp;\").replace(\"<\", \"&lt;\");\n  }\n\n  decodeHTML(s) {\n    return s.replace(\"&lt;\", \"<\").replace(\"&amp;\", \"&\");\n  }\n\n  resize() {\n    // #ACE Component compatiblity\n  }\n\n  enableAutocompletion() {\n    // #ACE Component compatiblity\n  }\n\n  get isJavaScript() {\n    if (!this.editor) return false;\n    let mode = this.editor.getOption(\"mode\");\n    return mode === \"javascript\" || mode === 'text/jsx';\n  }\n\n  get isMarkdown() {\n    if (!this.editor) return false;\n    return this.editor.getOption(\"mode\") == \"gfm\";\n  }\n\n  get isHTML() {\n    if (!this.editor) return false;\n    return this.editor.getOption(\"mode\") == \"text/html\";\n  }\n\n  async changeModeForFile(filename) {\n    if (!this.editor) return;\n\n    var mode = \"text\";\n    // #TODO there must be some kind of automatching?\n    if (filename.match(/\\.html$/)) {\n      mode = \"text/html\";\n    } else if (filename.match(/\\.md$/)) {\n      mode = \"gfm\";\n    } else if (filename.match(/\\.tex$/)) {\n      mode = \"text/x-stex\";\n    } else if (filename.match(/\\.css$/)) {\n      mode = \"css\";\n    } else if (filename.match(/\\.xml$/)) {\n      mode = \"xml\";\n    } else if (filename.match(/\\.json$/)) {\n      mode = \"javascript\";\n    } else if (filename.match(/\\.js$/)) {\n      mode = \"text/jsx\";\n    } else if (filename.match(/\\.mjs$/)) {\n      mode = \"text/jsx\";\n    } else if (filename.match(/\\.py$/)) {\n      mode = \"text/x-python\";\n    } else if (filename.match(/\\.c$/)) {\n      mode = \"text/x-csrc\";\n    } else if (filename.match(/\\.cpp$/)) {\n      mode = \"text/x-c++src\";\n    } else if (filename.match(/\\.h$/)) {\n      mode = \"text/x-c++src\";\n    } else if (filename.match(/\\.sh$/)) {\n      mode = \"text/x-sh\";\n    }\n\n    this.mode = mode;\n    this.editor.setOption(\"mode\", mode);\n    if (mode == \"gfm\" || mode == \"text/x-stex\") {\n      // #TODO make language customizable\n      var m = this.value.match(/^.*lang\\:(.._..)/);\n      if (m) {\n        var lang = m[1];\n        var dict = await spellCheck.loadDictLang(lang);\n        if (dict) {\n          lively.notify(\"start spell checking lang: \" + lang);\n          spellCheck.startSpellCheck(this.editor, dict);\n        } else {\n          console.log(\"spellchecking language not found: \" + lang);\n        }\n      } else {\n        spellCheck.startSpellCheck(this.editor, (await spellCheck.current()));\n      }\n    }\n  }\n\n  livelyPrepareSave() {\n    if (!this.editor) {\n      return;\n    }\n    this.textContent = this.encodeHTML(this.editor.getValue());\n  }\n\n  livelyPreMigrate() {\n    if (this.editor) {\n      this.lastScrollInfo = this.editor.getScrollInfo(); // #Example #PreserveContext\n    }\n  }\n\n  focus() {\n    if (this.editor) this.editor.focus();\n  }\n\n  isFocused(doc) {\n    doc = doc || document;\n    if (doc.activeElement === this) return true;\n    // search recursively in shadowDoms\n    if (doc.activeElement && doc.activeElement.shadowRoot) {\n      return this.isFocused(doc.activeElement.shadowRoot);\n    }\n    return false;\n  }\n\n  async livelyMigrate(other) {\n    lively.addEventListener(\"Migrate\", this, \"editor-loaded\", evt => {\n      if (evt.composedPath()[0] !== this) return; // bubbled from another place... that is not me!\n      lively.removeEventListener(\"Migrate\", this, \"editor-loaded\" // make sure we migrate only once\n      );this.value = other.value;\n      if (other.lastScrollInfo) {\n        this.editor.scrollTo(other.lastScrollInfo.left, other.lastScrollInfo.top);\n      }\n    });\n  }\n\n  fixHintsPosition() {\n    lively.setPosition(this.shadowRoot.querySelector(\"#code-mirror-hints\"), pt(-document.scrollingElement.scrollLeft, -document.scrollingElement.scrollTop).subPt(lively.getGlobalPosition(this)));\n  }\n\n  //   async enableTern() {\n  //     await LivelyCodeMirror.loadTernModules()\n\n  //     var ecmascriptdefs = await fetch(lively4url + \"/src/external/tern/ecmascript.json\").then(r => r.json())\n  //     var browserdefs = await fetch(lively4url + \"/src/external/tern/browser.json\").then(r => r.json())\n  //     // var chaidefs = await fetch(lively4url + \"/src/external/tern/chai.json\").then(r => r.json())\n\n  //     // Options supported (all optional):\n  //     // * defs: An array of JSON definition data structures.\n  //     // * plugins: An object mapping plugin names to configuration\n  //     //   options.\n  //     // * getFile: A function(name, c) that can be used to access files in\n  //     //   the project that haven't been loaded yet. Simply do c(null) to\n  //     //   indicate that a file is not available.\n  //     // * fileFilter: A function(value, docName, doc) that will be applied\n  //     //   to documents before passing them on to Tern.\n  //     // * switchToDoc: A function(name, doc) that should, when providing a\n  //     //   multi-file view, switch the view or focus to the named file.\n  //     // * showError: A function(editor, message) that can be used to\n  //     //   override the way errors are displayed.\n  //     // * completionTip: Customize the content in tooltips for completions.\n  //     //   Is passed a single argument the completion's data as returned by\n  //     //   Tern and may return a string, DOM node, or null to indicate that\n  //     //   no tip should be shown. By default the docstring is shown.\n  //     // * typeTip: Like completionTip, but for the tooltips shown for type\n  //     //   queries.\n  //     // * responseFilter: A function(doc, query, request, error, data) that\n  //     //   will be applied to the Tern responses before treating them\n\n  //     // It is possible to run the Tern server in a web worker by specifying\n  //     // these additional options:\n  //     // * useWorker: Set to true to enable web worker mode. You'll probably\n  //     //   want to feature detect the actual value you use here, for example\n  //     //   !!window.Worker.\n  //     // * workerScript: The main script of the worker. Point this to\n  //     //   wherever you are hosting worker.js from this directory.\n  //     // * workerDeps: An array of paths pointing (relative to workerScript)\n  //     //   to the Acorn and Tern libraries and any Tern plugins you want to\n  //     //   load. Or, if you minified those into a single script and included\n  //     //   them in the workerScript, simply leave this undefined.\n\n  //     this.ternServer = new CodeMirror.TernServer({\n  //       defs: [ecmascriptdefs, browserdefs], // chaidefs\n  //       plugins: {\n  //         es_modules: {}\n  //       },\n  //       getFile: (name, c) => {\n  //         lively.notify(\"get file \" + name)\n  //         c(null)\n  //       },\n  //       // responseFilter: (doc, query, request, error, data) => {\n  //       //  return data\n  //       // }\n\n  //     });\n\n  //     this.editor.setOption(\"extraKeys\", Object.assign({},\n  //       this.editor.getOption(\"extraKeys\"),\n  //       {\n  //         \"Ctrl-Space\": (cm) => {\n  //           this.fixHintsPosition();\n  //           this.ternServer.complete(cm);\n  //         },\n  //         \"Ctrl-Alt-I\": (cm) => { this.ternServer.showType(cm); },\n  //         \"Ctrl-O\": (cm) => { this.ternServer.showDocs(cm); },\n  //         \"Alt-.\": (cm) => { this.ternServer.jumpToDef(cm); },\n  //         \"Alt-,\": (cm) => { this.ternServer.jumpBack(cm); },\n  //         \"Ctrl-Q\": (cm) => { this.ternServer.rename(cm); },\n  //         \"Ctrl-.\": (cm) => { this.ternServer.selectName(cm); }\n  //       }))\n\n  //     this.editor.on(\"cursorActivity\", (cm) => { this.ternServer.updateArgHints(cm); });\n  //   }\n\n\n  async addTernFile(name, url, text) {\n    if (!this.ternServer) return;\n    url = url || name;\n    text = text || (await fetch(url).then(r => r.text()));\n    this.ternServer.server.addFile(name, text);\n  }\n\n  mergeView(originalText, originalLeftText) {\n    var target = this.shadowRoot.querySelector(\"#code-mirror-container\");\n    target.innerHTML = \"\";\n    this._mergeView = CodeMirror.MergeView(target, {\n      value: this.value,\n      origLeft: originalLeftText,\n      orig: originalText,\n      lineNumbers: true,\n      mode: this.editor.getOption('mode'),\n      scrollbarStyle: this.editor.getOption('scrollbarStyle'),\n      highlightDifferences: true,\n      connect: \"align\",\n      lineWrapping: true,\n      collapseIdentical: false\n    });\n    // if (this._mergeView.right) {\n    // this.setEditor(this._mergeView.right.edit)\n    // }\n    this.setEditor(this._mergeView.editor\n    // this.resizeMergeView(this._mergeView)\n    ());\n  }\n\n  resizeMergeView(mergeView) {\n    function editorHeight(editor) {\n      if (!editor) return 0;\n      return editor.getScrollInfo().height;\n    }\n\n    function mergeViewHeight(mergeView) {\n      return Math.max(editorHeight(mergeView.leftOriginal()), editorHeight(mergeView.editor()), editorHeight(mergeView.rightOriginal()));\n    }\n    var height = mergeViewHeight(mergeView);\n    for (;;) {\n      if (mergeView.leftOriginal()) mergeView.leftOriginal().setSize(null, height);\n      mergeView.editor().setSize(null, height);\n      if (mergeView.rightOriginal()) mergeView.rightOriginal().setSize(null, height);\n\n      var newHeight = mergeViewHeight(mergeView);\n      if (newHeight >= height) break;else height = newHeight;\n    }\n    mergeView.wrap.style.height = height + \"px\";\n  }\n\n  async hideDataURLs() {\n    var regEx = new RegExp(\"[\\\"\\'](data:[^\\\"\\']*)[\\\"\\']\", \"g\");\n    do {\n      var m = regEx.exec(this.value);\n      if (m) {\n        var from = m.index;\n        var to = m.index + m[0].length;\n        await this.wrapWidget(\"span\", this.editor.posFromIndex(from), this.editor.posFromIndex(to)).then(div => {\n          div.style.backgroundColor = \"rgb(240,240,240)\";\n\n          if (m[1].match(/^data:image/)) {\n            var img = document.createElement(\"img\");\n            img.src = m[1];\n            img.title = m[1].slice(0, 50) + \"...\";\n            img.style.maxHeight = \"100px\";\n\n            div.appendChild(document.createTextNode(\"\\\"\"));\n            div.appendChild(img);\n            div.appendChild(document.createTextNode(\"\\\"\"));\n          } else {\n            div.innerHTML = \"\\\"\" + m[1].slice(0, 50) + \"...\" + \"\\\"\";\n          }\n        });\n      }\n    } while (m);\n  }\n\n  //    async wrapImageLinks() {\n  //     var regEx = new RegExp(\"\\!\\[\\]\\(([A-Za-z0-9_ .]\\.((jpg)|(png)))$\\)\", \"g\");\n  //     do {\n  //       var m = regEx.exec(this.value);\n  //       if (m) {\n  //         var from = m.index\n  //         var to = m.index + m[0].length\n  //         var url = m[1]\n  //         await this.wrapWidget(\"span\", this.editor.posFromIndex(from),\n  //                               this.editor.posFromIndex(to)).then( div => {\n  //           div.style.backgroundColor = \"rgb(240,240,240)\"\n\n  //           if (m[1].match(/^data:image/)) {\n  //             var img = document.createElement(\"img\")\n  //             img.src = m[1]\n  //             img.title = m[1].slice(0,50) + \"...\"\n  //             img.style.maxHeight = \"100px\"\n\n  //             div.appendChild(document.createTextNode(\"\\\"\"))\n  //             div.appendChild(img)\n  //             div.appendChild(document.createTextNode(\"\\\"\"))\n  //           } else {\n  //             div.innerHTML = \"\\\"\"+ m[1].slice(0,50) + \"...\" + \"\\\"\"\n  //           }\n  //         })\n\n  //       }\n  //     } while (m);\n  //   }\n\n\n  async wrapImports() {\n    // dev mode alternative to #DevLayers, a #S3Pattern: add code the scopes your dev example inline while developing\n    if (this.id !== 'spike') {\n      // lively.warn('skip because id is not spike')\n      return;\n    }\n    // lively.success('wrap imports in spike')\n\n    const getImportDeclarationRegex = () => {\n      const LiteralString = `([\"][^\"\\\\n\\\\r]*[\"]|['][^'\\\\n\\\\r]*['])`;\n      const JavaScriptIdentifier = '([a-zA-Z$_][a-zA-Z0-9$_]*)';\n\n      const ImportSpecifierPartSimple = `(${JavaScriptIdentifier})`;\n      const ImportSpecifierPartRename = `(${JavaScriptIdentifier}\\\\s+as\\\\s+${JavaScriptIdentifier})`;\n      const ImportSpecifierPart = `(${ImportSpecifierPartSimple}|${ImportSpecifierPartRename})`;\n      // ImportSpecifier: {foo} or {foo as bar}\n      const ImportSpecifier = `({\\\\s*((${ImportSpecifierPart}\\\\s*\\\\,\\\\s*)*${ImportSpecifierPart}\\\\,?)?\\\\s*})`;\n      // ImportDefaultSpecifier: foo\n      const ImportDefaultSpecifier = `(${JavaScriptIdentifier})`;\n      // ImportNamespaceSpecifier: * as foo\n      const ImportNamespaceSpecifier = `(\\\\*\\\\s*as\\\\s+${JavaScriptIdentifier})`;\n      const anySpecifier = `(${ImportSpecifier}|${ImportDefaultSpecifier}|${ImportNamespaceSpecifier})`;\n      // ImportDeclaration: import [any] from Literal\n      const ImportDeclaration = `import\\\\s*(${anySpecifier}\\\\s*\\\\,\\\\s*)*${anySpecifier}\\\\s*from\\\\s*${LiteralString}(\\\\s*\\\\;)?`;\n\n      return ImportDeclaration;\n    };\n\n    var regEx = new RegExp(getImportDeclarationRegex(), 'g');\n\n    do {\n      var m = regEx.exec(this.value);\n      if (m) {\n        await LivelyCodeMirrorWidgetImport.importWidgetForRange(this, m);\n      }\n    } while (m);\n  }\n\n  async wrapLinks() {\n    // dev mode\n    if (this !== window.that) {\n      return;\n    }\n    var regEx = new RegExp(\"\\<([a-zA-Z0-9]+\\:\\/\\/[^ ]+)\\>\", \"g\");\n    do {\n      var m = regEx.exec(this.value);\n      if (m) {\n        lively.warn(\"wrap link: \" + m[0]);\n        var from = m.index;\n        var to = m.index + m[0].length;\n        var link = m[1];\n        // #TODO check for an existing widget and reuse / update it...\n        await this.wrapWidget(\"span\", this.editor.posFromIndex(from), this.editor.posFromIndex(to)).then(widget => {\n          window.lastWidget = widget;\n\n          widget.style.backgroundColor = \"rgb(120,120, 240)\";\n          var input = <input></input>;\n          input.value = m[0];\n\n          lively.warn(\"new input \" + input);\n\n          input.addEventListener(\"keydown\", evt => {\n            var range = widget.marker.find();\n            if (evt.keyCode == 13) {\n              // ENTER\n              // #TODO how to replace // update text without replacing widgets\n              this.editor.replaceRange(input.value, range.from, range.to // @Stefan, your welcome! ;-)\n              );this.wrapLinks // don't wait and do what you can now\n              ();\n            }\n            if (evt.keyCode == 37) {\n              // Left\n              if (input.selectionStart == 0) {\n                this.editor.setSelection(range.from, range.from);\n                this.focus();\n              }\n            }\n\n            if (evt.keyCode == 39) {\n              // Right\n              if (input.selectionStart == input.value.length) {\n                this.editor.setSelection(range.to, range.to);\n                this.focus();\n              }\n            }\n          });\n\n          widget.appendChild(input\n          // widget.appendChild(<button click={e => {\n          //   lively.openBrowser(link)  // #TODO fix browse and open browser...\n          // }}>browse</button>)\n          );\n        });\n      }\n    } while (m);\n  }\n\n  checkSyntax() {\n    if (this.isJavaScript) {\n      SyntaxChecker.checkForSyntaxErrors(this.editor);\n      this.wrapImports();\n      this.wrapLinks();\n    }\n    if (this.isMarkdown || this.isHTML) {\n      this.hideDataURLs();\n    }\n  }\n\n  find(str) {\n    // #TODO this is horrible... Why is there not a standard method for this?\n    if (!this.editor) return;\n    var found = false;\n    this.value.split(\"\\n\").forEach((ea, index) => {\n      var startPos = ea.indexOf(str);\n      if (!found && startPos != -1) {\n        this.editor.setCursor(index + 20, 10000); // line end ;-)\n        this.editor.focus();\n        this.editor.setSelection({ line: index, ch: startPos }, { line: index, ch: startPos + str.length });\n        found = ea;\n      }\n    });\n  }\n\n  scrollToLine(line) {\n    this.editor.scrollTo(null, this.editor.heightAtLine(line - 1, \"local\"));\n  }\n\n  unsavedChanges() {\n    if (this.editor.getValue() === \"\") return false;\n    return true; // workspaces should be treated carefully\n  }\n\n  onCursorActivity() {\n    var container = lively.query(this, \"lively-container\");\n    if (!container) return;\n    var navbar = lively.query(this, \"lively-container-navbar\");\n    if (!navbar) return;\n    navbar.onDetailsContentCursorActivity(this.editor, this.editor.getCursor(\"start\"), this.editor.getCursor(\"end\"));\n  }\n\n  livelyMinimizedTitle() {\n    return this.value.slice(0, 80);\n  }\n\n  /*MD ## Active Expression Support MD*/\n\n  async dependencyGraph() {\n    return this._deps || (this._deps = new DependencyGraph((await this.astCapabilities(this.editor))));\n  }\n\n  async updateAExprDependencies() {\n    if(!this.isJavaScript || !lively.query(this, \"lively-container\")) return;\n    await this.editor;\n    /*const dependencyGraph = await this.dependencyGraph();\n    if (!dependencyGraph.capabilities.canParse || !dependencyGraph.hasActiveExpressionsDirective) {\n      this.hideAExprDependencyGutter();\n      this.resetAExprTextMarkers();\n      this.resetAExprDependencyTextMarkers();\n      return;\n    }*/\n    // this.showAExprTextMarkers();\n    await this.showAExprDependencyGutter();\n    \n    DebuggingCache.registerFileForAEDebugging(this.fileURL(), this, (triplets) => {   \n      this.allDependenciesByLine(triplets).then(([depToAE, AEToDep]) => {\n        this.editor.doc.clearGutter('activeExpressionGutter');\n        this.showAExprDependencyGutterMarkers(depToAE, false);\n        this.showAExprDependencyGutterMarkers(AEToDep, true);        \n      });\n    });\n  }\n\n  async showAExprTextMarkers() {\n    const editor = await this.editor;\n    await this.resetAExprTextMarkers();\n    const dependencyGraph = await this.dependencyGraph();\n    dependencyGraph.getAllActiveExpressions().forEach(path => {\n      const r = range(path.node.loc).asCM();\n      const mark = this.editor.markText(r[0], r[1], {\n        css: \"background-color: #3BEDED\"\n      });\n      mark.isAExprTextMarker = true;\n    });\n  }\n\n  async resetAExprTextMarkers() {\n    const editor = await this.editor;\n    editor.getAllMarks().forEach(mark => {\n      if (mark.isAExprTextMarker) {\n        mark.clear();\n      }\n    });\n  }\n\n  async showAExprDependencyGutter() {\n    const id = \"activeExpressionGutter\";\n    const editor = await this.editor;\n    let gutters = editor.getOption(\"gutters\");\n    if (!gutters.some(marker => marker === id)) {\n      editor.setOption('gutters', [...gutters, id]);\n    };\n  }\n\n  async hideAExprDependencyGutter() {\n    const id = \"activeExpressionGutter\";\n    const editor = await this.editor;\n    let gutters = editor.getOption(\"gutters\");\n    gutters = gutters.filter(marker => marker !== id);\n    editor.setOption('gutters', gutters);\n  }\n\n  async resetAExprDependencyTextMarkers() {\n    const editor = await this.editor;\n    editor.getAllMarks().forEach(mark => {\n      if (mark.isAExprDependencyTextMarker) {\n        mark.clear();\n      }\n    });\n  }\n\n  async showAExprDependencyTextMarkers() {\n    await this.editor;\n    await this.resetAExprDependencyTextMarkers();\n    const cursor = this.editor.getCursor();\n    const dependencyGraph = await this.dependencyGraph();\n    const aexprPath = dependencyGraph.getAexprAtCursor(cursor);\n    if (!aexprPath) return;\n    const deps = dependencyGraph.resolveDependencies(aexprPath.get(\"arguments\")[0]);\n    deps.forEach(path => {\n      const r = range(path.node.loc).asCM();\n      const mark = this.editor.markText(r[0], r[1], {\n        css: \"background-color: orange\"\n      });\n      mark.isAExprDependencyTextMarker = true;\n    });\n  }\n\n  async showAExprDependencyGutterMarkers(dependencyMap, isAE) {\n    await this.editor;\n\n    for (const [line, aExprs] of dependencyMap.entries()) {\n      this.drawAExprGutter(line, aExprs, isAE);\n    }\n  }\n\n  async allDependenciesByLine(depsMapInFile) {\n    const depToAE = new Map();\n    const AEToDep = new Map();\n\n    await this.editor;\n    /*const dependencyGraph = await this.dependencyGraph();\n    dependencyGraph.getAllActiveExpressions().forEach(path => {\n      const dependencies = dependencyGraph.resolveDependencies(path.get(\"arguments\")[0]);\n      const AELine = path.node.loc.start.line - 1;\n      if (!AEToDep.get(AELine)) {\n        AEToDep.set(AELine, []);\n      }\n\n      dependencies.forEach(statement => {\n        const depLine = statement.node.loc.start.line - 1;\n        if (!depToAE.get(depLine)) {\n          depToAE.set(depLine, []);\n        }\n        depToAE.get(depLine).push({ location: path.node.loc, source: path.get(\"arguments.0.body\").getSource(), events: 0 });\n        AEToDep.get(AELine).push({ location: statement.node.loc, source: statement.getSource(), events: 0 });\n      });\n    });*/\n\n    const handleDepAEPairing = (ae, dependencyLoc, dependencySource) => {\n      const dependencyLine = dependencyLoc.start.line - 1;\n      const dependencyFile = dependencyLoc.file;\n      const AELocation = ae.meta().get(\"location\");\n      const AELine = AELocation.start.line - 1;\n\n      var valueChangedEvents = ae.meta().get(\"events\").filter(event => event.type === \"changed value\");\n      const relatedEvents = valueChangedEvents.filter(event => event.value.trigger && dependencyFile.includes(event.value.trigger.file) && event.value.trigger.start.line - 1 === dependencyLine);\n\n      if (dependencyFile.includes(this.fileURL())) {\n        // Dependency is in this file\n        if (!depToAE.get(dependencyLine)) {\n          depToAE.set(dependencyLine, []);\n        }\n        // Group by AE to distinguish between mutltiple AE Objects in the same line?\n        depToAE.get(dependencyLine).push({ location: AELocation, source: ae.meta().get(\"sourceCode\"), events: relatedEvents.length, aes: new Set([ae]) });\n      }\n\n      if (AELocation.file.includes(this.fileURL())) {\n        // AE is in this file\n        if (!AEToDep.get(AELine)) {\n          AEToDep.set(AELine, []);\n        }\n        AEToDep.get(AELine).push({ location: dependencyLoc, source: dependencySource, events: relatedEvents.length, aes: new Set([ae]) });\n      }\n    };\n    \n    for (const { hook, dependency, ae } of depsMapInFile) {\n      const locations = await hook.getLocations();\n      for (const location of locations) {\n        handleDepAEPairing(ae, location, dependency.identifier);\n      }\n      /*const memberName = dependency.contextIdentifierValue()[1];\n      let deps = dependencyGraph.resolveDependenciesForMember(memberName);\n       deps.forEach(path => {\n        for (const ae of aes) {\n          handleDepAEPairing(ae, this.fileURL(), path.node.loc, path.getSource());\n        }\n      });*/\n    }\n    /*const aeMapInFile = getAETriplesForFile(this.fileURL());\n    for (const { hook, dependency, ae } of aeMapInFile) {\n      const dependencyInfo = dependency.contextIdentifierValue();\n      const locations = await hook.getLocations();\n      for (const location of locations) {\n        const start = { line: location.line, column: location.column };\n        handleDepAEPairing(ae, location.source, { start, end: start /*TODO: Find end*//*, file: location.source }, dependencyInfo[1]);\n      }\n    }*/\n\n    /*let dynamicAES = AExprRegistry.allAsArray();\n    dynamicAES.forEach(ae => {   \n      var valueChangedEvents = ae.meta().get(\"events\").filter(event => event.type === \"changed value\");\n      valueChangedEvents.forEach(event => {        \n        if(event.value.trigger.source.includes(this.fileURL())) {     \n          const line = event.value.trigger.line - 1;\n          if (!dict.get(line)) {\n            dict.set(line, []);\n          }\n          dict.get(line).push({ location: ae._annotations._annotations[0].location, source: ae._annotations._annotations[1].sourceCode });\n        }\n      });\n    });*/\n\n    return [depToAE, AEToDep];\n  }\n\n  fileURL() {\n    return lively.query(this, \"lively-container\").getURL().pathname;\n  }\n  \n  valid() {\n    return lively.allParents(this, [], true).includes(document.body);\n  }\n\n  drawAExprGutter(line, dependencies, isAE) {\n    this.editor.doc.setGutterMarker(line, 'activeExpressionGutter', this.drawAExprGutterMarker(dependencies, isAE));\n  }\n\n  faIcon(name, ...modifiers) {\n    return `<i class=\"fa fa-${name} ${modifiers.map(m => 'fa-' + m).join(' ')}\"></i>`;\n  }\n  \n  drawAExprGutterMarker(dependencies, isAE) {\n    //Use accumulate instead\n    const sorted = dependencies.sort((aDep, bDep) => {\n      const a = aDep.location;\n      const b = bDep.location;\n      if (a.file < b.file) {\n        return -1;\n      } else if (a.file > b.file) {\n        return 1;\n      }\n      if (a.start.line < b.start.line) {\n        return -1;\n      } else if (a.start.line > b.start.line) {\n        return 1;\n      }\n      return a.start.column - b.start.column;\n    });\n\n    const accumulated = [];\n\n    sorted.forEach(dep => {\n      //Location might differ due to one object having this file as source and the other not having a source\n      if (accumulated.length === 0 || !_.isEqual(accumulated[accumulated.length - 1].location.start, dep.location.start)) {\n        accumulated.push(dep);\n      } else {\n        const lastDep = accumulated[accumulated.length - 1];\n\n        lastDep.events += dep.events;\n        if(dep.source.length > lastDep.source.length) {\n          lastDep.source = dep.source;\n        }\n        if(dep.location.end.column > lastDep.location.end.column) {\n          lastDep.location.end = dep.location.end;\n        }\n        lastDep.aes = new Set([...lastDep.aes, ...dep.aes]);\n      }\n    });\n\n    const callback = async evt => {\n      const markerBounds = evt.target.getBoundingClientRect();\n      this.drawAExprDependencyList(accumulated, markerBounds);\n    };\n\n    return <div class={\"activeExpressionGutter-marker\" + (isAE ? \"-ae\" : \"-dep\")} click={callback}>\n      {isAE ? <b>AE</b> : <i class=\"fa fa-share-alt\"></i>}\n    </div>;\n  }\n\n  async drawAExprDependencyList(dependencies, markerBounds) {\n\n    const menuItems = [];\n    const allAEs = this.union(...dependencies.map(dep => dep.aes))\n    menuItems.push([\"open timeline\", () => {this.navigateToTimeline(allAEs)}, \"\", \"l\"]);\n\n    dependencies.forEach(dep => {\n      const source = dep.source;\n      const line = dep.location.start.line;\n      let description = `${line}: ${source}`;\n      let path = dep.location.file;\n      const inThisFile = !path || path.includes(this.fileURL());\n      if (inThisFile) {\n        description = 'line ' + description;\n      } else {\n        description = path.substring(path.lastIndexOf(\"/\") + 1) + \":\" + description;\n      }\n      menuItems.push([description, () => {\n        const start = { line: dep.location.start.line - 1, ch: dep.location.start.column };\n        const end = { line: dep.location.end.line - 1, ch: dep.location.end.column };\n        if (inThisFile) {\n          this.editor.setSelection(start, end);\n        } else {\n          lively.openBrowser(path, true, {start, end}, false, undefined, true);\n        }\n        menu.remove();\n      }, dep.events + \" event\" + (dep.events === 1 ? \"\" : \"s\") + \", \" + dep.aes.size + \" instance\" + (dep.aes.size === 1 ? \"\" : \"s\"), this.faIcon(inThisFile ? 'location-arrow' : 'file-code-o')]);\n    });\n\n    const menu = await ContextMenu.openIn(document.body, { clientX: markerBounds.left, clientY: markerBounds.bottom }, undefined, document.body, menuItems);\n    menu.addEventListener(\"DOMNodeRemoved\", () => {\n      this.focus();\n    });\n  }\n  \n  union(...iterables) {\n    const set = new Set();\n\n    for (const iterable of iterables) {\n      for (const item of iterable) {\n        set.add(item);\n      }\n    }\n\n    return set;\n  }\n  \n  async navigateToTimeline(aes) {\n    const existingTimelines = document.body.querySelectorAll('aexpr-timeline');\n    \n    if(existingTimelines.length > 0) {\n      const timeline = existingTimelines[0];\n      timeline.filterToAEs(aes);\n      timeline.parentElement.focus();\n      timeline.focus();\n      return;\n    }\n    \n    lively.openComponentInWindow(\"aexpr-timeline\").then((timeline) => {\n      timeline.filterToAEs(aes);\n      // TODO Filter\n    })\n  }\n}"]}