{"version":3,"sources":["jsdelivr-header.js","/npm/angular-ui-bootstrap@2.1.4/dist/ui-bootstrap-tpls.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACAG,QAAQ,OAAO,eAAgB,CAAC,oBAAqB,wBAAwB,wBAAwB,yBAAyB,qBAAqB,uBAAuB,wBAAwB,0BAA0B,uBAAuB,0BAA0B,wBAAwB,+BAA+B,wBAAwB,wBAAwB,0BAA0B,qBAAqB,sBAAsB,qBAAqB,0BAA0B,uBAAuB,uBAAuB,2BAA2B,sBAAsB,oBAAoB,0BAA0B,2BACxnB,QAAQ,OAAO,oBAAqB,CAAC,8CAA8C,wCAAwC,gCAAgC,sCAAsC,mCAAmC,0CAA0C,mCAAmC,qCAAqC,oCAAoC,0CAA0C,iCAAiC,gCAAgC,0CAA0C,+CAA+C,0CAA0C,mDAAmD,yCAAyC,6CAA6C,oCAAoC,oCAAoC,yCAAyC,4CAA4C,kCAAkC,6BAA6B,gCAAgC,0CAA0C,8CAA8C,gDACrkC,QAAQ,OAAO,wBAAyB,IAErC,UAAU,cAAe,CAAC,WAAY,KAAM,SAAU,YAAa,SAAS,EAAU,EAAI,EAAQ,GACjG,IAAI,EAAc,EAAU,IAAI,eAAiB,EAAU,IAAI,eAAiB,KAChF,MAAO,CACL,KAAM,SAAS,EAAO,EAAS,GAC7B,IAAI,EAAgB,EAAO,EAAM,WAC/B,EAAe,EAAO,EAAM,UAC5B,EAAiB,EAAO,EAAM,YAC9B,EAAgB,EAAO,EAAM,WAC7B,GAAa,EACb,EAAM,CAAC,EACP,EAAQ,CAAC,EA0BX,SAAS,EAAqB,GAC5B,OAAI,EACK,CAAC,MAAO,EAAQ,YAAc,MAEhC,CAAC,OAAQ,EAAQ,aAAe,KACzC,CAkCA,SAAS,IACP,EAAQ,YAAY,cACjB,SAAS,YACT,IAAI,GACP,EAAa,EACf,CAkCA,SAAS,IACP,EAAQ,IAAI,GACZ,EAAQ,YAAY,cACjB,SAAS,YACZ,EAAc,EAChB,EAzGA,YACE,KAAgB,eAAgB,KAE9B,EAAM,CACJ,MAAO,IAET,EAAQ,CAAC,MAAO,OAEhB,EAAM,CACJ,OAAQ,IAEV,EAAQ,CAAC,OAAQ,MAEd,EAAM,MAAM,EAAM,cACrB,EAAQ,SAAS,MACd,SAAS,YACT,KAAK,iBAAiB,GACtB,KAAK,eAAe,GACpB,IAAI,EAEX,CAtBA,GA6GA,EAAM,OAAO,EAAM,aAAa,SAAS,GACnC,EAxCN,WACE,IAAK,EAAQ,SAAS,cAAgB,EAAQ,SAAS,MACrD,OAAO,IAGT,EAAG,QAAQ,EAAe,IACvB,MAAK,WACJ,EAIG,IAAI,EAAqB,EAAQ,KAGjC,YAAY,YACZ,SAAS,cACT,KAAK,iBAAiB,GACtB,KAAK,eAAe,GAEnB,EACF,EAAY,EAAS,CACnB,YAAa,KACb,GAAI,IACH,QAAiB,QAAE,GAEtB,EAAS,YAAY,EAAS,KAAM,CAClC,GAAI,IACH,KAAK,EAEZ,GACJ,CAWI,GA/EE,EAAQ,SAAS,aAAe,EAAQ,SAAS,OAIrD,EAAG,QAAQ,EAAc,IACtB,MAAK,WACJ,EAAQ,YAAY,YACjB,SAAS,cACT,KAAK,iBAAiB,GACtB,KAAK,eAAe,GAEnB,EACF,EAAY,EAAS,CACnB,SAAU,KACV,OAAQ,OACR,IAAK,CACH,SAAU,UAEZ,GAAI,EAAqB,EAAQ,MAChC,QAAiB,QAAE,GAEtB,EAAS,SAAS,EAAS,KAAM,CAC/B,IAAK,CACH,SAAU,UAEZ,GAAI,EAAqB,EAAQ,MAChC,KAAK,EAEZ,GAuDJ,GACF,EAEJ,IAEF,QAAQ,OAAO,wBAAyB,IAEvC,UAAU,qBAAqB,WAC9B,MAAO,CACL,SAAU,IACV,KAAM,SAAS,EAAO,EAAM,GAC1B,EAAM,SAAS,YAAY,SAAS,GAClC,EAAM,KAAK,WAAY,GAAY,EAAI,KACzC,GACF,EAEJ,IAEA,QAAQ,OAAO,yBAA0B,CAAC,wBAAyB,0BAElE,SAAS,qBAAsB,CAC9B,aAAa,IAGd,WAAW,yBAA0B,CAAC,SAAU,SAAU,qBAAsB,SAAS,EAAQ,EAAQ,GAExG,KAAK,OAAS,GAGd,KAAK,YAAc,SAAS,IACR,QAAQ,UAAU,EAAO,aACzC,EAAO,MAAM,EAAO,aAAe,EAAgB,cAEnD,QAAQ,QAAQ,KAAK,QAAQ,SAAS,GAChC,IAAU,IACZ,EAAM,QAAS,EAEnB,GAEJ,EAGA,KAAK,SAAW,SAAS,GACvB,IAAI,EAAO,KACX,KAAK,OAAO,KAAK,GAEjB,EAAW,IAAI,YAAY,SAAS,GAClC,EAAK,YAAY,EACnB,GACF,EAGA,KAAK,YAAc,SAAS,GAC1B,IAAI,EAAQ,KAAK,OAAO,QAAQ,IACjB,IAAX,GACF,KAAK,OAAO,OAAO,EAAO,EAE9B,CACF,IAIC,UAAU,gBAAgB,WACzB,MAAO,CACL,WAAY,yBACZ,aAAc,YACd,YAAY,EACZ,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,uCAC9B,EAEJ,IAGC,UAAU,qBAAqB,WAC9B,MAAO,CACL,QAAS,gBACT,YAAY,EACZ,SAAU,IACV,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,6CAC9B,EACA,MAAO,CACL,QAAS,IACT,WAAY,KACZ,OAAQ,KACR,WAAY,MAEd,WAAY,WACV,KAAK,WAAa,SAAS,GACzB,KAAK,QAAU,CACjB,CACF,EACA,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,EAAQ,SAAS,SACjB,EAAc,SAAS,GAEvB,EAAM,UAAY,EAAM,WAAa,aACrC,EAAM,WAAa,EAAM,YAAc,gBACvC,EAAM,OAAO,UAAU,SAAS,GAC9B,EAAQ,YAAY,EAAM,YAAa,GACnC,GACF,EAAc,YAAY,EAE9B,IAEA,EAAM,WAAa,SAAS,GACrB,EAAM,YACJ,GAA2B,KAAjB,EAAO,QACpB,EAAM,QAAU,EAAM,OAG5B,EAEA,IAAI,EAAK,kBAAoB,EAAM,IAAM,IAAM,KAAK,MAAsB,IAAhB,KAAK,UAC/D,EAAM,UAAY,EAAK,OACvB,EAAM,QAAU,EAAK,QACvB,EAEJ,IAGC,UAAU,uBAAuB,WAChC,MAAO,CACL,YAAY,EACZ,SAAU,GACV,SAAS,EACT,QAAS,qBACT,KAAM,SAAS,EAAO,EAAS,EAAO,EAAoB,GAIxD,EAAmB,WAAW,EAAW,EAAO,QAAQ,MAC1D,EAEJ,IAIC,UAAU,0BAA0B,WACnC,MAAO,CACL,QAAS,qBACT,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,EAAM,QAAO,WAAa,OAAO,EAAW,EAAM,uBAAyB,IAAG,SAAS,GACrF,GAAI,EAAS,CACX,IAAI,EAAO,QAAQ,QAAQ,EAAQ,GAAG,cASnC,6KARH,EAAK,KAAK,IACV,EAAK,OAAO,EACd,CACF,GACF,EAYJ,IAEA,QAAQ,OAAO,qBAAsB,IAEpC,WAAW,qBAAsB,CAAC,SAAU,WAAY,SAAU,eAAgB,WAAY,SAAS,EAAQ,EAAU,EAAQ,EAAc,GAC9I,EAAO,YAAc,EAAO,MAC5B,EAAS,SAAS,SAClB,EAAO,KAAK,OAAQ,SAChB,EAAO,WACT,EAAS,SAAS,qBAGpB,IAAI,EAAmB,QAAQ,UAAU,EAAO,kBAC9C,EAAa,EAAO,iBAApB,CAAsC,EAAO,SAAW,KAEtD,GACF,GAAS,WACP,EAAO,OACT,GAAG,SAAS,EAAkB,IAElC,IAEC,UAAU,YAAY,WACrB,MAAO,CACL,WAAY,qBACZ,aAAc,QACd,SAAU,IACV,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,+BAC9B,EACA,YAAY,EACZ,MAAO,CACL,MAAO,KAGb,IAEA,QAAQ,OAAO,uBAAwB,IAEtC,SAAS,kBAAmB,CAC3B,YAAa,SACb,YAAa,UAGd,WAAW,uBAAwB,CAAC,kBAAmB,SAAS,GAC/D,KAAK,YAAc,EAAa,aAAe,SAC/C,KAAK,YAAc,EAAa,aAAe,OACjD,IAEC,UAAU,cAAe,CAAC,SAAU,SAAS,GAC5C,MAAO,CACL,QAAS,CAAC,cAAe,WACzB,WAAY,uBACZ,aAAc,UACd,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,IAAI,EAAc,EAAM,GAAI,EAAc,EAAM,GAC5C,EAAkB,EAAO,EAAM,gBAEnC,EAAQ,KAAK,SAAS,IAAI,CAAC,QAAS,SAGpC,EAAY,QAAU,WACpB,EAAQ,YAAY,EAAY,YAAa,QAAQ,OAAO,EAAY,YAAa,EAAM,MAAM,EAAM,cACzG,EAGA,EAAQ,GAAG,EAAY,aAAa,WAClC,IAAI,EAAM,SAAV,CAIA,IAAI,EAAW,EAAQ,SAAS,EAAY,aAEvC,IAAY,QAAQ,UAAU,EAAM,cACvC,EAAM,QAAO,WACX,EAAY,cAAc,EAAW,KAAO,EAAM,MAAM,EAAM,cAC9D,EAAY,SACd,GARF,CAUF,IAEI,EAAM,gBACR,EAAM,OAAO,GAAiB,SAAS,GACrC,EAAM,KAAK,cAAe,EAAc,QAAK,EAC/C,GAEJ,EAEJ,IAEC,UAAU,kBAAkB,WAC3B,MAAO,CACL,QAAS,CAAC,iBAAkB,WAC5B,WAAY,uBACZ,aAAc,SACd,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,IAAI,EAAc,EAAM,GAAI,EAAc,EAAM,GAIhD,SAAS,IACP,OAAO,EAAiB,EAAM,iBAAiB,EACjD,CAMA,SAAS,EAAiB,EAAW,GACnC,OAAO,QAAQ,UAAU,GAAa,EAAM,MAAM,GAAa,CACjE,CAZA,EAAQ,KAAK,SAAS,IAAI,CAAC,QAAS,SAepC,EAAY,QAAU,WACpB,EAAQ,YAAY,EAAY,YAAa,QAAQ,OAAO,EAAY,YAAa,KACvF,EAGA,EAAQ,GAAG,EAAY,aAAa,WAC9B,EAAM,UAIV,EAAM,QAAO,WACX,EAAY,cAAc,EAAQ,SAAS,EAAY,aAnBlD,EAAiB,EAAM,kBAAkB,GAmB0C,KACxF,EAAY,SACd,GACF,GACF,EAEJ,IAEA,QAAQ,OAAO,wBAAyB,IAEvC,WAAW,wBAAyB,CAAC,SAAU,WAAY,YAAa,WAAY,WAAY,SAAS,EAAQ,EAAU,EAAW,EAAU,GAC/I,IAIE,EAAiB,EAJf,EAAO,KACT,EAAS,EAAK,OAAS,EAAO,OAAS,GACvC,EAAkB,qBAClB,EAAe,EAAO,OACM,EAAsB,GAEhD,GAAY,EA6KhB,SAAS,IACP,KAAO,EAAoB,QACzB,EAAoB,OAExB,CAUA,SAAS,EAAU,GACjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,EAAO,GAAG,MAAM,OAAS,IAAM,CAEnC,CAEA,SAAS,EAAO,EAAO,EAAO,GAC5B,IAAI,EAAJ,CAMA,GAFA,QAAQ,OAAO,EAAO,CAAC,UAAW,IAClC,QAAQ,OAAO,EAAO,GAAc,OAAS,CAAC,EAAG,CAAC,UAAW,IACzD,EAAS,QAAQ,KAAc,EAAO,oBACxC,EAAO,GAAO,SAAW,EAAK,OAAO,OAAS,EAAG,CACjD,EAAO,GAAO,QAAQ,KAAK,EAAiB,EAAM,WAClD,IAAI,EAAa,EAAK,kBAElB,QAAQ,SAAS,IAAe,EAAO,GAAY,SACrD,EAAO,GAAY,QAAQ,KAAK,EAAiB,EAAM,WAGzD,EAAO,oBAAqB,EAC5B,EAAS,GAAG,WAAY,EAAO,GAAO,SAAS,SAAS,EAAS,GAC/D,GAAc,UAAV,IACF,EAAO,mBAAqB,KAC5B,EAAS,IAAI,WAAY,GACrB,EAAoB,QAAQ,CAC9B,IAAI,EAAY,EAAoB,MAAM,MACtC,EAAY,EAAU,MACtB,EAAgB,EAAY,EAAK,kBAAoB,OAAS,OAClE,IAEA,EAAO,EAAW,EAAW,EAC/B,CAEJ,GACF,CAEA,EAAO,OAAS,EAAM,MACtB,EAAe,EAAM,MACrB,EAAU,GAGV,GAnCA,CAoCF,CAEA,SAAS,EAAe,GACtB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,GAAI,EAAO,GAAG,QAAU,EACtB,OAAO,CAGb,CAEA,SAAS,IACH,IACF,EAAU,OAAO,GACjB,EAAkB,KAEtB,CASA,SAAS,IACP,IACA,IAAI,GAAY,EAAO,UAClB,MAAM,IAAa,EAAW,IACjC,EAAkB,EAAU,EAAS,GAEzC,CAEA,SAAS,IACP,IAAI,GAAY,EAAO,SACnB,IAAc,MAAM,IAAa,EAAW,GAAK,EAAO,OAC1D,EAAO,OAEP,EAAO,OAEX,CA9QA,EAAS,SAAS,YAElB,EAAK,SAAW,SAAS,EAAO,GAC9B,EAAO,KAAK,CACV,MAAO,EACP,QAAS,IAEX,EAAO,MAAK,SAAS,EAAG,GACtB,OAAQ,EAAE,MAAM,OAAS,EAAE,MAAM,KACnC,KAEI,EAAM,QAAU,EAAO,QAA4B,IAAlB,EAAO,SAAiB,QAAQ,SAAS,EAAO,WAC/E,EAAO,qBACT,EAAO,mBAAqB,MAG9B,EAAe,EAAM,MACrB,EAAO,OAAS,EAAM,MACtB,EAAU,GACV,EAAK,OAAO,EAAO,EAAe,KACZ,IAAlB,EAAO,QACT,EAAO,OAGb,EAEA,EAAK,gBAAkB,WACrB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,GAAI,EAAO,GAAG,MAAM,QAAU,EAC5B,OAAO,CAGb,EAEA,EAAK,KAAO,EAAO,KAAO,WACxB,IAAI,GAAY,EAAK,kBAAoB,GAAK,EAAO,OAErD,GAAiB,IAAb,IAAkB,EAAO,SAK7B,OAAO,EAAK,OAAO,EAAO,GAAW,QAJnC,EAAO,OAKX,EAEA,EAAK,KAAO,EAAO,KAAO,WACxB,IAAI,EAAW,EAAK,kBAAoB,EAAI,EAAI,EAAO,OAAS,EAAI,EAAK,kBAAoB,EAE7F,IAAI,EAAO,UAAY,IAAa,EAAO,OAAS,EAKpD,OAAO,EAAK,OAAO,EAAO,GAAW,QAJnC,EAAO,OAKX,EAEA,EAAK,YAAc,SAAS,GAC1B,IAAI,EAAQ,EAAe,GAEvB,EAAgB,EAAoB,QAAQ,EAAO,KAChC,IAAnB,GACF,EAAoB,OAAO,EAAe,GAI5C,EAAO,OAAO,EAAO,GACjB,EAAO,OAAS,GAAK,IAAiB,EACpC,GAAS,EAAO,QAClB,EAAe,EAAO,OAAS,EAC/B,EAAO,OAAS,EAChB,EAAU,GACV,EAAK,OAAO,EAAO,EAAO,OAAS,MAEnC,EAAe,EACf,EAAO,OAAS,EAChB,EAAU,GACV,EAAK,OAAO,EAAO,KAEZ,EAAe,IACxB,IACA,EAAO,OAAS,GAII,IAAlB,EAAO,SACT,EAAe,KACf,EAAO,OAAS,KAChB,IAEJ,EAGA,EAAK,OAAS,EAAO,OAAS,SAAS,EAAW,GAChD,IAAI,EAAY,EAAe,EAAU,YAEvB,IAAd,IACF,EAAY,EAAY,EAAK,kBAAoB,OAAS,QAGxD,EAAU,MAAM,QAAU,GAC3B,EAAO,mBAEC,GAAa,EAAU,MAAM,QAAU,GAAgB,EAAO,oBACvE,EAAoB,KAAK,EAAO,IAFhC,EAAO,EAAU,MAAO,EAAW,EAIvC,EAGA,EAAO,aAAe,SAAS,GAC7B,OAAQ,EAAM,MAAM,KACtB,EAEA,EAAO,SAAW,SAAS,GACzB,OAAO,EAAO,SAAW,EAAM,MAAM,KACvC,EAEA,EAAO,eAAiB,WACtB,OAAyB,IAAlB,EAAO,QAAgB,EAAO,QACvC,EAEA,EAAO,eAAiB,WACtB,OAAO,EAAO,SAAW,EAAO,OAAS,GAAK,EAAO,QACvD,EAEA,EAAO,MAAQ,WACR,EAAO,UACV,GAAY,EACZ,IAEJ,EAEA,EAAO,KAAO,WACP,IACH,GAAY,EACZ,IAEJ,EAEA,EAAS,GAAG,aAAc,EAAO,OACjC,EAAS,GAAG,aAAc,EAAO,MAEjC,EAAO,IAAI,YAAY,WACrB,GAAY,EACZ,GACF,IAEA,EAAO,OAAO,gBAAgB,SAAS,GACrC,EAAS,QAAQ,GAAW,EAC9B,IAEA,EAAO,OAAO,WAAY,GAE1B,EAAO,iBAAiB,UAgGxB,SAAyB,GAClB,EAAO,SACV,EAAO,mBAAqB,KAC5B,IAEJ,IAnGA,EAAO,OAAO,UAAU,SAAS,GAC/B,GAAI,QAAQ,SAAS,IAAU,IAAiB,EAAO,CACrD,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,GAAI,EAAO,GAAG,MAAM,QAAU,EAAO,CACnC,EAAQ,EACR,KACF,CAGU,EAAO,KAEjB,EAAU,GACV,EAAK,OAAO,EAAO,IACnB,EAAe,EAEnB,CACF,GAqGF,IAEC,UAAU,eAAe,WACxB,MAAO,CACL,YAAY,EACZ,WAAY,wBACZ,aAAc,WACd,SAAU,IACV,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,qCAC9B,EACA,MAAO,CACL,OAAQ,IACR,SAAU,IACV,aAAc,IACd,QAAS,IACT,OAAQ,KAGd,IAEC,UAAU,WAAY,CAAC,WAAY,SAAS,GAC3C,MAAO,CACL,QAAS,eACT,SAAU,IACV,YAAY,EACZ,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,kCAC9B,EACA,MAAO,CACL,OAAQ,KACR,MAAO,MAET,KAAM,SAAU,EAAO,EAAS,EAAO,GACrC,EAAQ,SAAS,QACjB,EAAa,SAAS,EAAO,GAE7B,EAAM,IAAI,YAAY,WACpB,EAAa,YAAY,EAC3B,IAEA,EAAM,OAAO,UAAU,SAAS,GAC9B,EAAS,EAAS,WAAa,eAAe,EAAS,SACzD,GACF,EAEJ,IAEC,UAAU,QAAS,CAAC,cACrB,SAAS,GACP,IAAI,EAAkB,qBAEtB,SAAS,EAAY,EAAS,EAAW,GACvC,EAAQ,YAAY,GAChB,GACF,GAEJ,CAEA,MAAO,CACL,eAAgB,SAAS,EAAS,EAAW,GAC3C,GAAkB,WAAd,EAAwB,CAC1B,IACI,EAAY,EAAQ,KAAK,GACzB,EAA+B,SAAd,EAAuB,OAAS,QACjD,EAAgB,EAAY,KAAK,KAAM,EACzC,EAAiB,IAAM,EAAW,GAOpC,OANA,EAAQ,SAAS,GAEjB,EAAY,EAAS,CAAC,SAAU,IAC7B,QACA,KAAK,GAED,WACL,CACF,CACF,CACA,GACF,EACA,kBAAmB,SAAU,EAAS,EAAW,GAC/C,GAAkB,WAAd,EAAwB,CAC1B,IAEI,EAA+B,SADnB,EAAQ,KAAK,GACe,OAAS,QACjD,EAAgB,EAAY,KAAK,KAAM,EAAS,EAAgB,GAMpE,OAJA,EAAY,EAAS,CAAC,SAAU,IAC7B,QACA,KAAK,GAED,WACL,CACF,CACF,CACA,GACF,EAEJ,IAEA,QAAQ,OAAO,0BAA2B,IAEzC,QAAQ,gBAAiB,CAAC,OAAQ,UAAW,aAAc,gBAAiB,SAAS,EAAM,EAAS,EAAY,GAE/G,IAEI,EACA,EAHA,EAA4B,kCA2UhC,SAAS,EAA0B,EAAQ,EAAY,GACrD,OAAO,WACL,OAAO,EAAO,OAAO,EAAa,EAAG,EAAS,EAAa,EAC7D,CACF,CAEA,SAAS,EAA0B,EAAQ,GAEzC,IADA,IAAI,EAAgB,EAAO,OAAO,GACzB,EAAI,EAAG,EAAI,EAAkB,OAAQ,IAC5C,GAAI,IAAI,OAAO,IAAM,EAAkB,GAAG,KAAK,KAAK,GAAgB,CAClE,IAAI,EAAO,EAAkB,GAC7B,MAAO,CACL,OAAQ,EAAI,EAAK,IAAI,OACrB,OAAQ,EAAK,UAEjB,CAGF,MAAO,CACL,OAAQ,EAAI,EACZ,OAAQ,WACN,OAAO,EAAc,OAAO,EAC9B,EAEJ,CAoHA,SAAS,EAAM,GACb,OAAO,SAAS,EAAK,GACvB,CAiBA,SAAS,EAAiB,EAAU,GAClC,EAAW,EAAS,QAAQ,KAAM,IAClC,IAAI,EAA0B,KAAK,MAAM,yBAA2B,GAAY,IAChF,OAAO,MAAM,GAA2B,EAAW,CACrD,CAEA,SAAS,EAAe,EAAM,GAG5B,OAFA,EAAO,IAAI,KAAK,EAAK,YAChB,WAAW,EAAK,aAAe,GAC7B,CACT,CAEA,SAAS,EAAuB,EAAM,EAAU,GAC9C,EAAU,GAAW,EAAI,EACzB,IAAI,EAAqB,EAAK,oBAE9B,OAAO,EAAe,EAAM,GADP,EAAiB,EAAU,GACQ,GAC1D,CAtfA,KAAK,KAAO,WACV,EAAW,EAAQ,GAEnB,KAAK,QAAU,CAAC,EAChB,KAAK,WAAa,CAAC,EAEnB,EAAoB,CAClB,CACE,IAAK,OACL,MAAO,SACP,MAAO,SAAS,GAAS,KAAK,MAAQ,CAAO,EAC7C,UAAW,SAAS,GAClB,IAAI,EAAQ,IAAI,KAEhB,OADA,EAAM,YAAY,KAAK,IAAI,EAAK,gBACzB,EAAW,EAAO,OAC3B,GAEF,CACE,IAAK,KACL,MAAO,SACP,MAAO,SAAS,GAAS,GAAS,EAAO,KAAK,KAAO,EAAQ,GAAK,EAAQ,IAAO,EAAQ,IAAM,EAC/F,UAAW,SAAS,GAClB,IAAI,EAAQ,IAAI,KAEhB,OADA,EAAM,YAAY,KAAK,IAAI,EAAK,gBACzB,EAAW,EAAO,KAC3B,GAEF,CACE,IAAK,IACL,MAAO,WACP,MAAO,SAAS,GAAS,KAAK,MAAQ,CAAO,EAC7C,UAAW,SAAS,GAClB,IAAI,EAAQ,IAAI,KAEhB,OADA,EAAM,YAAY,KAAK,IAAI,EAAK,gBACzB,EAAW,EAAO,IAC3B,GAEF,CACE,IAAK,KACL,MAAO,iBACP,MAAO,SAAS,GAAS,KAAK,MAAQ,EAAQ,CAAG,EACjD,UAAW,SAAS,GAClB,IAAI,EAAQ,EAAK,WACjB,MAAI,UAAU,KAAK,GACV,EAAW,EAAM,MAGnB,EAAW,EAAM,IAC1B,GAEF,CACE,IAAK,OACL,MAAO,EAAQ,iBAAiB,MAAM,KAAK,KAC3C,MAAO,SAAS,GAAS,KAAK,MAAQ,EAAQ,iBAAiB,MAAM,QAAQ,EAAQ,EACrF,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,OAAS,GAE/D,CACE,IAAK,MACL,MAAO,EAAQ,iBAAiB,WAAW,KAAK,KAChD,MAAO,SAAS,GAAS,KAAK,MAAQ,EAAQ,iBAAiB,WAAW,QAAQ,EAAQ,EAC1F,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,MAAQ,GAE9D,CACE,IAAK,KACL,MAAO,gBACP,MAAO,SAAS,GAAS,KAAK,MAAQ,EAAQ,CAAG,EACjD,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,KAAO,GAE7D,CACE,IAAK,IACL,MAAO,eACP,MAAO,SAAS,GAAS,KAAK,MAAQ,EAAQ,CAAG,EACjD,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,IAAM,GAE5D,CACE,IAAK,KACL,MAAO,2BACP,MAAO,SAAS,GAAS,KAAK,MAAQ,CAAO,EAC7C,UAAW,SAAS,GAClB,IAAI,EAAQ,EAAK,UACjB,MAAI,UAAU,KAAK,GACV,EAAW,EAAM,MAGnB,EAAW,EAAM,IAC1B,GAEF,CACE,IAAK,KACL,MAAO,0BACP,MAAO,SAAS,GAAS,KAAK,MAAQ,CAAO,EAC7C,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,KAAO,GAE7D,CACE,IAAK,IACL,MAAO,2BACP,MAAO,SAAS,GAAS,KAAK,MAAQ,CAAO,EAC7C,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,IAAM,GAE5D,CACE,IAAK,OACL,MAAO,EAAQ,iBAAiB,IAAI,KAAK,KACzC,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,OAAS,GAE/D,CACE,IAAK,MACL,MAAO,EAAQ,iBAAiB,SAAS,KAAK,KAC9C,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,MAAQ,GAE9D,CACE,IAAK,KACL,MAAO,sBACP,MAAO,SAAS,GAAS,KAAK,OAAS,CAAO,EAC9C,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,KAAO,GAE7D,CACE,IAAK,KACL,MAAO,gBACP,MAAO,SAAS,GAAS,KAAK,OAAS,CAAO,EAC9C,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,KAAO,GAE7D,CACE,IAAK,IACL,MAAO,iBACP,MAAO,SAAS,GAAS,KAAK,OAAS,CAAO,EAC9C,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,IAAM,GAE5D,CACE,IAAK,IACL,MAAO,eACP,MAAO,SAAS,GAAS,KAAK,OAAS,CAAO,EAC9C,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,IAAM,GAE5D,CACE,IAAK,KACL,MAAO,aACP,MAAO,SAAS,GAAS,KAAK,SAAW,CAAO,EAChD,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,KAAO,GAE7D,CACE,IAAK,IACL,MAAO,mBACP,MAAO,SAAS,GAAS,KAAK,SAAW,CAAO,EAChD,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,IAAM,GAE5D,CACE,IAAK,MACL,MAAO,kBACP,MAAO,SAAS,GAAS,KAAK,cAAgB,CAAO,EACrD,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,MAAQ,GAE9D,CACE,IAAK,KACL,MAAO,aACP,MAAO,SAAS,GAAS,KAAK,SAAW,CAAO,EAChD,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,KAAO,GAE7D,CACE,IAAK,IACL,MAAO,mBACP,MAAO,SAAS,GAAS,KAAK,SAAW,CAAO,EAChD,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,IAAM,GAE5D,CACE,IAAK,IACL,MAAO,EAAQ,iBAAiB,MAAM,KAAK,KAC3C,MAAO,SAAS,GACK,KAAf,KAAK,QACP,KAAK,MAAQ,GAGD,OAAV,IACF,KAAK,OAAS,GAElB,EACA,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,IAAM,GAE5D,CACE,IAAK,IACL,MAAO,aACP,MAAO,SAAS,GACd,IAAI,EAAU,EAAM,MAAM,wBACxB,EAAO,EAAQ,GACf,EAAQ,EAAQ,GAChB,EAAU,EAAQ,GACpB,KAAK,OAAS,EAAM,EAAO,GAC3B,KAAK,SAAW,EAAM,EAAO,EAC/B,EACA,UAAW,SAAS,GAClB,OAAO,EAAW,EAAM,IAC1B,GAEF,CACE,IAAK,KACL,MAAO,oBACP,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,KAAO,GAE7D,CACE,IAAK,IACL,MAAO,0BACP,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,IAAM,GAE5D,CACE,IAAK,OACL,MAAO,EAAQ,iBAAiB,SAAS,KAAK,KAAK,QAAQ,MAAO,OAClE,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,OAAS,GAE/D,CACE,IAAK,MACL,MAAO,EAAQ,iBAAiB,KAAK,KAAK,KAC1C,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,MAAQ,GAE9D,CACE,IAAK,KACL,MAAO,EAAQ,iBAAiB,KAAK,KAAK,KAC1C,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,KAAO,GAE7D,CACE,IAAK,IACL,MAAO,EAAQ,iBAAiB,KAAK,KAAK,KAC1C,UAAW,SAAS,GAAQ,OAAO,EAAW,EAAM,IAAM,GAGhE,EAEA,KAAK,OA+HL,KAAK,OAAS,SAAS,EAAM,GAC3B,OAAK,QAAQ,OAAO,KAAS,MAAM,IAAU,GAI7C,EAAS,EAAQ,iBAAiB,IAAW,EAEzC,EAAQ,KAAO,GACjB,KAAK,OAGF,KAAK,WAAW,KACnB,KAAK,WAAW,GA5EpB,SAAyB,GAIvB,IAHA,IAEI,EAAW,EAFX,EAAa,GACb,EAAI,EAED,EAAI,EAAO,QAChB,GAAI,QAAQ,SAAS,GAArB,CACE,GAAyB,MAArB,EAAO,OAAO,IACZ,EAAI,GAAK,EAAO,QAAmC,MAAzB,EAAO,OAAO,EAAI,MAC9C,EAAW,KAAK,EAA0B,EAAQ,EAAY,IAC9D,EAAa,WAEV,GAAI,IAAM,EAAO,OACtB,KAAO,EAAa,EAAO,QACzB,EAAY,EAA0B,EAAQ,GAC9C,EAAW,KAAK,GAChB,EAAa,EAAU,OAI3B,GAEF,KAEyB,MAArB,EAAO,OAAO,IAMlB,EAAY,EAA0B,EAAQ,GAE9C,EAAW,KAAK,EAAU,QAC1B,EAAI,EAAU,SARZ,EAAa,EACb,KAUJ,OAAO,CACT,CAwC8B,CAAgB,IAG3B,KAAK,WAAW,GAEf,QAAO,SAAS,EAAK,GACrC,OAAO,EAAM,EAAU,EACzB,GAAG,KAjBM,EAkBX,EAEA,KAAK,MAAQ,SAAS,EAAO,EAAQ,GACnC,IAAK,QAAQ,SAAS,KAAW,EAC/B,OAAO,EAIT,GADA,EAAS,EAAQ,iBAAiB,IAAW,GAC7B,QAAQ,EAA2B,QAE/C,EAAQ,KAAO,GACjB,KAAK,OAGF,KAAK,QAAQ,KAChB,KAAK,QAAQ,GAhKjB,SAAsB,GACpB,IAAI,EAAM,GAAI,EAAQ,EAAO,MAAM,IAG/B,EAAa,EAAO,QAAQ,KAChC,GAAI,GAAc,EAAG,CACnB,IAAI,GAAY,EAChB,EAAS,EAAO,MAAM,IACtB,IAAK,IAAI,EAAI,EAAY,EAAI,EAAO,OAAQ,IACtC,GACgB,MAAd,EAAO,KACL,EAAI,EAAI,EAAO,QAA0B,MAAhB,EAAO,EAAE,IACpC,EAAO,EAAE,GAAK,IACd,EAAM,EAAE,GAAK,KAEb,EAAM,GAAK,GACX,GAAY,IAGhB,EAAO,GAAK,KAEM,MAAd,EAAO,KACT,EAAO,GAAK,IACZ,EAAM,GAAK,GACX,GAAY,GAKlB,EAAS,EAAO,KAAK,GACvB,CAyBA,OAvBA,QAAQ,QAAQ,GAAmB,SAAS,GAC1C,IAAI,EAAQ,EAAO,QAAQ,EAAK,KAEhC,GAAI,GAAS,EAAG,CACd,EAAS,EAAO,MAAM,IAEtB,EAAM,GAAS,IAAM,EAAK,MAAQ,IAClC,EAAO,GAAS,IAChB,IAAK,IAAI,EAAI,EAAQ,EAAG,EAAI,EAAQ,EAAK,IAAI,OAAQ,EAAI,EAAG,IAC1D,EAAM,GAAK,GACX,EAAO,GAAK,IAEd,EAAS,EAAO,KAAK,IAErB,EAAI,KAAK,CACP,MAAO,EACP,IAAK,EAAK,IACV,MAAO,EAAK,MACZ,QAAS,EAAK,OAElB,CACF,IAEO,CACL,MAAO,IAAI,OAAO,IAAM,EAAM,KAAK,IAAM,KACzC,IAAK,EAAc,EAAK,SAE5B,CAqG2B,CAAa,IAGtC,IAAI,EAAS,KAAK,QAAQ,GACtB,EAAQ,EAAO,MACf,EAAM,EAAO,IACb,EAAU,EAAM,MAAM,GACtB,GAAW,EACf,GAAI,GAAW,EAAQ,OAAQ,CAC7B,IAAI,EAAQ,EACR,QAAQ,OAAO,KAAc,MAAM,EAAS,WAC9C,EAAS,CACP,KAAM,EAAS,cACf,MAAO,EAAS,WAChB,KAAM,EAAS,UACf,MAAO,EAAS,WAChB,QAAS,EAAS,aAClB,QAAS,EAAS,aAClB,aAAc,EAAS,oBAGrB,GACF,EAAK,KAAK,cAAe,gCAE3B,EAAS,CAAE,KAAM,KAAM,MAAO,EAAG,KAAM,EAAG,MAAO,EAAG,QAAS,EAAG,QAAS,EAAG,aAAc,IAG5F,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,EAAI,EAAG,IAAK,CAC9C,IAAI,EAAS,EAAI,EAAI,GACE,MAAnB,EAAO,UACT,GAAW,GAGT,EAAO,OACT,EAAO,MAAM,KAAK,EAAQ,EAAQ,GAEtC,CAEA,IAAI,EAAa,EAAW,KAAK,UAAU,eACzC,KAAK,UAAU,YACb,EAAa,EAAW,KAAK,UAAU,YACzC,KAAK,UAAU,SAgBjB,OAMJ,SAAiB,EAAM,EAAO,GAC5B,GAAI,EAAO,EACT,OAAO,EAGT,GAAc,IAAV,GAAe,EAAO,GACxB,OAAgB,KAAT,IAAgB,EAAO,GAAM,GAAK,EAAO,KAAQ,GAAK,EAAO,KAAQ,GAG9E,GAAc,IAAV,GAAyB,IAAV,GAAyB,IAAV,GAAyB,KAAV,EAC/C,OAAO,EAAO,GAGhB,OAAO,CACT,CAlCQ,CAAQ,EAAO,KAAM,EAAO,MAAO,EAAO,SACxC,QAAQ,OAAO,IAAc,MAAM,EAAS,YAAe,GAM7D,EAAK,IAAI,KAAK,GACd,EAAW,KAAK,EAAI,EAAO,KAAM,EAAO,MAAO,EAAO,MACtD,EAAW,KAAK,EAAI,EAAO,OAAS,EAAG,EAAO,SAAW,EACvD,EAAO,SAAW,EAAG,EAAO,cAAgB,KAR9C,EAAK,IAAI,KAAK,GACd,EAAW,KAAK,EAAI,EAAO,KAAM,EAAO,MAAO,EAAO,MACtD,EAAW,KAAK,EAAI,EAAO,MAAO,EAAO,QACvC,EAAO,QAAS,EAAO,gBAStB,CACT,CACF,EAwBA,KAAK,WAML,SAAoB,EAAM,GACxB,OAAO,GAAQ,EAAW,EAAuB,EAAM,GAAY,CACrE,EAPA,KAAK,aASL,SAAsB,EAAM,GAC1B,OAAO,GAAQ,EAAW,EAAuB,EAAM,GAAU,GAAQ,CAC3E,EAVA,KAAK,iBAAmB,EACxB,KAAK,eAAiB,EACtB,KAAK,uBAAyB,CA6BhC,IAIA,QAAQ,OAAO,uBAAwB,IACtC,UAAU,aAAc,CAChB,WACT,SAAU,GAER,IAAI,EAAY,uCAEZ,EAAY,wCAIhB,MAAO,CACL,SAAU,IACV,QAAS,SAAS,EAAU,GAC1B,IAAI,EAAe,GACf,EAAY,GACZ,EAAY,CAAC,EAEb,EAAe,EAAO,WAAW,MAAM,GACvC,EAAQ,EAAa,GAErB,EADU,EAAa,GACR,MAAM,KAEzB,OAEA,SAAgB,EAAO,EAAS,GAC9B,EAAa,KAAK,GAClB,EAAU,KAAK,CACb,MAAO,EACP,QAAS,IAGX,EAAK,SAAQ,SAAS,EAAK,IAO7B,SAAmB,EAAK,GACtB,IAAI,EAAU,EAAI,MAAM,GACpB,EAAQ,EAAM,MAAM,EAAQ,IAC5B,EAAiB,EAAQ,GACzB,EAAO,EAAU,GACrB,IAAK,EAAM,CACT,IAAI,EAAU,SAAS,GACrB,IAAI,EAAe,KACnB,EAAU,MAAK,SAAS,GAEtB,GADc,EAAS,MAAM,MAAM,KACnB,EAEd,OADA,EAAe,GACR,CAEX,IACI,EAAK,gBAAkB,IACrB,EAAK,eACP,EAAS,YAAY,EAAK,cAAc,QAAS,GAE/C,GACF,EAAS,SAAS,EAAa,QAAS,GAE1C,EAAK,cAAgB,EAEzB,EACA,EAAU,GAAO,EAAO,CACtB,cAAe,KACf,MAAO,EACP,QAAS,EACT,eAAgB,EAChB,QAAS,EAAM,OAAO,EAAgB,GAE1C,CACA,EAAK,QAAQ,EAAM,MAAM,GAC3B,CAxCI,CAAU,EAAK,EACjB,IAEA,EAAM,IAAI,WAAY,EACxB,EAsCA,SAAS,EAAY,GACnB,IAAI,EAAe,EAAE,YACjB,EAAQ,EAAa,QAAQ,GAGjC,GAFA,EAAa,OAAO,EAAO,GAC3B,EAAU,OAAO,EAAO,GACpB,EAAa,OAAQ,CACvB,IAAI,EAAgB,EAAa,GACjC,QAAQ,QAAQ,GAAW,SAAS,GAC9B,EAAK,QAAU,IACjB,EAAK,QAAU,EAAc,OAAO,EAAK,eAAgB,EAAK,SAC9D,EAAK,MAAQ,EAEjB,GACF,MACE,EAAY,CAAC,CAEjB,CACF,EAEJ,IACA,QAAQ,OAAO,0BAA2B,CAAC,0BAA2B,yBAErE,MAAM,4BAA4B,GAElC,MAAM,6BAA6B,GAEnC,SAAS,sBAAuB,CAC/B,eAAgB,MAChB,UAAW,KACX,YAAa,OACb,WAAY,OACZ,gBAAiB,MACjB,eAAgB,YAChB,iBAAkB,OAClB,QAAS,KACT,QAAS,OACT,QAAS,KACT,QAAS,MACT,aAAc,EACd,eAAgB,CAAC,EACjB,qBAAqB,EACrB,WAAW,EACX,YAAa,EACb,SAAU,IAGX,WAAW,0BAA2B,CAAC,SAAU,WAAY,SAAU,SAAU,eAAgB,UAAW,OAAQ,aAAc,sBAAuB,4BAA6B,2BAA4B,gBACjN,SAAS,EAAQ,EAAU,EAAQ,EAAQ,EAAc,EAAS,EAAM,EAAY,EAAkB,EAA2B,EAA0B,GAC3J,IAAI,EAAO,KACP,EAAc,CAAE,cAAe,QAAQ,MACvC,EAAiB,CAAC,EAClB,EAAiB,GAErB,EAAS,SAAS,kBAClB,EAAO,KAAK,OAAQ,eAEf,EAAO,oBACV,EAAO,kBAAoB,CAAC,GAI9B,KAAK,MAAQ,CAAC,MAAO,QAAS,QAE9B,CACE,cACA,eACA,iBACA,YACA,kBACA,iBACA,cACA,mBACA,aACA,UACA,UACA,UACA,UACA,eACA,YACA,sBACA,cACA,cACA,YACA,SAAQ,SAAS,GACjB,OAAQ,GACN,IAAK,cACL,IAAK,eACH,EAAO,GAAO,EAAO,kBAAkB,IAAQ,QAAQ,KACvD,MACF,IAAK,iBACH,EAAO,eAAiB,QAAQ,UAAU,EAAO,kBAAkB,gBACjE,EAAO,kBAAkB,eAAiB,EAAiB,eAC7D,MACF,IAAK,YACL,IAAK,kBACL,IAAK,iBACL,IAAK,cACL,IAAK,mBACL,IAAK,aACH,EAAK,GAAO,QAAQ,UAAU,EAAO,kBAAkB,IACrD,EAAa,EAAO,kBAAkB,GAAtC,CAA4C,EAAO,SACnD,EAAiB,GACnB,MACF,IAAK,eACL,IAAK,YACL,IAAK,sBACL,IAAK,cACL,IAAK,WACH,EAAK,GAAO,QAAQ,UAAU,EAAO,kBAAkB,IACrD,EAAO,kBAAkB,GAAO,EAAiB,GACnD,MACF,IAAK,cACC,QAAQ,UAAU,EAAO,kBAAkB,aAC7C,EAAK,YAAc,EAAO,kBAAkB,YACnC,QAAQ,SAAS,EAAiB,aAC3C,EAAK,YAAc,EAAiB,YAEpC,EAAK,aAAe,EAAQ,iBAAiB,eAAiB,GAAK,EAGrE,MACF,IAAK,UACL,IAAK,UACH,EAAO,OAAO,qBAAuB,GAAK,SAAS,GAC7C,EACE,QAAQ,OAAO,GACjB,EAAK,GAAO,EAAW,aAAa,IAAI,KAAK,GAAQ,EAAe,WAEhE,GACF,EAAK,KAAK,gFAGZ,EAAK,GAAO,IAAI,KAAK,EAAW,EAAO,YAGzC,EAAK,GAAO,EAAiB,GAC3B,EAAW,aAAa,IAAI,KAAK,EAAiB,IAAO,EAAe,UACxE,KAGJ,EAAK,aACP,IAEA,MACF,IAAK,UACL,IAAK,UACC,EAAO,kBAAkB,GAC3B,EAAO,QAAO,WAAa,OAAO,EAAO,kBAAkB,EAAM,IAAG,SAAS,GAC3E,EAAK,GAAO,EAAO,GAAO,QAAQ,UAAU,GAAS,EAAQ,EAAO,kBAAkB,IAC1E,YAAR,GAAqB,EAAK,MAAM,QAAQ,EAAO,kBAAkB,gBAAkB,EAAK,MAAM,QAAQ,EAAK,KACrG,YAAR,GAAqB,EAAK,MAAM,QAAQ,EAAO,kBAAkB,gBAAkB,EAAK,MAAM,QAAQ,EAAK,OAC3G,EAAO,eAAiB,EAAK,GAC7B,EAAO,kBAAkB,eAAiB,EAAK,GAEnD,IAEA,EAAK,GAAO,EAAO,GAAO,EAAiB,IAAQ,KAK3D,IAEA,EAAO,SAAW,cAAgB,EAAO,IAAM,IAAM,KAAK,MAAsB,IAAhB,KAAK,UAErE,EAAO,SAAW,QAAQ,UAAU,EAAO,YAAa,EACpD,QAAQ,UAAU,EAAO,aAC3B,EAAe,KAAK,EAAO,QAAQ,OAAO,EAAO,YAAY,SAAS,GACpE,EAAO,SAAW,EAClB,EAAK,aACP,KAGF,EAAO,SAAW,SAAS,GACzB,OAAuD,IAAnD,EAAK,QAAQ,EAAW,KAAM,EAAK,cACrC,EAAO,aAAe,EAAW,KAC1B,EAGX,EAEA,KAAK,KAAO,SAAS,GACnB,EAAc,EACd,EAAiB,EAAa,UAC5B,EAAO,kBAAkB,gBACzB,EAAiB,eACf,EAAO,kBAAkB,UAC3B,EAAK,WAAa,EAAW,aAAa,EAAO,kBAAkB,SAAU,EAAe,WAAa,IAAI,KAC7G,EAAO,OAAO,8BAA8B,SAAS,GAC/C,IAAa,EAAY,SAAS,EAAY,cAAgB,EAAY,YAC5E,EAAK,WAAa,EAAW,aAAa,EAAU,EAAe,UACnE,EAAK,cAET,KAEA,EAAK,WAAa,IAAI,KAGxB,IAAI,EAAO,EAAY,YAAc,IAAI,KAAK,EAAY,aAAe,IAAI,KAC7E,KAAK,WAAc,MAAM,GAEvB,EAAW,aAAa,IAAI,KAAQ,EAAe,UADnD,EAAW,aAAa,EAAM,EAAe,UAG/C,EAAY,QAAU,WACpB,EAAK,QACP,CACF,EAEA,KAAK,OAAS,WACZ,GAAI,EAAY,WAAY,CAC1B,IAAI,EAAO,IAAI,KAAK,EAAY,aACjB,MAAM,GAGnB,KAAK,WAAa,EAAW,aAAa,EAAM,EAAe,UACrD,GACV,EAAK,MAAM,+DAEf,CACA,KAAK,aACP,EAEA,KAAK,YAAc,WACjB,GAAI,KAAK,QAAS,CAChB,EAAO,WAAa,KACpB,KAAK,eACD,EAAO,WACT,EAAO,aAAe,EAAO,SAAS,KAGxC,IAAI,EAAO,EAAY,WAAa,IAAI,KAAK,EAAY,YAAc,KACvE,EAAO,EAAW,aAAa,EAAM,EAAe,UACpD,EAAY,aAAa,gBAAiB,GACxC,KAAK,UAAY,KAAK,WAAW,GACrC,CACF,EAEA,KAAK,iBAAmB,SAAS,EAAM,GACrC,IAAI,EAAQ,EAAY,WAAa,IAAI,KAAK,EAAY,YAAc,KACxE,EAAQ,EAAW,aAAa,EAAO,EAAe,UACtD,IAAI,EAAQ,IAAI,KAChB,EAAQ,EAAW,aAAa,EAAO,EAAe,UACtD,IAAI,EAAO,KAAK,QAAQ,EAAM,GAC1B,EAAK,CACP,KAAM,EACN,MAAO,EAAW,OAAO,EAAM,GAC/B,SAAU,GAAuC,IAA9B,KAAK,QAAQ,EAAM,GACtC,SAAU,KAAK,WAAW,GAC1B,KAAM,EAAO,EACb,QAAkB,IAAT,EACT,OAAQ,EAAO,EACf,YAAa,KAAK,YAAY,IAAS,MAWzC,OARI,GAAuC,IAA9B,KAAK,QAAQ,EAAM,KAC9B,EAAO,WAAa,GAGlB,EAAK,YAAyD,IAA3C,KAAK,QAAQ,EAAG,KAAM,EAAK,cAChD,EAAO,SAAW,GAGb,CACT,EAEA,KAAK,WAAa,SAAS,GACzB,OAAO,EAAO,UACZ,KAAK,SAAW,KAAK,QAAQ,EAAM,KAAK,SAAW,GACnD,KAAK,SAAW,KAAK,QAAQ,EAAM,KAAK,SAAW,GACnD,EAAO,cAAgB,EAAO,aAAa,CAAC,KAAM,EAAM,KAAM,EAAO,gBACzE,EAEA,KAAK,YAAc,SAAS,GAC1B,OAAO,EAAO,YAAY,CAAC,KAAM,EAAM,KAAM,EAAO,gBACtD,EAGA,KAAK,MAAQ,SAAS,EAAK,GAEzB,IADA,IAAI,EAAS,GACN,EAAI,OAAS,GAClB,EAAO,KAAK,EAAI,OAAO,EAAG,IAE5B,OAAO,CACT,EAEA,EAAO,OAAS,SAAS,GACvB,GAAI,EAAO,iBAAmB,EAAK,QAAS,CAC1C,IAAI,EAAK,EAAY,WAAa,EAAW,aAAa,IAAI,KAAK,EAAY,YAAa,EAAe,UAAY,IAAI,KAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAClJ,EAAG,YAAY,EAAK,cAAe,EAAK,WAAY,EAAK,WACzD,EAAK,EAAW,WAAW,EAAI,EAAe,UAC9C,EAAY,cAAc,GAC1B,EAAY,SACd,MACE,EAAK,WAAa,EAClB,EAAQ,EAAK,MAAM,EAAK,MAAM,QAAQ,EAAO,gBAAkB,IAE/D,EAAO,MAAM,uBAGf,EAAO,WAAW,uBACpB,EAEA,EAAO,KAAO,SAAS,GACrB,IAAI,EAAO,EAAK,WAAW,cAAgB,GAAa,EAAK,KAAK,OAAS,GACvE,EAAQ,EAAK,WAAW,WAAa,GAAa,EAAK,KAAK,QAAU,GAC1E,EAAK,WAAW,YAAY,EAAM,EAAO,GACzC,EAAK,aACP,EAEA,EAAO,WAAa,SAAS,GAC3B,EAAY,GAAa,EAErB,EAAO,iBAAmB,EAAK,SAAyB,IAAd,GAC5C,EAAO,iBAAmB,EAAK,UAA0B,IAAf,IAI5C,EAAQ,EAAK,MAAM,EAAK,MAAM,QAAQ,EAAO,gBAAkB,IAE/D,EAAO,MAAM,uBACf,EAGA,EAAO,KAAO,CAAE,GAAI,QAAS,GAAI,QAAS,GAAI,SAAU,GAAI,WAAY,GAAI,MAAO,GAAI,OAAQ,GAAI,OAAQ,GAAI,KAAM,GAAI,QAAS,GAAI,QA+CtI,SAAS,EAAQ,GACf,EAAO,eAAiB,EACxB,EAAO,kBAAkB,eAAiB,CAC5C,CA3CA,EAAO,IAAI,wBALQ,WACjB,EAAK,QAAQ,GAAG,OAClB,IAKA,EAAO,QAAU,SAAS,GACxB,IAAI,EAAM,EAAO,KAAK,EAAI,OAE1B,GAAK,IAAO,EAAI,WAAY,EAAI,SAAU,EAAO,SASjD,GALA,EAAI,iBACC,EAAK,qBACR,EAAI,kBAGM,UAAR,GAA2B,UAAR,EAAiB,CACtC,GAAI,EAAK,WAAW,EAAK,YACvB,OAEF,EAAO,OAAO,EAAK,WACrB,MAAW,EAAI,SAAoB,OAAR,GAAwB,SAAR,GAGzC,EAAK,cAAc,EAAK,GACxB,EAAK,eAHL,EAAO,WAAmB,OAAR,EAAe,GAAK,EAK1C,EAEA,EAAS,GAAG,WAAW,SAAS,GAC9B,EAAO,QAAO,WACZ,EAAO,QAAQ,EACjB,GACF,IAEA,EAAO,IAAI,YAAY,WAErB,KAAO,EAAe,QACpB,EAAe,OAAf,EAEJ,GAMF,IAEC,WAAW,yBAA0B,CAAC,SAAU,WAAY,aAAc,SAAS,EAAO,EAAU,GACnG,IAAI,EAAgB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAIjE,SAAS,EAAe,EAAM,GAC5B,OAAiB,IAAV,GAAe,EAAO,GAAM,GAChC,EAAO,KAAQ,GAAK,EAAO,KAAQ,EAAU,EAAc,GAAnB,EAC7C,CAyEA,SAAS,EAAqB,GAC5B,IAAI,EAAY,IAAI,KAAK,GACzB,EAAU,QAAQ,EAAU,UAAY,GAAK,EAAU,UAAY,IACnE,IAAI,EAAO,EAAU,UAGrB,OAFA,EAAU,SAAS,GACnB,EAAU,QAAQ,GACX,KAAK,MAAM,KAAK,OAAO,EAAO,GAAa,OAAY,GAAK,CACrE,CArFA,KAAK,KAAO,CAAE,OAAQ,GACtB,KAAK,QAAU,EAMf,KAAK,KAAO,SAAS,GACnB,QAAQ,OAAO,EAAM,MACrB,EAAM,UAAY,EAAK,UACvB,EAAK,aACP,EAEA,KAAK,SAAW,SAAS,EAAW,GAElC,IADA,IAAgE,EAA5D,EAAQ,IAAI,MAAM,GAAI,EAAU,IAAI,KAAK,GAAY,EAAI,EACtD,EAAI,GACT,EAAO,IAAI,KAAK,GAChB,EAAM,KAAO,EACb,EAAQ,QAAQ,EAAQ,UAAY,GAEtC,OAAO,CACT,EAEA,KAAK,aAAe,WAClB,IAAI,EAAO,KAAK,WAAW,cACzB,EAAQ,KAAK,WAAW,WACxB,EAAkB,IAAI,KAAK,KAAK,YAElC,EAAgB,YAAY,EAAM,EAAO,GAEzC,IAAI,EAAa,KAAK,YAAc,EAAgB,SAClD,EAAgC,EAAa,EAC3C,EAAI,GAAe,EACrB,EAAY,IAAI,KAAK,GAEnB,EAAgC,GAClC,EAAU,QAAyC,EAAhC,GAKrB,IADA,IAAI,EAAO,KAAK,SAAS,EAAW,IAC3B,EAAI,EAAG,EAAI,GAAI,IACtB,EAAK,GAAK,QAAQ,OAAO,KAAK,iBAAiB,EAAK,GAAI,KAAK,WAAY,CACvE,UAAW,EAAK,GAAG,aAAe,EAClC,IAAK,EAAM,SAAW,IAAM,IAIhC,EAAM,OAAS,IAAI,MAAM,GACzB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IACrB,EAAM,OAAO,GAAK,CAChB,KAAM,EAAW,EAAK,GAAG,KAAM,KAAK,iBACpC,KAAM,EAAW,EAAK,GAAG,KAAM,SAOnC,GAHA,EAAM,MAAQ,EAAW,KAAK,WAAY,KAAK,gBAC/C,EAAM,KAAO,KAAK,MAAM,EAAM,GAE1B,EAAM,UAAW,CACnB,EAAM,YAAc,GAGpB,IAFA,IAAI,GAAiB,GAAQ,KAAK,aAAe,EAC7C,EAAW,EAAM,KAAK,OACjB,EAAU,EAAG,EAAU,EAAU,IACxC,EAAM,YAAY,KAChB,EAAqB,EAAM,KAAK,GAAS,GAAe,MAE9D,CACF,EAEA,KAAK,QAAU,SAAS,EAAO,GAC7B,IAAI,EAAS,IAAI,KAAK,EAAM,cAAe,EAAM,WAAY,EAAM,WAC/D,EAAS,IAAI,KAAK,EAAM,cAAe,EAAM,WAAY,EAAM,WAGnE,OAFA,EAAO,YAAY,EAAM,eACzB,EAAO,YAAY,EAAM,eAClB,EAAS,CAClB,EAWA,KAAK,cAAgB,SAAS,EAAK,GACjC,IAAI,EAAO,KAAK,WAAW,UAE3B,GAAY,SAAR,EACF,GAAc,OACT,GAAY,OAAR,EACT,GAAc,OACT,GAAY,UAAR,EACT,GAAc,OACT,GAAY,SAAR,EACT,GAAc,OACT,GAAY,WAAR,GAA4B,aAAR,EAAoB,CACjD,IAAI,EAAQ,KAAK,WAAW,YAAsB,WAAR,GAAqB,EAAI,GACnE,KAAK,WAAW,SAAS,EAAO,GAChC,EAAO,KAAK,IAAI,EAAe,KAAK,WAAW,cAAe,KAAK,WAAW,YAAa,EAC7F,KAAmB,SAAR,EACT,EAAO,EACU,QAAR,IACT,EAAO,EAAe,KAAK,WAAW,cAAe,KAAK,WAAW,aAEvE,KAAK,WAAW,QAAQ,EAC1B,CACF,IAEC,WAAW,2BAA4B,CAAC,SAAU,WAAY,aAAc,SAAS,EAAO,EAAU,GACrG,KAAK,KAAO,CAAE,MAAO,GACrB,KAAK,QAAU,EAEf,KAAK,KAAO,SAAS,GACnB,QAAQ,OAAO,EAAM,MACrB,EAAK,aACP,EAEA,KAAK,aAAe,WAKlB,IAJA,IAEI,EAFA,EAAS,IAAI,MAAM,IACnB,EAAO,KAAK,WAAW,cAGlB,EAAI,EAAG,EAAI,GAAI,KACtB,EAAO,IAAI,KAAK,KAAK,aAChB,YAAY,EAAM,EAAG,GAC1B,EAAO,GAAK,QAAQ,OAAO,KAAK,iBAAiB,EAAM,KAAK,aAAc,CACxE,IAAK,EAAM,SAAW,IAAM,IAIhC,EAAM,MAAQ,EAAW,KAAK,WAAY,KAAK,kBAC/C,EAAM,KAAO,KAAK,MAAM,EAAQ,KAAK,cACrC,EAAM,kBAAoB,KAAK,aAAe,EAAI,KAAK,aAAe,EAAI,CAC5E,EAEA,KAAK,QAAU,SAAS,EAAO,GAC7B,IAAI,EAAS,IAAI,KAAK,EAAM,cAAe,EAAM,YAC7C,EAAS,IAAI,KAAK,EAAM,cAAe,EAAM,YAGjD,OAFA,EAAO,YAAY,EAAM,eACzB,EAAO,YAAY,EAAM,eAClB,EAAS,CAClB,EAEA,KAAK,cAAgB,SAAS,EAAK,GACjC,IAAI,EAAO,KAAK,WAAW,WAE3B,GAAY,SAAR,EACF,GAAc,OACT,GAAY,OAAR,EACT,GAAc,KAAK,kBACd,GAAY,UAAR,EACT,GAAc,OACT,GAAY,SAAR,EACT,GAAc,KAAK,kBACd,GAAY,WAAR,GAA4B,aAAR,EAAoB,CACjD,IAAI,EAAO,KAAK,WAAW,eAAyB,WAAR,GAAqB,EAAI,GACrE,KAAK,WAAW,YAAY,EAC9B,KAAmB,SAAR,EACT,EAAO,EACU,QAAR,IACT,EAAO,IAET,KAAK,WAAW,SAAS,EAC3B,CACF,IAEC,WAAW,0BAA2B,CAAC,SAAU,WAAY,aAAc,SAAS,EAAO,EAAU,GACpG,IAAI,EAAS,EAGb,SAAS,EAAgB,GACvB,OAAO,UAAU,EAAO,GAAK,EAAO,IAAM,EAAQ,CACpD,CAJA,KAAK,QAAU,EAMf,KAAK,eAAiB,WACpB,EAAU,KAAK,YACf,EAAQ,KAAK,SAAW,EACxB,KAAK,KAAO,CAAE,MAAO,EACvB,EAEA,KAAK,aAAe,WAGlB,IAFA,IAA8B,EAA1B,EAAQ,IAAI,MAAM,GAEb,EAAI,EAAG,EAAQ,EAAgB,KAAK,WAAW,eAAgB,EAAI,EAAO,KACjF,EAAO,IAAI,KAAK,KAAK,aAChB,YAAY,EAAQ,EAAG,EAAG,GAC/B,EAAM,GAAK,QAAQ,OAAO,KAAK,iBAAiB,EAAM,KAAK,YAAa,CACtE,IAAK,EAAM,SAAW,IAAM,IAIhC,EAAM,MAAQ,CAAC,EAAM,GAAG,MAAO,EAAM,EAAQ,GAAG,OAAO,KAAK,OAC5D,EAAM,KAAO,KAAK,MAAM,EAAO,GAC/B,EAAM,QAAU,CAClB,EAEA,KAAK,QAAU,SAAS,EAAO,GAC7B,OAAO,EAAM,cAAgB,EAAM,aACrC,EAEA,KAAK,cAAgB,SAAS,EAAK,GACjC,IAAI,EAAO,KAAK,WAAW,cAEf,SAAR,EACF,GAAc,EACG,OAAR,EACT,GAAc,EACG,UAAR,EACT,GAAc,EACG,SAAR,EACT,GAAc,EACG,WAAR,GAA4B,aAAR,EAC7B,IAAiB,WAAR,GAAqB,EAAI,GAAK,EACtB,SAAR,EACT,EAAO,EAAgB,KAAK,WAAW,eACtB,QAAR,IACT,EAAO,EAAgB,KAAK,WAAW,eAAiB,EAAQ,GAElE,KAAK,WAAW,YAAY,EAC9B,CACF,IAEC,UAAU,iBAAiB,WAC1B,MAAO,CACL,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,yCAC9B,EACA,MAAO,CACL,kBAAmB,MAErB,QAAS,CAAC,gBAAiB,YAC3B,SAAU,IACV,WAAY,0BACZ,aAAc,aACd,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,IAAI,EAAiB,EAAM,GAAI,EAAc,EAAM,GAEnD,EAAe,KAAK,EACtB,EAEJ,IAEC,UAAU,gBAAgB,WACzB,MAAO,CACL,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,kCAC9B,EACA,QAAS,CAAC,iBAAkB,gBAC5B,SAAU,IACV,WAAY,yBACZ,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,IAAI,EAAiB,EAAM,GACT,EAAM,GAEV,KAAK,EACrB,EAEJ,IAEC,UAAU,kBAAkB,WAC3B,MAAO,CACL,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,oCAC9B,EACA,QAAS,CAAC,iBAAkB,kBAC5B,SAAU,IACV,WAAY,2BACZ,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,IAAI,EAAiB,EAAM,GACP,EAAM,GAEV,KAAK,EACvB,EAEJ,IAEC,UAAU,iBAAiB,WAC1B,MAAO,CACL,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,mCAC9B,EACA,QAAS,CAAC,iBAAkB,iBAC5B,SAAU,IACV,WAAY,0BACZ,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,IAAI,EAAO,EAAM,GACjB,QAAQ,OAAO,EAAM,EAAM,IAC3B,EAAK,iBAEL,EAAK,aACP,EAEJ,IAEA,QAAQ,OAAO,wBAAyB,IAQrC,QAAQ,eAAgB,CAAC,YAAa,UAAW,SAAS,EAAW,GAKpE,IAAI,EAKA,EACA,EAAiB,CACnB,OAAQ,gBACR,OAAQ,wBAEN,EAAkB,CACpB,KAAM,eACN,QAAS,4BACT,UAAW,mCACX,SAAU,kBAER,EAAa,cAEjB,MAAO,CASL,WAAY,SAAS,GACnB,OAAO,EAAK,SAAW,EAAO,EAAK,IAAM,CAC3C,EAUA,WAAY,SAAS,GAEnB,OADA,EAAQ,WAAW,GACZ,SAAS,GAAS,EAAQ,CACnC,EASA,aAAc,SAAS,GAGrB,IAE4B,EAFxB,GAFJ,EAAO,KAAK,WAAW,IAEC,cAAgB,EAAU,GAAG,gBAMrD,KAAO,GAAgB,IAAiB,EAAU,GAAG,kBAJzB,EAI+D,EAH1B,YAAvD,EAAQ,iBAAiB,GAAI,UAAY,YAIjD,EAAe,EAAa,aAG9B,OAAO,GAAgB,EAAU,GAAG,eACtC,EAUA,eAAgB,SAAS,GACvB,GAAI,EAAQ,CACV,GAAI,QAAQ,YAAY,GAAuB,CAC7C,IAAI,EAAW,EAAU,KAAK,QAC9B,EAAS,SAAS,uCAClB,EAAuB,EAAQ,WAAa,EAAS,GAAG,YACxD,EAAuB,SAAS,GAAwB,EAAuB,EAC/E,EAAS,YAAY,sCACvB,CACA,OAAO,CACT,CAEA,GAAI,QAAQ,YAAY,GAAkB,CACxC,IAAI,EAAa,QAAQ,QAAQ,sDACjC,EAAU,KAAK,QAAQ,OAAO,GAC9B,EAAkB,EAAW,GAAG,YAAc,EAAW,GAAG,YAC5D,EAAkB,SAAS,GAAmB,EAAkB,EAChE,EAAW,QACb,CAEA,OAAO,CACT,EAgBA,iBAAkB,SAAS,GACzB,EAAO,KAAK,WAAW,GAEvB,IAAI,EAAY,EAAQ,iBAAiB,GACrC,EAAe,KAAK,WAAW,EAAU,cACzC,EAAgB,KAAK,WAAW,EAAU,eAC1C,EAAe,KAAK,aAAa,GAAM,GAAO,GAC9C,EAAiB,KAAK,eAAe,EAAc,EAAW,KAAK,EAAa,UAEpF,MAAO,CACL,eAAgB,EAChB,cAAe,EAAa,YAAc,EAAa,YACvD,MAAO,EAAe,EACtB,cAAe,EACf,eAAgB,EAAa,aAAe,EAAa,aACzD,OAAQ,EAAgB,EACxB,eAAgB,EAEpB,EAWA,aAAc,SAAS,EAAM,GAC3B,EAAO,KAAK,WAAW,GAEvB,IAAI,EAAgB,EAAgB,EAAe,OAAS,EAAe,OACvE,EAAY,EAAQ,iBAAiB,GACzC,OAAO,EAAc,KAAK,EAAU,SAAW,EAAU,UAAY,EAAU,UACjF,EAeA,aAAc,SAAS,EAAM,EAAe,GAC1C,EAAO,KAAK,WAAW,GAEvB,IAAI,EAAgB,EAAgB,EAAe,OAAS,EAAe,OACvE,EAAa,EAAU,GAAG,gBAC1B,EAAY,EAAQ,iBAAiB,GACzC,GAAI,GAAe,EAAc,KAAK,EAAU,SAAW,EAAU,UAAY,EAAU,WACzF,OAAO,EAET,IAAI,EAAuC,aAAvB,EAAU,SAC1B,EAAe,EAAK,eAAiB,EAEzC,GAAI,IAAiB,GAAqC,UAAvB,EAAU,SAC3C,OAAO,EAGT,KAAO,EAAa,eAAiB,IAAiB,GAAY,CAChE,IAAI,EAAU,EAAQ,iBAAiB,GAKvC,GAJI,GAAsC,WAArB,EAAQ,WAC3B,GAAgB,IAGb,GAAiB,EAAc,KAAK,EAAQ,SAAW,EAAQ,UAAY,EAAQ,WACtF,MAEF,EAAe,EAAa,aAC9B,CAEA,OAAO,CACT,EAmBA,SAAU,SAAS,EAAM,GACvB,EAAO,KAAK,WAAW,GAEvB,IAAI,EAAa,KAAK,OAAO,GAC7B,GAAI,EAAe,CACjB,IAAI,EAAY,EAAQ,iBAAiB,GACzC,EAAW,KAAO,KAAK,WAAW,EAAU,WAC5C,EAAW,MAAQ,KAAK,WAAW,EAAU,WAC/C,CACA,IAAI,EAAS,KAAK,aAAa,GAC3B,EAAe,CAAC,IAAK,EAAG,KAAM,GAQlC,OANI,IAAW,EAAU,GAAG,mBAC1B,EAAe,KAAK,OAAO,IACd,KAAO,EAAO,UAAY,EAAO,UAC9C,EAAa,MAAQ,EAAO,WAAa,EAAO,YAG3C,CACL,MAAO,KAAK,MAAM,QAAQ,SAAS,EAAW,OAAS,EAAW,MAAQ,EAAK,aAC/E,OAAQ,KAAK,MAAM,QAAQ,SAAS,EAAW,QAAU,EAAW,OAAS,EAAK,cAClF,IAAK,KAAK,MAAM,EAAW,IAAM,EAAa,KAC9C,KAAM,KAAK,MAAM,EAAW,KAAO,EAAa,MAEpD,EAkBA,OAAQ,SAAS,GAGf,IAAI,GAFJ,EAAO,KAAK,WAAW,IAEJ,wBACnB,MAAO,CACL,MAAO,KAAK,MAAM,QAAQ,SAAS,EAAQ,OAAS,EAAQ,MAAQ,EAAK,aACzE,OAAQ,KAAK,MAAM,QAAQ,SAAS,EAAQ,QAAU,EAAQ,OAAS,EAAK,cAC5E,IAAK,KAAK,MAAM,EAAQ,KAAO,EAAQ,aAAe,EAAU,GAAG,gBAAgB,YACnF,KAAM,KAAK,MAAM,EAAQ,MAAQ,EAAQ,aAAe,EAAU,GAAG,gBAAgB,aAEzF,EAyBA,eAAgB,SAAS,EAAM,EAAa,GAE1C,GAAoC,IAAnB,EAEjB,IAAI,GAHJ,EAAO,KAAK,WAAW,IAGJ,wBACf,EAAY,CAAC,IAAK,EAAG,KAAM,EAAG,OAAQ,EAAG,MAAO,GAEhD,EAAe,EAAc,EAAU,GAAG,gBAAkB,KAAK,aAAa,GAC9E,EAAkB,EAAa,wBAWnC,GATA,EAAU,IAAM,EAAgB,IAAM,EAAa,UACnD,EAAU,KAAO,EAAgB,KAAO,EAAa,WACjD,IAAiB,EAAU,GAAG,kBAChC,EAAU,KAAO,EAAQ,YACzB,EAAU,MAAQ,EAAQ,aAE5B,EAAU,OAAS,EAAU,IAAM,EAAa,aAChD,EAAU,MAAQ,EAAU,KAAO,EAAa,YAE5C,EAAgB,CAClB,IAAI,EAAoB,EAAQ,iBAAiB,GACjD,EAAU,KAAO,KAAK,WAAW,EAAkB,YACnD,EAAU,QAAU,KAAK,WAAW,EAAkB,eACtD,EAAU,MAAQ,KAAK,WAAW,EAAkB,aACpD,EAAU,OAAS,KAAK,WAAW,EAAkB,aACvD,CAEA,MAAO,CACL,IAAK,KAAK,MAAM,EAAQ,IAAM,EAAU,KACxC,OAAQ,KAAK,MAAM,EAAU,OAAS,EAAQ,QAC9C,KAAM,KAAK,MAAM,EAAQ,KAAO,EAAU,MAC1C,MAAO,KAAK,MAAM,EAAU,MAAQ,EAAQ,OAEhD,EAmCA,eAAgB,SAAS,GACvB,IAAI,EAAY,EAAgB,KAAK,KAAK,GAuB1C,OAtBI,IACF,EAAY,EAAU,QAAQ,EAAgB,KAAM,MAGtD,EAAY,EAAU,MAAM,MAElB,GAAK,EAAU,IAAM,MAC1B,EAAgB,QAAQ,KAAK,EAAU,MAC1C,EAAU,GAAK,OAGjB,EAAU,GAAK,EAAU,IAAM,SAC1B,EAAgB,UAAU,KAAK,EAAU,MAC5C,EAAU,GAAK,UAIf,EAAU,KADR,EAMG,CACT,EAwCA,iBAAkB,SAAS,EAAU,EAAY,EAAW,GAC1D,EAAW,KAAK,WAAW,GAC3B,EAAa,KAAK,WAAW,GAG7B,IAAI,EAAc,QAAQ,UAAU,EAAW,aAAe,EAAW,YAAc,EAAW,KAAK,eACnG,EAAe,QAAQ,UAAU,EAAW,cAAgB,EAAW,aAAe,EAAW,KAAK,gBAE1G,EAAY,KAAK,eAAe,GAEhC,IAAI,EAAc,EAAe,KAAK,OAAO,GAAY,KAAK,SAAS,GACnE,EAAgB,CAAC,IAAK,EAAG,KAAM,EAAG,UAAW,IAEjD,GAAI,EAAU,GAAI,CAChB,IAAI,EAAiB,KAAK,eAAe,EAAU,GAE/C,EAAkB,EAAQ,iBAAiB,GAC3C,EAAe,CACjB,MAAO,EAAc,KAAK,MAAM,KAAK,IAAI,KAAK,WAAW,EAAgB,YAAc,KAAK,WAAW,EAAgB,eACvH,OAAQ,EAAe,KAAK,MAAM,KAAK,IAAI,KAAK,WAAW,EAAgB,WAAa,KAAK,WAAW,EAAgB,iBAe1H,GAZA,EAAU,GAAsB,QAAjB,EAAU,IAAgB,EAAa,OAAS,EAAe,KAAO,EAAa,QAAU,EAAe,OAAS,SACpG,WAAjB,EAAU,IAAmB,EAAa,OAAS,EAAe,QAAU,EAAa,QAAU,EAAe,IAAM,MACvG,SAAjB,EAAU,IAAiB,EAAa,MAAQ,EAAe,MAAQ,EAAa,OAAS,EAAe,MAAQ,QACnG,UAAjB,EAAU,IAAkB,EAAa,MAAQ,EAAe,OAAS,EAAa,OAAS,EAAe,KAAO,OACrH,EAAU,GAEzB,EAAU,GAAsB,QAAjB,EAAU,IAAgB,EAAa,OAAS,EAAY,OAAS,EAAe,QAAU,EAAa,OAAS,EAAY,QAAU,EAAe,IAAM,SAC9I,WAAjB,EAAU,IAAmB,EAAa,OAAS,EAAY,OAAS,EAAe,KAAO,EAAa,OAAS,EAAY,QAAU,EAAe,OAAS,MACjJ,SAAjB,EAAU,IAAiB,EAAa,MAAQ,EAAY,MAAQ,EAAe,OAAS,EAAa,MAAQ,EAAY,OAAS,EAAe,KAAO,QAC3I,UAAjB,EAAU,IAAkB,EAAa,MAAQ,EAAY,MAAQ,EAAe,MAAQ,EAAa,MAAQ,EAAY,OAAS,EAAe,MAAQ,OAC7J,EAAU,GAEJ,WAAjB,EAAU,GACZ,GAAI,EAAgB,SAAS,KAAK,EAAU,IAAK,CAC/C,IAAI,EAAY,EAAY,MAAQ,EAAI,EAAc,EAClD,EAAe,KAAO,EAAY,GAAK,EAAa,MAAQ,EAAY,OAAS,EAAe,MAClG,EAAU,GAAK,OACN,EAAe,MAAQ,EAAY,GAAK,EAAa,MAAQ,EAAY,OAAS,EAAe,OAC1G,EAAU,GAAK,QAEnB,KAAO,CACL,IAAI,EAAY,EAAY,OAAS,EAAI,EAAa,OAAS,EAC3D,EAAe,IAAM,EAAY,GAAK,EAAa,OAAS,EAAY,QAAU,EAAe,OACnG,EAAU,GAAK,MACN,EAAe,OAAS,EAAY,GAAK,EAAa,OAAS,EAAY,QAAU,EAAe,MAC7G,EAAU,GAAK,SAEnB,CAEJ,CAEA,OAAQ,EAAU,IAChB,IAAK,MACH,EAAc,IAAM,EAAY,IAAM,EACtC,MACF,IAAK,SACH,EAAc,IAAM,EAAY,IAAM,EAAY,OAClD,MACF,IAAK,OACH,EAAc,KAAO,EAAY,KAAO,EACxC,MACF,IAAK,QACH,EAAc,KAAO,EAAY,KAAO,EAAY,MAIxD,OAAQ,EAAU,IAChB,IAAK,MACH,EAAc,IAAM,EAAY,IAChC,MACF,IAAK,SACH,EAAc,IAAM,EAAY,IAAM,EAAY,OAAS,EAC3D,MACF,IAAK,OACH,EAAc,KAAO,EAAY,KACjC,MACF,IAAK,QACH,EAAc,KAAO,EAAY,KAAO,EAAY,MAAQ,EAC5D,MACF,IAAK,SACC,EAAgB,SAAS,KAAK,EAAU,IAC1C,EAAc,KAAO,EAAY,KAAO,EAAY,MAAQ,EAAI,EAAc,EAE9E,EAAc,IAAM,EAAY,IAAM,EAAY,OAAS,EAAI,EAAe,EASpF,OAJA,EAAc,IAAM,KAAK,MAAM,EAAc,KAC7C,EAAc,KAAO,KAAK,MAAM,EAAc,MAC9C,EAAc,UAA6B,WAAjB,EAAU,GAAkB,EAAU,GAAK,EAAU,GAAK,IAAM,EAAU,GAE7F,CACT,EAcA,UAAW,SAAS,EAAkB,EAAmB,EAAe,GACtE,IAAyC,IAArC,EAAiB,QAAQ,QAAiB,IAAkB,EAC9D,MAAO,CACL,IAAK,EAAkB,IAAM,EAAgB,KAGnD,EAUA,cAAe,SAAS,EAAM,GAG5B,IAAI,GAFJ,EAAO,KAAK,WAAW,IAEF,cAAc,kCACnC,GAAK,EAAL,CAIA,IAAI,EAAY,QAAQ,QAAQ,GAAW,SAAS,iBAEhD,EAAY,EAAY,EAAK,cAAc,kBAAoB,EAAK,cAAc,UACtF,GAAK,EAAL,CAIA,IAAI,EAAW,CACb,IAAK,GACL,OAAQ,GACR,KAAM,GACN,MAAO,IAIT,GAAqB,YADrB,EAAY,KAAK,eAAe,IAClB,GAAd,CAMA,IAAI,EAAa,UAAY,EAAU,GAAK,SACxC,EAAc,EAAQ,iBAAiB,GAAW,GAElD,EAAmB,UACnB,EAAgB,SAAS,KAAK,EAAU,IAC1C,GAAoB,EAAU,GAAK,IAAM,EAAU,GAEnD,GAAoB,EAAU,GAAK,IAAM,EAAU,GAErD,GAAoB,UACpB,IAAI,EAAe,EAAQ,iBAAiB,EAAY,EAAY,GAAM,GAE1E,OAAQ,EAAU,IAChB,IAAK,MACH,EAAS,OAAS,EAAY,IAAM,IAAM,EAC1C,MACF,IAAK,SACH,EAAS,IAAM,EAAY,IAAM,IAAM,EACvC,MACF,IAAK,OACH,EAAS,MAAQ,EAAY,IAAM,IAAM,EACzC,MACF,IAAK,QACH,EAAS,KAAO,EAAY,IAAM,IAAM,EAI5C,EAAS,EAAU,IAAM,EAEzB,QAAQ,QAAQ,GAAW,IAAI,EA/B/B,MAFE,QAAQ,QAAQ,GAAW,IAAI,EAZjC,CAPA,CAqDF,EAEJ,IAEF,QAAQ,OAAO,+BAAgC,CAAC,0BAA2B,0BAE1E,MAAM,kCAAkC,GAExC,SAAS,2BAA4B,CACpC,gBAAiB,GACjB,cAAc,EACd,UAAW,QACX,sBAAsB,EACtB,UAAW,OACX,YAAa,QACb,gBAAiB,aACjB,2BAA4B,0CAC5B,sBAAuB,0CACvB,WAAY,CACV,KAAM,aACN,iBAAkB,0BAClB,MAAS,WAEX,aAAa,EACb,eAAe,EACf,UAAW,qBAGZ,WAAW,+BAAgC,CAAC,SAAU,WAAY,SAAU,WAAY,OAAQ,SAAU,UAAW,YAAa,aAAc,eAAgB,aAAc,gBAAiB,2BAA4B,WAAY,sBAAuB,iCAC/P,SAAS,EAAQ,EAAU,EAAQ,EAAU,EAAM,EAAQ,EAAS,EAAW,EAAY,EAAW,EAAY,EAAY,EAAuB,EAAU,EAAkB,GAC/K,IAEI,EAAY,EAAsB,EAAc,EAClD,EAA4B,EAAuB,EAAS,EAAc,EAC1E,EAAS,EAAgB,EAAQ,EAHjC,GAAmB,EAG+B,EAAiB,GAmRrE,SAAS,EAAgB,GACvB,IAAI,EAAO,EAAW,MAAM,EAAW,EAAY,EAAO,MAC1D,GAAI,MAAM,GACR,IAAK,IAAI,EAAI,EAAG,EAAI,EAAgB,OAAQ,IAE1C,GADA,EAAO,EAAW,MAAM,EAAW,EAAgB,GAAI,EAAO,OACzD,MAAM,GACT,OAAO,EAIb,OAAO,CACT,CAEA,SAAS,EAAU,GAMjB,GALI,QAAQ,SAAS,KAEnB,EAAY,IAAI,KAAK,KAGlB,EACH,OAAO,KAGT,GAAI,QAAQ,OAAO,KAAe,MAAM,GACtC,OAAO,EAGT,GAAI,QAAQ,SAAS,GAAY,CAC/B,IAAI,EAAO,EAAgB,GAC3B,IAAK,MAAM,GACT,OAAO,EAAW,aAAa,EAAM,EAAe,SAExD,CAEA,OAAO,EAAQ,UAAY,EAAQ,SAAS,aAAe,OAAY,CACzE,CAEA,SAAS,EAAU,EAAY,GAC7B,IAAI,EAAQ,GAAc,EAE1B,OAAK,EAAO,aAAe,IAIvB,QAAQ,SAAS,KACnB,EAAQ,IAAI,KAAK,KAGd,OAID,QAAQ,OAAO,IAAW,MAAM,OAIhC,QAAQ,SAAS,KACX,MAAM,EAAgB,KAIlC,CAEA,SAAS,EAAkB,GACzB,GAAK,EAAO,SAAU,EAAO,SAA7B,CAIA,IAAI,EAAQ,EAAO,GACf,EAAmB,EAAS,GAAG,SAAS,EAAM,QAG9C,OAAyC,IAAnB,EAAM,UAA0B,EAAM,SAAS,EAAM,SAC3E,EAAO,QAAY,GAAoB,GACzC,EAAO,QAAO,WACZ,EAAO,QAAS,CAClB,GAVF,CAYF,CAEA,SAAS,EAAiB,GACN,KAAd,EAAI,OAAgB,EAAO,QAC7B,EAAI,iBACJ,EAAI,kBACJ,EAAO,QAAO,WACZ,EAAO,QAAS,CAClB,IACA,EAAS,GAAG,SACW,KAAd,EAAI,OAAiB,EAAO,SACrC,EAAI,iBACJ,EAAI,kBACJ,EAAO,QAAO,WACZ,EAAO,QAAS,CAClB,IAEJ,CAEA,SAAS,IACP,GAAI,EAAO,OAAQ,CACjB,IAAI,EAAY,QAAQ,QAAQ,EAAO,GAAG,cAAc,0BACpD,EAAY,EAAO,eAAiB,EAAO,eAAiB,EAAsB,UAClF,EAAW,EAAU,iBAAiB,EAAU,EAAW,EAAW,GAC1E,EAAU,IAAI,CAAC,IAAK,EAAS,IAAM,KAAM,KAAM,EAAS,KAAO,OAC3D,EAAU,SAAS,yBACrB,EAAU,YAAY,uBAE1B,CACF,CA5XA,KAAK,KAAO,SAAS,GAgDnB,GA/CA,EAAU,EACV,EAAiB,QAAQ,SAAS,EAAU,UAC1C,EAAU,SACV,CACE,SAAU,MAEd,EAAuB,QAAQ,UAAU,EAAO,sBAC9C,EAAO,QAAQ,MAAM,EAAO,sBAC5B,EAAsB,qBACxB,EAAe,QAAQ,UAAU,EAAO,wBACtC,EAAO,QAAQ,MAAM,EAAO,wBAC5B,EAAsB,aACxB,EAAc,QAAQ,UAAU,EAAO,aACrC,EAAO,QAAQ,MAAM,EAAO,aAAe,EAAsB,YACnE,EAA6B,QAAQ,UAAU,EAAO,4BACpD,EAAO,2BACP,EAAsB,2BACxB,EAAwB,QAAQ,UAAU,EAAO,uBAC/C,EAAO,sBAAwB,EAAsB,sBACvD,EAAkB,QAAQ,UAAU,EAAO,iBACzC,EAAO,QAAQ,MAAM,EAAO,iBAC5B,EAAsB,gBAExB,EAAO,cAAgB,QAAQ,UAAU,EAAO,eAC9C,EAAO,QAAQ,MAAM,EAAO,eAC5B,EAAsB,cAEpB,EAAsB,WAAW,EAAO,OAC1C,EAAa,EAAsB,WAAW,EAAO,MACrD,GAAmB,IAEnB,EAAa,EAAO,oBAAsB,EAAsB,gBAChE,EAAO,SAAS,sBAAsB,SAAS,EAAO,GACpD,IAAI,EAAgB,GAAS,EAAsB,gBAGnD,GAAI,IAAkB,IACpB,EAAa,EACb,EAAQ,YAAc,MAEjB,GACH,MAAM,IAAI,MAAM,wDAGtB,MAGG,EACH,MAAM,IAAI,MAAM,yDAGlB,GAAI,GAAoB,EAAO,mBAC7B,MAAM,IAAI,MAAM,0DAIlB,EAAU,QAAQ,QAAQ,oEAElB,KAAK,CACX,WAAY,OACZ,YAAa,sBACb,eAAgB,KAIlB,EAAe,QAAQ,QAAQ,EAAQ,WAAW,KACrC,KAAK,eAAgB,GAE7B,EAAO,oBACV,EAAO,kBAAoB,CAAC,GAG1B,GACkB,UAAhB,EAAO,OACT,EAAO,kBAAkB,eAAiB,QAC1C,EAAO,kBAAkB,QAAU,SAIvC,EAAa,KAAK,qBAAsB,qBAEnC,EAoBH,EAAQ,YAAY,MAAK,SAAS,GAEhC,OADA,EAAO,KAAO,EAAW,aAAa,EAAO,EAAe,UACrD,CACT,KArBA,EAAQ,aAAe,OACvB,EAAQ,YAAY,KAAO,EAC3B,EAAQ,SAAS,QAAQ,GACzB,EAAQ,YAAY,MAAK,SAAS,GAChC,OAAI,EAAQ,SAAS,IACnB,EAAO,KAAO,EACP,IAGL,QAAQ,SAAS,KACnB,EAAQ,IAAI,KAAK,IAGnB,EAAO,KAAO,EAAW,aAAa,EAAO,EAAe,UAErD,EAAW,OAAO,EAAO,KAAM,GACxC,KASF,EAAQ,qBAAqB,MAAK,WAChC,EAAO,KAAO,EAAgB,EAAQ,WACxC,IAEA,EAAS,GAAG,UAAW,GAEvB,EAAS,EAAS,EAAT,CAAkB,GAE3B,EAAQ,SAEJ,EACF,EAAU,KAAK,QAAQ,OAAO,GAE9B,EAAS,MAAM,GAGjB,EAAO,IAAI,YAAY,WAkBrB,KAjBsB,IAAlB,EAAO,SACJ,EAAW,SACd,EAAO,QAAO,WACZ,EAAO,QAAS,CAClB,KAIJ,EAAO,SACP,EAAS,IAAI,UAAW,GACxB,EAAU,IAAI,QAAS,GACnB,GACF,EAAe,IAAI,SAAU,GAE/B,QAAQ,QAAQ,GAAS,IAAI,SAAU,GAGhC,EAAe,QACpB,EAAe,OAAf,EAEJ,GACF,EAEA,EAAO,QAAU,SAAS,GACxB,OAAO,EAAO,EAAM,SAAW,EAAsB,EAAM,OAC7D,EAEA,EAAO,WAAa,SAAS,GACd,UAAT,IACF,EAAO,EAAW,aAAa,IAAI,KAAQ,EAAe,WAG5D,IAAI,EAAQ,CAAC,EAeb,OAdA,QAAQ,QAAQ,CAAC,UAAW,YAAY,SAAS,GAC1C,EAAO,kBAAkB,GAEnB,QAAQ,OAAO,EAAO,kBAAkB,IACjD,EAAM,GAAO,IAAI,KAAK,EAAO,kBAAkB,KAE3C,GACF,EAAK,KAAK,gFAGZ,EAAM,GAAO,IAAI,KAAK,EAAW,EAAO,kBAAkB,GAAM,YARhE,EAAM,GAAO,IAUjB,IAEO,EAAO,mBACZ,EAAM,SAAW,EAAO,QAAQ,EAAM,EAAM,SAAW,GACvD,EAAM,SAAW,EAAO,QAAQ,EAAM,EAAM,SAAW,CAC3D,EAEA,EAAO,QAAU,SAAS,EAAO,GAC/B,OAAO,IAAI,KAAK,EAAM,cAAe,EAAM,WAAY,EAAM,WAAa,IAAI,KAAK,EAAM,cAAe,EAAM,WAAY,EAAM,UAClI,EAGA,EAAO,cAAgB,SAAS,GAC9B,EAAO,KAAO,EACd,IAAI,EAAO,EAAO,KAAO,EAAW,OAAO,EAAO,KAAM,GAAc,KACtE,EAAS,IAAI,GACb,EAAQ,cAAc,GAElB,IACF,EAAO,QAAS,EAChB,EAAS,GAAG,QAEhB,EAEA,EAAO,QAAU,SAAS,GACN,KAAd,EAAI,QACN,EAAI,kBACJ,EAAO,QAAS,EAChB,EAAS,GAAG,QAEhB,EAEA,EAAO,OAAS,SAAS,EAAM,GAG7B,GAFA,EAAI,kBAES,UAAT,EAAkB,CACpB,IAAI,EAAQ,IAAI,KACZ,QAAQ,OAAO,EAAO,OACxB,EAAO,IAAI,KAAK,EAAO,OAClB,YAAY,EAAM,cAAe,EAAM,WAAY,EAAM,YAE9D,EAAO,EAAW,aAAa,EAAO,EAAe,WAChD,SAAS,EAAG,EAAG,EAAG,EAE3B,CACA,EAAO,cAAc,EACvB,EAEA,EAAO,MAAQ,SAAS,GACtB,EAAI,kBAEJ,EAAO,QAAS,EAChB,EAAS,GAAG,OACd,EAEA,EAAO,SAAW,QAAQ,UAAU,EAAO,YAAa,EACpD,EAAO,YACT,EAAe,KAAK,EAAO,QAAQ,OAAO,EAAO,EAAO,aAAa,SAAS,GAC5E,EAAO,SAAW,CACpB,KAGF,EAAO,OAAO,UAAU,SAAS,GAC3B,EACG,EAAO,SAuBV,EAAO,QAAS,EAtBhB,GAAS,WACP,IAEI,GACF,EAAO,WAAW,wBAGpB,EAAU,GAAG,QAAS,GAEtB,IAAI,EAAY,EAAO,eAAiB,EAAO,eAAiB,EAAsB,UAClF,GAAgB,EAAU,eAAe,GAAW,IACtD,EAAiB,GAAkB,QAAQ,QAAQ,EAAU,aAAa,MAExE,EAAe,GAAG,SAAU,GAG9B,EAAiB,KAGnB,QAAQ,QAAQ,GAAS,GAAG,SAAU,EACxC,GAAG,GAAG,IAKR,EAAU,IAAI,QAAS,GACnB,GACF,EAAe,IAAI,SAAU,GAE/B,QAAQ,QAAQ,GAAS,IAAI,SAAU,GAE3C,IAmHA,EAAO,IAAI,uBAAuB,WAChC,EAAS,EAAe,GAAG,EAC7B,GACF,IAEC,UAAU,sBAAsB,WAC/B,MAAO,CACL,QAAS,CAAC,UAAW,sBACrB,WAAY,+BACZ,MAAO,CACL,kBAAmB,KACnB,OAAQ,KACR,YAAa,IACb,UAAW,IACX,UAAW,KAEb,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,IAAI,EAAU,EAAM,GACX,EAAM,GAEV,KAAK,EACZ,EAEJ,IAEC,UAAU,0BAA0B,WACnC,MAAO,CACL,SAAU,IACV,YAAY,EACZ,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,yCAC9B,EAEJ,IAEA,QAAQ,OAAO,wBAAyB,IAIrC,QAAQ,aAAc,CAAC,WAAY,SAAS,GAC3C,OAAO,SAAS,EAAU,GACxB,IAAI,EAEJ,OAAO,WACL,IAAI,EAAO,KACP,EAAO,MAAM,UAAU,MAAM,KAAK,WAClC,GACF,EAAS,OAAO,GAGlB,EAAiB,GAAS,WACxB,EAAS,MAAM,EAAM,EACvB,GAAG,EACL,CACF,CACF,IAEF,QAAQ,OAAO,wBAAyB,CAAC,0BAExC,SAAS,oBAAqB,CAC7B,kBAAmB,oBACnB,UAAW,SAGZ,QAAQ,qBAAsB,CAAC,YAAa,aAAc,SAAS,EAAW,GAC7E,IAAI,EAAY,KAEhB,KAAK,KAAO,SAAS,EAAe,GAC7B,GACH,EAAU,GAAG,QAAS,GAGpB,GAAa,IAAc,IAC7B,EAAU,QAAS,GAGrB,EAAY,CACd,EAEA,KAAK,MAAQ,SAAS,EAAe,GAC/B,IAAc,IAChB,EAAY,KACZ,EAAU,IAAI,QAAS,GACvB,EAAU,IAAI,UAAW,KAAK,eAElC,EAEA,IAAI,EAAgB,SAAS,GAG3B,GAAK,KAED,GAAoC,aAA7B,EAAU,gBAEjB,GAAqB,IAAd,EAAI,OAAf,CAEA,IAAI,EAAgB,EAAU,mBAC9B,KAAI,GAAO,GAAiB,EAAc,GAAG,SAAS,EAAI,SAA1D,CAIA,IAAI,EAAkB,EAAU,qBAC5B,GAAoC,iBAA7B,EAAU,gBACnB,GAAmB,EAAgB,GAAG,SAAS,EAAI,UAIrD,EAAU,qBACV,EAAU,QAAS,EAEd,EAAW,SACd,EAAU,SAZZ,CALsC,CAmBxC,EAEA,KAAK,cAAgB,SAAS,GAC5B,IAAI,EAAkB,EAAU,qBAC5B,EAAgB,EAAU,mBAC1B,EAA0B,GAAmB,EAAgB,GAAG,SAAS,EAAI,QAC7E,EAAwB,GAAiB,EAAc,GAAG,SAAS,EAAI,QACzD,KAAd,EAAI,OACN,EAAI,kBACJ,EAAU,qBACV,KACS,EAAU,oBAAsD,IAAjC,CAAC,GAAI,IAAI,QAAQ,EAAI,QAAiB,EAAU,SAAW,GAA2B,KAC9H,EAAI,iBACJ,EAAI,kBACJ,EAAU,mBAAmB,EAAI,OAErC,CACF,IAEC,WAAW,wBAAyB,CAAC,SAAU,WAAY,SAAU,SAAU,oBAAqB,qBAAsB,WAAY,eAAgB,YAAa,WAAY,mBAAoB,SAAS,EAAQ,EAAU,EAAQ,EAAQ,EAAgB,EAAoB,EAAU,EAAW,EAAW,EAAU,GAC3T,IAEE,EAGA,EALE,EAAO,KACT,EAAQ,EAAO,OAEf,EAAoB,EAAe,kBACnC,EAAY,EAAe,UAE3B,EAAY,QAAQ,KACpB,EAAgB,EAAO,SAAW,EAAO,EAAO,UAAY,QAAQ,KACpE,GAAe,EACf,EAAW,KACX,GAAgB,EAEhB,EAAO,EAAU,KAAK,QAExB,EAAS,SAAS,YAElB,KAAK,KAAO,WAUV,GATI,EAAO,SACT,EAAY,EAAO,EAAO,QAC1B,EAAY,EAAU,OAEtB,EAAO,OAAO,GAAW,SAAS,GAChC,EAAM,SAAW,CACnB,KAGE,QAAQ,UAAU,EAAO,kBAAmB,CAC9C,IAAI,EAAa,EAAO,EAAO,iBAAd,CAAgC,GAC7C,IACF,EAAW,QAAQ,QAAQ,GAE/B,CAEA,EAAe,QAAQ,UAAU,EAAO,sBACxC,EAAgB,QAAQ,UAAU,EAAO,aAErC,IAAiB,IACnB,EAAW,GAGT,GAAY,EAAK,eACnB,EAAS,OAAO,EAAK,cACrB,EAAS,GAAG,YAAY,WACtB,EAAK,aAAa,QACpB,IAEJ,EAEA,KAAK,OAAS,SAAS,GAMrB,OALA,EAAM,OAAS,UAAU,SAAW,GAAQ,EAAM,OAC9C,QAAQ,WAAW,IACrB,EAAU,EAAO,EAAM,QAGlB,EAAM,MACf,EAGA,KAAK,OAAS,WACZ,OAAO,EAAM,MACf,EAEA,EAAM,iBAAmB,WACvB,OAAO,EAAK,aACd,EAEA,EAAM,aAAe,WACnB,OAAO,EAAO,WAAa,QAC7B,EAEA,EAAM,WAAa,WACjB,OAAO,CACT,EAEA,EAAM,gBAAkB,WACtB,OAAO,CACT,EAEA,EAAM,mBAAqB,SAAS,GAClC,IAAI,EAAQ,EAAK,aACf,QAAQ,QAAQ,EAAK,cAAc,KAAK,KACxC,EAAS,KAAK,MAAM,GAAG,GAAG,KAAK,KAEjC,OAAQ,GACN,KAAK,GACE,QAAQ,SAAS,EAAK,gBAGzB,EAAK,eAAiB,EAAK,iBAAmB,EAAM,OAAS,EAC3D,EAAK,eACL,EAAK,eAAiB,EAJxB,EAAK,eAAiB,EAMxB,MAEF,KAAK,GACE,QAAQ,SAAS,EAAK,gBAGzB,EAAK,eAAyC,IAAxB,EAAK,eACzB,EAAI,EAAK,eAAiB,EAH5B,EAAK,eAAiB,EAAM,OAAS,EAQ3C,EAAM,EAAK,gBAAgB,OAC7B,EAEA,EAAM,mBAAqB,WACzB,OAAO,EAAK,YACd,EAEA,EAAM,mBAAqB,WACrB,EAAK,eACP,EAAK,cAAc,GAAG,OAE1B,EAEA,EAAM,OAAO,UAAU,SAAS,EAAQ,GACtC,GAAI,GAAY,EAAK,aAAc,CACjC,IACE,EACA,EACA,EAHE,EAAM,EAAU,iBAAiB,EAAU,EAAK,aAAc,eAAe,GAI/E,EAAiB,EAyBnB,GAvBA,EAAM,CACJ,IAAK,EAAI,IAAM,KACf,QAAS,EAAS,QAAU,SAG9B,EAAa,EAAK,aAAa,SAAS,yBAKtC,EAAI,KAAO,QACX,EAAmB,EAAU,iBAAiB,IAEzB,gBAAkB,EAAiB,iBACtD,EAAiB,EAAiB,gBAGpC,EAAI,MAAQ,OAAO,WAAa,GAC7B,EAAI,KAAO,EAAS,KAAK,gBAAkB,OAX9C,EAAI,KAAO,EAAI,KAAO,KACtB,EAAI,MAAQ,SAeT,EAAc,CACjB,IAAI,EAAe,EAAU,OAAO,GAEpC,EAAI,IAAM,EAAI,IAAM,EAAa,IAAM,KAElC,EAGH,EAAI,MAAQ,OAAO,YAChB,EAAI,KAAO,EAAa,KAAO,EAAS,KAAK,gBAAkB,KAHlE,EAAI,KAAO,EAAI,KAAO,EAAa,KAAO,IAK9C,CAEA,EAAK,aAAa,IAAI,EACxB,CAEA,IAAI,EAAgB,GAAsB,EAW1C,GAVmB,EAAc,SAAS,EAAW,EAAoB,MAEnD,GACpB,EAAS,EAAS,WAAa,eAAe,EAAe,EAAW,EAAoB,GAAW,MAAK,WACtG,QAAQ,UAAU,IAAW,IAAW,GAC1C,EAAc,EAAQ,CAAE,OAAQ,GAEpC,IAGE,EACE,EAAK,wBACP,EAAiB,EAAK,yBAAyB,MAAK,SAAS,GAC3D,EAAgB,EAAM,OACtB,EAAS,EAAW,OAApB,CAA4B,GAAe,SAAS,GAClD,IAAI,EAAQ,EACZ,EAAK,aAAa,YAAY,GAC9B,EAAK,aAAe,EACpB,EAAU,GAAG,UAAW,EAAmB,cAC7C,GACF,IAEA,EAAU,GAAG,UAAW,EAAmB,eAG7C,EAAM,qBACN,EAAmB,KAAK,EAAO,OAC1B,CAEL,GADA,EAAmB,MAAM,EAAO,GAC5B,EAAK,wBAAyB,CAC5B,GACF,EAAc,WAEhB,IAAI,EAAQ,QAAQ,QAAQ,mCAC5B,EAAK,aAAa,YAAY,GAC9B,EAAK,aAAe,CACtB,CAEA,EAAK,eAAiB,IACxB,CAEI,QAAQ,WAAW,IACrB,EAAU,EAAQ,EAEtB,GACF,IAEC,UAAU,eAAe,WACxB,MAAO,CACL,WAAY,wBACZ,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,EAAa,MACf,EAEJ,IAEC,UAAU,mBAAmB,WAC5B,MAAO,CACL,SAAU,IACV,QAAS,gBACT,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,GAAK,IAAgB,QAAQ,UAAU,EAAM,gBAA7C,CAIA,EAAQ,SAAS,iBAEjB,IAAI,EAAS,EAAM,YACf,IACF,EAAa,wBAA0B,GAGpC,EAAa,eAChB,EAAa,aAAe,EAV9B,CAYF,EAEJ,IAEC,UAAU,qBAAqB,WAC9B,MAAO,CACL,QAAS,gBACT,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,GAAK,EAAL,CAIA,EAAQ,SAAS,mBAEjB,EAAa,cAAgB,EAE7B,IAAI,EAAiB,SAAS,GAC5B,EAAM,iBAED,EAAQ,SAAS,aAAgB,EAAM,UAC1C,EAAM,QAAO,WACX,EAAa,QACf,GAEJ,EAEA,EAAQ,KAAK,QAAS,GAGtB,EAAQ,KAAK,CAAE,iBAAiB,EAAM,iBAAiB,IACvD,EAAM,OAAO,EAAa,QAAQ,SAAS,GACzC,EAAQ,KAAK,kBAAmB,EAClC,IAEA,EAAM,IAAI,YAAY,WACpB,EAAQ,OAAO,QAAS,EAC1B,GA1BA,CA2BF,EAEJ,IAEA,QAAQ,OAAO,0BAA2B,IAKvC,QAAQ,gBAAgB,WACvB,MAAO,CACL,UAAW,WACT,IAAI,EAAQ,GAEZ,MAAO,CACL,IAAK,SAAS,EAAK,GACjB,EAAM,KAAK,CACT,IAAK,EACL,MAAO,GAEX,EACA,IAAK,SAAS,GACZ,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,GAAI,IAAQ,EAAM,GAAG,IACnB,OAAO,EAAM,EAGnB,EACA,KAAM,WAEJ,IADA,IAAI,EAAO,GACF,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,EAAK,KAAK,EAAM,GAAG,KAErB,OAAO,CACT,EACA,IAAK,WACH,OAAO,EAAM,EAAM,OAAS,EAC9B,EACA,OAAQ,SAAS,GAEf,IADA,IAAI,GAAO,EACF,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,GAAI,IAAQ,EAAM,GAAG,IAAK,CACxB,EAAM,EACN,KACF,CAEF,OAAO,EAAM,OAAO,EAAK,GAAG,EAC9B,EACA,UAAW,WACT,OAAO,EAAM,KACf,EACA,OAAQ,WACN,OAAO,EAAM,MACf,EAEJ,EAEJ,IACF,QAAQ,OAAO,qBAAsB,CAAC,0BAA2B,0BAI9D,QAAQ,cAAc,WACrB,MAAO,CACL,UAAW,WACT,IAAI,EAAM,CAAC,EAEX,MAAO,CACL,QAAS,WACP,OAAO,OAAO,KAAK,GAAK,KAAI,SAAS,GACnC,MAAO,CACL,IAAK,EACL,MAAO,EAAI,GAEf,GACF,EACA,IAAK,SAAS,GACZ,OAAO,EAAI,EACb,EACA,OAAQ,SAAS,GACf,QAAS,EAAI,EACf,EACA,KAAM,WACJ,OAAO,OAAO,KAAK,EACrB,EACA,IAAK,SAAS,EAAK,GACZ,EAAI,KACP,EAAI,GAAO,IAGb,EAAI,GAAK,KAAK,EAChB,EACA,OAAQ,SAAS,EAAK,GACpB,IAAI,EAAS,EAAI,GAEjB,GAAK,EAAL,CAIA,IAAI,EAAM,EAAO,QAAQ,IAEZ,IAAT,GACF,EAAO,OAAO,EAAK,GAGhB,EAAO,eACH,EAAI,EATb,CAWF,EAEJ,EAEJ,IAMC,SAAS,eAAe,WACvB,IAAI,EAAU,KACd,KAAK,SAAW,KAEhB,KAAK,YAAc,SAAS,GAC1B,KAAK,SAAW,CAClB,EAEA,KAAK,KAAO,CAAC,YAAa,KAAM,SAAS,EAAW,GAClD,IAAI,EAAW,EAAQ,SAAW,EAAU,IAAI,EAAQ,UAAY,KACpE,MAAO,CACL,QAAS,SAAS,EAAY,EAAQ,EAAQ,GAC5C,GAAI,EACF,OAAO,EAAS,QAAQ,EAAY,EAAQ,EAAQ,GAGtD,IAAI,EAAW,GAYf,OAVA,QAAQ,QAAQ,GAAY,SAAS,GAC/B,QAAQ,WAAW,IAAU,QAAQ,QAAQ,GAC/C,EAAS,KAAK,EAAG,QAAQ,EAAU,OAAO,KACjC,QAAQ,SAAS,GAC1B,EAAS,KAAK,EAAG,QAAQ,EAAU,IAAI,KAEvC,EAAS,KAAK,EAAG,QAAQ,GAE7B,IAEO,EAAG,IAAI,GAAU,MAAK,SAAS,GACpC,IAAI,EAAa,CAAC,EACd,EAAc,EAKlB,OAJA,QAAQ,QAAQ,GAAY,SAAS,EAAO,GAC1C,EAAW,GAAO,EAAS,IAC7B,IAEO,CACT,GACF,EAEJ,EACF,IAKC,UAAU,mBAAoB,CAAC,WAAY,YAAa,iBACzD,SAAS,EAAU,EAAW,GAC5B,MAAO,CACL,SAAU,IACV,QAAS,SAAS,EAAU,GAE1B,OADA,EAAS,SAAS,EAAO,eAClB,CACT,GAGF,SAAS,EAAO,EAAO,EAAS,GAC1B,EAAM,eACR,EAAS,SAAS,EAAS,EAAM,cAEjC,EAAM,IAAI,EAAY,mBAAmB,SAAS,EAAG,GACnD,IAAI,EAAO,IACP,EAAM,aAAa,UACrB,EAAS,YAAY,EAAS,EAAM,cAAc,KAAK,GAEvD,GAEJ,IAEJ,CACF,IAEC,UAAU,iBAAkB,CAAC,iBAAkB,KAAM,cAAe,YACrE,SAAS,EAAa,EAAI,EAAa,GACrC,MAAO,CACL,MAAO,CACL,MAAO,KAET,SAAU,IACV,YAAY,EACZ,YAAa,SAAS,EAAU,GAC9B,OAAO,EAAO,aAAe,gCAC/B,EACA,KAAM,SAAS,EAAO,EAAS,GAC7B,EAAQ,SAAS,EAAM,gBAAkB,IACzC,EAAM,KAAO,EAAM,KAEnB,EAAM,MAAQ,SAAS,GACrB,IAAI,EAAQ,EAAY,SACpB,GAAS,EAAM,MAAM,UACE,WAAzB,EAAM,MAAM,UACZ,EAAI,SAAW,EAAI,gBACnB,EAAI,iBACJ,EAAI,kBACJ,EAAY,QAAQ,EAAM,IAAK,kBAEnC,EAGA,EAAQ,GAAG,QAAS,EAAM,OAK1B,EAAM,aAAc,EAGpB,IAAI,EAAsB,EAAG,QAE7B,EAAM,cAAa,WACjB,EAAoB,SACtB,IAEA,EAAoB,QAAQ,MAAK,WAC/B,IAAI,EAAmB,KAEnB,EAAM,eACR,EAAmB,EAAY,EAAS,CACtC,SAAU,EAAM,eACf,QAEH,EAAM,IAAI,EAAY,mBAAmB,SAAS,EAAG,GACnD,IAAI,EAAO,IACX,EAAY,EAAS,CACnB,YAAa,EAAM,eAClB,QAAQ,KAAK,EAClB,KAIF,EAAG,KAAK,GAAkB,MAAK,WAE7B,IAAI,EAAQ,EAAY,SASxB,GARI,GACF,EAAY,cAAc,EAAM,MAO5B,EAAU,GAAG,gBAAiB,EAAQ,GAAG,SAAS,EAAU,GAAG,eAAiB,CACpF,IAAI,EAAqB,EAAQ,GAAG,cAAc,eAS9C,EACF,EAAmB,QAEnB,EAAQ,GAAG,OAEf,CACF,GACF,GACF,EAEJ,IAEC,UAAU,0BAA0B,WACnC,MAAO,CACL,QAAS,SAAS,EAAU,GACtB,EAAO,gBACT,EAAS,SAAS,EAAO,uBAE7B,EAEJ,IAEC,UAAU,qBAAsB,CAAC,WAAY,SAAS,GACrD,MAAO,CACL,KAAM,SAAS,EAAO,EAAS,EAAO,EAAY,GAChD,EAAW,EAAM,SAAS,SAAS,GACjC,EAAQ,QACR,EAAS,MAAM,EAAO,EACxB,GACF,EAEJ,IAEC,QAAQ,iBAAkB,CAAC,WAAY,cAAe,YACrD,WAAY,aAAc,KAAM,aAAc,eAAgB,eAC9D,SAAS,EAAU,EAAa,EAAW,EAAU,EAAY,EAAI,EAAY,EAAc,GAC7F,IAEI,EAAe,EAaf,EAfA,EAAqB,aAGrB,EAAgB,EAAa,YAC7B,EAAgB,EAAW,YAC3B,EAAc,CAChB,kBAAmB,2BAEjB,EAAgB,EAChB,EAAyB,KAOzB,EAAoB,SAgBxB,SAAS,IAGP,IAFA,IAAI,GAAoB,EACpB,EAAS,EAAc,OAClB,EAAI,EAAG,EAAI,EAAO,OAAQ,IAC7B,EAAc,IAAI,EAAO,IAAI,MAAM,WACrC,EAAmB,GASvB,OAHI,GAAoB,GAAK,EAAmB,IAC9C,EAAmB,GAEd,CACT,CAQA,SAAS,EAAkB,EAAe,GACxC,IAAI,EAAc,EAAc,IAAI,GAAe,MAC/C,EAAkB,EAAY,SAGlC,EAAc,OAAO,IACrB,EAAyB,EAAc,SAErC,EAAgB,SAAS,EAAuB,MAAM,WAAW,KAAK,SAAU,KAGlF,EAAmB,EAAY,WAAY,EAAY,YAAY,WACjE,IAAI,EAAiB,EAAY,aAAe,EAChD,EAAc,OAAO,EAAgB,GACrC,IAAI,EAAa,EAAc,OAAO,GACtC,EAAgB,YAAY,EAAgB,IACvC,GAAc,GAAoB,EAAiB,gBAAkB,EAAiB,iBACrF,EAAiB,cACnB,EAAgB,IAAI,CAAC,aAAc,EAAiB,cAAgB,OAEpE,EAAgB,IAAI,CAAC,aAAc,KAErC,EAAmB,MAErB,GAAqB,EACvB,GAAG,EAAY,gBAqBjB,WAEE,GAAI,IAAsC,IAArB,IAAwB,CAE3C,EAAmB,EAAe,GAAe,WAC/C,CACF,IACA,OAAgB,EAChB,OAAgB,CAClB,CACF,CA9BE,GAGI,GAAyB,EAAsB,MACjD,EAAsB,QACb,EAAgB,OACzB,EAAgB,OAEpB,CAGA,SAAS,EAAqB,GAC5B,IAAI,EAEA,EAAc,SAAW,IAC3B,EAAc,EAAc,MAAM,OACtB,WAAW,YAAY,EAAY,gBAAkB,GAAI,EAEzE,CAcA,SAAS,EAAmB,EAAO,EAAO,EAAM,GAC9C,IAAI,EACA,EAAe,KAgBnB,OALA,EAAM,WAAW,EAAY,mBAVZ,WAMf,OALK,IACH,EAAgB,EAAG,QACnB,EAAe,EAAc,SAGxB,WACL,EAAc,SAChB,CACF,IAMO,EAAG,KAAK,GAAc,MAE7B,SAAS,IACP,GAAI,EAAe,KACjB,OAEF,EAAe,MAAO,EAEtB,EAAS,MAAM,GAAO,MAAK,WACrB,GACF,IAGF,EAAM,SACF,GACF,EAAe,SAEnB,IAEA,EAAM,UACR,GACF,CAQA,SAAS,EAAgB,GACvB,GAAI,EAAI,qBACN,OAAO,EAGT,IAAI,EAAQ,EAAc,MAC1B,GAAI,EACF,OAAQ,EAAI,OACV,KAAK,GACC,EAAM,MAAM,WACd,EAAI,iBACJ,EAAW,QAAO,WAChB,EAAY,QAAQ,EAAM,IAAK,mBACjC,KAEF,MAEF,KAAK,EACH,IAAI,EAAO,EAAY,qBAAqB,GACxC,GAAe,EACf,EAAI,UACF,EAAY,mBAAmB,EAAK,IAAS,EAAY,eAAe,EAAK,MAC/E,EAAe,EAAY,0BAA0B,IAGnD,EAAY,kBAAkB,EAAK,KACrC,EAAe,EAAY,2BAA2B,IAItD,IACF,EAAI,iBACJ,EAAI,mBAOd,CAkHA,SAAS,EAAiB,EAAa,EAAgB,GACrD,OAAQ,EAAY,MAAM,WAAW,WAAW,gBAAiB,EAAgB,GAAS,gBAC5F,CA+FA,OAzWA,EAAW,OAAO,GAAe,SAAS,GACpC,IACF,EAAc,MAAQ,EAE1B,IAqGA,EAAU,GAAG,UAAW,GAExB,EAAW,IAAI,YAAY,WACzB,EAAU,IAAI,UAAW,EAC3B,IA2CA,EAAY,KAAO,SAAS,EAAe,GACzC,IAAI,EAAc,EAAU,GAAG,cAC7B,EAAiB,EAAM,aAAe,EAExC,GAAqB,GAIrB,EAAyB,EAAc,MAEvC,EAAc,IAAI,EAAe,CAC/B,SAAU,EAAM,SAChB,eAAgB,EAAM,eACtB,eAAgB,EAAM,eACtB,WAAY,EAAM,MAClB,SAAU,EAAM,SAChB,SAAU,EAAM,SAChB,YAAa,EAAM,YACnB,eAAgB,EAAM,eACtB,UAAW,EAAM,UACjB,SAAU,EAAM,WAGlB,EAAc,IAAI,EAAgB,GAElC,IAmCI,EAnCA,EAAkB,EAAM,SACxB,EAAoB,IAExB,IAAK,EAAgB,OACnB,MAAM,IAAI,MAAM,4EAGd,GAAqB,IAAM,KAC7B,EAAgB,EAAW,MAAK,IAClB,aAAe,EAC7B,EAAc,MAAQ,GACtB,EAAgB,QAAQ,QAAQ,oDAClB,KAAK,CACjB,MAAS,iBACT,WAAY,mDACZ,4BAA6B,OAC7B,iBAAkB,OAEhB,EAAM,eACR,EAAc,SAAS,EAAM,eAG3B,EAAM,WACR,EAAc,KAAK,kBAAmB,QAExC,EAAS,EAAT,CAAwB,GACxB,EAAS,MAAM,EAAe,GAC1B,EAAa,aAAa,KAC5B,EAAmB,EAAa,iBAAiB,IAC5B,gBAAkB,EAAiB,gBACtD,EAAgB,IAAI,CAAC,aAAc,EAAiB,MAAQ,QAM9D,EAAM,WACR,EAAU,SAAS,cAAyB,EAAM,UAAU,KAlPlD,QAAQ,GAAmB,SAAS,EAAQ,GACtD,OAAQ,EAFM,IAEY,IAAM,EAAO,aACzC,MAiPE,EAAU,QAAQ,QAAQ,IAClB,KAAK,CACX,QAAS,WACT,iBAAkB,oBAClB,MAAO,iBACP,QAAS,sBAGX,EAAU,EAAM,QAIlB,EAAgB,EAAyB,SAAS,EAAuB,MAAM,WAAW,KAAK,SAAU,IAAM,EAAI,EACnH,IAAI,EAAe,QAAQ,QAAQ,+CACnC,EAAa,KAAK,CAChB,MAAS,QACT,eAAgB,EAAM,kBACtB,mBAAoB,EAAM,eAC1B,KAAQ,SACR,kBAAmB,EAAM,eACzB,mBAAoB,EAAM,gBAC1B,KAAQ,EAAM,KACd,MAAS,EACT,QAAW,UACX,WAAY,2DACZ,UAAa,EACb,4BAA6B,OAC7B,iBAAkB,OACjB,OAAO,GACN,EAAM,aACR,EAAa,SAAS,EAAM,aAG1B,EAAM,WACR,EAAa,KAAK,kBAAmB,QAGvC,EAAgB,SAAS,GACrB,EAAM,QAGR,EAAM,MAAM,gBAAkB,GAEhC,EAAS,MAAM,EAAS,EAAT,CAAuB,EAAM,OAAQ,GAEpD,EAAc,MAAM,MAAM,WAAa,EACvC,EAAc,MAAM,MAAM,YAAc,CAC1C,EAMA,EAAY,MAAQ,SAAS,EAAe,GAC1C,IAAI,EAAc,EAAc,IAAI,GACpC,OAAI,GAAe,EAAiB,EAAa,GAAQ,IACvD,EAAY,MAAM,WAAW,2BAA4B,EACzD,EAAY,MAAM,SAAS,QAAQ,GACnC,EAAkB,EAAe,EAAY,MAAM,cAC5C,IAED,CACV,EAEA,EAAY,QAAU,SAAS,EAAe,GAC5C,IAAI,EAAc,EAAc,IAAI,GACpC,OAAI,GAAe,EAAiB,EAAa,GAAQ,IACvD,EAAY,MAAM,WAAW,2BAA4B,EACzD,EAAY,MAAM,SAAS,OAAO,GAClC,EAAkB,EAAe,EAAY,MAAM,cAC5C,IAED,CACV,EAEA,EAAY,WAAa,SAAS,GAEhC,IADA,IAAI,EAAW,KAAK,SACb,GAAY,KAAK,QAAQ,EAAS,IAAK,IAC5C,EAAW,KAAK,QAEpB,EAEA,EAAY,OAAS,WACnB,OAAO,EAAc,KACvB,EAEA,EAAY,cAAgB,SAAS,GACnC,IAAI,EAAc,EAAc,IAAI,GAChC,GACF,EAAY,MAAM,eAAe,SAErC,EAEA,EAAY,2BAA6B,SAAS,GAChD,OAAI,EAAK,OAAS,IAChB,EAAK,GAAG,SACD,EAGX,EAEA,EAAY,0BAA4B,SAAS,GAC/C,OAAI,EAAK,OAAS,IAChB,EAAK,EAAK,OAAS,GAAG,SACf,EAGX,EAEA,EAAY,eAAiB,SAAS,EAAK,GACzC,GAAI,GAAO,EAAa,CACtB,IAAI,EAAa,EAAY,MAAM,WACnC,GAAI,GAAc,EAAW,OAC3B,OAAQ,EAAI,QAAU,EAAI,cAAgB,EAAW,EAEzD,CACA,OAAO,CACT,EAEA,EAAY,mBAAqB,SAAS,EAAK,GAC7C,OAAI,EAAK,OAAS,IACR,EAAI,QAAU,EAAI,cAAgB,EAAK,EAGnD,EAEA,EAAY,kBAAoB,SAAS,EAAK,GAC5C,OAAI,EAAK,OAAS,IACR,EAAI,QAAU,EAAI,cAAgB,EAAK,EAAK,OAAS,EAGjE,EAEA,EAAY,qBAAuB,SAAS,GAC1C,GAAI,EAAa,CACf,IAAI,EAAa,EAAY,MAAM,WACnC,GAAI,GAAc,EAAW,OAAQ,CACnC,IAAI,EAAW,EAAW,GAAG,iBArYZ,6RAsYjB,OAAO,EACL,MAAM,UAAU,OAAO,KAAK,GAAU,SAAS,GAC7C,OA1XV,SAAmB,GACjB,SAAU,EAAQ,aAChB,EAAQ,cACR,EAAQ,iBAAiB,OAC7B,CAsXiB,CAAU,EACnB,IAAK,CACT,CACF,CACF,EAEO,CACT,IAED,SAAS,aAAa,WACrB,IAAI,EAAiB,CACnB,QAAS,CACP,WAAW,EACX,UAAU,EACV,UAAU,GAEZ,KAAM,CAAC,aAAc,KAAM,YAAa,mBAAoB,cAAe,cAAe,iBACxF,SAAU,EAAY,EAAI,EAAW,EAAkB,EAAa,EAAa,GAC/E,IAAI,EAAS,CAAC,EAQd,IAAI,EAAe,KAwJnB,OAvJA,EAAO,gBAAkB,WACvB,OAAO,CACT,EAEA,EAAO,KAAO,SAAS,GACrB,IA6BI,EAzCsB,EAyDtB,EA7CA,EAAsB,EAAG,QACzB,EAAsB,EAAG,QACzB,EAAsB,EAAG,QACzB,EAAsB,EAAG,QAGzB,EAAgB,CAClB,OAAQ,EAAoB,QAC5B,OAAQ,EAAoB,QAC5B,OAAQ,EAAoB,QAC5B,SAAU,EAAoB,QAC9B,MAAO,SAAU,GACf,OAAO,EAAY,MAAM,EAAe,EAC1C,EACA,QAAS,SAAU,GACjB,OAAO,EAAY,QAAQ,EAAe,EAC5C,GASF,IALA,EAAe,QAAQ,OAAO,CAAC,EAAG,EAAe,QAAS,IAC7C,QAAU,EAAa,SAAW,CAAC,EAChD,EAAa,SAAW,EAAa,UAAY,EAAU,KAAK,QAAQ,GAAG,IAGtE,EAAa,YAAc,EAAa,WAAa,EAAa,YACrE,MAAM,IAAI,MAAM,oEAWlB,SAAS,IACP,OAAO,CACT,CAwGA,OAhHE,EADE,EAAa,UACa,EAAG,KAAK,EAAY,QAAQ,EAAa,QAAS,CAAC,EAAG,KAAM,OAGtF,EAAG,IAAI,EA9Ce,EA8CK,EA7CxB,EAAQ,SAAW,EAAG,KAAK,EAAQ,UACxC,EAAiB,QAAQ,WAAW,EAAQ,aAC1C,EAAQ,cAAgB,EAAQ,cA2CU,EAAY,QAAQ,EAAa,QAAS,CAAC,EAAG,KAAM,QAYlG,EAAc,EAAe,EAAG,IAAI,CAAC,IAClC,KAAK,EAAqB,GAC1B,MAAK,SAAwB,GAC5B,IAAI,EAAgB,EAAa,OAAS,EAEtC,EAAa,EAAc,OAC/B,EAAW,OAAS,EAAc,MAClC,EAAW,SAAW,EAAc,QAEpC,EAAW,IAAI,YAAY,WACpB,EAAW,2BACd,EAAW,SAAS,6BAExB,IAEA,IAoBI,EAAc,EApBd,EAAQ,CACV,MAAO,EACP,SAAU,EACV,eAAgB,EAChB,eAAgB,EAChB,UAAW,EAAa,UACxB,SAAU,EAAa,SACvB,SAAU,EAAa,SACvB,cAAe,EAAa,cAC5B,eAAgB,EAAa,eAC7B,YAAa,EAAa,YAC1B,kBAAmB,EAAa,kBAChC,eAAgB,EAAa,eAC7B,gBAAiB,EAAa,gBAC9B,KAAM,EAAa,KACnB,YAAa,EAAa,YAC1B,SAAU,EAAa,UAGrB,EAAY,CAAC,EACkB,EAAa,CAAC,EAmCjD,SAAS,EAAgB,EAAK,EAAU,EAAiB,GACvD,EAAI,OAAS,EACb,EAAI,OAAO,SAAW,CAAC,EACnB,EACF,EAAI,OAAO,kBAAoB,EAE/B,EAAI,kBAAoB,EAG1B,IAAI,EAAW,EAAW,EAAW,GAAK,EAC1C,QAAQ,QAAQ,GAAU,SAAS,EAAO,GACpC,IACF,EAAI,GAAO,GAGb,EAAI,OAAO,SAAS,GAAO,CAC7B,GACF,CAlDI,EAAa,WACf,EAAgB,GAAW,GAAO,GAAM,GACxC,EAAU,KAAO,EAAa,UAC9B,EAAM,UAAY,GACT,EAAa,aACtB,EAAgB,GAAY,GAAM,GAAO,GAIzC,EAAkB,EAAY,EAAa,WAAY,GAAY,EAAM,EAAa,cAClF,EAAa,cAAgB,EAAa,oBAC5C,EAAe,EAAgB,UAClB,OAAS,EAAW,OACjC,EAAa,SAAW,EAAW,SACnC,QAAQ,OAAO,EAAc,CAC3B,SAAU,EAAW,OAAO,UAC3B,IAGL,EAAe,IAEX,QAAQ,WAAW,EAAa,UAClC,EAAa,WAIZ,EAAa,YAChB,EAAM,QAAU,EAAW,IAG7B,EAAY,KAAK,EAAe,GAChC,EAAoB,SAAQ,EAoBhC,IAAG,SAAsB,GACvB,EAAoB,OAAO,GAC3B,EAAoB,OAAO,EAC7B,IAAY,SAAE,WACR,IAAiB,IACnB,EAAe,KAEnB,IAEO,CACT,EAEO,CACT,IAIJ,OAAO,CACT,IAEF,QAAQ,OAAO,sBAAuB,IAKrC,QAAQ,YAAa,CAAC,SAAU,SAAS,GACxC,MAAO,CACL,OAAQ,SAAS,EAAM,EAAQ,GAC7B,EAAK,YAAc,EAAO,SAAW,EAAO,EAAO,UAAU,OAAS,QAAQ,KAC9E,EAAK,YAAc,CAAE,cAAe,QAAQ,MAC5C,EAAK,UAAY,GAEjB,EAAK,KAAO,SAAS,EAAa,GAChC,EAAK,YAAc,EACnB,EAAK,OAAS,EAEd,EAAY,QAAU,WACpB,EAAK,QACP,EAEI,EAAO,aACT,EAAK,UAAU,KAAK,EAAO,QAAQ,OAAO,EAAO,cAAc,SAAS,GACtE,EAAK,aAAe,SAAS,EAAO,IACpC,EAAO,WAAa,EAAK,sBACzB,EAAK,YACP,KAEA,EAAK,aAAe,EAAO,aAG7B,EAAO,OAAO,cAAc,SAAS,EAAU,IACzC,QAAQ,UAAU,IAAa,IAAa,KAC9C,EAAO,WAAa,EAAK,sBACzB,EAAK,aAET,GACF,EAEA,EAAK,oBAAsB,WACzB,IAAI,EAAa,EAAK,aAAe,EAAI,EAAI,KAAK,KAAK,EAAO,WAAa,EAAK,cAChF,OAAO,KAAK,IAAI,GAAc,EAAG,EACnC,EAEA,EAAK,OAAS,WACZ,EAAO,KAAO,SAAS,EAAK,YAAY,WAAY,KAAO,CAC7D,EAEA,EAAO,WAAa,SAAS,EAAM,GAC7B,GACF,EAAI,mBAGc,EAAO,aAAe,IACtB,EAAO,OAAS,GAAQ,EAAO,GAAK,GAAQ,EAAO,aACjE,GAAO,EAAI,QACb,EAAI,OAAO,OAEb,EAAK,YAAY,cAAc,GAC/B,EAAK,YAAY,UAErB,EAEA,EAAO,QAAU,SAAS,GACxB,OAAO,EAAO,EAAM,SAAW,EAAK,OAAO,EAAM,OACnD,EAEA,EAAO,WAAa,WAClB,OAAuB,IAAhB,EAAO,IAChB,EAEA,EAAO,OAAS,WACd,OAAO,EAAO,OAAS,EAAO,UAChC,EAEA,EAAK,WAAa,WAChB,EAAK,YAAY,EAAO,QAAS,EAAO,YAEpC,EAAO,KAAO,EAAO,WACvB,EAAO,WAAW,EAAO,YAEzB,EAAK,YAAY,SAErB,EAEA,EAAO,IAAI,YAAY,WACrB,KAAO,EAAK,UAAU,QACpB,EAAK,UAAU,OAAf,EAEJ,GACF,EAEJ,IAEA,QAAQ,OAAO,qBAAsB,CAAC,sBAAuB,0BAE5D,WAAW,qBAAsB,CAAC,SAAU,SAAU,YAAa,iBAAkB,SAAS,EAAQ,EAAQ,EAAW,GACxH,EAAO,MAAQ,QAAQ,UAAU,EAAO,OAAS,EAAO,QAAQ,MAAM,EAAO,OAAS,EAAe,MAErG,EAAU,OAAO,KAAM,EAAQ,EACjC,IAEC,SAAS,iBAAkB,CAC1B,aAAc,GACd,aAAc,aACd,SAAU,SACV,OAAO,IAGR,UAAU,WAAY,CAAC,iBAAkB,SAAS,GACjD,MAAO,CACL,MAAO,CACL,WAAY,IACZ,aAAc,IACd,SAAU,IACV,WAAY,KAEd,QAAS,CAAC,WAAY,YACtB,SAAU,IACV,WAAY,qBACZ,aAAc,QACd,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,+BAC9B,EACA,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,EAAQ,SAAS,SACjB,IAAI,EAAiB,EAAM,GAAI,EAAc,EAAM,GAE9C,GAIL,EAAe,KAAK,EAAa,EACnC,EAEJ,IAEA,QAAQ,OAAO,0BAA2B,CAAC,sBAAuB,0BACjE,WAAW,0BAA2B,CAAC,SAAU,SAAU,SAAU,YAAa,sBAAuB,SAAS,EAAQ,EAAQ,EAAQ,EAAW,GACpJ,IAAI,EAAO,KAEP,EAAU,QAAQ,UAAU,EAAO,SAAW,EAAO,QAAQ,MAAM,EAAO,SAAW,EAAoB,QAC3G,EAAS,QAAQ,UAAU,EAAO,QAAU,EAAO,QAAQ,MAAM,EAAO,QAAU,EAAoB,OACtG,EAAgB,QAAQ,UAAU,EAAO,eAAiB,EAAO,QAAQ,MAAM,EAAO,eAAiB,EAAoB,cAC3H,EAAsB,QAAQ,UAAU,EAAO,qBAAuB,EAAO,QAAQ,MAAM,EAAO,qBAAuB,EAAoB,oBAC7I,EAAY,QAAQ,UAAU,EAAO,WAAa,SAAS,GAAO,OAAO,EAAO,QAAQ,MAAM,EAAO,UAAW,CAAC,MAAO,GAAO,EAAI,QAAQ,SAc7I,SAAS,EAAS,EAAQ,EAAM,GAC9B,MAAO,CACL,OAAQ,EACR,KAAM,EACN,OAAQ,EAEZ,CAnBA,EAAO,cAAgB,QAAQ,UAAU,EAAO,eAAiB,EAAO,QAAQ,MAAM,EAAO,eAAiB,EAAoB,cAClI,EAAO,eAAiB,QAAQ,UAAU,EAAO,gBAAkB,EAAO,QAAQ,MAAM,EAAO,gBAAkB,EAAoB,eAErI,EAAU,OAAO,KAAM,EAAQ,GAE3B,EAAO,SACT,EAAK,UAAU,KAAK,EAAO,QAAQ,OAAO,EAAO,EAAO,UAAU,SAAS,GACzE,EAAU,SAAS,EAAO,IAC1B,EAAK,QACP,KAmFF,IAAI,EAAiB,KAAK,OAC1B,KAAK,OAAS,WACZ,IACI,EAAO,KAAO,GAAK,EAAO,MAAQ,EAAO,aAC3C,EAAO,MA3EX,SAAkB,EAAa,GAC7B,IAAI,EAAQ,GAGR,EAAY,EAAG,EAAU,EACzB,EAAa,QAAQ,UAAU,IAAY,EAAU,EAGrD,IACE,GAGF,GADA,EAAY,KAAK,IAAI,EAAc,KAAK,MAAM,EAAU,GAAI,IACtC,EAAU,GAGlB,IAEZ,GADA,EAAU,GACY,EAAU,IAIlC,GAAa,KAAK,KAAK,EAAc,GAAW,GAAK,EAAU,EAG/D,EAAU,KAAK,IAAI,EAAY,EAAU,EAAG,KAKhD,IAAK,IAAI,EAAS,EAAW,GAAU,EAAS,IAAU,CACxD,IAAI,EAAO,EAAS,EAAQ,EAAU,GAAS,IAAW,GAC1D,EAAM,KAAK,EACb,CAGA,GAAI,GAAc,EAAU,KAAO,GAAU,GAAiB,GAAsB,CAClF,GAAI,EAAY,EAAG,CACjB,IAAK,GAAuB,EAAY,EAAG,CAC3C,IAAI,EAAkB,EAAS,EAAY,EAAG,OAAO,GACrD,EAAM,QAAQ,EAChB,CACE,GAAI,EAAqB,CACvB,GAAkB,IAAd,EAAiB,CACnB,IAAI,EAAiB,EAAS,EAAG,KAAK,GACtC,EAAM,QAAQ,EAChB,CAEA,IAAI,EAAgB,EAAS,EAAG,KAAK,GACrC,EAAM,QAAQ,EAChB,CACF,CAEA,GAAI,EAAU,EAAY,CACxB,IAAK,GAAuB,EAAU,EAAa,EAAG,CACtD,IAAI,EAAc,EAAS,EAAU,EAAG,OAAO,GAC/C,EAAM,KAAK,EACb,CACE,GAAI,EAAqB,CACvB,GAAI,IAAY,EAAa,EAAG,CAC9B,IAAI,EAAuB,EAAS,EAAa,EAAG,EAAa,GAAG,GACpE,EAAM,KAAK,EACb,CAEA,IAAI,EAAe,EAAS,EAAY,GAAY,GACpD,EAAM,KAAK,EACb,CACF,CACF,CACA,OAAO,CACT,CAMmB,CAAS,EAAO,KAAM,EAAO,YAEhD,CACF,IAEC,SAAS,sBAAuB,CAC/B,aAAc,GACd,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,UAAW,QACX,aAAc,WACd,SAAU,OACV,SAAU,OACV,QAAQ,EACR,eAAe,IAGhB,UAAU,gBAAiB,CAAC,SAAU,sBAAuB,SAAS,EAAQ,GAC7E,MAAO,CACL,MAAO,CACL,WAAY,IACZ,UAAW,IACX,aAAc,IACd,SAAU,IACV,SAAU,IACV,WAAW,KAEb,QAAS,CAAC,gBAAiB,YAC3B,SAAU,IACV,WAAY,0BACZ,aAAc,aACd,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,yCAC9B,EACA,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,EAAQ,SAAS,cACjB,IAAI,EAAiB,EAAM,GAAI,EAAc,EAAM,GAE9C,GAIL,EAAe,KAAK,EAAa,EACnC,EAEJ,IAOA,QAAQ,OAAO,uBAAwB,CAAC,wBAAyB,4BAMhE,SAAS,eAAe,WAEvB,IAAI,EAAiB,CACnB,UAAW,MACX,qBAAsB,GACtB,WAAW,EACX,WAAY,EACZ,gBAAiB,EACjB,eAAe,GAIb,EAAa,CACf,WAAc,aACd,MAAS,QACT,aAAgB,eAChB,MAAS,OACT,KAAQ,IAIN,EAAgB,CAAC,EAWtB,KAAK,QAAU,SAAS,GACvB,QAAQ,OAAO,EAAe,EAC/B,EAOC,KAAK,YAAc,SAAqB,GACtC,QAAQ,OAAO,EAAY,EAC7B,EAiBA,KAAK,KAAO,CAAC,UAAW,WAAY,WAAY,YAAa,eAAgB,eAAgB,aAAc,SAAU,eAAgB,SAAS,EAAS,EAAU,EAAU,EAAW,EAAW,EAAc,EAAY,EAAQ,GACjO,IAAI,EAAiB,EAAa,YAOlC,SAAS,EAAiB,GACxB,GAAgB,KAAZ,EAAE,MAAc,CAClB,IAAI,EAAO,EAAe,MACtB,IACF,EAAK,MAAM,QACX,EAAO,KAEX,CACF,CAEA,OAhBA,EAAU,GAAG,QAAS,GAEtB,EAAW,IAAI,YAAY,WACzB,EAAU,IAAI,QAAS,EACzB,IAYO,SAAkB,EAAQ,EAAQ,EAAoB,GAiB3D,SAAS,EAAY,GACnB,IAAI,GAAQ,GAAW,EAAQ,SAAW,GAAoB,MAAM,KAChE,EAAO,EAAK,KAAI,SAAS,GAC3B,OAAO,EAAW,IAAY,CAChC,IACA,MAAO,CACL,KAAM,EACN,KAAM,EAEV,CAzBA,EAAU,QAAQ,OAAO,CAAC,EAAG,EAAgB,EAAe,GA2B5D,IAAI,EAA2B,EAvDrB,QAFC,UAEe,SAAS,EAAQ,GAC3C,OAAQ,EAFM,IAEY,IAAM,EAAO,aACzC,IAuDM,EAAW,EAAa,cACxB,EAAS,EAAa,YACtB,EACF,QAAS,EAAT,qBACkB,EAAW,QAAU,EAAS,MAC7C,EAAQ,cACP,8BACA,YAAc,EAAW,UAAY,EAAS,MAJlD,wDAMmC,EANnC,wFAaF,MAAO,CACL,QAAS,SAAS,EAAO,GACvB,IAAI,EAAgB,EAAS,GAE7B,OAAO,SAAc,EAAO,EAAS,EAAO,GAC1C,IAAI,EACA,EACA,EACA,EACA,EACA,EASA,EARA,IAAe,QAAQ,UAAU,EAAQ,eAAgB,EAAQ,aACjE,EAAW,OAAY,GACvB,EAAe,QAAQ,UAAU,EAAM,EAAS,WAChD,EAAU,EAAM,MAAK,GACrB,GAAsB,EACtB,IAAc,QAAQ,UAAU,EAAM,EAAS,YAAa,EAAO,EAAM,EAAS,WAClF,IAAe,EAAQ,eAAgB,EAAO,EAAM,IACpD,EAAY,GAGZ,EAAkB,WAEf,GAAY,EAAQ,SAEpB,IACH,EAAkB,GAAS,WACzB,IAAI,EAAa,EAAU,iBAAiB,EAAS,EAAS,EAAQ,UAAW,GAC7E,EAAgB,QAAQ,UAAU,EAAQ,cAAgB,EAAQ,aAAe,EAAQ,KAAK,gBAC9F,EAAa,EAAe,EAAU,OAAO,GAAW,EAAU,SAAS,GAC/E,EAAQ,IAAI,CAAE,IAAK,EAAW,IAAM,KAAM,KAAM,EAAW,KAAO,OAClE,IAAI,EAAmB,EAAW,UAAU,MAAM,KAE7C,EAAQ,SAAS,EAAiB,MACrC,EAAQ,YAAY,EAAc,MAAM,KAAK,IAC7C,EAAQ,SAAS,EAAiB,KAG/B,EAAQ,SAAS,EAAQ,qBAAuB,EAAW,aAC9D,EAAQ,YAAY,EAAQ,qBAAuB,GACnD,EAAQ,SAAS,EAAQ,qBAAuB,EAAW,YAG7D,GAAS,WACP,IAAI,EAAgB,QAAQ,UAAU,EAAQ,cAAgB,EAAQ,aAAe,EAAQ,KAAK,gBAC9F,EAAa,EAAU,UAAU,EAAkB,EAAY,EAAe,GAC9E,GACF,EAAQ,IAAI,EAEhB,GAAG,GAAG,GAKF,EAAQ,SAAS,yBACnB,EAAU,cAAc,EAAS,EAAW,WAC5C,EAAQ,YAAY,yBACX,IAAkB,EAAW,WACtC,EAAU,cAAc,EAAS,EAAW,WAE9C,EAAgB,EAAW,UAE3B,EAAkB,IACpB,GAAG,GAAG,IAEV,EASA,SAAS,IACF,EAAQ,OAGX,IAFA,GAIJ,CAGA,SAAS,IACH,IAAiB,EAAM,MAAM,EAAM,EAAS,aAIhD,IA6IF,WACE,EAAQ,MAAQ,EAAM,EAAS,SAE7B,EAAQ,QADN,EACgB,EAAa,GAEb,EAAM,GAG1B,EAAQ,WAAa,EAAM,EAAS,SACpC,EAAQ,UAAY,QAAQ,UAAU,EAAM,EAAS,cAAgB,EAAM,EAAS,aAAe,EAAQ,UAC3G,IAAI,EAAY,EAAU,eAAe,EAAQ,WACjD,EAAgB,EAAU,GAAK,EAAU,GAAK,IAAM,EAAU,GAAK,EAAU,GAE7E,IAAI,EAAQ,SAAS,EAAM,EAAS,cAAe,IAC/C,EAAa,SAAS,EAAM,EAAS,mBAAoB,IAC7D,EAAQ,WAAc,MAAM,GAAiB,EAAQ,WAAhB,EACrC,EAAQ,gBAAmB,MAAM,GAA2B,EAAQ,gBAArB,CACjD,CA7JE,GAEI,EAAQ,WAGL,IACH,EAAc,EAAS,EAAM,EAAQ,YAAY,IAGnD,IAEJ,CAEA,SAAS,IACP,IAEI,EAAQ,gBACL,IACH,EAAc,EAAS,EAAM,EAAQ,iBAAiB,IAGxD,GAEJ,CAGA,SAAS,IAKP,GAJA,IACA,KAGK,EAAQ,QACX,OAAO,QAAQ,MA+DnB,WAEE,GAAI,EACF,OAGF,EAAqB,EAAQ,OAC7B,EAAU,EAAc,GAAoB,SAAS,GAC/C,EACF,EAAU,KAAK,QAAQ,OAAO,GAE9B,EAAQ,MAAM,EAElB,IAEA,EAAe,IAAI,EAAS,CAC1B,MAAO,IA+EX,WACE,EAAU,OAAS,EAEf,GACF,EAAU,KACR,EAAM,OAAO,GAAc,SAAS,GAClC,EAAQ,QAAU,GACb,GAAO,EAAQ,QAClB,GAEJ,KAGF,EAAU,KACR,EAAmB,QAAO,WACnB,IACH,GAAsB,EACtB,EAAmB,cAAa,WAC9B,GAAsB,EAClB,GAAW,EAAQ,QACrB,GAEJ,IAEJ,MAGF,EAAU,KACR,EAAM,SAAS,GAAQ,SAAS,GAC9B,EAAQ,QAAU,GACb,GAAO,EAAQ,OAClB,IAEA,GAEJ,KAIJ,EAAU,KACR,EAAM,SAAS,EAAS,SAAS,SAAS,GACxC,EAAQ,MAAQ,EACZ,EAAQ,QACV,GAEJ,KAGF,EAAU,KACR,EAAM,SAAS,EAAS,aAAa,SAAS,GAC5C,EAAQ,UAAY,GAAY,EAAQ,UACpC,EAAQ,QACV,GAEJ,IAEJ,CApIE,EACF,CAhFE,GAGA,EAAQ,YAAW,WACjB,EAAQ,QAAS,EACjB,GAAa,GACb,GACF,GACF,CAEA,SAAS,IACH,IACF,EAAS,OAAO,GAChB,EAAc,MAGZ,IACF,EAAS,OAAO,GAChB,EAAkB,KAEtB,CAGA,SAAS,IACF,GAKL,EAAQ,YAAW,WACb,IACF,EAAQ,QAAS,EACjB,GAAa,GAKT,EAAQ,UACL,IACH,EAAoB,EAAS,EAAe,KAAK,IAGnD,IAGN,GACF,CAEA,SAAS,IACH,IACF,EAAS,OAAO,GAChB,EAAc,MAGZ,IACF,EAAS,OAAO,GAChB,EAAoB,KAExB,CAwBA,SAAS,IACP,IACA,IAkII,EAAU,SACZ,QAAQ,QAAQ,GAAW,SAAS,GAClC,GACF,IACA,EAAU,OAAS,GAnIjB,IACF,EAAQ,SACR,EAAU,MAGZ,EAAe,OAAO,GAElB,IACF,EAAmB,WACnB,EAAqB,KAEzB,CA0BA,SAAS,EAAa,GAChB,GAAe,QAAQ,WAAW,EAAY,SAChD,EAAY,OAAO,EAAO,EAE9B,CA+FA,SAAS,EAAoB,GACtB,GAAY,EAAQ,QAAW,IAI/B,EAAQ,GAAG,SAAS,EAAE,SAAY,EAAQ,GAAG,SAAS,EAAE,SAC3D,IAEJ,CA/RA,EAAQ,UAAY,EAIpB,EAAQ,QAAS,EAsLjB,EAAQ,WAAa,WACnB,OAAO,EAAQ,OACjB,EAKA,EAAM,SAAS,YAAY,SAAS,GAC9B,GACF,IAGE,GAAO,EAAQ,QACjB,GAEJ,IAEI,GACF,EAAM,OAAO,GAAa,SAAS,GAC7B,IAAY,IAAQ,EAAQ,QAC9B,GAEJ,IAiFF,IAmBM,EAAmB,EACnB,EApBF,EAAqB,WACvB,EAAS,KAAK,SAAQ,SAAS,GACb,iBAAZ,EACF,EAAQ,IAAI,QAAS,IAErB,EAAQ,IAAI,EAAS,GACrB,EAAQ,IAAI,EAAS,GAEzB,IACA,EAAS,KAAK,SAAQ,SAAS,GACb,iBAAZ,EACF,EAAU,IAAI,QAAS,GAEvB,EAAQ,IAAI,EAAS,EAEzB,GACF,EAGM,EAAe,GAAI,EAAe,GAClC,EAAM,EAAM,MAAM,EAAM,EAAS,YACrC,IAEI,QAAQ,SAAS,IACnB,OAAO,KAAK,GAAK,SAAQ,SAAS,GAChC,EAAa,KAAK,GAClB,EAAa,KAAK,EAAI,GACxB,IACA,EAAW,CACT,KAAM,EACN,KAAM,IAGR,EAAW,EAAY,GAGH,SAAlB,EAAS,MACX,EAAS,KAAK,SAAQ,SAAS,EAAS,GACtB,iBAAZ,GACF,EAAQ,GAAG,QAAS,GACpB,EAAU,GAAG,QAAS,IACb,IAAY,EAAS,KAAK,GACnC,EAAQ,GAAG,EAAS,GACX,IACT,EAAQ,GAAG,EAAS,GACpB,EAAQ,GAAG,EAAS,KAAK,GAAM,IAGjC,EAAQ,GAAG,YAAY,SAAS,GACd,KAAZ,EAAE,OACJ,GAEJ,GACF,IAMJ,IAGI,EAHA,EAAY,EAAM,MAAM,EAAM,EAAS,cAC3C,EAAQ,UAAY,QAAQ,UAAU,KAAe,EAAY,EAAQ,UAGzE,IAAI,EAAY,EAAS,eAEvB,EADE,KAAa,QAA8B,IAArB,EAAM,IAGZ,EAAM,MAAM,EAAM,IAGtC,EAAe,QAAQ,UAAU,GAAmB,EAAkB,EAGtE,EAAM,IAAI,YAAY,WACpB,IACA,IACA,EAAU,IACZ,GACF,CACF,EAEJ,CACF,EACF,IAGC,UAAU,+BAAgC,CAClC,WAAY,OAAQ,WAAY,mBACzC,SAAU,EAAU,EAAM,EAAU,GAClC,MAAO,CACL,KAAM,SAAS,EAAO,EAAM,GAC1B,IAGE,EACA,EACA,EALE,EAAY,EAAM,MAAM,EAAM,gCAE9B,EAAgB,EAKhB,EAA4B,WAC1B,IACF,EAAgB,SAChB,EAAkB,MAGhB,IACF,EAAa,WACb,EAAe,MAGb,IACF,EAAS,MAAM,GAAgB,MAAK,WAClC,EAAkB,IACpB,IACA,EAAkB,EAClB,EAAiB,KAErB,EAEA,EAAM,OAAO,EAAK,mBAAmB,EAAM,+BAA+B,SAAS,GACjF,IAAI,IAAiB,EAEjB,GAGF,EAAiB,GAAK,GAAM,MAAK,SAAS,GACxC,GAAI,IAAiB,EAArB,CACA,IAAI,EAAW,EAAU,OAGrB,EAAQ,EAFG,EAEH,CAAmB,GAAU,SAAS,GAChD,IACA,EAAS,MAAM,EAAO,EACxB,IAGA,EAAiB,GADjB,EAAe,GAGF,MAAM,wBAAyB,EAZE,CAahD,IAAG,WACG,IAAiB,IACnB,IACA,EAAM,MAAM,uBAAwB,GAExC,IACA,EAAM,MAAM,2BAA4B,IAExC,GAEJ,IAEA,EAAM,IAAI,WAAY,EACxB,EAEJ,IAOC,UAAU,oBAAqB,CAAC,eAAgB,SAAS,GACxD,MAAO,CACL,SAAU,IACV,KAAM,SAAS,EAAO,EAAS,GAI7B,GAAI,EAAM,UAAW,CAGnB,IAAI,EAAW,EAAa,eAAe,EAAM,WACjD,EAAQ,SAAS,EAAS,GAC5B,CAEI,EAAM,YACR,EAAQ,SAAS,EAAM,YAGrB,EAAM,WACR,EAAQ,SAAS,EAAM,sBAE3B,EAEJ,IAEC,UAAU,mBAAmB,WAC5B,MAAO,CACL,SAAU,IACV,MAAO,CAAE,QAAS,KAClB,YAAa,0CAEjB,IAEC,UAAU,aAAc,CAAE,cAAe,SAAS,GACjD,OAAO,EAAY,aAAc,UAAW,aAC9C,IAEC,UAAU,2BAA2B,WACpC,MAAO,CACL,SAAU,IACV,MAAO,CAAE,WAAY,IAAK,YAAa,KACvC,YAAa,mDAEjB,IAEC,UAAU,qBAAsB,CAAC,cAAe,SAAS,GACxD,OAAO,EAAY,qBAAsB,UAAW,aAAc,CAChE,eAAe,GAEnB,IAEC,UAAU,uBAAuB,WAChC,MAAO,CACL,SAAU,IACV,MAAO,CAAE,WAAY,KACrB,YAAa,+CAEjB,IAEC,UAAU,iBAAkB,CAAC,cAAe,SAAS,GACpD,OAAO,EAAY,iBAAkB,UAAW,aAAc,CAC5D,eAAe,GAEnB,IAOA,QAAQ,OAAO,uBAAwB,CAAC,yBAEvC,UAAU,2BAA2B,WACpC,MAAO,CACL,SAAU,IACV,MAAO,CAAE,SAAU,IAAK,WAAY,IAAK,YAAa,KACtD,YAAa,6CAEjB,IAEC,UAAU,qBAAsB,CAAC,cAAe,SAAS,GACxD,OAAO,EAAY,qBAAsB,UAAW,QAAS,CAC3D,eAAe,GAEnB,IAEC,UAAU,uBAAuB,WAChC,MAAO,CACL,SAAU,IACV,MAAO,CAAE,WAAY,IAAK,SAAU,KACpC,YAAa,yCAEjB,IAEC,UAAU,iBAAkB,CAAC,cAAe,SAAS,GACpD,OAAO,EAAY,iBAAkB,UAAW,QAAS,CACvD,eAAe,GAEnB,IAEC,UAAU,mBAAmB,WAC5B,MAAO,CACL,SAAU,IACV,MAAO,CAAE,SAAU,IAAK,QAAS,KACjC,YAAa,oCAEjB,IAEC,UAAU,aAAc,CAAC,cAAe,SAAS,GAChD,OAAO,EAAY,aAAc,UAAW,QAC9C,IAEA,QAAQ,OAAO,2BAA4B,IAE1C,SAAS,oBAAqB,CAC7B,SAAS,EACT,IAAK,MAGN,WAAW,wBAAyB,CAAC,SAAU,SAAU,oBAAqB,SAAS,EAAQ,EAAQ,GACtG,IAAI,EAAO,KACP,EAAU,QAAQ,UAAU,EAAO,SAAW,EAAO,QAAQ,MAAM,EAAO,SAAW,EAAe,QAmDxG,SAAS,IACP,OAAO,QAAQ,UAAU,EAAO,UAAY,EAAO,SAAW,EAAe,GAC/E,CAnDA,KAAK,KAAO,GACZ,EAAO,IAAM,IAEb,KAAK,OAAS,SAAS,EAAK,EAAS,GAC9B,GACH,EAAQ,IAAI,CAAC,WAAc,SAG7B,KAAK,KAAK,KAAK,GAEf,EAAI,IAAM,IACV,EAAI,MAAQ,GAAS,QAAQ,UAAU,EAAM,OAAS,EAAM,MAAQ,cAEpE,EAAI,OAAO,SAAS,SAAS,GAC3B,EAAI,uBACN,IAEA,EAAI,sBAAwB,WAC1B,IAAI,EAAkB,EAAK,KAAK,QAAO,SAAS,EAAO,GAErD,OADA,EAAI,UAAY,IAAM,EAAI,MAAQ,EAAI,KAAK,QAAQ,GAC5C,EAAQ,EAAI,OACrB,GAAG,GAEC,EAAkB,MACpB,EAAI,SAAW,EAAkB,IAErC,EAEA,EAAI,IAAI,YAAY,WAClB,EAAU,KACV,EAAK,UAAU,EACjB,GACF,EAEA,KAAK,UAAY,SAAS,GACxB,KAAK,KAAK,OAAO,KAAK,KAAK,QAAQ,GAAM,GACzC,KAAK,KAAK,SAAQ,SAAU,GAC1B,EAAI,uBACN,GACF,EAGA,EAAO,OAAO,YAAY,SAAS,GACjC,EAAK,KAAK,SAAQ,SAAS,GACzB,EAAI,IAAM,IACV,EAAI,uBACN,GACF,GAKF,IAEC,UAAU,eAAe,WACxB,MAAO,CACL,SAAS,EACT,YAAY,EACZ,WAAY,wBACZ,QAAS,cACT,MAAO,CACL,SAAU,SAEZ,YAAa,yCAEjB,IAEC,UAAU,UAAU,WACnB,MAAO,CACL,SAAS,EACT,YAAY,EACZ,QAAS,eACT,MAAO,CACL,MAAO,IACP,KAAM,KAER,YAAa,oCACb,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,EAAa,OAAO,EAAO,EAAS,EACtC,EAEJ,IAEC,UAAU,kBAAkB,WAC3B,MAAO,CACL,SAAS,EACT,YAAY,EACZ,WAAY,wBACZ,MAAO,CACL,MAAO,IACP,SAAU,QACV,KAAM,KAER,YAAa,4CACb,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,EAAa,OAAO,EAAO,QAAQ,QAAQ,EAAQ,WAAW,IAAK,CAAC,MAAO,EAAM,OACnF,EAEJ,IAEA,QAAQ,OAAO,sBAAuB,IAErC,SAAS,kBAAmB,CAC3B,IAAK,EACL,QAAS,KACT,SAAU,KACV,aAAa,EACb,OAAQ,CAAC,MAAO,MAAO,QAAS,OAAQ,UAGzC,WAAW,sBAAuB,CAAC,SAAU,SAAU,kBAAmB,SAAS,EAAQ,EAAQ,GAClG,IAAI,EAAc,CAAE,cAAe,QAAQ,MACzC,EAAO,KAET,KAAK,KAAO,SAAS,IACnB,EAAc,GACF,QAAU,KAAK,OAE3B,EAAY,YAAY,MAAK,SAAS,GAKpC,OAJI,QAAQ,SAAS,KAAU,EAAS,KAAM,IAC5C,EAAQ,KAAK,MAAM,IAGd,CACT,IAEA,KAAK,QAAU,QAAQ,UAAU,EAAO,SAAW,EAAO,QAAQ,MAAM,EAAO,SAAW,EAAa,QACvG,KAAK,SAAW,QAAQ,UAAU,EAAO,UAAY,EAAO,QAAQ,MAAM,EAAO,UAAY,EAAa,SAC1G,KAAK,YAAc,QAAQ,UAAU,EAAO,aAC1C,EAAO,QAAQ,MAAM,EAAO,aAAe,EAAa,YAC1D,IAAI,EAAY,QAAQ,UAAU,EAAO,QAAU,EAAO,QAAQ,MAAM,EAAO,QAAU,EAAa,OACtG,KAAK,OAAS,QAAQ,QAAQ,IAAc,EAAU,OAAS,EAC7D,EAAY,EAAa,OAE3B,IAAI,EAAe,QAAQ,UAAU,EAAO,cAC1C,EAAO,QAAQ,MAAM,EAAO,cAC5B,IAAI,MAAM,QAAQ,UAAU,EAAO,KAAO,EAAO,QAAQ,MAAM,EAAO,KAAO,EAAa,KAC5F,EAAO,MAAQ,KAAK,qBAAqB,EAC3C,EAEA,KAAK,qBAAuB,SAAS,GACnC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,EAAI,EAAG,IACxC,EAAO,GAAK,QAAQ,OAAO,CAAE,MAAO,GAAK,CAAE,QAAS,KAAK,QAAS,SAAU,KAAK,SAAU,MAAO,KAAK,SAAS,IAAM,EAAO,IAE/H,OAAO,CACT,EAEA,KAAK,SAAW,SAAS,GACvB,OAAI,GAAS,KAAK,OAAO,OAChB,EAAQ,EAGV,KAAK,OAAO,EACrB,EAEA,EAAO,KAAO,SAAS,GACrB,IAAK,EAAO,UAAY,GAAS,GAAK,GAAS,EAAO,MAAM,OAAQ,CAClE,IAAI,EAAe,EAAK,aAAe,EAAY,aAAe,EAAQ,EAAI,EAC9E,EAAY,cAAc,GAC1B,EAAY,SACd,CACF,EAEA,EAAO,MAAQ,SAAS,GACjB,EAAO,WACV,EAAO,MAAQ,GAEjB,EAAO,QAAQ,CAAC,MAAO,GACzB,EAEA,EAAO,MAAQ,WACb,EAAO,MAAQ,EAAY,WAC3B,EAAO,SACT,EAEA,EAAO,UAAY,SAAS,GACtB,gBAAgB,KAAK,EAAI,SAC3B,EAAI,iBACJ,EAAI,kBACJ,EAAO,KAAK,EAAO,OAAuB,KAAd,EAAI,OAA8B,KAAd,EAAI,MAAe,GAAK,IAE5E,EAEA,KAAK,OAAS,WACZ,EAAO,MAAQ,EAAY,WAC3B,EAAO,MAAQ,EAAK,SAAS,EAAO,MAAQ,EAC9C,CACF,IAEC,UAAU,aAAa,WACtB,MAAO,CACL,QAAS,CAAC,YAAa,WACvB,SAAU,IACV,MAAO,CACL,SAAU,aACV,QAAS,IACT,QAAS,KAEX,WAAY,sBACZ,YAAa,kCACb,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,IAAI,EAAa,EAAM,GAAI,EAAc,EAAM,GAC/C,EAAW,KAAK,EAClB,EAEJ,IAEA,QAAQ,OAAO,oBAAqB,IAEnC,WAAW,sBAAuB,CAAC,SAAU,SAAU,GACtD,IACE,EAgFE,EAjFA,EAAO,KAsFX,SAAS,EAAa,GACpB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,KAAK,OAAQ,IACpC,GAAI,EAAK,KAAK,GAAG,QAAU,EACzB,OAAO,CAGb,CA1FA,EAAK,KAAO,GAEZ,EAAK,OAAS,SAAS,EAAO,GAC5B,IAAK,EAAW,CACd,IAAI,EAAgB,EAAa,GAC7B,EAAmB,EAAK,KAAK,GACjC,GAAI,EAAkB,CAKpB,GAJA,EAAiB,IAAI,WAAW,CAC9B,OAAQ,EACR,eAAgB,IAEd,GAAO,EAAI,qBACb,OAEF,EAAiB,IAAI,QAAS,CAChC,CAEA,IAAI,EAAW,EAAK,KAAK,GACrB,GACF,EAAS,IAAI,SAAS,CACpB,OAAQ,IAEV,EAAS,IAAI,QAAS,EACtB,EAAK,OAAS,EAAS,MACvB,EAAW,EAAS,QACV,GAAY,QAAQ,UAAU,KACxC,EAAK,OAAS,KACd,EAAW,KAEf,CACF,EAEA,EAAK,OAAS,SAAgB,GAiB5B,GAhBA,EAAK,KAAK,KAAK,CACb,IAAK,EACL,MAAO,EAAI,QAEb,EAAK,KAAK,MAAK,SAAS,EAAI,GAC1B,OAAI,EAAG,MAAQ,EAAG,MACT,EAGL,EAAG,MAAQ,EAAG,OACR,EAGH,CACT,IAEI,EAAI,QAAU,EAAK,SAAW,QAAQ,UAAU,EAAK,SAAgC,IAArB,EAAK,KAAK,OAAc,CAC1F,IAAI,EAAiB,EAAa,EAAI,OACtC,EAAK,OAAO,EACd,CACF,EAEA,EAAK,UAAY,SAAmB,GAElC,IADA,IAAI,EACK,EAAI,EAAG,EAAI,EAAK,KAAK,OAAQ,IACpC,GAAI,EAAK,KAAK,GAAG,MAAQ,EAAK,CAC5B,EAAQ,EACR,KACF,CAGF,GAAI,EAAK,KAAK,GAAO,QAAU,EAAK,OAAQ,CAC1C,IAAI,EAAoB,IAAU,EAAK,KAAK,OAAS,EACnD,EAAQ,EAAI,EAAQ,EAAI,EAAK,KAAK,OACpC,EAAK,OAAO,EACd,CAEA,EAAK,KAAK,OAAO,EAAO,EAC1B,EAEA,EAAO,OAAO,iBAAiB,SAAS,GAClC,QAAQ,UAAU,IAAQ,IAAQ,GACpC,EAAK,OAAO,EAAa,GAE7B,IAGA,EAAO,IAAI,YAAY,WACrB,GAAY,CACd,GASF,IAEC,UAAU,aAAa,WACtB,MAAO,CACL,YAAY,EACZ,SAAS,EACT,MAAO,CAAC,EACR,iBAAkB,CAChB,OAAQ,KACR,KAAM,KAER,WAAY,sBACZ,aAAc,SACd,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,+BAC9B,EACA,KAAM,SAAS,EAAO,EAAS,GAC7B,EAAM,WAAW,QAAQ,UAAU,EAAM,WACvC,EAAM,QAAQ,MAAM,EAAM,UAC5B,EAAM,YAAY,QAAQ,UAAU,EAAM,YACxC,EAAM,QAAQ,MAAM,EAAM,UAC9B,EAEJ,IAEC,UAAU,SAAU,CAAC,SAAU,SAAS,GACvC,MAAO,CACL,QAAS,aACT,SAAS,EACT,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,4BAC9B,EACA,YAAY,EACZ,MAAO,CACL,QAAS,IACT,MAAO,KACP,QAAS,KACT,SAAU,UAEV,WAAY,aAEd,WAAY,WAEZ,EACA,aAAc,MACd,KAAM,SAAS,EAAO,EAAK,EAAO,EAAY,GAC5C,EAAM,UAAW,EACb,EAAM,SACR,EAAM,QAAQ,OAAO,EAAO,EAAM,UAAU,SAAS,GACnD,EAAM,WAAc,CACtB,IAGE,QAAQ,YAAY,EAAM,SACxB,EAAW,MAAQ,EAAW,KAAK,OACrC,EAAM,MAAQ,KAAK,IAAI,MAAM,KAAM,EAAW,KAAK,KAAI,SAAS,GAAK,OAAO,EAAE,KAAO,KAAM,EAE3F,EAAM,MAAQ,GAId,QAAQ,YAAY,EAAM,WAC5B,EAAM,QAAU,IAGlB,EAAM,OAAS,SAAS,GACtB,IAAK,EAAM,SAAU,CAEnB,IADA,IAAI,EACK,EAAI,EAAG,EAAI,EAAW,KAAK,OAAQ,IAC1C,GAAI,EAAW,KAAK,GAAG,MAAQ,EAAO,CACpC,EAAQ,EACR,KACF,CAGF,EAAW,OAAO,EAAO,EAC3B,CACF,EAEA,EAAW,OAAO,GAClB,EAAM,IAAI,YAAY,WACpB,EAAW,UAAU,EACvB,IAIA,EAAM,cAAgB,CACxB,EAEJ,IAEC,UAAU,2BAA2B,WACpC,MAAO,CACL,SAAU,IACV,QAAS,UACT,KAAM,SAAS,EAAO,GACpB,EAAM,OAAO,kBAAkB,SAA8B,GACvD,IACF,EAAI,KAAK,IACT,EAAI,OAAO,GAEf,GACF,EAEJ,IAEC,UAAU,2BAA2B,WACpC,MAAO,CACL,SAAU,IACV,QAAS,aACT,KAAM,SAAS,EAAO,EAAK,GACzB,IAAI,EAAM,EAAM,MAAM,EAAM,yBAAyB,IAIrD,EAAI,cAAc,EAAI,SAAS,SAAS,GACtC,QAAQ,QAAQ,GAAU,SAAS,IAYzC,SAAsB,GACpB,OAAO,EAAK,UACV,EAAK,aAAa,oBAClB,EAAK,aAAa,yBAClB,EAAK,aAAa,sBACa,oBAA/B,EAAK,QAAQ,eACkB,yBAA/B,EAAK,QAAQ,eACkB,sBAA/B,EAAK,QAAQ,eACkB,oBAA/B,EAAK,QAAQ,cAEjB,CArBY,CAAa,GAIf,EAAI,OAAO,GAFX,EAAI,eAAiB,CAIzB,GACF,GACF,EAcJ,IAEA,QAAQ,OAAO,0BAA2B,IAEzC,SAAS,sBAAuB,CAC/B,SAAU,EACV,WAAY,EACZ,WAAY,EACZ,cAAc,EACd,aAAa,EACb,UAAW,KACX,eAAe,EACf,YAAY,EACZ,WAAW,EACX,cAAc,EACd,YAAa,4CAGd,WAAW,0BAA2B,CAAC,SAAU,WAAY,SAAU,SAAU,OAAQ,UAAW,sBAAuB,SAAS,EAAQ,EAAU,EAAQ,EAAQ,EAAM,EAAS,GACpL,IAAI,EAAW,IAAI,KACjB,EAAW,GACX,EAAc,CAAE,cAAe,QAAQ,MACvC,EAAY,QAAQ,UAAU,EAAO,WAAa,EAAO,QAAQ,MAAM,EAAO,WAAa,EAAiB,WAAa,EAAQ,iBAAiB,MAClJ,GAAW,QAAQ,UAAU,EAAO,WAAY,EAAO,QAAQ,MAAM,EAAO,UAE9E,EAAO,SAAW,QAAQ,UAAU,EAAO,UAAY,EAAO,SAAW,EACzE,EAAS,WAAW,YAEpB,KAAK,KAAO,SAAS,EAAc,IACjC,EAAc,GACF,QAAU,KAAK,OAE3B,EAAY,YAAY,SAAQ,SAAS,GACvC,OAAO,EAAa,IAAI,KAAK,GAAc,IAC7C,IAEA,IAAI,EAAe,EAAO,GAAG,GACzB,EAAiB,EAAO,GAAG,GAC3B,EAAiB,EAAO,GAAG,IAEd,QAAQ,UAAU,EAAO,YAAc,EAAO,QAAQ,MAAM,EAAO,YAAc,EAAiB,aAGjH,KAAK,sBAAsB,EAAc,EAAgB,IAG3C,QAAQ,UAAU,EAAO,WAAa,EAAO,QAAQ,MAAM,EAAO,WAAa,EAAiB,YAE9G,KAAK,oBAAoB,EAAc,EAAgB,GAGzD,EAAO,cAAgB,QAAQ,UAAU,EAAO,eAAiB,EAAO,QAAQ,MAAM,EAAO,eAAiB,EAAiB,cAC/H,KAAK,iBAAiB,EAAc,EAAgB,EACtD,EAEA,IAAI,EAAW,EAAiB,SAC5B,EAAO,UACT,EAAS,KAAK,EAAO,QAAQ,OAAO,EAAO,EAAO,WAAW,SAAS,GACpE,GAAY,CACd,KAGF,IAOI,EAMA,EAbA,EAAa,EAAiB,WAC9B,EAAO,YACT,EAAS,KAAK,EAAO,QAAQ,OAAO,EAAO,EAAO,aAAa,SAAS,GACtE,GAAc,CAChB,KAIF,EAAS,KAAK,EAAO,QAAQ,OAAO,EAAO,EAAO,MAAM,SAAS,GAC/D,IAAI,EAAK,IAAI,KAAK,GAClB,EAAM,MAAM,QAAM,EAAY,CAChC,KAGA,EAAS,KAAK,EAAO,QAAQ,OAAO,EAAO,EAAO,MAAM,SAAS,GAC/D,IAAI,EAAK,IAAI,KAAK,GAClB,EAAM,MAAM,QAAM,EAAY,CAChC,KAEA,IAAI,GAAW,EACX,EAAO,YACT,EAAS,KAAK,EAAO,QAAQ,OAAO,EAAO,EAAO,aAAa,SAAS,GACtE,EAAW,CACb,KAGF,EAAO,iBAAmB,WACxB,IAAI,EAAsB,EAAW,EAAqB,GAAX,GAC/C,OAAO,GAAY,EAAsB,GACvC,EAAsB,GAAY,EAAsB,CAC5D,EAEA,EAAO,iBAAmB,WACxB,IAAI,EAAsB,EAAW,EAAsB,IAAX,GAChD,OAAO,GAAY,EAAsB,GACvC,EAAsB,GAAY,EAAsB,CAC5D,EAEA,EAAO,mBAAqB,WAC1B,IAAI,EAAsB,EAAW,EAAU,GAC/C,OAAO,GAAY,EAAsB,GACvC,EAAsB,GAAY,EAAsB,CAC5D,EAEA,EAAO,mBAAqB,WAC1B,IAAI,EAAsB,EAAW,GAAW,GAChD,OAAO,GAAY,EAAsB,GACvC,EAAsB,GAAY,EAAsB,CAC5D,EAEA,EAAO,mBAAqB,WAC1B,IAAI,EAAsB,EAAW,EAAU,GAC/C,OAAO,GAAY,EAAsB,GACvC,EAAsB,GAAY,EAAsB,CAC5D,EAEA,EAAO,mBAAqB,WAC1B,IAAI,EAAsB,EAAW,GAAW,GAChD,OAAO,GAAY,EAAsB,GACvC,EAAsB,GAAY,EAAsB,CAC5D,EAEA,EAAO,iBAAmB,WACxB,OAAI,EAAS,WAAa,GACjB,GAAY,EAAW,EAAU,KAAW,EAG9C,GAAY,EAAW,GAAU,KAAY,CACtD,EAEA,IAAI,EAAa,EAAiB,WAkClC,SAAS,IACP,IAAI,GAAS,EAAO,MAGpB,IAFY,EAAO,aAAe,EAAQ,GAAK,EAAQ,GACrD,GAAS,GAAK,EAAQ,KACO,KAAjB,EAAO,MAYrB,OARI,EAAO,eACK,KAAV,IACF,EAAQ,GAEN,EAAO,WAAa,EAAU,KAChC,GAAgB,KAGb,CACT,CAEA,SAAS,IACP,IAAI,GAAW,EAAO,QAEtB,GADY,GAAW,GAAK,EAAU,IACL,KAAnB,EAAO,QAGrB,OAAO,CACT,CAOA,SAAS,EAAI,EAAO,GAClB,OAAc,OAAV,EACK,GAGF,QAAQ,UAAU,IAAU,EAAM,WAAW,OAAS,IAAM,EACjE,IAAM,EAAQ,EAAM,UACxB,CAwNA,SAAS,EAAQ,GACf,IACA,EAAY,cAAc,IAAI,KAAK,IACnC,EAAe,EACjB,CAEA,SAAS,IACP,EAAY,aAAa,QAAQ,GACjC,EAAO,cAAe,EACtB,EAAO,gBAAiB,EACxB,EAAO,gBAAiB,CAC1B,CAEA,SAAS,EAAe,GACtB,GAAK,EAAY,YAKV,CACL,IAAI,EAAQ,EAAS,WACnB,EAAU,EAAS,aACnB,EAAU,EAAS,aAEjB,EAAO,eACT,EAAkB,IAAV,GAAyB,KAAV,EAAe,GAAK,EAAQ,IAGrD,EAAO,MAA2B,MAAnB,EAAyB,EAAQ,EAAI,GAAQ,GACrC,MAAnB,IACF,EAAO,QAAU,EAAI,IAEvB,EAAO,SAAW,EAAS,WAAa,GAAK,EAAU,GAAK,EAAU,GAE/C,MAAnB,IACF,EAAO,QAAU,EAAI,IAEvB,EAAO,SAAW,EAAS,WAAa,GAAK,EAAU,GAAK,EAAU,EACxE,MAvBE,EAAO,MAAQ,KACf,EAAO,QAAU,KACjB,EAAO,QAAU,KACjB,EAAO,SAAW,EAAU,EAqBhC,CAEA,SAAS,EAAqB,GAC5B,EAAW,EAAW,EAAU,GAChC,GACF,CAEA,SAAS,EAAW,EAAU,GAC5B,OAAO,EAAW,EAAkB,GAAR,EAC9B,CAEA,SAAS,EAAW,EAAM,GACxB,IAAI,EAAK,IAAI,KAAK,EAAK,UAAsB,IAAV,GAC/B,EAAU,IAAI,KAAK,GAEvB,OADA,EAAQ,SAAS,EAAG,WAAY,EAAG,aAAc,EAAG,cAC7C,CACT,CAEA,SAAS,IACP,OAAyB,OAAjB,EAAO,OAAmC,KAAjB,EAAO,SAClB,OAAnB,EAAO,SAAuC,KAAnB,EAAO,YACjC,EAAO,aAAe,EAAO,cAAmC,OAAnB,EAAO,SAAuC,KAAnB,EAAO,SACrF,CA9VI,EAAO,YACT,EAAS,KAAK,EAAO,QAAQ,OAAO,EAAO,EAAO,aAAa,SAAS,GACtE,GAAc,CAChB,KAGF,EAAO,YAAc,EAAiB,YAClC,EAAO,aACT,EAAS,KAAK,EAAO,QAAQ,OAAO,EAAO,EAAO,cAAc,SAAS,GACvE,EAAO,cAAgB,CACzB,KAIF,EAAO,aAAe,EAAiB,aACnC,EAAO,cACT,EAAS,KAAK,EAAO,QAAQ,OAAO,EAAO,EAAO,eAAe,SAAS,GAGxE,GAFA,EAAO,eAAiB,EAEpB,EAAY,OAAO,KAAM,CAE3B,IAAI,EAAQ,IAAwB,EAAU,IAC1C,QAAQ,UAAU,IAAU,QAAQ,UAAU,KAChD,EAAS,SAAS,GAClB,IAEJ,MACE,GAEJ,KA+CF,KAAK,sBAAwB,SAAS,EAAc,EAAgB,GAClE,IAAI,EAAgB,SAAS,GACvB,EAAE,gBACJ,EAAI,EAAE,eAGR,IAAI,EAAQ,EAAE,WAAa,EAAE,YAAc,EAAE,OAC7C,OAAO,EAAE,QAAU,EAAQ,CAC7B,EAEA,EAAa,KAAK,oBAAoB,SAAS,GACxC,GACH,EAAO,OAAO,EAAc,GAAK,EAAO,iBAAmB,EAAO,kBAEpE,EAAE,gBACJ,IAEA,EAAe,KAAK,oBAAoB,SAAS,GAC1C,GACH,EAAO,OAAO,EAAc,GAAK,EAAO,mBAAqB,EAAO,oBAEtE,EAAE,gBACJ,IAEC,EAAe,KAAK,oBAAoB,SAAS,GAC3C,GACH,EAAO,OAAO,EAAc,GAAK,EAAO,mBAAqB,EAAO,oBAEtE,EAAE,gBACJ,GACF,EAGA,KAAK,oBAAsB,SAAS,EAAc,EAAgB,GAChE,EAAa,KAAK,WAAW,SAAS,GAC/B,IACa,KAAZ,EAAE,OACJ,EAAE,iBACF,EAAO,iBACP,EAAO,UACc,KAAZ,EAAE,QACX,EAAE,iBACF,EAAO,iBACP,EAAO,UAGb,IAEA,EAAe,KAAK,WAAW,SAAS,GACjC,IACa,KAAZ,EAAE,OACJ,EAAE,iBACF,EAAO,mBACP,EAAO,UACc,KAAZ,EAAE,QACX,EAAE,iBACF,EAAO,mBACP,EAAO,UAGb,IAEA,EAAe,KAAK,WAAW,SAAS,GACjC,IACa,KAAZ,EAAE,OACJ,EAAE,iBACF,EAAO,mBACP,EAAO,UACc,KAAZ,EAAE,QACX,EAAE,iBACF,EAAO,mBACP,EAAO,UAGb,GACF,EAEA,KAAK,iBAAmB,SAAS,EAAc,EAAgB,GAC7D,GAAI,EAAO,cAIT,OAHA,EAAO,YAAc,QAAQ,KAC7B,EAAO,cAAgB,QAAQ,UAC/B,EAAO,cAAgB,QAAQ,MAIjC,IAAI,EAAa,SAAS,EAAc,EAAgB,GACtD,EAAY,cAAc,MAC1B,EAAY,aAAa,QAAQ,GAC7B,QAAQ,UAAU,KACpB,EAAO,aAAe,GAGpB,QAAQ,UAAU,KACpB,EAAO,eAAiB,GAGtB,QAAQ,UAAU,KACpB,EAAO,eAAiB,EAE5B,EAEA,EAAO,YAAc,WACnB,IAAI,EAAQ,IACV,EAAU,IAEZ,EAAY,YAER,QAAQ,UAAU,IAAU,QAAQ,UAAU,IAChD,EAAS,SAAS,GAClB,EAAS,WAAW,GAChB,EAAW,GAAO,EAAW,EAC/B,GAAW,GAEX,EAAQ,MAGV,GAAW,EAEf,EAEA,EAAa,KAAK,QAAQ,SAAS,GACjC,EAAY,cACR,IACF,IAC0B,OAAjB,EAAO,OAAmC,KAAjB,EAAO,MACzC,GAAW,IACD,EAAO,cAAgB,EAAO,MAAQ,IAChD,EAAO,QAAO,WACZ,EAAO,MAAQ,EAAI,EAAO,OAAQ,EACpC,GAEJ,IAEA,EAAO,cAAgB,WACrB,IAAI,EAAU,IACZ,EAAQ,IAEV,EAAY,YAER,QAAQ,UAAU,IAAY,QAAQ,UAAU,IAClD,EAAS,SAAS,GAClB,EAAS,WAAW,GAChB,EAAW,GAAO,EAAW,EAC/B,OAAW,GAAW,GAEtB,EAAQ,MAGV,OAAW,GAAW,EAE1B,EAEA,EAAe,KAAK,QAAQ,SAAS,GACnC,EAAY,cACR,IACF,IAC4B,OAAnB,EAAO,QAChB,OAAW,GAAW,IACZ,EAAO,gBAAkB,EAAO,QAAU,IACpD,EAAO,QAAO,WACZ,EAAO,QAAU,EAAI,EAAO,QAC9B,GAEJ,IAEA,EAAO,cAAgB,WACrB,IAAI,EArLR,WACE,IAAI,GAAW,EAAO,QACtB,OAAO,GAAW,GAAK,EAAU,GAAK,OAAU,CAClD,CAkLkB,GAEd,EAAY,YAER,QAAQ,UAAU,IACpB,EAAS,WAAW,GACpB,EAAQ,MAER,OAAW,OAAW,GAAW,EAErC,EAEA,EAAe,KAAK,QAAQ,SAAS,GAC/B,IACF,KACU,EAAO,gBAAkB,EAAO,QAAU,IACpD,EAAO,QAAQ,WACb,EAAO,QAAU,EAAI,EAAO,QAC9B,GAEJ,GAEF,EAEA,KAAK,OAAS,WACZ,IAAI,EAAO,EAAY,WAEnB,MAAM,IACR,EAAY,aAAa,QAAQ,GACjC,EAAK,MAAM,mKAEP,IACF,EAAW,GAGT,EAAW,GAAO,EAAW,GAC/B,EAAY,aAAa,QAAQ,GACjC,EAAO,cAAe,EACtB,EAAO,gBAAiB,GAExB,IAEF,IAEJ,EAkEA,EAAO,aAAe,QAAQ,UAAU,EAAO,cAC7C,EAAO,QAAQ,MAAM,EAAO,cAAgB,EAAiB,aAE/D,EAAO,eAAiB,WACjB,EAAO,oBACV,EAAgC,GAAX,EAAgB,GAEzC,EAEA,EAAO,eAAiB,WACjB,EAAO,oBACV,EAAiC,IAAX,EAAgB,GAE1C,EAEA,EAAO,iBAAmB,WACnB,EAAO,sBACV,EAAkC,GAAb,EAEzB,EAEA,EAAO,iBAAmB,WACnB,EAAO,sBACV,EAAmC,IAAb,EAE1B,EAEA,EAAO,iBAAmB,WACnB,EAAO,sBACV,EAAqB,EAEzB,EAEA,EAAO,iBAAmB,WACnB,EAAO,sBACV,GAAsB,EAE1B,EAEA,EAAO,eAAiB,WACtB,IAAI,EAAU,IACV,EAAQ,IAEP,EAAO,qBACN,QAAQ,UAAU,IAAY,QAAQ,UAAU,GAClD,EAAqB,KAAW,EAAS,WAAa,GAAK,IAAM,KAEjE,EAAO,SAAW,EAAO,WAAa,EAAU,GAAK,EAAU,GAAK,EAAU,GAGpF,EAEA,EAAO,KAAO,WACZ,EAAY,aACd,EAEA,EAAO,IAAI,YAAY,WACrB,KAAO,EAAS,QACd,EAAS,OAAT,EAEJ,GACF,IAEC,UAAU,gBAAiB,CAAC,sBAAuB,SAAS,GAC3D,MAAO,CACL,QAAS,CAAC,gBAAiB,aAC3B,SAAU,IACV,WAAY,0BACZ,aAAc,aACd,MAAO,CAAC,EACR,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,aAAe,EAAoB,WAClD,EACA,KAAM,SAAS,EAAO,EAAS,EAAO,GACpC,IAAI,EAAiB,EAAM,GAAI,EAAc,EAAM,GAE/C,GACF,EAAe,KAAK,EAAa,EAAQ,KAAK,SAElD,EAEJ,IAEA,QAAQ,OAAO,yBAA0B,CAAC,wBAAyB,0BAMhE,QAAQ,qBAAsB,CAAC,SAAU,SAAS,GAEjD,IAAI,EAAmB,yFACvB,MAAO,CACL,MAAO,SAAS,GACd,IAAI,EAAQ,EAAM,MAAM,GACxB,IAAK,EACH,MAAM,IAAI,MACR,gHACiB,EAAQ,MAG7B,MAAO,CACL,SAAU,EAAM,GAChB,OAAQ,EAAO,EAAM,IACrB,WAAY,EAAO,EAAM,IAAM,EAAM,IACrC,YAAa,EAAO,EAAM,IAE9B,EAEJ,IAEC,WAAW,yBAA0B,CAAC,SAAU,WAAY,SAAU,WAAY,SAAU,KAAM,WAAY,YAAa,UAAW,aAAc,aAAc,eAAgB,qBACjL,SAAS,EAAe,EAAS,EAAO,EAAU,EAAQ,EAAI,EAAU,EAAW,EAAS,EAAY,EAAY,EAAW,GAC/H,IAEI,EAAW,EAFX,EAAW,CAAC,EAAG,GAAI,GAAI,GAAI,IAM3B,EAAY,EAAc,MAAM,EAAM,oBACrC,GAA2B,IAAd,IAChB,EAAY,GAGd,EAAc,OAAO,EAAM,oBAAoB,SAAU,GACrD,EAAa,GAAqB,IAAX,EAAmB,EAAJ,CAC1C,IAGA,IAAI,EAAW,EAAc,MAAM,EAAM,kBAAoB,EAGzD,GAA8D,IAAjD,EAAc,MAAM,EAAM,mBAC3C,EAAc,OAAO,EAAM,mBAAmB,SAAU,GACtD,GAAwB,IAAX,CACf,IAGA,IAmDI,EAKA,EAxDA,EAAkB,EAAO,EAAM,kBAAkB,QAAU,QAAQ,KAGnE,EAAgB,EAAM,sBAAwB,EAAO,EAAM,uBAAyB,SAAS,EAAO,GACtG,IAAI,EAAM,EAAK,OACf,OAAqB,KAAd,EAAI,OAA8B,IAAd,EAAI,KACjC,EAGI,EAAmB,EAAO,EAAM,mBAGhC,IAAiB,QAAQ,UAAU,EAAM,wBAAyB,EAAc,MAAM,EAAM,uBAG5F,EAAoB,EAAO,EAAM,oBAAoB,QAAU,QAAQ,KAEvE,EAAiB,EAAM,wBAA0B,EAAO,EAAM,8BAA2B,EAEzF,IAAe,EAAM,uBAAwB,EAAc,MAAM,EAAM,uBAEvE,EAAW,EAAM,kBACnB,EAAc,MAAM,EAAM,mBAAqB,KAE7C,GAAgE,IAAnD,EAAc,MAAM,EAAM,qBAGvC,IAAgB,EAAM,wBAAyB,EAAc,MAAM,EAAM,wBAGzE,EAAe,EAAO,EAAM,iBAAiB,QAAU,QAAQ,KAE/D,EAAW,EAAc,MAAM,EAAM,qBAAsB,EAK3D,EAAc,EAAO,EAAM,SAC3B,EAAoB,EAAO,EAAM,QAAU,UAW3C,EAAe,EAAgB,MAAM,EAAM,cAW3C,EAAQ,EAAc,OACtB,EAAa,EAAc,IAAI,YAAY,WAC7C,EAAM,UACR,IACA,EAAM,IAAI,WAAY,GAGtB,IAOI,EAAiB,EAPjB,EAAU,aAAe,EAAM,IAAM,IAAM,KAAK,MAAsB,IAAhB,KAAK,UAC/D,EAAQ,KAAK,CACX,oBAAqB,OACrB,iBAAiB,EACjB,YAAa,IAKX,KACF,EAAkB,QAAQ,QAAQ,gBAClB,IAAI,WAAY,YAChC,EAAQ,MAAM,IACd,EAAgB,EAAQ,SACV,KAAK,cAAe,IAClC,EAAc,KAAK,WAAY,MAC/B,EAAc,IAAI,IAClB,EAAc,IAAI,CAChB,SAAY,WACZ,IAAO,MACP,KAAQ,MACR,eAAgB,cAChB,aAAc,OACd,QAAW,EACX,WAAc,4EACd,MAAS,SAEX,EAAQ,IAAI,CACV,SAAY,WACZ,iBAAkB,MAClB,mBAAoB,gBAGlB,EAAc,KAAK,OACrB,EAAc,WAAW,MAE3B,EAAgB,OAAO,GACvB,EAAc,MAAM,IAItB,IAAI,EAAU,QAAQ,QAAQ,mCAC9B,EAAQ,KAAK,CACX,GAAI,EACJ,QAAS,UACT,OAAQ,YACR,OAAQ,yBACR,mBAAoB,iBACpB,MAAO,QACP,SAAU,WACV,iBAAkB,uBAClB,SAAU,mBAGR,QAAQ,UAAU,EAAM,uBAC1B,EAAQ,KAAK,eAAgB,EAAM,sBAGjC,QAAQ,UAAU,EAAM,4BAC1B,EAAQ,KAAK,qBAAsB,EAAM,2BAG3C,IAMI,EAAe,WACjB,EAAM,QAAU,GAChB,EAAM,WAAa,EACnB,EAAQ,KAAK,iBAAiB,GAR1B,GACF,EAAc,IAAI,GAStB,EAEI,EAAa,SAAS,GACxB,OAAO,EAAU,WAAa,CAChC,EAIA,EAAM,OAAO,aAAa,SAAS,GAC7B,EAAQ,EACV,EAAQ,WAAW,yBAEnB,EAAQ,KAAK,wBAAyB,EAAW,GAErD,IAEA,IAQI,EAAkB,SAAS,EAAY,GACzC,IAAI,EAAS,CAAC,WAAY,GAC1B,EAAgB,GAAe,GAC/B,EAAkB,GAAe,GACjC,EAAG,KAAK,EAAa,OAAO,EAAe,IAAS,MAAK,SAAS,GAGhE,IAAI,EAAmB,IAAe,EAAU,WAChD,GAAI,GAAoB,EACtB,GAAI,GAAW,EAAQ,OAAS,EAAG,CACjC,EAAM,UAAY,EAAa,GAAK,EACpC,EAAkB,GAAe,GACjC,EAAM,QAAQ,OAAS,EAGvB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAClC,EAAO,EAAa,UAAY,EAAQ,GACxC,EAAM,QAAQ,KAAK,CACjB,GAAI,EAAW,GACf,MAAO,EAAa,WAAW,EAAO,GACtC,MAAO,EAAQ,KAuBnB,GAnBA,EAAM,MAAQ,EAId,IAEA,EAAQ,KAAK,iBAAiB,GAG1B,GAA0C,IAAzB,EAAM,QAAQ,QAzCnB,SAAS,EAAY,GAC3C,SAAI,EAAM,QAAQ,OAAS,GAAS,IAC3B,EAAW,gBAAkB,EAAM,QAAQ,GAAO,MAAM,aAInE,CAmC2D,CAAkB,EAAY,KAC3E,QAAQ,SAAS,EAAM,iBAAmB,QAAQ,SAAS,EAAM,gBACnE,GAAW,WACT,EAAM,OAAO,EAAG,EAClB,GAAG,QAAQ,SAAS,EAAM,gBAAkB,EAAM,eAAiB,EAAM,eAAwB,SAEjG,EAAM,OAAO,EAAG,IAIhB,EAAU,CACZ,IAAI,EAAa,EAAM,QAAQ,GAAG,MAC9B,QAAQ,SAAS,IACnB,EAAW,OAAS,GACpB,EAAW,MAAM,EAAG,EAAW,QAAQ,gBAAkB,EAAW,cACpE,EAAc,IAAI,EAAa,EAAW,MAAM,EAAW,SAE3D,EAAc,IAAI,GAEtB,CACF,MACE,IACA,EAAkB,GAAe,GAGjC,GACF,EAAgB,GAAe,EAEnC,IAAG,WACD,IACA,EAAgB,GAAe,GAC/B,EAAkB,GAAe,EACnC,GACF,EAGI,IACF,QAAQ,QAAQ,GAAS,GAAG,SAAU,GACtC,EAAU,KAAK,QAAQ,GAAG,SAAU,IAKtC,IAgCI,EAhCA,EAAuB,GAAW,WAEhC,EAAM,QAAQ,QAChB,IAGF,EAAM,gBAAiB,CACzB,GA/QwB,KAoRxB,SAAS,IACF,EAAM,iBACT,EAAM,gBAAiB,EACvB,EAAM,WAGR,GACF,CAIA,SAAS,IACP,EAAM,SAAW,EAAe,EAAU,OAAO,GAAW,EAAU,SAAS,GAC/E,EAAM,SAAS,KAAO,EAAQ,KAAK,eACrC,CAhBA,EAAM,gBAAiB,EAmBvB,EAAM,WAAQ,EAKd,IAMI,EAAwB,WACtB,GACF,EAAS,OAAO,EAEpB,EAEA,IAEA,EAAM,aAAe,SAAU,GAC7B,EAAa,EAAe,EAC9B,EAEA,EAAM,OAAS,SAAS,EAAW,GAEjC,IACI,EAAO,EADP,EAAS,CAAC,EAGd,GAAW,EACX,EAAO,EAAa,UAAY,EAAO,EAAM,QAAQ,GAAW,MAChE,EAAQ,EAAa,YAAY,EAAe,GApQ7B,SAAS,EAAO,GAC/B,QAAQ,WAAW,EAAY,KACjC,GAAkB,EAAe,UAAY,EAAe,SAAS,aAC9D,EAAkB,EAAO,CAAC,KAAM,IAGlC,EAAY,OAAO,EAAO,EACnC,CA8PE,CAAe,EAAe,GAC9B,EAAU,aAAa,YAAY,GACnC,EAAU,aAAa,SAAS,GAEhC,EAAiB,EAAe,CAC9B,MAAO,EACP,OAAQ,EACR,OAAQ,EAAa,WAAW,EAAe,GAC/C,OAAQ,IAGV,KAIkD,IAA9C,EAAM,MAAM,EAAM,yBACpB,GAAS,WAAa,EAAQ,GAAG,OAAS,GAAG,GAAG,EAEpD,EAGA,EAAQ,GAAG,WAAW,SAAS,GAE7B,GAA6B,IAAzB,EAAM,QAAQ,SAAiD,IAAjC,EAAS,QAAQ,EAAI,OAAvD,CAIA,IAeI,EAfA,EAAe,EAAc,EAAe,CAAC,OAAQ,IAQzD,IAAyB,IAArB,EAAM,WAAoB,GAA8B,IAAd,EAAI,OAAiB,EAAI,SAGrE,OAFA,SACA,EAAM,UAMR,OAFA,EAAI,iBAEI,EAAI,OACV,KAAK,GACH,EAAI,kBAEJ,IACA,EAAc,UACd,MACF,KAAK,GACH,EAAM,WAAa,EAAM,UAAY,EAAI,EAAM,UAAY,EAAM,QAAQ,QAAU,EACnF,EAAM,WACN,EAAS,EAAQ,GAAG,iBAAiB,wBAAwB,EAAM,YAC5D,WAAW,UAAY,EAAO,UACrC,MACF,KAAK,GACH,EAAM,WAAa,EAAM,UAAY,GAAK,EAAM,QAAQ,OACxD,EAAM,WACN,EAAS,EAAQ,GAAG,iBAAiB,wBAAwB,EAAM,YAC5D,WAAW,UAAY,EAAO,UACrC,MACF,QACM,GACF,EAAM,QAAO,WACP,QAAQ,SAAS,EAAM,iBAAmB,QAAQ,SAAS,EAAM,gBACnE,GAAW,WACT,EAAM,OAAO,EAAM,UAAW,EAChC,GAAG,QAAQ,SAAS,EAAM,gBAAkB,EAAM,eAAiB,EAAM,eAAwB,SAEjG,EAAM,OAAO,EAAM,UAAW,EAElC,IA/CN,CAkDF,IAEA,EAAQ,KAAK,SAAS,SAAU,GAC9B,GAAW,EACO,IAAd,GAAoB,EAAU,YAChC,GAAS,WACP,EAAgB,EAAU,WAAY,EACxC,GAAG,EAEP,IAEA,EAAQ,KAAK,QAAQ,SAAS,GACxB,GAAkB,EAAM,QAAQ,SAA+B,IAArB,EAAM,YAAqB,IACvE,GAAW,EACX,EAAM,QAAO,WACP,QAAQ,SAAS,EAAM,iBAAmB,QAAQ,SAAS,EAAM,eAAe,MAClF,GAAW,WACT,EAAM,OAAO,EAAM,UAAW,EAChC,GAAG,EAAM,eAAe,MAExB,EAAM,OAAO,EAAM,UAAW,EAElC,MAEG,GAAc,EAAU,OAAO,WAClC,EAAU,gBACV,EAAM,QAAO,WAEX,EAAU,aAAa,YAAY,GACnC,EAAU,aAAa,SAAS,EAClC,IACA,EAAQ,IAAI,KAEd,GAAW,EACX,GAAW,CACb,IAGA,IAAI,EAAsB,SAAS,GAG7B,EAAQ,KAAO,EAAI,QAAwB,IAAd,EAAI,OAAwC,IAAzB,EAAM,QAAQ,SAChE,IACK,EAAW,SACd,EAAc,UAGpB,EAEA,EAAU,GAAG,QAAS,GAEtB,EAAc,IAAI,YAAY,WAC5B,EAAU,IAAI,QAAS,IACnB,GAAgB,IAClB,EAAO,SAGL,IACF,QAAQ,QAAQ,GAAS,IAAI,SAAU,GACvC,EAAU,KAAK,QAAQ,IAAI,SAAU,IAGvC,EAAQ,SAEJ,GACA,EAAgB,QAEtB,IAEA,IAAI,EAAS,EAAS,EAAT,CAAkB,GAE3B,EACF,EAAU,KAAK,QAAQ,OAAO,GACrB,EACT,QAAQ,QAAQ,GAAU,GAAG,GAAG,OAAO,GAEvC,EAAQ,MAAM,GAGhB,KAAK,KAAO,SAAS,EAAY,GAC/B,EAAY,EACZ,EAAiB,EAEjB,EAAM,eAAiB,EAAU,UAAY,EAAO,EAAU,SAAS,SAA1B,CAAoC,GAIjF,EAAU,SAAS,SAAQ,SAAS,GAgBlC,OAfA,GAAW,EAEO,IAAd,GAAmB,GAAc,EAAW,QAAU,EACpD,EAAW,GACb,IAjMwB,SAAS,GACvC,EAAiB,GAAS,WACxB,EAAgB,EAClB,GAAG,EACL,CA8LQ,CAA0B,IAE1B,EAAgB,IAGlB,EAAgB,GAAe,GAC/B,IACA,KAGE,EACK,EAGJ,OAML,EAAU,aAAa,YAAY,IAJjC,EAAU,aAAa,YAAY,GAC5B,KAKX,IAEA,EAAU,YAAY,MAAK,SAAS,GAClC,IAAI,EACA,EAAS,CAAC,EASd,OAJK,GACH,EAAU,aAAa,YAAY,GAGjC,GACF,EAAO,OAAS,EACT,EAAe,EAAe,KAKvC,EAAO,EAAa,UAAY,EAChC,EAAqB,EAAa,WAAW,EAAe,GAC5D,EAAO,EAAa,eAAY,EAGzB,IAFU,EAAa,WAAW,EAAe,GAET,EAAqB,EACtE,GACF,CACF,IAEC,UAAU,gBAAgB,WACzB,MAAO,CACL,WAAY,yBACZ,QAAS,CAAC,UAAW,mBAAoB,gBACzC,KAAM,SAAS,EAAe,EAAS,EAAO,GAC5C,EAAM,GAAG,KAAK,EAAM,GAAI,EAAM,GAChC,EAEJ,IAEC,UAAU,oBAAqB,CAAC,aAAc,SAAS,GACtD,MAAO,CACL,MAAO,CACL,QAAS,IACT,MAAO,IACP,OAAQ,IACR,SAAU,IACV,eAAgB,IAChB,OAAQ,IACR,aAAc,IACd,SAAU,KAEZ,SAAS,EACT,YAAa,SAAS,EAAS,GAC7B,OAAO,EAAM,kBAAoB,6CACnC,EACA,KAAM,SAAS,EAAO,EAAS,GAC7B,EAAM,YAAc,EAAM,YAE1B,EAAM,OAAS,WACb,IAAI,EAAiB,EAAM,QAAQ,OAAS,EAE5C,OADA,EAAM,aAAa,CAAE,OAAQ,IACtB,CACT,EAEA,EAAM,SAAW,SAAS,GACxB,OAAO,EAAM,SAAW,CAC1B,EAEA,EAAM,aAAe,SAAS,GAC5B,EAAM,OAAS,CACjB,EAEA,EAAM,YAAc,SAAS,EAAW,GACtC,IAAI,EAAW,EAAM,WACjB,QAAQ,SAAS,IAAa,QAAQ,SAAS,GACjD,GAAW,WACT,EAAM,OAAO,CAAC,UAAW,EAAW,IAAK,GAC3C,GAAG,QAAQ,SAAS,GAAY,EAAW,EAAkB,SAE7D,EAAM,OAAO,CAAC,UAAW,EAAW,IAAK,GAE7C,CACF,EAEJ,IAEC,UAAU,oBAAqB,CAAC,mBAAoB,WAAY,SAAU,SAAS,EAAkB,EAAU,GAC9G,MAAO,CACL,MAAO,CACL,MAAO,IACP,MAAO,IACP,MAAO,KAET,KAAM,SAAS,EAAO,EAAS,GAC7B,IAAI,EAAS,EAAO,EAAM,YAAb,CAA0B,EAAM,UAAY,8CACzD,EAAiB,GAAQ,MAAK,SAAS,GACrC,IAAI,EAAQ,QAAQ,QAAQ,EAAW,QACvC,EAAQ,YAAY,GACpB,EAAS,EAAT,CAAgB,EAClB,GACF,EAEJ,IAEC,OAAO,wBAAyB,CAAC,OAAQ,YAAa,OAAQ,SAAS,EAAM,EAAW,GACvF,IAAI,EAaJ,OAZA,EAAoB,EAAU,IAAI,aAY3B,SAAS,EAAW,GAQzB,OAPK,GALP,SAAsB,GACpB,MAAO,QAAQ,KAAK,EACtB,CAG4B,CAAa,IACrC,EAAK,KAAK,iDAEZ,EAAY,GAAS,GAAK,GAAW,QAAQ,IAAI,OAAoB,EAXhD,QAAQ,yBAA0B,QAWsB,MAAO,uBAAyB,EACxG,IACH,EAAY,EAAK,YAAY,IAExB,CACT,CACF,IAEF,QAAQ,OAAO,8CAA+C,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAChG,EAAe,IAAI,8CACjB,itBASJ,IAEA,QAAQ,OAAO,wCAAyC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAC1F,EAAe,IAAI,wCACjB,+DACJ,IAEA,QAAQ,OAAO,gCAAiC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAClF,EAAe,IAAI,gCACjB,uNAMJ,IAEA,QAAQ,OAAO,sCAAuC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GACxF,EAAe,IAAI,sCACjB,u6BAeJ,IAEA,QAAQ,OAAO,mCAAoC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GACrF,EAAe,IAAI,mCACjB,kDAEJ,IAEA,QAAQ,OAAO,0CAA2C,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAC5F,EAAe,IAAI,0CACjB,qTAMJ,IAEA,QAAQ,OAAO,mCAAoC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GACrF,EAAe,IAAI,mCACjB,u3DA+BJ,IAEA,QAAQ,OAAO,qCAAsC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GACvF,EAAe,IAAI,qCACjB,qiDA0BJ,IAEA,QAAQ,OAAO,oCAAqC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GACtF,EAAe,IAAI,oCACjB,yhDA0BJ,IAEA,QAAQ,OAAO,0CAA2C,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAC5F,EAAe,IAAI,0CACjB,gyBAWJ,IAEA,QAAQ,OAAO,iCAAkC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GACnF,EAAe,IAAI,iCACjB,+HAEJ,IAEA,QAAQ,OAAO,gCAAiC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAClF,EAAe,IAAI,gCACjB,+ZAGJ,IAEA,QAAQ,OAAO,0CAA2C,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAC5F,EAAe,IAAI,0CACjB,0sCAMJ,IAEA,QAAQ,OAAO,+CAAgD,IAAI,IAAI,CAAC,iBAAkB,SAAS,GACjG,EAAe,IAAI,+CACjB,qGAGJ,IAEA,QAAQ,OAAO,0CAA2C,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAC5F,EAAe,IAAI,0CACjB,2FAGJ,IAEA,QAAQ,OAAO,mDAAoD,IAAI,IAAI,CAAC,iBAAkB,SAAS,GACrG,EAAe,IAAI,mDACjB,gLAKJ,IAEA,QAAQ,OAAO,yCAA0C,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAC3F,EAAe,IAAI,yCACjB,mNAOJ,IAEA,QAAQ,OAAO,6CAA8C,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAC/F,EAAe,IAAI,6CACjB,sSASJ,IAEA,QAAQ,OAAO,oCAAqC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GACtF,EAAe,IAAI,oCACjB,yMAOJ,IAEA,QAAQ,OAAO,oCAAqC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GACtF,EAAe,IAAI,oCACjB,yTAEJ,IAEA,QAAQ,OAAO,yCAA0C,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAC3F,EAAe,IAAI,yCACjB,2EACJ,IAEA,QAAQ,OAAO,4CAA6C,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAC9F,EAAe,IAAI,4CACjB,2VAIJ,IAEA,QAAQ,OAAO,kCAAmC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GACpF,EAAe,IAAI,kCACjB,sjBAKJ,IAEA,QAAQ,OAAO,6BAA8B,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAC/E,EAAe,IAAI,6BACjB,qMAIJ,IAEA,QAAQ,OAAO,gCAAiC,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAClF,EAAe,IAAI,gCACjB,4XAWJ,IAEA,QAAQ,OAAO,0CAA2C,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAC5F,EAAe,IAAI,0CACjB,k1GAmCJ,IAEA,QAAQ,OAAO,8CAA+C,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAChG,EAAe,IAAI,8CACjB,oIAKJ,IAEA,QAAQ,OAAO,8CAA+C,IAAI,IAAI,CAAC,iBAAkB,SAAS,GAChG,EAAe,IAAI,8CACjB,+hBAMJ,IACA,QAAQ,OAAO,yBAAyB,KAAI,YAAa,QAAQ,QAAQ,gBAAkB,QAAQ,kBAAoB,QAAQ,QAAQ,UAAU,KAAK,QAAQ,QAAQ,iJAAkJ,QAAQ,kBAAmB,CAAM,IACzV,QAAQ,OAAO,2BAA2B,KAAI,YAAa,QAAQ,QAAQ,gBAAkB,QAAQ,oBAAsB,QAAQ,QAAQ,UAAU,KAAK,QAAQ,QAAQ,6KAA8K,QAAQ,oBAAqB,CAAM,IAC3X,QAAQ,OAAO,yBAAyB,KAAI,YAAa,QAAQ,QAAQ,gBAAkB,QAAQ,kBAAoB,QAAQ,QAAQ,UAAU,KAAK,QAAQ,QAAQ,0ZAA2Z,QAAQ,kBAAmB,CAAM,IAClmB,QAAQ,OAAO,gCAAgC,KAAI,YAAa,QAAQ,QAAQ,gBAAkB,QAAQ,yBAA2B,QAAQ,QAAQ,UAAU,KAAK,QAAQ,QAAQ,gJAAiJ,QAAQ,yBAA0B,CAAM,IAC7W,QAAQ,OAAO,wBAAwB,KAAI,YAAa,QAAQ,QAAQ,gBAAkB,QAAQ,iBAAmB,QAAQ,QAAQ,UAAU,KAAK,QAAQ,QAAQ,m3FAAo3F,QAAQ,iBAAkB,CAAM,IACxjG,QAAQ,OAAO,2BAA2B,KAAI,YAAa,QAAQ,QAAQ,gBAAkB,QAAQ,oBAAsB,QAAQ,QAAQ,UAAU,KAAK,QAAQ,QAAQ,+DAAgE,QAAQ,oBAAqB,CAAM,IAC7Q,QAAQ,OAAO,0BAA0B,KAAI,YAAa,QAAQ,QAAQ,gBAAkB,QAAQ,mBAAqB,QAAQ,QAAQ,UAAU,KAAK,QAAQ,QAAQ,sFAAuF,QAAQ,mBAAoB,CAAM","file":"/npm/angular-ui-bootstrap@2.1.4/dist/ui-bootstrap-tpls.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/angular-ui-bootstrap@2.1.4/dist/ui-bootstrap-tpls.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\n * angular-ui-bootstrap\n * http://angular-ui.github.io/bootstrap/\n\n * Version: 2.1.4 - 2016-09-23\n * License: MIT\n */angular.module(\"ui.bootstrap\", [\"ui.bootstrap.tpls\", \"ui.bootstrap.collapse\",\"ui.bootstrap.tabindex\",\"ui.bootstrap.accordion\",\"ui.bootstrap.alert\",\"ui.bootstrap.buttons\",\"ui.bootstrap.carousel\",\"ui.bootstrap.dateparser\",\"ui.bootstrap.isClass\",\"ui.bootstrap.datepicker\",\"ui.bootstrap.position\",\"ui.bootstrap.datepickerPopup\",\"ui.bootstrap.debounce\",\"ui.bootstrap.dropdown\",\"ui.bootstrap.stackedMap\",\"ui.bootstrap.modal\",\"ui.bootstrap.paging\",\"ui.bootstrap.pager\",\"ui.bootstrap.pagination\",\"ui.bootstrap.tooltip\",\"ui.bootstrap.popover\",\"ui.bootstrap.progressbar\",\"ui.bootstrap.rating\",\"ui.bootstrap.tabs\",\"ui.bootstrap.timepicker\",\"ui.bootstrap.typeahead\"]);\nangular.module(\"ui.bootstrap.tpls\", [\"uib/template/accordion/accordion-group.html\",\"uib/template/accordion/accordion.html\",\"uib/template/alert/alert.html\",\"uib/template/carousel/carousel.html\",\"uib/template/carousel/slide.html\",\"uib/template/datepicker/datepicker.html\",\"uib/template/datepicker/day.html\",\"uib/template/datepicker/month.html\",\"uib/template/datepicker/year.html\",\"uib/template/datepickerPopup/popup.html\",\"uib/template/modal/window.html\",\"uib/template/pager/pager.html\",\"uib/template/pagination/pagination.html\",\"uib/template/tooltip/tooltip-html-popup.html\",\"uib/template/tooltip/tooltip-popup.html\",\"uib/template/tooltip/tooltip-template-popup.html\",\"uib/template/popover/popover-html.html\",\"uib/template/popover/popover-template.html\",\"uib/template/popover/popover.html\",\"uib/template/progressbar/bar.html\",\"uib/template/progressbar/progress.html\",\"uib/template/progressbar/progressbar.html\",\"uib/template/rating/rating.html\",\"uib/template/tabs/tab.html\",\"uib/template/tabs/tabset.html\",\"uib/template/timepicker/timepicker.html\",\"uib/template/typeahead/typeahead-match.html\",\"uib/template/typeahead/typeahead-popup.html\"]);\nangular.module('ui.bootstrap.collapse', [])\n\n  .directive('uibCollapse', ['$animate', '$q', '$parse', '$injector', function($animate, $q, $parse, $injector) {\n    var $animateCss = $injector.has('$animateCss') ? $injector.get('$animateCss') : null;\n    return {\n      link: function(scope, element, attrs) {\n        var expandingExpr = $parse(attrs.expanding),\n          expandedExpr = $parse(attrs.expanded),\n          collapsingExpr = $parse(attrs.collapsing),\n          collapsedExpr = $parse(attrs.collapsed),\n          horizontal = false,\n          css = {},\n          cssTo = {};\n\n        init();\n\n        function init() {\n          horizontal = !!('horizontal' in attrs);\n          if (horizontal) {\n            css = {\n              width: ''\n            };\n            cssTo = {width: '0'};\n          } else {\n            css = {\n              height: ''\n            };\n            cssTo = {height: '0'};\n          }\n          if (!scope.$eval(attrs.uibCollapse)) {\n            element.addClass('in')\n              .addClass('collapse')\n              .attr('aria-expanded', true)\n              .attr('aria-hidden', false)\n              .css(css);\n          }\n        }\n\n        function getScrollFromElement(element) {\n          if (horizontal) {\n            return {width: element.scrollWidth + 'px'};\n          }\n          return {height: element.scrollHeight + 'px'};\n        }\n\n        function expand() {\n          if (element.hasClass('collapse') && element.hasClass('in')) {\n            return;\n          }\n\n          $q.resolve(expandingExpr(scope))\n            .then(function() {\n              element.removeClass('collapse')\n                .addClass('collapsing')\n                .attr('aria-expanded', true)\n                .attr('aria-hidden', false);\n\n              if ($animateCss) {\n                $animateCss(element, {\n                  addClass: 'in',\n                  easing: 'ease',\n                  css: {\n                    overflow: 'hidden'\n                  },\n                  to: getScrollFromElement(element[0])\n                }).start()['finally'](expandDone);\n              } else {\n                $animate.addClass(element, 'in', {\n                  css: {\n                    overflow: 'hidden'\n                  },\n                  to: getScrollFromElement(element[0])\n                }).then(expandDone);\n              }\n            });\n        }\n\n        function expandDone() {\n          element.removeClass('collapsing')\n            .addClass('collapse')\n            .css(css);\n          expandedExpr(scope);\n        }\n\n        function collapse() {\n          if (!element.hasClass('collapse') && !element.hasClass('in')) {\n            return collapseDone();\n          }\n\n          $q.resolve(collapsingExpr(scope))\n            .then(function() {\n              element\n              // IMPORTANT: The width must be set before adding \"collapsing\" class.\n              // Otherwise, the browser attempts to animate from width 0 (in\n              // collapsing class) to the given width here.\n                .css(getScrollFromElement(element[0]))\n                // initially all panel collapse have the collapse class, this removal\n                // prevents the animation from jumping to collapsed state\n                .removeClass('collapse')\n                .addClass('collapsing')\n                .attr('aria-expanded', false)\n                .attr('aria-hidden', true);\n\n              if ($animateCss) {\n                $animateCss(element, {\n                  removeClass: 'in',\n                  to: cssTo\n                }).start()['finally'](collapseDone);\n              } else {\n                $animate.removeClass(element, 'in', {\n                  to: cssTo\n                }).then(collapseDone);\n              }\n            });\n        }\n\n        function collapseDone() {\n          element.css(cssTo); // Required so that collapse works when animation is disabled\n          element.removeClass('collapsing')\n            .addClass('collapse');\n          collapsedExpr(scope);\n        }\n\n        scope.$watch(attrs.uibCollapse, function(shouldCollapse) {\n          if (shouldCollapse) {\n            collapse();\n          } else {\n            expand();\n          }\n        });\n      }\n    };\n  }]);\n\nangular.module('ui.bootstrap.tabindex', [])\n\n.directive('uibTabindexToggle', function() {\n  return {\n    restrict: 'A',\n    link: function(scope, elem, attrs) {\n      attrs.$observe('disabled', function(disabled) {\n        attrs.$set('tabindex', disabled ? -1 : null);\n      });\n    }\n  };\n});\n\nangular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse', 'ui.bootstrap.tabindex'])\n\n.constant('uibAccordionConfig', {\n  closeOthers: true\n})\n\n.controller('UibAccordionController', ['$scope', '$attrs', 'uibAccordionConfig', function($scope, $attrs, accordionConfig) {\n  // This array keeps track of the accordion groups\n  this.groups = [];\n\n  // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to\n  this.closeOthers = function(openGroup) {\n    var closeOthers = angular.isDefined($attrs.closeOthers) ?\n      $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers;\n    if (closeOthers) {\n      angular.forEach(this.groups, function(group) {\n        if (group !== openGroup) {\n          group.isOpen = false;\n        }\n      });\n    }\n  };\n\n  // This is called from the accordion-group directive to add itself to the accordion\n  this.addGroup = function(groupScope) {\n    var that = this;\n    this.groups.push(groupScope);\n\n    groupScope.$on('$destroy', function(event) {\n      that.removeGroup(groupScope);\n    });\n  };\n\n  // This is called from the accordion-group directive when to remove itself\n  this.removeGroup = function(group) {\n    var index = this.groups.indexOf(group);\n    if (index !== -1) {\n      this.groups.splice(index, 1);\n    }\n  };\n}])\n\n// The accordion directive simply sets up the directive controller\n// and adds an accordion CSS class to itself element.\n.directive('uibAccordion', function() {\n  return {\n    controller: 'UibAccordionController',\n    controllerAs: 'accordion',\n    transclude: true,\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/accordion/accordion.html';\n    }\n  };\n})\n\n// The accordion-group directive indicates a block of html that will expand and collapse in an accordion\n.directive('uibAccordionGroup', function() {\n  return {\n    require: '^uibAccordion',         // We need this directive to be inside an accordion\n    transclude: true,              // It transcludes the contents of the directive into the template\n    restrict: 'A',\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/accordion/accordion-group.html';\n    },\n    scope: {\n      heading: '@',               // Interpolate the heading attribute onto this scope\n      panelClass: '@?',           // Ditto with panelClass\n      isOpen: '=?',\n      isDisabled: '=?'\n    },\n    controller: function() {\n      this.setHeading = function(element) {\n        this.heading = element;\n      };\n    },\n    link: function(scope, element, attrs, accordionCtrl) {\n      element.addClass('panel');\n      accordionCtrl.addGroup(scope);\n\n      scope.openClass = attrs.openClass || 'panel-open';\n      scope.panelClass = attrs.panelClass || 'panel-default';\n      scope.$watch('isOpen', function(value) {\n        element.toggleClass(scope.openClass, !!value);\n        if (value) {\n          accordionCtrl.closeOthers(scope);\n        }\n      });\n\n      scope.toggleOpen = function($event) {\n        if (!scope.isDisabled) {\n          if (!$event || $event.which === 32) {\n            scope.isOpen = !scope.isOpen;\n          }\n        }\n      };\n\n      var id = 'accordiongroup-' + scope.$id + '-' + Math.floor(Math.random() * 10000);\n      scope.headingId = id + '-tab';\n      scope.panelId = id + '-panel';\n    }\n  };\n})\n\n// Use accordion-heading below an accordion-group to provide a heading containing HTML\n.directive('uibAccordionHeading', function() {\n  return {\n    transclude: true,   // Grab the contents to be used as the heading\n    template: '',       // In effect remove this element!\n    replace: true,\n    require: '^uibAccordionGroup',\n    link: function(scope, element, attrs, accordionGroupCtrl, transclude) {\n      // Pass the heading to the accordion-group controller\n      // so that it can be transcluded into the right place in the template\n      // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat]\n      accordionGroupCtrl.setHeading(transclude(scope, angular.noop));\n    }\n  };\n})\n\n// Use in the accordion-group template to indicate where you want the heading to be transcluded\n// You must provide the property on the accordion-group controller that will hold the transcluded element\n.directive('uibAccordionTransclude', function() {\n  return {\n    require: '^uibAccordionGroup',\n    link: function(scope, element, attrs, controller) {\n      scope.$watch(function() { return controller[attrs.uibAccordionTransclude]; }, function(heading) {\n        if (heading) {\n          var elem = angular.element(element[0].querySelector(getHeaderSelectors()));\n          elem.html('');\n          elem.append(heading);\n        }\n      });\n    }\n  };\n\n  function getHeaderSelectors() {\n      return 'uib-accordion-header,' +\n          'data-uib-accordion-header,' +\n          'x-uib-accordion-header,' +\n          'uib\\\\:accordion-header,' +\n          '[uib-accordion-header],' +\n          '[data-uib-accordion-header],' +\n          '[x-uib-accordion-header]';\n  }\n});\n\nangular.module('ui.bootstrap.alert', [])\n\n.controller('UibAlertController', ['$scope', '$element', '$attrs', '$interpolate', '$timeout', function($scope, $element, $attrs, $interpolate, $timeout) {\n  $scope.closeable = !!$attrs.close;\n  $element.addClass('alert');\n  $attrs.$set('role', 'alert');\n  if ($scope.closeable) {\n    $element.addClass('alert-dismissible');\n  }\n\n  var dismissOnTimeout = angular.isDefined($attrs.dismissOnTimeout) ?\n    $interpolate($attrs.dismissOnTimeout)($scope.$parent) : null;\n\n  if (dismissOnTimeout) {\n    $timeout(function() {\n      $scope.close();\n    }, parseInt(dismissOnTimeout, 10));\n  }\n}])\n\n.directive('uibAlert', function() {\n  return {\n    controller: 'UibAlertController',\n    controllerAs: 'alert',\n    restrict: 'A',\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/alert/alert.html';\n    },\n    transclude: true,\n    scope: {\n      close: '&'\n    }\n  };\n});\n\nangular.module('ui.bootstrap.buttons', [])\n\n.constant('uibButtonConfig', {\n  activeClass: 'active',\n  toggleEvent: 'click'\n})\n\n.controller('UibButtonsController', ['uibButtonConfig', function(buttonConfig) {\n  this.activeClass = buttonConfig.activeClass || 'active';\n  this.toggleEvent = buttonConfig.toggleEvent || 'click';\n}])\n\n.directive('uibBtnRadio', ['$parse', function($parse) {\n  return {\n    require: ['uibBtnRadio', 'ngModel'],\n    controller: 'UibButtonsController',\n    controllerAs: 'buttons',\n    link: function(scope, element, attrs, ctrls) {\n      var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n      var uncheckableExpr = $parse(attrs.uibUncheckable);\n\n      element.find('input').css({display: 'none'});\n\n      //model -> UI\n      ngModelCtrl.$render = function() {\n        element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.uibBtnRadio)));\n      };\n\n      //ui->model\n      element.on(buttonsCtrl.toggleEvent, function() {\n        if (attrs.disabled) {\n          return;\n        }\n\n        var isActive = element.hasClass(buttonsCtrl.activeClass);\n\n        if (!isActive || angular.isDefined(attrs.uncheckable)) {\n          scope.$apply(function() {\n            ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.uibBtnRadio));\n            ngModelCtrl.$render();\n          });\n        }\n      });\n\n      if (attrs.uibUncheckable) {\n        scope.$watch(uncheckableExpr, function(uncheckable) {\n          attrs.$set('uncheckable', uncheckable ? '' : undefined);\n        });\n      }\n    }\n  };\n}])\n\n.directive('uibBtnCheckbox', function() {\n  return {\n    require: ['uibBtnCheckbox', 'ngModel'],\n    controller: 'UibButtonsController',\n    controllerAs: 'button',\n    link: function(scope, element, attrs, ctrls) {\n      var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      element.find('input').css({display: 'none'});\n\n      function getTrueValue() {\n        return getCheckboxValue(attrs.btnCheckboxTrue, true);\n      }\n\n      function getFalseValue() {\n        return getCheckboxValue(attrs.btnCheckboxFalse, false);\n      }\n\n      function getCheckboxValue(attribute, defaultValue) {\n        return angular.isDefined(attribute) ? scope.$eval(attribute) : defaultValue;\n      }\n\n      //model -> UI\n      ngModelCtrl.$render = function() {\n        element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue()));\n      };\n\n      //ui->model\n      element.on(buttonsCtrl.toggleEvent, function() {\n        if (attrs.disabled) {\n          return;\n        }\n\n        scope.$apply(function() {\n          ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue());\n          ngModelCtrl.$render();\n        });\n      });\n    }\n  };\n});\n\nangular.module('ui.bootstrap.carousel', [])\n\n.controller('UibCarouselController', ['$scope', '$element', '$interval', '$timeout', '$animate', function($scope, $element, $interval, $timeout, $animate) {\n  var self = this,\n    slides = self.slides = $scope.slides = [],\n    SLIDE_DIRECTION = 'uib-slideDirection',\n    currentIndex = $scope.active,\n    currentInterval, isPlaying, bufferedTransitions = [];\n\n  var destroyed = false;\n  $element.addClass('carousel');\n\n  self.addSlide = function(slide, element) {\n    slides.push({\n      slide: slide,\n      element: element\n    });\n    slides.sort(function(a, b) {\n      return +a.slide.index - +b.slide.index;\n    });\n    //if this is the first slide or the slide is set to active, select it\n    if (slide.index === $scope.active || slides.length === 1 && !angular.isNumber($scope.active)) {\n      if ($scope.$currentTransition) {\n        $scope.$currentTransition = null;\n      }\n\n      currentIndex = slide.index;\n      $scope.active = slide.index;\n      setActive(currentIndex);\n      self.select(slides[findSlideIndex(slide)]);\n      if (slides.length === 1) {\n        $scope.play();\n      }\n    }\n  };\n\n  self.getCurrentIndex = function() {\n    for (var i = 0; i < slides.length; i++) {\n      if (slides[i].slide.index === currentIndex) {\n        return i;\n      }\n    }\n  };\n\n  self.next = $scope.next = function() {\n    var newIndex = (self.getCurrentIndex() + 1) % slides.length;\n\n    if (newIndex === 0 && $scope.noWrap()) {\n      $scope.pause();\n      return;\n    }\n\n    return self.select(slides[newIndex], 'next');\n  };\n\n  self.prev = $scope.prev = function() {\n    var newIndex = self.getCurrentIndex() - 1 < 0 ? slides.length - 1 : self.getCurrentIndex() - 1;\n\n    if ($scope.noWrap() && newIndex === slides.length - 1) {\n      $scope.pause();\n      return;\n    }\n\n    return self.select(slides[newIndex], 'prev');\n  };\n\n  self.removeSlide = function(slide) {\n    var index = findSlideIndex(slide);\n\n    var bufferedIndex = bufferedTransitions.indexOf(slides[index]);\n    if (bufferedIndex !== -1) {\n      bufferedTransitions.splice(bufferedIndex, 1);\n    }\n\n    //get the index of the slide inside the carousel\n    slides.splice(index, 1);\n    if (slides.length > 0 && currentIndex === index) {\n      if (index >= slides.length) {\n        currentIndex = slides.length - 1;\n        $scope.active = currentIndex;\n        setActive(currentIndex);\n        self.select(slides[slides.length - 1]);\n      } else {\n        currentIndex = index;\n        $scope.active = currentIndex;\n        setActive(currentIndex);\n        self.select(slides[index]);\n      }\n    } else if (currentIndex > index) {\n      currentIndex--;\n      $scope.active = currentIndex;\n    }\n\n    //clean the active value when no more slide\n    if (slides.length === 0) {\n      currentIndex = null;\n      $scope.active = null;\n      clearBufferedTransitions();\n    }\n  };\n\n  /* direction: \"prev\" or \"next\" */\n  self.select = $scope.select = function(nextSlide, direction) {\n    var nextIndex = findSlideIndex(nextSlide.slide);\n    //Decide direction if it's not given\n    if (direction === undefined) {\n      direction = nextIndex > self.getCurrentIndex() ? 'next' : 'prev';\n    }\n    //Prevent this user-triggered transition from occurring if there is already one in progress\n    if (nextSlide.slide.index !== currentIndex &&\n      !$scope.$currentTransition) {\n      goNext(nextSlide.slide, nextIndex, direction);\n    } else if (nextSlide && nextSlide.slide.index !== currentIndex && $scope.$currentTransition) {\n      bufferedTransitions.push(slides[nextIndex]);\n    }\n  };\n\n  /* Allow outside people to call indexOf on slides array */\n  $scope.indexOfSlide = function(slide) {\n    return +slide.slide.index;\n  };\n\n  $scope.isActive = function(slide) {\n    return $scope.active === slide.slide.index;\n  };\n\n  $scope.isPrevDisabled = function() {\n    return $scope.active === 0 && $scope.noWrap();\n  };\n\n  $scope.isNextDisabled = function() {\n    return $scope.active === slides.length - 1 && $scope.noWrap();\n  };\n\n  $scope.pause = function() {\n    if (!$scope.noPause) {\n      isPlaying = false;\n      resetTimer();\n    }\n  };\n\n  $scope.play = function() {\n    if (!isPlaying) {\n      isPlaying = true;\n      restartTimer();\n    }\n  };\n\n  $element.on('mouseenter', $scope.pause);\n  $element.on('mouseleave', $scope.play);\n\n  $scope.$on('$destroy', function() {\n    destroyed = true;\n    resetTimer();\n  });\n\n  $scope.$watch('noTransition', function(noTransition) {\n    $animate.enabled($element, !noTransition);\n  });\n\n  $scope.$watch('interval', restartTimer);\n\n  $scope.$watchCollection('slides', resetTransition);\n\n  $scope.$watch('active', function(index) {\n    if (angular.isNumber(index) && currentIndex !== index) {\n      for (var i = 0; i < slides.length; i++) {\n        if (slides[i].slide.index === index) {\n          index = i;\n          break;\n        }\n      }\n\n      var slide = slides[index];\n      if (slide) {\n        setActive(index);\n        self.select(slides[index]);\n        currentIndex = index;\n      }\n    }\n  });\n\n  function clearBufferedTransitions() {\n    while (bufferedTransitions.length) {\n      bufferedTransitions.shift();\n    }\n  }\n\n  function getSlideByIndex(index) {\n    for (var i = 0, l = slides.length; i < l; ++i) {\n      if (slides[i].index === index) {\n        return slides[i];\n      }\n    }\n  }\n\n  function setActive(index) {\n    for (var i = 0; i < slides.length; i++) {\n      slides[i].slide.active = i === index;\n    }\n  }\n\n  function goNext(slide, index, direction) {\n    if (destroyed) {\n      return;\n    }\n\n    angular.extend(slide, {direction: direction});\n    angular.extend(slides[currentIndex].slide || {}, {direction: direction});\n    if ($animate.enabled($element) && !$scope.$currentTransition &&\n      slides[index].element && self.slides.length > 1) {\n      slides[index].element.data(SLIDE_DIRECTION, slide.direction);\n      var currentIdx = self.getCurrentIndex();\n\n      if (angular.isNumber(currentIdx) && slides[currentIdx].element) {\n        slides[currentIdx].element.data(SLIDE_DIRECTION, slide.direction);\n      }\n\n      $scope.$currentTransition = true;\n      $animate.on('addClass', slides[index].element, function(element, phase) {\n        if (phase === 'close') {\n          $scope.$currentTransition = null;\n          $animate.off('addClass', element);\n          if (bufferedTransitions.length) {\n            var nextSlide = bufferedTransitions.pop().slide;\n            var nextIndex = nextSlide.index;\n            var nextDirection = nextIndex > self.getCurrentIndex() ? 'next' : 'prev';\n            clearBufferedTransitions();\n\n            goNext(nextSlide, nextIndex, nextDirection);\n          }\n        }\n      });\n    }\n\n    $scope.active = slide.index;\n    currentIndex = slide.index;\n    setActive(index);\n\n    //every time you change slides, reset the timer\n    restartTimer();\n  }\n\n  function findSlideIndex(slide) {\n    for (var i = 0; i < slides.length; i++) {\n      if (slides[i].slide === slide) {\n        return i;\n      }\n    }\n  }\n\n  function resetTimer() {\n    if (currentInterval) {\n      $interval.cancel(currentInterval);\n      currentInterval = null;\n    }\n  }\n\n  function resetTransition(slides) {\n    if (!slides.length) {\n      $scope.$currentTransition = null;\n      clearBufferedTransitions();\n    }\n  }\n\n  function restartTimer() {\n    resetTimer();\n    var interval = +$scope.interval;\n    if (!isNaN(interval) && interval > 0) {\n      currentInterval = $interval(timerFn, interval);\n    }\n  }\n\n  function timerFn() {\n    var interval = +$scope.interval;\n    if (isPlaying && !isNaN(interval) && interval > 0 && slides.length) {\n      $scope.next();\n    } else {\n      $scope.pause();\n    }\n  }\n}])\n\n.directive('uibCarousel', function() {\n  return {\n    transclude: true,\n    controller: 'UibCarouselController',\n    controllerAs: 'carousel',\n    restrict: 'A',\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/carousel/carousel.html';\n    },\n    scope: {\n      active: '=',\n      interval: '=',\n      noTransition: '=',\n      noPause: '=',\n      noWrap: '&'\n    }\n  };\n})\n\n.directive('uibSlide', ['$animate', function($animate) {\n  return {\n    require: '^uibCarousel',\n    restrict: 'A',\n    transclude: true,\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/carousel/slide.html';\n    },\n    scope: {\n      actual: '=?',\n      index: '=?'\n    },\n    link: function (scope, element, attrs, carouselCtrl) {\n      element.addClass('item');\n      carouselCtrl.addSlide(scope, element);\n      //when the scope is destroyed then remove the slide from the current slides array\n      scope.$on('$destroy', function() {\n        carouselCtrl.removeSlide(scope);\n      });\n\n      scope.$watch('active', function(active) {\n        $animate[active ? 'addClass' : 'removeClass'](element, 'active');\n      });\n    }\n  };\n}])\n\n.animation('.item', ['$animateCss',\nfunction($animateCss) {\n  var SLIDE_DIRECTION = 'uib-slideDirection';\n\n  function removeClass(element, className, callback) {\n    element.removeClass(className);\n    if (callback) {\n      callback();\n    }\n  }\n\n  return {\n    beforeAddClass: function(element, className, done) {\n      if (className === 'active') {\n        var stopped = false;\n        var direction = element.data(SLIDE_DIRECTION);\n        var directionClass = direction === 'next' ? 'left' : 'right';\n        var removeClassFn = removeClass.bind(this, element,\n          directionClass + ' ' + direction, done);\n        element.addClass(direction);\n\n        $animateCss(element, {addClass: directionClass})\n          .start()\n          .done(removeClassFn);\n\n        return function() {\n          stopped = true;\n        };\n      }\n      done();\n    },\n    beforeRemoveClass: function (element, className, done) {\n      if (className === 'active') {\n        var stopped = false;\n        var direction = element.data(SLIDE_DIRECTION);\n        var directionClass = direction === 'next' ? 'left' : 'right';\n        var removeClassFn = removeClass.bind(this, element, directionClass, done);\n\n        $animateCss(element, {addClass: directionClass})\n          .start()\n          .done(removeClassFn);\n\n        return function() {\n          stopped = true;\n        };\n      }\n      done();\n    }\n  };\n}]);\n\nangular.module('ui.bootstrap.dateparser', [])\n\n.service('uibDateParser', ['$log', '$locale', 'dateFilter', 'orderByFilter', function($log, $locale, dateFilter, orderByFilter) {\n  // Pulled from https://github.com/mbostock/d3/blob/master/src/format/requote.js\n  var SPECIAL_CHARACTERS_REGEXP = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n\n  var localeId;\n  var formatCodeToRegex;\n\n  this.init = function() {\n    localeId = $locale.id;\n\n    this.parsers = {};\n    this.formatters = {};\n\n    formatCodeToRegex = [\n      {\n        key: 'yyyy',\n        regex: '\\\\d{4}',\n        apply: function(value) { this.year = +value; },\n        formatter: function(date) {\n          var _date = new Date();\n          _date.setFullYear(Math.abs(date.getFullYear()));\n          return dateFilter(_date, 'yyyy');\n        }\n      },\n      {\n        key: 'yy',\n        regex: '\\\\d{2}',\n        apply: function(value) { value = +value; this.year = value < 69 ? value + 2000 : value + 1900; },\n        formatter: function(date) {\n          var _date = new Date();\n          _date.setFullYear(Math.abs(date.getFullYear()));\n          return dateFilter(_date, 'yy');\n        }\n      },\n      {\n        key: 'y',\n        regex: '\\\\d{1,4}',\n        apply: function(value) { this.year = +value; },\n        formatter: function(date) {\n          var _date = new Date();\n          _date.setFullYear(Math.abs(date.getFullYear()));\n          return dateFilter(_date, 'y');\n        }\n      },\n      {\n        key: 'M!',\n        regex: '0?[1-9]|1[0-2]',\n        apply: function(value) { this.month = value - 1; },\n        formatter: function(date) {\n          var value = date.getMonth();\n          if (/^[0-9]$/.test(value)) {\n            return dateFilter(date, 'MM');\n          }\n\n          return dateFilter(date, 'M');\n        }\n      },\n      {\n        key: 'MMMM',\n        regex: $locale.DATETIME_FORMATS.MONTH.join('|'),\n        apply: function(value) { this.month = $locale.DATETIME_FORMATS.MONTH.indexOf(value); },\n        formatter: function(date) { return dateFilter(date, 'MMMM'); }\n      },\n      {\n        key: 'MMM',\n        regex: $locale.DATETIME_FORMATS.SHORTMONTH.join('|'),\n        apply: function(value) { this.month = $locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value); },\n        formatter: function(date) { return dateFilter(date, 'MMM'); }\n      },\n      {\n        key: 'MM',\n        regex: '0[1-9]|1[0-2]',\n        apply: function(value) { this.month = value - 1; },\n        formatter: function(date) { return dateFilter(date, 'MM'); }\n      },\n      {\n        key: 'M',\n        regex: '[1-9]|1[0-2]',\n        apply: function(value) { this.month = value - 1; },\n        formatter: function(date) { return dateFilter(date, 'M'); }\n      },\n      {\n        key: 'd!',\n        regex: '[0-2]?[0-9]{1}|3[0-1]{1}',\n        apply: function(value) { this.date = +value; },\n        formatter: function(date) {\n          var value = date.getDate();\n          if (/^[1-9]$/.test(value)) {\n            return dateFilter(date, 'dd');\n          }\n\n          return dateFilter(date, 'd');\n        }\n      },\n      {\n        key: 'dd',\n        regex: '[0-2][0-9]{1}|3[0-1]{1}',\n        apply: function(value) { this.date = +value; },\n        formatter: function(date) { return dateFilter(date, 'dd'); }\n      },\n      {\n        key: 'd',\n        regex: '[1-2]?[0-9]{1}|3[0-1]{1}',\n        apply: function(value) { this.date = +value; },\n        formatter: function(date) { return dateFilter(date, 'd'); }\n      },\n      {\n        key: 'EEEE',\n        regex: $locale.DATETIME_FORMATS.DAY.join('|'),\n        formatter: function(date) { return dateFilter(date, 'EEEE'); }\n      },\n      {\n        key: 'EEE',\n        regex: $locale.DATETIME_FORMATS.SHORTDAY.join('|'),\n        formatter: function(date) { return dateFilter(date, 'EEE'); }\n      },\n      {\n        key: 'HH',\n        regex: '(?:0|1)[0-9]|2[0-3]',\n        apply: function(value) { this.hours = +value; },\n        formatter: function(date) { return dateFilter(date, 'HH'); }\n      },\n      {\n        key: 'hh',\n        regex: '0[0-9]|1[0-2]',\n        apply: function(value) { this.hours = +value; },\n        formatter: function(date) { return dateFilter(date, 'hh'); }\n      },\n      {\n        key: 'H',\n        regex: '1?[0-9]|2[0-3]',\n        apply: function(value) { this.hours = +value; },\n        formatter: function(date) { return dateFilter(date, 'H'); }\n      },\n      {\n        key: 'h',\n        regex: '[0-9]|1[0-2]',\n        apply: function(value) { this.hours = +value; },\n        formatter: function(date) { return dateFilter(date, 'h'); }\n      },\n      {\n        key: 'mm',\n        regex: '[0-5][0-9]',\n        apply: function(value) { this.minutes = +value; },\n        formatter: function(date) { return dateFilter(date, 'mm'); }\n      },\n      {\n        key: 'm',\n        regex: '[0-9]|[1-5][0-9]',\n        apply: function(value) { this.minutes = +value; },\n        formatter: function(date) { return dateFilter(date, 'm'); }\n      },\n      {\n        key: 'sss',\n        regex: '[0-9][0-9][0-9]',\n        apply: function(value) { this.milliseconds = +value; },\n        formatter: function(date) { return dateFilter(date, 'sss'); }\n      },\n      {\n        key: 'ss',\n        regex: '[0-5][0-9]',\n        apply: function(value) { this.seconds = +value; },\n        formatter: function(date) { return dateFilter(date, 'ss'); }\n      },\n      {\n        key: 's',\n        regex: '[0-9]|[1-5][0-9]',\n        apply: function(value) { this.seconds = +value; },\n        formatter: function(date) { return dateFilter(date, 's'); }\n      },\n      {\n        key: 'a',\n        regex: $locale.DATETIME_FORMATS.AMPMS.join('|'),\n        apply: function(value) {\n          if (this.hours === 12) {\n            this.hours = 0;\n          }\n\n          if (value === 'PM') {\n            this.hours += 12;\n          }\n        },\n        formatter: function(date) { return dateFilter(date, 'a'); }\n      },\n      {\n        key: 'Z',\n        regex: '[+-]\\\\d{4}',\n        apply: function(value) {\n          var matches = value.match(/([+-])(\\d{2})(\\d{2})/),\n            sign = matches[1],\n            hours = matches[2],\n            minutes = matches[3];\n          this.hours += toInt(sign + hours);\n          this.minutes += toInt(sign + minutes);\n        },\n        formatter: function(date) {\n          return dateFilter(date, 'Z');\n        }\n      },\n      {\n        key: 'ww',\n        regex: '[0-4][0-9]|5[0-3]',\n        formatter: function(date) { return dateFilter(date, 'ww'); }\n      },\n      {\n        key: 'w',\n        regex: '[0-9]|[1-4][0-9]|5[0-3]',\n        formatter: function(date) { return dateFilter(date, 'w'); }\n      },\n      {\n        key: 'GGGG',\n        regex: $locale.DATETIME_FORMATS.ERANAMES.join('|').replace(/\\s/g, '\\\\s'),\n        formatter: function(date) { return dateFilter(date, 'GGGG'); }\n      },\n      {\n        key: 'GGG',\n        regex: $locale.DATETIME_FORMATS.ERAS.join('|'),\n        formatter: function(date) { return dateFilter(date, 'GGG'); }\n      },\n      {\n        key: 'GG',\n        regex: $locale.DATETIME_FORMATS.ERAS.join('|'),\n        formatter: function(date) { return dateFilter(date, 'GG'); }\n      },\n      {\n        key: 'G',\n        regex: $locale.DATETIME_FORMATS.ERAS.join('|'),\n        formatter: function(date) { return dateFilter(date, 'G'); }\n      }\n    ];\n  };\n\n  this.init();\n\n  function createParser(format) {\n    var map = [], regex = format.split('');\n\n    // check for literal values\n    var quoteIndex = format.indexOf('\\'');\n    if (quoteIndex > -1) {\n      var inLiteral = false;\n      format = format.split('');\n      for (var i = quoteIndex; i < format.length; i++) {\n        if (inLiteral) {\n          if (format[i] === '\\'') {\n            if (i + 1 < format.length && format[i+1] === '\\'') { // escaped single quote\n              format[i+1] = '$';\n              regex[i+1] = '';\n            } else { // end of literal\n              regex[i] = '';\n              inLiteral = false;\n            }\n          }\n          format[i] = '$';\n        } else {\n          if (format[i] === '\\'') { // start of literal\n            format[i] = '$';\n            regex[i] = '';\n            inLiteral = true;\n          }\n        }\n      }\n\n      format = format.join('');\n    }\n\n    angular.forEach(formatCodeToRegex, function(data) {\n      var index = format.indexOf(data.key);\n\n      if (index > -1) {\n        format = format.split('');\n\n        regex[index] = '(' + data.regex + ')';\n        format[index] = '$'; // Custom symbol to define consumed part of format\n        for (var i = index + 1, n = index + data.key.length; i < n; i++) {\n          regex[i] = '';\n          format[i] = '$';\n        }\n        format = format.join('');\n\n        map.push({\n          index: index,\n          key: data.key,\n          apply: data.apply,\n          matcher: data.regex\n        });\n      }\n    });\n\n    return {\n      regex: new RegExp('^' + regex.join('') + '$'),\n      map: orderByFilter(map, 'index')\n    };\n  }\n\n  function createFormatter(format) {\n    var formatters = [];\n    var i = 0;\n    var formatter, literalIdx;\n    while (i < format.length) {\n      if (angular.isNumber(literalIdx)) {\n        if (format.charAt(i) === '\\'') {\n          if (i + 1 >= format.length || format.charAt(i + 1) !== '\\'') {\n            formatters.push(constructLiteralFormatter(format, literalIdx, i));\n            literalIdx = null;\n          }\n        } else if (i === format.length) {\n          while (literalIdx < format.length) {\n            formatter = constructFormatterFromIdx(format, literalIdx);\n            formatters.push(formatter);\n            literalIdx = formatter.endIdx;\n          }\n        }\n\n        i++;\n        continue;\n      }\n\n      if (format.charAt(i) === '\\'') {\n        literalIdx = i;\n        i++;\n        continue;\n      }\n\n      formatter = constructFormatterFromIdx(format, i);\n\n      formatters.push(formatter.parser);\n      i = formatter.endIdx;\n    }\n\n    return formatters;\n  }\n\n  function constructLiteralFormatter(format, literalIdx, endIdx) {\n    return function() {\n      return format.substr(literalIdx + 1, endIdx - literalIdx - 1);\n    };\n  }\n\n  function constructFormatterFromIdx(format, i) {\n    var currentPosStr = format.substr(i);\n    for (var j = 0; j < formatCodeToRegex.length; j++) {\n      if (new RegExp('^' + formatCodeToRegex[j].key).test(currentPosStr)) {\n        var data = formatCodeToRegex[j];\n        return {\n          endIdx: i + data.key.length,\n          parser: data.formatter\n        };\n      }\n    }\n\n    return {\n      endIdx: i + 1,\n      parser: function() {\n        return currentPosStr.charAt(0);\n      }\n    };\n  }\n\n  this.filter = function(date, format) {\n    if (!angular.isDate(date) || isNaN(date) || !format) {\n      return '';\n    }\n\n    format = $locale.DATETIME_FORMATS[format] || format;\n\n    if ($locale.id !== localeId) {\n      this.init();\n    }\n\n    if (!this.formatters[format]) {\n      this.formatters[format] = createFormatter(format);\n    }\n\n    var formatters = this.formatters[format];\n\n    return formatters.reduce(function(str, formatter) {\n      return str + formatter(date);\n    }, '');\n  };\n\n  this.parse = function(input, format, baseDate) {\n    if (!angular.isString(input) || !format) {\n      return input;\n    }\n\n    format = $locale.DATETIME_FORMATS[format] || format;\n    format = format.replace(SPECIAL_CHARACTERS_REGEXP, '\\\\$&');\n\n    if ($locale.id !== localeId) {\n      this.init();\n    }\n\n    if (!this.parsers[format]) {\n      this.parsers[format] = createParser(format, 'apply');\n    }\n\n    var parser = this.parsers[format],\n        regex = parser.regex,\n        map = parser.map,\n        results = input.match(regex),\n        tzOffset = false;\n    if (results && results.length) {\n      var fields, dt;\n      if (angular.isDate(baseDate) && !isNaN(baseDate.getTime())) {\n        fields = {\n          year: baseDate.getFullYear(),\n          month: baseDate.getMonth(),\n          date: baseDate.getDate(),\n          hours: baseDate.getHours(),\n          minutes: baseDate.getMinutes(),\n          seconds: baseDate.getSeconds(),\n          milliseconds: baseDate.getMilliseconds()\n        };\n      } else {\n        if (baseDate) {\n          $log.warn('dateparser:', 'baseDate is not a valid date');\n        }\n        fields = { year: 1900, month: 0, date: 1, hours: 0, minutes: 0, seconds: 0, milliseconds: 0 };\n      }\n\n      for (var i = 1, n = results.length; i < n; i++) {\n        var mapper = map[i - 1];\n        if (mapper.matcher === 'Z') {\n          tzOffset = true;\n        }\n\n        if (mapper.apply) {\n          mapper.apply.call(fields, results[i]);\n        }\n      }\n\n      var datesetter = tzOffset ? Date.prototype.setUTCFullYear :\n        Date.prototype.setFullYear;\n      var timesetter = tzOffset ? Date.prototype.setUTCHours :\n        Date.prototype.setHours;\n\n      if (isValid(fields.year, fields.month, fields.date)) {\n        if (angular.isDate(baseDate) && !isNaN(baseDate.getTime()) && !tzOffset) {\n          dt = new Date(baseDate);\n          datesetter.call(dt, fields.year, fields.month, fields.date);\n          timesetter.call(dt, fields.hours, fields.minutes,\n            fields.seconds, fields.milliseconds);\n        } else {\n          dt = new Date(0);\n          datesetter.call(dt, fields.year, fields.month, fields.date);\n          timesetter.call(dt, fields.hours || 0, fields.minutes || 0,\n            fields.seconds || 0, fields.milliseconds || 0);\n        }\n      }\n\n      return dt;\n    }\n  };\n\n  // Check if date is valid for specific month (and year for February).\n  // Month: 0 = Jan, 1 = Feb, etc\n  function isValid(year, month, date) {\n    if (date < 1) {\n      return false;\n    }\n\n    if (month === 1 && date > 28) {\n      return date === 29 && (year % 4 === 0 && year % 100 !== 0 || year % 400 === 0);\n    }\n\n    if (month === 3 || month === 5 || month === 8 || month === 10) {\n      return date < 31;\n    }\n\n    return true;\n  }\n\n  function toInt(str) {\n    return parseInt(str, 10);\n  }\n\n  this.toTimezone = toTimezone;\n  this.fromTimezone = fromTimezone;\n  this.timezoneToOffset = timezoneToOffset;\n  this.addDateMinutes = addDateMinutes;\n  this.convertTimezoneToLocal = convertTimezoneToLocal;\n\n  function toTimezone(date, timezone) {\n    return date && timezone ? convertTimezoneToLocal(date, timezone) : date;\n  }\n\n  function fromTimezone(date, timezone) {\n    return date && timezone ? convertTimezoneToLocal(date, timezone, true) : date;\n  }\n\n  //https://github.com/angular/angular.js/blob/622c42169699ec07fc6daaa19fe6d224e5d2f70e/src/Angular.js#L1207\n  function timezoneToOffset(timezone, fallback) {\n    timezone = timezone.replace(/:/g, '');\n    var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;\n    return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;\n  }\n\n  function addDateMinutes(date, minutes) {\n    date = new Date(date.getTime());\n    date.setMinutes(date.getMinutes() + minutes);\n    return date;\n  }\n\n  function convertTimezoneToLocal(date, timezone, reverse) {\n    reverse = reverse ? -1 : 1;\n    var dateTimezoneOffset = date.getTimezoneOffset();\n    var timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);\n    return addDateMinutes(date, reverse * (timezoneOffset - dateTimezoneOffset));\n  }\n}]);\n\n// Avoiding use of ng-class as it creates a lot of watchers when a class is to be applied to\n// at most one element.\nangular.module('ui.bootstrap.isClass', [])\n.directive('uibIsClass', [\n         '$animate',\nfunction ($animate) {\n  //                    11111111          22222222\n  var ON_REGEXP = /^\\s*([\\s\\S]+?)\\s+on\\s+([\\s\\S]+?)\\s*$/;\n  //                    11111111           22222222\n  var IS_REGEXP = /^\\s*([\\s\\S]+?)\\s+for\\s+([\\s\\S]+?)\\s*$/;\n\n  var dataPerTracked = {};\n\n  return {\n    restrict: 'A',\n    compile: function(tElement, tAttrs) {\n      var linkedScopes = [];\n      var instances = [];\n      var expToData = {};\n      var lastActivated = null;\n      var onExpMatches = tAttrs.uibIsClass.match(ON_REGEXP);\n      var onExp = onExpMatches[2];\n      var expsStr = onExpMatches[1];\n      var exps = expsStr.split(',');\n\n      return linkFn;\n\n      function linkFn(scope, element, attrs) {\n        linkedScopes.push(scope);\n        instances.push({\n          scope: scope,\n          element: element\n        });\n\n        exps.forEach(function(exp, k) {\n          addForExp(exp, scope);\n        });\n\n        scope.$on('$destroy', removeScope);\n      }\n\n      function addForExp(exp, scope) {\n        var matches = exp.match(IS_REGEXP);\n        var clazz = scope.$eval(matches[1]);\n        var compareWithExp = matches[2];\n        var data = expToData[exp];\n        if (!data) {\n          var watchFn = function(compareWithVal) {\n            var newActivated = null;\n            instances.some(function(instance) {\n              var thisVal = instance.scope.$eval(onExp);\n              if (thisVal === compareWithVal) {\n                newActivated = instance;\n                return true;\n              }\n            });\n            if (data.lastActivated !== newActivated) {\n              if (data.lastActivated) {\n                $animate.removeClass(data.lastActivated.element, clazz);\n              }\n              if (newActivated) {\n                $animate.addClass(newActivated.element, clazz);\n              }\n              data.lastActivated = newActivated;\n            }\n          };\n          expToData[exp] = data = {\n            lastActivated: null,\n            scope: scope,\n            watchFn: watchFn,\n            compareWithExp: compareWithExp,\n            watcher: scope.$watch(compareWithExp, watchFn)\n          };\n        }\n        data.watchFn(scope.$eval(compareWithExp));\n      }\n\n      function removeScope(e) {\n        var removedScope = e.targetScope;\n        var index = linkedScopes.indexOf(removedScope);\n        linkedScopes.splice(index, 1);\n        instances.splice(index, 1);\n        if (linkedScopes.length) {\n          var newWatchScope = linkedScopes[0];\n          angular.forEach(expToData, function(data) {\n            if (data.scope === removedScope) {\n              data.watcher = newWatchScope.$watch(data.compareWithExp, data.watchFn);\n              data.scope = newWatchScope;\n            }\n          });\n        } else {\n          expToData = {};\n        }\n      }\n    }\n  };\n}]);\nangular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootstrap.isClass'])\n\n.value('$datepickerSuppressError', false)\n\n.value('$datepickerLiteralWarning', true)\n\n.constant('uibDatepickerConfig', {\n  datepickerMode: 'day',\n  formatDay: 'dd',\n  formatMonth: 'MMMM',\n  formatYear: 'yyyy',\n  formatDayHeader: 'EEE',\n  formatDayTitle: 'MMMM yyyy',\n  formatMonthTitle: 'yyyy',\n  maxDate: null,\n  maxMode: 'year',\n  minDate: null,\n  minMode: 'day',\n  monthColumns: 3,\n  ngModelOptions: {},\n  shortcutPropagation: false,\n  showWeeks: true,\n  yearColumns: 5,\n  yearRows: 4\n})\n\n.controller('UibDatepickerController', ['$scope', '$element', '$attrs', '$parse', '$interpolate', '$locale', '$log', 'dateFilter', 'uibDatepickerConfig', '$datepickerLiteralWarning', '$datepickerSuppressError', 'uibDateParser',\n  function($scope, $element, $attrs, $parse, $interpolate, $locale, $log, dateFilter, datepickerConfig, $datepickerLiteralWarning, $datepickerSuppressError, dateParser) {\n  var self = this,\n      ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl;\n      ngModelOptions = {},\n      watchListeners = [];\n\n  $element.addClass('uib-datepicker');\n  $attrs.$set('role', 'application');\n\n  if (!$scope.datepickerOptions) {\n    $scope.datepickerOptions = {};\n  }\n\n  // Modes chain\n  this.modes = ['day', 'month', 'year'];\n\n  [\n    'customClass',\n    'dateDisabled',\n    'datepickerMode',\n    'formatDay',\n    'formatDayHeader',\n    'formatDayTitle',\n    'formatMonth',\n    'formatMonthTitle',\n    'formatYear',\n    'maxDate',\n    'maxMode',\n    'minDate',\n    'minMode',\n    'monthColumns',\n    'showWeeks',\n    'shortcutPropagation',\n    'startingDay',\n    'yearColumns',\n    'yearRows'\n  ].forEach(function(key) {\n    switch (key) {\n      case 'customClass':\n      case 'dateDisabled':\n        $scope[key] = $scope.datepickerOptions[key] || angular.noop;\n        break;\n      case 'datepickerMode':\n        $scope.datepickerMode = angular.isDefined($scope.datepickerOptions.datepickerMode) ?\n          $scope.datepickerOptions.datepickerMode : datepickerConfig.datepickerMode;\n        break;\n      case 'formatDay':\n      case 'formatDayHeader':\n      case 'formatDayTitle':\n      case 'formatMonth':\n      case 'formatMonthTitle':\n      case 'formatYear':\n        self[key] = angular.isDefined($scope.datepickerOptions[key]) ?\n          $interpolate($scope.datepickerOptions[key])($scope.$parent) :\n          datepickerConfig[key];\n        break;\n      case 'monthColumns':\n      case 'showWeeks':\n      case 'shortcutPropagation':\n      case 'yearColumns':\n      case 'yearRows':\n        self[key] = angular.isDefined($scope.datepickerOptions[key]) ?\n          $scope.datepickerOptions[key] : datepickerConfig[key];\n        break;\n      case 'startingDay':\n        if (angular.isDefined($scope.datepickerOptions.startingDay)) {\n          self.startingDay = $scope.datepickerOptions.startingDay;\n        } else if (angular.isNumber(datepickerConfig.startingDay)) {\n          self.startingDay = datepickerConfig.startingDay;\n        } else {\n          self.startingDay = ($locale.DATETIME_FORMATS.FIRSTDAYOFWEEK + 8) % 7;\n        }\n\n        break;\n      case 'maxDate':\n      case 'minDate':\n        $scope.$watch('datepickerOptions.' + key, function(value) {\n          if (value) {\n            if (angular.isDate(value)) {\n              self[key] = dateParser.fromTimezone(new Date(value), ngModelOptions.timezone);\n            } else {\n              if ($datepickerLiteralWarning) {\n                $log.warn('Literal date support has been deprecated, please switch to date object usage');\n              }\n\n              self[key] = new Date(dateFilter(value, 'medium'));\n            }\n          } else {\n            self[key] = datepickerConfig[key] ?\n              dateParser.fromTimezone(new Date(datepickerConfig[key]), ngModelOptions.timezone) :\n              null;\n          }\n\n          self.refreshView();\n        });\n\n        break;\n      case 'maxMode':\n      case 'minMode':\n        if ($scope.datepickerOptions[key]) {\n          $scope.$watch(function() { return $scope.datepickerOptions[key]; }, function(value) {\n            self[key] = $scope[key] = angular.isDefined(value) ? value : $scope.datepickerOptions[key];\n            if (key === 'minMode' && self.modes.indexOf($scope.datepickerOptions.datepickerMode) < self.modes.indexOf(self[key]) ||\n              key === 'maxMode' && self.modes.indexOf($scope.datepickerOptions.datepickerMode) > self.modes.indexOf(self[key])) {\n              $scope.datepickerMode = self[key];\n              $scope.datepickerOptions.datepickerMode = self[key];\n            }\n          });\n        } else {\n          self[key] = $scope[key] = datepickerConfig[key] || null;\n        }\n\n        break;\n    }\n  });\n\n  $scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000);\n\n  $scope.disabled = angular.isDefined($attrs.disabled) || false;\n  if (angular.isDefined($attrs.ngDisabled)) {\n    watchListeners.push($scope.$parent.$watch($attrs.ngDisabled, function(disabled) {\n      $scope.disabled = disabled;\n      self.refreshView();\n    }));\n  }\n\n  $scope.isActive = function(dateObject) {\n    if (self.compare(dateObject.date, self.activeDate) === 0) {\n      $scope.activeDateId = dateObject.uid;\n      return true;\n    }\n    return false;\n  };\n\n  this.init = function(ngModelCtrl_) {\n    ngModelCtrl = ngModelCtrl_;\n    ngModelOptions = ngModelCtrl_.$options ||\n      $scope.datepickerOptions.ngModelOptions ||\n      datepickerConfig.ngModelOptions;\n    if ($scope.datepickerOptions.initDate) {\n      self.activeDate = dateParser.fromTimezone($scope.datepickerOptions.initDate, ngModelOptions.timezone) || new Date();\n      $scope.$watch('datepickerOptions.initDate', function(initDate) {\n        if (initDate && (ngModelCtrl.$isEmpty(ngModelCtrl.$modelValue) || ngModelCtrl.$invalid)) {\n          self.activeDate = dateParser.fromTimezone(initDate, ngModelOptions.timezone);\n          self.refreshView();\n        }\n      });\n    } else {\n      self.activeDate = new Date();\n    }\n\n    var date = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : new Date();\n    this.activeDate = !isNaN(date) ?\n      dateParser.fromTimezone(date, ngModelOptions.timezone) :\n      dateParser.fromTimezone(new Date(), ngModelOptions.timezone);\n\n    ngModelCtrl.$render = function() {\n      self.render();\n    };\n  };\n\n  this.render = function() {\n    if (ngModelCtrl.$viewValue) {\n      var date = new Date(ngModelCtrl.$viewValue),\n          isValid = !isNaN(date);\n\n      if (isValid) {\n        this.activeDate = dateParser.fromTimezone(date, ngModelOptions.timezone);\n      } else if (!$datepickerSuppressError) {\n        $log.error('Datepicker directive: \"ng-model\" value must be a Date object');\n      }\n    }\n    this.refreshView();\n  };\n\n  this.refreshView = function() {\n    if (this.element) {\n      $scope.selectedDt = null;\n      this._refreshView();\n      if ($scope.activeDt) {\n        $scope.activeDateId = $scope.activeDt.uid;\n      }\n\n      var date = ngModelCtrl.$viewValue ? new Date(ngModelCtrl.$viewValue) : null;\n      date = dateParser.fromTimezone(date, ngModelOptions.timezone);\n      ngModelCtrl.$setValidity('dateDisabled', !date ||\n        this.element && !this.isDisabled(date));\n    }\n  };\n\n  this.createDateObject = function(date, format) {\n    var model = ngModelCtrl.$viewValue ? new Date(ngModelCtrl.$viewValue) : null;\n    model = dateParser.fromTimezone(model, ngModelOptions.timezone);\n    var today = new Date();\n    today = dateParser.fromTimezone(today, ngModelOptions.timezone);\n    var time = this.compare(date, today);\n    var dt = {\n      date: date,\n      label: dateParser.filter(date, format),\n      selected: model && this.compare(date, model) === 0,\n      disabled: this.isDisabled(date),\n      past: time < 0,\n      current: time === 0,\n      future: time > 0,\n      customClass: this.customClass(date) || null\n    };\n\n    if (model && this.compare(date, model) === 0) {\n      $scope.selectedDt = dt;\n    }\n\n    if (self.activeDate && this.compare(dt.date, self.activeDate) === 0) {\n      $scope.activeDt = dt;\n    }\n\n    return dt;\n  };\n\n  this.isDisabled = function(date) {\n    return $scope.disabled ||\n      this.minDate && this.compare(date, this.minDate) < 0 ||\n      this.maxDate && this.compare(date, this.maxDate) > 0 ||\n      $scope.dateDisabled && $scope.dateDisabled({date: date, mode: $scope.datepickerMode});\n  };\n\n  this.customClass = function(date) {\n    return $scope.customClass({date: date, mode: $scope.datepickerMode});\n  };\n\n  // Split array into smaller arrays\n  this.split = function(arr, size) {\n    var arrays = [];\n    while (arr.length > 0) {\n      arrays.push(arr.splice(0, size));\n    }\n    return arrays;\n  };\n\n  $scope.select = function(date) {\n    if ($scope.datepickerMode === self.minMode) {\n      var dt = ngModelCtrl.$viewValue ? dateParser.fromTimezone(new Date(ngModelCtrl.$viewValue), ngModelOptions.timezone) : new Date(0, 0, 0, 0, 0, 0, 0);\n      dt.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n      dt = dateParser.toTimezone(dt, ngModelOptions.timezone);\n      ngModelCtrl.$setViewValue(dt);\n      ngModelCtrl.$render();\n    } else {\n      self.activeDate = date;\n      setMode(self.modes[self.modes.indexOf($scope.datepickerMode) - 1]);\n\n      $scope.$emit('uib:datepicker.mode');\n    }\n\n    $scope.$broadcast('uib:datepicker.focus');\n  };\n\n  $scope.move = function(direction) {\n    var year = self.activeDate.getFullYear() + direction * (self.step.years || 0),\n        month = self.activeDate.getMonth() + direction * (self.step.months || 0);\n    self.activeDate.setFullYear(year, month, 1);\n    self.refreshView();\n  };\n\n  $scope.toggleMode = function(direction) {\n    direction = direction || 1;\n\n    if ($scope.datepickerMode === self.maxMode && direction === 1 ||\n      $scope.datepickerMode === self.minMode && direction === -1) {\n      return;\n    }\n\n    setMode(self.modes[self.modes.indexOf($scope.datepickerMode) + direction]);\n\n    $scope.$emit('uib:datepicker.mode');\n  };\n\n  // Key event mapper\n  $scope.keys = { 13: 'enter', 32: 'space', 33: 'pageup', 34: 'pagedown', 35: 'end', 36: 'home', 37: 'left', 38: 'up', 39: 'right', 40: 'down' };\n\n  var focusElement = function() {\n    self.element[0].focus();\n  };\n\n  // Listen for focus requests from popup directive\n  $scope.$on('uib:datepicker.focus', focusElement);\n\n  $scope.keydown = function(evt) {\n    var key = $scope.keys[evt.which];\n\n    if (!key || evt.shiftKey || evt.altKey || $scope.disabled) {\n      return;\n    }\n\n    evt.preventDefault();\n    if (!self.shortcutPropagation) {\n      evt.stopPropagation();\n    }\n\n    if (key === 'enter' || key === 'space') {\n      if (self.isDisabled(self.activeDate)) {\n        return; // do nothing\n      }\n      $scope.select(self.activeDate);\n    } else if (evt.ctrlKey && (key === 'up' || key === 'down')) {\n      $scope.toggleMode(key === 'up' ? 1 : -1);\n    } else {\n      self.handleKeyDown(key, evt);\n      self.refreshView();\n    }\n  };\n\n  $element.on('keydown', function(evt) {\n    $scope.$apply(function() {\n      $scope.keydown(evt);\n    });\n  });\n\n  $scope.$on('$destroy', function() {\n    //Clear all watch listeners on destroy\n    while (watchListeners.length) {\n      watchListeners.shift()();\n    }\n  });\n\n  function setMode(mode) {\n    $scope.datepickerMode = mode;\n    $scope.datepickerOptions.datepickerMode = mode;\n  }\n}])\n\n.controller('UibDaypickerController', ['$scope', '$element', 'dateFilter', function(scope, $element, dateFilter) {\n  var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n  this.step = { months: 1 };\n  this.element = $element;\n  function getDaysInMonth(year, month) {\n    return month === 1 && year % 4 === 0 &&\n      (year % 100 !== 0 || year % 400 === 0) ? 29 : DAYS_IN_MONTH[month];\n  }\n\n  this.init = function(ctrl) {\n    angular.extend(ctrl, this);\n    scope.showWeeks = ctrl.showWeeks;\n    ctrl.refreshView();\n  };\n\n  this.getDates = function(startDate, n) {\n    var dates = new Array(n), current = new Date(startDate), i = 0, date;\n    while (i < n) {\n      date = new Date(current);\n      dates[i++] = date;\n      current.setDate(current.getDate() + 1);\n    }\n    return dates;\n  };\n\n  this._refreshView = function() {\n    var year = this.activeDate.getFullYear(),\n      month = this.activeDate.getMonth(),\n      firstDayOfMonth = new Date(this.activeDate);\n\n    firstDayOfMonth.setFullYear(year, month, 1);\n\n    var difference = this.startingDay - firstDayOfMonth.getDay(),\n      numDisplayedFromPreviousMonth = difference > 0 ?\n        7 - difference : - difference,\n      firstDate = new Date(firstDayOfMonth);\n\n    if (numDisplayedFromPreviousMonth > 0) {\n      firstDate.setDate(-numDisplayedFromPreviousMonth + 1);\n    }\n\n    // 42 is the number of days on a six-week calendar\n    var days = this.getDates(firstDate, 42);\n    for (var i = 0; i < 42; i ++) {\n      days[i] = angular.extend(this.createDateObject(days[i], this.formatDay), {\n        secondary: days[i].getMonth() !== month,\n        uid: scope.uniqueId + '-' + i\n      });\n    }\n\n    scope.labels = new Array(7);\n    for (var j = 0; j < 7; j++) {\n      scope.labels[j] = {\n        abbr: dateFilter(days[j].date, this.formatDayHeader),\n        full: dateFilter(days[j].date, 'EEEE')\n      };\n    }\n\n    scope.title = dateFilter(this.activeDate, this.formatDayTitle);\n    scope.rows = this.split(days, 7);\n\n    if (scope.showWeeks) {\n      scope.weekNumbers = [];\n      var thursdayIndex = (4 + 7 - this.startingDay) % 7,\n          numWeeks = scope.rows.length;\n      for (var curWeek = 0; curWeek < numWeeks; curWeek++) {\n        scope.weekNumbers.push(\n          getISO8601WeekNumber(scope.rows[curWeek][thursdayIndex].date));\n      }\n    }\n  };\n\n  this.compare = function(date1, date2) {\n    var _date1 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate());\n    var _date2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());\n    _date1.setFullYear(date1.getFullYear());\n    _date2.setFullYear(date2.getFullYear());\n    return _date1 - _date2;\n  };\n\n  function getISO8601WeekNumber(date) {\n    var checkDate = new Date(date);\n    checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday\n    var time = checkDate.getTime();\n    checkDate.setMonth(0); // Compare with Jan 1\n    checkDate.setDate(1);\n    return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;\n  }\n\n  this.handleKeyDown = function(key, evt) {\n    var date = this.activeDate.getDate();\n\n    if (key === 'left') {\n      date = date - 1;\n    } else if (key === 'up') {\n      date = date - 7;\n    } else if (key === 'right') {\n      date = date + 1;\n    } else if (key === 'down') {\n      date = date + 7;\n    } else if (key === 'pageup' || key === 'pagedown') {\n      var month = this.activeDate.getMonth() + (key === 'pageup' ? - 1 : 1);\n      this.activeDate.setMonth(month, 1);\n      date = Math.min(getDaysInMonth(this.activeDate.getFullYear(), this.activeDate.getMonth()), date);\n    } else if (key === 'home') {\n      date = 1;\n    } else if (key === 'end') {\n      date = getDaysInMonth(this.activeDate.getFullYear(), this.activeDate.getMonth());\n    }\n    this.activeDate.setDate(date);\n  };\n}])\n\n.controller('UibMonthpickerController', ['$scope', '$element', 'dateFilter', function(scope, $element, dateFilter) {\n  this.step = { years: 1 };\n  this.element = $element;\n\n  this.init = function(ctrl) {\n    angular.extend(ctrl, this);\n    ctrl.refreshView();\n  };\n\n  this._refreshView = function() {\n    var months = new Array(12),\n        year = this.activeDate.getFullYear(),\n        date;\n\n    for (var i = 0; i < 12; i++) {\n      date = new Date(this.activeDate);\n      date.setFullYear(year, i, 1);\n      months[i] = angular.extend(this.createDateObject(date, this.formatMonth), {\n        uid: scope.uniqueId + '-' + i\n      });\n    }\n\n    scope.title = dateFilter(this.activeDate, this.formatMonthTitle);\n    scope.rows = this.split(months, this.monthColumns);\n    scope.yearHeaderColspan = this.monthColumns > 3 ? this.monthColumns - 2 : 1;\n  };\n\n  this.compare = function(date1, date2) {\n    var _date1 = new Date(date1.getFullYear(), date1.getMonth());\n    var _date2 = new Date(date2.getFullYear(), date2.getMonth());\n    _date1.setFullYear(date1.getFullYear());\n    _date2.setFullYear(date2.getFullYear());\n    return _date1 - _date2;\n  };\n\n  this.handleKeyDown = function(key, evt) {\n    var date = this.activeDate.getMonth();\n\n    if (key === 'left') {\n      date = date - 1;\n    } else if (key === 'up') {\n      date = date - this.monthColumns;\n    } else if (key === 'right') {\n      date = date + 1;\n    } else if (key === 'down') {\n      date = date + this.monthColumns;\n    } else if (key === 'pageup' || key === 'pagedown') {\n      var year = this.activeDate.getFullYear() + (key === 'pageup' ? - 1 : 1);\n      this.activeDate.setFullYear(year);\n    } else if (key === 'home') {\n      date = 0;\n    } else if (key === 'end') {\n      date = 11;\n    }\n    this.activeDate.setMonth(date);\n  };\n}])\n\n.controller('UibYearpickerController', ['$scope', '$element', 'dateFilter', function(scope, $element, dateFilter) {\n  var columns, range;\n  this.element = $element;\n\n  function getStartingYear(year) {\n    return parseInt((year - 1) / range, 10) * range + 1;\n  }\n\n  this.yearpickerInit = function() {\n    columns = this.yearColumns;\n    range = this.yearRows * columns;\n    this.step = { years: range };\n  };\n\n  this._refreshView = function() {\n    var years = new Array(range), date;\n\n    for (var i = 0, start = getStartingYear(this.activeDate.getFullYear()); i < range; i++) {\n      date = new Date(this.activeDate);\n      date.setFullYear(start + i, 0, 1);\n      years[i] = angular.extend(this.createDateObject(date, this.formatYear), {\n        uid: scope.uniqueId + '-' + i\n      });\n    }\n\n    scope.title = [years[0].label, years[range - 1].label].join(' - ');\n    scope.rows = this.split(years, columns);\n    scope.columns = columns;\n  };\n\n  this.compare = function(date1, date2) {\n    return date1.getFullYear() - date2.getFullYear();\n  };\n\n  this.handleKeyDown = function(key, evt) {\n    var date = this.activeDate.getFullYear();\n\n    if (key === 'left') {\n      date = date - 1;\n    } else if (key === 'up') {\n      date = date - columns;\n    } else if (key === 'right') {\n      date = date + 1;\n    } else if (key === 'down') {\n      date = date + columns;\n    } else if (key === 'pageup' || key === 'pagedown') {\n      date += (key === 'pageup' ? - 1 : 1) * range;\n    } else if (key === 'home') {\n      date = getStartingYear(this.activeDate.getFullYear());\n    } else if (key === 'end') {\n      date = getStartingYear(this.activeDate.getFullYear()) + range - 1;\n    }\n    this.activeDate.setFullYear(date);\n  };\n}])\n\n.directive('uibDatepicker', function() {\n  return {\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/datepicker/datepicker.html';\n    },\n    scope: {\n      datepickerOptions: '=?'\n    },\n    require: ['uibDatepicker', '^ngModel'],\n    restrict: 'A',\n    controller: 'UibDatepickerController',\n    controllerAs: 'datepicker',\n    link: function(scope, element, attrs, ctrls) {\n      var datepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      datepickerCtrl.init(ngModelCtrl);\n    }\n  };\n})\n\n.directive('uibDaypicker', function() {\n  return {\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/datepicker/day.html';\n    },\n    require: ['^uibDatepicker', 'uibDaypicker'],\n    restrict: 'A',\n    controller: 'UibDaypickerController',\n    link: function(scope, element, attrs, ctrls) {\n      var datepickerCtrl = ctrls[0],\n        daypickerCtrl = ctrls[1];\n\n      daypickerCtrl.init(datepickerCtrl);\n    }\n  };\n})\n\n.directive('uibMonthpicker', function() {\n  return {\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/datepicker/month.html';\n    },\n    require: ['^uibDatepicker', 'uibMonthpicker'],\n    restrict: 'A',\n    controller: 'UibMonthpickerController',\n    link: function(scope, element, attrs, ctrls) {\n      var datepickerCtrl = ctrls[0],\n        monthpickerCtrl = ctrls[1];\n\n      monthpickerCtrl.init(datepickerCtrl);\n    }\n  };\n})\n\n.directive('uibYearpicker', function() {\n  return {\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/datepicker/year.html';\n    },\n    require: ['^uibDatepicker', 'uibYearpicker'],\n    restrict: 'A',\n    controller: 'UibYearpickerController',\n    link: function(scope, element, attrs, ctrls) {\n      var ctrl = ctrls[0];\n      angular.extend(ctrl, ctrls[1]);\n      ctrl.yearpickerInit();\n\n      ctrl.refreshView();\n    }\n  };\n});\n\nangular.module('ui.bootstrap.position', [])\n\n/**\n * A set of utility methods for working with the DOM.\n * It is meant to be used where we need to absolute-position elements in\n * relation to another element (this is the case for tooltips, popovers,\n * typeahead suggestions etc.).\n */\n  .factory('$uibPosition', ['$document', '$window', function($document, $window) {\n    /**\n     * Used by scrollbarWidth() function to cache scrollbar's width.\n     * Do not access this variable directly, use scrollbarWidth() instead.\n     */\n    var SCROLLBAR_WIDTH;\n    /**\n     * scrollbar on body and html element in IE and Edge overlay\n     * content and should be considered 0 width.\n     */\n    var BODY_SCROLLBAR_WIDTH;\n    var OVERFLOW_REGEX = {\n      normal: /(auto|scroll)/,\n      hidden: /(auto|scroll|hidden)/\n    };\n    var PLACEMENT_REGEX = {\n      auto: /\\s?auto?\\s?/i,\n      primary: /^(top|bottom|left|right)$/,\n      secondary: /^(top|bottom|left|right|center)$/,\n      vertical: /^(top|bottom)$/\n    };\n    var BODY_REGEX = /(HTML|BODY)/;\n\n    return {\n\n      /**\n       * Provides a raw DOM element from a jQuery/jQLite element.\n       *\n       * @param {element} elem - The element to convert.\n       *\n       * @returns {element} A HTML element.\n       */\n      getRawNode: function(elem) {\n        return elem.nodeName ? elem : elem[0] || elem;\n      },\n\n      /**\n       * Provides a parsed number for a style property.  Strips\n       * units and casts invalid numbers to 0.\n       *\n       * @param {string} value - The style value to parse.\n       *\n       * @returns {number} A valid number.\n       */\n      parseStyle: function(value) {\n        value = parseFloat(value);\n        return isFinite(value) ? value : 0;\n      },\n\n      /**\n       * Provides the closest positioned ancestor.\n       *\n       * @param {element} element - The element to get the offest parent for.\n       *\n       * @returns {element} The closest positioned ancestor.\n       */\n      offsetParent: function(elem) {\n        elem = this.getRawNode(elem);\n\n        var offsetParent = elem.offsetParent || $document[0].documentElement;\n\n        function isStaticPositioned(el) {\n          return ($window.getComputedStyle(el).position || 'static') === 'static';\n        }\n\n        while (offsetParent && offsetParent !== $document[0].documentElement && isStaticPositioned(offsetParent)) {\n          offsetParent = offsetParent.offsetParent;\n        }\n\n        return offsetParent || $document[0].documentElement;\n      },\n\n      /**\n       * Provides the scrollbar width, concept from TWBS measureScrollbar()\n       * function in https://github.com/twbs/bootstrap/blob/master/js/modal.js\n       * In IE and Edge, scollbar on body and html element overlay and should\n       * return a width of 0.\n       *\n       * @returns {number} The width of the browser scollbar.\n       */\n      scrollbarWidth: function(isBody) {\n        if (isBody) {\n          if (angular.isUndefined(BODY_SCROLLBAR_WIDTH)) {\n            var bodyElem = $document.find('body');\n            bodyElem.addClass('uib-position-body-scrollbar-measure');\n            BODY_SCROLLBAR_WIDTH = $window.innerWidth - bodyElem[0].clientWidth;\n            BODY_SCROLLBAR_WIDTH = isFinite(BODY_SCROLLBAR_WIDTH) ? BODY_SCROLLBAR_WIDTH : 0;\n            bodyElem.removeClass('uib-position-body-scrollbar-measure');\n          }\n          return BODY_SCROLLBAR_WIDTH;\n        }\n\n        if (angular.isUndefined(SCROLLBAR_WIDTH)) {\n          var scrollElem = angular.element('<div class=\"uib-position-scrollbar-measure\"></div>');\n          $document.find('body').append(scrollElem);\n          SCROLLBAR_WIDTH = scrollElem[0].offsetWidth - scrollElem[0].clientWidth;\n          SCROLLBAR_WIDTH = isFinite(SCROLLBAR_WIDTH) ? SCROLLBAR_WIDTH : 0;\n          scrollElem.remove();\n        }\n\n        return SCROLLBAR_WIDTH;\n      },\n\n      /**\n       * Provides the padding required on an element to replace the scrollbar.\n       *\n       * @returns {object} An object with the following properties:\n       *   <ul>\n       *     <li>**scrollbarWidth**: the width of the scrollbar</li>\n       *     <li>**widthOverflow**: whether the the width is overflowing</li>\n       *     <li>**right**: the amount of right padding on the element needed to replace the scrollbar</li>\n       *     <li>**rightOriginal**: the amount of right padding currently on the element</li>\n       *     <li>**heightOverflow**: whether the the height is overflowing</li>\n       *     <li>**bottom**: the amount of bottom padding on the element needed to replace the scrollbar</li>\n       *     <li>**bottomOriginal**: the amount of bottom padding currently on the element</li>\n       *   </ul>\n       */\n      scrollbarPadding: function(elem) {\n        elem = this.getRawNode(elem);\n\n        var elemStyle = $window.getComputedStyle(elem);\n        var paddingRight = this.parseStyle(elemStyle.paddingRight);\n        var paddingBottom = this.parseStyle(elemStyle.paddingBottom);\n        var scrollParent = this.scrollParent(elem, false, true);\n        var scrollbarWidth = this.scrollbarWidth(scrollParent, BODY_REGEX.test(scrollParent.tagName));\n\n        return {\n          scrollbarWidth: scrollbarWidth,\n          widthOverflow: scrollParent.scrollWidth > scrollParent.clientWidth,\n          right: paddingRight + scrollbarWidth,\n          originalRight: paddingRight,\n          heightOverflow: scrollParent.scrollHeight > scrollParent.clientHeight,\n          bottom: paddingBottom + scrollbarWidth,\n          originalBottom: paddingBottom\n         };\n      },\n\n      /**\n       * Checks to see if the element is scrollable.\n       *\n       * @param {element} elem - The element to check.\n       * @param {boolean=} [includeHidden=false] - Should scroll style of 'hidden' be considered,\n       *   default is false.\n       *\n       * @returns {boolean} Whether the element is scrollable.\n       */\n      isScrollable: function(elem, includeHidden) {\n        elem = this.getRawNode(elem);\n\n        var overflowRegex = includeHidden ? OVERFLOW_REGEX.hidden : OVERFLOW_REGEX.normal;\n        var elemStyle = $window.getComputedStyle(elem);\n        return overflowRegex.test(elemStyle.overflow + elemStyle.overflowY + elemStyle.overflowX);\n      },\n\n      /**\n       * Provides the closest scrollable ancestor.\n       * A port of the jQuery UI scrollParent method:\n       * https://github.com/jquery/jquery-ui/blob/master/ui/scroll-parent.js\n       *\n       * @param {element} elem - The element to find the scroll parent of.\n       * @param {boolean=} [includeHidden=false] - Should scroll style of 'hidden' be considered,\n       *   default is false.\n       * @param {boolean=} [includeSelf=false] - Should the element being passed be\n       * included in the scrollable llokup.\n       *\n       * @returns {element} A HTML element.\n       */\n      scrollParent: function(elem, includeHidden, includeSelf) {\n        elem = this.getRawNode(elem);\n\n        var overflowRegex = includeHidden ? OVERFLOW_REGEX.hidden : OVERFLOW_REGEX.normal;\n        var documentEl = $document[0].documentElement;\n        var elemStyle = $window.getComputedStyle(elem);\n        if (includeSelf && overflowRegex.test(elemStyle.overflow + elemStyle.overflowY + elemStyle.overflowX)) {\n          return elem;\n        }\n        var excludeStatic = elemStyle.position === 'absolute';\n        var scrollParent = elem.parentElement || documentEl;\n\n        if (scrollParent === documentEl || elemStyle.position === 'fixed') {\n          return documentEl;\n        }\n\n        while (scrollParent.parentElement && scrollParent !== documentEl) {\n          var spStyle = $window.getComputedStyle(scrollParent);\n          if (excludeStatic && spStyle.position !== 'static') {\n            excludeStatic = false;\n          }\n\n          if (!excludeStatic && overflowRegex.test(spStyle.overflow + spStyle.overflowY + spStyle.overflowX)) {\n            break;\n          }\n          scrollParent = scrollParent.parentElement;\n        }\n\n        return scrollParent;\n      },\n\n      /**\n       * Provides read-only equivalent of jQuery's position function:\n       * http://api.jquery.com/position/ - distance to closest positioned\n       * ancestor.  Does not account for margins by default like jQuery position.\n       *\n       * @param {element} elem - The element to caclulate the position on.\n       * @param {boolean=} [includeMargins=false] - Should margins be accounted\n       * for, default is false.\n       *\n       * @returns {object} An object with the following properties:\n       *   <ul>\n       *     <li>**width**: the width of the element</li>\n       *     <li>**height**: the height of the element</li>\n       *     <li>**top**: distance to top edge of offset parent</li>\n       *     <li>**left**: distance to left edge of offset parent</li>\n       *   </ul>\n       */\n      position: function(elem, includeMagins) {\n        elem = this.getRawNode(elem);\n\n        var elemOffset = this.offset(elem);\n        if (includeMagins) {\n          var elemStyle = $window.getComputedStyle(elem);\n          elemOffset.top -= this.parseStyle(elemStyle.marginTop);\n          elemOffset.left -= this.parseStyle(elemStyle.marginLeft);\n        }\n        var parent = this.offsetParent(elem);\n        var parentOffset = {top: 0, left: 0};\n\n        if (parent !== $document[0].documentElement) {\n          parentOffset = this.offset(parent);\n          parentOffset.top += parent.clientTop - parent.scrollTop;\n          parentOffset.left += parent.clientLeft - parent.scrollLeft;\n        }\n\n        return {\n          width: Math.round(angular.isNumber(elemOffset.width) ? elemOffset.width : elem.offsetWidth),\n          height: Math.round(angular.isNumber(elemOffset.height) ? elemOffset.height : elem.offsetHeight),\n          top: Math.round(elemOffset.top - parentOffset.top),\n          left: Math.round(elemOffset.left - parentOffset.left)\n        };\n      },\n\n      /**\n       * Provides read-only equivalent of jQuery's offset function:\n       * http://api.jquery.com/offset/ - distance to viewport.  Does\n       * not account for borders, margins, or padding on the body\n       * element.\n       *\n       * @param {element} elem - The element to calculate the offset on.\n       *\n       * @returns {object} An object with the following properties:\n       *   <ul>\n       *     <li>**width**: the width of the element</li>\n       *     <li>**height**: the height of the element</li>\n       *     <li>**top**: distance to top edge of viewport</li>\n       *     <li>**right**: distance to bottom edge of viewport</li>\n       *   </ul>\n       */\n      offset: function(elem) {\n        elem = this.getRawNode(elem);\n\n        var elemBCR = elem.getBoundingClientRect();\n        return {\n          width: Math.round(angular.isNumber(elemBCR.width) ? elemBCR.width : elem.offsetWidth),\n          height: Math.round(angular.isNumber(elemBCR.height) ? elemBCR.height : elem.offsetHeight),\n          top: Math.round(elemBCR.top + ($window.pageYOffset || $document[0].documentElement.scrollTop)),\n          left: Math.round(elemBCR.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft))\n        };\n      },\n\n      /**\n       * Provides offset distance to the closest scrollable ancestor\n       * or viewport.  Accounts for border and scrollbar width.\n       *\n       * Right and bottom dimensions represent the distance to the\n       * respective edge of the viewport element.  If the element\n       * edge extends beyond the viewport, a negative value will be\n       * reported.\n       *\n       * @param {element} elem - The element to get the viewport offset for.\n       * @param {boolean=} [useDocument=false] - Should the viewport be the document element instead\n       * of the first scrollable element, default is false.\n       * @param {boolean=} [includePadding=true] - Should the padding on the offset parent element\n       * be accounted for, default is true.\n       *\n       * @returns {object} An object with the following properties:\n       *   <ul>\n       *     <li>**top**: distance to the top content edge of viewport element</li>\n       *     <li>**bottom**: distance to the bottom content edge of viewport element</li>\n       *     <li>**left**: distance to the left content edge of viewport element</li>\n       *     <li>**right**: distance to the right content edge of viewport element</li>\n       *   </ul>\n       */\n      viewportOffset: function(elem, useDocument, includePadding) {\n        elem = this.getRawNode(elem);\n        includePadding = includePadding !== false ? true : false;\n\n        var elemBCR = elem.getBoundingClientRect();\n        var offsetBCR = {top: 0, left: 0, bottom: 0, right: 0};\n\n        var offsetParent = useDocument ? $document[0].documentElement : this.scrollParent(elem);\n        var offsetParentBCR = offsetParent.getBoundingClientRect();\n\n        offsetBCR.top = offsetParentBCR.top + offsetParent.clientTop;\n        offsetBCR.left = offsetParentBCR.left + offsetParent.clientLeft;\n        if (offsetParent === $document[0].documentElement) {\n          offsetBCR.top += $window.pageYOffset;\n          offsetBCR.left += $window.pageXOffset;\n        }\n        offsetBCR.bottom = offsetBCR.top + offsetParent.clientHeight;\n        offsetBCR.right = offsetBCR.left + offsetParent.clientWidth;\n\n        if (includePadding) {\n          var offsetParentStyle = $window.getComputedStyle(offsetParent);\n          offsetBCR.top += this.parseStyle(offsetParentStyle.paddingTop);\n          offsetBCR.bottom -= this.parseStyle(offsetParentStyle.paddingBottom);\n          offsetBCR.left += this.parseStyle(offsetParentStyle.paddingLeft);\n          offsetBCR.right -= this.parseStyle(offsetParentStyle.paddingRight);\n        }\n\n        return {\n          top: Math.round(elemBCR.top - offsetBCR.top),\n          bottom: Math.round(offsetBCR.bottom - elemBCR.bottom),\n          left: Math.round(elemBCR.left - offsetBCR.left),\n          right: Math.round(offsetBCR.right - elemBCR.right)\n        };\n      },\n\n      /**\n       * Provides an array of placement values parsed from a placement string.\n       * Along with the 'auto' indicator, supported placement strings are:\n       *   <ul>\n       *     <li>top: element on top, horizontally centered on host element.</li>\n       *     <li>top-left: element on top, left edge aligned with host element left edge.</li>\n       *     <li>top-right: element on top, lerightft edge aligned with host element right edge.</li>\n       *     <li>bottom: element on bottom, horizontally centered on host element.</li>\n       *     <li>bottom-left: element on bottom, left edge aligned with host element left edge.</li>\n       *     <li>bottom-right: element on bottom, right edge aligned with host element right edge.</li>\n       *     <li>left: element on left, vertically centered on host element.</li>\n       *     <li>left-top: element on left, top edge aligned with host element top edge.</li>\n       *     <li>left-bottom: element on left, bottom edge aligned with host element bottom edge.</li>\n       *     <li>right: element on right, vertically centered on host element.</li>\n       *     <li>right-top: element on right, top edge aligned with host element top edge.</li>\n       *     <li>right-bottom: element on right, bottom edge aligned with host element bottom edge.</li>\n       *   </ul>\n       * A placement string with an 'auto' indicator is expected to be\n       * space separated from the placement, i.e: 'auto bottom-left'  If\n       * the primary and secondary placement values do not match 'top,\n       * bottom, left, right' then 'top' will be the primary placement and\n       * 'center' will be the secondary placement.  If 'auto' is passed, true\n       * will be returned as the 3rd value of the array.\n       *\n       * @param {string} placement - The placement string to parse.\n       *\n       * @returns {array} An array with the following values\n       * <ul>\n       *   <li>**[0]**: The primary placement.</li>\n       *   <li>**[1]**: The secondary placement.</li>\n       *   <li>**[2]**: If auto is passed: true, else undefined.</li>\n       * </ul>\n       */\n      parsePlacement: function(placement) {\n        var autoPlace = PLACEMENT_REGEX.auto.test(placement);\n        if (autoPlace) {\n          placement = placement.replace(PLACEMENT_REGEX.auto, '');\n        }\n\n        placement = placement.split('-');\n\n        placement[0] = placement[0] || 'top';\n        if (!PLACEMENT_REGEX.primary.test(placement[0])) {\n          placement[0] = 'top';\n        }\n\n        placement[1] = placement[1] || 'center';\n        if (!PLACEMENT_REGEX.secondary.test(placement[1])) {\n          placement[1] = 'center';\n        }\n\n        if (autoPlace) {\n          placement[2] = true;\n        } else {\n          placement[2] = false;\n        }\n\n        return placement;\n      },\n\n      /**\n       * Provides coordinates for an element to be positioned relative to\n       * another element.  Passing 'auto' as part of the placement parameter\n       * will enable smart placement - where the element fits. i.e:\n       * 'auto left-top' will check to see if there is enough space to the left\n       * of the hostElem to fit the targetElem, if not place right (same for secondary\n       * top placement).  Available space is calculated using the viewportOffset\n       * function.\n       *\n       * @param {element} hostElem - The element to position against.\n       * @param {element} targetElem - The element to position.\n       * @param {string=} [placement=top] - The placement for the targetElem,\n       *   default is 'top'. 'center' is assumed as secondary placement for\n       *   'top', 'left', 'right', and 'bottom' placements.  Available placements are:\n       *   <ul>\n       *     <li>top</li>\n       *     <li>top-right</li>\n       *     <li>top-left</li>\n       *     <li>bottom</li>\n       *     <li>bottom-left</li>\n       *     <li>bottom-right</li>\n       *     <li>left</li>\n       *     <li>left-top</li>\n       *     <li>left-bottom</li>\n       *     <li>right</li>\n       *     <li>right-top</li>\n       *     <li>right-bottom</li>\n       *   </ul>\n       * @param {boolean=} [appendToBody=false] - Should the top and left values returned\n       *   be calculated from the body element, default is false.\n       *\n       * @returns {object} An object with the following properties:\n       *   <ul>\n       *     <li>**top**: Value for targetElem top.</li>\n       *     <li>**left**: Value for targetElem left.</li>\n       *     <li>**placement**: The resolved placement.</li>\n       *   </ul>\n       */\n      positionElements: function(hostElem, targetElem, placement, appendToBody) {\n        hostElem = this.getRawNode(hostElem);\n        targetElem = this.getRawNode(targetElem);\n\n        // need to read from prop to support tests.\n        var targetWidth = angular.isDefined(targetElem.offsetWidth) ? targetElem.offsetWidth : targetElem.prop('offsetWidth');\n        var targetHeight = angular.isDefined(targetElem.offsetHeight) ? targetElem.offsetHeight : targetElem.prop('offsetHeight');\n\n        placement = this.parsePlacement(placement);\n\n        var hostElemPos = appendToBody ? this.offset(hostElem) : this.position(hostElem);\n        var targetElemPos = {top: 0, left: 0, placement: ''};\n\n        if (placement[2]) {\n          var viewportOffset = this.viewportOffset(hostElem, appendToBody);\n\n          var targetElemStyle = $window.getComputedStyle(targetElem);\n          var adjustedSize = {\n            width: targetWidth + Math.round(Math.abs(this.parseStyle(targetElemStyle.marginLeft) + this.parseStyle(targetElemStyle.marginRight))),\n            height: targetHeight + Math.round(Math.abs(this.parseStyle(targetElemStyle.marginTop) + this.parseStyle(targetElemStyle.marginBottom)))\n          };\n\n          placement[0] = placement[0] === 'top' && adjustedSize.height > viewportOffset.top && adjustedSize.height <= viewportOffset.bottom ? 'bottom' :\n                         placement[0] === 'bottom' && adjustedSize.height > viewportOffset.bottom && adjustedSize.height <= viewportOffset.top ? 'top' :\n                         placement[0] === 'left' && adjustedSize.width > viewportOffset.left && adjustedSize.width <= viewportOffset.right ? 'right' :\n                         placement[0] === 'right' && adjustedSize.width > viewportOffset.right && adjustedSize.width <= viewportOffset.left ? 'left' :\n                         placement[0];\n\n          placement[1] = placement[1] === 'top' && adjustedSize.height - hostElemPos.height > viewportOffset.bottom && adjustedSize.height - hostElemPos.height <= viewportOffset.top ? 'bottom' :\n                         placement[1] === 'bottom' && adjustedSize.height - hostElemPos.height > viewportOffset.top && adjustedSize.height - hostElemPos.height <= viewportOffset.bottom ? 'top' :\n                         placement[1] === 'left' && adjustedSize.width - hostElemPos.width > viewportOffset.right && adjustedSize.width - hostElemPos.width <= viewportOffset.left ? 'right' :\n                         placement[1] === 'right' && adjustedSize.width - hostElemPos.width > viewportOffset.left && adjustedSize.width - hostElemPos.width <= viewportOffset.right ? 'left' :\n                         placement[1];\n\n          if (placement[1] === 'center') {\n            if (PLACEMENT_REGEX.vertical.test(placement[0])) {\n              var xOverflow = hostElemPos.width / 2 - targetWidth / 2;\n              if (viewportOffset.left + xOverflow < 0 && adjustedSize.width - hostElemPos.width <= viewportOffset.right) {\n                placement[1] = 'left';\n              } else if (viewportOffset.right + xOverflow < 0 && adjustedSize.width - hostElemPos.width <= viewportOffset.left) {\n                placement[1] = 'right';\n              }\n            } else {\n              var yOverflow = hostElemPos.height / 2 - adjustedSize.height / 2;\n              if (viewportOffset.top + yOverflow < 0 && adjustedSize.height - hostElemPos.height <= viewportOffset.bottom) {\n                placement[1] = 'top';\n              } else if (viewportOffset.bottom + yOverflow < 0 && adjustedSize.height - hostElemPos.height <= viewportOffset.top) {\n                placement[1] = 'bottom';\n              }\n            }\n          }\n        }\n\n        switch (placement[0]) {\n          case 'top':\n            targetElemPos.top = hostElemPos.top - targetHeight;\n            break;\n          case 'bottom':\n            targetElemPos.top = hostElemPos.top + hostElemPos.height;\n            break;\n          case 'left':\n            targetElemPos.left = hostElemPos.left - targetWidth;\n            break;\n          case 'right':\n            targetElemPos.left = hostElemPos.left + hostElemPos.width;\n            break;\n        }\n\n        switch (placement[1]) {\n          case 'top':\n            targetElemPos.top = hostElemPos.top;\n            break;\n          case 'bottom':\n            targetElemPos.top = hostElemPos.top + hostElemPos.height - targetHeight;\n            break;\n          case 'left':\n            targetElemPos.left = hostElemPos.left;\n            break;\n          case 'right':\n            targetElemPos.left = hostElemPos.left + hostElemPos.width - targetWidth;\n            break;\n          case 'center':\n            if (PLACEMENT_REGEX.vertical.test(placement[0])) {\n              targetElemPos.left = hostElemPos.left + hostElemPos.width / 2 - targetWidth / 2;\n            } else {\n              targetElemPos.top = hostElemPos.top + hostElemPos.height / 2 - targetHeight / 2;\n            }\n            break;\n        }\n\n        targetElemPos.top = Math.round(targetElemPos.top);\n        targetElemPos.left = Math.round(targetElemPos.left);\n        targetElemPos.placement = placement[1] === 'center' ? placement[0] : placement[0] + '-' + placement[1];\n\n        return targetElemPos;\n      },\n\n      /**\n       * Provides a way to adjust the top positioning after first\n       * render to correctly align element to top after content\n       * rendering causes resized element height\n       *\n       * @param {array} placementClasses - The array of strings of classes\n       * element should have.\n       * @param {object} containerPosition - The object with container\n       * position information\n       * @param {number} initialHeight - The initial height for the elem.\n       * @param {number} currentHeight - The current height for the elem.\n       */\n      adjustTop: function(placementClasses, containerPosition, initialHeight, currentHeight) {\n        if (placementClasses.indexOf('top') !== -1 && initialHeight !== currentHeight) {\n          return {\n            top: containerPosition.top - currentHeight + 'px'\n          };\n        }\n      },\n\n      /**\n       * Provides a way for positioning tooltip & dropdown\n       * arrows when using placement options beyond the standard\n       * left, right, top, or bottom.\n       *\n       * @param {element} elem - The tooltip/dropdown element.\n       * @param {string} placement - The placement for the elem.\n       */\n      positionArrow: function(elem, placement) {\n        elem = this.getRawNode(elem);\n\n        var innerElem = elem.querySelector('.tooltip-inner, .popover-inner');\n        if (!innerElem) {\n          return;\n        }\n\n        var isTooltip = angular.element(innerElem).hasClass('tooltip-inner');\n\n        var arrowElem = isTooltip ? elem.querySelector('.tooltip-arrow') : elem.querySelector('.arrow');\n        if (!arrowElem) {\n          return;\n        }\n\n        var arrowCss = {\n          top: '',\n          bottom: '',\n          left: '',\n          right: ''\n        };\n\n        placement = this.parsePlacement(placement);\n        if (placement[1] === 'center') {\n          // no adjustment necessary - just reset styles\n          angular.element(arrowElem).css(arrowCss);\n          return;\n        }\n\n        var borderProp = 'border-' + placement[0] + '-width';\n        var borderWidth = $window.getComputedStyle(arrowElem)[borderProp];\n\n        var borderRadiusProp = 'border-';\n        if (PLACEMENT_REGEX.vertical.test(placement[0])) {\n          borderRadiusProp += placement[0] + '-' + placement[1];\n        } else {\n          borderRadiusProp += placement[1] + '-' + placement[0];\n        }\n        borderRadiusProp += '-radius';\n        var borderRadius = $window.getComputedStyle(isTooltip ? innerElem : elem)[borderRadiusProp];\n\n        switch (placement[0]) {\n          case 'top':\n            arrowCss.bottom = isTooltip ? '0' : '-' + borderWidth;\n            break;\n          case 'bottom':\n            arrowCss.top = isTooltip ? '0' : '-' + borderWidth;\n            break;\n          case 'left':\n            arrowCss.right = isTooltip ? '0' : '-' + borderWidth;\n            break;\n          case 'right':\n            arrowCss.left = isTooltip ? '0' : '-' + borderWidth;\n            break;\n        }\n\n        arrowCss[placement[1]] = borderRadius;\n\n        angular.element(arrowElem).css(arrowCss);\n      }\n    };\n  }]);\n\nangular.module('ui.bootstrap.datepickerPopup', ['ui.bootstrap.datepicker', 'ui.bootstrap.position'])\n\n.value('$datepickerPopupLiteralWarning', true)\n\n.constant('uibDatepickerPopupConfig', {\n  altInputFormats: [],\n  appendToBody: false,\n  clearText: 'Clear',\n  closeOnDateSelection: true,\n  closeText: 'Done',\n  currentText: 'Today',\n  datepickerPopup: 'yyyy-MM-dd',\n  datepickerPopupTemplateUrl: 'uib/template/datepickerPopup/popup.html',\n  datepickerTemplateUrl: 'uib/template/datepicker/datepicker.html',\n  html5Types: {\n    date: 'yyyy-MM-dd',\n    'datetime-local': 'yyyy-MM-ddTHH:mm:ss.sss',\n    'month': 'yyyy-MM'\n  },\n  onOpenFocus: true,\n  showButtonBar: true,\n  placement: 'auto bottom-left'\n})\n\n.controller('UibDatepickerPopupController', ['$scope', '$element', '$attrs', '$compile', '$log', '$parse', '$window', '$document', '$rootScope', '$uibPosition', 'dateFilter', 'uibDateParser', 'uibDatepickerPopupConfig', '$timeout', 'uibDatepickerConfig', '$datepickerPopupLiteralWarning',\nfunction($scope, $element, $attrs, $compile, $log, $parse, $window, $document, $rootScope, $position, dateFilter, dateParser, datepickerPopupConfig, $timeout, datepickerConfig, $datepickerPopupLiteralWarning) {\n  var cache = {},\n    isHtml5DateInput = false;\n  var dateFormat, closeOnDateSelection, appendToBody, onOpenFocus,\n    datepickerPopupTemplateUrl, datepickerTemplateUrl, popupEl, datepickerEl, scrollParentEl,\n    ngModel, ngModelOptions, $popup, altInputFormats, watchListeners = [];\n\n  this.init = function(_ngModel_) {\n    ngModel = _ngModel_;\n    ngModelOptions = angular.isObject(_ngModel_.$options) ?\n      _ngModel_.$options :\n      {\n        timezone: null\n      };\n    closeOnDateSelection = angular.isDefined($attrs.closeOnDateSelection) ?\n      $scope.$parent.$eval($attrs.closeOnDateSelection) :\n      datepickerPopupConfig.closeOnDateSelection;\n    appendToBody = angular.isDefined($attrs.datepickerAppendToBody) ?\n      $scope.$parent.$eval($attrs.datepickerAppendToBody) :\n      datepickerPopupConfig.appendToBody;\n    onOpenFocus = angular.isDefined($attrs.onOpenFocus) ?\n      $scope.$parent.$eval($attrs.onOpenFocus) : datepickerPopupConfig.onOpenFocus;\n    datepickerPopupTemplateUrl = angular.isDefined($attrs.datepickerPopupTemplateUrl) ?\n      $attrs.datepickerPopupTemplateUrl :\n      datepickerPopupConfig.datepickerPopupTemplateUrl;\n    datepickerTemplateUrl = angular.isDefined($attrs.datepickerTemplateUrl) ?\n      $attrs.datepickerTemplateUrl : datepickerPopupConfig.datepickerTemplateUrl;\n    altInputFormats = angular.isDefined($attrs.altInputFormats) ?\n      $scope.$parent.$eval($attrs.altInputFormats) :\n      datepickerPopupConfig.altInputFormats;\n\n    $scope.showButtonBar = angular.isDefined($attrs.showButtonBar) ?\n      $scope.$parent.$eval($attrs.showButtonBar) :\n      datepickerPopupConfig.showButtonBar;\n\n    if (datepickerPopupConfig.html5Types[$attrs.type]) {\n      dateFormat = datepickerPopupConfig.html5Types[$attrs.type];\n      isHtml5DateInput = true;\n    } else {\n      dateFormat = $attrs.uibDatepickerPopup || datepickerPopupConfig.datepickerPopup;\n      $attrs.$observe('uibDatepickerPopup', function(value, oldValue) {\n        var newDateFormat = value || datepickerPopupConfig.datepickerPopup;\n        // Invalidate the $modelValue to ensure that formatters re-run\n        // FIXME: Refactor when PR is merged: https://github.com/angular/angular.js/pull/10764\n        if (newDateFormat !== dateFormat) {\n          dateFormat = newDateFormat;\n          ngModel.$modelValue = null;\n\n          if (!dateFormat) {\n            throw new Error('uibDatepickerPopup must have a date format specified.');\n          }\n        }\n      });\n    }\n\n    if (!dateFormat) {\n      throw new Error('uibDatepickerPopup must have a date format specified.');\n    }\n\n    if (isHtml5DateInput && $attrs.uibDatepickerPopup) {\n      throw new Error('HTML5 date input types do not support custom formats.');\n    }\n\n    // popup element used to display calendar\n    popupEl = angular.element('<div uib-datepicker-popup-wrap><div uib-datepicker></div></div>');\n\n    popupEl.attr({\n      'ng-model': 'date',\n      'ng-change': 'dateSelection(date)',\n      'template-url': datepickerPopupTemplateUrl\n    });\n\n    // datepicker element\n    datepickerEl = angular.element(popupEl.children()[0]);\n    datepickerEl.attr('template-url', datepickerTemplateUrl);\n\n    if (!$scope.datepickerOptions) {\n      $scope.datepickerOptions = {};\n    }\n\n    if (isHtml5DateInput) {\n      if ($attrs.type === 'month') {\n        $scope.datepickerOptions.datepickerMode = 'month';\n        $scope.datepickerOptions.minMode = 'month';\n      }\n    }\n\n    datepickerEl.attr('datepicker-options', 'datepickerOptions');\n\n    if (!isHtml5DateInput) {\n      // Internal API to maintain the correct ng-invalid-[key] class\n      ngModel.$$parserName = 'date';\n      ngModel.$validators.date = validator;\n      ngModel.$parsers.unshift(parseDate);\n      ngModel.$formatters.push(function(value) {\n        if (ngModel.$isEmpty(value)) {\n          $scope.date = value;\n          return value;\n        }\n\n        if (angular.isNumber(value)) {\n          value = new Date(value);\n        }\n\n        $scope.date = dateParser.fromTimezone(value, ngModelOptions.timezone);\n\n        return dateParser.filter($scope.date, dateFormat);\n      });\n    } else {\n      ngModel.$formatters.push(function(value) {\n        $scope.date = dateParser.fromTimezone(value, ngModelOptions.timezone);\n        return value;\n      });\n    }\n\n    // Detect changes in the view from the text box\n    ngModel.$viewChangeListeners.push(function() {\n      $scope.date = parseDateString(ngModel.$viewValue);\n    });\n\n    $element.on('keydown', inputKeydownBind);\n\n    $popup = $compile(popupEl)($scope);\n    // Prevent jQuery cache memory leak (template is now redundant after linking)\n    popupEl.remove();\n\n    if (appendToBody) {\n      $document.find('body').append($popup);\n    } else {\n      $element.after($popup);\n    }\n\n    $scope.$on('$destroy', function() {\n      if ($scope.isOpen === true) {\n        if (!$rootScope.$$phase) {\n          $scope.$apply(function() {\n            $scope.isOpen = false;\n          });\n        }\n      }\n\n      $popup.remove();\n      $element.off('keydown', inputKeydownBind);\n      $document.off('click', documentClickBind);\n      if (scrollParentEl) {\n        scrollParentEl.off('scroll', positionPopup);\n      }\n      angular.element($window).off('resize', positionPopup);\n\n      //Clear all watch listeners on destroy\n      while (watchListeners.length) {\n        watchListeners.shift()();\n      }\n    });\n  };\n\n  $scope.getText = function(key) {\n    return $scope[key + 'Text'] || datepickerPopupConfig[key + 'Text'];\n  };\n\n  $scope.isDisabled = function(date) {\n    if (date === 'today') {\n      date = dateParser.fromTimezone(new Date(), ngModelOptions.timezone);\n    }\n\n    var dates = {};\n    angular.forEach(['minDate', 'maxDate'], function(key) {\n      if (!$scope.datepickerOptions[key]) {\n        dates[key] = null;\n      } else if (angular.isDate($scope.datepickerOptions[key])) {\n        dates[key] = new Date($scope.datepickerOptions[key]);\n      } else {\n        if ($datepickerPopupLiteralWarning) {\n          $log.warn('Literal date support has been deprecated, please switch to date object usage');\n        }\n\n        dates[key] = new Date(dateFilter($scope.datepickerOptions[key], 'medium'));\n      }\n    });\n\n    return $scope.datepickerOptions &&\n      dates.minDate && $scope.compare(date, dates.minDate) < 0 ||\n      dates.maxDate && $scope.compare(date, dates.maxDate) > 0;\n  };\n\n  $scope.compare = function(date1, date2) {\n    return new Date(date1.getFullYear(), date1.getMonth(), date1.getDate()) - new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());\n  };\n\n  // Inner change\n  $scope.dateSelection = function(dt) {\n    $scope.date = dt;\n    var date = $scope.date ? dateParser.filter($scope.date, dateFormat) : null; // Setting to NULL is necessary for form validators to function\n    $element.val(date);\n    ngModel.$setViewValue(date);\n\n    if (closeOnDateSelection) {\n      $scope.isOpen = false;\n      $element[0].focus();\n    }\n  };\n\n  $scope.keydown = function(evt) {\n    if (evt.which === 27) {\n      evt.stopPropagation();\n      $scope.isOpen = false;\n      $element[0].focus();\n    }\n  };\n\n  $scope.select = function(date, evt) {\n    evt.stopPropagation();\n\n    if (date === 'today') {\n      var today = new Date();\n      if (angular.isDate($scope.date)) {\n        date = new Date($scope.date);\n        date.setFullYear(today.getFullYear(), today.getMonth(), today.getDate());\n      } else {\n        date = dateParser.fromTimezone(today, ngModelOptions.timezone);\n        date.setHours(0, 0, 0, 0);\n      }\n    }\n    $scope.dateSelection(date);\n  };\n\n  $scope.close = function(evt) {\n    evt.stopPropagation();\n\n    $scope.isOpen = false;\n    $element[0].focus();\n  };\n\n  $scope.disabled = angular.isDefined($attrs.disabled) || false;\n  if ($attrs.ngDisabled) {\n    watchListeners.push($scope.$parent.$watch($parse($attrs.ngDisabled), function(disabled) {\n      $scope.disabled = disabled;\n    }));\n  }\n\n  $scope.$watch('isOpen', function(value) {\n    if (value) {\n      if (!$scope.disabled) {\n        $timeout(function() {\n          positionPopup();\n\n          if (onOpenFocus) {\n            $scope.$broadcast('uib:datepicker.focus');\n          }\n\n          $document.on('click', documentClickBind);\n\n          var placement = $attrs.popupPlacement ? $attrs.popupPlacement : datepickerPopupConfig.placement;\n          if (appendToBody || $position.parsePlacement(placement)[2]) {\n            scrollParentEl = scrollParentEl || angular.element($position.scrollParent($element));\n            if (scrollParentEl) {\n              scrollParentEl.on('scroll', positionPopup);\n            }\n          } else {\n            scrollParentEl = null;\n          }\n\n          angular.element($window).on('resize', positionPopup);\n        }, 0, false);\n      } else {\n        $scope.isOpen = false;\n      }\n    } else {\n      $document.off('click', documentClickBind);\n      if (scrollParentEl) {\n        scrollParentEl.off('scroll', positionPopup);\n      }\n      angular.element($window).off('resize', positionPopup);\n    }\n  });\n\n  function cameltoDash(string) {\n    return string.replace(/([A-Z])/g, function($1) { return '-' + $1.toLowerCase(); });\n  }\n\n  function parseDateString(viewValue) {\n    var date = dateParser.parse(viewValue, dateFormat, $scope.date);\n    if (isNaN(date)) {\n      for (var i = 0; i < altInputFormats.length; i++) {\n        date = dateParser.parse(viewValue, altInputFormats[i], $scope.date);\n        if (!isNaN(date)) {\n          return date;\n        }\n      }\n    }\n    return date;\n  }\n\n  function parseDate(viewValue) {\n    if (angular.isNumber(viewValue)) {\n      // presumably timestamp to date object\n      viewValue = new Date(viewValue);\n    }\n\n    if (!viewValue) {\n      return null;\n    }\n\n    if (angular.isDate(viewValue) && !isNaN(viewValue)) {\n      return viewValue;\n    }\n\n    if (angular.isString(viewValue)) {\n      var date = parseDateString(viewValue);\n      if (!isNaN(date)) {\n        return dateParser.fromTimezone(date, ngModelOptions.timezone);\n      }\n    }\n\n    return ngModel.$options && ngModel.$options.allowInvalid ? viewValue : undefined;\n  }\n\n  function validator(modelValue, viewValue) {\n    var value = modelValue || viewValue;\n\n    if (!$attrs.ngRequired && !value) {\n      return true;\n    }\n\n    if (angular.isNumber(value)) {\n      value = new Date(value);\n    }\n\n    if (!value) {\n      return true;\n    }\n\n    if (angular.isDate(value) && !isNaN(value)) {\n      return true;\n    }\n\n    if (angular.isString(value)) {\n      return !isNaN(parseDateString(value));\n    }\n\n    return false;\n  }\n\n  function documentClickBind(event) {\n    if (!$scope.isOpen && $scope.disabled) {\n      return;\n    }\n\n    var popup = $popup[0];\n    var dpContainsTarget = $element[0].contains(event.target);\n    // The popup node may not be an element node\n    // In some browsers (IE) only element nodes have the 'contains' function\n    var popupContainsTarget = popup.contains !== undefined && popup.contains(event.target);\n    if ($scope.isOpen && !(dpContainsTarget || popupContainsTarget)) {\n      $scope.$apply(function() {\n        $scope.isOpen = false;\n      });\n    }\n  }\n\n  function inputKeydownBind(evt) {\n    if (evt.which === 27 && $scope.isOpen) {\n      evt.preventDefault();\n      evt.stopPropagation();\n      $scope.$apply(function() {\n        $scope.isOpen = false;\n      });\n      $element[0].focus();\n    } else if (evt.which === 40 && !$scope.isOpen) {\n      evt.preventDefault();\n      evt.stopPropagation();\n      $scope.$apply(function() {\n        $scope.isOpen = true;\n      });\n    }\n  }\n\n  function positionPopup() {\n    if ($scope.isOpen) {\n      var dpElement = angular.element($popup[0].querySelector('.uib-datepicker-popup'));\n      var placement = $attrs.popupPlacement ? $attrs.popupPlacement : datepickerPopupConfig.placement;\n      var position = $position.positionElements($element, dpElement, placement, appendToBody);\n      dpElement.css({top: position.top + 'px', left: position.left + 'px'});\n      if (dpElement.hasClass('uib-position-measure')) {\n        dpElement.removeClass('uib-position-measure');\n      }\n    }\n  }\n\n  $scope.$on('uib:datepicker.mode', function() {\n    $timeout(positionPopup, 0, false);\n  });\n}])\n\n.directive('uibDatepickerPopup', function() {\n  return {\n    require: ['ngModel', 'uibDatepickerPopup'],\n    controller: 'UibDatepickerPopupController',\n    scope: {\n      datepickerOptions: '=?',\n      isOpen: '=?',\n      currentText: '@',\n      clearText: '@',\n      closeText: '@'\n    },\n    link: function(scope, element, attrs, ctrls) {\n      var ngModel = ctrls[0],\n        ctrl = ctrls[1];\n\n      ctrl.init(ngModel);\n    }\n  };\n})\n\n.directive('uibDatepickerPopupWrap', function() {\n  return {\n    restrict: 'A',\n    transclude: true,\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/datepickerPopup/popup.html';\n    }\n  };\n});\n\nangular.module('ui.bootstrap.debounce', [])\n/**\n * A helper, internal service that debounces a function\n */\n  .factory('$$debounce', ['$timeout', function($timeout) {\n    return function(callback, debounceTime) {\n      var timeoutPromise;\n\n      return function() {\n        var self = this;\n        var args = Array.prototype.slice.call(arguments);\n        if (timeoutPromise) {\n          $timeout.cancel(timeoutPromise);\n        }\n\n        timeoutPromise = $timeout(function() {\n          callback.apply(self, args);\n        }, debounceTime);\n      };\n    };\n  }]);\n\nangular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])\n\n.constant('uibDropdownConfig', {\n  appendToOpenClass: 'uib-dropdown-open',\n  openClass: 'open'\n})\n\n.service('uibDropdownService', ['$document', '$rootScope', function($document, $rootScope) {\n  var openScope = null;\n\n  this.open = function(dropdownScope, element) {\n    if (!openScope) {\n      $document.on('click', closeDropdown);\n    }\n\n    if (openScope && openScope !== dropdownScope) {\n      openScope.isOpen = false;\n    }\n\n    openScope = dropdownScope;\n  };\n\n  this.close = function(dropdownScope, element) {\n    if (openScope === dropdownScope) {\n      openScope = null;\n      $document.off('click', closeDropdown);\n      $document.off('keydown', this.keybindFilter);\n    }\n  };\n\n  var closeDropdown = function(evt) {\n    // This method may still be called during the same mouse event that\n    // unbound this event handler. So check openScope before proceeding.\n    if (!openScope) { return; }\n\n    if (evt && openScope.getAutoClose() === 'disabled') { return; }\n\n    if (evt && evt.which === 3) { return; }\n\n    var toggleElement = openScope.getToggleElement();\n    if (evt && toggleElement && toggleElement[0].contains(evt.target)) {\n      return;\n    }\n\n    var dropdownElement = openScope.getDropdownElement();\n    if (evt && openScope.getAutoClose() === 'outsideClick' &&\n      dropdownElement && dropdownElement[0].contains(evt.target)) {\n      return;\n    }\n\n    openScope.focusToggleElement();\n    openScope.isOpen = false;\n\n    if (!$rootScope.$$phase) {\n      openScope.$apply();\n    }\n  };\n\n  this.keybindFilter = function(evt) {\n    var dropdownElement = openScope.getDropdownElement();\n    var toggleElement = openScope.getToggleElement();\n    var dropdownElementTargeted = dropdownElement && dropdownElement[0].contains(evt.target);\n    var toggleElementTargeted = toggleElement && toggleElement[0].contains(evt.target);\n    if (evt.which === 27) {\n      evt.stopPropagation();\n      openScope.focusToggleElement();\n      closeDropdown();\n    } else if (openScope.isKeynavEnabled() && [38, 40].indexOf(evt.which) !== -1 && openScope.isOpen && (dropdownElementTargeted || toggleElementTargeted)) {\n      evt.preventDefault();\n      evt.stopPropagation();\n      openScope.focusDropdownEntry(evt.which);\n    }\n  };\n}])\n\n.controller('UibDropdownController', ['$scope', '$element', '$attrs', '$parse', 'uibDropdownConfig', 'uibDropdownService', '$animate', '$uibPosition', '$document', '$compile', '$templateRequest', function($scope, $element, $attrs, $parse, dropdownConfig, uibDropdownService, $animate, $position, $document, $compile, $templateRequest) {\n  var self = this,\n    scope = $scope.$new(), // create a child scope so we are not polluting original one\n    templateScope,\n    appendToOpenClass = dropdownConfig.appendToOpenClass,\n    openClass = dropdownConfig.openClass,\n    getIsOpen,\n    setIsOpen = angular.noop,\n    toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop,\n    appendToBody = false,\n    appendTo = null,\n    keynavEnabled = false,\n    selectedOption = null,\n    body = $document.find('body');\n\n  $element.addClass('dropdown');\n\n  this.init = function() {\n    if ($attrs.isOpen) {\n      getIsOpen = $parse($attrs.isOpen);\n      setIsOpen = getIsOpen.assign;\n\n      $scope.$watch(getIsOpen, function(value) {\n        scope.isOpen = !!value;\n      });\n    }\n\n    if (angular.isDefined($attrs.dropdownAppendTo)) {\n      var appendToEl = $parse($attrs.dropdownAppendTo)(scope);\n      if (appendToEl) {\n        appendTo = angular.element(appendToEl);\n      }\n    }\n\n    appendToBody = angular.isDefined($attrs.dropdownAppendToBody);\n    keynavEnabled = angular.isDefined($attrs.keyboardNav);\n\n    if (appendToBody && !appendTo) {\n      appendTo = body;\n    }\n\n    if (appendTo && self.dropdownMenu) {\n      appendTo.append(self.dropdownMenu);\n      $element.on('$destroy', function handleDestroyEvent() {\n        self.dropdownMenu.remove();\n      });\n    }\n  };\n\n  this.toggle = function(open) {\n    scope.isOpen = arguments.length ? !!open : !scope.isOpen;\n    if (angular.isFunction(setIsOpen)) {\n      setIsOpen(scope, scope.isOpen);\n    }\n\n    return scope.isOpen;\n  };\n\n  // Allow other directives to watch status\n  this.isOpen = function() {\n    return scope.isOpen;\n  };\n\n  scope.getToggleElement = function() {\n    return self.toggleElement;\n  };\n\n  scope.getAutoClose = function() {\n    return $attrs.autoClose || 'always'; //or 'outsideClick' or 'disabled'\n  };\n\n  scope.getElement = function() {\n    return $element;\n  };\n\n  scope.isKeynavEnabled = function() {\n    return keynavEnabled;\n  };\n\n  scope.focusDropdownEntry = function(keyCode) {\n    var elems = self.dropdownMenu ? //If append to body is used.\n      angular.element(self.dropdownMenu).find('a') :\n      $element.find('ul').eq(0).find('a');\n\n    switch (keyCode) {\n      case 40: {\n        if (!angular.isNumber(self.selectedOption)) {\n          self.selectedOption = 0;\n        } else {\n          self.selectedOption = self.selectedOption === elems.length - 1 ?\n            self.selectedOption :\n            self.selectedOption + 1;\n        }\n        break;\n      }\n      case 38: {\n        if (!angular.isNumber(self.selectedOption)) {\n          self.selectedOption = elems.length - 1;\n        } else {\n          self.selectedOption = self.selectedOption === 0 ?\n            0 : self.selectedOption - 1;\n        }\n        break;\n      }\n    }\n    elems[self.selectedOption].focus();\n  };\n\n  scope.getDropdownElement = function() {\n    return self.dropdownMenu;\n  };\n\n  scope.focusToggleElement = function() {\n    if (self.toggleElement) {\n      self.toggleElement[0].focus();\n    }\n  };\n\n  scope.$watch('isOpen', function(isOpen, wasOpen) {\n    if (appendTo && self.dropdownMenu) {\n      var pos = $position.positionElements($element, self.dropdownMenu, 'bottom-left', true),\n        css,\n        rightalign,\n        scrollbarPadding,\n        scrollbarWidth = 0;\n\n      css = {\n        top: pos.top + 'px',\n        display: isOpen ? 'block' : 'none'\n      };\n\n      rightalign = self.dropdownMenu.hasClass('dropdown-menu-right');\n      if (!rightalign) {\n        css.left = pos.left + 'px';\n        css.right = 'auto';\n      } else {\n        css.left = 'auto';\n        scrollbarPadding = $position.scrollbarPadding(appendTo);\n\n        if (scrollbarPadding.heightOverflow && scrollbarPadding.scrollbarWidth) {\n          scrollbarWidth = scrollbarPadding.scrollbarWidth;\n        }\n\n        css.right = window.innerWidth - scrollbarWidth -\n          (pos.left + $element.prop('offsetWidth')) + 'px';\n      }\n\n      // Need to adjust our positioning to be relative to the appendTo container\n      // if it's not the body element\n      if (!appendToBody) {\n        var appendOffset = $position.offset(appendTo);\n\n        css.top = pos.top - appendOffset.top + 'px';\n\n        if (!rightalign) {\n          css.left = pos.left - appendOffset.left + 'px';\n        } else {\n          css.right = window.innerWidth -\n            (pos.left - appendOffset.left + $element.prop('offsetWidth')) + 'px';\n        }\n      }\n\n      self.dropdownMenu.css(css);\n    }\n\n    var openContainer = appendTo ? appendTo : $element;\n    var hasOpenClass = openContainer.hasClass(appendTo ? appendToOpenClass : openClass);\n\n    if (hasOpenClass === !isOpen) {\n      $animate[isOpen ? 'addClass' : 'removeClass'](openContainer, appendTo ? appendToOpenClass : openClass).then(function() {\n        if (angular.isDefined(isOpen) && isOpen !== wasOpen) {\n          toggleInvoker($scope, { open: !!isOpen });\n        }\n      });\n    }\n\n    if (isOpen) {\n      if (self.dropdownMenuTemplateUrl) {\n        $templateRequest(self.dropdownMenuTemplateUrl).then(function(tplContent) {\n          templateScope = scope.$new();\n          $compile(tplContent.trim())(templateScope, function(dropdownElement) {\n            var newEl = dropdownElement;\n            self.dropdownMenu.replaceWith(newEl);\n            self.dropdownMenu = newEl;\n            $document.on('keydown', uibDropdownService.keybindFilter);\n          });\n        });\n      } else {\n        $document.on('keydown', uibDropdownService.keybindFilter);\n      }\n\n      scope.focusToggleElement();\n      uibDropdownService.open(scope, $element);\n    } else {\n      uibDropdownService.close(scope, $element);\n      if (self.dropdownMenuTemplateUrl) {\n        if (templateScope) {\n          templateScope.$destroy();\n        }\n        var newEl = angular.element('<ul class=\"dropdown-menu\"></ul>');\n        self.dropdownMenu.replaceWith(newEl);\n        self.dropdownMenu = newEl;\n      }\n\n      self.selectedOption = null;\n    }\n\n    if (angular.isFunction(setIsOpen)) {\n      setIsOpen($scope, isOpen);\n    }\n  });\n}])\n\n.directive('uibDropdown', function() {\n  return {\n    controller: 'UibDropdownController',\n    link: function(scope, element, attrs, dropdownCtrl) {\n      dropdownCtrl.init();\n    }\n  };\n})\n\n.directive('uibDropdownMenu', function() {\n  return {\n    restrict: 'A',\n    require: '?^uibDropdown',\n    link: function(scope, element, attrs, dropdownCtrl) {\n      if (!dropdownCtrl || angular.isDefined(attrs.dropdownNested)) {\n        return;\n      }\n\n      element.addClass('dropdown-menu');\n\n      var tplUrl = attrs.templateUrl;\n      if (tplUrl) {\n        dropdownCtrl.dropdownMenuTemplateUrl = tplUrl;\n      }\n\n      if (!dropdownCtrl.dropdownMenu) {\n        dropdownCtrl.dropdownMenu = element;\n      }\n    }\n  };\n})\n\n.directive('uibDropdownToggle', function() {\n  return {\n    require: '?^uibDropdown',\n    link: function(scope, element, attrs, dropdownCtrl) {\n      if (!dropdownCtrl) {\n        return;\n      }\n\n      element.addClass('dropdown-toggle');\n\n      dropdownCtrl.toggleElement = element;\n\n      var toggleDropdown = function(event) {\n        event.preventDefault();\n\n        if (!element.hasClass('disabled') && !attrs.disabled) {\n          scope.$apply(function() {\n            dropdownCtrl.toggle();\n          });\n        }\n      };\n\n      element.bind('click', toggleDropdown);\n\n      // WAI-ARIA\n      element.attr({ 'aria-haspopup': true, 'aria-expanded': false });\n      scope.$watch(dropdownCtrl.isOpen, function(isOpen) {\n        element.attr('aria-expanded', !!isOpen);\n      });\n\n      scope.$on('$destroy', function() {\n        element.unbind('click', toggleDropdown);\n      });\n    }\n  };\n});\n\nangular.module('ui.bootstrap.stackedMap', [])\n/**\n * A helper, internal data structure that acts as a map but also allows getting / removing\n * elements in the LIFO order\n */\n  .factory('$$stackedMap', function() {\n    return {\n      createNew: function() {\n        var stack = [];\n\n        return {\n          add: function(key, value) {\n            stack.push({\n              key: key,\n              value: value\n            });\n          },\n          get: function(key) {\n            for (var i = 0; i < stack.length; i++) {\n              if (key === stack[i].key) {\n                return stack[i];\n              }\n            }\n          },\n          keys: function() {\n            var keys = [];\n            for (var i = 0; i < stack.length; i++) {\n              keys.push(stack[i].key);\n            }\n            return keys;\n          },\n          top: function() {\n            return stack[stack.length - 1];\n          },\n          remove: function(key) {\n            var idx = -1;\n            for (var i = 0; i < stack.length; i++) {\n              if (key === stack[i].key) {\n                idx = i;\n                break;\n              }\n            }\n            return stack.splice(idx, 1)[0];\n          },\n          removeTop: function() {\n            return stack.pop();\n          },\n          length: function() {\n            return stack.length;\n          }\n        };\n      }\n    };\n  });\nangular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap', 'ui.bootstrap.position'])\n/**\n * A helper, internal data structure that stores all references attached to key\n */\n  .factory('$$multiMap', function() {\n    return {\n      createNew: function() {\n        var map = {};\n\n        return {\n          entries: function() {\n            return Object.keys(map).map(function(key) {\n              return {\n                key: key,\n                value: map[key]\n              };\n            });\n          },\n          get: function(key) {\n            return map[key];\n          },\n          hasKey: function(key) {\n            return !!map[key];\n          },\n          keys: function() {\n            return Object.keys(map);\n          },\n          put: function(key, value) {\n            if (!map[key]) {\n              map[key] = [];\n            }\n\n            map[key].push(value);\n          },\n          remove: function(key, value) {\n            var values = map[key];\n\n            if (!values) {\n              return;\n            }\n\n            var idx = values.indexOf(value);\n\n            if (idx !== -1) {\n              values.splice(idx, 1);\n            }\n\n            if (!values.length) {\n              delete map[key];\n            }\n          }\n        };\n      }\n    };\n  })\n\n/**\n * Pluggable resolve mechanism for the modal resolve resolution\n * Supports UI Router's $resolve service\n */\n  .provider('$uibResolve', function() {\n    var resolve = this;\n    this.resolver = null;\n\n    this.setResolver = function(resolver) {\n      this.resolver = resolver;\n    };\n\n    this.$get = ['$injector', '$q', function($injector, $q) {\n      var resolver = resolve.resolver ? $injector.get(resolve.resolver) : null;\n      return {\n        resolve: function(invocables, locals, parent, self) {\n          if (resolver) {\n            return resolver.resolve(invocables, locals, parent, self);\n          }\n\n          var promises = [];\n\n          angular.forEach(invocables, function(value) {\n            if (angular.isFunction(value) || angular.isArray(value)) {\n              promises.push($q.resolve($injector.invoke(value)));\n            } else if (angular.isString(value)) {\n              promises.push($q.resolve($injector.get(value)));\n            } else {\n              promises.push($q.resolve(value));\n            }\n          });\n\n          return $q.all(promises).then(function(resolves) {\n            var resolveObj = {};\n            var resolveIter = 0;\n            angular.forEach(invocables, function(value, key) {\n              resolveObj[key] = resolves[resolveIter++];\n            });\n\n            return resolveObj;\n          });\n        }\n      };\n    }];\n  })\n\n/**\n * A helper directive for the $modal service. It creates a backdrop element.\n */\n  .directive('uibModalBackdrop', ['$animate', '$injector', '$uibModalStack',\n  function($animate, $injector, $modalStack) {\n    return {\n      restrict: 'A',\n      compile: function(tElement, tAttrs) {\n        tElement.addClass(tAttrs.backdropClass);\n        return linkFn;\n      }\n    };\n\n    function linkFn(scope, element, attrs) {\n      if (attrs.modalInClass) {\n        $animate.addClass(element, attrs.modalInClass);\n\n        scope.$on($modalStack.NOW_CLOSING_EVENT, function(e, setIsAsync) {\n          var done = setIsAsync();\n          if (scope.modalOptions.animation) {\n            $animate.removeClass(element, attrs.modalInClass).then(done);\n          } else {\n            done();\n          }\n        });\n      }\n    }\n  }])\n\n  .directive('uibModalWindow', ['$uibModalStack', '$q', '$animateCss', '$document',\n  function($modalStack, $q, $animateCss, $document) {\n    return {\n      scope: {\n        index: '@'\n      },\n      restrict: 'A',\n      transclude: true,\n      templateUrl: function(tElement, tAttrs) {\n        return tAttrs.templateUrl || 'uib/template/modal/window.html';\n      },\n      link: function(scope, element, attrs) {\n        element.addClass(attrs.windowTopClass || '');\n        scope.size = attrs.size;\n\n        scope.close = function(evt) {\n          var modal = $modalStack.getTop();\n          if (modal && modal.value.backdrop &&\n            modal.value.backdrop !== 'static' &&\n            evt.target === evt.currentTarget) {\n            evt.preventDefault();\n            evt.stopPropagation();\n            $modalStack.dismiss(modal.key, 'backdrop click');\n          }\n        };\n\n        // moved from template to fix issue #2280\n        element.on('click', scope.close);\n\n        // This property is only added to the scope for the purpose of detecting when this directive is rendered.\n        // We can detect that by using this property in the template associated with this directive and then use\n        // {@link Attribute#$observe} on it. For more details please see {@link TableColumnResize}.\n        scope.$isRendered = true;\n\n        // Deferred object that will be resolved when this modal is render.\n        var modalRenderDeferObj = $q.defer();\n        // Resolve render promise post-digest\n        scope.$$postDigest(function() {\n          modalRenderDeferObj.resolve();\n        });\n\n        modalRenderDeferObj.promise.then(function() {\n          var animationPromise = null;\n\n          if (attrs.modalInClass) {\n            animationPromise = $animateCss(element, {\n              addClass: attrs.modalInClass\n            }).start();\n\n            scope.$on($modalStack.NOW_CLOSING_EVENT, function(e, setIsAsync) {\n              var done = setIsAsync();\n              $animateCss(element, {\n                removeClass: attrs.modalInClass\n              }).start().then(done);\n            });\n          }\n\n\n          $q.when(animationPromise).then(function() {\n            // Notify {@link $modalStack} that modal is rendered.\n            var modal = $modalStack.getTop();\n            if (modal) {\n              $modalStack.modalRendered(modal.key);\n            }\n\n            /**\n             * If something within the freshly-opened modal already has focus (perhaps via a\n             * directive that causes focus). then no need to try and focus anything.\n             */\n            if (!($document[0].activeElement && element[0].contains($document[0].activeElement))) {\n              var inputWithAutofocus = element[0].querySelector('[autofocus]');\n              /**\n               * Auto-focusing of a freshly-opened modal element causes any child elements\n               * with the autofocus attribute to lose focus. This is an issue on touch\n               * based devices which will show and then hide the onscreen keyboard.\n               * Attempts to refocus the autofocus element via JavaScript will not reopen\n               * the onscreen keyboard. Fixed by updated the focusing logic to only autofocus\n               * the modal element if the modal does not contain an autofocus element.\n               */\n              if (inputWithAutofocus) {\n                inputWithAutofocus.focus();\n              } else {\n                element[0].focus();\n              }\n            }\n          });\n        });\n      }\n    };\n  }])\n\n  .directive('uibModalAnimationClass', function() {\n    return {\n      compile: function(tElement, tAttrs) {\n        if (tAttrs.modalAnimation) {\n          tElement.addClass(tAttrs.uibModalAnimationClass);\n        }\n      }\n    };\n  })\n\n  .directive('uibModalTransclude', ['$animate', function($animate) {\n    return {\n      link: function(scope, element, attrs, controller, transclude) {\n        transclude(scope.$parent, function(clone) {\n          element.empty();\n          $animate.enter(clone, element);\n        });\n      }\n    };\n  }])\n\n  .factory('$uibModalStack', ['$animate', '$animateCss', '$document',\n    '$compile', '$rootScope', '$q', '$$multiMap', '$$stackedMap', '$uibPosition',\n    function($animate, $animateCss, $document, $compile, $rootScope, $q, $$multiMap, $$stackedMap, $uibPosition) {\n      var OPENED_MODAL_CLASS = 'modal-open';\n\n      var backdropDomEl, backdropScope;\n      var openedWindows = $$stackedMap.createNew();\n      var openedClasses = $$multiMap.createNew();\n      var $modalStack = {\n        NOW_CLOSING_EVENT: 'modal.stack.now-closing'\n      };\n      var topModalIndex = 0;\n      var previousTopOpenedModal = null;\n\n      //Modal focus behavior\n      var tabbableSelector = 'a[href], area[href], input:not([disabled]):not([tabindex=\\'-1\\']), ' +\n        'button:not([disabled]):not([tabindex=\\'-1\\']),select:not([disabled]):not([tabindex=\\'-1\\']), textarea:not([disabled]):not([tabindex=\\'-1\\']), ' +\n        'iframe, object, embed, *[tabindex]:not([tabindex=\\'-1\\']), *[contenteditable=true]';\n      var scrollbarPadding;\n      var SNAKE_CASE_REGEXP = /[A-Z]/g;\n\n      // TODO: extract into common dependency with tooltip\n      function snake_case(name) {\n        var separator = '-';\n        return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {\n          return (pos ? separator : '') + letter.toLowerCase();\n        });\n      }\n\n      function isVisible(element) {\n        return !!(element.offsetWidth ||\n          element.offsetHeight ||\n          element.getClientRects().length);\n      }\n\n      function backdropIndex() {\n        var topBackdropIndex = -1;\n        var opened = openedWindows.keys();\n        for (var i = 0; i < opened.length; i++) {\n          if (openedWindows.get(opened[i]).value.backdrop) {\n            topBackdropIndex = i;\n          }\n        }\n\n        // If any backdrop exist, ensure that it's index is always\n        // right below the top modal\n        if (topBackdropIndex > -1 && topBackdropIndex < topModalIndex) {\n          topBackdropIndex = topModalIndex;\n        }\n        return topBackdropIndex;\n      }\n\n      $rootScope.$watch(backdropIndex, function(newBackdropIndex) {\n        if (backdropScope) {\n          backdropScope.index = newBackdropIndex;\n        }\n      });\n\n      function removeModalWindow(modalInstance, elementToReceiveFocus) {\n        var modalWindow = openedWindows.get(modalInstance).value;\n        var appendToElement = modalWindow.appendTo;\n\n        //clean up the stack\n        openedWindows.remove(modalInstance);\n        previousTopOpenedModal = openedWindows.top();\n        if (previousTopOpenedModal) {\n          topModalIndex = parseInt(previousTopOpenedModal.value.modalDomEl.attr('index'), 10);\n        }\n\n        removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, function() {\n          var modalBodyClass = modalWindow.openedClass || OPENED_MODAL_CLASS;\n          openedClasses.remove(modalBodyClass, modalInstance);\n          var areAnyOpen = openedClasses.hasKey(modalBodyClass);\n          appendToElement.toggleClass(modalBodyClass, areAnyOpen);\n          if (!areAnyOpen && scrollbarPadding && scrollbarPadding.heightOverflow && scrollbarPadding.scrollbarWidth) {\n            if (scrollbarPadding.originalRight) {\n              appendToElement.css({paddingRight: scrollbarPadding.originalRight + 'px'});\n            } else {\n              appendToElement.css({paddingRight: ''});\n            }\n            scrollbarPadding = null;\n          }\n          toggleTopWindowClass(true);\n        }, modalWindow.closedDeferred);\n        checkRemoveBackdrop();\n\n        //move focus to specified element if available, or else to body\n        if (elementToReceiveFocus && elementToReceiveFocus.focus) {\n          elementToReceiveFocus.focus();\n        } else if (appendToElement.focus) {\n          appendToElement.focus();\n        }\n      }\n\n      // Add or remove \"windowTopClass\" from the top window in the stack\n      function toggleTopWindowClass(toggleSwitch) {\n        var modalWindow;\n\n        if (openedWindows.length() > 0) {\n          modalWindow = openedWindows.top().value;\n          modalWindow.modalDomEl.toggleClass(modalWindow.windowTopClass || '', toggleSwitch);\n        }\n      }\n\n      function checkRemoveBackdrop() {\n        //remove backdrop if no longer needed\n        if (backdropDomEl && backdropIndex() === -1) {\n          var backdropScopeRef = backdropScope;\n          removeAfterAnimate(backdropDomEl, backdropScope, function() {\n            backdropScopeRef = null;\n          });\n          backdropDomEl = undefined;\n          backdropScope = undefined;\n        }\n      }\n\n      function removeAfterAnimate(domEl, scope, done, closedDeferred) {\n        var asyncDeferred;\n        var asyncPromise = null;\n        var setIsAsync = function() {\n          if (!asyncDeferred) {\n            asyncDeferred = $q.defer();\n            asyncPromise = asyncDeferred.promise;\n          }\n\n          return function asyncDone() {\n            asyncDeferred.resolve();\n          };\n        };\n        scope.$broadcast($modalStack.NOW_CLOSING_EVENT, setIsAsync);\n\n        // Note that it's intentional that asyncPromise might be null.\n        // That's when setIsAsync has not been called during the\n        // NOW_CLOSING_EVENT broadcast.\n        return $q.when(asyncPromise).then(afterAnimating);\n\n        function afterAnimating() {\n          if (afterAnimating.done) {\n            return;\n          }\n          afterAnimating.done = true;\n\n          $animate.leave(domEl).then(function() {\n            if (done) {\n              done();\n            }\n\n            domEl.remove();\n            if (closedDeferred) {\n              closedDeferred.resolve();\n            }\n          });\n\n          scope.$destroy();\n        }\n      }\n\n      $document.on('keydown', keydownListener);\n\n      $rootScope.$on('$destroy', function() {\n        $document.off('keydown', keydownListener);\n      });\n\n      function keydownListener(evt) {\n        if (evt.isDefaultPrevented()) {\n          return evt;\n        }\n\n        var modal = openedWindows.top();\n        if (modal) {\n          switch (evt.which) {\n            case 27: {\n              if (modal.value.keyboard) {\n                evt.preventDefault();\n                $rootScope.$apply(function() {\n                  $modalStack.dismiss(modal.key, 'escape key press');\n                });\n              }\n              break;\n            }\n            case 9: {\n              var list = $modalStack.loadFocusElementList(modal);\n              var focusChanged = false;\n              if (evt.shiftKey) {\n                if ($modalStack.isFocusInFirstItem(evt, list) || $modalStack.isModalFocused(evt, modal)) {\n                  focusChanged = $modalStack.focusLastFocusableElement(list);\n                }\n              } else {\n                if ($modalStack.isFocusInLastItem(evt, list)) {\n                  focusChanged = $modalStack.focusFirstFocusableElement(list);\n                }\n              }\n\n              if (focusChanged) {\n                evt.preventDefault();\n                evt.stopPropagation();\n              }\n\n              break;\n            }\n          }\n        }\n      }\n\n      $modalStack.open = function(modalInstance, modal) {\n        var modalOpener = $document[0].activeElement,\n          modalBodyClass = modal.openedClass || OPENED_MODAL_CLASS;\n\n        toggleTopWindowClass(false);\n\n        // Store the current top first, to determine what index we ought to use\n        // for the current top modal\n        previousTopOpenedModal = openedWindows.top();\n\n        openedWindows.add(modalInstance, {\n          deferred: modal.deferred,\n          renderDeferred: modal.renderDeferred,\n          closedDeferred: modal.closedDeferred,\n          modalScope: modal.scope,\n          backdrop: modal.backdrop,\n          keyboard: modal.keyboard,\n          openedClass: modal.openedClass,\n          windowTopClass: modal.windowTopClass,\n          animation: modal.animation,\n          appendTo: modal.appendTo\n        });\n\n        openedClasses.put(modalBodyClass, modalInstance);\n\n        var appendToElement = modal.appendTo,\n            currBackdropIndex = backdropIndex();\n\n        if (!appendToElement.length) {\n          throw new Error('appendTo element not found. Make sure that the element passed is in DOM.');\n        }\n\n        if (currBackdropIndex >= 0 && !backdropDomEl) {\n          backdropScope = $rootScope.$new(true);\n          backdropScope.modalOptions = modal;\n          backdropScope.index = currBackdropIndex;\n          backdropDomEl = angular.element('<div uib-modal-backdrop=\"modal-backdrop\"></div>');\n          backdropDomEl.attr({\n            'class': 'modal-backdrop',\n            'ng-style': '{\\'z-index\\': 1040 + (index && 1 || 0) + index*10}',\n            'uib-modal-animation-class': 'fade',\n            'modal-in-class': 'in'\n          });\n          if (modal.backdropClass) {\n            backdropDomEl.addClass(modal.backdropClass);\n          }\n\n          if (modal.animation) {\n            backdropDomEl.attr('modal-animation', 'true');\n          }\n          $compile(backdropDomEl)(backdropScope);\n          $animate.enter(backdropDomEl, appendToElement);\n          if ($uibPosition.isScrollable(appendToElement)) {\n            scrollbarPadding = $uibPosition.scrollbarPadding(appendToElement);\n            if (scrollbarPadding.heightOverflow && scrollbarPadding.scrollbarWidth) {\n              appendToElement.css({paddingRight: scrollbarPadding.right + 'px'});\n            }\n          }\n        }\n\n        var content;\n        if (modal.component) {\n          content = document.createElement(snake_case(modal.component.name));\n          content = angular.element(content);\n          content.attr({\n            resolve: '$resolve',\n            'modal-instance': '$uibModalInstance',\n            close: '$close($value)',\n            dismiss: '$dismiss($value)'\n          });\n        } else {\n          content = modal.content;\n        }\n\n        // Set the top modal index based on the index of the previous top modal\n        topModalIndex = previousTopOpenedModal ? parseInt(previousTopOpenedModal.value.modalDomEl.attr('index'), 10) + 1 : 0;\n        var angularDomEl = angular.element('<div uib-modal-window=\"modal-window\"></div>');\n        angularDomEl.attr({\n          'class': 'modal',\n          'template-url': modal.windowTemplateUrl,\n          'window-top-class': modal.windowTopClass,\n          'role': 'dialog',\n          'aria-labelledby': modal.ariaLabelledBy,\n          'aria-describedby': modal.ariaDescribedBy,\n          'size': modal.size,\n          'index': topModalIndex,\n          'animate': 'animate',\n          'ng-style': '{\\'z-index\\': 1050 + $$topModalIndex*10, display: \\'block\\'}',\n          'tabindex': -1,\n          'uib-modal-animation-class': 'fade',\n          'modal-in-class': 'in'\n        }).append(content);\n        if (modal.windowClass) {\n          angularDomEl.addClass(modal.windowClass);\n        }\n\n        if (modal.animation) {\n          angularDomEl.attr('modal-animation', 'true');\n        }\n\n        appendToElement.addClass(modalBodyClass);\n        if (modal.scope) {\n          // we need to explicitly add the modal index to the modal scope\n          // because it is needed by ngStyle to compute the zIndex property.\n          modal.scope.$$topModalIndex = topModalIndex;\n        }\n        $animate.enter($compile(angularDomEl)(modal.scope), appendToElement);\n\n        openedWindows.top().value.modalDomEl = angularDomEl;\n        openedWindows.top().value.modalOpener = modalOpener;\n      };\n\n      function broadcastClosing(modalWindow, resultOrReason, closing) {\n        return !modalWindow.value.modalScope.$broadcast('modal.closing', resultOrReason, closing).defaultPrevented;\n      }\n\n      $modalStack.close = function(modalInstance, result) {\n        var modalWindow = openedWindows.get(modalInstance);\n        if (modalWindow && broadcastClosing(modalWindow, result, true)) {\n          modalWindow.value.modalScope.$$uibDestructionScheduled = true;\n          modalWindow.value.deferred.resolve(result);\n          removeModalWindow(modalInstance, modalWindow.value.modalOpener);\n          return true;\n        }\n        return !modalWindow;\n      };\n\n      $modalStack.dismiss = function(modalInstance, reason) {\n        var modalWindow = openedWindows.get(modalInstance);\n        if (modalWindow && broadcastClosing(modalWindow, reason, false)) {\n          modalWindow.value.modalScope.$$uibDestructionScheduled = true;\n          modalWindow.value.deferred.reject(reason);\n          removeModalWindow(modalInstance, modalWindow.value.modalOpener);\n          return true;\n        }\n        return !modalWindow;\n      };\n\n      $modalStack.dismissAll = function(reason) {\n        var topModal = this.getTop();\n        while (topModal && this.dismiss(topModal.key, reason)) {\n          topModal = this.getTop();\n        }\n      };\n\n      $modalStack.getTop = function() {\n        return openedWindows.top();\n      };\n\n      $modalStack.modalRendered = function(modalInstance) {\n        var modalWindow = openedWindows.get(modalInstance);\n        if (modalWindow) {\n          modalWindow.value.renderDeferred.resolve();\n        }\n      };\n\n      $modalStack.focusFirstFocusableElement = function(list) {\n        if (list.length > 0) {\n          list[0].focus();\n          return true;\n        }\n        return false;\n      };\n\n      $modalStack.focusLastFocusableElement = function(list) {\n        if (list.length > 0) {\n          list[list.length - 1].focus();\n          return true;\n        }\n        return false;\n      };\n\n      $modalStack.isModalFocused = function(evt, modalWindow) {\n        if (evt && modalWindow) {\n          var modalDomEl = modalWindow.value.modalDomEl;\n          if (modalDomEl && modalDomEl.length) {\n            return (evt.target || evt.srcElement) === modalDomEl[0];\n          }\n        }\n        return false;\n      };\n\n      $modalStack.isFocusInFirstItem = function(evt, list) {\n        if (list.length > 0) {\n          return (evt.target || evt.srcElement) === list[0];\n        }\n        return false;\n      };\n\n      $modalStack.isFocusInLastItem = function(evt, list) {\n        if (list.length > 0) {\n          return (evt.target || evt.srcElement) === list[list.length - 1];\n        }\n        return false;\n      };\n\n      $modalStack.loadFocusElementList = function(modalWindow) {\n        if (modalWindow) {\n          var modalDomE1 = modalWindow.value.modalDomEl;\n          if (modalDomE1 && modalDomE1.length) {\n            var elements = modalDomE1[0].querySelectorAll(tabbableSelector);\n            return elements ?\n              Array.prototype.filter.call(elements, function(element) {\n                return isVisible(element);\n              }) : elements;\n          }\n        }\n      };\n\n      return $modalStack;\n    }])\n\n  .provider('$uibModal', function() {\n    var $modalProvider = {\n      options: {\n        animation: true,\n        backdrop: true, //can also be false or 'static'\n        keyboard: true\n      },\n      $get: ['$rootScope', '$q', '$document', '$templateRequest', '$controller', '$uibResolve', '$uibModalStack',\n        function ($rootScope, $q, $document, $templateRequest, $controller, $uibResolve, $modalStack) {\n          var $modal = {};\n\n          function getTemplatePromise(options) {\n            return options.template ? $q.when(options.template) :\n              $templateRequest(angular.isFunction(options.templateUrl) ?\n                options.templateUrl() : options.templateUrl);\n          }\n\n          var promiseChain = null;\n          $modal.getPromiseChain = function() {\n            return promiseChain;\n          };\n\n          $modal.open = function(modalOptions) {\n            var modalResultDeferred = $q.defer();\n            var modalOpenedDeferred = $q.defer();\n            var modalClosedDeferred = $q.defer();\n            var modalRenderDeferred = $q.defer();\n\n            //prepare an instance of a modal to be injected into controllers and returned to a caller\n            var modalInstance = {\n              result: modalResultDeferred.promise,\n              opened: modalOpenedDeferred.promise,\n              closed: modalClosedDeferred.promise,\n              rendered: modalRenderDeferred.promise,\n              close: function (result) {\n                return $modalStack.close(modalInstance, result);\n              },\n              dismiss: function (reason) {\n                return $modalStack.dismiss(modalInstance, reason);\n              }\n            };\n\n            //merge and clean up options\n            modalOptions = angular.extend({}, $modalProvider.options, modalOptions);\n            modalOptions.resolve = modalOptions.resolve || {};\n            modalOptions.appendTo = modalOptions.appendTo || $document.find('body').eq(0);\n\n            //verify options\n            if (!modalOptions.component && !modalOptions.template && !modalOptions.templateUrl) {\n              throw new Error('One of component or template or templateUrl options is required.');\n            }\n\n            var templateAndResolvePromise;\n            if (modalOptions.component) {\n              templateAndResolvePromise = $q.when($uibResolve.resolve(modalOptions.resolve, {}, null, null));\n            } else {\n              templateAndResolvePromise =\n                $q.all([getTemplatePromise(modalOptions), $uibResolve.resolve(modalOptions.resolve, {}, null, null)]);\n            }\n\n            function resolveWithTemplate() {\n              return templateAndResolvePromise;\n            }\n\n            // Wait for the resolution of the existing promise chain.\n            // Then switch to our own combined promise dependency (regardless of how the previous modal fared).\n            // Then add to $modalStack and resolve opened.\n            // Finally clean up the chain variable if no subsequent modal has overwritten it.\n            var samePromise;\n            samePromise = promiseChain = $q.all([promiseChain])\n              .then(resolveWithTemplate, resolveWithTemplate)\n              .then(function resolveSuccess(tplAndVars) {\n                var providedScope = modalOptions.scope || $rootScope;\n\n                var modalScope = providedScope.$new();\n                modalScope.$close = modalInstance.close;\n                modalScope.$dismiss = modalInstance.dismiss;\n\n                modalScope.$on('$destroy', function() {\n                  if (!modalScope.$$uibDestructionScheduled) {\n                    modalScope.$dismiss('$uibUnscheduledDestruction');\n                  }\n                });\n\n                var modal = {\n                  scope: modalScope,\n                  deferred: modalResultDeferred,\n                  renderDeferred: modalRenderDeferred,\n                  closedDeferred: modalClosedDeferred,\n                  animation: modalOptions.animation,\n                  backdrop: modalOptions.backdrop,\n                  keyboard: modalOptions.keyboard,\n                  backdropClass: modalOptions.backdropClass,\n                  windowTopClass: modalOptions.windowTopClass,\n                  windowClass: modalOptions.windowClass,\n                  windowTemplateUrl: modalOptions.windowTemplateUrl,\n                  ariaLabelledBy: modalOptions.ariaLabelledBy,\n                  ariaDescribedBy: modalOptions.ariaDescribedBy,\n                  size: modalOptions.size,\n                  openedClass: modalOptions.openedClass,\n                  appendTo: modalOptions.appendTo\n                };\n\n                var component = {};\n                var ctrlInstance, ctrlInstantiate, ctrlLocals = {};\n\n                if (modalOptions.component) {\n                  constructLocals(component, false, true, false);\n                  component.name = modalOptions.component;\n                  modal.component = component;\n                } else if (modalOptions.controller) {\n                  constructLocals(ctrlLocals, true, false, true);\n\n                  // the third param will make the controller instantiate later,private api\n                  // @see https://github.com/angular/angular.js/blob/master/src/ng/controller.js#L126\n                  ctrlInstantiate = $controller(modalOptions.controller, ctrlLocals, true, modalOptions.controllerAs);\n                  if (modalOptions.controllerAs && modalOptions.bindToController) {\n                    ctrlInstance = ctrlInstantiate.instance;\n                    ctrlInstance.$close = modalScope.$close;\n                    ctrlInstance.$dismiss = modalScope.$dismiss;\n                    angular.extend(ctrlInstance, {\n                      $resolve: ctrlLocals.$scope.$resolve\n                    }, providedScope);\n                  }\n\n                  ctrlInstance = ctrlInstantiate();\n\n                  if (angular.isFunction(ctrlInstance.$onInit)) {\n                    ctrlInstance.$onInit();\n                  }\n                }\n\n                if (!modalOptions.component) {\n                  modal.content = tplAndVars[0];\n                }\n\n                $modalStack.open(modalInstance, modal);\n                modalOpenedDeferred.resolve(true);\n\n                function constructLocals(obj, template, instanceOnScope, injectable) {\n                  obj.$scope = modalScope;\n                  obj.$scope.$resolve = {};\n                  if (instanceOnScope) {\n                    obj.$scope.$uibModalInstance = modalInstance;\n                  } else {\n                    obj.$uibModalInstance = modalInstance;\n                  }\n\n                  var resolves = template ? tplAndVars[1] : tplAndVars;\n                  angular.forEach(resolves, function(value, key) {\n                    if (injectable) {\n                      obj[key] = value;\n                    }\n\n                    obj.$scope.$resolve[key] = value;\n                  });\n                }\n            }, function resolveError(reason) {\n              modalOpenedDeferred.reject(reason);\n              modalResultDeferred.reject(reason);\n            })['finally'](function() {\n              if (promiseChain === samePromise) {\n                promiseChain = null;\n              }\n            });\n\n            return modalInstance;\n          };\n\n          return $modal;\n        }\n      ]\n    };\n\n    return $modalProvider;\n  });\n\nangular.module('ui.bootstrap.paging', [])\n/**\n * Helper internal service for generating common controller code between the\n * pager and pagination components\n */\n.factory('uibPaging', ['$parse', function($parse) {\n  return {\n    create: function(ctrl, $scope, $attrs) {\n      ctrl.setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop;\n      ctrl.ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl\n      ctrl._watchers = [];\n\n      ctrl.init = function(ngModelCtrl, config) {\n        ctrl.ngModelCtrl = ngModelCtrl;\n        ctrl.config = config;\n\n        ngModelCtrl.$render = function() {\n          ctrl.render();\n        };\n\n        if ($attrs.itemsPerPage) {\n          ctrl._watchers.push($scope.$parent.$watch($attrs.itemsPerPage, function(value) {\n            ctrl.itemsPerPage = parseInt(value, 10);\n            $scope.totalPages = ctrl.calculateTotalPages();\n            ctrl.updatePage();\n          }));\n        } else {\n          ctrl.itemsPerPage = config.itemsPerPage;\n        }\n\n        $scope.$watch('totalItems', function(newTotal, oldTotal) {\n          if (angular.isDefined(newTotal) || newTotal !== oldTotal) {\n            $scope.totalPages = ctrl.calculateTotalPages();\n            ctrl.updatePage();\n          }\n        });\n      };\n\n      ctrl.calculateTotalPages = function() {\n        var totalPages = ctrl.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / ctrl.itemsPerPage);\n        return Math.max(totalPages || 0, 1);\n      };\n\n      ctrl.render = function() {\n        $scope.page = parseInt(ctrl.ngModelCtrl.$viewValue, 10) || 1;\n      };\n\n      $scope.selectPage = function(page, evt) {\n        if (evt) {\n          evt.preventDefault();\n        }\n\n        var clickAllowed = !$scope.ngDisabled || !evt;\n        if (clickAllowed && $scope.page !== page && page > 0 && page <= $scope.totalPages) {\n          if (evt && evt.target) {\n            evt.target.blur();\n          }\n          ctrl.ngModelCtrl.$setViewValue(page);\n          ctrl.ngModelCtrl.$render();\n        }\n      };\n\n      $scope.getText = function(key) {\n        return $scope[key + 'Text'] || ctrl.config[key + 'Text'];\n      };\n\n      $scope.noPrevious = function() {\n        return $scope.page === 1;\n      };\n\n      $scope.noNext = function() {\n        return $scope.page === $scope.totalPages;\n      };\n\n      ctrl.updatePage = function() {\n        ctrl.setNumPages($scope.$parent, $scope.totalPages); // Readonly variable\n\n        if ($scope.page > $scope.totalPages) {\n          $scope.selectPage($scope.totalPages);\n        } else {\n          ctrl.ngModelCtrl.$render();\n        }\n      };\n\n      $scope.$on('$destroy', function() {\n        while (ctrl._watchers.length) {\n          ctrl._watchers.shift()();\n        }\n      });\n    }\n  };\n}]);\n\nangular.module('ui.bootstrap.pager', ['ui.bootstrap.paging', 'ui.bootstrap.tabindex'])\n\n.controller('UibPagerController', ['$scope', '$attrs', 'uibPaging', 'uibPagerConfig', function($scope, $attrs, uibPaging, uibPagerConfig) {\n  $scope.align = angular.isDefined($attrs.align) ? $scope.$parent.$eval($attrs.align) : uibPagerConfig.align;\n\n  uibPaging.create(this, $scope, $attrs);\n}])\n\n.constant('uibPagerConfig', {\n  itemsPerPage: 10,\n  previousText: '« Previous',\n  nextText: 'Next »',\n  align: true\n})\n\n.directive('uibPager', ['uibPagerConfig', function(uibPagerConfig) {\n  return {\n    scope: {\n      totalItems: '=',\n      previousText: '@',\n      nextText: '@',\n      ngDisabled: '='\n    },\n    require: ['uibPager', '?ngModel'],\n    restrict: 'A',\n    controller: 'UibPagerController',\n    controllerAs: 'pager',\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/pager/pager.html';\n    },\n    link: function(scope, element, attrs, ctrls) {\n      element.addClass('pager');\n      var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if (!ngModelCtrl) {\n        return; // do nothing if no ng-model\n      }\n\n      paginationCtrl.init(ngModelCtrl, uibPagerConfig);\n    }\n  };\n}]);\n\nangular.module('ui.bootstrap.pagination', ['ui.bootstrap.paging', 'ui.bootstrap.tabindex'])\n.controller('UibPaginationController', ['$scope', '$attrs', '$parse', 'uibPaging', 'uibPaginationConfig', function($scope, $attrs, $parse, uibPaging, uibPaginationConfig) {\n  var ctrl = this;\n  // Setup configuration parameters\n  var maxSize = angular.isDefined($attrs.maxSize) ? $scope.$parent.$eval($attrs.maxSize) : uibPaginationConfig.maxSize,\n    rotate = angular.isDefined($attrs.rotate) ? $scope.$parent.$eval($attrs.rotate) : uibPaginationConfig.rotate,\n    forceEllipses = angular.isDefined($attrs.forceEllipses) ? $scope.$parent.$eval($attrs.forceEllipses) : uibPaginationConfig.forceEllipses,\n    boundaryLinkNumbers = angular.isDefined($attrs.boundaryLinkNumbers) ? $scope.$parent.$eval($attrs.boundaryLinkNumbers) : uibPaginationConfig.boundaryLinkNumbers,\n    pageLabel = angular.isDefined($attrs.pageLabel) ? function(idx) { return $scope.$parent.$eval($attrs.pageLabel, {$page: idx}); } : angular.identity;\n  $scope.boundaryLinks = angular.isDefined($attrs.boundaryLinks) ? $scope.$parent.$eval($attrs.boundaryLinks) : uibPaginationConfig.boundaryLinks;\n  $scope.directionLinks = angular.isDefined($attrs.directionLinks) ? $scope.$parent.$eval($attrs.directionLinks) : uibPaginationConfig.directionLinks;\n\n  uibPaging.create(this, $scope, $attrs);\n\n  if ($attrs.maxSize) {\n    ctrl._watchers.push($scope.$parent.$watch($parse($attrs.maxSize), function(value) {\n      maxSize = parseInt(value, 10);\n      ctrl.render();\n    }));\n  }\n\n  // Create page object used in template\n  function makePage(number, text, isActive) {\n    return {\n      number: number,\n      text: text,\n      active: isActive\n    };\n  }\n\n  function getPages(currentPage, totalPages) {\n    var pages = [];\n\n    // Default page limits\n    var startPage = 1, endPage = totalPages;\n    var isMaxSized = angular.isDefined(maxSize) && maxSize < totalPages;\n\n    // recompute if maxSize\n    if (isMaxSized) {\n      if (rotate) {\n        // Current page is displayed in the middle of the visible ones\n        startPage = Math.max(currentPage - Math.floor(maxSize / 2), 1);\n        endPage = startPage + maxSize - 1;\n\n        // Adjust if limit is exceeded\n        if (endPage > totalPages) {\n          endPage = totalPages;\n          startPage = endPage - maxSize + 1;\n        }\n      } else {\n        // Visible pages are paginated with maxSize\n        startPage = (Math.ceil(currentPage / maxSize) - 1) * maxSize + 1;\n\n        // Adjust last page if limit is exceeded\n        endPage = Math.min(startPage + maxSize - 1, totalPages);\n      }\n    }\n\n    // Add page number links\n    for (var number = startPage; number <= endPage; number++) {\n      var page = makePage(number, pageLabel(number), number === currentPage);\n      pages.push(page);\n    }\n\n    // Add links to move between page sets\n    if (isMaxSized && maxSize > 0 && (!rotate || forceEllipses || boundaryLinkNumbers)) {\n      if (startPage > 1) {\n        if (!boundaryLinkNumbers || startPage > 3) { //need ellipsis for all options unless range is too close to beginning\n        var previousPageSet = makePage(startPage - 1, '...', false);\n        pages.unshift(previousPageSet);\n      }\n        if (boundaryLinkNumbers) {\n          if (startPage === 3) { //need to replace ellipsis when the buttons would be sequential\n            var secondPageLink = makePage(2, '2', false);\n            pages.unshift(secondPageLink);\n          }\n          //add the first page\n          var firstPageLink = makePage(1, '1', false);\n          pages.unshift(firstPageLink);\n        }\n      }\n\n      if (endPage < totalPages) {\n        if (!boundaryLinkNumbers || endPage < totalPages - 2) { //need ellipsis for all options unless range is too close to end\n        var nextPageSet = makePage(endPage + 1, '...', false);\n        pages.push(nextPageSet);\n      }\n        if (boundaryLinkNumbers) {\n          if (endPage === totalPages - 2) { //need to replace ellipsis when the buttons would be sequential\n            var secondToLastPageLink = makePage(totalPages - 1, totalPages - 1, false);\n            pages.push(secondToLastPageLink);\n          }\n          //add the last page\n          var lastPageLink = makePage(totalPages, totalPages, false);\n          pages.push(lastPageLink);\n        }\n      }\n    }\n    return pages;\n  }\n\n  var originalRender = this.render;\n  this.render = function() {\n    originalRender();\n    if ($scope.page > 0 && $scope.page <= $scope.totalPages) {\n      $scope.pages = getPages($scope.page, $scope.totalPages);\n    }\n  };\n}])\n\n.constant('uibPaginationConfig', {\n  itemsPerPage: 10,\n  boundaryLinks: false,\n  boundaryLinkNumbers: false,\n  directionLinks: true,\n  firstText: 'First',\n  previousText: 'Previous',\n  nextText: 'Next',\n  lastText: 'Last',\n  rotate: true,\n  forceEllipses: false\n})\n\n.directive('uibPagination', ['$parse', 'uibPaginationConfig', function($parse, uibPaginationConfig) {\n  return {\n    scope: {\n      totalItems: '=',\n      firstText: '@',\n      previousText: '@',\n      nextText: '@',\n      lastText: '@',\n      ngDisabled:'='\n    },\n    require: ['uibPagination', '?ngModel'],\n    restrict: 'A',\n    controller: 'UibPaginationController',\n    controllerAs: 'pagination',\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/pagination/pagination.html';\n    },\n    link: function(scope, element, attrs, ctrls) {\n      element.addClass('pagination');\n      var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if (!ngModelCtrl) {\n         return; // do nothing if no ng-model\n      }\n\n      paginationCtrl.init(ngModelCtrl, uibPaginationConfig);\n    }\n  };\n}]);\n\n/**\n * The following features are still outstanding: animation as a\n * function, placement as a function, inside, support for more triggers than\n * just mouse enter/leave, html tooltips, and selector delegation.\n */\nangular.module('ui.bootstrap.tooltip', ['ui.bootstrap.position', 'ui.bootstrap.stackedMap'])\n\n/**\n * The $tooltip service creates tooltip- and popover-like directives as well as\n * houses global options for them.\n */\n.provider('$uibTooltip', function() {\n  // The default options tooltip and popover.\n  var defaultOptions = {\n    placement: 'top',\n    placementClassPrefix: '',\n    animation: true,\n    popupDelay: 0,\n    popupCloseDelay: 0,\n    useContentExp: false\n  };\n\n  // Default hide triggers for each show trigger\n  var triggerMap = {\n    'mouseenter': 'mouseleave',\n    'click': 'click',\n    'outsideClick': 'outsideClick',\n    'focus': 'blur',\n    'none': ''\n  };\n\n  // The options specified to the provider globally.\n  var globalOptions = {};\n\n  /**\n   * `options({})` allows global configuration of all tooltips in the\n   * application.\n   *\n   *   var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) {\n   *     // place tooltips left instead of top by default\n   *     $tooltipProvider.options( { placement: 'left' } );\n   *   });\n   */\n\tthis.options = function(value) {\n\t\tangular.extend(globalOptions, value);\n\t};\n\n  /**\n   * This allows you to extend the set of trigger mappings available. E.g.:\n   *\n   *   $tooltipProvider.setTriggers( { 'openTrigger': 'closeTrigger' } );\n   */\n  this.setTriggers = function setTriggers(triggers) {\n    angular.extend(triggerMap, triggers);\n  };\n\n  /**\n   * This is a helper function for translating camel-case to snake_case.\n   */\n  function snake_case(name) {\n    var regexp = /[A-Z]/g;\n    var separator = '-';\n    return name.replace(regexp, function(letter, pos) {\n      return (pos ? separator : '') + letter.toLowerCase();\n    });\n  }\n\n  /**\n   * Returns the actual instance of the $tooltip service.\n   * TODO support multiple triggers\n   */\n  this.$get = ['$window', '$compile', '$timeout', '$document', '$uibPosition', '$interpolate', '$rootScope', '$parse', '$$stackedMap', function($window, $compile, $timeout, $document, $position, $interpolate, $rootScope, $parse, $$stackedMap) {\n    var openedTooltips = $$stackedMap.createNew();\n    $document.on('keyup', keypressListener);\n\n    $rootScope.$on('$destroy', function() {\n      $document.off('keyup', keypressListener);\n    });\n\n    function keypressListener(e) {\n      if (e.which === 27) {\n        var last = openedTooltips.top();\n        if (last) {\n          last.value.close();\n          last = null;\n        }\n      }\n    }\n\n    return function $tooltip(ttType, prefix, defaultTriggerShow, options) {\n      options = angular.extend({}, defaultOptions, globalOptions, options);\n\n      /**\n       * Returns an object of show and hide triggers.\n       *\n       * If a trigger is supplied,\n       * it is used to show the tooltip; otherwise, it will use the `trigger`\n       * option passed to the `$tooltipProvider.options` method; else it will\n       * default to the trigger supplied to this directive factory.\n       *\n       * The hide trigger is based on the show trigger. If the `trigger` option\n       * was passed to the `$tooltipProvider.options` method, it will use the\n       * mapped trigger from `triggerMap` or the passed trigger if the map is\n       * undefined; otherwise, it uses the `triggerMap` value of the show\n       * trigger; else it will just use the show trigger.\n       */\n      function getTriggers(trigger) {\n        var show = (trigger || options.trigger || defaultTriggerShow).split(' ');\n        var hide = show.map(function(trigger) {\n          return triggerMap[trigger] || trigger;\n        });\n        return {\n          show: show,\n          hide: hide\n        };\n      }\n\n      var directiveName = snake_case(ttType);\n\n      var startSym = $interpolate.startSymbol();\n      var endSym = $interpolate.endSymbol();\n      var template =\n        '<div '+ directiveName + '-popup ' +\n          'uib-title=\"' + startSym + 'title' + endSym + '\" ' +\n          (options.useContentExp ?\n            'content-exp=\"contentExp()\" ' :\n            'content=\"' + startSym + 'content' + endSym + '\" ') +\n          'origin-scope=\"origScope\" ' +\n          'class=\"uib-position-measure ' + prefix + '\" ' +\n          'tooltip-animation-class=\"fade\"' +\n          'uib-tooltip-classes ' +\n          'ng-class=\"{ in: isOpen }\" ' +\n          '>' +\n        '</div>';\n\n      return {\n        compile: function(tElem, tAttrs) {\n          var tooltipLinker = $compile(template);\n\n          return function link(scope, element, attrs, tooltipCtrl) {\n            var tooltip;\n            var tooltipLinkedScope;\n            var transitionTimeout;\n            var showTimeout;\n            var hideTimeout;\n            var positionTimeout;\n            var appendToBody = angular.isDefined(options.appendToBody) ? options.appendToBody : false;\n            var triggers = getTriggers(undefined);\n            var hasEnableExp = angular.isDefined(attrs[prefix + 'Enable']);\n            var ttScope = scope.$new(true);\n            var repositionScheduled = false;\n            var isOpenParse = angular.isDefined(attrs[prefix + 'IsOpen']) ? $parse(attrs[prefix + 'IsOpen']) : false;\n            var contentParse = options.useContentExp ? $parse(attrs[ttType]) : false;\n            var observers = [];\n            var lastPlacement;\n\n            var positionTooltip = function() {\n              // check if tooltip exists and is not empty\n              if (!tooltip || !tooltip.html()) { return; }\n\n              if (!positionTimeout) {\n                positionTimeout = $timeout(function() {\n                  var ttPosition = $position.positionElements(element, tooltip, ttScope.placement, appendToBody);\n                  var initialHeight = angular.isDefined(tooltip.offsetHeight) ? tooltip.offsetHeight : tooltip.prop('offsetHeight');\n                  var elementPos = appendToBody ? $position.offset(element) : $position.position(element);\n                  tooltip.css({ top: ttPosition.top + 'px', left: ttPosition.left + 'px' });\n                  var placementClasses = ttPosition.placement.split('-');\n\n                  if (!tooltip.hasClass(placementClasses[0])) {\n                    tooltip.removeClass(lastPlacement.split('-')[0]);\n                    tooltip.addClass(placementClasses[0]);\n                  }\n\n                  if (!tooltip.hasClass(options.placementClassPrefix + ttPosition.placement)) {\n                    tooltip.removeClass(options.placementClassPrefix + lastPlacement);\n                    tooltip.addClass(options.placementClassPrefix + ttPosition.placement);\n                  }\n\n                  $timeout(function() {\n                    var currentHeight = angular.isDefined(tooltip.offsetHeight) ? tooltip.offsetHeight : tooltip.prop('offsetHeight');\n                    var adjustment = $position.adjustTop(placementClasses, elementPos, initialHeight, currentHeight);\n                    if (adjustment) {\n                      tooltip.css(adjustment);\n                    }\n                  }, 0, false);\n\n                  // first time through tt element will have the\n                  // uib-position-measure class or if the placement\n                  // has changed we need to position the arrow.\n                  if (tooltip.hasClass('uib-position-measure')) {\n                    $position.positionArrow(tooltip, ttPosition.placement);\n                    tooltip.removeClass('uib-position-measure');\n                  } else if (lastPlacement !== ttPosition.placement) {\n                    $position.positionArrow(tooltip, ttPosition.placement);\n                  }\n                  lastPlacement = ttPosition.placement;\n\n                  positionTimeout = null;\n                }, 0, false);\n              }\n            };\n\n            // Set up the correct scope to allow transclusion later\n            ttScope.origScope = scope;\n\n            // By default, the tooltip is not open.\n            // TODO add ability to start tooltip opened\n            ttScope.isOpen = false;\n\n            function toggleTooltipBind() {\n              if (!ttScope.isOpen) {\n                showTooltipBind();\n              } else {\n                hideTooltipBind();\n              }\n            }\n\n            // Show the tooltip with delay if specified, otherwise show it immediately\n            function showTooltipBind() {\n              if (hasEnableExp && !scope.$eval(attrs[prefix + 'Enable'])) {\n                return;\n              }\n\n              cancelHide();\n              prepareTooltip();\n\n              if (ttScope.popupDelay) {\n                // Do nothing if the tooltip was already scheduled to pop-up.\n                // This happens if show is triggered multiple times before any hide is triggered.\n                if (!showTimeout) {\n                  showTimeout = $timeout(show, ttScope.popupDelay, false);\n                }\n              } else {\n                show();\n              }\n            }\n\n            function hideTooltipBind() {\n              cancelShow();\n\n              if (ttScope.popupCloseDelay) {\n                if (!hideTimeout) {\n                  hideTimeout = $timeout(hide, ttScope.popupCloseDelay, false);\n                }\n              } else {\n                hide();\n              }\n            }\n\n            // Show the tooltip popup element.\n            function show() {\n              cancelShow();\n              cancelHide();\n\n              // Don't show empty tooltips.\n              if (!ttScope.content) {\n                return angular.noop;\n              }\n\n              createTooltip();\n\n              // And show the tooltip.\n              ttScope.$evalAsync(function() {\n                ttScope.isOpen = true;\n                assignIsOpen(true);\n                positionTooltip();\n              });\n            }\n\n            function cancelShow() {\n              if (showTimeout) {\n                $timeout.cancel(showTimeout);\n                showTimeout = null;\n              }\n\n              if (positionTimeout) {\n                $timeout.cancel(positionTimeout);\n                positionTimeout = null;\n              }\n            }\n\n            // Hide the tooltip popup element.\n            function hide() {\n              if (!ttScope) {\n                return;\n              }\n\n              // First things first: we don't show it anymore.\n              ttScope.$evalAsync(function() {\n                if (ttScope) {\n                  ttScope.isOpen = false;\n                  assignIsOpen(false);\n                  // And now we remove it from the DOM. However, if we have animation, we\n                  // need to wait for it to expire beforehand.\n                  // FIXME: this is a placeholder for a port of the transitions library.\n                  // The fade transition in TWBS is 150ms.\n                  if (ttScope.animation) {\n                    if (!transitionTimeout) {\n                      transitionTimeout = $timeout(removeTooltip, 150, false);\n                    }\n                  } else {\n                    removeTooltip();\n                  }\n                }\n              });\n            }\n\n            function cancelHide() {\n              if (hideTimeout) {\n                $timeout.cancel(hideTimeout);\n                hideTimeout = null;\n              }\n\n              if (transitionTimeout) {\n                $timeout.cancel(transitionTimeout);\n                transitionTimeout = null;\n              }\n            }\n\n            function createTooltip() {\n              // There can only be one tooltip element per directive shown at once.\n              if (tooltip) {\n                return;\n              }\n\n              tooltipLinkedScope = ttScope.$new();\n              tooltip = tooltipLinker(tooltipLinkedScope, function(tooltip) {\n                if (appendToBody) {\n                  $document.find('body').append(tooltip);\n                } else {\n                  element.after(tooltip);\n                }\n              });\n\n              openedTooltips.add(ttScope, {\n                close: hide\n              });\n\n              prepObservers();\n            }\n\n            function removeTooltip() {\n              cancelShow();\n              cancelHide();\n              unregisterObservers();\n\n              if (tooltip) {\n                tooltip.remove();\n                tooltip = null;\n              }\n\n              openedTooltips.remove(ttScope);\n              \n              if (tooltipLinkedScope) {\n                tooltipLinkedScope.$destroy();\n                tooltipLinkedScope = null;\n              }\n            }\n\n            /**\n             * Set the initial scope values. Once\n             * the tooltip is created, the observers\n             * will be added to keep things in sync.\n             */\n            function prepareTooltip() {\n              ttScope.title = attrs[prefix + 'Title'];\n              if (contentParse) {\n                ttScope.content = contentParse(scope);\n              } else {\n                ttScope.content = attrs[ttType];\n              }\n\n              ttScope.popupClass = attrs[prefix + 'Class'];\n              ttScope.placement = angular.isDefined(attrs[prefix + 'Placement']) ? attrs[prefix + 'Placement'] : options.placement;\n              var placement = $position.parsePlacement(ttScope.placement);\n              lastPlacement = placement[1] ? placement[0] + '-' + placement[1] : placement[0];\n\n              var delay = parseInt(attrs[prefix + 'PopupDelay'], 10);\n              var closeDelay = parseInt(attrs[prefix + 'PopupCloseDelay'], 10);\n              ttScope.popupDelay = !isNaN(delay) ? delay : options.popupDelay;\n              ttScope.popupCloseDelay = !isNaN(closeDelay) ? closeDelay : options.popupCloseDelay;\n            }\n\n            function assignIsOpen(isOpen) {\n              if (isOpenParse && angular.isFunction(isOpenParse.assign)) {\n                isOpenParse.assign(scope, isOpen);\n              }\n            }\n\n            ttScope.contentExp = function() {\n              return ttScope.content;\n            };\n\n            /**\n             * Observe the relevant attributes.\n             */\n            attrs.$observe('disabled', function(val) {\n              if (val) {\n                cancelShow();\n              }\n\n              if (val && ttScope.isOpen) {\n                hide();\n              }\n            });\n\n            if (isOpenParse) {\n              scope.$watch(isOpenParse, function(val) {\n                if (ttScope && !val === ttScope.isOpen) {\n                  toggleTooltipBind();\n                }\n              });\n            }\n\n            function prepObservers() {\n              observers.length = 0;\n\n              if (contentParse) {\n                observers.push(\n                  scope.$watch(contentParse, function(val) {\n                    ttScope.content = val;\n                    if (!val && ttScope.isOpen) {\n                      hide();\n                    }\n                  })\n                );\n\n                observers.push(\n                  tooltipLinkedScope.$watch(function() {\n                    if (!repositionScheduled) {\n                      repositionScheduled = true;\n                      tooltipLinkedScope.$$postDigest(function() {\n                        repositionScheduled = false;\n                        if (ttScope && ttScope.isOpen) {\n                          positionTooltip();\n                        }\n                      });\n                    }\n                  })\n                );\n              } else {\n                observers.push(\n                  attrs.$observe(ttType, function(val) {\n                    ttScope.content = val;\n                    if (!val && ttScope.isOpen) {\n                      hide();\n                    } else {\n                      positionTooltip();\n                    }\n                  })\n                );\n              }\n\n              observers.push(\n                attrs.$observe(prefix + 'Title', function(val) {\n                  ttScope.title = val;\n                  if (ttScope.isOpen) {\n                    positionTooltip();\n                  }\n                })\n              );\n\n              observers.push(\n                attrs.$observe(prefix + 'Placement', function(val) {\n                  ttScope.placement = val ? val : options.placement;\n                  if (ttScope.isOpen) {\n                    positionTooltip();\n                  }\n                })\n              );\n            }\n\n            function unregisterObservers() {\n              if (observers.length) {\n                angular.forEach(observers, function(observer) {\n                  observer();\n                });\n                observers.length = 0;\n              }\n            }\n\n            // hide tooltips/popovers for outsideClick trigger\n            function bodyHideTooltipBind(e) {\n              if (!ttScope || !ttScope.isOpen || !tooltip) {\n                return;\n              }\n              // make sure the tooltip/popover link or tool tooltip/popover itself were not clicked\n              if (!element[0].contains(e.target) && !tooltip[0].contains(e.target)) {\n                hideTooltipBind();\n              }\n            }\n\n            var unregisterTriggers = function() {\n              triggers.show.forEach(function(trigger) {\n                if (trigger === 'outsideClick') {\n                  element.off('click', toggleTooltipBind);\n                } else {\n                  element.off(trigger, showTooltipBind);\n                  element.off(trigger, toggleTooltipBind);\n                }\n              });\n              triggers.hide.forEach(function(trigger) {\n                if (trigger === 'outsideClick') {\n                  $document.off('click', bodyHideTooltipBind);\n                } else {\n                  element.off(trigger, hideTooltipBind);\n                }\n              });\n            };\n\n            function prepTriggers() {\n              var showTriggers = [], hideTriggers = [];\n              var val = scope.$eval(attrs[prefix + 'Trigger']);\n              unregisterTriggers();\n\n              if (angular.isObject(val)) {\n                Object.keys(val).forEach(function(key) {\n                  showTriggers.push(key);\n                  hideTriggers.push(val[key]);\n                });\n                triggers = {\n                  show: showTriggers,\n                  hide: hideTriggers\n                };\n              } else {\n                triggers = getTriggers(val);\n              }\n\n              if (triggers.show !== 'none') {\n                triggers.show.forEach(function(trigger, idx) {\n                  if (trigger === 'outsideClick') {\n                    element.on('click', toggleTooltipBind);\n                    $document.on('click', bodyHideTooltipBind);\n                  } else if (trigger === triggers.hide[idx]) {\n                    element.on(trigger, toggleTooltipBind);\n                  } else if (trigger) {\n                    element.on(trigger, showTooltipBind);\n                    element.on(triggers.hide[idx], hideTooltipBind);\n                  }\n\n                  element.on('keypress', function(e) {\n                    if (e.which === 27) {\n                      hideTooltipBind();\n                    }\n                  });\n                });\n              }\n            }\n\n            prepTriggers();\n\n            var animation = scope.$eval(attrs[prefix + 'Animation']);\n            ttScope.animation = angular.isDefined(animation) ? !!animation : options.animation;\n\n            var appendToBodyVal;\n            var appendKey = prefix + 'AppendToBody';\n            if (appendKey in attrs && attrs[appendKey] === undefined) {\n              appendToBodyVal = true;\n            } else {\n              appendToBodyVal = scope.$eval(attrs[appendKey]);\n            }\n\n            appendToBody = angular.isDefined(appendToBodyVal) ? appendToBodyVal : appendToBody;\n\n            // Make sure tooltip is destroyed and removed.\n            scope.$on('$destroy', function onDestroyTooltip() {\n              unregisterTriggers();\n              removeTooltip();\n              ttScope = null;\n            });\n          };\n        }\n      };\n    };\n  }];\n})\n\n// This is mostly ngInclude code but with a custom scope\n.directive('uibTooltipTemplateTransclude', [\n         '$animate', '$sce', '$compile', '$templateRequest',\nfunction ($animate, $sce, $compile, $templateRequest) {\n  return {\n    link: function(scope, elem, attrs) {\n      var origScope = scope.$eval(attrs.tooltipTemplateTranscludeScope);\n\n      var changeCounter = 0,\n        currentScope,\n        previousElement,\n        currentElement;\n\n      var cleanupLastIncludeContent = function() {\n        if (previousElement) {\n          previousElement.remove();\n          previousElement = null;\n        }\n\n        if (currentScope) {\n          currentScope.$destroy();\n          currentScope = null;\n        }\n\n        if (currentElement) {\n          $animate.leave(currentElement).then(function() {\n            previousElement = null;\n          });\n          previousElement = currentElement;\n          currentElement = null;\n        }\n      };\n\n      scope.$watch($sce.parseAsResourceUrl(attrs.uibTooltipTemplateTransclude), function(src) {\n        var thisChangeId = ++changeCounter;\n\n        if (src) {\n          //set the 2nd param to true to ignore the template request error so that the inner\n          //contents and scope can be cleaned up.\n          $templateRequest(src, true).then(function(response) {\n            if (thisChangeId !== changeCounter) { return; }\n            var newScope = origScope.$new();\n            var template = response;\n\n            var clone = $compile(template)(newScope, function(clone) {\n              cleanupLastIncludeContent();\n              $animate.enter(clone, elem);\n            });\n\n            currentScope = newScope;\n            currentElement = clone;\n\n            currentScope.$emit('$includeContentLoaded', src);\n          }, function() {\n            if (thisChangeId === changeCounter) {\n              cleanupLastIncludeContent();\n              scope.$emit('$includeContentError', src);\n            }\n          });\n          scope.$emit('$includeContentRequested', src);\n        } else {\n          cleanupLastIncludeContent();\n        }\n      });\n\n      scope.$on('$destroy', cleanupLastIncludeContent);\n    }\n  };\n}])\n\n/**\n * Note that it's intentional that these classes are *not* applied through $animate.\n * They must not be animated as they're expected to be present on the tooltip on\n * initialization.\n */\n.directive('uibTooltipClasses', ['$uibPosition', function($uibPosition) {\n  return {\n    restrict: 'A',\n    link: function(scope, element, attrs) {\n      // need to set the primary position so the\n      // arrow has space during position measure.\n      // tooltip.positionTooltip()\n      if (scope.placement) {\n        // // There are no top-left etc... classes\n        // // in TWBS, so we need the primary position.\n        var position = $uibPosition.parsePlacement(scope.placement);\n        element.addClass(position[0]);\n      }\n\n      if (scope.popupClass) {\n        element.addClass(scope.popupClass);\n      }\n\n      if (scope.animation) {\n        element.addClass(attrs.tooltipAnimationClass);\n      }\n    }\n  };\n}])\n\n.directive('uibTooltipPopup', function() {\n  return {\n    restrict: 'A',\n    scope: { content: '@' },\n    templateUrl: 'uib/template/tooltip/tooltip-popup.html'\n  };\n})\n\n.directive('uibTooltip', [ '$uibTooltip', function($uibTooltip) {\n  return $uibTooltip('uibTooltip', 'tooltip', 'mouseenter');\n}])\n\n.directive('uibTooltipTemplatePopup', function() {\n  return {\n    restrict: 'A',\n    scope: { contentExp: '&', originScope: '&' },\n    templateUrl: 'uib/template/tooltip/tooltip-template-popup.html'\n  };\n})\n\n.directive('uibTooltipTemplate', ['$uibTooltip', function($uibTooltip) {\n  return $uibTooltip('uibTooltipTemplate', 'tooltip', 'mouseenter', {\n    useContentExp: true\n  });\n}])\n\n.directive('uibTooltipHtmlPopup', function() {\n  return {\n    restrict: 'A',\n    scope: { contentExp: '&' },\n    templateUrl: 'uib/template/tooltip/tooltip-html-popup.html'\n  };\n})\n\n.directive('uibTooltipHtml', ['$uibTooltip', function($uibTooltip) {\n  return $uibTooltip('uibTooltipHtml', 'tooltip', 'mouseenter', {\n    useContentExp: true\n  });\n}]);\n\n/**\n * The following features are still outstanding: popup delay, animation as a\n * function, placement as a function, inside, support for more triggers than\n * just mouse enter/leave, and selector delegatation.\n */\nangular.module('ui.bootstrap.popover', ['ui.bootstrap.tooltip'])\n\n.directive('uibPopoverTemplatePopup', function() {\n  return {\n    restrict: 'A',\n    scope: { uibTitle: '@', contentExp: '&', originScope: '&' },\n    templateUrl: 'uib/template/popover/popover-template.html'\n  };\n})\n\n.directive('uibPopoverTemplate', ['$uibTooltip', function($uibTooltip) {\n  return $uibTooltip('uibPopoverTemplate', 'popover', 'click', {\n    useContentExp: true\n  });\n}])\n\n.directive('uibPopoverHtmlPopup', function() {\n  return {\n    restrict: 'A',\n    scope: { contentExp: '&', uibTitle: '@' },\n    templateUrl: 'uib/template/popover/popover-html.html'\n  };\n})\n\n.directive('uibPopoverHtml', ['$uibTooltip', function($uibTooltip) {\n  return $uibTooltip('uibPopoverHtml', 'popover', 'click', {\n    useContentExp: true\n  });\n}])\n\n.directive('uibPopoverPopup', function() {\n  return {\n    restrict: 'A',\n    scope: { uibTitle: '@', content: '@' },\n    templateUrl: 'uib/template/popover/popover.html'\n  };\n})\n\n.directive('uibPopover', ['$uibTooltip', function($uibTooltip) {\n  return $uibTooltip('uibPopover', 'popover', 'click');\n}]);\n\nangular.module('ui.bootstrap.progressbar', [])\n\n.constant('uibProgressConfig', {\n  animate: true,\n  max: 100\n})\n\n.controller('UibProgressController', ['$scope', '$attrs', 'uibProgressConfig', function($scope, $attrs, progressConfig) {\n  var self = this,\n      animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate;\n\n  this.bars = [];\n  $scope.max = getMaxOrDefault();\n\n  this.addBar = function(bar, element, attrs) {\n    if (!animate) {\n      element.css({'transition': 'none'});\n    }\n\n    this.bars.push(bar);\n\n    bar.max = getMaxOrDefault();\n    bar.title = attrs && angular.isDefined(attrs.title) ? attrs.title : 'progressbar';\n\n    bar.$watch('value', function(value) {\n      bar.recalculatePercentage();\n    });\n\n    bar.recalculatePercentage = function() {\n      var totalPercentage = self.bars.reduce(function(total, bar) {\n        bar.percent = +(100 * bar.value / bar.max).toFixed(2);\n        return total + bar.percent;\n      }, 0);\n\n      if (totalPercentage > 100) {\n        bar.percent -= totalPercentage - 100;\n      }\n    };\n\n    bar.$on('$destroy', function() {\n      element = null;\n      self.removeBar(bar);\n    });\n  };\n\n  this.removeBar = function(bar) {\n    this.bars.splice(this.bars.indexOf(bar), 1);\n    this.bars.forEach(function (bar) {\n      bar.recalculatePercentage();\n    });\n  };\n\n  //$attrs.$observe('maxParam', function(maxParam) {\n  $scope.$watch('maxParam', function(maxParam) {\n    self.bars.forEach(function(bar) {\n      bar.max = getMaxOrDefault();\n      bar.recalculatePercentage();\n    });\n  });\n\n  function getMaxOrDefault () {\n    return angular.isDefined($scope.maxParam) ? $scope.maxParam : progressConfig.max;\n  }\n}])\n\n.directive('uibProgress', function() {\n  return {\n    replace: true,\n    transclude: true,\n    controller: 'UibProgressController',\n    require: 'uibProgress',\n    scope: {\n      maxParam: '=?max'\n    },\n    templateUrl: 'uib/template/progressbar/progress.html'\n  };\n})\n\n.directive('uibBar', function() {\n  return {\n    replace: true,\n    transclude: true,\n    require: '^uibProgress',\n    scope: {\n      value: '=',\n      type: '@'\n    },\n    templateUrl: 'uib/template/progressbar/bar.html',\n    link: function(scope, element, attrs, progressCtrl) {\n      progressCtrl.addBar(scope, element, attrs);\n    }\n  };\n})\n\n.directive('uibProgressbar', function() {\n  return {\n    replace: true,\n    transclude: true,\n    controller: 'UibProgressController',\n    scope: {\n      value: '=',\n      maxParam: '=?max',\n      type: '@'\n    },\n    templateUrl: 'uib/template/progressbar/progressbar.html',\n    link: function(scope, element, attrs, progressCtrl) {\n      progressCtrl.addBar(scope, angular.element(element.children()[0]), {title: attrs.title});\n    }\n  };\n});\n\nangular.module('ui.bootstrap.rating', [])\n\n.constant('uibRatingConfig', {\n  max: 5,\n  stateOn: null,\n  stateOff: null,\n  enableReset: true,\n  titles: ['one', 'two', 'three', 'four', 'five']\n})\n\n.controller('UibRatingController', ['$scope', '$attrs', 'uibRatingConfig', function($scope, $attrs, ratingConfig) {\n  var ngModelCtrl = { $setViewValue: angular.noop },\n    self = this;\n\n  this.init = function(ngModelCtrl_) {\n    ngModelCtrl = ngModelCtrl_;\n    ngModelCtrl.$render = this.render;\n\n    ngModelCtrl.$formatters.push(function(value) {\n      if (angular.isNumber(value) && value << 0 !== value) {\n        value = Math.round(value);\n      }\n\n      return value;\n    });\n\n    this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn;\n    this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff;\n    this.enableReset = angular.isDefined($attrs.enableReset) ?\n      $scope.$parent.$eval($attrs.enableReset) : ratingConfig.enableReset;\n    var tmpTitles = angular.isDefined($attrs.titles) ? $scope.$parent.$eval($attrs.titles) : ratingConfig.titles;\n    this.titles = angular.isArray(tmpTitles) && tmpTitles.length > 0 ?\n      tmpTitles : ratingConfig.titles;\n\n    var ratingStates = angular.isDefined($attrs.ratingStates) ?\n      $scope.$parent.$eval($attrs.ratingStates) :\n      new Array(angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max);\n    $scope.range = this.buildTemplateObjects(ratingStates);\n  };\n\n  this.buildTemplateObjects = function(states) {\n    for (var i = 0, n = states.length; i < n; i++) {\n      states[i] = angular.extend({ index: i }, { stateOn: this.stateOn, stateOff: this.stateOff, title: this.getTitle(i) }, states[i]);\n    }\n    return states;\n  };\n\n  this.getTitle = function(index) {\n    if (index >= this.titles.length) {\n      return index + 1;\n    }\n\n    return this.titles[index];\n  };\n\n  $scope.rate = function(value) {\n    if (!$scope.readonly && value >= 0 && value <= $scope.range.length) {\n      var newViewValue = self.enableReset && ngModelCtrl.$viewValue === value ? 0 : value;\n      ngModelCtrl.$setViewValue(newViewValue);\n      ngModelCtrl.$render();\n    }\n  };\n\n  $scope.enter = function(value) {\n    if (!$scope.readonly) {\n      $scope.value = value;\n    }\n    $scope.onHover({value: value});\n  };\n\n  $scope.reset = function() {\n    $scope.value = ngModelCtrl.$viewValue;\n    $scope.onLeave();\n  };\n\n  $scope.onKeydown = function(evt) {\n    if (/(37|38|39|40)/.test(evt.which)) {\n      evt.preventDefault();\n      evt.stopPropagation();\n      $scope.rate($scope.value + (evt.which === 38 || evt.which === 39 ? 1 : -1));\n    }\n  };\n\n  this.render = function() {\n    $scope.value = ngModelCtrl.$viewValue;\n    $scope.title = self.getTitle($scope.value - 1);\n  };\n}])\n\n.directive('uibRating', function() {\n  return {\n    require: ['uibRating', 'ngModel'],\n    restrict: 'A',\n    scope: {\n      readonly: '=?readOnly',\n      onHover: '&',\n      onLeave: '&'\n    },\n    controller: 'UibRatingController',\n    templateUrl: 'uib/template/rating/rating.html',\n    link: function(scope, element, attrs, ctrls) {\n      var ratingCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n      ratingCtrl.init(ngModelCtrl);\n    }\n  };\n});\n\nangular.module('ui.bootstrap.tabs', [])\n\n.controller('UibTabsetController', ['$scope', function ($scope) {\n  var ctrl = this,\n    oldIndex;\n  ctrl.tabs = [];\n\n  ctrl.select = function(index, evt) {\n    if (!destroyed) {\n      var previousIndex = findTabIndex(oldIndex);\n      var previousSelected = ctrl.tabs[previousIndex];\n      if (previousSelected) {\n        previousSelected.tab.onDeselect({\n          $event: evt,\n          $selectedIndex: index\n        });\n        if (evt && evt.isDefaultPrevented()) {\n          return;\n        }\n        previousSelected.tab.active = false;\n      }\n\n      var selected = ctrl.tabs[index];\n      if (selected) {\n        selected.tab.onSelect({\n          $event: evt\n        });\n        selected.tab.active = true;\n        ctrl.active = selected.index;\n        oldIndex = selected.index;\n      } else if (!selected && angular.isDefined(oldIndex)) {\n        ctrl.active = null;\n        oldIndex = null;\n      }\n    }\n  };\n\n  ctrl.addTab = function addTab(tab) {\n    ctrl.tabs.push({\n      tab: tab,\n      index: tab.index\n    });\n    ctrl.tabs.sort(function(t1, t2) {\n      if (t1.index > t2.index) {\n        return 1;\n      }\n\n      if (t1.index < t2.index) {\n        return -1;\n      }\n\n      return 0;\n    });\n\n    if (tab.index === ctrl.active || !angular.isDefined(ctrl.active) && ctrl.tabs.length === 1) {\n      var newActiveIndex = findTabIndex(tab.index);\n      ctrl.select(newActiveIndex);\n    }\n  };\n\n  ctrl.removeTab = function removeTab(tab) {\n    var index;\n    for (var i = 0; i < ctrl.tabs.length; i++) {\n      if (ctrl.tabs[i].tab === tab) {\n        index = i;\n        break;\n      }\n    }\n\n    if (ctrl.tabs[index].index === ctrl.active) {\n      var newActiveTabIndex = index === ctrl.tabs.length - 1 ?\n        index - 1 : index + 1 % ctrl.tabs.length;\n      ctrl.select(newActiveTabIndex);\n    }\n\n    ctrl.tabs.splice(index, 1);\n  };\n\n  $scope.$watch('tabset.active', function(val) {\n    if (angular.isDefined(val) && val !== oldIndex) {\n      ctrl.select(findTabIndex(val));\n    }\n  });\n\n  var destroyed;\n  $scope.$on('$destroy', function() {\n    destroyed = true;\n  });\n\n  function findTabIndex(index) {\n    for (var i = 0; i < ctrl.tabs.length; i++) {\n      if (ctrl.tabs[i].index === index) {\n        return i;\n      }\n    }\n  }\n}])\n\n.directive('uibTabset', function() {\n  return {\n    transclude: true,\n    replace: true,\n    scope: {},\n    bindToController: {\n      active: '=?',\n      type: '@'\n    },\n    controller: 'UibTabsetController',\n    controllerAs: 'tabset',\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/tabs/tabset.html';\n    },\n    link: function(scope, element, attrs) {\n      scope.vertical = angular.isDefined(attrs.vertical) ?\n        scope.$parent.$eval(attrs.vertical) : false;\n      scope.justified = angular.isDefined(attrs.justified) ?\n        scope.$parent.$eval(attrs.justified) : false;\n    }\n  };\n})\n\n.directive('uibTab', ['$parse', function($parse) {\n  return {\n    require: '^uibTabset',\n    replace: true,\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || 'uib/template/tabs/tab.html';\n    },\n    transclude: true,\n    scope: {\n      heading: '@',\n      index: '=?',\n      classes: '@?',\n      onSelect: '&select', //This callback is called in contentHeadingTransclude\n                          //once it inserts the tab's content into the dom\n      onDeselect: '&deselect'\n    },\n    controller: function() {\n      //Empty controller so other directives can require being 'under' a tab\n    },\n    controllerAs: 'tab',\n    link: function(scope, elm, attrs, tabsetCtrl, transclude) {\n      scope.disabled = false;\n      if (attrs.disable) {\n        scope.$parent.$watch($parse(attrs.disable), function(value) {\n          scope.disabled = !! value;\n        });\n      }\n\n      if (angular.isUndefined(attrs.index)) {\n        if (tabsetCtrl.tabs && tabsetCtrl.tabs.length) {\n          scope.index = Math.max.apply(null, tabsetCtrl.tabs.map(function(t) { return t.index; })) + 1;\n        } else {\n          scope.index = 0;\n        }\n      }\n\n      if (angular.isUndefined(attrs.classes)) {\n        scope.classes = '';\n      }\n\n      scope.select = function(evt) {\n        if (!scope.disabled) {\n          var index;\n          for (var i = 0; i < tabsetCtrl.tabs.length; i++) {\n            if (tabsetCtrl.tabs[i].tab === scope) {\n              index = i;\n              break;\n            }\n          }\n\n          tabsetCtrl.select(index, evt);\n        }\n      };\n\n      tabsetCtrl.addTab(scope);\n      scope.$on('$destroy', function() {\n        tabsetCtrl.removeTab(scope);\n      });\n\n      //We need to transclude later, once the content container is ready.\n      //when this link happens, we're inside a tab heading.\n      scope.$transcludeFn = transclude;\n    }\n  };\n}])\n\n.directive('uibTabHeadingTransclude', function() {\n  return {\n    restrict: 'A',\n    require: '^uibTab',\n    link: function(scope, elm) {\n      scope.$watch('headingElement', function updateHeadingElement(heading) {\n        if (heading) {\n          elm.html('');\n          elm.append(heading);\n        }\n      });\n    }\n  };\n})\n\n.directive('uibTabContentTransclude', function() {\n  return {\n    restrict: 'A',\n    require: '^uibTabset',\n    link: function(scope, elm, attrs) {\n      var tab = scope.$eval(attrs.uibTabContentTransclude).tab;\n\n      //Now our tab is ready to be transcluded: both the tab heading area\n      //and the tab content area are loaded.  Transclude 'em both.\n      tab.$transcludeFn(tab.$parent, function(contents) {\n        angular.forEach(contents, function(node) {\n          if (isTabHeading(node)) {\n            //Let tabHeadingTransclude know.\n            tab.headingElement = node;\n          } else {\n            elm.append(node);\n          }\n        });\n      });\n    }\n  };\n\n  function isTabHeading(node) {\n    return node.tagName && (\n      node.hasAttribute('uib-tab-heading') ||\n      node.hasAttribute('data-uib-tab-heading') ||\n      node.hasAttribute('x-uib-tab-heading') ||\n      node.tagName.toLowerCase() === 'uib-tab-heading' ||\n      node.tagName.toLowerCase() === 'data-uib-tab-heading' ||\n      node.tagName.toLowerCase() === 'x-uib-tab-heading' ||\n      node.tagName.toLowerCase() === 'uib:tab-heading'\n    );\n  }\n});\n\nangular.module('ui.bootstrap.timepicker', [])\n\n.constant('uibTimepickerConfig', {\n  hourStep: 1,\n  minuteStep: 1,\n  secondStep: 1,\n  showMeridian: true,\n  showSeconds: false,\n  meridians: null,\n  readonlyInput: false,\n  mousewheel: true,\n  arrowkeys: true,\n  showSpinners: true,\n  templateUrl: 'uib/template/timepicker/timepicker.html'\n})\n\n.controller('UibTimepickerController', ['$scope', '$element', '$attrs', '$parse', '$log', '$locale', 'uibTimepickerConfig', function($scope, $element, $attrs, $parse, $log, $locale, timepickerConfig) {\n  var selected = new Date(),\n    watchers = [],\n    ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl\n    meridians = angular.isDefined($attrs.meridians) ? $scope.$parent.$eval($attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS,\n    padHours = angular.isDefined($attrs.padHours) ? $scope.$parent.$eval($attrs.padHours) : true;\n\n  $scope.tabindex = angular.isDefined($attrs.tabindex) ? $attrs.tabindex : 0;\n  $element.removeAttr('tabindex');\n\n  this.init = function(ngModelCtrl_, inputs) {\n    ngModelCtrl = ngModelCtrl_;\n    ngModelCtrl.$render = this.render;\n\n    ngModelCtrl.$formatters.unshift(function(modelValue) {\n      return modelValue ? new Date(modelValue) : null;\n    });\n\n    var hoursInputEl = inputs.eq(0),\n        minutesInputEl = inputs.eq(1),\n        secondsInputEl = inputs.eq(2);\n\n    var mousewheel = angular.isDefined($attrs.mousewheel) ? $scope.$parent.$eval($attrs.mousewheel) : timepickerConfig.mousewheel;\n\n    if (mousewheel) {\n      this.setupMousewheelEvents(hoursInputEl, minutesInputEl, secondsInputEl);\n    }\n\n    var arrowkeys = angular.isDefined($attrs.arrowkeys) ? $scope.$parent.$eval($attrs.arrowkeys) : timepickerConfig.arrowkeys;\n    if (arrowkeys) {\n      this.setupArrowkeyEvents(hoursInputEl, minutesInputEl, secondsInputEl);\n    }\n\n    $scope.readonlyInput = angular.isDefined($attrs.readonlyInput) ? $scope.$parent.$eval($attrs.readonlyInput) : timepickerConfig.readonlyInput;\n    this.setupInputEvents(hoursInputEl, minutesInputEl, secondsInputEl);\n  };\n\n  var hourStep = timepickerConfig.hourStep;\n  if ($attrs.hourStep) {\n    watchers.push($scope.$parent.$watch($parse($attrs.hourStep), function(value) {\n      hourStep = +value;\n    }));\n  }\n\n  var minuteStep = timepickerConfig.minuteStep;\n  if ($attrs.minuteStep) {\n    watchers.push($scope.$parent.$watch($parse($attrs.minuteStep), function(value) {\n      minuteStep = +value;\n    }));\n  }\n\n  var min;\n  watchers.push($scope.$parent.$watch($parse($attrs.min), function(value) {\n    var dt = new Date(value);\n    min = isNaN(dt) ? undefined : dt;\n  }));\n\n  var max;\n  watchers.push($scope.$parent.$watch($parse($attrs.max), function(value) {\n    var dt = new Date(value);\n    max = isNaN(dt) ? undefined : dt;\n  }));\n\n  var disabled = false;\n  if ($attrs.ngDisabled) {\n    watchers.push($scope.$parent.$watch($parse($attrs.ngDisabled), function(value) {\n      disabled = value;\n    }));\n  }\n\n  $scope.noIncrementHours = function() {\n    var incrementedSelected = addMinutes(selected, hourStep * 60);\n    return disabled || incrementedSelected > max ||\n      incrementedSelected < selected && incrementedSelected < min;\n  };\n\n  $scope.noDecrementHours = function() {\n    var decrementedSelected = addMinutes(selected, -hourStep * 60);\n    return disabled || decrementedSelected < min ||\n      decrementedSelected > selected && decrementedSelected > max;\n  };\n\n  $scope.noIncrementMinutes = function() {\n    var incrementedSelected = addMinutes(selected, minuteStep);\n    return disabled || incrementedSelected > max ||\n      incrementedSelected < selected && incrementedSelected < min;\n  };\n\n  $scope.noDecrementMinutes = function() {\n    var decrementedSelected = addMinutes(selected, -minuteStep);\n    return disabled || decrementedSelected < min ||\n      decrementedSelected > selected && decrementedSelected > max;\n  };\n\n  $scope.noIncrementSeconds = function() {\n    var incrementedSelected = addSeconds(selected, secondStep);\n    return disabled || incrementedSelected > max ||\n      incrementedSelected < selected && incrementedSelected < min;\n  };\n\n  $scope.noDecrementSeconds = function() {\n    var decrementedSelected = addSeconds(selected, -secondStep);\n    return disabled || decrementedSelected < min ||\n      decrementedSelected > selected && decrementedSelected > max;\n  };\n\n  $scope.noToggleMeridian = function() {\n    if (selected.getHours() < 12) {\n      return disabled || addMinutes(selected, 12 * 60) > max;\n    }\n\n    return disabled || addMinutes(selected, -12 * 60) < min;\n  };\n\n  var secondStep = timepickerConfig.secondStep;\n  if ($attrs.secondStep) {\n    watchers.push($scope.$parent.$watch($parse($attrs.secondStep), function(value) {\n      secondStep = +value;\n    }));\n  }\n\n  $scope.showSeconds = timepickerConfig.showSeconds;\n  if ($attrs.showSeconds) {\n    watchers.push($scope.$parent.$watch($parse($attrs.showSeconds), function(value) {\n      $scope.showSeconds = !!value;\n    }));\n  }\n\n  // 12H / 24H mode\n  $scope.showMeridian = timepickerConfig.showMeridian;\n  if ($attrs.showMeridian) {\n    watchers.push($scope.$parent.$watch($parse($attrs.showMeridian), function(value) {\n      $scope.showMeridian = !!value;\n\n      if (ngModelCtrl.$error.time) {\n        // Evaluate from template\n        var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate();\n        if (angular.isDefined(hours) && angular.isDefined(minutes)) {\n          selected.setHours(hours);\n          refresh();\n        }\n      } else {\n        updateTemplate();\n      }\n    }));\n  }\n\n  // Get $scope.hours in 24H mode if valid\n  function getHoursFromTemplate() {\n    var hours = +$scope.hours;\n    var valid = $scope.showMeridian ? hours > 0 && hours < 13 :\n      hours >= 0 && hours < 24;\n    if (!valid || $scope.hours === '') {\n      return undefined;\n    }\n\n    if ($scope.showMeridian) {\n      if (hours === 12) {\n        hours = 0;\n      }\n      if ($scope.meridian === meridians[1]) {\n        hours = hours + 12;\n      }\n    }\n    return hours;\n  }\n\n  function getMinutesFromTemplate() {\n    var minutes = +$scope.minutes;\n    var valid = minutes >= 0 && minutes < 60;\n    if (!valid || $scope.minutes === '') {\n      return undefined;\n    }\n    return minutes;\n  }\n\n  function getSecondsFromTemplate() {\n    var seconds = +$scope.seconds;\n    return seconds >= 0 && seconds < 60 ? seconds : undefined;\n  }\n\n  function pad(value, noPad) {\n    if (value === null) {\n      return '';\n    }\n\n    return angular.isDefined(value) && value.toString().length < 2 && !noPad ?\n      '0' + value : value.toString();\n  }\n\n  // Respond on mousewheel spin\n  this.setupMousewheelEvents = function(hoursInputEl, minutesInputEl, secondsInputEl) {\n    var isScrollingUp = function(e) {\n      if (e.originalEvent) {\n        e = e.originalEvent;\n      }\n      //pick correct delta variable depending on event\n      var delta = e.wheelDelta ? e.wheelDelta : -e.deltaY;\n      return e.detail || delta > 0;\n    };\n\n    hoursInputEl.bind('mousewheel wheel', function(e) {\n      if (!disabled) {\n        $scope.$apply(isScrollingUp(e) ? $scope.incrementHours() : $scope.decrementHours());\n      }\n      e.preventDefault();\n    });\n\n    minutesInputEl.bind('mousewheel wheel', function(e) {\n      if (!disabled) {\n        $scope.$apply(isScrollingUp(e) ? $scope.incrementMinutes() : $scope.decrementMinutes());\n      }\n      e.preventDefault();\n    });\n\n     secondsInputEl.bind('mousewheel wheel', function(e) {\n      if (!disabled) {\n        $scope.$apply(isScrollingUp(e) ? $scope.incrementSeconds() : $scope.decrementSeconds());\n      }\n      e.preventDefault();\n    });\n  };\n\n  // Respond on up/down arrowkeys\n  this.setupArrowkeyEvents = function(hoursInputEl, minutesInputEl, secondsInputEl) {\n    hoursInputEl.bind('keydown', function(e) {\n      if (!disabled) {\n        if (e.which === 38) { // up\n          e.preventDefault();\n          $scope.incrementHours();\n          $scope.$apply();\n        } else if (e.which === 40) { // down\n          e.preventDefault();\n          $scope.decrementHours();\n          $scope.$apply();\n        }\n      }\n    });\n\n    minutesInputEl.bind('keydown', function(e) {\n      if (!disabled) {\n        if (e.which === 38) { // up\n          e.preventDefault();\n          $scope.incrementMinutes();\n          $scope.$apply();\n        } else if (e.which === 40) { // down\n          e.preventDefault();\n          $scope.decrementMinutes();\n          $scope.$apply();\n        }\n      }\n    });\n\n    secondsInputEl.bind('keydown', function(e) {\n      if (!disabled) {\n        if (e.which === 38) { // up\n          e.preventDefault();\n          $scope.incrementSeconds();\n          $scope.$apply();\n        } else if (e.which === 40) { // down\n          e.preventDefault();\n          $scope.decrementSeconds();\n          $scope.$apply();\n        }\n      }\n    });\n  };\n\n  this.setupInputEvents = function(hoursInputEl, minutesInputEl, secondsInputEl) {\n    if ($scope.readonlyInput) {\n      $scope.updateHours = angular.noop;\n      $scope.updateMinutes = angular.noop;\n      $scope.updateSeconds = angular.noop;\n      return;\n    }\n\n    var invalidate = function(invalidHours, invalidMinutes, invalidSeconds) {\n      ngModelCtrl.$setViewValue(null);\n      ngModelCtrl.$setValidity('time', false);\n      if (angular.isDefined(invalidHours)) {\n        $scope.invalidHours = invalidHours;\n      }\n\n      if (angular.isDefined(invalidMinutes)) {\n        $scope.invalidMinutes = invalidMinutes;\n      }\n\n      if (angular.isDefined(invalidSeconds)) {\n        $scope.invalidSeconds = invalidSeconds;\n      }\n    };\n\n    $scope.updateHours = function() {\n      var hours = getHoursFromTemplate(),\n        minutes = getMinutesFromTemplate();\n\n      ngModelCtrl.$setDirty();\n\n      if (angular.isDefined(hours) && angular.isDefined(minutes)) {\n        selected.setHours(hours);\n        selected.setMinutes(minutes);\n        if (selected < min || selected > max) {\n          invalidate(true);\n        } else {\n          refresh('h');\n        }\n      } else {\n        invalidate(true);\n      }\n    };\n\n    hoursInputEl.bind('blur', function(e) {\n      ngModelCtrl.$setTouched();\n      if (modelIsEmpty()) {\n        makeValid();\n      } else if ($scope.hours === null || $scope.hours === '') {\n        invalidate(true);\n      } else if (!$scope.invalidHours && $scope.hours < 10) {\n        $scope.$apply(function() {\n          $scope.hours = pad($scope.hours, !padHours);\n        });\n      }\n    });\n\n    $scope.updateMinutes = function() {\n      var minutes = getMinutesFromTemplate(),\n        hours = getHoursFromTemplate();\n\n      ngModelCtrl.$setDirty();\n\n      if (angular.isDefined(minutes) && angular.isDefined(hours)) {\n        selected.setHours(hours);\n        selected.setMinutes(minutes);\n        if (selected < min || selected > max) {\n          invalidate(undefined, true);\n        } else {\n          refresh('m');\n        }\n      } else {\n        invalidate(undefined, true);\n      }\n    };\n\n    minutesInputEl.bind('blur', function(e) {\n      ngModelCtrl.$setTouched();\n      if (modelIsEmpty()) {\n        makeValid();\n      } else if ($scope.minutes === null) {\n        invalidate(undefined, true);\n      } else if (!$scope.invalidMinutes && $scope.minutes < 10) {\n        $scope.$apply(function() {\n          $scope.minutes = pad($scope.minutes);\n        });\n      }\n    });\n\n    $scope.updateSeconds = function() {\n      var seconds = getSecondsFromTemplate();\n\n      ngModelCtrl.$setDirty();\n\n      if (angular.isDefined(seconds)) {\n        selected.setSeconds(seconds);\n        refresh('s');\n      } else {\n        invalidate(undefined, undefined, true);\n      }\n    };\n\n    secondsInputEl.bind('blur', function(e) {\n      if (modelIsEmpty()) {\n        makeValid();\n      } else if (!$scope.invalidSeconds && $scope.seconds < 10) {\n        $scope.$apply( function() {\n          $scope.seconds = pad($scope.seconds);\n        });\n      }\n    });\n\n  };\n\n  this.render = function() {\n    var date = ngModelCtrl.$viewValue;\n\n    if (isNaN(date)) {\n      ngModelCtrl.$setValidity('time', false);\n      $log.error('Timepicker directive: \"ng-model\" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.');\n    } else {\n      if (date) {\n        selected = date;\n      }\n\n      if (selected < min || selected > max) {\n        ngModelCtrl.$setValidity('time', false);\n        $scope.invalidHours = true;\n        $scope.invalidMinutes = true;\n      } else {\n        makeValid();\n      }\n      updateTemplate();\n    }\n  };\n\n  // Call internally when we know that model is valid.\n  function refresh(keyboardChange) {\n    makeValid();\n    ngModelCtrl.$setViewValue(new Date(selected));\n    updateTemplate(keyboardChange);\n  }\n\n  function makeValid() {\n    ngModelCtrl.$setValidity('time', true);\n    $scope.invalidHours = false;\n    $scope.invalidMinutes = false;\n    $scope.invalidSeconds = false;\n  }\n\n  function updateTemplate(keyboardChange) {\n    if (!ngModelCtrl.$modelValue) {\n      $scope.hours = null;\n      $scope.minutes = null;\n      $scope.seconds = null;\n      $scope.meridian = meridians[0];\n    } else {\n      var hours = selected.getHours(),\n        minutes = selected.getMinutes(),\n        seconds = selected.getSeconds();\n\n      if ($scope.showMeridian) {\n        hours = hours === 0 || hours === 12 ? 12 : hours % 12; // Convert 24 to 12 hour system\n      }\n\n      $scope.hours = keyboardChange === 'h' ? hours : pad(hours, !padHours);\n      if (keyboardChange !== 'm') {\n        $scope.minutes = pad(minutes);\n      }\n      $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1];\n\n      if (keyboardChange !== 's') {\n        $scope.seconds = pad(seconds);\n      }\n      $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1];\n    }\n  }\n\n  function addSecondsToSelected(seconds) {\n    selected = addSeconds(selected, seconds);\n    refresh();\n  }\n\n  function addMinutes(selected, minutes) {\n    return addSeconds(selected, minutes*60);\n  }\n\n  function addSeconds(date, seconds) {\n    var dt = new Date(date.getTime() + seconds * 1000);\n    var newDate = new Date(date);\n    newDate.setHours(dt.getHours(), dt.getMinutes(), dt.getSeconds());\n    return newDate;\n  }\n\n  function modelIsEmpty() {\n    return ($scope.hours === null || $scope.hours === '') &&\n      ($scope.minutes === null || $scope.minutes === '') &&\n      (!$scope.showSeconds || $scope.showSeconds && ($scope.seconds === null || $scope.seconds === ''));\n  }\n\n  $scope.showSpinners = angular.isDefined($attrs.showSpinners) ?\n    $scope.$parent.$eval($attrs.showSpinners) : timepickerConfig.showSpinners;\n\n  $scope.incrementHours = function() {\n    if (!$scope.noIncrementHours()) {\n      addSecondsToSelected(hourStep * 60 * 60);\n    }\n  };\n\n  $scope.decrementHours = function() {\n    if (!$scope.noDecrementHours()) {\n      addSecondsToSelected(-hourStep * 60 * 60);\n    }\n  };\n\n  $scope.incrementMinutes = function() {\n    if (!$scope.noIncrementMinutes()) {\n      addSecondsToSelected(minuteStep * 60);\n    }\n  };\n\n  $scope.decrementMinutes = function() {\n    if (!$scope.noDecrementMinutes()) {\n      addSecondsToSelected(-minuteStep * 60);\n    }\n  };\n\n  $scope.incrementSeconds = function() {\n    if (!$scope.noIncrementSeconds()) {\n      addSecondsToSelected(secondStep);\n    }\n  };\n\n  $scope.decrementSeconds = function() {\n    if (!$scope.noDecrementSeconds()) {\n      addSecondsToSelected(-secondStep);\n    }\n  };\n\n  $scope.toggleMeridian = function() {\n    var minutes = getMinutesFromTemplate(),\n        hours = getHoursFromTemplate();\n\n    if (!$scope.noToggleMeridian()) {\n      if (angular.isDefined(minutes) && angular.isDefined(hours)) {\n        addSecondsToSelected(12 * 60 * (selected.getHours() < 12 ? 60 : -60));\n      } else {\n        $scope.meridian = $scope.meridian === meridians[0] ? meridians[1] : meridians[0];\n      }\n    }\n  };\n\n  $scope.blur = function() {\n    ngModelCtrl.$setTouched();\n  };\n\n  $scope.$on('$destroy', function() {\n    while (watchers.length) {\n      watchers.shift()();\n    }\n  });\n}])\n\n.directive('uibTimepicker', ['uibTimepickerConfig', function(uibTimepickerConfig) {\n  return {\n    require: ['uibTimepicker', '?^ngModel'],\n    restrict: 'A',\n    controller: 'UibTimepickerController',\n    controllerAs: 'timepicker',\n    scope: {},\n    templateUrl: function(element, attrs) {\n      return attrs.templateUrl || uibTimepickerConfig.templateUrl;\n    },\n    link: function(scope, element, attrs, ctrls) {\n      var timepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if (ngModelCtrl) {\n        timepickerCtrl.init(ngModelCtrl, element.find('input'));\n      }\n    }\n  };\n}]);\n\nangular.module('ui.bootstrap.typeahead', ['ui.bootstrap.debounce', 'ui.bootstrap.position'])\n\n/**\n * A helper service that can parse typeahead's syntax (string provided by users)\n * Extracted to a separate service for ease of unit testing\n */\n  .factory('uibTypeaheadParser', ['$parse', function($parse) {\n    //                      000001111111100000000000002222222200000000000000003333333333333330000000000044444444000\n    var TYPEAHEAD_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w\\d]*))\\s+in\\s+([\\s\\S]+?)$/;\n    return {\n      parse: function(input) {\n        var match = input.match(TYPEAHEAD_REGEXP);\n        if (!match) {\n          throw new Error(\n            'Expected typeahead specification in form of \"_modelValue_ (as _label_)? for _item_ in _collection_\"' +\n              ' but got \"' + input + '\".');\n        }\n\n        return {\n          itemName: match[3],\n          source: $parse(match[4]),\n          viewMapper: $parse(match[2] || match[1]),\n          modelMapper: $parse(match[1])\n        };\n      }\n    };\n  }])\n\n  .controller('UibTypeaheadController', ['$scope', '$element', '$attrs', '$compile', '$parse', '$q', '$timeout', '$document', '$window', '$rootScope', '$$debounce', '$uibPosition', 'uibTypeaheadParser',\n    function(originalScope, element, attrs, $compile, $parse, $q, $timeout, $document, $window, $rootScope, $$debounce, $position, typeaheadParser) {\n    var HOT_KEYS = [9, 13, 27, 38, 40];\n    var eventDebounceTime = 200;\n    var modelCtrl, ngModelOptions;\n    //SUPPORTED ATTRIBUTES (OPTIONS)\n\n    //minimal no of characters that needs to be entered before typeahead kicks-in\n    var minLength = originalScope.$eval(attrs.typeaheadMinLength);\n    if (!minLength && minLength !== 0) {\n      minLength = 1;\n    }\n\n    originalScope.$watch(attrs.typeaheadMinLength, function (newVal) {\n        minLength = !newVal && newVal !== 0 ? 1 : newVal;\n    });\n\n    //minimal wait time after last character typed before typeahead kicks-in\n    var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0;\n\n    //should it restrict model values to the ones selected from the popup only?\n    var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false;\n    originalScope.$watch(attrs.typeaheadEditable, function (newVal) {\n      isEditable = newVal !== false;\n    });\n\n    //binding to a variable that indicates if matches are being retrieved asynchronously\n    var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop;\n\n    //a function to determine if an event should cause selection\n    var isSelectEvent = attrs.typeaheadShouldSelect ? $parse(attrs.typeaheadShouldSelect) : function(scope, vals) {\n      var evt = vals.$event;\n      return evt.which === 13 || evt.which === 9;\n    };\n\n    //a callback executed when a match is selected\n    var onSelectCallback = $parse(attrs.typeaheadOnSelect);\n\n    //should it select highlighted popup value when losing focus?\n    var isSelectOnBlur = angular.isDefined(attrs.typeaheadSelectOnBlur) ? originalScope.$eval(attrs.typeaheadSelectOnBlur) : false;\n\n    //binding to a variable that indicates if there were no results after the query is completed\n    var isNoResultsSetter = $parse(attrs.typeaheadNoResults).assign || angular.noop;\n\n    var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined;\n\n    var appendToBody = attrs.typeaheadAppendToBody ? originalScope.$eval(attrs.typeaheadAppendToBody) : false;\n\n    var appendTo = attrs.typeaheadAppendTo ?\n      originalScope.$eval(attrs.typeaheadAppendTo) : null;\n\n    var focusFirst = originalScope.$eval(attrs.typeaheadFocusFirst) !== false;\n\n    //If input matches an item of the list exactly, select it automatically\n    var selectOnExact = attrs.typeaheadSelectOnExact ? originalScope.$eval(attrs.typeaheadSelectOnExact) : false;\n\n    //binding to a variable that indicates if dropdown is open\n    var isOpenSetter = $parse(attrs.typeaheadIsOpen).assign || angular.noop;\n\n    var showHint = originalScope.$eval(attrs.typeaheadShowHint) || false;\n\n    //INTERNAL VARIABLES\n\n    //model setter executed upon match selection\n    var parsedModel = $parse(attrs.ngModel);\n    var invokeModelSetter = $parse(attrs.ngModel + '($$$p)');\n    var $setModelValue = function(scope, newValue) {\n      if (angular.isFunction(parsedModel(originalScope)) &&\n        ngModelOptions && ngModelOptions.$options && ngModelOptions.$options.getterSetter) {\n        return invokeModelSetter(scope, {$$$p: newValue});\n      }\n\n      return parsedModel.assign(scope, newValue);\n    };\n\n    //expressions used by typeahead\n    var parserResult = typeaheadParser.parse(attrs.uibTypeahead);\n\n    var hasFocus;\n\n    //Used to avoid bug in iOS webview where iOS keyboard does not fire\n    //mousedown & mouseup events\n    //Issue #3699\n    var selected;\n\n    //create a child scope for the typeahead directive so we are not polluting original scope\n    //with typeahead-specific data (matches, query etc.)\n    var scope = originalScope.$new();\n    var offDestroy = originalScope.$on('$destroy', function() {\n      scope.$destroy();\n    });\n    scope.$on('$destroy', offDestroy);\n\n    // WAI-ARIA\n    var popupId = 'typeahead-' + scope.$id + '-' + Math.floor(Math.random() * 10000);\n    element.attr({\n      'aria-autocomplete': 'list',\n      'aria-expanded': false,\n      'aria-owns': popupId\n    });\n\n    var inputsContainer, hintInputElem;\n    //add read-only input to show hint\n    if (showHint) {\n      inputsContainer = angular.element('<div></div>');\n      inputsContainer.css('position', 'relative');\n      element.after(inputsContainer);\n      hintInputElem = element.clone();\n      hintInputElem.attr('placeholder', '');\n      hintInputElem.attr('tabindex', '-1');\n      hintInputElem.val('');\n      hintInputElem.css({\n        'position': 'absolute',\n        'top': '0px',\n        'left': '0px',\n        'border-color': 'transparent',\n        'box-shadow': 'none',\n        'opacity': 1,\n        'background': 'none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255)',\n        'color': '#999'\n      });\n      element.css({\n        'position': 'relative',\n        'vertical-align': 'top',\n        'background-color': 'transparent'\n      });\n\n      if (hintInputElem.attr('id')) {\n        hintInputElem.removeAttr('id'); // remove duplicate id if present.\n      }\n      inputsContainer.append(hintInputElem);\n      hintInputElem.after(element);\n    }\n\n    //pop-up element used to display matches\n    var popUpEl = angular.element('<div uib-typeahead-popup></div>');\n    popUpEl.attr({\n      id: popupId,\n      matches: 'matches',\n      active: 'activeIdx',\n      select: 'select(activeIdx, evt)',\n      'move-in-progress': 'moveInProgress',\n      query: 'query',\n      position: 'position',\n      'assign-is-open': 'assignIsOpen(isOpen)',\n      debounce: 'debounceUpdate'\n    });\n    //custom item template\n    if (angular.isDefined(attrs.typeaheadTemplateUrl)) {\n      popUpEl.attr('template-url', attrs.typeaheadTemplateUrl);\n    }\n\n    if (angular.isDefined(attrs.typeaheadPopupTemplateUrl)) {\n      popUpEl.attr('popup-template-url', attrs.typeaheadPopupTemplateUrl);\n    }\n\n    var resetHint = function() {\n      if (showHint) {\n        hintInputElem.val('');\n      }\n    };\n\n    var resetMatches = function() {\n      scope.matches = [];\n      scope.activeIdx = -1;\n      element.attr('aria-expanded', false);\n      resetHint();\n    };\n\n    var getMatchId = function(index) {\n      return popupId + '-option-' + index;\n    };\n\n    // Indicate that the specified match is the active (pre-selected) item in the list owned by this typeahead.\n    // This attribute is added or removed automatically when the `activeIdx` changes.\n    scope.$watch('activeIdx', function(index) {\n      if (index < 0) {\n        element.removeAttr('aria-activedescendant');\n      } else {\n        element.attr('aria-activedescendant', getMatchId(index));\n      }\n    });\n\n    var inputIsExactMatch = function(inputValue, index) {\n      if (scope.matches.length > index && inputValue) {\n        return inputValue.toUpperCase() === scope.matches[index].label.toUpperCase();\n      }\n\n      return false;\n    };\n\n    var getMatchesAsync = function(inputValue, evt) {\n      var locals = {$viewValue: inputValue};\n      isLoadingSetter(originalScope, true);\n      isNoResultsSetter(originalScope, false);\n      $q.when(parserResult.source(originalScope, locals)).then(function(matches) {\n        //it might happen that several async queries were in progress if a user were typing fast\n        //but we are interested only in responses that correspond to the current view value\n        var onCurrentRequest = inputValue === modelCtrl.$viewValue;\n        if (onCurrentRequest && hasFocus) {\n          if (matches && matches.length > 0) {\n            scope.activeIdx = focusFirst ? 0 : -1;\n            isNoResultsSetter(originalScope, false);\n            scope.matches.length = 0;\n\n            //transform labels\n            for (var i = 0; i < matches.length; i++) {\n              locals[parserResult.itemName] = matches[i];\n              scope.matches.push({\n                id: getMatchId(i),\n                label: parserResult.viewMapper(scope, locals),\n                model: matches[i]\n              });\n            }\n\n            scope.query = inputValue;\n            //position pop-up with matches - we need to re-calculate its position each time we are opening a window\n            //with matches as a pop-up might be absolute-positioned and position of an input might have changed on a page\n            //due to other elements being rendered\n            recalculatePosition();\n\n            element.attr('aria-expanded', true);\n\n            //Select the single remaining option if user input matches\n            if (selectOnExact && scope.matches.length === 1 && inputIsExactMatch(inputValue, 0)) {\n              if (angular.isNumber(scope.debounceUpdate) || angular.isObject(scope.debounceUpdate)) {\n                $$debounce(function() {\n                  scope.select(0, evt);\n                }, angular.isNumber(scope.debounceUpdate) ? scope.debounceUpdate : scope.debounceUpdate['default']);\n              } else {\n                scope.select(0, evt);\n              }\n            }\n\n            if (showHint) {\n              var firstLabel = scope.matches[0].label;\n              if (angular.isString(inputValue) &&\n                inputValue.length > 0 &&\n                firstLabel.slice(0, inputValue.length).toUpperCase() === inputValue.toUpperCase()) {\n                hintInputElem.val(inputValue + firstLabel.slice(inputValue.length));\n              } else {\n                hintInputElem.val('');\n              }\n            }\n          } else {\n            resetMatches();\n            isNoResultsSetter(originalScope, true);\n          }\n        }\n        if (onCurrentRequest) {\n          isLoadingSetter(originalScope, false);\n        }\n      }, function() {\n        resetMatches();\n        isLoadingSetter(originalScope, false);\n        isNoResultsSetter(originalScope, true);\n      });\n    };\n\n    // bind events only if appendToBody params exist - performance feature\n    if (appendToBody) {\n      angular.element($window).on('resize', fireRecalculating);\n      $document.find('body').on('scroll', fireRecalculating);\n    }\n\n    // Declare the debounced function outside recalculating for\n    // proper debouncing\n    var debouncedRecalculate = $$debounce(function() {\n      // if popup is visible\n      if (scope.matches.length) {\n        recalculatePosition();\n      }\n\n      scope.moveInProgress = false;\n    }, eventDebounceTime);\n\n    // Default progress type\n    scope.moveInProgress = false;\n\n    function fireRecalculating() {\n      if (!scope.moveInProgress) {\n        scope.moveInProgress = true;\n        scope.$digest();\n      }\n\n      debouncedRecalculate();\n    }\n\n    // recalculate actual position and set new values to scope\n    // after digest loop is popup in right position\n    function recalculatePosition() {\n      scope.position = appendToBody ? $position.offset(element) : $position.position(element);\n      scope.position.top += element.prop('offsetHeight');\n    }\n\n    //we need to propagate user's query so we can higlight matches\n    scope.query = undefined;\n\n    //Declare the timeout promise var outside the function scope so that stacked calls can be cancelled later\n    var timeoutPromise;\n\n    var scheduleSearchWithTimeout = function(inputValue) {\n      timeoutPromise = $timeout(function() {\n        getMatchesAsync(inputValue);\n      }, waitTime);\n    };\n\n    var cancelPreviousTimeout = function() {\n      if (timeoutPromise) {\n        $timeout.cancel(timeoutPromise);\n      }\n    };\n\n    resetMatches();\n\n    scope.assignIsOpen = function (isOpen) {\n      isOpenSetter(originalScope, isOpen);\n    };\n\n    scope.select = function(activeIdx, evt) {\n      //called from within the $digest() cycle\n      var locals = {};\n      var model, item;\n\n      selected = true;\n      locals[parserResult.itemName] = item = scope.matches[activeIdx].model;\n      model = parserResult.modelMapper(originalScope, locals);\n      $setModelValue(originalScope, model);\n      modelCtrl.$setValidity('editable', true);\n      modelCtrl.$setValidity('parse', true);\n\n      onSelectCallback(originalScope, {\n        $item: item,\n        $model: model,\n        $label: parserResult.viewMapper(originalScope, locals),\n        $event: evt\n      });\n\n      resetMatches();\n\n      //return focus to the input element if a match was selected via a mouse click event\n      // use timeout to avoid $rootScope:inprog error\n      if (scope.$eval(attrs.typeaheadFocusOnSelect) !== false) {\n        $timeout(function() { element[0].focus(); }, 0, false);\n      }\n    };\n\n    //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27)\n    element.on('keydown', function(evt) {\n      //typeahead is open and an \"interesting\" key was pressed\n      if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) {\n        return;\n      }\n\n      var shouldSelect = isSelectEvent(originalScope, {$event: evt});\n\n      /**\n       * if there's nothing selected (i.e. focusFirst) and enter or tab is hit\n       * or\n       * shift + tab is pressed to bring focus to the previous element\n       * then clear the results\n       */\n      if (scope.activeIdx === -1 && shouldSelect || evt.which === 9 && !!evt.shiftKey) {\n        resetMatches();\n        scope.$digest();\n        return;\n      }\n\n      evt.preventDefault();\n      var target;\n      switch (evt.which) {\n        case 27: // escape\n          evt.stopPropagation();\n\n          resetMatches();\n          originalScope.$digest();\n          break;\n        case 38: // up arrow\n          scope.activeIdx = (scope.activeIdx > 0 ? scope.activeIdx : scope.matches.length) - 1;\n          scope.$digest();\n          target = popUpEl[0].querySelectorAll('.uib-typeahead-match')[scope.activeIdx];\n          target.parentNode.scrollTop = target.offsetTop;\n          break;\n        case 40: // down arrow\n          scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length;\n          scope.$digest();\n          target = popUpEl[0].querySelectorAll('.uib-typeahead-match')[scope.activeIdx];\n          target.parentNode.scrollTop = target.offsetTop;\n          break;\n        default:\n          if (shouldSelect) {\n            scope.$apply(function() {\n              if (angular.isNumber(scope.debounceUpdate) || angular.isObject(scope.debounceUpdate)) {\n                $$debounce(function() {\n                  scope.select(scope.activeIdx, evt);\n                }, angular.isNumber(scope.debounceUpdate) ? scope.debounceUpdate : scope.debounceUpdate['default']);\n              } else {\n                scope.select(scope.activeIdx, evt);\n              }\n            });\n          }\n      }\n    });\n\n    element.bind('focus', function (evt) {\n      hasFocus = true;\n      if (minLength === 0 && !modelCtrl.$viewValue) {\n        $timeout(function() {\n          getMatchesAsync(modelCtrl.$viewValue, evt);\n        }, 0);\n      }\n    });\n\n    element.bind('blur', function(evt) {\n      if (isSelectOnBlur && scope.matches.length && scope.activeIdx !== -1 && !selected) {\n        selected = true;\n        scope.$apply(function() {\n          if (angular.isObject(scope.debounceUpdate) && angular.isNumber(scope.debounceUpdate.blur)) {\n            $$debounce(function() {\n              scope.select(scope.activeIdx, evt);\n            }, scope.debounceUpdate.blur);\n          } else {\n            scope.select(scope.activeIdx, evt);\n          }\n        });\n      }\n      if (!isEditable && modelCtrl.$error.editable) {\n        modelCtrl.$setViewValue();\n        scope.$apply(function() {\n          // Reset validity as we are clearing\n          modelCtrl.$setValidity('editable', true);\n          modelCtrl.$setValidity('parse', true);\n        });\n        element.val('');\n      }\n      hasFocus = false;\n      selected = false;\n    });\n\n    // Keep reference to click handler to unbind it.\n    var dismissClickHandler = function(evt) {\n      // Issue #3973\n      // Firefox treats right click as a click on document\n      if (element[0] !== evt.target && evt.which !== 3 && scope.matches.length !== 0) {\n        resetMatches();\n        if (!$rootScope.$$phase) {\n          originalScope.$digest();\n        }\n      }\n    };\n\n    $document.on('click', dismissClickHandler);\n\n    originalScope.$on('$destroy', function() {\n      $document.off('click', dismissClickHandler);\n      if (appendToBody || appendTo) {\n        $popup.remove();\n      }\n\n      if (appendToBody) {\n        angular.element($window).off('resize', fireRecalculating);\n        $document.find('body').off('scroll', fireRecalculating);\n      }\n      // Prevent jQuery cache memory leak\n      popUpEl.remove();\n\n      if (showHint) {\n          inputsContainer.remove();\n      }\n    });\n\n    var $popup = $compile(popUpEl)(scope);\n\n    if (appendToBody) {\n      $document.find('body').append($popup);\n    } else if (appendTo) {\n      angular.element(appendTo).eq(0).append($popup);\n    } else {\n      element.after($popup);\n    }\n\n    this.init = function(_modelCtrl, _ngModelOptions) {\n      modelCtrl = _modelCtrl;\n      ngModelOptions = _ngModelOptions;\n\n      scope.debounceUpdate = modelCtrl.$options && $parse(modelCtrl.$options.debounce)(originalScope);\n\n      //plug into $parsers pipeline to open a typeahead on view changes initiated from DOM\n      //$parsers kick-in on all the changes coming from the view as well as manually triggered by $setViewValue\n      modelCtrl.$parsers.unshift(function(inputValue) {\n        hasFocus = true;\n\n        if (minLength === 0 || inputValue && inputValue.length >= minLength) {\n          if (waitTime > 0) {\n            cancelPreviousTimeout();\n            scheduleSearchWithTimeout(inputValue);\n          } else {\n            getMatchesAsync(inputValue);\n          }\n        } else {\n          isLoadingSetter(originalScope, false);\n          cancelPreviousTimeout();\n          resetMatches();\n        }\n\n        if (isEditable) {\n          return inputValue;\n        }\n\n        if (!inputValue) {\n          // Reset in case user had typed something previously.\n          modelCtrl.$setValidity('editable', true);\n          return null;\n        }\n\n        modelCtrl.$setValidity('editable', false);\n        return undefined;\n      });\n\n      modelCtrl.$formatters.push(function(modelValue) {\n        var candidateViewValue, emptyViewValue;\n        var locals = {};\n\n        // The validity may be set to false via $parsers (see above) if\n        // the model is restricted to selected values. If the model\n        // is set manually it is considered to be valid.\n        if (!isEditable) {\n          modelCtrl.$setValidity('editable', true);\n        }\n\n        if (inputFormatter) {\n          locals.$model = modelValue;\n          return inputFormatter(originalScope, locals);\n        }\n\n        //it might happen that we don't have enough info to properly render input value\n        //we need to check for this situation and simply return model value if we can't apply custom formatting\n        locals[parserResult.itemName] = modelValue;\n        candidateViewValue = parserResult.viewMapper(originalScope, locals);\n        locals[parserResult.itemName] = undefined;\n        emptyViewValue = parserResult.viewMapper(originalScope, locals);\n\n        return candidateViewValue !== emptyViewValue ? candidateViewValue : modelValue;\n      });\n    };\n  }])\n\n  .directive('uibTypeahead', function() {\n    return {\n      controller: 'UibTypeaheadController',\n      require: ['ngModel', '^?ngModelOptions', 'uibTypeahead'],\n      link: function(originalScope, element, attrs, ctrls) {\n        ctrls[2].init(ctrls[0], ctrls[1]);\n      }\n    };\n  })\n\n  .directive('uibTypeaheadPopup', ['$$debounce', function($$debounce) {\n    return {\n      scope: {\n        matches: '=',\n        query: '=',\n        active: '=',\n        position: '&',\n        moveInProgress: '=',\n        select: '&',\n        assignIsOpen: '&',\n        debounce: '&'\n      },\n      replace: true,\n      templateUrl: function(element, attrs) {\n        return attrs.popupTemplateUrl || 'uib/template/typeahead/typeahead-popup.html';\n      },\n      link: function(scope, element, attrs) {\n        scope.templateUrl = attrs.templateUrl;\n\n        scope.isOpen = function() {\n          var isDropdownOpen = scope.matches.length > 0;\n          scope.assignIsOpen({ isOpen: isDropdownOpen });\n          return isDropdownOpen;\n        };\n\n        scope.isActive = function(matchIdx) {\n          return scope.active === matchIdx;\n        };\n\n        scope.selectActive = function(matchIdx) {\n          scope.active = matchIdx;\n        };\n\n        scope.selectMatch = function(activeIdx, evt) {\n          var debounce = scope.debounce();\n          if (angular.isNumber(debounce) || angular.isObject(debounce)) {\n            $$debounce(function() {\n              scope.select({activeIdx: activeIdx, evt: evt});\n            }, angular.isNumber(debounce) ? debounce : debounce['default']);\n          } else {\n            scope.select({activeIdx: activeIdx, evt: evt});\n          }\n        };\n      }\n    };\n  }])\n\n  .directive('uibTypeaheadMatch', ['$templateRequest', '$compile', '$parse', function($templateRequest, $compile, $parse) {\n    return {\n      scope: {\n        index: '=',\n        match: '=',\n        query: '='\n      },\n      link: function(scope, element, attrs) {\n        var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'uib/template/typeahead/typeahead-match.html';\n        $templateRequest(tplUrl).then(function(tplContent) {\n          var tplEl = angular.element(tplContent.trim());\n          element.replaceWith(tplEl);\n          $compile(tplEl)(scope);\n        });\n      }\n    };\n  }])\n\n  .filter('uibTypeaheadHighlight', ['$sce', '$injector', '$log', function($sce, $injector, $log) {\n    var isSanitizePresent;\n    isSanitizePresent = $injector.has('$sanitize');\n\n    function escapeRegexp(queryToEscape) {\n      // Regex: capture the whole query string and replace it with the string that will be used to match\n      // the results, for example if the capture is \"a\" the result will be \\a\n      return queryToEscape.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n    }\n\n    function containsHtml(matchItem) {\n      return /<.*>/g.test(matchItem);\n    }\n\n    return function(matchItem, query) {\n      if (!isSanitizePresent && containsHtml(matchItem)) {\n        $log.warn('Unsafe use of typeahead please use ngSanitize'); // Warn the user about the danger\n      }\n      matchItem = query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '<strong>$&</strong>') : matchItem; // Replaces the capture string with a the same string inside of a \"strong\" tag\n      if (!isSanitizePresent) {\n        matchItem = $sce.trustAsHtml(matchItem); // If $sanitize is not present we pack the string in a $sce object for the ng-bind-html directive\n      }\n      return matchItem;\n    };\n  }]);\n\nangular.module(\"uib/template/accordion/accordion-group.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/accordion/accordion-group.html\",\n    \"<div role=\\\"tab\\\" id=\\\"{{::headingId}}\\\" aria-selected=\\\"{{isOpen}}\\\" class=\\\"panel-heading\\\" ng-keypress=\\\"toggleOpen($event)\\\">\\n\" +\n    \"  <h4 class=\\\"panel-title\\\">\\n\" +\n    \"    <a role=\\\"button\\\" data-toggle=\\\"collapse\\\" href aria-expanded=\\\"{{isOpen}}\\\" aria-controls=\\\"{{::panelId}}\\\" tabindex=\\\"0\\\" class=\\\"accordion-toggle\\\" ng-click=\\\"toggleOpen()\\\" uib-accordion-transclude=\\\"heading\\\" ng-disabled=\\\"isDisabled\\\" uib-tabindex-toggle><span uib-accordion-header ng-class=\\\"{'text-muted': isDisabled}\\\">{{heading}}</span></a>\\n\" +\n    \"  </h4>\\n\" +\n    \"</div>\\n\" +\n    \"<div id=\\\"{{::panelId}}\\\" aria-labelledby=\\\"{{::headingId}}\\\" aria-hidden=\\\"{{!isOpen}}\\\" role=\\\"tabpanel\\\" class=\\\"panel-collapse collapse\\\" uib-collapse=\\\"!isOpen\\\">\\n\" +\n    \"  <div class=\\\"panel-body\\\" ng-transclude></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/accordion/accordion.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/accordion/accordion.html\",\n    \"<div role=\\\"tablist\\\" class=\\\"panel-group\\\" ng-transclude></div>\");\n}]);\n\nangular.module(\"uib/template/alert/alert.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/alert/alert.html\",\n    \"<button ng-show=\\\"closeable\\\" type=\\\"button\\\" class=\\\"close\\\" ng-click=\\\"close({$event: $event})\\\">\\n\" +\n    \"  <span aria-hidden=\\\"true\\\">&times;</span>\\n\" +\n    \"  <span class=\\\"sr-only\\\">Close</span>\\n\" +\n    \"</button>\\n\" +\n    \"<div ng-transclude></div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/carousel/carousel.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/carousel/carousel.html\",\n    \"<div class=\\\"carousel-inner\\\" ng-transclude></div>\\n\" +\n    \"<a role=\\\"button\\\" href class=\\\"left carousel-control\\\" ng-click=\\\"prev()\\\" ng-class=\\\"{ disabled: isPrevDisabled() }\\\" ng-show=\\\"slides.length > 1\\\">\\n\" +\n    \"  <span aria-hidden=\\\"true\\\" class=\\\"glyphicon glyphicon-chevron-left\\\"></span>\\n\" +\n    \"  <span class=\\\"sr-only\\\">previous</span>\\n\" +\n    \"</a>\\n\" +\n    \"<a role=\\\"button\\\" href class=\\\"right carousel-control\\\" ng-click=\\\"next()\\\" ng-class=\\\"{ disabled: isNextDisabled() }\\\" ng-show=\\\"slides.length > 1\\\">\\n\" +\n    \"  <span aria-hidden=\\\"true\\\" class=\\\"glyphicon glyphicon-chevron-right\\\"></span>\\n\" +\n    \"  <span class=\\\"sr-only\\\">next</span>\\n\" +\n    \"</a>\\n\" +\n    \"<ol class=\\\"carousel-indicators\\\" ng-show=\\\"slides.length > 1\\\">\\n\" +\n    \"  <li ng-repeat=\\\"slide in slides | orderBy:indexOfSlide track by $index\\\" ng-class=\\\"{ active: isActive(slide) }\\\" ng-click=\\\"select(slide)\\\">\\n\" +\n    \"    <span class=\\\"sr-only\\\">slide {{ $index + 1 }} of {{ slides.length }}<span ng-if=\\\"isActive(slide)\\\">, currently active</span></span>\\n\" +\n    \"  </li>\\n\" +\n    \"</ol>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/carousel/slide.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/carousel/slide.html\",\n    \"<div class=\\\"text-center\\\" ng-transclude></div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/datepicker.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/datepicker/datepicker.html\",\n    \"<div ng-switch=\\\"datepickerMode\\\">\\n\" +\n    \"  <div uib-daypicker ng-switch-when=\\\"day\\\" tabindex=\\\"0\\\" class=\\\"uib-daypicker\\\"></div>\\n\" +\n    \"  <div uib-monthpicker ng-switch-when=\\\"month\\\" tabindex=\\\"0\\\" class=\\\"uib-monthpicker\\\"></div>\\n\" +\n    \"  <div uib-yearpicker ng-switch-when=\\\"year\\\" tabindex=\\\"0\\\" class=\\\"uib-yearpicker\\\"></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/day.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/datepicker/day.html\",\n    \"<table role=\\\"grid\\\" aria-labelledby=\\\"{{::uniqueId}}-title\\\" aria-activedescendant=\\\"{{activeDateId}}\\\">\\n\" +\n    \"  <thead>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-left uib-left\\\" ng-click=\\\"move(-1)\\\" tabindex=\\\"-1\\\"><i aria-hidden=\\\"true\\\" class=\\\"glyphicon glyphicon-chevron-left\\\"></i><span class=\\\"sr-only\\\">previous</span></button></th>\\n\" +\n    \"      <th colspan=\\\"{{::5 + showWeeks}}\\\"><button id=\\\"{{::uniqueId}}-title\\\" role=\\\"heading\\\" aria-live=\\\"assertive\\\" aria-atomic=\\\"true\\\" type=\\\"button\\\" class=\\\"btn btn-default btn-sm uib-title\\\" ng-click=\\\"toggleMode()\\\" ng-disabled=\\\"datepickerMode === maxMode\\\" tabindex=\\\"-1\\\"><strong>{{title}}</strong></button></th>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-right uib-right\\\" ng-click=\\\"move(1)\\\" tabindex=\\\"-1\\\"><i aria-hidden=\\\"true\\\" class=\\\"glyphicon glyphicon-chevron-right\\\"></i><span class=\\\"sr-only\\\">next</span></button></th>\\n\" +\n    \"    </tr>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <th ng-if=\\\"showWeeks\\\" class=\\\"text-center\\\"></th>\\n\" +\n    \"      <th ng-repeat=\\\"label in ::labels track by $index\\\" class=\\\"text-center\\\"><small aria-label=\\\"{{::label.full}}\\\">{{::label.abbr}}</small></th>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </thead>\\n\" +\n    \"  <tbody>\\n\" +\n    \"    <tr class=\\\"uib-weeks\\\" ng-repeat=\\\"row in rows track by $index\\\" role=\\\"row\\\">\\n\" +\n    \"      <td ng-if=\\\"showWeeks\\\" class=\\\"text-center h6\\\"><em>{{ weekNumbers[$index] }}</em></td>\\n\" +\n    \"      <td ng-repeat=\\\"dt in row\\\" class=\\\"uib-day text-center\\\" role=\\\"gridcell\\\"\\n\" +\n    \"        id=\\\"{{::dt.uid}}\\\"\\n\" +\n    \"        ng-class=\\\"::dt.customClass\\\">\\n\" +\n    \"        <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\"\\n\" +\n    \"          uib-is-class=\\\"\\n\" +\n    \"            'btn-info' for selectedDt,\\n\" +\n    \"            'active' for activeDt\\n\" +\n    \"            on dt\\\"\\n\" +\n    \"          ng-click=\\\"select(dt.date)\\\"\\n\" +\n    \"          ng-disabled=\\\"::dt.disabled\\\"\\n\" +\n    \"          tabindex=\\\"-1\\\"><span ng-class=\\\"::{'text-muted': dt.secondary, 'text-info': dt.current}\\\">{{::dt.label}}</span></button>\\n\" +\n    \"      </td>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </tbody>\\n\" +\n    \"</table>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/month.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/datepicker/month.html\",\n    \"<table role=\\\"grid\\\" aria-labelledby=\\\"{{::uniqueId}}-title\\\" aria-activedescendant=\\\"{{activeDateId}}\\\">\\n\" +\n    \"  <thead>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-left uib-left\\\" ng-click=\\\"move(-1)\\\" tabindex=\\\"-1\\\"><i aria-hidden=\\\"true\\\" class=\\\"glyphicon glyphicon-chevron-left\\\"></i><span class=\\\"sr-only\\\">previous</span></button></th>\\n\" +\n    \"      <th colspan=\\\"{{::yearHeaderColspan}}\\\"><button id=\\\"{{::uniqueId}}-title\\\" role=\\\"heading\\\" aria-live=\\\"assertive\\\" aria-atomic=\\\"true\\\" type=\\\"button\\\" class=\\\"btn btn-default btn-sm uib-title\\\" ng-click=\\\"toggleMode()\\\" ng-disabled=\\\"datepickerMode === maxMode\\\" tabindex=\\\"-1\\\"><strong>{{title}}</strong></button></th>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-right uib-right\\\" ng-click=\\\"move(1)\\\" tabindex=\\\"-1\\\"><i aria-hidden=\\\"true\\\" class=\\\"glyphicon glyphicon-chevron-right\\\"></i><span class=\\\"sr-only\\\">next</span></i></button></th>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </thead>\\n\" +\n    \"  <tbody>\\n\" +\n    \"    <tr class=\\\"uib-months\\\" ng-repeat=\\\"row in rows track by $index\\\" role=\\\"row\\\">\\n\" +\n    \"      <td ng-repeat=\\\"dt in row\\\" class=\\\"uib-month text-center\\\" role=\\\"gridcell\\\"\\n\" +\n    \"        id=\\\"{{::dt.uid}}\\\"\\n\" +\n    \"        ng-class=\\\"::dt.customClass\\\">\\n\" +\n    \"        <button type=\\\"button\\\" class=\\\"btn btn-default\\\"\\n\" +\n    \"          uib-is-class=\\\"\\n\" +\n    \"            'btn-info' for selectedDt,\\n\" +\n    \"            'active' for activeDt\\n\" +\n    \"            on dt\\\"\\n\" +\n    \"          ng-click=\\\"select(dt.date)\\\"\\n\" +\n    \"          ng-disabled=\\\"::dt.disabled\\\"\\n\" +\n    \"          tabindex=\\\"-1\\\"><span ng-class=\\\"::{'text-info': dt.current}\\\">{{::dt.label}}</span></button>\\n\" +\n    \"      </td>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </tbody>\\n\" +\n    \"</table>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/year.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/datepicker/year.html\",\n    \"<table role=\\\"grid\\\" aria-labelledby=\\\"{{::uniqueId}}-title\\\" aria-activedescendant=\\\"{{activeDateId}}\\\">\\n\" +\n    \"  <thead>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-left uib-left\\\" ng-click=\\\"move(-1)\\\" tabindex=\\\"-1\\\"><i aria-hidden=\\\"true\\\" class=\\\"glyphicon glyphicon-chevron-left\\\"></i><span class=\\\"sr-only\\\">previous</span></button></th>\\n\" +\n    \"      <th colspan=\\\"{{::columns - 2}}\\\"><button id=\\\"{{::uniqueId}}-title\\\" role=\\\"heading\\\" aria-live=\\\"assertive\\\" aria-atomic=\\\"true\\\" type=\\\"button\\\" class=\\\"btn btn-default btn-sm uib-title\\\" ng-click=\\\"toggleMode()\\\" ng-disabled=\\\"datepickerMode === maxMode\\\" tabindex=\\\"-1\\\"><strong>{{title}}</strong></button></th>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-right uib-right\\\" ng-click=\\\"move(1)\\\" tabindex=\\\"-1\\\"><i aria-hidden=\\\"true\\\" class=\\\"glyphicon glyphicon-chevron-right\\\"></i><span class=\\\"sr-only\\\">next</span></button></th>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </thead>\\n\" +\n    \"  <tbody>\\n\" +\n    \"    <tr class=\\\"uib-years\\\" ng-repeat=\\\"row in rows track by $index\\\" role=\\\"row\\\">\\n\" +\n    \"      <td ng-repeat=\\\"dt in row\\\" class=\\\"uib-year text-center\\\" role=\\\"gridcell\\\"\\n\" +\n    \"        id=\\\"{{::dt.uid}}\\\"\\n\" +\n    \"        ng-class=\\\"::dt.customClass\\\">\\n\" +\n    \"        <button type=\\\"button\\\" class=\\\"btn btn-default\\\"\\n\" +\n    \"          uib-is-class=\\\"\\n\" +\n    \"            'btn-info' for selectedDt,\\n\" +\n    \"            'active' for activeDt\\n\" +\n    \"            on dt\\\"\\n\" +\n    \"          ng-click=\\\"select(dt.date)\\\"\\n\" +\n    \"          ng-disabled=\\\"::dt.disabled\\\"\\n\" +\n    \"          tabindex=\\\"-1\\\"><span ng-class=\\\"::{'text-info': dt.current}\\\">{{::dt.label}}</span></button>\\n\" +\n    \"      </td>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </tbody>\\n\" +\n    \"</table>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/datepickerPopup/popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/datepickerPopup/popup.html\",\n    \"<ul role=\\\"presentation\\\" class=\\\"uib-datepicker-popup dropdown-menu uib-position-measure\\\" dropdown-nested ng-if=\\\"isOpen\\\" ng-keydown=\\\"keydown($event)\\\" ng-click=\\\"$event.stopPropagation()\\\">\\n\" +\n    \"  <li ng-transclude></li>\\n\" +\n    \"  <li ng-if=\\\"showButtonBar\\\" class=\\\"uib-button-bar\\\">\\n\" +\n    \"    <span class=\\\"btn-group pull-left\\\">\\n\" +\n    \"      <button type=\\\"button\\\" class=\\\"btn btn-sm btn-info uib-datepicker-current\\\" ng-click=\\\"select('today', $event)\\\" ng-disabled=\\\"isDisabled('today')\\\">{{ getText('current') }}</button>\\n\" +\n    \"      <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger uib-clear\\\" ng-click=\\\"select(null, $event)\\\">{{ getText('clear') }}</button>\\n\" +\n    \"    </span>\\n\" +\n    \"    <button type=\\\"button\\\" class=\\\"btn btn-sm btn-success pull-right uib-close\\\" ng-click=\\\"close($event)\\\">{{ getText('close') }}</button>\\n\" +\n    \"  </li>\\n\" +\n    \"</ul>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/modal/window.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/modal/window.html\",\n    \"<div class=\\\"modal-dialog {{size ? 'modal-' + size : ''}}\\\"><div class=\\\"modal-content\\\" uib-modal-transclude></div></div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/pager/pager.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/pager/pager.html\",\n    \"<li ng-class=\\\"{disabled: noPrevious()||ngDisabled, previous: align}\\\"><a href ng-click=\\\"selectPage(page - 1, $event)\\\" ng-disabled=\\\"noPrevious()||ngDisabled\\\" uib-tabindex-toggle>{{::getText('previous')}}</a></li>\\n\" +\n    \"<li ng-class=\\\"{disabled: noNext()||ngDisabled, next: align}\\\"><a href ng-click=\\\"selectPage(page + 1, $event)\\\" ng-disabled=\\\"noNext()||ngDisabled\\\" uib-tabindex-toggle>{{::getText('next')}}</a></li>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/pagination/pagination.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/pagination/pagination.html\",\n    \"<li ng-if=\\\"::boundaryLinks\\\" ng-class=\\\"{disabled: noPrevious()||ngDisabled}\\\" class=\\\"pagination-first\\\"><a href ng-click=\\\"selectPage(1, $event)\\\" ng-disabled=\\\"noPrevious()||ngDisabled\\\" uib-tabindex-toggle>{{::getText('first')}}</a></li>\\n\" +\n    \"<li ng-if=\\\"::directionLinks\\\" ng-class=\\\"{disabled: noPrevious()||ngDisabled}\\\" class=\\\"pagination-prev\\\"><a href ng-click=\\\"selectPage(page - 1, $event)\\\" ng-disabled=\\\"noPrevious()||ngDisabled\\\" uib-tabindex-toggle>{{::getText('previous')}}</a></li>\\n\" +\n    \"<li ng-repeat=\\\"page in pages track by $index\\\" ng-class=\\\"{active: page.active,disabled: ngDisabled&&!page.active}\\\" class=\\\"pagination-page\\\"><a href ng-click=\\\"selectPage(page.number, $event)\\\" ng-disabled=\\\"ngDisabled&&!page.active\\\" uib-tabindex-toggle>{{page.text}}</a></li>\\n\" +\n    \"<li ng-if=\\\"::directionLinks\\\" ng-class=\\\"{disabled: noNext()||ngDisabled}\\\" class=\\\"pagination-next\\\"><a href ng-click=\\\"selectPage(page + 1, $event)\\\" ng-disabled=\\\"noNext()||ngDisabled\\\" uib-tabindex-toggle>{{::getText('next')}}</a></li>\\n\" +\n    \"<li ng-if=\\\"::boundaryLinks\\\" ng-class=\\\"{disabled: noNext()||ngDisabled}\\\" class=\\\"pagination-last\\\"><a href ng-click=\\\"selectPage(totalPages, $event)\\\" ng-disabled=\\\"noNext()||ngDisabled\\\" uib-tabindex-toggle>{{::getText('last')}}</a></li>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/tooltip/tooltip-html-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/tooltip/tooltip-html-popup.html\",\n    \"<div class=\\\"tooltip-arrow\\\"></div>\\n\" +\n    \"<div class=\\\"tooltip-inner\\\" ng-bind-html=\\\"contentExp()\\\"></div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/tooltip/tooltip-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/tooltip/tooltip-popup.html\",\n    \"<div class=\\\"tooltip-arrow\\\"></div>\\n\" +\n    \"<div class=\\\"tooltip-inner\\\" ng-bind=\\\"content\\\"></div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/tooltip/tooltip-template-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/tooltip/tooltip-template-popup.html\",\n    \"<div class=\\\"tooltip-arrow\\\"></div>\\n\" +\n    \"<div class=\\\"tooltip-inner\\\"\\n\" +\n    \"  uib-tooltip-template-transclude=\\\"contentExp()\\\"\\n\" +\n    \"  tooltip-template-transclude-scope=\\\"originScope()\\\"></div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/popover/popover-html.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/popover/popover-html.html\",\n    \"<div class=\\\"arrow\\\"></div>\\n\" +\n    \"\\n\" +\n    \"<div class=\\\"popover-inner\\\">\\n\" +\n    \"    <h3 class=\\\"popover-title\\\" ng-bind=\\\"uibTitle\\\" ng-if=\\\"uibTitle\\\"></h3>\\n\" +\n    \"    <div class=\\\"popover-content\\\" ng-bind-html=\\\"contentExp()\\\"></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/popover/popover-template.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/popover/popover-template.html\",\n    \"<div class=\\\"arrow\\\"></div>\\n\" +\n    \"\\n\" +\n    \"<div class=\\\"popover-inner\\\">\\n\" +\n    \"    <h3 class=\\\"popover-title\\\" ng-bind=\\\"uibTitle\\\" ng-if=\\\"uibTitle\\\"></h3>\\n\" +\n    \"    <div class=\\\"popover-content\\\"\\n\" +\n    \"      uib-tooltip-template-transclude=\\\"contentExp()\\\"\\n\" +\n    \"      tooltip-template-transclude-scope=\\\"originScope()\\\"></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/popover/popover.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/popover/popover.html\",\n    \"<div class=\\\"arrow\\\"></div>\\n\" +\n    \"\\n\" +\n    \"<div class=\\\"popover-inner\\\">\\n\" +\n    \"    <h3 class=\\\"popover-title\\\" ng-bind=\\\"uibTitle\\\" ng-if=\\\"uibTitle\\\"></h3>\\n\" +\n    \"    <div class=\\\"popover-content\\\" ng-bind=\\\"content\\\"></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/progressbar/bar.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/progressbar/bar.html\",\n    \"<div class=\\\"progress-bar\\\" ng-class=\\\"type && 'progress-bar-' + type\\\" role=\\\"progressbar\\\" aria-valuenow=\\\"{{value}}\\\" aria-valuemin=\\\"0\\\" aria-valuemax=\\\"{{max}}\\\" ng-style=\\\"{width: (percent < 100 ? percent : 100) + '%'}\\\" aria-valuetext=\\\"{{percent | number:0}}%\\\" aria-labelledby=\\\"{{::title}}\\\" ng-transclude></div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/progressbar/progress.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/progressbar/progress.html\",\n    \"<div class=\\\"progress\\\" ng-transclude aria-labelledby=\\\"{{::title}}\\\"></div>\");\n}]);\n\nangular.module(\"uib/template/progressbar/progressbar.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/progressbar/progressbar.html\",\n    \"<div class=\\\"progress\\\">\\n\" +\n    \"  <div class=\\\"progress-bar\\\" ng-class=\\\"type && 'progress-bar-' + type\\\" role=\\\"progressbar\\\" aria-valuenow=\\\"{{value}}\\\" aria-valuemin=\\\"0\\\" aria-valuemax=\\\"{{max}}\\\" ng-style=\\\"{width: (percent < 100 ? percent : 100) + '%'}\\\" aria-valuetext=\\\"{{percent | number:0}}%\\\" aria-labelledby=\\\"{{::title}}\\\" ng-transclude></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/rating/rating.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/rating/rating.html\",\n    \"<span ng-mouseleave=\\\"reset()\\\" ng-keydown=\\\"onKeydown($event)\\\" tabindex=\\\"0\\\" role=\\\"slider\\\" aria-valuemin=\\\"0\\\" aria-valuemax=\\\"{{range.length}}\\\" aria-valuenow=\\\"{{value}}\\\" aria-valuetext=\\\"{{title}}\\\">\\n\" +\n    \"    <span ng-repeat-start=\\\"r in range track by $index\\\" class=\\\"sr-only\\\">({{ $index < value ? '*' : ' ' }})</span>\\n\" +\n    \"    <i ng-repeat-end ng-mouseenter=\\\"enter($index + 1)\\\" ng-click=\\\"rate($index + 1)\\\" class=\\\"glyphicon\\\" ng-class=\\\"$index < value && (r.stateOn || 'glyphicon-star') || (r.stateOff || 'glyphicon-star-empty')\\\" ng-attr-title=\\\"{{r.title}}\\\"></i>\\n\" +\n    \"</span>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/tabs/tab.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/tabs/tab.html\",\n    \"<li ng-class=\\\"[{active: active, disabled: disabled}, classes]\\\" class=\\\"uib-tab nav-item\\\">\\n\" +\n    \"  <a href ng-click=\\\"select($event)\\\" class=\\\"nav-link\\\" uib-tab-heading-transclude>{{heading}}</a>\\n\" +\n    \"</li>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/tabs/tabset.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/tabs/tabset.html\",\n    \"<div>\\n\" +\n    \"  <ul class=\\\"nav nav-{{tabset.type || 'tabs'}}\\\" ng-class=\\\"{'nav-stacked': vertical, 'nav-justified': justified}\\\" ng-transclude></ul>\\n\" +\n    \"  <div class=\\\"tab-content\\\">\\n\" +\n    \"    <div class=\\\"tab-pane\\\"\\n\" +\n    \"         ng-repeat=\\\"tab in tabset.tabs\\\"\\n\" +\n    \"         ng-class=\\\"{active: tabset.active === tab.index}\\\"\\n\" +\n    \"         uib-tab-content-transclude=\\\"tab\\\">\\n\" +\n    \"    </div>\\n\" +\n    \"  </div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/timepicker/timepicker.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/timepicker/timepicker.html\",\n    \"<table class=\\\"uib-timepicker\\\">\\n\" +\n    \"  <tbody>\\n\" +\n    \"    <tr class=\\\"text-center\\\" ng-show=\\\"::showSpinners\\\">\\n\" +\n    \"      <td class=\\\"uib-increment hours\\\"><a ng-click=\\\"incrementHours()\\\" ng-class=\\\"{disabled: noIncrementHours()}\\\" class=\\\"btn btn-link\\\" ng-disabled=\\\"noIncrementHours()\\\" tabindex=\\\"-1\\\"><span class=\\\"glyphicon glyphicon-chevron-up\\\"></span></a></td>\\n\" +\n    \"      <td>&nbsp;</td>\\n\" +\n    \"      <td class=\\\"uib-increment minutes\\\"><a ng-click=\\\"incrementMinutes()\\\" ng-class=\\\"{disabled: noIncrementMinutes()}\\\" class=\\\"btn btn-link\\\" ng-disabled=\\\"noIncrementMinutes()\\\" tabindex=\\\"-1\\\"><span class=\\\"glyphicon glyphicon-chevron-up\\\"></span></a></td>\\n\" +\n    \"      <td ng-show=\\\"showSeconds\\\">&nbsp;</td>\\n\" +\n    \"      <td ng-show=\\\"showSeconds\\\" class=\\\"uib-increment seconds\\\"><a ng-click=\\\"incrementSeconds()\\\" ng-class=\\\"{disabled: noIncrementSeconds()}\\\" class=\\\"btn btn-link\\\" ng-disabled=\\\"noIncrementSeconds()\\\" tabindex=\\\"-1\\\"><span class=\\\"glyphicon glyphicon-chevron-up\\\"></span></a></td>\\n\" +\n    \"      <td ng-show=\\\"showMeridian\\\"></td>\\n\" +\n    \"    </tr>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <td class=\\\"form-group uib-time hours\\\" ng-class=\\\"{'has-error': invalidHours}\\\">\\n\" +\n    \"        <input type=\\\"text\\\" placeholder=\\\"HH\\\" ng-model=\\\"hours\\\" ng-change=\\\"updateHours()\\\" class=\\\"form-control text-center\\\" ng-readonly=\\\"::readonlyInput\\\" maxlength=\\\"2\\\" tabindex=\\\"{{::tabindex}}\\\" ng-disabled=\\\"noIncrementHours()\\\" ng-blur=\\\"blur()\\\">\\n\" +\n    \"      </td>\\n\" +\n    \"      <td class=\\\"uib-separator\\\">:</td>\\n\" +\n    \"      <td class=\\\"form-group uib-time minutes\\\" ng-class=\\\"{'has-error': invalidMinutes}\\\">\\n\" +\n    \"        <input type=\\\"text\\\" placeholder=\\\"MM\\\" ng-model=\\\"minutes\\\" ng-change=\\\"updateMinutes()\\\" class=\\\"form-control text-center\\\" ng-readonly=\\\"::readonlyInput\\\" maxlength=\\\"2\\\" tabindex=\\\"{{::tabindex}}\\\" ng-disabled=\\\"noIncrementMinutes()\\\" ng-blur=\\\"blur()\\\">\\n\" +\n    \"      </td>\\n\" +\n    \"      <td ng-show=\\\"showSeconds\\\" class=\\\"uib-separator\\\">:</td>\\n\" +\n    \"      <td class=\\\"form-group uib-time seconds\\\" ng-class=\\\"{'has-error': invalidSeconds}\\\" ng-show=\\\"showSeconds\\\">\\n\" +\n    \"        <input type=\\\"text\\\" placeholder=\\\"SS\\\" ng-model=\\\"seconds\\\" ng-change=\\\"updateSeconds()\\\" class=\\\"form-control text-center\\\" ng-readonly=\\\"readonlyInput\\\" maxlength=\\\"2\\\" tabindex=\\\"{{::tabindex}}\\\" ng-disabled=\\\"noIncrementSeconds()\\\" ng-blur=\\\"blur()\\\">\\n\" +\n    \"      </td>\\n\" +\n    \"      <td ng-show=\\\"showMeridian\\\" class=\\\"uib-time am-pm\\\"><button type=\\\"button\\\" ng-class=\\\"{disabled: noToggleMeridian()}\\\" class=\\\"btn btn-default text-center\\\" ng-click=\\\"toggleMeridian()\\\" ng-disabled=\\\"noToggleMeridian()\\\" tabindex=\\\"{{::tabindex}}\\\">{{meridian}}</button></td>\\n\" +\n    \"    </tr>\\n\" +\n    \"    <tr class=\\\"text-center\\\" ng-show=\\\"::showSpinners\\\">\\n\" +\n    \"      <td class=\\\"uib-decrement hours\\\"><a ng-click=\\\"decrementHours()\\\" ng-class=\\\"{disabled: noDecrementHours()}\\\" class=\\\"btn btn-link\\\" ng-disabled=\\\"noDecrementHours()\\\" tabindex=\\\"-1\\\"><span class=\\\"glyphicon glyphicon-chevron-down\\\"></span></a></td>\\n\" +\n    \"      <td>&nbsp;</td>\\n\" +\n    \"      <td class=\\\"uib-decrement minutes\\\"><a ng-click=\\\"decrementMinutes()\\\" ng-class=\\\"{disabled: noDecrementMinutes()}\\\" class=\\\"btn btn-link\\\" ng-disabled=\\\"noDecrementMinutes()\\\" tabindex=\\\"-1\\\"><span class=\\\"glyphicon glyphicon-chevron-down\\\"></span></a></td>\\n\" +\n    \"      <td ng-show=\\\"showSeconds\\\">&nbsp;</td>\\n\" +\n    \"      <td ng-show=\\\"showSeconds\\\" class=\\\"uib-decrement seconds\\\"><a ng-click=\\\"decrementSeconds()\\\" ng-class=\\\"{disabled: noDecrementSeconds()}\\\" class=\\\"btn btn-link\\\" ng-disabled=\\\"noDecrementSeconds()\\\" tabindex=\\\"-1\\\"><span class=\\\"glyphicon glyphicon-chevron-down\\\"></span></a></td>\\n\" +\n    \"      <td ng-show=\\\"showMeridian\\\"></td>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </tbody>\\n\" +\n    \"</table>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/typeahead/typeahead-match.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/typeahead/typeahead-match.html\",\n    \"<a href\\n\" +\n    \"   tabindex=\\\"-1\\\"\\n\" +\n    \"   ng-bind-html=\\\"match.label | uibTypeaheadHighlight:query\\\"\\n\" +\n    \"   ng-attr-title=\\\"{{match.label}}\\\"></a>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"uib/template/typeahead/typeahead-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"uib/template/typeahead/typeahead-popup.html\",\n    \"<ul class=\\\"dropdown-menu\\\" ng-show=\\\"isOpen() && !moveInProgress\\\" ng-style=\\\"{top: position().top+'px', left: position().left+'px'}\\\" role=\\\"listbox\\\" aria-hidden=\\\"{{!isOpen()}}\\\">\\n\" +\n    \"    <li class=\\\"uib-typeahead-match\\\" ng-repeat=\\\"match in matches track by $index\\\" ng-class=\\\"{active: isActive($index) }\\\" ng-mouseenter=\\\"selectActive($index)\\\" ng-click=\\\"selectMatch($index, $event)\\\" role=\\\"option\\\" id=\\\"{{::match.id}}\\\">\\n\" +\n    \"        <div uib-typeahead-match index=\\\"$index\\\" match=\\\"match\\\" query=\\\"query\\\" template-url=\\\"templateUrl\\\"></div>\\n\" +\n    \"    </li>\\n\" +\n    \"</ul>\\n\" +\n    \"\");\n}]);\nangular.module('ui.bootstrap.carousel').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibCarouselCss && angular.element(document).find('head').prepend('<style type=\"text/css\">.ng-animate.item:not(.left):not(.right){-webkit-transition:0s ease-in-out left;transition:0s ease-in-out left}</style>'); angular.$$uibCarouselCss = true; });\nangular.module('ui.bootstrap.datepicker').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibDatepickerCss && angular.element(document).find('head').prepend('<style type=\"text/css\">.uib-datepicker .uib-title{width:100%;}.uib-day button,.uib-month button,.uib-year button{min-width:100%;}.uib-left,.uib-right{width:100%}</style>'); angular.$$uibDatepickerCss = true; });\nangular.module('ui.bootstrap.position').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibPositionCss && angular.element(document).find('head').prepend('<style type=\"text/css\">.uib-position-measure{display:block !important;visibility:hidden !important;position:absolute !important;top:-9999px !important;left:-9999px !important;}.uib-position-scrollbar-measure{position:absolute !important;top:-9999px !important;width:50px !important;height:50px !important;overflow:scroll !important;}.uib-position-body-scrollbar-measure{overflow:scroll !important;}</style>'); angular.$$uibPositionCss = true; });\nangular.module('ui.bootstrap.datepickerPopup').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibDatepickerpopupCss && angular.element(document).find('head').prepend('<style type=\"text/css\">.uib-datepicker-popup.dropdown-menu{display:block;float:none;margin:0;}.uib-button-bar{padding:10px 9px 2px;}</style>'); angular.$$uibDatepickerpopupCss = true; });\nangular.module('ui.bootstrap.tooltip').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibTooltipCss && angular.element(document).find('head').prepend('<style type=\"text/css\">[uib-tooltip-popup].tooltip.top-left > .tooltip-arrow,[uib-tooltip-popup].tooltip.top-right > .tooltip-arrow,[uib-tooltip-popup].tooltip.bottom-left > .tooltip-arrow,[uib-tooltip-popup].tooltip.bottom-right > .tooltip-arrow,[uib-tooltip-popup].tooltip.left-top > .tooltip-arrow,[uib-tooltip-popup].tooltip.left-bottom > .tooltip-arrow,[uib-tooltip-popup].tooltip.right-top > .tooltip-arrow,[uib-tooltip-popup].tooltip.right-bottom > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.top-left > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.top-right > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.bottom-left > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.bottom-right > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.left-top > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.left-bottom > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.right-top > .tooltip-arrow,[uib-tooltip-html-popup].tooltip.right-bottom > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.top-left > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.top-right > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.bottom-left > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.bottom-right > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.left-top > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.left-bottom > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.right-top > .tooltip-arrow,[uib-tooltip-template-popup].tooltip.right-bottom > .tooltip-arrow,[uib-popover-popup].popover.top-left > .arrow,[uib-popover-popup].popover.top-right > .arrow,[uib-popover-popup].popover.bottom-left > .arrow,[uib-popover-popup].popover.bottom-right > .arrow,[uib-popover-popup].popover.left-top > .arrow,[uib-popover-popup].popover.left-bottom > .arrow,[uib-popover-popup].popover.right-top > .arrow,[uib-popover-popup].popover.right-bottom > .arrow,[uib-popover-html-popup].popover.top-left > .arrow,[uib-popover-html-popup].popover.top-right > .arrow,[uib-popover-html-popup].popover.bottom-left > .arrow,[uib-popover-html-popup].popover.bottom-right > .arrow,[uib-popover-html-popup].popover.left-top > .arrow,[uib-popover-html-popup].popover.left-bottom > .arrow,[uib-popover-html-popup].popover.right-top > .arrow,[uib-popover-html-popup].popover.right-bottom > .arrow,[uib-popover-template-popup].popover.top-left > .arrow,[uib-popover-template-popup].popover.top-right > .arrow,[uib-popover-template-popup].popover.bottom-left > .arrow,[uib-popover-template-popup].popover.bottom-right > .arrow,[uib-popover-template-popup].popover.left-top > .arrow,[uib-popover-template-popup].popover.left-bottom > .arrow,[uib-popover-template-popup].popover.right-top > .arrow,[uib-popover-template-popup].popover.right-bottom > .arrow{top:auto;bottom:auto;left:auto;right:auto;margin:0;}[uib-popover-popup].popover,[uib-popover-html-popup].popover,[uib-popover-template-popup].popover{display:block !important;}</style>'); angular.$$uibTooltipCss = true; });\nangular.module('ui.bootstrap.timepicker').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibTimepickerCss && angular.element(document).find('head').prepend('<style type=\"text/css\">.uib-time input{width:50px;}</style>'); angular.$$uibTimepickerCss = true; });\nangular.module('ui.bootstrap.typeahead').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibTypeaheadCss && angular.element(document).find('head').prepend('<style type=\"text/css\">[uib-typeahead-popup].dropdown-menu{display:block;}</style>'); angular.$$uibTypeaheadCss = true; });"]}