{"version":3,"sources":["https://lively-kernel.org/lively4/swt21-debugging/src/components/widgets/lively-window.js"],"names":["Morph","pt","Grid","Preferences","setPointToAttribute","getPointFromAttribute","element","attrX","attrY","x","getAttribute","y","parseFloat","p","setAttribute","Window","allWindows","Array","from","document","querySelectorAll","filter","ea","isWindow","title","val","minimizedWindowWidth","minimizedWindowPadding","active","hasAttribute","isFixed","titleSpan","get","target","childNodes","window","maxButton","windowTitle","minZIndex","tabbingTimeThreshold","tabBar","setExtent","extent","lively","dispatchEvent","CustomEvent","initialize","setup","created","render","isMinimized","isMaximized","displayResizeHandle","_attrObserver","MutationObserver","mutations","forEach","mutation","type","attributeChangedCallback","attributeName","oldValue","observe","attributes","setTabBar","formerTabs","attachedCallback","parentElement","body","classList","add","remove","attrName","newValue","reposition","bindEvents","addEventListener","evt","focus","onExtentChanged","onTitleMouseDown","onTitleDoubleClick","focusWithoutScroll","onMenuButtonClicked","onMinButtonClicked","onMaxButtonClicked","onDoubleClick","onCloseButtonClicked","onKeyUp","err","console","log","dragging","isFullscreen","style","display","contains","icon","content","value","slice","innerHTML","pos","getGlobalPosition","setPosition","addPt","getScroll","thisIdx","indexOf","allWindowsButThis","splice","sort","a","b","parseInt","win","index","removeAttribute","length","bringMinimizedWindowsToFront","getAddOnRoot","shadowRoot","querySelector","embedContentInParent","getPosition","appendChild","detachedCallback","overflow","toggleMaximize","maxButtonI","restoreExtentAndPosition","toggleMinimize","storeExtentAndPosition","position","top","left","width","height","bool","undefined","getAllSubmorphs","getExtent","pointerEvents","prevTitle","minTitle","livelyMinimizedTitle","titleExtent","togglePined","isPinned","shiftKey","scrollingElement","scrollTop","scrollLeft","moveBy","scaleBy","withY","innerHeight","stopPropagation","openContextMenu","preventDefault","positionBeforeMaximize","offsetWindow","getBoundingClientRect","pageX","pageY","draggingStart","isNaN","Error","clientX","clientY","removeEventListener","documentElement","onWindowMouseMove","onWindowMouseUp","saveTabsOnClose","unsavedChanges","askToCloseWindow","parentNode","removeChild","afterWindowClosed","Function","last","first","subPt","preferences","rememberWindowCollision","optSnapPosition","dropintoOtherWindow","createTabsWrapper","char","String","fromCharCode","keyCode","charCode","altKey","confirm","cursorX","cursorY","rect","plusSymbol","right","bottom","Date","now","addedTime","otherWindow","wrapper","windowOfWrapper","setGlobalPosition","addWindow","joinWithTabsWrapper","hidePlusSymbol","otherTW","thisTW","children","numberOfChildren","childrenCounter","child","addContent","existingWrapper","wrapperOfThisWindow","tabbableWin","allNonTabbedWindows","allCollidingWindows","cursorCollidesWith","self","lastCollidingWindow","reduce","prev","current","zIndexPrev","getComputedStyle","getPropertyValue","zIndexCurrent","showPlusSymbol","otherWinPos","otherWinX","otherWinY","otherWinWidth","otherWinHeight","offsetHeight","nodeName","otherWindowPosition","w","h","progressBar","animate","opacity","duration","setProperty","containsTabs","getTabsWrapper","tabsContents","eaWin","newTabBar","currTabBar","replaceChild","livelyMigrate","oldInstance"],"mappings":";;;;;;;;;;;;;;;;AAOOA,W;;AACEC,Q,wBAAAA,E;;AACAC,U,+BAAAA,I;;AACFC,iB;;;;;;;;;;;AASEC,8D;;;;;;;;;;;;;AANAC,gE;;;;;;;;;;;;;AANFL,gD;;;;;;;;;;;;;AACEC,6C;;;;;;;;;;;;;AACAC,+C;;;;;;;;;;;;;AACFC,sD;;;;;;;;;AAEP;AACA,eAASE,qBAAT,CAA+BC,OAA/B,EAAwCC,KAAxC,EAA+CC,KAA/C,EAAsD;AACpD,YAAIC,IAAIH,QAAQI,YAAR,CAAqBH,KAArB,CAAR;AACA,YAAII,IAAIL,QAAQI,YAAR,CAAqBF,KAArB,CAAR;AACA,eAAOP,GAAGW,WAAWH,CAAX,CAAH,EAAkBG,WAAWD,CAAX,CAAlB,CAAP;AACD;;AAED,eAASP,mBAAT,CAA6BE,OAA7B,EAAsCC,KAAtC,EAA6CC,KAA7C,EAAqDK,CAArD,EAAwD;AACtDP,gBAAQQ,YAAR,CAAqBP,KAArB,EAA4BM,EAAEJ,CAA9B;AACAH,gBAAQQ,YAAR,CAAqBN,KAArB,EAA4BK,EAAEF,CAA9B;AACD;;AAEc,YAAMI,MAAN,SAAqBf,KAArB,CAA2B;;AAExC,eAAOgB,UAAP,GAAoB;AAClB,iBAAOC,MAAMC,IAAN,CAAWC,SAASC,gBAAT,CAA0B,GAA1B,CAAX,EAA2CC,MAA3C,CAAkDC,MAAMA,GAAGC,QAA3D,CAAP;AACD;AACD;AACA,YAAIC,KAAJ,GAAY;AACV,iBAAO,KAAKd,YAAL,CAAkB,OAAlB,CAAP;AACD;AACD,YAAIc,KAAJ,CAAUC,GAAV,EAAe;AACb,eAAKX,YAAL,CAAkB,OAAlB,EAA2BW,GAA3B;AACD;AACD,YAAIF,QAAJ,GAAe;AAAE,iBAAO,IAAP;AAAa;AAC9B,YAAIG,oBAAJ,GAA2B;AAAE,iBAAO,GAAP;AAAY;AACzC,YAAIC,sBAAJ,GAA6B;AAAE,iBAAO,EAAP;AAAW;;AAE1C,YAAIC,MAAJ,GAAa;AAAE,iBAAO,KAAKC,YAAL,CAAkB,QAAlB,CAAP;AAAoC;AACnD,YAAIC,OAAJ,GAAc;AAAE,iBAAO,KAAKD,YAAL,CAAkB,OAAlB,CAAP;AAAmC;AACnD,YAAIE,SAAJ,GAAgB;AAAE,iBAAO,KAAKC,GAAL,CAAS,oBAAT,CAAP;AAAuC;AACzD,YAAIC,MAAJ,GAAa;AAAE,iBAAO,KAAKC,UAAL,CAAgB,CAAhB,CAAP;AAA2B;AAC1C,YAAIC,MAAJ,GAAa;AAAE,iBAAO,KAAKH,GAAL,CAAS,SAAT,CAAP;AAA4B;AAC3C,YAAII,SAAJ,GAAgB;AAAE,iBAAO,KAAKJ,GAAL,CAAS,aAAT,CAAP;AAAgC;AAClD,YAAIK,WAAJ,GAAkB;AAAE,iBAAO,KAAKL,GAAL,CAAS,eAAT,CAAP;AAAkC;;AAEtD,YAAIM,SAAJ,GAAgB;AACd,iBAAO,GAAP;AACD;AACD;AACA,YAAIC,oBAAJ,GAA2B;AAAE,iBAAO,GAAP;AAAa;AAC1C,YAAIC,MAAJ,GAAa;AACX,iBAAO,KAAKR,GAAL,CAAS,qBAAT,CAAP;AACD;;AAEDS,kBAAUC,MAAV,EAAkB;AAChBC,iBAAOF,SAAP,CAAiB,IAAjB,EAAuBC,MAAvB;AACA,cAAI,KAAKT,MAAT,EACE,KAAKA,MAAL,CAAYW,aAAZ,CAA0B,IAAIC,WAAJ,CAAgB,gBAAhB,CAA1B;AACH;AACD;;AAEAC,qBAAa;AACX,eAAKC,KAAL;AACA,eAAKC,OAAL,GAAe,IAAf;AACA,eAAKC,MAAL;;AAEA,cAAI,KAAKC,WAAL,MAAsB,KAAKC,WAAL,EAA1B,EACE,KAAKC,mBAAL,CAAyB,KAAzB;;AAEF,eAAKC,aAAL,GAAqB,IAAIC,gBAAJ,CAAqBC,aAAa;AACrDA,sBAAUC,OAAV,CAAkBC,YAAY;AAC5B,kBAAGA,SAASC,IAAT,IAAiB,YAApB,EAAkC;AAChC,qBAAKC,wBAAL,CACEF,SAASG,aADX,EAEEH,SAASI,QAFX,EAGEJ,SAASxB,MAAT,CAAgBvB,YAAhB,CAA6B+C,SAASG,aAAtC,CAHF;AAKD;AACF,aARD;AASD,WAVoB,CAArB;AAWA,eAAKP,aAAL,CAAmBS,OAAnB,CAA2B,IAA3B,EAAiC,EAAEC,YAAY,IAAd,EAAjC;;AAEA,eAAKjD,YAAL,CAAkB,UAAlB,EAA8B,CAA9B;;AAEA,eAAKkD,SAAL,CAAe,KAAKC,UAApB;AAED;;AAEDC,2BAAmB;AACjB,cAAI,KAAKC,aAAL,KAAuBhD,SAASiD,IAApC,EAA0C;AACxC,iBAAKC,SAAL,CAAeC,GAAf,CAAmB,QAAnB;AACD,WAFD,MAEO;AACL,iBAAKD,SAAL,CAAeE,MAAf,CAAsB,QAAtB;AACD;AACF;;AAEDZ,iCAAyBa,QAAzB,EAAmCX,QAAnC,EAA6CY,QAA7C,EAAuD;AACrD,kBAAQD,QAAR;AACE,iBAAK,OAAL;AACE,mBAAKvB,MAAL;AACA;AACF,iBAAK,MAAL;AACE,mBAAKA,MAAL;AACA;AACF,iBAAK,OAAL;AACE,mBAAKyB,UAAL;AACA;AACF;AACE;AAXJ;AAaD;;AAEDC,qBAAa;AACX,cAAI;AACF,iBAAKC,gBAAL,CAAsB,SAAtB,EAAkCC,GAAD,IAAS,KAAKC,KAAL,EAA1C;AACA,iBAAKF,gBAAL,CAAsB,gBAAtB,EAAyCC,GAAD,IAAS;AAAE,mBAAKE,eAAL;AAAyB,aAA5E;AACA,iBAAK1C,WAAL,CAAiBuC,gBAAjB,CAAkC,aAAlC,EAAkDC,GAAD,IAAS;AAAE,mBAAKG,gBAAL,CAAsBH,GAAtB;AAA4B,aAAxF;AACA,iBAAKxC,WAAL,CAAiBuC,gBAAjB,CAAkC,UAAlC,EAA+CC,GAAD,IAAS;AAAE,mBAAKI,kBAAL,CAAwBJ,GAAxB;AAA8B,aAAvF;AACA,iBAAKD,gBAAL,CAAsB,WAAtB,EAAoCC,GAAD,IAASlC,OAAOuC,kBAAP,CAA0B,IAA1B,CAA5C,EAA6E,IAA7E;AACA,iBAAKlD,GAAL,CAAS,cAAT,EAAyB4C,gBAAzB,CAA0C,OAA1C,EAAmDC,OAAO;AAAE,mBAAKM,mBAAL,CAAyBN,GAAzB;AAAgC,aAA5F;AACA,iBAAK7C,GAAL,CAAS,aAAT,EAAwB4C,gBAAxB,CAAyC,OAAzC,EAAkDC,OAAO;AAAE,mBAAKO,kBAAL,CAAwBP,GAAxB;AAA+B,aAA1F;AACA,iBAAK7C,GAAL,CAAS,eAAT,EAA0B4C,gBAA1B,CAA2C,OAA3C,EAAoDC,OAAO;AAAE,mBAAKO,kBAAL,CAAwBP,GAAxB;AAA+B,aAA5F;;AAEA,iBAAKzC,SAAL,CAAewC,gBAAf,CAAgC,OAAhC,EAAyCC,OAAO;AAAE,mBAAKQ,kBAAL,CAAwBR,GAAxB;AAA+B,aAAjF;AACA,iBAAKD,gBAAL,CAAsB,UAAtB,EAAkCC,OAAO;AAAE,mBAAKS,aAAL,CAAmBT,GAAnB;AAA0B,aAArE;AACA,iBAAK7C,GAAL,CAAS,eAAT,EAA0B4C,gBAA1B,CAA2C,OAA3C,EAAoDC,OAAO;AAAE,mBAAKU,oBAAL,CAA0BV,GAA1B;AAAiC,aAA9F;AACA,iBAAKD,gBAAL,CAAsB,OAAtB,EAA+BC,OAAO;AAAE,mBAAKW,OAAL,CAAaX,GAAb;AAAoB,aAA5D;AACD,WAdD,CAcE,OAAOY,GAAP,EAAY;AACZC,oBAAQC,GAAR,CAAY,yCAAZ,EAAuDF,GAAvD;AACD;AACF;;AAID1C,gBAAQ;AACN,eAAK6C,QAAL,GAAgB,KAAhB;AACA,eAAKjB,UAAL;AACD;;AAGD;;AAEAkB,uBAAe;AACb,iBAAO,KAAK7D,GAAL,CAAS,kBAAT,EAA6B8D,KAA7B,CAAmCC,OAAnC,IAA8C,MAArD;AACD;;AAED7C,sBAAc;AACZ,iBAAO,KAAKmB,SAAL,CAAe2B,QAAf,CAAwB,WAAxB,CAAP;AACD;;AAED7C,sBAAc;AACZ,iBAAO,KAAKkB,SAAL,CAAe2B,QAAf,CAAwB,WAAxB,CAAP;AACD;;AAED/C,iBAAS;AACP,cAAI,KAAKD,OAAT,EAAkB;AAChB,gBAAIiD,OAAO,KAAKlC,UAAL,CAAgB,MAAhB,CAAX;AACA,gBAAIvC,QAAQ,KAAKuC,UAAL,CAAgB,OAAhB,CAAZ;AACA,gBAAImC,UAAU,EAAd;AACA,gBAAID,QAAQzE,KAAZ,EAAmB;AACjB0E,wBAAUD,KAAKE,KAAL,GAAa,GAAb,GAAmB3E,MAAM2E,KAAN,CAAYC,KAAZ,CAAkB,CAAlB,EAAqB,EAArB,CAA7B;AACD,aAFD,MAEO,IAAIH,IAAJ,EAAU;AACfC,wBAAUD,KAAKE,KAAf;AACD,aAFM,MAEA,IAAI3E,KAAJ,EAAW;AAChB0E,wBAAU1E,MAAM2E,KAAN,CAAYC,KAAZ,CAAkB,CAAlB,EAAqB,EAArB,CAAV;AACD;AACD,iBAAKrE,SAAL,CAAesE,SAAf,GAA2BH,OAA3B;AACD;AACF;;AAEDxB,qBAAa;AACX,cAAI4B,MAAM3D,OAAO4D,iBAAP,CAAyB,IAAzB,CAAV;AACA,cAAI,KAAKzE,OAAT,EAAkB;AAChBa,mBAAO6D,WAAP,CAAmB,IAAnB,EAAyBF,GAAzB;AACA,iBAAKjC,SAAL,CAAeC,GAAf,CAAmB,cAAnB;AACD,WAHD,MAGO;AACL3B,mBAAO6D,WAAP,CAAmB,IAAnB,EAAyBF,IAAIG,KAAJ,CAAU9D,OAAO+D,SAAP,EAAV,CAAzB;AACA,iBAAKrC,SAAL,CAAeE,MAAf,CAAsB,cAAtB;AACD;AACF;;AAEDvD,qBAAa;AACX,iBAAOD,OAAOC,UAAP,EAAP;AACD;;AAED8D,gBAAQ;AACN,cAAI9D,aAAa,KAAKA,UAAL,EAAjB;AACA,cAAI2F,UAAU3F,WAAW4F,OAAX,CAAmB,IAAnB,CAAd;AACA,cAAIC,oBAAoB7F,UAAxB;AACA6F,4BAAkBC,MAAlB,CAAyBH,OAAzB,EAAkC,CAAlC;AACAE,4BAAkBE,IAAlB,CAAuB,CAACC,CAAD,EAAIC,CAAJ,KAAU;AAC/B,mBAAOC,SAASF,EAAElB,KAAF,CAAQ,SAAR,CAAT,IAA+BoB,SAASD,EAAEnB,KAAF,CAAQ,SAAR,CAAT,CAAtC;AACD,WAFD;;AAIAe,4BAAkBrD,OAAlB,CAA0B,CAAC2D,GAAD,EAAMC,KAAN,KAAgB;AACxCD,gBAAIrB,KAAJ,CAAU,SAAV,IAAuB,KAAKxD,SAAL,GAAiB8E,KAAxC;AACA,gBAAID,IAAIhF,MAAR,EACEgF,IAAIhF,MAAJ,CAAWkC,SAAX,CAAqBE,MAArB,CAA4B,SAA5B;AACF4C,gBAAIE,eAAJ,CAAoB,QAApB;AACD,WALD;;AAOA,cAAI,KAAKxB,YAAL,EAAJ,EAAyB;AACvB;AACA,iBAAKC,KAAL,CAAW,SAAX,IAAwB,CAAxB;AACD,WAHD,MAGO;AACL,iBAAKA,KAAL,CAAW,SAAX,IAAwB,KAAKxD,SAAL,GAAiBuE,kBAAkBS,MAA3D;AAED;;AAED,eAAKnF,MAAL,CAAYkC,SAAZ,CAAsBC,GAAtB,CAA0B,SAA1B;AACA,eAAKxD,YAAL,CAAkB,QAAlB,EAA4B,IAA5B;;AAEA;;AAEA,cAAI,KAAKmB,MAAL,IAAe,KAAKA,MAAL,CAAY6C,KAA/B,EAAsC,KAAK7C,MAAL,CAAY6C,KAAZ;AACvC;;AAEDyC,uCAA+B;AAC7B,cAAIvG,aAAa,KAAKA,UAAL,EAAjB;AACAA,qBAAWK,MAAX,CAAkBC,MAAMA,GAAG4B,WAAH,EAAxB,EAA0CM,OAA1C,CAAkDlC,MAAM;AACtDA,eAAGwE,KAAH,CAAS,SAAT,IAAsB,KAAKxD,SAAL,GAAiBtB,WAAWsG,MAA5B,GAAqC,CAA3D;AACD,WAFD;AAGD;;AAEDE,uBAAe;AACb,iBAAO,KAAKC,UAAL,CAAgBC,aAAhB,CAA8B,gBAA9B,CAAP;AACD;;AAED;AACAC,+BAAuB;AACrB,cAAIzB,UAAU,KAAKwB,aAAL,CAAmB,GAAnB,CAAd;AACA,cAAIpB,MAAM3D,OAAOiF,WAAP,CAAmB,IAAnB,CAAV;AACA,eAAKzD,aAAL,CAAmB0D,WAAnB,CAA+B3B,OAA/B;AACAvD,iBAAO6D,WAAP,CAAmBN,OAAnB,EAA4BI,GAA5B;AACA,eAAK/B,MAAL;AACD;;AAGDuD,2BAAmB;AACjB,cAAI,KAAK3E,WAAL,EAAJ,EAAwB;AACtBhC,qBAASiD,IAAT,CAAc0B,KAAd,CAAoBiC,QAApB,GAA+B,KAAKrH,YAAL,CAAkB,eAAlB,CAA/B;AACD;AACF;;AAED;;AAEA;AACAsH,yBAAiB;AACf,cAAI9B,UAAU,KAAKlE,GAAL,CAAS,iBAAT,CAAd;AACA,cAAIiG,aAAa,KAAK7F,SAAL,CAAesF,aAAf,CAA6B,GAA7B,CAAjB;AACA,cAAI,KAAKvE,WAAL,EAAJ,EAAwB;AACtB,iBAAK+E,wBAAL;;AAEAD,uBAAW5D,SAAX,CAAqBE,MAArB,CAA4B,aAA5B;AACA0D,uBAAW5D,SAAX,CAAqBC,GAArB,CAAyB,WAAzB;;AAEA4B,oBAAQJ,KAAR,CAAcC,OAAd,GAAwB,OAAxB;AACA5E,qBAASiD,IAAT,CAAc0B,KAAd,CAAoBiC,QAApB,GAA+B,KAAKrH,YAAL,CAAkB,eAAlB,CAA/B;AACA,iBAAK2D,SAAL,CAAeE,MAAf,CAAsB,WAAtB;AACD,WATD,MASO;AACL,gBAAI,KAAKrB,WAAL,EAAJ,EAAwB;AACtB,qBAAO,KAAKiF,cAAL,EAAP;AACD;;AAEDF,uBAAW5D,SAAX,CAAqBC,GAArB,CAAyB,aAAzB;AACA2D,uBAAW5D,SAAX,CAAqBE,MAArB,CAA4B,WAA5B;;AAGA,iBAAK6D,sBAAL;AACA,iBAAKtH,YAAL,CAAkB,eAAlB,EAAmCK,SAASiD,IAAT,CAAc0B,KAAd,CAAoBiC,QAAvD;;AAEA,iBAAKjC,KAAL,CAAWuC,QAAX,GAAsB,OAAtB;AACA,iBAAKvC,KAAL,CAAWwC,GAAX,GAAiB,CAAjB;AACA,iBAAKxC,KAAL,CAAWyC,IAAX,GAAkB,CAAlB;AACA,iBAAKzC,KAAL,CAAW0C,KAAX,GAAmB,MAAnB;AACA,iBAAK1C,KAAL,CAAW2C,MAAX,GAAoB,MAApB;AACAtH,qBAASiD,IAAT,CAAc0B,KAAd,CAAoBiC,QAApB,GAA+B,QAA/B;AACA,gBAAI,KAAK9F,MAAT,EACE,KAAKA,MAAL,CAAYW,aAAZ,CAA0B,IAAIC,WAAJ,CAAgB,gBAAhB,CAA1B;;AAEF,iBAAKwB,SAAL,CAAeC,GAAf,CAAmB,WAAnB;AACD;AACD,eAAKiD,4BAAL;AACA,eAAKnE,mBAAL,CAAyB,CAAC,KAAKD,WAAL,EAA1B;AACD;;AAEDC,4BAAoBsF,IAApB,EAA0B;AACxB,cAAIA,SAASC,SAAb,EAAwBD,OAAO,IAAP;AACxB,eAAKE,eAAL,CAAqB,gBAArB,EAAuCpF,OAAvC,CAA+ClC,MAAM;AACnDA,eAAGwE,KAAH,CAASC,OAAT,GAAmB2C,OAAO,OAAP,GAAiB,MAApC;AACD,WAFD;AAGD;;AAGDN,iCAAyB;AACvBhI,8BAAoB,IAApB,EAA0B,WAA1B,EAAuC,UAAvC,EAAmDuC,OAAOiF,WAAP,CAAmB,IAAnB,CAAnD;AACAxH,8BAAoB,IAApB,EAA0B,YAA1B,EAAwC,aAAxC,EAAuDuC,OAAOkG,SAAP,CAAiB,IAAjB,CAAvD;AACD;;AAGDX,mCAA2B;AACzBvF,iBAAO6D,WAAP,CAAmB,IAAnB,EAAyBnG,sBAAsB,IAAtB,EAA4B,WAA5B,EAAyC,UAAzC,CAAzB;AACAsC,iBAAOF,SAAP,CAAiB,IAAjB,EAAuBpC,sBAAsB,IAAtB,EAA4B,YAA5B,EAA0C,aAA1C,CAAvB;AACD;;AAED;AACA8H,yBAAiB;;AAEf,cAAIjC,UAAU,KAAKlE,GAAL,CAAS,iBAAT,CAAd;AACA,cAAI,KAAKqC,SAAL,CAAe2B,QAAf,CAAwB,WAAxB,CAAJ,EAA0C;;AAExC;;AAEA,iBAAK5C,mBAAL,CAAyB,IAAzB;;AAEAhD,gCAAoB,IAApB,EAA0B,eAA1B,EAA2C,cAA3C,EAA2DuC,OAAOiF,WAAP,CAAmB,IAAnB,CAA3D;AACA,iBAAKM,wBAAL;;AAEA,iBAAK7D,SAAL,CAAeE,MAAf,CAAsB,WAAtB;;AAEA2B,oBAAQJ,KAAR,CAAcC,OAAd,GAAwB,OAAxB;AACA;AACA,iBAAKjF,YAAL,CAAkB,OAAlB,EAA2B,KAAKJ,YAAL,CAAkB,YAAlB,CAA3B;;AAEA,iBAAKuB,MAAL,CAAY6D,KAAZ,CAAkBC,OAAlB,GAA4B,EAA5B;AACAG,oBAAQJ,KAAR,CAAcgD,aAAd,GAA8B,EAA9B;AAED,WAlBD,MAkBO;AACL,gBAAI,KAAK3F,WAAL,EAAJ,EAAwB;AACtB,qBAAO,KAAK6E,cAAL,EAAP;AACD;;AAED;;AAEA,iBAAKI,sBAAL;AACAzF,mBAAO6D,WAAP,CAAmB,IAAnB,EAAyBnG,sBAAsB,IAAtB,EAA4B,eAA5B,EAA6C,cAA7C;;AAEzB;AAFA,cAGA,IAAI0I,YAAY,KAAKrI,YAAL,CAAkB,OAAlB,KAA8B,IAA9B,GAAqC,KAAKA,YAAL,CAAkB,OAAlB,CAArC,GAAkE,EAAlF;AACA,iBAAKI,YAAL,CAAkB,YAAlB,EAAgCiI,SAAhC;;AAEA;AACA,gBAAIC,WAAW,KAAKtI,YAAL,CAAkB,OAAlB,IAA6B,cAA5C;AACA,gBAAI,KAAKuB,MAAL,CAAYgH,oBAAhB,EAAsC;AACpCD,yBAAW,KAAK/G,MAAL,CAAYgH,oBAAZ,EAAX;AACD;AACD,iBAAKnI,YAAL,CAAkB,OAAlB,EAA4BkI,QAA5B;AACA,gBAAIE,cAAcvG,OAAOkG,SAAP,CAAiB,KAAK7G,GAAL,CAAS,kBAAT,CAAjB,CAAlB;AACAW,mBAAOF,SAAP,CAAiB,IAAjB,EAAuBxC,GAAG,GAAH,EAAQiJ,YAAYvI,CAAZ,GAAgB,CAAxB,CAAvB;;AAEA,iBAAK0D,SAAL,CAAeC,GAAf,CAAmB,WAAnB;AACA,iBAAKrC,MAAL,CAAY6D,KAAZ,CAAkBC,OAAlB,GAA4B,MAA5B;AACAG,oBAAQJ,KAAR,CAAcgD,aAAd,GAA8B,MAA9B;AACA,iBAAK1F,mBAAL,CAAyB,KAAzB;AACD;AACD,eAAKmE,4BAAL;AACD;;AAKD;AACA4B,sBAAc;AACZ,cAAIC,WAAW,KAAKtD,KAAL,CAAWuC,QAAX,IAAuB,OAAtC;AACA,cAAIe,QAAJ,EAAc;AACZ,iBAAK/B,eAAL,CAAqB,OAArB;AACA,iBAAKvB,KAAL,CAAWuC,QAAX,GAAsB,UAAtB,CAFY,CAEqB;AAClC,WAHD,MAGO;AACL,iBAAKvH,YAAL,CAAkB,OAAlB,EAA2B,EAA3B;AACA,iBAAKgF,KAAL,CAAWuC,QAAX,GAAsB,OAAtB,CAFK,CAEyB;AAC/B;AACF;AACD;;AAEAjD,2BAAmBP,GAAnB,EAAwB;AACtB,cAAIA,IAAIwE,QAAR,EAAkB;AAChBlI,qBAASmI,gBAAT,CAA0BC,SAA1B,GAAsC,CAAtC;AACApI,qBAASmI,gBAAT,CAA0BE,UAA1B,GAAuC,CAAvC;AACA7G,mBAAO8G,MAAP,CAActI,SAASiD,IAAvB,EAA6BzB,OAAO4D,iBAAP,CAAyB,IAAzB,EAA+BmD,OAA/B,CAAuC,CAAC,CAAxC,CAA7B;AACA/G,mBAAOF,SAAP,CAAiB,IAAjB,EAAuBE,OAAOkG,SAAP,CAAiB,IAAjB,EAAuBc,KAAvB,CAA6BxH,OAAOyH,WAAP,GAAqB,CAAlD,CAAvB;AACD,WALD,MAKO;AACL,iBAAKzB,cAAL;AACD;AACDtD,cAAIgF,eAAJ;AACD;;AAEDxE,2BAAmBR,GAAnB,EAAwB;AACtB,cAAIA,IAAIwE,QAAR,EAAkB;AAChB,iBAAKF,WAAL;AACD,WAFD,MAEO;AACL,iBAAKnB,cAAL;AACD;AACF;;AAED7C,4BAAoBN,GAApB,EAAyB;AACvBlC,iBAAOmH,eAAP,CAAuB3I,SAASiD,IAAhC,EAAsCS,GAAtC,EAA2C,KAAK5C,MAAhD;AACD;;AAED+C,yBAAiBH,GAAjB,EAAsB;AACpBA,cAAIkF,cAAJ;AACAlF,cAAIgF,eAAJ;AACAlH,iBAAOuC,kBAAP,CAA0B,IAA1B;;AAEA,cAAI,KAAK8E,sBAAT,EAAiC,OALb,CAKqB;;AAEzC,cAAI,KAAKlI,OAAT,EAAkB;AAChB,gBAAImI,eAAe,KAAKC,qBAAL,EAAnB;AACA,iBAAKtE,QAAL,GAAgB3F,GAAG4E,IAAIsF,KAAJ,GAAYF,aAAa1B,IAA5B,EAAkC1D,IAAIuF,KAAJ,GAAYH,aAAa3B,GAA3D,CAAhB;AAED,WAJD,MAIO;AACL,iBAAK+B,aAAL,GAAqB1H,OAAOiF,WAAP,CAAmB,IAAnB,CAArB;AACA,gBAAI0C,MAAM,KAAKD,aAAL,CAAmB5J,CAAzB,KAA+B6J,MAAM,KAAKD,aAAL,CAAmB1J,CAAzB,CAAnC,EAAgE;AAC9D,oBAAM,IAAI4J,KAAJ,CAAU,sDAAV,CAAN;AACD;AACD,iBAAK3E,QAAL,GAAgB3F,GAAG4E,IAAI2F,OAAP,EAAgB3F,IAAI4F,OAApB,CAAhB;AACD;AACD9H,iBAAO+H,mBAAP,CAA2B,oBAA3B,EAAiD,KAAKrI,WAAtD;;AAEAM,iBAAOiC,gBAAP,CAAwB,oBAAxB,EAA8CzD,SAASwJ,eAAvD,EAAwE,aAAxE,EACE9F,OAAO,KAAK+F,iBAAL,CAAuB/F,GAAvB,CADT,EACsC,IADtC;AAEAlC,iBAAOiC,gBAAP,CAAwB,oBAAxB,EAA8CzD,SAASwJ,eAAvD,EAAwE,WAAxE,EACE,MAAM9F,GAAN,IAAa,MAAM,KAAKgG,eAAL,CAAqBhG,GAArB,CADrB;AAEA,eAAK1C,MAAL,CAAYkC,SAAZ,CAAsBC,GAAtB,CAA0B,UAA1B,EAAsC,IAAtC;AACD;;AAED,cAAMiB,oBAAN,CAA2BV,GAA3B,EAAgC;;AAE9B,cAAI,MAAM,KAAKiG,eAAL,EAAV,EAAkC;AAChC;AACD;;AAED,cAAI,KAAK7I,MAAL,IAAe,KAAKA,MAAL,CAAY8I,cAA3B,IAA6C,KAAK9I,MAAL,CAAY8I,cAAZ,EAAjD,EAA+E;AAC7E,gBAAI,MAAM,KAAKC,gBAAL,EAAV,EAAmC;AACpC;AACD,cAAI,KAAKhB,sBAAT,EACE,KAAKhC,cAAL;;AAEF,eAAKiD,UAAL,CAAgBC,WAAhB,CAA4B,IAA5B;AACA,cAAI,KAAKC,iBAAL,YAAkCC,QAAtC,EAAgD;AAC9C,iBAAKD,iBAAL;AACD;;AAED,cAAIE,OAAO,KAAKrK,UAAL,GAAkBsK,KAA7B;AACA,cAAID,IAAJ,EAAU;AACR1I,mBAAOuC,kBAAP,CAA0BmG,IAA1B;AACD;AACF;;AAGDT,0BAAkB/F,GAAlB,EAAuB;AACrB;;AAEA,cAAI,KAAKe,QAAT,EAAmB;AACjBf,gBAAIkF,cAAJ;AACAlF,gBAAIgF,eAAJ;;AAEA,gBAAI,KAAK/H,OAAT,EAAkB;AAChBa,qBAAO6D,WAAP,CAAmB,IAAnB,EAAyBvG,GAAG4E,IAAI2F,OAAP,EAAgB3F,IAAI4F,OAApB,EAA6Bc,KAA7B,CAAmC,KAAK3F,QAAxC,CAAzB;AACD,aAFD,MAEO;AACL,kBAAIjD,OAAO6I,WAAP,CAAmBxJ,GAAnB,CAAuB,eAAvB,CAAJ,EAA6C;AAC3C,qBAAKyJ,uBAAL,CAA6B5G,GAA7B;AACD;AACD,kBAAIyB,MAAM,KAAK+D,aAAL,CAAmB5D,KAAnB,CAAyBxG,GAAG4E,IAAIsF,KAAP,EAActF,IAAIuF,KAAlB,CAAzB,EACPmB,KADO,CACD,KAAK3F,QADJ,EACc2F,KADd,CACoB5I,OAAO+D,SAAP,EADpB,CAAV;AAEA/D,qBAAO6D,WAAP,CAAmB,IAAnB,EAAyBtG,KAAKwL,eAAL,CAAqBpF,GAArB,EAA0BzB,GAA1B,CAAzB;AACD;AACF;AACF;;AAGD,cAAMgG,eAAN,CAAsBhG,GAAtB,EAA2B;AACzBA,cAAIkF,cAAJ;AACA,eAAKnE,QAAL,GAAgB,KAAhB;AACA;AACA,eAAKzD,MAAL,CAAYkC,SAAZ,CAAsBE,MAAtB,CAA6B,UAA7B;AACA,eAAKpC,MAAL,CAAYkC,SAAZ,CAAsBE,MAAtB,CAA6B,UAA7B;AACA5B,iBAAO+H,mBAAP,CAA2B,oBAA3B,EAAkDvJ,SAASwJ,eAA3D;;AAEA,cAAI,KAAKgB,mBAAT,EAA8B;AAC5B,kBAAM,KAAKC,iBAAL,CAAuB/G,GAAvB,CAAN;AACD;AACD,eAAK8G,mBAAL,GAA2B,IAA3B;AACD;;AAED5G,wBAAgBF,GAAhB,EAAqB;AACnB,cAAI,KAAK5C,MAAT,EAAiB;AACf,iBAAKA,MAAL,CAAYW,aAAZ,CAA0B,IAAIC,WAAJ,CAAgB,gBAAhB,CAA1B;AACD;AACF;;AAEDyC,sBAAcT,GAAd,EAAmB;AACjB,cAAI,KAAK3B,WAAL,EAAJ,EAAwB;AACtB,iBAAKiF,cAAL;AACD;AACF;;AAEDlD,2BAAmBJ,GAAnB,EAAwB;AACtB,eAAKmD,cAAL;AACAnD,cAAIgF,eAAJ;AACD;;AAEDrE,gBAAQX,GAAR,EAAa;AACX,cAAIgH,OAAOC,OAAOC,YAAP,CAAoBlH,IAAImH,OAAJ,IAAenH,IAAIoH,QAAvC,CAAX;AACA,cAAKpH,IAAIqH,MAAL,IAAgBL,QAAQ,GAA5B,EAAiC;AAAE;AACjC,iBAAKtG,oBAAL,CAA0BV,GAA1B;AACAA,gBAAIkF,cAAJ;AACD;AACF;;AAED;;;;;AAKA,cAAMiB,gBAAN,GAAyB;AACrB,iBAAO,EAAG,MAAMrI,OAAOwJ,OAAP,CAAe,gDAAf,CAAT,CAAP;AACH;;AAID;AACA;;;;;AAKA,cAAMP,iBAAN,CAAwB/G,GAAxB,EAA4B;;AAE1B,gBAAMuH,UAAUvH,IAAI2F,OAApB;AACA,gBAAM6B,UAAUxH,IAAI4F,OAApB;;AAEA,cAAI,CAAC,KAAKkB,mBAAV,EAA+B;;AAE/B;AACA;AACA,cAAIW,OAAO,KAAKC,UAAL,CAAgBrC,qBAAhB,EAAX;AACA,cAAGkC,UAAUE,KAAK/D,IAAf,IAAuB6D,UAAUE,KAAKE,KAAtC,IACAH,UAAUC,KAAKhE,GADf,IACsB+D,UAAUC,KAAKG,MADrC,IAEAC,KAAKC,GAAL,KAAa,KAAKJ,UAAL,CAAgBK,SAA7B,GAAyC,KAAKrK,oBAFjD,EAEuE;;AAErE,gBAAIsK,cAAc,KAAKlB,mBAAvB;;AAEA,gBAAI,EAAGkB,YAAYxI,SAAZ,CAAsB2B,QAAtB,CAA+B,qBAA/B,KAAyD,KAAK3B,SAAL,CAAe2B,QAAf,CAAwB,qBAAxB,CAA5D,CAAJ,EAAiH;;AAE/G,kBAAI8G,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAd;AACA,kBAAIC,kBAAkB,0EAAuBD,OAAvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAtB;AACAC,8BAAgB1I,SAAhB,CAA0BC,GAA1B,CAA8B,qBAA9B;;AAEAnD,uBAASiD,IAAT,CAAcyD,WAAd,CAA0BkF,eAA1B;;AAEApK,qBAAOqK,iBAAP,CAAyBD,eAAzB,EAA0CpK,OAAO4D,iBAAP,CAAyBsG,WAAzB,CAA1C;AACAlK,qBAAO6D,WAAP,CAAmBuG,eAAnB,EAAoCpK,OAAOiF,WAAP,CAAmBmF,eAAnB,CAApC;AACApK,qBAAOF,SAAP,CAAiBsK,eAAjB,EAAkCpK,OAAOkG,SAAP,CAAiBgE,WAAjB,CAAlC;;AAEA,oBAAMC,QAAQG,SAAR,CAAkBJ,WAAlB,CAAN;AACA,oBAAMC,QAAQG,SAAR,CAAkB,IAAlB,CAAN;AACD,aAdD,MAcO;AACL,oBAAM,KAAKC,mBAAL,CAAyBL,WAAzB,CAAN;AACD;AACF;;AAED,cAAG,KAAKN,UAAR,EAAoB;AAClB,iBAAKY,cAAL;AACD;AAEF;;AAED,cAAMD,mBAAN,CAA0BL,WAA1B,EAAuC;AACrC;;;;;;AAMA,cAAIA,YAAYxI,SAAZ,CAAsB2B,QAAtB,CAA+B,qBAA/B,KAA0D,KAAK3B,SAAL,CAAe2B,QAAf,CAAwB,qBAAxB,CAA9D,EAA8G;AAC5G;AACA;AACA,gBAAIoH,UAAUP,YAAY7K,GAAZ,CAAgB,qBAAhB,CAAd;AACA,gBAAIqL,SAAS,KAAKrL,GAAL,CAAS,qBAAT,CAAb;;AAEA;AACA,gBAAIoL,WAAWC,MAAf,EAAuB;;AAErB,kBAAIC,WAAWD,OAAOC,QAAtB;AACA,kBAAIC,mBAAmBD,SAAShG,MAAhC;;AAEA,mBAAK,IAAIkG,kBAAkB,CAA3B,EAA8BA,kBAAkBD,gBAAhD,EAAkEC,iBAAlE,EAAqF;AACnF,sBAAMC,QAAQH,SAAS,CAAT,CAAd;AACA,sBAAMF,QAAQM,UAAR,CAAmBD,KAAnB,EAA0BA,MAAMjM,KAAhC,CAAN;AACD;AACF;AACD;AACA,iBAAK+C,MAAL;AACD,WAnBD,MAmBO;;AAEL;AACA,gBAAIsI,YAAYxI,SAAZ,CAAsB2B,QAAtB,CAA+B,qBAA/B,CAAJ,EAA2D;AACzD,kBAAI2H,kBAAkBd,YAAY7K,GAAZ,CAAgB,qBAAhB,CAAtB;AACA2L,8BAAgBV,SAAhB,CAA0B,IAA1B;AACD,aAHD,MAGO;AACL,kBAAI,KAAK5I,SAAL,CAAe2B,QAAf,CAAwB,qBAAxB,CAAJ,EAAoD;AAClD,oBAAIM,MAAM3D,OAAOiF,WAAP,CAAmBiF,WAAnB,CAAV;AACA,oBAAIe,sBAAsB,KAAK5L,GAAL,CAAS,qBAAT,CAA1B;AACA4L,oCAAoBX,SAApB,CAA8BJ,WAA9B;AACAlK,uBAAO6D,WAAP,CAAmB,IAAnB,EAAyBF,GAAzB;AACD;AACF;AAEF;AACF;;AAED,cAAMmF,uBAAN,CAA8B5G,GAA9B,EAAmC;;AAEjC,gBAAMuH,UAAUvH,IAAI2F,OAApB;AACA,gBAAM6B,UAAUxH,IAAI4F,OAApB;;AAEA,cAAIoD,cAAc,IAAlB;;AAEA;AACA,cAAIC,sBAAsB,KAAK9M,UAAL,GAAkBK,MAAlB,CAA2B8F,GAAD,IAAS,CAACA,IAAI9C,SAAJ,CAAc2B,QAAd,CAAuB,QAAvB,CAApC,CAA1B;AACA,cAAI+H,sBAAsBD,oBAAoBzM,MAApB,CAA2B,UAAS8F,GAAT,EAAc;;AAEjE;AACA,gBAAIA,IAAI9C,SAAJ,CAAc2B,QAAd,CAAuB,QAAvB,CAAJ,EAAsC;AACpC,qBAAO,IAAP;AACD;AACD,mBAAO,SAASmB,GAAT,IAAiBA,IAAI6G,kBAArB,IAA2C7G,IAAI6G,kBAAJ,CAAwB5B,OAAxB,EAAiCC,OAAjC,EAA0ClF,GAA1C,CAAlD;AACD,WAPyB,EAOvB,IAPuB,CAA1B;;AASA;AACA,cAAG4G,uBAAuBA,oBAAoBzG,MAApB,GAA6B,CAAvD,EAA0D;AACxD;AACA2G,iBAAKC,mBAAL,GAA2BH,mBAA3B;AACAF,0BAAcE,oBAAoBI,MAApB,CAA2B,UAASC,IAAT,EAAeC,OAAf,EAAwB;AAC/D,kBAAIC,aAAapH,SAAS/E,OAAOoM,gBAAP,CAAwBH,IAAxB,EAA8BI,gBAA9B,CAA+C,SAA/C,CAAT,CAAjB;AACA,kBAAIC,gBAAgBvH,SAAS/E,OAAOoM,gBAAP,CAAwBF,OAAxB,EAAiCG,gBAAjC,CAAkD,SAAlD,CAAT,CAApB;AACA,qBAAQF,aAAaG,aAAd,GAA+BL,IAA/B,GAAsCC,OAA7C;AACD,aAJa,CAAd;AAKD;;AAED;AACA,cAAG,KAAK9B,UAAL,IAAmBsB,eAAe,KAAKlC,mBAA1C,EAA+D;AAC7D,iBAAKwB,cAAL;AACD;AACD;AACA,cAAGU,eAAeA,eAAe,KAAKlC,mBAAtC,EAA2D;AACzD,kBAAM,KAAK+C,cAAL,CAAqBb,WAArB,CAAN;AACD;AACD,eAAKlC,mBAAL,GAA2BkC,WAA3B;AACD;;AAED;;;AAGAG,2BAAmB5B,OAAnB,EAA4BC,OAA5B,EAAqClF,GAArC,EAAyC;;AAEvC,gBAAMwH,cAAchM,OAAO4D,iBAAP,CAAyBY,GAAzB,CAApB;AACA,gBAAMyH,YAAYD,YAAYlO,CAA9B;AACA,gBAAMoO,YAAYF,YAAYhO,CAA9B;AACA,gBAAMmO,gBAAgB5H,SAASC,IAAIrB,KAAJ,CAAU0C,KAAnB,CAAtB;AACA,gBAAMuG,iBAAiB5H,IAAInF,GAAJ,CAAQ,kBAAR,EAA4BgN,YAAnD;;AAEA,cAAI5C,UAAUwC,SAAV,IACAxC,UAAUwC,YAAYE,aADtB,IAEAzC,UAAUwC,SAFV,IAGAxC,UAAUwC,YAAYE,cAH1B,EAG0C;AACtC;AACA,mBAAO,IAAP;AACH;AACD,iBAAO,KAAP;AACD;;AAED,cAAML,cAAN,CAAqB7B,WAArB,EAAiC;;AAE/B;AACA,cAAIA,YAAY1I,aAAZ,CAA0B8K,QAA1B,KAAuC,qBAA3C,EAAkE;;AAElE,gBAAMC,sBAAsBvM,OAAO4D,iBAAP,CAAyBsG,WAAzB,CAA5B;AACA,gBAAMsC,IAAIjI,SAAS2F,YAAY/G,KAAZ,CAAkB0C,KAA3B,CAAV;AACA,gBAAM4G,IAAIlI,SAAS,KAAKnF,SAAL,CAAe+D,KAAf,CAAqB2C,MAA9B,CAAV;AACA,cAAI4G,cAAc,mEAAkB,gEAAlB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAlB;AACA,eAAK9C,UAAL,6DAA+B,WAAW4C,CAAX,GAAe,KAAf,GAAuB,EAAvB,GAA4B,0CAA3D,0EACsBE,WADtB,0HAEiC,0EAFjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA,eAAK9C,UAAL,CAAgB+C,OAAhB,CAAwB,CACpB,EAACC,SAAS,CAAV,EADoB,EAEpB,EAACA,SAAS,GAAV,EAFoB,CAAxB,EAGK;AACDC,sBAAU,KAAKjN;AADd,WAHL;AAMA8M,sBAAYC,OAAZ,CAAoB,CAClB,EAAC9G,OAAO,CAAR,EADkB,EAElB,EAACA,OAAO2G,CAAR,EAFkB,CAApB,EAGG,EAACK,UAAU,KAAKjN,oBAAhB,EAHH;AAIA;AACApB,mBAASiD,IAAT,CAAcyD,WAAd,CAA0B,KAAK0E,UAA/B;AACA,eAAKA,UAAL,CAAgBzG,KAAhB,CAAsB2J,WAAtB,CAAkC,UAAlC,EAA8C,UAA9C;AACA9M,iBAAOqK,iBAAP,CAAyB,KAAKT,UAA9B,EAA0C2C,mBAA1C;AACA,eAAK3C,UAAL,CAAgBzG,KAAhB,CAAsB2J,WAAtB,CAAkC,SAAlC,EAA6C,MAA7C;AACA;AACA,eAAKlD,UAAL,CAAgBK,SAAhB,GAA4BF,KAAKC,GAAL,EAA5B;AACD;;AAEDQ,yBAAiB;AACf,eAAKZ,UAAL,CAAgBhI,MAAhB;AACA,eAAKgI,UAAL,GAAkB,IAAlB;AACD;;AAED,cAAMzB,eAAN,GAAwB;;AAEtB,cAAI,CAAC,KAAK4E,YAAL,EAAL,EAA0B;;AAE1B,cAAI5C,UAAU,KAAK6C,cAAL,EAAd;AACA,cAAIC,eAAe9C,QAAQ5K,UAA3B;;AAEA,eAAK,IAAI2N,KAAT,IAAkBD,YAAlB,EAAgC;AAC9B,gBAAIC,SAASA,MAAM9E,cAAf,IAAiC8E,MAAM9E,cAAN,EAArC,EAA6D;AAC3D,kBAAI,MAAM,KAAKC,gBAAL,EAAV,EAAmC;AACjC,uBAAO,IAAP;AACD;AACD;AACA,qBAAO,KAAP;AACD;AACF;AACD,iBAAO,KAAP;AAED;;AAED;;;AAGAhH,kBAAU8L,SAAV,EAAqB;AACnB,cAAIA,SAAJ,EAAe;AACb,gBAAIC,aAAa,KAAKvN,MAAtB;AACAuN,uBAAW5L,aAAX,CAAyB6L,YAAzB,CAAsCF,SAAtC,EAAiDC,UAAjD;AACD;AACF;;AAEDJ,yBAAiB;AACf,cAAI,KAAKD,YAAL,EAAJ,EAAyB;AACvB,mBAAO,KAAKxN,UAAL,CAAgB,CAAhB,CAAP;AACD;AACD,iBAAO,IAAP;AACD;;AAEDwN,uBAAe;AACb,iBAAO,KAAKrL,SAAL,CAAe2B,QAAf,CAAwB,qBAAxB,CAAP;AACD;;AAED;;AAEAiK,sBAAcC,WAAd,EAA2B;AACzB,eAAKjM,UAAL,GAAkBiM,YAAY1N,MAA9B;AACD;;AA9tBuC;;yBAArBzB,M;;;;;;;;6BAAAA,uC","file":"lively-window.js","sourcesContent":["/*MD # Window\n\n![](lively-window.png){height=200}\n\nMD*/\n\n\nimport Morph from 'src/components/widgets/lively-morph.js';  \nimport { pt } from 'src/client/graphics.js';\nimport { Grid } from 'src/client/morphic/snapping.js';\nimport Preferences from 'src/client/preferences.js';\n\n// #TODO extract\nfunction getPointFromAttribute(element, attrX, attrY) {\n  var x = element.getAttribute(attrX)\n  var y = element.getAttribute(attrY)\n  return pt(parseFloat(x), parseFloat(y)) \n}\n \nfunction setPointToAttribute(element, attrX, attrY,  p) {\n  element.setAttribute(attrX, p.x)\n  element.setAttribute(attrY, p.y)\n}\n\nexport default class Window extends Morph {\n  \n  static allWindows() {\n    return Array.from(document.querySelectorAll('*')).filter(ea => ea.isWindow);\n  }\n  /*MD ## Getter / Setter MD*/\n  get title() {\n    return this.getAttribute(\"title\")\n  }\n  set title(val) {\n    this.setAttribute(\"title\", val)\n  }\n  get isWindow() { return true }\n  get minimizedWindowWidth() { return 300 }\n  get minimizedWindowPadding() { return 10 }\n\n  get active() { return this.hasAttribute('active') }\n  get isFixed() { return this.hasAttribute('fixed') }\n  get titleSpan() { return this.get('.window-title span') }\n  get target() { return this.childNodes[0] }\n  get window() { return this.get('.window') }\n  get maxButton() { return this.get('.window-max') }\n  get windowTitle() { return this.get('.window-title') }\n\n  get minZIndex() {\n    return 100\n  }\n  // time (in ms) to wait until a tab is created when dropping\n  get tabbingTimeThreshold() { return 700; }\n  get tabBar() {\n    return this.get(\"#tab-bar-identifier\");\n  }\n  \n  setExtent(extent) {\n    lively.setExtent(this, extent)\n    if (this.target)\n      this.target.dispatchEvent(new CustomEvent(\"extent-changed\"))\n  }\n  /*MD ## Setup MD*/\n  \n  initialize() {    \n    this.setup();\n    this.created = true;\n    this.render();\n\n    if (this.isMinimized() || this.isMaximized())\n      this.displayResizeHandle(false);\n\n    this._attrObserver = new MutationObserver(mutations => {\n      mutations.forEach(mutation => {\n        if(mutation.type == \"attributes\") {\n          this.attributeChangedCallback(\n            mutation.attributeName,\n            mutation.oldValue,\n            mutation.target.getAttribute(mutation.attributeName)\n          )\n        }\n      });\n    });\n    this._attrObserver.observe(this, { attributes: true });\n    \n    this.setAttribute(\"tabindex\", 0);\n    \n    this.setTabBar(this.formerTabs);\n    \n  }\n\n  attachedCallback() {\n    if (this.parentElement === document.body) {\n      this.classList.add(\"global\")\n    } else {\n      this.classList.remove(\"global\") \n    }\n  } \n\n  attributeChangedCallback(attrName, oldValue, newValue) {\n    switch (attrName) {\n      case 'title':\n        this.render();\n        break;\n      case 'icon':\n        this.render();\n        break;\n      case 'fixed':\n        this.reposition();\n        break;\n      default:\n        //\n    }\n  }\n\n  bindEvents() {\n    try {\n      this.addEventListener('created', (evt) => this.focus());\n      this.addEventListener('extent-changed', (evt) => { this.onExtentChanged(); });\n      this.windowTitle.addEventListener('pointerdown', (evt) => { this.onTitleMouseDown(evt) });\n      this.windowTitle.addEventListener('dblclick', (evt) => { this.onTitleDoubleClick(evt) });\n      this.addEventListener('mousedown', (evt) => lively.focusWithoutScroll(this), true);\n      this.get('.window-menu').addEventListener('click', evt => { this.onMenuButtonClicked(evt); });\n      this.get('.window-min').addEventListener('click', evt => { this.onMinButtonClicked(evt); });\n      this.get('.window-unmin').addEventListener('click', evt => { this.onMinButtonClicked(evt); });\n\n      this.maxButton.addEventListener('click', evt => { this.onMaxButtonClicked(evt); });\n      this.addEventListener('dblclick', evt => { this.onDoubleClick(evt); });\n      this.get('.window-close').addEventListener('click', evt => { this.onCloseButtonClicked(evt); });\n      this.addEventListener('keyup', evt => { this.onKeyUp(evt); });\n    } catch (err) {\n      console.log(\"Error, binding events! Continue anyway!\", err)\n    }\n  }\n\n\n\n  setup() {\n    this.dragging = false;\n    this.bindEvents();\n  }\n\n \n  /*MD ## Window MD*/\n  \n  isFullscreen() {\n    return this.get(\".window-titlebar\").style.display == \"none\"\n  }\n\n  isMinimized() {\n    return this.classList.contains(\"minimized\")\n  }\n\n  isMaximized() {\n    return this.classList.contains(\"maximized\")\n  }\n  \n  render() {\n    if (this.created) {\n      var icon = this.attributes['icon'];\n      var title = this.attributes['title'];\n      var content = '';\n      if (icon && title) {\n        content = icon.value + ' ' + title.value.slice(0, 50);\n      } else if (icon) {\n        content = icon.value;\n      } else if (title) {\n        content = title.value.slice(0, 50);\n      }\n      this.titleSpan.innerHTML = content;\n    }\n  }\n\n  reposition() {\n    let pos = lively.getGlobalPosition(this);\n    if (this.isFixed) {\n      lively.setPosition(this, pos);\n      this.classList.add('window-fixed');\n    } else {\n      lively.setPosition(this, pos.addPt(lively.getScroll()))\n      this.classList.remove('window-fixed')\n    }\n  }\n\n  allWindows() {\n    return Window.allWindows()\n  }\n \n  focus() {\n    let allWindows = this.allWindows();\n    let thisIdx = allWindows.indexOf(this);\n    let allWindowsButThis = allWindows;\n    allWindowsButThis.splice(thisIdx, 1);\n    allWindowsButThis.sort((a, b) => {\n      return parseInt(a.style['z-index']) - parseInt(b.style['z-index']);\n    });\n\n    allWindowsButThis.forEach((win, index) => {\n      win.style['z-index'] = this.minZIndex + index;\n      if (win.window)\n        win.window.classList.remove('focused');\n      win.removeAttribute('active');\n    });\n\n    if (this.isFullscreen()) {\n      // fullscreen and everything is in front of me...\n      this.style['z-index'] = 0;\n    } else {\n      this.style['z-index'] = this.minZIndex + allWindowsButThis.length;\n\n    }\n\n    this.window.classList.add('focused');\n    this.setAttribute('active', true);\n\n    // this.bringMinimizedWindowsToFront()\n\n    if (this.target && this.target.focus) this.target.focus()\n  }\n\n  bringMinimizedWindowsToFront() {\n    var allWindows = this.allWindows();\n    allWindows.filter(ea => ea.isMinimized()).forEach(ea => {\n      ea.style['z-index'] = this.minZIndex + allWindows.length + 1\n    });\n  }  \n  \n  getAddOnRoot() {\n    return this.shadowRoot.querySelector(\"#window-global\")\n  }\n\n  /* embed content in parent and remove yourself */\n  embedContentInParent() {\n    var content = this.querySelector(\"*\")\n    var pos = lively.getPosition(this);\n    this.parentElement.appendChild(content);\n    lively.setPosition(content, pos);\n    this.remove()\n  }\n\n  \n  detachedCallback() {\n    if (this.isMaximized()) {\n      document.body.style.overflow = this.getAttribute(\"prev-overflow\")\n    }\n  }\n  \n  /*MD ## Maximize/Minimize MD*/\n\n  // #important\n  toggleMaximize() {\n    var content = this.get('#window-content');\n    var maxButtonI = this.maxButton.querySelector('i')\n    if (this.isMaximized()) {\n      this.restoreExtentAndPosition()\n      \n      maxButtonI.classList.remove('fa-compress')\n      maxButtonI.classList.add('fa-expand');\n      \n      content.style.display = \"block\";\n      document.body.style.overflow = this.getAttribute(\"prev-overflow\")\n      this.classList.remove(\"maximized\")\n    } else {\n      if (this.isMinimized()) {\n        return this.toggleMinimize()\n      }\n\n      maxButtonI.classList.add('fa-compress')\n      maxButtonI.classList.remove('fa-expand');\n\n      \n      this.storeExtentAndPosition()\n      this.setAttribute(\"prev-overflow\", document.body.style.overflow)\n\n      this.style.position = \"fixed\"\n      this.style.top = 0;\n      this.style.left = 0;\n      this.style.width = \"100%\";\n      this.style.height = \"100%\";\n      document.body.style.overflow = \"hidden\"\n      if (this.target)\n        this.target.dispatchEvent(new CustomEvent(\"extent-changed\"))\n      \n      this.classList.add(\"maximized\")\n    }\n    this.bringMinimizedWindowsToFront()\n    this.displayResizeHandle(!this.isMaximized())\n  }\n\n  displayResizeHandle(bool) {\n    if (bool === undefined) bool = true;\n    this.getAllSubmorphs('lively-resizer').forEach(ea => {\n      ea.style.display = bool ? \"block\" : \"none\";\n    })\n  }\n  \n  \n  storeExtentAndPosition() {\n    setPointToAttribute(this, \"prev-left\", \"prev-top\", lively.getPosition(this))\n    setPointToAttribute(this, \"prev-width\", \"prev-height\", lively.getExtent(this))\n  }\n  \n\n  restoreExtentAndPosition() {\n    lively.setPosition(this, getPointFromAttribute(this, \"prev-left\", \"prev-top\"))\n    lively.setExtent(this, getPointFromAttribute(this, \"prev-width\", \"prev-height\"))            \n  }\n\n  // #important\n  toggleMinimize() {\n\n    var content = this.get('#window-content');\n    if (this.classList.contains(\"minimized\")) {\n      \n      // min -> normal\n      \n      this.displayResizeHandle(true)\n      \n      setPointToAttribute(this, \"prev-min-left\", \"prev-min-top\", lively.getPosition(this))\n      this.restoreExtentAndPosition()\n      \n      this.classList.remove(\"minimized\")\n\n      content.style.display = \"block\";\n      // restore title\n      this.setAttribute(\"title\", this.getAttribute(\"prev-title\"));\n      \n      this.target.style.display = \"\"\n      content.style.pointerEvents = \"\"\n\n    } else {\n      if (this.isMaximized()) {\n        return this.toggleMaximize()\n      }\n      \n      // normal -> min\n      \n      this.storeExtentAndPosition()\n      lively.setPosition(this, getPointFromAttribute(this, \"prev-min-left\", \"prev-min-top\"))\n      \n      // set title\n      var prevTitle = this.getAttribute(\"title\") != null ? this.getAttribute(\"title\") : \"\";\n      this.setAttribute(\"prev-title\", prevTitle);\n      \n      // update title\n      var minTitle = this.getAttribute(\"title\") + \" (minimized)\";\n      if (this.target.livelyMinimizedTitle) {\n        minTitle = this.target.livelyMinimizedTitle()\n      }\n      this.setAttribute(\"title\",  minTitle )\n      var titleExtent = lively.getExtent(this.get(\".window-titlebar\"))\n      lively.setExtent(this, pt(400, titleExtent.y + 4))\n      \n      this.classList.add(\"minimized\")\n      this.target.style.display = \"none\"\n      content.style.pointerEvents = \"none\"\n      this.displayResizeHandle(false)\n    }\n    this.bringMinimizedWindowsToFront()\n  }\n  \n\n\n  \n  // #depricated #notused \n  togglePined() {\n    let isPinned = this.style.position == \"fixed\"\n    if (isPinned) {\n      this.removeAttribute('fixed');\n      this.style.position = \"absolute\" // does not seem to work with css? #Jens\n    } else {\n      this.setAttribute('fixed', '');\n      this.style.position = \"fixed\" // does not seem to work with css? #Jens\n    }\n  }  \n  /*MD ## Events MD*/\n\n  onMinButtonClicked(evt) {\n    if (evt.shiftKey) {\n      document.scrollingElement.scrollTop = 0\n      document.scrollingElement.scrollLeft = 0\n      lively.moveBy(document.body, lively.getGlobalPosition(this).scaleBy(-1))\n      lively.setExtent(this, lively.getExtent(this).withY(window.innerHeight - 8))\n    } else {\n      this.toggleMinimize()\n    }\n    evt.stopPropagation()\n  }\n\n  onMaxButtonClicked(evt) {\n    if (evt.shiftKey) {\n      this.togglePined()\n    } else {\n      this.toggleMaximize()\n    }\n  }\n\n  onMenuButtonClicked(evt) {\n    lively.openContextMenu(document.body, evt, this.target);\n  }\n\n  onTitleMouseDown(evt) {    \n    evt.preventDefault();\n    evt.stopPropagation();\n    lively.focusWithoutScroll(this)\n\n    if (this.positionBeforeMaximize) return; // no dragging when maximized\n\n    if (this.isFixed) {\n      let offsetWindow = this.getBoundingClientRect()\n      this.dragging = pt(evt.pageX - offsetWindow.left, evt.pageY - offsetWindow.top)\n\n    } else {\n      this.draggingStart = lively.getPosition(this)\n      if (isNaN(this.draggingStart.x) || isNaN(this.draggingStart.y)) {\n        throw new Error(\"Drag failed, because window Position is not a number\")\n      }\n      this.dragging = pt(evt.clientX, evt.clientY)\n    }\n    lively.removeEventListener('lively-window-drag', this.windowTitle)\n    \n    lively.addEventListener('lively-window-drag', document.documentElement, 'pointermove',\n      evt => this.onWindowMouseMove(evt), true);\n    lively.addEventListener('lively-window-drag', document.documentElement, 'pointerup',\n      async evt => await this.onWindowMouseUp(evt));\n    this.window.classList.add('dragging', true);\n  }\n\n  async onCloseButtonClicked(evt) {\n    \n    if (await this.saveTabsOnClose()) {\n      return;\n    }\n    \n    if (this.target && this.target.unsavedChanges && this.target.unsavedChanges()) {\n      if (await this.askToCloseWindow()) return;\n    }\n    if (this.positionBeforeMaximize)\n      this.toggleMaximize()\n\n    this.parentNode.removeChild(this);\n    if (this.afterWindowClosed instanceof Function) {\n      this.afterWindowClosed();\n    }\n    \n    var last = this.allWindows().first\n    if (last) {\n      lively.focusWithoutScroll(last)\n    }\n  }  \n  \n  \n  onWindowMouseMove(evt) {    \n    // lively.showEvent(evt)\n    \n    if (this.dragging) {\n      evt.preventDefault();\n      evt.stopPropagation();\n      \n      if (this.isFixed) {\n        lively.setPosition(this, pt(evt.clientX, evt.clientY).subPt(this.dragging));\n      } else {\n        if (lively.preferences.get(\"TabbedWindows\")) {\n          this.rememberWindowCollision(evt);\n        }\n        var pos = this.draggingStart.addPt(pt(evt.pageX, evt.pageY))\n          .subPt(this.dragging).subPt(lively.getScroll())\n        lively.setPosition(this, Grid.optSnapPosition(pos, evt))\n      }\n    }\n  }\n  \n\n  async onWindowMouseUp(evt) {\n    evt.preventDefault();\n    this.dragging = false;\n    // this.windowTitle.releasePointerCapture(evt.pointerId)\n    this.window.classList.remove('dragging');\n    this.window.classList.remove('resizing');\n    lively.removeEventListener('lively-window-drag',  document.documentElement);\n    \n    if (this.dropintoOtherWindow) {\n      await this.createTabsWrapper(evt);\n    }\n    this.dropintoOtherWindow = null\n  }\n\n  onExtentChanged(evt) {\n    if (this.target) {\n      this.target.dispatchEvent(new CustomEvent(\"extent-changed\"));\n    }\n  }\n\n  onDoubleClick(evt) {\n    if (this.isMinimized()) {\n      this.toggleMinimize()\n    }\n  }\n\n  onTitleDoubleClick(evt) {\n    this.toggleMaximize()\n    evt.stopPropagation()\n  }  \n  \n  onKeyUp(evt) {\n    var char = String.fromCharCode(evt.keyCode || evt.charCode);\n    if ((evt.altKey) && char == \"W\") { // is this  \"evt.ctrlKey\" used unter Mac? , it makes problems under Windows\n      this.onCloseButtonClicked(evt)\n      evt.preventDefault();\n    }\n  }\n  \n  /*\n    Returns: \n            true: The User confirmed (\"clicked Ok\")\n            false: The User canceled (\"clicked cancel\")\n  */\n  async askToCloseWindow() {    \n      return !( await lively.confirm(\"Window contains unsaved changes, close anyway?\") );\n  }\n  \n  \n  \n  /*MD ## Tabs MD*/\n  /*\n    Checks, if two windows collide. \n    If so, they are both inserted into a newly created Tabs-Wrapper.\n    If one of the windows is already a tabs wrapper, the other one is inserted into it.\n  */\n  async createTabsWrapper(evt){\n    \n    const cursorX = evt.clientX;\n    const cursorY = evt.clientY;      \n    \n    if (!this.dropintoOtherWindow) return;\n    \n    // Join windows if cursor was in pluswindow and one second is gone since\n    // the cursor entered the window.\n    var rect = this.plusSymbol.getBoundingClientRect();\n    if(cursorX > rect.left && cursorX < rect.right &&\n       cursorY > rect.top && cursorY < rect.bottom &&\n       Date.now() - this.plusSymbol.addedTime > this.tabbingTimeThreshold) { \n      \n      var otherWindow = this.dropintoOtherWindow;\n      \n      if (! (otherWindow.classList.contains(\"containsTabsWrapper\") || this.classList.contains(\"containsTabsWrapper\"))) {\n        \n        var wrapper = await (<lively-tabs-wrapper></lively-tabs-wrapper>);        \n        var windowOfWrapper = await (<lively-window>{wrapper}</lively-window>);\n        windowOfWrapper.classList.add(\"containsTabsWrapper\");\n        \n        document.body.appendChild(windowOfWrapper);\n\n        lively.setGlobalPosition(windowOfWrapper, lively.getGlobalPosition(otherWindow));\n        lively.setPosition(windowOfWrapper, lively.getPosition(windowOfWrapper));\n        lively.setExtent(windowOfWrapper, lively.getExtent(otherWindow));\n\n        await wrapper.addWindow(otherWindow)\n        await wrapper.addWindow(this)        \n      } else {\n        await this.joinWithTabsWrapper(otherWindow);\n      }\n    }\n    \n    if(this.plusSymbol) {\n      this.hidePlusSymbol();\n    }\n    \n  }\n  \n  async joinWithTabsWrapper(otherWindow) {\n    /*\n      When adding a window to a wrapper, there are 3 cases:\n        (1) Win1 is a tabs wrapper, but win2 is not.\n        (2) Win1 is not a tabs wrapper, but Win2 is one.\n        (3) Both windows are tabs wrappers.\n    */\n    if (otherWindow.classList.contains(\"containsTabsWrapper\") &&  this.classList.contains(\"containsTabsWrapper\")) {\n      // Case (3)\n      // Get both wrappers\n      var otherTW = otherWindow.get(\"lively-tabs-wrapper\");\n      var thisTW = this.get(\"lively-tabs-wrapper\");\n          \n      // Merge both wrappers\n      if (otherTW && thisTW) {\n            \n        var children = thisTW.children;\n        var numberOfChildren = children.length;\n\n        for (var childrenCounter = 0; childrenCounter < numberOfChildren; childrenCounter++) {\n          const child = children[0];\n          await otherTW.addContent(child, child.title);\n        }\n      }\n      // Remove one of the wrappers\n      this.remove();   \n    } else {\n          \n      // Case (1) & (2)\n      if (otherWindow.classList.contains(\"containsTabsWrapper\")) {                          \n        var existingWrapper = otherWindow.get(\"lively-tabs-wrapper\");\n        existingWrapper.addWindow(this);\n      } else {\n        if (this.classList.contains(\"containsTabsWrapper\")) {\n          let pos = lively.getPosition(otherWindow);\n          var wrapperOfThisWindow = this.get(\"lively-tabs-wrapper\");\n          wrapperOfThisWindow.addWindow(otherWindow);\n          lively.setPosition(this, pos);\n        }\n      }\n          \n    }        \n  }\n  \n  async rememberWindowCollision(evt) {\n    \n    const cursorX = evt.clientX;\n    const cursorY = evt.clientY;\n    \n    var tabbableWin = null;\n    \n    // Filter colliding windows whether they collide with the current window or not\n    var allNonTabbedWindows = this.allWindows().filter( (win) => !win.classList.contains(\"tabbed\") );\n    var allCollidingWindows = allNonTabbedWindows.filter(function(win) {\n    \n      // Do not show the plus symbol for tabbed windows!\n      if (win.classList.contains(\"tabbed\")) {\n        return true;\n      }\n      return this !== win &&  win.cursorCollidesWith && win.cursorCollidesWith( cursorX, cursorY, win );\n    }, this);\n    \n    // Filter for windows, which do not lay on top. \n    if(allCollidingWindows && allCollidingWindows.length > 0) {\n      // find win with max z-index\n      self.lastCollidingWindow = allCollidingWindows;\n      tabbableWin = allCollidingWindows.reduce(function(prev, current) {\n        var zIndexPrev = parseInt(window.getComputedStyle(prev).getPropertyValue(\"z-index\"));\n        var zIndexCurrent = parseInt(window.getComputedStyle(current).getPropertyValue(\"z-index\"));\n        return (zIndexPrev > zIndexCurrent) ? prev : current;\n      });\n    }\n    \n    // Hide plusSymbol (drop area)\n    if(this.plusSymbol && tabbableWin != this.dropintoOtherWindow) {\n      this.hidePlusSymbol();\n    }\n    // Show plusSymbol (drop area)\n    if(tabbableWin && tabbableWin != this.dropintoOtherWindow) {\n      await this.showPlusSymbol( tabbableWin );\n    }\n    this.dropintoOtherWindow = tabbableWin;                                    \n  }\n  \n  /*\n  Demermines, whether the cursor is over a window or not\n  */\n  cursorCollidesWith(cursorX, cursorY, win){\n    \n    const otherWinPos = lively.getGlobalPosition(win);    \n    const otherWinX = otherWinPos.x;\n    const otherWinY = otherWinPos.y;\n    const otherWinWidth = parseInt(win.style.width);\n    const otherWinHeight = win.get('.window-titlebar').offsetHeight;\n    \n    if (cursorX > otherWinX && \n        cursorX < otherWinX + otherWinWidth &&\n        cursorY > otherWinY &&\n        cursorY < otherWinY + otherWinHeight) {\n        // Cursor is in other window\n        return true;              \n    }\n    return false;\n  }\n  \n  async showPlusSymbol(otherWindow){\n    \n    // If the parent is a tabs wrapper (aka currently looking at a tab) --> dont show a window\n    if (otherWindow.parentElement.nodeName === \"LIVELY-TABS-WRAPPER\") return;\n    \n    const otherWindowPosition = lively.getGlobalPosition(otherWindow);\n    const w = parseInt(otherWindow.style.width);\n    const h = parseInt(this.titleSpan.style.height);\n    var progressBar = await (<div style=\"height:2px;width:100%;background-color:white;align-self:start;\"/>);\n    this.plusSymbol = (<div style={\"width:\" + w + \"px;\" + \"\" + \"px;background-color:#778899;opacity:0.6;\"}>\n                         {progressBar}\n                         <span style=\"font-size:16px;text-align:center;color:#ffffff;margin:auto;display:block\">Add a new tab</span>\n                       </div>);\n    // start animations\n    this.plusSymbol.animate([\n        {opacity: 0},\n        {opacity: 0.6},\n      ], {\n        duration: this.tabbingTimeThreshold\n    });\n    progressBar.animate([\n      {width: 0},\n      {width: w}\n    ], {duration: this.tabbingTimeThreshold});\n    // add to DOM\n    document.body.appendChild(this.plusSymbol);\n    this.plusSymbol.style.setProperty(\"position\", \"absolute\");\n    lively.setGlobalPosition(this.plusSymbol, otherWindowPosition);\n    this.plusSymbol.style.setProperty(\"z-index\", 100000);\n    // Set time for threshold\n    this.plusSymbol.addedTime = Date.now();\n  }\n  \n  hidePlusSymbol() {\n    this.plusSymbol.remove();\n    this.plusSymbol = null;\n  }\n  \n  async saveTabsOnClose() {\n    \n    if (!this.containsTabs()) return;\n  \n    let wrapper = this.getTabsWrapper();\n    let tabsContents = wrapper.childNodes;\n    \n    for (let eaWin of tabsContents) {      \n      if (eaWin && eaWin.unsavedChanges && eaWin.unsavedChanges()) {\n        if (await this.askToCloseWindow()) {\n          return true;\n        } \n        // Do not ask multiple times for each tab.\n        return false;\n      }\n    }\n    return false;    \n    \n  }\n  \n  /*\n    Allows to place a custom tab bar element.\n  */ \n  setTabBar(newTabBar) {\n    if (newTabBar) {\n      let currTabBar = this.tabBar;\n      currTabBar.parentElement.replaceChild(newTabBar, currTabBar); \n    }\n  }\n  \n  getTabsWrapper() {\n    if (this.containsTabs()) {\n      return this.childNodes[0];\n    }\n    return null;\n  }\n   \n  containsTabs() {\n    return this.classList.contains(\"containsTabsWrapper\");\n  }\n  \n  /*MD ## Hooks MD*/\n  \n  livelyMigrate(oldInstance) {\n    this.formerTabs = oldInstance.tabBar;\n  }\n\n}\n"]}