{"version":3,"sources":["snabbdom-patch.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","snabbdom","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","addNS","data","children","sel","ns","undefined","VNode","is","b","c","text","array","primitive","./is","./vnode","2","createElement","tagName","document","createElementNS","namespaceURI","qualifiedName","createTextNode","insertBefore","parentNode","newNode","referenceNode","removeChild","node","child","appendChild","parentElement","nextSibling","setTextContent","textContent","3","Array","isArray","4","updateAttrs","oldVnode","vnode","key","cur","old","namespaceSplit","elm","oldAttrs","attrs","booleanAttrsDict","removeAttribute","split","NamespaceURIs","hasOwnProperty","setAttributeNS","setAttribute","xlink","booleanAttrs","Object","create","len","update","5","updateClass","name","oldClass","klass","classList","remove","6","invokeHandler","handler","event","args","slice","push","apply","handleEvent","type","on","createListener","updateEventListeners","oldOn","oldListener","listener","oldElm","removeEventListener","addEventListener","destroy","7","updateProps","oldProps","props","8","setNextFrame","obj","prop","val","nextFrame","updateStyle","oldStyle","style","oldHasDel","delayed","applyDestroyStyle","applyRemoveStyle","rm","compStyle","amount","applied","getComputedStyle","indexOf","ev","target","raf","requestAnimationFrame","setTimeout","fn","9","patch","init","h","./h","./modules/attributes","./modules/class","./modules/eventlisteners","./modules/props","./modules/style","./snabbdom","10","isUndef","isDef","sameVnode","vnode1","vnode2","createKeyToOldIdx","beginIdx","endIdx","map","modules","api","emptyNodeAt","id","className","join","toLowerCase","createRmCb","childElm","listeners","parent","createElm","insertedVnodeQueue","hook","hashIdx","dotIdx","hash","dot","tag","Math","min","replace","cbs","emptyNode","insert","addVnodes","parentElm","before","vnodes","startIdx","invokeDestroyHook","j","removeVnodes","ch","updateChildren","oldCh","newCh","oldKeyToIdx","idxInOld","elmToMove","oldStartIdx","newStartIdx","oldEndIdx","oldStartVnode","oldEndVnode","newEndIdx","newStartVnode","newEndVnode","patchVnode","prepatch","postpatch","domApi","hooks","pre","post","./htmldomapi","11"],"mappings":"CAAA,SAAUA,GAAG,GAAoB,gBAAVC,UAAoC,mBAATC,QAAsBA,OAAOD,QAAQD,QAAS,IAAmB,kBAATG,SAAqBA,OAAOC,IAAKD,UAAUH,OAAO,CAAC,GAAIK,EAAkCA,GAAb,mBAATC,QAAwBA,OAA+B,mBAATC,QAAwBA,OAA6B,mBAAPC,MAAsBA,KAAYC,KAAKJ,EAAEK,SAAWV,MAAO,WAAqC,MAAO,SAAUW,GAAEC,EAAEC,EAAEC,GAAG,QAASC,GAAEC,EAAEC,GAAG,IAAIJ,EAAEG,GAAG,CAAC,IAAIJ,EAAEI,GAAG,CAAC,GAAIE,GAAkB,kBAATC,UAAqBA,OAAQ,KAAIF,GAAGC,EAAE,MAAOA,GAAEF,GAAE,EAAI,IAAGI,EAAE,MAAOA,GAAEJ,GAAE,EAAI,IAAIhB,GAAE,GAAIqB,OAAM,uBAAuBL,EAAE,IAAK,MAAMhB,GAAEsB,KAAK,mBAAmBtB,EAAE,GAAIuB,GAAEV,EAAEG,IAAIf,WAAYW,GAAEI,GAAG,GAAGQ,KAAKD,EAAEtB,QAAQ,SAASU,GAAG,GAAIE,GAAED,EAAEI,GAAG,GAAGL,EAAG,OAAOI,GAAEF,EAAEA,EAAEF,IAAIY,EAAEA,EAAEtB,QAAQU,EAAEC,EAAEC,EAAEC,GAAG,MAAOD,GAAEG,GAAGf,QAAkD,IAAI,GAA1CmB,GAAkB,kBAATD,UAAqBA,QAAgBH,EAAE,EAAEA,EAAEF,EAAEW,OAAOT,IAAID,EAAED,EAAEE,GAAI,OAAOD,KAAKW,GAAG,SAASP,EAAQjB,EAAOD,GAIv0B,QAAS0B,GAAMC,EAAMC,EAAUC,GAG7B,GAFAF,EAAKG,GAAK,6BAEE,kBAARD,GAAwCE,SAAbH,EAC7B,IAAK,GAAIT,GAAI,EAAGA,EAAIS,EAASJ,SAAUL,EACrCO,EAAME,EAAST,GAAGQ,KAAMC,EAAST,GAAGS,SAAUA,EAAST,GAAGU,KARhE,GAAIG,GAAQd,EAAQ,WAChBe,EAAKf,EAAQ,OAYjBjB,GAAOD,QAAU,SAAW6B,EAAKK,EAAGC,GAClC,GAAeP,GAAUQ,EAAMjB,EAA3BQ,IAUJ,IATUI,SAANI,GACFR,EAAOO,EACHD,EAAGI,MAAMF,GAAMP,EAAWO,EACrBF,EAAGK,UAAUH,KAAMC,EAAOD,IACpBJ,SAANG,IACLD,EAAGI,MAAMH,GAAMN,EAAWM,EACrBD,EAAGK,UAAUJ,GAAME,EAAOF,EAC5BP,EAAOO,GAEZD,EAAGI,MAAMT,GACX,IAAKT,EAAI,EAAGA,EAAIS,EAASJ,SAAUL,EAC7Bc,EAAGK,UAAUV,EAAST,MAAKS,EAAST,GAAKa,EAAMD,OAAWA,OAAWA,OAAWH,EAAST,IAMjG,OAHe,MAAXU,EAAI,IAAyB,MAAXA,EAAI,IAAyB,MAAXA,EAAI,IAC1CH,EAAMC,EAAMC,EAAUC,GAEjBG,EAAMH,EAAKF,EAAMC,EAAUQ,EAAML,WAGvCQ,OAAO,EAAEC,UAAU,KAAKC,GAAG,SAASvB,EAAQjB,EAAOD,GACtD,QAAS0C,GAAcC,GACrB,MAAOC,UAASF,cAAcC,GAGhC,QAASE,GAAgBC,EAAcC,GACrC,MAAOH,UAASC,gBAAgBC,EAAcC,GAGhD,QAASC,GAAeZ,GACtB,MAAOQ,UAASI,eAAeZ,GAIjC,QAASa,GAAaC,EAAYC,EAASC,GACzCF,EAAWD,aAAaE,EAASC,GAInC,QAASC,GAAYC,EAAMC,GACzBD,EAAKD,YAAYE,GAGnB,QAASC,GAAYF,EAAMC,GACzBD,EAAKE,YAAYD,GAGnB,QAASL,GAAWI,GAClB,MAAOA,GAAKG,cAGd,QAASC,GAAYJ,GACnB,MAAOA,GAAKI,YAGd,QAASf,GAAQW,GACf,MAAOA,GAAKX,QAGd,QAASgB,GAAeL,EAAMlB,GAC5BkB,EAAKM,YAAcxB,EAGrBnC,EAAOD,SACL0C,cAAeA,EACfG,gBAAiBA,EACjBG,eAAgBA,EAChBQ,YAAaA,EACbH,YAAaA,EACbJ,aAAcA,EACdC,WAAYA,EACZQ,YAAaA,EACbf,QAASA,EACTgB,eAAgBA,QAGZE,GAAG,SAAS3C,EAAQjB,EAAOD,GACjCC,EAAOD,SACLqC,MAAOyB,MAAMC,QACbzB,UAAW,SAASxB,GAAK,MAAoB,gBAANA,IAA+B,gBAANA,UAG5DkD,GAAG,SAAS9C,EAAQjB,EAAOD,GAiBjC,QAASiE,GAAYC,EAAUC,GAC7B,GAAIC,GAAKC,EAAKC,EACgDC,EAD3CC,EAAML,EAAMK,IAC3BC,EAAWP,EAASvC,KAAK+C,MAAOA,EAAQP,EAAMxC,KAAK+C,KAEvD,IAAKD,GAAaC,EAAlB,CACAD,EAAWA,MACXC,EAAQA,KAGR,KAAKN,IAAOM,GACVL,EAAMK,EAAMN,GACZE,EAAMG,EAASL,GACXE,IAAQD,KACNA,GAAOM,EAAiBP,GAC1BI,EAAII,gBAAgBR,IAEpBG,EAAiBH,EAAIS,MAAM,KACxBN,EAAe/C,OAAS,GAAKsD,EAAcC,eAAeR,EAAe,IAC1EC,EAAIQ,eAAeF,EAAcP,EAAe,IAAKH,EAAKC,GAE1DG,EAAIS,aAAab,EAAKC,IAO9B,KAAKD,IAAOK,GACJL,IAAOM,IACXF,EAAII,gBAAgBR,IAjC1B,IAAI,GAZAU,IACFI,MAAS,gCAGPC,GAAgB,kBAAmB,QAAS,YAAa,WAAY,UAAW,UAAW,WAAY,UAC3F,UAAW,iBAAkB,eAAgB,kBAAmB,QAAS,WAAY,YACrF,UAAW,iBAAkB,SAAU,gBAAiB,QAAS,QAAS,YAAa,OAAQ,WAC/F,QAAS,SAAU,WAAY,UAAW,aAAc,SAAU,OAAQ,cAAe,WACzF,WAAY,WAAY,SAAU,WAAY,WAAY,WAAY,aAAc,YACpF,YAAa,gBAAiB,WAE1CR,EAAmBS,OAAOC,OAAO,MAC7BlE,EAAE,EAAGmE,EAAMH,EAAa3D,OAAQL,EAAImE,EAAKnE,IAC/CwD,EAAiBQ,EAAahE,KAAM,CAqCtClB,GAAOD,SAAWqF,OAAQpB,EAAasB,OAAQtB,QAEzCuB,GAAG,SAAStE,EAAQjB,EAAOD,GACjC,QAASyF,GAAYvB,EAAUC,GAC7B,GAAIE,GAAKqB,EAAMlB,EAAML,EAAMK,IACvBmB,EAAWzB,EAASvC,KAATuC,SACX0B,EAAQzB,EAAMxC,KAANwC,QAEZ,IAAKwB,GAAaC,EAAlB,CACAD,EAAWA,MACXC,EAAQA,KAER,KAAKF,IAAQC,GACNC,EAAMF,IACTlB,EAAIqB,UAAUC,OAAOJ,EAGzB,KAAKA,IAAQE,GACXvB,EAAMuB,EAAMF,GACRrB,IAAQsB,EAASD,IACnBlB,EAAIqB,UAAUxB,EAAM,MAAQ,UAAUqB,IAK5CzF,EAAOD,SAAWqF,OAAQI,EAAaF,OAAQE,QAEzCM,GAAG,SAAS7E,EAAQjB,EAAOD,GACjC,QAASgG,GAAcC,EAAS9B,EAAO+B,GACrC,GAAuB,kBAAZD,GAETA,EAAQ1E,KAAK4C,EAAO+B,EAAO/B,OACtB,IAAuB,gBAAZ8B,GAEhB,GAA0B,kBAAfA,GAAQ,GAEjB,GAAuB,IAAnBA,EAAQzE,OACVyE,EAAQ,GAAG1E,KAAK4C,EAAO8B,EAAQ,GAAIC,EAAO/B,OACrC,CACL,GAAIgC,GAAOF,EAAQG,MAAM,EACzBD,GAAKE,KAAKH,GACVC,EAAKE,KAAKlC,GACV8B,EAAQ,GAAGK,MAAMnC,EAAOgC,OAI1B,KAAK,GAAIhF,GAAI,EAAGA,EAAI8E,EAAQzE,OAAQL,IAClC6E,EAAcC,EAAQ9E,IAM9B,QAASoF,GAAYL,EAAO/B,GAC1B,GAAIuB,GAAOQ,EAAMM,KACbC,EAAKtC,EAAMxC,KAAK8E,EAGhBA,IAAMA,EAAGf,IACXM,EAAcS,EAAGf,GAAOvB,EAAO+B,GAInC,QAASQ,KACP,MAAO,SAAST,GAAQC,GACtBK,EAAYL,EAAOD,EAAQ9B,QAI/B,QAASwC,GAAqBzC,EAAUC,GACtC,GAKIuB,GALAkB,EAAQ1C,EAASvC,KAAK8E,GACtBI,EAAc3C,EAAS4C,SACvBC,EAAS7C,EAASM,IAClBiC,EAAKtC,GAASA,EAAMxC,KAAK8E,GACzBjC,EAAML,GAASA,EAAMK,GAIzB,IAAIoC,IAAUH,EAAd,CAKA,GAAIG,GAASC,EAEX,GAAKJ,EAMH,IAAKf,IAAQkB,GAENH,EAAGf,IACNqB,EAAOC,oBAAoBtB,EAAMmB,GAAa,OARlD,KAAKnB,IAAQkB,GAEXG,EAAOC,oBAAoBtB,EAAMmB,GAAa,EAapD,IAAIJ,EAAI,CAEN,GAAIK,GAAW3C,EAAM2C,SAAW5C,EAAS4C,UAAYJ,GAKrD,IAHAI,EAAS3C,MAAQA,EAGZyC,EAMH,IAAKlB,IAAQe,GAENG,EAAMlB,IACTlB,EAAIyC,iBAAiBvB,EAAMoB,GAAU,OARzC,KAAKpB,IAAQe,GAEXjC,EAAIyC,iBAAiBvB,EAAMoB,GAAU,KAa7C7G,EAAOD,SACLqF,OAAQsB,EACRpB,OAAQoB,EACRO,QAASP,QAGLQ,GAAG,SAASjG,EAAQjB,EAAOD,GACjC,QAASoH,GAAYlD,EAAUC,GAC7B,GAAIC,GAAKC,EAAKC,EAAKE,EAAML,EAAMK,IAC3B6C,EAAWnD,EAASvC,KAAK2F,MAAOA,EAAQnD,EAAMxC,KAAK2F,KAEvD,IAAKD,GAAaC,EAAlB,CACAD,EAAWA,MACXC,EAAQA,KAER,KAAKlD,IAAOiD,GACLC,EAAMlD,UACFI,GAAIJ,EAGf,KAAKA,IAAOkD,GACVjD,EAAMiD,EAAMlD,GACZE,EAAM+C,EAASjD,GACXE,IAAQD,GAAgB,UAARD,GAAmBI,EAAIJ,KAASC,IAClDG,EAAIJ,GAAOC,IAKjBpE,EAAOD,SAAWqF,OAAQ+B,EAAa7B,OAAQ6B,QAEzCG,GAAG,SAASrG,EAAQjB,EAAOD,GAIjC,QAASwH,GAAaC,EAAKC,EAAMC,GAC/BC,EAAU,WAAaH,EAAIC,GAAQC,IAGrC,QAASE,GAAY3D,EAAUC,GAC7B,GAAIE,GAAKqB,EAAMlB,EAAML,EAAMK,IACvBsD,EAAW5D,EAASvC,KAAKoG,MACzBA,EAAQ5D,EAAMxC,KAAKoG,KAEvB,IAAKD,GAAaC,EAAlB,CACAD,EAAWA,MACXC,EAAQA,KACR,IAAIC,GAAY,WAAaF,EAE7B,KAAKpC,IAAQoC,GACNC,EAAMrC,KACTlB,EAAIuD,MAAMrC,GAAQ,GAGtB,KAAKA,IAAQqC,GAEX,GADA1D,EAAM0D,EAAMrC,GACC,YAATA,EACF,IAAKA,IAAQqC,GAAME,QACjB5D,EAAM0D,EAAME,QAAQvC,GACfsC,GAAa3D,IAAQyD,EAASG,QAAQvC,IACzC8B,EAAahD,EAAIuD,MAAOrC,EAAMrB,OAGhB,WAATqB,GAAqBrB,IAAQyD,EAASpC,KAC/ClB,EAAIuD,MAAMrC,GAAQrB,IAKxB,QAAS6D,GAAkB/D,GACzB,GAAI4D,GAAOrC,EAAMlB,EAAML,EAAMK,IAAK1D,EAAIqD,EAAMxC,KAAKoG,KACjD,IAAKjH,IAAOiH,EAAQjH,EAAEoG,SACtB,IAAKxB,IAAQqC,GACXvD,EAAIuD,MAAMrC,GAAQqC,EAAMrC,GAI5B,QAASyC,GAAiBhE,EAAOiE,GAC/B,GAAItH,GAAIqD,EAAMxC,KAAKoG,KACnB,KAAKjH,IAAMA,EAAEgF,OAEX,WADAsC,IAGF,IAAI1C,GACA2C,EADM7D,EAAML,EAAMK,IAAUrD,EAAI,EACrB4G,EAAQjH,EAAEgF,OAAQwC,EAAS,EAAGC,IAC7C,KAAK7C,IAAQqC,GACXQ,EAAQlC,KAAKX,GACblB,EAAIuD,MAAMrC,GAAQqC,EAAMrC,EAE1B2C,GAAYG,iBAAiBhE,EAE7B,KADA,GAAI8C,GAAQe,EAAU,uBAAuBxD,MAAM,MAC5C1D,EAAImG,EAAM9F,SAAUL,EACtBoH,EAAQE,QAAQnB,EAAMnG,UAAYmH,GAEvC9D,GAAIyC,iBAAiB,gBAAiB,SAASyB,GACzCA,EAAGC,SAAWnE,KAAO8D,EACV,IAAXA,GAAcF,MAhEtB,GAAIQ,GAAyB,mBAAXvI,SAA0BA,OAAOwI,uBAA0BC,WACzElB,EAAY,SAASmB,GAAMH,EAAI,WAAaA,EAAIG,KAmEpD9I,GAAOD,SAAWqF,OAAQwC,EAAatC,OAAQsC,EAAaX,QAASgB,EAAmBpC,OAAQqC,QAE1Fa,GAAG,SAAS9H,EAAQjB,EAAOD,GACjC,GAAIS,GAAWS,EAAQ,cACnB+H,EAAQxI,EAASyI,MACnBhI,EAAQ,wBACRA,EAAQ,mBACRA,EAAQ,mBACRA,EAAQ,mBACRA,EAAQ,8BAENiI,EAAIjI,EAAQ,MAEhBjB,GAAOD,SAAYiJ,MAAOA,EAAOE,EAAGA,KAEjCC,MAAM,EAAEC,uBAAuB,EAAEC,kBAAkB,EAAEC,2BAA2B,EAAEC,kBAAkB,EAAEC,kBAAkB,EAAEC,aAAa,KAAKC,IAAI,SAASzI,EAAQjB,EAAOD,GAG3K,YAMA,SAAS4J,GAAQ9I,GAAK,MAAaiB,UAANjB,EAC7B,QAAS+I,GAAM/I,GAAK,MAAaiB,UAANjB,EAI3B,QAASgJ,GAAUC,EAAQC,GACzB,MAAOD,GAAO3F,MAAQ4F,EAAO5F,KAAO2F,EAAOlI,MAAQmI,EAAOnI,IAG5D,QAASoI,GAAkBrI,EAAUsI,EAAUC,GAC7C,GAAIhJ,GAAaiD,EAAVgG,IACP,KAAKjJ,EAAI+I,EAAU/I,GAAKgJ,IAAUhJ,EAChCiD,EAAMxC,EAAST,GAAGiD,IACdyF,EAAMzF,KAAMgG,EAAIhG,GAAOjD,EAE7B,OAAOiJ,GAKT,QAASlB,GAAKmB,EAASC,GAYrB,QAASC,GAAY/F,GACnB,GAAIgG,GAAKhG,EAAIgG,GAAK,IAAMhG,EAAIgG,GAAK,GAC7BrI,EAAIqC,EAAIiG,UAAY,IAAMjG,EAAIiG,UAAU5F,MAAM,KAAK6F,KAAK,KAAO,EACnE,OAAO1I,GAAMsI,EAAI3H,QAAQ6B,GAAKmG,cAAgBH,EAAKrI,QAAWJ,OAAWyC,GAG3E,QAASoG,GAAWC,EAAUC,GAC5B,MAAO,YACL,GAAoB,MAAdA,EAAiB,CACrB,GAAIC,GAAST,EAAIpH,WAAW2H,EAC5BP,GAAIjH,YAAY0H,EAAQF,KAK9B,QAASG,GAAU7G,EAAO8G,GACxB,GAAI9J,GAAGQ,EAAOwC,EAAMxC,IAChBkI,GAAMlI,IACJkI,EAAM1I,EAAIQ,EAAKuJ,OAASrB,EAAM1I,EAAIA,EAAE+H,QACtC/H,EAAEgD,GACFxC,EAAOwC,EAAMxC,KAGjB,IAAI6C,GAAK5C,EAAWuC,EAAMvC,SAAUC,EAAMsC,EAAMtC,GAChD,IAAIgI,EAAMhI,GAAM,CAEd,GAAIsJ,GAAUtJ,EAAI4G,QAAQ,KACtB2C,EAASvJ,EAAI4G,QAAQ,IAAK0C,GAC1BE,EAAOF,EAAU,EAAIA,EAAUtJ,EAAIL,OACnC8J,EAAMF,EAAS,EAAIA,EAASvJ,EAAIL,OAChC+J,EAAMJ,QAAkBC,OAAgBvJ,EAAIuE,MAAM,EAAGoF,KAAKC,IAAIJ,EAAMC,IAAQzJ,CAKhF,IAJA2C,EAAML,EAAMK,IAAMqF,EAAMlI,IAASkI,EAAM1I,EAAIQ,EAAKG,IAAMwI,EAAIzH,gBAAgB1B,EAAGoK,GACvBjB,EAAI5H,cAAc6I,GACpEF,EAAOC,IAAK9G,EAAIgG,GAAK3I,EAAIuE,MAAMiF,EAAO,EAAGC,IACzCF,EAAS,IAAG5G,EAAIiG,UAAY5I,EAAIuE,MAAMkF,EAAM,GAAGI,QAAQ,MAAO,MAC9DzJ,EAAGI,MAAMT,GACX,IAAKT,EAAI,EAAGA,EAAIS,EAASJ,SAAUL,EACjCmJ,EAAI9G,YAAYgB,EAAKwG,EAAUpJ,EAAST,GAAI8J,QAErChJ,GAAGK,UAAU6B,EAAM/B,OAC5BkI,EAAI9G,YAAYgB,EAAK8F,EAAItH,eAAemB,EAAM/B,MAEhD,KAAKjB,EAAI,EAAGA,EAAIwK,EAAItG,OAAO7D,SAAUL,EAAGwK,EAAItG,OAAOlE,GAAGyK,EAAWzH,EACjEhD,GAAIgD,EAAMxC,KAAKuJ,KACXrB,EAAM1I,KACJA,EAAEkE,QAAQlE,EAAEkE,OAAOuG,EAAWzH,GAC9BhD,EAAE0K,QAAQZ,EAAmB5E,KAAKlC,QAGxCK,GAAML,EAAMK,IAAM8F,EAAItH,eAAemB,EAAM/B,KAE7C,OAAO+B,GAAMK,IAGf,QAASsH,GAAUC,EAAWC,EAAQC,EAAQC,EAAU/B,EAAQc,GAC9D,KAAOiB,GAAY/B,IAAU+B,EAC3B5B,EAAIrH,aAAa8I,EAAWf,EAAUiB,EAAOC,GAAWjB,GAAqBe,GAIjF,QAASG,GAAkBhI,GACzB,GAAIhD,GAAGiL,EAAGzK,EAAOwC,EAAMxC,IACvB,IAAIkI,EAAMlI,GAAO,CAEf,IADIkI,EAAM1I,EAAIQ,EAAKuJ,OAASrB,EAAM1I,EAAIA,EAAE+F,UAAU/F,EAAEgD,GAC/ChD,EAAI,EAAGA,EAAIwK,EAAIzE,QAAQ1F,SAAUL,EAAGwK,EAAIzE,QAAQ/F,GAAGgD,EACxD,IAAI0F,EAAM1I,EAAIgD,EAAMvC,UAClB,IAAKwK,EAAI,EAAGA,EAAIjI,EAAMvC,SAASJ,SAAU4K,EACvCD,EAAkBhI,EAAMvC,SAASwK,KAMzC,QAASC,GAAaN,EAAWE,EAAQC,EAAU/B,GACjD,KAAO+B,GAAY/B,IAAU+B,EAAU,CACrC,GAAI/K,GAAG2J,EAAW1C,EAAIkE,EAAKL,EAAOC,EAClC,IAAIrC,EAAMyC,GACR,GAAIzC,EAAMyC,EAAGzK,KAAM,CAIjB,IAHAsK,EAAkBG,GAClBxB,EAAYa,EAAI7F,OAAOtE,OAAS,EAChC4G,EAAKwC,EAAW0B,EAAG9H,IAAKsG,GACnB3J,EAAI,EAAGA,EAAIwK,EAAI7F,OAAOtE,SAAUL,EAAGwK,EAAI7F,OAAO3E,GAAGmL,EAAIlE,EACtDyB,GAAM1I,EAAImL,EAAG3K,OAASkI,EAAM1I,EAAIA,EAAE+J,OAASrB,EAAM1I,EAAIA,EAAE2E,QACzD3E,EAAEmL,EAAIlE,GAENA,QAGFkC,GAAIjH,YAAY0I,EAAWO,EAAG9H,MAMtC,QAAS+H,GAAeR,EAAWS,EAAOC,EAAOxB,GAU/C,IATA,GAOIyB,GAAaC,EAAUC,EAAWZ,EAPlCa,EAAc,EAAGC,EAAc,EAC/BC,EAAYP,EAAMhL,OAAS,EAC3BwL,EAAgBR,EAAM,GACtBS,EAAcT,EAAMO,GACpBG,EAAYT,EAAMjL,OAAS,EAC3B2L,EAAgBV,EAAM,GACtBW,EAAcX,EAAMS,GAGjBL,GAAeE,GAAaD,GAAeI,GAC5CtD,EAAQoD,GACVA,EAAgBR,IAAQK,GACfjD,EAAQqD,GACjBA,EAAcT,IAAQO,GACbjD,EAAUkD,EAAeG,IAClCE,EAAWL,EAAeG,EAAelC,GACzC+B,EAAgBR,IAAQK,GACxBM,EAAgBV,IAAQK,IACfhD,EAAUmD,EAAaG,IAChCC,EAAWJ,EAAaG,EAAanC,GACrCgC,EAAcT,IAAQO,GACtBK,EAAcX,IAAQS,IACbpD,EAAUkD,EAAeI,IAClCC,EAAWL,EAAeI,EAAanC,GACvCX,EAAIrH,aAAa8I,EAAWiB,EAAcxI,IAAK8F,EAAI5G,YAAYuJ,EAAYzI,MAC3EwI,EAAgBR,IAAQK,GACxBO,EAAcX,IAAQS,IACbpD,EAAUmD,EAAaE,IAChCE,EAAWJ,EAAaE,EAAelC,GACvCX,EAAIrH,aAAa8I,EAAWkB,EAAYzI,IAAKwI,EAAcxI,KAC3DyI,EAAcT,IAAQO,GACtBI,EAAgBV,IAAQK,KAEpBlD,EAAQ8C,KAAcA,EAAczC,EAAkBuC,EAAOK,EAAaE,IAC9EJ,EAAWD,EAAYS,EAAc/I,KACjCwF,EAAQ+C,IACVrC,EAAIrH,aAAa8I,EAAWf,EAAUmC,EAAelC,GAAqB+B,EAAcxI,KACxF2I,EAAgBV,IAAQK,KAExBF,EAAYJ,EAAMG,GAClBU,EAAWT,EAAWO,EAAelC,GACrCuB,EAAMG,GAAY5K,OAClBuI,EAAIrH,aAAa8I,EAAWa,EAAUpI,IAAKwI,EAAcxI,KACzD2I,EAAgBV,IAAQK,IAI1BD,GAAcE,GAChBf,EAASpC,EAAQ6C,EAAMS,EAAU,IAAM,KAAOT,EAAMS,EAAU,GAAG1I,IACjEsH,EAAUC,EAAWC,EAAQS,EAAOK,EAAaI,EAAWjC,IACnD6B,EAAcI,GACvBb,EAAaN,EAAWS,EAAOK,EAAaE,GAIhD,QAASM,GAAWnJ,EAAUC,EAAO8G,GACnC,GAAI9J,GAAG+J,CACHrB,GAAM1I,EAAIgD,EAAMxC,OAASkI,EAAMqB,EAAO/J,EAAE+J,OAASrB,EAAM1I,EAAI+J,EAAKoC,WAClEnM,EAAE+C,EAAUC,EAEd,IAAIK,GAAML,EAAMK,IAAMN,EAASM,IAAKgI,EAAQtI,EAAStC,SAAU0K,EAAKnI,EAAMvC,QAC1E,IAAIsC,IAAaC,EAAjB,CACA,IAAK2F,EAAU5F,EAAUC,GAAQ,CAC/B,GAAI4H,GAAYzB,EAAIpH,WAAWgB,EAASM,IAIxC,OAHAA,GAAMwG,EAAU7G,EAAO8G,GACvBX,EAAIrH,aAAa8I,EAAWvH,EAAKN,EAASM,SAC1C6H,GAAaN,GAAY7H,GAAW,EAAG,GAGzC,GAAI2F,EAAM1F,EAAMxC,MAAO,CACrB,IAAKR,EAAI,EAAGA,EAAIwK,EAAIpG,OAAO/D,SAAUL,EAAGwK,EAAIpG,OAAOpE,GAAG+C,EAAUC,EAChEhD,GAAIgD,EAAMxC,KAAKuJ,KACXrB,EAAM1I,IAAM0I,EAAM1I,EAAIA,EAAEoE,SAASpE,EAAE+C,EAAUC,GAE/CyF,EAAQzF,EAAM/B,MACZyH,EAAM2C,IAAU3C,EAAMyC,GACpBE,IAAUF,GAAIC,EAAe/H,EAAKgI,EAAOF,EAAIrB,GACxCpB,EAAMyC,IACXzC,EAAM3F,EAAS9B,OAAOkI,EAAI3G,eAAea,EAAK,IAClDsH,EAAUtH,EAAK,KAAM8H,EAAI,EAAGA,EAAG9K,OAAS,EAAGyJ,IAClCpB,EAAM2C,GACfH,EAAa7H,EAAKgI,EAAO,EAAGA,EAAMhL,OAAS,GAClCqI,EAAM3F,EAAS9B,OACxBkI,EAAI3G,eAAea,EAAK,IAEjBN,EAAS9B,OAAS+B,EAAM/B,MACjCkI,EAAI3G,eAAea,EAAKL,EAAM/B,MAE5ByH,EAAMqB,IAASrB,EAAM1I,EAAI+J,EAAKqC,YAChCpM,EAAE+C,EAAUC,IAnMhB,GAAIhD,GAAGiL,EAAGT,IAIV,KAFI/B,EAAQU,KAAMA,EAAMkD,GAEnBrM,EAAI,EAAGA,EAAIsM,EAAMjM,SAAUL,EAE9B,IADAwK,EAAI8B,EAAMtM,OACLiL,EAAI,EAAGA,EAAI/B,EAAQ7I,SAAU4K,EACHrK,SAAzBsI,EAAQ+B,GAAGqB,EAAMtM,KAAmBwK,EAAI8B,EAAMtM,IAAIkF,KAAKgE,EAAQ+B,GAAGqB,EAAMtM,IAgMhF,OAAO,UAAS+C,EAAUC,GACxB,GAAIhD,GAAGqD,EAAKuG,EACRE,IACJ,KAAK9J,EAAI,EAAGA,EAAIwK,EAAI+B,IAAIlM,SAAUL,EAAGwK,EAAI+B,IAAIvM,IAoB7C,KAlBIyI,EAAQ1F,EAASrC,OACnBqC,EAAWqG,EAAYrG,IAGrB4F,EAAU5F,EAAUC,GACtBkJ,EAAWnJ,EAAUC,EAAO8G,IAE5BzG,EAAMN,EAASM,IACfuG,EAAST,EAAIpH,WAAWsB,GAExBwG,EAAU7G,EAAO8G,GAEF,OAAXF,IACFT,EAAIrH,aAAa8H,EAAQ5G,EAAMK,IAAK8F,EAAI5G,YAAYc,IACpD6H,EAAatB,GAAS7G,GAAW,EAAG,KAInC/C,EAAI,EAAGA,EAAI8J,EAAmBzJ,SAAUL,EAC3C8J,EAAmB9J,GAAGQ,KAAKuJ,KAAKW,OAAOZ,EAAmB9J,GAE5D,KAAKA,EAAI,EAAGA,EAAIwK,EAAIgC,KAAKnM,SAAUL,EAAGwK,EAAIgC,KAAKxM,IAC/C,OAAOgD,IA3PX,GAAInC,GAAQd,EAAQ,WAChBe,EAAKf,EAAQ,QACbsM,EAAStM,EAAQ,gBAKjB0K,EAAY5J,EAAM,SAAYD,OAAWA,QAezC0L,GAAS,SAAU,SAAU,SAAU,UAAW,MAAO,OAyO7DxN,GAAOD,SAAWkJ,KAAMA,KAErB0E,eAAe,EAAErL,OAAO,EAAEC,UAAU,KAAKqL,IAAI,SAAS3M,EAAQjB,EAAOD,GACxEC,EAAOD,QAAU,SAAS6B,EAAKF,EAAMC,EAAUQ,EAAMoC,GACnD,GAAIJ,GAAerC,SAATJ,EAAqBI,OAAYJ,EAAKyC,GAChD,QAAQvC,IAAKA,EAAKF,KAAMA,EAAMC,SAAUA,EAChCQ,KAAMA,EAAMoC,IAAKA,EAAKJ,IAAKA,cAG1B,IAAI","file":"snabbdom-patch.min.js","sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.snabbdom = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 1 && NamespaceURIs.hasOwnProperty(namespaceSplit[0]))\n elm.setAttributeNS(NamespaceURIs[namespaceSplit[0]], key, cur);\n else\n elm.setAttribute(key, cur);\n }\n }\n }\n //remove removed attributes\n // use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)\n // the other option is to remove all attributes with value == undefined\n for (key in oldAttrs) {\n if (!(key in attrs)) {\n elm.removeAttribute(key);\n }\n }\n}\n\nmodule.exports = {create: updateAttrs, update: updateAttrs};\n\n},{}],5:[function(require,module,exports){\nfunction updateClass(oldVnode, vnode) {\n var cur, name, elm = vnode.elm,\n oldClass = oldVnode.data.class,\n klass = vnode.data.class;\n\n if (!oldClass && !klass) return;\n oldClass = oldClass || {};\n klass = klass || {};\n\n for (name in oldClass) {\n if (!klass[name]) {\n elm.classList.remove(name);\n }\n }\n for (name in klass) {\n cur = klass[name];\n if (cur !== oldClass[name]) {\n elm.classList[cur ? 'add' : 'remove'](name);\n }\n }\n}\n\nmodule.exports = {create: updateClass, update: updateClass};\n\n},{}],6:[function(require,module,exports){\nfunction invokeHandler(handler, vnode, event) {\n if (typeof handler === \"function\") {\n // call function handler\n handler.call(vnode, event, vnode);\n } else if (typeof handler === \"object\") {\n // call handler with arguments\n if (typeof handler[0] === \"function\") {\n // special case for single argument for performance\n if (handler.length === 2) {\n handler[0].call(vnode, handler[1], event, vnode);\n } else {\n var args = handler.slice(1);\n args.push(event);\n args.push(vnode);\n handler[0].apply(vnode, args);\n }\n } else {\n // call multiple handlers\n for (var i = 0; i < handler.length; i++) {\n invokeHandler(handler[i]);\n }\n }\n }\n}\n\nfunction handleEvent(event, vnode) {\n var name = event.type,\n on = vnode.data.on;\n\n // call event handler(s) if exists\n if (on && on[name]) {\n invokeHandler(on[name], vnode, event);\n }\n}\n\nfunction createListener() {\n return function handler(event) {\n handleEvent(event, handler.vnode);\n }\n}\n\nfunction updateEventListeners(oldVnode, vnode) {\n var oldOn = oldVnode.data.on,\n oldListener = oldVnode.listener,\n oldElm = oldVnode.elm,\n on = vnode && vnode.data.on,\n elm = vnode && vnode.elm,\n name;\n\n // optimization for reused immutable handlers\n if (oldOn === on) {\n return;\n }\n\n // remove existing listeners which no longer used\n if (oldOn && oldListener) {\n // if element changed or deleted we remove all existing listeners unconditionally\n if (!on) {\n for (name in oldOn) {\n // remove listener if element was changed or existing listeners removed\n oldElm.removeEventListener(name, oldListener, false);\n }\n } else {\n for (name in oldOn) {\n // remove listener if existing listener removed\n if (!on[name]) {\n oldElm.removeEventListener(name, oldListener, false);\n }\n }\n }\n }\n\n // add new listeners which has not already attached\n if (on) {\n // reuse existing listener or create new\n var listener = vnode.listener = oldVnode.listener || createListener();\n // update vnode for listener\n listener.vnode = vnode;\n\n // if element changed or added we add all needed listeners unconditionally\n if (!oldOn) {\n for (name in on) {\n // add listener if element was changed or new listeners added\n elm.addEventListener(name, listener, false);\n }\n } else {\n for (name in on) {\n // add listener if new listener added\n if (!oldOn[name]) {\n elm.addEventListener(name, listener, false);\n }\n }\n }\n }\n}\n\nmodule.exports = {\n create: updateEventListeners,\n update: updateEventListeners,\n destroy: updateEventListeners\n};\n\n},{}],7:[function(require,module,exports){\nfunction updateProps(oldVnode, vnode) {\n var key, cur, old, elm = vnode.elm,\n oldProps = oldVnode.data.props, props = vnode.data.props;\n\n if (!oldProps && !props) return;\n oldProps = oldProps || {};\n props = props || {};\n\n for (key in oldProps) {\n if (!props[key]) {\n delete elm[key];\n }\n }\n for (key in props) {\n cur = props[key];\n old = oldProps[key];\n if (old !== cur && (key !== 'value' || elm[key] !== cur)) {\n elm[key] = cur;\n }\n }\n}\n\nmodule.exports = {create: updateProps, update: updateProps};\n\n},{}],8:[function(require,module,exports){\nvar raf = (typeof window !== 'undefined' && window.requestAnimationFrame) || setTimeout;\nvar nextFrame = function(fn) { raf(function() { raf(fn); }); };\n\nfunction setNextFrame(obj, prop, val) {\n nextFrame(function() { obj[prop] = val; });\n}\n\nfunction updateStyle(oldVnode, vnode) {\n var cur, name, elm = vnode.elm,\n oldStyle = oldVnode.data.style,\n style = vnode.data.style;\n\n if (!oldStyle && !style) return;\n oldStyle = oldStyle || {};\n style = style || {};\n var oldHasDel = 'delayed' in oldStyle;\n\n for (name in oldStyle) {\n if (!style[name]) {\n elm.style[name] = '';\n }\n }\n for (name in style) {\n cur = style[name];\n if (name === 'delayed') {\n for (name in style.delayed) {\n cur = style.delayed[name];\n if (!oldHasDel || cur !== oldStyle.delayed[name]) {\n setNextFrame(elm.style, name, cur);\n }\n }\n } else if (name !== 'remove' && cur !== oldStyle[name]) {\n elm.style[name] = cur;\n }\n }\n}\n\nfunction applyDestroyStyle(vnode) {\n var style, name, elm = vnode.elm, s = vnode.data.style;\n if (!s || !(style = s.destroy)) return;\n for (name in style) {\n elm.style[name] = style[name];\n }\n}\n\nfunction applyRemoveStyle(vnode, rm) {\n var s = vnode.data.style;\n if (!s || !s.remove) {\n rm();\n return;\n }\n var name, elm = vnode.elm, idx, i = 0, maxDur = 0,\n compStyle, style = s.remove, amount = 0, applied = [];\n for (name in style) {\n applied.push(name);\n elm.style[name] = style[name];\n }\n compStyle = getComputedStyle(elm);\n var props = compStyle['transition-property'].split(', ');\n for (; i < props.length; ++i) {\n if(applied.indexOf(props[i]) !== -1) amount++;\n }\n elm.addEventListener('transitionend', function(ev) {\n if (ev.target === elm) --amount;\n if (amount === 0) rm();\n });\n}\n\nmodule.exports = {create: updateStyle, update: updateStyle, destroy: applyDestroyStyle, remove: applyRemoveStyle};\n\n},{}],9:[function(require,module,exports){\nvar snabbdom = require('./snabbdom');\nvar patch = snabbdom.init([ // Init patch function with choosen modules\n require('./modules/attributes'), // makes it easy to toggle classes\n require('./modules/class'), // makes it easy to toggle classes\n require('./modules/props'), // for setting properties on DOM elements\n require('./modules/style'), // handles styling on elements with support for animations\n require('./modules/eventlisteners'), // attaches event listeners\n]);\nvar h = require('./h'); // helper function for creating vnodes\n\nmodule.exports = { patch: patch, h: h }\n\n},{\"./h\":1,\"./modules/attributes\":4,\"./modules/class\":5,\"./modules/eventlisteners\":6,\"./modules/props\":7,\"./modules/style\":8,\"./snabbdom\":10}],10:[function(require,module,exports){\n// jshint newcap: false\n/* global require, module, document, Node */\n'use strict';\n\nvar VNode = require('./vnode');\nvar is = require('./is');\nvar domApi = require('./htmldomapi');\n\nfunction isUndef(s) { return s === undefined; }\nfunction isDef(s) { return s !== undefined; }\n\nvar emptyNode = VNode('', {}, [], undefined, undefined);\n\nfunction sameVnode(vnode1, vnode2) {\n return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;\n}\n\nfunction createKeyToOldIdx(children, beginIdx, endIdx) {\n var i, map = {}, key;\n for (i = beginIdx; i <= endIdx; ++i) {\n key = children[i].key;\n if (isDef(key)) map[key] = i;\n }\n return map;\n}\n\nvar hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];\n\nfunction init(modules, api) {\n var i, j, cbs = {};\n\n if (isUndef(api)) api = domApi;\n\n for (i = 0; i < hooks.length; ++i) {\n cbs[hooks[i]] = [];\n for (j = 0; j < modules.length; ++j) {\n if (modules[j][hooks[i]] !== undefined) cbs[hooks[i]].push(modules[j][hooks[i]]);\n }\n }\n\n function emptyNodeAt(elm) {\n var id = elm.id ? '#' + elm.id : '';\n var c = elm.className ? '.' + elm.className.split(' ').join('.') : '';\n return VNode(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);\n }\n\n function createRmCb(childElm, listeners) {\n return function() {\n if (--listeners === 0) {\n var parent = api.parentNode(childElm);\n api.removeChild(parent, childElm);\n }\n };\n }\n\n function createElm(vnode, insertedVnodeQueue) {\n var i, data = vnode.data;\n if (isDef(data)) {\n if (isDef(i = data.hook) && isDef(i = i.init)) {\n i(vnode);\n data = vnode.data;\n }\n }\n var elm, children = vnode.children, sel = vnode.sel;\n if (isDef(sel)) {\n // Parse selector\n var hashIdx = sel.indexOf('#');\n var dotIdx = sel.indexOf('.', hashIdx);\n var hash = hashIdx > 0 ? hashIdx : sel.length;\n var dot = dotIdx > 0 ? dotIdx : sel.length;\n var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;\n elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag)\n : api.createElement(tag);\n if (hash < dot) elm.id = sel.slice(hash + 1, dot);\n if (dotIdx > 0) elm.className = sel.slice(dot + 1).replace(/\\./g, ' ');\n if (is.array(children)) {\n for (i = 0; i < children.length; ++i) {\n api.appendChild(elm, createElm(children[i], insertedVnodeQueue));\n }\n } else if (is.primitive(vnode.text)) {\n api.appendChild(elm, api.createTextNode(vnode.text));\n }\n for (i = 0; i < cbs.create.length; ++i) cbs.create[i](emptyNode, vnode);\n i = vnode.data.hook; // Reuse variable\n if (isDef(i)) {\n if (i.create) i.create(emptyNode, vnode);\n if (i.insert) insertedVnodeQueue.push(vnode);\n }\n } else {\n elm = vnode.elm = api.createTextNode(vnode.text);\n }\n return vnode.elm;\n }\n\n function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {\n for (; startIdx <= endIdx; ++startIdx) {\n api.insertBefore(parentElm, createElm(vnodes[startIdx], insertedVnodeQueue), before);\n }\n }\n\n function invokeDestroyHook(vnode) {\n var i, j, data = vnode.data;\n if (isDef(data)) {\n if (isDef(i = data.hook) && isDef(i = i.destroy)) i(vnode);\n for (i = 0; i < cbs.destroy.length; ++i) cbs.destroy[i](vnode);\n if (isDef(i = vnode.children)) {\n for (j = 0; j < vnode.children.length; ++j) {\n invokeDestroyHook(vnode.children[j]);\n }\n }\n }\n }\n\n function removeVnodes(parentElm, vnodes, startIdx, endIdx) {\n for (; startIdx <= endIdx; ++startIdx) {\n var i, listeners, rm, ch = vnodes[startIdx];\n if (isDef(ch)) {\n if (isDef(ch.sel)) {\n invokeDestroyHook(ch);\n listeners = cbs.remove.length + 1;\n rm = createRmCb(ch.elm, listeners);\n for (i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm);\n if (isDef(i = ch.data) && isDef(i = i.hook) && isDef(i = i.remove)) {\n i(ch, rm);\n } else {\n rm();\n }\n } else { // Text node\n api.removeChild(parentElm, ch.elm);\n }\n }\n }\n }\n\n function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {\n var oldStartIdx = 0, newStartIdx = 0;\n var oldEndIdx = oldCh.length - 1;\n var oldStartVnode = oldCh[0];\n var oldEndVnode = oldCh[oldEndIdx];\n var newEndIdx = newCh.length - 1;\n var newStartVnode = newCh[0];\n var newEndVnode = newCh[newEndIdx];\n var oldKeyToIdx, idxInOld, elmToMove, before;\n\n while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n if (isUndef(oldStartVnode)) {\n oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left\n } else if (isUndef(oldEndVnode)) {\n oldEndVnode = oldCh[--oldEndIdx];\n } else if (sameVnode(oldStartVnode, newStartVnode)) {\n patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);\n oldStartVnode = oldCh[++oldStartIdx];\n newStartVnode = newCh[++newStartIdx];\n } else if (sameVnode(oldEndVnode, newEndVnode)) {\n patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);\n oldEndVnode = oldCh[--oldEndIdx];\n newEndVnode = newCh[--newEndIdx];\n } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right\n patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);\n api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));\n oldStartVnode = oldCh[++oldStartIdx];\n newEndVnode = newCh[--newEndIdx];\n } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left\n patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);\n api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n oldEndVnode = oldCh[--oldEndIdx];\n newStartVnode = newCh[++newStartIdx];\n } else {\n if (isUndef(oldKeyToIdx)) oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);\n idxInOld = oldKeyToIdx[newStartVnode.key];\n if (isUndef(idxInOld)) { // New element\n api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);\n newStartVnode = newCh[++newStartIdx];\n } else {\n elmToMove = oldCh[idxInOld];\n patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);\n oldCh[idxInOld] = undefined;\n api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);\n newStartVnode = newCh[++newStartIdx];\n }\n }\n }\n if (oldStartIdx > oldEndIdx) {\n before = isUndef(newCh[newEndIdx+1]) ? null : newCh[newEndIdx+1].elm;\n addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);\n } else if (newStartIdx > newEndIdx) {\n removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);\n }\n }\n\n function patchVnode(oldVnode, vnode, insertedVnodeQueue) {\n var i, hook;\n if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {\n i(oldVnode, vnode);\n }\n var elm = vnode.elm = oldVnode.elm, oldCh = oldVnode.children, ch = vnode.children;\n if (oldVnode === vnode) return;\n if (!sameVnode(oldVnode, vnode)) {\n var parentElm = api.parentNode(oldVnode.elm);\n elm = createElm(vnode, insertedVnodeQueue);\n api.insertBefore(parentElm, elm, oldVnode.elm);\n removeVnodes(parentElm, [oldVnode], 0, 0);\n return;\n }\n if (isDef(vnode.data)) {\n for (i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode);\n i = vnode.data.hook;\n if (isDef(i) && isDef(i = i.update)) i(oldVnode, vnode);\n }\n if (isUndef(vnode.text)) {\n if (isDef(oldCh) && isDef(ch)) {\n if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue);\n } else if (isDef(ch)) {\n if (isDef(oldVnode.text)) api.setTextContent(elm, '');\n addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);\n } else if (isDef(oldCh)) {\n removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n } else if (isDef(oldVnode.text)) {\n api.setTextContent(elm, '');\n }\n } else if (oldVnode.text !== vnode.text) {\n api.setTextContent(elm, vnode.text);\n }\n if (isDef(hook) && isDef(i = hook.postpatch)) {\n i(oldVnode, vnode);\n }\n }\n\n return function(oldVnode, vnode) {\n var i, elm, parent;\n var insertedVnodeQueue = [];\n for (i = 0; i < cbs.pre.length; ++i) cbs.pre[i]();\n\n if (isUndef(oldVnode.sel)) {\n oldVnode = emptyNodeAt(oldVnode);\n }\n\n if (sameVnode(oldVnode, vnode)) {\n patchVnode(oldVnode, vnode, insertedVnodeQueue);\n } else {\n elm = oldVnode.elm;\n parent = api.parentNode(elm);\n\n createElm(vnode, insertedVnodeQueue);\n\n if (parent !== null) {\n api.insertBefore(parent, vnode.elm, api.nextSibling(elm));\n removeVnodes(parent, [oldVnode], 0, 0);\n }\n }\n\n for (i = 0; i < insertedVnodeQueue.length; ++i) {\n insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);\n }\n for (i = 0; i < cbs.post.length; ++i) cbs.post[i]();\n return vnode;\n };\n}\n\nmodule.exports = {init: init};\n\n},{\"./htmldomapi\":2,\"./is\":3,\"./vnode\":11}],11:[function(require,module,exports){\nmodule.exports = function(sel, data, children, text, elm) {\n var key = data === undefined ? undefined : data.key;\n return {sel: sel, data: data, children: children,\n text: text, elm: elm, key: key};\n};\n\n},{}]},{},[9])(9)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJoLmpzIiwiaHRtbGRvbWFwaS5qcyIsImlzLmpzIiwibW9kdWxlcy9hdHRyaWJ1dGVzLmpzIiwibW9kdWxlcy9jbGFzcy5qcyIsIm1vZHVsZXMvZXZlbnRsaXN0ZW5lcnMuanMiLCJtb2R1bGVzL3Byb3BzLmpzIiwibW9kdWxlcy9zdHlsZS5qcyIsInNuYWJiZG9tLmJ1bmRsZS5qcyIsInNuYWJiZG9tLmpzIiwidm5vZGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJ2YXIgVk5vZGUgPSByZXF1aXJlKCcuL3Zub2RlJyk7XG52YXIgaXMgPSByZXF1aXJlKCcuL2lzJyk7XG5cbmZ1bmN0aW9uIGFkZE5TKGRhdGEsIGNoaWxkcmVuLCBzZWwpIHtcbiAgZGF0YS5ucyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG5cbiAgaWYgKHNlbCAhPT0gJ2ZvcmVpZ25PYmplY3QnICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7XG4gICAgICBhZGROUyhjaGlsZHJlbltpXS5kYXRhLCBjaGlsZHJlbltpXS5jaGlsZHJlbiwgY2hpbGRyZW5baV0uc2VsKTtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoKHNlbCwgYiwgYykge1xuICB2YXIgZGF0YSA9IHt9LCBjaGlsZHJlbiwgdGV4dCwgaTtcbiAgaWYgKGMgIT09IHVuZGVmaW5lZCkge1xuICAgIGRhdGEgPSBiO1xuICAgIGlmIChpcy5hcnJheShjKSkgeyBjaGlsZHJlbiA9IGM7IH1cbiAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUoYykpIHsgdGV4dCA9IGM7IH1cbiAgfSBlbHNlIGlmIChiICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoaXMuYXJyYXkoYikpIHsgY2hpbGRyZW4gPSBiOyB9XG4gICAgZWxzZSBpZiAoaXMucHJpbWl0aXZlKGIpKSB7IHRleHQgPSBiOyB9XG4gICAgZWxzZSB7IGRhdGEgPSBiOyB9XG4gIH1cbiAgaWYgKGlzLmFycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGlzLnByaW1pdGl2ZShjaGlsZHJlbltpXSkpIGNoaWxkcmVuW2ldID0gVk5vZGUodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgfVxuICBpZiAoc2VsWzBdID09PSAncycgJiYgc2VsWzFdID09PSAndicgJiYgc2VsWzJdID09PSAnZycpIHtcbiAgICBhZGROUyhkYXRhLCBjaGlsZHJlbiwgc2VsKTtcbiAgfVxuICByZXR1cm4gVk5vZGUoc2VsLCBkYXRhLCBjaGlsZHJlbiwgdGV4dCwgdW5kZWZpbmVkKTtcbn07XG4iLCJmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZ05hbWUpe1xuICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSl7XG4gIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUodGV4dCl7XG4gIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcbn1cblxuXG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50Tm9kZSwgbmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSl7XG4gIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpO1xufVxuXG5cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkKG5vZGUsIGNoaWxkKXtcbiAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKG5vZGUsIGNoaWxkKXtcbiAgbm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5cbmZ1bmN0aW9uIHBhcmVudE5vZGUobm9kZSl7XG4gIHJldHVybiBub2RlLnBhcmVudEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIG5leHRTaWJsaW5nKG5vZGUpe1xuICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbn1cblxuZnVuY3Rpb24gdGFnTmFtZShub2RlKXtcbiAgcmV0dXJuIG5vZGUudGFnTmFtZTtcbn1cblxuZnVuY3Rpb24gc2V0VGV4dENvbnRlbnQobm9kZSwgdGV4dCl7XG4gIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCxcbiAgY3JlYXRlRWxlbWVudE5TOiBjcmVhdGVFbGVtZW50TlMsXG4gIGNyZWF0ZVRleHROb2RlOiBjcmVhdGVUZXh0Tm9kZSxcbiAgYXBwZW5kQ2hpbGQ6IGFwcGVuZENoaWxkLFxuICByZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsXG4gIGluc2VydEJlZm9yZTogaW5zZXJ0QmVmb3JlLFxuICBwYXJlbnROb2RlOiBwYXJlbnROb2RlLFxuICBuZXh0U2libGluZzogbmV4dFNpYmxpbmcsXG4gIHRhZ05hbWU6IHRhZ05hbWUsXG4gIHNldFRleHRDb250ZW50OiBzZXRUZXh0Q29udGVudFxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBhcnJheTogQXJyYXkuaXNBcnJheSxcbiAgcHJpbWl0aXZlOiBmdW5jdGlvbihzKSB7IHJldHVybiB0eXBlb2YgcyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHMgPT09ICdudW1iZXInOyB9LFxufTtcbiIsInZhciBOYW1lc3BhY2VVUklzID0ge1xuICBcInhsaW5rXCI6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXG59O1xuXG52YXIgYm9vbGVhbkF0dHJzID0gW1wiYWxsb3dmdWxsc2NyZWVuXCIsIFwiYXN5bmNcIiwgXCJhdXRvZm9jdXNcIiwgXCJhdXRvcGxheVwiLCBcImNoZWNrZWRcIiwgXCJjb21wYWN0XCIsIFwiY29udHJvbHNcIiwgXCJkZWNsYXJlXCIsXG4gICAgICAgICAgICAgICAgXCJkZWZhdWx0XCIsIFwiZGVmYXVsdGNoZWNrZWRcIiwgXCJkZWZhdWx0bXV0ZWRcIiwgXCJkZWZhdWx0c2VsZWN0ZWRcIiwgXCJkZWZlclwiLCBcImRpc2FibGVkXCIsIFwiZHJhZ2dhYmxlXCIsXG4gICAgICAgICAgICAgICAgXCJlbmFibGVkXCIsIFwiZm9ybW5vdmFsaWRhdGVcIiwgXCJoaWRkZW5cIiwgXCJpbmRldGVybWluYXRlXCIsIFwiaW5lcnRcIiwgXCJpc21hcFwiLCBcIml0ZW1zY29wZVwiLCBcImxvb3BcIiwgXCJtdWx0aXBsZVwiLFxuICAgICAgICAgICAgICAgIFwibXV0ZWRcIiwgXCJub2hyZWZcIiwgXCJub3Jlc2l6ZVwiLCBcIm5vc2hhZGVcIiwgXCJub3ZhbGlkYXRlXCIsIFwibm93cmFwXCIsIFwib3BlblwiLCBcInBhdXNlb25leGl0XCIsIFwicmVhZG9ubHlcIixcbiAgICAgICAgICAgICAgICBcInJlcXVpcmVkXCIsIFwicmV2ZXJzZWRcIiwgXCJzY29wZWRcIiwgXCJzZWFtbGVzc1wiLCBcInNlbGVjdGVkXCIsIFwic29ydGFibGVcIiwgXCJzcGVsbGNoZWNrXCIsIFwidHJhbnNsYXRlXCIsXG4gICAgICAgICAgICAgICAgXCJ0cnVlc3BlZWRcIiwgXCJ0eXBlbXVzdG1hdGNoXCIsIFwidmlzaWJsZVwiXTtcblxudmFyIGJvb2xlYW5BdHRyc0RpY3QgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuZm9yKHZhciBpPTAsIGxlbiA9IGJvb2xlYW5BdHRycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICBib29sZWFuQXR0cnNEaWN0W2Jvb2xlYW5BdHRyc1tpXV0gPSB0cnVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVBdHRycyhvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGtleSwgY3VyLCBvbGQsIGVsbSA9IHZub2RlLmVsbSxcbiAgICAgIG9sZEF0dHJzID0gb2xkVm5vZGUuZGF0YS5hdHRycywgYXR0cnMgPSB2bm9kZS5kYXRhLmF0dHJzLCBuYW1lc3BhY2VTcGxpdDtcblxuICBpZiAoIW9sZEF0dHJzICYmICFhdHRycykgcmV0dXJuO1xuICBvbGRBdHRycyA9IG9sZEF0dHJzIHx8IHt9O1xuICBhdHRycyA9IGF0dHJzIHx8IHt9O1xuXG4gIC8vIHVwZGF0ZSBtb2RpZmllZCBhdHRyaWJ1dGVzLCBhZGQgbmV3IGF0dHJpYnV0ZXNcbiAgZm9yIChrZXkgaW4gYXR0cnMpIHtcbiAgICBjdXIgPSBhdHRyc1trZXldO1xuICAgIG9sZCA9IG9sZEF0dHJzW2tleV07XG4gICAgaWYgKG9sZCAhPT0gY3VyKSB7XG4gICAgICBpZighY3VyICYmIGJvb2xlYW5BdHRyc0RpY3Rba2V5XSlcbiAgICAgICAgZWxtLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIG5hbWVzcGFjZVNwbGl0ID0ga2V5LnNwbGl0KFwiOlwiKTtcbiAgICAgICAgaWYobmFtZXNwYWNlU3BsaXQubGVuZ3RoID4gMSAmJiBOYW1lc3BhY2VVUklzLmhhc093blByb3BlcnR5KG5hbWVzcGFjZVNwbGl0WzBdKSlcbiAgICAgICAgICBlbG0uc2V0QXR0cmlidXRlTlMoTmFtZXNwYWNlVVJJc1tuYW1lc3BhY2VTcGxpdFswXV0sIGtleSwgY3VyKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGVsbS5zZXRBdHRyaWJ1dGUoa2V5LCBjdXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL3JlbW92ZSByZW1vdmVkIGF0dHJpYnV0ZXNcbiAgLy8gdXNlIGBpbmAgb3BlcmF0b3Igc2luY2UgdGhlIHByZXZpb3VzIGBmb3JgIGl0ZXJhdGlvbiB1c2VzIGl0ICguaS5lLiBhZGQgZXZlbiBhdHRyaWJ1dGVzIHdpdGggdW5kZWZpbmVkIHZhbHVlKVxuICAvLyB0aGUgb3RoZXIgb3B0aW9uIGlzIHRvIHJlbW92ZSBhbGwgYXR0cmlidXRlcyB3aXRoIHZhbHVlID09IHVuZGVmaW5lZFxuICBmb3IgKGtleSBpbiBvbGRBdHRycykge1xuICAgIGlmICghKGtleSBpbiBhdHRycykpIHtcbiAgICAgIGVsbS5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7Y3JlYXRlOiB1cGRhdGVBdHRycywgdXBkYXRlOiB1cGRhdGVBdHRyc307XG4iLCJmdW5jdGlvbiB1cGRhdGVDbGFzcyhvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGN1ciwgbmFtZSwgZWxtID0gdm5vZGUuZWxtLFxuICAgICAgb2xkQ2xhc3MgPSBvbGRWbm9kZS5kYXRhLmNsYXNzLFxuICAgICAga2xhc3MgPSB2bm9kZS5kYXRhLmNsYXNzO1xuXG4gIGlmICghb2xkQ2xhc3MgJiYgIWtsYXNzKSByZXR1cm47XG4gIG9sZENsYXNzID0gb2xkQ2xhc3MgfHwge307XG4gIGtsYXNzID0ga2xhc3MgfHwge307XG5cbiAgZm9yIChuYW1lIGluIG9sZENsYXNzKSB7XG4gICAgaWYgKCFrbGFzc1tuYW1lXSkge1xuICAgICAgZWxtLmNsYXNzTGlzdC5yZW1vdmUobmFtZSk7XG4gICAgfVxuICB9XG4gIGZvciAobmFtZSBpbiBrbGFzcykge1xuICAgIGN1ciA9IGtsYXNzW25hbWVdO1xuICAgIGlmIChjdXIgIT09IG9sZENsYXNzW25hbWVdKSB7XG4gICAgICBlbG0uY2xhc3NMaXN0W2N1ciA/ICdhZGQnIDogJ3JlbW92ZSddKG5hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtjcmVhdGU6IHVwZGF0ZUNsYXNzLCB1cGRhdGU6IHVwZGF0ZUNsYXNzfTtcbiIsImZ1bmN0aW9uIGludm9rZUhhbmRsZXIoaGFuZGxlciwgdm5vZGUsIGV2ZW50KSB7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgLy8gY2FsbCBmdW5jdGlvbiBoYW5kbGVyXG4gICAgaGFuZGxlci5jYWxsKHZub2RlLCBldmVudCwgdm5vZGUpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcIm9iamVjdFwiKSB7XG4gICAgLy8gY2FsbCBoYW5kbGVyIHdpdGggYXJndW1lbnRzXG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3Igc2luZ2xlIGFyZ3VtZW50IGZvciBwZXJmb3JtYW5jZVxuICAgICAgaWYgKGhhbmRsZXIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGhhbmRsZXJbMF0uY2FsbCh2bm9kZSwgaGFuZGxlclsxXSwgZXZlbnQsIHZub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBhcmdzID0gaGFuZGxlci5zbGljZSgxKTtcbiAgICAgICAgYXJncy5wdXNoKGV2ZW50KTtcbiAgICAgICAgYXJncy5wdXNoKHZub2RlKTtcbiAgICAgICAgaGFuZGxlclswXS5hcHBseSh2bm9kZSwgYXJncyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNhbGwgbXVsdGlwbGUgaGFuZGxlcnNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpbnZva2VIYW5kbGVyKGhhbmRsZXJbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCwgdm5vZGUpIHtcbiAgdmFyIG5hbWUgPSBldmVudC50eXBlLFxuICAgICAgb24gPSB2bm9kZS5kYXRhLm9uO1xuXG4gIC8vIGNhbGwgZXZlbnQgaGFuZGxlcihzKSBpZiBleGlzdHNcbiAgaWYgKG9uICYmIG9uW25hbWVdKSB7XG4gICAgaW52b2tlSGFuZGxlcihvbltuYW1lXSwgdm5vZGUsIGV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVMaXN0ZW5lcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICBoYW5kbGVFdmVudChldmVudCwgaGFuZGxlci52bm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRXZlbnRMaXN0ZW5lcnMob2xkVm5vZGUsIHZub2RlKSB7XG4gIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24sXG4gICAgICBvbGRMaXN0ZW5lciA9IG9sZFZub2RlLmxpc3RlbmVyLFxuICAgICAgb2xkRWxtID0gb2xkVm5vZGUuZWxtLFxuICAgICAgb24gPSB2bm9kZSAmJiB2bm9kZS5kYXRhLm9uLFxuICAgICAgZWxtID0gdm5vZGUgJiYgdm5vZGUuZWxtLFxuICAgICAgbmFtZTtcblxuICAvLyBvcHRpbWl6YXRpb24gZm9yIHJldXNlZCBpbW11dGFibGUgaGFuZGxlcnNcbiAgaWYgKG9sZE9uID09PSBvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHJlbW92ZSBleGlzdGluZyBsaXN0ZW5lcnMgd2hpY2ggbm8gbG9uZ2VyIHVzZWRcbiAgaWYgKG9sZE9uICYmIG9sZExpc3RlbmVyKSB7XG4gICAgLy8gaWYgZWxlbWVudCBjaGFuZ2VkIG9yIGRlbGV0ZWQgd2UgcmVtb3ZlIGFsbCBleGlzdGluZyBsaXN0ZW5lcnMgdW5jb25kaXRpb25hbGx5XG4gICAgaWYgKCFvbikge1xuICAgICAgZm9yIChuYW1lIGluIG9sZE9uKSB7XG4gICAgICAgIC8vIHJlbW92ZSBsaXN0ZW5lciBpZiBlbGVtZW50IHdhcyBjaGFuZ2VkIG9yIGV4aXN0aW5nIGxpc3RlbmVycyByZW1vdmVkXG4gICAgICAgIG9sZEVsbS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIG9sZExpc3RlbmVyLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobmFtZSBpbiBvbGRPbikge1xuICAgICAgICAvLyByZW1vdmUgbGlzdGVuZXIgaWYgZXhpc3RpbmcgbGlzdGVuZXIgcmVtb3ZlZFxuICAgICAgICBpZiAoIW9uW25hbWVdKSB7XG4gICAgICAgICAgb2xkRWxtLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgb2xkTGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCBuZXcgbGlzdGVuZXJzIHdoaWNoIGhhcyBub3QgYWxyZWFkeSBhdHRhY2hlZFxuICBpZiAob24pIHtcbiAgICAvLyByZXVzZSBleGlzdGluZyBsaXN0ZW5lciBvciBjcmVhdGUgbmV3XG4gICAgdmFyIGxpc3RlbmVyID0gdm5vZGUubGlzdGVuZXIgPSBvbGRWbm9kZS5saXN0ZW5lciB8fCBjcmVhdGVMaXN0ZW5lcigpO1xuICAgIC8vIHVwZGF0ZSB2bm9kZSBmb3IgbGlzdGVuZXJcbiAgICBsaXN0ZW5lci52bm9kZSA9IHZub2RlO1xuXG4gICAgLy8gaWYgZWxlbWVudCBjaGFuZ2VkIG9yIGFkZGVkIHdlIGFkZCBhbGwgbmVlZGVkIGxpc3RlbmVycyB1bmNvbmRpdGlvbmFsbHlcbiAgICBpZiAoIW9sZE9uKSB7XG4gICAgICBmb3IgKG5hbWUgaW4gb24pIHtcbiAgICAgICAgLy8gYWRkIGxpc3RlbmVyIGlmIGVsZW1lbnQgd2FzIGNoYW5nZWQgb3IgbmV3IGxpc3RlbmVycyBhZGRlZFxuICAgICAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKG5hbWUgaW4gb24pIHtcbiAgICAgICAgLy8gYWRkIGxpc3RlbmVyIGlmIG5ldyBsaXN0ZW5lciBhZGRlZFxuICAgICAgICBpZiAoIW9sZE9uW25hbWVdKSB7XG4gICAgICAgICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVFdmVudExpc3RlbmVycyxcbiAgdXBkYXRlOiB1cGRhdGVFdmVudExpc3RlbmVycyxcbiAgZGVzdHJveTogdXBkYXRlRXZlbnRMaXN0ZW5lcnNcbn07XG4iLCJmdW5jdGlvbiB1cGRhdGVQcm9wcyhvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGtleSwgY3VyLCBvbGQsIGVsbSA9IHZub2RlLmVsbSxcbiAgICAgIG9sZFByb3BzID0gb2xkVm5vZGUuZGF0YS5wcm9wcywgcHJvcHMgPSB2bm9kZS5kYXRhLnByb3BzO1xuXG4gIGlmICghb2xkUHJvcHMgJiYgIXByb3BzKSByZXR1cm47XG4gIG9sZFByb3BzID0gb2xkUHJvcHMgfHwge307XG4gIHByb3BzID0gcHJvcHMgfHwge307XG5cbiAgZm9yIChrZXkgaW4gb2xkUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzW2tleV0pIHtcbiAgICAgIGRlbGV0ZSBlbG1ba2V5XTtcbiAgICB9XG4gIH1cbiAgZm9yIChrZXkgaW4gcHJvcHMpIHtcbiAgICBjdXIgPSBwcm9wc1trZXldO1xuICAgIG9sZCA9IG9sZFByb3BzW2tleV07XG4gICAgaWYgKG9sZCAhPT0gY3VyICYmIChrZXkgIT09ICd2YWx1ZScgfHwgZWxtW2tleV0gIT09IGN1cikpIHtcbiAgICAgIGVsbVtrZXldID0gY3VyO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtjcmVhdGU6IHVwZGF0ZVByb3BzLCB1cGRhdGU6IHVwZGF0ZVByb3BzfTtcbiIsInZhciByYWYgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkgfHwgc2V0VGltZW91dDtcbnZhciBuZXh0RnJhbWUgPSBmdW5jdGlvbihmbikgeyByYWYoZnVuY3Rpb24oKSB7IHJhZihmbik7IH0pOyB9O1xuXG5mdW5jdGlvbiBzZXROZXh0RnJhbWUob2JqLCBwcm9wLCB2YWwpIHtcbiAgbmV4dEZyYW1lKGZ1bmN0aW9uKCkgeyBvYmpbcHJvcF0gPSB2YWw7IH0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdHlsZShvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGN1ciwgbmFtZSwgZWxtID0gdm5vZGUuZWxtLFxuICAgICAgb2xkU3R5bGUgPSBvbGRWbm9kZS5kYXRhLnN0eWxlLFxuICAgICAgc3R5bGUgPSB2bm9kZS5kYXRhLnN0eWxlO1xuXG4gIGlmICghb2xkU3R5bGUgJiYgIXN0eWxlKSByZXR1cm47XG4gIG9sZFN0eWxlID0gb2xkU3R5bGUgfHwge307XG4gIHN0eWxlID0gc3R5bGUgfHwge307XG4gIHZhciBvbGRIYXNEZWwgPSAnZGVsYXllZCcgaW4gb2xkU3R5bGU7XG5cbiAgZm9yIChuYW1lIGluIG9sZFN0eWxlKSB7XG4gICAgaWYgKCFzdHlsZVtuYW1lXSkge1xuICAgICAgZWxtLnN0eWxlW25hbWVdID0gJyc7XG4gICAgfVxuICB9XG4gIGZvciAobmFtZSBpbiBzdHlsZSkge1xuICAgIGN1ciA9IHN0eWxlW25hbWVdO1xuICAgIGlmIChuYW1lID09PSAnZGVsYXllZCcpIHtcbiAgICAgIGZvciAobmFtZSBpbiBzdHlsZS5kZWxheWVkKSB7XG4gICAgICAgIGN1ciA9IHN0eWxlLmRlbGF5ZWRbbmFtZV07XG4gICAgICAgIGlmICghb2xkSGFzRGVsIHx8IGN1ciAhPT0gb2xkU3R5bGUuZGVsYXllZFtuYW1lXSkge1xuICAgICAgICAgIHNldE5leHRGcmFtZShlbG0uc3R5bGUsIG5hbWUsIGN1cik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5hbWUgIT09ICdyZW1vdmUnICYmIGN1ciAhPT0gb2xkU3R5bGVbbmFtZV0pIHtcbiAgICAgIGVsbS5zdHlsZVtuYW1lXSA9IGN1cjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlEZXN0cm95U3R5bGUodm5vZGUpIHtcbiAgdmFyIHN0eWxlLCBuYW1lLCBlbG0gPSB2bm9kZS5lbG0sIHMgPSB2bm9kZS5kYXRhLnN0eWxlO1xuICBpZiAoIXMgfHwgIShzdHlsZSA9IHMuZGVzdHJveSkpIHJldHVybjtcbiAgZm9yIChuYW1lIGluIHN0eWxlKSB7XG4gICAgZWxtLnN0eWxlW25hbWVdID0gc3R5bGVbbmFtZV07XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlSZW1vdmVTdHlsZSh2bm9kZSwgcm0pIHtcbiAgdmFyIHMgPSB2bm9kZS5kYXRhLnN0eWxlO1xuICBpZiAoIXMgfHwgIXMucmVtb3ZlKSB7XG4gICAgcm0oKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5hbWUsIGVsbSA9IHZub2RlLmVsbSwgaWR4LCBpID0gMCwgbWF4RHVyID0gMCxcbiAgICAgIGNvbXBTdHlsZSwgc3R5bGUgPSBzLnJlbW92ZSwgYW1vdW50ID0gMCwgYXBwbGllZCA9IFtdO1xuICBmb3IgKG5hbWUgaW4gc3R5bGUpIHtcbiAgICBhcHBsaWVkLnB1c2gobmFtZSk7XG4gICAgZWxtLnN0eWxlW25hbWVdID0gc3R5bGVbbmFtZV07XG4gIH1cbiAgY29tcFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbG0pO1xuICB2YXIgcHJvcHMgPSBjb21wU3R5bGVbJ3RyYW5zaXRpb24tcHJvcGVydHknXS5zcGxpdCgnLCAnKTtcbiAgZm9yICg7IGkgPCBwcm9wcy5sZW5ndGg7ICsraSkge1xuICAgIGlmKGFwcGxpZWQuaW5kZXhPZihwcm9wc1tpXSkgIT09IC0xKSBhbW91bnQrKztcbiAgfVxuICBlbG0uYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uKGV2KSB7XG4gICAgaWYgKGV2LnRhcmdldCA9PT0gZWxtKSAtLWFtb3VudDtcbiAgICBpZiAoYW1vdW50ID09PSAwKSBybSgpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7Y3JlYXRlOiB1cGRhdGVTdHlsZSwgdXBkYXRlOiB1cGRhdGVTdHlsZSwgZGVzdHJveTogYXBwbHlEZXN0cm95U3R5bGUsIHJlbW92ZTogYXBwbHlSZW1vdmVTdHlsZX07XG4iLCJ2YXIgc25hYmJkb20gPSByZXF1aXJlKCcuL3NuYWJiZG9tJyk7XG52YXIgcGF0Y2ggPSBzbmFiYmRvbS5pbml0KFsgLy8gSW5pdCBwYXRjaCBmdW5jdGlvbiB3aXRoIGNob29zZW4gbW9kdWxlc1xuICByZXF1aXJlKCcuL21vZHVsZXMvYXR0cmlidXRlcycpLCAvLyBtYWtlcyBpdCBlYXN5IHRvIHRvZ2dsZSBjbGFzc2VzXG4gIHJlcXVpcmUoJy4vbW9kdWxlcy9jbGFzcycpLCAvLyBtYWtlcyBpdCBlYXN5IHRvIHRvZ2dsZSBjbGFzc2VzXG4gIHJlcXVpcmUoJy4vbW9kdWxlcy9wcm9wcycpLCAvLyBmb3Igc2V0dGluZyBwcm9wZXJ0aWVzIG9uIERPTSBlbGVtZW50c1xuICByZXF1aXJlKCcuL21vZHVsZXMvc3R5bGUnKSwgLy8gaGFuZGxlcyBzdHlsaW5nIG9uIGVsZW1lbnRzIHdpdGggc3VwcG9ydCBmb3IgYW5pbWF0aW9uc1xuICByZXF1aXJlKCcuL21vZHVsZXMvZXZlbnRsaXN0ZW5lcnMnKSwgLy8gYXR0YWNoZXMgZXZlbnQgbGlzdGVuZXJzXG5dKTtcbnZhciBoID0gcmVxdWlyZSgnLi9oJyk7IC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgdm5vZGVzXG5cbm1vZHVsZS5leHBvcnRzID0geyBwYXRjaDogcGF0Y2gsIGg6IGggfVxuIiwiLy8ganNoaW50IG5ld2NhcDogZmFsc2Vcbi8qIGdsb2JhbCByZXF1aXJlLCBtb2R1bGUsIGRvY3VtZW50LCBOb2RlICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBWTm9kZSA9IHJlcXVpcmUoJy4vdm5vZGUnKTtcbnZhciBpcyA9IHJlcXVpcmUoJy4vaXMnKTtcbnZhciBkb21BcGkgPSByZXF1aXJlKCcuL2h0bWxkb21hcGknKTtcblxuZnVuY3Rpb24gaXNVbmRlZihzKSB7IHJldHVybiBzID09PSB1bmRlZmluZWQ7IH1cbmZ1bmN0aW9uIGlzRGVmKHMpIHsgcmV0dXJuIHMgIT09IHVuZGVmaW5lZDsgfVxuXG52YXIgZW1wdHlOb2RlID0gVk5vZGUoJycsIHt9LCBbXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuXG5mdW5jdGlvbiBzYW1lVm5vZGUodm5vZGUxLCB2bm9kZTIpIHtcbiAgcmV0dXJuIHZub2RlMS5rZXkgPT09IHZub2RlMi5rZXkgJiYgdm5vZGUxLnNlbCA9PT0gdm5vZGUyLnNlbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5VG9PbGRJZHgoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHtcbiAgdmFyIGksIG1hcCA9IHt9LCBrZXk7XG4gIGZvciAoaSA9IGJlZ2luSWR4OyBpIDw9IGVuZElkeDsgKytpKSB7XG4gICAga2V5ID0gY2hpbGRyZW5baV0ua2V5O1xuICAgIGlmIChpc0RlZihrZXkpKSBtYXBba2V5XSA9IGk7XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn1cblxudmFyIGhvb2tzID0gWydjcmVhdGUnLCAndXBkYXRlJywgJ3JlbW92ZScsICdkZXN0cm95JywgJ3ByZScsICdwb3N0J107XG5cbmZ1bmN0aW9uIGluaXQobW9kdWxlcywgYXBpKSB7XG4gIHZhciBpLCBqLCBjYnMgPSB7fTtcblxuICBpZiAoaXNVbmRlZihhcGkpKSBhcGkgPSBkb21BcGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgKytpKSB7XG4gICAgY2JzW2hvb2tzW2ldXSA9IFtdO1xuICAgIGZvciAoaiA9IDA7IGogPCBtb2R1bGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICBpZiAobW9kdWxlc1tqXVtob29rc1tpXV0gIT09IHVuZGVmaW5lZCkgY2JzW2hvb2tzW2ldXS5wdXNoKG1vZHVsZXNbal1baG9va3NbaV1dKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbXB0eU5vZGVBdChlbG0pIHtcbiAgICB2YXIgaWQgPSBlbG0uaWQgPyAnIycgKyBlbG0uaWQgOiAnJztcbiAgICB2YXIgYyA9IGVsbS5jbGFzc05hbWUgPyAnLicgKyBlbG0uY2xhc3NOYW1lLnNwbGl0KCcgJykuam9pbignLicpIDogJyc7XG4gICAgcmV0dXJuIFZOb2RlKGFwaS50YWdOYW1lKGVsbSkudG9Mb3dlckNhc2UoKSArIGlkICsgYywge30sIFtdLCB1bmRlZmluZWQsIGVsbSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVSbUNiKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS1saXN0ZW5lcnMgPT09IDApIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IGFwaS5wYXJlbnROb2RlKGNoaWxkRWxtKTtcbiAgICAgICAgYXBpLnJlbW92ZUNoaWxkKHBhcmVudCwgY2hpbGRFbG0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbG0odm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgIHZhciBpLCBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkge1xuICAgICAgICBpKHZub2RlKTtcbiAgICAgICAgZGF0YSA9IHZub2RlLmRhdGE7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBlbG0sIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW4sIHNlbCA9IHZub2RlLnNlbDtcbiAgICBpZiAoaXNEZWYoc2VsKSkge1xuICAgICAgLy8gUGFyc2Ugc2VsZWN0b3JcbiAgICAgIHZhciBoYXNoSWR4ID0gc2VsLmluZGV4T2YoJyMnKTtcbiAgICAgIHZhciBkb3RJZHggPSBzZWwuaW5kZXhPZignLicsIGhhc2hJZHgpO1xuICAgICAgdmFyIGhhc2ggPSBoYXNoSWR4ID4gMCA/IGhhc2hJZHggOiBzZWwubGVuZ3RoO1xuICAgICAgdmFyIGRvdCA9IGRvdElkeCA+IDAgPyBkb3RJZHggOiBzZWwubGVuZ3RoO1xuICAgICAgdmFyIHRhZyA9IGhhc2hJZHggIT09IC0xIHx8IGRvdElkeCAhPT0gLTEgPyBzZWwuc2xpY2UoMCwgTWF0aC5taW4oaGFzaCwgZG90KSkgOiBzZWw7XG4gICAgICBlbG0gPSB2bm9kZS5lbG0gPSBpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ucykgPyBhcGkuY3JlYXRlRWxlbWVudE5TKGksIHRhZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFwaS5jcmVhdGVFbGVtZW50KHRhZyk7XG4gICAgICBpZiAoaGFzaCA8IGRvdCkgZWxtLmlkID0gc2VsLnNsaWNlKGhhc2ggKyAxLCBkb3QpO1xuICAgICAgaWYgKGRvdElkeCA+IDApIGVsbS5jbGFzc05hbWUgPSBzZWwuc2xpY2UoZG90ICsgMSkucmVwbGFjZSgvXFwuL2csICcgJyk7XG4gICAgICBpZiAoaXMuYXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGFwaS5hcHBlbmRDaGlsZChlbG0sIGNyZWF0ZUVsbShjaGlsZHJlbltpXSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXMucHJpbWl0aXZlKHZub2RlLnRleHQpKSB7XG4gICAgICAgIGFwaS5hcHBlbmRDaGlsZChlbG0sIGFwaS5jcmVhdGVUZXh0Tm9kZSh2bm9kZS50ZXh0KSk7XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmNyZWF0ZS5sZW5ndGg7ICsraSkgY2JzLmNyZWF0ZVtpXShlbXB0eU5vZGUsIHZub2RlKTtcbiAgICAgIGkgPSB2bm9kZS5kYXRhLmhvb2s7IC8vIFJldXNlIHZhcmlhYmxlXG4gICAgICBpZiAoaXNEZWYoaSkpIHtcbiAgICAgICAgaWYgKGkuY3JlYXRlKSBpLmNyZWF0ZShlbXB0eU5vZGUsIHZub2RlKTtcbiAgICAgICAgaWYgKGkuaW5zZXJ0KSBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsbSA9IHZub2RlLmVsbSA9IGFwaS5jcmVhdGVUZXh0Tm9kZSh2bm9kZS50ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlLmVsbTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFZub2RlcyhwYXJlbnRFbG0sIGJlZm9yZSwgdm5vZGVzLCBzdGFydElkeCwgZW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7XG4gICAgICBhcGkuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgY3JlYXRlRWxtKHZub2Rlc1tzdGFydElkeF0sIGluc2VydGVkVm5vZGVRdWV1ZSksIGJlZm9yZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRGVzdHJveUhvb2sodm5vZGUpIHtcbiAgICB2YXIgaSwgaiwgZGF0YSA9IHZub2RlLmRhdGE7XG4gICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkuZGVzdHJveSkpIGkodm5vZGUpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSBjYnMuZGVzdHJveVtpXSh2bm9kZSk7XG4gICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkge1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBpbnZva2VEZXN0cm95SG9vayh2bm9kZS5jaGlsZHJlbltqXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVWbm9kZXMocGFyZW50RWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgpIHtcbiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7XG4gICAgICB2YXIgaSwgbGlzdGVuZXJzLCBybSwgY2ggPSB2bm9kZXNbc3RhcnRJZHhdO1xuICAgICAgaWYgKGlzRGVmKGNoKSkge1xuICAgICAgICBpZiAoaXNEZWYoY2guc2VsKSkge1xuICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKGNoKTtcbiAgICAgICAgICBsaXN0ZW5lcnMgPSBjYnMucmVtb3ZlLmxlbmd0aCArIDE7XG4gICAgICAgICAgcm0gPSBjcmVhdGVSbUNiKGNoLmVsbSwgbGlzdGVuZXJzKTtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraSkgY2JzLnJlbW92ZVtpXShjaCwgcm0pO1xuICAgICAgICAgIGlmIChpc0RlZihpID0gY2guZGF0YSkgJiYgaXNEZWYoaSA9IGkuaG9vaykgJiYgaXNEZWYoaSA9IGkucmVtb3ZlKSkge1xuICAgICAgICAgICAgaShjaCwgcm0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBybSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgYXBpLnJlbW92ZUNoaWxkKHBhcmVudEVsbSwgY2guZWxtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuKHBhcmVudEVsbSwgb2xkQ2gsIG5ld0NoLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICB2YXIgb2xkU3RhcnRJZHggPSAwLCBuZXdTdGFydElkeCA9IDA7XG4gICAgdmFyIG9sZEVuZElkeCA9IG9sZENoLmxlbmd0aCAtIDE7XG4gICAgdmFyIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFswXTtcbiAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdO1xuICAgIHZhciBuZXdFbmRJZHggPSBuZXdDaC5sZW5ndGggLSAxO1xuICAgIHZhciBuZXdTdGFydFZub2RlID0gbmV3Q2hbMF07XG4gICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTtcbiAgICB2YXIgb2xkS2V5VG9JZHgsIGlkeEluT2xkLCBlbG1Ub01vdmUsIGJlZm9yZTtcblxuICAgIHdoaWxlIChvbGRTdGFydElkeCA8PSBvbGRFbmRJZHggJiYgbmV3U3RhcnRJZHggPD0gbmV3RW5kSWR4KSB7XG4gICAgICBpZiAoaXNVbmRlZihvbGRTdGFydFZub2RlKSkge1xuICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07IC8vIFZub2RlIGhhcyBiZWVuIG1vdmVkIGxlZnRcbiAgICAgIH0gZWxzZSBpZiAoaXNVbmRlZihvbGRFbmRWbm9kZSkpIHtcbiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlKSkge1xuICAgICAgICBwYXRjaFZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTtcbiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlKSkge1xuICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdFbmRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07XG4gICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIHJpZ2h0XG4gICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIGFwaS5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgYXBpLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpO1xuICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07XG4gICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnRcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZEVuZFZub2RlLmVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTtcbiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSBvbGRLZXlUb0lkeCA9IGNyZWF0ZUtleVRvT2xkSWR4KG9sZENoLCBvbGRTdGFydElkeCwgb2xkRW5kSWR4KTtcbiAgICAgICAgaWR4SW5PbGQgPSBvbGRLZXlUb0lkeFtuZXdTdGFydFZub2RlLmtleV07XG4gICAgICAgIGlmIChpc1VuZGVmKGlkeEluT2xkKSkgeyAvLyBOZXcgZWxlbWVudFxuICAgICAgICAgIGFwaS5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCBjcmVhdGVFbG0obmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbG1Ub01vdmUgPSBvbGRDaFtpZHhJbk9sZF07XG4gICAgICAgICAgcGF0Y2hWbm9kZShlbG1Ub01vdmUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgb2xkQ2hbaWR4SW5PbGRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGFwaS5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCBlbG1Ub01vdmUuZWxtLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvbGRTdGFydElkeCA+IG9sZEVuZElkeCkge1xuICAgICAgYmVmb3JlID0gaXNVbmRlZihuZXdDaFtuZXdFbmRJZHgrMV0pID8gbnVsbCA6IG5ld0NoW25ld0VuZElkeCsxXS5lbG07XG4gICAgICBhZGRWbm9kZXMocGFyZW50RWxtLCBiZWZvcmUsIG5ld0NoLCBuZXdTdGFydElkeCwgbmV3RW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHtcbiAgICAgIHJlbW92ZVZub2RlcyhwYXJlbnRFbG0sIG9sZENoLCBvbGRTdGFydElkeCwgb2xkRW5kSWR4KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7XG4gICAgdmFyIGksIGhvb2s7XG4gICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5kYXRhKSAmJiBpc0RlZihob29rID0gaS5ob29rKSAmJiBpc0RlZihpID0gaG9vay5wcmVwYXRjaCkpIHtcbiAgICAgIGkob2xkVm5vZGUsIHZub2RlKTtcbiAgICB9XG4gICAgdmFyIGVsbSA9IHZub2RlLmVsbSA9IG9sZFZub2RlLmVsbSwgb2xkQ2ggPSBvbGRWbm9kZS5jaGlsZHJlbiwgY2ggPSB2bm9kZS5jaGlsZHJlbjtcbiAgICBpZiAob2xkVm5vZGUgPT09IHZub2RlKSByZXR1cm47XG4gICAgaWYgKCFzYW1lVm5vZGUob2xkVm5vZGUsIHZub2RlKSkge1xuICAgICAgdmFyIHBhcmVudEVsbSA9IGFwaS5wYXJlbnROb2RlKG9sZFZub2RlLmVsbSk7XG4gICAgICBlbG0gPSBjcmVhdGVFbG0odm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICBhcGkuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgZWxtLCBvbGRWbm9kZS5lbG0pO1xuICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgW29sZFZub2RlXSwgMCwgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0RlZih2bm9kZS5kYXRhKSkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy51cGRhdGUubGVuZ3RoOyArK2kpIGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTtcbiAgICAgIGkgPSB2bm9kZS5kYXRhLmhvb2s7XG4gICAgICBpZiAoaXNEZWYoaSkgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSkgaShvbGRWbm9kZSwgdm5vZGUpO1xuICAgIH1cbiAgICBpZiAoaXNVbmRlZih2bm9kZS50ZXh0KSkge1xuICAgICAgaWYgKGlzRGVmKG9sZENoKSAmJiBpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgdXBkYXRlQ2hpbGRyZW4oZWxtLCBvbGRDaCwgY2gsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmKGNoKSkge1xuICAgICAgICBpZiAoaXNEZWYob2xkVm5vZGUudGV4dCkpIGFwaS5zZXRUZXh0Q29udGVudChlbG0sICcnKTtcbiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZENoKSkge1xuICAgICAgICByZW1vdmVWbm9kZXMoZWxtLCBvbGRDaCwgMCwgb2xkQ2gubGVuZ3RoIC0gMSk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7XG4gICAgICAgIGFwaS5zZXRUZXh0Q29udGVudChlbG0sICcnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9sZFZub2RlLnRleHQgIT09IHZub2RlLnRleHQpIHtcbiAgICAgIGFwaS5zZXRUZXh0Q29udGVudChlbG0sIHZub2RlLnRleHQpO1xuICAgIH1cbiAgICBpZiAoaXNEZWYoaG9vaykgJiYgaXNEZWYoaSA9IGhvb2sucG9zdHBhdGNoKSkge1xuICAgICAgaShvbGRWbm9kZSwgdm5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihvbGRWbm9kZSwgdm5vZGUpIHtcbiAgICB2YXIgaSwgZWxtLCBwYXJlbnQ7XG4gICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdO1xuICAgIGZvciAoaSA9IDA7IGkgPCBjYnMucHJlLmxlbmd0aDsgKytpKSBjYnMucHJlW2ldKCk7XG5cbiAgICBpZiAoaXNVbmRlZihvbGRWbm9kZS5zZWwpKSB7XG4gICAgICBvbGRWbm9kZSA9IGVtcHR5Tm9kZUF0KG9sZFZub2RlKTtcbiAgICB9XG5cbiAgICBpZiAoc2FtZVZub2RlKG9sZFZub2RlLCB2bm9kZSkpIHtcbiAgICAgIHBhdGNoVm5vZGUob2xkVm5vZGUsIHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbG0gPSBvbGRWbm9kZS5lbG07XG4gICAgICBwYXJlbnQgPSBhcGkucGFyZW50Tm9kZShlbG0pO1xuXG4gICAgICBjcmVhdGVFbG0odm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG5cbiAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnQsIHZub2RlLmVsbSwgYXBpLm5leHRTaWJsaW5nKGVsbSkpO1xuICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50LCBbb2xkVm5vZGVdLCAwLCAwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICBpbnNlcnRlZFZub2RlUXVldWVbaV0uZGF0YS5ob29rLmluc2VydChpbnNlcnRlZFZub2RlUXVldWVbaV0pO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnBvc3QubGVuZ3RoOyArK2kpIGNicy5wb3N0W2ldKCk7XG4gICAgcmV0dXJuIHZub2RlO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtpbml0OiBpbml0fTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc2VsLCBkYXRhLCBjaGlsZHJlbiwgdGV4dCwgZWxtKSB7XG4gIHZhciBrZXkgPSBkYXRhID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBkYXRhLmtleTtcbiAgcmV0dXJuIHtzZWw6IHNlbCwgZGF0YTogZGF0YSwgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgICAgICAgIHRleHQ6IHRleHQsIGVsbTogZWxtLCBrZXk6IGtleX07XG59O1xuIl19\n"]}