|
|
-{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","context","SETTINGS","_initServices","services","orderedServices","OrderedList","order","forEach","item","factory","undefined","serviceInstance","key","_destroyServices","reverse","destroy","setup","init","fixture","get","test","api","_services","proto","prototype","addService","name","push","after","before","has","obj","hasOwnProperty","value","pop","returnValue","items","isOrdered","_items","add","i","length","values","values_only","_order","unordered","insertItem","insertAt","ordering","indexOf","ordered","splice","index","iterations","serializeDatetime","serialized","format","deserializeDatetime","deserialized","moment","startsWith","string","beginning","endsWith","tail","UrlConfInvalidComponentError","message","toString","UrlConf","_patterns","patterns","prefixPattern","prefix","pattern","replace","include","url","component","loadingPage","_","m","Loader","getCsrfToken","cookie_name","document","cookie","cookieRegex","RegExp","match","split","Ajax","csrfToken","CSRF_COOKIE_NAME","runningGets","ajax","method","data","progress","promise","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","resolve","error","jqXHR","rejection","responseJSON","status","statusText","reject","$","preloaded","post","patch","put","filtersUrl","filters","encodedKey","encodeURIComponent","encodedValue","join","Query","call","path","related","model","relation","endpoint","then","results","map","models","Api","argumentsArray","arguments","apply","settings","mount","getElementById","ForumLayout","Models","classes","deserializers","relations","kwargs","deserialize","json","locale","attr","noop","route","isActive","__controller","controller","__onunload","onunload","vm","__init","initArgs","ondata","finalArgs","f","container","router","errorPage","loading","__view","view","isReady","Router","baseUrl","staticUrl","mediaUrl","urls","reverses","routedComponent","populatePatterns","urlconf","finalPattern","startRouting","mode","delegateElement","delegateName","cleanUrl","isRelative","substr","location","protocol","host","avatarsUrl","delegateClicks","element","on","e","target","href","preventDefault","off","prefixUrl","error403","ban","ErrorBannedRoute","detail","Error403Route","error404","Error404Route","error500","Error500Route","error0","Error0Route","RunLoop","_intervals","stopInterval","clearTimeout","run","callable","delay","setTimeout","result","runOnce","stop","loop","runloop","ticks","prop","startComputation","endComputation","PageTitle","forum_name","set","title","_set_complex","completeTitle","page","page_label","interpolate","gettext","parent","Ban","html","plain","expires_on","deserializeBan","class","LegalPage","body","link","error_message","help","code","icon","trust","expirationMessage","isAfter","fromNow","IndexRoute","forum_index_title","count","increment","console","log","ctrl","onclick","legalPageFactory","typeName","defaultTitle","dashedTypeName","PageHeader","Markup","TermsOfServiceRoute","PrivacyPolicyRoute","legalLink","legalType","FooterNav","isVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","ForumFooter","nav","FooterMisagoBranding","BrandFull","branding","children","src","alt","ForumNavbar","desktopNavbar","forum_branding_display","forum_branding_text","config","navbarStyle","persistent","el","isInit","retain","LoadingPage","setupMarkup","content","options"],"mappings":"CAEC,WACC,YAEAA,QAAOC,OAAS,WACd,GAAIC,GAAKC,OAAOC,eAAeC,MAC3BC,EAAOD,IAGXA,MAAKE,SAEHC,aAIFH,KAAKI,cAAgB,SAASC,GAC5B,GAAIC,GAAkB,GAAIT,GAAGU,YAAYF,GAAUG,OAAM,EACzDF,GAAgBG,QAAQ,SAAUC,GAChC,GAAIC,GAAU,IAEZA,GADwBC,SAAtBF,EAAKA,KAAKC,QACFD,EAAKA,KAAKC,QAEVD,EAAKA,IAGjB,IAAIG,GAAkBF,EAAQV,EAC1BY,KACFZ,EAAKS,EAAKI,KAAOD,MAKvBb,KAAKe,iBAAmB,SAASV,GAC/B,GAAIC,GAAkB,GAAIT,GAAGU,YAAYF,GAAUG,OACnDF,GAAgBU,UAChBV,EAAgBG,QAAQ,SAAUC,GACXE,SAAjBF,EAAKO,SACPP,EAAKO,QAAQhB,MAMnBD,KAAKkB,OAAQ,EACblB,KAAKmB,KAAO,SAASD,GACnBlB,KAAKkB,OACHE,QAASvB,EAAGwB,IAAIH,EAAO,UAAW,MAClCI,KAAMzB,EAAGwB,IAAIH,EAAO,QAAQ,GAC5BK,IAAK1B,EAAGwB,IAAIH,EAAO,MAAO,UAG5BlB,KAAKI,cAAcP,EAAG2B,YAGxBxB,KAAKiB,QAAU,WACbjB,KAAKe,iBAAiBlB,EAAG2B,YAM7B,IAAIC,GAAQ9B,OAAOC,OAAO8B,SAC1BD,GAAMD,aAENC,EAAME,WAAa,SAASC,EAAMjB,EAASH,GACzCiB,EAAMD,UAAUK,MACdf,IAAKc,EACLlB,KAAMC,EACNmB,MAAOL,EAAMJ,IAAIb,EAAO,SACxBuB,OAAQN,EAAMJ,IAAIb,EAAO,gBAK9B,SAAUZ,GACT,YAEAA,GAAOoC,IAAM,SAASC,EAAKnB,GACzB,MAAImB,GACKA,EAAIC,eAAepB,IAEnB,GAIXlB,EAAOyB,IAAM,SAASY,EAAKnB,EAAKqB,GAC9B,MAAIvC,GAAOoC,IAAIC,EAAKnB,GACXmB,EAAInB,GACQF,SAAVuB,EACFA,EAEAvB,QAIXhB,EAAOwC,IAAM,SAASH,EAAKnB,EAAKqB,GAC9B,GAAIE,GAAczC,EAAOyB,IAAIY,EAAKnB,EAAKqB,EAIvC,OAHIvC,GAAOoC,IAAIC,EAAKnB,KAClBmB,EAAInB,GAAO,MAENuB,IAETzC,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAOW,YAAc,SAAS+B,GAC5BtC,KAAKuC,WAAY,EACjBvC,KAAKwC,OAASF,MAEdtC,KAAKyC,IAAM,SAAS3B,EAAKJ,EAAMF,GAC7BR,KAAKwC,OAAOX,MACVf,IAAKA,EACLJ,KAAMA,EACNoB,MAAOlC,EAAOyB,IAAIb,EAAO,SACzBuB,OAAQnC,EAAOyB,IAAIb,EAAO,aAI9BR,KAAKqB,IAAM,SAASP,EAAKqB,GACvB,IAAK,GAAIO,GAAI,EAAGA,EAAI1C,KAAKwC,OAAOG,OAAQD,IACtC,GAAI1C,KAAKwC,OAAOE,GAAG5B,MAAQA,EACzB,MAAOd,MAAKwC,OAAOE,GAAGhC,IAI1B,OAAOyB,IAGTnC,KAAKgC,IAAM,SAASlB,GAClB,MAAyBF,UAAlBZ,KAAKqB,IAAIP,IAGlBd,KAAK4C,OAAS,WAEZ,IAAK,GADDA,MACKF,EAAI,EAAGA,EAAI1C,KAAKwC,OAAOG,OAAQD,IACtCE,EAAOf,KAAK7B,KAAKwC,OAAOE,GAAGhC,KAE7B,OAAOkC,IAGT5C,KAAKQ,MAAQ,SAASqC,GAMpB,MALK7C,MAAKuC,YACRvC,KAAKwC,OAASxC,KAAK8C,OAAO9C,KAAKwC,QAC/BxC,KAAKuC,WAAY,GAGfM,GAAsC,mBAAhBA,GACjB7C,KAAK4C,SAEL5C,KAAKwC,QAIhBxC,KAAK8C,OAAS,SAASC,GAgCrB,QAASC,GAAWtC,GAClB,GAAIuC,GAAW,EACoB,MAA/BC,EAASC,QAAQzC,EAAKI,OACpBJ,EAAKoB,OACPmB,EAAWC,EAASC,QAAQzC,EAAKoB,OAChB,KAAbmB,IACFA,GAAY,IAELvC,EAAKqB,SACdkB,EAAWC,EAASC,QAAQzC,EAAKqB,SAGlB,KAAbkB,IACFG,EAAQC,OAAOJ,EAAU,EAAGvC,GAC5BwC,EAASG,OAAOJ,EAAU,EAAGvC,EAAKI,OA5CxC,GAAIwC,KACJP,GAAUtC,QAAQ,SAAUC,GAC1B4C,EAAMzB,KAAKnB,EAAKI,MAIlB,IAAIsC,MACAF,IAIJH,GAAUtC,QAAQ,SAAUC,GACrBA,EAAKoB,OAAUpB,EAAKqB,SACvBqB,EAAQvB,KAAKnB,GACbwC,EAASrB,KAAKnB,EAAKI,QAMvBiC,EAAUtC,QAAQ,SAAUC,GACN,SAAhBA,EAAKqB,SACPqB,EAAQvB,KAAKnB,GACbwC,EAASrB,KAAKnB,EAAKI,OA2BvB,KADA,GAAIyC,GAAa,IACVA,EAAa,GAAKD,EAAMX,SAAWO,EAASP,QACjDY,GAAc,EACdR,EAAUtC,QAAQuC,EAGpB,OAAOI,MAGVxD,OAAO8B,WAET,SAAU9B,GACTA,EAAO4D,kBAAoB,SAASC,GAClC,MAAOA,GAAaA,EAAWC,SAAW,MAG5C9D,EAAO+D,oBAAsB,SAASC,GACpC,MAAOA,GAAeC,OAAOD,GAAgB,OAE/ChE,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAOkE,WAAa,SAASC,EAAQC,GACnC,MAAqC,KAA9BD,EAAOZ,QAAQa,IAGxBpE,EAAOqE,SAAW,SAASF,EAAQG,GACjC,MAA6D,KAAtDH,EAAOZ,QAAQe,EAAMH,EAAOpB,OAASuB,EAAKvB,UAEnD/C,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAOuE,6BAA+B,SAASvC,GAC7C5B,KAAKoE,QAAU,WAAaxC,EAAO,0CAGnC5B,KAAKqE,SAAW,WACd,MAAOrE,MAAKoE,UAIhBxE,EAAO0E,QAAU,WACf,GAAIrE,GAAOD,IACXA,MAAKuE,aAELvE,KAAKwE,SAAW,WACd,MAAOxE,MAAKuE,UAGd,IAAIE,GAAgB,SAASC,EAAQC,GACnC,OAAQD,EAASC,GAASC,QAAQ,KAAM,MAGtCC,EAAU,SAASH,EAAQF,GAC7B,IAAK,GAAI9B,GAAI,EAAGA,EAAI8B,EAAS7B,OAAQD,IACnCzC,EAAK6E,IAAIL,EAAcC,EAAQF,EAAS9B,GAAGiC,SAClCH,EAAS9B,GAAGqC,UACZP,EAAS9B,GAAGd,MAIzB5B,MAAK8E,IAAM,SAASH,EAASI,EAAWnD,GACtC,GAAyB,gBAAdmD,GACT,KAAM,IAAInF,GAAOuE,6BAA6BvC,EAGhC,MAAZ+C,IACFA,EAAU,KAGRI,YAAqBnF,GAAO0E,QAC9BO,EAAQF,EAASI,EAAUP,YAE3BxE,KAAKuE,UAAU1C,MACb8C,QAASA,EACTI,UAAWA,EACXnD,KAAMA,OAKdhC,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAOoF,YAAc,SAASC,GAC5B,MAAOC,GAAE,qBACPD,EAAEF,UAAUnF,EAAOuF,WAGvBvF,OAAO8B,WAER,SAAU9B,GACT,YAEA,IAAIwF,GAAe,SAASC,GAC1B,GAA6C,KAAzCC,SAASC,OAAOpC,QAAQkC,GAAqB,CAC/C,GAAIG,GAAc,GAAIC,QAAOJ,EAAc,YACvCE,EAAS3F,EAAOyB,IAAIiE,SAASC,OAAOG,MAAMF,GAAc,EAC5D,OAAOD,GAAOI,MAAM,KAAK,GAEzB,MAAO,OAIPC,EAAO,SAASX,GAClBjF,KAAK6F,UAAYT,EAAaH,EAAE/E,QAAQ4F,iBAMxC,IAAIC,KAEJ/F,MAAKgG,KAAO,SAASC,EAAQnB,EAAKoB,EAAMC,GACtC,GAAIC,GAAUlB,EAAEmB,WAEZC,GACFxB,IAAKA,EACLmB,OAAQA,EACRM,SACEC,cAAexG,KAAK6F,WAGtBK,KAAMA,KACNO,SAAU,OAEVC,QAAS,SAASR,GACD,QAAXD,GACFrG,EAAOwC,IAAI2D,EAAajB,GAE1BsB,EAAQO,QAAQT,IAElBU,MAAO,SAASC,GACC,QAAXZ,GACFrG,EAAOwC,IAAI2D,EAAajB,EAG1B,IAAIgC,GAAYD,EAAME,gBAEtBD,GAAUE,OAASH,EAAMG,OACzBF,EAAUG,WAAaJ,EAAMI,WAE7Bb,EAAQc,OAAOJ,IAInB,OAAIX,GAAJ,QAIAgB,EAAEnB,KAAKM,GACAF,EAAQA,UAGjBpG,KAAKqB,IAAM,SAASyD,GAClB,GAAIsC,GAAYxH,EAAOwC,IAAI6C,EAAE/E,QAAS4E,EACtC,IAAIsC,EAAW,CACb,GAAIf,GAAWnB,EAAEmB,UAEjB,OADAA,GAASM,QAAQS,GACVf,EAASD,QACX,MAAyBxF,UAArBmF,EAAYjB,GACdiB,EAAYjB,IAEnBiB,EAAYjB,GAAO9E,KAAKgG,KAAK,MAAOlB,GAC7BiB,EAAYjB,KAIvB9E,KAAKqH,KAAO,SAASvC,EAAKoB,GACxB,MAAOlG,MAAKgG,KAAK,OAAQlB,EAAKoB,IAGhClG,KAAKsH,MAAQ,SAASxC,EAAKoB,GACzB,MAAOlG,MAAKgG,KAAK,QAASlB,EAAKoB,IAGjClG,KAAKuH,IAAM,SAASzC,EAAKoB,GACvB,MAAOlG,MAAKgG,KAAK,MAAOlB,EAAKoB,IAG/BlG,KAAAA,UAAc,SAAS8E,GACrB,MAAO9E,MAAKgG,KAAK,SAAUlB,IAI/BlF,GAAO+B,WAAW,OAAQ,SAASsD,GACjC,MAAO,IAAIW,GAAKX,MAElBrF,OAAO8B,WAER,SAAU9B,GACT,YAEA,IAAI4H,GAAa,SAASC,GACxB,GAAuB,gBAAZA,GAAsB,CAC/B,GAAI7E,KACJ,KAAK,GAAI9B,KAAO2G,GACd,GAAIA,EAAQvF,eAAepB,GAAM,CAC/B,GAAI4G,GAAaC,mBAAmB7G,GAChC8G,EAAeD,mBAAmBF,EAAQ3G,GAC9C8B,GAAOf,KAAK6F,EAAa,IAAME,GAGnC,MAAO,IAAMhF,EAAOiF,KAAK,KAEzB,MAAOJ,GAAU,KAIjBK,EAAQ,SAAS7C,EAAG8C,GACtB/H,KAAK8E,IAAMiD,EAAKjD,KAAOG,EAAE/D,MAAMK,IAG7BvB,KAAK8E,KADHiD,EAAKC,KACKD,EAAKC,KAAO,IACfD,EAAKE,QACFF,EAAKE,QAAU,IAEfF,EAAKG,MAAQ,KAGvBH,EAAKN,UACPzH,KAAK8E,KAAO0C,EAAWO,EAAKN,WAGzBM,EAAKjD,KAAOiD,EAAKN,UAChBM,EAAKG,QACPlI,KAAKiI,QAAU,SAASC,EAAOT,GAC7B,MAAO,IAAIK,GAAM7C,GACfH,IAAK9E,KAAK8E,IACVqD,SAAUJ,EAAKG,MACfD,QAASC,EACTT,QAASA,MAKfzH,KAAKoI,SAAW,SAASJ,EAAMP,GAC7B,MAAO,IAAIK,GAAM7C,GACfH,IAAK9E,KAAK8E,IACVkD,KAAMA,EACNP,QAASA,MAKfzH,KAAKqB,IAAM,WACT,GAAI6G,GAAQ,IAOZ,OANIH,GAAKE,QACPC,EAAQH,EAAKI,SAAW,IAAMJ,EAAKE,QAC1BF,EAAKG,QACdA,EAAQH,EAAKG,OAGRjD,EAAEe,KAAK3E,IAAIrB,KAAK8E,KAAKuD,KAAK,SAASnC,GACxC,MAAIgC,GACEhC,EAAKoC,SACPpC,EAAKoC,QAAQC,IAAI,SAAS7H,GACxB,MAAOuE,GAAEuD,OAAFvD,OAAaiD,EAAOxH,KAEtBwF,GAEAjB,EAAEuD,OAAFvD,OAAaiD,EAAOhC,GAGtBA,KAKblG,KAAKqH,KAAO,SAASnB,GACnB,MAAOjB,GAAEe,KAAKqB,KAAKrH,KAAK8E,IAAKoB,IAG/BlG,KAAKsH,MAAQ,SAASpB,GACpB,MAAOjB,GAAEe,KAAKsB,MAAMtH,KAAK8E,IAAKoB,IAGhClG,KAAKuH,IAAM,SAASrB,GAClB,MAAOjB,GAAEe,KAAKuB,IAAIvH,KAAK8E,IAAKoB,IAG9BlG,KAAAA,UAAc,WACZ,MAAOiF,GAAEe,KAAFf,UAAcjF,KAAK8E,MAI5B9E,KAAKqI,KAAO,SAAS1B,EAASO,GAC5B,MAAOlH,MAAKqB,MAAMgH,KAAK1B,EAASO,KAIhCuB,EAAM,SAASxD,GACjBjF,KAAKkI,MAAQ,SAASA,EAAOT,GAC3B,MAAO,IAAIK,GAAM7C,GACfiD,MAAOA,EACPT,QAASA,KAIbzH,KAAKoI,SAAW,SAASJ,EAAMP,GAC7B,MAAO,IAAIK,GAAM7C,GACf+C,KAAMA,EACNP,QAASA,KAKf7H,GAAO+B,WAAW,MAAO,SAASsD,GAChC,MAAO,IAAIwD,GAAIxD,MAEjBrF,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAO+B,WAAW,oBAAqB,SAASsD,GAE9CA,EAAEF,UAAY,WAEZ,IAAK,GADD2D,MACKhG,EAAI,EAAGA,EAAIiG,UAAUhG,OAAQD,GAAK,EACzCgG,EAAe7G,KAAK8G,UAAUjG,GAIhC,OADAgG,GAAe7G,KAAKoD,GACbC,EAAEH,UAAU6D,MAAMhI,OAAW8H,OAGxC9I,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAO+B,WAAW,OAAQ,SAASsD,GACjCA,EAAE4D,SAAWjJ,EAAOyB,IAAI4D,EAAE/E,QAAS,kBAErCN,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAO+B,WAAW,gBAChBhB,QAAS,SAASsE,GACZA,EAAE/D,MAAME,SACV8D,EAAE4D,MAAMxD,SAASyD,eAAe9D,EAAE/D,MAAME,SAChC6D,EAAEF,UAAUnF,EAAOoJ,eAI/B/H,QAAS,SAASgE,GACZA,EAAE/D,MAAME,SACV8D,EAAE4D,MAAMxD,SAASyD,eAAe9D,EAAE/D,MAAME,SAAU,SAGpDW,OAAQ,mBACZnC,OAAO8B,WAER,SAAU9B,GACT,YAEA,IAAIqJ,GAAS,WACXjJ,KAAKkJ,WACLlJ,KAAKmJ,iBACLnJ,KAAKoJ,aAELpJ,KAAKyC,IAAM,SAASb,EAAMyH,GASxB,GARIA,EAAAA,WACFrJ,KAAKkJ,QAAQtH,GAAQyH,EAAAA,UAGnBA,EAAOC,cACTtJ,KAAKmJ,cAAcvH,GAAQyH,EAAOC,aAGhCD,EAAOD,UACT,IAAK,GAAItI,KAAOuI,GAAOD,UACjBC,EAAOD,UAAUlH,eAAepB,KAClCd,KAAKoJ,UAAUxH,EAAO,IAAMd,GAAOuI,EAAOD,UAAUtI,KAM5Dd,KAAAA,OAAW,SAAS4B,EAAMsE,GACxB,MAAIlG,MAAKkJ,QAAQtH,GACR,GAAI5B,MAAKkJ,QAAQtH,GAAMsE,GAEvBA,GAIXlG,KAAKsJ,YAAc,SAAS1H,EAAM2H,GAKhC,MAJIvJ,MAAKoJ,UAAUxH,KACjBA,EAAO5B,KAAKoJ,UAAUxH,IAGpB5B,KAAKmJ,cAAcvH,GACd5B,KAAAA,OAAS4B,EAAM5B,KAAKmJ,cAAcvH,GAAM2H,EAAMvJ,OAE9CA,KAAAA,OAAS4B,EAAM2H,IAK5B3J,GAAO+B,WAAW,SAAU,WAC1B,MAAO,IAAIsH,MAEbrJ,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAO+B,WAAW,sBAAuB,WACvCkC,OAAO2F,OAAOrC,EAAE,QAAQsC,KAAK,YAE/B7J,OAAO8B,WAER,SAAU9B,GACT,YAEA,IAAI8J,GAAO,YAEX9J,GAAO+J,MAAQ,SAAS5E,GAMtBA,EAAU6E,UAAW,CAGrB,IAAIC,GAAe9E,EAAU+E,YAAcJ,CAiB3C,IAhBA3E,EAAU+E,WAAa,WACrB/E,EAAU6E,UAAW,CAErB,IAAIE,GAAaD,EAAajB,MAAM7D,EAAW4D,eAG3CoB,EAAaD,EAAWE,UAAYN,CAMxC,OALAI,GAAWE,SAAW,WACpBD,EAAWnB,MAAM7D,EAAW4D,WAC5B5D,EAAU6E,UAAW,GAGhBE,GAIL/E,EAAUkF,IAAMlF,EAAUkF,GAAG9I,KAAM,CAErC,GAAI+I,GAASnF,EAAUkF,GAAG9I,IAC1B4D,GAAUkF,GAAG9I,KAAO,WAClB,GAAIgJ,GAAWxB,UACXvC,EAAU8D,EAAOtB,MAAM7D,EAAUkF,GAAIE,EAErC/D,IACFA,EAAQiC,KAAK,WACX,GAAItD,EAAU6E,UAAY7E,EAAUkF,GAAGG,OAAQ,CAE7C,IAAK,GADDC,MACK3H,EAAI,EAAGA,EAAIiG,UAAUhG,OAAQD,IACpC2H,EAAUxI,KAAK8G,UAAUjG,GAE3B,KAAK,GAAI4H,GAAI,EAAGA,EAAIH,EAASxH,OAAQ2H,IACnCD,EAAUxI,KAAKsI,EAASG,GAG1BvF,GAAUkF,GAAGG,OAAOxB,MAAM7D,EAAUkF,GAAII,KAEzC,SAASzD,GACN7B,EAAU6E,UACZ7E,EAAUwF,UAAUC,OAAOC,UAAU7D,MAOxC7B,EAAU2F,UACb3F,EAAU2F,QAAU,WAClB,GAAIzF,GAAIjF,KAAKuK,SACb,OAAOrF,GAAE,qBACPD,EAAEF,UAAUnF,EAAOuF,UAKzB,IAAIwF,GAAS5F,EAAU6F,IACvB7F,GAAU6F,KAAO,WACf,MAAI7F,GAAUkF,GAAGY,QACRF,EAAO/B,MAAM7D,EAAW4D,WAExB5D,EAAU2F,QAAQ9B,MAAM7D,EAAW4D,YAKhD,MAAO5D,KAETnF,OAAO8B,WAER,SAAU9B,GACT,YAEA,IAAIkL,GAAS,SAAS7F,GACpB,GAAIhF,GAAOD,IACXA,MAAK+K,QAAU5D,EAAE,QAAQsC,KAAK,OAE9B,IAAIuB,GAAYpL,EAAOyB,IAAI4D,EAAE/E,QAAS,aAAc,KAChD+K,EAAWrL,EAAOyB,IAAI4D,EAAE/E,QAAS,YAAa,IAGlDF,MAAKkL,QACLlL,KAAKmL,WAEL,IAAIC,GAAkB,SAASrG,GAE7B,MADAA,GAAUwF,UAAYtF,EACfF,GAGLsG,EAAmB,SAASC,GAC9BA,EAAQ9G,WAAW/D,QAAQ,SAASqE,GAGlC,GAAIyG,GAAetL,EAAK8K,QAAUjG,EAAIH,OACtC4G,GAAeA,EAAa3G,QAAQ,KAAM,KAE1C3E,EAAKiL,KAAKK,GAAgBH,EAAgBtG,EAAIC,WAC9C9E,EAAKkL,SAASrG,EAAIlD,MAAQ2J,IAI9BvL,MAAKwL,aAAe,SAASF,EAASlK,GACpCiK,EAAiBC,GACjBtL,KAAKoB,QAAUA,EAGb8D,EAAEyE,MAAM8B,KADNxG,EAAE/D,MAAMI,KACK,SAEA,WAEjB4D,EAAEyE,MAAMvI,EAAS,IAAKpB,KAAKkL,OAG7BlL,KAAK8E,IAAM,SAASlD,GAClB,MAAO5B,MAAKmL,SAASvJ,IAIvB5B,KAAK0L,gBAAkB,KACvB1L,KAAK2L,aAAe,sBAEpB3L,KAAK4L,SAAW,SAAS9G,GACvB,GAAKA,EAAL,CAGA,GAAI+G,GAAkC,MAArB/G,EAAIgH,OAAO,EAAG,IAAmC,OAArBhH,EAAIgH,OAAO,EAAG,EAG3D,KAAKD,EAAY,CACf,GAAIE,GAAWpM,OAAOoM,QAItB,IAAyB,OAArBjH,EAAIgH,OAAO,EAAG,GAAa,CAC7B,GAAIE,GAAWlH,EAAIgH,OAAO,EAAGC,EAASC,SAASrJ,OAAS,EACxD,IAAIqJ,IAAaD,EAASC,SAAW,KAAQ,MAC7ClH,GAAMA,EAAIgH,OAAOC,EAASC,SAASrJ,OAAS,OAE5CmC,GAAMA,EAAIgH,OAAO,EAInB,IAAIhH,EAAIgH,OAAO,EAAGC,EAASE,KAAKtJ,UAAYoJ,EAASE,KAAQ,MAC7DnH,GAAMA,EAAIgH,OAAOC,EAASE,KAAKtJ,QAIjC,GAAImC,EAAIgH,OAAO,EAAG9L,KAAK+K,QAAQpI,UAAY3C,KAAK+K,SAG5CjG,EAAIgH,OAAO,EAAGd,EAAUrI,UAAYqI,GAEpClG,EAAIgH,OAAO,EAAGb,EAAStI,UAAYsI,EAAvC,CAEA,GAAIiB,GAAa,eACjB,IAAIpH,EAAIgH,OAAO,EAAGI,EAAWvJ,UAAYuJ,EAEzC,MAAOpH,MAGT9E,KAAKmM,eAAiB,SAASC,GAC7BpM,KAAK0L,gBAAkBU,EACvBjF,EAAEnH,KAAK0L,iBAAiBW,GAAGrM,KAAK2L,aAAc,IAAK,SAASW,GAC1D,GAAIV,GAAW3L,EAAK2L,SAASU,EAAEC,OAAOC,KAClCZ,KACEA,GAAY1G,EAAEyE,SAChBzE,EAAEyE,MAAMiC,GAEVU,EAAEG,qBAKRzM,KAAKiB,QAAU,WACbkG,EAAEnH,KAAK0L,iBAAiBgB,IAAI1M,KAAK2L,cAInC,IAAIgB,GAAY,SAASjI,GACvB,MAAO,UAASI,GACd,MAAOJ,GAASI,GAIpB9E,MAAKgL,UAAY2B,EAAU3B,GAC3BhL,KAAKiL,SAAW0B,EAAU1B,GAG1BjL,KAAK4M,SAAW,SAAShG,GACvB,GAAI7B,GAAY,IACZ6B,GAAMiG,KACR9H,EAAYqG,EAAgBxL,EAAOkN,kBACnC/H,EAAU6B,OACRxC,QAASwC,EAAMmG,OACfF,IAAK5H,EAAEuD,OAAOc,YAAY,MAAO1C,EAAMiG,QAGzC9H,EAAYqG,EAAgBxL,EAAOoN,eACnCjI,EAAU6B,MAAQA,EAAMmG,QAG1B7H,EAAE4D,MAAM9I,KAAKoB,QAAS2D,IAGxB/E,KAAKiN,SAAW,WACd/H,EAAE4D,MAAM9I,KAAKoB,QAASgK,EAAgBxL,EAAOsN,iBAG/ClN,KAAKmN,SAAW,WACdjI,EAAE4D,MAAM9I,KAAKoB,QAASgK,EAAgBxL,EAAOwN,iBAG/CpN,KAAKqN,OAAS,WACZnI,EAAE4D,MAAM9I,KAAKoB,QAASgK,EAAgBxL,EAAO0N,eAG/CtN,KAAKyK,UAAY,SAAS7D,GACH,IAAjBA,EAAMI,QACRhH,KAAKqN,SAGc,MAAjBzG,EAAMI,QACRhH,KAAKmN,WAGc,MAAjBvG,EAAMI,QACRhH,KAAKiN,WAGc,MAAjBrG,EAAMI,QACRhH,KAAK4M,SAAShG,IAKpBhH,GAAO+B,WAAW,SAAU,SAASsD,GACnC,MAAO,IAAI6F,GAAO7F,KAGpBrF,EAAO+B,WAAW,gBAAiB,SAASsD,GAC1CA,EAAEuF,OAAOgB,aACP5L,EAAOsL,KAAM5F,SAASyD,eAAe,mBACvC9D,EAAEuF,OAAO2B,eAAe7G,SAASyD,eAAe9D,EAAE/D,MAAME,YACtDW,OAAQ,UACZnC,OAAO8B,WAER,SAAU9B,GACT,YAEA,IAAI2N,GAAU,SAAStI,GACrB,GAAIhF,GAAOD,IAEXA,MAAKwN,aAEL,IAAIC,GAAe,SAAS7L,GACtB3B,EAAKuN,WAAW5L,KAClBjC,OAAO+N,aAAazN,EAAKuN,WAAW5L,IACpC3B,EAAKuN,WAAW5L,GAAQ,MAI5B5B,MAAK2N,IAAM,SAASC,EAAUhM,EAAMiM,GAClC7N,KAAKwN,WAAW5L,GAAQjC,OAAOmO,WAAW,WACxCL,EAAa7L,EACb,IAAImM,GAASH,EAAS3I,EAClB8I,MAAW,GACb9N,EAAK0N,IAAIC,EAAUhM,EAAMiM,IAE1BA,IAGL7N,KAAKgO,QAAU,SAASJ,EAAUhM,EAAMiM,GACtC7N,KAAKwN,WAAW5L,GAAQjC,OAAOmO,WAAW,WACxCL,EAAa7L,GACbgM,EAAS3I,IACR4I,IAGL7N,KAAKiO,KAAO,SAASrM,GACnB,IAAK,GAAIsM,KAAQlO,MAAKwN,WACf5L,GAAQA,IAASsM,GACpBT,EAAaS,IAMrBtO,GAAO+B,WAAW,WAChBhB,QAAS,SAASsE,GAChB,MAAO,IAAIsI,GAAQtI,IAGrBhE,QAAS,SAASgE,GAChBA,EAAEkJ,QAAQF,WAGdrO,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAO+B,WAAW,aAAc,SAASsD,GACvC,GAAImJ,GAAQlJ,EAAEmJ,MAEdpJ,GAAEkJ,QAAQR,IAAI,WACZzI,EAAEoJ,mBAEFF,EAAMA,IAAU,GAEhBlJ,EAAEqJ,kBACD,OAAQ,QAEb3O,OAAO8B,WAER,SAAU9B,GACT,YAEA,IAAI4O,GAAY,SAASC,GACvBzO,KAAK0O,IAAM,SAASC,GACdA,EACF3O,KAAK4O,aAAaD,GAElBrJ,SAASqJ,MAAQF,GAIrBzO,KAAK4O,aAAe,SAASD,GACN,gBAAVA,KACTA,GAASA,MAAOA,GAGlB,IAAIE,GAAgBF,EAAMA,KAE1B,IAA0B,mBAAfA,GAAMG,MAAwBH,EAAMG,KAAO,EAAG,CACvD,GAAIC,GAAaC,YACfC,QAAQ,kBAAoBH,KAAKH,EAAMG,OAAQ,EACjDD,IAAiB,KAAOE,EAAa,IAGX,mBAAjBJ,GAAMO,SACfL,GAAiB,MAAQF,EAAMO,QAGjC5J,SAASqJ,MAAQE,EAAgB,MAAQJ,GAI7C7O,GAAO+B,WAAW,aAAc,SAASsD,GACvCA,EAAE0J,MAAQ,GAAIH,GAAUvJ,EAAE4D,SAAS4F,eAErC7O,OAAO8B,WAER,SAAU9B,GACT,YAEA,IAAIuP,GAAM,SAASjJ,GACjBlG,KAAKoE,SACHgL,KAAMlJ,EAAK9B,QAAQgL,KACnBC,MAAOnJ,EAAK9B,QAAQiL,OAGtBrP,KAAKsP,WAAapJ,EAAKoJ,YAGrBC,EAAiB,SAASrJ,GAG5B,MAFAA,GAAKoJ,WAAa1P,EAAO+D,oBAAoBuC,EAAKoJ,YAE3CpJ,EAGTtG,GAAO+B,WAAW,YAAa,SAASsD,GACtCA,EAAEuD,OAAO/F,IAAI,OACX+M,QAAOL,EACP7F,YAAaiG,MAEbzN,MAAO,YACVlC,OAAO8B,WAET,SAAU9B,GACT,YAEA,IAAI6P,GAAY,SAASvJ,GACvBlG,KAAK2O,MAAQzI,EAAKyI,MAClB3O,KAAK0P,KAAOxJ,EAAKwJ,KACjB1P,KAAK2P,KAAOzJ,EAAKyJ,KAGnB/P,GAAO+B,WAAW,mBAAoB,SAASsD,GAC7CA,EAAEuD,OAAO/F,IAAI,cACX+M,QAAOC,MAEP3N,MAAO,YACVlC,OAAO8B,WAET,SAAU9B,GACT,YAEA,IAAI6K,GAAY,SAAS7D,GACvB,GAAIgJ,IACF1K,EAAE,SAAU0B,EAAMxC,SAOpB,OAJIwC,GAAMiJ,MACRD,EAAc/N,KAAKqD,EAAE,SAAU0B,EAAMiJ,OAGhC3K,EAAE,0BAA4B0B,EAAMkJ,KAAO,QAChD5K,EAAE,aACAA,EAAE,gBACAA,EAAE,cACAA,EAAE,qBAAsB0B,EAAMmJ,OAEhC7K,EAAE,iBAAkB0K,OAM5BhQ,GAAOkN,iBAAmBlN,EAAO+J,OAC/BG,WAAY,WACV9J,KAAKuK,UAAUoE,MAAMD,IAAIO,QAAQ,oBAEnCrI,MAAO,KACPgE,KAAM,WACJ,GAAIgF,KAEFA,GAAc/N,KADZ7B,KAAK4G,MAAMiG,IAAIzI,QAAQgL,KACNlK,EAAE,QAASA,EAAE8K,MAAMhQ,KAAK4G,MAAMiG,IAAIzI,QAAQgL,OAE1ClK,EAAE,SAAUlF,KAAK4G,MAAMxC,SAG5C,IAAI6L,GAAoB,IAexB,OAZIA,GAFAjQ,KAAK4G,MAAMiG,IAAIyC,WACbtP,KAAK4G,MAAMiG,IAAIyC,WAAWY,QAAQrM,UAChBmL,YAClBC,QAAQ,qCACNK,WAActP,KAAK4G,MAAMiG,IAAIyC,WAAWa,YAC1C,GAEkBlB,QAAQ,yBAGVA,QAAQ,0BAE9BW,EAAc/N,KAAKqD,EAAE,IAAK+K,IAEnB/K,EAAE,qCACPA,EAAE,aACAA,EAAE,gBACAA,EAAE,cACAA,EAAE,qBAAsB,kBAE1BA,EAAE,iBAAkB0K,UAO9BhQ,EAAOoN,cAAgBpN,EAAO+J,OAC5BG,WAAY,WACV9J,KAAKuK,UAAUoE,MAAMD,IAAIO,QAAQ,wBAEnCrI,MAAO,KACPgE,KAAM,WAKJ,MAJmB,sBAAf5K,KAAK4G,QACP5G,KAAK4G,MAAQqI,QAAQ,mDAGhBxE,GACLqF,KAAM,IACNC,KAAM,wBACN3L,QAAS6K,QAAQ,+BACjBY,KAAM7P,KAAK4G,WAKjBhH,EAAOsN,cAAgBtN,EAAO+J,OAC5BG,WAAY,WACV9J,KAAKuK,UAAUoE,MAAMD,IAAIO,QAAQ,oBAEnCrE,KAAM,WACJ,MAAOH,IACLqF,KAAM,IACNC,KAAM,eACN3L,QAAS6K,QAAQ,sCACjBY,KAAMZ,QAAQ,mFAKpBrP,EAAOwN,cAAgBxN,EAAO+J,OAC5BG,WAAY,WACV9J,KAAKuK,UAAUoE,MAAMD,IAAIO,QAAQ,+BAEnCrE,KAAM,WACJ,MAAOH,IACLqF,KAAM,IACNC,KAAM,gBACN3L,QAAS6K,QAAQ,0DACjBY,KAAMZ,QAAQ,wEAKpBrP,EAAO0N,YAAc1N,EAAO+J,OAC1BG,WAAY,WACV9J,KAAKuK,UAAUoE,MAAMD,IAAIO,QAAQ,sCAEnCrE,KAAM,WACJ,MAAOH,IACLqF,KAAM,EACNC,KAAM,eACN3L,QAAS6K,QAAQ,qCACjBY,KAAMZ,QAAQ,gKAIpBrP,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAOwQ,WAAaxQ,EAAO+J,OACzBG,WAAY,WACV,GAAI7E,GAAIjF,KAAKuK,SACbjF,UAASqJ,MAAQ1J,EAAE4D,SAASwH,mBAAqBpL,EAAE4D,SAAS4F,UAE5D,IAAI6B,GAAQpL,EAAEmJ,KAAK,EAEnB,QACEiC,MAAOA,EACPC,UAAW,WACTC,QAAQC,IAAI,eACZH,EAAMA,IAAU,MAItB1F,KAAM,SAAS8F,GACb,MAAOxL,GAAE,cACPA,EAAE,MACA,UAAWA,EAAE,SAAUwL,EAAKJ,WAE9BpL,EAAE,IAAK,2CACPA,EAAE,IACAA,EAAE,0BAA2ByL,QAASD,EAAKH,WACzC,yBAMV3Q,OAAO8B,WAER,SAAU9B,GACT,YAEA,IAAIgR,GAAmB,SAASC,EAAUC,GACxC,GAAIC,GAAiBF,EAASjM,QAAQ,KAAM,IAE5C,OAAOhF,GAAO+J,OACZG,WAAY,WACV,GAAI7E,GAAIjF,KAAKuK,SAET3K,GAAOyB,IAAI4D,EAAE4D,SAAUgI,EAAW,SACpClR,OAAOoM,SAAWnM,EAAOyB,IAAI4D,EAAE4D,SAAUgI,EAAW,SAEpD7Q,KAAKiK,GAAG9I,KAAKnB,KAAMiF,IAGvBgF,IACE6E,KAAM,KACNjE,SAAS,EACT1J,KAAM,SAAS4D,EAAWE,GACxB,MAAIjF,MAAK6K,YACP5F,GAAE0J,MAAMD,IAAI1O,KAAK2O,QAEjB1J,EAAE0J,MAAMD,MACDzJ,EAAE1D,IAAI2G,MAAM,aAAc6I,KAGrC3G,OAAQ,SAAS0E,EAAM/J,EAAWE,GAChCC,EAAEoJ,mBAEEQ,EAAKa,KACPhQ,OAAOoM,SAAW+C,EAAKa,MAEvBb,EAAKH,MAAQG,EAAKH,OAASmC,EAC3B9Q,KAAK8O,KAAOA,EACZ9O,KAAK6K,SAAU,EAEf3F,EAAEqJ,iBAEExJ,EAAU6E,UACZ3E,EAAE0J,MAAMD,IAAI1O,KAAK8O,KAAKH,UAK9B/D,KAAM,WACJ,GAAI3F,GAAIjF,KAAKuK,SAEb,OAAOrF,GAAE,oBAAsB6L,EAAiB,SAC9C9L,EAAEF,UAAUnF,EAAOoR,YAAarC,MAAO3O,KAAKiK,GAAG6E,KAAKH,QACpDzJ,EAAE,aACAD,EAAEF,UAAUnF,EAAOqR,OAAQjR,KAAKiK,GAAG6E,KAAKY,YAOlD9P,GAAOsR,oBAAsBN,EAC3B,mBAAoB3B,QAAQ,qBAC9BrP,EAAOuR,mBAAqBP,EAC1B,iBAAkB3B,QAAQ,oBAC5BrP,OAAO8B,WAER,SAAU9B,GACT,YAEA,IAAIwR,GAAY,SAASnM,EAAGoM,EAAWP,GACrC,GAAIhM,GAAMlF,EAAOyB,IAAI4D,EAAE4D,SAAUwI,EAAY,QAK7C,QAJKvM,GAAOlF,EAAOyB,IAAI4D,EAAE4D,SAAUwI,KACjCvM,EAAMG,EAAEuF,OAAO1F,IAAIuM,IAGjBvM,EACKI,EAAE,KACPA,EAAE,KAAMsH,KAAM1H,GACZlF,EAAOyB,IAAI4D,EAAE4D,SAAUwI,EAAY,SAAUP,KAI1C,KAIXlR,GAAO0R,WACLC,UAAW,SAAS1I,GAClB,MAMoB,QALhBA,EAAS2I,iBACT3I,EAAS4I,mBACT5I,EAAS6I,wBACT7I,EAAS8I,iBACT9I,EAAS+I,qBACXzO,SAAQ,IAEZyH,KAAM,SAAS8F,EAAMzL,GACnB,GAAI3C,KAWJ,OATI2C,GAAE4D,SAAS2I,gBACblP,EAAMT,KAAKqD,EAAE,oBAAqBA,EAAE8K,MAAM/K,EAAE4D,SAAS2I,kBAGvDlP,EAAMT,KACJuP,EAAUnM,EAAG,mBAAoBgK,QAAQ,sBAC3C3M,EAAMT,KACJuP,EAAUnM,EAAG,iBAAkBgK,QAAQ,oBAElC/J,EAAE,4BAA6B5C,MAG1C1C,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAOiS,aACLjH,KAAM,SAAS8F,EAAMzL,GACnB,GAAI6M,GAAM,IAKV,OAJIlS,GAAO0R,UAAUC,UAAUtM,EAAE4D,YAC/BiJ,EAAM7M,EAAEF,UAAUnF,EAAO0R,YAGpBpM,EAAE,uBACPA,EAAE,aACAA,EAAE,mBACA4M,EACA7M,EAAEF,UAAUnF,EAAOmS,8BAM7BnS,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAOmS,sBACLnH,KAAM,WACJ,MAAO1F,GAAE,qDACP,cAAeA,EAAE,SAAU,eAIjCtF,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAOoS,WACLpH,KAAM,SAAS8F,EAAMuB,EAAUhN,GAC7B,GAAIiN,IACFhN,EAAE,OACAiN,IAAKlN,EAAEuF,OAAOQ,UAAU,4BACxBoH,IAAKnN,EAAE4D,SAAS4F,aAQpB,OAJIwD,IACFC,EAASrQ,KAAKoQ,GAGT/M,EAAE,kBAAmBsH,KAAMvH,EAAEuF,OAAO1F,IAAI,UAAWoN,MAG9DtS,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAOyS,aACLzH,KAAM,SAAS8F,EAAMzL,GACnB,GAAIqN,KAEArN,GAAE4D,SAAS0J,wBACbD,EAAczQ,KACZoD,EAAEF,UAAUnF,EAAOoS,UAAW/M,EAAE4D,SAAS2J,sBAG7CF,EAAczQ,KAAKqD,EAAE,qBACnBA,EAAE,KACAA,EAAE,KAAMuN,OAAQvN,EAAEyE,MAAO6C,KAAMvH,EAAEuF,OAAO1F,IAAI,UAAW,YAI3D,IAAI4N,GAAc,0CAElB,OAAOxN,GAAE,MAAQwN,EAAc,uBAC7BxN,EAAE,6CAA8CoN,QAItD1S,OAAO8B,WAER,SAAU9B,GACT,YAEA,IAAI+S,GAAa,SAASC,EAAIC,EAAQ3S,GACpCA,EAAQ4S,QAAS,EAGnBlT,GAAOoJ,aACL4B,KAAM,SAAS8F,EAAMzL,GACnB,OACEA,EAAEF,UAAUnF,EAAOyS,aACnBnN,EAAE,mBAAoBuN,OAAQE,IAC9B1N,EAAEF,UAAUnF,EAAOiS,iBAIzBjS,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAOuF,QACLyF,KAAM,WACJ,MAAO1F,GAAE,2BACPA,EAAE,qBACFA,EAAE,qBACFA,EAAE,qBACFA,EAAE,yBAKRtF,EAAOmT,aACLnI,KAAM,SAAS8F,EAAMzL,GACnB,MAAOC,GAAE,qBACPD,EAAEF,UAAUnF,EAAOuF,YAIxBvF,OAAO8B,WAET,SAAU9B,GACT,YAEA,IAAIoT,GAAc,SAASJ,EAAIC,EAAQ3S,GACrCA,EAAQ4S,QAAS,EAGnBlT,GAAOqR,QACLrG,KAAM,SAAS8F,EAAMuC,GACnB,MAAO/N,GAAE,yBAA0BuN,OAAQO,GACzC9N,EAAE8K,MAAMiD,OAIdrT,OAAO8B,WAER,SAAU9B,GACT,YAEAA,GAAOoR,YACLpG,KAAM,SAAS8F,EAAMwC,GACnB,MAAOhO,GAAE,eACPA,EAAE,cACAA,EAAE,KAAMgO,EAAQvE,aAKxB/O,OAAO8B,WAER,SAAU9B,EAAQ0E,GACjB,YAEA,IAAI4G,GAAO,GAAI5G,EACf4G,GAAKpG,IAAI,IAAKlF,EAAOwQ,WAAY,SAGjClF,EAAKpG,IACH,qBACAlF,EAAOsR,oBACP,oBAEFhG,EAAKpG,IACH,mBACAlF,EAAOuR,mBACP,kBAGFjG,EAAKpG,IAAI,YAAalF,EAAOsN,cAAe,aAE5CtN,EAAOsL,KAAOA,GACbtL,OAAO8B,UAAW9B,OAAO8B,UAAU4C","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n 'use strict';\n\n window.Misago = function() {\n var ns = Object.getPrototypeOf(this);\n var self = this;\n\n // Context data\n this.context = {\n // Empty settings\n SETTINGS: {}\n };\n\n // Services init/destroy\n this._initServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order(false);\n orderedServices.forEach(function (item) {\n var factory = null;\n if (item.item.factory !== undefined) {\n factory = item.item.factory;\n } else {\n factory = item.item;\n }\n\n var serviceInstance = factory(self);\n if (serviceInstance) {\n self[item.key] = serviceInstance;\n }\n });\n };\n\n this._destroyServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order();\n orderedServices.reverse();\n orderedServices.forEach(function (item) {\n if (item.destroy !== undefined) {\n item.destroy(self);\n }\n });\n };\n\n // App init/destory\n this.setup = false;\n this.init = function(setup) {\n this.setup = {\n fixture: ns.get(setup, 'fixture', null),\n test: ns.get(setup, 'test', false),\n api: ns.get(setup, 'api', '/api/')\n };\n\n this._initServices(ns._services);\n };\n\n this.destroy = function() {\n this._destroyServices(ns._services);\n };\n };\n\n\n // Services registry\n var proto = window.Misago.prototype;\n proto._services = [];\n\n proto.addService = function(name, factory, order) {\n proto._services.push({\n key: name,\n item: factory,\n after: proto.get(order, 'after'),\n before: proto.get(order, 'before')\n });\n };\n}());\n\n(function (Misago) {\n 'use strict';\n\n Misago.has = function(obj, key) {\n if (obj) {\n return obj.hasOwnProperty(key);\n } else {\n return false;\n }\n };\n\n Misago.get = function(obj, key, value) {\n if (Misago.has(obj, key)) {\n return obj[key];\n } else if (value !== undefined) {\n return value;\n } else {\n return undefined;\n }\n };\n\n Misago.pop = function(obj, key, value) {\n var returnValue = Misago.get(obj, key, value);\n if (Misago.has(obj, key)) {\n obj[key] = null;\n }\n return returnValue;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.OrderedList = function(items) {\n this.isOrdered = false;\n this._items = items || [];\n\n this.add = function(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n after: Misago.get(order, 'after'),\n before: Misago.get(order, 'before')\n });\n };\n\n this.get = function(key, value) {\n for (var i = 0; i < this._items.length; i++) {\n if (this._items[i].key === key) {\n return this._items[i].item;\n }\n }\n\n return value;\n };\n\n this.has = function(key) {\n return this.get(key) !== undefined;\n };\n\n this.values = function() {\n var values = [];\n for (var i = 0; i < this._items.length; i++) {\n values.push(this._items[i].item);\n }\n return values;\n };\n\n this.order = function(values_only) {\n if (!this.isOrdered) {\n this._items = this._order(this._items);\n this.isOrdered = true;\n }\n\n if (values_only || typeof values_only === 'undefined') {\n return this.values();\n } else {\n return this._items;\n }\n };\n\n this._order = function(unordered) {\n // Index of unordered items\n var index = [];\n unordered.forEach(function (item) {\n index.push(item.key);\n });\n\n // Ordered items\n var ordered = [];\n var ordering = [];\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Second pass: register items that\n // specify their before to \"_end\"\n unordered.forEach(function (item) {\n if (item.before === \"_end\") {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Third pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1;\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after);\n if (insertAt !== -1) {\n insertAt += 1;\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before);\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item);\n ordering.splice(insertAt, 0, item.key);\n }\n }\n }\n\n var iterations = 200;\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1;\n unordered.forEach(insertItem);\n }\n\n return ordered;\n };\n };\n} (Misago.prototype));\n\n(function (Misago) {\n Misago.serializeDatetime = function(serialized) {\n return serialized ? serialized.format() : null;\n };\n\n Misago.deserializeDatetime = function(deserialized) {\n return deserialized ? moment(deserialized) : null;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.startsWith = function(string, beginning) {\n return string.indexOf(beginning) === 0;\n };\n\n Misago.endsWith = function(string, tail) {\n return string.indexOf(tail, string.length - tail.length) !== -1;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.UrlConfInvalidComponentError = function(name) {\n this.message = \"route's \" + name + \" component \" +\n \"should be an array or object\";\n\n this.toString = function() {\n return this.message;\n };\n };\n\n Misago.UrlConf = function() {\n var self = this;\n this._patterns = [];\n\n this.patterns = function() {\n return this._patterns;\n };\n\n var prefixPattern = function(prefix, pattern) {\n return (prefix + pattern).replace('//', '/');\n };\n\n var include = function(prefix, patterns) {\n for (var i = 0; i < patterns.length; i ++) {\n self.url(prefixPattern(prefix, patterns[i].pattern),\n patterns[i].component,\n patterns[i].name);\n }\n };\n\n this.url = function(pattern, component, name) {\n if (typeof component !== 'object') {\n throw new Misago.UrlConfInvalidComponentError(name);\n }\n\n if (pattern === '') {\n pattern = '/';\n }\n\n if (component instanceof Misago.UrlConf) {\n include(pattern, component.patterns());\n } else {\n this._patterns.push({\n pattern: pattern,\n component: component,\n name: name\n });\n }\n };\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.loadingPage = function(_) {\n return m('.page.page-loading',\n _.component(Misago.Loader)\n );\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var getCsrfToken = function(cookie_name) {\n if (document.cookie.indexOf(cookie_name) !== -1) {\n var cookieRegex = new RegExp(cookie_name + '\\=([^;]*)');\n var cookie = Misago.get(document.cookie.match(cookieRegex), 0);\n return cookie.split('=')[1];\n } else {\n return null;\n }\n };\n\n var Ajax = function(_) {\n this.csrfToken = getCsrfToken(_.context.CSRF_COOKIE_NAME);\n\n /*\n List of GETs underway\n We are limiting number of GETs to API to 1 per url\n */\n var runningGets = {};\n\n this.ajax = function(method, url, data, progress) {\n var promise = m.deferred();\n\n var ajax_settings = {\n url: url,\n method: method,\n headers: {\n 'X-CSRFToken': this.csrfToken\n },\n\n data: data | {},\n dataType: 'json',\n\n success: function(data) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n promise.resolve(data);\n },\n error: function(jqXHR) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n\n var rejection = jqXHR.responseJSON || {};\n\n rejection.status = jqXHR.status;\n rejection.statusText = jqXHR.statusText;\n\n promise.reject(rejection);\n }\n };\n\n if (progress) {\n return; // not implemented... yet!\n }\n\n $.ajax(ajax_settings);\n return promise.promise;\n };\n\n this.get = function(url) {\n var preloaded = Misago.pop(_.context, url);\n if (preloaded) {\n var deferred = m.deferred();\n deferred.resolve(preloaded);\n return deferred.promise;\n } else if (runningGets[url] !== undefined) {\n return runningGets[url];\n } else {\n runningGets[url] = this.ajax('GET', url);\n return runningGets[url];\n }\n };\n\n this.post = function(url, data) {\n return this.ajax('POST', url, data);\n };\n\n this.patch = function(url, data) {\n return this.ajax('PATCH', url, data);\n };\n\n this.put = function(url, data) {\n return this.ajax('PUT', url, data);\n };\n\n this.delete = function(url) {\n return this.ajax('DELETE', url);\n };\n };\n\n Misago.addService('ajax', function(_) {\n return new Ajax(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var filtersUrl = function(filters) {\n if (typeof filters === 'object') {\n var values = [];\n for (var key in filters) {\n if (filters.hasOwnProperty(key)) {\n var encodedKey = encodeURIComponent(key);\n var encodedValue = encodeURIComponent(filters[key]);\n values.push(encodedKey + '=' + encodedValue);\n }\n }\n return '?' + values.join('&');\n } else {\n return filters + '/';\n }\n };\n\n var Query = function(_, call) {\n this.url = call.url || _.setup.api;\n\n if (call.path) {\n this.url += call.path + '/';\n } else if (call.related) {\n this.url += call.related + '/';\n } else {\n this.url += call.model + 's' + '/';\n }\n\n if (call.filters) {\n this.url += filtersUrl(call.filters);\n }\n\n if (!call.url && call.filters) {\n if (call.model) {\n this.related = function(model, filters) {\n return new Query(_, {\n url: this.url,\n relation: call.model,\n related: model,\n filters: filters,\n });\n };\n }\n\n this.endpoint = function(path, filters) {\n return new Query(_, {\n url: this.url,\n path: path,\n filters: filters\n });\n };\n }\n\n this.get = function() {\n var model = null;\n if (call.related) {\n model = call.relation + ':' + call.related;\n } else if (call.model) {\n model = call.model;\n }\n\n return _.ajax.get(this.url).then(function(data) {\n if (model) {\n if (data.results) {\n data.results.map(function(item) {\n return _.models.new(model, item);\n });\n return data;\n } else {\n return _.models.new(model, data);\n }\n } else {\n return data;\n }\n });\n };\n\n this.post = function(data) {\n return _.ajax.post(this.url, data);\n };\n\n this.patch = function(data) {\n return _.ajax.patch(this.url, data);\n };\n\n this.put = function(data) {\n return _.ajax.put(this.url, data);\n };\n\n this.delete = function() {\n return _.ajax.delete(this.url);\n };\n\n // shortcut for get()\n this.then = function(resolve, reject) {\n return this.get().then(resolve, reject);\n };\n };\n\n var Api = function(_) {\n this.model = function(model, filters) {\n return new Query(_, {\n model: model,\n filters: filters,\n });\n };\n\n this.endpoint = function(path, filters) {\n return new Query(_, {\n path: path,\n filters: filters\n });\n };\n };\n\n Misago.addService('api', function(_) {\n return new Api(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('component-factory', function(_) {\n // Component factory\n _.component = function() {\n var argumentsArray = [];\n for (var i = 0; i < arguments.length; i += 1) {\n argumentsArray.push(arguments[i]);\n }\n\n argumentsArray.push(_);\n return m.component.apply(undefined, argumentsArray);\n };\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('conf', function(_) {\n _.settings = Misago.get(_.context, 'SETTINGS', {});\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('forum-layout', {\n factory: function(_) {\n if (_.setup.fixture) {\n m.mount(document.getElementById(_.setup.fixture),\n _.component(Misago.ForumLayout));\n }\n },\n\n destroy: function(_) {\n if (_.setup.fixture) {\n m.mount(document.getElementById(_.setup.fixture), null);\n }\n }\n }, {before: 'start-routing'});\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Models = function() {\n this.classes = {};\n this.deserializers = {};\n this.relations = {};\n\n this.add = function(name, kwargs) {\n if (kwargs.class) {\n this.classes[name] = kwargs.class;\n }\n\n if (kwargs.deserialize) {\n this.deserializers[name] = kwargs.deserialize;\n }\n\n if (kwargs.relations) {\n for (var key in kwargs.relations) {\n if (kwargs.relations.hasOwnProperty(key)) {\n this.relations[name + ':' + key] = kwargs.relations[key];\n }\n }\n }\n };\n\n this.new = function(name, data) {\n if (this.classes[name]) {\n return new this.classes[name](data);\n } else {\n return data;\n }\n };\n\n this.deserialize = function(name, json) {\n if (this.relations[name]) {\n name = this.relations[name];\n }\n\n if (this.deserializers[name]) {\n return this.new(name, this.deserializers[name](json, this));\n } else {\n return this.new(name, json);\n }\n };\n };\n\n Misago.addService('models', function() {\n return new Models();\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('set-momentjs-locale', function() {\n moment.locale($('html').attr('lang'));\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var noop = function() {};\n\n Misago.route = function(component) {\n /*\n Boilerplate for Misago top-level components\n */\n\n // Component state\n component.isActive = true;\n\n // Wrap controller to store lifecycle methods\n var __controller = component.controller || noop;\n component.controller = function() {\n component.isActive = true;\n\n var controller = __controller.apply(component, arguments) || {};\n\n // wrap onunload for lifestate\n var __onunload = controller.onunload || noop;\n controller.onunload = function() {\n __onunload.apply(component, arguments);\n component.isActive = false;\n };\n\n return controller;\n };\n\n // Add state callbacks to View-Model\n if (component.vm && component.vm.init) {\n // wrap vm.init in promise handler\n var __init = component.vm.init;\n component.vm.init = function() {\n var initArgs = arguments;\n var promise = __init.apply(component.vm, initArgs);\n\n if (promise) {\n promise.then(function() {\n if (component.isActive && component.vm.ondata) {\n var finalArgs = [];\n for (var i = 0; i < arguments.length; i++) {\n finalArgs.push(arguments[i]);\n }\n for (var f = 0; f < initArgs.length; f++) {\n finalArgs.push(initArgs[f]);\n }\n\n component.vm.ondata.apply(component.vm, finalArgs);\n }\n }, function(error) {\n if (component.isActive) {\n component.container.router.errorPage(error);\n }\n });\n }\n };\n\n // setup default loading view\n if (!component.loading) {\n component.loading = function () {\n var _ = this.container;\n return m('.page.page-loading',\n _.component(Misago.Loader)\n );\n };\n }\n\n var __view = component.view;\n component.view = function() {\n if (component.vm.isReady) {\n return __view.apply(component, arguments);\n } else {\n return component.loading.apply(component, arguments);\n }\n };\n }\n\n return component;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Router = function(_) {\n var self = this;\n this.baseUrl = $('base').attr('href');\n\n var staticUrl = Misago.get(_.context, 'STATIC_URL', '/');\n var mediaUrl = Misago.get(_.context, 'MEDIA_URL', '/');\n\n // Routing\n this.urls = {};\n this.reverses = {};\n\n var routedComponent = function(component) {\n component.container = _;\n return component;\n };\n\n var populatePatterns = function(urlconf) {\n urlconf.patterns().forEach(function(url) {\n // set service container on component\n\n var finalPattern = self.baseUrl + url.pattern;\n finalPattern = finalPattern.replace('//', '/');\n\n self.urls[finalPattern] = routedComponent(url.component);\n self.reverses[url.name] = finalPattern;\n });\n };\n\n this.startRouting = function(urlconf, fixture) {\n populatePatterns(urlconf);\n this.fixture = fixture;\n\n if (_.setup.test) {\n m.route.mode = 'search';\n } else {\n m.route.mode = 'pathname';\n }\n m.route(fixture, '/', this.urls);\n };\n\n this.url = function(name) {\n return this.reverses[name];\n };\n\n // Delegate clicks\n this.delegateElement = null;\n this.delegateName = 'click.misago-router';\n\n this.cleanUrl = function(url) {\n if (!url) { return; }\n\n // Is link relative?\n var isRelative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';\n\n // If link contains host, validate to see if its outgoing\n if (!isRelative) {\n var location = window.location;\n\n // If protocol matches current one, strip it from string\n // otherwhise stop handler\n if (url.substr(0, 2) !== '//') {\n var protocol = url.substr(0, location.protocol.length + 2);\n if (protocol !== location.protocol + '//') { return; }\n url = url.substr(location.protocol.length + 2);\n } else {\n url = url.substr(2);\n }\n\n // Host checks out?\n if (url.substr(0, location.host.length) !== location.host) { return; }\n url = url.substr(location.host.length);\n }\n\n // Is link within Ember app?\n if (url.substr(0, this.baseUrl.length) !== this.baseUrl) { return; }\n\n // Is link to media/static/avatar server?\n if (url.substr(0, staticUrl.length) === staticUrl) { return; }\n\n if (url.substr(0, mediaUrl.length) === mediaUrl) { return; }\n\n var avatarsUrl = '/user-avatar/';\n if (url.substr(0, avatarsUrl.length) === avatarsUrl) { return; }\n\n return url;\n };\n\n this.delegateClicks = function(element) {\n this.delegateElement = element;\n $(this.delegateElement).on(this.delegateName, 'a', function(e) {\n var cleanUrl = self.cleanUrl(e.target.href);\n if (cleanUrl) {\n if (cleanUrl != m.route()) {\n m.route(cleanUrl);\n }\n e.preventDefault();\n }\n });\n };\n\n this.destroy = function() {\n $(this.delegateElement).off(this.delegateName);\n };\n\n // Media/Static url\n var prefixUrl = function(prefix) {\n return function(url) {\n return prefix + url;\n };\n };\n\n this.staticUrl = prefixUrl(staticUrl);\n this.mediaUrl = prefixUrl(mediaUrl);\n\n // Errors\n this.error403 = function(error) {\n var component = null;\n if (error.ban) {\n component = routedComponent(Misago.ErrorBannedRoute);\n component.error = {\n message: error.detail,\n ban: _.models.deserialize('ban', error.ban)\n };\n } else {\n component = routedComponent(Misago.Error403Route);\n component.error = error.detail;\n }\n\n m.mount(this.fixture, component);\n };\n\n this.error404 = function() {\n m.mount(this.fixture, routedComponent(Misago.Error404Route));\n };\n\n this.error500 = function() {\n m.mount(this.fixture, routedComponent(Misago.Error500Route));\n };\n\n this.error0 = function() {\n m.mount(this.fixture, routedComponent(Misago.Error0Route));\n };\n\n this.errorPage = function(error) {\n if (error.status === 0) {\n this.error0();\n }\n\n if (error.status === 500) {\n this.error500();\n }\n\n if (error.status === 404) {\n this.error404();\n }\n\n if (error.status === 403) {\n this.error403(error);\n }\n };\n };\n\n Misago.addService('router', function(_) {\n return new Router(_);\n });\n\n Misago.addService('start-routing', function(_) {\n _.router.startRouting(\n Misago.urls, document.getElementById('router-fixture'));\n _.router.delegateClicks(document.getElementById(_.setup.fixture));\n }, {before: '_end'});\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var RunLoop = function(_) {\n var self = this;\n\n this._intervals = {};\n\n var stopInterval = function(name) {\n if (self._intervals[name]) {\n window.clearTimeout(self._intervals[name]);\n self._intervals[name] = null;\n }\n };\n\n this.run = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n stopInterval(name);\n var result = callable(_);\n if (result !== false) {\n self.run(callable, name, delay);\n }\n }, delay);\n };\n\n this.runOnce = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n stopInterval(name);\n callable(_);\n }, delay);\n };\n\n this.stop = function(name) {\n for (var loop in this._intervals) {\n if (!name || name === loop) {\n stopInterval(loop);\n }\n }\n };\n };\n\n Misago.addService('runloop', {\n factory: function(_) {\n return new RunLoop(_);\n },\n\n destroy: function(_) {\n _.runloop.stop();\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('start-tick', function(_) {\n var ticks = m.prop();\n\n _.runloop.run(function() {\n m.startComputation();\n // just tick once a minute so stuff gets rerendered\n ticks(ticks() + 1);\n // syncing dynamic timestamps, etc ect\n m.endComputation();\n }, 'tick', 60000);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var PageTitle = function(forum_name) {\n this.set = function(title) {\n if (title) {\n this._set_complex(title);\n } else {\n document.title = forum_name;\n }\n };\n\n this._set_complex = function(title) {\n if (typeof title === 'string') {\n title = {title: title};\n }\n\n var completeTitle = title.title;\n\n if (typeof title.page !== 'undefined' && title.page > 1) {\n var page_label = interpolate(\n gettext('page %(page)s'), { page:title.page }, true);\n completeTitle += ' (' + page_label + ')';\n }\n\n if (typeof title.parent !== 'undefined') {\n completeTitle += ' | ' + title.parent;\n }\n\n document.title = completeTitle + ' | ' + forum_name;\n };\n };\n\n Misago.addService('page-title', function(_) {\n _.title = new PageTitle(_.settings.forum_name);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Ban = function(data) {\n this.message = {\n html: data.message.html,\n plain: data.message.plain,\n };\n\n this.expires_on = data.expires_on;\n };\n\n var deserializeBan = function(data) {\n data.expires_on = Misago.deserializeDatetime(data.expires_on);\n\n return data;\n };\n\n Misago.addService('ban-model', function(_) {\n _.models.add('ban', {\n class: Ban,\n deserialize: deserializeBan\n });\n }, {after: 'models'});\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var LegalPage = function(data) {\n this.title = data.title;\n this.body = data.body;\n this.link = data.link;\n };\n\n Misago.addService('legal-page-model', function(_) {\n _.models.add('legal-page', {\n class: LegalPage\n });\n }, {after: 'models'});\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var errorPage = function(error) {\n var error_message = [\n m('p.lead', error.message)\n ];\n\n if (error.help) {\n error_message.push(m('p.help', error.help));\n }\n\n return m('.page.error-page.error-' + error.code + '-page',\n m('.container',\n m('.error-panel', [\n m('.error-icon',\n m('span.material-icon', error.icon)\n ),\n m('.error-message', error_message)\n ])\n )\n );\n };\n\n Misago.ErrorBannedRoute = Misago.route({\n controller: function() {\n this.container.title.set(gettext('You are banned'));\n },\n error: null,\n view: function() {\n var error_message = [];\n if (this.error.ban.message.html) {\n error_message.push(m('.lead', m.trust(this.error.ban.message.html)));\n } else {\n error_message.push(m('p.lead', this.error.message));\n }\n\n var expirationMessage = null;\n if (this.error.ban.expires_on) {\n if (this.error.ban.expires_on.isAfter(moment())) {\n expirationMessage = interpolate(\n gettext('This ban expires %(expires_on)s.'),\n { 'expires_on': this.error.ban.expires_on.fromNow() },\n true);\n } else {\n expirationMessage = gettext('This ban has expired.');\n }\n } else {\n expirationMessage = gettext('This ban is permanent.');\n }\n error_message.push(m('p', expirationMessage));\n\n return m('.page.error-page.error-banned-page',\n m('.container',\n m('.error-panel', [\n m('.error-icon',\n m('span.material-icon', 'highlight_off')\n ),\n m('.error-message', error_message)\n ])\n )\n );\n }\n });\n\n Misago.Error403Route = Misago.route({\n controller: function() {\n this.container.title.set(gettext('Page not available'));\n },\n error: null,\n view: function() {\n if (this.error === \"Permission denied\") {\n this.error = gettext(\"You don't have permission to access this page.\");\n }\n\n return errorPage({\n code: 403,\n icon: 'remove_circle_outline',\n message: gettext(\"This page is not available.\"),\n help: this.error\n });\n }\n });\n\n Misago.Error404Route = Misago.route({\n controller: function() {\n this.container.title.set(gettext('Page not found'));\n },\n view: function() {\n return errorPage({\n code: 404,\n icon: 'info_outline',\n message: gettext(\"Requested page could not be found.\"),\n help: gettext(\"The link you followed was incorrect or the page has been moved or deleted.\")\n });\n }\n });\n\n Misago.Error500Route = Misago.route({\n controller: function() {\n this.container.title.set(gettext('Application error occured'));\n },\n view: function() {\n return errorPage({\n code: 500,\n icon: 'error_outline',\n message: gettext(\"Requested page could not be displayed due to an error.\"),\n help: gettext(\"Please try again later or contact site staff if error persists.\")\n });\n }\n });\n\n Misago.Error0Route = Misago.route({\n controller: function() {\n this.container.title.set(gettext('Lost connection with application'));\n },\n view: function() {\n return errorPage({\n code: 0,\n icon: 'sync_problem',\n message: gettext(\"Could not connect to application.\"),\n help: gettext(\"This may be caused by problems with your connection or application server. Please check your internet connection and refresh page if problem persists.\")\n });\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.IndexRoute = Misago.route({\n controller: function() {\n var _ = this.container;\n document.title = _.settings.forum_index_title || _.settings.forum_name;\n\n var count = m.prop(0);\n\n return {\n count: count,\n increment: function() {\n console.log('increment()');\n count(count() + 1);\n }\n };\n },\n view: function(ctrl) {\n return m('.container', [\n m('h1', [\n 'Count: ', m('strong', ctrl.count())\n ]),\n m('p', 'Clicky click button to increase count!.'),\n m('p',\n m('button.btn.btn-primary', {onclick: ctrl.increment},\n 'Clicky clicky!'\n )\n )\n ]);\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalPageFactory = function(typeName, defaultTitle) {\n var dashedTypeName = typeName.replace(/_/g, '-');\n\n return Misago.route({\n controller: function() {\n var _ = this.container;\n\n if (Misago.get(_.settings, typeName + '_link')) {\n window.location = Misago.get(_.settings, typeName + '_link');\n } else {\n this.vm.init(this, _);\n }\n },\n vm: {\n page: null,\n isReady: false,\n init: function(component, _) {\n if (this.isReady) {\n _.title.set(this.title);\n } else {\n _.title.set();\n return _.api.model('legal-page', dashedTypeName);\n }\n },\n ondata: function(page, component, _) {\n m.startComputation();\n\n if (page.link) {\n window.location = page.link;\n } else {\n page.title = page.title || defaultTitle;\n this.page = page;\n this.isReady = true;\n\n m.endComputation();\n\n if (component.isActive) {\n _.title.set(this.page.title);\n }\n }\n }\n },\n view: function() {\n var _ = this.container;\n\n return m('.page.legal-page.' + dashedTypeName + '-page', [\n _.component(Misago.PageHeader, {title: this.vm.page.title}),\n m('.container',\n _.component(Misago.Markup, this.vm.page.body)\n )\n ]);\n }\n });\n };\n\n Misago.TermsOfServiceRoute = legalPageFactory(\n 'terms_of_service', gettext('Terms of service'));\n Misago.PrivacyPolicyRoute = legalPageFactory(\n 'privacy_policy', gettext('Privacy policy'));\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalLink = function(_, legalType, defaultTitle) {\n var url = Misago.get(_.settings, legalType + '_link');\n if (!url && Misago.get(_.settings, legalType)) {\n url = _.router.url(legalType);\n }\n\n if (url) {\n return m('li',\n m('a', {href: url},\n Misago.get(_.settings, legalType + '_title', defaultTitle)\n )\n );\n } else {\n return null;\n }\n };\n\n Misago.FooterNav = {\n isVisible: function(settings) {\n return [\n !!settings.forum_footnote,\n !!settings.terms_of_service,\n !!settings.terms_of_service_link,\n !!settings.privacy_policy,\n !!settings.privacy_policy_link\n ].indexOf(true) !== -1;\n },\n view: function(ctrl, _) {\n var items = [];\n\n if (_.settings.forum_footnote) {\n items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));\n }\n\n items.push(\n legalLink(_, 'terms_of_service', gettext('Terms of service')));\n items.push(\n legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n return m('ul.list-inline.footer-nav', items);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.ForumFooter = {\n view: function(ctrl, _) {\n var nav = null;\n if (Misago.FooterNav.isVisible(_.settings)) {\n nav = _.component(Misago.FooterNav);\n }\n\n return m('footer.forum-footer', [\n m('.container',\n m('.footer-content', [\n nav,\n _.component(Misago.FooterMisagoBranding)\n ])\n )\n ]);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.FooterMisagoBranding = {\n view: function() {\n return m('a.misago-branding[href=http://misago-project.org]', [\n \"powered by \", m('strong', \"misago\")\n ]);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.BrandFull = {\n view: function(ctrl, branding, _) {\n var children = [\n m('img', {\n src: _.router.staticUrl('misago/img/site-logo.png'),\n alt: _.settings.forum_name\n })\n ];\n\n if (branding) {\n children.push(branding);\n }\n\n return m('a.navbar-brand', {href: _.router.url('index')}, children);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.ForumNavbar = {\n view: function(ctrl, _) {\n var desktopNavbar = [];\n\n if (_.settings.forum_branding_display) {\n desktopNavbar.push(\n _.component(Misago.BrandFull, _.settings.forum_branding_text));\n }\n\n desktopNavbar.push(m('ul.nav.navbar-nav', [\n m('li',\n m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')\n )\n ]));\n\n var navbarStyle = '.navbar.navbar-default.navbar-static-top';\n\n return m('nav' + navbarStyle + '[role=\"navigation\"]', [\n m('.container.navbar-full.hidden-xs.hidden-sm', desktopNavbar)\n ]);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n Misago.ForumLayout = {\n view: function(ctrl, _) {\n return [\n _.component(Misago.ForumNavbar),\n m('#router-fixture', {config: persistent}),\n _.component(Misago.ForumFooter)\n ];\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.Loader = {\n view: function() {\n return m('.loader.sk-folding-cube', [\n m('.sk-cube1.sk-cube'),\n m('.sk-cube2.sk-cube'),\n m('.sk-cube4.sk-cube'),\n m('.sk-cube3.sk-cube')\n ]);\n }\n };\n\n Misago.LoadingPage = {\n view: function(ctrl, _) {\n return m('.page.loading-page',\n _.component(Misago.Loader)\n );\n }\n };\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var setupMarkup = function(el, isInit, context) {\n context.retain = true;\n };\n\n Misago.Markup = {\n view: function(ctrl, content) {\n return m('article.misago-markup', {config: setupMarkup},\n m.trust(content)\n );\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.PageHeader = {\n view: function(ctrl, options) {\n return m('.page-header',\n m('.container', [\n m('h1', options.title),\n ])\n );\n }\n };\n}(Misago.prototype));\n\n(function (Misago, UrlConf) {\n 'use strict';\n\n var urls = new UrlConf();\n urls.url('/', Misago.IndexRoute, 'index');\n\n // Legal pages\n urls.url(\n '/terms-of-service/',\n Misago.TermsOfServiceRoute,\n 'terms_of_service');\n\n urls.url(\n '/privacy-policy/',\n Misago.PrivacyPolicyRoute,\n 'privacy_policy');\n\n // Catch-all 404 not found route\n urls.url('/:rest...', Misago.Error404Route, 'not_found');\n\n Misago.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}
|
|
|
+{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","context","SETTINGS","_initServices","services","orderedServices","OrderedList","order","forEach","item","factory","undefined","serviceInstance","key","_destroyServices","reverse","destroy","setup","init","fixture","get","test","api","_services","proto","prototype","addService","name","push","after","before","has","obj","hasOwnProperty","value","pop","returnValue","items","isOrdered","_items","add","i","length","values","values_only","_order","unordered","insertItem","insertAt","ordering","indexOf","ordered","splice","index","iterations","serializeDatetime","serialized","format","deserializeDatetime","deserialized","moment","startsWith","string","beginning","endsWith","tail","UrlConfInvalidComponentError","message","toString","UrlConf","_patterns","patterns","prefixPattern","prefix","pattern","replace","include","url","component","loadingPage","_","m","Loader","getCsrfToken","cookie_name","document","cookie","cookieRegex","RegExp","match","split","Ajax","csrfToken","CSRF_COOKIE_NAME","runningGets","ajax","method","data","progress","promise","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","resolve","error","jqXHR","rejection","responseJSON","status","statusText","reject","$","preloaded","post","patch","put","filtersUrl","filters","encodedKey","encodeURIComponent","encodedValue","join","Query","call","path","related","model","relation","endpoint","then","results","map","models","Api","argumentsArray","arguments","apply","settings","mount","getElementById","ForumLayout","Modal","element","delegateName","on","hide","off","modal","show","open","Models","classes","deserializers","relations","kwargs","deserialize","json","locale","attr","noop","route","isActive","__controller","controller","__onunload","onunload","vm","__init","initArgs","ondata","finalArgs","f","container","router","errorPage","loading","__view","view","isReady","Router","baseUrl","staticUrl","mediaUrl","urls","reverses","routedComponent","populatePatterns","urlconf","finalPattern","startRouting","mode","delegateElement","cleanUrl","isRelative","substr","location","protocol","host","avatarsUrl","delegateClicks","e","target","href","preventDefault","prefixUrl","error403","ban","ErrorBannedRoute","detail","Error403Route","error404","Error404Route","error500","Error500Route","error0","Error0Route","RunLoop","_intervals","stopInterval","clearTimeout","run","callable","delay","setTimeout","result","runOnce","stop","loop","runloop","ticks","prop","startComputation","endComputation","PageTitle","forum_name","set","title","_set_complex","completeTitle","page","page_label","interpolate","gettext","parent","Ban","html","plain","expires_on","deserializeBan","class","LegalPage","body","link","error_message","help","code","icon","trust","expirationMessage","isAfter","fromNow","IndexRoute","forum_index_title","count","increment","console","log","ctrl","onclick","legalPageFactory","typeName","defaultTitle","dashedTypeName","PageHeader","Markup","TermsOfServiceRoute","PrivacyPolicyRoute","legalLink","legalType","FooterNav","isVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","ForumFooter","nav","FooterMisagoBranding","persistent","el","isInit","retain","RegisterModal","config","SignInModal","BrandFull","branding","children","src","alt","DesktopForumNavbar","menu","forum_branding_display","forum_branding_text","NavbarGuestMenu","ForumNavbar","style","ForumModal","LoadingPage","setupMarkup","content","tabindex","aria-labelledby","options"],"mappings":"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","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n 'use strict';\n\n window.Misago = function() {\n var ns = Object.getPrototypeOf(this);\n var self = this;\n\n // Context data\n this.context = {\n // Empty settings\n SETTINGS: {}\n };\n\n // Services init/destroy\n this._initServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order(false);\n orderedServices.forEach(function (item) {\n var factory = null;\n if (item.item.factory !== undefined) {\n factory = item.item.factory;\n } else {\n factory = item.item;\n }\n\n var serviceInstance = factory(self);\n if (serviceInstance) {\n self[item.key] = serviceInstance;\n }\n });\n };\n\n this._destroyServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order();\n orderedServices.reverse();\n orderedServices.forEach(function (item) {\n if (item.destroy !== undefined) {\n item.destroy(self);\n }\n });\n };\n\n // App init/destory\n this.setup = false;\n this.init = function(setup) {\n this.setup = {\n fixture: ns.get(setup, 'fixture', null),\n test: ns.get(setup, 'test', false),\n api: ns.get(setup, 'api', '/api/')\n };\n\n this._initServices(ns._services);\n };\n\n this.destroy = function() {\n this._destroyServices(ns._services);\n };\n };\n\n\n // Services registry\n var proto = window.Misago.prototype;\n proto._services = [];\n\n proto.addService = function(name, factory, order) {\n proto._services.push({\n key: name,\n item: factory,\n after: proto.get(order, 'after'),\n before: proto.get(order, 'before')\n });\n };\n}());\n\n(function (Misago) {\n 'use strict';\n\n Misago.has = function(obj, key) {\n if (obj) {\n return obj.hasOwnProperty(key);\n } else {\n return false;\n }\n };\n\n Misago.get = function(obj, key, value) {\n if (Misago.has(obj, key)) {\n return obj[key];\n } else if (value !== undefined) {\n return value;\n } else {\n return undefined;\n }\n };\n\n Misago.pop = function(obj, key, value) {\n var returnValue = Misago.get(obj, key, value);\n if (Misago.has(obj, key)) {\n obj[key] = null;\n }\n return returnValue;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.OrderedList = function(items) {\n this.isOrdered = false;\n this._items = items || [];\n\n this.add = function(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n after: Misago.get(order, 'after'),\n before: Misago.get(order, 'before')\n });\n };\n\n this.get = function(key, value) {\n for (var i = 0; i < this._items.length; i++) {\n if (this._items[i].key === key) {\n return this._items[i].item;\n }\n }\n\n return value;\n };\n\n this.has = function(key) {\n return this.get(key) !== undefined;\n };\n\n this.values = function() {\n var values = [];\n for (var i = 0; i < this._items.length; i++) {\n values.push(this._items[i].item);\n }\n return values;\n };\n\n this.order = function(values_only) {\n if (!this.isOrdered) {\n this._items = this._order(this._items);\n this.isOrdered = true;\n }\n\n if (values_only || typeof values_only === 'undefined') {\n return this.values();\n } else {\n return this._items;\n }\n };\n\n this._order = function(unordered) {\n // Index of unordered items\n var index = [];\n unordered.forEach(function (item) {\n index.push(item.key);\n });\n\n // Ordered items\n var ordered = [];\n var ordering = [];\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Second pass: register items that\n // specify their before to \"_end\"\n unordered.forEach(function (item) {\n if (item.before === \"_end\") {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Third pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1;\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after);\n if (insertAt !== -1) {\n insertAt += 1;\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before);\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item);\n ordering.splice(insertAt, 0, item.key);\n }\n }\n }\n\n var iterations = 200;\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1;\n unordered.forEach(insertItem);\n }\n\n return ordered;\n };\n };\n} (Misago.prototype));\n\n(function (Misago) {\n Misago.serializeDatetime = function(serialized) {\n return serialized ? serialized.format() : null;\n };\n\n Misago.deserializeDatetime = function(deserialized) {\n return deserialized ? moment(deserialized) : null;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.startsWith = function(string, beginning) {\n return string.indexOf(beginning) === 0;\n };\n\n Misago.endsWith = function(string, tail) {\n return string.indexOf(tail, string.length - tail.length) !== -1;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.UrlConfInvalidComponentError = function(name) {\n this.message = \"route's \" + name + \" component \" +\n \"should be an array or object\";\n\n this.toString = function() {\n return this.message;\n };\n };\n\n Misago.UrlConf = function() {\n var self = this;\n this._patterns = [];\n\n this.patterns = function() {\n return this._patterns;\n };\n\n var prefixPattern = function(prefix, pattern) {\n return (prefix + pattern).replace('//', '/');\n };\n\n var include = function(prefix, patterns) {\n for (var i = 0; i < patterns.length; i ++) {\n self.url(prefixPattern(prefix, patterns[i].pattern),\n patterns[i].component,\n patterns[i].name);\n }\n };\n\n this.url = function(pattern, component, name) {\n if (typeof component !== 'object') {\n throw new Misago.UrlConfInvalidComponentError(name);\n }\n\n if (pattern === '') {\n pattern = '/';\n }\n\n if (component instanceof Misago.UrlConf) {\n include(pattern, component.patterns());\n } else {\n this._patterns.push({\n pattern: pattern,\n component: component,\n name: name\n });\n }\n };\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.loadingPage = function(_) {\n return m('.page.page-loading',\n _.component(Misago.Loader)\n );\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var getCsrfToken = function(cookie_name) {\n if (document.cookie.indexOf(cookie_name) !== -1) {\n var cookieRegex = new RegExp(cookie_name + '\\=([^;]*)');\n var cookie = Misago.get(document.cookie.match(cookieRegex), 0);\n return cookie.split('=')[1];\n } else {\n return null;\n }\n };\n\n var Ajax = function(_) {\n this.csrfToken = getCsrfToken(_.context.CSRF_COOKIE_NAME);\n\n /*\n List of GETs underway\n We are limiting number of GETs to API to 1 per url\n */\n var runningGets = {};\n\n this.ajax = function(method, url, data, progress) {\n var promise = m.deferred();\n\n var ajax_settings = {\n url: url,\n method: method,\n headers: {\n 'X-CSRFToken': this.csrfToken\n },\n\n data: data | {},\n dataType: 'json',\n\n success: function(data) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n promise.resolve(data);\n },\n error: function(jqXHR) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n\n var rejection = jqXHR.responseJSON || {};\n\n rejection.status = jqXHR.status;\n rejection.statusText = jqXHR.statusText;\n\n promise.reject(rejection);\n }\n };\n\n if (progress) {\n return; // not implemented... yet!\n }\n\n $.ajax(ajax_settings);\n return promise.promise;\n };\n\n this.get = function(url) {\n var preloaded = Misago.pop(_.context, url);\n if (preloaded) {\n var deferred = m.deferred();\n deferred.resolve(preloaded);\n return deferred.promise;\n } else if (runningGets[url] !== undefined) {\n return runningGets[url];\n } else {\n runningGets[url] = this.ajax('GET', url);\n return runningGets[url];\n }\n };\n\n this.post = function(url, data) {\n return this.ajax('POST', url, data);\n };\n\n this.patch = function(url, data) {\n return this.ajax('PATCH', url, data);\n };\n\n this.put = function(url, data) {\n return this.ajax('PUT', url, data);\n };\n\n this.delete = function(url) {\n return this.ajax('DELETE', url);\n };\n };\n\n Misago.addService('ajax', function(_) {\n return new Ajax(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var filtersUrl = function(filters) {\n if (typeof filters === 'object') {\n var values = [];\n for (var key in filters) {\n if (filters.hasOwnProperty(key)) {\n var encodedKey = encodeURIComponent(key);\n var encodedValue = encodeURIComponent(filters[key]);\n values.push(encodedKey + '=' + encodedValue);\n }\n }\n return '?' + values.join('&');\n } else {\n return filters + '/';\n }\n };\n\n var Query = function(_, call) {\n this.url = call.url || _.setup.api;\n\n if (call.path) {\n this.url += call.path + '/';\n } else if (call.related) {\n this.url += call.related + '/';\n } else {\n this.url += call.model + 's' + '/';\n }\n\n if (call.filters) {\n this.url += filtersUrl(call.filters);\n }\n\n if (!call.url && call.filters) {\n if (call.model) {\n this.related = function(model, filters) {\n return new Query(_, {\n url: this.url,\n relation: call.model,\n related: model,\n filters: filters,\n });\n };\n }\n\n this.endpoint = function(path, filters) {\n return new Query(_, {\n url: this.url,\n path: path,\n filters: filters\n });\n };\n }\n\n this.get = function() {\n var model = null;\n if (call.related) {\n model = call.relation + ':' + call.related;\n } else if (call.model) {\n model = call.model;\n }\n\n return _.ajax.get(this.url).then(function(data) {\n if (model) {\n if (data.results) {\n data.results.map(function(item) {\n return _.models.new(model, item);\n });\n return data;\n } else {\n return _.models.new(model, data);\n }\n } else {\n return data;\n }\n });\n };\n\n this.post = function(data) {\n return _.ajax.post(this.url, data);\n };\n\n this.patch = function(data) {\n return _.ajax.patch(this.url, data);\n };\n\n this.put = function(data) {\n return _.ajax.put(this.url, data);\n };\n\n this.delete = function() {\n return _.ajax.delete(this.url);\n };\n\n // shortcut for get()\n this.then = function(resolve, reject) {\n return this.get().then(resolve, reject);\n };\n };\n\n var Api = function(_) {\n this.model = function(model, filters) {\n return new Query(_, {\n model: model,\n filters: filters,\n });\n };\n\n this.endpoint = function(path, filters) {\n return new Query(_, {\n path: path,\n filters: filters\n });\n };\n };\n\n Misago.addService('api', function(_) {\n return new Api(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('component-factory', function(_) {\n // Component factory\n _.component = function() {\n var argumentsArray = [];\n for (var i = 0; i < arguments.length; i += 1) {\n argumentsArray.push(arguments[i]);\n }\n\n argumentsArray.push(_);\n return m.component.apply(undefined, argumentsArray);\n };\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('conf', function(_) {\n _.settings = Misago.get(_.context, 'SETTINGS', {});\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('forum-layout', {\n factory: function(_) {\n if (_.setup.fixture) {\n m.mount(document.getElementById(_.setup.fixture),\n _.component(Misago.ForumLayout));\n }\n },\n\n destroy: function(_) {\n if (_.setup.fixture) {\n m.mount(document.getElementById(_.setup.fixture), null);\n }\n }\n }, {before: 'start-routing'});\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Modal = function(_) {\n var self = this;\n\n var element = document.getElementById('misago-modal');\n\n // href clicks within modal should close it\n var delegateName = 'click.misago-modal';\n $(element).on(delegateName, 'a', function() {\n self.hide();\n });\n\n this.destroy = function() {\n $(element).off(delegateName);\n };\n\n // Open/close modal\n var modal = $(element).modal({show: false});\n this.open = false;\n\n modal.on('hidden.bs.modal', function () {\n if (self.open) {\n m.mount(element, null);\n this.open = false;\n }\n });\n\n this.show = function(component) {\n this.open = true;\n m.mount(element, _.component(component));\n modal.modal('show');\n };\n\n this.hide = function() {\n modal.modal('hide');\n };\n };\n\n Misago.addService('modal', {\n factory: function(_) {\n return new Modal(_);\n },\n destroy: function(_) {\n _.modal.destroy();\n }\n }, {after: 'start-routing'});\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Models = function() {\n this.classes = {};\n this.deserializers = {};\n this.relations = {};\n\n this.add = function(name, kwargs) {\n if (kwargs.class) {\n this.classes[name] = kwargs.class;\n }\n\n if (kwargs.deserialize) {\n this.deserializers[name] = kwargs.deserialize;\n }\n\n if (kwargs.relations) {\n for (var key in kwargs.relations) {\n if (kwargs.relations.hasOwnProperty(key)) {\n this.relations[name + ':' + key] = kwargs.relations[key];\n }\n }\n }\n };\n\n this.new = function(name, data) {\n if (this.classes[name]) {\n return new this.classes[name](data);\n } else {\n return data;\n }\n };\n\n this.deserialize = function(name, json) {\n if (this.relations[name]) {\n name = this.relations[name];\n }\n\n if (this.deserializers[name]) {\n return this.new(name, this.deserializers[name](json, this));\n } else {\n return this.new(name, json);\n }\n };\n };\n\n Misago.addService('models', function() {\n return new Models();\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('set-momentjs-locale', function() {\n moment.locale($('html').attr('lang'));\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var noop = function() {};\n\n Misago.route = function(component) {\n /*\n Boilerplate for Misago top-level components\n */\n\n // Component state\n component.isActive = true;\n\n // Wrap controller to store lifecycle methods\n var __controller = component.controller || noop;\n component.controller = function() {\n component.isActive = true;\n\n var controller = __controller.apply(component, arguments) || {};\n\n // wrap onunload for lifestate\n var __onunload = controller.onunload || noop;\n controller.onunload = function() {\n __onunload.apply(component, arguments);\n component.isActive = false;\n };\n\n return controller;\n };\n\n // Add state callbacks to View-Model\n if (component.vm && component.vm.init) {\n // wrap vm.init in promise handler\n var __init = component.vm.init;\n component.vm.init = function() {\n var initArgs = arguments;\n var promise = __init.apply(component.vm, initArgs);\n\n if (promise) {\n promise.then(function() {\n if (component.isActive && component.vm.ondata) {\n var finalArgs = [];\n for (var i = 0; i < arguments.length; i++) {\n finalArgs.push(arguments[i]);\n }\n for (var f = 0; f < initArgs.length; f++) {\n finalArgs.push(initArgs[f]);\n }\n\n component.vm.ondata.apply(component.vm, finalArgs);\n }\n }, function(error) {\n if (component.isActive) {\n component.container.router.errorPage(error);\n }\n });\n }\n };\n\n // setup default loading view\n if (!component.loading) {\n component.loading = function () {\n var _ = this.container;\n return m('.page.page-loading',\n _.component(Misago.Loader)\n );\n };\n }\n\n var __view = component.view;\n component.view = function() {\n if (component.vm.isReady) {\n return __view.apply(component, arguments);\n } else {\n return component.loading.apply(component, arguments);\n }\n };\n }\n\n return component;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Router = function(_) {\n var self = this;\n this.baseUrl = $('base').attr('href');\n\n var staticUrl = Misago.get(_.context, 'STATIC_URL', '/');\n var mediaUrl = Misago.get(_.context, 'MEDIA_URL', '/');\n\n // Routing\n this.urls = {};\n this.reverses = {};\n\n var routedComponent = function(component) {\n component.container = _;\n return component;\n };\n\n var populatePatterns = function(urlconf) {\n urlconf.patterns().forEach(function(url) {\n // set service container on component\n\n var finalPattern = self.baseUrl + url.pattern;\n finalPattern = finalPattern.replace('//', '/');\n\n self.urls[finalPattern] = routedComponent(url.component);\n self.reverses[url.name] = finalPattern;\n });\n };\n\n this.startRouting = function(urlconf, fixture) {\n populatePatterns(urlconf);\n this.fixture = fixture;\n\n if (_.setup.test) {\n m.route.mode = 'search';\n } else {\n m.route.mode = 'pathname';\n }\n m.route(fixture, '/', this.urls);\n };\n\n this.url = function(name) {\n return this.reverses[name];\n };\n\n // Delegate clicks\n this.delegateElement = null;\n\n this.cleanUrl = function(url) {\n if (!url) { return; }\n\n // Is link relative?\n var isRelative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';\n\n // If link contains host, validate to see if its outgoing\n if (!isRelative) {\n var location = window.location;\n\n // If protocol matches current one, strip it from string\n // otherwhise stop handler\n if (url.substr(0, 2) !== '//') {\n var protocol = url.substr(0, location.protocol.length + 2);\n if (protocol !== location.protocol + '//') { return; }\n url = url.substr(location.protocol.length + 2);\n } else {\n url = url.substr(2);\n }\n\n // Host checks out?\n if (url.substr(0, location.host.length) !== location.host) { return; }\n url = url.substr(location.host.length);\n }\n\n // Is link within Ember app?\n if (url.substr(0, this.baseUrl.length) !== this.baseUrl) { return; }\n\n // Is link to media/static/avatar server?\n if (url.substr(0, staticUrl.length) === staticUrl) { return; }\n\n if (url.substr(0, mediaUrl.length) === mediaUrl) { return; }\n\n var avatarsUrl = '/user-avatar/';\n if (url.substr(0, avatarsUrl.length) === avatarsUrl) { return; }\n\n return url;\n };\n\n var delegateName = 'click.misago-router';\n this.delegateClicks = function(element) {\n this.delegateElement = element;\n $(this.delegateElement).on(delegateName, 'a', function(e) {\n var cleanUrl = self.cleanUrl(e.target.href);\n if (cleanUrl) {\n if (cleanUrl != m.route()) {\n m.route(cleanUrl);\n }\n e.preventDefault();\n }\n });\n };\n\n this.destroy = function() {\n $(this.delegateElement).off(delegateName);\n };\n\n // Media/Static url\n var prefixUrl = function(prefix) {\n return function(url) {\n return prefix + url;\n };\n };\n\n this.staticUrl = prefixUrl(staticUrl);\n this.mediaUrl = prefixUrl(mediaUrl);\n\n // Errors\n this.error403 = function(error) {\n var component = null;\n if (error.ban) {\n component = routedComponent(Misago.ErrorBannedRoute);\n component.error = {\n message: error.detail,\n ban: _.models.deserialize('ban', error.ban)\n };\n } else {\n component = routedComponent(Misago.Error403Route);\n component.error = error.detail;\n }\n\n m.mount(this.fixture, component);\n };\n\n this.error404 = function() {\n m.mount(this.fixture, routedComponent(Misago.Error404Route));\n };\n\n this.error500 = function() {\n m.mount(this.fixture, routedComponent(Misago.Error500Route));\n };\n\n this.error0 = function() {\n m.mount(this.fixture, routedComponent(Misago.Error0Route));\n };\n\n this.errorPage = function(error) {\n if (error.status === 0) {\n this.error0();\n }\n\n if (error.status === 500) {\n this.error500();\n }\n\n if (error.status === 404) {\n this.error404();\n }\n\n if (error.status === 403) {\n this.error403(error);\n }\n };\n };\n\n Misago.addService('router', function(_) {\n return new Router(_);\n });\n\n Misago.addService('start-routing', function(_) {\n _.router.startRouting(\n Misago.urls, document.getElementById('router-fixture'));\n _.router.delegateClicks(document.getElementById(_.setup.fixture));\n }, {before: '_end'});\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var RunLoop = function(_) {\n var self = this;\n\n this._intervals = {};\n\n var stopInterval = function(name) {\n if (self._intervals[name]) {\n window.clearTimeout(self._intervals[name]);\n self._intervals[name] = null;\n }\n };\n\n this.run = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n stopInterval(name);\n var result = callable(_);\n if (result !== false) {\n self.run(callable, name, delay);\n }\n }, delay);\n };\n\n this.runOnce = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n stopInterval(name);\n callable(_);\n }, delay);\n };\n\n this.stop = function(name) {\n for (var loop in this._intervals) {\n if (!name || name === loop) {\n stopInterval(loop);\n }\n }\n };\n };\n\n Misago.addService('runloop', {\n factory: function(_) {\n return new RunLoop(_);\n },\n\n destroy: function(_) {\n _.runloop.stop();\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('start-tick', function(_) {\n var ticks = m.prop();\n\n _.runloop.run(function() {\n m.startComputation();\n // just tick once a minute so stuff gets rerendered\n ticks(ticks() + 1);\n // syncing dynamic timestamps, etc ect\n m.endComputation();\n }, 'tick', 60000);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var PageTitle = function(forum_name) {\n this.set = function(title) {\n if (title) {\n this._set_complex(title);\n } else {\n document.title = forum_name;\n }\n };\n\n this._set_complex = function(title) {\n if (typeof title === 'string') {\n title = {title: title};\n }\n\n var completeTitle = title.title;\n\n if (typeof title.page !== 'undefined' && title.page > 1) {\n var page_label = interpolate(\n gettext('page %(page)s'), { page:title.page }, true);\n completeTitle += ' (' + page_label + ')';\n }\n\n if (typeof title.parent !== 'undefined') {\n completeTitle += ' | ' + title.parent;\n }\n\n document.title = completeTitle + ' | ' + forum_name;\n };\n };\n\n Misago.addService('page-title', function(_) {\n _.title = new PageTitle(_.settings.forum_name);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Ban = function(data) {\n this.message = {\n html: data.message.html,\n plain: data.message.plain,\n };\n\n this.expires_on = data.expires_on;\n };\n\n var deserializeBan = function(data) {\n data.expires_on = Misago.deserializeDatetime(data.expires_on);\n\n return data;\n };\n\n Misago.addService('ban-model', function(_) {\n _.models.add('ban', {\n class: Ban,\n deserialize: deserializeBan\n });\n }, {after: 'models'});\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var LegalPage = function(data) {\n this.title = data.title;\n this.body = data.body;\n this.link = data.link;\n };\n\n Misago.addService('legal-page-model', function(_) {\n _.models.add('legal-page', {\n class: LegalPage\n });\n }, {after: 'models'});\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var errorPage = function(error) {\n var error_message = [\n m('p.lead', error.message)\n ];\n\n if (error.help) {\n error_message.push(m('p.help', error.help));\n }\n\n return m('.page.error-page.error-' + error.code + '-page',\n m('.container',\n m('.error-panel', [\n m('.error-icon',\n m('span.material-icon', error.icon)\n ),\n m('.error-message', error_message)\n ])\n )\n );\n };\n\n Misago.ErrorBannedRoute = Misago.route({\n controller: function() {\n this.container.title.set(gettext('You are banned'));\n },\n error: null,\n view: function() {\n var error_message = [];\n if (this.error.ban.message.html) {\n error_message.push(m('.lead', m.trust(this.error.ban.message.html)));\n } else {\n error_message.push(m('p.lead', this.error.message));\n }\n\n var expirationMessage = null;\n if (this.error.ban.expires_on) {\n if (this.error.ban.expires_on.isAfter(moment())) {\n expirationMessage = interpolate(\n gettext('This ban expires %(expires_on)s.'),\n { 'expires_on': this.error.ban.expires_on.fromNow() },\n true);\n } else {\n expirationMessage = gettext('This ban has expired.');\n }\n } else {\n expirationMessage = gettext('This ban is permanent.');\n }\n error_message.push(m('p', expirationMessage));\n\n return m('.page.error-page.error-banned-page',\n m('.container',\n m('.error-panel', [\n m('.error-icon',\n m('span.material-icon', 'highlight_off')\n ),\n m('.error-message', error_message)\n ])\n )\n );\n }\n });\n\n Misago.Error403Route = Misago.route({\n controller: function() {\n this.container.title.set(gettext('Page not available'));\n },\n error: null,\n view: function() {\n if (this.error === \"Permission denied\") {\n this.error = gettext(\"You don't have permission to access this page.\");\n }\n\n return errorPage({\n code: 403,\n icon: 'remove_circle_outline',\n message: gettext(\"This page is not available.\"),\n help: this.error\n });\n }\n });\n\n Misago.Error404Route = Misago.route({\n controller: function() {\n this.container.title.set(gettext('Page not found'));\n },\n view: function() {\n return errorPage({\n code: 404,\n icon: 'info_outline',\n message: gettext(\"Requested page could not be found.\"),\n help: gettext(\"The link you followed was incorrect or the page has been moved or deleted.\")\n });\n }\n });\n\n Misago.Error500Route = Misago.route({\n controller: function() {\n this.container.title.set(gettext('Application error occured'));\n },\n view: function() {\n return errorPage({\n code: 500,\n icon: 'error_outline',\n message: gettext(\"Requested page could not be displayed due to an error.\"),\n help: gettext(\"Please try again later or contact site staff if error persists.\")\n });\n }\n });\n\n Misago.Error0Route = Misago.route({\n controller: function() {\n this.container.title.set(gettext('Lost connection with application'));\n },\n view: function() {\n return errorPage({\n code: 0,\n icon: 'sync_problem',\n message: gettext(\"Could not connect to application.\"),\n help: gettext(\"This may be caused by problems with your connection or application server. Please check your internet connection and refresh page if problem persists.\")\n });\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.IndexRoute = Misago.route({\n controller: function() {\n var _ = this.container;\n document.title = _.settings.forum_index_title || _.settings.forum_name;\n\n var count = m.prop(0);\n\n return {\n count: count,\n increment: function() {\n console.log('increment()');\n count(count() + 1);\n }\n };\n },\n view: function(ctrl) {\n return m('.container', [\n m('h1', [\n 'Count: ', m('strong', ctrl.count())\n ]),\n m('p', 'Clicky click button to increase count!.'),\n m('p',\n m('button.btn.btn-primary', {onclick: ctrl.increment},\n 'Clicky clicky!'\n )\n )\n ]);\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalPageFactory = function(typeName, defaultTitle) {\n var dashedTypeName = typeName.replace(/_/g, '-');\n\n return Misago.route({\n controller: function() {\n var _ = this.container;\n\n if (Misago.get(_.settings, typeName + '_link')) {\n window.location = Misago.get(_.settings, typeName + '_link');\n } else {\n this.vm.init(this, _);\n }\n },\n vm: {\n page: null,\n isReady: false,\n init: function(component, _) {\n if (this.isReady) {\n _.title.set(this.title);\n } else {\n _.title.set();\n return _.api.model('legal-page', dashedTypeName);\n }\n },\n ondata: function(page, component, _) {\n m.startComputation();\n\n if (page.link) {\n window.location = page.link;\n } else {\n page.title = page.title || defaultTitle;\n this.page = page;\n this.isReady = true;\n\n m.endComputation();\n\n if (component.isActive) {\n _.title.set(this.page.title);\n }\n }\n }\n },\n view: function() {\n var _ = this.container;\n\n return m('.page.legal-page.' + dashedTypeName + '-page', [\n _.component(Misago.PageHeader, {title: this.vm.page.title}),\n m('.container',\n _.component(Misago.Markup, this.vm.page.body)\n )\n ]);\n }\n });\n };\n\n Misago.TermsOfServiceRoute = legalPageFactory(\n 'terms_of_service', gettext('Terms of service'));\n Misago.PrivacyPolicyRoute = legalPageFactory(\n 'privacy_policy', gettext('Privacy policy'));\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalLink = function(_, legalType, defaultTitle) {\n var url = Misago.get(_.settings, legalType + '_link');\n if (!url && Misago.get(_.settings, legalType)) {\n url = _.router.url(legalType);\n }\n\n if (url) {\n return m('li',\n m('a', {href: url},\n Misago.get(_.settings, legalType + '_title', defaultTitle)\n )\n );\n } else {\n return null;\n }\n };\n\n Misago.FooterNav = {\n isVisible: function(settings) {\n return [\n !!settings.forum_footnote,\n !!settings.terms_of_service,\n !!settings.terms_of_service_link,\n !!settings.privacy_policy,\n !!settings.privacy_policy_link\n ].indexOf(true) !== -1;\n },\n view: function(ctrl, _) {\n var items = [];\n\n if (_.settings.forum_footnote) {\n items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));\n }\n\n items.push(\n legalLink(_, 'terms_of_service', gettext('Terms of service')));\n items.push(\n legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n return m('ul.list-inline.footer-nav', items);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.ForumFooter = {\n view: function(ctrl, _) {\n var nav = null;\n if (Misago.FooterNav.isVisible(_.settings)) {\n nav = _.component(Misago.FooterNav);\n }\n\n return m('footer.forum-footer', [\n m('.container',\n m('.footer-content', [\n nav,\n _.component(Misago.FooterMisagoBranding)\n ])\n )\n ]);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.FooterMisagoBranding = {\n view: function() {\n return m('a.misago-branding[href=http://misago-project.org]', [\n \"powered by \", m('strong', \"misago\")\n ]);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n Misago.RegisterModal = {\n view: function() {\n return m('.modal-dialog.modal-lg[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n m('.modal-header',\n m('h4#misago-modal-label.modal-title', 'Register in modal!')\n ),\n m('.modal-body', [\n m('p', 'Lorem ipsum dolor met sit amet elit.'),\n m('p', [\n 'Si vis pacem ',\n m('a', {href: '/'}, 'bellum'),\n ' sequitat.'\n ])\n ])\n ])\n );\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n Misago.SignInModal = {\n view: function() {\n return m('.modal-dialog[role=\"document\"]',\n {config: persistent},\n m('.modal-content', [\n m('.modal-header',\n m('h4#misago-modal-label.modal-title', 'Sign in modal!')\n ),\n m('.modal-body', [\n m('p', 'Lorem ipsum dolor met sit amet elit.'),\n m('p', [\n 'Si vis pacem ',\n m('a', {href: '/'}, 'bellum'),\n ' sequitat.'\n ])\n ])\n ])\n );\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.BrandFull = {\n view: function(ctrl, branding, _) {\n var children = [\n m('img', {\n src: _.router.staticUrl('misago/img/site-logo.png'),\n alt: _.settings.forum_name\n })\n ];\n\n if (branding) {\n children.push(branding);\n }\n\n return m('a.navbar-brand', {href: _.router.url('index')}, children);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.DesktopForumNavbar = {\n view: function(ctrl, _) {\n var menu = [];\n\n if (_.settings.forum_branding_display) {\n menu.push(\n _.component(Misago.BrandFull, _.settings.forum_branding_text));\n }\n\n menu.push(m('ul.nav.navbar-nav', [\n m('li',\n m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')\n )\n ]));\n\n menu.push(_.component(Misago.NavbarGuestMenu));\n\n return m('.container.navbar-full.hidden-xs.hidden-sm', menu);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.ForumNavbar = {\n view: function(ctrl, _) {\n var style = '.navbar.navbar-default.navbar-static-top';\n return m('nav' + style + '[role=\"navigation\"]', [\n _.component(Misago.DesktopForumNavbar)\n ]);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.NavbarGuestMenu = {\n view: function(ctrl, _) {\n return m('div.nav.guest-nav', [\n m('button.navbar-btn.btn.btn-default',\n {onclick: function() {_.modal.show(Misago.SignInModal); }},\n gettext(\"Sign in\")),\n m('button.navbar-btn.btn.btn-primary',\n {onclick: function() {_.modal.show(Misago.RegisterModal); }},\n gettext(\"Register\"))\n ]);\n }\n };\n}(Misago.prototype));\n\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n Misago.ForumLayout = {\n view: function(ctrl, _) {\n return [\n _.component(Misago.ForumNavbar),\n m('#router-fixture', {config: persistent}),\n _.component(Misago.ForumFooter),\n m.component(Misago.ForumModal)\n ];\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.Loader = {\n view: function() {\n return m('.loader.sk-folding-cube', [\n m('.sk-cube1.sk-cube'),\n m('.sk-cube2.sk-cube'),\n m('.sk-cube4.sk-cube'),\n m('.sk-cube3.sk-cube')\n ]);\n }\n };\n\n Misago.LoadingPage = {\n view: function(ctrl, _) {\n return m('.page.loading-page',\n _.component(Misago.Loader)\n );\n }\n };\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var setupMarkup = function(el, isInit, context) {\n context.retain = true;\n };\n\n Misago.Markup = {\n view: function(ctrl, content) {\n return m('article.misago-markup', {config: setupMarkup},\n m.trust(content)\n );\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n function persistent(el, isInit, context) {\n context.retain = true;\n }\n\n Misago.ForumModal = {\n view: function() {\n return m(\n '#misago-modal.modal.fade[role=\"dialog\"]',\n {\n config: persistent,\n tabindex: \"-1\",\n \"aria-labelledby\": \"misago-modal-label\"\n }\n );\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.PageHeader = {\n view: function(ctrl, options) {\n return m('.page-header',\n m('.container', [\n m('h1', options.title),\n ])\n );\n }\n };\n}(Misago.prototype));\n\n(function (Misago, UrlConf) {\n 'use strict';\n\n var urls = new UrlConf();\n urls.url('/', Misago.IndexRoute, 'index');\n\n // Legal pages\n urls.url(\n '/terms-of-service/',\n Misago.TermsOfServiceRoute,\n 'terms_of_service');\n\n urls.url(\n '/privacy-policy/',\n Misago.PrivacyPolicyRoute,\n 'privacy_policy');\n\n // Catch-all 404 not found route\n urls.url('/:rest...', Misago.Error404Route, 'not_found');\n\n Misago.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}
|